module nobrowser { export function overrideLocalStorage(drive: persistence.Drive) { return LocalStorageOverride; class LocalStorageOverride { } }}module nobrowser { export function overrideLocalStorage(drive: persistence.Drive) { return LocalStorageOverride; class LocalStorageOverride { } }}declare function getText(element: Element): string;
declare function getText(fn: Function): string;
declare function setText(element: Element, text: string): void;
declare function elem(tag: string): HTMLElement;
declare function elem(tag: string, style: {}, parent?: Element): HTMLElement;
declare function elem(tag: string, parent: Element): HTMLElement;
declare function elem(elem: HTMLElement, style: {}, parent?: Element): HTMLElement;
declare function on(obj: Node, eventName: string, handler: (evt: Event) => void);
declare function on(obj: Window, eventName: string, handler: (evt: Event) => void);
declare function on(obj: Node, eventName: string, handler: (evt: Event) => void);
declare function off(obj: Window, eventName: string, handler: (evt: Event) => void);
declare function createFrame(): createFrame.LoadedResult;
declare module createFrame {
export interface LoadedResult {
global: Window;
document: Document;
iframe: HTMLIFrameElement;
evalFN(code: string): any;
}
}function base(window: Window) {
return {
getText,
setText,
elem,
on, off,
createFrame,
apply
};
function apply() {
(<any>window).getText = getText;
(<any>window).setText = setText;
(<any>window).elem = elem;
(<any>window).on = on;
(<any>window).off = off;
(<any>window).createFrame = createFrame;
}
function getText(obj) {
if (typeof obj === 'function') {
var result = /\/\*(\*(?!\/)|[^*])*\*\//m.exec(obj + '')[0];
if (result) result = result.slice(2, result.length - 2);
return result;
}
else if (/^SCRIPT$/i.test(obj.tagName)) {
if ('text' in obj)
return obj.text;
else
return obj.innerHTML;
}
else if (/^STYLE$/i.test(obj.tagName)) {
if ('text' in obj)
return obj.text;
else if (obj.styleSheet)
return obj.styleSheet.cssText;
else
return obj.innerHTML;
}
else if ('textContent' in obj) {
return obj.textContent;
}
else if (/^INPUT$/i.test(obj.tagName)) {
return obj.value;
}
else {
var result: string = obj.innerText;
if (result) {
// IE fixes
result = result.replace(/\<BR\s*\>/g, '\n').replace(/\r\n/g, '\n');
}
return result || '';
}
}
function setText(obj, text) {
if (/^SCRIPT$/i.test(obj.tagName)) {
if ('text' in obj)
obj.text = text;
else
obj.innerHTML = text;
}
else if (/^STYLE$/i.test(obj.tagName)) {
if ('text' in obj) {
obj.text = text;
}
else if ('styleSheet' in obj) {
if (!obj.styleSheet && !obj.type) obj.type = 'text/css';
obj.styleSheet.cssText = text;
}
else if ('textContent' in obj) {
obj.textContent = text;
}
else {
obj.innerHTML = text;
}
}
else if ('textContent' in obj) {
if ('type' in obj && !obj.type) obj.type = 'text/css';
obj.textContent = text;
}
else if (/^INPUT$/i.test(obj.tagName)) {
obj.value = text;
}
else {
obj.innerText = text;
}
}
function on(obj, eventName, handler) {
if (obj.addEventListener) {
obj.addEventListener(eventName, handler, false);
}
else if (obj.attachEvent) {
obj.attachEvent('on' + eventName, handler);
}
else {
obj['on' + eventName] = function(e) { return handler(e || window.event); };
}
};
function off(obj, eventName, handler) {
if (obj.removeEventListener) {
obj.removeEventListener(eventName, handler, false);
}
else if (obj.detachEvent) {
obj.detachEvent('on' + eventName, handler);
}
else {
if (obj['on' + eventName])
obj['on' + eventName] = null;
}
};
function elem(tag, style, parent) {
var e = tag.tagName ? tag : window.document.createElement(tag);
if (!parent && style && style.tagName) {
parent = style;
style = null;
}
if (style) {
if (typeof style === 'string') {
setText(e, style);
}
else {
for (var k in style) if (style.hasOwnProperty(k)) {
if (k === 'text') {
setText(e, style[k]);
}
else if (k === 'className') {
e.className = style[k];
}
else if (!(e.style && k in e.style) && k in e) {
e[k] = style[k];
}
else {
if (style[k] && typeof style[k] === 'object' && typeof style[k].length === 'number') {
// array: iterate and apply values
var applyValues = style[k];
for (var i = 0; i < applyValues.length; i++) {
try { e.style[k] = applyValues[i]; }
catch (errApplyValues) { }
}
}
else {
// not array
try {
e.style[k] = style[k];
}
catch (err) {
try {
if (typeof console !== 'undefined' && typeof console.error === 'function')
console.error(e.tagName + '.style.' + k + '=' + style[k] + ': ' + err.message);
}
catch (whatevs) {
alert(e.tagName + '.style.' + k + '=' + style[k] + ': ' + err.message);
}
}
}
}
}
}
}
if (parent) {
try {
parent.appendChild(e);
}
catch (error) {
throw new Error(error.message + ' adding ' + e.tagName + ' to ' + parent.tagName);
}
}
return e;
}
function createFrame() {
var ifr = elem(
'iframe',
{
position: 'absolute',
left: 0, top: 0,
width: '100%', height: '100%',
border: 'none',
src: 'about:blank'
},
window.document.body);
var ifrwin = ifr.contentWindow || ifr.window;
var ifrdoc = ifrwin.document;
if (ifrdoc.open) ifrdoc.open();
ifrdoc.write(
'<!' + 'doctype html' + '>' +
'<' + 'html' + '>' +
'<' + 'head' + '><' + 'style' + '>' +
'body,html{margin:0;padding:0;border:none;height:100%;border:none;}' +
'*,*:before,*:after{box-sizing:inherit;}' +
'html{box-sizing:border-box;}' +
'</' + 'style' + '>\n' +
'<' + 'body' + '>' +
'<' + 'script' + '>window.__eval_export_=function(code) { return eval(code); }</' + 'script' + '>' +
// it's important to have body before any long scripts (especialy external),
// so IFRAME is immediately ready
'<' + 'body' + '>' +
'</' + 'html' + '>');
if (ifrdoc.close) ifrdoc.close();
var ifrwin_eval = ifrwin.__eval_export_;
try {
delete (<any>ifrwin).__eval_export_;
}
catch (weirdIEFailure) {
// no big deal if it fails
}
ifrdoc.body.innerHTML = '';
if (window.onerror) {
ifrwin.onerror = delegate_onerror;
}
return {
document: ifrdoc,
global: ifrwin,
iframe: ifr,
evalFN: ifrwin_eval
};
function delegate_onerror() {
window.onerror.apply(window, arguments);
}
}
}function bootUI(document, window, base) {
base.elem(document.body, {
background: 'rgb(3,11,61)',
color: 'cyan',
border: 'none',
overflow: 'hidden',
fontFamily: 'Segoe UI Light, Segoe UI, Ubuntu Light, Ubuntu, Toronto, Helvetica, Roboto, Droid Sans, Sans Serif'
});
base.elem('div', {
innerHTML:
'<table style="width:100%;filter:blur(2.5px);-webkit-filter:blur(2.5px);-ms-filter: DXImageTransform.Microsoft.Blur(PixelRadius=\'2.5\');" width=100%><tr><td style="width:50%;" width=50% valign=top>'+
'<div style="color: white">'+
'<div style="background: darkcyan; width: 33%; margin-top:0.5em;padding-left:0.5em;">######</div>'+
'<div style="margin-left:0.5em;">'+
'##### <br>'+
'###'+
'</div>'+
'<div style="margin-left:0.5em;">'+
'******* <br>'+
'*********** <br>'+
'*********** <br>'+
'************ <br>'+
'************* <br>'+
'**************** ** <br>'+
'*************** <br>'+
'************' +
'</div>'+
'</div>'+
'</td><td style="width:50%; padding: 0.5em;" width=50% valign=top>'+
'<div style="color: white">'+
'-- <br>'+
'#### <br>'+
'####### <br>'+
'#### <br>'+
'#### <br>'+
'#### #### <br>' +
'######## <br>' +
'##### <br>'+
'####### <br>' +
'#######' +
'</div>'+
'***** ** <br>'+
'**** **** <br>'+
'*********' +
'</td></tr></table>'
}, document.body);
var progressContainer = base.elem('div', {
position: 'absolute',
left: 0, top: 0,
padding: '3em'
}, document.body);
var header = base.elem('h2', {
text: 'Mini portabled shell',
color: 'white',
fontWeight: '100',
fontSize: '500%',
marginBottom: 0, paddingBottom: 0,
textShadow: '1px 1px 3px black'
}, progressContainer);
var smallTitle = base.elem('div', {
fontStyle: 'italic',
paddingLeft: '1em',
textShadow: '1px 1px 3px black',
text: 'Loading...',
opacity: 0.8
}, progressContainer);
var bootBar = base.elem('div', {
marginTop: '2em',
background: 'gold', color: 'gold',
height: '2px',
width: '3%',
fontSize: '10%',
innerHTML: ' '
}, progressContainer);
var darkBottom = base.elem('div', {
position: 'absolute',
bottom: 0,
width: '100%',
height: '3em',
background: 'black'
}, document.body);
return {
title: function(t, ratio) {
setText(smallTitle,t);
if (typeof console !== 'undefined' && typeof console.log === 'function')
console.log(t);
if (ratio) {
bootBar.style.width = (ratio*100) + '%';
}
},
loaded: function() {
setText(smallTitle, 'Loaded.');
}
};
}function earlyBoot(window: Window) {
base(window).apply();
(<any>window).__boot_times.earlyBootStart = (+new Date());
document.write(
'<' + 'style' + ' data-legit=mi>' +
'*{display:none;background:white;color:white;}' +
'html,body{display:block;}' +
'</' + 'style' + '>' +
(document.body ? '' : '<body>'));
elem(document.body, {
height: '100%',
margin: 0,
padding: 0,
overflow: 'hidden'
});
elem(document.body.parentElement, {
overflow: 'hidden'
});
var allStyleElements = document.getElementsByTagName('style');
var addedStyle = allStyleElements[allStyleElements.length - 1];
var bootFrame: any = createFrame();
bootFrame.iframe.style.zIndex = <any>2000;
bootFrame.iframe.style.display = 'block';
base(bootFrame.global).apply();
var bootUI = (<any>window).bootUI;
var bootAPI = bootUI(bootFrame.document, bootFrame.global, { elem: (<any>bootFrame.global).elem });
bootFrame.api = bootAPI;
bootFrame.earlyStartTime = (<any>window).__boot_times.onerror_start;
bootFrame.bootStartTime = (<any>window).__boot_times.earlyBootStart;
var uniqueKey = deriveUniqueKey(location);
var shellLoaderInstance = null;
var shellLoadInterval = setInterval(function() {
if ((<any>window).shellLoader === 'undefined') return;
if (!shellLoadInterval) return; // protect against old Opera's super-async habits
shellLoaderInstance = shellLoaderInstance ? shellLoaderInstance.continueLoading() : (<any>window).shellLoader ? (<any>window).shellLoader(uniqueKey, document, bootFrame) : null;
}, 1);
window.onload = function() {
clearInterval(shellLoadInterval);
shellLoadInterval = 0;
removeSpyElements();
bootFrame.iframe.style.zIndex = <any>1000;
if (addedStyle.parentElement)
addedStyle.parentElement.removeChild(addedStyle);
bootFrame.iframe.style.display = '';
(shellLoaderInstance || (<any>window).shellLoader(uniqueKey, document, bootFrame)).finishLoading();
};
function deriveUniqueKey(locationSeed) {
var key = (locationSeed + '').split('?')[0].split('#')[0].toLowerCase();
var posIndexTrail = key.search(/\/index\.html$/);
if (posIndexTrail > 0) key = key.slice(0, posIndexTrail);
if (key.charAt(0) === '/')
key = key.slice(1);
if (key.slice(-1) === '/')
key = key.slice(0, key.length - 1);
return smallHash(key) + '-' + smallHash(key.slice(1) + 'a');
function smallHash(key) {
for (var h = 0, i = 0; i < key.length; i++) {
h = Math.pow(31, h + 31 / key.charCodeAt(i));
h -= h | 0;
}
return (h * 2000000000) | 0;
}
}
function removeSpyElements() {
removeElements('iframe', function(ifr) { return ifr !== bootFrame.iframe; });
removeElements('style', function(sty) { return sty.getAttribute('data-legit') !== 'mi'; });
removeElements('script', function(sty) { return sty.getAttribute('data-legit') !== 'mi'; });
function removeElements(tagName, predicateToRemove) {
var list = document.getElementsByTagName(tagName);
for (var i = 0; i < list.length; i++) {
var elem = list[i] || list.item(i);
if (predicateToRemove(elem)) {
elem.parentElement.removeChild(elem);
i--;
}
}
}
}
}window.__boot_times = window.__boot_times || {};
window.__boot_times.onerror_start = +new Date();
window.onerror = function onerror() {
var msg = [];
for (var i = 0; i < arguments.length; i++) {
var a = arguments[i];
if (a && (typeof a === 'object')) {
if (a.stack) {
msg.push(a.stack);
}
else {
var msg1 = [];
for (var k in a) {
var r = a[k];
if (typeof r === 'function' || (typeof r === 'object' && !r)) continue;
msg1.push(k+':'+r);
}
msg.push(msg1.join(', '));
}
}
else {
msg.push(a===null ? 'null' : a);
}
}
alert(msg.join('\n'));
}var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
;(function (exports) {
'use strict'
var Arr = (typeof Uint8Array !== 'undefined')
? Uint8Array
: Array
var PLUS = '+'.charCodeAt(0)
var SLASH = '/'.charCodeAt(0)
var NUMBER = '0'.charCodeAt(0)
var LOWER = 'a'.charCodeAt(0)
var UPPER = 'A'.charCodeAt(0)
var PLUS_URL_SAFE = '-'.charCodeAt(0)
var SLASH_URL_SAFE = '_'.charCodeAt(0)
function decode (elt) {
var code = elt.charCodeAt(0)
if (code === PLUS || code === PLUS_URL_SAFE) return 62 // '+'
if (code === SLASH || code === SLASH_URL_SAFE) return 63 // '/'
if (code < NUMBER) return -1 // no match
if (code < NUMBER + 10) return code - NUMBER + 26 + 26
if (code < UPPER + 26) return code - UPPER
if (code < LOWER + 26) return code - LOWER + 26
}
function b64ToByteArray (b64) {
var i, j, l, tmp, placeHolders, arr
if (b64.length % 4 > 0) {
throw new Error('Invalid string. Length must be a multiple of 4')
}
// the number of equal signs (place holders)
// if there are two placeholders, than the two characters before it
// represent one byte
// if there is only one, then the three characters before it represent 2 bytes
// this is just a cheap hack to not do indexOf twice
var len = b64.length
placeHolders = b64.charAt(len - 2) === '=' ? 2 : b64.charAt(len - 1) === '=' ? 1 : 0
// base64 is 4/3 + up to two characters of the original data
arr = new Arr(b64.length * 3 / 4 - placeHolders)
// if there are placeholders, only get up to the last complete 4 chars
l = placeHolders > 0 ? b64.length - 4 : b64.length
var L = 0
function push (v) {
arr[L++] = v
}
for (i = 0, j = 0; i < l; i += 4, j += 3) {
tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3))
push((tmp & 0xFF0000) >> 16)
push((tmp & 0xFF00) >> 8)
push(tmp & 0xFF)
}
if (placeHolders === 2) {
tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4)
push(tmp & 0xFF)
} else if (placeHolders === 1) {
tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2)
push((tmp >> 8) & 0xFF)
push(tmp & 0xFF)
}
return arr
}
function uint8ToBase64 (uint8) {
var i
var extraBytes = uint8.length % 3 // if we have 1 byte left, pad 2 bytes
var output = ''
var temp, length
function encode (num) {
return lookup.charAt(num)
}
function tripletToBase64 (num) {
return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F)
}
// go through the array every three bytes, we'll deal with trailing stuff later
for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {
temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
output += tripletToBase64(temp)
}
// pad the end with zeros, but make sure to not forget the extra bytes
switch (extraBytes) {
case 1:
temp = uint8[uint8.length - 1]
output += encode(temp >> 2)
output += encode((temp << 4) & 0x3F)
output += '=='
break
case 2:
temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1])
output += encode(temp >> 10)
output += encode((temp >> 4) & 0x3F)
output += encode((temp << 2) & 0x3F)
output += '='
break
default:
break
}
return output
}
exports.toByteArray = b64ToByteArray
exports.fromByteArray = uint8ToBase64
}(typeof exports === 'undefined' ? (this.base64js = {}) : exports))
/*!
* The buffer module from node.js, for the browser.
*
* @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
* @license MIT
*/
var base64 = require('base64-js')
var ieee754 = require('ieee754')
var isArray = require('is-array')
exports.Buffer = Buffer
exports.SlowBuffer = SlowBuffer
exports.INSPECT_MAX_BYTES = 50
Buffer.poolSize = 8192 // not used by this implementation
var kMaxLength = 0x3fffffff
var rootParent = {}
/**
* If `Buffer.TYPED_ARRAY_SUPPORT`:
* === true Use Uint8Array implementation (fastest)
* === false Use Object implementation (most compatible, even IE6)
*
* Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
* Opera 11.6+, iOS 4.2+.
*
* Note:
*
* - Implementation must support adding new properties to `Uint8Array` instances.
* Firefox 4-29 lacked support, fixed in Firefox 30+.
* See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
*
* - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
*
* - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
* incorrect length in some situations.
*
* We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they will
* get the Object implementation, which is slower but will work correctly.
*/
Buffer.TYPED_ARRAY_SUPPORT = (function () {
try {
var buf = new ArrayBuffer(0)
var arr = new Uint8Array(buf)
arr.foo = function () { return 42 }
return arr.foo() === 42 && // typed array instances can be augmented
typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
new Uint8Array(1).subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
} catch (e) {
return false
}
})()
/**
* Class: Buffer
* =============
*
* The Buffer constructor returns instances of `Uint8Array` that are augmented
* with function properties for all the node `Buffer` API functions. We use
* `Uint8Array` so that square bracket notation works as expected -- it returns
* a single octet.
*
* By augmenting the instances, we can avoid modifying the `Uint8Array`
* prototype.
*/
function Buffer (arg) {
if (!(this instanceof Buffer)) {
// Avoid going through an ArgumentsAdaptorTrampoline in the common case.
if (arguments.length > 1) return new Buffer(arg, arguments[1])
return new Buffer(arg)
}
this.length = 0
this.parent = undefined
// Common case.
if (typeof arg === 'number') {
return fromNumber(this, arg)
}
// Slightly less common case.
if (typeof arg === 'string') {
return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8')
}
// Unusual.
return fromObject(this, arg)
}
function fromNumber (that, length) {
that = allocate(that, length < 0 ? 0 : checked(length) | 0)
if (!Buffer.TYPED_ARRAY_SUPPORT) {
for (var i = 0; i < length; i++) {
that[i] = 0
}
}
return that
}
function fromString (that, string, encoding) {
if (typeof encoding !== 'string' || encoding === '') encoding = 'utf8'
// Assumption: byteLength() return value is always < kMaxLength.
var length = byteLength(string, encoding) | 0
that = allocate(that, length)
that.write(string, encoding)
return that
}
function fromObject (that, object) {
if (Buffer.isBuffer(object)) return fromBuffer(that, object)
if (isArray(object)) return fromArray(that, object)
if (object == null) {
throw new TypeError('must start with number, buffer, array or string')
}
if (typeof ArrayBuffer !== 'undefined' && object.buffer instanceof ArrayBuffer) {
return fromTypedArray(that, object)
}
if (object.length) return fromArrayLike(that, object)
return fromJsonObject(that, object)
}
function fromBuffer (that, buffer) {
var length = checked(buffer.length) | 0
that = allocate(that, length)
buffer.copy(that, 0, 0, length)
return that
}
function fromArray (that, array) {
var length = checked(array.length) | 0
that = allocate(that, length)
for (var i = 0; i < length; i += 1) {
that[i] = array[i] & 255
}
return that
}
// Duplicate of fromArray() to keep fromArray() monomorphic.
function fromTypedArray (that, array) {
var length = checked(array.length) | 0
that = allocate(that, length)
// Truncating the elements is probably not what people expect from typed
// arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior
// of the old Buffer constructor.
for (var i = 0; i < length; i += 1) {
that[i] = array[i] & 255
}
return that
}
function fromArrayLike (that, array) {
var length = checked(array.length) | 0
that = allocate(that, length)
for (var i = 0; i < length; i += 1) {
that[i] = array[i] & 255
}
return that
}
// Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object.
// Returns a zero-length buffer for inputs that don't conform to the spec.
function fromJsonObject (that, object) {
var array
var length = 0
if (object.type === 'Buffer' && isArray(object.data)) {
array = object.data
length = checked(array.length) | 0
}
that = allocate(that, length)
for (var i = 0; i < length; i += 1) {
that[i] = array[i] & 255
}
return that
}
function allocate (that, length) {
if (Buffer.TYPED_ARRAY_SUPPORT) {
// Return an augmented `Uint8Array` instance, for best performance
that = Buffer._augment(new Uint8Array(length))
} else {
// Fallback: Return an object instance of the Buffer class
that.length = length
that._isBuffer = true
}
var fromPool = length !== 0 && length <= Buffer.poolSize >>> 1
if (fromPool) that.parent = rootParent
return that
}
function checked (length) {
// Note: cannot use `length < kMaxLength` here because that fails when
// length is NaN (which is otherwise coerced to zero.)
if (length >= kMaxLength) {
throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
'size: 0x' + kMaxLength.toString(16) + ' bytes')
}
return length | 0
}
function SlowBuffer (subject, encoding) {
if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding)
var buf = new Buffer(subject, encoding)
delete buf.parent
return buf
}
Buffer.isBuffer = function isBuffer (b) {
return !!(b != null && b._isBuffer)
}
Buffer.compare = function compare (a, b) {
if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
throw new TypeError('Arguments must be Buffers')
}
if (a === b) return 0
var x = a.length
var y = b.length
var i = 0
var len = Math.min(x, y)
while (i < len) {
if (a[i] !== b[i]) break
++i
}
if (i !== len) {
x = a[i]
y = b[i]
}
if (x < y) return -1
if (y < x) return 1
return 0
}
Buffer.isEncoding = function isEncoding (encoding) {
switch (String(encoding).toLowerCase()) {
case 'hex':
case 'utf8':
case 'utf-8':
case 'ascii':
case 'binary':
case 'base64':
case 'raw':
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
return true
default:
return false
}
}
Buffer.concat = function concat (list, length) {
if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.')
if (list.length === 0) {
return new Buffer(0)
} else if (list.length === 1) {
return list[0]
}
var i
if (length === undefined) {
length = 0
for (i = 0; i < list.length; i++) {
length += list[i].length
}
}
var buf = new Buffer(length)
var pos = 0
for (i = 0; i < list.length; i++) {
var item = list[i]
item.copy(buf, pos)
pos += item.length
}
return buf
}
function byteLength (string, encoding) {
if (typeof string !== 'string') string = String(string)
if (string.length === 0) return 0
switch (encoding || 'utf8') {
case 'ascii':
case 'binary':
case 'raw':
return string.length
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
return string.length * 2
case 'hex':
return string.length >>> 1
case 'utf8':
case 'utf-8':
return utf8ToBytes(string).length
case 'base64':
return base64ToBytes(string).length
default:
return string.length
}
}
Buffer.byteLength = byteLength
// pre-set for values that may exist in the future
Buffer.prototype.length = undefined
Buffer.prototype.parent = undefined
// toString(encoding, start=0, end=buffer.length)
Buffer.prototype.toString = function toString (encoding, start, end) {
var loweredCase = false
start = start | 0
end = end === undefined || end === Infinity ? this.length : end | 0
if (!encoding) encoding = 'utf8'
if (start < 0) start = 0
if (end > this.length) end = this.length
if (end <= start) return ''
while (true) {
switch (encoding) {
case 'hex':
return hexSlice(this, start, end)
case 'utf8':
case 'utf-8':
return utf8Slice(this, start, end)
case 'ascii':
return asciiSlice(this, start, end)
case 'binary':
return binarySlice(this, start, end)
case 'base64':
return base64Slice(this, start, end)
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
return utf16leSlice(this, start, end)
default:
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
encoding = (encoding + '').toLowerCase()
loweredCase = true
}
}
}
Buffer.prototype.equals = function equals (b) {
if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
if (this === b) return true
return Buffer.compare(this, b) === 0
}
Buffer.prototype.inspect = function inspect () {
var str = ''
var max = exports.INSPECT_MAX_BYTES
if (this.length > 0) {
str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
if (this.length > max) str += ' ... '
}
return '<Buffer ' + str + '>'
}
Buffer.prototype.compare = function compare (b) {
if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
if (this === b) return 0
return Buffer.compare(this, b)
}
Buffer.prototype.indexOf = function indexOf (val, byteOffset) {
if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff
else if (byteOffset < -0x80000000) byteOffset = -0x80000000
byteOffset >>= 0
if (this.length === 0) return -1
if (byteOffset >= this.length) return -1
// Negative offsets start from the end of the buffer
if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0)
if (typeof val === 'string') {
if (val.length === 0) return -1 // special case: looking for empty string always fails
return String.prototype.indexOf.call(this, val, byteOffset)
}
if (Buffer.isBuffer(val)) {
return arrayIndexOf(this, val, byteOffset)
}
if (typeof val === 'number') {
if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') {
return Uint8Array.prototype.indexOf.call(this, val, byteOffset)
}
return arrayIndexOf(this, [ val ], byteOffset)
}
function arrayIndexOf (arr, val, byteOffset) {
var foundIndex = -1
for (var i = 0; byteOffset + i < arr.length; i++) {
if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) {
if (foundIndex === -1) foundIndex = i
if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex
} else {
foundIndex = -1
}
}
return -1
}
throw new TypeError('val must be string, number or Buffer')
}
// `get` will be removed in Node 0.13+
Buffer.prototype.get = function get (offset) {
console.log('.get() is deprecated. Access using array indexes instead.')
return this.readUInt8(offset)
}
// `set` will be removed in Node 0.13+
Buffer.prototype.set = function set (v, offset) {
console.log('.set() is deprecated. Access using array indexes instead.')
return this.writeUInt8(v, offset)
}
function hexWrite (buf, string, offset, length) {
offset = Number(offset) || 0
var remaining = buf.length - offset
if (!length) {
length = remaining
} else {
length = Number(length)
if (length > remaining) {
length = remaining
}
}
// must be an even number of digits
var strLen = string.length
if (strLen % 2 !== 0) throw new Error('Invalid hex string')
if (length > strLen / 2) {
length = strLen / 2
}
for (var i = 0; i < length; i++) {
var parsed = parseInt(string.substr(i * 2, 2), 16)
if (isNaN(parsed)) throw new Error('Invalid hex string')
buf[offset + i] = parsed
}
return i
}
function utf8Write (buf, string, offset, length) {
return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
}
function asciiWrite (buf, string, offset, length) {
return blitBuffer(asciiToBytes(string), buf, offset, length)
}
function binaryWrite (buf, string, offset, length) {
return asciiWrite(buf, string, offset, length)
}
function base64Write (buf, string, offset, length) {
return blitBuffer(base64ToBytes(string), buf, offset, length)
}
function ucs2Write (buf, string, offset, length) {
return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
}
Buffer.prototype.write = function write (string, offset, length, encoding) {
// Buffer#write(string)
if (offset === undefined) {
encoding = 'utf8'
length = this.length
offset = 0
// Buffer#write(string, encoding)
} else if (length === undefined && typeof offset === 'string') {
encoding = offset
length = this.length
offset = 0
// Buffer#write(string, offset[, length][, encoding])
} else if (isFinite(offset)) {
offset = offset | 0
if (isFinite(length)) {
length = length | 0
if (encoding === undefined) encoding = 'utf8'
} else {
encoding = length
length = undefined
}
// legacy write(string, encoding, offset, length) - remove in v0.13
} else {
var swap = encoding
encoding = offset
offset = length | 0
length = swap
}
var remaining = this.length - offset
if (length === undefined || length > remaining) length = remaining
if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
throw new RangeError('attempt to write outside buffer bounds')
}
if (!encoding) encoding = 'utf8'
var loweredCase = false
for (;;) {
switch (encoding) {
case 'hex':
return hexWrite(this, string, offset, length)
case 'utf8':
case 'utf-8':
return utf8Write(this, string, offset, length)
case 'ascii':
return asciiWrite(this, string, offset, length)
case 'binary':
return binaryWrite(this, string, offset, length)
case 'base64':
// Warning: maxLength not taken into account in base64Write
return base64Write(this, string, offset, length)
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
return ucs2Write(this, string, offset, length)
default:
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
encoding = ('' + encoding).toLowerCase()
loweredCase = true
}
}
}
Buffer.prototype.toJSON = function toJSON () {
return {
type: 'Buffer',
data: Array.prototype.slice.call(this._arr || this, 0)
}
}
function base64Slice (buf, start, end) {
if (start === 0 && end === buf.length) {
return base64.fromByteArray(buf)
} else {
return base64.fromByteArray(buf.slice(start, end))
}
}
function utf8Slice (buf, start, end) {
var res = ''
var tmp = ''
end = Math.min(buf.length, end)
for (var i = start; i < end; i++) {
if (buf[i] <= 0x7F) {
res += decodeUtf8Char(tmp) + String.fromCharCode(buf[i])
tmp = ''
} else {
tmp += '%' + buf[i].toString(16)
}
}
return res + decodeUtf8Char(tmp)
}
function asciiSlice (buf, start, end) {
var ret = ''
end = Math.min(buf.length, end)
for (var i = start; i < end; i++) {
ret += String.fromCharCode(buf[i] & 0x7F)
}
return ret
}
function binarySlice (buf, start, end) {
var ret = ''
end = Math.min(buf.length, end)
for (var i = start; i < end; i++) {
ret += String.fromCharCode(buf[i])
}
return ret
}
function hexSlice (buf, start, end) {
var len = buf.length
if (!start || start < 0) start = 0
if (!end || end < 0 || end > len) end = len
var out = ''
for (var i = start; i < end; i++) {
out += toHex(buf[i])
}
return out
}
function utf16leSlice (buf, start, end) {
var bytes = buf.slice(start, end)
var res = ''
for (var i = 0; i < bytes.length; i += 2) {
res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)
}
return res
}
Buffer.prototype.slice = function slice (start, end) {
var len = this.length
start = ~~start
end = end === undefined ? len : ~~end
if (start < 0) {
start += len
if (start < 0) start = 0
} else if (start > len) {
start = len
}
if (end < 0) {
end += len
if (end < 0) end = 0
} else if (end > len) {
end = len
}
if (end < start) end = start
var newBuf
if (Buffer.TYPED_ARRAY_SUPPORT) {
newBuf = Buffer._augment(this.subarray(start, end))
} else {
var sliceLen = end - start
newBuf = new Buffer(sliceLen, undefined)
for (var i = 0; i < sliceLen; i++) {
newBuf[i] = this[i + start]
}
}
if (newBuf.length) newBuf.parent = this.parent || this
return newBuf
}
/*
* Need to make sure that buffer isn't trying to write out of bounds.
*/
function checkOffset (offset, ext, length) {
if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
}
Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) checkOffset(offset, byteLength, this.length)
var val = this[offset]
var mul = 1
var i = 0
while (++i < byteLength && (mul *= 0x100)) {
val += this[offset + i] * mul
}
return val
}
Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) {
checkOffset(offset, byteLength, this.length)
}
var val = this[offset + --byteLength]
var mul = 1
while (byteLength > 0 && (mul *= 0x100)) {
val += this[offset + --byteLength] * mul
}
return val
}
Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
if (!noAssert) checkOffset(offset, 1, this.length)
return this[offset]
}
Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 2, this.length)
return this[offset] | (this[offset + 1] << 8)
}
Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 2, this.length)
return (this[offset] << 8) | this[offset + 1]
}
Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return ((this[offset]) |
(this[offset + 1] << 8) |
(this[offset + 2] << 16)) +
(this[offset + 3] * 0x1000000)
}
Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return (this[offset] * 0x1000000) +
((this[offset + 1] << 16) |
(this[offset + 2] << 8) |
this[offset + 3])
}
Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) checkOffset(offset, byteLength, this.length)
var val = this[offset]
var mul = 1
var i = 0
while (++i < byteLength && (mul *= 0x100)) {
val += this[offset + i] * mul
}
mul *= 0x80
if (val >= mul) val -= Math.pow(2, 8 * byteLength)
return val
}
Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) checkOffset(offset, byteLength, this.length)
var i = byteLength
var mul = 1
var val = this[offset + --i]
while (i > 0 && (mul *= 0x100)) {
val += this[offset + --i] * mul
}
mul *= 0x80
if (val >= mul) val -= Math.pow(2, 8 * byteLength)
return val
}
Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
if (!noAssert) checkOffset(offset, 1, this.length)
if (!(this[offset] & 0x80)) return (this[offset])
return ((0xff - this[offset] + 1) * -1)
}
Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 2, this.length)
var val = this[offset] | (this[offset + 1] << 8)
return (val & 0x8000) ? val | 0xFFFF0000 : val
}
Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 2, this.length)
var val = this[offset + 1] | (this[offset] << 8)
return (val & 0x8000) ? val | 0xFFFF0000 : val
}
Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return (this[offset]) |
(this[offset + 1] << 8) |
(this[offset + 2] << 16) |
(this[offset + 3] << 24)
}
Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return (this[offset] << 24) |
(this[offset + 1] << 16) |
(this[offset + 2] << 8) |
(this[offset + 3])
}
Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return ieee754.read(this, offset, true, 23, 4)
}
Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return ieee754.read(this, offset, false, 23, 4)
}
Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 8, this.length)
return ieee754.read(this, offset, true, 52, 8)
}
Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 8, this.length)
return ieee754.read(this, offset, false, 52, 8)
}
function checkInt (buf, value, offset, ext, max, min) {
if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance')
if (value > max || value < min) throw new RangeError('value is out of bounds')
if (offset + ext > buf.length) throw new RangeError('index out of range')
}
Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
value = +value
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)
var mul = 1
var i = 0
this[offset] = value & 0xFF
while (++i < byteLength && (mul *= 0x100)) {
this[offset + i] = (value / mul) & 0xFF
}
return offset + byteLength
}
Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
value = +value
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)
var i = byteLength - 1
var mul = 1
this[offset + i] = value & 0xFF
while (--i >= 0 && (mul *= 0x100)) {
this[offset + i] = (value / mul) & 0xFF
}
return offset + byteLength
}
Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
this[offset] = value
return offset + 1
}
function objectWriteUInt16 (buf, value, offset, littleEndian) {
if (value < 0) value = 0xffff + value + 1
for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) {
buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
(littleEndian ? i : 1 - i) * 8
}
}
Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = value
this[offset + 1] = (value >>> 8)
} else {
objectWriteUInt16(this, value, offset, true)
}
return offset + 2
}
Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value >>> 8)
this[offset + 1] = value
} else {
objectWriteUInt16(this, value, offset, false)
}
return offset + 2
}
function objectWriteUInt32 (buf, value, offset, littleEndian) {
if (value < 0) value = 0xffffffff + value + 1
for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) {
buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
}
}
Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset + 3] = (value >>> 24)
this[offset + 2] = (value >>> 16)
this[offset + 1] = (value >>> 8)
this[offset] = value
} else {
objectWriteUInt32(this, value, offset, true)
}
return offset + 4
}
Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value >>> 24)
this[offset + 1] = (value >>> 16)
this[offset + 2] = (value >>> 8)
this[offset + 3] = value
} else {
objectWriteUInt32(this, value, offset, false)
}
return offset + 4
}
Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) {
var limit = Math.pow(2, 8 * byteLength - 1)
checkInt(this, value, offset, byteLength, limit - 1, -limit)
}
var i = 0
var mul = 1
var sub = value < 0 ? 1 : 0
this[offset] = value & 0xFF
while (++i < byteLength && (mul *= 0x100)) {
this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
}
return offset + byteLength
}
Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) {
var limit = Math.pow(2, 8 * byteLength - 1)
checkInt(this, value, offset, byteLength, limit - 1, -limit)
}
var i = byteLength - 1
var mul = 1
var sub = value < 0 ? 1 : 0
this[offset + i] = value & 0xFF
while (--i >= 0 && (mul *= 0x100)) {
this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
}
return offset + byteLength
}
Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
if (value < 0) value = 0xff + value + 1
this[offset] = value
return offset + 1
}
Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = value
this[offset + 1] = (value >>> 8)
} else {
objectWriteUInt16(this, value, offset, true)
}
return offset + 2
}
Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value >>> 8)
this[offset + 1] = value
} else {
objectWriteUInt16(this, value, offset, false)
}
return offset + 2
}
Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = value
this[offset + 1] = (value >>> 8)
this[offset + 2] = (value >>> 16)
this[offset + 3] = (value >>> 24)
} else {
objectWriteUInt32(this, value, offset, true)
}
return offset + 4
}
Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
if (value < 0) value = 0xffffffff + value + 1
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value >>> 24)
this[offset + 1] = (value >>> 16)
this[offset + 2] = (value >>> 8)
this[offset + 3] = value
} else {
objectWriteUInt32(this, value, offset, false)
}
return offset + 4
}
function checkIEEE754 (buf, value, offset, ext, max, min) {
if (value > max || value < min) throw new RangeError('value is out of bounds')
if (offset + ext > buf.length) throw new RangeError('index out of range')
if (offset < 0) throw new RangeError('index out of range')
}
function writeFloat (buf, value, offset, littleEndian, noAssert) {
if (!noAssert) {
checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
}
ieee754.write(buf, value, offset, littleEndian, 23, 4)
return offset + 4
}
Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
return writeFloat(this, value, offset, true, noAssert)
}
Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
return writeFloat(this, value, offset, false, noAssert)
}
function writeDouble (buf, value, offset, littleEndian, noAssert) {
if (!noAssert) {
checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
}
ieee754.write(buf, value, offset, littleEndian, 52, 8)
return offset + 8
}
Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
return writeDouble(this, value, offset, true, noAssert)
}
Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
return writeDouble(this, value, offset, false, noAssert)
}
// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
Buffer.prototype.copy = function copy (target, targetStart, start, end) {
if (!start) start = 0
if (!end && end !== 0) end = this.length
if (targetStart >= target.length) targetStart = target.length
if (!targetStart) targetStart = 0
if (end > 0 && end < start) end = start
// Copy 0 bytes; we're done
if (end === start) return 0
if (target.length === 0 || this.length === 0) return 0
// Fatal error conditions
if (targetStart < 0) {
throw new RangeError('targetStart out of bounds')
}
if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
if (end < 0) throw new RangeError('sourceEnd out of bounds')
// Are we oob?
if (end > this.length) end = this.length
if (target.length - targetStart < end - start) {
end = target.length - targetStart + start
}
var len = end - start
if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
for (var i = 0; i < len; i++) {
target[i + targetStart] = this[i + start]
}
} else {
target._set(this.subarray(start, start + len), targetStart)
}
return len
}
// fill(value, start=0, end=buffer.length)
Buffer.prototype.fill = function fill (value, start, end) {
if (!value) value = 0
if (!start) start = 0
if (!end) end = this.length
if (end < start) throw new RangeError('end < start')
// Fill 0 bytes; we're done
if (end === start) return
if (this.length === 0) return
if (start < 0 || start >= this.length) throw new RangeError('start out of bounds')
if (end < 0 || end > this.length) throw new RangeError('end out of bounds')
var i
if (typeof value === 'number') {
for (i = start; i < end; i++) {
this[i] = value
}
} else {
var bytes = utf8ToBytes(value.toString())
var len = bytes.length
for (i = start; i < end; i++) {
this[i] = bytes[i % len]
}
}
return this
}
/**
* Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance.
* Added in Node 0.12. Only available in browsers that support ArrayBuffer.
*/
Buffer.prototype.toArrayBuffer = function toArrayBuffer () {
if (typeof Uint8Array !== 'undefined') {
if (Buffer.TYPED_ARRAY_SUPPORT) {
return (new Buffer(this)).buffer
} else {
var buf = new Uint8Array(this.length)
for (var i = 0, len = buf.length; i < len; i += 1) {
buf[i] = this[i]
}
return buf.buffer
}
} else {
throw new TypeError('Buffer.toArrayBuffer not supported in this browser')
}
}
// HELPER FUNCTIONS
// ================
var BP = Buffer.prototype
/**
* Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods
*/
Buffer._augment = function _augment (arr) {
arr.constructor = Buffer
arr._isBuffer = true
// save reference to original Uint8Array set method before overwriting
arr._set = arr.set
// deprecated, will be removed in node 0.13+
arr.get = BP.get
arr.set = BP.set
arr.write = BP.write
arr.toString = BP.toString
arr.toLocaleString = BP.toString
arr.toJSON = BP.toJSON
arr.equals = BP.equals
arr.compare = BP.compare
arr.indexOf = BP.indexOf
arr.copy = BP.copy
arr.slice = BP.slice
arr.readUIntLE = BP.readUIntLE
arr.readUIntBE = BP.readUIntBE
arr.readUInt8 = BP.readUInt8
arr.readUInt16LE = BP.readUInt16LE
arr.readUInt16BE = BP.readUInt16BE
arr.readUInt32LE = BP.readUInt32LE
arr.readUInt32BE = BP.readUInt32BE
arr.readIntLE = BP.readIntLE
arr.readIntBE = BP.readIntBE
arr.readInt8 = BP.readInt8
arr.readInt16LE = BP.readInt16LE
arr.readInt16BE = BP.readInt16BE
arr.readInt32LE = BP.readInt32LE
arr.readInt32BE = BP.readInt32BE
arr.readFloatLE = BP.readFloatLE
arr.readFloatBE = BP.readFloatBE
arr.readDoubleLE = BP.readDoubleLE
arr.readDoubleBE = BP.readDoubleBE
arr.writeUInt8 = BP.writeUInt8
arr.writeUIntLE = BP.writeUIntLE
arr.writeUIntBE = BP.writeUIntBE
arr.writeUInt16LE = BP.writeUInt16LE
arr.writeUInt16BE = BP.writeUInt16BE
arr.writeUInt32LE = BP.writeUInt32LE
arr.writeUInt32BE = BP.writeUInt32BE
arr.writeIntLE = BP.writeIntLE
arr.writeIntBE = BP.writeIntBE
arr.writeInt8 = BP.writeInt8
arr.writeInt16LE = BP.writeInt16LE
arr.writeInt16BE = BP.writeInt16BE
arr.writeInt32LE = BP.writeInt32LE
arr.writeInt32BE = BP.writeInt32BE
arr.writeFloatLE = BP.writeFloatLE
arr.writeFloatBE = BP.writeFloatBE
arr.writeDoubleLE = BP.writeDoubleLE
arr.writeDoubleBE = BP.writeDoubleBE
arr.fill = BP.fill
arr.inspect = BP.inspect
arr.toArrayBuffer = BP.toArrayBuffer
return arr
}
var INVALID_BASE64_RE = /[^+\/0-9A-z\-]/g
function base64clean (str) {
// Node strips out invalid characters like \n and \t from the string, base64-js does not
str = stringtrim(str).replace(INVALID_BASE64_RE, '')
// Node converts strings with length < 2 to ''
if (str.length < 2) return ''
// Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
while (str.length % 4 !== 0) {
str = str + '='
}
return str
}
function stringtrim (str) {
if (str.trim) return str.trim()
return str.replace(/^\s+|\s+$/g, '')
}
function toHex (n) {
if (n < 16) return '0' + n.toString(16)
return n.toString(16)
}
function utf8ToBytes (string, units) {
units = units || Infinity
var codePoint
var length = string.length
var leadSurrogate = null
var bytes = []
var i = 0
for (; i < length; i++) {
codePoint = string.charCodeAt(i)
// is surrogate component
if (codePoint > 0xD7FF && codePoint < 0xE000) {
// last char was a lead
if (leadSurrogate) {
// 2 leads in a row
if (codePoint < 0xDC00) {
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
leadSurrogate = codePoint
continue
} else {
// valid surrogate pair
codePoint = leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00 | 0x10000
leadSurrogate = null
}
} else {
// no lead yet
if (codePoint > 0xDBFF) {
// unexpected trail
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
continue
} else if (i + 1 === length) {
// unpaired lead
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
continue
} else {
// valid lead
leadSurrogate = codePoint
continue
}
}
} else if (leadSurrogate) {
// valid bmp char, but last char was a lead
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
leadSurrogate = null
}
// encode utf8
if (codePoint < 0x80) {
if ((units -= 1) < 0) break
bytes.push(codePoint)
} else if (codePoint < 0x800) {
if ((units -= 2) < 0) break
bytes.push(
codePoint >> 0x6 | 0xC0,
codePoint & 0x3F | 0x80
)
} else if (codePoint < 0x10000) {
if ((units -= 3) < 0) break
bytes.push(
codePoint >> 0xC | 0xE0,
codePoint >> 0x6 & 0x3F | 0x80,
codePoint & 0x3F | 0x80
)
} else if (codePoint < 0x200000) {
if ((units -= 4) < 0) break
bytes.push(
codePoint >> 0x12 | 0xF0,
codePoint >> 0xC & 0x3F | 0x80,
codePoint >> 0x6 & 0x3F | 0x80,
codePoint & 0x3F | 0x80
)
} else {
throw new Error('Invalid code point')
}
}
return bytes
}
function asciiToBytes (str) {
var byteArray = []
for (var i = 0; i < str.length; i++) {
// Node's code seems to be doing this and not & 0x7F..
byteArray.push(str.charCodeAt(i) & 0xFF)
}
return byteArray
}
function utf16leToBytes (str, units) {
var c, hi, lo
var byteArray = []
for (var i = 0; i < str.length; i++) {
if ((units -= 2) < 0) break
c = str.charCodeAt(i)
hi = c >> 8
lo = c % 256
byteArray.push(lo)
byteArray.push(hi)
}
return byteArray
}
function base64ToBytes (str) {
return base64.toByteArray(base64clean(str))
}
function blitBuffer (src, dst, offset, length) {
for (var i = 0; i < length; i++) {
if ((i + offset >= dst.length) || (i >= src.length)) break
dst[i + offset] = src[i]
}
return i
}
function decodeUtf8Char (str) {
try {
return decodeURIComponent(str)
} catch (err) {
return String.fromCharCode(0xFFFD) // UTF 8 invalid char
}
}
exports.read = function (buffer, offset, isLE, mLen, nBytes) {
var e, m,
eLen = nBytes * 8 - mLen - 1,
eMax = (1 << eLen) - 1,
eBias = eMax >> 1,
nBits = -7,
i = isLE ? (nBytes - 1) : 0,
d = isLE ? -1 : 1,
s = buffer[offset + i]
i += d
e = s & ((1 << (-nBits)) - 1)
s >>= (-nBits)
nBits += eLen
for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
m = e & ((1 << (-nBits)) - 1)
e >>= (-nBits)
nBits += mLen
for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
if (e === 0) {
e = 1 - eBias
} else if (e === eMax) {
return m ? NaN : ((s ? -1 : 1) * Infinity)
} else {
m = m + Math.pow(2, mLen)
e = e - eBias
}
return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
}
exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
var e, m, c,
eLen = nBytes * 8 - mLen - 1,
eMax = (1 << eLen) - 1,
eBias = eMax >> 1,
rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0),
i = isLE ? 0 : (nBytes - 1),
d = isLE ? 1 : -1,
s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
value = Math.abs(value)
if (isNaN(value) || value === Infinity) {
m = isNaN(value) ? 1 : 0
e = eMax
} else {
e = Math.floor(Math.log(value) / Math.LN2)
if (value * (c = Math.pow(2, -e)) < 1) {
e--
c *= 2
}
if (e + eBias >= 1) {
value += rt / c
} else {
value += rt * Math.pow(2, 1 - eBias)
}
if (value * c >= 2) {
e++
c /= 2
}
if (e + eBias >= eMax) {
m = 0
e = eMax
} else if (e + eBias >= 1) {
m = (value * c - 1) * Math.pow(2, mLen)
e = e + eBias
} else {
m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
e = 0
}
}
for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
e = (e << mLen) | m
eLen += mLen
for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
buffer[offset + i - d] |= s * 128
}
/**
* isArray
*/
var isArray = Array.isArray;
/**
* toString
*/
var str = Object.prototype.toString;
/**
* Whether or not the given `val`
* is an array.
*
* example:
*
* isArray([]);
* // > true
* isArray(arguments);
* // > false
* isArray('');
* // > false
*
* @param {mixed} val
* @return {bool}
*/
module.exports = isArray || function (val) {
return !! val && '[object Array]' == str.call(val);
};
module noapi {
export function apply(
global: any,
drive: persistence.Drive,
options?: {
argv?: string[];
cwd?: string;
env?: any;
}) {
var apiGlobal = {
process: <Process>null,
module: <Module>null
};
if (!options) options = {};
var cleanOptions = {
argv: options.argv || ['/node'],
cwd: options.cwd || '/',
env: options.env || {}
};
var coreModules = {
fs: <FS>null,
os: <OS>null,
path: <Path>null
};
apiGlobal.process = createProcess(coreModules, cleanOptions);
apiGlobal.module = createModule('repl' /*id*/, null /*filename*/, null /*parent*/, module_require);
coreModules.fs = createFS(drive, coreModules);
coreModules.os = createOS(apiGlobal);
coreModules.path = createPath(apiGlobal);
global.process = apiGlobal.process;
global.module = apiGlobal.module;
global.require = global_require;
function global_require(moduleName: string) {
return module_require(moduleName);
}
function module_require(moduleName: string): any {
if (coreModules.hasOwnProperty(moduleName)) return coreModules[moduleName];
throw new Error('Cannot find module \'' + moduleName + '\'');
}
}
export function nextTick(callback: Function): void {
function fire() {
if (fired) return;
fired = true;
callback();
}
var fired = false;
setTimeout(fire, 0);
if (typeof requestAnimationFrame !== 'undefined') {
requestAnimationFrame(fire);
}
else if (typeof msRequestAnimationFrame !== 'undefined') {
msRequestAnimationFrame(fire);
}
}
export function wrapAsync(fn: Function): () => void {
return function() {
var args = [];
for (var i = 0; i < arguments.length - 1; i++) {
args.push(arguments[i]);
}
var callback = arguments[arguments.length - 1];
nextTick(function() {
try {
var result = fn.apply(null, args);
}
catch (error) {
callback(error);
}
callback(null, result);
});
}
}
export function wrapAsyncNoError(fn: Function): () => void {
return function() {
var args = [];
for (var i = 0; i < arguments.length - 1; i++) {
args.push(arguments[i]);
}
var callback = arguments[arguments.length - 1];
nextTick(function() {
try {
var result = fn.apply(null, args);
}
catch (error) {
callback(error);
}
callback(result);
});
}
}
}declare module noapi {
export interface RequireFunction {
(id: string): any;
resolve(id: string): string;
cache: any;
extensions: any;
main: any;
}
export interface Global {
module: Module;
process: Process;
require: RequireFunction;
exports?: any;
__filename?: string;
__dirname?: string;
}
export interface ErrnoError extends Error {
}
export interface Buffer {
[index: number]: number;
write(string: string, offset?: number, length?: number, encoding?: string): number;
toString(encoding?: string, start?: number, end?: number): string;
toJSON(): any;
length: number;
copy(targetBuffer: Buffer, targetStart?: number, sourceStart?: number, sourceEnd?: number): number;
slice(start?: number, end?: number): Buffer;
readUInt8(offset: number, noAsset?: boolean): number;
readUInt16LE(offset: number, noAssert?: boolean): number;
readUInt16BE(offset: number, noAssert?: boolean): number;
readUInt32LE(offset: number, noAssert?: boolean): number;
readUInt32BE(offset: number, noAssert?: boolean): number;
readInt8(offset: number, noAssert?: boolean): number;
readInt16LE(offset: number, noAssert?: boolean): number;
readInt16BE(offset: number, noAssert?: boolean): number;
readInt32LE(offset: number, noAssert?: boolean): number;
readInt32BE(offset: number, noAssert?: boolean): number;
readFloatLE(offset: number, noAssert?: boolean): number;
readFloatBE(offset: number, noAssert?: boolean): number;
readDoubleLE(offset: number, noAssert?: boolean): number;
readDoubleBE(offset: number, noAssert?: boolean): number;
writeUInt8(value: number, offset: number, noAssert?: boolean): void;
writeUInt16LE(value: number, offset: number, noAssert?: boolean): void;
writeUInt16BE(value: number, offset: number, noAssert?: boolean): void;
writeUInt32LE(value: number, offset: number, noAssert?: boolean): void;
writeUInt32BE(value: number, offset: number, noAssert?: boolean): void;
writeInt8(value: number, offset: number, noAssert?: boolean): void;
writeInt16LE(value: number, offset: number, noAssert?: boolean): void;
writeInt16BE(value: number, offset: number, noAssert?: boolean): void;
writeInt32LE(value: number, offset: number, noAssert?: boolean): void;
writeInt32BE(value: number, offset: number, noAssert?: boolean): void;
writeFloatLE(value: number, offset: number, noAssert?: boolean): void;
writeFloatBE(value: number, offset: number, noAssert?: boolean): void;
writeDoubleLE(value: number, offset: number, noAssert?: boolean): void;
writeDoubleBE(value: number, offset: number, noAssert?: boolean): void;
fill(value: any, offset?: number, end?: number): void;
}
}declare module noapi {
export interface EventEmitter {
//static listenerCount(emitter: EventEmitter, event: string): number;
addListener(event: string, listener: Function): EventEmitter;
on(event: string, listener: Function): EventEmitter;
once(event: string, listener: Function): EventEmitter;
removeListener(event: string, listener: Function): EventEmitter;
removeAllListeners(event?: string): EventEmitter;
setMaxListeners(n: number): void;
listeners(event: string): Function[];
emit(event: string, ...args: any[]): boolean;
}
}module noapi {
export function createEventEmitter(): EventEmitter {
var _listeners: { [eventKey: string]: Function[]; } = {};
var result = {
addListener, removeListener, removeAllListeners,
on, once,
setMaxListeners,
listeners,
emit
};
return result;
function addListener(event: string, listener: Function): EventEmitter {
var key = '*' + event;
var list = _listeners[key] || (this._listeners[key] = []);
list.push(listener);
return result;
}
function removeListener(event: string, listener: Function): EventEmitter {
var key = '*' + event;
var list = _listeners[key];
if (list) {
for (var i = 0; i < list.length; i++) {
if (list[i] === listener) {
list.splice(i, 1);
break;
}
}
}
return result;
}
function removeAllListeners(event?: string): EventEmitter {
var key = '*' + event;
delete _listeners[key];
return result;
}
function setMaxListeners(n: number): void {
// too complicated for now, ignore
}
function listeners(event: string): Function[] {
var key = '*' + event;
var list = _listeners[key];
if (list)
return list.slice(0);
else
return [];
}
function emit(event: string, ...args: any[]): boolean {
var key = '*' + event;
var list = _listeners[key];
if (!list) return false;
for (var i = 0; i < list.length; i++) {
var f = list[i];
f.apply(null, args);
}
return true;
}
function on(event: string, listener: Function): EventEmitter {
return addListener(event, listener);
}
function once(event: string, listener: Function): EventEmitter {
return on(event, listener);
}
}
}declare module noapi {
export interface FS {
rename(oldPath: string, newPath: string, callback?: (err?: ErrnoError) => void): void;
renameSync(oldPath: string, newPath: string): void;
truncate(path: string, callback?: (err?: ErrnoError) => void): void;
truncate(path: string, len: number, callback?: (err?: ErrnoError) => void): void;
truncateSync(path: string, len?: number): void;
ftruncate(fd: number, callback?: (err?: ErrnoError) => void): void;
ftruncate(fd: number, len: number, callback?: (err?: ErrnoError) => void): void;
ftruncateSync(fd: number, len?: number): void;
chown(path: string, uid: number, gid: number, callback?: (err?: ErrnoError) => void): void;
chownSync(path: string, uid: number, gid: number): void;
fchown(fd: number, uid: number, gid: number, callback?: (err?: ErrnoError) => void): void;
fchownSync(fd: number, uid: number, gid: number): void;
lchown(path: string, uid: number, gid: number, callback?: (err?: ErrnoError) => void): void;
lchownSync(path: string, uid: number, gid: number): void;
chmod(path: string, mode: number, callback?: (err?: ErrnoError) => void): void;
chmod(path: string, mode: string, callback?: (err?: ErrnoError) => void): void;
chmodSync(path: string, mode: number): void;
chmodSync(path: string, mode: string): void;
fchmod(fd: number, mode: number, callback?: (err?: ErrnoError) => void): void;
fchmod(fd: number, mode: string, callback?: (err?: ErrnoError) => void): void;
fchmodSync(fd: number, mode: number): void;
fchmodSync(fd: number, mode: string): void;
lchmod(path: string, mode: number, callback?: (err?: ErrnoError) => void): void;
lchmod(path: string, mode: string, callback?: (err?: ErrnoError) => void): void;
lchmodSync(path: string, mode: number): void;
lchmodSync(path: string, mode: string): void;
stat(path: string, callback?: (err: ErrnoError, stats: Stats) => any): void;
lstat(path: string, callback?: (err: ErrnoError, stats: Stats) => any): void;
fstat(fd: number, callback?: (err: ErrnoError, stats: Stats) => any): void;
statSync(path: string): Stats;
lstatSync(path: string): Stats;
fstatSync(fd: number): Stats;
link(srcpath: string, dstpath: string, callback?: (err?: ErrnoError) => void): void;
linkSync(srcpath: string, dstpath: string): void;
symlink(srcpath: string, dstpath: string, type?: string, callback?: (err?: ErrnoError) => void): void;
symlinkSync(srcpath: string, dstpath: string, type?: string): void;
readlink(path: string, callback?: (err: ErrnoError, linkString: string) => any): void;
readlinkSync(path: string): string;
realpath(path: string, callback?: (err: ErrnoError, resolvedPath: string) => any): void;
realpath(path: string, cache: { [path: string]: string }, callback: (err: ErrnoError, resolvedPath: string) => any): void;
realpathSync(path: string, cache?: { [path: string]: string }): string;
unlink(path: string, callback?: (err?: ErrnoError) => void): void;
unlinkSync(path: string): void;
rmdir(path: string, callback?: (err?: ErrnoError) => void): void;
rmdirSync(path: string): void;
mkdir(path: string, callback?: (err?: ErrnoError) => void): void;
mkdir(path: string, mode: number, callback?: (err?: ErrnoError) => void): void;
mkdir(path: string, mode: string, callback?: (err?: ErrnoError) => void): void;
mkdirSync(path: string, mode?: number): void;
mkdirSync(path: string, mode?: string): void;
readdir(path: string, callback?: (err: ErrnoError, files: string[]) => void): void;
readdirSync(path: string): string[];
close(fd: number, callback?: (err?: ErrnoError) => void): void;
closeSync(fd: number): void;
open(path: string, flags: string, callback?: (err: ErrnoError, fd: number) => any): void;
open(path: string, flags: string, mode: number, callback?: (err: ErrnoError, fd: number) => any): void;
open(path: string, flags: string, mode: string, callback?: (err: ErrnoError, fd: number) => any): void;
openSync(path: string, flags: string, mode?: number): number;
openSync(path: string, flags: string, mode?: string): number;
utimes(path: string, atime: number, mtime: number, callback?: (err?: ErrnoError) => void): void;
utimes(path: string, atime: Date, mtime: Date, callback?: (err?: ErrnoError) => void): void;
utimesSync(path: string, atime: number, mtime: number): void;
utimesSync(path: string, atime: Date, mtime: Date): void;
futimes(fd: number, atime: number, mtime: number, callback?: (err?: ErrnoError) => void): void;
futimes(fd: number, atime: Date, mtime: Date, callback?: (err?: ErrnoError) => void): void;
futimesSync(fd: number, atime: number, mtime: number): void;
futimesSync(fd: number, atime: Date, mtime: Date): void;
fsync(fd: number, callback?: (err?: ErrnoError) => void): void;
fsyncSync(fd: number): void;
read(fd: number, buffer: Buffer, offset: number, length: number, position: number, callback?: (err: ErrnoError, bytesRead: number, buffer: Buffer) => void): void;
readSync(fd: number, buffer: Buffer, offset: number, length: number, position: number): number;
readFile(filename: string, encoding: string, callback: (err: ErrnoError, data: string) => void): void;
readFile(filename: string, options: { encoding: string; flag?: string; }, callback: (err: ErrnoError, data: string) => void): void;
readFile(filename: string, options: { flag?: string; }, callback: (err: ErrnoError, data: Buffer) => void): void;
readFile(filename: string, callback: (err: ErrnoError, data: Buffer) => void): void;
readFileSync(filename: string, encoding: string): string;
readFileSync(filename: string, options: { encoding: string; flag?: string; }): string;
readFileSync(filename: string, options?: { flag?: string; }): Buffer;
write(fd: number, buffer: Buffer, offset: number, length: number, position: number, callback?: (err: ErrnoError, written: number, buffer: Buffer) => void): void;
writeSync(fd: number, buffer: Buffer, offset: number, length: number, position: number): number;
writeFile(filename: string, data: any, callback?: (err: ErrnoError) => void): void;
writeFile(filename: string, data: any, options: { encoding?: string; mode?: number; flag?: string; }, callback?: (err: ErrnoError) => void): void;
writeFile(filename: string, data: any, options: { encoding?: string; mode?: string; flag?: string; }, callback?: (err: ErrnoError) => void): void;
writeFileSync(filename: string, data: any, options?: { encoding?: string; mode?: number; flag?: string; }): void;
writeFileSync(filename: string, data: any, options?: { encoding?: string; mode?: string; flag?: string; }): void;
appendFile(filename: string, data: any, options: { encoding?: string; mode?: number; flag?: string; }, callback?: (err: ErrnoError) => void): void;
appendFile(filename: string, data: any, options: { encoding?: string; mode?: string; flag?: string; }, callback?: (err: ErrnoError) => void): void;
appendFile(filename: string, data: any, callback?: (err: ErrnoError) => void): void;
appendFileSync(filename: string, data: any, options?: { encoding?: string; mode?: number; flag?: string; }): void;
appendFileSync(filename: string, data: any, options?: { encoding?: string; mode?: string; flag?: string; }): void;
watchFile(filename: string, listener: (curr: Stats, prev: Stats) => void): void;
watchFile(filename: string, options: { persistent?: boolean; interval?: number; }, listener: (curr: Stats, prev: Stats) => void): void;
unwatchFile(filename: string, listener?: (curr: Stats, prev: Stats) => void): void;
watch(filename: string, listener?: (event: string, filename: string) => any): Watcher;
watch(filename: string, options: { persistent?: boolean; }, listener?: (event: string, filename: string) => any): Watcher;
exists(path: string, callback?: (exists: boolean) => void): void;
existsSync(path: string): boolean;
createReadStream(path: string, options?: { flags?: string; encoding?: string; fd?: string; mode?: number; bufferSize?: number; }): ReadStream;
createReadStream(path: string, options?: { flags?: string; encoding?: string; fd?: string; mode?: string; bufferSize?: number; }): ReadStream;
createWriteStream(path: string, options?: { flags?: string; encoding?: string; string?: string; }): WriteStream;
}
export interface Stats {
isFile(): boolean;
isDirectory(): boolean;
isBlockDevice(): boolean;
isCharacterDevice(): boolean;
isSymbolicLink(): boolean;
isFIFO(): boolean;
isSocket(): boolean;
dev: number;
ino: number;
mode: number;
nlink: number;
uid: number;
gid: number;
rdev: number;
size: number;
blksize: number;
blocks: number;
atime: Date;
mtime: Date;
ctime: Date;
}
export interface Watcher extends EventEmitter {
close(): void;
}
export interface ReadStream extends Readable {
close(): void;
}
export interface WriteStream extends Writable {
close(): void;
}
}module noapi {
export function createFS(drive: persistence.Drive, modules: { path: Path; }): FS {
var fs: FS = {
renameSync: renameSync,
rename: wrapAsync(renameSync),
statSync: statSync,
lstatSync: statSync,
stat: wrapAsync(statSync),
lstat: wrapAsync(statSync),
fstat: null, fstatSync: null, // TODO: implement fstat using fstab
existsSync: existsSync,
exists: wrapAsyncNoError(existsSync),
openSync: openSync,
open: wrapAsync(openSync),
close: null, closeSync: null,
fsync: null, fsyncSync: null,
readFileSync: readFileSync,
readFile: wrapAsync(readFileSync),
createReadStream: null,
writeFileSync: writeFileSync,
writeFile: wrapAsync(writeFileSync),
appendFile: null, appendFileSync: null,
createWriteStream: null,
readSync: readSync,
read: wrapAsync(readSync),
writeSync: writeSync,
write: wrapAsync(writeSync),
truncate: null, truncateSync: null,
ftruncate: null, ftruncateSync: null,
chown: null, chownSync: null,
fchown: null, fchownSync: null,
lchown: null, lchownSync: null,
chmod: null, chmodSync: null,
fchmod: null, fchmodSync: null,
lchmod: null, lchmodSync: null,
link: null, linkSync: null,
readlink: null, readlinkSync: null,
symlink: null, symlinkSync: null,
unlink: null, unlinkSync: null,
realpath: null, realpathSync: null,
mkdir: wrapAsync(mkdirSync), mkdirSync: mkdirSync,
rmdir: null, rmdirSync: null,
readdir: null, readdirSync: null,
utimes: null, utimesSync: null,
futimes: null, futimesSync: null,
watch: null, watchFile: null, unwatchFile: null
};
return fs;
function existsSync(file: string): boolean {
var content = drive.read(file);
if (content || (content !== null && typeof content === 'undefined'))
return true;
var files = drive.files();
var normPath = modules.path.normalize(file);
if (normPath.slice(-1) !== '/') normPath += '/';
var leadMatch = getStartMatcher(file);
for (var i = 0; i < files.length; i++) {
if (leadMatch(files[i])) return;
}
return false;
}
function mkdirSync(path: string, mode?: any): void {
var normPath = modules.path.normalize(path);
if (normPath.slice(-1) !== '/') normPath += '/';
if (existsSync(path)) throw new Error('Directory \'' + path + '\'');
drive.write(normPath, '');
}
function renameSync(oldPath: string, newPath: string): void {
var oldContent = drive.read(oldPath);
if (oldContent !== null) {
// TODO: check if directory is in the way
// if (nofs
drive.write(newPath, oldContent);
drive.write(oldPath, null);
return;
}
if (drive.read(newPath) !== null) {
// node actually reports oldPath here, but let's be reasonable
throw new Error('ENOTDIR, not a directory \'' + newPath + '\'');
}
var norm_oldPath = modules.path.resolve(oldPath);
if (norm_oldPath === '/')
throw new Error('EBUSY, resource busy or locked \'/\'');
else
norm_oldPath += '/';
var norm_newPath = modules.path.resolve(newPath);
if (norm_newPath === '/')
throw new Error('EBUSY, resource busy or locked \'/\'');
else
norm_newPath += '/';
var files = drive.files();
var startAsOld = getStartMatcher(norm_oldPath);
for (var i = 0; i < files.length; i++) {
var fi = files[i];
if (startAsOld(fi)) {
var oldContent = drive.read(fi);
var restPath = fi.slice(norm_newPath.length);
var newFiPath = norm_newPath + restPath;
drive.write(newFiPath, oldContent);
drive.write(newFiPath, null);
}
}
}
function statSync(path: string): Stats {
// TODO: implement
throw new Error('Not implemented');
}
/*
stat(path: string, callback?: (err: no_ErrnoError, stats: nofs_Stats) => any): void;
lstat(path: string, callback?: (err: no_ErrnoError, stats: nofs_Stats) => any): void;
fstat(fd: number, callback?: (err: no_ErrnoError, stats: nofs_Stats) => any): void;
statSync(path: string): nofs_Stats;
lstatSync(path: string): nofs_Stats;
fstatSync(fd: number): nofs_Stats;
*/
function readFileSync(filename: string, options?: { encoding?: string; flag?: string; }): any {
// TODO: handle encoding and other
return drive.read(filename);
}
function readSync(fd: number, buffer: Buffer, offset: number, length: number, position: number): number {
// TODO: consider also std handles
//var path = nofs_fdtable()[fd];
throw new Error('Buffer-aware API fs.readSync is not implemented.');
}
function writeFileSync(filename: string, content: string) {
drive.write(filename, content);
}
function writeSync(fd: number, buffer: Buffer, offset: number, length: number, position: number): number {
if (fd === 1) {
if (typeof console !== 'undefined')
console.log(buffer);
return length;
}
var path = get_fdtable()[fd];
throw new Error('Buffer-aware API fs.writeSync is not implemented.');
}
function openSync(path: string, flags: string, mode?: number): number;
function openSync(path: string, flags: string, mode?: string): number;
function openSync(path: string, flags?: string, mode?: any): number {
var fdtable = get_fdtable();
for (var fd in fdtable) {
var fpath = fdtable[fd];
if (fpath === path) {
return Number(fd);
}
}
var newFD = _fdbase_++;
fdtable[newFD] = path;
return newFD;
}
var _fdbase_;
var _fdtable_: string[];
function get_fdtable() {
if (!_fdtable_) {
_fdtable_ = [];
_fdbase_ = 34957346;
}
return _fdtable_;
}
}
function getStartMatcher(oldPath: string) {
if (!oldPath) return (txt: string) => !txt;
return (txt: string) => {
if (!txt) return false;
if (txt.length < oldPath.length) return false;
return txt.slice(0, oldPath.length) === oldPath;
};
}
}declare module noapi {
export interface Module {
exports: any;
require(id: string): any;
id: string;
filename: string;
loaded: boolean;
parent: any;
children: any[];
}
}module noapi {
export function createModule(
id: string,
filename: string,
parent: any,
requireForModule: (moduleName: string) => any): Module {
var module: Module = {
exports: {},
id,
filename,
loaded: false,
parent,
children: [],
require
};
return module;
var _moduleCache: any;
var _resolveCache: any;
function require(moduleName: string): any {
var key = '*' + moduleName;
if (_moduleCache && key in _moduleCache)
return _moduleCache[key];
var mod = requireForModule(moduleName);
(_moduleCache || (_moduleCache = {}))[key] = mod;
return mod;
}
}
}declare module noapi {
export interface OS {
tmpdir(): string;
hostname(): string;
type(): string;
platform(): string;
arch(): string;
release(): string;
uptime(): number;
loadavg(): number[];
totalmem(): number;
freemem(): number;
cpus(): { model: string; speed: number; times: { user: number; nice: number; sys: number; idle: number; irq?: number; }; }[];
networkInterfaces(): any;
EOL: string;
}
}module noapi {
export function createOS(global: { process: Process; }) {
return {
EOL: '\n',
tmpdir: () => '/.tmp',
hostname: () => 'localhost',
type: () => 'Linux',
arch: () => global.process.arch,
platform: () => global.process.platform,
release: () => '3.16.0-38-generic',
uptime: () => global.process.uptime(),
loadavg: () => [0.7275390625, 0.65576171875, 0.4658203125],
totalmem: () => 3680739328 + ((Math.random() * 1000) | 0),
freemem: () => 2344873984 - ((Math.random() * 1000) | 0),
cpus: () => [
{ model: 'AMD A4-1250 APU with Radeon(TM) HD Graphics', speed: 800, times: { user: 8058000, nice: 29600, sys: 1079400, idle: 128185400, irq: 0 } },
{ model: 'AMD A4-1250 APU with Radeon(TM) HD Graphics', speed: 800, times: { user: 7779400, nice: 33000, sys: 1069200, idle: 127970900, irq: 0 } }
],
networkInterfaces: () => {
return {
lo: [
{ address: '127.0.0.1', family: 'IPv4', internal: true },
{ address: '::1', family: 'IPv6', internal: true }
],
wlan0: [
{ address: '192.168.1.3', family: 'IPv4', internal: false },
{ address: 'fe80::8256:f2ff:fe04:3d29', family: 'IPv6', internal: false }
]
}
}
};
}
}declare module noapi {
export interface Path {
normalize(p: string): string;
join(...paths: any[]): string;
resolve(...pathSegments: any[]): string;
isAbsolute(p: string): boolean;
relative(from: string, to: string): string;
dirname(p: string): string;
basename(p: string, ext?: string): string;
extname(p: string): string;
sep: string;
delimiter: string;
// new apis? definitely not in v0.10.38
parse?(p: string): { root: string; dir: string; base: string; ext: string; name: string; };
format?(pP: { root: string; dir: string; base: string; ext: string; name: string; }): string;
}
}module noapi {
export function createPath(global: { process: Process; }): Path {
var result: Path = {
basename, extname,
dirname,
isAbsolute,
normalize,
join,
relative, resolve,
sep: '/',
delimiter: ':'
};
return result;
function basename(p: string, ext?: string): string {
p = normalize(p);
if (p === '/')
return '';
var result: string;
var lastSlash = p.lastIndexOf('/');
if (lastSlash === p.length - 1) {
var prevSlash = p.lastIndexOf('/', lastSlash - 1);
if (prevSlash < 0)
prevSlash = 0;
result = p.slice(prevSlash + 1, lastSlash);
}
else {
result = p.slice(lastSlash + 1);
}
if (ext && result.length >= ext.length && result.slice(-ext.length) === ext)
result = result.slice(0, result.length - ext.length);
}
function dirname(p: string): string {
var p = normalize(p);
if (p === '/') return '/';
var lastSlash = p.lastIndexOf('/');
if (lastSlash === p.length - 1)
lastSlash = p.lastIndexOf('/', lastSlash - 1);
return p.slice(0, lastSlash + 1);
}
function isAbsolute(p: string): boolean {
return /^\//.test(p);
}
function extname(p: string): string {
var base = basename(p);
var lastDot = base.lastIndexOf('.');
if (lastDot >= 0)
return base.slice(lastDot);
else
return '';
}
function normalize(p: string): string {
return p;
}
function join(...paths: any[]): string {
return join_core(paths);
}
function join_core(paths: any[]): string {
var parts: string[] = [];
var trailSlash = false;
for (var i = 0; i < paths.length; i++) {
var part = paths[i];
if (!part) continue;
if (parts.length) {
var wlead = part;
part = part.replace(/^\/*/, '');
if (!part) continue;
if (wlead.length > part.length)
parts.push('');
}
var wtrail = part;
part = part.replace(/\/*$/, '');
if (!part) continue;
parts.push(part);
trailSlash = wtrail.length > part.length;
}
if (trailSlash)
parts.push('/');
return parts.join('/');
}
function relative(from: string, to: string): string {
throw new Error('path/relative is not implemented');
}
function resolve(...pathSegments: any[]): string {
var res = join_core(pathSegments);
if (!/^\//.test(res))
res = global.process.cwd() + res;
return res;
}
}
}declare module noapi {
export interface Process extends EventEmitter {
stdout: WritableStream;
stderr: WritableStream;
stdin: ReadableStream;
argv: string[];
execPath: string;
abort(): void;
chdir(directory: string): void;
cwd(): string;
env: any;
exit(code?: number): void;
getgid(): number;
setgid(id: number): void;
setgid(id: string): void;
getuid(): number;
setuid(id: number): void;
setuid(id: string): void;
version: string;
versions: {
http_parser: string;
node: string;
v8: string;
ares: string;
uv: string;
zlib: string;
openssl: string;
};
config: {
target_defaults: {
cflags: any[];
default_configuration: string;
defines: string[];
include_dirs: string[];
libraries: string[];
};
variables: {
clang?: number;
host_arch?: string;
target_arch?: string;
visibility?: string;
};
};
kill(pid: number, signal?: string): void;
pid: number;
title: string;
arch: string;
platform: string;
memoryUsage(): { rss: number; heapTotal: number; heapUsed: number; };
nextTick(callback: Function): void;
umask(mask?: number): number;
uptime(): number;
hrtime(time?: number[]): number[];
// Worker
send?(message: any, sendHandle?: any): void;
}
}module noapi {
export function createProcess(
modules: { fs: FS; path: Path; },
options: {
argv: string[];
cwd: string;
env: any;
}): Process {
var evt = createEventEmitter();
return {
abort, exit, kill,
nextTick,
chdir, cwd,
title: 'node',
arch: 'ia32',
platform: 'linux',
execPath: '/usr/bin/nodejs',
getgid, setgid, getuid, setuid,
stdout: load_stdout(), stderr: load_stderr(), stdin: load_stdin(),
memoryUsage,
uptime: load_uptime(),
hrtime: <any>function() { throw new Error('High resultion time is not implemenetd yet.'); },
pid: load_pid(),
umask: load_umask(),
config: load_config(),
versions: load_versions(),
version: load_versions().node,
argv: options.argv,
env: options.env,
addListener: evt.addListener,
on: evt.on,
once: evt.once,
removeListener: evt.removeListener,
removeAllListeners: evt.removeAllListeners,
setMaxListeners: evt.setMaxListeners,
listeners: evt.listeners,
emit: evt.emit
};
function abort() {
}
function exit(code?: number) {
}
function kill(pid: number, signal?: string) {
// when we emulate processes, implement process termination
}
function chdir(directory: string) {
var dirStat = modules.fs.statSync(directory);
if (dirStat && dirStat.isDirectory()) {
if (directory !== cwd()) {
var normDirectory = modules.path.normalize(directory);
if (cwd() !== normDirectory) {
options.cwd = normDirectory;
}
}
}
else {
// TODO: throw a node-shaped error instead
throw new Error('ENOENT, no such file or directory');
}
}
function cwd(): string {
return options.cwd;
}
function getgid() {
// taken from node running on ubuntu
return 1000;
}
function setgid(id: any) {
// TODO: use node-shaped error
throw new Error('EPERM, Operation not permitted');
}
function getuid(): number {
// taken from node running on ubuntu
return 1000;
}
function setuid(id: any) {
// TODO: use node-shaped error
throw new Error('EPERM, Operation not permitted');
}
function load_uptime() {
var _uptime_start_ = typeof Date.now === 'function' ? Date.now() : +(new Date());
return uptime;
function uptime() {
var now = typeof Date.now === 'function' ? Date.now() : +(new Date());
return now - _uptime_start_;
}
}
function load_stdout() {
return <WritableStream>{
};
}
function load_stderr() {
return <WritableStream>{
};
}
function load_stdin() {
return <ReadableStream>{
};
}
function memoryUsage(): { rss: number; heapTotal: number; heapUsed: number; } {
return {
rss: 13225984 + ((Math.random() * 3000) | 0),
heapTotal: 7130752 + ((Math.random() * 3000) | 0),
heapUsed: 2449612 + ((Math.random() * 3000) | 0)
};
}
function load_pid() {
return 32754 + ((Math.random() * 500) | 0);
}
function load_umask() {
var _umask_;
return umask;
function umask(mask?: number): number {
if (typeof _umask_ !== 'number') {
_umask_ = 2;
}
if (typeof mask === 'number') {
var res = _umask_;
_umask_ = mask;
return res;
}
return _umask_;
}
}
function load_versions() {
// real node running on ubuntu as of Friday 22 of May 2015
// (these might not be properly implemented when hosted in browser)
return {
http_parser: '1.0',
node: '0.10.38',
v8: '3.14.5.9',
ares: '1.9.0-DEV',
uv: '0.10.36',
zlib: '1.2.8',
modules: '11',
openssl: '1.0.1m'
};
}
function load_config() {
return {
target_defaults:
{
cflags: [],
default_configuration: 'Release',
defines: [],
include_dirs: [],
libraries: []
},
variables:
{
clang: 0,
gcc_version: 48,
host_arch: 'ia32',
node_install_npm: true,
node_prefix: '/usr',
node_shared_cares: false,
node_shared_http_parser: false,
node_shared_libuv: false,
node_shared_openssl: false,
node_shared_v8: false,
node_shared_zlib: false,
node_tag: '',
node_unsafe_optimizations: 0,
node_use_dtrace: false,
node_use_etw: false,
node_use_openssl: true,
node_use_perfctr: false,
node_use_systemtap: false,
openssl_no_asm: 0,
python: '/usr/bin/python',
target_arch: 'ia32',
v8_enable_gdbjit: 0,
v8_no_strict_aliasing: 1,
v8_use_snapshot: false,
want_separate_host_toolset: 0
}
};
}
}
}declare module noapi {
export interface ReadableStream extends EventEmitter {
readable: boolean;
read(size?: number): string|Buffer;
setEncoding(encoding: string): void;
pause(): void;
resume(): void;
pipe<T extends WritableStream>(destination: T, options?: { end?: boolean; }): T;
unpipe<T extends WritableStream>(destination?: T): void;
unshift(chunk: string): void;
unshift(chunk: Buffer): void;
wrap(oldStream: ReadableStream): ReadableStream;
}
export interface WritableStream extends EventEmitter {
writable: boolean;
write(buffer: Buffer, cb?: Function): boolean;
write(str: string, cb?: Function): boolean;
write(str: string, encoding?: string, cb?: Function): boolean;
end(): void;
end(buffer: Buffer, cb?: Function): void;
end(str: string, cb?: Function): void;
end(str: string, encoding?: string, cb?: Function): void
}
export interface Stream extends EventEmitter {
pipe<T extends WritableStream>(destination: T, options?: { end?: boolean; }): T;
}
export interface ReadableOptions {
highWaterMark?: number;
encoding?: string;
objectMode?: boolean;
}
export interface Readable extends EventEmitter, ReadableStream {
readable: boolean;
//constructor(opts?: ReadableOptions)
_read(size: number): void;
read(size?: number): string|Buffer;
setEncoding(encoding: string): void;
pause(): void;
resume(): void;
pipe<T extends WritableStream>(destination: T, options?: { end?: boolean; }): T;
unpipe(destination?: WritableStream): void;
unshift(chunk: string): void;
unshift(chunk: Buffer): void;
wrap(oldStream: ReadableStream): ReadableStream;
push(chunk: any, encoding?: string): boolean;
}
export interface WritableOptions {
highWaterMark?: number;
decodeStrings?: boolean;
}
export interface Writable extends EventEmitter, WritableStream {
writable: boolean;
// constructor(opts?: WritableOptions)
_write(data: Buffer, encoding: string, callback: Function): void;
_write(data: string, encoding: string, callback: Function): void;
write(buffer: Buffer, cb?: Function): boolean;
write(str: string, cb?: Function): boolean;
write(str: string, encoding?: string, cb?: Function): boolean;
end(): void;
end(buffer: Buffer, cb?: Function): void;
end(str: string, cb?: Function): void;
end(str: string, encoding?: string, cb?: Function): void;
}
export interface DuplexOptions extends ReadableOptions, WritableOptions {
allowHalfOpen?: boolean;
}
/**
* Note: Duplex extends both Readable and Writable.
*/
export interface Duplex extends Readable {
writable: boolean;
// constructor(opts?: DuplexOptions);
_write(data: Buffer, encoding: string, callback: Function);
_write(data: string, encoding: string, callback: Function): void;
write(buffer: Buffer, cb?: Function);
write(str: string, cb?: Function);
write(str: string, encoding?: string, cb?: Function): boolean;
end(): void;
end(buffer: Buffer, cb?: Function): void;
end(str: string, cb?: Function): void;
end(str: string, encoding?: string, cb?: Function): void;
}
export interface TransformOptions extends ReadableOptions, WritableOptions { }
/**
* Note: Transform lacks the _read and _write methods of Readable/Writable.
*/
interface Transform extends EventEmitter {
readable: boolean;
writable: boolean;
// constructor(opts?: TransformOptions)
_transform(chunk: Buffer, encoding: string, callback: Function): void;
_transform(chunk: string, encoding: string, callback: Function): void;
_flush(callback: Function): void;
read(size?: number): any;
setEncoding(encoding: string): void;
pause(): void;
resume(): void;
pipe<T extends WritableStream>(destination: T, options?: { end?: boolean; }): T;
unpipe(destination?: WritableStream): void;
unshift(chunk: string): void;
unshift(chunk: Buffer): void;
wrap(oldStream: ReadableStream): ReadableStream;
push(chunk: any, encoding?: string): boolean;
write(buffer: Buffer, cb?: Function): boolean;
write(str: string, cb?: Function): boolean;
write(str: string, encoding?: string, cb?: Function): boolean;
end(): void;
end(buffer: Buffer, cb?: Function): void;
end(str: string, cb?: Function): void;
end(str: string, encoding?: string, cb?: Function): void;
}
}module nobrowser {
export function overrideLocalStorage(drive: persistence.Drive) {
return LocalStorageOverride;
class LocalStorageOverride {
}
}
}module nobrowser {
export function overrideXMLHttpRequest(readCache: (url: string, callback: (content: string) => void) => void) {
return XMLHttpRequestOverride;
// urlBase - 'https://rawgit.com/jeffpar/pcjs/master'
class XMLHttpRequestOverride {
private _url: string = null;
status = 0;
readyState = 0;
responseText = null;
onreadystatechange: () => void = null;
open(method: string, url: string) {
this._url = url;
}
send() {
var completed = false;
this.readyState = 0;
readCache(this._url, content => {
this.status = 200;
this.readyState = 4;
this.responseText = content;
if (completed)
this.onreadystatechange();
return;
});
if (this.readyState === 4) {
setTimeout(() => this.onreadystatechange(), 1);
}
}
setRequestHeader() {
}
}
}
export module overrideXMLHttpRequest {
export function withDrive(drive: persistence.Drive, cachePath: string, realXMLHttpRequest: typeof XMLHttpRequest) {
return overrideXMLHttpRequest(
(url, callback) => {
var existing = cachePath + (cachePath.slice(-1) === '/' ? '' : '/') + (url.charAt(0) === '/' ? url.slice(1) : url);
var existingContent = drive.read(existing);
if (existingContent) {
callback(existingContent);
return;
}
var xhr = new realXMLHttpRequest();
xhr.open('GET', url);
xhr.onreadystatechange = () => {
if (xhr.readyState === 4 && xhr.status === 200) {
var response = xhr.responseText || xhr.response;
drive.write(existing, response);
callback(response);
}
};
xhr.send();
});
}
}
}module isolation {
export class Context {
private _frame;
private _obscureScope: any = {};
constructor(private _window: Window) {
this._frame = createFrame(this._window);
defineObscureScope(this._obscureScope, this._frame.global);
defineObscureScope(this._obscureScope, this._frame.window);
this._obscureScope.global = void 0;
var setGlobal = this._frame.evalFN('(function() { return function(global) { window.global = global; }; })()');
setGlobal(this._obscureScope);
}
run(code: string, path: string, scope: any) {
path = path || typeof path === 'string' ? path : createTimebasedPath();
this._obscureScope.global = scope || {};
var decoratedCode =
'with(window.global){with(global){ ' + code +
'\n }} //# sourceURL=' + path;
var result = this._frame.evalFN(decoratedCode);
this._obscureScope.global = null;
return result;
}
dispose() {
document.body.removeChild(this._frame.iframe);
}
}
function createTimebasedPath() {
var now = new Date();
var path = now.getFullYear() +
(now.getMonth() + 1 > 9 ? '' : '0') + now.getMonth() +
(now.getDate() > 9 ? '' : '0') + now.getDate() + '-' +
(now.getHours() > 9 ? '' : '0') + now.getHours() +
(now.getMinutes() > 9 ? '' : '0') + now.getMinutes() + '-' +
(now.getSeconds() > 9 ? '' : '0') + now.getSeconds() +
'.' + ((now.getMilliseconds() | 0) + 1000).toString().slice(1) +
'.js';
return path;
}
function createFrame(window: Window) {
var ifr = window.document.createElement('iframe');
ifr.style.display = 'none';
window.document.body.appendChild(ifr);
var ifrwin: Window = ifr.contentWindow || (<any>ifr).window;
var ifrdoc = ifrwin.document;
if (ifrdoc.open) ifrdoc.open();
ifrdoc.write(
'<!' + 'doctype html' + '>' +
'<' + 'html' + '><' + 'body' + '>' +
'<' + 'script' + '>window.__eval_export_=function(code) { return eval(code); }</' + 'script' + '>' +
'<' + 'body' + '></' + 'html' + '>');
if (ifrdoc.close) ifrdoc.close();
var ifrwin_eval: typeof eval = (<any>ifrwin).__eval_export_;
try {
delete (<any>ifrwin).__eval_export_;
}
catch (weirdIEFailure) {
// no big deal if it fails
}
ifrdoc.body.innerHTML = '';
return {
document: ifrdoc,
window: ifrwin,
global: ifrwin_eval('this'),
iframe: ifr,
evalFN: ifrwin_eval
};
}
function defineObscureScope(scope: any, pollutedGlobal: any) {
var natives = defineAllowedNatives();
var dummy;
// normal properties
for (var k in pollutedGlobal) {
if (scope[k] || natives[k]) continue;
scope[k] = dummy;
}
// non-enumerable properties directly on global
if (Object.getOwnPropertyNames) {
var props = Object.getOwnPropertyNames(pollutedGlobal);
for (var i = 0; i < props.length; i++) {
if (scope[props[i]] || natives[props[i]]) continue;
scope[props[i]] = dummy;
}
// non-enumerable properties on global's prototype
if (pollutedGlobal.constructor
&& pollutedGlobal.constructor.prototype
&& pollutedGlobal.constructor.prototype !== Object.prototype) {
props = Object.getOwnPropertyNames(pollutedGlobal.constructor.prototype);
for (var i = 0; i < props.length; i++) {
if (scope[props[i]] || natives[props[i]]) continue;
scope[props[i]] = dummy;
}
}
}
}
var allowedNatives = null;
function defineAllowedNatives() {
return {
setTimeout: 1, setInterval: 1, clearTimeout: 1, clearInterval: 1,
eval: 1,
console: 1,
undefined: 1,
Object: 1, Array: 1, Date: 1, Function: 1, String: 1, Boolean: 1, Number: 1,
Infinity: 1, NaN: 1, isNaN: 1, isFinite: 1, parseInt: 1, parseFloat: 1,
escape: 1, unescape: 1,
Int32Array: 1, Int8Array: 1, Int16Array: 1,
UInt32Array: 1, UInt8Array: 1, UInt8ClampedArray: 1, UInt16Array: 1,
Float32Array: 1, Float64Array: 1, ArrayBuffer: 1,
Math: 1, JSON: 1, RegExp: 1,
Error: 1, SyntaxError: 1, EvalError: 1, RangeError: 1, ReferenceError: 1,
toString: 1, toJSON: 1, toValue: 1,
Map: 1, Promise: 1
};
}
}declare var showCommanderInContext;
function shellLoader(uniqueKey: string, document: Document, boot: shellLoader.BootModuleAPI): shellLoader.ContinueLoading {
var driveMount = persistence.bootMount(uniqueKey, document);
return continueLoading();
function continueLoading(): shellLoader.ContinueLoading {
driveMount = driveMount.continueLoading();
boot.api.title('Loading files: ' + progressText('dom'), 0.05 + 0.8* driveMount.loadedSize/driveMount.totalSize);
return { continueLoading, finishLoading };
}
var timings;
var prevStage;
var prevStageStart;
var prevTimeText;
function progressText(stage) {
var fileText = driveMount.loadedFileCount + ' (' + driveMount.totalSize + ' total)';
var now = +new Date();
if (!prevStage) {
timings = [
{stage: 'boot ui', time: boot.bootStartTime - boot.earlyStartTime}
];
prevTimeText = ' boot UI ' + (boot.bootStartTime - boot.earlyStartTime) + 'ms init ' + (now - boot.bootStartTime) + 'ms';
prevStageStart = boot.bootStartTime;
prevStage = stage;
return fileText + prevTimeText;
}
else if (prevStage !== stage) {
timings.push({
stage: prevStage,
time: now-prevStageStart
});
prevTimeText += ' ' + prevStage + ' ' + (now - prevStageStart) + 'ms';
prevStageStart = now;
prevStage = stage;
return fileText + prevTimeText;
}
else {
return fileText + prevTimeText + ' ' + prevStage + ' ' + (now - prevStageStart) + 'ms';
}
}
function finishLoading() {
boot.api.title('Loading modifications: ' + progressText('local'), 0.85);
driveMount.finishLoading(drive => {
boot.api.title('Loading application: ' + progressText('ui-init'), 0.9);
var uiframe = createFrame();
uiframe.iframe.style.opacity = '0';
uiframe.iframe.style.filter = 'alpha(opacity=0)';
var uiframeBase = (<any>window).base(uiframe.global);
uiframeBase.apply();
var wasResized = false;
var resizeHandlers: any[] = [];
on(window, 'resize', global_resize_detect);
on(document.body, 'resize', global_resize_detect);
on(uiframe.document.body, 'touchstart', global_resize_detect);
on(uiframe.document.body, 'touchmove', global_resize_detect);
on(uiframe.document.body, 'touchend', global_resize_detect);
on(uiframe.document.body, 'pointerdown', global_resize_detect);
on(uiframe.document.body, 'pointerup', global_resize_detect);
on(uiframe.document.body, 'pointerout', global_resize_detect);
on(uiframe.document.body, 'keydown', global_resize_detect);
on(uiframe.document.body, 'keyup', global_resize_detect);
(<any>uiframe.global).require = shell_require;
boot.api.title('Loaded: ' + progressText('ui'), 0.95);
try {
showCommanderInContext(drive, uiframe.global, uiframe.document, shell_require);
}
catch (error) {
alert('Shell initialisation failed ' + error.message+'\n'+error.stack+'\n'+error);
}
boot.api.title('Completed: ' + progressText('ui'), 0.99);
function shell_require(moduleName): any {
switch (moduleName) {
case 'window': return window;
case 'document': return document;
case 'ui': return uiframe;
case 'drive': return drive;
case 'resize': return { on: onresize, off: offresize };
case 'timings': return timings;
}
throw new Error('Module ' + moduleName + ' is not supported.');
}
function onresize(handler) {
if (typeof handler !== 'function') return;
resizeHandlers.push(handler);
}
function offresize(handler) {
if (typeof handler !== 'function') return;
for (var i = 0; i < resizeHandlers.length; i++) {
if (resizeHandlers[i] === handler) {
resizeHandlers.splice(i, 1);
}
}
}
function global_resize_detect() {
if (wasResized) return;
wasResized = true;
if (typeof requestAnimationFrame === 'function') {
requestAnimationFrame(global_resize_delayed);
}
else {
setTimeout(global_resize_delayed, 5);
}
}
var lastMetrics: any = {};
function global_resize_delayed() {
wasResized = false;
var metrics = getMetrics();
if (metrics.windowWidth !== lastMetrics.windowWidth
&& metrics.windowHeight !== lastMetrics.windowHeight) {
lastMetrics = metrics;
for (var i = 0; i < resizeHandlers.length; i++) {
var f = resizeHandlers[i];
if (f)
f(metrics);
}
}
}
function getMetrics() {
var metrics = {
windowWidth: window.innerWidth || document.body.parentElement.clientWidth || document.body.clientWidth,
windowHeight: window.innerHeight || document.body.parentElement.clientHeight || document.body.clientHeight
};
return metrics;
}
var start = new Date().valueOf();
var fadeintTime = Math.min(500, ((+new Date()) - boot.bootStartTime) * 0.9);
var animateFadeIn = setInterval(function() {
var passed = new Date().valueOf() - start;
var opacity = Math.min(passed, fadeintTime) / fadeintTime;
boot.iframe.style.opacity = (1 - opacity).toString();
if (uiframe.iframe.style.filter)
boot.iframe.style.filter = 'alpha(opacity=' + ((opacity * 100) | 0) + ')';
uiframe.iframe.style.opacity = '1';
uiframe.iframe.style.filter = 'alpha(opacity=100)';
if (passed >= fadeintTime) {
clearInterval(animateFadeIn);
if (boot.iframe.parentElement) // old Opera may keep firing even after clearInterval
boot.iframe.parentElement.removeChild(boot.iframe);
}
}, 10);
//if (typeof console !== 'undefined' && console.log)
// console.log(window['dbgDrive'] = drive);
});
}
}
module shellLoader {
export interface BootModuleAPI extends createFrame.LoadedResult {
api?: any;
earlyStartTime?: number;
bootStartTime?: number;
}
export interface ContinueLoading {
continueLoading(): ContinueLoading;
finishLoading();
}
}#!/usr/bin/env node
/**
* @fileoverview Implements the DiskDump command-line interface
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* @suppress {missingProperties}
* Created 2012-Sep-04
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
* and <http://pcjs.org/>.
*
* JSMachines is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with JSMachines.
* If not, see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some JSMachines files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* JSMachines Project for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
var path = require("path");
var fs = require("fs");
var lib = path.join(path.dirname(fs.realpathSync(__filename)), "../lib/");
require(lib + "diskdump.js").CLI();
/**
* @fileoverview Converts disk images to/from JSON
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
* @version 1.0
* Created 2014-02-01
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
* and <http://pcjs.org/>.
*
* JSMachines is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with JSMachines.
* If not, see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some JSMachines files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* JSMachines Project for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
/*
* See http://en.wikipedia.org/wiki/Design_of_the_FAT_file_system for more information.
*/
"use strict";
var fs = require("fs");
var path = require("path");
var http = require("http");
var mkdirp = require("mkdirp");
var crypto = require("crypto");
var net = require("../../shared/lib/netlib");
var proc = require("../../shared/lib/proclib");
var str = require("../../shared/lib/strlib");
var usr = require("../../shared/lib/usrlib");
var DiskAPI = require("../../shared/lib/diskapi");
var DumpAPI = require("../../shared/lib/dumpapi");
var X86 = require("../../pcjs/lib/x86");
/**
* @class exports
* @property {string} name
* @property {string} version
*/
var pkg = require("../../../package.json");
/*
* fConsole controls console messages; it is false by default but is enable by the CLI interface.
*/
var fConsole = false;
/*
* fDebug controls debug console messages; it is false by default but can be enabled from the command-line
* using "--debug".
*/
var fDebug = false;
/*
* logFile is passed from the web server through HTMLOut to us, allowing us to "mingle" our logConsole()
* output with the server's log (typically "./logs/node.log").
*/
var logFile = null;
/*
* fNormalize attempts to enforce consistency across multiple dump requests, including the order of files within every
* directory, the use of hard-coded volume label timestamps, etc. And since I assume that normalization is a wonderful
* thing, I don't provide any UI for turning it off.
*/
var fNormalize = true;
/**
* DiskDump()
*
* TODO: Honor the caller's mbHD size. At the moment, any hard disk build request translates to 10Mb,
* since we rely on a "canned" BPB in aDefaultBPBs.
*
* TODO: If sServerRoot is set, make sure the final sDiskPath refers to something in either /apps/ or /disks/,
* to prevent random enumeration of other server resources.
*
* @constructor
* @param {string|Array} sDiskPath
* @param {Array|null} [asExclude] contains filename exclusions, if any
* @param {string} [sFormat] is the output format, one of "json"|"data"|"hex"|"bytes"|"img"
* @param {boolean|string} [fComments] enables comments and other readability enhancements in the JSON output
* @param {string} [mbHD] specifies a hard disk size, in megabytes, when building a new image
* @param {string|null} [sServerRoot]
* @param {string} [sManifestFile]
* @param {Object} [argv] optional (experimental) arguments, if any
*/
function DiskDump(sDiskPath, asExclude, sFormat, fComments, mbHD, sServerRoot, sManifestFile, argv)
{
/*
* I used to set this.sServerRoot to "sServerRoot || process.cwd()", but in reality, the
* server (httpapi.js) always passes the web server's root directory; when called from the
* command-line, sServerRoot is a bit of a misnomer: it's basically blank if sDiskPath begins
* with a slash, and process.cwd() otherwise.
*/
this.sServerRoot = sServerRoot;
this.sDiskPath = (net.isRemote(sDiskPath)? sDiskPath : path.join(this.sServerRoot, sDiskPath));
this.asExclude = asExclude || DiskDump.asExclusions;
this.mbHD = mbHD? parseInt(mbHD, 10) : 0;
this.sFormat = (sFormat || DumpAPI.FORMAT.JSON);
this.fJSONNative = (this.sFormat == DumpAPI.FORMAT.JSON && !fComments);
this.nJSONIndent = 0;
this.fJSONComments = fComments;
this.sJSONWhitespace = (this.fJSONComments? " " : "");
this.fXDFSupport = (argv && argv['xdf']);
/*
* The dump operation itself doesn't care about sManifestFile, but we DO need some indication
* of whether MD5 checksums need to be computed for the individual files, so we use the filename
* as that indication.
*/
this.sManifestFile = sManifestFile;
/*
* If we have to enumerate one or more files during the buildImage() process, this array
* will save them, in case the caller wants to query that information later, in updateManifest().
*
* Originally, I thought each saved entry would be a subset of what the fileInfo objects contain,
* but it turns out I pretty much need everything. This, in turn, means that some of the original
* buildImage() functions could simply use this.aManifestInfo, instead of their own aFiles array,
* but sometimes they're using aFiles of subdirectories, so it's not quite that simple.
*/
this.aManifestInfo = [];
/*
* bufDisk is set by buildImage() (or by loadFile() if the file is NOT a ".json" file; otherwise
* loadFile() loads the file as string data and stores it in jsonDisk).
*
* In those cases where bufDisk is set, the caller must call convertToJSON() to obtain JSON, which
* will simply return jsonDisk if it was already set by loadFile() OR if it was already created by
* a previous convertToJSON() call.
*
* In those cases where jsonDisk is set, the caller must call convertToIMG() to obtain an IMG file.
* Since that function relies on dataDisk, it first calls JSON.parse() to convert jsonDisk to dataDisk,
* and then it builds bufDisk from dataDisk; if a previous call already created dataDisk and/or bufDisk,
* the previous values are used/returned.
*
* dataDisk is a native data object built by convertToJSON() and convertToIMG() as needed. In the
* first case, it's used to create JSON using JSON.stringify(), but only if fJSONNative is set (ie,
* the caller explicitly specifies FORMAT_JSON); that probably should be the default setting, but it
* wasn't an option in the original PHP code, so I added it as an option here in order to compare the
* output of both methods. fJSONNative still isn't an option for converting OSI disk images to JSON
* (and it may never be, as those images aren't very common).
*/
this.bufDisk = null;
this.jsonDisk = "";
this.dataDisk = undefined;
}
/**
* setLogFile(file)
*
* @param {Object} file
*/
DiskDump.setLogFile = function(file) {
logFile = file;
};
/*
* Class constants
*/
DiskDump.sAPIURL = "http://www.pcjs.org" + DumpAPI.ENDPOINT;
DiskDump.sCopyright = "© 2012-2015 by Jeff Parsons (@jeffpar)";
DiskDump.sNotice = DiskDump.sAPIURL + " " + DiskDump.sCopyright;
DiskDump.sUsage = "Usage: " + DiskDump.sAPIURL + "?" + DumpAPI.QUERY.PATH + "={url}&" + DumpAPI.QUERY.FORMAT + "=json|data|hex|bytes|img";
/*
* MY_VOL_LABEL is our default label, used whenever a more suitable label (eg, the disk image's folder name)
* is not available or not supplied, and MY_OEM_STRING is inserted into any DiskDump-generated diskette images.
*/
DiskDump.MY_VOL_LABEL = "PCJSDISK";
DiskDump.MY_OEM_STRING = "PCJS.ORG";
/**
* The BPBs that buildImage() currently supports; these BPBs should be in order of smallest to largest capacity,
* to help ensure we don't select a disk format larger than necessary.
*
* TODO: For now, the code that chooses a default BPB is starting with #1 instead of #0, because Windows 95 (at least
* when running under VMware) fails to read the contents of such disks correctly. Whether that's my fault or Windows 95's
* fault is still TBD (although it's probably mine -- perhaps 160Kb diskettes aren't supposed to have BPBs?) The simple
* work-around is to avoid creating 160Kb diskette images.
*/
DiskDump.aDefaultBPBs = [
[ // define BPB for 160Kb diskette
0xEB, 0xFE, 0x90, // 0x00: JMP instruction, following by 8-byte OEM signature
0x50, 0x43, 0x4A, 0x53, 0x2E, 0x4F, 0x52, 0x47, // MY_OEM_STRING
// 0x49, 0x42, 0x4D, 0x20, 0x20, 0x31, 0x2E, 0x30, // "IBM 1.0" (this is a fake OEM signature)
0x00, 0x02, // 0x0B: bytes per sector (0x200 or 512)
0x01, // 0x0D: sectors per cluster (1)
0x01, 0x00, // 0x0E: reserved sectors; ie, # sectors preceding the first FAT--usually just the boot sector (1)
0x02, // 0x10: FAT copies (2)
0x40, 0x00, // 0x11: root directory entries (0x40 or 64) 0x40 * 0x20 = 0x800 (1 sector is 0x200 bytes, total of 4 sectors)
0x40, 0x01, // 0x13: number of sectors (0x140 or 320)
0xFE, // 0x15: media type (eg, 0xFF: 320Kb, 0xFE: 160Kb, 0xFD: 360Kb, 0xFC: 180Kb)
0x01, 0x00, // 0x16: sectors per FAT (1)
0x08, 0x00, // 0x18: sectors per track (8)
0x01, 0x00, // 0x1A: number of heads (2)
0x00, 0x00, 0x00, 0x00 // 0x1C: number of hidden sectors (always 0 for non-partitioned media)
],
[ // define BPB for 360Kb diskette
0xEB, 0xFE, 0x90, // 0x00: JMP instruction, following by 8-byte OEM signature
0x50, 0x43, 0x4A, 0x53, 0x2E, 0x4F, 0x52, 0x47, // MY_OEM_STRING
// 0x49, 0x42, 0x4D, 0x20, 0x20, 0x32, 0x2E, 0x30, // "IBM 2.0" (this is a real OEM signature)
0x00, 0x02, // 0x0B: bytes per sector (0x200 or 512)
0x02, // 0x0D: sectors per cluster (2)
0x01, 0x00, // 0x0E: reserved sectors; ie, # sectors preceding the first FAT--usually just the boot sector (1)
0x02, // 0x10: FAT copies (2)
0x70, 0x00, // 0x11: root directory entries (0x70 or 112) 0x70 * 0x20 = 0xE00 (1 sector is 0x200 bytes, total of 7 sectors)
0xD0, 0x02, // 0x13: number of sectors (0x2D0 or 720)
0xFD, // 0x15: media type (eg, 0xFF: 320Kb, 0xFE: 160Kb, 0xFD: 360Kb, 0xFC: 180Kb)
0x02, 0x00, // 0x16: sectors per FAT (2)
0x09, 0x00, // 0x18: sectors per track (9)
0x02, 0x00, // 0x1A: number of heads (2)
0x00, 0x00, 0x00, 0x00 // 0x1C: number of hidden sectors (always 0 for non-partitioned media)
],
[ // define BPB for 1.2Mb diskette
0xEB, 0xFE, 0x90, // 0x00: JMP instruction, following by 8-byte OEM signature
0x50, 0x43, 0x4A, 0x53, 0x2E, 0x4F, 0x52, 0x47, // MY_OEM_STRING
// 0x49, 0x42, 0x4D, 0x20, 0x31, 0x30, 0x2E, 0x31, // "10.0" (which I believe was used on IBM OS/2 1.0 diskettes)
0x00, 0x02, // 0x0B: bytes per sector (0x200 or 512)
0x01, // 0x0D: sectors per cluster (1)
0x01, 0x00, // 0x0E: reserved sectors; ie, # sectors preceding the first FAT--usually just the boot sector (1)
0x02, // 0x10: FAT copies (2)
0xE0, 0x00, // 0x11: root directory entries (0xe0 or 224) 0xe0 * 0x20 = 0x1c00 (1 sector is 0x200 bytes, total of 14 sectors)
0x60, 0x09, // 0x13: number of sectors (0x960 or 2400)
0xF9, // 0x15: media type (0xF9 was used for 1228800-byte diskettes, and later for 737280-byte diskettes)
0x07, 0x00, // 0x16: sectors per FAT (7)
0x0f, 0x00, // 0x18: sectors per track (15)
0x02, 0x00, // 0x1A: number of heads (2)
0x00, 0x00, 0x00, 0x00 // 0x1C: number of hidden sectors (always 0 for non-partitioned media)
],
[ // define BPB for 1.44Mb diskette
0xEB, 0xFE, 0x90, // 0x00: JMP instruction, following by 8-byte OEM signature
0x50, 0x43, 0x4A, 0x53, 0x2E, 0x4F, 0x52, 0x47, // MY_OEM_STRING
// 0x4d, 0x53, 0x44, 0x4F, 0x53, 0x35, 0x2E, 0x30, // "MSDOS5.0" (an actual OEM signature, arbitrarily chosen for use here)
0x00, 0x02, // 0x0B: bytes per sector (0x200 or 512)
0x01, // 0x0D: sectors per cluster (1)
0x01, 0x00, // 0x0E: reserved sectors; ie, # sectors preceding the first FAT--usually just the boot sector (1)
0x02, // 0x10: FAT copies (2)
0xE0, 0x00, // 0x11: root directory entries (0xe0 or 224) 0xe0 * 0x20 = 0x1c00 (1 sector is 0x200 bytes, total of 14 sectors)
0x40, 0x0B, // 0x13: number of sectors (0xb40 or 2880)
0xF0, // 0x15: media type (0xF0 was used for 1474560-byte diskettes)
0x09, 0x00, // 0x16: sectors per FAT (9)
0x12, 0x00, // 0x18: sectors per track (18)
0x02, 0x00, // 0x1A: number of heads (2)
0x00, 0x00, 0x00, 0x00 // 0x1C: number of hidden sectors (always 0 for non-partitioned media)
],
[ // define BPB for 10Mb hard disk
0xEB, 0xFE, 0x90, // 0x00: JMP instruction, following by 8-byte OEM signature
0x50, 0x43, 0x4A, 0x53, 0x2E, 0x4F, 0x52, 0x47, // MY_OEM_STRING
// 0x49, 0x42, 0x4D, 0x20, 0x20, 0x32, 0x2E, 0x30, // "IBM 2.0" (this is a real OEM signature)
0x00, 0x02, // 0x0B: bytes per sector (0x200 or 512)
0x08, // 0x0D: sectors per cluster (8)
0x01, 0x00, // 0x0E: reserved sectors; ie, # sectors preceding the first FAT--usually just the boot sector (1)
0x02, // 0x10: FAT copies (2)
0x00, 0x02, // 0x11: root directory entries (0x200 or 512) 0x200 * 0x20 = 0x4000 (1 sector is 0x200 bytes, total of 0x20 or 32 sectors)
0x03, 0x51, // 0x13: number of sectors (0x5103 or 20739; * 512 bytes/sector = 10,618,368 bytes = 10,369Kb = 10Mb)
0xF8, // 0x15: media type (eg, 0xF8: hard disk w/FAT12)
0x08, 0x00, // 0x16: sectors per FAT (8)
// Wikipedia (http://en.wikipedia.org/wiki/File_Allocation_Table#BIOS_Parameter_Block) implies everything past this point was introduced
// post-DOS 2.0. I think that's wrong, because I just formatted a diskette with PC-DOS 2.0 and it properly initialized the next 3 fields as well.
0x11, 0x00, // 0x18: sectors per track (17)
0x04, 0x00, // 0x1A: number of heads (4)
// PC-DOS 2.0 actually stored 0x01, 0x00, 0x80, 0x00 here, so you can't always assume that anything past offset 0x1E is part of the BPB;
// requires further investigation.
0x01, 0x00, 0x00, 0x00 // 0x1C: number of hidden sectors (always 0 for non-partitioned media)
]
];
DiskDump.asExclusions = [".*", ".IMG"];
DiskDump.asTextFileExts = [".MD", ".ME", ".ASM", ".BAS", ".TXT", ".XML"];
/*
* Class methods
*/
/**
* CLI()
*
* Provides the command-line interface for the diskdump module.
*
* Usage
* ---
* diskdump --dir={directory} [--format=json|data|hex|bytes|img] [--comments] [--output={file}]
* diskdump --disk={disk image} [--format=json|data|hex|bytes|img] [--comments] [--output={file}]
* diskdump --path={file[;file]...} [--format=json|data|hex|bytes|img] [--comments] [--output={file}]
*
* NOTE: --img is permitted as an alias for --disk
*
* Arguments
* ---
* The default format is "json", which generates an array of signed 32-bit decimal values; "hex" is an older
* text format that consists entirely of 2-character hex values (deprecated), and "bytes" is a JSON-like format
* that also uses hex values (but with "0x" prefixes) and is normally used only when comments are enabled.
*
* Note that command-line arguments, if any, are not validated. For example, argv['comments'] may be any of
* boolean, string, or undefined, since the user may have typed "--comments" or "--comments=foo" or nothing at all.
*
* Additional command-line arguments include:
*
* --mbhd={number}: requests a hard disk image with the given number of megabytes (eg, 10 for a 10mb image)
* --exclude={filename}: specifies a filename that should be excluded from the image; repeat as often as needed
* --overwrite: allows the --output option to overwrite an existing file; default is to NOT overwrite
* --manifest[={filename}]: update the specified manifest.xml file with details about the disk image
* --xdf: enable support for XDF-formatted disk images (experimental)
*
* Examples
* ---
* node modules/diskdump/bin/diskdump --disk=../jsmachines/disks/pc/games/infocom/zork1/zork1.dsk
* node modules/diskdump/bin/diskdump --dir=./apps/pc/1981/visicalc/ --format=img --output=./apps/pc/1981/visicalc/disk.img
* node modules/diskdump/bin/diskdump --path=./apps/pc/1981/visicalc/bin/vc.com;../README.md --format=json --output=./apps/pc/1981/visicalc/disk.json
*/
DiskDump.CLI = function()
{
var err = null;
var args = proc.getArgs();
fConsole = true;
if (args.argc) {
var argv = args.argv;
if (argv['debug'] !== undefined) fDebug = argv['debug'];
if (fDebug) {
DiskDump.logConsole("cwd: " + process.cwd());
DiskDump.logConsole("args: " + JSON.stringify(argv));
}
var sDiskPath = null, sServerRoot = "";
var sDir = argv['dir'], sDisk = (argv['disk'] || argv['img']), sPath = argv['path'];
if (typeof sDir == "string") {
sDiskPath = sDir;
}
else if (typeof sDisk == "string") {
sDiskPath = sDisk;
}
else if (typeof sPath == "string") {
sDiskPath = sPath;
}
if (sDiskPath && sDiskPath.charAt(0) != '/') sServerRoot = process.cwd();
var asExclude = argv['exclude'];
if (asExclude && typeof asExclude == "string") asExclude = [asExclude];
/*
* Create some sensible defaults for --manifest and --output when no values are specified
*/
var sManifestFile = argv['manifest'];
if (typeof sManifestFile == "boolean") {
sManifestFile = "manifest.xml";
}
if (sManifestFile && sManifestFile.charAt(0) != '/') {
sManifestFile = path.join(process.cwd(), sManifestFile);
}
var sOutput = "";
var sOutputFile = argv['output'];
if (typeof sOutputFile == "string" && !str.endsWith(sOutputFile, ".img") && !str.endsWith(sOutputFile, ".json")) {
sOutput = sOutputFile;
sOutputFile = true;
}
if (typeof sOutputFile == "boolean") {
if (sDir || sDisk) {
sOutput = path.join(sOutput, path.basename(sDir || sDisk));
var i = sOutput.lastIndexOf('.');
if (i > 0) {
var sExt = sOutput.substr(i);
if (sExt == ".img" || sExt == ".json") sOutput = sOutput.substr(0, i);
}
} else {
sOutput = "disk";
}
sOutputFile = sOutput + '.' + argv['format'];
}
if (sOutputFile && sOutputFile.charAt(0) != '/') sOutputFile = path.join(process.cwd(), sOutputFile);
var fOverwrite = argv['overwrite'];
var sManifestTitle = argv['title'];
if (sDiskPath) {
var disk = new DiskDump(sDiskPath, asExclude, argv['format'], argv['comments'], argv['mbhd'], sServerRoot, sManifestFile, argv);
if (sDir) {
disk.buildImage(true, function(err) {
DiskDump.outputDisk(err, disk, sDiskPath, sOutputFile, fOverwrite, sManifestTitle);
});
}
else if (sDisk) {
disk.loadFile(function(err) {
DiskDump.outputDisk(err, disk, sDiskPath, sOutputFile, fOverwrite, sManifestTitle);
});
}
else if (sPath) {
disk.buildImage(false, function(err) {
DiskDump.outputDisk(err, disk, sDiskPath, sOutputFile, fOverwrite, sManifestTitle);
});
}
} else {
err = new Error("no dir|disk|path specified");
}
}
else {
DiskDump.logConsole("usage: diskdump --dir={dir}|--disk={disk}|--path={file}[;{file}...] [--format=json|data|hex|bytes|img] [--comments] [--output={file}] [--manifest={file}] [--xdf]");
}
if (err) {
DiskDump.logError(err);
process.exit(1);
}
};
/**
* outputDisk(err, disk, sDiskPath, sOutputFile, fOverwrite, sManifestTitle)
*
* @param {Error} err
* @param {DiskDump} disk
* @param {string} sDiskPath
* @param {string} sOutputFile
* @param {boolean} fOverwrite
* @param {string} [sManifestTitle]
*/
DiskDump.outputDisk = function(err, disk, sDiskPath, sOutputFile, fOverwrite, sManifestTitle)
{
if (!err) {
/*
* The caller may have built an image (or loaded an IMG file), in which case
* bufDisk will be set (otherwise, jsonDisk will be set). We then look for pending
* conversions: if a disk image was built/loaded, but the requested format was not,
* call convertToJSON(). Similarly, if bufDisk is not set and a raw image was
* requested, call convertToIMG().
*/
var data = disk.bufDisk;
if (data) {
if (disk.sFormat != DumpAPI.FORMAT.IMG) {
data = disk.convertToJSON();
}
} else {
if (disk.sFormat == DumpAPI.FORMAT.IMG) {
data = disk.convertToIMG();
}
}
if (data) {
var cbDisk = (disk.bufDisk? disk.bufDisk.length : data.length);
if (sOutputFile) {
var fUnchanged;
var md5Disk = null, md5JSON = null;
if (disk.sManifestFile) {
if (typeof data == "string") {
md5JSON = crypto.createHash('md5').update(data).digest('hex');
}
if (disk.bufDisk) {
md5Disk = crypto.createHash('md5').update(disk.bufDisk).digest('hex');
}
fUnchanged = DiskDump.updateManifest(disk, disk.sManifestFile, sDiskPath, sOutputFile, true, sManifestTitle, md5Disk, md5JSON);
}
try {
if (fUnchanged) {
DiskDump.logConsole(sOutputFile + " unchanged");
} else {
if (fs.existsSync(sOutputFile) && !fOverwrite) {
DiskDump.logConsole(sOutputFile + " exists, use --overwrite to rewrite");
} else {
var sDirName = path.dirname(sOutputFile);
if (!fs.existsSync(sDirName)) mkdirp.sync(sDirName);
fs.writeFileSync(sOutputFile, data);
DiskDump.logConsole(cbDisk + "-byte disk image saved to " + sOutputFile);
}
}
} catch(e) {
err = e;
}
} else {
/*
* We'll dump JSON to the console, but not a raw disk buffer; we could add an option to
* "stringify" buffers, but if that's what the caller wants, they should use "--format=json".
*/
if (typeof data == "string") {
DiskDump.logConsole(data);
} else {
DiskDump.logConsole("specify --output={file} to save " + cbDisk + "-byte disk image");
}
}
} else {
err = new Error("unable to convert " + disk.sDiskPath);
}
}
if (err) {
DiskDump.logError(err);
process.exit(1);
}
};
/**
* getManifestAttr(sID, sTag)
*
* @param sID
* @param sTag
* @return {string|null}
*/
DiskDump.getManifestAttr = function(sID, sTag)
{
var match = sTag.match(new RegExp(sID + '="([^"]*)"'));
if (match) return match[1];
return null;
};
/**
* updateManifest(disk, sManifestFile, sDiskPath, sOutputFile, fOverwrite, sTitle, md5Disk, md5JSON)
*
* This function reports a change if EITHER the md5Disk value does not match the original
* "md5" value recorded in the manifest OR the manifest itself has changed. If md5JSON is
* also provided, we require that to match as well.
*
* Since this function is for command-line use only, we use *Sync functions, so that we can
* return the results immediately.
*
* @param {DiskDump} disk
* @param {string} sManifestFile
* @param {string} sDiskPath
* @param {string} sOutputFile
* @param {boolean} fOverwrite
* @param {string} [sTitle]
* @param {string} [md5Disk] for the entire disk image
* @param {string} [md5JSON] for the entire JSON-encoded disk image, if any
* @return {boolean|undefined} true if disk has changed, false if not, undefined if unknown
*/
DiskDump.updateManifest = function(disk, sManifestFile, sDiskPath, sOutputFile, fOverwrite, sTitle, md5Disk, md5JSON)
{
var i, fUnchanged, fExists = false, sXML, err = null;
var sMatchDisk = null, sIDDisk = null, sMD5Disk = null, sMD5JSON = null;
try {
sXML = fs.readFileSync(sManifestFile, {encoding: "utf8"});
fExists = true;
} catch(e) {
var sPrefix = "";
if (!sTitle) {
sTitle = str.getBaseName(disk.sDiskPath);
if (sTitle) {
sTitle = sTitle.charAt(0).toUpperCase() + sTitle.substr(1);
}
}
if (sTitle) {
i = sTitle.indexOf(':');
if (i > 0) sPrefix = ' prefix="' + sTitle.substr(0, i) + '"';
}
sXML = '<?xml version="1.0" encoding="UTF-8"?>\n';
sXML += '<?xml-stylesheet type="text/xsl" href="/versions/pcjs/' + pkg.version + '/manifest.xsl"?>\n';
sXML += '<manifest type="software">\n';
sXML += '\t<title' + sPrefix + '>' + sTitle + '</title>\n';
sXML += '</manifest>';
}
i = sOutputFile.indexOf("/disks/");
if (i > 0) {
sOutputFile = sOutputFile.substr(i);
} else {
i = sOutputFile.indexOf("/apps/");
if (i > 0) {
sOutputFile = sOutputFile.substr(i);
}
}
var match = sXML.match(new RegExp('[ \t]*<disk ([^>]*href="' + sOutputFile + '"[^>]*?)(>[\\s\\S]*?</disk>|/>)[ \t]*\n?'));
if (match) {
sMatchDisk = match[0];
sIDDisk = DiskDump.getManifestAttr("id", match[1]);
sMD5Disk = DiskDump.getManifestAttr("md5", match[1]);
sMD5JSON = DiskDump.getManifestAttr("md5json", match[1]);
}
if (!sIDDisk) {
for (i = 1; i < 1000; i++) {
sIDDisk = i.toString();
if (sIDDisk.length < 2) sIDDisk = '0' + sIDDisk;
sIDDisk = "disk" + sIDDisk;
if (sXML.indexOf(' id="' + sIDDisk + '"') < 0) break;
}
if (i == 1000) {
err = new Error("manifest already contains " + i + " disks");
}
}
if (!err) {
/*
* Thanks to buildImage(), fDir is true if a "dir" parameter was provided, false if a "path" parameter was provided,
* and undefined otherwise, which implies a "disk" parameter (or no parameter at all -- in which case, why are we even here?)
*/
var sParm = null;
if (disk.fDir === true) {
sParm = "dir";
} else if (disk.fDir === undefined) {
sParm = "img";
}
/*
* Build a "size" attribute with the total disk size in bytes and a "chs" attribute that describes the disk geometry; eg:
*
* size="368640" chs="40:2:9"
*/
var size = 0, sCHS = "";
if (disk.dataDisk) {
sCHS = disk.dataDisk.length + ':' + disk.dataDisk[0].length + ':' + disk.dataDisk[0][0].length;
size = disk.dataDisk.length * disk.dataDisk[0].length * disk.dataDisk[0][0].length * disk.dataDisk[0][0][0].length;
}
var sXMLDisk = '\t<disk id="' + sIDDisk + '"' + (size? ' size="' + size + '"' : '') + (sCHS? ' chs="' + sCHS + '"' : '') + (sParm? ' ' + sParm + '="' + sDiskPath + '"' : '') + ' href="' + sOutputFile + '"' + (md5Disk? ' md5="' + md5Disk + '"' : '') + (md5JSON? ' md5json="' + md5JSON + '"' : '') + '>\n';
var sName = "";
if (sMatchDisk && (match = sMatchDisk.match(/<name>([^>]*)<\/name>/))) {
sName = match[1];
}
if (!sName && sXML.indexOf("\n\t<name>") < 0) {
sName = str.getBaseName(sOutputFile, true).toUpperCase();
}
if (sName) {
sXMLDisk += '\t\t<name>' + sName + '</name>\n';
}
if (sMatchDisk && (match = sMatchDisk.match(/<from [^>]*?\/>/))) {
sXMLDisk += '\t\t' + match[0] + '\n';
}
var sBaseDir = null;
for (i = 0; i < disk.aManifestInfo.length; i++) {
var sAttrs = "";
var fileInfo = disk.aManifestInfo[i];
if (fileInfo.FILE_SIZE < 0) continue; // ignore non-file entries
var sDir = path.dirname(fileInfo.FILE_PATH) + '/';
if (sBaseDir === null) sBaseDir = sDir;
sAttrs += ' size="' + fileInfo.FILE_SIZE + '"';
sAttrs += ' time="' + usr.formatDate("Y-m-d H:i:s", fileInfo.FILE_TIME) + '"';
sAttrs += ' attr="0x' + fileInfo.FILE_ATTR.toString(16) + '"';
if (fileInfo.FILE_MD5) sAttrs += ' md5="' + fileInfo.FILE_MD5 + '"';
if (!sDir.indexOf(sBaseDir)) {
sDir = sDir.substr(sBaseDir.length);
if (sDir) {
sAttrs += ' dir="' + sDir + '"';
}
}
sXMLDisk += '\t\t<file' + sAttrs + '>' + fileInfo.FILE_NAME + '</file>\n';
}
sXMLDisk += '\t</disk>\n';
sXMLDisk = sXMLDisk.replace(/(<disk[^>]*)>\s*<\/disk>/, "$1/>");
if (!sMatchDisk) {
sMatchDisk = '</manifest>';
sXMLDisk += sMatchDisk;
}
if (sMatchDisk != sXMLDisk) {
fUnchanged = false;
sXML = sXML.replace(sMatchDisk, sXMLDisk);
if (fOverwrite || !fExists) {
try {
fs.writeFileSync(sManifestFile, sXML);
DiskDump.logConsole(sManifestFile + " updated");
} catch(e) {
err = e;
}
} else {
DiskDump.logConsole(sManifestFile + " exists, use --overwrite to rewrite");
if (fDebug) DiskDump.logConsole(sXML);
}
} else {
DiskDump.logConsole(sManifestFile + " unchanged");
fUnchanged = (!md5Disk || !sMD5Disk || (md5Disk == sMD5Disk && (!md5JSON || md5JSON == sMD5JSON)));
}
}
DiskDump.logError(err);
return fUnchanged;
};
/**
* logConsole(s)
*
* @param {string} s
* @return {string}
*/
DiskDump.logConsole = function(s)
{
if (fConsole) console.log(s);
if (logFile) logFile.write(s + "\n");
return s;
};
/**
* logError(err)
*
* Conditionally logs an error to the console
*
* @param {Error} err
* @return {string} the error message that was logged (or that would have been logged had logging been enabled)
*/
DiskDump.logError = function(err)
{
var sError = "";
if (err) {
sError = "diskdump error: " + err.message;
DiskDump.logConsole(sError);
}
return sError;
};
/**
* logWarning(s)
*
* Conditionally logs a warning to the console
*
* @param {string} s
* @return {string} the warning message that was logged (or that would have been logged had logging been enabled)
*/
DiskDump.logWarning = function(s)
{
var sWarning = "";
if (s) {
sWarning = "diskdump warning: " + s;
DiskDump.logConsole(sWarning);
}
return sWarning;
};
/**
* getStat(sPath, done)
*
* An alternative to fs.stat() that handles supported remote files, in addition to local files
*
* @param {string} sPath
* @param {function(Error,Object)} done
*/
DiskDump.getStat = function(sPath, done)
{
net.isRemote(sPath)? net.getStat(sPath, done) : fs.stat(sPath, done); // jshint ignore:line
};
/**
* readFile(sPath, sEncoding, done)
*
* An alternative to fs.readFile() that handles supported remote files, in addition to local files
*
* @param {string} sPath
* @param {string|null} sEncoding
* @param {function(Error,Buffer|string)} done
*/
DiskDump.readFile = function(sPath, sEncoding, done)
{
if (net.isRemote(sPath)) {
/*
* Just a quick verification that the getStat() function works...
*
net.getStat(sPath, function(err, stats) {
if (!err) {
DiskDump.logConsole(stats);
} else {
DiskDump.logError(err);
}
});
*/
net.getFile(sPath, sEncoding, function doneReadFileRemote(err, status, buf) {
done(err, buf);
});
} else {
fs.readFile(sPath, {encoding: sEncoding}, function doneReadFileLocal(err, buf) {
done(err, buf);
});
}
};
/*
* Object methods
*/
/**
* isExcluded(sName)
*
* @this {DiskDump}
* @param {string} sName is the basename of a file under consideration
* @return {boolean} is true if the file should be excluded, false if not
*/
DiskDump.prototype.isExcluded = function(sName)
{
sName = sName.toUpperCase();
for (var i = 0; i < this.asExclude.length; i++) {
var sExclude = this.asExclude[i].toUpperCase();
if (sName == sExclude) return true;
if (sExclude.charAt(0) == '.') {
if (sExclude.charAt(1) == '*') {
if (sName.charAt(0) == '.') return true;
} else {
if (str.endsWith(sName, sExclude)) return true;
}
}
}
return false;
};
/**
* loadFile(done)
*
* This used to be part of the DiskDump constructor, but I felt it would be safer to separate
* object creation from any I/O that the object may perform, to ensure that a callback can never
* be called before the caller has actually received the newly created object.
*
* @this {DiskDump}
* @param {function(Error)} done
*/
DiskDump.prototype.loadFile = function(done)
{
/*
* When the 'encoding' property of the 'options' object is null (or the 'options'
* object is omitted altogether), the callback's 2nd parameter will be a Buffer object
* rather than a String.
*/
var obj = this;
var sEncoding = null;
if (this.sDiskPath.slice(-5) == ".json") sEncoding = "utf8";
DiskDump.readFile(this.sDiskPath, sEncoding, function doneLoadFile(err, buf) {
obj.setData(err, buf, done);
});
};
/**
* setData(err, buf, done)
*
* Records the loaded disk data buffer
*
* @this {DiskDump}
* @param {Error} err
* @param {Buffer|string} buf
* @param {function(Error)} done
*/
DiskDump.prototype.setData = function(err, buf, done)
{
if (err) {
DiskDump.logError(err); // DiskDump.logConsole("unable to read " + this.sDiskPath);
done(err);
return;
}
/*
* Record the disk data buffer, and then notify the caller
*/
if (typeof buf == "string") {
this.jsonDisk = buf;
/*
* The following code is non-essential, but it's handy for forcing existing JSON to be
* regenerated; here, we assume that it's unlikely any JSON stored on the server was stored
* with comments, so if the caller has requested comments, we immediately convert the
* JSON to a Buffer and throw the JSON away. The next convertToJSON() call will take care
* of the rest.
*
* We could also move this functionality into its own function, or wait until the
* caller actually calls convertToJSON() -- although if the caller inadvertently calls
* convertToJSON() multiple times, you don't want to be regenerating the JSON every time.
*/
if (this.fJSONComments) {
if (this.convertToIMG()) {
/*
* Since convertToIMG() succeeded, we can safely blow away jsonDisk.
*/
this.jsonDisk = null;
}
}
} else {
this.bufDisk = buf;
}
done(null);
};
/**
* dumpLine(nIndent, sLine, sComment)
*
* @this {DiskDump}
* @param {number} [nIndent] is the relative number of characters to indent the given line (0 if none)
* @param {string} [sLine] is the given line
* @param {string} [sComment] is an optional comment to append to the line, if comment output is enabled
* @return {string} the indented/commented line
*/
DiskDump.prototype.dumpLine = function(nIndent, sLine, sComment)
{
if (nIndent < 0) {
this.nJSONIndent += nIndent;
}
if (this.fJSONComments) {
sLine = " ".substr(0, this.nJSONIndent) + (sLine? (sLine + (sComment? (" // " + sComment) : "") + "\n") : "");
}
if (nIndent > 0) {
this.nJSONIndent += nIndent;
}
return sLine;
};
/**
* dumpProp(sKey, value, fLast)
*
* @this {DiskDump}
* @param {string} sKey
* @param {number|string|null} value
* @param {boolean} [fLast]
* @return {string} the indented property
*/
DiskDump.prototype.dumpProp = function(sKey, value, fLast)
{
var sDump = "";
if (value) {
sDump += this.dumpLine(0, '"' + sKey + '":' + this.sJSONWhitespace + (typeof value == 'string'? ("'" + value + "'") : value) + (fLast? "" : ","));
}
return sDump;
};
/**
* dumpBuffer(sKey, buf, len, cbItem, offData)
*
* @this {DiskDump}
* @param {string|null} sKey is name of buffer data element
* @param {Buffer} buf is a Buffer containing the bytes to dump
* @param {number} len is the number of bytes to dump
* @param {number} cbItem is either 1 or 4, to dump bytes or dwords respectively
* @param {number} [offData] is a relative offset of this data within the parent (for display purposes only)
* @return {string} hex (or decimal) representation of the data
*/
DiskDump.prototype.dumpBuffer = function(sKey, buf, len, cbItem, offData)
{
var sDump = this.dumpLine(2, (sKey? '"' + sKey + '":' : "") + this.sJSONWhitespace + '[');
var sLine = "";
var sASCII = "";
var cMaxCols = 16 * cbItem;
if (offData === undefined) offData = 0;
/*
* TODO: Assert that off is always < buf.length as well.
*/
for (var off = 0; off < len; off += cbItem) {
var v = (cbItem == 1? buf.readUInt8(off) : buf.readInt32LE(off));
if (off) {
sLine += ",";
if ((off % cMaxCols) === 0) {
sDump += this.dumpLine(0, sLine, sASCII);
sLine = sASCII = "";
}
}
if (cbItem > 1) {
sLine += v;
}
else {
sLine += str.toHexByte(v);
if (!sASCII) sASCII = "0x" + str.toHex(offData + off) + " ";
sASCII += (v >= 0x20 && v < 0x7F && v != 0x3C && v != 0x3E? String.fromCharCode(v) : ".");
}
}
sDump += this.dumpLine(0, sLine + "]", sASCII);
this.dumpLine(-2);
return sDump;
};
/**
* dumpTrackOSI(sTrackSig, nTrackNum, nTrackType, nTrackLoad)
*
* Dumps track data for an OSI disk track
*
* @this {DiskDump}
* @param {string} sTrackSig
* @param {number} nTrackNum
* @param {number} nTrackType
* @param {number} [nTrackLoad]
* @return {string}
*/
DiskDump.prototype.dumpTrackOSI = function(sTrackSig, nTrackNum, nTrackType, nTrackLoad)
{
var sDump = "";
nTrackNum = Math.floor(nTrackNum / 16) * 10 + (nTrackNum % 16);
sDump += this.dumpLine(2, "{");
sDump += this.dumpProp("trackSig", sTrackSig);
sDump += this.dumpProp("trackNum", nTrackNum);
sDump += this.dumpProp("trackType", nTrackType);
sDump += this.dumpProp("trackLoad", nTrackLoad);
sDump += this.dumpLine(2, '"sectors":' + this.sJSONWhitespace + '[');
return sDump;
};
/**
* dumpSectorOSI(nSectorSig, nSectorNum, nSectorPages, bufSector, sSectorEndSig, nSectorOffset)
*
* Dumps sector data for an OSI disk sector
*
* @this {DiskDump}
* @param {number|null} nSectorSig
* @param {number} nSectorNum
* @param {number} nSectorPages
* @param {Buffer} bufSector
* @param {string|null} sSectorEndSig
* @param {number} nSectorOffset
* @return {string}
*/
DiskDump.prototype.dumpSectorOSI = function(nSectorSig, nSectorNum, nSectorPages, bufSector, sSectorEndSig, nSectorOffset)
{
var sDump = "";
sDump += this.dumpLine(2, "{");
sDump += this.dumpProp("sectorSig", nSectorSig);
sDump += this.dumpProp("sectorNum", nSectorNum);
sDump += this.dumpProp("sectorPages", nSectorPages);
sDump += this.dumpProp("sectorEndSig", sSectorEndSig);
sDump += this.dumpBuffer("sectorData", bufSector, bufSector.length, 1, nSectorOffset);
return sDump;
};
/**
* trimSector(buf, len)
*
* If dwPattern is not null, then cbBuffer is the number of unique bytes
* at the beginning of the sector, and dwPattern is the 32-bit pattern that
* fills out the rest of the sector.
*
* There are many compression schemes I could have adopted to reduce the size of
* JSON-encoded disk images, but for now, I keep it simple: trim all bytes from
* the end of each sector that match. This is easy for the simulator to deal with,
* since all it has to do is append zeros (or the specified pattern byte) to every
* under-sized sector.
*
* NOTE: The C1Pjs Simulator doesn't support this feature (yet), which is why
* trimSector() isn't used when dumping OSI disk images.
*
* @this {DiskDump}
* @param {Buffer} buf
* @param {number} len
* @return {Array} containing [dwPattern, cbBuffer]
*/
DiskDump.prototype.trimSector = function(buf, len)
{
var cbTrim = 0;
var cbBuffer = buf.length;
var cbPattern = 4;
var dwPattern = null;
if (cbBuffer == len) { // sector must be full-size (we don't pad it with zeros first like convdisk.php did)
var off = cbBuffer - cbPattern;
dwPattern = buf.readInt32LE(off);
while ((off -= cbPattern) >= 0) {
var dw = buf.readInt32LE(off);
// if (fDebug) DiskDump.logConsole("0x" + str.toHex(off) + ": comparing 0x" + str.toHex(dw) + " to pattern 0x" + str.toHex(dwPattern));
if (dw != dwPattern) break;
cbTrim += cbPattern;
}
}
if (cbTrim < 8) {
dwPattern = null;
} else {
cbBuffer -= (cbTrim + cbPattern);
}
return [dwPattern, cbBuffer];
};
/*
* fileInfo objects have the following properties:
*
* FILE_NAME: the 8.3 name to use
* FILE_PATH: the fully-qualified host path, if any
* FILE_ATTR: the attribute bits to use (see the ATTR constants below)
* FILE_TIME: a Date object representing the file's modification date/time, null if unknown
* FILE_SIZE: the size of the file, in bytes (or -1, in which case FILE_DATA is another aFiles array)
* FILE_DATA: the file's data (either a string or a Buffer), which may either be pre-read or deferred to buildClusters()
* FILE_CLUS: the cluster to be assigned to the file, if any
*
* Next up: assorted FAT file system constants.
*/
DiskDump.ATTR_READONLY = 0x01;
DiskDump.ATTR_HIDDEN = 0x02;
DiskDump.ATTR_SYSTEM = 0x04;
DiskDump.ATTR_VOLUME = 0x08;
DiskDump.ATTR_SUBDIR = 0x10;
DiskDump.ATTR_ARCHIVE = 0x20;
/**
* validateTime(dateTime)
*
* @this {DiskDump}
* @param {Date} dateTime
* @return {boolean} true if date/time modified, false if not
*/
DiskDump.prototype.validateTime = function(dateTime)
{
var fModified = false;
if (dateTime) {
var year = dateTime.getFullYear();
var month = dateTime.getMonth();
var day = dateTime.getDate();
var hours = dateTime.getHours();
var minutes = dateTime.getMinutes();
var seconds = dateTime.getSeconds();
/*
* The year in a DOS modification date occupies 7 bits and is interpreted as a non-negative value (0-127)
* that is added to the base year of 1980, so the range of valid years is 1980-2107. However, it's worth
* nothing that in PC-DOS 2.0, I observed a date with the largest possible year value (127) displayed as
* "12-31-:7" (an ASCII ':' is the next highest character after '0'). While that DOES distinguish the year
* 2007 from the year 2107, we probably shouldn't allow any year > 2099, to eliminate confusion.
*
* In fact, it might be worth setting the upper limit to 2079, otherwise a date like "12-31-81" is ambiguous
* (it could mean 1981 or 2081). But I'll stick to a limit of 2099 for now.
*/
if (year < 1980) {
year = 1980; month = 0; day = 1;
hours = 0; minutes = 0; seconds = 2; // PC-DOS 2.0 won't display times that are completely zero
fModified = true;
} else if (year > 2099) {
year = 2099; month = 11; day = 31;
hours = 23; minutes = 59; seconds = 2;
fModified = true;
}
if (fModified) {
dateTime.setFullYear(year, month, day);
dateTime.setHours(hours, minutes, seconds);
}
}
return fModified;
};
/**
* buildData(cb)
*
* @this {DiskDump}
* @param {number} cb
* @param {Array.<number>} [abInit]
* @return {Array.<number>} of bytes zero-initialized
*/
DiskDump.prototype.buildData = function(cb, abInit)
{
var ab = new Array(cb);
for (var i = 0; i < cb; i++) {
ab[i] = (abInit && i < abInit.length? abInit[i] : 0);
}
return ab;
};
/**
* copyData(ab)
*
* @this {DiskDump}
* @param {number} offDisk
* @param {Array.<number>} ab
* @return {number} number of bytes written
*/
DiskDump.prototype.copyData = function(offDisk, ab)
{
var buf = new Buffer(ab);
buf.copy(this.bufDisk, offDisk);
return ab.length;
};
/**
* addManifestInfo(fileInfo)
*
* @this {DiskDump}
* @param {Object} fileInfo
*/
DiskDump.prototype.addManifestInfo = function(fileInfo)
{
this.aManifestInfo.push(fileInfo);
};
/**
* isTextFile(sFileName)
*
* @this {DiskDump}
* @param {string} sFileName
* @return {boolean} true if the filename contains a known text file extension, false if unknown
*/
DiskDump.prototype.isTextFile = function(sFileName)
{
for (var i = 0; i < DiskDump.asTextFileExts.length; i++) {
if (str.endsWith(sFileName, DiskDump.asTextFileExts[i])) return true;
}
return false;
};
/**
* readDir(sDir, fRoot, done)
*
* Returns an array (aFiles) via the done() callback, where each entry is a fileInfo object.
* If fileInfo refers to a subdirectory, then FILE_SIZE is -1 and FILE_DATA entry is another aFiles array.
*
* @this {DiskDump}
* @param {string} sDir is a fully-qualified directory name
* @param {boolean} [fRoot] should be true for the first directory read
* @param {function(Error,Array)} done
*/
DiskDump.prototype.readDir = function(sDir, fRoot, done)
{
var fileInfo;
var aFiles = [];
/*
* Use the directory name as a candidate for a volume label as well, if it's upper-case and
* 11 characters or less (after we remove any numeric prefix that we may have added to indicate
* disk order, that is).
*/
if (fRoot) {
fileInfo = this.buildVolLabel(sDir);
if (fileInfo) {
aFiles.push(fileInfo);
// this.addManifestInfo(fileInfo);
}
}
var obj = this;
var cCallbacks = 0;
fs.readdir(sDir, function doneReadDir(err, asFiles) {
var iFile;
if (err) {
done(err, null);
return;
}
/*
* Sorting file names now (since they're just strings) is easier/faster than sorting the filtered
* aFiles array later (which would require the use of a compare function), so we do the sort now; it
* has no bearing on the outcome. Note that the lack of a stable sort in JavaScript also has no
* bearing, because we're sorting on name, and every name is different.
*
* However, it's not entirely clear whether this is strictly necessary. I think the variations in
* file name order that I was originally seeing may have simply been due to out-of-order fs.stat()
* calls, because I used to call addManifestInfo() in the callback.
*/
// if (fNormalize) asFiles.sort();
for (iFile = 0; iFile < asFiles.length; iFile++) {
var sFileName = asFiles[iFile];
/*
* fs.readdir() already excludes "." and ".." but there are also a wide variety of hidden
* files on *nix systems that begin with a period, which in general we should ignore, too.
*
* TODO: Consider an override option that will allow hidden file(s) to be included as well.
*/
if (sFileName.charAt(0) == '.') continue;
var sFilePath = path.join(sDir, sFileName);
fileInfo = {};
/*
* TODO: Verify that buildName() didn't change the name into one that already exists in this directory.
* In the normal case, the directory being read already contains files named according to DOS conventions,
* and therefore they will automatically be unique.
*/
if (obj.isExcluded(sFileName)) continue;
fileInfo.FILE_NAME = obj.buildName(sFileName);
fileInfo.FILE_PATH = sFilePath;
aFiles.push(fileInfo);
/*
* We add the fileInfo objects to the aManifestInfo array NOW, because the fs.stat() callbacks may
* occur out-of-order. The only downside is that non-file entries can now appear in the array, which
* means updateManifest() will want to check for those and ignore them.
*/
obj.addManifestInfo(fileInfo);
}
var errSave = null;
for (iFile = 0; iFile < aFiles.length; iFile++) {
if (!aFiles[iFile].FILE_PATH) continue;
(function readDirEntry(fileInfo) {
cCallbacks++;
fs.stat(fileInfo.FILE_PATH, function doneStat(err, stats) {
if (!err) {
fileInfo.FILE_TIME = stats.mtime; // NOTE: This is a Date object
obj.validateTime(fileInfo.FILE_TIME);
if (stats.isDirectory()) {
fileInfo.FILE_ATTR = DiskDump.ATTR_SUBDIR;
fileInfo.FILE_SIZE = -1;
obj.readDir(fileInfo.FILE_PATH, false, function(err, aFilesDir) {
fileInfo.FILE_DATA = aFilesDir;
if (err && !errSave) errSave = err;
if (!--cCallbacks) done(errSave, aFiles);
});
return;
} else {
fileInfo.FILE_ATTR = DiskDump.ATTR_ARCHIVE;
fileInfo.FILE_SIZE = stats.size;
if (obj.isTextFile(fileInfo.FILE_NAME)) {
fs.readFile(fileInfo.FILE_PATH, {encoding: "utf8"}, function doneReadDirEntry(err, s) {
if (!err) {
s = s.replace(/\n/g, "\r\n").replace(/\r\r/g, "\r");
fileInfo.FILE_DATA = s;
fileInfo.FILE_SIZE = s.length;
} else {
if (!errSave) errSave = err;
}
// obj.addManifestInfo(fileInfo);
if (!--cCallbacks) done(errSave, aFiles);
});
return;
}
// obj.addManifestInfo(fileInfo);
}
} else {
if (!errSave) errSave = err;
}
if (!--cCallbacks) done(errSave, aFiles);
});
}(aFiles[iFile])); // jshint ignore:line
}
if (!cCallbacks) done(errSave, aFiles);
});
};
/**
* readPath(sPath, done)
*
* Returns an array (aFiles) via the done() callback, where each entry is a fileInfo object.
* If fileInfo refers to a subdirectory, then FILE_SIZE is -1 and FILE_DATA entry is another aFiles array.
*
* NOTE: sPath begins fully-qualified (see this.sDiskPath), but if any of the intermediate entries contains paths,
* it's our responsibility to join them with sServerRoot.
*
* @this {DiskDump}
* @param {string} sPath contains series of semi-colon-separated files (local or remote)
* @param {function(Error,Array)} done
*/
DiskDump.prototype.readPath = function(sPath, done)
{
var aFiles = [];
var asFiles = sPath.split(';');
var sDefaultPath = "";
var fileInfo = this.buildVolLabel();
if (fileInfo) {
aFiles.push(fileInfo);
// this.addManifestInfo(fileInfo);
}
for (var iFile = 0; iFile < asFiles.length; iFile++) {
fileInfo = {};
var sFileName = asFiles[iFile];
var i = sFileName.lastIndexOf('/');
if (i >= 0) {
if (sFileName.indexOf("..") < 0) {
sDefaultPath = sFileName.substr(0, i);
/*
* The DiskDump constructor joins the beginning of sPath with sServerRoot,
* but if there are any intermediate paths, we have to join them ourselves.
*/
if (iFile > 0 && !net.isRemote(sDefaultPath)) {
sDefaultPath = path.join(this.sServerRoot, sDefaultPath);
}
sFileName = sFileName.substr(i+1);
} else {
/*
* TODO: We need to permit ".." without compromising the server...
*
var err = new Error('invalid file "' + sFileName + '"');
done(err, null);
return;
*/
}
}
/*
* Ordinarily, sFileName will already be the basename, except when it has a path element like "../"
*
* TODO: Verify that buildName() doesn't change the name into one that already exists.
* This is more of a problem than in readDir(), because all these names are user-supplied.
*/
var sBaseName = path.basename(sFileName);
if (this.isExcluded(sBaseName)) continue;
fileInfo.FILE_NAME = this.buildName(sBaseName);
fileInfo.FILE_PATH = path.join(sDefaultPath, sFileName);
fileInfo.FILE_TIME = null;
aFiles.push(fileInfo);
/*
* We add the fileInfo objects to the aManifestInfo array NOW, because the getStat() callbacks may
* occur out-of-order. The only downside is that non-file entries can now appear in the array, which
* means updateManifest() will want to check for those and ignore them.
*/
this.addManifestInfo(fileInfo);
}
var obj = this;
var cCallbacks = 0;
var errSave = null;
for (iFile = 0; iFile < aFiles.length; iFile++) {
if (!aFiles[iFile].FILE_PATH) continue;
(function readPathEntry(fileInfo) {
cCallbacks++;
var sFilePath = fileInfo.FILE_PATH;
/*
* TODO: See if we can eliminate some of the unfortunate redundancy between the code
* below and the very similar code in readDir(), such as the "README.md" pre-processing.
*
* However, in this case, because we want readPath() to support both local and remote
* paths, we call DiskDump.readFile() instead of fs.readFile().
*/
DiskDump.getStat(sFilePath, function doneReadPathStat(err, stats) {
if (!err) {
fileInfo.FILE_TIME = stats.mtime; // NOTE: This is a Date object
obj.validateTime(fileInfo.FILE_TIME);
if (!stats.remote && stats.isDirectory()) {
fileInfo.FILE_ATTR = DiskDump.ATTR_SUBDIR;
fileInfo.FILE_SIZE = -1;
obj.readDir(fileInfo.FILE_PATH, false, function(err, aFilesDir) {
fileInfo.FILE_DATA = aFilesDir;
if (err && !errSave) errSave = err;
if (!--cCallbacks) done(errSave, aFiles);
});
return;
} else {
fileInfo.FILE_ATTR = DiskDump.ATTR_ARCHIVE;
fileInfo.FILE_SIZE = stats.size;
if (obj.isTextFile(fileInfo.FILE_NAME)) {
DiskDump.readFile(sFilePath, "utf8", function doneReadPathEntry(err, sData) {
if (!err) {
sData = sData.replace(/\n/g, "\r\n").replace(/\r\r/g, "\r");
fileInfo.FILE_DATA = sData;
fileInfo.FILE_SIZE = sData.length;
// obj.addManifestInfo(fileInfo);
} else {
if (!errSave) errSave = err;
}
if (!--cCallbacks) done(errSave, aFiles);
});
return;
}
// obj.addManifestInfo(fileInfo);
}
} else {
if (!errSave) errSave = err;
}
if (!--cCallbacks) done(errSave, aFiles);
});
}(aFiles[iFile])); // jshint ignore:line
}
if (!cCallbacks) done(errSave, aFiles);
};
/**
* buildName(sFile)
*
* @this {DiskDump}
* @param {string} sFile is the basename of a file
* @return {string} containing a corresponding FAT-compatible filename
*/
DiskDump.prototype.buildName = function(sFile)
{
var sName = sFile.toUpperCase();
var iExt = sName.lastIndexOf('.');
var sExt = "";
if (iExt >= 0) {
sExt = sName.substr(iExt+1);
sName = sName.substr(0, iExt);
}
sName = sName.substr(0, 8).trim();
sExt = sExt.substr(0, 3).trim();
var iPeriod = -1;
if (sExt) {
iPeriod = sName.length;
sName += '.' + sExt;
}
for (var i = 0; i < sName.length; i++) {
if (i == iPeriod) continue;
var ch = sName.charAt(i);
if ("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%&'()-@^_`{}~".indexOf(ch) < 0) {
sName = sName.substr(0, i) + '_' + sName.substr(i+1);
}
}
return sName;
};
/**
* buildVolLabel(sDir)
*
* NOTE: When fileInfo is returned, there will be no FILE_PATH property, which means
* don't go looking for a corresponding entry in the host file system, because there isn't one.
*
* @this {DiskDump}
* @param {string} [sDir]
* @return {Object|null} fileInfo (or null if no suitable volume label)
*/
DiskDump.prototype.buildVolLabel = function(sDir)
{
var sVolume = null;
var fileInfo = null;
if (sDir) {
sVolume = path.basename(sDir);
if (sVolume == sVolume.toUpperCase()) {
var i = sVolume.indexOf('-');
if (i > 0) {
var sPrefix = sVolume.substr(0, i);
if (!sPrefix.match(/^\d+$/))
sVolume = null;
else
sVolume = sVolume.substr(i+1);
}
}
}
if (!sVolume) {
sVolume = DiskDump.MY_VOL_LABEL;
}
if (sVolume && sVolume.length <= 11) {
fileInfo = {};
fileInfo.FILE_NAME = this.buildName(sVolume);
fileInfo.FILE_ATTR = DiskDump.ATTR_VOLUME;
/*
* I used to initialize the volume label's date with a simple "new Date()", but because that results
* in a different disk image every time we run DiskDump, I've opted for a hard-coded date/time (ie, the
* day the IBM PC was introduced, August 12, 1981, with an arbitrary time of 12pm).
*/
fileInfo.FILE_TIME = fNormalize? new Date(1981, 7, 12, 12) : new Date();
this.validateTime(fileInfo.FILE_TIME);
fileInfo.FILE_SIZE = 0;
}
return fileInfo;
};
/**
* buildFAT(abFAT, aFiles, iCluster, cbCluster)
*
* @this {DiskDump}
* @param {Array.<number>} abFAT
* @param {Array} aFiles
* @param {number} iCluster
* @param {number} cbCluster
* @return {number}
*/
DiskDump.prototype.buildFAT = function(abFAT, aFiles, iCluster, cbCluster)
{
var cb;
var cSubDirs = 0;
for (var iFile = 0; iFile < aFiles.length; iFile++) {
cb = aFiles[iFile].FILE_SIZE;
if (cb < 0) {
cb = (aFiles[iFile].FILE_DATA.length + 2) * 32;
cSubDirs++;
}
var cFileClusters = ((cb + cbCluster - 1) / cbCluster) | 0;
if (!cFileClusters) {
aFiles[iFile].FILE_CLUS = 0;
} else {
aFiles[iFile].FILE_CLUS = iCluster;
while (cFileClusters-- > 0) {
var iNextCluster = iCluster + 1;
if (!cFileClusters) iNextCluster = 0xFFF;
// if (fDebug) DiskDump.logConsole(aFiles[iFile].FILE_NAME + ": setting cluster entry " + iCluster + " to " + str.toHexWord(iNextCluster));
this.buildFATEntry(abFAT, iCluster++, iNextCluster);
}
}
}
if (cSubDirs) {
for (iFile = 0; iFile < aFiles.length; iFile++) {
cb = aFiles[iFile].FILE_SIZE;
if (cb < 0) {
iCluster = this.buildFAT(abFAT, aFiles[iFile].FILE_DATA, iCluster, cbCluster);
}
}
}
return iCluster;
};
/**
* buildFATEntry(abFat, iFat, v)
*
* @this {DiskDump}
* @param {Array.<number>} abFAT
* @param {number} iFAT
* @param {number} v
*/
DiskDump.prototype.buildFATEntry = function(abFAT, iFAT, v)
{
var iBit = iFAT * 12;
var iByte = (iBit >> 3);
if ((iBit % 8) === 0) {
abFAT[iByte] = v & 0xff;
iByte++;
if (abFAT[iByte] === undefined) abFAT[iByte] = 0;
abFAT[iByte] = (abFAT[iByte] & 0xF0) | (v >> 8);
}
else {
if (abFAT[iByte] === undefined) abFAT[iByte] = 0;
abFAT[iByte] = (abFAT[iByte] & 0x0F) | ((v & 0xF) << 4);
iByte++;
abFAT[iByte] = (v >> 4);
}
};
/**
* buildDir(abDir, aFiles, dateMod, iCluster, iParentCluster)
*
* @this {DiskDump}
* @param {Array.<number>} abDir
* @param {Array} aFiles
* @param {Date} [dateMod]
* @param {number} [iCluster]
* @param {number} [iParentCluster]
* @return {number} number of directory entries built
*/
DiskDump.prototype.buildDir = function(abDir, aFiles, dateMod, iCluster, iParentCluster)
{
if (dateMod === undefined) dateMod = null;
if (iCluster === undefined) iCluster = -1;
if (iParentCluster === undefined) iParentCluster = -1;
var offDir = 0;
var cEntries = 0;
if (iCluster >= 0) {
offDir += this.buildDirEntry(abDir, offDir, ".", 0, DiskDump.ATTR_SUBDIR, dateMod, iCluster);
offDir += this.buildDirEntry(abDir, offDir, "..", 0, DiskDump.ATTR_SUBDIR, dateMod, iParentCluster);
cEntries += 2;
}
for (var iFile = 0; iFile < aFiles.length; iFile++) {
if (aFiles[iFile].FILE_CLUS === undefined) {
if (fDebug) DiskDump.logConsole("file " + aFiles[iFile].FILE_NAME + " missing cluster, skipping");
continue;
}
offDir += this.buildDirEntry(abDir, offDir, aFiles[iFile].FILE_NAME, aFiles[iFile].FILE_SIZE, aFiles[iFile].FILE_ATTR, aFiles[iFile].FILE_TIME, aFiles[iFile].FILE_CLUS);
cEntries++;
}
return cEntries;
};
/**
* buildDirEntry(ab, off, sFile, cbFile, bAttr, dateMod, iCluster)
*
* TODO: Create constants that define the various directory entry fields, including the overall size (32 bytes).
*
* @this {DiskDump}
* @param {Array.<number>} ab contains the bytes of a directory
* @param {number} off is the offset within ab to build the next directory entry
* @param {string} sFile is the file name
* @param {number} cbFile is the size of the file, in bytes
* @param {number} bAttr contains the attribute bits of the file
* @param {Date} dateMod contains the modification date of the file
* @param {number} iCluster is the starting cluster of the file
* @return {number} number of bytes added to the directory (normally 32)
*/
DiskDump.prototype.buildDirEntry = function(ab, off, sFile, cbFile, bAttr, dateMod, iCluster)
{
var offDir = off;
var sFileExt = "";
var i = sFile.indexOf('.');
if (i > 0) {
sFileExt = sFile.substr(i+1);
sFile = sFile.substr(0, i);
}
for (i = 0; i < 8; i++) {
ab[off++] = (i < sFile.length? sFile.charCodeAt(i) : 0x20);
}
for (i = 0; i < 3; i++) {
ab[off++] = (i < sFileExt.length? sFileExt.charCodeAt(i) : 0x20);
}
/*
* File attribute bits at offset 0x0B are next: (0x01 for read-only, 0x02 for hidden, 0x04 for system,
* 0x08 for volume label, 0x10 for subdirectory, and 0x20 for archive)
*/
ab[off++] = bAttr;
/*
* Skip 10 bytes, bringing us to offset 0x16: 2 bytes for modification time, plus 2 bytes for modification date.
*/
off += 10;
if (dateMod) {
var year = dateMod.getFullYear();
var month = dateMod.getMonth() + 1;
var day = dateMod.getDate();
var time = ((dateMod.getHours() & 0x1F) << 11) | ((dateMod.getMinutes() & 0x3F) << 5) | ((dateMod.getSeconds() >> 1) & 0x1F);
/*
* NOTE: If validateTime() is doing its job, then we should never have to do this. This is simple paranoia.
*/
if (year < 1980) {
year = 1980; month = 1; day = 1; time = 1;
} else if (year > 2099) {
year = 2099; month = 12; day = 31; time = 1;
}
ab[off++] = time & 0xff;
ab[off++] = time >> 8;
var date = (((year - 1980) & 0x7F) << 9) | (month << 5) | day;
ab[off++] = date & 0xff;
ab[off++] = date >> 8;
} else {
for (i = 0; i < 4; i++) {
ab[off++] = 0;
}
}
/*
* Now we're at offset 0x1A, where the starting cluster (2 bytes) and file size (4 bytes) are stored,
* completing the 32-byte directory entry.
*/
ab[off++] = iCluster & 0xff; // first file cluster (low byte)
ab[off++] = (iCluster >> 8) & 0xff; // first file cluster (high byte)
/*
* For subdirectories, we recorded a -1 rather than a 0, because unlike true 0-length files, they DO actually
* have a size, it's just not immediately known until we traverse the directory's contents. However, when it
* comes time to the write the directory entry for a subdirectory, the FAT convention is to record it as zero.
*/
if (cbFile < 0) cbFile = 0;
ab[off++] = cbFile & 0xff;
ab[off++] = (cbFile >> 8) & 0xff;
ab[off++] = (cbFile >> 16) & 0xff;
ab[off++] = (cbFile >> 24) & 0xff;
return off - offDir;
};
/**
* buildClusters(aFiles, offDisk, cbCluster, iParentCluster, done)
*
* @this {DiskDump}
* @param {Array} aFiles
* @param {number} offDisk
* @param {number} cbCluster
* @param {number} iParentCluster
* @param {number} iLevel
* @param {function(Error)} done
* @return {number} number of clusters built
*/
DiskDump.prototype.buildClusters = function(aFiles, offDisk, cbCluster, iParentCluster, iLevel, done)
{
var obj = this;
var cSubDirs = 0;
var cClusters = 0;
if (!iLevel) {
this.cWritesPending = 0;
}
for (var iFile = 0; iFile < aFiles.length; iFile++) {
var bufData = null;
var cbData = aFiles[iFile].FILE_SIZE;
if (cbData > 0) {
var sData = aFiles[iFile].FILE_DATA;
if (!sData) {
this.cWritesPending++;
(function readClusters(file, cb, off) {
fs.readFile(file.FILE_PATH, function doneReadClusters(err, buf) {
/*
* If cWritesPending has been prematurely zeroed, we assume that's because the buildClusters()
* caller discovered a problem (eg, the total number of clusters exceeds what can fit in the image),
* so we bail.
*/
if (!obj.cWritesPending) return;
if (!err) {
if (fDebug && cb != buf.length) DiskDump.logConsole(file.FILE_NAME + ": initial size (" + cb + ") does not match actual size (" + buf.length + ")");
buf.copy(obj.bufDisk, off);
if (fDebug) DiskDump.logConsole("0x" + str.toHex(off) + ": 0x" + str.toHex(buf.length) + " bytes written for " + file.FILE_PATH);
if (obj.sManifestFile) file.FILE_MD5 = crypto.createHash('md5').update(buf).digest('hex');
}
if (!--obj.cWritesPending) done(err);
});
}(aFiles[iFile], cbData, offDisk)); // jshint ignore:line
} else {
cbData = sData.length;
bufData = new Buffer(sData);
if (this.sManifestFile) aFiles[iFile].FILE_MD5 = crypto.createHash('md5').update(bufData).digest('hex');
}
}
else if (cbData < 0) {
var abData = [];
cbData = this.buildDir(abData, aFiles[iFile].FILE_DATA, aFiles[iFile].FILE_TIME, aFiles[iFile].FILE_CLUS, iParentCluster) * 32;
bufData = new Buffer(this.buildData(cbData, abData));
cSubDirs++;
}
if (bufData) {
bufData.copy(this.bufDisk, offDisk);
if (fDebug) DiskDump.logConsole("0x" + str.toHex(offDisk) + ": 0x" + str.toHex(bufData.length) + " bytes IMMEDIATELY written for " + aFiles[iFile].FILE_PATH);
}
offDisk += cbData;
cClusters += ((cbData / cbCluster) | 0);
var cbPartial = (cbData % cbCluster);
if (cbPartial) {
cbPartial = cbCluster - cbPartial;
offDisk += cbPartial;
cClusters++;
}
}
if (cSubDirs > 0) {
for (iFile = 0; iFile < aFiles.length; iFile++) {
var cb = aFiles[iFile].FILE_SIZE;
if (cb < 0) {
if (fDebug) DiskDump.logConsole("0x" + str.toHex(offDisk) + ": buildClusters()");
var cSubClusters = this.buildClusters(aFiles[iFile].FILE_DATA, offDisk, cbCluster, aFiles[iFile].FILE_CLUS, iLevel + 1, done);
cClusters += cSubClusters;
offDisk += cSubClusters * cbCluster;
if (fDebug) DiskDump.logConsole("0x" + str.toHex(offDisk) + ": buildClusters() returned, writing " + cSubClusters + " clusters");
}
}
}
if (!iLevel) {
if (!this.cWritesPending) done(null);
}
return cClusters;
};
/**
* buildImage()
*
* @this {DiskDump}
* @param {boolean} fDir
* @param {function(Error)} done
*/
DiskDump.prototype.buildImage = function(fDir, done)
{
var obj = this;
if ((this.fDir = fDir)) {
this.readDir(this.sDiskPath, true, function doneReadDir(err, aFiles) {
if (err) {
done(err);
return;
}
obj.buildImageFromFiles(aFiles, done);
});
} else {
this.readPath(this.sDiskPath, function doneReadPath(err, aFiles) {
if (err) {
done(err);
return;
}
obj.buildImageFromFiles(aFiles, done);
});
}
};
/**
* calcFileSizes(aFiles)
*
* WARNING: Our "total data" calculation should be rounding up to the next cluster,
* not the next sector, because data on the disk is cluster-granular, not sector-granular.
* But we have a chicken-and-egg problem: we won't know the cluster size until we've
* calculated total data and found a BPB we think will accommodate it. So, the code below
* will still have to be prepared for running out of disk space. This is just a good estimate.
*
* @this {DiskDump}
* @param {Array} aFiles
* @return {number} of bytes required for all files, including all subdirectories
*/
DiskDump.prototype.calcFileSizes = function(aFiles)
{
var cbTotal = 0;
for (var iFile = 0; iFile < aFiles.length; iFile++) {
var cb = aFiles[iFile].FILE_SIZE;
var cbSubTotal = 0;
if (cb < 0) {
cb = (aFiles[iFile].FILE_DATA.length + 2) * 32;
cbSubTotal = this.calcFileSizes(aFiles[iFile].FILE_DATA);
}
cbTotal += cb;
if ((cb %= 512)) {
cbTotal += 512 - cb; // WARNING: rounding to next sector may not be enough (see above)
}
cbTotal += cbSubTotal;
}
return cbTotal;
};
/**
* buildMBR(cHeads, cSectorsPerTrack, cbSector, cTotalSectors)
*
* @this {DiskDump}
* @param {number} cHeads
* @param {number} cSectorsPerTrack
* @param {number} cbSector
* @param {number} cTotalSectors
* @returns {Array.<number>}
*/
DiskDump.prototype.buildMBR = function(cHeads, cSectorsPerTrack, cbSector, cTotalSectors)
{
/*
* There are four 16-byte partition entries in the MBR, starting at offset 0x1BE,
* but we need only one, and like DOS 2.0, we'll use the last one, at offset 0x1EE.
*/
var offSector = 0x1EE;
var abSector = this.buildData(cbSector);
/*
* Next 1 byte: status + physical drive #
*/
abSector[offSector++] = 0x80; // 0x80 indicates an active partition entry
/*
* Next 3 bytes: CHS (Cylinder/Head/Sector) of first partition sector
*/
abSector[offSector++] = 0x00; // head: 0
abSector[offSector++] = 0x02; // sector: 1 (bits 0-5), cyclinder bits 8-9: 0 (bits 6-7)
abSector[offSector++] = 0x00; // cylinder bits 0-7: 0
/*
* Next 1 byte: partition ID
*/
abSector[offSector++] = 0x01; // partition ID: 0x01 (FAT12)
/*
* Next 3 bytes: CHS (Cylinder/Head/Sector) of last partition sector
*/
abSector[offSector++] = cHeads-1;
var cCylinders = (cTotalSectors / (cHeads * cSectorsPerTrack)) | 0;
abSector[offSector++] = cSectorsPerTrack | ((cCylinders & 0x300) >> 2);
abSector[offSector++] = cCylinders & 0xff;
/*
* Next 4 bytes: LBA (Logical Block Address) of first partition sector
*/
abSector[offSector++] = 1;
abSector[offSector++] = 0x00;
abSector[offSector++] = 0x00;
abSector[offSector++] = 0x00;
/*
* Next 4 bytes: Number of sectors in partition
*/
abSector[offSector++] = (cTotalSectors & 0xff);
abSector[offSector++] = ((cTotalSectors >> 8) & 0xff);
abSector[offSector++] = ((cTotalSectors >> 16) & 0xff);
abSector[offSector++] = ((cTotalSectors >> 24) & 0xff);
/*
* Since we should be at offset 0x1FE now, store the MBR signature bytes
*/
abSector[offSector++] = 0x55;
abSector[offSector] = 0xAA;
return abSector;
};
/**
* buildImageFromFiles(aFiles)
*
* Note, however, that even if this function returns true, you won't receive the buffer until
* all the writes to have it have finished.
*
* @this {DiskDump}
* @param {Array} aFiles
* @param {function(Error)} done
* @return {boolean} true if disk allocation successful, false if not
*/
DiskDump.prototype.buildImageFromFiles = function(aFiles, done)
{
var err;
if (!aFiles || !aFiles.length) {
done(null);
return false;
}
/*
* Put reasonable upper limits on both individual file sizes and the total size of all files.
*/
var cbMax = (this.mbHD? this.mbHD * 1024 * 1024 : 1440 * 1024);
var cbTotal = this.calcFileSizes(aFiles);
if (fDebug) DiskDump.logConsole("total calculated size for " + aFiles.length + " files/folders: " + cbTotal + " bytes (0x" + str.toHex(cbTotal) + ")");
if (cbTotal >= cbMax) {
err = new Error("file(s) too large (" + cbTotal + " bytes total, " + cbMax + " bytes maximum)");
done(err);
return false;
}
var abBoot, cbSector, cSectorsPerCluster, cbCluster, cFATs, cFATSectors;
var cRootEntries, cRootSectors, cTotalSectors, cSectorsPerTrack, cHeads, cDataSectors, cbAvail;
/*
* Find or build a BPB with enough capacity, and at the same time, calculate all
* the other values we'll need, including total number of data sectors (cDataSectors).
*/
for (var iBPB = 1; iBPB < DiskDump.aDefaultBPBs.length; iBPB++) {
/*
* If this BPB is for a hard disk but a hard disk size was not specified, skip it.
*/
abBoot = DiskDump.aDefaultBPBs[iBPB];
if ((abBoot[0x15] == 0xF8) != (this.mbHD > 0)) continue;
cbSector = abBoot[0x0B] | (abBoot[0x0C] << 8);
cSectorsPerCluster = abBoot[0x0D];
cbCluster = cbSector * cSectorsPerCluster;
cFATs = abBoot[0x10];
cFATSectors = abBoot[0x16] | (abBoot[0x17] << 8);
cRootEntries = abBoot[0x11] | (abBoot[0x12] << 8);
cRootSectors = (((cRootEntries * 0x20) + cbSector - 1) / cbSector) | 0;
cTotalSectors = abBoot[0x13] | (abBoot[0x14] << 8);
cSectorsPerTrack = abBoot[0x18] | (abBoot[0x19] << 8);
cHeads = abBoot[0x1A] | (abBoot[0x1B] << 8);
cDataSectors = cTotalSectors - cRootSectors - cFATs * cFATSectors + 1;
cbAvail = cDataSectors * cbSector;
if (cbTotal <= cbAvail) break; // found a BPB that works!
}
if (iBPB == DiskDump.aDefaultBPBs.length) {
err = new Error("file(s) too large for disk image (" + cbTotal + " vs. " + cbAvail + " bytes)");
done(err);
return false;
}
if (aFiles.length > cRootEntries) {
err = new Error("too many files for disk image (" + aFiles.length + " vs. " + cRootEntries + " max)");
done(err);
return false;
}
var abSector;
var offDisk = 0;
var cbDisk = cTotalSectors * cbSector;
/*
* TODO: Consider doing what convertToIMG() does, which is deferring setting this.bufDisk until the
* buffer is fully (and successfully) initialized. Here, however, the build process relies on worker
* functions that prefer not passing around temporary buffers. In the meantime, perhaps any catastrophic
* failures should set bufDisk back to null?
*/
this.bufDisk = new Buffer(cbDisk);
/*
* WARNING: Buffers are NOT zero-initialized, so we need explicitly fill bufDisk with zeros (this seems
* to be a reversal in the trend to zero buffers, when security concerns would trump performance concerns).
*/
this.bufDisk.fill(0);
/*
* Output a Master Boot Record (MBR), if a hard disk image was requested
*/
if (this.mbHD > 0) {
abSector = this.buildMBR(cHeads, cSectorsPerTrack, cbSector, cTotalSectors);
offDisk += this.copyData(offDisk, abSector);
}
/*
* Output a boot sector
*
* NOTE: I don't put a [0x55,0xAA] signature at the end, since it's not actually bootable.
*/
abSector = this.buildData(cbSector, abBoot);
offDisk += this.copyData(offDisk, abSector);
/*
* Build the FAT, noting the starting cluster number that each file will use along the way.
*/
var abFAT = [];
this.buildFATEntry(abFAT, 0, abBoot[0x15] | 0xF00);
this.buildFATEntry(abFAT, 1, 0xFFF);
this.buildFAT(abFAT, aFiles, 2, cbCluster);
/*
* Output the FAT sectors; we simplify the logic a bit by writing each FAT table as if it
* were one giant sector.
*/
while (cFATs--) {
abSector = this.buildData(cFATSectors * cbSector, abFAT);
offDisk += this.copyData(offDisk, abSector);
}
/*
* Build the root directory
*/
var abRoot = [];
var cEntries = this.buildDir(abRoot, aFiles);
/*
* PC-DOS 1.0 requires ALL unused directory entries to start with 0xE5; 0x00 isn't good enough,
* so we must loop through all the remaining directory entries and zap them with 0xE5.
*/
var offRoot = cEntries * 32;
while (cEntries++ < cRootEntries) {
abRoot[offRoot] = 0xE5;
offRoot += 32;
}
/*
* Output the root directory sectors (as before, as if they were one giant sector)
*/
abSector = this.buildData(cRootSectors * cbSector, abRoot);
offDisk += this.copyData(offDisk, abSector);
/*
* Output the file data clusters, which must be stored sequentially, mirroring the order in which
* we wrote the cluster sequences to the FAT, above.
*/
var cClusters = this.buildClusters(aFiles, offDisk, cbCluster, 0, 0, done);
offDisk += cClusters * cSectorsPerCluster * cbSector;
if (fDebug) DiskDump.logConsole(offDisk + " bytes written, " + cbDisk + " bytes available");
if (offDisk > cbDisk) {
err = new Error("too much data for disk image (" + cClusters + " clusters required)");
this.cWritesPending = 0;
done(err);
return false;
}
return true;
};
/**
* convertToJSON()
*
* Converts the disk image data to JSON.
*
* @this {DiskDump}
* @return {string|null} containing a JSON representation of the disk image, or null if unrecognized/malformed
*/
DiskDump.prototype.convertToJSON = function()
{
if (this.jsonDisk) {
return this.jsonDisk;
}
/*
* TODO: Decide if we want to retain this usage info:
*/
if (!this.bufDisk) {
// DiskDump.logConsole("no data available in disk image");
// this.jsonDisk = "[ /* no data */ ]";
this.jsonDisk = "[\n /**\n * " + DiskDump.sNotice + "\n * " + DiskDump.sUsage + "\n */\n]";
return this.jsonDisk;
}
var json = null;
try {
var nHeads = 0;
var nCylinders = 0;
var nSectorsPerTrack = 0;
var aTracks = []; // track array (used only for disk images with track tables)
var iTrack, cbTrack, offTrack, bufTrack, bufSector;
var cbSector = 512; // default sector size
var offBootSector = 0;
var cbDiskData = this.bufDisk.length;
if (cbDiskData >= 3000000) { // arbitrary threshold between diskette image sizes and hard disk image sizes
/*
* In this case, the first sector should be an MBR; find the active partition entry,
* then read the LBA of the first partition sector to calculate the boot sector offset.
*/
for (var offEntry = 0x1BE; offEntry <= 0x1EE; offEntry += 0x10) {
if (this.bufDisk.readUInt8(offEntry) >= 0x80) {
offBootSector = this.bufDisk.readUInt16LE(offEntry + 0x08) * cbSector;
break;
}
}
/*
* If we failed to find an active entry, we'll fall into the BPB detection code, which
* should fail if the first sector really was an MBR. Otherwise, the BPB should give us
* the geometry info we need to dump the entire disk image, including the MBR and any
* other reserved sectors.
*/
}
var bByte0 = this.bufDisk.readUInt8(offBootSector + DiskAPI.BOOT.JMP_OPCODE);
var cbSectorBPB = this.bufDisk.readUInt16LE(offBootSector + DiskAPI.BPB.SECTOR_BYTES);
/*
* These checks are not only necessary for DOS 1.x diskette images (and other pre-BPB images),
* but also non-DOS diskette images (eg, CPM-86 diskettes).
*
* And we must perform these tests BEFORE checking for a BPB, because we want the PHYSICAL geometry
* of the disk, whereas any values in the BPB may only be LOGICAL. For example, DOS may only be using
* 8 sectors per track on diskette that's actually formatted with 9 sectors per track.
*
* Checking these common sizes insures we get the proper physical geometry for common disk formats,
* but at some point, we'll need to perform more general calculations to properly deal with ANY disk
* image whose logical format doesn't agree with its physical structure.
*/
var fXDFOutput = false;
var disketteFormat = DiskAPI.DISKETTE_FORMATS[cbDiskData];
if (disketteFormat) {
nCylinders = disketteFormat[0];
nHeads = disketteFormat[1];
nSectorsPerTrack = disketteFormat[2];
}
else {
/*
* See if the first sector of the image contains a valid DOS BPB. That begs the question: what IS a valid
* DOS BPB? For starters, the first word (at offset 0x0B) is invariably 0x0200, indicating a 512-byte sector
* size. I also check the first byte for an Intel JMP opcode (0xEB is JMP with a 1-byte displacement, and
* 0xE9 is JMP with a 2-byte displacement). What else?
*/
if ((bByte0 == X86.OPCODE.JMP || bByte0 == X86.OPCODE.JMPS) && cbSectorBPB == cbSector) {
var nHeadsBPB = this.bufDisk.readUInt16LE(offBootSector + DiskAPI.BPB.TOTAL_HEADS);
var nSectorsTotalBPB = this.bufDisk.readUInt16LE(offBootSector + DiskAPI.BPB.TOTAL_SECS);
var nSectorsPerTrackBPB = this.bufDisk.readUInt16LE(offBootSector + DiskAPI.BPB.TRACK_SECS);
if (nSectorsPerTrackBPB && nHeadsBPB) {
var nSectorsPerCylinderBPB = nSectorsPerTrackBPB * nHeadsBPB;
nHeads = nHeadsBPB;
nCylinders = Math.floor(nSectorsTotalBPB / nSectorsPerCylinderBPB);
nSectorsPerTrack = nSectorsPerTrackBPB;
/*
* OK, great, the disk appears to contain a valid BPB. But so do XDF disk images, which are
* diskette images with tracks containing:
*
* 1 8Kb sector (equivalent of 16 512-byte sectors)
* 1 2Kb sector (equivalent of 4 512-byte sectors)
* 1 1Kb sector (equivalent of 2 512-byte sectors)
* 1 512-byte sector (equivalent of, um, 1 512-byte sector)
*
* for a total of the equivalent of 23 512-byte sectors, or 11776 (0x2E00) bytes per track.
* For an 80-track diskette with 2 sides, that works out to a total of 3680 512-byte sectors,
* or 1884160 bytes, or 1.84Mb, which is the exact size of the (only) XDF diskette images we
* currently (try to) support.
*
* Moreover, the first two tracks (ie, the first cylinder) contain only 19 sectors each,
* rather than 23, but XDF disk images still pads those tracks with 4 unused sectors.
*
* So, data for the first track contains 1 boot sector ending at 512 (0x200), 11 FAT sectors
* ending at 6144 (0x1800), and 7 "micro-disk" sectors ending at 9728 (0x2600). Then there's
* 4 (useless?) sectors that end at 11776 (0x2E00).
*
* Data for the second track contains 7 root directory sectors ending at 15360 (0x3C00), followed
* by disk data.
*
* For more details, check out this helpful article: http://www.os2museum.com/wp/the-xdf-diskette-format/
*/
if (nSectorsTotalBPB == 3680 && this.fXDFSupport) {
DiskDump.logWarning("XDF diskette detected, experimental XDF output enabled");
fXDFOutput = true;
}
}
}
}
if (!nHeads) {
/*
* Next, check for a DSK header (an old private format I used to use, which begins with either
* 0x00 (read-write) or 0x01 (write-protected), followed by 7 more bytes):
*
* 0x01: # heads (1 byte)
* 0x02: # cylinders (2 bytes)
* 0x04: # sectors/track (2 bytes)
* 0x06: # bytes/sector (2 bytes)
*
* which may be followed by an array of track table entries if the words at 0x04 and 0x06 are zero.
* If the track table exists, each entry contains the following:
*
* 0x00: # sectors/track (2 bytes)
* 0x02: # bytes/sector (2 bytes)
* 0x04: file offset of track data (4 bytes)
*
* TODO: Our JSON disk format doesn't explicitly support a write-protect indicator. Instead, we
* (used to) include the string "write-protected" as a comment in the first line of the JSON data
* as a work-around, and if the FDC component sees that comment string, it will honor it; however,
* we now prefer that read-only disk images simply include a "-readonly" suffix in the filename.
*/
if (!(bByte0 & 0xFE)) {
var cbSectorDSK = this.bufDisk.readUInt16LE(offBootSector + 0x06);
if (!(cbSectorDSK & (cbSectorDSK - 1))) {
cbSector = cbSectorDSK;
nHeads = this.bufDisk.readUInt8(offBootSector + 0x01);
nCylinders = this.bufDisk.readUInt16LE(offBootSector + 0x02);
nSectorsPerTrack= this.bufDisk.readUInt16LE(offBootSector + 0x04);
var nTracks = nHeads * nCylinders;
cbTrack = nSectorsPerTrack * cbSector;
offTrack = 0x08;
if (!cbTrack) {
for (iTrack = 0; iTrack < nTracks; iTrack++) {
nSectorsPerTrack = this.bufDisk.readUInt16LE(offTrack);
cbSectorDSK = this.bufDisk.readUInt16LE(offTrack+2);
cbTrack = nSectorsPerTrack * cbSectorDSK;
offSector = this.bufDisk.readUInt32LE(offTrack+4);
bufTrack = this.bufDisk.slice(offSector, offSector + cbTrack);
aTracks[iTrack] = [nSectorsPerTrack, cbSectorDSK, bufTrack];
offTrack += 8;
}
}
}
}
}
if (nHeads) {
/*
* Output the disk data as an array of cylinders, each containing an array of tracks (one track per head),
* and each track containing an array of sectors.
*/
iTrack = offTrack = 0;
cbTrack = nSectorsPerTrack * cbSector;
if (this.fJSONNative) {
this.dataDisk = new Array(nCylinders);
} else {
json = this.dumpLine(2, "[", "DiskDump of " + this.sDiskPath + " via " + DiskDump.sNotice);
}
for (var iCylinder=0; iCylinder < nCylinders; iCylinder++) {
var aHeads;
if (this.fJSONNative) {
aHeads = new Array(nHeads);
this.dataDisk[iCylinder] = aHeads;
} else {
json += this.dumpLine(2, "[", "cylinder: " + iCylinder);
}
var offHead = 0;
for (var iHead=0; iHead < nHeads; iHead++) {
if (aTracks.length) {
var aTrack = aTracks[iTrack++];
nSectorsPerTrack = aTrack[0];
cbSector = aTrack[1];
bufTrack = aTrack[2];
cbTrack = nSectorsPerTrack * cbSector;
} else {
bufTrack = this.bufDisk.slice(offTrack + offHead, offTrack + offHead + cbTrack);
}
var aSectors;
if (this.fJSONNative) {
aSectors = new Array(nSectorsPerTrack);
aHeads[iHead] = aSectors;
} else {
json += this.dumpLine(2, "[", "head:" + this.sJSONWhitespace + iHead + ", track:" + this.sJSONWhitespace + iCylinder);
}
/*
* For most disks, the size of every sector and the number of sectors/track are consistent, and the
* sector number encoded in every sector (nSector) matches the 1-based sector index (iSector) we use
* to "track" our progress through the current track. However, for XDF disk images, the above is
* NOT true beyond cylinder 0, which is why we have all these *ThisTrack variables, which would otherwise
* be unnecessary.
*/
var cbSectorThisTrack = cbSector;
var nSectorsThisTrack = nSectorsPerTrack;
/*
* Notes regarding XDF track layouts, from http://forum.kryoflux.com/viewtopic.php?f=3&t=234:
*
* Track 0, side 0: 19x512 bytes per sector, with standard numbering for the first 8 sectors, then custom numbering
* Track 0, side 1: 19x512 bytes per sector, with interleaved sector numbering 0x81...0x93
*
* Track 1 and up, side 0, 4 sectors per track:
* 1x1024, 1x512, 1x2048, 1x8192 bytes per sector (0x83, 0x82, 084, 0x86 as sector numbers)
*
* Track 1 and up, side 1, 4 sectors per track:
* 1x2048, 1x512, 1x1024, 1x8192 bytes per sector (0x84, 0x82, 083, 0x86 as sector numbers)
*
* Notes regarding the order in which XDF sectors are read (from http://mail.netbridge.at/cgi-bin/info2www?(fdutils)XDF),
* where each position column represents a (roughly) 128-byte section of the track:
*
* 1 2 3 4
* 1234567890123456789012345678901234567890 (position)
* ----------------------------------------
* 6633332244444446666666666666666666666666 (side 0)
* 6666444444422333366666666666666666666666 (side 1)
*
* where 2's contain a 512-byte sector, 3's contain a 1Kb sector, 4's contains a 2Kb sector, and 6's contain an 8Kb sector.
*
* Reading all the data on an XDF cylinder occurs in the following order, from the specified start to end positions:
*
* sector head start end
* 3 0 3 7
* 4 0 9 16
* 6 1 18 5 (1st wrap around)
* 2 0 7 9
* 2 1 12 14
* 6 0 16 3 (2nd wrap around)
* 4 1 5 12
* 3 1 14 18
*/
if (fXDFOutput) nSectorsThisTrack = (iCylinder? 4 : 19);
for (var iSector=1, offSector=0; iSector <= nSectorsThisTrack && offSector < cbTrack; iSector++, offSector += cbSectorThisTrack) {
var sector = {};
var nSector = iSector;
if (fXDFOutput && iCylinder) {
if (!iHead) {
cbSectorThisTrack = (iSector == 1? 1024 : (iSector == 2? 512 : (iSector == 3? 2048 : 8192)));
} else {
cbSectorThisTrack = (iSector == 1? 8192 : (iSector == 2? 2048 : (iSector == 3? 1024 : 512)));
}
nSector = (cbSectorThisTrack == 512? 2 : (cbSectorThisTrack == 1024? 3 : (cbSectorThisTrack == 2048? 4 : 6)));
}
bufSector = bufTrack.slice(offSector, offSector + cbSectorThisTrack);
if (this.fJSONNative) {
sector['sector'] = nSector;
sector['length'] = cbSectorThisTrack;
} else {
json += (iSector == 1? this.dumpLine(2, "{") : "");
json += this.dumpLine(0, '"sector":' + this.sJSONWhitespace + nSector + ",");
json += this.dumpLine(0, '"length":' + this.sJSONWhitespace + cbSectorThisTrack + ",");
}
var aTrim = this.trimSector(bufSector, cbSectorThisTrack);
var dwPattern = aTrim[0];
var cbBuffer = cbSectorThisTrack;
if (dwPattern !== null) {
cbBuffer = aTrim[1];
if (this.fJSONNative) {
sector['pattern'] = dwPattern;
} else {
json += this.dumpLine(0, '"pattern":' + this.sJSONWhitespace + dwPattern + ",");
}
}
if (this.fJSONNative) {
var dataSector = [];
sector['data'] = dataSector;
for (var off = 0; off < cbBuffer; off += 4) {
dataSector.push(bufSector.readInt32LE(off));
}
aSectors[iSector-1] = sector;
} else {
if (this.sFormat == DumpAPI.FORMAT.BYTES) {
json += this.dumpBuffer("bytes", bufSector, cbBuffer, 1, offSector);
} else {
/*
* TODO: Assert that sFormat is FORMAT_JSON or FORMAT_DATA (both use the same dword format)
*/
json += this.dumpBuffer("data", bufSector, cbBuffer, 4, offSector);
}
json += (iSector < nSectorsThisTrack? this.dumpLine(0, "},{") : this.dumpLine(-2, "}"));
}
}
if (!this.fJSONNative) json += this.dumpLine(-2, "]" + (iHead+1 == nHeads? "" : ","));
offHead += cbTrack; // end of head {iHead}, track {iCylinder}
}
if (!this.fJSONNative) json += this.dumpLine(-2, "]" + (iCylinder+1 == nCylinders? "" : ","));
offTrack += offHead; // end of cylinder {iCylinder}
}
/*
* Here's where I used to output the following comment:
*
* // write-protected
*
* as the first line of the JSON stream if the disk was marked write-protected (ie, if (bByte0 & 0x1) != 0).
*
* But since that makes JSON.parse() sad, the preferred solution is to name read-only JSON disk images with a
* "-readonly" suffix.
*/
if (this.fJSONNative) {
json = JSON.stringify(this.dataDisk);
} else {
json += this.dumpLine(-2, "]");
}
this.jsonDisk = json;
}
else if (this.bufDisk.readUInt16BE(0x900) == 0x4357) {
this.jsonDisk = this.convertOSIDiskToJSON();
}
} catch(err) {
DiskDump.logError(err);
}
return this.jsonDisk;
};
/**
* convertOSIDiskToJSON()
*
* This is called when we detect a "CW" signature at offset 0x900 of bufDisk, so we'll try parsing the data
* as an OSI disk image, and output the data in JSON as an array of heads, each containing an array of tracks,
* like so:
*
* [ [ {
* trackSig:"CW",
* trackNum:0x01,
* trackType:0x58,
* trackLoad:0xnnnn,
* sectors:[
* { sectorSig:0x76,
* sectorNum:0x01,
* sectorPages:0x01,
* sectorEndSig:"GS",
* sectorData: [0x52,0x41,0x43,0x4b,...]
* },...
* ]
* },
* {
* trackSig:"CW",
* ...
* }
* ] ]
*
* TODO: If we ever add support for OSI drives/disk images with more than one head, we should change the disk image
* format to match that used by DOS disk images and PCjs; ie, an array of cylinders, each containing an array of heads,
* each containing an array of tracks. It's largely just a matter of swapping the two outermost array elements, both
* here and in the C1Pjs disk module.
*
* @this {DiskDump}
* @return {string|null} containing a JSON representation of the disk image, or null if unrecognized/malformed
*/
DiskDump.prototype.convertOSIDiskToJSON = function()
{
var json = null;
try {
var iTrack = 0;
var offTrack = 0;
var cbTrack = 0x900; // this is the raw track length for a 40-track 5.25-inch disk image
if (this.fJSONNative) {
json = "";
} else {
json = "/*\n * OSI DiskDump of " + this.sDiskPath + " via " + DiskDump.sNotice + "\n */\n";
}
json += this.dumpLine(2, "[");
json += this.dumpLine(2, "["); // begin array of heads
while (true) {
var bufSector;
var bufTrack = this.bufDisk.slice(offTrack, offTrack + cbTrack);
if (!bufTrack.length) {
if (iTrack) {
json += this.dumpLine(-2, "}");
}
break;
}
var nSectorPages;
if (!iTrack) {
/*
* Track 0 is first, with this format:
*
* 0x0000: track load address (high and low bytes of 16-bit address, respectively)
* 0x0002: number of pages (up to 8)
*/
var nTrackLoad = bufTrack.readUInt16BE(0);
json += this.dumpTrackOSI("", 0, null, nTrackLoad);
/*
* Track 0 supports only 1 sector; it has no nSectorSig (hence the first null), an implied
* sector number of 1, and no end signature (hence the second null).
*/
nSectorPages = bufTrack.readUInt8(2);
bufSector = bufTrack.slice(3, 3 + nSectorPages * 256);
json += this.dumpSectorOSI(null, 1, nSectorPages, bufSector, null, nTrackLoad);
json += this.dumpLine(-2, "}");
json += this.dumpLine(-2, "]");
}
else {
/*
* Track N is next, with this format:
*
* 0x0000: start-of-track signature "CW" (0x43,0x57)
* 0x0002: track number (in BCD); eg, 0x01
* 0x0003: track type code (0x58)
* <sector info begins>
* 0x0004: sector start code (0x76)
* 0x0005: sector number (in binary); eg, 0x01
* 0x0006: sector length (no. of pages, in binary); eg, 0x08
* 0x0007: <sector data begins>
* 0xnnnn: end-of-sector signature "GS" (0x47,0x53); eg, 0xnnnn is 0x0807, using the above examples.
*
* The next track is typically stored at the next page boundary (eg, 0x0900), which is why
* cbTrack is hard-coded to 0x900 above.
*
* Note that anything from 1 (large) sector to multiple (smaller) sectors can be stored in a single track,
* if the sector length byte at 0x0006 is less than 8; for example, if the first sector's length was only 1 page,
* then this would follow:
*
* 0x0107: end-of-sector signature "GS"
* <sector info begins>
* 0x0109: sector start code (0x76)
* 0x010A: sector number (in binary); eg, 0x02
* 0x010B: sector length (no. of pages, in binary); eg, 0x01
* 0x010C: <sector data begins>
* 0xnnnn: next end-of-sector signature "GS" (0x47,0x53); eg, 0x020C
*/
if (bufTrack.readUInt16BE(0) == 0x4357) {
var nSectorOffset = 0;
json += this.dumpLine(-2, "},");
json += this.dumpTrackOSI("CW", bufTrack.readUInt8(2), bufTrack.readUInt8(3));
bufTrack = bufTrack.slice(4);
while (bufTrack.length > 5 && bufTrack.readUInt8(0) == 0x76) {
nSectorPages = bufTrack.readUInt8(2);
var cbSector = nSectorPages * 256;
bufSector = bufTrack.slice(3, cbSector+3);
var sSectorEndSig = bufTrack.slice(cbSector+3, cbSector+5).toString("ascii");
if (nSectorOffset) json += this.dumpLine(-2, "},");
json += this.dumpSectorOSI(bufTrack.readUInt8(0), bufTrack.readUInt8(1), nSectorPages, bufSector, sSectorEndSig, nSectorOffset);
bufTrack = bufTrack.slice(cbSector+5);
nSectorOffset += cbSector;
}
json += this.dumpLine(-2, "}");
json += this.dumpLine(-2, "]");
}
else {
DiskDump.logError(new Error("unrecognized OSI disk track at 0x" + str.toHex(offTrack)));
break;
}
}
offTrack += cbTrack;
iTrack++;
}
json += this.dumpLine(-2, "]");
json += this.dumpLine(-2, "]");
} catch(err) {
DiskDump.logError(err);
}
return json;
};
/**
* convertToIMG()
*
* Converts the disk image data to a Buffer.
*
* TODO: Consider creating a caching mechanism for these requests (ie, stash a limited number of these
* disk images under /tmp, using a name based on a hash of the source path).
*
* @this {DiskDump}
* @return {Buffer|null} containing the disk image's raw data, or null if no data available (or parse error)
*/
DiskDump.prototype.convertToIMG = function()
{
if (!this.bufDisk) {
if (!this.dataDisk) {
if (!this.jsonDisk) {
return null;
}
try {
/*
* These replacements provide compatibility with older JSON disk images
* that were generated by convdisk.php and weren't entirely JSON-compatible.
*/
this.jsonDisk = this.jsonDisk.replace(/(sector|length|bytes|data|pattern):/g, '"$1":');
/*
* Comments can appear even when comments weren't requested; the only situation
* where that currently may occur is when a write-protected .DSK file is converted,
* requiring us to output a "write-protected" comment on the first line.
* A better solution requires revamping the disk image format or, better yet, updating
* the FDC component to implement a user-configurable option for write-protecting media.
*/
this.jsonDisk = this.jsonDisk.replace(/\/\/[^\n]*/g, "");
/*
* There are also some old files that also contain hex constants; eg:
*
* "pattern": 0xe5e5e5e5
*
* which must be converted to decimal before JSON.parse() will be happy.
* While I could sit here and search for all hex patterns and replace them,
* the proper solution is to simply reconvert those disk images.
*
* TODO: Generate a clear warning whenever "this.jsonDisk.indexOf("0x") >= 0".
*
* TODO: Remove the above transformations once we can be sure there are no more
* disk images with those legacy features.
*/
this.dataDisk = JSON.parse(this.jsonDisk);
} catch(err) {
DiskDump.logError(err);
return null;
}
}
/*
* The following code was adapted from the mount() method in disk.js, and assumes a homogeneous disk
* format with 512-byte sectors.
*
* TODO: Rework this code to support non-homogeneous disk formats (eg, variable sector sizes, variable
* sectors per track, etc).
*/
var buf = null;
try {
/*
* We need to be prepared for any number of errors due to malformed data; in fact, it's entirely
* possible the JSON we just parsed is NOT a disk image, which means nCylinders, nHeads, etc may be
* undefined, in which case an exception will occur almost immediately.
*/
var nCylinders = this.dataDisk.length;
var nHeads = this.dataDisk[0].length;
var nSectorsPerTrack = this.dataDisk[0][0].length;
var cbDisk = nCylinders * nHeads * nSectorsPerTrack * 512;
var off = 0;
buf = new Buffer(cbDisk);
/*
* WARNING: Buffers are NOT zero-initialized, so we need explicitly fill it with zeros (this seems to
* be a reversal in the trend to zero buffers, when security concerns used to trump performance concerns).
*/
buf.fill(0);
for (var iCylinder = 0; iCylinder < nCylinders; iCylinder++) {
for (var iHead = 0; iHead < this.dataDisk[iCylinder].length; iHead++) {
for (var iSector = 0; iSector < this.dataDisk[iCylinder][iHead].length; iSector++) {
var idw;
var sector = this.dataDisk[iCylinder][iHead][iSector];
var length = sector['length'];
if (length === undefined) { // provide backward-compatibility with older JSON...
length = sector['length'] = 512;
}
length >>= 2; // convert length from a byte-length to a dword-length
var dwPattern = sector['pattern'];
if (dwPattern === undefined) {
dwPattern = sector['pattern'] = 0;
}
var adw = sector['data'];
if (adw === undefined) {
var ab = sector['bytes'];
if (ab === undefined || !ab.length) {
/*
* It would be odd if there was neither a 'bytes' nor 'data' array; I'm just
* being paranoid. It's more likely that the 'bytes' array is simply empty,
* in which case we need only create an empty 'data' array and turn the byte
* pattern, if any, into a dword pattern.
*/
adw = [];
// if (DEBUG) this.assert((dwPattern & 0xff) == dwPattern);
dwPattern = sector['pattern'] = (dwPattern | (dwPattern << 8) | (dwPattern << 16) | (dwPattern << 24));
} else {
/*
* To keep the conversion code simple, we'll do any necessary pattern-filling first,
* to fully "inflate" the sector, eliminating the possibility of partial dwords and
* saving any code downstream from dealing with byte-size patterns.
*/
var ib;
var cb = length << 2;
for (ib = ab.length; ib < cb; ib++) {
ab[ib] = dwPattern; // the pattern for byte-arrays was only a byte
}
ib = 0;
adw = new Array(length);
for (idw = 0; idw < adw.length; idw++) {
adw[idw] = ab[ib] | (ab[ib + 1] << 8) | (ab[ib + 2] << 16) | (ab[ib + 3] << 24);
ib += 4;
}
}
delete sector['bytes'];
sector['data'] = adw;
}
/*
* Now the current sector has ALL of the following properties:
*
* 'sector': sector number
* 'length': size of the sector, in bytes
* 'data': array of dwords
* 'pattern': dword pattern to use for empty or partial sectors
*
* TODO: Honor the 'sector' property and dump the sectors in sector-number order.
*/
for (idw = 0; idw < length; idw++) {
var dw = (idw < adw.length? adw[idw] : dwPattern);
buf.writeInt32LE(dw, off);
off += 4;
}
}
}
}
/*
* Since there's no way (and rightly so) of setting fDebug via the API, I've added the check for
* fJSONComments as another way of disabling "branding" via the API; requesting an IMG file with comments
* is otherwise a nonsensical request.
*/
if (!fDebug && !this.fJSONComments && buf.length < 3000000) { // arbitrary size threshold between diskette images and hard disk images
/*
* Mimic the BPB test in convertToJSON(), because we don't want to blast an OEM string into non-DOS diskette images
*/
var bByte0 = buf.readUInt8(DiskAPI.BOOT.JMP_OPCODE);
var cbSectorBPB = buf.readUInt16LE(DiskAPI.BPB.SECTOR_BYTES);
if ((bByte0 == X86.OPCODE.JMP || bByte0 == X86.OPCODE.JMPS) && cbSectorBPB == 512) {
/*
* Overwrite the OEM string with our own, so that people know how the image originated
*/
buf.write(DiskDump.MY_OEM_STRING, DiskAPI.BOOT.OEM_STRING, DiskDump.MY_OEM_STRING.length);
}
}
} catch(err) {
DiskDump.logError(err);
return null;
}
this.bufDisk = buf;
}
return this.bufDisk;
};
module.exports = DiskDump;
DiskDump === **DiskDump** is a Node module with both a command-line interface and a web server API for converting disk images to/from various formats (eg, JSON files, JSON files with comments, IMG disk images, etc). Building Disk Images from Folders/Files --- In addition to converting disk images to/from JSON, DiskDump can also create disk images from the contents of local files/folders. For example, from the root directory of the project, you could run: node modules/diskdump/bin/diskdump --path="apps/pc/1981/visicalc/README.md" --format=img --output=disk.img to produce a `disk.img` containing one file, "README.md", which you could then mount on your local operating system *or* inside a PCjs machine. To make the disk image more useful, you might want to download a copy of [VisiCalc](http://www.bricklin.com/history/vcexecutable.htm) into that folder as well, so that you could then run: node modules/diskdump/bin/diskdump --path="apps/pc/1981/visicalc/vc.com;README.md" --format=img --output=disk.img to produce a `disk.img` containing both "VC.COM" and "README.md". In fact, this is exactly how the [disk.json](/apps/pc/1981/visicalc/disk.json) stored in the [VisiCalc](/apps/pc/1981/visicalc/) folder was generated. The equivalent web server API request would look like: http://localhost:8088/api/v1/dump?path=/apps/pc/1981/visicalc/vc.com;README.md&format=img DiskDump is a port of the original [JavaScript Machines](http://jsmachines.net/) **convdisk.php** utility.
{
"name": "diskdump",
"version": "0.2.0",
"description": "Converts disk images to/from JSON",
"main": "./lib/diskdump",
"scripts": {
"test": "echo \"error: no test specified\" && exit 1"
},
"author": "Jeff Parsons <Jeff@pcjs.org>",
"licenses": [
{
"type": "GPLv3",
"url": "http://www.gnu.org/licenses/gpl.html"
}
],
"bin": {
"diskdump": "./bin/diskdump"
}
}
#!/usr/bin/env node
/**
* @fileoverview Implements the FileDump command-line interface
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* @suppress {missingProperties}
* Created 2012-Sep-04
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
* and <http://pcjs.org/>.
*
* JSMachines is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with JSMachines.
* If not, see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some JSMachines files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* JSMachines Project for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
var path = require("path");
var fs = require("fs");
var lib = path.join(path.dirname(fs.realpathSync(__filename)), "../lib/");
require(lib + "filedump.js").CLI();
/**
* @fileoverview Converts file contents to JSON
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
* @version 1.0
* Created 2014-02-01
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
* and <http://pcjs.org/>.
*
* JSMachines is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with JSMachines.
* If not, see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some JSMachines files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* JSMachines Project for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
var fs = require("fs");
var path = require("path");
var mkdirp = require("mkdirp");
var net = require("../../shared/lib/netlib");
var proc = require("../../shared/lib/proclib");
var str = require("../../shared/lib/strlib");
var DumpAPI = require("../../shared/lib/dumpapi");
/**
* FileDump()
*
* TODO: Consider adding a "map" option that allows the user to supply a MAP filename (via a "map" API parameter
* or a "--map" command-line option), which in turn triggers a call to loadMap(). Note that loadMap() will need
* to be a bit more general and use a worker function that calls either net.getFile() or fs.readFile(), similar
* to what our loadFile() function already does.
*
* @constructor
* @param {string|undefined} sFormat should be one of "json"|"data"|"hex"|"bytes"|"rom" (see the FORMAT constants)
* @param {boolean|string|undefined} fComments enables comments and other readability enhancements in the JSON output
* @param {boolean|string|undefined} fDecimal forces decimal output if not undefined
* @param {number|string|undefined} offDump
* @param {number|string|undefined} nWidthDump
* @param {string} [sServerRoot]
*/
function FileDump(sFormat, fComments, fDecimal, offDump, nWidthDump, sServerRoot)
{
this.fDebug = false;
this.sFormat = (sFormat || DumpAPI.FORMAT.JSON);
this.fJSONNative = (this.sFormat == DumpAPI.FORMAT.JSON && !fComments);
this.nJSONIndent = 0;
this.fJSONComments = fComments;
this.sJSONWhitespace = (this.fJSONComments? " " : "");
this.fDecimal = fDecimal;
this.offDump = +offDump || 0;
this.nWidthDump = +nWidthDump || 16;
this.sServerRoot = sServerRoot || process.cwd();
this.buf = null;
/*
* TODO: Decide what to do with this usage info; we can't use it as a default, because setting this.json
* causes outputFile() to ignore this.buf indiscriminately (ie, it breaks non-JSON output modes).
*/
this.json = ""; // "[\n /**\n * " + FileDump.sAPIURL + " " + FileDump.sCopyright + "\n * " + FileDump.sUsage + "\n */\n]";
}
/*
* Class constants
*/
FileDump.sAPIURL = "http://www.pcjs.org" + DumpAPI.ENDPOINT;
FileDump.sCopyright = "© 2012-2015 by Jeff Parsons (@jeffpar)";
FileDump.sNotice = FileDump.sAPIURL + " " + FileDump.sCopyright;
FileDump.sUsage = "Usage: " + FileDump.sAPIURL + "?" + DumpAPI.QUERY.FILE + "=({path}|{URL})&" + DumpAPI.QUERY.FORMAT + "=(json|data|hex|bytes|rom)";
FileDump.asBadExts = [
"js", "log"
];
/*
* Class methods
*/
/**
* CLI()
*
* Provides the command-line interface for the FileDump module.
*
* Usage
* ---
* filedump --file=({path}|{URL}) [--merge=({path}|{url})] [--format=(json|data|hex|bytes|rom)] [--comments]
* [--decimal] [--offset={number}] [--width={number}] [--output={path}] [--overwrite]
*
* Arguments
* ---
* The default format is "json", which generates an array of signed 32-bit decimal values; "hex" is an older
* text format that consists entirely of 2-character hex values (deprecated), and "bytes" is a JSON-like format
* that also uses hex values (but with "0x" prefixes) and is normally used only when comments are enabled (use
* --decimal to force decimal byte output).
*
* When a second file is "merged", the first file sets all even bytes and the second file sets all odd bytes.
* In fact, any number of files can be merged: if there are N files, file #1 sets bytes at "offset mod N == 0",
* file #2 sets all bytes at "offset mod N == 1", and file #N sets all bytes at "offset mod N == N - 1".
*
* Note that command-line arguments, if any, are not validated. For example, argv['comments'] may be any of
* boolean, string, or undefined, since the user may have typed "--comments" or "--comments=foo" or nothing at all.
*
* Examples
* ---
* filedump --file=devices/pc/video/ibm-ega.rom --format=bytes --decimal
*
* Notes
* ---
* Originally, we had to specify `--format=bytes` because the onLoadROM() code in rom.js assumed the data was
* always byte-sized, but it has since been updated to support dword arrays, so the default format ("json")
* works fine as well. Also, `--decimal` reduces the size of the output file significantly.
*
* If there's a ".map" file (eg, "ibm-ega.map"), it's automatically loaded and appended to the ROM data as a
* "symbols" property; we may want to consider an option to disable the processing of map files, but for now, the
* simple answer is: if you don't want one, don't create one.
*/
FileDump.CLI = function()
{
var args = proc.getArgs();
if (!args.argc) {
console.log("usage: filedump --file=({path}|{URL}) [--merge=({path}|{url})] [--format=(json|data|hex|bytes|rom)] [--comments] [--decimal] [--output={path}] [--overwrite]");
return;
}
var argv = args.argv;
var sFile = argv['file'];
if (!sFile || FileDump.asBadExts.indexOf(str.getExtension(sFile)) >= 0) {
FileDump.logError(new Error("bad or missing input filename"));
return;
}
var sOutputFile = argv['output'];
if (sOutputFile && sOutputFile.charAt(0) != '/') sOutputFile = path.join(process.cwd(), sOutputFile);
var fOverwrite = argv['overwrite'];
var sFormat = FileDump.validateFormat(argv['format']);
if (sFormat === false) {
FileDump.logError(new Error("unrecognized format"));
return;
}
var sMergeFile, asMergeFiles = [];
var file = new FileDump(sFormat, argv['comments'], argv['decimal'], argv['offset'], argv['width']);
if (argv['merge']) {
if (typeof argv['merge'] == "string") {
asMergeFiles.push(argv['merge']);
} else {
for (sMergeFile in argv['merge']) asMergeFiles.push(sMergeFile);
}
}
var cMergesPending = asMergeFiles.length;
var iStart = 0, nSkip = cMergesPending;
file.loadFile(sFile, iStart++, nSkip, function(err) {
if (!err) {
var cErrors = 0;
while ((sMergeFile = asMergeFiles.shift())) {
file.loadFile(sMergeFile, iStart++, nSkip, function(err) {
if (err) cErrors++;
if (!--cMergesPending) {
if (!cErrors) file.convertToFile(sOutputFile, fOverwrite);
}
});
}
if (!cMergesPending) {
if (argv['checksum']) console.log("checksum: " + file.getChecksum());
file.convertToFile(sOutputFile, fOverwrite);
}
}
});
};
/**
* logError(err)
*
* Conditionally logs an error to the console.
*
* @param {Error} err
* @return {string} the error message that was logged (or that would have been logged had logging been enabled)
*/
FileDump.logError = function(err)
{
var sError = "";
if (err) {
sError = "filedump error: " + err.message;
console.log(sError);
}
return sError;
};
/**
* validateFormat(sFormat)
*
* @param {string} sFormat
* @return {null|string|boolean} the validated format, null if unspecified, or false if invalid
*/
FileDump.validateFormat = function(sFormat)
{
if (!sFormat) {
return null;
}
for (var s in DumpAPI.FORMAT) {
if (sFormat == DumpAPI.FORMAT[s]) return sFormat;
}
return false;
};
/*
* Object methods
*/
/**
* loadFile(sFile, iStart, nSkip, done)
*
* This used to be part of the FileDump constructor, but I felt it would be safer to separate
* object creation from any I/O that the object may perform, to ensure that a callback can never
* be called before the caller has actually received the newly created object.
*
* @this {FileDump}
* @param {string} sFile
* @param {number} iStart
* @param {number} nSkip
* @param {function(Error)} done
*/
FileDump.prototype.loadFile = function(sFile, iStart, nSkip, done)
{
var obj = this;
var sExt = str.getExtension(sFile);
var options = {encoding: sExt == DumpAPI.FORMAT.JSON || sExt == DumpAPI.FORMAT.HEX? "utf8" : null};
var sFilePath = net.isRemote(sFile)? sFile : path.join(this.sServerRoot, sFile);
if (!this.sFilePath) this.sFilePath = sFilePath;
if (this.fDebug) console.log("loadFile(" + sFilePath + "," + iStart + "," + nSkip + ")");
if (net.isRemote(sFilePath)) {
net.getFile(sFilePath, options.encoding, function(err, status, buf) {
if (err) {
FileDump.logError(err);
done(err);
return;
}
obj.setData(buf, iStart, nSkip);
done(null);
});
} else {
fs.readFile(sFilePath, options, function(err, buf) {
if (err) {
FileDump.logError(err);
done(err);
return;
}
obj.setData(buf, iStart, nSkip);
done(null);
});
}
};
/**
* setData(buf, iStart, nSkip)
*
* Records the given file data in the FileDump's buffer
*
* @this {FileDump}
* @param {Buffer|string} buf
* @param {number} iStart
* @param {number} nSkip
*/
FileDump.prototype.setData = function(buf, iStart, nSkip)
{
var b, i, j, s;
if (typeof buf == "string") {
var ab = [];
if (buf.indexOf('{') >= 0) {
/*
* Treat the incoming string data as JSON data.
*/
var json;
try {
json = JSON.parse(buf);
} catch (e) {
json = null;
}
if (json && json.data && json.data.length) {
for (i = 0; i < json.data.length; i++) {
var dw = json.data[i];
for (j = 0; j < 4; j++) {
ab.push(dw & 0xff);
dw >>>= 8;
}
}
}
}
else {
/*
* Treat the incoming string data as HEX (ie, a series of byte values encoded in hex, separated by whitespace)
*/
var as = buf.split(/\s+/);
for (i = 0; i < as.length; i++) {
s = as[i];
if (!s.length) continue;
if (isNaN(b = parseInt(s, 16))) break;
ab.push(b);
}
}
/*
* If we didn't recognize the data, then simply return, leaving this.buf undefined.
*/
if (!ab.length) return;
buf = new Buffer(ab);
}
if (!this.buf) {
if (!nSkip) {
this.buf = buf;
} else {
this.buf = new Buffer(buf.length * (nSkip + 1));
}
}
if (nSkip) {
for (i = 0; i < buf.length; i++) {
this.buf.writeUInt8(b = buf.readUInt8(i), iStart);
iStart += nSkip + 1;
}
}
};
/**
* getData()
*
* @this {FileDump}
* @return {Buffer|null}
*/
FileDump.prototype.getData = function()
{
return this.buf;
};
/**
* getChecksum()
*
* @this {FileDump}
* @return {number|null}
*/
FileDump.prototype.getChecksum = function()
{
if (!this.buf) return null;
var b = 0;
for (var i = 0; i < this.buf.length; i++) {
b += this.buf.readUInt8(i);
}
return b & 0xff;
};
/**
* dumpLine(nIndent, sLine, sComment)
*
* @this {FileDump}
* @param {number} [nIndent] is the relative number of characters to indent the given line (0 if none)
* @param {string} [sLine] is the given line
* @param {string} [sComment] is an optional comment to append to the line, if comment output is enabled
* @return {string} the indented/commented line
*/
FileDump.prototype.dumpLine = function(nIndent, sLine, sComment)
{
if (nIndent < 0) {
this.nJSONIndent += nIndent;
}
if (this.fJSONComments) {
sLine = " ".substr(0, this.nJSONIndent) + (sLine? (sLine + (sComment? (" // " + sComment) : "")) : "");
}
if (sLine) sLine += "\n";
if (nIndent > 0) {
this.nJSONIndent += nIndent;
}
return sLine;
};
/**
* dumpBuffer(sKey, buf, len, cbItem, offDump, nWidthDump)
*
* @this {FileDump}
* @param {string|null} sKey is name of buffer data element
* @param {Buffer} buf is a Buffer containing the bytes to dump
* @param {number} len is the number of bytes to dump
* @param {number} cbItem is either 1 or 4, to dump bytes or dwords respectively
* @param {number} [offDump] is a relative offset (default is 0; see constructor)
* @param {number} [nWidthDump] is an alternate width (default is 16; see constructor)
* @return {string} hex (or decimal) representation of the data
*/
FileDump.prototype.dumpBuffer = function(sKey, buf, len, cbItem, offDump, nWidthDump)
{
var chOpen = '', chClose = '', chSep = ' ', sHexPrefix = "";
this.sKey = sKey;
if (this.sFormat != DumpAPI.FORMAT.HEX) {
chOpen = '['; chClose = ']'; chSep = ',';
}
offDump = offDump || this.offDump;
nWidthDump = nWidthDump || this.nWidthDump;
var sDump = this.dumpLine(2, (sKey? '"' + sKey + '":' : "") + this.sJSONWhitespace + chOpen);
var sLine = "";
var sASCII = "";
var cMaxCols = nWidthDump * cbItem;
for (var off = offDump; off < len; off += cbItem) {
/*
* WARNING: Whenever the following condition arises, you probably have a non-dword-granular
* file, and you should have requested a byte-granular dump instead.
*/
if (off + cbItem > buf.length) {
break;
}
var v = (cbItem == 1? buf.readUInt8(off) : buf.readInt32LE(off));
if (off > offDump) {
sLine += chSep;
if (!((off - offDump) % cMaxCols)) { // jshint ignore:line
sDump += this.dumpLine(0, sLine, sASCII);
sLine = sASCII = "";
}
}
if (cbItem > 1) {
sLine += v;
}
else {
if (this.fDecimal) {
sLine += v;
} else {
sLine += str.toHexByte(v);
}
if (!sASCII) sASCII = "0x" + str.toHex(off) + " ";
sASCII += (v >= 0x20 && v < 0x7F && v != 0x3C && v != 0x3E? String.fromCharCode(v) : ".");
}
}
sDump += this.dumpLine(0, sLine + chClose, sASCII);
this.dumpLine(-2);
return sDump;
};
/**
* loadMap(sFilePath, done)
*
* NOTE: Since ".map" files are an internal construct, I support only local map files (for now)
*
* @this {FileDump}
* @param {string} sFilePath
* @param {function(Error,string)} done
*/
FileDump.prototype.loadMap = function(sFilePath, done)
{
/*
* The HEX format doesn't support MAP files, because old HEX clients expect an Array of bytes,
* not an Object. For all other (JSON) formats, we assume that the JSON is "unwrapped" at this point,
* and so even if loadMap() doesn't find a map file, it will still wrap the resulting JSON with braces.
*/
if (this.sFormat != DumpAPI.FORMAT.HEX) {
if (!this.sKey) {
this.json = '"bytes":' + this.json;
}
var obj = this;
var sMapPath = sFilePath.replace(/\.(rom|json)$/, ".map");
if (str.endsWith(sMapPath, ".map")) {
var sMapFile = path.basename(sMapPath);
fs.readFile(sMapPath, {encoding: "utf8"}, function(err, str) {
var sMapData = null;
if (err) {
/*
* This isn't really an error (map files are optional), although it might be helpful to display
* a warning. In any case, this is also why the first done() callback below always passes null for
* the Error parameter.
*
FileDump.logError(err);
*/
}
else {
// console.log("add this to obj.json:\n" + str);
/*
* Parse MAP data into a set of properties; for example, if the .map file contains:
*
* 0320 = HF_PORT
* 0000:0034 4 HDISK_INT
* 0040:0042 1 CMD_BLOCK
* 0003 @ DISK_SETUP
* 0000:004C 4 ORG_VECTOR
* 0028 . MOV AX,WORD PTR ORG_VECTOR ;GET DISKETTE VECTOR
*
* where the symbols in the second column of the .map file indicate type/size information as follows:
*
* = unsized value
* 1 1-byte (DB) value
* 2 2-byte (DW) value
* 4 4-byte (DD) value
* @ label
* . reference
* + bias (ie, value to be added to all following offsets)
*
* then we should produce the following corresponding JSON:
*
* {
* "HF_PORT": {
* "v":800
* },
* "HDISK_INT": {
* "b":4, "s":0, "o":52
* },
* "ORG_VECTOR": {
* "b":4, "s":0, "o":76
* },
* "CMD_BLOCK": {
* "b":1, "s":64, "o":66
* },
* "DISK_SETUP": {
* "o":3
* },
* ".40": {
* "o":64, "a":"MOV AX,WORD PTR ORG_VECTOR ;GET DISKETTE VECTOR"
* }
* }
*
* where "v" is the value of an absolute (unsized) value; "b" is either 1, 2, 4 or undefined; "s" is either a hard-coded
* segment or undefined; and "o" is the offset of an symbol. Also, if the symbol is not entirely upper-case, then we
* store the original-case version of the symbol as an "l" property.
*
* If the same symbol appears more than once in a .map file, the value of the last occurrence will replace any previous
* occurrence(s).
*
* aSymbols() wil be an associative array containing an entry for every symbol, where the key is the symbol and the value
* is another associative array containing the other properties described above.
*/
var nBias = 0;
var aSymbols = {};
var asLines = str.split('\n');
for (var iLine = 0; iLine < asLines.length; iLine++){
var s = asLines[iLine].trim();
if (!s || s.charAt(0) == ';') continue;
var match = s.match(/^\s*([0-9A-Z:]+)\s+([=124@\.\+])\s*(.*?)\s*$/i);
if (match) {
var sValue = match[1];
var sSegment = null;
var i = sValue.indexOf(':');
if (i >= 0) {
sSegment = sValue.substr(0, i);
sValue = sValue.substr(i+1);
}
var sType = match[2];
var sSymbol = match[3].replace(/"/g, "''");
var sComment = null;
i = sSymbol.indexOf(';');
if (i >= 0) {
sComment = sSymbol.substr(i+1).trim();
sSymbol = sSymbol.substr(0, i).trim();
}
var sID = sSymbol.toUpperCase();
var aValue = {};
switch (sType) {
case '=':
aValue['v'] = parseInt(sValue, 16);
break;
case '1':
case '2':
case '4':
aValue['b'] = parseInt(sType, 10);
/* falls through */
case '@':
case '.':
aValue['o'] = parseInt(sValue, 16) + nBias;
if (sSegment) {
aValue['s'] = parseInt(sSegment, 16);
}
if (sType != '.') break;
match = sSymbol.match(/^([A-Z_][A-Z0-9_]*):\s*(.*)/i);
if (match) {
sSymbol = match[1];
sID = sSymbol.toUpperCase();
if (match[2]) aValue['a'] = match[2];
if (aSymbols[sID]) {
sID = '.' + parseInt(sValue, 16);
}
} else {
aValue['a'] = sSymbol;
sID = sSymbol = '.' + parseInt(sValue, 16);
}
break;
case '+':
nBias = parseInt(sValue, 16);
continue;
default:
done(new Error("unrecognized symbol type (" + sType + ") in MAP file: " + sMapFile), null);
return;
}
if (sID != sSymbol) {
aValue['l'] = sSymbol;
}
if (sComment) {
aValue['c'] = sComment;
}
aSymbols[sID] = aValue;
continue;
}
done(new Error("unrecognized line (" + s + ") in MAP file: " + sMapFile), null);
return;
}
sMapData = JSON.stringify(aSymbols);
if (sMapData) {
obj.json = '{' + obj.json + ',"symbols":' + sMapData + '}';
}
}
if (!sMapData) {
obj.json = '{' + obj.json + '}';
}
done(null, obj.json);
});
return;
}
this.json = '{' + this.json + '}';
}
done(null, this.json);
};
/**
* buildJSON()
*
* Common code between the API helper (convertToJSON()) and the command-line helper (convertToFile()).
*
* @this {FileDump}
*/
FileDump.prototype.buildJSON = function()
{
this.json = "";
if (!this.buf) {
// console.log("no data available in file");
this.json = "[ /* no data */ ]";
} else {
// console.log("length of buffer: " + this.buf.length);
if (this.fJSONComments || this.sFormat == DumpAPI.FORMAT.HEX || this.sFormat == DumpAPI.FORMAT.BYTES) {
this.json += this.dumpBuffer(null, this.buf, this.buf.length, 1);
} else {
this.json += this.dumpBuffer("data", this.buf, this.buf.length, 4);
}
}
};
/**
* convertToJSON(done)
*
* Converts the data buffer to JSON.
*
* @this {FileDump}
* @param {function(Error,string)} done
*/
FileDump.prototype.convertToJSON = function(done)
{
this.buildJSON();
this.loadMap(this.sFilePath, done);
};
/**
* convertToFile(sOutputFile, fOverwrite)
*
* Converts the data buffer to JSON, as appropriate.
*
* @this {FileDump}
* @param {string} sOutputFile
* @param {boolean} fOverwrite
*/
FileDump.prototype.convertToFile = function(sOutputFile, fOverwrite)
{
if (this.sFormat != DumpAPI.FORMAT.ROM) {
var obj = this;
this.buildJSON();
this.loadMap(sOutputFile || this.sFilePath, function(err, str) {
if (err) {
FileDump.logError(err);
} else {
obj.outputFile(sOutputFile, fOverwrite);
}
});
return;
}
this.outputFile(sOutputFile, fOverwrite);
};
/**
* outputFile(sOutputFile, fOverwrite)
*
* @this {FileDump}
* @param {string} sOutputFile
* @param {boolean} fOverwrite
*/
FileDump.prototype.outputFile = function(sOutputFile, fOverwrite)
{
var data = this.json || this.buf;
var sFormat = this.sFormat.toUpperCase();
if (sOutputFile) {
try {
if (fs.existsSync(sOutputFile) && !fOverwrite) {
console.log(sOutputFile + " exists, use --overwrite to rewrite");
} else {
var sDirName = path.dirname(sOutputFile);
if (!fs.existsSync(sDirName)) mkdirp.sync(sDirName);
fs.writeFileSync(sOutputFile, data);
console.log(data.length + "-byte " + sFormat + " file saved as " + sOutputFile);
}
} catch(err) {
FileDump.logError(err);
}
} else {
/*
* We'll dump JSON to the console, but not a raw file buffer; we could add an option to
* "stringify" buffers, but if that's what the caller wants, they should use "--format=json".
*/
if (typeof data == "string") {
console.log(data);
} else {
console.log("specify --output={file} to save " + data.length + "-byte " + sFormat + " file");
}
}
};
module.exports = FileDump;
FileDump === Module (and command-line utility) for converting the contents of files to JSON.
{
"name": "filedump",
"version": "0.2.0",
"description": "Converts file contents to JSON",
"main": "./lib/filedump",
"scripts": {
"test": "echo \"error: no test specified\" && exit 1"
},
"author": "Jeff Parsons <Jeff@pcjs.org>",
"licenses": [
{
"type": "GPLv3",
"url": "http://www.gnu.org/licenses/gpl.html"
}
],
"bin": {
"filedump": "./bin/filedump"
}
}
/**
* grunt-manifester
* https://github.com/jeffpar/jsmachines
*
* Copyright (c) 2014 jeffpar
* Licensed under the MIT license.
*
* TODO: Update this header with our standard header and fix all the JSHint warnings
*/
"use strict";
var fs = require("fs");
var path = require("path");
var mkdirp = require("mkdirp");
var url = require("url");
var async = require("async");
var parseXML = require("xml2js").parseString; // see: https://github.com/Leonidas-from-XIV/node-xml2js
var unzip = require("unzip");
var util = require("util");
var net = require("../../../shared/lib/netlib");
module.exports = function (grunt) {
/*
* Please see the Grunt documentation for more information regarding task
* creation: http://gruntjs.com/creating-tasks
*/
grunt.registerMultiTask('manifester', 'manifest.xml processor', function() {
/*
* Merge task-specific and/or target-specific options with these defaults
*
var options = this.options({
});
*/
/*
* Tell grunt this task is asynchronous
*/
var asManifests = [];
var doneGrunt = this.async();
/*
* Iterate over all specified file groups
*/
this.files.forEach(function(file) {
file.src.filter(function(sFilePath) {
/*
* Warn on and remove invalid source files (if nonull was set)
*/
if (!grunt.file.exists(sFilePath)) {
grunt.log.warn('Source file "' + sFilePath + '" not found.');
return false;
}
return true;
}).map(function(sFilePath) {
/*
* TODO: Given the memory constraints I've run into with Grunt in the past, it would
* probably be better queue up the file paths instead of the file contents, and do async
* readFile() calls.
*/
asManifests.push(sFilePath);
});
});
async.each(asManifests, function processXML(sManifestFile, doneAsync) {
var sManifestXML = grunt.file.read(sManifestFile);
parseXML(sManifestXML, function doneParseXML(err, xml) {
var cCallbacks = 0;
if (xml.manifest) {
// console.log(util.inspect(xml, false, null));
for (var iRepo in xml.manifest.repo) {
var repo = xml.manifest.repo[iRepo];
if (repo.src) {
var src = repo.src[0];
var sURL = src.$['href'];
// var sURL = src._ || src; // the former is set if there are any attributes, otherwise the element is just a string
console.log('found src URL: "' + sURL + '"');
if (sURL.slice(0, 5) == "http:" && sURL.slice(-1) == '/') {
for (var iDownload in repo.download) {
var download = repo.download[iDownload];
var sDownloadFile = download.$['href'];
// var sDownloadFile = download._ || download;
console.log("processing download " + sDownloadFile);
var sRemoteFile = sURL + sDownloadFile;
var sLocalDir = path.join(path.dirname(sManifestFile), repo.$['dir']);
if (grunt.file.exists(sLocalDir) || mkdirp.sync(sLocalDir)) {
var sLocalFile = path.join(sLocalDir, sDownloadFile);
if (grunt.file.exists(sLocalFile)) {
console.log("file already exists: " + sLocalFile);
} else {
console.log('downloadFile("' + sRemoteFile + '", "' + sLocalFile + '")...');
cCallbacks++;
net.downloadFile(sRemoteFile, sLocalFile, function doneDownloadFile(err, status) {
console.log('downloadFile("' + sRemoteFile + '") returned ' + status + ': ' + (err? false : true));
if (!err && status == 200 && sLocalFile.slice(-4) == ".zip") {
var sLocalZipDir = path.join(sLocalDir, path.basename(sLocalFile, ".zip"));
if (grunt.file.exists(sLocalZipDir) || mkdirp.sync(sLocalZipDir)) {
/*
* TODO: As explained here (https://github.com/EvanOxfeld/node-unzip/issues/40), determine why this ZIP
* file (http://beej.us/moria/files/pc/zip-arc/mor55-88.zip) causes an "invalid stored block lengths" error.
*/
fs.createReadStream(sLocalFile).pipe(unzip.Extract({path: sLocalZipDir})).on('close', function() {
console.log("unzip complete: " + sLocalZipDir);
if (--cCallbacks == 0) doneAsync();
});
return;
} else {
grunt.log.warn("unzip directory not available: " + sLocalZipDir);
}
}
if (--cCallbacks == 0) doneAsync();
});
}
} else {
grunt.log.warn("download directory not available: " + sLocalDir);
}
}
} else {
grunt.log.warn("unsupported repo src: " + sURL);
}
}
}
}
if (!cCallbacks) doneAsync();
});
}, function(err) {
doneGrunt();
});
});
};
Testing: 1 2 3 !!!
Testing, 1 2 3.
1 2 3
Testing
'use strict';
var grunt = require('grunt');
/*
======== A Handy Little Nodeunit Reference ========
https://github.com/caolan/nodeunit
Test methods:
test.expect(numAssertions)
test.done()
Test assertions:
test.ok(value, [message])
test.equal(actual, expected, [message])
test.notEqual(actual, expected, [message])
test.deepEqual(actual, expected, [message])
test.notDeepEqual(actual, expected, [message])
test.strictEqual(actual, expected, [message])
test.notStrictEqual(actual, expected, [message])
test.throws(block, [error], [message])
test.doesNotThrow(block, [error], [message])
test.ifError(value)
*/
exports.manifester = {
setUp: function(done) {
// setup here if necessary
done();
},
default_options: function(test) {
test.expect(1);
var actual = grunt.file.read('tmp/default_options');
var expected = grunt.file.read('test/expected/default_options');
test.equal(actual, expected, 'should describe what the default behavior is.');
test.done();
},
custom_options: function(test) {
test.expect(1);
var actual = grunt.file.read('tmp/custom_options');
var expected = grunt.file.read('test/expected/custom_options');
test.equal(actual, expected, 'should describe what the custom option(s) behavior is.');
test.done();
},
};
node_modules npm-debug.log tmp
{
"curly": true,
"eqeqeq": true,
"immed": true,
"latedef": true,
"newcap": true,
"noarg": true,
"sub": true,
"undef": true,
"boss": true,
"eqnull": true,
"node": true
}
/*
* grunt-manifester
* https://github.com/jeffpar/jsmachines
*
* Copyright (c) 2014 jeffpar
* Licensed under the MIT license.
*/
'use strict';
module.exports = function (grunt) {
// Project configuration.
grunt.initConfig({
jshint: {
all: [
'Gruntfile.js',
'tasks/*.js',
'<%= nodeunit.tests %>'
],
options: {
jshintrc: '.jshintrc'
}
},
// Before generating any new files, remove any previously-created files.
clean: {
tests: ['tmp']
},
// Configuration to be run (and then tested).
manifester: {
default_options: {
options: {
},
files: {
'tmp/default_options': ['test/fixtures/testing', 'test/fixtures/123']
}
},
custom_options: {
options: {
separator: ': ',
punctuation: ' !!!'
},
files: {
'tmp/custom_options': ['test/fixtures/testing', 'test/fixtures/123']
}
}
},
// Unit tests.
nodeunit: {
tests: ['test/*_test.js']
}
});
// Actually load this plugin's task(s).
grunt.loadTasks('tasks');
// These plugins provide necessary tasks.
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-contrib-nodeunit');
// Whenever the "test" task is run, first clean the "tmp" dir, then run this
// plugin's task(s), then test the result.
grunt.registerTask('test', ['clean', 'manifester', 'nodeunit']);
// By default, lint and run all tests.
grunt.registerTask('default', ['jshint', 'test']);
};
Copyright (c) 2014 jeffpar Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# grunt-manifester
> manifest.xml processor
## Getting Started
This plugin requires Grunt `~0.4.4`
If you haven't used [Grunt](http://gruntjs.com/) before, be sure to check out the [Getting Started](http://gruntjs.com/getting-started) guide, as it explains how to create a [Gruntfile](http://gruntjs.com/sample-gruntfile) as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command:
```shell
npm install grunt-manifester --save-dev
```
Once the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:
```js
grunt.loadNpmTasks('grunt-manifester');
```
## The "manifester" task
### Overview
In your project's Gruntfile, add a section named `manifester` to the data object passed into `grunt.initConfig()`.
```js
grunt.initConfig({
manifester: {
options: {
// Task-specific options go here.
},
your_target: {
// Target-specific file lists and/or options go here.
},
},
});
```
### Options
#### options.separator
Type: `String`
Default value: `', '`
A string value that is used to do something with whatever.
#### options.punctuation
Type: `String`
Default value: `'.'`
A string value that is used to do something else with whatever else.
### Usage Examples
#### Default Options
In this example, the default options are used to do something with whatever. So if the `testing` file has the content `Testing` and the `123` file had the content `1 2 3`, the generated result would be `Testing, 1 2 3.`
```js
grunt.initConfig({
manifester: {
options: {},
files: {
'dest/default_options': ['src/testing', 'src/123'],
},
},
});
```
#### Custom Options
In this example, custom options are used to do something else with whatever else. So if the `testing` file has the content `Testing` and the `123` file had the content `1 2 3`, the generated result in this case would be `Testing: 1 2 3 !!!`
```js
grunt.initConfig({
manifester: {
options: {
separator: ': ',
punctuation: ' !!!',
},
files: {
'dest/default_options': ['src/testing', 'src/123'],
},
},
});
```
## Contributing
In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [Grunt](http://gruntjs.com/).
## Release History
_(Nothing yet)_
{
"name": "grunt-manifester",
"description": "manifest.xml processor",
"version": "0.1.0",
"homepage": "https://github.com/jeffpar/jsmachines",
"author": {
"name": "jeffpar",
"email": "jeffpar@mac.com"
},
"repository": {
"type": "git",
"url": "git://github.com/jeffpar/jsmachines.git"
},
"bugs": {
"url": "https://github.com/jeffpar/jsmachines/issues"
},
"licenses": [
{
"type": "MIT",
"url": "https://github.com/jeffpar/jsmachines/blob/master/LICENSE-MIT"
}
],
"engines": {
"node": ">= 0.8.0"
},
"scripts": {
"test": "grunt test"
},
"devDependencies": {
"grunt-contrib-jshint": "~0.6.0",
"grunt-contrib-clean": "~0.4.0",
"grunt-contrib-nodeunit": "~0.2.0",
"grunt": "~0.4.4"
},
"peerDependencies": {
"grunt": "~0.4.4"
},
"keywords": [
"gruntplugin"
]
}/**
* @fileoverview Pre-process JavaScript file(s) with well-defined constants inlined
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
* @version 1.1
* Created 2014-Mar-22
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of C1Pjs, PCjs, and other related components written
* by Jeff Parsons and originally published at cpusim.org and jsmachines.net.
*
* C1Pjs and PCjs are free software: you can redistribute them and/or modify
* them under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* C1Pjs and PCjs are distributed in the hope that they will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with C1Pjs and PCjs. If not, see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source
* code file of every copy or modified version of this work, and to display
* that copyright notice on every screen that loads or runs any version
* of this software (see Computer.sCopyright).
*
* Some C1Pjs and PCjs files also attempt to load external resource files, such
* as character-image files and ROM files. Those external resource files are
* not considered part of the PCjs program for purposes of the GNU General Public
* License, and the author does not claim any copyright as to their contents.
*/
/*
* Options
* ---
* The 'includeObjectConstants' option allows replacement of constants defined
* within objects, instead of only global constants. Use with caution, because
* constants defined within an object scope may not be unique. This does attempt
* to catch any constant collisions and completely disable their replacement, but
* it's not foolproof.
*
* History
* ---
* Although we run all our code through Google's Closure Compiler, which does a
* great job of inlining not only variables but also code to improve performance,
* JavaScript doesn't have the notion of "constants", so we have to define all our
* constants as properties and simply trust that the Closure Compiler will inline
* them all. I'm not completely trusting, so I've created this script that allows
* us to verify the compiler produces substantially the same code whether or not
* we inline all our constants first.
*
* See "inline.php" for the original PHP version of this module.
*
* Conventions
* ---
* This script looks for global constant definitions of the form "Component.XXX = YYY;".
*
* The current approach requires all inlined constants to be defined as properties on
* the associated class constructor (ie, as "class constants"). Life might be simpler
* if the Closure Compiler honored "@const" references for properties, and who knows,
* perhaps the latest version does now; but on the other hand, having my own convention
* relieves me from having to annotate every single constant with a "@const" JSDoc tag.
*
* TODO: Update the C1Pjs sources to use class constants instead of "object constants",
* because in order for C1Pjs to benefit from constant inlining, we must reply on the
* 'includeObjectConstants' option (hack) to expand the contexts that constants may live
* in, which is inherently less safe. Moreover, that option prevents us from removing
* the original constant definitions, because constants like "this.PORT_CRA" could be used
* in other contexts that this script will NOT catch (eg, "controller.PORT_CRA").
*
* TODO: Think about adding another quick hack to this tool, to convert all:
*
* at-param {Debugger} dbg
* to:
* at-param {Component} dbg
*
* prior to compilation. The only reason I declared my "dbg" variables generically,
* as Component objects rather than Debugger objects, was to work around compilation
* errors in the non-Debugger builds.
*
* Implementation
* ---
* This script uses a very simplistic replacement approach that doesn't perform any
* parsing, tokenizing or other pre-processing of the source code, which would otherwise
* be required if we wanted to guarantee that all our replacements precisely mirrored what
* JavaScript actually replaces at run-time. For example, JavaScript allows any so-called
* constant to be redefined at any point, and we don't attempt to catch modifications.
*
* This is why it's important that we limit inlining to only those constants described
* above, and why such constants must never be altered by the code using them.
*
* Debugging
* ===
* Use the following command to debug this task (after making Chrome your default browser):
*
* node-debug $(which grunt) prepjs
*
* which required installing "node-inspector" first:
*
* sudo npm install -g node-inspector
*
* You may also want to enable the heapdump code below, which required installing "heapdump" first:
*
* npm install heapdump --save-dev
*
* TODO: Resolve once and for all the "process out of memory" error that occurs if we don't divide
* the src input into smaller chunks. See the WARNING below.
*/
'use strict';
// var heapdump = require("heapdump");
/**
* compareConstants(a, b)
*
* @param {Array} a
* @param {Array} b
* @returns {number}
*/
var compareConstants = function(a, b)
{
return b[0].length - a[0].length;
};
/**
* indexOfConstant(sConstant, aConstants)
*
* @param {string} sConstant
* @param {Array} aConstants
* @returns {number} index of aConstants entry, or -1 if not found
*/
var indexOfConstant = function(sConstant, aConstants)
{
for (var i = 0; i < aConstants.length; i++) {
if (sConstant == aConstants[i][0]) {
return i;
}
}
return -1;
};
/**
* findConstants(sInput)
*
* @param {string} sInput
* @param {Array} aConstants
* @param {boolean} fObjectConstants
* @param {boolean} fReplaceConstants
* @param {function} [fnLog]
* @returns {string} modified input
*/
var findConstants = function(sInput, aConstants, fObjectConstants, fReplaceConstants, fnLog) {
var sWarning = "";
var sConstDef = "[A-Z][A-Za-z0-9_]*";
if (fObjectConstants) {
sConstDef = "(?:" + sConstDef + "|this)";
}
var aConstDef;
var reConstDef = new RegExp("[ \t]*(" + sConstDef + "\\.[A-Z_][A-Z0-9_\\.]*)\\s*=\\s*(.*?)\\s*;[\t ]*(?://[^\n]*|)\n", "g");
while (aConstDef = reConstDef.exec(sInput)) {
var i;
var sFind = aConstDef[1];
var sReplace = aConstDef[2];
if (fReplaceConstants && !fObjectConstants) {
sInput = sInput.substr(0, aConstDef.index) + sInput.substr(aConstDef.index + aConstDef[0].length);
reConstDef.lastIndex -= aConstDef[0].length;
}
if ((i = indexOfConstant(sFind, aConstants)) >= 0) {
sWarning += "/*\n * warning: multiple definitions for '" + sFind + "' (" + sReplace + ")\n */\n";
aConstants[i][2] = -1; // set a negative replacement count to disable this constant definition
continue;
}
/*
* If the replacement string is entirely quoted, or parenthesized, or a single constant, then we can leave
* the replacement string as-is; otherwise, let's wrap it with parentheses (we could probably wrap everything
* with parentheses, but I like to avoid doing that whenever it's completely unnecessary).
*/
if (!sReplace.match(/^["'\(].*["'\)]$/) && sReplace.match(/[^A-Za-z0-9\.]/)) {
sReplace = "(" + sReplace + ")";
}
if (fnLog) {
fnLog("found '" + sFind + "' => '" + sReplace + "'");
/*
if (sFind == "Video.CRT.CURSOR_END") {
fnLog("here's where we usually run of memory (" + process.cwd() + ")");
heapdump.writeSnapshot();
}
*/
}
aConstants.push([sFind, sReplace, 0]);
}
if (sWarning) sInput = sWarning + sInput;
return sInput;
};
/**
* replaceConstants(sInput, aConstants, fObjectConstants, fInConstant, fnLog)
*
* @param {string} sInput
* @param {Array} aConstants
* @param {boolean} fObjectConstants
* @param {boolean} [fInConstant]
* @param {function} [fnLog]
* @returns {string} modified input
*/
var replaceConstants = function(sInput, aConstants, fObjectConstants, fInConstant, fnLog)
{
do {
var cReplacements = 0;
for (var i = 0; i < aConstants.length; i++) {
if (aConstants[i][2] < 0) continue; // skip any replacement for which we recorded multiple definitions (ie, negative replacement count)
var sFind = aConstants[i][0];
var sReplace = aConstants[i][1];
var cchFind = sFind.length;
var cchReplace = sReplace.length;
var iNext = 0;
while ((iNext = sInput.indexOf(sFind, iNext)) >= 0) {
if (fObjectConstants) {
/*
* As discussed earlier, the 'includeObjectConstants' option precludes removing any constant definitions,
* so we must additionally ensure that we don't inadvertently perform replacements on those definitions.
*/
if (sInput.substr(iNext, 1024).match(/([A-Za-z][A-Za-z0-9_]*\.[A-Z_][A-Z0-9_\.]*)\s*=\s*(.*?)\s*;[\t ]*(?:\/\/[^\n]*|)\n/)) {
iNext += cchFind;
continue;
}
}
if (fnLog) {
fnLog("replaced '" + sFind + "' with '" + sReplace + "'");
}
sInput = sInput.substr(0, iNext) + sReplace + sInput.substr(iNext + cchFind);
aConstants[i][2]++;
cReplacements++;
iNext += cchReplace;
}
/*
* If we've just done any replacements within another constant, then start the process over again
* with the longest constant, to ensure we don't perform any partial replacements.
*/
if (fInConstant && cReplacements) break;
}
} while (cReplacements);
return sInput;
};
module.exports = function(grunt) {
// Please see the Grunt documentation for more information regarding task
// creation: http://gruntjs.com/creating-tasks
grunt.registerMultiTask('prepjs', 'JS Preprocessor', function() {
/*
* Merge task-specific and/or target-specific options with these defaults.
*/
var options = this.options({
includeObjectConstants: false,
listConstants: true,
replaceConstants: true
});
/*
* Iterate over all specified file groups.
*
* See http://gruntjs.com/inside-tasks#this.files, which says in part:
*
* Your task should iterate over the this.files array, utilizing the src and dest
* properties of each object in that array. The this.files property will always be an array.
* The src property will also always be an array, in case your task cares about multiple
* source files per destination file.
*
* And http://gruntjs.com/configuring-tasks#files-array-format, which explains that all files
* objects support src and dest but the 'Files Array' format supports a few additional properties:
*
* filter: Either a valid fs.Stats method name or a function that is passed the matched
* src filepath and returns true or false;
*
* nonull: If set to true then the operation will include non-matching patterns. Combined
* with grunt's --verbose flag, this option can help debug file path issues;
*
* dot: Allow patterns to match filenames starting with a period, even if the pattern does
* not explicitly have a period in that spot;
*
* matchBase: If set, patterns without slashes will be matched against the basename of the path
* if it contains slashes. For example, a?b would match the path /xyz/123/acb, but not /xyz/acb/123;
*
* expand: Process a dynamic src-dest file mapping, see "Building the files object dynamically"
* for more information.
*/
this.files.forEach(function(file) {
/*
* Allow any of our options to be set at the target level as well
*/
var fObjectConstants = file.includeObjectConstants;
if (fObjectConstants === undefined) fObjectConstants = options.includeObjectConstants;
var fListConstants = file.listConstants;
if (fListConstants === undefined) fListConstants = options.listConstants;
var fReplaceConstants = file.replaceConstants;
if (fReplaceConstants === undefined) fReplaceConstants = options.replaceConstants;
/*
* Read all file contents into src
*/
var src = file.src.filter(function(sFilePath) {
/*
* Warn on and remove invalid source files (if nonull was set)
*/
if (!grunt.file.exists(sFilePath)) {
grunt.log.warn('Source file "' + sFilePath + '" not found.');
return false;
}
return true;
}).map(function(sFilePath) {
/*
* Read a file
*/
return grunt.file.read(sFilePath);
}).join("\n");
/*
* Find all the constants in src, and remove their definitions from src if possible
* (ie, if fReplaceConstants is true and fObjectConstants is false).
*
* aConstants is the array of constant definitions, where each definition is another
* 3-element array:
*
* [0]: the original string (ie, the name of the constant)
* [1]: the replacement string (ie, the value of the constant)
* [2]: a replacement count, initialized to zero; set to -1 if a duplicate is found
*
* WARNING: Grunt (ie, Node) fails with the following error:
*
* FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory
*
* when processing a large src stream (eg, on the order 1.5Mb), and it always seems to
* die in findConstants()'s call to RegExp's exec() method. I couldn't glean any clues
* from the heapdump (other than observing that, yes, running Grunt generates a shitload of
* objects and is probably not very well-tuned), so I've implemented a simple work-around:
* divide the src stream into two parts. If necessary, this work-around can easily be
* generalized to N parts. If the problem is a direct side-effect of passing very large
* strings to the RegExp library, then this is clearly one way to avoid that problem.
*/
var aConstants = [];
var i = src.length/2;
i = src.indexOf("\n", i) + 1; // divide the src after the first linefeed beyond the midpoint
var src1 = src.substr(0, i);
var src2 = src.substr(i);
// grunt.log.writeln("findConstants(src1): " + src1.length + " chars");
src1 = findConstants(src1, aConstants, fObjectConstants, fReplaceConstants);
// grunt.log.writeln("findConstants(src2): " + src2.length + " chars");
src2 = findConstants(src2, aConstants, fObjectConstants, fReplaceConstants);
/*
* Sort the constants in order of longest definition to shortest, because we perform all the replacements
* in array order, and we can't allow definitions that are subsets of longer definitions to be replaced first.
*/
// grunt.log.writeln("aConstants.sort()");
aConstants.sort(compareConstants);
// grunt.log.writeln("replacing constants in other constants");
aConstants.forEach(function(constant) {
constant[1] = replaceConstants(constant[1], aConstants, fObjectConstants, true);
});
if (fReplaceConstants) {
// grunt.log.writeln("replaceConstants(src1)");
src1 = replaceConstants(src1, aConstants, fObjectConstants, false);
// grunt.log.writeln("replaceConstants(src2)");
src2 = replaceConstants(src2, aConstants, fObjectConstants, false);
// grunt.log.writeln("replaceConstants() complete");
}
var sListing = "";
if (fListConstants) {
// grunt.log.writeln("listing constants");
sListing += "/*\n * List of grunt-prepjs replacements:\n *\n";
for (i = 0; i < aConstants.length; i++) {
sListing += " * " + aConstants[i][0] + " => " + aConstants[i][1] + " (" + aConstants[i][2] + " occurrences)\n";
}
sListing += " */\n";
}
/*
* Write the destination file
*/
// grunt.log.writeln("writing " + f.dest);
grunt.file.write(file.dest, sListing + src1 + src2);
/*
* Print a success message
*/
grunt.log.writeln('File "' + file.dest + '" created.');
});
});
};
Testing: 1 2 3 !!!
Testing, 1 2 3.
1 2 3
Testing
'use strict';
var grunt = require('grunt');
/*
======== A Handy Little Nodeunit Reference ========
https://github.com/caolan/nodeunit
Test methods:
test.expect(numAssertions)
test.done()
Test assertions:
test.ok(value, [message])
test.equal(actual, expected, [message])
test.notEqual(actual, expected, [message])
test.deepEqual(actual, expected, [message])
test.notDeepEqual(actual, expected, [message])
test.strictEqual(actual, expected, [message])
test.notStrictEqual(actual, expected, [message])
test.throws(block, [error], [message])
test.doesNotThrow(block, [error], [message])
test.ifError(value)
*/
exports.prepjs = {
setUp: function(done) {
// setup here if necessary
done();
},
default_options: function(test) {
test.expect(1);
var actual = grunt.file.read('tmp/default_options');
var expected = grunt.file.read('test/expected/default_options');
test.equal(actual, expected, 'should describe what the default behavior is.');
test.done();
},
custom_options: function(test) {
test.expect(1);
var actual = grunt.file.read('tmp/custom_options');
var expected = grunt.file.read('test/expected/custom_options');
test.equal(actual, expected, 'should describe what the custom option(s) behavior is.');
test.done();
},
};
{
"curly": true,
"eqeqeq": true,
"immed": true,
"latedef": true,
"newcap": true,
"noarg": true,
"sub": true,
"undef": true,
"boss": true,
"eqnull": true,
"node": true
}
/*
* grunt-prepjs
* https://github.com/jeffpar/jsmachines
*
* Copyright (c) 2014 jeffpar
* Licensed under the MIT license.
*
* Genesis:
*
* sudo npm install -g grunt-init
* git clone git://github.com/gruntjs/grunt-init-gruntplugin.git ~/.grunt-init/gruntplugin
* cd ~/Sites/pcjs/modules
* mkdir -p grunts/prepjs
* cd grunts/prepjs
* grunt-init gruntplugin
* npm install
*
* This file was generated at the "grunt-init gruntplugin" stage. Here's what that process looked like:
*
* Running "init:gruntplugin" (init) task
* This task will create one or more files in the current directory, based on the
* environment and the answers to a few questions. Note that answering "?" to any
* question will show question-specific help and answering "none" to most questions
* will leave its value blank.
*
* "gruntplugin" template notes:
* For more information about Grunt plugin best practices, please see the docs at
* http://gruntjs.com/creating-plugins
*
* Please answer the following:
* [?] Project name (grunt-prep) grunt-prepjs
* [?] Description (The best Grunt plugin ever.) JS Preprocessor
* [?] Version (0.1.0)
* [?] Project git repository (git://github.com/jeffpar/jsmachines.git)
* [?] Project homepage (https://github.com/jeffpar/jsmachines)
* [?] Project issues tracker (https://github.com/jeffpar/jsmachines/issues)
* [?] Licenses (MIT)
* [?] Author name (jeffpar)
* [?] Author email (jeffpar@mac.com)
* [?] Author url (none)
* [?] What versions of grunt does it require? (~0.4.4)
* [?] What versions of node does it run on? (>= 0.8.0)
* [?] Do you need to make any changes to the above before continuing? (y/N)
*
* Writing .gitignore...OK
* Writing .jshintrc...OK
* Writing Gruntfile.js...OK
* Writing README.md...OK
* Writing tasks/prepjs.js...OK
* Writing test/expected/custom_options...OK
* Writing test/expected/default_options...OK
* Writing test/fixtures/123...OK
* Writing test/fixtures/testing...OK
* Writing test/prepjs_test.js...OK
* Writing LICENSE-MIT...OK
* Writing package.json...OK
*
* Initialized from template "gruntplugin".
* You should now install project dependencies with npm install. After that, you
* may execute project tasks with grunt. For more information about installing
* and configuring Grunt, please see the Getting Started guide:
*
* http://gruntjs.com/getting-started
*
* Done, without errors.
*
* The process was a bit sloppy about trailing commas, though. I've cleaned those up, thanks to PhpStorm.
*
* Online tutorials further recommended the following in my project's root:
*
* npm install modules/grunts/prepjs --save-dev
*
* However, all that does is make another copy of my "grunt-prepjs" module, inside the "node_modules" folders;
* I can avoid that by simply including the following in my root Gruntfile.js:
*
* grunt.loadTasks("modules/grunts/prepjs/tasks");
*/
'use strict';
module.exports = function (grunt) {
// Project configuration.
grunt.initConfig({
jshint: {
all: [
'Gruntfile.js',
'tasks/*.js',
'<%= nodeunit.tests %>'
],
options: {
jshintrc: '.jshintrc'
}
},
// Before generating any new files, remove any previously-created files.
clean: {
tests: ['tmp']
},
// Configuration to be run (and then tested).
prepjs: {
default_options: {
options: {
},
files: {
'tmp/default_options': ['test/fixtures/testing', 'test/fixtures/123']
}
},
custom_options: {
options: {
separator: ': ',
punctuation: ' !!!'
},
files: {
'tmp/custom_options': ['test/fixtures/testing', 'test/fixtures/123']
}
}
},
// Unit tests.
nodeunit: {
tests: ['test/*_test.js']
}
});
// Actually load this plugin's task(s).
grunt.loadTasks('tasks');
// These plugins provide necessary tasks.
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-contrib-nodeunit');
// Whenever the "test" task is run, first clean the "tmp" dir, then run this
// plugin's task(s), then test the result.
grunt.registerTask('test', ['clean', 'prepjs', 'nodeunit']);
// By default, lint and run all tests.
grunt.registerTask('default', ['jshint', 'test']);
};
Copyright (c) 2014 jeffpar Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# grunt-prepjs
> JS Preprocessor
## Getting Started
This plugin requires Grunt `~0.4.4`
If you haven't used [Grunt](http://gruntjs.com/) before, be sure to check out the [Getting Started](http://gruntjs.com/getting-started) guide, as it explains how to create a [Gruntfile](http://gruntjs.com/sample-gruntfile) as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command:
```shell
npm install grunt-prepjs --save-dev
```
Once the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:
```js
grunt.loadNpmTasks('grunt-prepjs');
```
## The "prepjs" task
### Overview
In your project's Gruntfile, add a section named `prepjs` to the data object passed into `grunt.initConfig()`.
```js
grunt.initConfig({
prepjs: {
options: {
// Task-specific options go here.
},
your_target: {
// Target-specific file lists and/or options go here.
},
},
});
```
### Options
#### options.separator
Type: `String`
Default value: `', '`
A string value that is used to do something with whatever.
#### options.punctuation
Type: `String`
Default value: `'.'`
A string value that is used to do something else with whatever else.
### Usage Examples
#### Default Options
In this example, the default options are used to do something with whatever. So if the `testing` file has the content `Testing` and the `123` file had the content `1 2 3`, the generated result would be `Testing, 1 2 3.`
```js
grunt.initConfig({
prepjs: {
options: {},
files: {
'dest/default_options': ['src/testing', 'src/123'],
},
},
});
```
#### Custom Options
In this example, custom options are used to do something else with whatever else. So if the `testing` file has the content `Testing` and the `123` file had the content `1 2 3`, the generated result in this case would be `Testing: 1 2 3 !!!`
```js
grunt.initConfig({
prepjs: {
options: {
separator: ': ',
punctuation: ' !!!',
},
files: {
'dest/default_options': ['src/testing', 'src/123'],
},
},
});
```
## Contributing
In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [Grunt](http://gruntjs.com/).
## Release History
_(Nothing yet)_
{
"name": "grunt-prepjs",
"description": "JS Preprocessor",
"version": "0.1.0",
"homepage": "https://github.com/jeffpar/jsmachines",
"author": {
"name": "jeffpar",
"email": "jeffpar@mac.com"
},
"repository": {
"type": "git",
"url": "git://github.com/jeffpar/jsmachines.git"
},
"bugs": {
"url": "https://github.com/jeffpar/jsmachines/issues"
},
"licenses": [
{
"type": "MIT",
"url": "https://github.com/jeffpar/jsmachines/blob/master/LICENSE-MIT"
}
],
"engines": {
"node": ">= 0.8.0"
},
"scripts": {
"test": "grunt test"
},
"devDependencies": {
"grunt-contrib-jshint": "~0.6.0",
"grunt-contrib-clean": "~0.4.0",
"grunt-contrib-nodeunit": "~0.2.0",
"grunt": "~0.4.4"
},
"peerDependencies": {
"grunt": "~0.4.4"
},
"keywords": [
"gruntplugin"
]
}Experimental Grunt Tasks === I experimented briefly with a few Grunt tasks, but working with Grunt wasn't all that pleasant, and neither of these tasks are all that important right now, so they're only here for a rainy day or to be cannibalized for some other purpose. [manifester](manifester/) was intended to open a manifest.xml file (discussed in more detail [here](/apps/)) and download all the referenced files. The task was inspired by `npm install`, which downloads all the required modules specified in [package.json](/package.json) without requiring them to be checked into the project. However, the manifest design needs to be fleshed out more before work on this continues. [prepjs](prepjs/) was intended to inline well-defined constants in all JavaScript files before running them through the Closure Compiler, but it turned out that: - the Grunt task would quickly run out of memory - the Closure Compiler actually did a pretty good job inlining all by itself
#!/bin/sh
#
# This script was created for the Grunt "delete-indexes" task in /Gruntfile.js; it lives here
# because htmlout is the module responsible for "littering" the project with "index.html" files,
# therefore it bears responsibility for cleaning them up. This is its "poor man's" solution.
#
find . -name "index.html" -exec grep -H -l -e "<title>pcjs.org" {} \; | sed -E "s/(.*)/rm -v \"\1\"/" | bash
#!/usr/bin/env node
/**
* @fileoverview Implements the HTMLOut command-line interface
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* @suppress {missingProperties}
* Created 2012-Sep-04
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
* and <http://pcjs.org/>.
*
* JSMachines is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with JSMachines.
* If not, see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some JSMachines files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* JSMachines Project for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
var path = require("path");
var fs = require("fs");
var lib = path.join(path.dirname(fs.realpathSync(__filename)), "../lib/");
require(lib + "htmlout.js").CLI();
/**
* @fileoverview Builds default ("index.html") documents from HTML templates
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
* @version 1.0
* Created 2014-02-14
*
* This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
* and <http://pcjs.org/>.
*
* JSMachines is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with JSMachines.
* If not, see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some JSMachines files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* JSMachines Project for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
var fs = require("fs");
var path = require("path");
var glob = require("glob");
/**
* @class exports
* @property {function(string)} sync
*/
var HTTPAPI = require("./httpapi");
var DumpAPI = require("../../shared/lib/dumpapi");
var MarkOut = require("../../markout");
var net = require("../../shared/lib/netlib");
var proc = require("../../shared/lib/proclib");
var str = require("../../shared/lib/strlib");
var usr = require("../../shared/lib/usrlib");
/**
* @class exports
* @property {string} name
* @property {string} version
* @property {Array.<string>} c1pCSSFiles
* @property {Array.<string>} c1pJSFiles
* @property {Array.<string>} pcCSSFiles
* @property {Array.<string>} pcJSFiles
*/
var pkg = require("../../../package.json");
/*
* fCache controls "index.html" caching; it is true by default and can be overridden using the setOptions()
* 'cache' property.
*/
var fCache = true;
/*
* fConsole controls console messages; it is false by default and can be overridden using the setOptions()
* 'console' property.
*/
var fConsole = false;
/*
* fServerDebug controls server-related debug features; it is false by default and can be enabled using the
* setOptions() 'debug' property (or from the server's command-line interface using "--debug").
*
* This used to be named fDebug, which was fine, but it has been renamed to make the distinction between the
* server's debug state (fServerDebug) and the debug state of HTMLOut instances (this.fDebug) clearer.
*/
var fServerDebug = false;
/*
* logFile is set by server.js using the setOptions() 'logfile' property, if the server has turned on
* logging. This allows us to "mingle" our logConsole() output with the server's log (typically "./logs/node.log").
*
* The same "mingled" messages will also appear on the console if fConsole has been turned on as well
* (using "--console" from our own command-line interface, or via the setOptions() 'console' property).
*/
var logFile = null;
/*
* fRebuild controls the rebuilding of cached "index.html" files, assuming fCache is true; fRebuild is false
* by default, and it can be set for all requests using the setOptions() 'rebuild' property, or for individual
* requests using the fRebuild parameter to HTMLOut().
*/
var fRebuild = false;
/*
* fSendDefault determines what happens HTMLOut() determines that an up-to-date default document already exists;
* if false (default), HTMLOut() will return null, allowing our Express filter() function pass the request on
* as a normal static file request; otherwise, HTMLOut() will load the document and send the contents itself
* (this is the mode that the CLI uses).
*
* TODO: Consider honoring fSendDefault even when generating a new default document, although there may be some
* efficiency to sending new documents ourselves, because we don't have to wait for the writeFile() to complete.
*
* NOTE: I've since changed the fSendDefault from false to true, because I'm running into situations where, at
* least for directory URLs with default documents, the Express static file handler is reporting that the static
* content is "not modified" (304), which in turn causes Safari to occasionally display blank pages.
*
* The server (server.js) still has the option (via setOptions) to override this setting, but until the dreaded
* "Safari blank page" problem is fully understood and addressed, the server should probably not do that.
*
* TODO: Understand and properly address the "Safari blank page" problem (which I'm still seeing as of
* Safari v7.0.3); some folks claim it's a Safari bug, but I'm not convinced, because similar requests/responses
* from Apache don't cause the problem.
*/
var fSendDefault = true;
/*
* fSockets is set if the server tells us to enable client-side support.
*/
var fSockets = false;
/*
* sServerRoot is the root directory of the web server; it can (and should) be overridden using by the Express
* web server using setRoot().
*/
var sServerRoot = "/Users/Jeff/Sites/pcjs";
/*
* sDefaultFile is the default filename to use for web server directories, and sTemplateFile is the default HTML
* template to use.
*/
var sDefaultFile = "index.html";
var sTemplateFile = "./modules/shared/templates/common.html";
/*
* sReadMeFile is the default markdown file to load and convert to HTML when a "readme" token is detected in an
* HTML template file; sMachineXMLFile is a fallback file to look for when sReadMeFile doesn't exist.
*/
var sReadMeFile = "README.md";
var sMachineXMLFile = "machine.xml";
var sManifestXMLFile = "manifest.xml";
/*
* We need lists of the uncompiled scripts for C1Pjs and PCjs, indexed by machine class, so that if we have
* to inject those individual scripts into the current document, all the ordering dependencies will be honored
* (which is why processMachines() can't simply enumerate all the .js files in the respective script folder).
*
* We build these lists from the lists stored in the project's "package.json" file; also, we start with the
* complete lists (ie, with "debugger.js" included in the proper sequence) and then filter out the debugger
* later if it turns out we don't need it.
*
* We include any required CSS files in these lists as well, for convenience. CSS files are added just before
* the closing </head> tag, and JS files are added just before the closing </body> tag.
*/
var aMachineFiles = {
'c1p': pkg.c1pCSSFiles.concat(pkg.c1pJSFiles),
'pc': pkg.pcCSSFiles.concat(pkg.pcJSFiles)
};
var aMachineFileTypes = {
'head': [".css"], // put BOTH ".css" and ".js" here if convertMDMachineLinks() embeds its own scripts
'body': [".js"]
};
/*
* Since we have a small server-side optimization that assumes any directory entry without an extension is
* a directory, this is a list of known exceptions (ie, entries that are NOT directories despite no extension).
*/
var asNonDirectories = [
"COPYING",
"LICENSE",
"README",
"makefile"
];
/*
* A list of plain-text file types that we want the server to serve up with mime-type "text/plain".
*/
var asExtsPlainText = [
"65v",
"bas",
"hex",
"map",
"nasm",
"txt"
];
/*
* When we're generating file listings for a directory (ie, getDirList()), we exclude
* all files/folders in BOTH of the following arrays. However, if someone knows/guesses
* the name of a non-listed file that does not appear in the non-served set, we're OK
* with serving it to them.
*
* EXAMPLE: If you put "lib" in the non-listed set, then folders containing a "lib" won't
* list it, but if you enter a URL to a "lib", its contents will be listed; whereas if you
* put "lib" in the non-served set, then neither it NOR its contents will be listed.
*
* NOTE: There are some additional non-listed run-time checks we perform, such as files
* containing a "-debug" suffix, as well as some non-served run-time checks, like anything
* ending with ".sh" or ".php" (although I no longer bother with ".php", since all PHP files
* should now be removed from the project).
*/
var asFilesNonListed = [
// "LICENSE",
"Gruntfile.js",
"npm-shrinkwrap.json",
"package.json",
"server.js",
"index.html",
"notes.md",
"README.md",
"robots.txt",
"machine.xml",
"manifest.xml",
"cache.manifest"
];
var asExtsNonListed = [
// "json" // let's allow these after all (so that people can download disk images)
];
var asExtsNonServed = [
"sh"
];
var asFilesNonServed = [
"bin",
"debug",
"grunts",
"logs",
"node.log",
"node_modules",
"tests",
"tmp",
"users",
"users.log",
"iisnode", // Azure/IISNode-specific
"IISNode.yml", // Azure/IISNode-specific
"web.config" // Azure/IISNode-specific
];
var nBlogExcerpts = 20;
/**
* HTMLOut()
*
* Load (building or rebuilding as needed) a default HTML document ("index.html")
* for the specified directory (which corresponds to req.path). sFile is the name
* of a specific template file to start with, but in most cases, callers will pass
* null, which means we'll fall back to sTemplateFile.
*
* @constructor
* @param {string} sDir is a fully-qualified web server directory
* @param {string|null} sFile is an optional template path (relative to sDir)
* @param {boolean} fRebuild (this overrides the module's normal fRebuild setting)
* @param {Object} req
* @param {function(Error,string)} done
*/
function HTMLOut(sDir, sFile, fRebuild, req, done)
{
this.sDir = sDir;
this.sFile = (sFile? path.join(sDir, sFile) : path.join(sServerRoot, sTemplateFile));
HTMLOut.logDebug('HTMLOut("' + sDir + '", "' + this.sFile + '", ' + fRebuild + ')');
this.fDebug = (fServerDebug || net.hasParm(net.GORT_COMMAND, net.GORT_DEBUG, req)) && !net.hasParm(net.GORT_COMMAND, net.GORT_RELEASE, req);
this.fRebuild = fRebuild;
this.req = req;
this.done = done;
this.sHTML = "";
this.sTemplate = null;
this.aTokens = {};
this.fRandomize = false;
/*
* Since we now pass fDebug to the MarkOut module, which may generate some debug
* info in the final output that we wouldn't want to cache, I've changed the behavior
* of fDebug to simply never cache, instead of always rebuilding the cache.
*
* if (this.fDebug) this.fRebuild = true;
*
* Note that a production server should not need the GORT_REBUILD command, so we accept
* it only if fServerDebug is true.
*/
if (fServerDebug && net.hasParm(net.GORT_COMMAND, net.GORT_REBUILD, req)) {
req.query[net.GORT_COMMAND] = undefined;
this.fRebuild = true;
}
/*
* Check the global cache setting, as well as the presence of ANY special commands
* that we would never want to cache.
*/
if (!fCache || fServerDebug || net.hasParm(net.GORT_COMMAND, null, req) || net.hasParm(net.REVEAL_COMMAND, null, req)) {
this.loadFile(this.sFile, true);
return;
}
/*
* Set the name of the default file (eg, "index.html") we will use to cache the template
* after all tokens have been replaced.
*/
this.sCacheFile = path.join(sDir, sDefaultFile);
if (this.fRebuild) {
HTMLOut.logDebug("HTMLOut(): rebuilding " + this.sCacheFile);
this.loadFile(this.sFile, true);
return;
}
/*
* Since caching is allowed, let's see if sDefaultFile has already been built
* and is newer than the specified template file.
*/
var obj = this;
fs.stat(this.sCacheFile, function doneStatCacheFile(err, statsIndex) {
if (err) {
obj.loadFile(obj.sFile, true);
} else {
fs.stat(obj.sFile, function doneStatTemplateFile(err, statsTemplate) {
if (!err && statsIndex.mtime.getTime() < statsTemplate.mtime.getTime()) {
/*
* Since the template has a new timestamp, we're going to load and process it
* as a template (so set fTemplate = true);
*/
obj.loadFile(obj.sFile, true);
} else {
/*
* If the specified template file can't be accessed, we can either report that as
* an error, or display the current sDefaultFile; it seems safer and friendlier to
* do the latter, and simply log the missing template error.
*
* if (err) {
* obj.setData(err, null);
* }
*/
if (err) {
HTMLOut.logError(err, true);
}
if (fSendDefault) {
/*
* Since the cached copy appears to be up-to-date, we can load it, but there's
* no need to (re)process it as a template (so set fTemplate = false).
*/
obj.loadFile(obj.sCacheFile, false);
} else {
/*
* By passing null for the (2nd) data parameter, we're telling the caller to pass
* the request on as a static file request.
*/
obj.done(null, null);
}
}
});
}
});
}
/**
* CLI() provides a command-line interface for the htmlout module
*
* Usage:
*
* htmlout --dir=(directory) [--file=(filename)] [--cache] [--console] [--rebuild]
*
* Arguments:
*
* --cache turns "index.html" caching on or off; caching is ON by default.
*
* --console turns diagnostic console messages on or off; they are OFF by default.
*
* --debug turns internal debug console messages on or off; they are OFF by default.
*
* --dir specifies a directory relative to the web server's root directory; it must begin with '/' and
* will be fully-qualified before being passed to HTMLOut().
*
* --file specifies an optional filename (relative to the directory given by --dir) of an alternative HTML
* template file; otherwise, sTemplateFile (which is relative to sServerRoot) will be used.
*
* --rebuild forces any cached version of the resulting HTML to be rebuilt (in other words, we will not read
* any cached version of the HTML, but if caching is enabled, we will write a new cached version).
*
* Examples:
*
* node modules/htmlout/bin/htmlout --dir=/ --console --rebuild
*/
HTMLOut.CLI = function()
{
var args = proc.getArgs();
if (args.argc) {
var argv = args.argv;
/*
* Create a dummy Express req object
*/
var sDir = argv['dir'];
var req = {'path': sDir};
if (argv['debug'] !== undefined) fServerDebug = argv['debug'];
/*
* Note that we don't provide command-line control over the 'senddef' option, because
* that option's only purpose is to force HTMLOut() to load and return the requested
* file (and the CLI interface is not a filter function).
*/
HTMLOut.setOptions({'cache': argv['cache'], 'console': argv['console'], 'senddef': true});
if (fServerDebug) {
console.log("args: " + JSON.stringify(argv));
console.log("req: " + JSON.stringify(req));
}
if (sDir && sDir.charAt(0) == '/') {
sDir = path.join(sServerRoot, sDir);
var file = new HTMLOut(sDir, argv['file'], argv['rebuild'], req, function doneHTMLOutCLI(err, s) {
if (err) {
HTMLOut.logError(err, true);
}
else {
console.log(s);
}
});
} else {
console.log("error: --dir missing or invalid");
}
} else {
console.log("usage: htmlout [--dir=(directory)] [--file=(filename)] [--rebuild] [--cache=(true|false)] [--console=(true|false)]");
}
};
/**
* filter(req, res, next) is called by the Express web server to give us a crack at the URL
*
* If the URL path (req.path) refers to a directory, then we will read a common HTML template and fill
* it with the contents of the README.md in that directory, and send the response ourselves. Otherwise,
* we pass the request back to Express, via next(), because req.path must either refer to a static file,
* which the express.static() middleware will take care of, or a non-existent file, which Express should
* handle by returning an error (eg, 404).
*
* @param {Object} req is an Express request object (http://expressjs.com/api.html#req.params)
* @param {Object} res is an Express response object (http://expressjs.com/api.html#res.status)
* @param {function()} next is the function to call to finish processing this request (unless WE finish it)
*/
HTMLOut.filter = function(req, res, next)
{
HTMLOut.logDebug('HTMLOut.filter("' + req.url + '")');
if (HTTPAPI.redirect(req, res, next)) return;
var i;
var sPath = path.join(sServerRoot, req.path);
var sBaseName = path.basename(req.path);
var sBaseExt = ((i = sBaseName.lastIndexOf('.')) > 0? sBaseName.substr(i+1) : "").toLowerCase();
var sTrailingChar = req.path.slice(-1);
if (!fServerDebug && !net.hasParm(net.GORT_COMMAND, net.GORT_DEBUG, req)) {
if (asExtsNonServed.indexOf(sBaseExt) >= 0 || asFilesNonServed.indexOf(sBaseName) >= 0) {
/*
* Mimic the error code+message that express.static() displays for non-existent files/folders.
*/
res.status(404).send("Cannot GET " + req.path);
return;
}
}
/*
* The Safari "blank page" problem continues to plague us. Our first work-around was for directory
* "index.html" documents, which we resolved by setting fSendDefault to true, so that we would always send
* it ourselves, along with an "ok" (200) response code, instead of letting the Express next() function
* handle it with a "not modified" (304) response code.
*
* However, the problem also extends to any XML files that we serve to an initial Safari request
* (eg, the machine.xml and manifest.xml files that we style as web pages). Safari includes
* "Cache-Control max-age=0" in the request, and if the response is "Cache-Control public, max-age=0"
* along with a 304 response code, Safari may once again display a blank page.
*
* This problem appears limited to the initial resource request for a particular URL. When these XML
* files are requested by Safari while loading another web page, Safari's caching logic is different
* (eg, it doesn't include the same "Cache-Control" setting).
*/
if (sBaseName == "machine.xml" || sBaseName == "manifest.xml") {
var sAgent = req.headers['user-agent'];
if (sAgent && sAgent.indexOf("Safari/") >= 0 && sAgent.indexOf("Chrome/") < 0 && sAgent.indexOf("OPR/") < 0) {
var sCacheControl = req.headers['cache-control'];
if (sCacheControl && sCacheControl.indexOf("max-age=0") >= 0) {
HTMLOut.logDebug("HTMLOut.filter(" + sBaseName + "): Safari work-around in progress");
fs.readFile(sPath, {encoding: "utf8"}, function doneReadFileFilter(err, sData) {
if (err) {
HTMLOut.logError(err);
next(); // alternatively: res.status(404).send("Cannot GET " + req.path);
} else {
/*
* HACK: Express may still modify our response, turning our 200 status code into a 304
* and adding an Etag, unless we ALSO change the req.method from "GET" to something else.
* Supposedly, we could also use app.disable('etag'), but I'm not sure that would prevent
* Express from changing the status code, and I'm tired of testing work-arounds for this
* irritating behavior.
*/
req.method = "NONE";
res.set("Content-Type", "application/xml");
res.status(200).send(sData);
}
});
return;
}
}
}
if (asNonDirectories.indexOf(sBaseName) >= 0 || asExtsPlainText.indexOf(sBaseExt) >= 0) {
res.set("Content-Type", "text/plain");
}
/*
* Next, check for API requests (eg, "/api/v1/dump?disk=/disks/pc/dos/ibm/2.00/PCDOS200-DISK1.json&format=img")
*
* We perform this before the trailing-slash-redirect check below, because we don't require our API endpoints to
* have a trailing slash.
*/
if (HTTPAPI.filterAPI(req, res, next)) return;
/*
* If sBaseName contains a file extension, I want to save some time by assuming it's NOT a directory.
* I simplistically check for a file extension by checking merely for the presence of a period ("dot").
* Obviously, folder names *could* also contain periods, so this optimization works only so long as I promise
* to not create any public directories containing periods (well, ignoring folders containing version numbers).
*
* Conversely, if there is NO period, then I want to assume that it IS a directory, and therefore if the
* basename did NOT end with a trailing slash AND I've enabled "strict routing" in Express (which I should
* have), then we want to pass this request on to next(), so that the "express-slash" module will get a
* crack at the URL and redirect with a trailing slash as appropriate.
*
* This isn't just a cosmetic issue, because without "strict routing" and the "express-slash" module,
* URLs like "http://localhost:8088/devices/pc/machine/5150/mda/64kb/debugger" will cause problems for
* client-side JavaScript when it tries to do an XMLHttpRequest with a relative filename (eg, "machine.xml");
* that request will fetch the "machine.xml" in the parent directory instead of the "debugger" directory.
*
* TODO: Verify the problem observed above is NOT a side-effect of some poorly written client-side JavaScript
* forming improper paths.
*
* NOTE: To minimize unnecessary redirects, the getDirList() function should always (try to) generate URLs for
* folders with trailing slashes.
*/
if (asNonDirectories.indexOf(sBaseName) < 0) {
if (sTrailingChar != '/') {
HTMLOut.logDebug('HTMLOut.filter("' + sBaseName + '"): passing static file request to next()');
next();
return;
}
}
fs.stat(sPath, function doneStatDirFilter(err, stats) {
if (err) {
HTMLOut.logError(err);
// res.status(404).send(err.message);
} else {
var fDir = stats.isDirectory();
HTMLOut.logDebug('HTMLOut.filter(): isDirectory("' + sPath + '"): ' + fDir);
if (fDir) {
new HTMLOut(sPath, null, fRebuild, req, function doneHTMLOutFilter(err, sData) {
if (err) {
HTMLOut.logError(err);
next();
} else if (!sData) {
/*
* HTMLOut() has the option of returning null, if it determines we can
* simply pass the request (ie, treat it as a static request).
*
* TODO: Assert that this behavior is consistent with the fSendDefault setting
* (fSendDefault should be false).
*/
HTMLOut.logDebug("HTMLOut.filter(): returned null");
next();
} else {
HTMLOut.logDebug("HTMLOut.filter(): returned " + sData.length + " bytes");
/*
* HACK: Express may still modify our response, turning our 200 status code into a 304
* and adding an Etag, unless we ALSO change the req.method from "GET" to something else.
* Supposedly, we could also use app.disable('etag'), but I'm not sure that would prevent
* Express from changing the status code, and I'm tired of testing work-arounds for this
* irritating behavior in Safari.
*/
req.method = "NONE";
res.status(200).send(sData);
}
});
return;
}
}
next();
});
};
/**
* logConsole(s)
*
* By using this instead of console.log(), we can eliminate the constant checks for fConsole (although
* doing those checks might save some unnecessary string concatenation when fConsole is false), and we get
* the added benefit of optionally being able to log all our messages to the server's log file.
*
* @param {string} s
* @return {string}
*/
HTMLOut.logConsole = function(s)
{
if (fConsole) console.log(s);
if (logFile) logFile.write(s + "\n");
return s;
};
/**
* logDebug(s)
*
* @param {string} s
* @return {string}
*/
HTMLOut.logDebug = function(s)
{
if (fServerDebug) HTMLOut.logConsole(s);
return s;
};
/**
* logError(err) conditionally logs an error to the console
*
* @param {Error} err
* @param {boolean} [fForce]
* @return {string} the error message that was logged (or that would have been logged had logging been enabled)
*/
HTMLOut.logError = function(err, fForce)
{
var sError = "";
if (err) {
sError = "htmlout error: " + err.message;
if (fConsole || fForce) HTMLOut.logConsole(sError);
}
return sError;
};
/**
* setOptions(options) is used by the Express web server to set module options
*
* Supported options include:
*
* 'cache' fCache
* 'console' fConsole
* 'debug' fServerDebug
* 'logfile' logFile
* 'rebuild' fRebuild
* 'senddef' fSendDefault
* 'sockets' fSockets
*
* Note that an option must be explicitly set in order to override the option's default value
* (see fCache, fConsole, fServerDebug, fRebuild and fSockets, respectively).
*
* @param {Object} options
*/
HTMLOut.setOptions = function(options)
{
if (options['cache'] !== undefined) {
fCache = options['cache'];
}
if (options['console'] !== undefined) {
fConsole = options['console'];
}
if (options['debug'] !== undefined) {
fServerDebug = options['debug'];
}
if (options['logfile'] !== undefined) {
logFile = options['logfile'];
HTTPAPI.setLogFile(logFile);
}
if (options['rebuild'] !== undefined) {
fRebuild = options['rebuild'];
}
if (options['senddef'] !== undefined) {
fSendDefault = options['senddef'];
}
if (options['sockets'] !== undefined) {
fSockets = options['sockets'];
}
};
/**
* setRoot(sRoot) is used by the Express web server to inform us of its root directory
*
* NOTE: We can't use __dirname, because every module has its own __dirname, so our __dirname
* won't be the same as Express's __dirname. Moreover, the Express web server won't necessarily
* be configured to use __dirname as the root. Normally, this should match whatever gets
* passed to express.static().
*
* @param {string} sRoot
*/
HTMLOut.setRoot = function(sRoot)
{
sServerRoot = sRoot;
HTTPAPI(HTMLOut, sRoot);
};
/*
* Object methods
*/
/**
* loadFile()
*
* @this {HTMLOut}
* @param {string} sFile
* @param {boolean} fTemplate
*/
HTMLOut.prototype.loadFile = function(sFile, fTemplate)
{
var obj = this;
HTMLOut.logConsole('HTMLOut.loadFile("' + sFile + '")');
fs.readFile(sFile, {encoding: "utf8"}, function doneLoadFile(err, sData) {
obj.setData(err, sData, sFile, fTemplate);
});
};
/**
* setData(err, sData)
*
* Records the given HTML template and immediately parses it.
*
* @this {HTMLOut}
* @param {Error} err
* @param {string} sData
* @param {string} sFile
* @param {boolean} fTemplate
*/
HTMLOut.prototype.setData = function(err, sData, sFile, fTemplate)
{
if (err) {
HTMLOut.logError(err);
sData = "unable to read " + sFile;
fTemplate = false;
}
if (!fTemplate || !sData) {
this.done(null, sData);
return;
}
/*
* Copy the HTML template, and then start finding/replacing tokens.
*
* We cheat slightly and insert one of those tokens right now, because otherwise
* the template file itself would not render correctly in your web browser.
*/
this.sTemplate = sData.replace("/modules/shared/templates/common.css", "/versions/pcjs/<!-- pcjs:version -->/common.css");
this.sHTML = this.sTemplate;
/*
* But first, let's automatically massage any URLs in the template file.
*/
var link;
var reLinks = /(<a[^>]*?\shref=)(['"])([^'"]*)(\2[^>]*>)/gi;
while ((link = reLinks.exec(this.sTemplate))) {
var sReplacement = link[1] + link[2] + net.encodeURL(link[3], this.req, this.fDebug) + link[4];
this.sHTML = this.sHTML.replace(link[0], sReplacement);
}
var reTokens = /([ \t]*)<!--\s*([a-z]+):([a-z]+)(\(.*?\)|)\s*-->/gi;
this.findTokens(reTokens);
};
/**
* findTokens()
*
* @this {HTMLOut}
* @param {RegExp} reTokens
*/
HTMLOut.prototype.findTokens = function(reTokens)
{
while (true) {
var token = reTokens.exec(this.sTemplate);
if (!token) break;
var sIndent = token[1];
/*
* As per the warning in replaceTokens(), we must beware of token characters that have special meaning
* when parsed as a regular expression; for example, if there are any opening or closing parentheses in
* the token, each must be escaped.
*/
var sToken = token[0].substr(sIndent.length);
sToken = sToken.replace(/([\(\)\*])/g, "\\$1");
if (this.aTokens[sToken] === undefined) {
this.aTokens[sToken] = "";
if (HTMLOut.tokenFunctions[token[2]] !== undefined) {
var fnToken = HTMLOut.tokenFunctions[token[2]][token[3]];
if (fnToken !== undefined) {
this.aTokens[sToken] = null;
if (fnToken === null) {
this.aTokens[sToken] = undefined;
continue;
}
var aParms = [];
if (token[4]) {
var aMatch;
var reParms = /"(.*?)"/g;
while ((aMatch = reParms.exec(token[4]))) {
aParms.push(aMatch[1]);
}
}
fnToken.call(this, sToken, sIndent, aParms);
}
}
/*
* We could yield here after every newly discovered token, but our templates
* are pretty simple, so I doubt finding all of them will take significant time.
*
* var obj = this;
* setImmediate(function() { obj.findTokens(reTokens); });
* return;
*/
}
}
this.replaceTokens();
};
/**
* replaceTokens()
*
* @this {HTMLOut}
*/
HTMLOut.prototype.replaceTokens = function()
{
var fPending = false;
for (var sToken in this.aTokens) {
if (!this.aTokens.hasOwnProperty(sToken)) continue;
var sReplacement = this.aTokens[sToken];
/*
* Skip tokens that have already been replaced.
*/
if (sReplacement === undefined) {
continue;
}
/*
* Unknown (null) tokens are pending replacements, which occur when a template function is waiting
* for a callback; the callback is required to call replaceTokens() once the replacement is known,
* starting the replacement process over again (eg, see getDirList()).
*/
if (sReplacement === null) {
fPending = true;
continue;
}
// HTMLOut.logDebug('HTMLOut.replaceTokens: replacing "' + sToken + '" with "' + sReplacement + '"');
/*
* WARNING: Beware of tokens containing characters that have special meaning within regular
* expressions; otherwise, this global search-and-replace will fail in unexpected ways.
*/
this.sHTML = this.sHTML.replace(new RegExp(sToken, "g"), sReplacement);
/*
* Mark the token as replaced, by setting it to undefined (it's tempting to simply "delete" it,
* but that would modify the object we're iterating over, which would be bad form).
*/
this.aTokens[sToken] = undefined;
}
if (!fPending) {
/*
* Remove any lingering HTML/JavaScript comments and unnecessary scripts
*/
this.sHTML = this.sHTML.replace(/[ \t]*<!--[\s\S]*?-->[\r\n]*/g, "");
if (!this.fRandomize) {
this.sHTML = this.sHTML.replace(/[ \t]*<script id="randomize"[\s\S]*?<\/script>[\r\n]*/g, "");
}
if (this.sCacheFile) {
HTMLOut.logConsole('HTMLOut.writeFile("' + this.sCacheFile + '")');
var today = new Date();
this.sHTML = this.sHTML.replace(/(<body[^>]*>)(\s*)/, "$1$2<!-- " + sDefaultFile + " generated on " + today.toString() + " -->$2");
fs.writeFile(this.sCacheFile, this.sHTML, function doneWriteFileReplaceTokens(err) {
HTMLOut.logError(err);
});
}
this.done(null, this.sHTML);
}
};
/**
* getTitle(sToken, sIndent, aParms)
*
* aParms[0], if present, is used as the preferred title for the home page
*
* @this {HTMLOut}
* @param {string} sToken
* @param {string} [sIndent]
* @param {Array.<string>} [aParms]
*/
HTMLOut.prototype.getTitle = function(sToken, sIndent, aParms)
{
this.aTokens[sToken] = ((this.req.path == "/" && aParms[0])? aParms[0] : this.req.path);
};
/**
* getVersion(sToken, sIndent, aParms)
*
* Returns the current version in "package.json".
*
* @this {HTMLOut}
* @param {string} sToken
* @param {string} [sIndent]
* @param {Array.<string>} [aParms]
*/
HTMLOut.prototype.getVersion = function(sToken, sIndent, aParms)
{
/*
* Use the same test that processMachines() uses for setting fCompiled: if we're not using compiled code,
* then we should be using "current" CSS and template files (as opposed to version-specific template files).
*
* NOTE: I used to create a symlink in each app's "versions" directory (eg, /versions/pcjs/current ->
* ../../modules/shared/templates), so that when fDebug was true, I could simply insert "current" in
* place of a version number. However, that symlink didn't get added to the repository, and I'm not sure
* all operating systems would deal with it properly even if was added, so now I'm treating the "version"
* token as the equivalent of a symlink here.
*/
this.aTokens[sToken] = this.fDebug? "../../modules/shared/templates" : pkg.version;
};
/**
* getPath(sToken, sIndent, aParms)
*
* @this {HTMLOut}
* @param {string} sToken
* @param {string} [sIndent]
* @param {Array.<string>} [aParms]
*/
HTMLOut.prototype.getPath = function(sToken, sIndent, aParms)
{
this.aTokens[sToken] = this.req.path;
};
/**
* getPCPath(sToken, sIndent, aParms)
*
* @this {HTMLOut}
* @param {string} sToken
* @param {string} [sIndent]
* @param {Array.<string>} [aParms]
*/
HTMLOut.prototype.getPCPath = function(sToken, sIndent, aParms)
{
/*
* SIDEBAR: We must use a regular expression to replace all forward slashes with backslashes, because
* the string form of JavaScript's replace() method replaces only the FIRST occurrence of the search string.
*/
var s = this.req.path.replace(/\//g, "\\").toUpperCase();
/*
* Remove any trailing backslash from the final result.
*/
if (s.slice(-1) == '\\') s = s.slice(0, -1);
this.aTokens[sToken] = s;
};
/**
* getDirList(sToken, sIndent, aParms)
*
* Generate a list element for every subdirectory; each list element should look like:
*
* <li>
* <a href="/apps/">[apps]</a>
* </li>
*
* @this {HTMLOut}
* @param {string} sToken
* @param {string} [sIndent]
* @param {Array.<string>} [aParms]
*/
HTMLOut.prototype.getDirList = function(sToken, sIndent, aParms)
{
var obj = this;
fs.readdir(this.sDir, function doneReadDirList(err, asFiles) {
if (err) {
obj.aTokens[sToken] = HTMLOut.logError(err);
} else {
var sList = "";
/*
* We add an entry for the parent directory; when we call path.join() with obj.req.path,
* the ".." will be replaced by the actual path to the parent, and if there is no parent
* (ie, path.join() returns obj.req.path unmodified), we will discard the entry at that point.
*/
asFiles.push("..");
/*
* For sorting purposes, I want all folders ending in "kb" and beginning with one to three
* digits to sort as if they all began with FOUR digits (ie, with leading zeros as needed).
* But I don't want to change the folder names that are ultimately displayed. So instead,
* I pad those names with slashes, since a leading slash will sort much like a leading zero
* without being a valid filename character, meaning we can trim away those leading slashes
* with impunity after the sort is done.
*
* Why does this work? The ASCII value of '0' is 48, whereas the ASCII value of '/' is 47,
* so there are no intervening characters that could sort differently.
*/
var re = /^([0-9]+)(kb|mb)$/i;
for (var i = 0; i < asFiles.length; i++) {
var match = re.exec(asFiles[i]);
if (match) asFiles[i] = "///".substr(0, 4 - match[1].length) + asFiles[i];
}
asFiles.sort();
for (var iFile = 0; iFile < asFiles.length; iFile++) {
var sBaseName = asFiles[iFile].replace(/\//g, "");
/*
* The only exception we currently make to the "no filenames with leading periods" rule
* is the parent directory entry that we explicitly added above.
*/
var iExt = sBaseName.lastIndexOf('.');
if (sBaseName == "..") {
iExt = -1;
} else if (sBaseName.charAt(0) == '.') {
continue;
}
var sExt = (iExt > 0? sBaseName.substr(iExt+1) : "");
if (!obj.fDebug) {
if (sBaseName.indexOf("-debug") > 0) continue;
if (asExtsNonServed.indexOf(sExt) >= 0) continue;
if (asExtsNonListed.indexOf(sExt) >= 0) continue;
if (asFilesNonServed.indexOf(sBaseName) >= 0) continue;
if (asFilesNonListed.indexOf(sBaseName) >= 0) continue;
} else {
/*
* Even when the server's in Debug mode, there are some files it makes no sense to list.
*/
if (sBaseName == "index.html") continue;
}
/*
* If path.join() returns obj.req.path unmodified, we treat that as a sign we're at
* sServerRoot (ie, that sFile is ".." and there is no parent), so we discard the entry.
*
* IISNode hack: path.join() may return paths with backslashes, so convert back to slashes.
*
* Yes, encodeURL() would take care of that for us, but we must also perform some preliminary
* checks on sURL first, and having consistent slash-based paths make those checks simpler.
*/
var sURL = path.join(obj.req.path, sBaseName).replace(/\\/g, '/');
if (sURL.length == obj.req.path.length) continue;
/*
* Here's where we make the same assumption that filter() makes; ie, that any basename
* without a file extension (period) -- or a period followed by one or more digits -- should
* be considered a directory, and should therefore include a trailing slash, to minimize
* unnecessary redirects. Unless, of course, the path is already a lone slash (ie, the root).
*/
var fDir = false;
if (sURL == '/' || sBaseName == "..") {
fDir = true;
if (sURL != '/') sURL += '/';
} else if (asNonDirectories.indexOf(sBaseName) < 0 && (iExt < 0 || sBaseName.match(/\.[0-9]+[Ma-c]?$/))) {
fDir = true;
sURL += '/';
}
sURL = net.encodeURL(sURL, obj.req, obj.fDebug);
/*
* Here's where we add some code to massage disk image links: if this is a ".json" file in the
* /disks folders OR the basename contains "disk", then transform the link into one that will
* return an ".img" file when clicked (adapted from the code in browseFolder() in transform.php).
*
* We assume someone accessing/downloading such a file would rather have it in its original binary
* form rather than its JSON-ified form (which is all we typically check into the project).
*/
var sOnClick = "";
if (sExt == DumpAPI.FORMAT.JSON && (sURL.indexOf("/disks/") === 0 || sBaseName.indexOf("disk") >= 0)) {
sOnClick = obj.genOnClick(sURL);
}
/*
* The following code would similarly convert any links to ".img" files to a JSON stream, but I'm
* not sure we really need to support the reverse of the above.
*
* if (sExt == DumpAPI.FORMAT.IMG) {
* sOnClick = obj.genOnClick(sURL, DumpAPI.FORMAT.JSON);
* }
*/
sBaseName = '\\' + sBaseName.toUpperCase();
// if (fDir) sBaseName = sBaseName + '\\';
sList += sIndent + '\t<li><a href="' + sURL + '"' + sOnClick + '>' + sBaseName + '</a></li>\n';
}
if (sList) sList = '<ul class="common-list">\n' + sIndent + '\t' + sList.trim() + '\n' + sIndent + '</ul>';
obj.aTokens[sToken] = sList;
}
obj.replaceTokens();
});
};
/**
* getYear(sToken, sIndent, aParms)
*
* Return the current year.
*
* @this {HTMLOut}
* @param {string} sToken
* @param {string} [sIndent]
* @param {Array.<string>} [aParms]
*/
HTMLOut.prototype.getYear = function(sToken, sIndent, aParms)
{
var year = new Date().getFullYear();
if (year < 2015) year = 2015;
this.aTokens[sToken] = year.toString();
};
/**
* getBlog(sToken, sIndent, aParms)
*
* If we're in the "blog" folder, then enumerate all available blog entries and create a rendering of blog excerpts.
*
* @this {HTMLOut}
* @param {string} sToken
* @param {string} [sIndent]
* @param {Array.<string>} [aParms]
* @return {boolean} true if blog folder, false if not
*/
HTMLOut.prototype.getBlog = function(sToken, sIndent, aParms)
{
var obj = this;
if (this.sDir.match(/[\/\\]blog/)) {
var sPath = path.join(this.sDir, "**/README.md");
/*
* WARNING: On Azure, this.sDir will contain backslashes instead of slashes, which means
* you'd also expect the results from glob() to contain backslashes as well -- but they don't.
*
* For example, sPath on Azure is typically:
*
* D:\home\site\wwwroot\blog\**\README.md
*
* but the results from glob() typically look like:
*
* 'D:/home/site/wwwroot/blog/2014/01/README.md',
* 'D:/home/site/wwwroot/blog/2013/11/README.md'
*
* However, it would be VERY unwise to rely on that behavior. Let's continue to operate in a
* path-separator-agnostic mode, like passing any URL we form from these paths through encodeURL().
*/
glob(sPath, {nosort: true}, function doneGlobForBlog(err, asPaths) {
asPaths.sort(function(a, b) {return a < b? 1 : -1;});
/*
* Sorting the list of blog files now was all well and good, except that there's
* no guarantee the readFile() callbacks will return in the same order we issue them.
*
* To deal with that, we turn asPaths into aExcerpts: an array of objects (instead of
* strings) that can hold the excerpts. We'll plug the excerpts into aExcerpts as they
* come in, and then we'll assemble them all at the end.
*
* We also take this opportunity to cap the number of (most recent) excerpts.
*/
var i;
var cExcerpts = Math.min(asPaths.length, nBlogExcerpts);
var aExcerpts = new Array(cExcerpts);
var cExcerptsRemaining = aExcerpts.length;
for (i = 0; i < cExcerpts; i++) {
/*
* If any of the paths we received appear to be the same as obj.sDir (which we can
* infer simply based on path lengths, without worrying about slashes vs. backslashes),
* then we can presume that there's a README.md in the requested directory, meaning
* this is probably a "leaf" folder of the blog "tree", and so it's that README.md we
* should display, not these excerpts -- so set the excerpt count to zero and bail.
*/
if (path.dirname(asPaths[i]).length - obj.sDir.length <= 0) {
cExcerptsRemaining = 0;
break;
}
aExcerpts[i] = {path: asPaths[i], excerpt: ""};
}
if (cExcerptsRemaining) {
for (i = 0; i < aExcerpts.length; i++) {
(function(iPath) {
var sFile = aExcerpts[iPath].path;
fs.readFile(sFile, {encoding: "utf8"}, function doneReadFileForBlog(err, s) {
if (err) {
aExcerpts[iPath].excerpt = HTMLOut.logError(err);
} else {
s = s.replace(/\r\n/g, "\n");
var cch = s.indexOf("\n\n");
cch = s.indexOf("\n\n", cch+2);
if (cch >= 0) {
s = s.substr(0, cch+2);
/*
* I believe path.dirname() always removes any trailing slash, and since
* these are directories, we definitely want a trailing slash on the URL.
*/
var sURL = path.dirname(sFile.substr(obj.sDir.length)) + "/";
/*
* I would like to annotate the excerpt with date information, which we can
* derive from sFile, which should be in one of two forms:
*
* YYYY/MM
* or:
* YYYY/MM/DD
*
* We adhere to those forms because, when sorted, they produce a chronological listing.
*/
var asParts = sFile.match(/[\/\\](\d\d\d\d)[\/\\](\d\d)[\/\\]?(\d*)/);
if (asParts) {
var iYear = parseInt(asParts[1], 10);
var iMonth = parseInt(asParts[2], 10) - 1;
var iDay = asParts[3]? parseInt(asParts[3], 10) : 1;
var sDate = usr.formatDate(asParts[3]? "F j, Y" : "F Y", new Date(iYear, iMonth, iDay));
s = s.replace(/^([^\n]*\n[^\n]*\n)/, '$1<p style="font-size:x-small;margin-top:-12px">' + sDate + '</p>\n\n');
}
aExcerpts[iPath].excerpt = s + "[Read more](" + sURL + ")...";
} else {
aExcerpts[iPath].excerpt = "Can't parse " + sFile;
}
}
if (!--cExcerptsRemaining) {
var sExcerpts = "";
for (var i = 0; i < aExcerpts.length; i++) {
sExcerpts += aExcerpts[i].excerpt + "\n\n";
}
var mExcerpts = new MarkOut(sExcerpts, sIndent, obj.req, aParms, obj.fDebug);
obj.aTokens[sToken] = mExcerpts.convertMD(" ").trim();
obj.replaceTokens();
}
});
})(i);
}
} else {
obj.getManifestXML(sToken, sIndent, aParms);
}
});
return true;
}
return false;
};
/**
* getDefault(sToken, sIndent, aParms)
*
* Process whatever default document(s) are appropriate for the folder being requested.
*
* getBlog() gets first crack; if we're in a blog folder, it will display the appropriate blog entries.
* If getBlog() declines the request, we move on to getManifestXML(), because we have some folders where
* there's BOTH a manifest and a README, such as /apps/pc/1981/visicalc, and we want the manifest to take
* priority. getManifestXML() will, in turn, pass the request on to getReadMe(), which will, in turn,
* pass the request on to getMachineXML().
*
* If getMachineXML() declines as well, then getRandomString() is called, which is kinda useless, but better
* than nothing (well, maybe).
*
* Some wrinkles have been added to the above: getManifestXML() can alternatively call getMachineXML()
* with a specific machine XML file, which would have had the potential to bypass getReadMe() altogether, so
* getMachineXML() may now call getReadMe() -- which must NOT call getMachineXML() back whenever that happens.
*
* @this {HTMLOut}
* @param {string} sToken
* @param {string} [sIndent]
* @param {Array.<string>} [aParms]
*/
HTMLOut.prototype.getDefault = function(sToken, sIndent, aParms)
{
if (this.getBlog(sToken, sIndent, aParms)) {
return;
}
this.getManifestXML(sToken, sIndent, aParms);
};
/**
* getHTMLFile(sToken, sIndent, aParms)
*
* If the HTML file specified by aParms[0] exists, insert its contents into the current HTML document.
*
* @this {HTMLOut}
* @param {string} sToken
* @param {string} [sIndent]
* @param {Array.<string>} [aParms]
*/
HTMLOut.prototype.getHTMLFile = function(sToken, sIndent, aParms)
{
/*
* If we're debugging, we don't want any HTML fragments embedded (at least not the Google Analytics or
* AdSense fragments).
*
* TODO: Consider a cleaner way for a tokenFunction to bypass token replacement (such as returning
* false); findTokens() sets the current token replacement value to null, to indicate a pending replacement,
* so currently our only bypass option is to set the token replacement value to an empty string, otherwise
* replaceTokens() won't think we're done.
*/
if (fServerDebug || net.hasParm(net.GORT_COMMAND, null, this.req)) {
this.aTokens[sToken] = "";
return;
}
var obj = this;
var sFile = path.join(sServerRoot, path.dirname(sTemplateFile), aParms[0]);
HTMLOut.logConsole('HTMLOut.getHTMLFile("' + sFile + '")');
fs.readFile(sFile, {encoding: "utf8"}, function doneReadHTMLFile(err, s) {
if (err) {
HTMLOut.logError(err);
s = "";
}
obj.aTokens[sToken] = s.trim();
obj.replaceTokens();
});
};
/**
* getMachineXML(sToken, sIndent, aParms, sXMLFile, sStateFile)
*
* If "machine.xml" exists in the current directory, open it and determine if embedding it makes sense.
*
* @this {HTMLOut}
* @param {string} sToken
* @param {string} [sIndent]
* @param {Array.<string>|null} [aParms]
* @param {string|null} [sXMLFile]
* @param {string|null} [sStateFile]
*/
HTMLOut.prototype.getMachineXML = function(sToken, sIndent, aParms, sXMLFile, sStateFile)
{
var obj = this;
var fFromManifest = !!sXMLFile;
var sFile = sXMLFile? path.join(sServerRoot, sXMLFile) : path.join(this.sDir, sXMLFile = sMachineXMLFile);
HTMLOut.logConsole('HTMLOut.getMachineXML("' + sFile + '")');
fs.readFile(sFile, {encoding: "utf8"}, function doneReadMachineXMLFile(err, sXML) {
var s;
if (!err) {
/*
* I've made this test stricter, to ensure we're only embedding machine XML files, because trying to
* embed other kinds of XML files (eg, those using an "outline.xsl", such as the C1P "server array" demo)
* will fail.
*/
var aMatch = sXML.match(/<\?xml-stylesheet.*?href="(.*?machine\.xsl)"\?>/);
if (aMatch) {
var sStyleSheet = aMatch[1];
/*
* Recognized machine stylesheets are either "production" stylesheets in ("/versions/pcjs"|"/versions/c1pjs")
* or "development" stylesheets in ("/modules/pcjs/templates"|"/modules/c1pjs/templates").
*
* The common denominator in both sets is either "/pc" or "/c1p", which in turn indicates the class of machine
* (ie, "PC" or "C1P").
*/
var sMachineClass = (sStyleSheet.indexOf("/pc") >= 0? "PC" : (sStyleSheet.indexOf("/c1p") >= 0? "C1P" : null));
if (sMachineClass) {
/*
* Since the MarkOut module already contains the ability to embed a machine definition with
* one simple line of Markdown-like magic, we'll create such a line and let MarkOut do the rest.
*
* The string we initialize the MarkOut object should look like one of
*
* '[Embedded PC](machine.xml "PCjs:machineID:stylesheet:version:options:state")'
* '[Embedded C1P](machine.xml "C1Pjs:machineID:stylesheet:version:options:state")'
*
* where machineID is the machine "id" embedded in the XML, stylesheet is the path to the XML stylesheet,
* version is a version number ('*' or blank for the latest version, which is all we support here), and
* options is a comma-delimited series of, well, options; the only option we currently output is "debugger"
* if a <debugger> element is present in the machine XML.
*/
var sMachineID = "machine" + sMachineClass; // fallback to either "machinePC" or "machineC1P" if no ID found
aMatch = sXML.match(/<machine.*?\sid=(['"])(.*?)\1[^>]*>/);
if (aMatch) sMachineID = aMatch[2];
/*
* WARNING: Machine XML files use machine XSL stylesheets, which are designed to transform a
* machine definition into a complete self-contained HTML document, which is inappropriate for
* embedding inside an existing HTML document, so any "machine.xsl" stylesheet must be remapped
* to a corresponding "components.xsl" stylesheet (which is what the next line does).
*/
var sMachineDef = sMachineClass + "js:" + sMachineID + ":" + sStyleSheet.replace("machine.xsl", "components.xsl");
sMachineDef += (sXML.indexOf("<debugger") > 0? ":*:debugger" : ":*:none");
sMachineDef += (sStateFile? ":" + sStateFile : "");
s = '[Embedded ' + sMachineClass + '](' + sXMLFile + ' "' + sMachineDef + '")';
var m = new MarkOut(s, sIndent, obj.req, null, obj.fDebug);
s = m.convertMD(" ").trim();
obj.processMachines(m.getMachines(), function doneProcessXMLMachines() {
obj.getReadMe(sToken, sIndent, aParms, s);
});
return;
}
}
}
/*
* If we're still here, one of the following happened:
*
* 1) there was no "machine.xml"; see err for details
* 2) there was no stylesheet specified in "machine.xml"
* 3) the specified stylesheet in "machine.xml" was not recognized
*
* But, instead of displaying a cryptic error message inside our beautiful HTML template, eg:
*
* htmlout error: ENOENT, open '/Users/Jeff/Sites/pcjs/devices/pc/machine/5160/cga/256kb/win101/debugger/machine.xml'
*
* we have one more fallback: a random string! Less useful, but more entertaining. Well, maybe not even that.
*
* s = HTMLOut.logError(err);
*/
/*
* If we were called from getManifestXML(), then let's fallback to getReadMe() instead.
*/
s = obj.getRandomString(sIndent);
if (fFromManifest) {
obj.getReadMe(sToken, sIndent, aParms, s);
return;
}
obj.aTokens[sToken] = s;
obj.replaceTokens();
});
};
/**
* getManifestXML(sToken, sIndent, aParms)
*
* If "manifest.xml" exists in the current directory, open it and embed it.
*
* @this {HTMLOut}
* @param {string} sToken
* @param {string} [sIndent]
* @param {Array.<string>} [aParms]
*/
HTMLOut.prototype.getManifestXML = function(sToken, sIndent, aParms)
{
var obj = this;
var sXMLFile = path.join(this.sDir, sManifestXMLFile);
HTMLOut.logConsole('HTMLOut.getManifestXML("' + sXMLFile + '")');
fs.readFile(sXMLFile, {encoding: "utf8"}, function doneReadManifestXMLFile(err, sXML) {
var s;
if (!err) {
var match = sXML.match(/<\?xml-stylesheet.*?href="(.*?manifest\.xsl)"\?>\s*<manifest[^>]* type="([^"]*)"/);
if (match) {
var sListItems = "";
var sHeading = "Manifest";
var sStyleSheet = match[1];
var sManifestType = match[2];
/*
* Manifests contain a variety of metadata describing software or documentation, which we display
* in a "common-list-data" list. Those data items are already listed in "manifest.xsl", so to minimize
* redundancy, I read the XSL file and enumerate the items to, uh, be enumerated.
*/
var sXSLFile = path.join(sServerRoot, sStyleSheet);
fs.readFile(sXSLFile, {encoding: "utf8"}, function doneReadManifestXSLFile(err, sXSL) {
if (!err) {
var reTemplate = new RegExp("<xsl:template match=\"/manifest\\[@type\\s*=\\s*'" + sManifestType + "'[^>]*>([\\s\\S]*?)</xsl:template>");
var matchXSL = sXSL.match(reTemplate);
var sXSLTemplate = (matchXSL? matchXSL[1] : "");
var fCreationDate = false;
var matchItem, matchParams;
var sName = null, sVersion = null;
var reItems = /<xsl:call-template name="listItem">([\s\S]*?)<\/xsl:call-template>/g;
var reParams = /<xsl:with-param name="([^"]*)"\s+select="'?([^"']*)'?"[^>]*\/>/g;
while ((matchItem = reItems.exec(sXSLTemplate))) {
var sLabel = null, sNode = null, sDefault = null;
while ((matchParams = reParams.exec(matchItem[0]))) {
switch(matchParams[1]) {
case "label":
sLabel = matchParams[2];
break;
case "node":
sNode = matchParams[2];
if (!sLabel && sNode == "releaseDate") sLabel = (fCreationDate? "Updated" : "Released");
break;
case "default":
sDefault = matchParams[2];
break;
default:
break;
}
}
if (sLabel) {
var matchNode;
var fMatch = false;
var reNodes = new RegExp('<' + sNode + '([^>]*)>([\\s\\S]*?)</' + sNode + '>', "g");
while ((matchNode = reNodes.exec(sXML))) {
var sNodeDesc = "", sNodeValue = matchNode[2];
match = sNodeValue.match("<desc[^>]*>(.*?)</desc>");
if (match) {
sNodeDesc = match[1];
} else {
match = sNodeValue.match("<org[^>]*>(.*?)</org>");
if (match) sNodeDesc = match[1];
}
match = sNodeValue.match("<name[^>]*>(.*?)</name>");
if (match) {
sNodeValue = match[1];
} else if (!sNodeValue || sNodeValue.indexOf('<') >= 0) {
if (!sDefault && sNode == "disk") {
sDefault = (sName? sName + (sVersion? ' ' + sVersion : '') : '');
}
sNodeValue = sDefault;
}
if (!sNodeValue) continue;
if (sNode == "name") sName = sNodeValue;
if (sNode == "version") sVersion = sNodeValue;
if (sNode == "creationDate") fCreationDate = true;
var sNodeLink = "", sOnClick = "";
if (matchNode[1] && (match = matchNode[1].match(/ href=(['"])(.*?)\1/))) {
sNodeLink = match[2];
}
var matchCover = null;
match = matchNode[2].match('<cover[^>]*href="([^"]*)"');
if (match && match[1].indexOf("static/") >= 0) {
matchCover = match[1];
if (obj.fDebug) {
sNodeLink = matchCover.replace("/thumbs/", '/').replace(/ ?[0-9]*\.(jpeg|jpg)/, ".pdf");
}
}
if (sNodeLink) {
if (str.endsWith(sNodeLink, ".json") && sNodeLink.indexOf("/disks/") === 0) {
sOnClick = obj.genOnClick(sNodeLink);
}
sNodeValue = '<a href="' + net.encodeURL(sNodeLink, obj.req, obj.fDebug) + '"' + sOnClick + '>' + sNodeValue + '</a>';
}
var sItemPages = "";
var rePages = /<page([^>]*)>([^<]*)<\/page>/g;
while ((match = rePages.exec(matchNode[2]))) {
var sPageName = match[2];
match = match[1].match(/ href="([^"]*)"/);
var sPageLink = (match? match[1] : null);
if (sPageLink) {
if (sPageLink.charAt(0) == '#') {
match = sPageLink.match(/page=([0-9]+)/);
if (!match || !matchCover) {
sPageLink = sNodeLink + sPageLink;
} else {
sPageLink = matchCover.replace("/thumbs/", '/pages/').replace(/( ?)[0-9]*\.(jpeg|jpg)/, "$1" + match[1] + ".pdf");
}
}
sPageName = '<a href="' + net.encodeURL(sPageLink, obj.req, obj.fDebug) + '" target="_blank">' + sPageName + '</a>';
}
sItemPages += sIndent + '\t\t\t<li>' + sPageName + '</li>\n';
}
if (!fMatch) {
sListItems += sIndent + '\t<li>' + sLabel + '\n';
sListItems += sIndent + '\t\t<ul class="common-list-data-items">\n';
fMatch = true;
}
sListItems += sIndent + '\t\t\t<li' + (sNodeDesc? ' title="' + sNodeDesc + '"' : '') + '>' + sNodeValue;
if (sItemPages) {
sListItems += '\n' + sIndent + '\t\t<ul class="common-list-data-subitems">\n' + sItemPages + sIndent + '\t\t</ul>';
}
sListItems += '\n' + sIndent + '\t\t\t</li>\n';
}
if (fMatch) {
sListItems += sIndent + '\t\t</ul>\n';
sListItems += sIndent + '\t</li>\n';
}
}
}
sListItems = '<h4><a href="' + sManifestXMLFile + '">' + sHeading + '</a></h4>\n' + sIndent + '<ul class="common-list-data">\n' + sListItems + sIndent + '</ul>\n';
obj.aTokens["<!-- pcjs:manifest -->"] = sListItems;
var sXMLFile = null, sStateFile = null;
var matchMachine = sXML.match(/<machine(.*?)\/>/);
if (matchMachine) {
if ((match = matchMachine[1].match(/ href=(['"])(.*?)\1/))) {
sXMLFile = match[2];
}
if ((match = matchMachine[1].match(/ state=(['"])(.*?)\1/))) {
sStateFile = match[2];
}
}
if (sXMLFile) {
obj.getMachineXML(sToken, sIndent, null, sXMLFile, sStateFile);
return;
}
}
/*
* If we're still here, then there was either a problem reading the manifest XSL file,
* or the manifest XML file didn't contain a machine reference. For now, we fall back to
* getReadMe().
*/
obj.getReadMe(sToken, sIndent, aParms);
});
return;
}
}
/*
* If we're still here, then there was either a problem reading the manifest XML file, or it didn't
* contain a recognized stylesheet. For now, we fall back to getReadMe().
*/
obj.getReadMe(sToken, sIndent, aParms);
});
};
/**
* getReadMe(sToken, sIndent, aParms, sPrevious)
*
* If a "README.md" exists in the current directory, open it, convert it, and prepare for replacement.
*
* @this {HTMLOut}
* @param {string} sToken
* @param {string} [sIndent]
* @param {Array.<string>} [aParms]
* @param {string|null} [sPrevious] is text, if any, that should precede the README.md
*/
HTMLOut.prototype.getReadMe = function(sToken, sIndent, aParms, sPrevious)
{
var obj = this;
var sFile = path.join(this.sDir, sReadMeFile);
HTMLOut.logConsole('HTMLOut.getReadMe("' + sFile + '")');
fs.readFile(sFile, {encoding: "utf8"}, function doneReadMeFile(err, s) {
if (err) {
/*
* Instead of displaying a cryptic error message inside our beautiful HTML template, eg:
*
* htmlout error: ENOENT, open '/Users/Jeff/Sites/pcjs/devices/pc/machine/5160/cga/256kb/win101/debugger/README.md'
*
* which is all this will give us:
*
* s = HTMLOut.logError(err);
*
* we now try some fallbacks, like checking for a "machine.xml" -- but only if sPrevious is not defined.
*/
if (sPrevious !== undefined) { // this means we were called from getMachineXML(), so it's the end of road
obj.aTokens[sToken] = sPrevious;
obj.replaceTokens();
} else {
obj.getMachineXML(sToken, sIndent); // we don't pass along aParms, because those are for Markdown files only
}
} else {
var m = new MarkOut(s, sIndent, obj.req, aParms, obj.fDebug);
s = m.convertMD(" ").trim();
/*
* If the Markdown document begins with a heading, stuff that into the <title> tag;
* it would be cleaner if this replacement could be performed by getTitle(), but unfortunately,
* getTitle() is called long before any README.md is opened.
*/
var match = s.match(/^\s*<h([0-9])[^>]*>(.*?)<\/h\1>/);
if (match) {
var sTitle = match[2];
match = sTitle.match(/<a [^>]*>([^<]*)<\/a>/);
if (match) sTitle = match[1];
obj.sHTML = obj.sHTML.replace(/(<title[^>]*>)([^\|]*)\|[^<]*(<\/title>)/, "$1$2| " + sTitle + "$3");
}
/*
* We need to query the MarkOut object for any machine definitions that the current "readme"
* document contained and give them to processMachines(), so that any associated scripts can
* be added to the current page.
*
* However, processMachines() may need to search the file system for the appropriate scripts,
* and since that may not finish immediately, we defer updating the "readme" token until the
* processMachines() callback has been called. This insures that the HTML page will not be
* delivered until all associated scripts for all machine definitions have been added.
*
* Note that if we ever decide to support more than one Markdown document (or "readme" token)
* per HTML page, it may be better to collect all the machine definitions in an array, eliminate
* any duplicates from that array, and then call processMachines() at some later point, after
* all tokens have been replaced.
*/
obj.processMachines(m.getMachines(), function doneProcessReadMeMachines() {
obj.aTokens[sToken] = sPrevious? (sPrevious + sIndent + s) : s;
obj.replaceTokens();
});
}
});
};
/**
* getSocketScripts(sToken, sIndent, aParms)
*
* @this {HTMLOut}
* @param {string} sToken
* @param {string} [sIndent]
* @param {Array.<string>} [aParms]
*/
HTMLOut.prototype.getSocketScripts = function(sToken, sIndent, aParms)
{
this.aTokens[sToken] = (fSockets? '<script type="text/javascript" src="/socket.io/socket.io.js"></script>\n' + sIndent + '<script type="text/javascript" src="/modules/shared/lib/sockets.js"></script>' : "");
};
/**
* getRandomString(sIndent)
*
* Generate a random string of words, purely for entertainment purposes (eg, something in honor of "ADVENT").
*
* @this {HTMLOut}
* @param {string} [sIndent]
* @return {string}
*/
HTMLOut.prototype.getRandomString = function(sIndent)
{
var s = "";
var asNouns = ["maze", "passages"];
var asAdjectives = ["little", "twisty|twisting"];
while (asNouns.length) {
var cAdjectives = Math.floor(Math.random() * Math.min(2, asAdjectives.length));
while (cAdjectives--) {
var iAdjective = Math.floor(Math.random() * asAdjectives.length);
var sAdjective = asAdjectives[iAdjective];
var asVariations = sAdjective.split("|");
sAdjective = asVariations[Math.floor(Math.random() * asVariations.length)];
if (s) s += " ";
s += sAdjective;
asAdjectives.splice(iAdjective, 1);
}
if (s) s += " ";
s += asNouns[0];
asNouns.splice(0, 1);
if (asNouns.length) s += " of";
}
s = sIndent + '<p id="random">You are in a ' + s + ', all ' + (Math.floor(Math.random() * 2)? 'alike' : 'different') + '.</p>\n';
this.fRandomize = true;
return s;
};
/**
* processMachines(aMachines, done)
*
* At a minimum, each machine object should contain the following properties:
*
* 'class' (eg, a machine class, such as "pc" or "c1p")
* 'version' (eg, "1.10", "*" to select the current version, or "uncompiled"; "*" is the default)
* 'debugger' (eg, true or false; false is the default)
*
* @this {HTMLOut}
* @param {Array} aMachines is an array of objects containing information about each machine on the current page
* @param {function()} done
*/
HTMLOut.prototype.processMachines = function(aMachines, done)
{
for (var iMachine = 0; iMachine < aMachines.length; iMachine++) {
var infoMachine = aMachines[iMachine];
HTMLOut.logDebug('HTMLOut.processMachines(' + JSON.stringify(infoMachine) + ')');
var sClass = infoMachine['class']; // aka the machine class
var fCompiled = !this.fDebug;
var sVersion = infoMachine['version'];
if (sVersion === undefined || sVersion == '*') {
sVersion = pkg.version;
} else {
fCompiled = (sVersion != "uncompiled");
}
var fDebugger = infoMachine['debugger'];
if (fDebugger === undefined) fDebugger = false; // default to no debugger
var fNoDebug = !this.fDebug;
if (net.hasParm(net.GORT_COMMAND, net.GORT_NODEBUG, this.req)) {
fNoDebug = true;
fCompiled = false;
}
var sScriptEmbed = "";
if (infoMachine['func']) {
sScriptEmbed = '<script type="text/javascript">' + 'window.' + infoMachine['func'] + '("' + infoMachine['id'] + '","' + infoMachine['xml'] + '"' + (infoMachine['xsl']? (',"' + infoMachine['xsl'] + '"') : ',""') + (infoMachine['state']? (',"' + infoMachine['state'] + '"') : '') + ');</script>';
}
var asFiles = [];
if (fCompiled) {
var sScriptFolder = sClass + "js"; // aka the app class
var sScriptFile = sClass + (fDebugger? "-dbg" : "") + ".js";
asFiles.push("/versions/" + sScriptFolder + "/" + sVersion + "/components.css");
asFiles.push("/versions/" + sScriptFolder + "/" + sVersion + "/" + sScriptFile);
this.addFilesToHTML(asFiles, sScriptEmbed);
}
else {
/*
* SIDEBAR: Why the "slice()"? It's a handy way to create a copy of the array, and we need a copy,
* because if it turns out we need to "cut out" some of the files below (using splice), we don't want that
* affecting the original array.
*/
if ((asFiles = aMachineFiles[sClass].slice())) {
var i;
if (fNoDebug) {
/*
* We need to find the shared "defines.js" source file, and follow it with "nodebug.js".
*/
for (i = 0; i < asFiles.length; i++) {
if (asFiles[i].indexOf("shared/lib/defines.js") >= 0) {
asFiles.splice(i + 1, 0, asFiles[i].replace("defines.js", "nodebug.js"));
break;
}
}
}
if (!fDebugger) {
/*
* Step 1: We need to find the client's "defines.js" source file, and follow it with "nodebugger.js".
*/
for (i = 0; i < asFiles.length; i++) {
if (asFiles[i].indexOf("js/lib/defines.js") >= 0) {
asFiles.splice(i + 1, 0, asFiles[i].replace("defines.js", "nodebugger.js"));
break;
}
}
/*
* Step 2: If there's a "debugger.js" source file in the list of uncompiled files, we need to remove it,
* which we do by using the Array splice() method, removing the 1 matching element from the array.
*/
for (i = 0; i < asFiles.length; i++) {
if (asFiles[i].indexOf("/debugger.js") >= 0) {
asFiles.splice(i, 1);
break;
}
}
}
this.addFilesToHTML(asFiles, sScriptEmbed);
}
}
}
if (done) done();
};
/**
* addFilesToHTML(asFiles)
*
* @this {HTMLOut}
* @param {Array.<string>} asFiles is a list of CSS and/or JS files to include in the HTML
* @param {string} [sScriptEmbed] is an optional script to embed in the <body> (after any JS files listed above)
*/
HTMLOut.prototype.addFilesToHTML = function(asFiles, sScriptEmbed)
{
for (var sTag in aMachineFileTypes) {
var aMatch = this.sHTML.match(new RegExp("<" + sTag + ">\n?([ \t]*)([\\s\\S]*?)[\n \t]*</" + sTag + ">", "i"));
if (aMatch) {
var sTextInsert = "";
var sIndent = aMatch[1];
var sText = aMatch[2];
for (var iExt = 0; iExt < aMachineFileTypes[sTag].length; iExt++) {
var sExt = aMachineFileTypes[sTag][iExt];
for (var i = 0; i < asFiles.length; i++) {
var sFile = asFiles[i];
/*
* If the filenames coming from "package.json" begin with "./", strip the leading period.
*/
if (sFile.substr(0, 2) == "./") sFile = sFile.substr(1);
/*
* SIDEBAR: substr(-4) is another way to extract the last 4 characters of a string,
* but it's non-standard (eg, early versions of IE didn't support it), so if you want to extract
* from the end of a string, using slice() with negative indexes is the safer way to go.
*/
var sInsert;
if (sFile.slice(-sExt.length) == sExt) {
if (sExt == ".css") {
sInsert = '\n' + sIndent + '<link rel="stylesheet" type="text/css" href="' + sFile + '">';
if (sText.indexOf(sInsert) < 0) {
sTextInsert += sInsert;
}
}
else if (sExt == ".js") {
sInsert = '\n' + sIndent + '<script type="text/javascript" src="' + sFile + '"></script>';
if (sText.indexOf(sInsert) < 0) {
sTextInsert += sInsert;
}
}
}
}
}
if (sScriptEmbed && sTag == "body") {
sTextInsert += '\n' + sIndent + sScriptEmbed;
}
if (sTextInsert) {
this.sHTML = this.sHTML.replace(sText, sText + sTextInsert);
}
}
else {
HTMLOut.logError(new Error("missing <" + sTag + "> in HTML template"));
}
}
};
/**
* genOnClick(sURL)
*
* @this {HTMLOut}
* @param {string} sURL
* @param {string} [sFormat] (default is DumpAPI.FORMAT.IMG)
* @return {string}
*/
HTMLOut.prototype.genOnClick = function(sURL, sFormat)
{
return " onclick=\"window.location='" + DumpAPI.ENDPOINT + "?" + DumpAPI.QUERY.DISK + "=" + sURL.replace('?', '&') + "&" + DumpAPI.QUERY.FORMAT + "=" + (sFormat || DumpAPI.FORMAT.IMG) + "'; return false;\"";
};
/*
* Class constants/globals
*/
HTMLOut.tokenFunctions = {
'pcjs': {
'title': HTMLOut.prototype.getTitle,
'version': HTMLOut.prototype.getVersion,
'path': HTMLOut.prototype.getPath,
'pcpath': HTMLOut.prototype.getPCPath,
'dirlist': HTMLOut.prototype.getDirList,
'manifest': null,
'year': HTMLOut.prototype.getYear,
'default': HTMLOut.prototype.getDefault,
'htmlfile': HTMLOut.prototype.getHTMLFile,
'sockets': HTMLOut.prototype.getSocketScripts
}
};
module.exports = HTMLOut;
/**
* @fileoverview Handles API requests and redirects
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
* @version 1.0
* Created 2014-02-14
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
* and <http://pcjs.org/>.
*
* JSMachines is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with JSMachines.
* If not, see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some JSMachines files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* JSMachines Project for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
var fs = require("fs");
var path = require("path");
/**
* @class exports
* @property {function(string)} sync
*/
var mkdirp = require("mkdirp");
var DiskAPI = require("../../shared/lib/diskapi");
var DumpAPI = require("../../shared/lib/dumpapi");
var UserAPI = require("../../shared/lib/userapi");
var ReportAPI = require("../../shared/lib/reportapi");
var net = require("../../shared/lib/netlib");
var str = require("../../shared/lib/strlib");
var usr = require("../../shared/lib/usrlib");
var DiskDump = require("../../diskdump");
var FileDump = require("../../filedump");
/**
* @type {HTMLOut}
*/
var HTMLOut;
/**
* sServerRoot is the root directory of the web server; it can (and should) be overridden using by the Express
* web server using setRoot().
*
* @type {string}
*/
var sServerRoot = "";
/*
* logFile is set by HTMLOut, allowing us to "mingle" our output with the server's log (typically "./logs/node.log").
*/
var logFile = null;
/*
* Entries in this table are matched first, as-is, to req.path (no string or RegExp compare involved);
* we do, however, strip any trailing slash from the incoming path before doing the lookup, so none of
* the entries on the left-hand side should contain trailing slashes.
*
* FYI, here's what the jsmachines.net .htaccess contained before we retired its Apache webserver:
*
* Redirect permanent /c1p /docs/c1pjs/
* Redirect permanent /c1pjs /docs/c1pjs/
* Redirect permanent /pc /docs/pcjs/
* Redirect permanent /pcjs /docs/pcjs/
* Redirect permanent /configs/c1p/embed/ /docs/c1pjs/embed/
* # Redirect permanent /configs/c1p/machines/ /docs/c1pjs/
* Redirect permanent /configs/pc/machines/5160/cga/win101/xt-cga-win101.xml /configs/pc/machines/5160/cga/256kb/win101/
* Redirect permanent /devices/c1p/array.xml /configs/c1p/machines/array/
* Redirect permanent /devices/pc/5160/cga/machine-dos400m.xml /configs/pc/machines/5160/cga/640kb/dos400m/
* Redirect permanent /demos/c1p/embed.html /docs/c1pjs/embed/
* Redirect permanent /demos/pc/cga-win101/xt-cga-win101.xml /configs/pc/machines/5160/cga/256kb/win101/
* Redirect permanent /videos/pcjs/ /disks/pc/dos/microsoft/4.0M/
* RedirectMatch permanent /demos/pc/.* /configs/pc/machines/
*/
var aExternalRedirects = {
"/c1p": "/docs/c1pjs/",
"/c1pjs": "/docs/c1pjs/",
"/pc": "/docs/about/pcjs/",
"/pcjs": "/docs/about/pcjs/",
"/configs/c1p/embed": "/docs/c1pjs/embed/",
"/configs/c1p/machines/array": "/devices/c1p/machine/8kb/array/",
"/configs/c1p/machines/array.xml": "/devices/c1p/machine/8kb/array/",
"/configs/c1p/machines/machine.xml": "/devices/c1p/machine/8kb/large/",
"/configs/pc/disks": "/disks/pc/",
"/configs/pc/machines/5150/mda/demo/pc-mda-64k.xml": "/devices/pc/machine/5150/mda/64kb/",
"/configs/pc/machines/5150/cga/donkey/pc-cga-64k.xml": "/devices/pc/machine/5150/cga/64kb/donkey/",
"/configs/pc/machines/5150/cga/donkey/pc-dbg-64k.xml": "/devices/pc/machine/5150/cga/64kb/donkey/debugger/",
"/configs/pc/machines/5160/cga/demo": "/devices/pc/machine/5160/cga/256kb/demo/",
"/configs/pc/machines/5160/cga/demo/xt-cga-256k.xml": "/devices/pc/machine/5160/cga/256kb/demo/",
"/configs/pc/machines/5160/cga/demo/xt-dbg-256k.xml": "/devices/pc/machine/5160/cga/256kb/demo/debugger/",
"/configs/pc/machines/5160/cga/win101/xt-cga-win101.xml": "/devices/pc/machine/5160/cga/256kb/win101/",
"/configs/pc/machines/5160/cga/machine-512k-win101.xml": "/devices/pc/machine/5160/cga/512kb/win101/softkbd/",
"/demos/c1p/embed.html": "/docs/c1pjs/embed/",
"/demos/c1p/embed.xml": "/devices/c1p/machine/8kb/embed/machine.xml",
"/demos/pc/cga": "/devices/pc/machine/5150/cga/",
"/demos/pc/donkey/pc-cga-64k.xml": "/devices/pc/machine/5150/cga/64kb/donkey/",
"/demos/pc/cga-win101": "/devices/pc/machine/5160/cga/256kb/win101/",
"/demos/pc/cga-win101/xt-cga-win101.xml": "/devices/pc/machine/5160/cga/256kb/win101/",
"/devices/c1p/array.xml": "/devices/c1p/machine/8kb/array/",
"/devices/pc/5160/cga/machine-dos400m.xml": "/devices/pc/machine/5160/cga/640kb/dos400m/",
"/videos/pcjs": "/devices/pc/machine/5160/cga/640kb/dos400m/"
};
var aExternalRedirectPatterns = {
"^/configs/c1p/machines/?(.*)": "/devices/c1p/machine/$1",
"^/configs/pc/machines/?(.*)": "/devices/pc/machine/$1"
};
/*
* Entries in this table are matched next, using a RegExp comparison; comparisons start with the first entry
* and continue until a match is found, at which point the replacement is performed and comparisons stop;
* we could make the replacement process "additive", by continuing comparisons/replacements until the
* end is reached, but let's not, unless there's an actual need.
*
* Feel free to use subgroups on the left-hand side, and references to them (eg, $1, $2, etc) on the right.
*/
var aInternalRedirectPatterns = {
// "^/apps/pc/visicalc/": "/apps/pc/1981/visicalc/",
// "^/demos/pc/.*": "/devices/pc/machine/"
};
/**
* HTTPAPI()
*
* @param {HTMLOut} out
* @param {string} sRoot
*/
function HTTPAPI(out, sRoot) {
HTMLOut = out;
sServerRoot = sRoot;
}
/**
* setLogFile(file)
*
* @param {Object} file
*/
HTTPAPI.setLogFile = function(file) {
logFile = file;
DiskDump.setLogFile(file);
};
/**
* @class Volume
* @property {number|null} fd file descriptor
* @property {string} mode access mode (one of DiskAPI.MODE.*)
* @property {string} path path of the volume file
* @property {string} machine machine ID associated with the volume file
*/
/**
* User IDs are added to userVolumes as users open volumes; for now, only one open
* volume per user is supported. Every entry in userVolumes is another object (Volume).
*
* @type {Object.<Volume>}
*/
var userVolumes = {};
/**
* redirect(req, res, next) is called by filter() to give us a crack at the URL
*
* @param {Object} req is an Express request object (http://expressjs.com/api.html#req.params)
* @param {Object} res is an Express response object (http://expressjs.com/api.html#res.status)
* @param {function()} next is the function to call to finish processing this request (unless WE finish it)
* @return {boolean} true if the request was permanently redirected, false if not
*/
HTTPAPI.redirect = function(req, res, next)
{
var re;
var sPath = req.path;
if (sPath.slice(-1) == '/') sPath = sPath.slice(0, -1);
if (sPath.indexOf("%2520") >= 0) {
sPath = sPath.replace(/%2520/g, "%20");
res.redirect(301, sPath);
return true;
}
if (aExternalRedirects[sPath] !== undefined) {
res.redirect(301, aExternalRedirects[sPath]);
return true;
}
for (sPath in aExternalRedirectPatterns) {
re = new RegExp(sPath);
if (re.exec(req.url)) {
res.redirect(301, req.url.replace(re, aExternalRedirectPatterns[sPath]));
return true;
}
}
for (sPath in aInternalRedirectPatterns) {
re = new RegExp(sPath);
if (re.exec(req.url)) {
req.url = req.url.replace(re, aInternalRedirectPatterns[sPath]);
break;
}
}
return false;
};
/**
* filterAPI(req, res, next) is called by filter() to give us a crack at any API URLs
*
* @param {Object} req is an Express request object (http://expressjs.com/api.html#req.params)
* @param {Object} res is an Express response object (http://expressjs.com/api.html#res.status)
* @param {function()} next is the function to call to finish processing this request (unless WE finish it)
* @return {boolean} true if the request was handled as an API request, false if not
*/
HTTPAPI.filterAPI = function(req, res, next)
{
var asURL = req.path.match(/(^\/api\/v1\/[a-z]+)/);
if (asURL) {
if (asURL[0] == DiskAPI.ENDPOINT) {
if (HTTPAPI.processDiskAPI(req, res)) {
return true;
}
}
else if (asURL[0] == DumpAPI.ENDPOINT) {
if (HTTPAPI.processDumpAPI(req, res)) {
return true;
}
}
else if (asURL[0] == ReportAPI.ENDPOINT) {
if (HTTPAPI.processReportAPI(req, res)) {
return true;
}
}
else if (asURL[0] == UserAPI.ENDPOINT) {
if (HTTPAPI.processUserAPI(req, res)) {
return true;
}
}
/*
* If we're still here, the API request didn't pass muster.
*
* TODO: Consider providing some simple usage info, and changing the nResponse to 200,
* since the API endpoints will eventually be documented in /docs/pcjs/.
*/
var nResponse = 400; // default to "Bad Request"
var sResponse = "unrecognized API request: " + asURL[0] + "\n";
res.status(nResponse).send(sResponse);
return true;
}
return false;
};
/**
* hasAPICommand(req, asCommands)
*
* @param {Object} req
* @param {Array.<string>} asCommands (eg, DumpAPI.asDiskCommands or DumpAPI.asFileCommands)
* @returns {Array|null}
*/
HTTPAPI.hasAPICommand = function(req, asCommands)
{
if (req.query) {
for (var i = 0; i < asCommands.length; i++) {
var sValue = req.query[asCommands[i]];
if (sValue) return [asCommands[i], sValue];
}
}
return null;
};
/**
* initUserVolume(vol, fd, cbInit)
*
* @param {Object} vol
* @param {number} fd
* @param {number} cbInit
* @param {function(nResponse:number,sResponse:string,fd:number)} done
*/
HTTPAPI.initUserVolume = function(vol, fd, cbInit, done)
{
vol.fd = fd;
var nResponse = 200;
var sResponse = null;
/*
* We need to know if the file was just created, and if so, "truncate" it to the proper size
*/
if (cbInit) {
fs.fstat(fd, function(err, stats) {
if (!stats.size) {
fs.ftruncate(fd, cbInit, function(err) {
if (err) {
HTMLOut.logError(err);
fs.close(fd, function(err) {
vol.fd = null;
nResponse = 400;
sResponse = DiskAPI.FAIL.WRITEVOL;
done(nResponse, sResponse, null);
});
return;
}
done(nResponse, sResponse, fd);
});
return;
}
if (stats.size != cbInit) {
HTMLOut.logError(new Error(sResponse = "file size (" + stats.size + ") does not match requested size (" + cbInit + ")"));
fs.close(fd, function(err) {
vol.fd = null;
nResponse = 400;
sResponse = DiskAPI.FAIL.BADVOL;
done(nResponse, sResponse, null);
});
return;
}
done(nResponse, sResponse, fd);
});
}
};
/**
* openUserVolume(sPath, sMachine, sUser, sMode, cbInit, done)
*
* User IDs are added to userVolumes as users open volumes; for now, only one open
* volume per user is supported. Every entry in userVolumes is another Volume object.
*
* @param {string} sPath
* @param {string} sMachine
* @param {string} sUser
* @param {string} sMode
* @param {number} cbInit
* @param {function(nResponse:number,sResponse:string,fd:number)} done
*/
HTTPAPI.openUserVolume = function(sPath, sMachine, sUser, sMode, cbInit, done)
{
var vol = userVolumes[sUser];
if (vol) {
/*
* TODO: If the path is the same and the machine ID differs, then we need to add the
* current machine ID to a "revocation" list, consider that machine's access "revoked",
* and return DiskAPI.FAIL.REVOKED; otherwise, there's no real protection of volume
* integrity here. One of the challenges will be ensuring the list of revoked machine
* IDs doesn't grow without bound.
*
* When revoking, we should also be able to reuse the current vol by simply updating its
* machine ID; there's no need to close and re-open the file (although assuming revocation
* is a rare occurrence, it shouldn't much matter).
*/
if (vol.path != sPath || vol.machine != sMachine) {
HTTPAPI.closeUserVolume(vol.path, vol.machine, sUser, function() {
HTTPAPI.openUserVolume(sPath, sMachine, sUser, sMode, cbInit, done);
});
return;
}
}
if (!vol) {
vol = {fd: null, mode: sMode, path: sPath, machine: sMachine};
userVolumes[sUser] = vol;
}
var nResponse = 200;
var sResponse = null;
if (!vol.fd) {
HTMLOut.logDebug('HTMLOut.openUserVolume("' + sPath + '")');
fs.open(sPath, "r+", function(err, fd) {
if (err) {
if (sMode == DiskAPI.MODE.DEMANDRW) {
fs.open(sPath, "w+", function(err, fd) {
if (err) {
HTMLOut.logError(err);
nResponse = 400;
sResponse = DiskAPI.FAIL.CREATEVOL;
done(nResponse, sResponse, null);
} else {
HTTPAPI.initUserVolume(vol, fd, cbInit, done);
}
});
} else {
HTMLOut.logError(err);
nResponse = 400;
sResponse = DiskAPI.FAIL.OPENVOL;
done(nResponse, sResponse, null);
}
} else {
HTTPAPI.initUserVolume(vol, fd, cbInit, done);
}
});
return;
}
done(nResponse, sResponse, vol.fd);
};
/**
* readUserVolume(sPath, fd, aCHS, aAddr, done)
*
* aCHS is filled in as follows:
*
* [0]: total cylinders
* [1]: total heads
* [2]: total sectors per track
* [3]: total bytes per sector (generally 512)
*
* aAddr is filled in as follows:
*
* [0]: 0-based cylinder number
* [1]: 0-based head number
* [2]: 1-based sector number
* [3]: sector count
*
* @param {string} sPath
* @param {number} fd
* @param {Array.<number>} aCHS
* @param {Array.<number>} aAddr
* @param {function(nResponse:number,sResponse:string)} done
*/
HTTPAPI.readUserVolume = function(sPath, fd, aCHS, aAddr, done)
{
var pos = (aAddr[0] * (aCHS[1] * aCHS[2] * aCHS[3])) + (aAddr[1] * (aCHS[2] * aCHS[3])) + ((aAddr[2] - 1) * aCHS[3]);
var len = (aAddr[3] * aCHS[3]);
HTMLOut.logDebug('HTMLOut.readUserVolume("' + sPath + '"): pos: ' + pos + ', len: ' + len);
var buf = new Buffer(len);
fs.read(fd, buf, 0, len, pos, function(err, cbRead, buffer) {
var nResponse = 200;
var sResponse = null;
//
// TODO: The callback should be asserting/verifying that cbRead equals the requested length.
//
if (err) {
nResponse = 400;
sResponse = err.message;
} else {
sResponse = JSON.stringify(buffer);
}
done(nResponse, sResponse);
/*
* Replace the preceding line with this if you want to test how well the client deals with long I/O delays (eg, 10 seconds)
*
setTimeout(function() {
HTMLOut.logDebug("HTTPAPI.readUserVolume(): responding after 10000ms delay");
done(nResponse, sResponse);
}, 10000);
*/
});
};
/**
* writeUserVolume(sPath, fd, aCHS, aAddr, sData, done)
*
* aCHS is filled in as follows:
*
* [0]: total cylinders
* [1]: total heads
* [2]: total sectors per track
* [3]: total bytes per sector (generally 512)
*
* aAddr is filled in as follows:
*
* [0]: 0-based cylinder number
* [1]: 0-based head number
* [2]: 1-based sector number
* [3]: sector count
*
* @param {string} sPath
* @param {number} fd
* @param {Array.<number>} aCHS
* @param {Array.<number>} aAddr
* @param {string} sData
* @param {function(nResponse:number,sResponse:string)} done
*/
HTTPAPI.writeUserVolume = function(sPath, fd, aCHS, aAddr, sData, done)
{
var pos = (aAddr[0] * (aCHS[1] * aCHS[2] * aCHS[3])) + (aAddr[1] * (aCHS[2] * aCHS[3])) + ((aAddr[2] - 1) * aCHS[3]);
var len = (aAddr[3] * aCHS[3]);
HTMLOut.logDebug('HTMLOut.writeUserVolume("' + sPath + '"): pos: ' + pos + ', len: ' + len);
var abData;
try {
abData = JSON.parse(sData);
} catch(err) {
done(-1, err.message);
return;
}
if (abData.length == len) {
var buf = new Buffer(abData);
/*
* I have some concerns about asynchronous writes being performed out of order; however,
* even after changing fs.write() to fs.writeSync(), I'm still getting a corrupted 20mb disk
* image after running PKXARC B:DOCS.ARC into C:\TMP. TODO: Investigate.
*/
var nResponse = 200;
var sResponse = null;
var cbWrite = fs.writeSync(fd, buf, 0, len, pos);
if (cbWrite != len) {
nResponse = 400;
sResponse = "write length (" + cbWrite + ") does not equal buffer length (" + len + ")"
}
done(nResponse, sResponse);
/*
fs.write(fd, buf, 0, len, pos, function(err, cbWrite, buffer) {
//
// TODO: The callback should be asserting/verifying that cbWrite equals the requested length.
//
var nResponse = 200;
var sResponse = null;
if (err) {
nResponse = 400;
sResponse = err.message;
}
done(nResponse, sResponse);
});
*/
} else {
done(-1, "buffer length (" + abData.length + ") does not equal requested length (" + len + ")");
}
};
/**
* closeUserVolume(sPath, sMachine, sUser, done)
*
* @param {string} sPath
* @param {string} sMachine
* @param {string} sUser
* @param {function(Error)} done
*/
HTTPAPI.closeUserVolume = function(sPath, sMachine, sUser, done)
{
/**
* @type {Volume}
*/
var vol = userVolumes[sUser];
if (vol) {
if (vol.path == sPath && vol.machine == sMachine) {
userVolumes[sUser] = null;
if (vol.fd) {
HTMLOut.logDebug('HTTPAPI.closeUserVolume("' + sPath + '")');
fs.close(vol.fd, done);
return;
}
done(new Error(HTMLOut.logDebug('HTTPAPI.closeUserVolume("' + sPath + '"): volume not open')));
return;
}
done(new Error(HTMLOut.logDebug('HTTPAPI.closeUserVolume("' + sPath + '"): different volume open (' + vol.path + ')')));
return;
}
done(new Error(HTMLOut.logDebug('HTTPAPI.closeUserVolume("' + sPath + '"): no open volumes')));
};
/**
* parseDiskValues(s, aDefaults)
*
* @param {string} s
* @param {Array.<number>} a
* @returns {Array.<number>}
*/
HTTPAPI.parseDiskValues = function(s, a)
{
if (s) {
var as = s.split(':');
for (var i = 0; i < as.length && i < a.length; i++) {
if (!str.isValidInt(as[i])) break;
a[i] = parseInt(as[i]);
}
}
return a;
};
/**
* processDiskAPI(req, res)
*
* @param {Object} req is an Express request object (http://expressjs.com/api.html#req.params)
* @param {Object} res is an Express response object (http://expressjs.com/api.html#res.status)
* @return {boolean} true if the request was handled as an API request, false if not
*/
HTTPAPI.processDiskAPI = function(req, res)
{
/*
* For every volume, we must maintain the active machine+user that currently has access.
*/
var nResponse = 400; // default to "Bad Request"
var reqParms = req.method == "GET"? req.query : req.body;
var sAction = reqParms[DiskAPI.QUERY.ACTION];
var sPath = reqParms[DiskAPI.QUERY.VOLUME];
var sMode = reqParms[DiskAPI.QUERY.MODE]; // one of DiskAPI.MODE.* (eg, DiskAPI.MODE.DEMANDRW)
var sCHS = reqParms[DiskAPI.QUERY.CHS];
var sAddr = reqParms[DiskAPI.QUERY.ADDR];
var sData = reqParms[DiskAPI.QUERY.DATA];
var sMachine = reqParms[DiskAPI.QUERY.MACHINE];
var sUser = reqParms[DiskAPI.QUERY.USER];
/*
* aCHS is filled in as follows:
*
* [0]: total cylinders
* [1]: total heads
* [2]: total sectors per track
* [3]: total bytes per sector (generally 512)
*
* aAddr is filled in as follows:
*
* [0]: 0-based cylinder number
* [1]: 0-based head number
* [2]: 1-based sector number
* [3]: sector count
*/
var aCHS = HTTPAPI.parseDiskValues(sCHS, [0, 0, 0, 512]);
var aAddr = HTTPAPI.parseDiskValues(sAddr, [0, 0, 0, 0]);
HTMLOut.logDebug('HTTPAPI.processDiskAPI("' + sPath + '"): action=' + sAction + ', chs=' + sCHS + ', addr=' + sAddr);
if (sPath && sPath.indexOf('*/') === 0 && sPath.indexOf("..") < 0) {
HTTPAPI.verifyUserDir(sUser, function(sDir) {
if (sDir) {
var cbInit = aCHS[0] * aCHS[1] * aCHS[2] * aCHS[3];
sPath = path.join(sDir, sPath.replace('*', ''));
switch(sAction) {
case DiskAPI.ACTION.OPEN:
HTTPAPI.openUserVolume(sPath, sMachine, sUser, sMode, cbInit, function(nResponse, sResponse, fd) {
res.status(nResponse).send(sResponse);
});
break;
case DiskAPI.ACTION.READ:
HTTPAPI.openUserVolume(sPath, sMachine, sUser, sMode, cbInit, function(nResponse, sResponse, fd) {
if (fd) {
HTTPAPI.readUserVolume(sPath, fd, aCHS, aAddr, function(nResponse, sResponse) {
/*
* Without the addition of "no-store", Chrome will assume that a previous response to
* a previously seen URL can be re-used without hitting the server again, which would be
* bad if the requested sector(s) had been written in the meantime.
*
* Perhaps I should be using different HTTP verbs, or perhaps I should switch to sockets,
* but in the meantime, this is absolutely necessary.
*/
res.set("Cache-Control", "no-cache, no-store");
res.status(nResponse).send(sResponse);
});
} else {
res.status(nResponse).send(sResponse);
}
});
break;
case DiskAPI.ACTION.WRITE:
HTTPAPI.openUserVolume(sPath, sMachine, sUser, sMode, cbInit, function(nResponse, sResponse, fd) {
if (fd) {
HTTPAPI.writeUserVolume(sPath, fd, aCHS, aAddr, sData, function(nResponse, sResponse) {
res.status(nResponse).send(sResponse);
});
} else {
res.status(nResponse).send(sResponse);
}
});
break;
case DiskAPI.ACTION.CLOSE:
HTTPAPI.closeUserVolume(sPath, sMachine, sUser, function(err) {
var sResponse = null;
if (err) {
sResponse = err.message;
} else {
nResponse = 200;
}
res.status(nResponse).send(sResponse);
});
break;
default:
res.status(nResponse).send(DiskAPI.FAIL.BADACTION);
break;
}
return;
}
res.status(nResponse).send(DiskAPI.FAIL.BADUSER);
});
return true;
}
res.status(nResponse).send(DiskAPI.FAIL.BADVOL);
return true;
};
/**
* processDumpAPI(req, res)
*
* @param {Object} req is an Express request object (http://expressjs.com/api.html#req.params)
* @param {Object} res is an Express response object (http://expressjs.com/api.html#res.status)
* @return {boolean} true if the request was handled as an API request, false if not
*/
HTTPAPI.processDumpAPI = function(req, res)
{
var aCommand;
var nResponse = 400; // default to "Bad Request"
var sDisk, sFile, sFormat, fComments;
if ((aCommand = HTTPAPI.hasAPICommand(req, DumpAPI.asDiskCommands))) {
sDisk = aCommand[1];
HTMLOut.logDebug('HTTPAPI.processDumpAPI("' + sDisk + '"): type=' + aCommand[0]);
/*
* Allowing ".." in a path component is risky, unless we're running locally...
*/
if (sDisk.indexOf("..") < 0 || req.app.settings.port == 8088) {
sFormat = req.query[DumpAPI.QUERY.FORMAT] || DumpAPI.FORMAT.JSON;
fComments = (req.query[DumpAPI.QUERY.COMMENTS]? true : false);
var mbHD = req.query[DumpAPI.QUERY.MBHD];
/*
* TODO: Consider adding support for DiskDump's "exclusion" option to the API interface
* (the command-line interface supports it).
*/
var disk = new DiskDump(sDisk, null, sFormat, fComments, mbHD, sServerRoot);
if (aCommand[0] == DumpAPI.QUERY.DISK || aCommand[0] == DumpAPI.QUERY.IMG) {
disk.loadFile(function(err) {
HTTPAPI.dumpDisk(err, disk, res);
});
} else {
disk.buildImage(aCommand[0] == DumpAPI.QUERY.DIR, function(err) {
HTTPAPI.dumpDisk(err, disk, res);
});
}
return true;
}
}
else if ((aCommand = HTTPAPI.hasAPICommand(req, DumpAPI.asFileCommands))) {
sFile = aCommand[1];
HTMLOut.logDebug('HTTPAPI.processDumpAPI("' + sFile + '"): type=' + aCommand[0]);
/*
* Allowing ".." in a path component is too risky, unless we're running locally.
*/
if (sFile.indexOf("..") < 0 || req.app.settings.port == 8088) {
sFormat = req.query[DumpAPI.QUERY.FORMAT] || DumpAPI.FORMAT.JSON;
fComments = (req.query[DumpAPI.QUERY.COMMENTS]? true : false);
var fDecimal;
if (req.query[DumpAPI.QUERY.DECIMAL]) {
fDecimal = (req.query[DumpAPI.QUERY.DECIMAL] == "true");
}
var file = new FileDump(sFormat, fComments, fDecimal, sServerRoot);
file.loadFile(sFile, 0, 0, function(err) {
HTTPAPI.dumpFile(err, file, res);
});
return true;
}
}
return false;
};
/**
* dumpDisk(err, disk, res)
*
* @param {Error} err
* @param {DiskDump} disk
* @param {Object} res
*/
HTTPAPI.dumpDisk = function(err, disk, res)
{
var sResponse = "";
var nResponse = 400; // default to "Bad Request"
var sMIMEType = null;
var sAttachment = null;
if (err) {
/*
* TODO: Do a better job of mapping the underlying error (eg, err.errno) to an appropriate HTTP response error.
*/
nResponse = 404;
sResponse = err.message;
} else {
if (disk.sFormat == DumpAPI.FORMAT.IMG) {
// sMIMEType = "application/octet-stream";
sMIMEType = "application/x-download";
sAttachment = path.basename(disk.sDiskPath);
var i = sAttachment.lastIndexOf('.');
if (i > 0) sAttachment = sAttachment.substring(0, i+1) + DumpAPI.FORMAT.IMG;
sResponse = disk.convertToIMG();
} else {
// res.charset = "utf-8";
sMIMEType = "application/json; charset=utf-8";
sResponse = disk.convertToJSON();
}
/*
* Return a successful response ONLY if the disk conversion call returned any data
*/
if (sResponse) {
nResponse = 200;
} else {
sResponse = "unable to convert disk image: " + disk.sDiskPath;
}
}
if (sMIMEType) {
res.set("Content-Type", sMIMEType);
}
if (sAttachment) {
res.set("Content-Disposition", 'attachment; filename="' + sAttachment + '"');
}
res.status(nResponse).send(sResponse);
};
/**
* dumpFile(err, file, res)
*
* @param {Error} err
* @param {FileDump} file
* @param {Object} res
*/
HTTPAPI.dumpFile = function(err, file, res)
{
var sResponse = "";
var nResponse = 400; // default to "Bad Request"
var sMIMEType = null;
var sAttachment = null;
if (err) {
/*
* TODO: Do a better job of mapping the underlying error (eg, err.errno) to an appropriate HTTP response error.
*/
nResponse = 404;
sResponse = err.message;
} else {
if (file.sFormat == DumpAPI.FORMAT.ROM) {
// sMIMEType = "application/octet-stream";
sMIMEType = "application/x-download";
sAttachment = path.basename(file.sFilePath);
var i = sAttachment.lastIndexOf('.');
if (i > 0) sAttachment = sAttachment.substring(0, i+1) + DumpAPI.FORMAT.ROM;
sResponse = file.getData();
} else {
file.convertToJSON(function(err, str) {
if (!err) {
nResponse = 200;
} else {
str = err.message;
}
res.status(nResponse).send(str);
});
return;
}
/*
* Return a successful response ONLY if the file conversion call returned any data
*/
if (sResponse) {
nResponse = 200;
} else {
sResponse = "unable to convert file image: " + file.sFilePath;
}
}
if (sMIMEType) {
res.set("Content-Type", sMIMEType);
}
if (sAttachment) {
res.set("Content-Disposition", 'attachment; filename="' + sAttachment + '"');
}
res.status(nResponse).send(sResponse);
};
/**
* processReportAPI(req, res)
*
* @param {Object} req is an Express request object (http://expressjs.com/api.html#req.params)
* @param {Object} res is an Express response object (http://expressjs.com/api.html#res.status)
* @return {boolean} true if the request was handled as an API request, false if not
*/
HTTPAPI.processReportAPI = function(req, res)
{
var sApp = req.body[ReportAPI.QUERY.APP];
var sVer = req.body[ReportAPI.QUERY.VER];
var sURL = req.body[ReportAPI.QUERY.URL];
var sUser = req.body[ReportAPI.QUERY.USER];
var sType = req.body[ReportAPI.QUERY.TYPE];
var sData = req.body[ReportAPI.QUERY.DATA];
HTMLOut.logDebug('HTTPAPI.processReportAPI("' + sApp + '"): ver=' + sVer + ', url=' + sURL + ', type=' + sType);
if (sApp && sVer && sType == ReportAPI.TYPE.BUG && sData) {
/*
* Generate a random number x (where 0 <= x < 1), add 0.1 so that it's guaranteed to be
* non-zero, convert to base 36, and chop off the leading digit and "decimal" point.
*/
var sRemoteIP = req? req.ip : "";
var sDataFile = "/logs/" + sType + "s/" + usr.formatDate("Ymd") + '-' + (Math.random() + 0.1).toString(36).substr(2,8) + ".json";
var sReport = "<p>" + sApp + ' v' + sVer + ' ' + usr.formatDate("Y-m-d H:i:s") + ' ' + sRemoteIP + ' <a href="' + sURL + '?state=' + sDataFile + (sUser? '&user=' + sUser : '') + '">' + sDataFile + "</a></p>\n";
sDataFile = path.join(sServerRoot, sDataFile);
fs.writeFile(sDataFile, sData);
var sTypeFile = path.join(sServerRoot, "/logs/" + sType + "s.html");
fs.appendFile(sTypeFile, sReport);
res.status(200).send(ReportAPI.RES.OK);
return true;
}
return false;
};
/**
* processUserAPI(req, res)
*
* @param {Object} req is an Express request object (http://expressjs.com/api.html#req.params)
* @param {Object} res is an Express response object (http://expressjs.com/api.html#res.status)
* @return {boolean} true if the request was handled as an API request, false if not
*/
HTTPAPI.processUserAPI = function(req, res)
{
var reqParms = req.method == "GET"? req.query : req.body;
var sReq = reqParms[UserAPI.QUERY.REQ];
var sUser = reqParms[UserAPI.QUERY.USER];
var sState = reqParms[UserAPI.QUERY.STATE];
var sData = reqParms[UserAPI.QUERY.DATA];
HTMLOut.logDebug('HTTPAPI.processUserAPI("' + sUser + '"): req=' + sReq + (sState? (', state=' + sState) : ''));
if (sUser) {
switch(sReq) {
case UserAPI.REQ.CREATE:
if (HTTPAPI.createUserID(sUser, res)) return true;
break;
case UserAPI.REQ.VERIFY:
if (HTTPAPI.verifyUserID(sUser, res)) return true;
break;
case UserAPI.REQ.STORE:
if (HTTPAPI.storeUserData(sUser, sState, sData, res)) return true;
break;
case UserAPI.REQ.LOAD:
if (HTTPAPI.loadUserData(sUser, sState, res)) return true;
break;
default:
break;
}
}
return false;
};
/**
* createUserID(sUser, res)
*
* sUser must consist of the authorizing key, a colon, and the key to be authorized.
*
* @param {string} sUser
* @param {Object} res is an Express response object (http://expressjs.com/api.html#res.status)
* @return {boolean} true if request was valid (does not imply success), false if invalid
*/
HTTPAPI.createUserID = function(sUser, res)
{
HTMLOut.logDebug('HTTPAPI.createUserID("' + sUser + '")');
var asUsers = sUser.split(':');
if (asUsers[0] && asUsers[1]) {
HTTPAPI.verifyUserID(asUsers[0], res, function doneVerifyAuthorizedID(iVerified, result, res) {
HTMLOut.logDebug('HTTPAPI.doneVerifyAuthorizedID("' + asUsers[0] + '"): ' + iVerified);
/*
* The authorizing key has been verified, but it may authorize another key only
* if it is the first key in the list (or there are no keys at all yet and the authorizing
* key matches GORT_COMMAND).
*/
if (iVerified == 1 || iVerified <= 0 && asUsers[0] == net.GORT_COMMAND) {
HTTPAPI.verifyUserID(asUsers[1], res, function doneVerifyUserID(iVerified, resultSecond, res) {
HTMLOut.logDebug('HTTPAPI.doneVerifyUserID("' + asUsers[1] + '"): ' + iVerified);
if (iVerified <= 0) {
var sUserFile = path.join(sServerRoot, "/logs/users.log");
fs.appendFile(sUserFile, asUsers[1] + "\n");
result[UserAPI.RES.CODE] = UserAPI.CODE.OK;
result[UserAPI.RES.DATA] = asUsers[1];
} else {
result[UserAPI.RES.CODE] = UserAPI.CODE.FAIL;
result[UserAPI.RES.DATA] = UserAPI.FAIL.DUPLICATE;
}
if (res) res.status(200).send(JSON.stringify(result) + "\n");
});
return;
}
result[UserAPI.RES.CODE] = UserAPI.CODE.FAIL;
result[UserAPI.RES.DATA] = UserAPI.FAIL.VERIFY;
if (res) res.status(200).send(JSON.stringify(result) + "\n");
});
return true;
}
return false;
};
/**
* verifyUserID(sUser, res, done)
*
* If a done() handler is specified, the first parameter it receives is iVerified, which
* will be -1 if the "users.log" file hasn't been initialized yet, 0 if the key doesn't exist,
* or a positive number representing the line number at which the key appears.
*
* Moreover, when a done() handler is provided, it simply passes the response object (res) to
* done(), which must actually send the response, based on the provided result; this function sends
* a response only if done() is NOT provided.
*
* @param {string} sUser
* @param {Object} res is an Express response object (http://expressjs.com/api.html#res.status)
* @param {function(number, Object, Object)} [done]
* @return {boolean} true if request was valid (does not imply success), false if invalid
*/
HTTPAPI.verifyUserID = function(sUser, res, done)
{
HTMLOut.logDebug('HTTPAPI.verifyUserID("' + sUser + '")');
/*
* If a colon separator is present, this is an implicit REQ.CREATE call
* (in fact, at present, PCjs does not issue any explicit REQ.CREATE calls).
*/
if (sUser.indexOf(':') > 0 && HTTPAPI.createUserID(sUser, res)) {
return true;
}
var iVerified = -1;
var sUserFile = path.join(sServerRoot, "/logs/users.log");
fs.readFile(sUserFile, {encoding: "utf8"}, function doneReadUserIDs(err, sData) {
var sResCode = UserAPI.CODE.FAIL;
var sResData = UserAPI.FAIL.VERIFY;
if (err) {
HTMLOut.logError(err);
} else {
var asUsers = sData.split("\n");
iVerified = asUsers.indexOf(sUser);
if (iVerified >= 0) {
if (HTTPAPI.createUserDir(sUser)) {
sResCode = UserAPI.CODE.OK;
sResData = sUser;
}
}
iVerified++;
}
var result = {};
result[UserAPI.RES.CODE] = sResCode;
result[UserAPI.RES.DATA] = sResData;
if (done) {
done(iVerified, result, res);
return;
}
if (res) res.status(200).send(JSON.stringify(result) + "\n");
});
return true;
};
/**
* getUserDir(sUser)
*
* @param {string} sUser
* @return {string}
*/
HTTPAPI.getUserDir = function(sUser)
{
return path.join(sServerRoot, "/logs/users/" + /* sUser.substr(0, 2) + "/" + */ sUser);
};
/**
* createUserDir(sUser)
*
* TODO: Creation is relatively rare, so I'm lazy and use synchronous calls, but fix this someday.
*
* @param {string} sUser
* @return {boolean} true if successful, false if not
*/
HTTPAPI.createUserDir = function(sUser)
{
var sDir = HTTPAPI.getUserDir(sUser);
return (fs.existsSync(sDir) || !!mkdirp.sync(sDir));
};
/**
* verifyUserDir(sUser, done)
*
* @param {string} sUser
* @param {function(string|null)} done
*/
HTTPAPI.verifyUserDir = function(sUser, done)
{
HTMLOut.logDebug('HTTPAPI.verifyUserDir("' + sUser + '")');
if (sUser) {
var sDir = HTTPAPI.getUserDir(sUser);
fs.exists(sDir, function(fExists) {
if (!fExists) {
HTTPAPI.verifyUserID(sUser, null, function(iVerified, result, res) {
done(iVerified > 0? sDir : null);
});
return;
}
done(sDir);
});
return;
}
done(null);
};
/**
* loadUserData(sUser, sState, res)
*
* @param {string} sUser
* @param {string} sState is a state ID
* @param {Object} res is an Express response object (http://expressjs.com/api.html#res.status)
* @return {boolean} true if request was valid (does not imply success), false if invalid
*/
HTTPAPI.loadUserData = function(sUser, sState, res)
{
HTMLOut.logDebug('HTTPAPI.loadUserData("' + sUser + '","' + sState + '")');
if (sState) {
HTTPAPI.verifyUserDir(sUser, function(sDir) {
var result = {};
result[UserAPI.RES.CODE] = UserAPI.CODE.FAIL;
result[UserAPI.RES.DATA] = UserAPI.FAIL.VERIFY;
if (sDir) {
if (sState.indexOf("..") >= 0) {
result[UserAPI.RES.DATA] = UserAPI.FAIL.BADSTATE;
}
else {
var sFile = path.join(sDir, sState);
fs.readFile(sFile, {encoding: "utf8"}, function doneReadUserData(err, sData) {
if (err) {
HTMLOut.logError(err);
/*
* We'll assume that any error here means the file doesn't exist (ie, NOSTATE instead
* of BADLOAD).
*/
result[UserAPI.RES.DATA] = UserAPI.FAIL.NOSTATE;
} else {
/*
* Suppress the normal RES_CODE+RES_DATA output format and simply return the "raw" state;
* this makes life simpler for the client app.
*/
result = sData;
/*
* Without the addition of "no-store", Chrome (and perhaps other browsers) will assume that
* a previous response to a previously seen URL can be re-used without hitting the server
* again, which would be bad if the requested state has been modified in the meantime.
*
* Here's the scenario: the user loads a web page with a machine that uses server-side state,
* the user changes the state of that machine and switches away from the machine (eg, clicks
* a link to a different page), which causes the state to be updated on the server; then they
* click the Back button, and the browser, seeing the same server-side state request, simply
* uses the state data it originally retrieved, instead of requesting the updated state from the
* server.
*/
res.set("Cache-Control", "no-cache, no-store");
}
res.status(200).send(typeof result == "string"? result : JSON.stringify(result) + "\n");
});
return;
}
}
res.status(200).send(JSON.stringify(result) + "\n");
});
return true;
}
return false;
};
/**
* storeUserData(sUser, sState, sData, res)
*
* @param {string} sUser
* @param {string} sState is a state ID
* @param {string} sData
* @param {Object} res is an Express response object (http://expressjs.com/api.html#res.status)
* @return {boolean} true if request was valid (does not imply success), false if invalid
*/
HTTPAPI.storeUserData = function(sUser, sState, sData, res)
{
HTMLOut.logDebug('HTTPAPI.storeUserData("' + sUser + '","' + sState + '")');
if (sState && sData) {
HTTPAPI.verifyUserDir(sUser, function(sDir) {
var result = {};
result[UserAPI.RES.CODE] = UserAPI.CODE.FAIL;
result[UserAPI.RES.DATA] = UserAPI.FAIL.VERIFY;
if (sDir) {
if (sState.indexOf("..") >= 0) {
result[UserAPI.RES.DATA] = UserAPI.FAIL.BADSTATE;
}
else {
var sFile = path.join(sDir, sState);
fs.writeFile(sFile, sData);
result[UserAPI.RES.CODE] = UserAPI.CODE.OK;
result[UserAPI.RES.DATA] = sData.length + " bytes stored";
}
}
res.status(200).send(JSON.stringify(result) + "\n");
});
return true;
}
return false;
};
module.exports = HTTPAPI;
HTMLOut === This module provides a filter() function for [server.js](../../../server.js), our Express-based web server. The function is installed like so: app.use(HTMLOut.filter); The filter function examines the URL, and if it corresponds to a directory on the server, the function will generate an "index.html" in that directory, based on the contents of a default template file (currently [common.html](../shared/templates/common.html)).
{
"name": "htmlout",
"version": "0.1.0",
"description": "Filters HTTP requests and creates default documents from HTML templates",
"main": "./lib/htmlout",
"scripts": {
"test": "echo \"error: no test specified\" && exit 1"
},
"author": "Jeff Parsons <Jeff@pcjs.org>",
"licenses": [
{
"type": "GPLv3",
"url": "http://www.gnu.org/licenses/gpl.html"
}
],
"bin": {
"example": "./bin/htmlout"
}
}
#!/usr/bin/env node
/**
* @fileoverview Implements the MarkOut command-line interface
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* @suppress {missingProperties}
* Created 2012-Sep-04
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
* and <http://pcjs.org/>.
*
* JSMachines is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with JSMachines.
* If not, see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some JSMachines files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* JSMachines Project for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
var path = require("path");
var fs = require("fs");
var lib = path.join(path.dirname(fs.realpathSync(__filename)), "../lib/");
require(lib + "markout.js").CLI();
/**
* @fileoverview Parses simplified Markdown files
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
* @version 1.0
* Created 2014-02-14
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
* and <http://pcjs.org/>.
*
* JSMachines is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with JSMachines.
* If not, see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some JSMachines files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* JSMachines Project for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
/*
* For complete Markdown syntax, see: http://daringfireball.net/projects/markdown/syntax
*
* TODO: Consider adding support for GFM-style tables, as described [here](https://help.github.com/articles/github-flavored-markdown#tables);
* this would be nice for a Markdown-based ASCII table, for example.
*
* TODO: Consider adding support for GFM-style strike-through, as described [here](https://help.github.com/articles/github-flavored-markdown#strikethrough)
*
* TODO: Consider adding support for anything in the Markdown spec that we don't currently support (but only features that I might actually want to use).
*/
"use strict";
var path = require("path");
var net = require("../../shared/lib/netlib");
var proc = require("../../shared/lib/proclib");
var str = require("../../shared/lib/strlib");
/**
* @class exports
* @property {string} name
* @property {string} version
*/
var pkg = require("../../../package.json");
/**
* fConsole controls diagnostic messages; it is false by default and can be overridden using the
* setOptions() 'console' property.
*
* @type {boolean}
*/
var fConsole = false;
/**
* sDefaultDir is the default directory to use with the command-line interface; it can be overridden using --dir.
*
* @type {string}
*/
var sDefaultDir = "/Users/Jeff/Sites/pcjs";
/**
* sDefaultFile is the default file to use with the command-line interface; it can be overridden using --file.
*
* @type {string}
*/
var sDefaultFile = "./README.md";
/**
* MarkOut()
*
* The req parameter is provided ONLY so that we can check for special URL parameters which, for
* example, require us to transform standard machine configurations into DEBUG configurations.
*
* If aParms is provided, it should contain the following elements:
*
* aParms[0]: the version to use for any machines (default is "*" for the latest version)
* aParms[1]: the class prefix to use for any image galleries (eg, "common-image")
*
* @constructor
* @param {string} sMD containing markdown
* @param {string|null} [sIndent] sets the overall indentation of the document
* @param {Object} [req] is the web server's (ie, Express) request object, if any
* @param {Array.<string>|null} [aParms] is an array of overrides to use (see below)
* @param {boolean} [fDebug] turns on debugging features (eg, debug comments, special URL encodings, etc)
*/
function MarkOut(sMD, sIndent, req, aParms, fDebug)
{
this.sMD = sMD;
this.sIndent = (sIndent || "");
this.req = req;
this.sMachineVersion = ((aParms && aParms[0]) || "*");
if ((this.sClassImage = ((aParms && aParms[1]) || ""))) {
this.sClassImageGallery = this.sClassImage + "-gallery";
this.sClassImageFrame = this.sClassImage + "-frame";
this.sClassImageLink = this.sClassImage + "-link";
this.sClassImageLabel = this.sClassImage + "-label";
}
this.fDebug = fDebug;
this.sHTML = null;
this.aIDs = []; // this keeps tracks of auto-generated ID attributes for page elements, to insure uniqueness
this.aMachines = []; // this keeps tracks of embedded machines on the page
}
/*
* Class constants/globals
*/
/*
* Class methods
*/
/**
* CLI()
*
* Provides a command-line interface for the markout module
*
* Usage:
*
* markout [--dir=(directory)] [--file=(filename)] [--console=(true|false)]
*
* Options:
*
* --dir specifies a directory to use in conjunction with --file; sDefaultDir used if none specified.
*
* --file specifies an optional filename (relative to the directory given by --dir) of a markdown file;
* sDefaultFile is used if none specified.
*
* --console turns diagnostic console messages on or off; they are OFF by default.
*
* Examples:
*
* node modules/markout/bin/markout --file=/modules/grunts/prepjs/README.md --debug
*/
MarkOut.CLI = function()
{
var fs = require("fs");
var path = require("path");
var fDebug = false;
var args = proc.getArgs();
if (args.argc) {
var argv = args.argv;
/*
* Create a dummy Express req.query object
*/
var req = {'query': {}};
if (argv['debug'] !== undefined) fDebug = argv['debug'];
MarkOut.setOptions({'console': argv['console']});
if (fDebug) console.log("args:" + JSON.stringify(argv));
var sDir = argv['dir'] !== undefined? argv['dir'] : sDefaultDir;
var sFile = argv['file'] !== undefined? argv['file'] : sDefaultFile;
sFile = path.join(sDir, sFile);
if (fConsole) console.log("readFile(" + sFile + ")");
fs.readFile(sFile, {encoding: "utf8"}, function(err, str) {
if (err) {
MarkOut.logError(err, true);
} else {
var m = new MarkOut(str, null, req, null, fDebug);
console.log(m.convertMD(" "));
}
});
} else {
console.log("usage: markout [--dir=(directory)] [--file=(filename)] [--console=(true|false)]");
}
};
/**
* logError(err) conditionally logs an error to the console
*
* @param {Error} err
* @param {boolean} [fForce]
* @return {string} the error message that was logged (or that would have been logged had logging been enabled)
*/
MarkOut.logError = function(err, fForce)
{
var sError = "";
if (err) {
sError = "markout error: " + err.message;
if (fConsole || fForce) console.log(sError);
}
return sError;
};
/**
* setOptions(options) sets module options
*
* Supported options are 'console'; note that an option must be explicitly set in order to override
* the option's default value (see fConsole).
*
* @param {Object} options
*/
MarkOut.setOptions = function(options)
{
if (options['console'] !== undefined) {
fConsole = options['console'];
}
};
/*
* Object methods
*/
/**
* addMachine(infoMachine)
*
* The infoMachine object should contain, at a minimum:
*
* {
* 'class': sMachineClass, // eg, "pc"
* 'func': sMachineFunc,
* 'id': sMachineID,
* 'xml': sMachineXMLFile,
* 'xsl': sMachineXSLFile,
* 'version': sMachineVersion, // eg, "1.13.0"
* 'debugger': fDebugger, // eg, false
* 'state': sMachineState
* }
*
* This is an internal function, used by convertMDMachineLinks() to record all the machines defined
* in the current document. getMachines() is then called externally (eg, by HTMLOut) to get this list
* and make sure all the pre-requisites are in place (eg, CSS file and scripts in the HTML document's
* header).
*
* @this {MarkOut}
* @param {Object} infoMachine
*/
MarkOut.prototype.addMachine = function(infoMachine)
{
this.aMachines.push(infoMachine);
};
/**
* getMachines()
*
* @this {MarkOut}
* @return {Array} of objects containing information about each machine defined by the document
*/
MarkOut.prototype.getMachines = function()
{
return this.aMachines;
};
/**
* generateID(sText)
*
* Generate an ID from the given text, by basically converting it to lower case, converting anything
* that's not a letter or a digit to a hyphen (-), and stripping all leading and trailing hyphens from
* the result. Furthermore, if the generated ID is not unique (among the set of ALL generated IDs),
* then no ID is produced.
*
* @this {MarkOut}
* @param {string} sText
* @returns {string|null} converts the given text to a unique ID (or null if resulting ID was not unique)
*/
MarkOut.prototype.generateID = function(sText)
{
var sID = sText.replace(/[^A-Z0-9]+/gi, '-').replace(/^-+|-+$/g, "").toLowerCase();
if (this.aIDs.indexOf(sID) < 0) {
this.aIDs.push(sID);
return sID;
}
return null;
};
MarkOut.aHTMLEntities = {
"\\\\": "\",
"\\`": "`",
"\\*": "*",
"\\_": "_",
"\\{": "{",
"\\}": "}",
"\\[": "[",
"\\]": "]",
"\\(": "(",
"\\)": ")",
"\\#": "#",
"\\+": "+",
"\\-": "-",
"\\.": ".",
"\\!": "!"
};
/**
* convertMD()
*
* @this {MarkOut}
* @param {string} [sIndent] sets the indentation of HTML elements within the document
*/
MarkOut.prototype.convertMD = function(sIndent)
{
var sMD = this.sMD;
/*
* Convert any escaped asterisks, square brackets, etc, to their HTML-entity equivalents,
* as a convenient way of avoiding parsing problems later. We also take this opportunity
* to replace any \r\n sequences with \n.
*/
sMD = str.replaceArray(MarkOut.aHTMLEntities, sMD).replace(/\r\n/g, "\n").replace(/\r/g, "\n");
/*
* Before performing the original comment-elimination step, a new step has been added that
* allows blocks of Markdown to be excluded from the Markout process (eg, build instructions
* that you'd like to see on GitHub but that don't need to be displayed on the public website).
*
* Basically, you wrap those kinds of blocks with a pair of special comments, like so:
*
* <!-- BEGIN:EXCLUDE --> ... <!-- END:EXCLUDE -->
*
* While I used upper-case for emphasis, the replacement is case-insensitive and also supports
* triple-dash-style comments.
*/
if (!this.fDebug) {
sMD = sMD.replace(/[ \t]*<!--+\s*begin:exclude\s*-+->[\s\S]*?<!--+\s*end:exclude\s*-+->[\r\n]*/i, "");
}
/*
* I eliminate all HTML-style comments up front, because I sometimes use such comments to
* document Markdown-internal issues. I've seen online references to "triple-dash" (<!--- --->)
* comments being used for that purpose, but it doesn't seem to be a standard; however, this
* regex should eliminate both forms.
*
* $sMD = preg_replace("%<!--.*?-->%s", "", $sMD);
*
* NOTE: I found the following trick online: use "[\s\S]" to match any character, to work around JavaScript's
* lack of support for the "s" (aka "dotall" or "multiline") option that changes "." to match newlines.
*/
sMD = sMD.replace(/<!--[\s\S]*?-->/g, "");
/*
* Convert all lone series of three or more hyphens/underscores/asterisks into horizontal rules.
*/
sMD = sMD.replace(/(^|\n\n+)(-\s*-\s*-+|_\s*_\s*_+|\*\s*\*\s*\*+)\s*(\n\n+|$)+/g, "$1<hr/>$3");
/*
* "Normalize" all series of blank lines into simple "double-linefeed" sequences
* that we can use as markers to delineate all the top-level Markdown blocks (ie,
* headings, paragraphs, lists, code blocks, etc).
*/
sMD = sMD.trim().replace(/\n([ \t]*\n)+/g, "\n\n");
/*
* HACK: To allow paragraphs to appear within list items, I also find all lines that begin
* with an indented list marker and are followed by a series of indented and/or blank lines,
* and replace all double-linefeeds in that series with "\n\t\n", so that the entire series
* will be treated as a single block.
*
* convertMDList() will, in turn, look for any "\n\t\n" sequences, convert them back into
* "\n\n", and then call convertMDBlocks().
*
* WARNING: This hack works ONLY for lists whose list markers are indented by at least one space
* (and up to three spaces). This doesn't affect normal parsers, which treat all list markers
* indented by 0-3 spaces equally.
*
* NOTE: I find this to be a very annoying feature of Markdown, because it's not clear to me why:
*
* * A list item.
*
* With multiple paragraphs.
*
* * Another item in the list.
*
* should be interpreted as ONE list whose first item contains multiple paragraphs, rather than
* as TWO lists, each with one item, and an indented code block between them. And in fact, that's
* exactly what I'll give you if your list markers aren't indented, per my warning above.
*
* The official Markdown spec (http://daringfireball.net/projects/markdown/syntax) says that if
* you want the second paragraph to appear as a code block, it must be indented TWICE (by 8 spaces
* or 2 tabs). That behavior should fall out of this hack as well.
*/
var aMatch;
var re = /(^|\n)( ? ?)([\*+-]|[0-9]+\.)([^\n]*\n)([ \t]+[^\n]*\n|\n)+([ \t]+[^\n]+)/g;
//noinspection UnnecessaryLocalVariableJS
var sMDOrig = sMD;
while ((aMatch = re.exec(sMDOrig))) {
var sReplace = aMatch[0].replace(/\n\n/g, "\n\t\n");
sMD = sMD.replace(aMatch[0], sReplace);
}
/*
* Ready to convert all blocks now.
*/
sMD = this.convertMDBlocks(sMD, sIndent);
/*
* Post-processing hacks go here. First off, we would like all <pre>...</pre><pre>...</pre> sequences
* to become one single (unified) <pre> sequence.
*/
sMD = sMD.replace(/<\/pre>(\s*)<pre>/g, "\n\n").replace(/<\/code>(\s*)<code>/g, "$1");
this.sHTML = sMD;
return this.sHTML;
};
/**
* convertMDBlocks(sMD, sIndent)
*
* If your text may contain some block markers (ie, double-linefeeds), or headers (either "Atx-style"
* or "Setext-style) that require the insertion of double-linefeed block markers, then call this function.
*
* @this {MarkOut}
* @param {string} sMD
* @param {string} [sIndent]
*/
MarkOut.prototype.convertMDBlocks = function(sMD, sIndent)
{
var sHTML = "";
/*
* Convert all "Atx-style headers" (ie, series of leading hashmarks) to their <h#> equivalents.
*
* A slight tweak to standard Markdown: if there are equal numbers of hashmarks on either side of the
* text, we center it.
*/
sMD = sMD.replace(/(^|\n)(#+)\s+(.*?)\2(\n|$)/g, '$1<h$2 style="text-align:center">$3</h$2>\n\n');
sMD = sMD.replace(/(^|\n)(#+)\s+(.*?)#*(\n|$)/g, "$1<h$2>$3</h$2>\n\n");
sMD = str.replaceArray({"<h######":"<h6", "<h#####":"<h5", "<h####":"<h4", "<h###":"<h3", "<h##":"<h2", "<h#":"<h1"}, sMD);
sMD = str.replaceArray({"h######>":"h6>", "h#####>":"h5>", "h####>":"h4>", "h###>":"h3>", "h##>":"h2>", "h#>":"h1>"}, sMD);
/*
* Convert all "Setext-style headers" (ie, series of equal-signs or dashes) to their <h#> equivalents.
*/
sMD = sMD.replace(/([^\n]+)\n([=-])[=-]*(\n|$)/g, "<h$2>$1</h$2>\n\n");
sMD = str.replaceArray({"h=>":"h1>", "h->":"h2>"}, sMD);
/*
* Auto-generate IDs for headings
*/
var match;
var re = /<(h[0-9])>([^<]*)<\/\1>/g;
while ((match = re.exec(sMD))) {
var sID = this.generateID(match[2]);
if (sID) {
sMD = sMD.replace(match[0], '<' + match[1] + ' id="' + sID + '">' + match[2] + '</' + match[1] + '>');
/*
* Since the replacement is guaranteed to be longer than the original, no need to worry about re.lastIndex
*/
}
}
/*
* The preceding replacements used to end with a match on "(\n|$)+", but in cases where there were consecutive
* headings, the first match would "eat" all the linefeeds between them, and so the second heading would not get
* matched. However, a side-effect of not "eating" all those linefeeds is that we can end up with too many of them
* after all the heading replacements are done.
*
* So, even though we already "normalized" all consecutive linefeeds in convertMD(), we have to do it again
* (although this normalization is simpler, as we don't have to worry about any other whitespace).
*/
sMD = sMD.replace(/\n\n+/g, "\n\n");
/*
* Explode the given Markdown sequence into blocks based purely on double-linefeed sequences.
*/
var asBlocks = sMD.split("\n\n");
for (var iBlock = 0; iBlock < asBlocks.length; iBlock++) {
sHTML += this.convertMDBlock(asBlocks[iBlock], sIndent);
}
return sHTML;
};
/**
* convertMDBlock(sBlock, sIndent)
*
* @this {MarkOut}
* @param {string} sBlock
* @param {string} [sIndent]
*/
MarkOut.prototype.convertMDBlock = function(sBlock, sIndent)
{
var sHTML = "";
// this.addIndent(sIndent);
// if (this.fDebug) sHTML += this.encodeComment("convertMDBlock", sBlock);
/*
* Look for "quoted" paragraphs that should be wrapped with <blockquote>.
*
* This is a recursive operation, so this code does not need to "fall into" the other conversions.
*/
if (sBlock.match(/^>\s+/)) {
sBlock = sBlock.replace(/(^|\n)>\s+/g, "$1");
sHTML += this.sIndent + "<blockquote>\n" + this.convertMDBlocks(sBlock, sIndent) + this.sIndent + "</blockquote>\n";
return sHTML;
}
/*
* Look for indented paragraphs that should be converted to <pre><code> blocks.
*
* No other conversions should occur in such a block, so we don't "fall into" the other conversions.
*/
var aMatch;
var re = /^((^|\n)( |\t)([^\n]*))+$/;
if ((aMatch = re.exec(sBlock))) {
var sUndented = aMatch[0].replace(/(^|\n)( |\t)([^\n]*)/g, "$1$3");
sBlock = sBlock.replace(aMatch[0], "<pre><code>" + str.escapeHTML(sUndented.replace(/\t/g, " ")) + "</code></pre>");
sHTML += this.sIndent + sBlock + "\n";
return sHTML;
}
/*
* Look for GFM ("GitHub Flavored Markdown") "fenced code blocks", which are basically code blocks
* wrapped by "triple-backticks" instead of being indented.
*
* No other conversions should occur in such a block, so we don't "fall into" the other conversions.
*
* TODO: GFM doesn't require fenced code blocks to be preceded/followed by blank lines, so if we want
* to support those as well, it will be up to convertMD() to detect them and parse them into discrete blocks.
*/
re = /^```([^\n]*)\n([\s\S]*?)```$/;
if ((aMatch = re.exec(sBlock))) {
sBlock = sBlock.replace(aMatch[0], "<pre><code>" + str.escapeHTML(aMatch[2]) + "</code></pre>");
sHTML += this.sIndent + sBlock + "\n";
return sHTML;
}
/*
* Convert any "double-backtick" sequences into <code> sequences, with inner backticks
* treated as literal; we translate those to HTML entity "`" to prevent them from being
* detected as part of a "single-backtick" sequence below.
*
* Note that we also do the entity replacement AFTER calling htmlspecialchars(), because
* our implementation of htmlspecialchars() isn't smart enough to avoid the "double-encoding"
* problem (ie, translating the leading "&" of an entity into yet another "&" entity).
*/
var sBlockOrig = sBlock;
re = /``(.*?)``/g;
while ((aMatch = re.exec(sBlockOrig))) {
sBlock = sBlock.replace(aMatch[0], "<code>" + str.escapeHTML(aMatch[1]).replace(/`/g, "`") + "</code>");
}
/*
* Convert any remaining "single-backtick" sequences into <code> sequences as well.
*/
sBlockOrig = sBlock;
re = /`(.*?)`/g;
while ((aMatch = re.exec(sBlockOrig))) {
sBlock = sBlock.replace(aMatch[0], "<code>" + str.escapeHTML(aMatch[1]) + "</code>");
}
/*
* Per markdown syntax: "When you do want to insert a <br /> break tag using Markdown,
* you end a line with two or more spaces, then type return."
*/
sBlock = sBlock.replace(/ +\n/g, "<br/>\n" + this.sIndent);
/*
* If the block looks like a list, convertMDList() will convert it; if not, then it will wrap the
* block with paragraph tags -- assuming the block isn't already wrapped with some sort of block markup.
*/
sBlock = this.convertMDList(sBlock, sIndent);
/*
* Process any "image" Markdown links first (since they can be misinterpreted as "normal" links);
* this ordering also allows image links to be wrapped by "normal" Markdown links, if you want to
* turn images into links, as in:
*
* [](http://google.com.au/)
*
* However, we also offer a "link:" extension to the title attribute; as in:
*
* 
*
* which has the same effect but ALSO wraps the image in a special "image link" class and displays the
* "Alt text" as a label underneath the image; and if the block consists entirely of such images, then all
* the images are wrapped in an "image gallery" class.
*/
sBlock = this.convertMDImageLinks(sBlock, sIndent);
/*
* Process any special "machine" Markdown-style links next.
*/
sBlock = this.convertMDMachineLinks(sBlock);
/*
* Now we can finally process "normal" Markdown links.
*/
sBlock = this.convertMDLinks(sBlock);
/*
* Finally, look for all assorted forms of Markdown emphasis (there's no particular reason we do it last, we just do).
*/
sBlock = this.convertMDEmphasis(sBlock);
sHTML += this.sIndent + sBlock + "\n";
// this.subIndent(sIndent);
return sHTML;
};
/**
* convertMDList(sBlock, sIndent)
*
* If the block begins with an unordered list marker, create an unordered list;
* similarly, if the block begins with an ordered list marker, create an ordered list.
*
* Otherwise, wrap the block with paragraph tags in the absence of any other block markup.
*
* HACK: To allow paragraphs to appear within list items, convertMD() found all lines that
* began with an indented list marker and were followed by a series of indented and/or blank
* lines, and replaced all double-linefeeds in that series with "\n\t\n". Hence, this
* function must compensate by replacing "\n\t\n" sequences in any sub-lists with the normal
* "\n\n" and calling convertMDBlocks().
*
* FEATURE: If you use "*" as your unordered list marker (instead of "+" or "-", all of which
* Markdown apparently treats equivalently), I automatically use a list style that omits bullets.
* So, if you REALLY want bullets, use "-" or "+".
*
* @this {MarkOut}
* @param {string} sBlock
* @param {string} sIndent
* @return {string}
*/
MarkOut.prototype.convertMDList = function(sBlock, sIndent)
{
var sIndentPrev = this.addIndent(sIndent);
var aMatch;
var aMatches = [];
var re = /(^|\n) ? ? ?([\*+-]|[0-9]+\.)[ \t]+/g;
while ((aMatch = re.exec(sBlock))) {
aMatches.push(aMatch);
}
if (aMatches.length && aMatches[0].index === 0) {
aMatch = aMatches[0];
var sListType = aMatch[2].charAt(0);
var sListStyle = "md-list" + (sListType == '*'? " md-list-none" : (sListType == '-'? " md-list-compact" : ""));
sListType = (sListType >= '0' && sListType <= '9')? "ol" : "ul";
var sList = '<' + sListType + ' class="' + sListStyle + '">\n';
for (var iMatch = 0; iMatch < aMatches.length; iMatch++) {
aMatch = aMatches[iMatch];
var iStart = aMatch.index + aMatch[0].length;
var iStop = iMatch < aMatches.length-1? aMatches[iMatch+1].index : sBlock.length;
var sListItem = sBlock.substr(iStart, iStop - iStart);
/*
* If this list item contains one or more lines indented by 4 or more spaces (or 1 or more tabs)
* then we need to strip them, so that they can be parsed as a sub-list.
*/
re = /((^|\n)( |\t)([^\n]*))+/;
if ((aMatch = re.exec(sListItem))) {
// if (this.fDebug) sList += this.encodeComment("subList", aMatch[0]);
var sSubList = aMatch[0].replace(/(^|\n)( |\t)([^\n]*)/g, "$1$3").replace(/\n\t\n/g, "\n\n");
if (sSubList.charAt(0) == "\n") sSubList = sSubList.substr(1);
sListItem = str.replaceAll(aMatch[0], "\n" + this.sIndent + this.convertMDBlocks(sSubList, sIndent).trim() + "\n" + this.sIndent, sListItem);
} else {
sListItem = this.convertMDLines(sListItem);
}
sList += this.sIndent + "<li>" + sListItem + "</li>\n";
}
sList += sIndentPrev + "</" + sListType + ">";
sBlock = sList;
}
else {
/*
* In the absence of any other block markup, wrap the block in paragraph tags.
*
* TODO: The test here is currently for *any* HTML markup; this should probably be tightened up.
*/
if (sBlock.charAt(0) != "<") sBlock = "<p>" + this.convertMDLines(sBlock) + "</p>";
}
this.subIndent(sIndent);
return sBlock;
};
/**
* convertMDLines(s)
*
* This function is purely cosmetic. The intent is to indent all the lines in multi-line items
* (eg, paragraphs, list items), so that the resulting HTML is a bit more readable. Unfortunately,
* it has some unintended side-effects (for example, it creates unnecessary indentation inside image
* galleries, which are nothing more than paragraphs containing a series of image links), so this
* code is disabled for now.
*
* @this {MarkOut}
* @param {string} s
* @return {string}
*/
MarkOut.prototype.convertMDLines = function(s)
{
return s;
// return s.replace(/\n/g, "\n" + this.sIndent).trim();
};
/**
* convertMDLinks(sBlock)
*
* Aside from basic "inline" Markdown links, we also support named anchors; if the link begins with '#',
* we strip the '#' and use the remainder of the link as the name of the anchor. To reference a named
* anchor from another link, you have to specify a path with '#' and the anchor name appended, in order
* to distinguish an anchor name from an anchor reference.
*
* Note that the need for named anchors is somewhat diminished now that I automatically generate IDs for
* all heading tags (eg, <h1>); refer to the generateID() function that's used in convertMDBlocks().
*
* Another extension to Markdown that I've added is detecting empty parentheses alongside a likely URL,
* and automatically converting it to a link; eg:
*
* [http://www.ascii-code.com/]()
*
* Also, if a URL contains any asterisks, we replace them with the current version number from "package.json".
*
* I prefer this solution over GFM's "autolinking" solution, which is too "loosey-goosey" for my taste
* (see https://help.github.com/articles/github-flavored-markdown#url-autolinking).
*
* TODO: Consider adding support for "reference"-style Markdown links.
*
* @this {MarkOut}
* @param {string} sBlock
* @return {string}
*/
MarkOut.prototype.convertMDLinks = function(sBlock)
{
var aMatch;
var re = /\[([^\[\]]*)]\((.*?)(?:\s*"(.*?)"\)|\))/g;
while ((aMatch = re.exec(sBlock))) {
var sTag = "a";
var sType = "href";
var sText = aMatch[1];
var sURL = aMatch[2];
var sTitle = (aMatch[3]? ' title="' + aMatch[3] + '"' : '');
if (!sURL) { // if the parentheses are empty and the text (kinda) looks like a URL, use the text as the URL, too
if (sText.match(/^[a-z]+:/) || sText.match(/^\/(.*)\/$/)) {
sURL = sText;
} else if (sText.match(/(^www\.|\.com|\.org|\.net|\.io)/)) {
sURL = "http://" + sText;
} else if (sText.indexOf(' ') < 0 && sText.indexOf('.') > 0) {
sURL = sText; // we assume you're trying to automatically link to a filename
}
}
sURL = sURL.replace(/\*/g, pkg.version);
if (sURL.charAt(0) == '#') {
sTag = "span"; // using <a> to name an anchor is deprecated
sType = "id"; // using the "name" attribute is deprecated as well
sURL = sURL.substr(1);
} else {
sURL = net.encodeURL(sURL, this.req, this.fDebug);
}
sBlock = str.replaceAll(aMatch[0], '<' + sTag + ' ' + sType + '="' + sURL + '"' + sTitle + '>' + sText + '</' + sTag + '>', sBlock);
}
return sBlock;
};
/**
* convertMDImageLinks(sBlock)
*
* @this {MarkOut}
* @param {string} sBlock
* @param {string} sIndent
* @return {string}
*/
MarkOut.prototype.convertMDImageLinks = function(sBlock, sIndent)
{
/*
* Look for image links of the form  and convert them. We do this before processing non-image
* ("normal") links, since the only difference in syntax is the presence of a preceding exclamation point (!).
*
* We also extend the syntax a bit, by allowing the optional title string inside the parentheses to include
* a special "link:" prefix; if that prefix is present, we will wrap the image with the URL following that prefix,
* and then wrap THAT with the special image classes, if any, that we were given at initialization.
*/
var aMatch;
var cImageLinks = 0;
var fNoGallery = false;
var sBlockOrig = sBlock;
var re = /!\[(.*?)]\((.*?)(?:\s*"(.*?)"\)|\))/g;
while ((aMatch = re.exec(sBlockOrig))) {
var sImage = '<img src="' + net.encodeURL(aMatch[2], this.req, this.fDebug) + '" alt="' + aMatch[1] + '"';
if (aMatch[3]) {
/*
* The format of the special "link:" syntax is:
*
* link:url[:width[:height]]
*
* If "link:" is specified, a URL is required, but image width and height are optional.
*
* Alternatively:
*
* link:url:nogallery[:width[:height]]
*
* to disable the automatic "gallery-ification" of image links (an optional width and height
* can still follow).
*/
var iPart = 0;
var asParts = aMatch[3].split(':');
if (asParts[iPart++] == "link") {
var sURL = asParts[iPart++];
if ((sURL == "http" || sURL == "https" || sURL == "ftp") && asParts[iPart]) {
sURL += ':' + asParts[iPart];
asParts.splice(2, 1);
}
/*
* If the image link (aMatch[2]) contains "static/" but the sURL is external, AND we're in
* "reveal mode", then transform sURL into a "static/" URL as well; encodeURL() will take care
* of the rest of the transformation.
*
* This feature is used with READMEs like /pubs/pc/programming/README.md, where normally we
* want to link to documents stored on sites like archive.org, minuszerodegrees.net or bitsavers,
* unless you're in "reveal mode", in which case we'll serve up our own "backup copies".
*
* The assumption here is that if we have "static" thumbs, then we should also have full "static"
* copies as well.
*/
if (aMatch[2].indexOf("static/") >= 0 && sURL.indexOf("://") > 0 && (this.fDebug || net.hasParm(net.REVEAL_COMMAND, net.REVEAL_PDFS, this.req))) {
sURL = aMatch[2].replace("/thumbs/", "/").replace(" 1.jpeg", ".pdf").replace(".jpg", ".pdf");
}
sURL = net.encodeURL(sURL, this.req, this.fDebug);
if (asParts[iPart] == "nogallery") {
fNoGallery = true;
iPart++;
}
this.addIndent(sIndent);
var sID = this.generateID(aMatch[1]);
sID = (sID? (' id="' + sID + '"') : "");
var sImageLink = this.sIndent + '<div' + sID + ' class="' + this.sClassImageFrame + '">\n';
this.addIndent(sIndent);
sImageLink += this.sIndent + '<div class="' + this.sClassImageLink + '">\n';
this.addIndent(sIndent);
sImageLink += this.sIndent + (sURL? '<a href="' + sURL + '">' : '') + sImage;
if (asParts[iPart]) {
sImageLink += ' width="' + asParts[iPart++] + '"';
}
if (asParts[iPart]) {
sImageLink += ' height="' + asParts[iPart++] + '"';
}
sImageLink += "/>" + (sURL? "</a>" : "");
this.subIndent(sIndent);
sImageLink += this.sIndent + '</div>\n';
sImageLink += this.sIndent + '<span class="' + this.sClassImageLabel + '">' + aMatch[1] + '</span>\n';
this.subIndent(sIndent);
sImageLink += this.sIndent + '</div>';
this.subIndent(sIndent);
sImage = sImageLink;
cImageLinks++;
} else {
sImage += ' title="' + aMatch[3] + '"/>';
}
} else {
sImage += '/>';
}
sBlock = sBlock.replace(aMatch[0], sImage);
}
if (cImageLinks && !fNoGallery) {
sBlock = sBlock.replace(/^<p>([\s\S]*)<\/p>$/g, '<div class="' + this.sClassImageGallery + '">\n$1\n' + this.sIndent + '</div>');
}
return sBlock;
};
/**
* convertMDMachineLinks(sBlock)
*
* @this {MarkOut}
* @param {string} sBlock
* @return {string}
*/
MarkOut.prototype.convertMDMachineLinks = function(sBlock)
{
/*
* Before we call convertMDLinks() to process any normal Markdown-style links, we first
* look for our own special flavor of "machine" Markdown links; ie:
*
* [IBM PC](/devices/pc/machine/5150/mda/64kb/ "PCjs:demoPC:stylesheet:version:options:state")
*
* where a special title attribute triggers generation of an embedded machine rather than
* a link. Use "PCjs" or "C1Pjs" to automatically include the latest version of either
* "pc.js" or "c1p.js", followed by a colon and the ID you want to use for the embedded <div>.
* If you need to use the script with the built-in Debugger (ie, either "pc-dbg.js" or
* "c1p-dbg.js"), then include "debugger" in the list of comma-delimited options, as in:
*
* [IBM PC](/devices/pc/machine/5150/mda/64kb/ "PCjs:demoPC:::debugger")
*
* If the link ends with a slash, then it's an implied reference to a "machine.xml".
*
* Granted, there are a number of things we could be smarter about. First, you probably
* don't care about the ID for the <div>; it's purely a mechanism for telling the script
* where to embed the machine, so we could auto-generate an ID for you, but on the other hand,
* there might actually be situations where you want to style the machine a certain way, or
* interact with it from another script, so having a known ID can be a good thing.
*
* Second, if we know we're running on the same server as the machine XML file in the link,
* we could crack that file open right now, see if it includes a <debugger>, and automatically
* include the appropriate script, without requiring the user to specify that. And in fact,
* that's exactly what the "machine.xsl" stylesheet does: it calls componentScripts() with the
* appropriate script based on the presence of a <debugger> element in the XML file. That's
* similar to what getMachineXML() in htmlout.js does, when it's loading a "machine.xml".
*
* We don't have the XML file open here, and I don't think it's worth the hit to open it.
* Besides, the XML config file isn't necessarily on the same server (although whenever this
* script is being used, it very likely is).
*
* TODO: Consider cracking open the XML file anyway, even though the Markdown module is supposed
* to be non-blocking; I'd like to be smarter about defaults (eg, specifying "debugger" when the
* XML file clearly needs it).
*/
var aMatch;
var cMatches = 0;
var reMachines = /\[(.*?)]\((.*?)\s*"(PC|C1P)js:(.*?)"\)/gi;
while ((aMatch = reMachines.exec(sBlock))) {
var sMachineXMLFile = aMatch[2];
if (sMachineXMLFile.slice(-1) == "/") sMachineXMLFile += "machine.xml";
var sMachine = aMatch[3].toUpperCase();
var sMachineFunc = "embed" + sMachine;
var sMachineClass = sMachine.toLowerCase();
var aMachineParms = aMatch[4].split(':');
var sMachineMessage = "Waiting for " + sMachine + "js to load";
var sMachineID = aMachineParms[0];
var sMachineXSLFile = aMachineParms[1] || "";
var sMachineVersion = aMachineParms[2] || this.sMachineVersion;
var sMachineOptions = aMachineParms[3] || "";
var sMachineState = aMachineParms[4] || "";
var aMachineOptions = sMachineOptions.split(',');
var fDebugger = (aMachineOptions.indexOf("debugger") >= 0);
/*
* TODO: Consider validating the existence of this XML file and generating a more meaningful error if not found
*/
var sReplacement = '<div id="' + sMachineID + '" class="machine-placeholder"><p>' + aMatch[1] + '</p><p class="machine-warning">' + sMachineMessage + '</p></div>\n';
/*
* The embedPC()/embedC1P functions take an XSL file as the 3rd parameter, which defaults to:
*
* "/versions/" + APPCLASS + "/" + APPVERSION + "/components.xsl"
*
* However, when debugging, I'd prefer to use the "development" version of components.xsl, rather than the default
* "production" version.
*/
if (!sMachineXSLFile || sMachineXSLFile.indexOf("components.xsl") >= 0) {
if (this.fDebug) {
sMachineXSLFile = "/modules/" + sMachineClass + "js/templates/components.xsl";
}
}
/*
* Now that we're providing all of the following machine information to addMachine(), we don't
* need to install the machine embed code here; processMachines() in HTMLOut will take care of that now.
*
sReplacement += this.sIndent + '<script type="text/javascript">\n' + this.sIndent + 'window.' + sMachineFunc + '("' + sMachineID + '","' + sMachineXMLFile + '","' + sMachineXSLFile + '");\n' + this.sIndent + '</script>';
*/
sBlock = sBlock.replace(aMatch[0], sReplacement);
reMachines.lastIndex = 0; // reset lastIndex, since we just modified the string that reMachines is iterating over
cMatches++;
this.addMachine({
'class': sMachineClass, // eg, a machine class, such as "pc" or "c1p"
'func': sMachineFunc,
'id': sMachineID,
'xml': sMachineXMLFile,
'xsl': sMachineXSLFile,
'version': sMachineVersion, // eg, "1.10", "*" to select the current version, or "uncompiled"; "*" is the default
'debugger': fDebugger, // eg, true or false; false is the default
'state': sMachineState}
);
}
if (cMatches) {
sBlock = sBlock.replace(/^<p>([\s\S]*)<\/p>$/g, "$1");
}
return sBlock;
};
/**
* convertMDEmphasis(sBlock)
*
* We look for sequences like **strength**, __strength__, *emphasis* and _emphasis_;
* we convert the stronger (double-character) forms first, followed by the weaker
* (single-character) forms, since we don't want to misconstrue the former as containing
* the latter.
*
* Also, standard Markdown says that "if you surround an * or _ with spaces, it’ll be
* treated as a literal asterisk or underscore." Well, we don't. You can already escape
* special characters with a backslash to make them literal, so I don't feel like
* complicating the RegExps below to accommodate a syntax I don't use or want to support.
*
* Also, for reasons noted in the code below, we don't support emphasis in the middle
* of words.
*
* @this {MarkOut}
* @param {string} sBlock
* @return {string}
*/
MarkOut.prototype.convertMDEmphasis = function(sBlock)
{
/*
* Standard Markdown allows * or _ in the middle of a word, as in:
*
* un*frigging*believable
*
* but we do not. That's because a Markdown link like:
*
* [modules](/modules/)
*
* would otherwise be misconstrued as containing emphasis (and it doesn't
* matter whether we process emphasis BEFORE or AFTER links -- an HTML link
* poses the same problem as a Markdown link).
*
* To resolve this, I require something non-alphanumeric to both precede AND
* follow the emphasis characters. I would expect that "something" to normally
* be whitespace, but we make it a bit more flexible, so that you can do things
* like place emphasis INSIDE links:
*
* [*modules*](/modules/)
*
* or OUTSIDE links:
*
* *[modules](/modules/)*
*/
if (sBlock.indexOf('*') >= 0 || sBlock.indexOf('_') >= 0) {
sBlock = sBlock.replace(/(^|[^a-z0-9])([\*_])\2([\s\S]*?)\2\2([^a-z0-9]|$)/gi, "$1<strong>$3</strong>$4");
sBlock = sBlock.replace(/(^|[^a-z0-9])([\*_])([\s\S]*?)\2([^a-z0-9]|$)/gi, "$1<em>$3</em>$4");
}
return sBlock;
};
/**
* addIndent(sIndent)
*
* @this {MarkOut}
* @param {string|undefined} sIndent
* @return {string} previous indent
*/
MarkOut.prototype.addIndent = function(sIndent)
{
var sIndentPrev = this.sIndent;
this.sIndent += (sIndent || "");
return sIndentPrev;
};
/**
* subIndent(sIndent)
*
* @this {MarkOut}
* @param {string|undefined} sIndent
*/
MarkOut.prototype.subIndent = function(sIndent)
{
if (sIndent) {
var cch = this.sIndent.length - sIndent.length;
if (cch < 0) {
MarkOut.logError(new Error("indentation underflow"), true);
cch = 0;
}
this.sIndent = this.sIndent.substr(0, cch);
}
};
/**
* encodeComment(sLabel, sText)
*
* This is used purely (at the moment) for debugging purposes, so that we can clearly see
* what our simplistic Markdown parser is parsing at each stage.
*
* @this {MarkOut}
* @param {string} sLabel
* @param {string} sText
* @return {string}
*
MarkOut.prototype.encodeComment = function(sLabel, sText)
{
return '<!-- ' + sLabel + '("' + this.encodeWhitespace(sText) + '") -->\n';
};
*/
/**
* encodeWhitespace(sText)
*
* This is used purely (at the moment) for debugging purposes, so that we can clearly see
* what our simplistic Markdown parser is parsing at each stage.
*
* @this {MarkOut}
* @param {string} sText
* @return {string}
*
MarkOut.prototype.encodeWhitespace = function(sText)
{
return str.replaceArray({" ":".", "\t":"\\t", "\n":"\\n"}, sText);
};
*/
module.exports = MarkOut;
MarkOut === This modules transforms a subset of Markdown into HTML. It's used by the [HTMLOut](../htmlout) module to process README.md files and incorporate their contents into the "index.html" files that we generate when browsing directories.
{
"name": "markout",
"version": "0.1.0",
"description": "Transforms simplified Markdown to HTML",
"main": "./lib/markout",
"scripts": {
"test": "echo \"error: no test specified\" && exit 1"
},
"author": "Jeff Parsons <Jeff@pcjs.org>",
"licenses": [
{
"type": "GPLv3",
"url": "http://www.gnu.org/licenses/gpl.html"
}
],
"bin": {
"example": "./bin/markout"
}
}
{
"globalstrict": true,
"sub": true,
"globals": {
"global": true,
"console": true,
"module": true,
"require": true
}
}
/**
* @fileoverview This file tests raw floating point access using typed arrays.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2014-Aug-20
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
try {
/*
* If Node is running us, this will succeed, and we'll have a print()
* function (an alias for console.log). If JSC is running us instead,
* then this will fail (there is neither a global NOR a console object),
* but that's OK, because print() is a built-in function.
*
* TODO: Find a cleaner way of doing this, and while you're at it, alias
* Node's process.argv to JSC's "arguments" array, and Node's process.exit()
* to JSC's quit().
*
* UPDATE: Node *must* be used to run this test, because JSC's support for
* typed arrays is incomplete.
*/
var print = console.log;
} catch(err) {}
function toHex(v, len) {
var s = "00000000" + v.toString(16);
return "0x" + s.slice(s.length - (!len? 8 : (len < 8? len : 8))).toUpperCase();
}
var f = 3.4;
var af = new Float64Array(1);
af.set([f]); // the optional offset defaults to zero
var dv = new DataView(af.buffer);
var dw1 = dv.getUint32(0);
var dw2 = dv.getUint32(4);
print(f + " = " + toHex(dw1) + "," + toHex(dw2));
{
"computer": {
"id": "ibm5150.pc-mda-64k",
"name": "IBM PC",
"resume": "1",
"state": ""
},
"ram": [
{ "id": "ibm5150.ramLow",
"name": "",
"addr": 0x00000,
"size": 0,
"test": true
}
],
"rom": [
{ "id": "ibm5150.romBASIC",
"name": "",
"addr": 0xf6000,
"size": 0x08000,
"file": "/devices/pc/basic/ibm-basic-1.00.json",
"notify": ""
},
{ "id": "ibm5150.romBIOS",
"name": "",
"addr": 0xfe000,
"size": 0x02000,
"file": "/devices/pc/bios/5150/1981-04-24.json",
"notify": ""
}
],
"video": [
{ "id": "ibm5150.videoMDA",
"name": "Monochrome Display",
"model": "",
"mode": 7,
"screenWidth": 720,
"screenHeight": 350,
"scale": true,
"charCols": 80,
"charRows": 25,
"fontROM": "/devices/pc/video/ibm/mda/ibm-mda.json",
"screenColor": "black",
"touchScreen": false
}
],
"cpu": {
"id": "ibm5150.cpu8088",
"name": "",
"model": 8088,
"clock": 0,
"multiplier": 1,
"autoStart": true,
"csStart": -1,
"csInterval": -1,
"csStop": -1
},
"keyboard": {
"id": "ibm5150.keyboard",
"name": "",
"model": ""
},
"fdc": {
"id": "ibm5150.fdcNEC",
"name": "",
"autoMount": {
"A": {
"name": "PC-DOS 2.00 (Disk 1)",
"path": "/disks/pc/dos/ibm/2.00/PCDOS200-DISK1.json"
},
"B": {
"name": "PC-DOS 2.00 (Disk 2)",
"path": "/disks/pc/dos/ibm/2.00/PCDOS200-DISK2.json"
}
}
},
"chipset": {
"id": "ibm5150.chipset",
"name": "",
"model": "5150",
"sw1": "01000001",
"sw2": "11110000",
"sound": true
},
"debugger": {
"id": "ibm5150.debugger",
"name": "",
"messages": ""
},
"xml": "/devices/pc/machine/5150/mda/64kb/machine.xml"
}
#!/usr/bin/env node
/**
* @fileoverview Implements the PCjs command-line interface
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* @suppress {missingProperties}
* Created 2012-Sep-04
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
var path = require("path");
var fs = require("fs");
var repl = require("repl");
var str = require("../../shared/lib/strlib");
var proc = require("../../shared/lib/proclib");
var fConsole = false;
var fDebug = false;
var args = proc.getArgs();
var argv = args.argv;
var sCmdPrev = "";
if (argv['console'] !== undefined) fConsole = argv['console'];
if (argv['debug'] !== undefined) fDebug = argv['debug'];
var lib = path.join(path.dirname(fs.realpathSync(__filename)), "../lib/");
try {
var pkg = require(lib + "../../../package.json");
} catch(err) {
console.log(err.message);
}
/*
* We will build an array of components whose names will match the component names
* used in a JSON machine definition file; eg:
*
* [
* {name: "panel",
* Create: Panel,
* objects: []
* },
* {name: "chipset":
* Create: ChipSet,
* objects: []
* },
* ...
* ]
*
* Every component name comes from the component filename, minus the ".js" extension;
* Create is the constructor returned by require(). The only bit of fudging we do is
* overriding the constructor for component "cpu" with the constructor for "x86cpu",
* because when a "cpu" definition is encountered, it's the "x86cpu" subclass that we
* actually want to create, not the "cpu" superclass.
*
* TODO: Update the list of ignored (ie, ignorable) components.
*/
var Component;
var dbg;
var aComponents = [];
var asComponentsIgnore = ["embed"];
/**
* loadComponents(asFiles)
*
* @param {Array.<string>} asFiles
*/
function loadComponents(asFiles)
{
for (var i = 0; i < asFiles.length; i++) {
var sFile = asFiles[i];
if (str.getExtension(sFile) != "js") continue;
var sName = str.getBaseName(sFile, true);
if (asComponentsIgnore.indexOf(sName) >= 0) continue;
if (fDebug) console.log(sFile);
try {
/*
* We COULD load ("require") all the files on-demand, because it's only the
* browser initialization sequence we want to mimic in loadMachine(), but this
* is simpler, and it also gives us direct references to certain components
* we'll want to access later (eg, "component" in getComponentByType()).
*/
var fn = require(lib + "../../../" + sFile);
if (sName == "x86cpu") {
for (var j = 0; j < aComponents.length; j++) {
if (aComponents[j].name == "cpu") {
aComponents[j].Create = fn;
sName = null;
break;
}
}
}
if (sName == "component") {
fn.log = fn.println = function(s, type) {
console.log((type !== undefined? (type + ": ") : "") + (s || ""));
}; // jshint ignore:line
}
if (sName) {
aComponents.push({name: sName, Create: fn, objects: []});
}
if (sName == "defines") {
/*
* Enabling component console messages requires setting CONSOLE to true.
*/
if (global.DEBUG !== undefined) {
global.DEBUG = fDebug;
global.CONSOLE = fConsole;
}
}
} catch(err) {
console.log(err.message);
}
}
}
/**
* getComponentByName(sName)
*
* @param sName
* @return {*}
*/
function getComponentByName(sName)
{
for (var i = 0; i < aComponents.length; i++) {
if (aComponents[i].name == sName) {
return aComponents[i].Create;
}
}
return null;
}
/**
* getComponentByType(sType)
*
* @param sType
* @return {*}
*/
function getComponentByType(sType)
{
var component = null;
if (!Component) {
Component = getComponentByName("component");
}
if (Component) {
component = Component.getComponentByType(sType);
}
return component;
}
/**
* loadMachine(sFile)
*
* @param {string} sFile
* @return {Object} representing the machine whose component objects have been loaded into aComponents
*/
function loadMachine(sFile)
{
if (fDebug) console.log('loadMachine("' + sFile + '")');
/*
* Clear any/all saved objects from any previous machine
*/
var i, j;
Component = dbg = null;
for (i = 0; i < aComponents.length; i++) {
aComponents[i].objects = [];
}
var machine;
try {
/*
* Since our JSON files may contain comments, hex values, and/or other tokens deemed
* unacceptable by the JSON Overlords, we can't use require() to load it, as we're able to
* do with "package.json". Also note that require() assumes the same path as that of the
* requiring file, whereas fs.readFileSync() assumes the path reported by process.cwd().
*
* TODO: I've since removed the comments from my sample "ibm5150.json" file, so we could
* try to reinstate this code; however, there are still hex constants, which I find *much*
* preferable to the decimal equivalents. JSON's restrictions continue to infuriate me.
*
* var machine = require(lib + "../bin/" +sFile);
*/
var sMachine = fs.readFileSync(sFile, {encoding: "utf8"});
sMachine = '(' + sMachine + ')';
if (fDebug) console.log(sMachine);
machine = eval(sMachine); // jshint ignore:line
if (machine) {
/*
* Since we have a machine object, we now mimic the initialization sequence that occurs
* in the browser, by walking the list of PCjs components we loaded above and looking for
* matches.
*/
for (i = 0; i < aComponents.length; i++) {
var parms = machine[aComponents[i].name];
/*
* If parms is undefined, it means there is no component with that name defined in the
* machine object (NOT that the component has no parms), and therefore we should skip it.
*/
if (parms === undefined) continue;
/*
* If parms is an Array, then we must create an object for each parms element; and yes,
* I'm relying on the fact that none of my parm objects use a "length" property, as a quick
* and dirty way of differentiating objects from arrays.
*/
var aParms = parms.length !== undefined? parms : [parms];
for (j = 0; j < aParms.length; j++) {
var obj;
if (fDebug) console.log("creating " + aComponents[i].name + "...");
if (fDebug) console.log(aParms[j]);
if (aComponents[i].name == "cpu") {
aParms[j]['autoStart'] = false;
}
try {
obj = new aComponents[i].Create(aParms[j]);
} catch(err) {
console.log("error creating " + aComponents[i].name + ": " + err.message);
continue;
}
console.log(obj['id'] + " object created");
aComponents[i].objects.push(obj);
if (obj.type == "Debugger") {
dbg = obj;
}
}
}
/*
* Return the original machine object only in DEBUG mode
*/
if (!fDebug) machine = true;
}
} catch(err) {
console.log(err.message);
}
return machine;
}
/**
* doCommand(sCmd)
*
* @param {string} sCmd
* @return {*}
*/
function doCommand(sCmd)
{
if (!sCmd) {
sCmd = sCmdPrev;
} else {
sCmdPrev = sCmd;
}
var result = false;
var aTokens = sCmd.split(' ');
switch(aTokens[0]) {
case "cwd":
result = process.cwd();
break;
case "load":
result = loadMachine(aTokens[1]);
break;
case "quit":
process.exit();
result = true;
break;
default:
if (sCmd) {
try {
if (dbg && !dbg.doCommand(sCmd, true)) {
sCmd = '(' + sCmd + ')';
result = eval(sCmd); // jshint ignore:line
}
} catch(err) {
console.log(err.message);
}
}
break;
}
return result;
}
/**
* onCommand(cmd, context, filename, callback)
*
* The Node docs (http://nodejs.org/api/repl.html) say that repl.start's "eval" option is:
*
* a function that will be used to eval each given line; defaults to an async wrapper for eval()
*
* and it gives this example of such a function:
*
* function eval(cmd, context, filename, callback) {
* callback(null, result);
* }
*
* but it defines NEITHER the parameters for the function NOR the parameters for the callback().
*
* It's pretty clear that "result" is expected to return whatever "eval()" would return for the expression
* in "cmd" (which is always parenthesized in preparation for a call to "eval()"), but it's not clear what
* the first callback() parameter (represented by null) is supposed to be. Should we assume it's an Error
* object, in case we want to report an error?
*
* @param {string} cmd
* @param {Object} context
* @param {string} filename
* @param {function(Object|null, Object)} callback
*/
var onCommand = function (cmd, context, filename, callback)
{
var result = false;
/*
* WARNING: After updating from Node v0.10.x to v0.11.x, the incoming expression in "cmd" is no longer
* parenthesized, so I had to tweak the RegExp below. But... WTF. Do we not care what we break, folks?
*/
var match = cmd.match(/^\(?\s*(.*?)\s*\)?$/);
if (match) result = doCommand(match[1]);
callback(null, result);
};
if (pkg) {
loadComponents(pkg.pcJSFiles);
}
/*
* Before falling into the REPL, process any command-line (--cmd) commands -- which should eventually include batch files.
*/
if (argv['cmd'] !== undefined) {
var cmds = argv['cmd'];
var aCmds = (typeof cmds == "string"? [cmds] : cmds);
for (var i = 0; i < aCmds.length; i++) {
doCommand(aCmds[i]);
}
sCmdPrev = "";
}
repl.start({
prompt: "PCjs> ",
input: process.stdin,
output: process.stdout,
eval: onCommand
});
{
"computer": {
"id": "pc386.computer",
"name": "Compaq DeskPro 386",
"resume": 0,
"state": "",
"busWidth": 32
},
"ram": [
{ "id": "pc386.ramLow",
"name": "",
"addr": 0,
"size": 655360,
"test": false
}
],
"rom": [
{ "id": "pc386.romTests",
"name": "",
"addr": 983296,
"size": 65280,
"alias": 4294902016,
"file": "/tests/pc/80386/tests.json",
"notify": ""
}
],
"video": [
{ "id": "pc386.videoMDA",
"name": "Monochrome Display",
"model": "",
"mode": 7,
"screenWidth": 720,
"screenHeight": 350,
"scale": true,
"charCols": 80,
"charRows": 25,
"fontROM": "/devices/pc/video/ibm/mda/ibm-mda.json",
"screenColor": "black",
"touchScreen": false
}
],
"cpu": {
"id": "pc386.cpu",
"name": "",
"model": 80386,
"clock": 0,
"multiplier": 1,
"autoStart": true,
"csStart": -1,
"csInterval": -1,
"csStop": -1
},
"keyboard": {
"id": "pc386.keyboard",
"name": "",
"model": ""
},
"fdc": {
"id": "pc386.fdcNEC",
"name": "",
"autoMount": {
"A": {
"name": "PC-DOS 2.00 (Disk 1)",
"path": "/disks/pc/dos/ibm/2.00/PCDOS200-DISK1.json"
},
"B": {
"name": "PC-DOS 2.00 (Disk 2)",
"path": "/disks/pc/dos/ibm/2.00/PCDOS200-DISK2.json"
}
}
},
"chipset": {
"id": "pc386.chipset",
"name": "",
"model": "deskpro386",
"sound": false
},
"debugger": {
"id": "pc386.debugger",
"name": "",
"commands": "",
"messages": ""
}
}
/**
* @fileoverview This file generates PCjs 8086 mode-byte decoders.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-Sep-08
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
try {
/*
* If Node is running us, this will succeed, and we'll have a print()
* function (an alias for console.log). If JSC is running us instead,
* then this will fail (there is neither a global NOR a console object),
* but that's OK, because print() is a built-in function.
*
* TODO: Find a cleaner way of doing this, and while you're at it, alias
* Node's process.argv to JSC's "arguments" array, and Node's process.exit()
* to JSC's quit().
*/
var print = console.log;
} catch(err) {}
/*
* I'm going to start by creating 4 sets of "mod,reg,r/m" aka OpMod tables:
*
* Set 0: mod,r/m is dst, size is byte, dispatch table is aOpModMemByte
* Set 1: mod,r/m is dst, size is word, dispatch table is aOpModMemWord
* Set 2: reg is dst, size is byte, dispatch table is aOpModRegByte
* Set 3: reg is dst, size is word, dispatch table is aOpModRegWord
*
* See p. 3-41 of "The 8086 Book" for more details.
*/
var f16Only = true;
var aDst = ["Mem", "Reg"];
var aSize = ["Byte", "Word"];
var aOpPrefix = ["B", "W"];
var aAddrPrefix = [f16Only? "" : "16", "32"];
var aDisp = ["8", "16"];
/*
* Index aREG like so: aREG[w][reg]
*/
var aREG = [
["AL", "CL", "DL", "BL", "AH", "CH", "DH", "BH"],
["AX", "CX", "DX", "BX", "SP", "BP", "SI", "DI"]
];
var w, sError = "";
var fGenMods = true;
var sEAFuncs = "";
var aBase = ["EAX", "ECX", "EDX", "EBX", "ESP", "EBP", "ESI", "EDI"];
var aIndex = ["EAX", "ECX", "EDX", "EBX", "none", "EBP", "ESI", "EDI"];
if (!fGenMods) {
var sOps = "", cOps = 0;
for (var op = 0x00; op <= 0xFF; op++) {
var i, iReg, sOp, sOpCode, sOperator, sDst, sDstReg;
if (op >= 0x40 && op <= 0x4F) {
i = op - 0x40;
iReg = i % 8;
sOpCode = (op < 0x48? "INC" : "DEC");
sOperator = (op < 0x48? "+" : "-");
sDst = aREG[1][iReg];
sDstReg = "this.reg." + aREG[1][iReg];
print(" /**");
print(" * @this {X86CPU}");
print(" *");
print(" * op=0x" + toHex(op, 2) + " (" + sOpCode.toLowerCase() + " " + sDst + ")");
print(" */");
sOp = "op" + sOpCode + sDst;
print(" " + sOp + ": function() {");
print(" " + sDstReg + " = (" + sDstReg + " " + sOperator + " 1) & 0xffff;");
print(" },");
if (sOps) sOps += ((cOps % 4)? ", " : ",\n");
sOps += " this." + sOp;
cOps++;
}
else if (op >= 0x50 && op <= 0x5F) {
i = op - 0x50;
iReg = i % 8;
sOpCode = (op < 0x58? "PUSH" : "POP");
sDst = aREG[1][iReg];
sDstReg = "this.reg." + aREG[1][iReg];
print(" /**");
print(" * @this {X86CPU}");
print(" *");
print(" * op=0x" + toHex(op, 2) + " (" + sOpCode.toLowerCase() + " " + sDst + ")");
print(" */");
sOp = "op" + sOpCode + sDst;
print(" " + sOp + ": function() {");
if (op < 0x58) {
print(" this.pushWord(" + sDstReg + ");");
}
else {
print(" " + sDstReg + " = this.popWord();");
}
print(" },");
if (sOps) sOps += ((cOps % 4)? ", " : ",\n");
sOps += " this." + sOp;
cOps++;
}
else if (op == 0x90) {
if (sOps) sOps += ((cOps % 4)? ", " : ",\n");
sOps += " this.opNOP";
cOps++;
}
else if (op >= 0x91 && op <= 0x97) {
i = op - 0x90;
iReg = i % 8;
sOpCode = "XCHG";
sDst = aREG[1][iReg];
sDstReg = "this.reg." + aREG[1][iReg];
print(" /**");
print(" * @this {X86CPU}");
print(" *");
print(" * op=0x" + toHex(op, 2) + " (" + sOpCode.toLowerCase() + " EAX," + sDst + ")");
print(" */");
sOp = "op" + sOpCode + sDst;
print(" " + sOp + ": function() {");
print(" var temp = this.regEAX; this.regEAX = " + sDstReg + "; " + sDstReg + " = temp;");
print(" },");
if (sOps) sOps += ((cOps % 4)? ", " : ",\n");
sOps += " this." + sOp;
cOps++;
}
else if (op >= 0xB0 && op <= 0xBF) {
i = op - 0xB0;
w = (i < 8? 0 : 1);
i = i % 8;
sDst = aREG[w][i].toLowerCase();
print(" /**");
print(" * @this {X86CPU}");
print(" *");
print(" * op=0x" + toHex(op, 2) + " (mov " + aREG[w][i] + "," + aSize[w].toLowerCase() + ")");
print(" */");
sOp = "opMOV" + aREG[w][i] + aDisp[w];
print(" " + sOp + ": function() {");
var sRegSet = "", sRegSetEnd = null;
if (w == 1) {
sRegSet = "this.reg" + aREG[1][i] + " = ";
}
else {
if (i < 4) {
sRegSet = "this.reg" + aREG[1][i] + " = (this.reg" + aREG[1][i] + " & ~0xff) | ";
}
else {
sRegSet = "this.reg" + aREG[1][i - 4] + " = (this.reg" + aREG[1][i - 4] + " & 0xff) | ";
sRegSetEnd = " << 8";
}
}
print(" " + sRegSet + (sRegSetEnd? "(" : "") + "this.getIP" + aSize[w] + "()" + (sRegSetEnd? (sRegSetEnd + ")") : "") + ";");
print(" },");
if (sOps) sOps += ((cOps % 4)? ", " : ",\n");
sOps += " this." + sOp;
cOps++;
}
}
}
else {
/*
* Index aMOD like so: aMOD[mod]
*/
var aMOD = ["mem", "mem+d8", "mem+d16", "reg"];
/*
* Index aRM like so: aRM[a][mod][w][r_m], forcing w to 0 unless mod is 3
*/
var aRM = [
[
[["BX+SI", "BX+DI", "BP+SI", "BP+DI", "SI", "DI", "d16", "BX"], []],
[["BX+SI+d8", "BX+DI+d8", "BP+SI+d8", "BP+DI+d8", "SI+d8", "DI+d8", "BP+d8", "BX+d8"], []],
[["BX+SI+d16", "BX+DI+d16", "BP+SI+d16", "BP+DI+d16", "SI+d16", "DI+d16", "BP+d16", "BX+d16"], []],
[["AL", "CL", "DL", "BL", "AH", "CH", "DH", "BH"], ["AX", "CX", "DX", "BX", "SP", "BP", "SI", "DI"]]
],[
[["EAX", "ECX", "EDX", "EBX", "sib", "d32", "ESI", "EDI"], []],
[["EAX+d8", "ECX+d8", "EDX+d8", "EBX+d8", "sib+d8", "EBP+d8", "ESI+d8", "EDI+d8"], []],
[["EAX+d32", "ECX+d32", "EDX+d32", "EBX+d32", "sib+d32", "EBP+d32", "ESI+d32", "EDI+d32"], []],
[["AL", "CL", "DL", "BL", "AH", "CH", "DH", "BH"], ["EAX", "ECX", "EDX", "EBX", "ESP", "EBP", "ESI", "EDI"]]
]
];
var cOpMods, mrm;
var sOpMods, sOpMod, sContainer;
print('"use strict";\n');
if (f16Only) {
print("var X86ModB = {};");
print("var X86ModW = {};\n");
} else {
print("var X86ModB16 = {};");
print("var X86ModW16 = {};");
print("var X86ModB32 = {};");
print("var X86ModW32 = {};\n");
}
for (var a = 0; a <= (f16Only? 0 : 1) && !sError; a++) {
for (w = 0; w <= 1 && !sError; w++) {
for (var d = 1; d >= 0 && !sError; d--) {
cOpMods = 0;
sOpMods = "";
sContainer = "X86Mod" + aOpPrefix[w] + aAddrPrefix[a] + ".aOpMod" + aDst[d];
print(sContainer + " = [");
for (mrm = 0x00; mrm <= 0xff && !sError; mrm++) {
sOpMod = genMode(a, d, w, mrm);
if (sOpMod) {
if (sOpMods) sOpMods += ((cOpMods % 4)? ", " : ",\n");
sOpMods += " " + sContainer + "." + sOpMod;
cOpMods++;
}
}
print("];\n");
}
cOpMods = 0;
sOpMods = "";
sContainer = "X86Mod" + aOpPrefix[w] + aAddrPrefix[a] + ".aOpModGrp";
print(sContainer + " = [");
for (mrm = 0x00; mrm <= 0xff && !sError; mrm++) {
sOpMod = genMode(a, 0, w, mrm, "Grp");
if (sOpMod) {
if (sOpMods) sOpMods += ((cOpMods % 4)? ", " : ",\n");
sOpMods += " " + sContainer + "." + sOpMod;
cOpMods++;
}
}
print("];\n");
}
}
if (!f16Only) {
sContainer = "X86ModSIB" + ".aOpModSIB";
print(sContainer + " = [");
for (var sib = 0x00; sib <= 0xff && !sError; sib++) {
genSIB(sib);
}
print("];\n");
}
if (sEAFuncs) {
print("var X86Mods = {\n" + sEAFuncs + "};\n");
}
}
function genSIB(sib) {
var scale = (sib >> 6);
var index = (sib >> 3) & 0x7;
var base = (sib & 0x7);
var sFunc = "opModSIB" + toHex(sib, 2);
print(" /**");
print(" * " + sFunc + "(): scale=" + toBin(scale, 2) + " (" + toHex(1 << scale, 1) + ") index=" + toBin(index, 3) + " (" + aIndex[index] + ") base=" + toBin(base, 3) + " (" + (base == 5? "mod? EBP : disp32)" : aBase[base] + ")"));
print(" *");
print(" * @this {X86CPU}");
print(" * @param {number} mod");
print(" */");
print(" function " + sFunc + "(mod) {");
var sMod = "this.reg" + aBase[base];
if (aBase[base] == "ESP" || aBase[base] == "EBP") {
if (base != 5) {
print(" this.segData = this.segStack;");
} else {
sMod = "((this.segData = this.segStack), " + sMod + ")";
}
}
var sBase = (base == 5? "(mod? " + sMod + " : this.getIPAddr())" : "this.reg" + aBase[base]);
if (index != 4) sBase += " + " + (scale? ("(this.reg" + aIndex[index] + " << " + scale + ")") : ("this.reg" + aIndex[index]));
print(" return " + sBase + ";");
print(" }" + (sib < 255? "," : ""));
}
function genMode(a, d, w, mrm, sGroup, sRO) {
var mod = (mrm >> 6);
var reg = (mrm >> 3) & 0x7;
var r_m = (mrm & 0x7);
var sRegGet = null;
var sRegSet = null;
var sRegSetBegin = "", sRegSetEnd = "";
var sRegBTLo = null, sRegBTHi = null;
if (!w) {
switch (reg) {
case 0:
sRegGet = "this.regEAX & 0xff";
sRegSet = "this.regEAX = (this.regEAX & ~0xff) | ";
sRegBTLo = "this.backTrack.btiAL";
break;
case 1:
sRegGet = "this.regECX & 0xff";
sRegSet = "this.regECX = (this.regECX & ~0xff) | ";
sRegBTLo = "this.backTrack.btiCL";
break;
case 2:
sRegGet = "this.regEDX & 0xff";
sRegSet = "this.regEDX = (this.regEDX & ~0xff) | ";
sRegBTLo = "this.backTrack.btiDL";
break;
case 3:
sRegGet = "this.regEBX & 0xff";
sRegSet = "this.regEBX = (this.regEBX & ~0xff) | ";
sRegBTLo = "this.backTrack.btiBL";
break;
case 4:
sRegGet = f16Only? "this.regEAX >> 8" : "(this.regEAX >> 8) & 0xff";
sRegSet = f16Only? "this.regEAX = (this.regEAX & 0xff) | " : "this.regEAX = (this.regEAX & ~0xff00) | ";
sRegSetEnd = " << 8";
sRegBTLo = "this.backTrack.btiAH";
break;
case 5:
sRegGet = f16Only? "this.regECX >> 8" : "(this.regECX >> 8) & 0xff";
sRegSet = f16Only? "this.regECX = (this.regECX & 0xff) | " : "this.regECX = (this.regECX & ~0xff00) | ";
sRegSetEnd = " << 8";
sRegBTLo = "this.backTrack.btiCH";
break;
case 6:
sRegGet = f16Only? "this.regEDX >> 8" : "(this.regEDX >> 8) & 0xff";
sRegSet = f16Only? "this.regEDX = (this.regEDX & 0xff) | " : "this.regEDX = (this.regEDX & ~0xff00) | ";
sRegSetEnd = " << 8";
sRegBTLo = "this.backTrack.btiDH";
break;
case 7:
sRegGet = f16Only? "this.regEBX >> 8" : "(this.regEBX >> 8) & 0xff";
sRegSet = f16Only? "this.regEBX = (this.regEBX & 0xff) | " : "this.regEBX = (this.regEBX & ~0xff00) | ";
sRegSetEnd = " << 8";
sRegBTLo = "this.backTrack.btiBH";
break;
default:
sError = "unrecognized w=0 reg: " + reg;
break;
}
}
else {
switch (reg) {
case 0:
sRegGet = f16Only? "this.regEAX" : "this.regEAX & this.dataMask";
sRegSet = f16Only? "" : "this.regEAX = (this.regEAX & ~this.dataMask) | ";
sRegBTLo = "this.backTrack.btiAL";
sRegBTHi = "this.backTrack.btiAH";
break;
case 1:
sRegGet = f16Only? "this.regECX" : "this.regECX & this.dataMask";
sRegSet = f16Only? "" : "this.regECX = (this.regECX & ~this.dataMask) | ";
sRegBTLo = "this.backTrack.btiCL";
sRegBTHi = "this.backTrack.btiCH";
break;
case 2:
sRegGet = f16Only? "this.regEDX" : "this.regEDX & this.dataMask";
sRegSet = f16Only? "" : "this.regEDX = (this.regEDX & ~this.dataMask) | ";
sRegBTLo = "this.backTrack.btiDL";
sRegBTHi = "this.backTrack.btiDH";
break;
case 3:
sRegGet = f16Only? "this.regEBX" : "this.regEBX & this.dataMask";
sRegSet = f16Only? "" : "this.regEBX = (this.regEBX & ~this.dataMask) | ";
sRegBTLo = "this.backTrack.btiBL";
sRegBTHi = "this.backTrack.btiBH";
break;
case 4:
sRegGet = f16Only? "this.regESP" : "this.regESP & this.dataMask";
sRegSet = f16Only? "" : "this.regESP = (this.regESP & ~this.dataMask) | ";
sRegBTLo = "X86.BACKTRACK.SP_LO";
sRegBTHi = "X86.BACKTRACK.SP_HI";
break;
case 5:
sRegGet = f16Only? "this.regEBP" : "this.regEBP & this.dataMask";
sRegSet = f16Only? "" : "this.regEBP = (this.regEBP & ~this.dataMask) | ";
sRegBTLo = "this.backTrack.btiBPLo";
sRegBTHi = "this.backTrack.btiBPHi";
break;
case 6:
sRegGet = f16Only? "this.regESI" : "this.regESI & this.dataMask";
sRegSet = f16Only? "" : "this.regESI = (this.regESI & ~this.dataMask) | ";
sRegBTLo = "this.backTrack.btiSILo";
sRegBTHi = "this.backTrack.btiSIHi";
break;
case 7:
sRegGet = f16Only? "this.regEDI" : "this.regEDI & this.dataMask";
sRegSet = f16Only? "" : "this.regEDI = (this.regEDI & ~this.dataMask) | ";
sRegBTLo = "this.backTrack.btiDILo";
sRegBTHi = "this.backTrack.btiDIHi";
break;
default:
sError = "unrecognized w=1 reg: " + reg;
break;
}
}
/*
* The 8086/8088 cycle counts below come from p.3-48 of "The 8086 Book", where it discusses EA
* ("effective address") calculations and the number of execution cycles required for each type
* of calculation.
*
*
*/
var fInline = true;
var nCycles = null;
var sModAddr = null;
var sModFunc = null;
var sModRegGet = null;
var sModRegSet = null;
var sModRegSetBegin = "", sModRegSetEnd = "";
var sModRegBTLo = null, sModRegBTHi = null;
var sModRegSeg = "Data";
if (!a) {
switch (mod) {
case 0:
switch (r_m) {
case 0:
sModAddr = "this.regEBX + this.regESI";
sModFunc = "BXSI";
nCycles = "this.cycleCounts.nEACyclesBaseIndex"; // 8086: 7
break;
case 1:
sModAddr = "this.regEBX + this.regEDI";
sModFunc = "BXDI";
nCycles = "this.cycleCounts.nEACyclesBaseIndexExtra"; // 8086: 8
break;
case 2:
sModAddr = "this.regEBP + this.regESI";
sModFunc = "BPSI";
sModRegSeg = "Stack";
nCycles = "this.cycleCounts.nEACyclesBaseIndexExtra"; // 8086: 8
break;
case 3:
sModAddr = "this.regEBP + this.regEDI";
sModFunc = "BPDI";
sModRegSeg = "Stack";
nCycles = "this.cycleCounts.nEACyclesBaseIndex"; // 8086: 7
break;
case 4:
sModAddr = "this.regESI";
sModFunc = "SI";
nCycles = "this.cycleCounts.nEACyclesBase"; // 8086: 5
break;
case 5:
sModAddr = "this.regEDI";
sModFunc = "DI";
nCycles = "this.cycleCounts.nEACyclesBase"; // 8086: 5
break;
case 6:
sModAddr = "this.getIPAddr()";
sModFunc = "D16";
nCycles = "this.cycleCounts.nEACyclesDisp"; // 8086: 6
break;
case 7:
sModAddr = "this.regEBX";
sModFunc = "BX";
nCycles = "this.cycleCounts.nEACyclesBase"; // 8086: 5
break;
default:
sError = "unrecognized mod=0 r/m: " + r_m;
break;
}
break;
case 1:
switch (r_m) {
case 0:
sModAddr = "this.regEBX + this.regESI + this.getIPDisp()";
sModFunc = "BXSID8";
nCycles = "this.cycleCounts.nEACyclesBaseIndexDisp"; // 8086: 11
break;
case 1:
sModAddr = "this.regEBX + this.regEDI + this.getIPDisp()";
sModFunc = "BXDID8";
nCycles = "this.cycleCounts.nEACyclesBaseIndexDispExtra"; // 8086: 12
break;
case 2:
sModAddr = "this.regEBP + this.regESI + this.getIPDisp()";
sModFunc = "BPSID8";
sModRegSeg = "Stack";
nCycles = "this.cycleCounts.nEACyclesBaseIndexDispExtra"; // 8086: 12
break;
case 3:
sModAddr = "this.regEBP + this.regEDI + this.getIPDisp()";
sModFunc = "BPDID8";
sModRegSeg = "Stack";
nCycles = "this.cycleCounts.nEACyclesBaseIndexDisp"; // 8086: 11
break;
case 4:
sModAddr = "this.regESI + this.getIPDisp()";
sModFunc = "SID8";
nCycles = "this.cycleCounts.nEACyclesBaseDisp"; // 8086: 9
break;
case 5:
sModAddr = "this.regEDI + this.getIPDisp()";
sModFunc = "DID8";
nCycles = "this.cycleCounts.nEACyclesBaseDisp"; // 8086: 9
break;
case 6:
sModAddr = "this.regEBP + this.getIPDisp()";
sModFunc = "BPD8";
sModRegSeg = "Stack";
nCycles = "this.cycleCounts.nEACyclesBaseDisp"; // 8086: 9
break;
case 7:
sModAddr = "this.regEBX + this.getIPDisp()";
sModFunc = "BXD8";
nCycles = "this.cycleCounts.nEACyclesBaseDisp"; // 8086: 9
break;
default:
sError = "unrecognized mod=1 r/m: " + r_m;
break;
}
break;
case 2:
switch (r_m) {
case 0:
sModAddr = "this.regEBX + this.regESI + this.getIPAddr()";
sModFunc = "BXSID16";
nCycles = "this.cycleCounts.nEACyclesBaseIndexDisp"; // 8086: 11
break;
case 1:
sModAddr = "this.regEBX + this.regEDI + this.getIPAddr()";
sModFunc = "BXDID16";
nCycles = "this.cycleCounts.nEACyclesBaseIndexDispExtra"; // 8086: 12
break;
case 2:
sModAddr = "this.regEBP + this.regESI + this.getIPAddr()";
sModFunc = "BPSID16";
sModRegSeg = "Stack";
nCycles = "this.cycleCounts.nEACyclesBaseIndexDispExtra"; // 8086: 12
break;
case 3:
sModAddr = "this.regEBP + this.regEDI + this.getIPAddr()";
sModFunc = "BPDID16";
sModRegSeg = "Stack";
nCycles = "this.cycleCounts.nEACyclesBaseIndexDisp"; // 8086: 11
break;
case 4:
sModAddr = "this.regESI + this.getIPAddr()";
sModFunc = "SID16";
nCycles = "this.cycleCounts.nEACyclesBaseDisp"; // 8086: 9
break;
case 5:
sModAddr = "this.regEDI + this.getIPAddr()";
sModFunc = "DID16";
nCycles = "this.cycleCounts.nEACyclesBaseDisp"; // 8086: 9
break;
case 6:
sModAddr = "this.regEBP + this.getIPAddr()";
sModFunc = "BPD16";
sModRegSeg = "Stack";
nCycles = "this.cycleCounts.nEACyclesBaseDisp"; // 8086: 9
break;
case 7:
sModAddr = "this.regEBX + this.getIPAddr()";
sModFunc = "BXD16";
nCycles = "this.cycleCounts.nEACyclesBaseDisp"; // 8086: 9
break;
default:
sError = "unrecognized mod=2 r/m: " + r_m;
break;
}
break;
case 3:
if (!w) {
switch (r_m) {
case 0:
sModRegGet = "this.regEAX & 0xff";
sModRegSet = "this.regEAX = (this.regEAX & ~0xff) | ";
sModRegBTLo = "this.backTrack.btiAL";
break;
case 1:
sModRegGet = "this.regECX & 0xff";
sModRegSet = "this.regECX = (this.regECX & ~0xff) | ";
sModRegBTLo = "this.backTrack.btiCL";
break;
case 2:
sModRegGet = "this.regEDX & 0xff";
sModRegSet = "this.regEDX = (this.regEDX & ~0xff) | ";
sModRegBTLo = "this.backTrack.btiDL";
break;
case 3:
sModRegGet = "this.regEBX & 0xff";
sModRegSet = "this.regEBX = (this.regEBX & ~0xff) | ";
sModRegBTLo = "this.backTrack.btiBL";
break;
case 4:
sModRegGet = f16Only? "(this.regEAX >> 8)" : "(this.regEAX >> 8) & 0xff";
sModRegSet = f16Only? "this.regEAX = (this.regEAX & 0xff) | " : "this.regEAX = (this.regEAX & ~0xff00) | ";
sModRegSetEnd = " << 8";
sModRegBTLo = "this.backTrack.btiAH";
break;
case 5:
sModRegGet = f16Only? "(this.regECX >> 8)" : "(this.regECX >> 8) & 0xff";
sModRegSet = f16Only? "this.regECX = (this.regECX & 0xff) | " : "this.regECX = (this.regECX & ~0xff00) | ";
sModRegSetEnd = " << 8";
sModRegBTLo = "this.backTrack.btiCH";
break;
case 6:
sModRegGet = f16Only? "(this.regEDX >> 8)" : "(this.regEDX >> 8) & 0xff";
sModRegSet = f16Only? "this.regEDX = (this.regEDX & 0xff) | " : "this.regEDX = (this.regEDX & ~0xff00) | ";
sModRegSetEnd = " << 8";
sModRegBTLo = "this.backTrack.btiDH";
break;
case 7:
sModRegGet = f16Only? "(this.regEBX >> 8)" : "(this.regEBX >> 8) & 0xff";
sModRegSet = f16Only? "this.regEBX = (this.regEBX & 0xff) | " : "this.regEBX = (this.regEBX & ~0xff00) | ";
sModRegSetEnd = " << 8";
sModRegBTLo = "this.backTrack.btiBH";
break;
default:
sError = "unrecognized w=0 mod=3 r/m: " + r_m;
break;
}
}
else {
switch (r_m) {
case 0:
sModRegGet = f16Only? "this.regEAX" : "this.regEAX & this.dataMask";
sModRegSet = f16Only? "" : "this.regEAX = (this.regEAX & ~this.dataMask) | ";
sModRegBTLo = "this.backTrack.btiAL";
sModRegBTHi = "this.backTrack.btiAH";
break;
case 1:
sModRegGet = f16Only? "this.regECX" : "this.regECX & this.dataMask";
sModRegSet = f16Only? "" : "this.regECX = (this.regECX & ~this.dataMask) | ";
sModRegBTLo = "this.backTrack.btiCL";
sModRegBTHi = "this.backTrack.btiCH";
break;
case 2:
sModRegGet = f16Only? "this.regEDX" : "this.regEDX & this.dataMask";
sModRegSet = f16Only? "" : "this.regEDX = (this.regEDX & ~this.dataMask) | ";
sModRegBTLo = "this.backTrack.btiDL";
sModRegBTHi = "this.backTrack.btiDH";
break;
case 3:
sModRegGet = f16Only? "this.regEBX" : "this.regEBX & this.dataMask";
sModRegSet = f16Only? "" : "this.regEBX = (this.regEBX & ~this.dataMask) | ";
sModRegBTLo = "this.backTrack.btiBL";
sModRegBTHi = "this.backTrack.btiBH";
break;
case 4:
sModRegGet = f16Only? "this.regESP" : "this.regESP & this.dataMask";
sModRegSet = f16Only? "" : "this.regESP = (this.regESP & ~this.dataMask) | ";
sModRegBTLo = "X86.BACKTRACK.SP_LO";
sModRegBTHi = "X86.BACKTRACK.SP_HI";
break;
case 5:
sModRegGet = f16Only? "this.regEBP" : "this.regEBP & this.dataMask";
sModRegSet = f16Only? "" : "this.regEBP = (this.regEBP & ~this.dataMask) | ";
sModRegBTLo = "this.backTrack.btiBPLo";
sModRegBTHi = "this.backTrack.btiBPHi";
break;
case 6:
sModRegGet = f16Only? "this.regESI" : "this.regESI & this.dataMask";
sModRegSet = f16Only? "" : "this.regESI = (this.regESI & ~this.dataMask) | ";
sModRegBTLo = "this.backTrack.btiSILo";
sModRegBTHi = "this.backTrack.btiSIHi";
break;
case 7:
sModRegGet = f16Only? "this.regEDI" : "this.regEDI & this.dataMask";
sModRegSet = f16Only? "" : "this.regEDI = (this.regEDI & ~this.dataMask) | ";
sModRegBTLo = "this.backTrack.btiDILo";
sModRegBTHi = "this.backTrack.btiDIHi";
break;
default:
sError = "unrecognized w=1 mod=3 r/m: " + r_m;
break;
}
}
break;
default:
sError = "unrecognized mod: " + mod;
break;
}
} else {
switch (mod) {
case 0:
switch (r_m) {
case 0:
sModAddr = "this.regEAX";
sModFunc = "EAX";
nCycles = "this.cycleCounts.nEACyclesBase";
break;
case 1:
sModAddr = "this.regECX";
sModFunc = "ECX";
nCycles = "this.cycleCounts.nEACyclesBase";
break;
case 2:
sModAddr = "this.regEDX";
sModFunc = "EDX";
nCycles = "this.cycleCounts.nEACyclesBase";
break;
case 3:
sModAddr = "this.regEBX";
sModFunc = "EBX";
nCycles = "this.cycleCounts.nEACyclesBase";
break;
case 4:
sModAddr = "this.getSIBAddr(0)";
sModFunc = "SIB";
nCycles = "this.cycleCounts.nEACyclesBase";
break;
case 5:
sModAddr = "this.getIPAddr()";
sModFunc = "D32";
nCycles = "this.cycleCounts.nEACyclesDisp";
break;
case 6:
sModAddr = "this.regESI";
sModFunc = "ESI";
nCycles = "this.cycleCounts.nEACyclesBase";
break;
case 7:
sModAddr = "this.regEDI";
sModFunc = "EDI";
nCycles = "this.cycleCounts.nEACyclesBase";
break;
default:
sError = "unrecognized mod=0 r/m: " + r_m;
break;
}
break;
case 1:
switch (r_m) {
case 0:
sModAddr = "this.regEAX + this.getIPDisp()";
sModFunc = "EAXD8";
nCycles = "this.cycleCounts.nEACyclesBaseDisp";
break;
case 1:
sModAddr = "this.regECX + this.getIPDisp()";
sModFunc = "ECXD8";
nCycles = "this.cycleCounts.nEACyclesBaseDisp";
break;
case 2:
sModAddr = "this.regEDX + this.getIPDisp()";
sModFunc = "EDXD8";
nCycles = "this.cycleCounts.nEACyclesBaseDisp";
break;
case 3:
sModAddr = "this.regEBX + this.getIPDisp()";
sModFunc = "EBXD8";
nCycles = "this.cycleCounts.nEACyclesBaseDisp";
break;
case 4:
sModAddr = "this.getSIBAddr(1) + this.getIPDisp()";
sModFunc = "SIBD8";
nCycles = "this.cycleCounts.nEACyclesBaseDisp";
break;
case 5:
sModAddr = "this.regEBP + this.getIPDisp()";
sModFunc = "EBPD8";
sModRegSeg = "Stack";
nCycles = "this.cycleCounts.nEACyclesBaseDisp";
break;
case 6:
sModAddr = "this.regESI + this.getIPDisp()";
sModFunc = "ESID8";
nCycles = "this.cycleCounts.nEACyclesBaseDisp";
break;
case 7:
sModAddr = "this.regEDI + this.getIPDisp()";
sModFunc = "EDID8";
nCycles = "this.cycleCounts.nEACyclesBaseDisp";
break;
default:
sError = "unrecognized mod=1 r/m: " + r_m;
break;
}
break;
case 2:
switch (r_m) {
case 0:
sModAddr = "this.regEAX + this.getIPAddr()";
sModFunc = "EAXD32";
nCycles = "this.cycleCounts.nEACyclesBaseDisp";
break;
case 1:
sModAddr = "this.regECX + this.getIPAddr()";
sModFunc = "ECXD32";
nCycles = "this.cycleCounts.nEACyclesBaseDisp";
break;
case 2:
sModAddr = "this.regEDX + this.getIPAddr()";
sModFunc = "EDXD32";
nCycles = "this.cycleCounts.nEACyclesBaseDisp";
break;
case 3:
sModAddr = "this.regEBX + this.getIPAddr()";
sModFunc = "EBXD32";
nCycles = "this.cycleCounts.nEACyclesBaseDisp";
break;
case 4:
sModAddr = "this.getSIBAddr(2) + this.getIPAddr()";
sModFunc = "SIBD32";
nCycles = "this.cycleCounts.nEACyclesBaseDisp";
break;
case 5:
sModAddr = "this.regEBP + this.getIPAddr()";
sModFunc = "EBPD32";
sModRegSeg = "Stack";
nCycles = "this.cycleCounts.nEACyclesBaseDisp";
break;
case 6:
sModAddr = "this.regESI + this.getIPAddr()";
sModFunc = "ESID32";
nCycles = "this.cycleCounts.nEACyclesBaseDisp";
break;
case 7:
sModAddr = "this.regEDI + this.getIPAddr()";
sModFunc = "EDID32";
nCycles = "this.cycleCounts.nEACyclesBaseDisp";
break;
default:
sError = "unrecognized mod=2 r/m: " + r_m;
break;
}
break;
case 3:
if (!w) {
switch (r_m) {
case 0:
sModRegGet = "this.regEAX & 0xff";
sModRegSet = "this.regEAX = (this.regEAX & ~0xff) | ";
sModRegBTLo = "this.backTrack.btiAL";
break;
case 1:
sModRegGet = "this.regECX & 0xff";
sModRegSet = "this.regECX = (this.regECX & ~0xff) | ";
sModRegBTLo = "this.backTrack.btiCL";
break;
case 2:
sModRegGet = "this.regEDX & 0xff";
sModRegSet = "this.regEDX = (this.regEDX & ~0xff) | ";
sModRegBTLo = "this.backTrack.btiDL";
break;
case 3:
sModRegGet = "this.regEBX & 0xff";
sModRegSet = "this.regEBX = (this.regEBX & ~0xff) | ";
sModRegBTLo = "this.backTrack.btiBL";
break;
case 4:
sModRegGet = "(this.regEAX >> 8) & 0xff";
sModRegSet = "this.regEAX = (this.regEAX & ~0xff00) | ";
sModRegSetEnd = " << 8";
sModRegBTLo = "this.backTrack.btiAH";
break;
case 5:
sModRegGet = "(this.regECX >> 8) & 0xff";
sModRegSet = "this.regECX = (this.regECX & ~0xff00) | ";
sModRegSetEnd = " << 8";
sModRegBTLo = "this.backTrack.btiCH";
break;
case 6:
sModRegGet = "(this.regEDX >> 8) & 0xff";
sModRegSet = "this.regEDX = (this.regEDX & ~0xff00) | ";
sModRegSetEnd = " << 8";
sModRegBTLo = "this.backTrack.btiDH";
break;
case 7:
sModRegGet = "(this.regEBX >> 8) & 0xff";
sModRegSet = "this.regEBX = (this.regEBX & ~0xff00) | ";
sModRegSetEnd = " << 8";
sModRegBTLo = "this.backTrack.btiBH";
break;
default:
sError = "unrecognized w=0 mod=3 r/m: " + r_m;
break;
}
}
else {
switch (r_m) {
case 0:
sModRegGet = "this.regEAX & this.dataMask";
sModRegSet = "this.regEAX = (this.regEAX & ~this.dataMask) | ";
sModRegBTLo = "this.backTrack.btiAL";
sModRegBTHi = "this.backTrack.btiAH";
break;
case 1:
sModRegGet = "this.regECX & this.dataMask";
sModRegSet = "this.regECX = (this.regECX & ~this.dataMask) | ";
sModRegBTLo = "this.backTrack.btiCL";
sModRegBTHi = "this.backTrack.btiCH";
break;
case 2:
sModRegGet = "this.regEDX & this.dataMask";
sModRegSet = "this.regEDX = (this.regEDX & ~this.dataMask) | ";
sModRegBTLo = "this.backTrack.btiDL";
sModRegBTHi = "this.backTrack.btiDH";
break;
case 3:
sModRegGet = "this.regEBX & this.dataMask";
sModRegSet = "this.regEBX = (this.regEBX & ~this.dataMask) | ";
sModRegBTLo = "this.backTrack.btiBL";
sModRegBTHi = "this.backTrack.btiBH";
break;
case 4:
sModRegGet = "this.regESP & this.dataMask";
sModRegSet = "this.regESP = (this.regESP & ~this.dataMask) | ";
sModRegBTLo = "X86.BACKTRACK.SP_LO";
sModRegBTHi = "X86.BACKTRACK.SP_HI";
break;
case 5:
sModRegGet = "this.regEBP & this.dataMask";
sModRegSet = "this.regEBP = (this.regEBP & ~this.dataMask) | ";
sModRegBTLo = "this.backTrack.btiBPLo";
sModRegBTHi = "this.backTrack.btiBPHi";
break;
case 6:
sModRegGet = "this.regESI & this.dataMask";
sModRegSet = "this.regESI = (this.regESI & ~this.dataMask) | ";
sModRegBTLo = "this.backTrack.btiSILo";
sModRegBTHi = "this.backTrack.btiSIHi";
break;
case 7:
sModRegGet = "this.regEDI & this.dataMask";
sModRegSet = "this.regEDI = (this.regEDI & ~this.dataMask) | ";
sModRegBTLo = "this.backTrack.btiDILo";
sModRegBTHi = "this.backTrack.btiDIHi";
break;
default:
sError = "unrecognized w=1 mod=3 r/m: " + r_m;
break;
}
}
break;
default:
sError = "unrecognized mod: " + mod;
break;
}
}
if (sError) {
print(sError);
return null;
}
sOpMod = "opMod" + aAddrPrefix[a] + (sGroup? sGroup + (sRO? sRO : "") : aDst[d]) + aSize[w] + toHex(mrm, 2);
var sTemp = aSize[w].charAt(0).toLowerCase();
if (sGroup) {
/*
* Use this to generate ModRM decoders that accept an array (ie, "group") of functions, and pass along an implied argument as well
*/
if (sRO && reg != 7) {
sOpMod = "opMod" + aAddrPrefix[a] + (sGroup? sGroup : aDst[d]) + aSize[w] + toHex(mrm, 2);
return sOpMod;
}
print(" /**");
print(" * " + sOpMod + "(afnGrp, fnSrc): mod=" + toMod(d, mod) + " reg=" + toReg(d, w, reg, sGroup) + " r/m=" + toRM(a, mod, w, r_m));
print(" *");
print(" * @this {X86CPU}");
print(" * @param {Array.<function(number,number)>} afnGrp");
print(" * @param {function()} fnSrc");
print(" */");
print(" function " + sOpMod + "(afnGrp, fnSrc) {");
if (sModAddr) {
if (!d) {
if (reg == 7 && sRO) {
if (sModFunc) {
if (fInline) {
print(" afnGrp[" + reg + "].call(this, this.getEA" + aSize[w] + sModRegSeg + "(" + sModAddr + "), fnSrc.call(this));");
} else {
sModFunc = "read" + sModFunc + aSize[w];
print(" var addr = X86Mods." + sModFunc + ".call(this);");
print(" afnGrp[" + reg + "].call(this, this.getEA" + aSize[w] + "(addr), fnSrc.call(this));");
genEAFunc(sModFunc, "this.regEA = " + sModRegSeg + "[1] + " + sModAddr);
}
} else {
print(" this.regEA = " + sModRegSeg + "[1] + " + sModAddr + ";");
print(" afnGrp[" + reg + "].call(this, this.getEA" + aSize[w] + "(this.regEA), fnSrc.call(this));");
}
}
else {
if (sModFunc) {
if (fInline) {
print(" var " + sTemp + " = afnGrp[" + reg + "].call(this, this.modEA" + aSize[w] + sModRegSeg + "(" + sModAddr + "), fnSrc.call(this));");
print(" this.setEA" + aSize[w] + "(" + sTemp + ");");
} else {
sModFunc = "write" + sModFunc + aSize[w];
print(" var addr = X86Mods." + sModFunc + ".call(this);");
print(" var " + sTemp + " = afnGrp[" + reg + "].call(this, this.modEA" + aSize[w] + "(addr), fnSrc.call(this));");
print(" this.setEA" + aSize[w] + "(addr, " + sTemp + ");");
genEAFunc(sModFunc, "this.regEAWrite = " + sModRegSeg + "[1] + " + sModAddr);
}
} else {
print(" this.regEAWrite = " + sModRegSeg + "[1] + " + sModAddr + ";");
print(" var " + sTemp + " = afnGrp[" + reg + "].call(this, this.modEA" + aSize[w] + "(this.regEAWrite), fnSrc.call(this));");
print(" this.setEA" + aSize[w] + "(this.regEAWrite, " + sTemp + ");");
}
}
if (nCycles !== null)
print(" this.nStepCycles -= " + nCycles + ";");
}
}
else if (sModRegGet) {
if (!sModRegSet) {
sModRegSet = sModRegGet + " = ";
sTemp = null;
}
if (sModRegSetEnd) {
sModRegSetBegin = "(";
sModRegSetEnd += ")";
}
if (reg == 7 && sRO) {
print(" afnGrp[" + reg + "].call(this, " + sModRegGet + ", fnSrc.call(this));");
} else {
if (!sTemp) {
print(" " + sModRegSet + sModRegSetBegin + "afnGrp[" + reg + "].call(this, " + sModRegGet + ", fnSrc.call(this))" + sModRegSetEnd + ";");
} else {
print(" var " + sTemp + " = afnGrp[" + reg + "].call(this, " + sModRegGet + ", fnSrc.call(this));");
print(" " + sModRegSet + sModRegSetBegin + sTemp + sModRegSetEnd + ";");
}
if (sModRegBTLo) {
if (!sModRegBTHi) {
print(" if (BACKTRACK) " + sModRegBTLo + " = this.backTrack.btiEALo;");
} else if (sModRegBTLo.indexOf("_") < 0) {
print(" if (BACKTRACK) {");
print(" " + sModRegBTLo + " = this.backTrack.btiEALo; " + sModRegBTHi + " = this.backTrack.btiEAHi;");
print(" }");
}
}
}
}
}
else {
/*
* Is this OpMod a duplicate OpMod? Specifically, when mod is 3 and d is 0, the destination is a register specified by r_m,
* which should match the OpMod handler for when mod' == 3 and d' == 1 and reg' == r_m and r_m' == reg.
*/
if (mod == 3 && !d) {
var mrmPrime = (mod << 6) | (r_m << 3) | reg;
print(" X86Mod" + aOpPrefix[w] + aAddrPrefix[a] + ".aOpModReg[0x" + toHex(mrmPrime, 2) + "],");
sOpMod = "opMod" + aAddrPrefix[a] + aDst[1] + aSize[w] + toHex(mrmPrime, 2);
return sOpMod;
}
print(" /**");
print(" * " + sOpMod + "(fn): mod=" + toMod(d, mod) + " reg=" + toReg(d, w, reg) + " r/m=" + toRM(a, mod, w, r_m));
print(" *");
print(" * @this {X86CPU}");
print(" * @param {function(number,number)} fn (dst,src)");
print(" */");
print(" function " + sOpMod + "(fn) {");
if (sModAddr && sRegGet) {
if (!d) {
if (sModFunc) {
if (fInline) {
print(" var " + sTemp + " = fn.call(this, this.modEA" + aSize[w] + sModRegSeg + "(" + sModAddr + "), " + sRegGet + ");");
if (sRegBTLo) {
if (!sRegBTHi) {
print(" if (BACKTRACK) this.backTrack.btiEALo = " + sRegBTLo + ";");
} else {
print(" if (BACKTRACK) {");
print(" this.backTrack.btiEALo = " + sRegBTLo + "; this.backTrack.btiEAHi = " + sRegBTHi + ";");
print(" }");
}
}
print(" this.setEA" + aSize[w] + "(" + sTemp + ");");
} else {
sModFunc = "write" + sModFunc + aSize[w];
print(" var addr = X86Mods." + sModFunc + ".call(this);");
print(" var " + sTemp + " = fn.call(this, this.modEA" + aSize[w] + "(addr), " + sRegGet + ");");
print(" this.setEA" + aSize[w] + "(addr, " + sTemp + ");");
genEAFunc(sModFunc, "this.regEAWrite = " + sModRegSeg + "[1] + " + sModAddr);
}
} else {
print(" this.regEAWrite = " + sModRegSeg + "[1] + " + sModAddr + ";");
print(" var " + sTemp + " = fn.call(this, this.modEA" + aSize[w] + "(this.regEAWrite), " + sRegGet + ");");
if (sRegBTLo) {
if (!sRegBTHi) {
print(" if (BACKTRACK) this.backTrack.btiEALo = " + sRegBTLo + ";");
} else {
print(" if (BACKTRACK) {");
print(" this.backTrack.btiEALo = " + sRegBTLo + "; this.backTrack.btiEAHi = " + sRegBTHi + ";");
print(" }");
}
}
print(" this.setEA" + aSize[w] + "(this.regEAWrite, " + sTemp + ");");
}
}
else {
if (!sRegSet) {
sRegSet = sRegGet + " = ";
sTemp = null;
}
if (sRegSetEnd) {
sRegSetBegin = "(";
sRegSetEnd += ")";
}
if (sModFunc) {
if (fInline) {
if (!sTemp) {
print(" " + sRegSet + sRegSetBegin + "fn.call(this, " + sRegGet + ", this.getEA" + aSize[w] + sModRegSeg + "(" + sModAddr + "))" + sRegSetEnd + ";");
} else {
print(" var " + sTemp + " = fn.call(this, " + sRegGet + ", this.getEA" + aSize[w] + sModRegSeg + "(" + sModAddr + "));");
print(" " + sRegSet + sRegSetBegin + sTemp + sRegSetEnd + ";");
}
} else {
sModFunc = "read" + sModFunc + aSize[w];
print(" var addr = X86Mods." + sModFunc + ".call(this);");
if (!sTemp) {
print(" " + sRegSet + sRegSetBegin + "fn.call(this, " + sRegGet + ", this.getEA" + aSize[w] + "(addr))" + sRegSetEnd + ";");
} else {
print(" var " + sTemp + " = fn.call(this, " + sRegGet + ", this.getEA" + aSize[w] + "(addr));");
print(" " + sRegSet + sRegSetBegin + sTemp + sRegSetEnd + ";");
}
genEAFunc(sModFunc, "this.regEA = " + sModRegSeg + "[1] + " + sModAddr);
}
} else {
print(" this.regEA = " + sModRegSeg + "[1] + " + sModAddr + ";");
if (!sTemp) {
print(" " + sRegSet + sRegSetBegin + "fn.call(this, " + sRegGet + ", this.getEA" + aSize[w] + "(this.regEA))" + sRegSetEnd + ";");
} else {
print(" var " + sTemp + " = fn.call(this, " + sRegGet + ", this.getEA" + aSize[w] + "(this.regEA));");
print(" " + sRegSet + sRegSetBegin + sTemp + sRegSetEnd + ";");
}
}
if (sRegBTLo && sRegBTLo.indexOf("this.") >= 0) {
if (!sRegBTHi) {
print(" if (BACKTRACK) " + sRegBTLo + " = this.backTrack.btiEALo;");
} else {
print(" if (BACKTRACK) {");
print(" " + sRegBTLo + " = this.backTrack.btiEALo; " + sRegBTHi + " = this.backTrack.btiEAHi;");
print(" }");
}
}
}
if (nCycles !== null)
print(" this.nStepCycles -= " + nCycles + ";");
}
else if (sModRegGet && sRegGet) {
if (!d) {
if (!sModRegSet) {
sModRegSet = sModRegGet + " = ";
sTemp = null;
}
if (sModRegSetEnd) {
sModRegSetBegin = "(";
sModRegSetEnd += ")";
}
if (!sTemp) {
print(" " + sModRegSet + sModRegSetBegin + "fn.call(this, " + sModRegGet + ", " + sRegGet + ")" + sModRegSetEnd + ";");
} else {
print(" var " + sTemp + " = fn.call(this, " + sModRegGet + ", " + sRegGet + ");");
print(" " + sModRegSet + sModRegSetBegin + sTemp + sModRegSetEnd + ";");
}
if (sModRegBTLo && sModRegBTLo.indexOf("this.") >= 0 && sRegBTLo && sModRegBTLo != sRegBTLo) {
if (!sModRegBTHi || !sRegBTHi) {
print(" if (BACKTRACK) " + sModRegBTLo + " = " + sRegBTLo + ";");
} else if (sModRegBTLo.indexOf("_") < 0) {
print(" if (BACKTRACK) {");
print(" " + sModRegBTLo + " = " + sRegBTLo + "; " + sModRegBTHi + " = " + sRegBTHi + ";");
print(" }");
}
}
}
else {
if (!sRegSet) {
sRegSet = sRegGet + " = ";
sTemp = null;
}
if (sRegSetEnd) {
sRegSetBegin = "(";
sRegSetEnd += ")";
}
if (!sTemp) {
print(" " + sRegSet + sRegSetBegin + "fn.call(this, " + sRegGet + ", " + sModRegGet + ")" + sRegSetEnd + ";");
} else {
print(" var " + sTemp + " = fn.call(this, " + sRegGet + ", " + sModRegGet + ");");
print(" " + sRegSet + sRegSetBegin + sTemp + sRegSetEnd + ";");
}
if (sRegBTLo && sRegBTLo.indexOf("this.") >= 0 && sModRegBTLo && sRegBTLo != sModRegBTLo) {
if (!sRegBTHi || !sModRegBTHi) {
print(" if (BACKTRACK) " + sRegBTLo + " = " + sModRegBTLo + ";");
} else {
print(" if (BACKTRACK) {");
print(" " + sRegBTLo + " = " + sModRegBTLo + "; " + sRegBTHi + " = " + sModRegBTHi + ";");
print(" }");
}
}
}
}
}
print(" }" + (mrm < 0xff? "," : ""));
return sOpMod;
}
function genEAFunc(sFuncName, sFuncBody) {
if (sEAFuncs.indexOf(sFuncName) < 0) {
sEAFuncs += " /**\n";
sEAFuncs += " * @this {X86CPU}\n";
sEAFuncs += " * @return {number}\n";
sEAFuncs += " */\n";
sEAFuncs += " " + sFuncName + ": function() {\n";
sEAFuncs += " return (" + sFuncBody + ");\n";
sEAFuncs += " },\n";
}
}
function toMod(d, mod) {
return toBin(mod, 2) + " (" + (d? "src" : "dst") + ":" + aMOD[mod] + ")";
}
function toReg(d, w, reg, sGroup) {
return toBin(reg, 3) + " (" + (sGroup? "afnGrp[" + reg + "]" : (d? "dst" : "src") + ":" + aREG[w][reg]) + ")";
}
function toRM(a, mod, w, r_m) {
return toBin(r_m, 3) + " (" + aRM[a][mod][mod < 3? 0 : w][r_m] + ")";
}
function toBin(v, len) {
var s = "0000000000000000" + v.toString(2);
return s.slice(s.length - (len === undefined? 8 : (len < 16? len : 16)));
}
function toHex(v, len) {
var s = "00000000" + v.toString(16);
return s.slice(s.length - (len === undefined? 4 : (len < 8? len : 8))).toUpperCase();
}
{
"boss": true,
"eqnull": true,
"evil": true,
"loopfunc": true,
"sub": true,
"globalstrict": true,
"globals": {
"APPNAME": false,
"APPVERSION": false,
"SITEHOST": false,
"COMPILED": true,
"DEBUG": true,
"MAXDEBUG": false,
"PCJSCLASS": true,
"DEBUGGER": true,
"PREFETCH": true,
"FATARRAYS": true,
"TYPEDARRAYS": true,
"BACKTRACK": true,
"SAMPLER": true,
"BUGS_8086": true,
"I386": true,
"COMPAQ386": true,
"Component": true,
"State": true,
"Bus": true,
"ChipSet": true,
"Computer": true,
"CPU": true,
"Debugger": true,
"Disk": true,
"FDC": true,
"HDC": true,
"Keyboard": true,
"Memory": true,
"Mouse": true,
"Panel": true,
"RAM": true,
"ROM": true,
"SerialPort": true,
"Video": true,
"X86": true,
"X86Seg": true,
"X86CPU": true,
"X86Func": true,
"X86OpXX": true,
"X86Op0F": true,
"X86ModB": true,
"X86ModW": true,
"X86ModB32": true,
"X86ModW32": true,
"X86ModSIB": true,
"str": true,
"usr": true,
"web": true,
"document": true,
"global": true,
"module": true,
"require": true,
"ArrayBuffer": false,
"DataView": false,
"FileReader": false,
"Uint8Array": false,
"Uint16Array": false,
"Int32Array": false,
"setTimeout": false,
"clearTimeout": false,
"webkitAudioContext": false,
"window": true
}
}
PCjs Sources === Structure --- These JavaScript files divide PCjs functionality into major PC components. Most of the files are device components, implementing a specific device (or set of devices, in the case of [chipset.js](chipset.js)). Be aware that *component* is an overloaded term, since **Component** is also the name of the shared base class in [component.js](../../shared/lib/component.js) used by most machine components. A few low-level components (eg, the **Memory** and **State** components, the Card class of the **Video** component, the Color and Rectangle classes of the **Panel** component, etc) do not extend **Component**, so don't assume that every PCjs object has access to [component.js](../../shared/lib/component.js) methods. Examples of non-device components include UI components like [panel.js](panel.js) and [debugger.js](debugger.js), and sub-components like [x86opxx.js](x86opxx.js) and [x86func.js](x86func.js) that separate the CPU functionality of [x86.js](x86.js) into more manageable pieces. These components should always be loaded or compiled in the order listed by the *pcJSFiles* property in [package.json](../../../package.json), which includes all the necessary *shared* components as well. At the time of this writing, the recommended order is: * [shared/defines.js](../../shared/lib/defines.js) * [shared/diskapi.js](../../shared/lib/diskapi.js) * [shared/dumpapi.js](../../shared/lib/dumpapi.js) * [shared/reportapi.js](../../shared/lib/reportapi.js) * [shared/userapi.js](../../shared/lib/userapi.js) * [shared/strlib.js](../../shared/lib/strlib.js) * [shared/usrlib.js](../../shared/lib/usrlib.js) * [shared/weblib.js](../../shared/lib/weblib.js) * [shared/component.js](../../shared/lib/component.js) * [pcjs/defines.js](defines.js) * [pcjs/interrupts.js](interrupts.js) * [pcjs/messages.js](messages.js) * [pcjs/panel.js](panel.js) * [pcjs/bus.js](bus.js) * [pcjs/memory.js](memory.js) * [pcjs/cpu.js](cpu.js) * [pcjs/x86.js](x86.js) * [pcjs/x86seg.js](x86seg.js) * [pcjs/x86cpu.js](x86cpu.js) * [pcjs/x86func.js](x86func.js) * [pcjs/x86opxx.js](x86opxx.js) * [pcjs/x86op0f.js](x86op0f.js) * [pcjs/x86modb.js](x86modb.js) * [pcjs/x86modw.js](x86modw.js) * [pcjs/x86modb16.js](x86modb16.js) * [pcjs/x86modw16.js](x86modw16.js) * [pcjs/x86modb32.js](x86modb32.js) * [pcjs/x86modw32.js](x86modw32.js) * [pcjs/x86modsib.js](x86modsib.js) * [pcjs/chipset.js](chipset.js) * [pcjs/rom.js](rom.js) * [pcjs/ram.js](ram.js) * [pcjs/keyboard.js](keyboard.js) * [pcjs/video.js](video.js) * [pcjs/serialport.js](serialport.js) * [pcjs/mouse.js](mouse.js) * [pcjs/disk.js](disk.js) * [pcjs/fdc.js](fdc.js) * [pcjs/hdc.js](hdc.js) * [pcjs/debugger.js](debugger.js) * [pcjs/state.js](state.js) * [pcjs/computer.js](computer.js) * [shared/embed.js](../../shared/lib/embed.js) Some of the components *can* be reordered or even omitted (eg, [debugger.js](debugger.js) or [embed.js](../../shared/lib/embed.js)), but you should observe the following: * [component.js](../../shared/lib/component.js) must be listed before any component that extends **Component** * [panel.js](panel.js) should be loaded early to initialize the Control Panel (if any) as soon as possible * [computer.js](computer.js) should be the last device component, as it supervises and notifies all the other device components To minimize ordering requirements, the init() handlers and constructors of all components should avoid referencing other components. Device components should define an initBus() notification handler, which the *Computer* component will call after it has created/initialized the *Bus* component. Features --- [List of major existing features goes here] ### BackTrack Support The next major feature to be implemented is referred to as BackTrack Support, or simply BackTracks. When BackTracks are enabled, every memory location (at the byte level) and every general-purpose byte register may have an optional link back to its source. These links are called BackTrack indexes. All the code that a virtual machine initially executes enters the machine either via ROM or disk sectors, and as that code executes, the machine is loading data into registers from memory locations and/or I/O ports and writing the results to other memory locations and/or I/O ports. BackTracks keep track of that data flow, allowing us to examine the history of any piece of data at any time, down to the byte level; while this feature could be extended to the bit level, it would make the feature dramatically more expensive, both in terms of size and speed. A BackTrack index is encoded as a 32-bit value with three parts: - Bits 0-8: 9-bit BackTrack object offset (0-511) - Bits 9-15: 7-bit type and access info - Bits 16-30: 15-bit BackTrack object number (1-32767, 0 reserved for dynamic data) This represents a total of 31 bits, with bit 31 reserved. For example, look at one of the last things a ROM does during boot: loading a disk sector into RAM. It will be up to the disk controller (or DMA controller, if used) to create a BackTrack object representing the sector that was read, adding that object to the global BackTrack object array, and then associating the corresponding BackTrack index with the first byte of RAM where the sector was loaded. Subsequent bytes of RAM containing the rest of the sector will refer to the same BackTrack object, using BackTrack indexes containing offsets 1-511.
/**
* @fileoverview Implements the PCjs Bus component.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-Sep-04
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
if (typeof module !== 'undefined') {
var str = require("../../shared/lib/strlib");
var usr = require("../../shared/lib/usrlib");
var Component = require("../../shared/lib/component");
var Memory = require("./memory");
var Messages = require("./messages");
var State = require("./state");
var X86 = require("./x86");
}
/**
* Bus(cpu, dbg)
*
* The Bus component manages physical memory and I/O address spaces.
*
* The Bus component has no UI elements, so it does not require an init() handler,
* but it still inherits from the Component class and must be allocated like any
* other device component. It's currently allocated by the Computer's init() handler,
* which then calls the initBus() method of all the other components.
*
* When initMemory() initializes the entire address space, it also passes aMemBlocks
* to the CPU object, so that the CPU can perform its own address-to-block calculations
* (essential, for example, when the CPU enables paging).
*
* For memory beyond the simple needs of the ROM and RAM components (ie, memory-mapped
* devices), the address space must still be allocated through the Bus component via
* addMemory(). If the component needs something more than simple read/write storage,
* it must provide a controller with getMemoryBuffer() and getMemoryAccess() methods.
*
* By contrast, all port (I/O) operations are defined by external handlers; they register
* with us, and we manage those registrations, as well as support for I/O breakpoints,
* but unlike memory accesses, we're not involved with port data accesses.
*
* @constructor
* @extends Component
* @param {Object} parmsBus
* @param {X86CPU} cpu
* @param {Debugger} dbg
*/
function Bus(parmsBus, cpu, dbg)
{
Component.call(this, "Bus", parmsBus, Bus);
this.cpu = cpu;
this.dbg = dbg;
this.nBusWidth = parmsBus['buswidth'] || 20;
/*
* Compute all Bus memory block parameters, based on the width of the bus.
*
* Regarding blockTotal, we want to avoid using block overflow expressions like:
*
* iBlock < this.nBlockTotal? iBlock : 0
*
* As long as we know that blockTotal is a power of two (eg, 256 or 0x100, in the case of
* nBusWidth == 20 and blockSize == 4096), we can define blockMask as (blockTotal - 1) and
* rewrite the previous expression as:
*
* iBlock & this.nBlockMask
*
* Similarly, we mask addresses with busMask to enforce "A20 wrap" on 20-bit busses.
* For larger busses, A20 wrap can be simulated by either clearing bit 20 of busMask or by
* changing all the block entries for the 2nd megabyte to match those in the 1st megabyte.
*
* Bus Property Old hard-coded values (when nBusWidth was always 20)
* ------------ ----------------------------------------------------
* this.nBusLimit 0xfffff
* this.nBusMask [same as busLimit]
* this.nBlockSize 4096
* this.nBlockLen (this.nBlockSize >> 2)
* this.nBlockShift 12
* this.nBlockLimit 0xfff
* this.nBlockTotal ((this.nBusLimit + this.nBlockSize) / this.nBlockSize) | 0
* this.nBlockMask (this.nBlockTotal - 1) [ie, 0xff]
*
* Note that we choose a nBlockShift value (and thus a physical memory block size) based on "buswidth":
*
* Bus Width Block Shift Block Size
* --------- ----------- ----------
* 20 bits (1Mb address space): 12 4Kb (256 maximum blocks)
* 24 bits (16Mb address space): 14 16Kb (1K maximum blocks)
* 32 bits (4Gb address space); 15 32Kb (128K maximum blocks)
*
* The coarser block granularities (ie, 16Kb and 32Kb) may cause problems for certain RAM and/or ROM
* allocations that are contiguous but are allocated out of order, or that have different controller
* requirements. Your choices, for the moment, are either to ensure the allocations are performed in
* order, or to choose smaller nBlockShift values (at the expense of a generating a larger block array).
*
* Note that if PAGEBLOCKS is set, then for a bus width of 32 bits, the block size is fixed at 4Kb.
*/
this.addrTotal = Math.pow(2, this.nBusWidth);
this.nBusLimit = this.nBusMask = (this.addrTotal - 1) | 0;
this.nBlockShift = (PAGEBLOCKS && this.nBusWidth == 32 || this.nBusWidth <= 20)? 12 : (this.nBusWidth <= 24? 14 : 15);
this.nBlockSize = 1 << this.nBlockShift;
this.nBlockLen = this.nBlockSize >> 2;
this.nBlockLimit = this.nBlockSize - 1;
this.nBlockTotal = (this.addrTotal / this.nBlockSize) | 0;
this.nBlockMask = this.nBlockTotal - 1;
this.assert(this.nBlockMask <= Bus.BlockInfo.num.mask);
/*
* Lists of I/O notification functions: aPortInputNotify and aPortOutputNotify are arrays, indexed by
* port, of sub-arrays which contain:
*
* [0]: registered component
* [1]: registered function to call for every I/O access
*
* The registered function is called with the port address, and if the access was triggered by the CPU,
* the linear instruction pointer (LIP) at the point of access.
*
* WARNING: Unlike the (old) read and write memory notification functions, these support only one
* pair of input/output functions per port. A more sophisticated architecture could support a list
* of chained functions across multiple components, but I doubt that will be necessary here.
*
* UPDATE: The Debugger now piggy-backs on these arrays to indicate ports for which it wants notification
* of I/O. In those cases, the registered component/function elements may or may not be set, but the following
* additional element will be set:
*
* [2]: true to break on I/O, false to ignore I/O
*
* The false case is important if fPortInputBreakAll and/or fPortOutputBreakAll is set, because it allows the
* Debugger to selectively ignore specific ports.
*/
this.aPortInputNotify = [];
this.aPortOutputNotify = [];
this.fPortInputBreakAll = this.fPortOutputBreakAll = false;
/*
* Allocate empty Memory blocks to span the entire physical address space.
*/
this.initMemory();
if (BACKTRACK) {
this.abtObjects = [];
this.cbtDeletions = 0;
this.ibtLastAlloc = -1;
this.ibtLastDelete = 0;
}
this.setReady();
}
Component.subclass(Bus);
if (BACKTRACK) {
/**
* BackTrack object definition
*
* obj: reference to the source object (eg, ROM object, Sector object)
* off: the offset within the source object that this object refers to
* slot: the slot (+1) in abtObjects which this object currently occupies
* refs: the number of memory references, as recorded by writeBackTrack()
*
* @typedef {{
* obj: Object,
* off: number,
* slot: number,
* refs: number
* }}
*/
var BackTrack;
/*
* BackTrack indexes are 31-bit values, where bits 0-8 store an object offset (0-511) and bits 16-30 store
* an object number (1-32767). Object number 0 is reserved for dynamic data (ie, data created independent
* of any source); examples include zero values produced by instructions such as "SUB AX,AX" or "XOR AX,AX".
* We must special-case instructions like that, because even though AX will almost certainly contain some source
* data prior to the instruction, the result no longer has any connection to the source. Similarly, "SBB AX,AX"
* may produce 0 or -1, depending on carry, but since we don't track the source of individual bits (including the
* carry flag), AX is now source-less. TODO: This is an argument for maintaining source info on selected flags,
* even though it would be rather expensive.
*
* The 7 middle bits (9-15) record type and access information, as follows:
*
* bit 15: set to indicate a "data" byte, clear to indicate a "code" byte
*
* All bytes start out as "data" bytes; only once they've been executed do they become "code" bytes. For code
* bytes, the remaining 6 middle bits (9-14) represent an execution count that starts at 1 (on the byte's initial
* transition from data to code) and tops out at 63.
*
* For data bytes, the remaining middle bits indicate any transformations the data has undergone; eg:
*
* bit 14: ADD/SUB/INC/DEC
* bit 13: MUL/DIV
* bit 12: OR/AND/XOR/NOT
*
* We make no attempt to record the original data or the transformation data, only that the transformation occurred.
*
* Other middle bits indicate whether the data was ever read and/or written:
*
* bit 11: READ
* bit 10: WRITE
*
* Bit 9 is reserved for now.
*/
Bus.BACKTRACK = {
SLOT_MAX: 32768,
SLOT_SHIFT: 16,
TYPE_DATA: 0x8000,
TYPE_ADDSUB: 0x4000,
TYPE_MULDIV: 0x2000,
TYPE_LOGICAL: 0x1000,
TYPE_READ: 0x0800,
TYPE_WRITE: 0x0400,
TYPE_COUNT_INC: 0x0200,
TYPE_COUNT_MAX: 0x7E00,
TYPE_MASK: 0xFE00,
TYPE_SHIFT: 9,
OFF_MAX: 512,
OFF_MASK: 0x1FF
};
}
/**
* @typedef {number}
*/
var BlockInfo;
/**
* This defines the BlockInfo bit fields used by scanMemory() when it creates the aBlocks array.
*
* @typedef {{
* num: BitField,
* count: BitField,
* btmod: BitField,
* type: BitField
* }}
*/
Bus.BlockInfo = usr.defineBitFields({num:20, count:8, btmod:1, type:3});
/**
* BusInfo object definition (returned by scanMemory())
*
* cbTotal: total bytes allocated
* cBlocks: total Memory blocks allocated
* aBlocks: array of allocated Memory block numbers
*
* @typedef {{
* cbTotal: number,
* cBlocks: number,
* aBlocks: Array.<BlockInfo>
* }}
*/
var BusInfo;
/**
* initMemory()
*
* Allocate enough (empty) Memory blocks to span the entire physical address space.
*
* @this {Bus}
*/
Bus.prototype.initMemory = function()
{
var block = new Memory();
this.aMemBlocks = new Array(this.nBlockTotal);
for (var iBlock = 0; iBlock < this.nBlockTotal; iBlock++) {
this.aMemBlocks[iBlock] = block;
}
this.cpu.initMemory(this.aMemBlocks, this.nBlockShift);
this.cpu.setAddressMask(this.nBusMask);
};
/**
* reset()
*
* @this {Bus}
*/
Bus.prototype.reset = function()
{
this.setA20(true);
if (BACKTRACK) this.ibtLastDelete = 0;
};
/**
* powerUp(data, fRepower)
*
* We don't need a powerDown() handler, because for largely historical reasons, our state (including the A20 state)
* is saved by saveMemory().
*
* However, we do need a powerUp() handler, because on resumable machines, the Computer's onReset() function calls
* everyone's powerUp() handler rather than their reset() handler.
*
* TODO: Perhaps Computer should be smarter: if there's no powerUp() handler, then fallback to the reset() handler.
* In that case, however, we'd either need to remove the powerUp() stub in Component, or detect the existence of the stub.
*
* @this {Bus}
* @param {Object|null} data (always null because we supply no powerDown() handler)
* @param {boolean} [fRepower]
* @return {boolean} true if successful, false if failure
*/
Bus.prototype.powerUp = function(data, fRepower)
{
if (!fRepower) this.reset();
return true;
};
/**
* addMemory(addr, size, type, controller)
*
* Adds new Memory blocks to the specified address range. Any Memory blocks previously
* added to that range must first be removed via removeMemory(); otherwise, you'll get
* an allocation conflict error. This helps prevent address calculation errors, redundant
* allocations, etc.
*
* We've relaxed some of the original requirements (ie, that addresses must start at a
* block-granular address, or that sizes must be equal to exactly one or more blocks), because
* machines with large block sizes can make it impossible to load certain ROMs at at their
* required addresses.
*
* Even so, Bus memory management does NOT provide a general-purpose heap. Most memory
* allocations occur during machine initialization and never change. The only notable
* exception is the Video frame buffer, which ranges from 4Kb (MDA) to 16Kb (CGA) to
* 32Kb/64Kb/128Kb (EGA), and only the EGA changes its buffer address post-initialization.
*
* Each Memory block keeps track of a single address (addr) and length (used), indicating
* the used space within the block; any free space that precedes or follows that used space
* can be allocated later, by simply extending the beginning or ending of the previously used
* space. However, any holes that might have existed between the original allocation and an
* extension are subsumed by the extension.
*
* @this {Bus}
* @param {number} addr is the starting physical address of the request
* @param {number} size of the request, in bytes
* @param {number} type is one of the Memory.TYPE constants
* @param {Object} [controller] is an optional memory controller component
* @return {boolean} true if successful, false if not
*/
Bus.prototype.addMemory = function(addr, size, type, controller)
{
var iBlock = addr >>> this.nBlockShift;
while (size > 0 && iBlock < this.aMemBlocks.length) {
var block = this.aMemBlocks[iBlock];
var addrBlock = iBlock * this.nBlockSize;
var sizeBlock = size > this.nBlockSize? this.nBlockSize : size;
if (block && block.size) {
if (block.type == type && block.controller == controller) {
/*
* Where there is already a block with a non-zero size, we can allow the allocation only if:
*
* 1) addr + size <= block.addr (the request precedes the used portion of the current block)
* or:
* 2) addr >= block.addr + block.used (the request follows the used portion of the current block)
*/
if (addr + size <= block.addr) {
block.used += (block.addr - addr);
block.addr = addr;
return true;
}
if (addr >= block.addr + block.used) {
var sizeAvail = block.size - (addr - addrBlock);
if (sizeAvail > size) sizeAvail = size;
block.used = addr - block.addr + sizeAvail;
size -= sizeAvail;
addr = addrBlock + this.nBlockSize;
continue;
}
}
return this.reportError(1, addr, size);
}
block = this.aMemBlocks[iBlock++] = new Memory(addr, sizeBlock, this.nBlockSize, type, controller);
if (DEBUGGER && this.dbg) {
block.setDebugger(this.dbg, addr, this.nBlockSize);
}
size -= sizeBlock;
addr = addrBlock + this.nBlockSize;
}
if (size > 0) {
return this.reportError(2, addr, size);
}
return true;
};
/**
* cleanMemory(addr, size)
*
* @this {Bus}
* @param {number} addr
* @param {number} size
* @return {boolean} true if all blocks were clean, false if dirty; all blocks are cleaned in the process
*/
Bus.prototype.cleanMemory = function(addr, size)
{
var fClean = true;
var iBlock = addr >>> this.nBlockShift;
while (size > 0 && iBlock < this.aMemBlocks.length) {
if (this.aMemBlocks[iBlock].fDirty) {
this.aMemBlocks[iBlock].fDirty = fClean = false;
this.aMemBlocks[iBlock].fDirtyEver = true;
}
size -= this.nBlockSize;
iBlock++;
}
return fClean;
};
/**
* scanMemory(info, addr, size)
*
* Returns a BusInfo object for the specified address range.
*
* @this {Bus}
* @param {Object} [info] previous BusInfo, if any
* @param {number} [addr] starting address of range (0 if none provided)
* @param {number} [size] size of range, in bytes (up to end of address space if none provided)
* @return {Object} updated info (or new info if no previous info provided)
*/
Bus.prototype.scanMemory = function(info, addr, size)
{
if (addr == null) addr = 0;
if (size == null) size = (this.addrTotal - addr) | 0;
if (info == null) info = {cbTotal: 0, cBlocks: 0, aBlocks: []};
var iBlock = addr >>> this.nBlockShift;
var iBlockMax = ((addr + size - 1) >>> this.nBlockShift);
info.cbTotal = 0;
info.cBlocks = 0;
while (iBlock <= iBlockMax) {
var block = this.aMemBlocks[iBlock];
info.cbTotal += block.size;
if (block.size) {
var btmod = (BACKTRACK && block.modBackTrack(false)? 1 : 0);
info.aBlocks.push(usr.initBitFields(Bus.BlockInfo, iBlock, 0, btmod, block.type));
info.cBlocks++
}
iBlock++;
}
return info;
};
/**
* getA20()
*
* @this {Bus}
* @return {boolean} true if enabled, false if disabled
*/
Bus.prototype.getA20 = function()
{
return !this.aBlocks2Mb && this.nBusLimit == this.nBusMask;
};
/**
* setA20(fEnable)
*
* On 32-bit bus machines, I've adopted the approach that Compaq took with DeskPro 386 machines,
* which is to map the 1st Mb to the 2nd Mb whenever A20 is disabled, rather than blindly masking
* the A20 address bit from all addresses; in fact, this is what the DeskPro 386 ROM BIOS requires.
*
* For 24-bit bus machines, we take the same approach that most if not all 80286 systems took, which
* is simply masking the A20 address bit. A lot of 32-bit machines probably took the same approach.
*
* TODO: On machines with a 32-bit bus, look into whether we can eliminate address masking altogether,
* which seems feasible, provided all incoming addresses are already pre-truncated to 32 bits. Also,
* confirm that DeskPro 386 machines mapped the ENTIRE 1st Mb to the 2nd, and not simply the first 64Kb,
* which is technically all that 8086 address wrap-around compatibility would require.
*
* @this {Bus}
* @param {boolean} fEnable is true to enable A20 (default), false to disable
*/
Bus.prototype.setA20 = function(fEnable)
{
if (this.nBusWidth == 32) {
if (fEnable) {
if (this.aBlocks2Mb) {
this.setMemoryBlocks(0x100000, 0x100000, this.aBlocks2Mb);
this.aBlocks2Mb = null;
}
} else {
if (!this.aBlocks2Mb) {
this.aBlocks2Mb = this.getMemoryBlocks(0x100000, 0x100000);
this.setMemoryBlocks(0x100000, 0x100000, this.getMemoryBlocks(0x0, 0x100000));
}
}
}
else if (this.nBusWidth > 20) {
var addrMask = (this.nBusMask & ~0x100000) | (fEnable? 0x100000 : 0);
if (addrMask != this.nBusMask) {
this.nBusMask = addrMask;
if (this.cpu) this.cpu.setAddressMask(addrMask);
}
}
};
/**
* getWidth()
*
* @this {Bus}
* @return {number}
*/
Bus.prototype.getWidth = function()
{
return this.nBusWidth;
};
/**
* setMemoryAccess(addr, size)
*
* Updates the access functions in every block of the specified address range. Since the only components
* that should be dynamically modifying the memory access functions are those that use addMemory() with a custom
* memory controller, we require that the block(s) being updated do in fact have a controller.
*
* @this {Bus}
* @param {number} addr
* @param {number} size
* @param {Array.<function()>} [afn]
* @return {boolean} true if successful, false if not
*/
Bus.prototype.setMemoryAccess = function(addr, size, afn)
{
if (!(addr & this.nBlockLimit) && size && !(size & this.nBlockLimit)) {
var iBlock = addr >>> this.nBlockShift;
while (size > 0) {
var block = this.aMemBlocks[iBlock];
if (!block.controller) {
return this.reportError(5, addr, size);
}
block.setAccess(afn);
size -= this.nBlockSize;
iBlock++;
}
return true;
}
return this.reportError(3, addr, size);
};
/**
* removeMemory(addr, size)
*
* Replaces every block in the specified address range with empty Memory blocks that will ignore all reads/writes.
*
* TODO: Update the removeMemory() interface to reflect the relaxed requirements of the addMemory() interface.
*
* @this {Bus}
* @param {number} addr
* @param {number} size
* @return {boolean} true if successful, false if not
*/
Bus.prototype.removeMemory = function(addr, size)
{
if (!(addr & this.nBlockLimit) && size && !(size & this.nBlockLimit)) {
var iBlock = addr >>> this.nBlockShift;
while (size > 0) {
addr = iBlock * this.nBlockSize;
var block = this.aMemBlocks[iBlock++] = new Memory(addr);
if (DEBUGGER && this.dbg) {
block.setDebugger(this.dbg, addr, this.nBlockSize);
}
size -= this.nBlockSize;
}
return true;
}
return this.reportError(4, addr, size);
};
/**
* getMemoryBlocks(addr, size)
*
* @this {Bus}
* @param {number} addr is the starting physical address
* @param {number} size of the request, in bytes
* @return {Array} of Memory blocks
*/
Bus.prototype.getMemoryBlocks = function(addr, size)
{
var aBlocks = [];
var iBlock = addr >>> this.nBlockShift;
while (size > 0 && iBlock < this.aMemBlocks.length) {
aBlocks.push(this.aMemBlocks[iBlock++]);
size -= this.nBlockSize;
}
return aBlocks;
};
/**
* setMemoryBlocks(addr, size, aBlocks, type)
*
* If no type is specified, then specified address range uses all the provided blocks as-is;
* this form of setMemoryBlocks() is used for complete physical aliases.
*
* Otherwise, new blocks are allocated with the specified type; the underlying memory from the
* provided blocks is still used, but the new blocks may have different access to that memory.
*
* @this {Bus}
* @param {number} addr is the starting physical address
* @param {number} size of the request, in bytes
* @param {Array} aBlocks as returned by getMemoryBlocks()
* @param {number} [type] is one of the Memory.TYPE constants
*/
Bus.prototype.setMemoryBlocks = function(addr, size, aBlocks, type)
{
var i = 0;
var iBlock = addr >>> this.nBlockShift;
while (size > 0 && iBlock < this.aMemBlocks.length) {
var block = aBlocks[i++];
this.assert(block);
if (!block) break;
if (type !== undefined) {
var blockNew = new Memory(addr);
if (DEBUGGER && this.dbg) {
blockNew.setDebugger(this.dbg, addr, this.nBlockSize);
}
blockNew.clone(block, type);
block = blockNew;
}
this.aMemBlocks[iBlock++] = block;
size -= this.nBlockSize;
}
};
/**
* getByte(addr)
*
* For physical addresses only; for linear addresses, use cpu.getByte().
*
* @this {Bus}
* @param {number} addr is a physical address
* @return {number} byte (8-bit) value at that address
*/
Bus.prototype.getByte = function(addr)
{
return this.aMemBlocks[(addr & this.nBusMask) >>> this.nBlockShift].readByte(addr & this.nBlockLimit, addr);
};
/**
* getByteDirect(addr)
*
* This is useful for the Debugger and other components that want to bypass getByte() breakpoint detection.
*
* @this {Bus}
* @param {number} addr is a physical address
* @return {number} byte (8-bit) value at that address
*/
Bus.prototype.getByteDirect = function(addr)
{
return this.aMemBlocks[(addr & this.nBusMask) >>> this.nBlockShift].readByteDirect(addr & this.nBlockLimit, addr);
};
/**
* getShort(addr)
*
* For physical addresses only; for linear addresses, use cpu.getShort().
*
* @this {Bus}
* @param {number} addr is a physical address
* @return {number} word (16-bit) value at that address
*/
Bus.prototype.getShort = function(addr)
{
var off = addr & this.nBlockLimit;
var iBlock = (addr & this.nBusMask) >>> this.nBlockShift;
if (off != this.nBlockLimit) {
return this.aMemBlocks[iBlock].readShort(off, addr);
}
return this.aMemBlocks[iBlock++].readByte(off, addr) | (this.aMemBlocks[iBlock & this.nBlockMask].readByte(0, addr + 1) << 8);
};
/**
* getShortDirect(addr)
*
* This is useful for the Debugger and other components that want to bypass getShort() breakpoint detection.
*
* @this {Bus}
* @param {number} addr is a physical address
* @return {number} word (16-bit) value at that address
*/
Bus.prototype.getShortDirect = function(addr)
{
var off = addr & this.nBlockLimit;
var iBlock = (addr & this.nBusMask) >>> this.nBlockShift;
if (off != this.nBlockLimit) {
return this.aMemBlocks[iBlock].readShortDirect(off, addr);
}
return this.aMemBlocks[iBlock++].readByteDirect(off, addr) | (this.aMemBlocks[iBlock & this.nBlockMask].readByteDirect(0, addr + 1) << 8);
};
/**
* getLong(addr)
*
* For physical addresses only; for linear addresses, use cpu.getLong().
*
* @this {Bus}
* @param {number} addr is a physical address
* @return {number} long (32-bit) value at that address
*/
Bus.prototype.getLong = function(addr)
{
var off = addr & this.nBlockLimit;
var iBlock = (addr & this.nBusMask) >>> this.nBlockShift;
if (off < this.nBlockLimit - 2) {
return this.aMemBlocks[iBlock].readLong(off, addr);
}
var nShift = (off & 0x3) << 3;
return (this.aMemBlocks[iBlock].readLong(off & ~0x3, addr) >>> nShift) | (this.aMemBlocks[(iBlock + 1) & this.nBlockMask].readLong(0, addr + 3) << (32 - nShift));
};
/**
* getLongDirect(addr)
*
* This is useful for the Debugger and other components that want to bypass getLong() breakpoint detection.
*
* @this {Bus}
* @param {number} addr is a physical address
* @return {number} long (32-bit) value at that address
*/
Bus.prototype.getLongDirect = function(addr)
{
var off = addr & this.nBlockLimit;
var iBlock = (addr & this.nBusMask) >>> this.nBlockShift;
if (off < this.nBlockLimit - 2) {
return this.aMemBlocks[iBlock].readLongDirect(off, addr);
}
var nShift = (off & 0x3) << 3;
return (this.aMemBlocks[iBlock].readLongDirect(off & ~0x3, addr) >>> nShift) | (this.aMemBlocks[(iBlock + 1) & this.nBlockMask].readLongDirect(0, addr + 3) << (32 - nShift));
};
/**
* setByte(addr, b)
*
* For physical addresses only; for linear addresses, use cpu.setByte().
*
* @this {Bus}
* @param {number} addr is a physical address
* @param {number} b is the byte (8-bit) value to write (we truncate it to 8 bits to be safe)
*/
Bus.prototype.setByte = function(addr, b)
{
this.aMemBlocks[(addr & this.nBusMask) >>> this.nBlockShift].writeByte(addr & this.nBlockLimit, b & 0xff, addr);
};
/**
* setByteDirect(addr, b)
*
* This is useful for the Debugger and other components that want to bypass breakpoint detection AND read-only
* memory protection (for example, this is an interface the ROM component could use to initialize ROM contents).
*
* @this {Bus}
* @param {number} addr is a physical address
* @param {number} b is the byte (8-bit) value to write (we truncate it to 8 bits to be safe)
*/
Bus.prototype.setByteDirect = function(addr, b)
{
this.aMemBlocks[(addr & this.nBusMask) >>> this.nBlockShift].writeByteDirect(addr & this.nBlockLimit, b & 0xff, addr);
};
/**
* setShort(addr, w)
*
* For physical addresses only; for linear addresses, use cpu.setShort().
*
* @this {Bus}
* @param {number} addr is a physical address
* @param {number} w is the word (16-bit) value to write (we truncate it to 16 bits to be safe)
*/
Bus.prototype.setShort = function(addr, w)
{
var off = addr & this.nBlockLimit;
var iBlock = (addr & this.nBusMask) >>> this.nBlockShift;
if (off != this.nBlockLimit) {
this.aMemBlocks[iBlock].writeShort(off, w & 0xffff, addr);
return;
}
this.aMemBlocks[iBlock++].writeByte(off, w & 0xff, addr);
this.aMemBlocks[iBlock & this.nBlockMask].writeByte(0, (w >> 8) & 0xff, addr + 1);
};
/**
* setShortDirect(addr, w)
*
* This is useful for the Debugger and other components that want to bypass breakpoint detection AND read-only
* memory protection (for example, this is an interface the ROM component could use to initialize ROM contents).
*
* @this {Bus}
* @param {number} addr is a physical address
* @param {number} w is the word (16-bit) value to write (we truncate it to 16 bits to be safe)
*/
Bus.prototype.setShortDirect = function(addr, w)
{
var off = addr & this.nBlockLimit;
var iBlock = (addr & this.nBusMask) >>> this.nBlockShift;
if (off != this.nBlockLimit) {
this.aMemBlocks[iBlock].writeShortDirect(off, w & 0xffff, addr);
return;
}
this.aMemBlocks[iBlock++].writeByteDirect(off, w & 0xff, addr);
this.aMemBlocks[iBlock & this.nBlockMask].writeByteDirect(0, (w >> 8) & 0xff, addr + 1);
};
/**
* setLong(addr, l)
*
* For physical addresses only; for linear addresses, use cpu.setLong().
*
* @this {Bus}
* @param {number} addr is a physical address
* @param {number} l is the long (32-bit) value to write
*/
Bus.prototype.setLong = function(addr, l)
{
var off = addr & this.nBlockLimit;
var iBlock = (addr & this.nBusMask) >>> this.nBlockShift;
if (off < this.nBlockLimit - 2) {
this.aMemBlocks[iBlock].writeLong(off, l);
return;
}
var lPrev, nShift = (off & 0x3) << 3;
off &= ~0x3;
lPrev = this.aMemBlocks[iBlock].readLong(off, addr);
this.aMemBlocks[iBlock].writeLong(off, (lPrev & ~((0xffffffff|0) << nShift)) | (l << nShift), addr);
iBlock = (iBlock + 1) & this.nBlockMask;
addr += 3;
lPrev = this.aMemBlocks[iBlock].readLong(0, addr);
this.aMemBlocks[iBlock].writeLong(0, (lPrev & ((0xffffffff|0) << nShift)) | (l >>> (32 - nShift)), addr);
};
/**
* setLongDirect(addr, l)
*
* This is useful for the Debugger and other components that want to bypass breakpoint detection AND read-only
* memory protection (for example, this is an interface the ROM component could use to initialize ROM contents).
*
* @this {Bus}
* @param {number} addr is a physical address
* @param {number} l is the long (32-bit) value to write
*/
Bus.prototype.setLongDirect = function(addr, l)
{
var off = addr & this.nBlockLimit;
var iBlock = (addr & this.nBusMask) >>> this.nBlockShift;
if (off < this.nBlockLimit - 2) {
this.aMemBlocks[iBlock].writeLongDirect(off, l, addr);
return;
}
var lPrev, nShift = (off & 0x3) << 3;
off &= ~0x3;
lPrev = this.aMemBlocks[iBlock].readLongDirect(off, addr);
this.aMemBlocks[iBlock].writeLongDirect(off, (lPrev & ~((0xffffffff|0) << nShift)) | (l << nShift), addr);
iBlock = (iBlock + 1) & this.nBlockMask;
addr += 3;
lPrev = this.aMemBlocks[iBlock].readLongDirect(0, addr);
this.aMemBlocks[iBlock].writeLongDirect(0, (lPrev & ((0xffffffff|0) << nShift)) | (l >>> (32 - nShift)), addr);
};
/**
* addBackTrackObject(obj, bto, off)
*
* If bto is null, then we create bto (ie, an object that wraps obj and records off).
*
* If bto is NOT null, then we verify that off is within the given bto's range; if not,
* then we must create a new bto and return that instead.
*
* @this {Bus}
* @param {Object} obj
* @param {BackTrack} bto
* @param {number} off (the offset within obj that this wrapper object is relative to)
* @return {BackTrack|null}
*/
Bus.prototype.addBackTrackObject = function(obj, bto, off)
{
if (BACKTRACK && obj) {
var cbtObjects = this.abtObjects.length;
if (!bto) {
/*
* Try the most recently created bto, on the off-chance it's what the caller needs
*/
if (this.ibtLastAlloc >= 0) bto = this.abtObjects[this.ibtLastAlloc];
}
if (!bto || bto.obj != obj || off < bto.off || off >= bto.off + Bus.BACKTRACK.OFF_MAX) {
bto = {obj: obj, off: off, slot: 0, refs: 0};
var slot;
if (!this.cbtDeletions) {
slot = cbtObjects;
} else {
for (slot = this.ibtLastDelete; slot < cbtObjects; slot++) {
var btoTest = this.abtObjects[slot];
if (!btoTest || !btoTest.refs && !this.isBackTrackWeak(slot << Bus.BACKTRACK.SLOT_SHIFT)) {
this.ibtLastDelete = slot + 1;
this.cbtDeletions--;
break;
}
}
/*
* There's no longer any guarantee that simply because cbtDeletions was non-zero that there WILL
* be an available (existing) slot, because cbtDeletions also counts weak references that may still
* be weak.
*
* this.assert(slot < cbtObjects);
*/
}
this.assert(slot < Bus.BACKTRACK.SLOT_MAX);
this.ibtLastAlloc = slot;
bto.slot = slot + 1;
if (slot == cbtObjects) {
this.abtObjects.push(bto);
} else {
this.abtObjects[slot] = bto;
}
}
return bto;
}
return null;
};
/**
* getBackTrackIndex(bto, off)
*
* @this {Bus}
* @param {BackTrack|null} bto
* @param {number} off
* @return {number}
*/
Bus.prototype.getBackTrackIndex = function(bto, off)
{
var bti = 0;
if (BACKTRACK && bto) {
bti = (bto.slot << Bus.BACKTRACK.SLOT_SHIFT) | Bus.BACKTRACK.TYPE_DATA | (off - bto.off);
}
return bti;
};
/**
* writeBackTrackObject(addr, bto, off)
*
* @this {Bus}
* @param {number} addr is a physical address
* @param {BackTrack|null} bto
* @param {number} off
*/
Bus.prototype.writeBackTrackObject = function(addr, bto, off)
{
if (BACKTRACK && bto) {
this.assert(off - bto.off >= 0 && off - bto.off < Bus.BACKTRACK.OFF_MAX);
var bti = (bto.slot << Bus.BACKTRACK.SLOT_SHIFT) | Bus.BACKTRACK.TYPE_DATA | (off - bto.off);
this.writeBackTrack(addr, bti);
}
};
/**
* readBackTrack(addr)
*
* @this {Bus}
* @param {number} addr is a physical address
* @return {number}
*/
Bus.prototype.readBackTrack = function(addr)
{
if (BACKTRACK) {
return this.aMemBlocks[(addr & this.nBusMask) >>> this.nBlockShift].readBackTrack(addr & this.nBlockLimit);
}
return 0;
};
/**
* writeBackTrack(addr, bti)
*
* @this {Bus}
* @param {number} addr is a physical address
* @param {number} bti
*/
Bus.prototype.writeBackTrack = function(addr, bti)
{
if (BACKTRACK) {
var slot = bti >>> Bus.BACKTRACK.SLOT_SHIFT;
var iBlock = (addr & this.nBusMask) >>> this.nBlockShift;
var btiPrev = this.aMemBlocks[iBlock].writeBackTrack(addr & this.nBlockLimit, bti);
var slotPrev = btiPrev >>> Bus.BACKTRACK.SLOT_SHIFT;
if (slot != slotPrev) {
this.aMemBlocks[iBlock].modBackTrack(true);
if (btiPrev && slotPrev) {
var btoPrev = this.abtObjects[slotPrev-1];
if (!btoPrev) {
if (DEBUGGER && this.dbg && this.dbg.messageEnabled(Messages.WARN)) {
this.dbg.message("writeBackTrack(%" + str.toHex(addr) + ',' + str.toHex(bti) + "): previous index (" + str.toHex(btiPrev) + ") refers to empty slot (" + slotPrev + ")");
}
}
else if (btoPrev.refs <= 0) {
if (DEBUGGER && this.dbg && this.dbg.messageEnabled(Messages.WARN)) {
this.dbg.message("writeBackTrack(%" + str.toHex(addr) + ',' + str.toHex(bti) + "): previous index (" + str.toHex(btiPrev) + ") refers to object with bad ref count (" + btoPrev.refs + ")");
}
} else if (!--btoPrev.refs) {
/*
* We used to just slam a null into the previous slot and consider it gone, but there may still
* be "weak references" to that slot (ie, it may still be associated with a register bti).
*
* The easiest way to handle weak references is to leave the slot allocated, with the object's ref
* count sitting at zero, and change addBackTrackObject() to look for both empty slots AND non-empty
* slots with a ref count of zero; in the latter case, it should again check for weak references,
* after which we can re-use the slot if all its weak references are now gone.
*/
if (!this.isBackTrackWeak(btiPrev)) this.abtObjects[slotPrev-1] = null;
/*
* TODO: Consider what the appropriate trigger should be for resetting ibtLastDelete to zero;
* if we don't OCCASIONALLY set it to zero, we may never clear out obsolete weak references,
* whereas if we ALWAYS set it to zero, we may be forcing addBackTrackObject() to scan the entire
* table too often.
*
* I'd prefer to do something like this:
*
* if (this.ibtLastDelete > slotPrev-1) this.ibtLastDelete = slotPrev-1;
*
* or even this:
*
* if (this.ibtLastDelete > slotPrev-1) this.ibtLastDelete = 0;
*
* But neither one of those guarantees that we will at least occasionally scan the entire table.
*/
this.ibtLastDelete = 0;
this.cbtDeletions++;
}
}
if (bti && slot) {
var bto = this.abtObjects[slot-1];
if (bto) {
this.assert(slot == bto.slot);
bto.refs++;
}
}
}
}
};
/**
* isBackTrackWeak(bti)
*
* @param {number} bti
* @returns {boolean} true if the given bti is still referenced by a register, false if not
*/
Bus.prototype.isBackTrackWeak = function(bti)
{
var bt = this.cpu.backTrack;
var slot = bti >> Bus.BACKTRACK.SLOT_SHIFT;
return (bt.btiAL >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
bt.btiAH >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
bt.btiBL >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
bt.btiBH >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
bt.btiCL >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
bt.btiCH >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
bt.btiDL >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
bt.btiDH >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
bt.btiBPLo >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
bt.btiBPHi >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
bt.btiSILo >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
bt.btiSIHi >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
bt.btiDILo >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
bt.btiDIHi >> Bus.BACKTRACK.SLOT_SHIFT == slot
);
};
/**
* updateBackTrackCode(addr, bti)
*
* @this {Bus}
* @param {number} addr is a physical address
* @param {number} bti
*/
Bus.prototype.updateBackTrackCode = function(addr, bti)
{
if (BACKTRACK) {
if (bti & Bus.BACKTRACK.TYPE_DATA) {
bti = (bti & ~Bus.BACKTRACK.TYPE_MASK) | Bus.BACKTRACK.TYPE_COUNT_INC;
} else if ((bti & Bus.BACKTRACK.TYPE_MASK) < Bus.BACKTRACK.TYPE_COUNT_MAX) {
bti += Bus.BACKTRACK.TYPE_COUNT_INC;
} else {
return;
}
this.aMemBlocks[(addr & this.nBusMask) >>> this.nBlockShift].writeBackTrack(addr & this.nBlockLimit, bti);
}
};
/**
* getBackTrackObject(bti)
*
* @this {Bus}
* @param {number} bti
* @return {Object|null}
*/
Bus.prototype.getBackTrackObject = function(bti)
{
if (BACKTRACK) {
var slot = bti >>> Bus.BACKTRACK.SLOT_SHIFT;
if (slot) {
var bto = this.abtObjects[slot-1];
if (bto) return bto.obj;
}
}
return null;
};
/**
* getBackTrackObjectFromAddr(addr)
*
* @this {Bus}
* @param {number} addr
* @return {Object|null}
*/
Bus.prototype.getBackTrackObjectFromAddr = function(addr)
{
return BACKTRACK? this.getBackTrackObject(this.readBackTrack(addr)) : null;
};
/**
* getBackTrackInfo(bti)
*
* @this {Bus}
* @param {number} bti
* @return {string|null}
*/
Bus.prototype.getBackTrackInfo = function(bti)
{
if (BACKTRACK) {
var bto = this.getBackTrackObject(bti);
if (bto) {
var off = bti & Bus.BACKTRACK.OFF_MASK;
var file = bto.obj.file;
if (file) {
this.assert(!bto.off);
return file.sName + '[' + (bto.obj.offFile + off) + ']';
}
return bto.obj.idComponent + '[' + (bto.off + off) + ']';
}
}
return null;
};
/**
* getBackTrackInfoFromAddr(addr)
*
* @this {Bus}
* @param {number} addr
* @return {string|null}
*/
Bus.prototype.getBackTrackInfoFromAddr = function(addr)
{
return BACKTRACK? this.getBackTrackInfo(this.readBackTrack(addr)) : null;
};
/**
* saveMemory()
*
* The only memory blocks we save are those marked as dirty; most likely all of RAM will have been marked dirty,
* and even if our dirty-memory flags were as smart as our dirty-sector flags (ie, were set only when a write changed
* what was already there), it's unlikely that would reduce the number of RAM blocks we must save/restore. At least
* all the ROM blocks should be clean (except in the unlikely event that the Debugger was used to modify them).
*
* All dirty blocks will be stored in a single array, as pairs of block numbers and data arrays, like so:
*
* [iBlock0, [dw0, dw1, ...], iBlock1, [dw0, dw1, ...], ...]
*
* In a normal 4Kb block, there will be 1K DWORD values in the data array. Remember that each DWORD is a signed 32-bit
* integer (because they are formed using bit-wise operator rather than floating-point math operators), so don't be
* surprised to see negative numbers in the data.
*
* The above example assumes "uncompressed" data arrays. If we choose to use "compressed" data arrays, the data arrays
* will look like:
*
* [count0, dw0, count1, dw1, ...]
*
* where each count indicates how many times the following DWORD value occurs. A data array length less than 1K indicates
* that it's compressed, since we'll only store them in compressed form if they actually shrank, and we'll use State
* helper methods compress() and decompress() to create and expand the compressed data arrays.
*
* @this {Bus}
* @return {Array} a
*/
Bus.prototype.saveMemory = function()
{
var i = 0;
var a = [];
for (var iBlock = 0; iBlock < this.nBlockTotal; iBlock++) {
var block = this.aMemBlocks[iBlock];
/*
* We have to check both fDirty and fDirtyEver, because we may have called cleanMemory() on some of
* the memory blocks (eg, video memory), and while cleanMemory() will clear a dirty block's fDirty flag,
* it also sets the dirty block's fDirtyEver flag, which is left set for the lifetime of the machine.
*/
if (block.fDirty || block.fDirtyEver) {
a[i++] = iBlock;
a[i++] = State.compress(block.save());
}
}
a[i] = this.getA20();
return a;
};
/**
* restoreMemory(a)
*
* This restores the contents of all Memory blocks; called by X86CPU.restore().
*
* In theory, we ONLY have to save/restore block contents. Other block attributes,
* like the type, the memory controller (if any), and the active memory access functions,
* should already be restored, since every component (re)allocates all the memory blocks
* it was using when it's restored. And since the CPU is guaranteed to be the last
* component to be restored, all those blocks (and their attributes) should be in place now.
*
* See saveMemory() for a description of how the memory block contents are saved.
*
* @this {Bus}
* @param {Array} a
* @return {boolean} true if successful, false if not
*/
Bus.prototype.restoreMemory = function(a)
{
var i;
for (i = 0; i < a.length - 1; i += 2) {
var iBlock = a[i];
var adw = a[i+1];
if (adw && adw.length < this.nBlockLen) {
adw = State.decompress(adw, this.nBlockLen);
}
var block = this.aMemBlocks[iBlock];
if (!block || !block.restore(adw)) {
/*
* Either the block to restore hasn't been allocated, indicating a change in the machine
* configuration since it was last saved (the most likely explanation) or there's some internal
* inconsistency (eg, the block size is wrong).
*/
Component.error("Unable to restore memory block " + iBlock);
return false;
}
}
if (a[i] !== undefined) this.setA20(a[i]);
return true;
};
/**
* addMemBreak(addr, fWrite)
*
* @this {Bus}
* @param {number} addr
* @param {boolean} fWrite is true for a memory write breakpoint, false for a memory read breakpoint
*/
Bus.prototype.addMemBreak = function(addr, fWrite)
{
if (DEBUGGER) {
var iBlock = addr >>> this.nBlockShift;
this.aMemBlocks[iBlock].addBreakpoint(addr & this.nBlockLimit, fWrite);
}
};
/**
* removeMemBreak(addr, fWrite)
*
* @this {Bus}
* @param {number} addr
* @param {boolean} fWrite is true for a memory write breakpoint, false for a memory read breakpoint
*/
Bus.prototype.removeMemBreak = function(addr, fWrite)
{
if (DEBUGGER) {
var iBlock = addr >>> this.nBlockShift;
this.aMemBlocks[iBlock].removeBreakpoint(addr & this.nBlockLimit, fWrite);
}
};
/**
* addPortInputBreak(port)
*
* @this {Bus}
* @param {number} [port]
* @return {boolean} true if break on port input enabled, false if disabled
*/
Bus.prototype.addPortInputBreak = function(port)
{
if (port === undefined) {
this.fPortInputBreakAll = !this.fPortInputBreakAll;
return this.fPortInputBreakAll;
}
if (this.aPortInputNotify[port] === undefined) {
this.aPortInputNotify[port] = [null, null, false];
}
this.aPortInputNotify[port][2] = !this.aPortInputNotify[port][2];
return this.aPortInputNotify[port][2];
};
/**
* addPortInputNotify(start, end, component, fn)
*
* Add a port input-notification handler to the list of such handlers.
*
* @this {Bus}
* @param {number} start port address
* @param {number} end port address
* @param {Component} component
* @param {function(number,number)} fn is called with the port and LIP values at the time of the input
*/
Bus.prototype.addPortInputNotify = function(start, end, component, fn)
{
if (fn !== undefined) {
for (var port = start; port <= end; port++) {
if (this.aPortInputNotify[port] !== undefined) {
Component.warning("Input port " + str.toHexWord(port) + " registered by " + this.aPortInputNotify[port][0].id + ", ignoring " + component.id);
continue;
}
this.aPortInputNotify[port] = [component, fn, false, false];
if (MAXDEBUG) this.log("addPortInputNotify(" + str.toHexWord(port) + "," + component.id + ")");
}
}
};
/**
* addPortInputTable(component, table, offset)
*
* Add port input-notification handlers from the specified table (a batch version of addPortInputNotify)
*
* @this {Bus}
* @param {Component} component
* @param {Object} table
* @param {number} [offset] is an optional port offset
*/
Bus.prototype.addPortInputTable = function(component, table, offset)
{
if (offset === undefined) offset = 0;
for (var port in table) {
this.addPortInputNotify(+port + offset, +port + offset, component, table[port]);
}
};
/**
* checkPortInputNotify(port, addrLIP)
*
* @this {Bus}
* @param {number} port
* @param {number} [addrLIP] is the LIP value at the time of the input
* @return {number} simulated port value (0xff if none)
*
* NOTE: It seems that at least parts of the ROM BIOS (like the RS-232 probes around F000:E5D7 in the 5150 BIOS)
* assume that ports for non-existent hardware return 0xff rather than 0x00, hence my new default (0xff) below.
*/
Bus.prototype.checkPortInputNotify = function(port, addrLIP)
{
var bIn = 0xff;
var aNotify = this.aPortInputNotify[port];
if (BACKTRACK) {
this.cpu.backTrack.btiIO = 0;
}
if (aNotify !== undefined) {
if (aNotify[1]) {
var b = aNotify[1].call(aNotify[0], port, addrLIP);
if (b !== undefined) bIn = b;
}
if (DEBUGGER && this.dbg && this.fPortInputBreakAll != aNotify[2]) {
this.dbg.checkPortInput(port, bIn);
}
}
else {
if (DEBUGGER && this.dbg) {
this.dbg.messageIO(this, port, null, addrLIP);
if (this.fPortInputBreakAll) this.dbg.checkPortInput(port, bIn);
}
}
return bIn;
};
/**
* removePortInputNotify(start, end, component, fn)
*
* Remove a port input-notification handler from the list of such handlers (to be ENABLED later if needed)
*
* @this {Bus}
* @param {number} start address
* @param {number} end address
* @param {Component} component
* @param {function(number,number)} fn of previously added handler
*
Bus.prototype.removePortInputNotify = function(start, end, component, fn)
{
for (var port = start; port < end; port++) {
if (this.aPortInputNotify[port] && this.aPortInputNotify[port][0] == component && this.aPortInputNotify[port][1] == fn) {
this.aPortInputNotify[port] = undefined;
}
}
};
*/
/**
* addPortOutputBreak(port)
*
* @this {Bus}
* @param {number} [port]
* @return {boolean} true if break on port output enabled, false if disabled
*/
Bus.prototype.addPortOutputBreak = function(port)
{
if (port === undefined) {
this.fPortOutputBreakAll = !this.fPortOutputBreakAll;
return this.fPortOutputBreakAll;
}
if (this.aPortOutputNotify[port] === undefined) {
this.aPortOutputNotify[port] = [null, null, false];
}
this.aPortOutputNotify[port][2] = !this.aPortOutputNotify[port][2];
return this.aPortOutputNotify[port][2];
};
/**
* addPortOutputNotify(start, end, component, fn)
*
* Add a port output-notification handler to the list of such handlers.
*
* @this {Bus}
* @param {number} start port address
* @param {number} end port address
* @param {Component} component
* @param {function(number,number)} fn is called with the port and LIP values at the time of the output
*/
Bus.prototype.addPortOutputNotify = function(start, end, component, fn)
{
if (fn !== undefined) {
for (var port = start; port <= end; port++) {
if (this.aPortOutputNotify[port] !== undefined) {
Component.warning("Output port " + str.toHexWord(port) + " registered by " + this.aPortOutputNotify[port][0].id + ", ignoring " + component.id);
continue;
}
this.aPortOutputNotify[port] = [component, fn, false, false];
if (MAXDEBUG) this.log("addPortOutputNotify(" + str.toHexWord(port) + "," + component.id + ")");
}
}
};
/**
* addPortOutputTable(component, table, offset)
*
* Add port output-notification handlers from the specified table (a batch version of addPortOutputNotify)
*
* @this {Bus}
* @param {Component} component
* @param {Object} table
* @param {number} [offset] is an optional port offset
*/
Bus.prototype.addPortOutputTable = function(component, table, offset)
{
if (offset === undefined) offset = 0;
for (var port in table) {
this.addPortOutputNotify(+port + offset, +port + offset, component, table[port]);
}
};
/**
* checkPortOutputNotify(port, bOut, addrLIP)
*
* @this {Bus}
* @param {number} port
* @param {number} bOut
* @param {number} [addrLIP] is the LIP value at the time of the output
*/
Bus.prototype.checkPortOutputNotify = function(port, bOut, addrLIP)
{
var aNotify = this.aPortOutputNotify[port];
if (aNotify !== undefined) {
if (aNotify[1]) {
aNotify[1].call(aNotify[0], port, bOut, addrLIP);
}
if (DEBUGGER && this.dbg && this.fPortOutputBreakAll != aNotify[2]) {
this.dbg.checkPortOutput(port, bOut);
}
}
else {
if (DEBUGGER && this.dbg) {
this.dbg.messageIO(this, port, bOut, addrLIP);
if (this.fPortOutputBreakAll) this.dbg.checkPortOutput(port, bOut);
}
}
};
/**
* removePortOutputNotify(start, end, component, fn)
*
* Remove a port output-notification handler from the list of such handlers (to be ENABLED later if needed)
*
* @this {Bus}
* @param {number} start address
* @param {number} end address
* @param {Component} component
* @param {function(number,number)} fn of previously added handler
*
Bus.prototype.removePortOutputNotify = function(start, end, component, fn)
{
for (var port = start; port < end; port++) {
if (this.aPortOutputNotify[port] && this.aPortOutputNotify[port][0] == component && this.aPortOutputNotify[port][1] == fn) {
this.aPortOutputNotify[port] = undefined;
}
}
};
*/
/**
* reportError(op, addr, size)
*
* @this {Bus}
* @param {number} op
* @param {number} addr
* @param {number} size
* @return {boolean} false
*/
Bus.prototype.reportError = function(op, addr, size)
{
Component.error("Memory block error (" + op + "," + str.toHex(addr) + "," + str.toHex(size) + ")");
return false;
};
if (typeof module !== 'undefined') module.exports = Bus;
/**
* @fileoverview Implements the PCjs ChipSet component.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-Sep-14
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
if (typeof module !== 'undefined') {
var str = require("../../shared/lib/strlib");
var usr = require("../../shared/lib/usrlib");
var web = require("../../shared/lib/weblib");
var Component = require("../../shared/lib/component");
var Interrupts = require("./interrupts");
var Messages = require("./messages");
var State = require("./state");
}
/**
* ChipSet(parmsChipSet)
*
* The ChipSet component has the following component-specific (parmsChipSet) properties:
*
* model: "5150", "5160", "5170" or "deskpro386" (should be a member of ChipSet.MODELS)
* sw1: 8-character binary string representing the SW1 DIP switches (SW1[1-8])
* sw2: 8-character binary string representing the SW2 DIP switches (SW2[1-8]) (MODEL_5150 only)
* sound: true to enable (experimental) sound support (default); false to disable
* scaleTimers: true to divide timer cycle counts by the CPU's cycle multiplier (default is false)
* floppies: array of floppy drive sizes in Kb (default is "[360, 360]" if no sw1 value provided)
* monitor: none|tv|color|mono|ega|vga (if no sw1 value provided, default is "ega" for 5170, "mono" otherwise)
* rtcDate: optional RTC date/time (in GMT) to use on reset; use the ISO 8601 format; eg: "2014-10-01T08:00:00"
*
* The conventions used for the sw1 and sw2 strings are that the left-most character represents DIP switch [1],
* the right-most character represents DIP switch [8], and "1" means the DIP switch is ON and "0" means it is OFF.
*
* Internally, we convert the above strings into binary values that the 8255A PPI returns, where DIP switch [1]
* is bit 0 and DIP switch [8] is bit 7, and 0 indicates the switch is ON and 1 indicates it is OFF.
*
* For reference, here's how the SW1 and SW2 switches correspond to the internal 8255A PPI bit values:
*
* SW1[1] (bit 0) "0xxxxxxx" (1): IPL, "1xxxxxxx" (0): No IPL
* SW1[2] (bit 1) reserved
* SW1[3,4] (bits 3-2) "xx11xxxx" (00): 16Kb, "xx01xxxx" (01): 32Kb, "xx10xxxx" (10): 48Kb, "xx00xxxx" (11): 64Kb
* SW1[5,6] (bits 5-4) "xxxx11xx" (00): none, "xxxx01xx" (01): tv, "xxxx10xx" (10): color, "xxxx00xx" (11): mono
* SW1[7,8] (bits 7-6) "xxxxxx11" (00): 1 FD, "xxxxxx01" (01): 2 FD, "xxxxxx10" (10): 3 FD, "xxxxxx00" (11): 4 FD
*
* Note: FD refers to floppy drive, and IPL refers to an "Initial Program Load" floppy drive.
*
* SW2[1-4] (bits 3-0) "NNNNxxxx": number of 32Kb blocks of I/O expansion RAM present
*
* TODO: There are cryptic references to SW2[5] in the original (5150) TechRef, and apparently the 8255A PPI can
* be programmed to return it (which we support), but its purpose remains unclear to me (see PPI_B.ENABLE_SW2).
*
* For example, sw1="01110011" indicates that all SW1 DIP switches are ON, except for SW1[1], SW1[5] and SW1[6],
* which are OFF. Internally, the order of these bits must reversed (to 11001110) and then inverted (to 00110001)
* to yield the value that the 8255A PPI returns. Reading the final value right-to-left, 00110001 indicates an
* IPL floppy drive, 1X of RAM (where X is 16Kb on a MODEL_5150 and 64Kb on a MODEL_5160), MDA, and 1 floppy drive.
*
* WARNING: It is possible to set SW1 to indicate more memory than the RAM component has been configured to provide.
* This is a configuration error which will cause the machine to crash after reporting a "201" error code (memory
* test failure), which is presumably what a real machine would do if it was similarly misconfigured. Surprisingly,
* the BIOS forges ahead, setting SP to the top of the memory range indicated by SW1 (via INT 0x12), but the lack of
* a valid stack causes the system to crash after the next IRET. The BIOS should have either halted or modified
* the actual memory size to match the results of the memory test.
*
* This module provides support for many of the following components (except where a separate component is noted).
* This list is taken from p.1-8 ("System Unit") of the IBM 5160 (PC XT) Technical Reference Manual (as revised
* April 1983), only because I didn't see a similar listing in the original 5150 TechRef.
*
* Port(s) Description
* ------- -----------
* 000-00F DMA Chip 8237A-5 [see below]
* 020-021 Interrupt 8259A [see below]
* 040-043 Timer 8253-5 [see below]
* 060-063 PPI 8255A-5 [see below]
* 080-083 DMA Page Registers [see below]
* 0Ax [1] NMI Mask Register [see below]
* 0Cx Reserved
* 0Ex Reserved
* 200-20F Game Control
* 210-217 Expansion Unit
* 220-24F Reserved
* 278-27F Reserved
* 2F0-2F7 Reserved
* 2F8-2FF Asynchronous Communications (Secondary) [see the SerialPort component]
* 300-31F Prototype Card
* 320-32F Hard Drive Controller (XTC) [see the HDC component]
* 378-37F Printer
* 380-38C [2] SDLC Communications
* 380-389 [2] Binary Synchronous Communications (Secondary)
* 3A0-3A9 Binary Synchronous Communications (Primary)
* 3B0-3BF IBM Monochrome Display/Printer [see the Video component]
* 3C0-3CF Reserved
* 3D0-3DF Color/Graphics (Motorola 6845) [see the Video component]
* 3EO-3E7 Reserved
* 3FO-3F7 Floppy Drive Controller [see the FDC component]
* 3F8-3FF Asynchronous Communications (Primary) [see the SerialPort component]
*
* [1] At power-on time, NMI is masked off, perhaps because models 5150 and 5160 also tie coprocessor
* interrupts to NMI. Suppressing NMI by default seems odd, because that would also suppress memory
* parity errors. TODO: Determine whether "power-on time" refers to the initial power-on state of the
* NMI Mask Register or the state that the BIOS "POST" (Power-On Self-Test) sets.
*
* [2] These devices cannot be used together since their port addresses overlap.
*
* MODEL_5170 Description
* ---------- -----------
* 070 [3] CMOS Address ChipSet.CMOS.ADDR.PORT
* 071 CMOS Data ChipSet.CMOS.DATA.PORT
* 0F0 Coprocessor Clear Busy (output 0x00)
* 0F1 Coprocessor Reset (output 0x00)
* 1F0-1F7 Hard Drive Controller (ATC) [see the HDC component]
*
* [3] Port 0x70 doubles as the NMI Mask Register: output a CMOS address with bit 7 clear to enable NMI
* or with bit 7 set to disable NMI (apparently the inverse of the older NMI Mask Register at port 0xA0).
* Also, apparently unlike previous models, the MODEL_5170 POST leaves NMI enabled. And fortunately, the
* coprocessor interrupt line is no longer tied to NMI (it uses IRQ 13).
*
* @constructor
* @extends Component
* @param {Object} parmsChipSet
*/
function ChipSet(parmsChipSet)
{
Component.call(this, "ChipSet", parmsChipSet, ChipSet, Messages.CHIPSET);
this.model = parmsChipSet['model'];
this.model = this.model && ChipSet.MODELS[this.model] || ChipSet.MODEL_5150;
/*
* SW1 describes the number of floppy drives, the amount of base memory, the primary monitor type,
* and (on the MODEL_5160) whether or not a coprocessor is installed. If no SW1 settings are provided,
* we look for individual 'floppies' and 'monitor' settings and build a default SW1 value.
*
* The defaults below select max memory, monochrome monitor (EGA monitor for MODEL_5170), and two floppies.
* Don't get too excited about "max memory" either: on a MODEL_5150, the max was 64Kb, and on a MODEL_5160,
* the max was 256Kb. However, the RAM component is free to install as much base memory as it likes,
* overriding the SW1 memory setting.
*
* Given that the ROM BIOS is hard-coded to load boot sectors @0000:7C00, the minimum amount of system RAM
* required to boot is therefore 32Kb. Whether that's actually enough to run any or all versions of PC-DOS is
* a separate question. FYI, with only 16Kb, the ROM BIOS will still try to boot, and fail miserably.
*/
this.sw1Init = 0;
var sw1 = parmsChipSet['sw1'];
if (sw1) {
this.sw1Init = this.parseSwitches(sw1, ChipSet.PPI_SW.MEMORY.X4 | ChipSet.PPI_SW.MONITOR.MONO);
} else {
this.aFloppyDrives = [360, 360];
var aFloppyDrives = parmsChipSet['floppies'];
if (aFloppyDrives && aFloppyDrives.length) this.aFloppyDrives = aFloppyDrives;
var nDrives = this.aFloppyDrives.length;
if (nDrives) {
this.sw1Init |= ChipSet.PPI_SW.FDRIVE.IPL;
nDrives--;
this.sw1Init |= ((nDrives & 0x3) << ChipSet.PPI_SW.FDRIVE.SHIFT);
}
var sMonitor = parmsChipSet['monitor'] || (this.model < ChipSet.MODEL_5170? "mono" : "ega");
if (sMonitor && ChipSet.aMonitorSwitches[sMonitor] !== undefined) {
this.sw1Init |= (ChipSet.aMonitorSwitches[sMonitor] << ChipSet.PPI_SW.MONITOR.SHIFT);
}
}
/*
* SW2 describes the number of 32Kb blocks of I/O expansion RAM that's present in the system. The MODEL_5150
* ROM BIOS only checked/supported the first four switches, so the maximum amount of additional RAM specifiable
* was 15 * 32Kb, or 480Kb. With a maximum of 64Kb on the motherboard, the MODEL_5150 ROM BIOS could support
* a grand total of 544Kb.
*
* For MODEL_5160 (PC XT) and up, memory expansion cards had their own configuration switches, and the motherboard
* SW2 switches for I/O expansion RAM were eliminated. Instead, the ROM BIOS scans the entire address space
* (up to 0xA0000) looking for additional memory. As a result, the only mechanism we provide for adding RAM
* (above the maximum of 256Kb supported on the motherboard) is the "size" parameter of the RAM component.
*
* NOTE: If you use the "size" parameter, you will not be able to dynamically alter the memory configuration;
* the RAM component will ignore any changes to SW1.
*/
this.sw2Init = this.parseSwitches(parmsChipSet['sw2'] || "11110000", 0);
/*
* The SW1 memory setting is actually just a multiplier: it's multiplied by 16Kb on a MODEL_5150, 64Kb otherwise.
*/
this.kbSW = (this.model == ChipSet.MODEL_5150? 16 : 64);
this.cDMACs = this.cPICs = 1;
if (this.model >= ChipSet.MODEL_5170) {
this.cDMACs = this.cPICs = 2;
}
this.fScaleTimers = parmsChipSet['scaleTimers'] || false;
this.sRTCDate = parmsChipSet['rtcDate'];
/*
* Here, I'm finally getting around to trying the Web Audio API. Fortunately, based on what little I know about
* sound generation, using the API to make the same noises as the IBM PC speaker seems straightforward.
*
* To start, we create an audio context, unless the 'sound' parameter has been explicitly set to false.
*
* From:
*
* http://developer.apple.com/library/safari/#documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/PlayingandSynthesizingSounds/PlayingandSynthesizingSounds.html
*
* "Similar to how HTML5 canvas requires a context on which lines and curves are drawn, Web Audio requires an audio context
* on which sounds are played and manipulated. This context will be the parent object of further audio objects to come....
* Your audio context is typically created when your page initializes and should be long-lived. You can play multiple sounds
* coming from multiple sources within the same context, so it is unnecessary to create more than one audio context per page."
*/
this.fSpeaker = false;
if (parmsChipSet['sound']) {
this.classAudio = this.contextAudio = null;
if (window) {
this.classAudio = window['AudioContext'] || window['webkitAudioContext'];
}
if (this.classAudio) {
this.contextAudio = new this.classAudio();
} else {
if (DEBUG) this.log("AudioContext not available");
}
}
/*
* I used to defer ChipSet's reset() to powerUp(), which then gave us the option of doing either
* reset() OR restore(), instead of both. However, on MODEL_5170 machines, the initial CMOS data
* needs to be created earlier, so that when other components are initializing their state (eg, when
* HDC calls setCMOSDriveType() or RAM calls addCMOSMemory()), the CMOS will be ready to take their calls.
*/
this.reset(true);
this.setReady();
}
Component.subclass(ChipSet);
/*
* Supported model numbers
*
* Unless otherwise noted, all BIOS references refer to the *original* BIOS released with each model.
*/
ChipSet.MODEL_5150 = 5150; // used in reference to the 1st 5150 BIOS, dated Apr 24, 1981
ChipSet.MODEL_5160 = 5160; // used in reference to the 1st 5160 BIOS, dated Nov 8, 1982
ChipSet.MODEL_5170 = 5170; // used in reference to the 1st 5170 BIOS, dated Jan 10, 1984
/*
* The following are fake model numbers, used only to document issues/features in later IBM PC AT BIOS revisions.
*/
ChipSet.MODEL_5170_REV2 = 5170.2; // used in reference to the 2nd 5170 BIOS, dated Jun 10, 1985
ChipSet.MODEL_5170_REV3 = 5170.3; // used in reference to the 3rd 5170 BIOS, dated Nov 15, 1985
/*
* The following are even more fake model numbers, as we begin to depart from the IBM lineage. All that
* really matters at this point is that MODEL_DESKPRO386 > MODEL_5170.
*/
ChipSet.MODEL_DESKPRO386 = 5180;
/*
* Last but not least, a complete list of supported model strings, and corresponding internal model numbers.
*/
ChipSet.MODELS = {
"5150": ChipSet.MODEL_5150,
"5160": ChipSet.MODEL_5160,
"5170": ChipSet.MODEL_5170,
"deskpro386": ChipSet.MODEL_DESKPRO386
};
/*
* Values returned by ChipSet.getSWVideoMonitor()
*/
ChipSet.MONITOR = {
NONE: 0,
TV: 1, // Composite monitor (lower resolution; no support)
COLOR: 2, // Color Display (5153)
MONO: 3, // Monochrome Display (5151)
EGACOLOR: 4, // Enhanced Color Display (5154) in High-Res Mode
EGAEMULATION: 6, // Enhanced Color Display (5154) in Emulation Mode
VGACOLOR: 7 // VGA Color Display
};
/*
* Lookup table for converting ChipSet "monitor" values into the corresponding SW1 switch bits
* (they must be shifted left by ChipSet.PPI_SW.MONITOR.SHIFT before OR'ing them into sw1/sw1Init).
*/
ChipSet.aMonitorSwitches = {
"none": 0x0,
"tv": 0x1,
"color": 0x2,
"mono": 0x3,
"ega": 0x0,
"vga": 0x0
};
/*
* 8237A DMA Controller (DMAC) I/O ports
*
* MODEL_5150 and up uses DMA channel 0 for memory refresh cycles and channel 2 for the FDC.
*
* MODEL_5160 and up uses DMA channel 3 for HDC transfers (XTC only).
*
* DMA0 refers to the original DMA controller found on all models, and DMA1 refers to the additional
* controller found on MODEL_5170 and up; channel 4 on DMA1 is used to "cascade" channels 0-3 from DMA0,
* so only channels 5-7 are available on DMA1.
*
* For FDC DMA notes, refer to http://wiki.osdev.org/ISA_DMA
* For general DMA notes, refer to http://www.freebsd.org/doc/en/books/developers-handbook/dma.html
*
* TODO: Determine why the MODEL_5150 ROM BIOS sets the DMA channel 1 page register (port 0x83) to zero.
*/
ChipSet.DMA0 = {
INDEX: 0,
PORT: {
CH0_ADDR: 0x00, // OUT: starting address IN: current address
CH0_COUNT: 0x01, // OUT: starting word count IN: remaining word count
CH1_ADDR: 0x02, // OUT: starting address IN: current address
CH1_COUNT: 0x03, // OUT: starting word count IN: remaining word count
CH2_ADDR: 0x04, // OUT: starting address IN: current address
CH2_COUNT: 0x05, // OUT: starting word count IN: remaining word count
CH3_ADDR: 0x06, // OUT: starting address IN: current address
CH3_COUNT: 0x07, // OUT: starting word count IN: remaining word count
CMD_STATUS: 0x08, // OUT: command register IN: status register
REQUEST: 0x09,
MASK: 0x0A,
MODE: 0x0B,
RESET_FF: 0x0C, // reset flip-flop
MASTER_CLEAR: 0x0D, // master clear
MASK_CLEAR: 0x0E, // TODO: Provide handlers
MASK_ALL: 0x0F, // TODO: Provide handlers
CH2_PAGE: 0x81, // OUT: DMA channel 2 page register
CH3_PAGE: 0x82, // OUT: DMA channel 3 page register
CH1_PAGE: 0x83, // OUT: DMA channel 1 page register
CH0_PAGE: 0x87 // OUT: DMA channel 0 page register (unusable; See "The Inside Out" book, p.246)
}
};
ChipSet.DMA1 = {
INDEX: 1,
PORT: {
CH6_PAGE: 0x89, // OUT: DMA channel 6 page register (MODEL_5170)
CH7_PAGE: 0x8A, // OUT: DMA channel 7 page register (MODEL_5170)
CH5_PAGE: 0x8B, // OUT: DMA channel 5 page register (MODEL_5170)
CH4_PAGE: 0x8F, // OUT: DMA channel 4 page register (MODEL_5170; unusable; aka "Refresh" page register?)
CH4_ADDR: 0xC0, // OUT: starting address IN: current address
CH4_COUNT: 0xC2, // OUT: starting word count IN: remaining word count
CH5_ADDR: 0xC4, // OUT: starting address IN: current address
CH5_COUNT: 0xC6, // OUT: starting word count IN: remaining word count
CH6_ADDR: 0xC8, // OUT: starting address IN: current address
CH6_COUNT: 0xCA, // OUT: starting word count IN: remaining word count
CH7_ADDR: 0xCC, // OUT: starting address IN: current address
CH7_COUNT: 0xCE, // OUT: starting word count IN: remaining word count
CMD_STATUS: 0xD0, // OUT: command register IN: status register
REQUEST: 0xD2,
MASK: 0xD4,
MODE: 0xD6,
RESET_FF: 0xD8, // reset flip-flop
MASTER_CLEAR: 0xDA, // master clear
MASK_CLEAR: 0xDC, // TODO: Provide handlers
MASK_ALL: 0xDE // TODO: Provide handlers
}
};
ChipSet.DMA_CMD = {
M2M_ENABLE: 0x01,
CH0HOLD_ENABLE: 0x02,
CTRL_DISABLE: 0x04,
COMP_TIMING: 0x08,
ROT_PRIORITY: 0x10,
EXT_WRITE_SEL: 0x20,
DREQ_ACTIVE_LO: 0x40,
DACK_ACTIVE_HI: 0x80
};
ChipSet.DMA_STATUS = {
CH0_TC: 0x01, // Channel 0 has reached Terminal Count (TC)
CH1_TC: 0x02, // Channel 1 has reached Terminal Count (TC)
CH2_TC: 0x04, // Channel 2 has reached Terminal Count (TC)
CH3_TC: 0x08, // Channel 3 has reached Terminal Count (TC)
ALL_TC: 0x0f, // all TC bits are cleared whenever DMA_STATUS is read
CH0_REQ: 0x10, // Channel 0 DMA requested
CH1_REQ: 0x20, // Channel 1 DMA requested
CH2_REQ: 0x40, // Channel 2 DMA requested
CH3_REQ: 0x80 // Channel 3 DMA requested
};
ChipSet.DMA_MASK = {
CHANNEL: 0x03,
CHANNEL_SET: 0x04
};
ChipSet.DMA_MODE = {
CHANNEL: 0x03, // bits 0-1 select 1 of 4 possible channels
TYPE: 0x0C, // bits 2-3 select 1 of 3 valid (4 possible) transfer types
TYPE_VERIFY: 0x00, // pseudo transfer (generates addresses, responds to EOP, but nothing is moved)
TYPE_WRITE: 0x04, // write to memory (move data FROM an I/O device; eg, reading a sector from a disk)
TYPE_READ: 0x08, // read from memory (move data TO an I/O device; eg, writing a sector to a disk)
AUTOINIT: 0x10,
DECREMENT: 0x20, // clear for INCREMENT
MODE: 0xC0, // bits 6-7 select 1 of 4 possible transfer modes
MODE_DEMAND: 0x00,
MODE_SINGLE: 0x40,
MODE_BLOCK: 0x80,
MODE_CASCADE: 0xC0
};
ChipSet.DMA_REFRESH = 0x00; // DMA channel assigned to memory refresh
ChipSet.DMA_FDC = 0x02; // DMA channel assigned to the Floppy Drive Controller (FDC)
ChipSet.DMA_HDC = 0x03; // DMA channel assigned to the Hard Drive Controller (HDC; XTC only)
/*
* 8259A Programmable Interrupt Controller (PIC) I/O ports
*
* Internal registers:
*
* ICW1 Initialization Command Word 1 (sent to port ChipSet.PIC_LO)
* ICW2 Initialization Command Word 2 (sent to port ChipSet.PIC_HI)
* ICW3 Initialization Command Word 3 (sent to port ChipSet.PIC_HI)
* ICW4 Initialization Command Word 4 (sent to port ChipSet.PIC_HI)
* IMR Interrupt Mask Register
* IRR Interrupt Request Register
* ISR Interrupt Service Register
* IRLow (IR having lowest priority; IR+1 will have highest priority; default is 7)
*
* Note that ICW2 effectively contains the starting IDT vector number (ie, for IRQ 0),
* which must be multiplied by 4 to calculate the vector offset, since every vector is 4 bytes long.
*
* Also, since the low 3 bits of ICW2 are ignored in 8086/8088 mode (ie, they are effectively
* treated as zeros), this means that the starting IDT vector can only be a multiple of 8.
*
* So, if ICW2 is set to 0x08, the starting vector number (ie, for IRQ 0) will be 0x08, and the
* 4-byte address for the corresponding ISR will be located at offset 0x20 in the real-mode IDT.
*
* ICW4 is typically set to 0x09, indicating 8086 mode, non-automatic EOI, buffered/slave mode.
*
* TODO: Determine why the original ROM BIOS chose buffered/slave over buffered/master.
* Did it simply not matter in pre-AT systems with only one PIC, or am I misreading something?
*
* TODO: Consider support for level-triggered PIC interrupts, even though the original IBM PCs
* (up through MODEL_5170) used only edge-triggered interrupts.
*/
ChipSet.PIC0 = { // all models: the "master" PIC
INDEX: 0,
PORT_LO: 0x20,
PORT_HI: 0x21
};
ChipSet.PIC1 = { // MODEL_5170 and up: the "slave" PIC
INDEX: 1,
PORT_LO: 0xA0,
PORT_HI: 0xA1
};
ChipSet.PIC_LO = { // ChipSet.PIC1.PORT_LO or ChipSet.PIC2.PORT_LO
ICW1: 0x10, // set means ICW1
ICW1_ICW4: 0x01, // ICW4 needed (otherwise ICW4 must be sent)
ICW1_SNGL: 0x02, // single PIC (and therefore no ICW3; otherwise there is another "cascaded" PIC)
ICW1_ADI: 0x04, // call address interval is 4 (otherwise 8; presumably ignored in 8086/8088 mode)
ICW1_LTIM: 0x08, // level-triggered interrupt mode (otherwise edge-triggered mode, which is what PCs use)
OCW2: 0x00, // bit 3 (PIC_LO.OCW3) and bit 4 (ChipSet.PIC_LO.ICW1) are clear in an OCW2 command byte
OCW2_IR_LVL: 0x07,
OCW2_OP_MASK: 0xE0, // of the following valid OCW2 operations, the first 4 are EOI commands (all have ChipSet.PIC_LO.OCW2_EOI set)
OCW2_EOI: 0x20, // non-specific EOI (end-of-interrupt)
OCW2_EOI_SPEC: 0x60, // specific EOI
OCW2_EOI_ROT: 0xA0, // rotate on non-specific EOI
OCW2_EOI_ROTSPEC: 0xE0, // rotate on specific EOI
OCW2_SET_ROTAUTO: 0x80, // set rotate in automatic EOI mode
OCW2_CLR_ROTAUTO: 0x00, // clear rotate in automatic EOI mode
OCW2_SET_PRI: 0xC0, // bits 0-2 specify the lowest priority interrupt
OCW3: 0x08, // bit 3 (PIC_LO.OCW3) is set and bit 4 (PIC_LO.ICW1) clear in an OCW3 command byte (bit 7 should be clear, too)
OCW3_READ_IRR: 0x02, // read IRR register
OCW3_READ_ISR: 0x03, // read ISR register
OCW3_READ_CMD: 0x03,
OCW3_POLL_CMD: 0x04, // poll
OCW3_SMM_RESET: 0x40, // special mask mode: reset
OCW3_SMM_SET: 0x60, // special mask mode: set
OCW3_SMM_CMD: 0x60
};
ChipSet.PIC_HI = { // ChipSet.PIC1.PORT_HI or ChipSet.PIC2.PORT_HI
ICW2_VECTOR: 0xF8, // starting vector number (bits 0-2 are effectively treated as zeros in 8086/8088 mode)
ICW4_8086: 0x01,
ICW4_AUTO_EOI: 0x02,
ICW4_MASTER: 0x04,
ICW4_BUFFERED: 0x08,
ICW4_FULLY_NESTED: 0x10,
OCW1_IMR: 0xFF
};
/*
* The priorities of IRQs 0-7 are normally high to low, unless the master PIC has been reprogrammed.
* Also, if a slave PIC is present, the priorities of IRQs 8-15 fall between the priorities of IRQs 1 and 3.
*
* As the MODEL_5170 TechRef states:
*
* "Interrupt requests are prioritized, with IRQ9 through IRQ12 and IRQ14 through IRQ15 having the
* highest priority (IRQ9 is the highest) and IRQ3 through IRQ7 having the lowest priority (IRQ7 is
* the lowest).
*
* Interrupt 13 (IRQ.COPROC) is used on the system board and is not available on the I/O channel.
* Interrupt 8 (IRQ.RTC) is used for the real-time clock."
*
* This priority scheme is a byproduct of IRQ8 through IRQ15 (slave PIC interrupts) being tied to IRQ2 of
* the master PIC. As a result, the two other system board interrupts, IRQ0 and IRQ1, continue to have the
* highest priority, by default.
*/
ChipSet.IRQ = {
TIMER0: 0x00,
KBD: 0x01,
SLAVE: 0x02, // MODEL_5170
COM2: 0x03,
COM1: 0x04,
XTC: 0x05, // MODEL_5160 uses IRQ 5 for HDC (XTC version)
LPT2: 0x05, // MODEL_5170 uses IRQ 5 for LPT2
FDC: 0x06,
LPT1: 0x07,
RTC: 0x08, // MODEL_5170
IRQ2: 0x09, // MODEL_5170
COPROC: 0x0D, // MODEL_5170
ATC: 0x0E // MODEL_5170 uses IRQ 14 for HDC (ATC version)
};
/*
* 8253 Programmable Interval Timer (PIT) I/O ports
*
* Although technically, a PIT provides 3 "counters" rather than 3 "timers", we have
* adopted IBM's TechRef nomenclature, which refers to the PIT's counters as TIMER0,
* TIMER1, and TIMER2. For machines with a second PIT (eg, the DeskPro 386), we refer
* to those additional counters as TIMER3, TIMER4, and TIMER5.
*
* In addition, if there's a need to refer to a specfic PIT, use PIT0 for the first PIT
* and PIT1 for the second. This mirrors how we refer to multiple DMA controllers
* (eg, DMA0 and DMA1) and multiple PICs (eg, PIC0 and PIC1).
*
* This differs from Compaq's nomenclature, which used "Timer 1" to refer to the first
* PIT, and "Timer 2" for the second PIT, and then referred to "Counter 0", "Counter 1",
* and "Counter 2" within each PIT.
*/
ChipSet.PIT0 = {
PORT: 0x40,
TIMER0: 0, // used for time-of-day (prior to MODEL_5170)
TIMER1: 1, // used for memory refresh
TIMER2: 2 // used for speaker tone generation
};
ChipSet.PIT1 = {
PORT: 0x48, // MODEL_DESKPRO386 only
TIMER3: 0, // used for fail-safe clock
TIMER4: 1, // N/A
TIMER5: 2 // used for refresher request extend/speed control
};
ChipSet.PIT_CTRL = {
PORT1: 0x43, // write-only control register (use the Read-Back command to get status)
PORT2: 0x4B, // write-only control register (use the Read-Back command to get status)
BCD: 0x01,
MODE: 0x0E,
MODE0: 0x00, // interrupt on Terminal Count (TC)
MODE1: 0x02, // programmable one-shot
MODE2: 0x04, // rate generator
MODE3: 0x06, // square wave generator
MODE4: 0x08, // software-triggered strobe
MODE5: 0x0A, // hardware-triggered strobe
RW: 0x30,
RW_LATCH: 0x00,
RW_LSB: 0x10,
RW_MSB: 0x20,
RW_BOTH: 0x30,
SC: 0xC0,
SC_CTR0: 0x00,
SC_CTR1: 0x40,
SC_CTR2: 0x80,
SC_BACK: 0xC0
};
ChipSet.TIMER_TICKS_PER_SEC = 1193181;
/*
* 8255A Programmable Peripheral Interface (PPI) I/O ports, for Cassette/Speaker/Keyboard/SW1/etc
*
* Normally, 0x99 is written to PPI_CTRL.PORT, indicating that PPI_A.PORT and PPI_C.PORT are INPUT ports
* and PPI_B.PORT is an OUTPUT port.
*
* However, the MODEL_5160 ROM BIOS initially writes 0x89 instead, making PPI_A.PORT an OUTPUT port.
* I'm guessing that's just part of some "diagnostic mode", because all it writes to PPI_A.PORT are a series
* of "checkpoint" values (ie, 0x01, 0x02, and 0x03) before updating PPI_CTRL.PORT with the usual 0x99.
*/
ChipSet.PPI_A = { // this.bPPIA (port 0x60)
PORT: 0x60 // INPUT: keyboard scan code (PPI_B.CLEAR_KBD must be clear)
};
ChipSet.PPI_B = { // this.bPPIB (port 0x61)
PORT: 0x61, // OUTPUT (although it has to be treated as INPUT, too: the keyboard interrupt handler reads it, OR's PPI_B.CLEAR_KBD, writes it, and then rewrites the original read value)
CLK_TIMER2: 0x01, // ALL: set to enable clock to TIMER2
SPK_TIMER2: 0x02, // ALL: set to connect output of TIMER2 to speaker (MODEL_5150: clear for cassette)
ENABLE_SW2: 0x04, // MODEL_5150: set to enable SW2[1-4] through PPI_C.PORT, clear to enable SW2[5]; MODEL_5160: unused (there is no SW2 switch block on the MODEL_5160 motherboard)
CASS_MOTOR_OFF: 0x08, // MODEL_5150: cassette motor off
ENABLE_SW_HI: 0x08, // MODEL_5160: clear to read SW1[1-4], set to read SW1[5-8]
DISABLE_RW_MEM: 0x10, // ALL: clear to enable RAM parity check, set to disable
DISABLE_IO_CHK: 0x20, // ALL: clear to enable I/O channel check, set to disable
CLK_KBD: 0x40, // ALL: clear to force keyboard clock low
CLEAR_KBD: 0x80 // ALL: clear to enable keyboard scan codes (MODEL_5150: set to enable SW1 through PPI_A.PORT)
};
ChipSet.PPI_C = { // this.bPPIC (port 0x62)
PORT: 0x62, // INPUT (see below)
SW: 0x0F, // MODEL_5150: SW2[1-4] or SW2[5], depending on whether PPI_B.ENABLE_SW2 is set or clear; MODEL_5160: SW1[1-4] or SW1[5-8], depending on whether PPI_B.ENABLE_SW_HI is clear or set
CASS_DATA_IN: 0x10,
TIMER2_OUT: 0x20,
IO_CHANNEL_CHK: 0x40, // used by NMI handler to detect I/O channel errors
RW_PARITY_CHK: 0x80 // used by NMI handler to detect R/W memory parity errors
};
ChipSet.PPI_CTRL = { // this.bPPICtrl (port 0x63)
PORT: 0x63, // OUTPUT: initialized to 0x99, defining PPI_A and PPI_C as INPUT and PPI_B as OUTPUT
A_IN: 0x10,
B_IN: 0x02,
C_IN_LO: 0x01,
C_IN_HI: 0x08,
B_MODE: 0x04,
A_MODE: 0x60
};
/*
* On the MODEL_5150, the following PPI_SW bits are exposed through PPI_A.
*
* On the MODEL_5160, either the low or high 4 bits are exposed through PPI_C.SW, if PPI_B.ENABLE_SW_HI is clear or set.
*/
ChipSet.PPI_SW = {
FDRIVE: {
IPL: 0x01, // MODEL_5150: IPL ("Initial Program Load") floppy drive attached; MODEL_5160: "Loop on POST"
ONE: 0x00, // 1 floppy drive attached (or 0 drives if PPI_SW.FDRIVE_IPL is not set -- MODEL_5150 only)
TWO: 0x40, // 2 floppy drives attached
THREE: 0x80, // 3 floppy drives attached
FOUR: 0xC0, // 4 floppy drives attached
MASK: 0xC0,
SHIFT: 6
},
COPROC: 0x02, // MODEL_5150: reserved; MODEL_5160: coprocessor installed
MEMORY: { // MODEL_5150: "X" is 16Kb; MODEL_5160: "X" is 64Kb
X1: 0x00, // 16Kb or 64Kb
X2: 0x04, // 32Kb or 128Kb
X3: 0x08, // 48Kb or 192Kb
X4: 0x0C, // 64Kb or 256Kb
MASK: 0x0C,
SHIFT: 2
},
MONITOR: {
TV: 0x10,
COLOR: 0x20,
MONO: 0x30,
MASK: 0x30,
SHIFT: 4
}
};
/*
* 8042 Keyboard Controller I/O ports (MODEL_5170)
*
* On the MODEL_5170, port 0x60 is designated KBC.DATA rather than PPI_A, although the BIOS also refers to it
* as "PORT_A: 8042 KEYBOARD SCAN/DIAG OUTPUTS"). This is the 8042's output buffer and should be read only when
* KBC.STATUS.OUTBUFF_FULL is set.
*
* Similarly, port 0x61 is designated KBC.RWREG rather than PPI_B; the BIOS also refers to it as "PORT_B: 8042
* READ WRITE REGISTER", but it is not otherwise discussed in the MODEL_5170 TechRef's 8042 documentation.
*
* There are brief references to bits 0 and 1 (KBC.RWREG.CLK_TIMER2 and KBC.RWREG.SPK_TIMER2), and the BIOS sets
* bits 2-7 to "DISABLE PARITY CHECKERS" (principally KBC.RWREG.DISABLE_NMI, which are bits 2 and 3); why the BIOS
* also sets bits 4-7 (or if those bits are even settable) is unclear, since it uses 11111100b rather than defined
* constants.
*
* The bottom line: on a MODEL_5170, port 0x61 is still used for speaker control and parity checking, so we use
* the same register (bPPIB) but install different I/O handlers. It's also bi-directional: at one point, the BIOS
* reads KBC.RWREG.REFRESH_BIT (bit 4) to verify that it's alternating.
*
* PPI_C and PPI_CTRL don't seem to be documented or used by the MODEL_5170 BIOS, so I'm assuming they're obsolete.
*
* NOTE: For more information on the 8042 Controller, including information on undocumented commands, refer to the
* documents in /devices/pc/keyboard, as well as the following websites:
*
* http://halicery.com/8042/8042_INTERN_TXT.htm
* http://www.os2museum.com/wp/ibm-pcat-8042-keyboard-controller-commands/
*/
ChipSet.KBC = {
DATA: { // this.b8042OutBuff (PPI_A on previous models, still referred to as "PORT A" by the MODEL_5170 BIOS)
PORT: 0x60,
CMD: { // this.b8042CmdData (KBC.DATA.CMD "data bytes" written to port 0x60, after writing a KBC.CMD byte to port 0x64)
INT_ENABLE: 0x01, // generate an interrupt when the controller places data in the output buffer
SYS_FLAG: 0x04, // this value is propagated to ChipSet.KBC.STATUS.SYS_FLAG
NO_INHIBIT: 0x08, // disable inhibit function
NO_CLOCK: 0x10, // disable keyboard by driving "clock" line low
PC_MODE: 0x20,
PC_COMPAT: 0x40 // generate IBM PC-compatible scan codes
},
SELF_TEST: { // result of ChipSet.KBC.CMD.SELF_TEST command (0xAA)
OK: 0x55
},
INTF_TEST: { // result of ChipSet.KBC.CMD.INTF_TEST command (0xAB)
OK: 0x00, // no error
CLOCK_LO: 0x01, // keyboard clock line stuck low
CLOCK_HI: 0x02, // keyboard clock line stuck high
DATA_LO: 0x03, // keyboard data line stuck low
DATA_HI: 0x04 // keyboard data line stuck high
}
},
INPORT: { // this.b8042InPort
COMPAQ_50MHZ: 0x01, // 50Mhz system clock enabled (0=48Mhz); see Compaq 386/25 TechRef p2-106
UNDEFINED: 0x02, // undefined
COMPAQ_NO80387: 0x04, // 80387 coprocessor NOT installed; see Compaq 386/25 TechRef p2-106
COMPAQ_NOWEITEK:0x08, // Weitek coprocessor NOT installed; see Compaq 386/25 TechRef p2-106
ENABLE_256KB: 0x10, // enable 2nd 256Kb of system board RAM
COMPAQ_HISPEED: 0x10, // high-speed enabled (0=auto); see Compaq 386/25 TechRef p2-106
MFG_OFF: 0x20, // manufacturing jumper not installed
COMPAQ_DIP5OFF: 0x20, // system board DIP switch #5 OFF (0=ON); see Compaq 386/25 TechRef p2-106
MONO: 0x40, // monochrome monitor is primary display
COMPAQ_NONDUAL: 0x40, // Compaq Dual-Mode monitor NOT installed; see Compaq 386/25 TechRef p2-106
KBD_UNLOCKED: 0x80 // keyboard not inhibited (in Compaq parlance: security lock is unlocked)
},
OUTPORT: { // this.b8042OutPort
NO_RESET: 0x01, // set by default
A20_ON: 0x02, // set by default
COMPAQ_SLOWD: 0x08, // SL0WD* NOT asserted (refer to timer 2, counter 2); see Compaq 386/25 TechRef p2-105
OUTBUFF_FULL: 0x10, // output buffer full
INBUFF_EMPTY: 0x20, // input buffer empty
KBD_CLOCK: 0x40, // keyboard clock (output)
KBD_DATA: 0x80 // keyboard data (output)
},
TESTPORT: { // generated "on the fly"
KBD_CLOCK: 0x01, // keyboard clock (input)
KBD_DATA: 0x02 // keyboard data (input)
},
RWREG: { // this.bPPIB (since CLK_TIMER2 and SPK_TIMER2 are in both PPI_B and RWREG)
PORT: 0x61,
CLK_TIMER2: 0x01, // set to enable clock to TIMER2 (R/W)
SPK_TIMER2: 0x02, // set to connect output of TIMER2 to speaker (R/W)
COMPAQ_FSNMI: 0x04, // set to disable RAM/FS NMI (R/W, DESKPRO386)
COMPAQ_IONMI: 0x08, // set to disable IOCHK NMI (R/W, DESKPRO386)
DISABLE_NMI: 0x0C, // set to disable IOCHK and RAM/FS NMI, clear to enable (R/W)
REFRESH_BIT: 0x10, // 0 if RAM refresh occurring, 1 if RAM not in refresh cycle (R/O)
OUT_TIMER2: 0x20, // state of TIMER2 output signal (R/O, DESKPRO386)
IOCHK_NMI: 0x40, // IOCHK NMI (R/O); to reset, pulse bit 3 (0x08)
RAMFS_NMI: 0x80, // RAM/FS (parity or fail-safe) NMI (R/O); to reset, pulse bit 2 (0x04)
NMI_ERROR: 0xC0
},
CMD: { // this.b8042InBuff (on write to port 0x64, interpret this as a CMD)
PORT: 0x64,
READ_CMD: 0x20, // sends the current CMD byte (this.b8042CmdData) to KBC.DATA.PORT
WRITE_CMD: 0x60, // followed by a command byte written to KBC.DATA.PORT (see KBC.DATA.CMD)
COMPAQ_SLOWD: 0xA3, // enable system slow down; see Compaq 386/25 TechRef p2-111
COMPAQ_TOGGLE: 0xA4, // toggle speed-control bit; see Compaq 386/25 TechRef p2-111
COMPAQ_SPCREAD: 0xA5, // special read of "port 2"; see Compaq 386/25 TechRef p2-111
SELF_TEST: 0xAA, // self-test (KBC.DATA.SELF_TEST.OK is placed in the output buffer if no errors)
INTF_TEST: 0xAB, // interface test
DIAG_DUMP: 0xAC, // diagnostic dump
DISABLE_KBD: 0xAD, // disable keyboard
ENABLE_KBD: 0xAE, // enable keyboard
READ_INPORT: 0xC0, // read input port and place data in output buffer (use only if output buffer empty)
READ_OUTPORT: 0xD0, // read output port and place data in output buffer (use only if output buffer empty)
WRITE_OUTPORT: 0xD1, // next byte written to KBC.DATA.PORT (port 0x60) is placed in the output port (see KBC.OUTPORT)
READ_TEST: 0xE0,
PULSE_OUTPORT: 0xF0 // this is the 1st of 16 commands (0xF0-0xFF) that pulse bits 0-3 of the output port
},
STATUS: { // this.b8042Status (on read from port 0x64)
PORT: 0x64,
OUTBUFF_FULL: 0x01,
INBUFF_FULL: 0x02, // set if the controller has received but not yet read data from the input buffer (not normally set)
SYS_FLAG: 0x04,
CMD_FLAG: 0x08, // set on write to KBC.CMD (port 0x64), clear on write to KBC.DATA (port 0x60)
NO_INHIBIT: 0x10, // (in Compaq parlance: security lock not engaged)
XMT_TIMEOUT: 0x20,
RCV_TIMEOUT: 0x40,
PARITY_ERR: 0x80, // last byte of data received had EVEN parity (ODD parity is normally expected)
OUTBUFF_DELAY: 0x100
}
};
/*
* MC146818A RTC/CMOS Ports (MODEL_5170)
*
* Write a CMOS address to ChipSet.CMOS.ADDR.PORT, then read/write data from/to ChipSet.CMOS.DATA.PORT.
*
* The ADDR port also controls NMI: write an address with bit 7 clear to enable NMI or set to disable NMI.
*/
ChipSet.CMOS = {
ADDR: { // this.bCMOSAddr
PORT: 0x70,
RTC_SEC: 0x00,
RTC_SEC_ALRM: 0x01,
RTC_MIN: 0x02,
RTC_MIN_ALRM: 0x03,
RTC_HOUR: 0x04,
RTC_HOUR_ALRM: 0x05,
RTC_WEEK_DAY: 0x06,
RTC_MONTH_DAY: 0x07,
RTC_MONTH: 0x08,
RTC_YEAR: 0x09,
STATUSA: 0x0A,
STATUSB: 0x0B,
STATUSC: 0x0C,
STATUSD: 0x0D,
DIAG: 0x0E,
SHUTDOWN: 0x0F,
FDRIVE: 0x10,
HDRIVE: 0x12,
EQUIP: 0x14,
BASEMEM_LO: 0x15,
BASEMEM_HI: 0x16, // the BASEMEM values indicate the total Kb of base memory, up to 0x280 (640Kb)
EXTMEM_LO: 0x17,
EXTMEM_HI: 0x18, // the EXTMEM values indicate the total Kb of extended memory, up to 0x3C00 (15Mb)
CHKSUM_HI: 0x2E,
CHKSUM_LO: 0x2F, // CMOS bytes included in the checksum calculation: 0x10-0x2D
EXTMEM2_LO: 0x30,
EXTMEM2_HI: 0x31,
CENTURY_DATE: 0x32, // BCD value for the current century (eg, 0x19 for 20th century, 0x20 for 21st century)
BOOT_INFO: 0x33, // 0x80 if 128Kb expansion memory installed, 0x40 if Setup Utility wants an initial setup message
MASK: 0x3F,
TOTAL: 0x40,
NMI_DISABLE: 0x80
},
DATA: { // this.abCMOSData
PORT: 0x71
},
STATUSA: { // abCMOSData[ChipSet.CMOS.ADDR.STATUSA]
UIP: 0x80, // bit 7: 1 indicates Update-In-Progress, 0 indicates date/time ready to read
DV: 0x70, // bits 6-4 (DV2-DV0) are programmed to 010 to select a 32.768Khz time base
RS: 0x0F // bits 3-0 (RS3-RS0) are programmed to 0110 to select a 976.562us interrupt rate
},
STATUSB: { // abCMOSData[ChipSet.CMOS.ADDR.STATUSB]
SET: 0x80, // bit 7: 1 to set any/all of the 14 time-bytes
PIE: 0x40, // bit 6: 1 for Periodic Interrupt Enable
AIE: 0x20, // bit 5: 1 for Alarm Interrupt Enable
UIE: 0x10, // bit 4: 1 for Update Interrupt Enable
SQWE: 0x08, // bit 3: 1 for Square Wave Enabled (as set by the STATUSA rate selection bits)
BINARY: 0x04, // bit 2: 1 for binary Date Mode, 0 for BCD Date Mode
HOUR24: 0x02, // bit 1: 1 for 24-hour mode, 0 for 12-hour mode
DST: 0x01 // bit 0: 1 for Daylight Savings Time enabled
},
STATUSC: { // abCMOSData[ChipSet.CMOS.ADDR.STATUSC]
IRQF: 0x80, // bit 7: 1 indicates one or more of the following bits (PF, AF, UF) are set
PF: 0x40, // bit 6: 1 indicates Periodic Interrupt
AF: 0x20, // bit 5: 1 indicates Alarm Interrupt
UF: 0x10, // bit 4: 1 indicates Update Interrupt
RESERVED: 0x0F
},
STATUSD: { // abCMOSData[ChipSet.CMOS.ADDR.STATUSD]
VRB: 0x80, // bit 7: 1 indicates Valid RAM Bit (0 implies power was and/or is lost)
RESERVED: 0x7F
},
DIAG: { // abCMOSData[ChipSet.CMOS.ADDR.DIAG]
RTCFAIL: 0x80, // bit 7: 1 indicates RTC lost power
CHKSUMFAIL: 0x40, // bit 6: 1 indicates bad CMOS checksum
CONFIGFAIL: 0x20, // bit 5: 1 indicates bad CMOS configuration info
MEMSIZEFAIL: 0x10, // bit 4: 1 indicates memory size miscompare
HDRIVEFAIL: 0x08, // bit 3: 1 indicates hard drive controller or drive init failure
TIMEFAIL: 0x04, // bit 2: 1 indicates time failure
RESERVED: 0x03
},
FDRIVE: { // abCMOSData[ChipSet.CMOS.ADDR.FDRIVE]
D0_MASK: 0xF0, // Drive 0 type in high nibble
D1_MASK: 0x0F, // Drive 1 type in lower nibble
NONE: 0, // no drive
/*
* There's at least one floppy drive type that IBM didn't bother defining a CMOS drive type for:
* single-sided drives that were only capable of storing 160Kb (or 180Kb when using 9 sectors/track).
* So, as you can see in getSWFloppyDriveType(), we lump all standard diskette capacities <= 360Kb
* into the FD360 bucket.
*/
FD360: 1, // 5.25-inch double-sided double-density (DSDD 48TPI) drive: 40 tracks, 9 sectors/track, 360Kb max
FD1200: 2, // 5.25-inch double-sided high-density (DSHD 96TPI) drive: 80 tracks, 15 sectors/track, 1200Kb max
FD720: 3, // 3.5-inch drive capable of storing 80 tracks and up to 9 sectors/track, 720Kb max
FD1440: 4 // 3.5-inch drive capable of storing 80 tracks and up to 18 sectors/track, 1440Kb max
},
/*
* HDRIVE types are defined by table in the HDC component, which uses setCMOSDriveType() to update the CMOS
*/
HDRIVE: { // abCMOSData[ChipSet.CMOS.ADDR.HDRIVE]
D0_MASK: 0xF0, // Drive 0 type in high nibble
D1_MASK: 0x0F // Drive 1 type in lower nibble
},
/*
* The CMOS equipment flags use the same format as the older PPI equipment flags
*/
EQUIP: { // abCMOSData[ChipSet.CMOS.ADDR.EQUIP]
MONITOR: ChipSet.PPI_SW.MONITOR, // PPI_SW.MONITOR.MASK == 0x30
COPROC: ChipSet.PPI_SW.COPROC, // PPI_SW.COPROC == 0x02
FDRIVE: ChipSet.PPI_SW.FDRIVE // PPI_SW.FDRIVE.IPL == 0x01 and PPI_SW.FDRIVE.MASK = 0xC0
}
};
/*
* DMA Page Registers
*
* The MODEL_5170 TechRef lists 0x80-0x9F as the range for DMA page registers, but that may be a bit
* overbroad. There are a total of 8 (7 usable) DMA channels on the MODEL_5170, each of which has the
* following assigned DMA page registers:
*
* Channel # Page Reg
* --------- --------
* 0 0x87
* 1 0x83
* 2 0x81
* 3 0x82
* 4 0x8F (not usable; the 5170 TechRef refers to this as the "Refresh" page register)
* 5 0x8B
* 6 0x89
* 7 0x8A
*
* That leaves 0x80, 0x84, 0x85, 0x86, 0x88, 0x8C, 0x8D and 0x8E unaccounted for in the range 0x80-0x8F.
* (I'm saving the question of what, if anything, is available in the range 0x90-0x9F for another day.)
*
* As for port 0x80, the TechRef says:
*
* "I/O address hex 080 is used as a diagnostic-checkpoint port or register.
* This port corresponds to a read/write register in the DMA page register (74LS612)."
*
* so I used to have dedicated handlers and storage (bMFGData) for the register at port 0x80, but I've since
* appended it to abDMAPageSpare, an 8-element array that captures all I/O to the 8 unassigned (aka "spare")
* DMA page registers. The 5170 BIOS uses 0x80 as a "checkpoint" register, and the DESKPRO386 uses 0x84 in a
* similar fashion. The 5170 also contains "MFG_TST" code that uses other unassigned DMA page registers as
* scratch registers, which come in handy when RAM hasn't been tested/initialized yet.
*
* Here's our mapping of entries in the abDMAPageSpare array to the unassigned ("spare") DMA page registers:
*
* Index # Page Reg
* -------- --------
* 0 0x84
* 1 0x85
* 2 0x86
* 3 0x88
* 4 0x8C
* 5 0x8D
* 6 0x8E
* 7 0x80
*
* The only reason port 0x80 is out of sequence (ie, at the end of the array, at index 7 instead of index 0) is
* because it was added the array later, and the entire array gets written to our save/restore data structures, so
* reordering the elements would be a bad idea.
*/
/*
* NMI Mask Register (MODEL_5150 and MODEL_5160 only)
*/
ChipSet.NMI = { // this.bNMI
PORT: 0xA0,
ENABLE: 0x80,
DISABLE: 0x00
};
/*
* Coprocessor Control Registers (MODEL_5170)
*/
ChipSet.COPROC = { // TODO: Define a variable for this
PORT_CLEAR: 0xF0, // clear the coprocessor's "busy" state
PORT_RESET: 0xF1 // reset the coprocessor
};
/**
* @this {ChipSet}
* @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
* @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "sw1")
* @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
* @return {boolean} true if binding was successful, false if unrecognized binding request
*/
ChipSet.prototype.setBinding = function(sHTMLType, sBinding, control)
{
switch (sBinding) {
case "sw1":
this.bindings[sBinding] = control;
this.addSwitches(sBinding, control, 8, this.sw1Init, {
0: (this.model == ChipSet.MODEL_5150? "Bootable Floppy Drive" : "Loop on POST"),
1: (this.model == ChipSet.MODEL_5150? "Reserved" : "Coprocessor"),
2: "Base Memory Size", // up to 64Kb on a MODEL_5150, 256Kb on a MODEL_5160
4: "Monitor Type",
6: "Number of Floppy Drives"
});
return true;
case "sw2":
if (this.model == ChipSet.MODEL_5150) {
this.bindings[sBinding] = control;
this.addSwitches(sBinding, control, 8, this.sw2Init, {
0: "Expansion Memory Size", // up to 480Kb, which, when combined with 64Kb of MODEL_5150 base memory, gives a maximum of 544Kb
4: "Reserved"
});
return true;
}
break;
case "swdesc":
this.bindings[sBinding] = control;
return true;
default:
break;
}
return false;
};
/**
* initBus(cmp, bus, cpu, dbg)
*
* @this {ChipSet}
* @param {Computer} cmp
* @param {Bus} bus
* @param {X86CPU} cpu
* @param {Debugger} dbg
*/
ChipSet.prototype.initBus = function(cmp, bus, cpu, dbg)
{
this.bus = bus;
this.cpu = cpu;
this.dbg = dbg;
this.cmp = cmp;
this.kbd = cmp.getComponentByType("Keyboard");
/*
* This divisor is invariant, so we calculate it as soon as we're able to query the CPU's base speed.
*/
this.nTicksDivisor = (cpu.getCyclesPerSecond() / ChipSet.TIMER_TICKS_PER_SEC);
bus.addPortInputTable(this, ChipSet.aPortInput);
bus.addPortOutputTable(this, ChipSet.aPortOutput);
if (this.model < ChipSet.MODEL_5170) {
bus.addPortInputTable(this, ChipSet.aPortInput5150);
bus.addPortOutputTable(this, ChipSet.aPortOutput5150);
} else {
bus.addPortInputTable(this, ChipSet.aPortInput5170);
bus.addPortOutputTable(this, ChipSet.aPortOutput5170);
}
if (DEBUGGER) {
if (dbg) {
var chipset = this;
/*
* TODO: Add more "dumpers" (eg, for DMA, RTC, 8042, etc)
*/
dbg.messageDump(Messages.PIC, function onDumpPIC() {
chipset.dumpPIC();
});
dbg.messageDump(Messages.TIMER, function onDumpTimer() {
chipset.dumpTimer();
});
dbg.messageDump(Messages.CMOS, function onDumpCMOS() {
chipset.dumpCMOS();
});
}
cpu.addIntNotify(Interrupts.RTC.VECTOR, this, this.intBIOSRTC);
}
};
/**
* powerUp(data, fRepower)
*
* @this {ChipSet}
* @param {Object|null} data
* @param {boolean} [fRepower]
* @return {boolean} true if successful, false if failure
*/
ChipSet.prototype.powerUp = function(data, fRepower)
{
if (!fRepower) {
if (!data) {
this.reset();
} else {
if (!this.restore(data)) return false;
}
}
return true;
};
/**
* powerDown(fSave, fShutdown)
*
* @this {ChipSet}
* @param {boolean} fSave
* @param {boolean} [fShutdown]
* @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
*/
ChipSet.prototype.powerDown = function(fSave, fShutdown)
{
return fSave && this.save? this.save() : true;
};
/**
* reset(fHard)
*
* @this {ChipSet}
* @param {boolean} [fHard] true on the initial reset (not a normal "soft" reset)
*/
ChipSet.prototype.reset = function(fHard)
{
/*
* We propagate the sw1Init/sw2Init values to sw1/sw2 at reset; the user is only
* allowed to tweak sw1Init/sw2Init, which doesn't take effect until the next reset.
*/
var i;
this.sw1 = this.sw1Init;
this.sw2 = this.sw2Init;
this.updateSwitchDesc();
/*
* DMA (Direct Memory Access) Controller initialization
*/
this.aDMACs = new Array(this.cDMACs);
for (i = 0; i < this.cDMACs; i++) {
this.initDMAController(i);
}
/*
* PIC (Programmable Interupt Controller) initialization
*/
this.aPICs = new Array(this.cPICs);
this.initPIC(ChipSet.PIC0.INDEX, ChipSet.PIC0.PORT_LO);
if (this.cPICs > 1) {
this.initPIC(ChipSet.PIC1.INDEX, ChipSet.PIC1.PORT_LO);
}
/*
* PIT (Programmable Interval Timer) initialization
*
* Although the DeskPro 386 refers to the timers in the first PIT as "Timer 1, Counter 0",
* "Timer 1, Counter 1" and "Timer 1, Counter 2", we're sticking with IBM's nomenclature:
* TIMER0, TIMER1 and TIMER2. Which means that we refer to the "counters" in the second PIT
* as TIMER3, TIMER4 and TIMER5; that numbering also matches their indexes in the aTimers array.
*/
this.bPIT1Ctrl = null; // tracks writes to port 0x43
this.bPIT2Ctrl = null; // tracks writes to port 0x4B (MODEL_DESKPRO386 only)
this.aTimers = new Array(this.model == ChipSet.MODEL_DESKPRO386? 6 : 3);
for (i = 0; i < this.aTimers.length; i++) {
this.initTimer(i);
}
/*
* PPI and other misc ports
*/
this.bPPIA = null; // tracks writes to port 0x60, in case PPI_CTRL.A_IN is not set
this.bPPIB = null; // tracks writes to port 0x61, in case PPI_CTRL.B_IN is not set
this.bPPIC = null; // tracks writes to port 0x62, in case PPI_CTRL.C_IN_LO or PPI_CTRL.C_IN_HI is not set
this.bPPICtrl = null; // tracks writes to port 0x63 (eg, 0x99); read-only
this.bNMI = ChipSet.NMI.DISABLE;// tracks writes to the NMI Mask Register
/*
* ChipSet state introduced by the MODEL_5170
*/
if (this.model >= ChipSet.MODEL_5170) {
/*
* The 8042 input buffer is treated as a "command byte" when written via port 0x64 and as a "data byte"
* when written via port 0x60. So, whenever the KBC.CMD.WRITE_CMD "command byte" is written to the input
* buffer, the subsequent command data byte is saved in b8042CmdData. Similarly, for KBC.CMD.WRITE_OUTPORT,
* the subsequent data byte is saved in b8042OutPort.
*
* TODO: Consider a UI for the Keyboard INHIBIT switch. By default, our keyboard is never inhibited
* (ie, locked). Also, note that the hardware changes this bit only when new data is sent to b8042OutBuff.
*/
this.b8042Status = ChipSet.KBC.STATUS.NO_INHIBIT;
this.b8042InBuff = 0;
this.b8042CmdData = ChipSet.KBC.DATA.CMD.NO_CLOCK;
this.b8042OutBuff = 0;
/*
* TODO: Provide more control over these 8042 "Input Port" bits (eg, the keyboard lock)
*/
this.b8042InPort = ChipSet.KBC.INPORT.MFG_OFF | ChipSet.KBC.INPORT.KBD_UNLOCKED;
if (this.getSWMemorySize() >= 512) {
this.b8042InPort |= ChipSet.KBC.INPORT.ENABLE_256KB;
}
if (this.getSWVideoMonitor() == ChipSet.MONITOR.MONO) {
this.b8042InPort |= ChipSet.KBC.INPORT.MONO;
}
if (COMPAQ386 && this.model == ChipSet.MODEL_DESKPRO386) {
this.b8042InPort |= ChipSet.KBC.INPORT.COMPAQ_NO80387 | ChipSet.KBC.INPORT.COMPAQ_NOWEITEK;
}
this.b8042OutPort = ChipSet.KBC.OUTPORT.NO_RESET | ChipSet.KBC.OUTPORT.A20_ON;
this.abDMAPageSpare = new Array(8);
this.bCMOSAddr = 0; // NMI is enabled, since the ChipSet.CMOS.ADDR.NMI_DISABLE bit is not set in bCMOSAddr
/*
* Now that we call reset() from the ChipSet constructor, enabling other components to update
* their own CMOS information as needed, we must distinguish between the initial ("hard") reset
* and any later ("soft") resets (eg, from powerUp() calls), and make sure the latter preserves
* existing CMOS information.
*/
if (fHard) {
this.abCMOSData = new Array(ChipSet.CMOS.ADDR.TOTAL);
}
this.initRTCTime(this.sRTCDate);
/*
* initCMOSData() will initialize a variety of "legacy" CMOS bytes, but it will NOT overwrite any memory
* size or hard drive type information that might have been set, via addCMOSMemory() or setCMOSDriveType().
*/
this.initCMOSData();
}
if (DEBUGGER && MAXDEBUG) {
/*
* Arrays for interrupt counts (one count per IRQ) and timer data
*/
this.acInterrupts = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
this.acTimersFired = [0, 0, 0];
this.acTimer0Counts = [];
}
};
/**
* initRTCTime(sDate)
*
* Initialize the RTC portion of the CMOS registers to match the specified date/time (or if none is specified,
* the current date/time). The date/time should be expressed in the ISO 8601 format; eg: "2011-10-10T14:48:00".
*
* NOTE: There are two approaches we could take here: always store the RTC bytes in binary, and convert them
* to/from BCD on-demand (ie, as the simulation reads/writes the CMOS RTC registers); or init/update them in the
* format specified by CMOS.STATUSB.BINARY (1 for binary, 0 for BCD). Both approaches require BCD conversion
* functions, but the former seems more efficient, in part because the periodic calls to updateRTCTime() won't
* require any conversions.
*
* We take the same approach with the CMOS.STATUSB.HOUR24 setting: internally, we always operate in 24-hour mode,
* but externally, we convert the RTC hour values to the 12-hour format as needed.
*
* Thus, all I/O to the RTC bytes must be routed through the getRTCByte() and setRTCByte() functions, to ensure
* that all the necessary on-demand conversions occur.
*
* @this {ChipSet}
* @param {string} [sDate]
*/
ChipSet.prototype.initRTCTime = function(sDate)
{
/*
* NOTE: I've already been burned once by a JavaScript library function that did NOT treat an undefined
* parameter (ie, a parameter === undefined) the same as an omitted parameter (eg, the async parameter in
* xmlHTTP.open() in IE), so I'm taking no chances here: if sDate is undefined, then explicitly call Date()
* with no parameters.
*/
var date = sDate? new Date(sDate) : new Date();
/*
* Example of a valid Date string:
*
* 2014-10-01T08:00:00 (interpreted as GMT, resulting in "Wed Oct 01 2014 01:00:00 GMT-0700 (PDT)")
*
* Examples of INVALID Date strings:
*
* 2014-10-01T08:00:00PST
* 2014-10-01T08:00:00-0700 (actually, this DOES work in Chrome, but NOT in Safari)
*
* In the case of INVALID Date strings, the Date object is invalid, but there's no obvious test for an "invalid"
* object, so I've adapted the following test from StackOverflow.
*
* See http://stackoverflow.com/questions/1353684/detecting-an-invalid-date-date-instance-in-javascript
*/
if (Object.prototype.toString.call(date) !== "[object Date]" || isNaN(date.getTime())) {
date = new Date();
this.println("CMOS date invalid (" + sDate + "), using " + date);
} else if (sDate) {
this.println("CMOS date: " + date);
}
this.abCMOSData[ChipSet.CMOS.ADDR.RTC_SEC] = date.getSeconds();
this.abCMOSData[ChipSet.CMOS.ADDR.RTC_SEC_ALRM] = 0;
this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MIN] = date.getMinutes();
this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MIN_ALRM] = 0;
this.abCMOSData[ChipSet.CMOS.ADDR.RTC_HOUR] = date.getHours();
this.abCMOSData[ChipSet.CMOS.ADDR.RTC_HOUR_ALRM] = 0;
this.abCMOSData[ChipSet.CMOS.ADDR.RTC_WEEK_DAY] = date.getDay() + 1;
this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MONTH_DAY] = date.getDate();
this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MONTH] = date.getMonth() + 1;
var nYear = date.getFullYear();
this.abCMOSData[ChipSet.CMOS.ADDR.RTC_YEAR] = nYear % 100;
var nCentury = (nYear / 100);
this.abCMOSData[ChipSet.CMOS.ADDR.CENTURY_DATE] = (nCentury % 10) | ((nCentury / 10) << 4);
this.abCMOSData[ChipSet.CMOS.ADDR.STATUSA] = 0x26; // hard-coded default; refer to ChipSet.CMOS.STATUSA.DV and ChipSet.CMOS.STATUSA.RS
this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] = ChipSet.CMOS.STATUSB.HOUR24; // default to BCD mode (ChipSet.CMOS.STATUSB.BINARY not set)
this.abCMOSData[ChipSet.CMOS.ADDR.STATUSC] = 0x00;
this.abCMOSData[ChipSet.CMOS.ADDR.STATUSD] = ChipSet.CMOS.STATUSD.VRB;
this.nRTCCyclesLastUpdate = this.nRTCCyclesNextUpdate = 0;
this.nRTCPeriodsPerSecond = this.nRTCCyclesPerPeriod = null;
};
/**
* getRTCByte(iRTC)
*
* @param {number} iRTC
* @return {number} b
*/
ChipSet.prototype.getRTCByte = function(iRTC)
{
this.assert(iRTC >= 0 && iRTC <= ChipSet.CMOS.ADDR.STATUSD);
var b = this.abCMOSData[iRTC];
if (iRTC < ChipSet.CMOS.ADDR.STATUSA) {
var f12HourValue = false;
if (iRTC == ChipSet.CMOS.ADDR.RTC_HOUR || iRTC == ChipSet.CMOS.ADDR.RTC_HOUR_ALRM) {
if (!(this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.HOUR24)) {
if (b < 12) {
b = (!b? 12 : b);
} else {
b -= 12;
b = (!b? 0x8c : b + 0x80);
}
f12HourValue = true;
}
}
if (!(this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.BINARY)) {
/*
* We're in BCD mode, so we must convert b from BINARY to BCD. But first:
*
* If b is a 12-hour value (ie, we're in 12-hour mode) AND the hour is a PM value
* (ie, in the range 0x81-0x8C), then it must be adjusted to yield 81-92 in BCD.
*
* AM hour values (0x01-0x0C) need no adjustment; they naturally convert to 01-12 in BCD.
*/
if (f12HourValue && b > 0x80) {
b -= (0x81 - 81);
}
b = (b % 10) | ((b / 10) << 4);
}
} else {
if (iRTC == ChipSet.CMOS.ADDR.STATUSA) {
/*
* HACK: Perform a mindless toggling of the "Update-In-Progress" bit, so that it's flipped
* on the next read; this makes the MODEL_5170 BIOS ("POST2_RTCUP") happy.
*/
this.abCMOSData[iRTC] ^= ChipSet.CMOS.STATUSA.UIP;
}
}
return b;
};
/**
* setRTCByte(iRTC, b)
*
* @param {number} iRTC
* @param {number} b proposed byte to write
* @return {number} actual byte to write
*/
ChipSet.prototype.setRTCByte = function(iRTC, b)
{
this.assert(iRTC >= 0 && iRTC <= ChipSet.CMOS.ADDR.STATUSD);
if (iRTC < ChipSet.CMOS.ADDR.STATUSA) {
var fBCD = false;
if (!(this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.BINARY)) {
/*
* We're in BCD mode, so we must convert b from BCD to BINARY (we assume it's valid
* BCD; ie, that both nibbles contain only 0-9, not A-F).
*/
b = (b >> 4) * 10 + (b & 0xf);
fBCD = true;
}
if (iRTC == ChipSet.CMOS.ADDR.RTC_HOUR || iRTC == ChipSet.CMOS.ADDR.RTC_HOUR_ALRM) {
if (fBCD) {
/*
* If the original BCD hour was 0x81-0x92, then the previous BINARY-to-BCD conversion
* transformed it to 0x51-0x5C, so we must add 0x30.
*/
if (b > 23) {
this.assert(b >= 0x51 && b <= 0x5c);
b += 0x30;
}
}
if (!(this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.HOUR24)) {
if (b <= 12) {
b = (b == 12? 0 : b);
} else {
b -= (0x80 - 12);
b = (b == 24? 12 : b);
}
}
}
}
return b;
};
/**
* calcRTCCyclePeriod()
*
* This should be called whenever the timings in STATUSA may have changed.
*
* TODO: 1024 is a hard-coded number of periods per second based on the default interrupt rate of 976.562us
* (ie, 1000000 / 976.562). Calculate the actual number based on the values programmed in the STATUSA register.
*
* @this {ChipSet}
*/
ChipSet.prototype.calcRTCCyclePeriod = function()
{
this.nRTCCyclesLastUpdate = this.cpu.getCycles(this.fScaleTimers);
this.nRTCPeriodsPerSecond = 1024;
this.nRTCCyclesPerPeriod = Math.floor(this.cpu.getCyclesPerSecond() / this.nRTCPeriodsPerSecond);
this.setRTCCycleLimit();
};
/**
* getRTCCycleLimit(nCycles)
*
* This is called by the CPU to determine the maximum number of cycles it can process for the current burst.
*
* @this {ChipSet}
* @param {number} nCycles desired
* @return {number} maximum number of cycles (<= nCycles)
*/
ChipSet.prototype.getRTCCycleLimit = function(nCycles)
{
if (this.abCMOSData && this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.PIE) {
var nCyclesUpdate = this.nRTCCyclesNextUpdate - this.cpu.getCycles(this.fScaleTimers);
if (nCyclesUpdate > 0) {
if (nCycles > nCyclesUpdate) {
if (DEBUG && this.messageEnabled(Messages.RTC)) {
this.printMessage("getRTCCycleLimit(" + nCycles + "): reduced to " + nCyclesUpdate + " cycles", true);
}
nCycles = nCyclesUpdate;
} else {
if (DEBUG && this.messageEnabled(Messages.RTC)) {
this.printMessage("getRTCCycleLimit(" + nCycles + "): already less than " + nCyclesUpdate + " cycles", true);
}
}
} else {
if (DEBUG && this.messageEnabled(Messages.RTC)) {
this.printMessage("RTC next update has passed by " + nCyclesUpdate + " cycles", true);
}
}
}
return nCycles;
};
/**
* setRTCCycleLimit(nCycles)
*
* This should be called when PIE becomes set in STATUSB (and whenever PF is cleared in STATUSC while PIE is still set).
*
* @this {ChipSet}
* @param {number} [nCycles]
*/
ChipSet.prototype.setRTCCycleLimit = function(nCycles)
{
if (nCycles === undefined) nCycles = this.nRTCCyclesPerPeriod;
this.nRTCCyclesNextUpdate = this.cpu.getCycles(this.fScaleTimers) + nCycles;
if (this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.PIE) {
this.cpu.setBurstCycles(nCycles);
}
};
/**
* updateRTCTime()
*
* @this {ChipSet}
*/
ChipSet.prototype.updateRTCTime = function()
{
var nCyclesPerSecond = this.cpu.getCyclesPerSecond();
var nCyclesUpdate = this.cpu.getCycles(this.fScaleTimers);
/*
* We must arrange for the very first calcRTCCyclePeriod() call to occur here, on the very first
* updateRTCTime() call, because this is the first point we can be guaranteed that CPU cycle counts
* are initialized (the CPU is the last component to be powered up/restored).
*
* TODO: A side-effect of this is that it undermines the save/restore code's preservation of last
* and next RTC cycle counts, which may affect when the next RTC event is delivered.
*/
if (this.nRTCCyclesPerPeriod == null) this.calcRTCCyclePeriod();
/*
* Step 1: Deal with Periodic Interrupts
*/
if (nCyclesUpdate >= this.nRTCCyclesNextUpdate) {
var bPrev = this.abCMOSData[ChipSet.CMOS.ADDR.STATUSC];
this.abCMOSData[ChipSet.CMOS.ADDR.STATUSC] |= ChipSet.CMOS.STATUSC.PF;
if (this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.PIE) {
/*
* When PIE is set, setBurstCycles() should be getting called as needed to ensure
* that updateRTCTime() is called more frequently, so let's assert that we don't have
* an excess of cycles and thus possibly some missed Periodic Interrupts.
*/
if (DEBUG) {
if (nCyclesUpdate - this.nRTCCyclesNextUpdate > this.nRTCCyclesPerPeriod) {
if (bPrev & ChipSet.CMOS.STATUSC.PF) {
this.printMessage("RTC interrupt handler failed to clear STATUSC", Messages.RTC);
} else {
this.printMessage("CPU took too long trigger new RTC periodic interrupt", Messages.RTC);
}
}
}
this.abCMOSData[ChipSet.CMOS.ADDR.STATUSC] |= ChipSet.CMOS.STATUSC.IRQF;
this.setIRR(ChipSet.IRQ.RTC);
/*
* We could also call setRTCCycleLimit() at this point, but I don't think there's any
* benefit until the interrupt had been acknowledged and STATUSC has been read, thereby
* clearing the way for another Periodic Interrupt; it seems to me that when STATUSC
* is read, that's the more appropriate time to call setRTCCycleLimit().
*/
}
this.nRTCCyclesNextUpdate = nCyclesUpdate + this.nRTCCyclesPerPeriod;
}
/*
* Step 2: Deal with Alarm Interrupts
*/
if (this.abCMOSData[ChipSet.CMOS.ADDR.RTC_SEC] == this.abCMOSData[ChipSet.CMOS.ADDR.RTC_SEC_ALRM]) {
if (this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MIN] == this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MIN_ALRM]) {
if (this.abCMOSData[ChipSet.CMOS.ADDR.RTC_HOUR] == this.abCMOSData[ChipSet.CMOS.ADDR.RTC_HOUR_ALRM]) {
this.abCMOSData[ChipSet.CMOS.ADDR.STATUSC] |= ChipSet.CMOS.STATUSC.AF;
if (this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.AIE) {
this.abCMOSData[ChipSet.CMOS.ADDR.STATUSC] |= ChipSet.CMOS.STATUSC.IRQF;
this.setIRR(ChipSet.IRQ.RTC);
}
}
}
}
/*
* Step 3: Update the RTC date/time and deal with Update Interrupts
*/
var nCyclesDelta = nCyclesUpdate - this.nRTCCyclesLastUpdate;
this.assert(nCyclesDelta >= 0);
var nSecondsDelta = Math.floor(nCyclesDelta / nCyclesPerSecond);
/*
* We trust that updateRTCTime() is being called as part of updateAllTimers(), and is therefore
* being called often enough to ensure that nSecondsDelta will never be greater than one. In fact,
* it would always be LESS than one if it weren't also for the fact that we plow any "unused" cycles
* (nCyclesDelta % nCyclesPerSecond) back into nRTCCyclesLastUpdate, so that we will eventually
* see a one-second delta.
*/
this.assert(nSecondsDelta <= 1);
/*
* Make sure that CMOS.STATUSB.SET isn't set; if it is, then the once-per-second RTC updates must be
* disabled so that software can write new RTC date/time values without interference.
*/
if (nSecondsDelta && !(this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.SET)) {
while (nSecondsDelta--) {
if (++this.abCMOSData[ChipSet.CMOS.ADDR.RTC_SEC] >= 60) {
this.abCMOSData[ChipSet.CMOS.ADDR.RTC_SEC] = 0;
if (++this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MIN] >= 60) {
this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MIN] = 0;
if (++this.abCMOSData[ChipSet.CMOS.ADDR.RTC_HOUR] >= 24) {
this.abCMOSData[ChipSet.CMOS.ADDR.RTC_HOUR] = 0;
this.abCMOSData[ChipSet.CMOS.ADDR.RTC_WEEK_DAY] = (this.abCMOSData[ChipSet.CMOS.ADDR.RTC_WEEK_DAY] % 7) + 1;
var nDayMax = usr.getMonthDays(this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MONTH], this.abCMOSData[ChipSet.CMOS.ADDR.RTC_YEAR]);
if (++this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MONTH_DAY] > nDayMax) {
this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MONTH_DAY] = 1;
if (++this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MONTH] > 12) {
this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MONTH] = 1;
this.abCMOSData[ChipSet.CMOS.ADDR.RTC_YEAR] = (this.abCMOSData[ChipSet.CMOS.ADDR.RTC_YEAR] + 1) % 100;
}
}
}
}
}
}
this.abCMOSData[ChipSet.CMOS.ADDR.STATUSC] |= ChipSet.CMOS.STATUSC.UF;
if (this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.UIE) {
this.abCMOSData[ChipSet.CMOS.ADDR.STATUSC] |= ChipSet.CMOS.STATUSC.IRQF;
this.setIRR(ChipSet.IRQ.RTC);
}
}
this.nRTCCyclesLastUpdate = nCyclesUpdate - (nCyclesDelta % nCyclesPerSecond);
};
/**
* initCMOSData()
*
* Initialize all the CMOS configuration bytes in the range 0x0E-0x2F (TODO: Decide what to do about 0x30-0x3F)
*
* Note that the MODEL_5170 "SETUP" utility is normally what sets all these bytes, including the checksum, and then
* the BIOS verifies it, but since we want our machines to pass BIOS verification "out of the box", we go the extra
* mile here, even though it's not really our responsibility.
*
* @this {ChipSet}
*/
ChipSet.prototype.initCMOSData = function()
{
/*
* On all reset() calls, the RAM component(s) will (re)add their totals, so we have to make sure that
* the addition always starts with 0. That also means that ChipSet must always be initialized before RAM.
*/
var iCMOS;
for (iCMOS = ChipSet.CMOS.ADDR.BASEMEM_LO; iCMOS <= ChipSet.CMOS.ADDR.EXTMEM_HI; iCMOS++) {
this.abCMOSData[iCMOS] = 0;
}
/*
* Make sure all the "checksummed" CMOS bytes are initialized (not just the handful we set below) to ensure
* that the checksum will be valid.
*/
for (iCMOS = ChipSet.CMOS.ADDR.DIAG; iCMOS < ChipSet.CMOS.ADDR.CHKSUM_HI; iCMOS++) {
if (this.abCMOSData[iCMOS] === undefined) this.abCMOSData[iCMOS] = 0;
}
/*
* We propagate all compatible "legacy" SW1 bits to the CMOS.EQUIP byte using the old SW masks, but any further
* access to CMOS.ADDR.EQUIP should use the new CMOS_EQUIP flags (eg, CMOS.EQUIP.COPROC, CMOS.EQUIP.MONITOR.CGA80, etc).
*/
this.abCMOSData[ChipSet.CMOS.ADDR.EQUIP] = this.sw1 & (ChipSet.PPI_SW.MONITOR.MASK | ChipSet.PPI_SW.COPROC | ChipSet.PPI_SW.FDRIVE.IPL | ChipSet.PPI_SW.FDRIVE.MASK);
this.abCMOSData[ChipSet.CMOS.ADDR.FDRIVE] = (this.getSWFloppyDriveType(0) << 4) | this.getSWFloppyDriveType(1);
/*
* The final step is calculating the CMOS checksum, which we then store into the CMOS as a courtesy, so that the
* user doesn't get unnecessary CMOS errors.
*/
this.updateCMOSChecksum();
};
/**
* setCMOSByte(iCMOS, b)
*
* This is ONLY for use by components that need to update CMOS configuration bytes to match their internal configuration.
*
* @this {ChipSet}
* @param {number} iCMOS
* @param {number} b
* @return {boolean} true if successful, false if not (eg, CMOS not initialized yet, or no CMOS on this machine)
*/
ChipSet.prototype.setCMOSByte = function(iCMOS, b)
{
if (this.abCMOSData) {
this.assert(iCMOS >= ChipSet.CMOS.ADDR.FDRIVE && iCMOS < ChipSet.CMOS.ADDR.CHKSUM_HI);
this.abCMOSData[iCMOS] = b;
this.updateCMOSChecksum();
return true;
}
return false;
};
/**
* addCMOSMemory(addr, size)
*
* For use by the RAM component, to dynamically update the CMOS memory configuration.
*
* @this {ChipSet}
* @param {number} addr (if 0, BASEMEM_LO/BASEMEM_HI is updated; if >= 0x100000, then EXTMEM_LO/EXTMEM_HI is updated)
* @param {number} size (in bytes; we convert to Kb)
* @return {boolean} true if successful, false if not (eg, CMOS not initialized yet, or no CMOS on this machine)
*/
ChipSet.prototype.addCMOSMemory = function(addr, size)
{
if (this.abCMOSData) {
var iCMOS = (addr < 0x100000? ChipSet.CMOS.ADDR.BASEMEM_LO : ChipSet.CMOS.ADDR.EXTMEM_LO);
var wKb = this.abCMOSData[iCMOS] | (this.abCMOSData[iCMOS+1] << 8);
wKb += (size >> 10);
this.abCMOSData[iCMOS] = wKb & 0xff;
this.abCMOSData[iCMOS+1] = wKb >> 8;
this.updateCMOSChecksum();
return true;
}
return false;
};
/**
* setCMOSDriveType(iDrive, bType)
*
* For use by the HDC component, to update the CMOS drive configuration to match HDC's internal configuration.
*
* TODO: Consider extending this to support FDC drive updates, so that the FDC can specify diskette drive types
* (ie, FD360 or FD1200) in the same way that HDC does. However, historically, the ChipSet has been responsible for
* floppy drive configuration, at least in terms of *number* of drives, through the use of SW1 settings, and we've
* continued that tradition with the addition of the ChipSet 'floppies' parameter, which allows both the number *and*
* capacity of drives to be specified with a simple array (eg, [360, 360] for two 360Kb drives).
*
* @this {ChipSet}
* @param {number} iDrive
* @param {number} bType
* @return {boolean} true if successful, false if not (eg, CMOS not initialized yet, or no CMOS on this machine)
*/
ChipSet.prototype.setCMOSDriveType = function(iDrive, bType)
{
if (this.abCMOSData) {
var b = this.abCMOSData[ChipSet.CMOS.ADDR.HDRIVE];
this.assert(bType > 0 && bType < 0xf);
if (iDrive) {
b = (b & ChipSet.CMOS.HDRIVE.D0_MASK) | bType;
} else {
b = (b & ChipSet.CMOS.HDRIVE.D1_MASK) | (bType << 4);
}
this.setCMOSByte(ChipSet.CMOS.ADDR.HDRIVE, b);
return true;
}
return false;
};
/**
* updateCMOSChecksum()
*
* This sums all the CMOS bytes from 0x10-0x2D, creating a 16-bit checksum. That's a total of 30 (unsigned) 8-bit
* values which could sum to at most 30*255 or 7650 (0x1DE2). Since there's no way that can overflow 16 bits, we don't
* worry about masking it with 0xffff.
*
* WARNING: The IBM PC AT TechRef, p.1-53 (p.75) claims that the checksum is on bytes 0x10-0x20, but that's simply wrong.
*
* @this {ChipSet}
*/
ChipSet.prototype.updateCMOSChecksum = function()
{
var wChecksum = 0;
for (var iCMOS = ChipSet.CMOS.ADDR.FDRIVE; iCMOS < ChipSet.CMOS.ADDR.CHKSUM_HI; iCMOS++) {
wChecksum += this.abCMOSData[iCMOS];
}
this.abCMOSData[ChipSet.CMOS.ADDR.CHKSUM_LO] = wChecksum & 0xff;
this.abCMOSData[ChipSet.CMOS.ADDR.CHKSUM_HI] = wChecksum >> 8;
};
/**
* save()
*
* @this {ChipSet}
* @return {Object}
*
* This implements save support for the ChipSet component.
*/
ChipSet.prototype.save = function()
{
var state = new State(this);
state.set(0, [this.sw1Init, this.sw2Init, this.sw1, this.sw2]);
state.set(1, [this.saveDMAControllers()]);
state.set(2, [this.savePICs()]);
state.set(3, [this.bPIT1Ctrl, this.saveTimers(), this.bPIT2Ctrl]);
state.set(4, [this.bPPIA, this.bPPIB, this.bPPIC, this.bPPICtrl, this.bNMI]);
if (this.model >= ChipSet.MODEL_5170) {
state.set(5, [this.b8042Status, this.b8042InBuff, this.b8042CmdData,
this.b8042OutBuff, this.b8042InPort, this.b8042OutPort]);
state.set(6, [this.abDMAPageSpare[7], this.abDMAPageSpare, this.bCMOSAddr, this.abCMOSData, this.nRTCCyclesLastUpdate, this.nRTCCyclesNextUpdate]);
}
return state.data();
};
/**
* restore(data)
*
* @this {ChipSet}
* @param {Object} data
* @return {boolean} true if successful, false if failure
*
* This implements restore support for the ChipSet component.
*/
ChipSet.prototype.restore = function(data)
{
var a, i;
a = data[0];
this.sw1Init = a[0];
this.sw2Init = a[1];
this.sw1 = a[2];
this.sw2 = a[3];
a = data[1];
for (i = 0; i < this.cDMACs; i++) {
this.initDMAController(i, a.length == 1? a[0][i] : a);
}
a = data[2];
for (i = 0; i < this.cPICs; i++) {
this.initPIC(i, i === 0? ChipSet.PIC0.PORT_LO : ChipSet.PIC1.PORT_LO, a[0][i]);
}
a = data[3];
this.bPIT1Ctrl = a[0];
this.bPIT2Ctrl = a[2];
for (i = 0; i < this.aTimers.length; i++) {
this.initTimer(i, a[1][i]);
}
a = data[4];
this.bPPIA = a[0];
this.bPPIB = a[1];
this.bPPIC = a[2];
this.bPPICtrl = a[3];
this.bNMI = a[4];
a = data[5];
if (a) {
this.assert(this.model >= ChipSet.MODEL_5170);
this.b8042Status = a[0];
this.b8042InBuff = a[1];
this.b8042CmdData = a[2];
this.b8042OutBuff = a[3];
this.b8042InPort = a[4];
this.b8042OutPort = a[5];
}
a = data[6];
if (a) {
this.assert(this.model >= ChipSet.MODEL_5170);
this.abDMAPageSpare = a[1];
this.abDMAPageSpare[7] = a[0]; // formerly bMFGData
this.bCMOSAddr = a[2];
this.abCMOSData = a[3];
this.nRTCCyclesLastUpdate = a[4];
this.nRTCCyclesNextUpdate = a[5];
/*
* TODO: Decide whether restore() should faithfully preserve the RTC date/time that save() saved,
* or always reinitialize the date/time, or give the user (or the machine configuration) the option.
*
* For now, we're always reinitializing the RTC date. Alternatively, we could selectively update
* the CMOS bytes above, instead of overwriting them all, in which case this extra call to initRTCTime()
* could be avoided.
*/
this.initRTCTime();
}
return true;
};
ChipSet.aDMAControllerInit = [0, null, null, 0, new Array(4)];
/**
* initDMAController(iDMAC, aState)
*
* @this {ChipSet}
* @param {number} iDMAC
* @param {Array} [aState]
*/
ChipSet.prototype.initDMAController = function(iDMAC, aState)
{
var controller = this.aDMACs[iDMAC];
if (!controller) {
this.assert(!aState);
controller = {
aChannels: new Array(4)
};
}
var a = aState && aState.length == 5? aState : ChipSet.aDMAControllerInit;
controller.bStatus = a[0];
controller.bCmd = a[1];
controller.bReq = a[2];
controller.bIndex = a[3];
controller.nChannelBase = iDMAC << 2;
for (var iChannel = 0; iChannel < controller.aChannels.length; iChannel++) {
this.initDMAChannel(controller, iChannel, a[4][iChannel]);
}
this.aDMACs[iDMAC] = controller;
};
ChipSet.aDMAChannelInit = [true, [0,0], [0,0], [0,0], [0,0]];
/**
* initDMAChannel(controller, iChannel, aState)
*
* @this {ChipSet}
* @param {Object} controller
* @param {number} iChannel
* @param {Array} [aState]
*/
ChipSet.prototype.initDMAChannel = function(controller, iChannel, aState)
{
var channel = controller.aChannels[iChannel];
if (!channel) {
this.assert(!aState);
channel = {
addrInit: [0,0],
countInit: [0,0],
addrCurrent: [0,0],
countCurrent: [0,0]
};
}
var a = aState && aState.length == 8? aState : ChipSet.aDMAChannelInit;
channel.masked = a[0];
channel.addrInit[0] = a[1][0]; channel.addrInit[1] = a[1][1];
channel.countInit[0] = a[2][0]; channel.countInit[1] = a[2][1];
channel.addrCurrent[0] = a[3][0]; channel.addrCurrent[1] = a[3][1];
channel.countCurrent[0] = a[4][0]; channel.countCurrent[1] = a[4][1];
channel.mode = a[5];
channel.bPage = a[6];
// a[7] is deprecated
channel.controller = controller;
channel.iChannel = iChannel;
this.initDMAFunction(channel, a[8], a[9]);
controller.aChannels[iChannel] = channel;
};
/**
* initDMAFunction(channel)
*
* @param {Object} channel
* @param {Component|string} [component]
* @param {string} [sFunction]
* @param {Object} [obj]
* @return {*}
*/
ChipSet.prototype.initDMAFunction = function(channel, component, sFunction, obj)
{
if (typeof component == "string") {
component = Component.getComponentByID(component);
}
if (component) {
channel.done = null;
channel.sDevice = component.id;
channel.sFunction = sFunction;
channel.component = component;
channel.fnTransfer = component[sFunction];
channel.obj = obj;
}
return channel.fnTransfer;
};
/**
* saveDMAControllers()
*
* @this {ChipSet}
* @return {Array}
*/
ChipSet.prototype.saveDMAControllers = function()
{
var data = [];
for (var iDMAC = 0; iDMAC < this.aDMACs; iDMAC++) {
var controller = this.aDMACs[iDMAC];
data[iDMAC] = [
controller.bStatus,
controller.bCmd,
controller.bReq,
controller.bIndex,
this.saveDMAChannels(controller)
];
}
return data;
};
/**
* saveDMAChannels(controller)
*
* @this {ChipSet}
* @param {Object} controller
* @return {Array}
*/
ChipSet.prototype.saveDMAChannels = function(controller)
{
var data = [];
for (var iChannel = 0; iChannel < controller.aChannels.length; iChannel++) {
var channel = controller.aChannels[iChannel];
data[iChannel] = [
channel.masked,
channel.addrInit,
channel.countInit,
channel.addrCurrent,
channel.countCurrent,
channel.mode,
channel.bPage,
channel.sDevice,
channel.sFunction
];
}
return data;
};
ChipSet.aPICInit = [0, new Array(4)];
/**
* initPIC(iPIC, port, aState)
*
* @this {ChipSet}
* @param {number} iPIC
* @param {number} port
* @param {Array} [aState]
*/
ChipSet.prototype.initPIC = function(iPIC, port, aState)
{
var pic = this.aPICs[iPIC];
if (!pic) {
pic = {
aICW: [null,null,null,null]
};
}
var a = aState && aState.length == 8? aState : ChipSet.aPICInit;
pic.port = port;
pic.nIRQBase = iPIC << 3;
pic.nDelay = a[0];
pic.aICW[0] = a[1][0]; pic.aICW[1] = a[1][1]; pic.aICW[2] = a[1][2]; pic.aICW[3] = a[1][3];
pic.nICW = a[2];
pic.bIMR = a[3];
pic.bIRR = a[4];
pic.bISR = a[5];
pic.bIRLow = a[6];
pic.bOCW3 = a[7];
this.aPICs[iPIC] = pic;
};
/**
* savePICs()
*
* @this {ChipSet}
* @return {Array}
*/
ChipSet.prototype.savePICs = function()
{
var data = [];
for (var iPIC = 0; iPIC < this.aPICs.length; iPIC++) {
var pic = this.aPICs[iPIC];
data[iPIC] = [
pic.nDelay,
pic.aICW,
pic.nICW,
pic.bIMR,
pic.bIRR,
pic.bISR,
pic.bIRLow,
pic.bOCW3
];
}
return data;
};
ChipSet.aTimerInit = [[0,0], [0,0], [0,0], [0,0]];
/**
* initTimer(iTimer, aState)
*
* @this {ChipSet}
* @param {number} iTimer
* @param {Array} [aState]
*/
ChipSet.prototype.initTimer = function(iTimer, aState)
{
var timer = this.aTimers[iTimer];
if (!timer) {
timer = {
countInit: [0,0],
countStart: [0,0],
countCurrent: [0,0],
countLatched: [0,0]
};
}
var a = aState && aState.length == 13? aState : ChipSet.aTimerInit;
timer.countInit[0] = a[0][0]; timer.countInit[1] = a[0][1];
timer.countStart[0] = a[1][0]; timer.countStart[1] = a[1][1];
timer.countCurrent[0] = a[2][0]; timer.countCurrent[1] = a[2][1];
timer.countLatched[0] = a[3][0]; timer.countLatched[1] = a[3][1];
timer.bcd = a[4];
timer.mode = a[5];
timer.rw = a[6];
timer.countIndex = a[7];
timer.countBytes = a[8];
timer.fOUT = a[9];
timer.fLatched = a[10];
timer.fCounting = a[11];
timer.nCyclesStart = a[12];
this.aTimers[iTimer] = timer;
};
/**
* saveTimers()
*
* @this {ChipSet}
* @return {Array}
*/
ChipSet.prototype.saveTimers = function()
{
var data = [];
for (var iTimer = 0; iTimer < this.aTimers.length; iTimer++) {
var timer = this.aTimers[iTimer];
data[iTimer] = [
timer.countInit,
timer.countStart,
timer.countCurrent,
timer.countLatched,
timer.bcd,
timer.mode,
timer.rw,
timer.countIndex,
timer.countBytes,
timer.fOUT,
timer.fLatched,
timer.fCounting,
timer.nCyclesStart
];
}
return data;
};
/**
* getSWMemorySize(fInit)
*
* @this {ChipSet}
* @param {boolean} [fInit] is true for init switch value(s) only, current value(s) otherwise
* @return {number} number of Kb of specified memory (NOT necessarily the same as installed memory; see RAM component)
*/
ChipSet.prototype.getSWMemorySize = function(fInit)
{
var sw1 = (fInit? this.sw1Init : this.sw1);
var sw2 = (fInit? this.sw2Init : this.sw2);
return (((sw1 & ChipSet.PPI_SW.MEMORY.MASK) >> ChipSet.PPI_SW.MEMORY.SHIFT) + 1) * this.kbSW + (sw2 & ChipSet.PPI_C.SW) * 32;
};
/**
* getSWFloppyDrives(fInit)
*
* @this {ChipSet}
* @param {boolean} [fInit] is true for init switch value(s) only, current value(s) otherwise
* @return {number} number of floppy drives specified by SW1 (range is 0 to 4)
*/
ChipSet.prototype.getSWFloppyDrives = function(fInit)
{
var sw1 = (fInit? this.sw1Init : this.sw1);
return ((this.model != ChipSet.MODEL_5150) || (sw1 & ChipSet.PPI_SW.FDRIVE.IPL))? ((sw1 & ChipSet.PPI_SW.FDRIVE.MASK) >> ChipSet.PPI_SW.FDRIVE.SHIFT) + 1 : 0;
};
/**
* getSWFloppyDriveType(iDrive)
*
* @this {ChipSet}
* @param {number} iDrive (0-based)
* @return {number} one of the ChipSet.CMOS.FDRIVE.FD* values (FD360, FD1200, etc)
*/
ChipSet.prototype.getSWFloppyDriveType = function(iDrive)
{
if (iDrive < this.getSWFloppyDrives()) {
if (!this.aFloppyDrives) {
return ChipSet.CMOS.FDRIVE.FD360;
}
if (iDrive < this.aFloppyDrives.length) {
switch(this.aFloppyDrives[iDrive]) {
case 160:
case 180:
case 320:
case 360:
return ChipSet.CMOS.FDRIVE.FD360;
case 720:
return ChipSet.CMOS.FDRIVE.FD720;
case 1200:
return ChipSet.CMOS.FDRIVE.FD1200;
case 1440:
return ChipSet.CMOS.FDRIVE.FD1440;
}
}
this.assert(false); // we should never get here (else something is out of out sync)
}
return ChipSet.CMOS.FDRIVE.NONE;
};
/**
* getSWFloppyDriveSize(iDrive)
*
* @this {ChipSet}
* @param {number} iDrive (0-based)
* @return {number} capacity of drive in Kb (eg, 360, 1200, 1440, etc), or 0 if none
*/
ChipSet.prototype.getSWFloppyDriveSize = function(iDrive)
{
if (iDrive < this.getSWFloppyDrives()) {
if (!this.aFloppyDrives) {
return 360;
}
if (iDrive < this.aFloppyDrives.length) {
return this.aFloppyDrives[iDrive];
}
this.assert(false); // we should never get here (else something is out of out sync)
}
return 0;
};
/**
* getSWVideoMonitor(fInit)
*
* @this {ChipSet}
* @param {boolean} [fInit] is true for init switch value(s) only, current value(s) otherwise
* @return {number} one of ChipSet.MONITOR.*
*/
ChipSet.prototype.getSWVideoMonitor = function(fInit)
{
var sw1 = (fInit? this.sw1Init : this.sw1);
return (sw1 & ChipSet.PPI_SW.MONITOR.MASK) >> ChipSet.PPI_SW.MONITOR.SHIFT;
};
/**
* addSwitches(s, control, n, v, oTips)
*
* @this {ChipSet}
* @param {string} s is the name of the control
* @param {Object} control is the HTML control DOM object
* @param {number} n is the number of switches to add
* @param {number} v contains the current value(s) of the switches
* @param {Object} oTips contains tooltips for the various cells
*/
ChipSet.prototype.addSwitches = function(s, control, n, v, oTips)
{
var sHTML = "";
var sCellClass = PCJSCLASS + "-bitCell";
for (var i = 1; i <= n; i++) {
var sCellClasses = sCellClass;
if (!i) sCellClasses += " " + PCJSCLASS + "-bitCellLeft";
var sCellID = s + "-" + i;
sHTML += "<div id=\"" + sCellID + "\" class=\"" + sCellClasses + "\" data-value=\"0\">" + i + "</div>\n";
}
control.innerHTML = sHTML;
var aeCells = Component.getElementsByClass(control, sCellClass);
var sTip = null;
for (i = 0; i < aeCells.length; i++) {
if (oTips != null && oTips[i] != null) {
sTip = oTips[i];
}
if (sTip) aeCells[i].setAttribute("title", sTip);
this.setSwitch(aeCells[i], (v & (0x1 << i))? false : true);
aeCells[i].onclick = function(chipset, eSwitch) {
/*
* If we defined the onclick handler below as "function(e)" instead of simply "function()", then we could
* also receive an event object (e); however, IE reportedly requires that we examine a global (window.event)
* instead. If that's true, and if we ever care to get more details about the click event, then we might
* have to worry about that (eg, define a local var: "var event = window.event || e").
*/
return function onClickSwitch() {
chipset.toggleSwitch(eSwitch);
};
}(this, aeCells[i]);
}
};
/**
* getSwitch(control)
*
* @this {ChipSet}
* @param {Object} control is an HTML control DOM object
* @return {boolean} true if the switch represented by e is "on", false if "off"
*/
ChipSet.prototype.getSwitch = function(control)
{
return control.getAttribute("data-value") == "1";
};
/**
* setSwitch(control, f)
*
* @this {ChipSet}
* @param {Object} control is an HTML control DOM object
* @param {boolean} f is true if the switch represented by control should be "on", false if "off"
*/
ChipSet.prototype.setSwitch = function(control, f)
{
control.setAttribute("data-value", f? "1" : "0");
control.style.color = (f? "#ffffff" : "#000000");
control.style.backgroundColor = (f? "#000000" : "#ffffff");
};
/**
* toggleSwitch(control)
*
* @this {ChipSet}
* @param {Object} control is an HTML control DOM object
*/
ChipSet.prototype.toggleSwitch = function(control)
{
var f = !this.getSwitch(control);
this.setSwitch(control, f);
var sID = control.getAttribute("id");
var asParts = sID.split("-");
var b = (0x1 << (+asParts[1] - 1));
switch (asParts[0]) {
case "sw1":
this.sw1Init = (this.sw1Init & ~b) | (f? 0 : b);
break;
case "sw2":
this.sw2Init = (this.sw2Init & ~b) | (f? 0 : b);
break;
default:
break;
}
this.updateSwitchDesc();
};
/**
* updateSwitchDesc()
*
* @this {ChipSet}
*/
ChipSet.prototype.updateSwitchDesc = function()
{
var controlDesc = this.bindings["swdesc"];
/*
* TODO: Monitor type 0 used to be "No" (as in "No Monitor"), which was correct in the pre-EGA world,
* but in the post-EGA world, it depends. We could ask the Video component for a definitive answer, but
* but what we print here isn't that critical, because most people won't bother with a Control Panel,
* which is really the only beneficiary of this code.
*/
var asMonitorTypes = {
0: "Enhanced Color",
1: "TV",
2: "Color",
3: "Monochrome"
};
if (controlDesc != null) {
var sText = "";
sText += this.getSWMemorySize(true) + "Kb";
sText += ", " + asMonitorTypes[this.getSWVideoMonitor(true)] + " Monitor";
sText += ", " + this.getSWFloppyDrives(true) + " Floppy Drives";
if (this.sw1 != null && this.sw1 != this.sw1Init || this.sw2 != null && this.sw2 != this.sw2Init) {
sText += " (Reset required)";
}
controlDesc.textContent = sText;
}
};
/**
* dumpPIC()
*
* @this {ChipSet}
*/
ChipSet.prototype.dumpPIC = function()
{
if (DEBUGGER) {
for (var iPIC = 0; iPIC < this.aPICs.length; iPIC++) {
var pic = this.aPICs[iPIC];
var sDump = "PIC" + iPIC + ":";
for (var i = 0; i < pic.aICW.length; i++) {
var b = pic.aICW[i];
sDump += " IC" + (i + 1) + '=' + str.toHexByte(b);
}
sDump += " IMR=" + str.toHexByte(pic.bIMR) + " IRR=" + str.toHexByte(pic.bIRR) + " ISR=" + str.toHexByte(pic.bISR) + " DELAY=" + pic.nDelay;
this.dbg.println(sDump);
}
}
};
/**
* dumpTimer()
*
* @this {ChipSet}
*/
ChipSet.prototype.dumpTimer = function()
{
if (DEBUGGER) {
for (var iTimer = 0; iTimer < this.aTimers.length; iTimer++) {
this.updateTimer(iTimer);
var timer = this.aTimers[iTimer];
var sDump = "TIMER" + iTimer + ":";
var count = 0;
if (timer.countBytes != null) {
for (var i = 0; i <= timer.countBytes; i++) {
count |= (timer.countCurrent[i] << (i * 8));
}
}
sDump += " mode=" + timer.mode + " bytes=" + timer.countBytes + " count=" + str.toHexWord(count);
this.dbg.println(sDump);
}
}
};
/**
* dumpCMOS()
*
* @this {ChipSet}
*/
ChipSet.prototype.dumpCMOS = function()
{
if (DEBUGGER) {
var sDump = "";
for (var iCMOS = 0; iCMOS < ChipSet.CMOS.ADDR.TOTAL; iCMOS++) {
var b = (iCMOS <= ChipSet.CMOS.ADDR.STATUSD? this.getRTCByte(iCMOS) : this.abCMOSData[iCMOS]);
if (sDump) sDump += '\n';
sDump += "CMOS[" + str.toHexByte(iCMOS) + "]: " + str.toHexByte(b);
}
this.dbg.println(sDump);
}
};
/**
* inDMAChannelAddr(iDMAC, iChannel, port, addrFrom)
*
* @this {ChipSet}
* @param {number} iDMAC
* @param {number} iChannel
* @param {number} port (0x00, 0x02, 0x04, 0x06 for DMAC 0, 0xC0, 0xC4, 0xC8, 0xCC for DMAC 1)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inDMAChannelAddr = function(iDMAC, iChannel, port, addrFrom)
{
var controller = this.aDMACs[iDMAC];
var channel = controller.aChannels[iChannel];
var b = channel.addrCurrent[controller.bIndex];
if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
this.printMessageIO(port, null, addrFrom, "DMA" + iDMAC + ".CHANNEL" + iChannel + ".ADDR[" + controller.bIndex + "]", b, true);
}
controller.bIndex ^= 0x1;
/*
* Technically, aTimers[1].fOut is what drives DMA requests for DMA channel 0 (ChipSet.DMA_REFRESH),
* every 15us, once the BIOS has initialized the channel's "mode" with MODE_SINGLE, INCREMENT, AUTOINIT,
* and TYPE_READ (0x58) and initialized TIMER1 appropriately.
*
* However, we don't need to be that particular. Simply simulate an ever-increasing address after every
* read of the full DMA channel 0 address.
*/
if (!iDMAC && iChannel == ChipSet.DMA_REFRESH && !controller.bIndex) {
channel.addrCurrent[0]++;
if (channel.addrCurrent[0] > 0xff) {
channel.addrCurrent[0] = 0;
channel.addrCurrent[1]++;
if (channel.addrCurrent[1] > 0xff) {
channel.addrCurrent[1] = 0;
}
}
}
return b;
};
/**
* outDMAChannelAddr(iDMAC, iChannel, port, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} iDMAC
* @param {number} iChannel
* @param {number} port (0x00, 0x02, 0x04, 0x06 for DMAC 0, 0xC0, 0xC4, 0xC8, 0xCC for DMAC 1)
* @param {number} bOut
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outDMAChannelAddr = function outDMAChannelAddr(iDMAC, iChannel, port, bOut, addrFrom)
{
var controller = this.aDMACs[iDMAC];
if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
this.printMessageIO(port, bOut, addrFrom, "DMA" + iDMAC + ".CHANNEL" + iChannel + ".ADDR[" + controller.bIndex + "]", null, true);
}
var channel = controller.aChannels[iChannel];
channel.addrCurrent[controller.bIndex] = channel.addrInit[controller.bIndex] = bOut;
controller.bIndex ^= 0x1;
};
/**
* inDMAChannelCount(iDMAC, iChannel, port, addrFrom)
*
* @this {ChipSet}
* @param {number} iDMAC
* @param {number} iChannel
* @param {number} port (0x01, 0x03, 0x05, 0x07 for DMAC 0, 0xC2, 0xC6, 0xCA, 0xCE for DMAC 1)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inDMAChannelCount = function(iDMAC, iChannel, port, addrFrom)
{
var controller = this.aDMACs[iDMAC];
var channel = controller.aChannels[iChannel];
var b = channel.countCurrent[controller.bIndex];
if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
this.printMessageIO(port, null, addrFrom, "DMA" + iDMAC + ".CHANNEL" + iChannel + ".COUNT[" + controller.bIndex + "]", b, true);
}
controller.bIndex ^= 0x1;
/*
* Technically, aTimers[1].fOut is what drives DMA requests for DMA channel 0 (ChipSet.DMA_REFRESH),
* every 15us, once the BIOS has initialized the channel's "mode" with MODE_SINGLE, INCREMENT, AUTOINIT,
* and TYPE_READ (0x58) and initialized TIMER1 appropriately.
*
* However, we don't need to be that particular. Simply simulate an ever-decreasing count after every
* read of the full DMA channel 0 count.
*/
if (!iDMAC && iChannel == ChipSet.DMA_REFRESH && !controller.bIndex) {
channel.countCurrent[0]--;
if (channel.countCurrent[0] < 0) {
channel.countCurrent[0] = 0xff;
channel.countCurrent[1]--;
if (channel.countCurrent[1] < 0) {
channel.countCurrent[1] = 0xff;
/*
* This is the logical point to indicate Terminal Count (TC), but again, there's no need to be
* so particular; inDMAStatus() has its own logic for periodically signalling TC.
*/
}
}
}
return b;
};
/**
* outDMAChannelCount(iDMAC, iChannel, port, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} iDMAC
* @param {number} iChannel (ports 0x01, 0x03, 0x05, 0x07)
* @param {number} port (0x01, 0x03, 0x05, 0x07 for DMAC 0, 0xC2, 0xC6, 0xCA, 0xCE for DMAC 1)
* @param {number} bOut
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outDMAChannelCount = function(iDMAC, iChannel, port, bOut, addrFrom)
{
var controller = this.aDMACs[iDMAC];
if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
this.printMessageIO(port, bOut, addrFrom, "DMA" + iDMAC + ".CHANNEL" + iChannel + ".COUNT[" + controller.bIndex + "]", null, true);
}
var channel = controller.aChannels[iChannel];
channel.countCurrent[controller.bIndex] = channel.countInit[controller.bIndex] = bOut;
controller.bIndex ^= 0x1;
};
/**
* inDMAStatus(iDMAC, port, addrFrom)
*
* From the 8237A spec:
*
* "The Status register is available to be read out of the 8237A by the microprocessor.
* It contains information about the status of the devices at this point. This information includes
* which channels have reached Terminal Count (TC) and which channels have pending DMA requests.
*
* Bits 0–3 are set every time a TC is reached by that channel or an external EOP is applied.
* These bits are cleared upon Reset and on each Status Read.
*
* Bits 4–7 are set whenever their corresponding channel is requesting service."
*
* TRIVIA: This hook wasn't installed when I was testing with the MODEL_5150 ROM BIOS, and it
* didn't matter, but the MODEL_5160 ROM BIOS checks it several times, including @F000:E156, where
* it verifies that TIMER1 didn't request service on channel 0.
*
* @this {ChipSet}
* @param {number} iDMAC
* @param {number} port (0x08 for DMAC 0, 0xD0 for DMAC 1)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inDMAStatus = function(iDMAC, port, addrFrom)
{
/*
* HACK: Unlike the MODEL_5150, the MODEL_5160 ROM BIOS checks DMA channel 0 for TC (@F000:E4DF)
* after running a number of unrelated tests, since enough time would have passed for channel 0 to
* have reached TC at least once. So I simply OR in a hard-coded TC bit for channel 0 every time
* status is read.
*/
var controller = this.aDMACs[iDMAC];
var b = controller.bStatus | ChipSet.DMA_STATUS.CH0_TC;
controller.bStatus &= ~ChipSet.DMA_STATUS.ALL_TC;
if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
this.printMessageIO(port, null, addrFrom, "DMA" + iDMAC + ".STATUS", b, true);
}
return b;
};
/**
* outDMACmd(iDMAC, port, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} iDMAC
* @param {number} port (0x08 for DMAC 0, 0xD0 for DMAC 1)
* @param {number} bOut
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outDMACmd = function(iDMAC, port, bOut, addrFrom)
{
if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
this.printMessageIO(port, bOut, addrFrom, "DMA" + iDMAC + ".CMD", null, true);
}
this.aDMACs[iDMAC].bCmd = bOut;
};
/**
* outDMAReq(iDMAC, port, bOut, addrFrom)
*
* From the 8237A spec:
*
* "The 8237A can respond to requests for DMA service which are initiated by software as well as by a DREQ.
* Each channel has a request bit associated with it in the 4-bit Request register. These are non-maskable and subject
* to prioritization by the Priority Encoder network. Each register bit is set or reset separately under software
* control or is cleared upon generation of a TC or external EOP. The entire register is cleared by a Reset.
*
* To set or reset a bit the software loads the proper form of the data word.... In order to make a software request,
* the channel must be in Block Mode."
*
* @this {ChipSet}
* @param {number} iDMAC
* @param {number} port (0x09 for DMAC 0, 0xD2 for DMAC 1)
* @param {number} bOut
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outDMAReq = function(iDMAC, port, bOut, addrFrom)
{
var controller = this.aDMACs[iDMAC];
if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
this.printMessageIO(port, bOut, addrFrom, "DMA" + iDMAC + ".REQ", null, true);
}
/*
* Bits 0-1 contain the channel number
*/
var iChannel = (bOut & 0x3);
/*
* Bit 2 is the request bit (0 to reset, 1 to set), which must be propagated to the corresponding bit (4-7) in the status register
*/
var iChannelBit = ((bOut & 0x4) << (iChannel + 2));
controller.bStatus = (controller.bStatus & ~(0x10 << iChannel)) | iChannelBit;
controller.bReq = bOut;
};
/**
* outDMAMask(iDMAC, port, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} iDMAC
* @param {number} port (0x0A for DMAC 0, 0xD4 for DMAC 1)
* @param {number} bOut
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outDMAMask = function(iDMAC, port, bOut, addrFrom)
{
var controller = this.aDMACs[iDMAC];
if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
this.printMessageIO(port, bOut, addrFrom, "DMA" + iDMAC + ".MASK", null, true);
}
var iChannel = bOut & ChipSet.DMA_MASK.CHANNEL;
var channel = controller.aChannels[iChannel];
channel.masked = !!(bOut & ChipSet.DMA_MASK.CHANNEL_SET);
if (!channel.masked) this.requestDMA(controller.nChannelBase + iChannel);
};
/**
* outDMAMode(iDMAC, port, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} iDMAC
* @param {number} port (0x0B for DMAC 0, 0xD6 for DMAC 1)
* @param {number} bOut
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outDMAMode = function(iDMAC, port, bOut, addrFrom)
{
if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
this.printMessageIO(port, bOut, addrFrom, "DMA" + iDMAC + ".MODE", null, true);
}
var iChannel = bOut & ChipSet.DMA_MODE.CHANNEL;
this.aDMACs[iDMAC].aChannels[iChannel].mode = bOut;
};
/**
* outDMAResetFF(iDMAC, port, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} iDMAC
* @param {number} port (0x0C for DMAC 0, 0xD8 for DMAC 1)
* @param {number} bOut
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*
* Any write to this port simply resets the controller's "first/last flip-flop", which determines whether
* the even or odd byte of a DMA address or count register will be accessed next.
*/
ChipSet.prototype.outDMAResetFF = function(iDMAC, port, bOut, addrFrom)
{
if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
this.printMessageIO(port, bOut, addrFrom, "DMA" + iDMAC + ".RESET_FF", null, true);
}
this.aDMACs[iDMAC].bIndex = 0;
};
/**
* outDMAMasterClear(iDMAC, port, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} iDMAC
* @param {number} port (0x0D for DMAC 0, 0xDA for DMAC 1)
* @param {number} bOut
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outDMAMasterClear = function(iDMAC, port, bOut, addrFrom)
{
if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
this.printMessageIO(port, bOut, addrFrom, "DMA" + iDMAC + ".MASTER_CLEAR", null, true);
}
/*
* The value written to this port doesn't matter; any write triggers a "master clear" operation
*
* TODO: Can't we just call initDMAController(), which would also take care of clearing controller.bStatus?
*/
var controller = this.aDMACs[iDMAC];
for (var i = 0; i < controller.aChannels.length; i++) {
this.initDMAChannel(controller, i);
}
};
/**
* inDMAPageReg(iDMAC, iChannel, port, addrFrom)
*
* @this {ChipSet}
* @param {number} iDMAC
* @param {number} iChannel
* @param {number} port
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inDMAPageReg = function(iDMAC, iChannel, port, addrFrom)
{
var bIn = this.aDMACs[iDMAC].aChannels[iChannel].bPage;
if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
this.printMessageIO(port, null, addrFrom, "DMA" + iDMAC + ".CHANNEL" + iChannel + ".PAGE", bIn, true);
}
return bIn;
};
/**
* outDMAPageReg(iDMAC, iChannel, port, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} iDMAC
* @param {number} iChannel
* @param {number} port
* @param {number} bOut
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outDMAPageReg = function(iDMAC, iChannel, port, bOut, addrFrom)
{
if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
this.printMessageIO(port, bOut, addrFrom, "DMA" + iDMAC + ".CHANNEL" + iChannel + ".PAGE", null, true);
}
this.aDMACs[iDMAC].aChannels[iChannel].bPage = bOut;
};
/**
* inDMAPageSpare(iSpare, port, addrFrom)
*
* @this {ChipSet}
* @param {number} iSpare
* @param {number} port
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inDMAPageSpare = function(iSpare, port, addrFrom)
{
var bIn = this.abDMAPageSpare[iSpare];
if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
this.printMessageIO(port, null, addrFrom, "DMA.SPARE" + iSpare + ".PAGE", bIn, true);
}
return bIn;
};
/**
* outDMAPageSpare(iSpare, port, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} iSpare
* @param {number} port
* @param {number} bOut
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outDMAPageSpare = function(iSpare, port, bOut, addrFrom)
{
/*
* TODO: Remove this DEBUG-only DESKPRO386 code once we're done debugging DeskPro 386 ROMs;
* it enables logging of all DeskPro ROM checkpoint I/O to port 0x84.
*/
if (this.messageEnabled(Messages.DMA | Messages.PORT) || DEBUG && this.model == ChipSet.MODEL_DESKPRO386 && port == 0x84) {
this.printMessageIO(port, bOut, addrFrom, "DMA.SPARE" + iSpare + ".PAGE", null, true);
}
this.abDMAPageSpare[iSpare] = bOut;
};
/**
* checkDMA()
*
* Called by the CPU whenever INTR.DMA is set.
*
* @return {boolean} true if one or more async DMA channels are still active (unmasked), false to reset INTR.DMA
*/
ChipSet.prototype.checkDMA = function()
{
var fActive = false;
for (var iDMAC = 0; iDMAC < this.aDMACs; iDMAC++) {
var controller = this.aDMACs[iDMAC];
for (var iChannel = 0; iChannel < controller.aChannels.length; iChannel++) {
var channel = controller.aChannels[iChannel];
if (!channel.masked) {
this.advanceDMA(channel);
if (!channel.masked) fActive = true;
}
}
}
return fActive;
};
/**
* connectDMA(iDMAChannel, component, sFunction, obj)
*
* @param {number} iDMAChannel
* @param {Component|string} component
* @param {string} sFunction
* @param {Object} obj (eg, when the HDC connects, it passes a drive object)
*/
ChipSet.prototype.connectDMA = function(iDMAChannel, component, sFunction, obj)
{
var iDMAC = iDMAChannel >> 2;
var controller = this.aDMACs[iDMAC];
var iChannel = iDMAChannel & 0x3;
var channel = controller.aChannels[iChannel];
this.initDMAFunction(channel, component, sFunction, obj);
};
/**
* requestDMA(iDMAChannel, done)
*
* @this {ChipSet}
* @param {number} iDMAChannel
* @param {function(boolean)} [done]
*
* For DMA_MODE.TYPE_WRITE transfers, fnTransfer(-1) must return bytes as long as we request them (although it may
* return -1 if it runs out of bytes prematurely).
*
* Similarly, for DMA_MODE.TYPE_READ transfers, fnTransfer(b) must accept bytes as long as we deliver them (although
* it is certainly free to ignore bytes it no longer wants).
*/
ChipSet.prototype.requestDMA = function(iDMAChannel, done)
{
var iDMAC = iDMAChannel >> 2;
var controller = this.aDMACs[iDMAC];
var iChannel = iDMAChannel & 0x3;
var channel = controller.aChannels[iChannel];
if (!channel.component || !channel.fnTransfer || !channel.obj) {
if (DEBUG && this.messageEnabled(Messages.DMA | Messages.DATA)) {
this.printMessage("requestDMA(" + iDMAChannel + "): not connected to a component", true);
}
if (done) done(true);
return;
}
/*
* We can't simply slam done into channel.done; that would be fine if requestDMA() was called only by functions
* like HDC.doRead() and HDC.doWrite(), but we're also called whenever a DMA channel is unmasked, and in those cases,
* we need to preserve whatever handler may have been previously set.
*
* However, in an effort to ensure we don't end up with stale done handlers, connectDMA() will reset channel.done.
*/
if (done) channel.done = done;
if (channel.masked) {
if (DEBUG && this.messageEnabled(Messages.DMA | Messages.DATA)) {
this.printMessage("requestDMA(" + iDMAChannel + "): channel masked, request queued", true);
}
return;
}
/*
* Let's try to do async DMA without asking the CPU for help...
*
* this.cpu.setDMA(true);
*/
this.advanceDMA(channel, true);
};
/**
* advanceDMA(channel, fInit)
*
* @this {ChipSet}
* @param {Object} channel
* @param {boolean} [fInit]
*/
ChipSet.prototype.advanceDMA = function(channel, fInit)
{
if (fInit) {
channel.count = (channel.countCurrent[1] << 8) | channel.countCurrent[0];
channel.type = (channel.mode & ChipSet.DMA_MODE.TYPE);
channel.fWarning = channel.fError = false;
if (DEBUG && DEBUGGER) {
channel.cbDebug = channel.count + 1;
channel.sAddrDebug = (DEBUG && DEBUGGER? null : undefined);
}
}
/*
* To support async DMA without requiring help from the CPU (ie, without relying upon cpu.setDMA()), we require that
* the data transfer functions provide an fAsync parameter to their callbacks; fAsync must be true if the callback was
* truly asynchronous (ie, it had to wait for a remote I/O request to finish), or false if the data was already available
* and the callback was performed synchronously.
*
* Whenever a callback is issued asynchronously, we will immediately daisy-chain another pair of updateDMA()/advanceDMA()
* calls, which will either finish the DMA operation if no more remote I/O requests are required, or will queue up another
* I/O request, which will in turn trigger another async callback. Thus, the DMA request keeps itself going without
* requiring any special assistance from the CPU via setDMA().
*/
var bto = null;
var chipset = this;
var fAsyncRequest = false;
var controller = channel.controller;
var iDMAChannel = controller.nChannelBase + channel.iChannel;
while (true) {
if (channel.count >= 0) {
var b;
var addr = (channel.bPage << 16) | (channel.addrCurrent[1] << 8) | channel.addrCurrent[0];
if (DEBUG && DEBUGGER && channel.sAddrDebug === null) {
channel.sAddrDebug = str.toHex(addr >> 4, 4) + ":" + str.toHex(addr & 0xf, 4);
if (this.messageEnabled(this.messageBitsDMA(iDMAChannel)) && channel.type != ChipSet.DMA_MODE.TYPE_WRITE) {
this.printMessage("advanceDMA(" + iDMAChannel + ") transferring " + channel.cbDebug + " bytes from " + channel.sAddrDebug, true);
this.dbg.doDump("db", channel.sAddrDebug, "l" + channel.cbDebug);
}
}
if (channel.type == ChipSet.DMA_MODE.TYPE_WRITE) {
fAsyncRequest = true;
(function advanceDMAWrite(addrCur) {
channel.fnTransfer.call(channel.component, channel.obj, -1, function onTransferDMA(b, fAsync, obj, off) {
if (b < 0) {
if (!channel.fWarning) {
if (DEBUG && chipset.messageEnabled(Messages.DMA)) {
chipset.printMessage("advanceDMA(" + iDMAChannel + ") ran out of data, assuming 0xff", true);
}
channel.fWarning = true;
}
/*
* TODO: Determine whether to abort, as we do for DMA_MODE.TYPE_READ.
*/
b = 0xff;
}
if (!channel.masked) {
chipset.bus.setByte(addrCur, b);
if (BACKTRACK) {
if (!off && obj.file && chipset.messageEnabled(Messages.DISK)) {
chipset.printMessage("loading " + obj.file.sPath + '[' + obj.offFile + "] at %" + str.toHex(addrCur), true);
}
bto = chipset.bus.addBackTrackObject(obj, bto, off);
chipset.bus.writeBackTrackObject(addrCur, bto, off);
}
}
fAsyncRequest = fAsync;
if (fAsync) {
setTimeout(function() {
if (!chipset.updateDMA(channel)) chipset.advanceDMA(channel);
}, 0);
}
});
}(addr));
}
else if (channel.type == ChipSet.DMA_MODE.TYPE_READ) {
/*
* TODO: Determine whether we should support async dmaWrite() functions (currently not required)
*/
b = chipset.bus.getByte(addr);
if (channel.fnTransfer.call(channel.component, channel.obj, b) < 0) {
/*
* In this case, I think I have no choice but to terminate the DMA operation in response to a failure,
* because the ROM BIOS FDC.REG_DATA.CMD.FORMAT_TRACK command specifies a count that is MUCH too large
* (a side-effect of the ROM BIOS using the same "DMA_SETUP" code for reads, writes AND formats).
*/
channel.fError = true;
}
}
else if (channel.type == ChipSet.DMA_MODE.TYPE_VERIFY) {
/*
* Nothing to read or write; just call updateDMA()
*/
}
else {
if (DEBUG && this.messageEnabled(Messages.DMA | Messages.WARN)) {
this.printMessage("advanceDMA(" + iDMAChannel + ") unsupported transfer type: " + str.toHexWord(channel.type), true);
}
channel.fError = true;
}
}
if (fAsyncRequest || this.updateDMA(channel)) break;
}
};
/**
* updateDMA(channel)
*
* @this {ChipSet}
* @param {Object} channel
* @return {boolean} true if DMA operation complete, false if not
*/
ChipSet.prototype.updateDMA = function(channel)
{
if (!channel.fError && --channel.count >= 0) {
if (channel.mode & ChipSet.DMA_MODE.DECREMENT) {
channel.addrCurrent[0]--;
if (channel.addrCurrent[0] < 0) {
channel.addrCurrent[0] = 0xff;
channel.addrCurrent[1]--;
if (channel.addrCurrent[1] < 0) channel.addrCurrent[1] = 0xff;
}
} else {
channel.addrCurrent[0]++;
if (channel.addrCurrent[0] > 0xff) {
channel.addrCurrent[0] = 0x00;
channel.addrCurrent[1]++;
if (channel.addrCurrent[1] > 0xff) channel.addrCurrent[1] = 0x00;
}
}
/*
* In situations where an HDC DMA operation took too long, the Fixed Disk BIOS would give up, but the DMA operation would continue.
*
* TODO: Verify that the Fixed Disk BIOS shuts down (ie, re-masks) a DMA channel for failed requests, and that this handles those failures.
*/
if (!channel.masked) return false;
}
var controller = channel.controller;
var iDMAChannel = controller.nChannelBase + channel.iChannel;
controller.bStatus = (controller.bStatus & ~(0x10 << channel.iChannel)) | (0x1 << channel.iChannel);
/*
* EOP is supposed to automatically (re)mask the channel, unless it's set for auto-initialize.
*/
if (!(channel.mode & ChipSet.DMA_MODE.AUTOINIT)) {
channel.masked = true;
channel.component = channel.obj = null;
}
if (DEBUG && this.messageEnabled(this.messageBitsDMA(iDMAChannel)) && channel.type == ChipSet.DMA_MODE.TYPE_WRITE && channel.sAddrDebug) {
this.printMessage("updateDMA(" + iDMAChannel + ") transferred " + channel.cbDebug + " bytes to " + channel.sAddrDebug, true);
this.dbg.doDump("db", channel.sAddrDebug, "l" + channel.cbDebug);
}
if (channel.done) {
channel.done(!channel.fError);
channel.done = null;
}
/*
* While it might make sense to call cpu.setDMA() here, it's simpler to let the CPU issue one more call
* to chipset.checkDMA() and let the CPU update INTR.DMA on its own, based on the return value from checkDMA().
*/
return true;
};
/**
* inPICLo(iPIC, addrFrom)
*
* @this {ChipSet}
* @param {number} iPIC
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inPICLo = function(iPIC, addrFrom)
{
var b = 0;
var pic = this.aPICs[iPIC];
if (pic.bOCW3 != null) {
var bReadReg = pic.bOCW3 & ChipSet.PIC_LO.OCW3_READ_CMD;
switch (bReadReg) {
case ChipSet.PIC_LO.OCW3_READ_IRR:
b = pic.bIRR;
break;
case ChipSet.PIC_LO.OCW3_READ_ISR:
b = pic.bISR;
break;
default:
break;
}
}
if (this.messageEnabled(Messages.PIC | Messages.PORT | Messages.CHIPSET)) {
this.printMessageIO(pic.port, null, addrFrom, "PIC" + iPIC, b, true);
}
return b;
};
/**
* outPICLo(iPIC, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} iPIC
* @param {number} bOut
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outPICLo = function(iPIC, bOut, addrFrom)
{
var pic = this.aPICs[iPIC];
if (this.messageEnabled(Messages.PIC | Messages.PORT | Messages.CHIPSET)) {
this.printMessageIO(pic.port, bOut, addrFrom, "PIC" + iPIC, null, true);
}
if (bOut & ChipSet.PIC_LO.ICW1) {
/*
* This must be an ICW1...
*/
pic.nICW = 0;
pic.aICW[pic.nICW++] = bOut;
/*
* I used to do the rest of this initialization in outPICHi(), once all the ICW commands had been received,
* but a closer reading of the 8259A spec indicates that that should happen now, on receipt on ICW1.
*
* Also, on p.10 of that spec, it says "The Interrupt Mask Register is cleared". I originally took that to
* mean that all interrupts were masked, but based on what MS-DOS 4.0M expects to happen after this code runs:
*
* 0070:44C6 B013 MOV AL,13
* 0070:44C8 E620 OUT 20,AL
* 0070:44CA B050 MOV AL,50
* 0070:44CC E621 OUT 21,AL
* 0070:44CE B009 MOV AL,09
* 0070:44D0 E621 OUT 21,AL
*
* (ie, it expects its next call to INT 0x13 will still generate an interrupt), I've decided the spec
* must be read literally, meaning that all IMR bits must be zeroed. Unmasking all possible interrupts by
* default seems unwise to me, but who am I to judge....
*/
pic.bIMR = 0x00;
pic.bIRLow = 7;
/*
* TODO: I'm also zeroing both IRR and ISR, even though that's not actually mentioned as part of the ICW
* sequence, because they need to be (re)initialized at some point. However, if some component is currently
* requesting an interrupt, what should I do about that? Originally, I had decided to clear them ONLY if they
* were still undefined, but that change appeared to break the ROM BIOS handling of CTRL-ALT-DEL, so I'm back
* to unconditionally zeroing them.
*/
pic.bIRR = pic.bISR = 0;
/*
* The spec also says that "Special Mask Mode is cleared and Status Read is set to IRR". I attempt to insure
* the latter, but as for special mask mode... well, that mode isn't supported yet.
*/
pic.bOCW3 = ChipSet.PIC_LO.OCW3 | ChipSet.PIC_LO.OCW3_READ_IRR;
}
else if (!(bOut & ChipSet.PIC_LO.OCW3)) {
/*
* This must be an OCW2...
*/
var bOCW2 = bOut & ChipSet.PIC_LO.OCW2_OP_MASK;
if (bOCW2 & ChipSet.PIC_LO.OCW2_EOI) {
/*
* This OCW2 must be an EOI command...
*/
var nIRL, bIREnd = 0;
if ((bOCW2 & ChipSet.PIC_LO.OCW2_EOI_SPEC) == ChipSet.PIC_LO.OCW2_EOI_SPEC) {
/*
* More "specifically", a specific EOI command...
*/
nIRL = bOut & ChipSet.PIC_LO.OCW2_IR_LVL;
bIREnd = 1 << nIRL;
} else {
/*
* Less "specifically", a non-specific EOI command. The search for the highest priority in-service
* interrupt must start with whichever interrupt is opposite the lowest priority interrupt (normally 7,
* but technically whatever bIRLow is currently set to). For example:
*
* If bIRLow is 7, then the priority order is: 0, 1, 2, 3, 4, 5, 6, 7.
* If bIRLow is 6, then the priority order is: 7, 0, 1, 2, 3, 4, 5, 6.
* If bIRLow is 5, then the priority order is: 6, 7, 0, 1, 2, 3, 4, 5.
* etc.
*/
nIRL = pic.bIRLow + 1;
while (true) {
nIRL &= 0x7;
var bIR = 1 << nIRL;
if (pic.bISR & bIR) {
bIREnd = bIR;
break;
}
if (nIRL++ == pic.bIRLow) break;
}
if (DEBUG && !bIREnd) nIRL = null; // for unexpected non-specific EOI commands, there's no IRQ to report
}
var nIRQ = (nIRL == null? undefined : pic.nIRQBase + nIRL);
if (pic.bISR & bIREnd) {
if (DEBUG && this.messageEnabled(this.messageBitsIRQ(nIRQ))) {
this.printMessage("outPIC" + iPIC + '(' + str.toHexByte(pic.port) + "): IRQ " + nIRQ + " ending @" + this.dbg.hexOffset(this.cpu.getIP(), this.cpu.getCS()) + " stack=" + this.dbg.hexOffset(this.cpu.getSP(), this.cpu.getSS()), true);
}
pic.bISR &= ~bIREnd;
this.checkIRR();
} else {
if (DEBUG && this.messageEnabled(Messages.PIC | Messages.WARN)) {
this.printMessage("outPIC" + iPIC + '(' + str.toHexByte(pic.port) + "): unexpected EOI command, IRQ " + nIRQ + " not in service", true);
if (!SAMPLER && MAXDEBUG) this.dbg.stopCPU();
}
}
/*
* TODO: Support EOI commands with automatic rotation (eg, ChipSet.PIC_LO.OCW2_EOI_ROT and ChipSet.PIC_LO.OCW2_EOI_ROTSPEC)
*/
if (bOCW2 & ChipSet.PIC_LO.OCW2_SET_ROTAUTO) {
this.notice("PIC" + iPIC + '(' + str.toHexByte(pic.port) + "): unsupported OCW2 rotate command: " + str.toHexByte(bOut));
}
}
else if (bOCW2 == ChipSet.PIC_LO.OCW2_SET_PRI) {
/*
* This OCW2 changes the lowest priority interrupt to the specified level (the default is 7)
*/
pic.bIRLow = bOut & ChipSet.PIC_LO.OCW2_IR_LVL;
}
else {
/*
* TODO: Remaining commands to support: ChipSet.PIC_LO.OCW2_SET_ROTAUTO and ChipSet.PIC_LO.OCW2_CLR_ROTAUTO
*/
this.notice("PIC" + iPIC + '(' + str.toHexByte(pic.port) + "): unsupported OCW2 automatic EOI command: " + str.toHexByte(bOut));
}
} else {
/*
* This must be an OCW3 request. If it's a "Read Register" command (PIC_LO.OCW3_READ_CMD), inPICLo() will take care it.
*
* TODO: If OCW3 specified a "Poll" command (PIC_LO.OCW3_POLL_CMD) or a "Special Mask Mode" command (PIC_LO.OCW3_SMM_CMD),
* that's unfortunate, because I don't support them yet.
*/
if (bOut & (ChipSet.PIC_LO.OCW3_POLL_CMD | ChipSet.PIC_LO.OCW3_SMM_CMD)) {
this.notice("PIC" + iPIC + '(' + str.toHexByte(pic.port) + "): unsupported OCW3 command: " + str.toHexByte(bOut));
}
pic.bOCW3 = bOut;
}
};
/**
* inPICHi(iPIC, addrFrom)
*
* @this {ChipSet}
* @param {number} iPIC
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inPICHi = function(iPIC, addrFrom)
{
var pic = this.aPICs[iPIC];
var b = pic.bIMR;
if (this.messageEnabled(Messages.PIC | Messages.PORT | Messages.CHIPSET)) {
this.printMessageIO(pic.port+1, null, addrFrom, "PIC" + iPIC, b, true);
}
return b;
};
/**
* outPICHi(iPIC, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} iPIC
* @param {number} bOut
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outPICHi = function(iPIC, bOut, addrFrom)
{
var pic = this.aPICs[iPIC];
if (this.messageEnabled(Messages.PIC | Messages.PORT | Messages.CHIPSET)) {
this.printMessageIO(pic.port+1, bOut, addrFrom, "PIC" + iPIC, null, true);
}
if (pic.nICW < pic.aICW.length) {
pic.aICW[pic.nICW++] = bOut;
if (pic.nICW == 2 && (pic.aICW[0] & ChipSet.PIC_LO.ICW1_SNGL))
pic.nICW++;
if (pic.nICW == 3 && !(pic.aICW[0] & ChipSet.PIC_LO.ICW1_ICW4))
pic.nICW++;
}
else {
/*
* We have all our ICW "words" (ie, bytes), so this must be an OCW1 write (which is simply an IMR write)
*/
pic.bIMR = bOut;
/*
* See the CPU's delayINTR() function for an explanation of why this explicit delay is necessary.
*/
this.cpu.delayINTR();
/*
* Alas, we need a longer delay for the MODEL_5170's "KBD_RESET" function (F000:17D2), which must drop
* into a loop and decrement CX at least once after unmasking the KBD IRQ. The "KBD_RESET" function on
* previous models could be handled with a 4-instruction delay provided by the Keyboard.resetDevice() call
* to setIRR(), but the MODEL_5170 needs a roughly 6-instruction delay after it unmasks the KBD IRQ.
*/
this.checkIRR(!iPIC && bOut == 0xFD? 6 : 0);
}
};
/**
* checkIMR(nIRQ)
*
* @this {ChipSet}
* @param {number} nIRQ
* @return {boolean} true if the specified IRQ is masked, false if not
*/
ChipSet.prototype.checkIMR = function(nIRQ)
{
var iPIC = nIRQ >> 3;
var nIRL = nIRQ & 0x7;
var pic = this.aPICs[iPIC];
return (pic.bIMR & (0x1 << nIRL))? true : false;
};
/**
* setIRR(nIRQ, nDelay)
*
* @this {ChipSet}
* @param {number} nIRQ (IRQ 0-7 implies iPIC 0, and IRQ 8-15 implies iPIC 1)
* @param {number} [nDelay] is an optional number of instructions to delay acknowledgment of the IRQ (see getIRRVector)
*/
ChipSet.prototype.setIRR = function(nIRQ, nDelay)
{
var iPIC = nIRQ >> 3;
var nIRL = nIRQ & 0x7;
var pic = this.aPICs[iPIC];
var bIRR = (1 << nIRL);
if (!(pic.bIRR & bIRR)) {
pic.bIRR |= bIRR;
if (DEBUG && this.messageEnabled(this.messageBitsIRQ(nIRQ) | Messages.CHIPSET)) {
this.printMessage("setIRR(" + nIRQ + ")", true);
}
pic.nDelay = nDelay || 0;
this.checkIRR();
}
};
/**
* clearIRR(nIRQ)
*
* @this {ChipSet}
* @param {number} nIRQ (IRQ 0-7 implies iPIC 0, and IRQ 8-15 implies iPIC 1)
*/
ChipSet.prototype.clearIRR = function(nIRQ)
{
var iPIC = nIRQ >> 3;
var nIRL = nIRQ & 0x7;
var pic = this.aPICs[iPIC];
var bIRR = (1 << nIRL);
if (pic.bIRR & bIRR) {
pic.bIRR &= ~bIRR;
if (DEBUG && this.messageEnabled(this.messageBitsIRQ(nIRQ) | Messages.CHIPSET)) {
this.printMessage("clearIRR(" + nIRQ + ")", true);
}
this.checkIRR();
}
};
/**
* checkIRR(nDelay)
*
* @this {ChipSet}
* @param {number} [nDelay] is an optional number of instructions to delay acknowledgment of a pending interrupt
*/
ChipSet.prototype.checkIRR = function(nDelay)
{
/*
* Look for any IRR bits that aren't masked and aren't already in service; in theory, all we'd have to
* check is the master PIC (which is the *only* PIC on pre-5170 models), because when any IRQs are set or
* cleared on the slave, that would automatically be reflected in IRQ.SLAVE on the master; that's what
* setIRR() and clearIRR() used to do.
*
* Unfortunately, despite setIRR() and clearIRR()'s efforts, whenever a slave interrupt is acknowledged,
* getIRRVector() ends up clearing the IRR bits for BOTH the slave's IRQ and the master's IRQ.SLAVE.
* So if another lower-priority slave IRQ is waiting to be dispatched, that fact is no longer reflected
* in IRQ.SLAVE.
*
* Since checkIRR() is called on every EOI, we can resolve that problem here, by first checking the slave
* PIC for any unmasked, unserviced interrupts and updating the master's IRQ.SLAVE.
*
* And since this is ALSO called by both setIRR() and clearIRR(), those functions no longer need to perform
* their own IRQ.SLAVE updates. This function consolidates the propagation of slave interrupts to the master.
*/
var pic;
var bIR = -1;
if (this.cPICs > 1) {
pic = this.aPICs[1];
bIR = ~(pic.bISR | pic.bIMR) & pic.bIRR;
}
pic = this.aPICs[0];
if (bIR >= 0) {
if (bIR) {
pic.bIRR |= (1 << ChipSet.IRQ.SLAVE);
} else {
pic.bIRR &= ~(1 << ChipSet.IRQ.SLAVE);
}
}
bIR = ~(pic.bISR | pic.bIMR) & pic.bIRR;
this.cpu.updateINTR(!!bIR);
if (bIR && nDelay) pic.nDelay = nDelay;
};
/**
* getIRRVector()
*
* getIRRVector() is called by the CPU whenever PS_IF is set and OP_NOINTR is clear. Ordinarily, an immediate
* response would seem perfectly reasonable, but unfortunately, there are places in the original ROM BIOS like
* "KBD_RESET" (F000:E688) that enable interrupts but still expect nothing to happen for several more instructions.
*
* So, in addition to the two normal responses (an IDT vector #, or -1 indicating no pending interrupts), we must
* support a third response (-2) that basically means: don't change the CPU interrupt state, just keep calling until
* we return one of the first two responses. The number of times we delay our normal response is determined by the
* component that originally called setIRR with an optional delay parameter.
*
* @this {ChipSet}
* @param {number} [iPIC]
* @return {number} IDT vector # of the next highest-priority interrupt, -1 if none, or -2 for "please try your call again later"
*/
ChipSet.prototype.getIRRVector = function(iPIC)
{
if (iPIC === undefined) iPIC = 0;
/*
* Look for any IRR bits that aren't masked and aren't already in service...
*/
var nIDT = -1;
var pic = this.aPICs[iPIC];
if (!pic.nDelay) {
var bIR = pic.bIRR & ((pic.bISR | pic.bIMR) ^ 0xff);
/*
* The search for the next highest priority requested interrupt (that's also not in-service and not masked)
* must start with whichever interrupt is opposite the lowest priority interrupt (normally 7, but technically
* whatever bIRLow is currently set to). For example:
*
* If bIRLow is 7, then the priority order is: 0, 1, 2, 3, 4, 5, 6, 7.
* If bIRLow is 6, then the priority order is: 7, 0, 1, 2, 3, 4, 5, 6.
* If bIRLow is 5, then the priority order is: 6, 7, 0, 1, 2, 3, 4, 5.
* etc.
*
* This process is similar to the search performed by non-specific EOIs, except those apply only to a single
* PIC (which is why a slave interrupt must be EOI'ed twice: once for the slave PIC and again for the master),
* whereas here we must search across all PICs.
*/
var nIRL = pic.bIRLow + 1;
while (true) {
nIRL &= 0x7;
var bIRNext = 1 << nIRL;
if (bIR & bIRNext) {
if (!iPIC && nIRL == ChipSet.IRQ.SLAVE) {
/*
* Slave interrupts are tied to the master PIC on IRQ2; query the slave PIC for the vector #
*/
nIDT = this.getIRRVector(1);
} else {
/*
* Get the starting IDT vector # from ICW2 and add the IR level to obtain the target IDT vector #
*/
nIDT = pic.aICW[1] + nIRL;
}
if (nIDT >= 0) {
pic.bISR |= bIRNext;
/*
* Setting the ISR implies clearing the IRR, but clearIRR() has side-effects we don't want
* (eg, clearing the slave IRQ, notifying the CPU, etc), so we clear the IRR ourselves.
*/
pic.bIRR &= ~bIRNext;
var nIRQ = pic.nIRQBase + nIRL;
if (DEBUG && this.messageEnabled(this.messageBitsIRQ(nIRQ))) {
this.printMessage("getIRRVector(): IRQ " + nIRQ + " interrupting @" + this.dbg.hexOffset(this.cpu.getIP(), this.cpu.getCS()) + " stack=" + this.dbg.hexOffset(this.cpu.getSP(), this.cpu.getSS()), true);
}
if (MAXDEBUG && DEBUGGER) {
this.acInterrupts[nIRQ]++;
}
}
break;
}
if (nIRL++ == pic.bIRLow) break;
}
} else {
nIDT = -2;
pic.nDelay--;
}
return nIDT;
};
/**
* inTimer(iTimer, addrFrom)
*
* @this {ChipSet}
* @param {number} iTimer
* @param {number} port (0x40, 0x41, 0x42, etc)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inTimer = function(iTimer, port, addrFrom)
{
var b;
var timer = this.aTimers[iTimer];
if (timer.countIndex == timer.countBytes) this.resetTimerIndex(iTimer);
if (timer.fLatched) {
return timer.countLatched[timer.countIndex++];
}
this.updateTimer(iTimer);
b = timer.countCurrent[timer.countIndex++];
if (this.messageEnabled(Messages.TIMER | Messages.PORT)) {
this.printMessageIO(port, null, addrFrom, "TIMER" + iTimer, b, true);
}
return b;
};
/**
* outTimer(iTimer, port, bOut, addrFrom)
*
* We now rely EXCLUSIVELY on setBurstCycles() to address situations where quick timer interrupt turn-around
* is expected; eg, by the ROM BIOS POST when it sets TIMER0 to a low test count (0x16); since we typically
* don't update any of the timers until after we've finished a burst of CPU cycles, we must reduce the current
* burst cycle count, so that the current instruction burst will end at the same time a timer interrupt is expected.
*
* Note that in some cases, if the number of cycles remaining in the current burst is less than the target,
* this may have the effect of *lengthening* the current burst instead of shortening it, but stepCPU() should be
* OK with that.
*
* @this {ChipSet}
* @param {number} iTimer
* @param {number} port (0x40, 0x41, 0x42, etc)
* @param {number} bOut
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outTimer = function(iTimer, port, bOut, addrFrom)
{
if (this.messageEnabled(Messages.TIMER | Messages.PORT)) {
this.printMessageIO(port, bOut, addrFrom, "TIMER" + iTimer, null, true);
}
var timer = this.aTimers[iTimer];
if (timer.countIndex == timer.countBytes) this.resetTimerIndex(iTimer);
timer.countInit[timer.countIndex++] = bOut;
if (timer.countIndex == timer.countBytes) {
/*
* In general, writing a new count to a timer that's already counting isn't supposed to affect the current
* count, with the notable exceptions of MODE0 and MODE4.
*/
if (!timer.fCounting || timer.mode == ChipSet.PIT_CTRL.MODE0 || timer.mode == ChipSet.PIT_CTRL.MODE4) {
timer.fLatched = false;
timer.countCurrent[0] = timer.countStart[0] = timer.countInit[0];
timer.countCurrent[1] = timer.countStart[1] = timer.countInit[1];
timer.nCyclesStart = this.cpu.getCycles(this.fScaleTimers);
timer.fCounting = true;
/*
* I believe MODE0 is the only mode where "OUT" (fOUT) starts out "low" (false); for the rest of the modes,
* "OUT" (fOUT) starts "high" (true). It's also my understanding that the way edge-triggered interrupts work
* on the original PC is that an interrupt is requested only when the corresponding "OUT" transitions from
* "low" to "high".
*/
timer.fOUT = (timer.mode != ChipSet.PIT_CTRL.MODE0);
if (iTimer == ChipSet.PIT0.TIMER0) {
/*
* TODO: Determine if there are situations/modes where I should NOT automatically clear IRQ0 on behalf of TIMER0.
*/
this.clearIRR(ChipSet.IRQ.TIMER0);
var countInit = this.getTimerInit(ChipSet.PIT0.TIMER0);
var nCyclesRemain = (countInit * this.nTicksDivisor) | 0;
if (timer.mode == ChipSet.PIT_CTRL.MODE3) nCyclesRemain >>= 1;
this.cpu.setBurstCycles(nCyclesRemain);
}
}
if (iTimer == ChipSet.PIT0.TIMER2) this.setSpeaker();
}
};
/**
* inPIT1Ctrl(port, addrFrom)
*
* @this {ChipSet}
* @param {number} port (0x43)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number|null} simulated port value
*/
ChipSet.prototype.inPIT1Ctrl = function(port, addrFrom)
{
this.printMessageIO(port, null, addrFrom, "PIT1_CTRL", null, Messages.TIMER);
if (DEBUG) this.printMessage("PIT1_CTRL: Read-Back command not supported (yet)", Messages.TIMER);
return null;
};
/**
* outPIT1Ctrl(port, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} port (0x43)
* @param {number} bOut
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outPIT1Ctrl = function(port, bOut, addrFrom)
{
this.bPIT1Ctrl = bOut;
this.printMessageIO(port, bOut, addrFrom, "PIT1_CTRL", null, Messages.TIMER);
/*
* Extract the SC (Select Counter) bits
*/
var iTimer = (bOut & ChipSet.PIT_CTRL.SC) >> 6;
if (iTimer == 0x3) {
if (DEBUG) this.printMessage("PIT1_CTRL: Read-Back command not supported (yet)", Messages.TIMER);
return;
}
/*
* Extract the BCD, MODE, and RW bits, which we simply store as-is (see setTimerMode)
*/
var bcd = (bOut & ChipSet.PIT_CTRL.BCD);
var mode = (bOut & ChipSet.PIT_CTRL.MODE);
var rw = (bOut & ChipSet.PIT_CTRL.RW);
if (!rw) {
this.latchTimer(iTimer);
} else {
this.setTimerMode(iTimer, bcd, mode, rw);
/*
* The 5150 ROM BIOS code @F000:E285 ("TEST.7") would fail after a warm boot (eg, after a CTRL-ALT-DEL) because
* it assumed that no TIMER0 interrupt would occur between the point it unmasked the TIMER0 interrupt and the
* point it started reprogramming TIMER0.
*
* Similarly, the 5160 ROM BIOS @F000:E35D ("8253 TIMER CHECKOUT") would fail after initializing the EGA BIOS,
* because the EGA BIOS uses TIMER0 during its diagnostics; as in the previous example, by the time the 8253
* test code runs later, there's now a pending TIMER0 interrupt, which triggers an interrupt as soon as IRQ0 is
* unmasked @F000:E364.
*
* After looking at this problem at bit more closely the second time around (while debugging the EGA BIOS),
* it turns out I missed an important 8253 feature: whenever a new MODE0 control word OR a new MODE0 count
* is written, fOUT (which is what drives IRQ0) goes low. So, by simply adding an appropriate clearIRR() call
* both here and in outTimer(), this annoying problem seems to be gone.
*
* TODO: Determine if there are situations/modes where I should NOT automatically clear IRQ0 on behalf of TIMER0.
*/
if (iTimer == ChipSet.PIT0.TIMER0) this.clearIRR(ChipSet.IRQ.TIMER0);
/*
* Another TIMER0 HACK: The "CASSETTE DATA WRAP TEST" @F000:E51E occasionally reports an error when the second of
* two TIMER0 counts it latches is greater than the first. You would think the ROM BIOS would expect this, since
* TIMER0 can reload its count at any time. Is the ROM BIOS assuming that TIMER0 was initialized sufficiently
* recently that this should never happen? I'm not sure, but for now, let's try resetting TIMER0's count immediately
* after TIMER2 has been reprogrammed for the test in question (ie, when interrupts are masked and PPIB is set as
* shown below).
*
* FWIW, I believe the cassette hardware was discontinued after MODEL_5150, and even if the test fails, it's non-fatal;
* the ROM BIOS displays an error (131) and moves on.
*/
if (iTimer == ChipSet.PIT0.TIMER2) {
var pic = this.aPICs[0];
if (pic.bIMR == 0xff && this.bPPIB == (ChipSet.PPI_B.CLK_TIMER2 | ChipSet.PPI_B.ENABLE_SW2 | ChipSet.PPI_B.CASS_MOTOR_OFF | ChipSet.PPI_B.CLK_KBD)) {
var timer = this.aTimers[0];
timer.countStart[0] = timer.countInit[0];
timer.countStart[1] = timer.countInit[1];
timer.nCyclesStart = this.cpu.getCycles(this.fScaleTimers);
if (DEBUG && this.messageEnabled(Messages.TIMER)) {
this.printMessage("TIMER0 count reset @" + timer.nCyclesStart + " cycles", true);
}
}
}
}
};
/**
* getTimerInit(iTimer)
*
* @this {ChipSet}
* @param {number} iTimer
* @return {number} initial timer count
*/
ChipSet.prototype.getTimerInit = function(iTimer)
{
var timer = this.aTimers[iTimer];
var countInit = (timer.countInit[1] << 8) | timer.countInit[0];
if (!countInit) countInit = (timer.countBytes == 1? 0x100 : 0x10000);
return countInit;
};
/**
* getTimerStart(iTimer)
*
* @this {ChipSet}
* @param {number} iTimer
* @return {number} starting timer count (from the initial timer count for the current countdown)
*/
ChipSet.prototype.getTimerStart = function(iTimer)
{
var timer = this.aTimers[iTimer];
var countStart = (timer.countStart[1] << 8) | timer.countStart[0];
if (!countStart) countStart = (timer.countBytes == 1? 0x100 : 0x10000);
return countStart;
};
/**
* getTimerCycleLimit(iTimer, nCycles)
*
* This is called by the CPU to determine the maximum number of cycles it can process for the current burst.
* It's presumed that no instructions have been executed since the last updateTimer(iTimer) call.
*
* @this {ChipSet}
* @param {number} iTimer
* @param {number} nCycles desired
* @return {number} maximum number of cycles remaining for the specified timer (<= nCycles)
*/
ChipSet.prototype.getTimerCycleLimit = function(iTimer, nCycles)
{
var timer = this.aTimers[iTimer];
if (timer.fCounting) {
var nCyclesUpdate = this.cpu.getCycles(this.fScaleTimers);
var ticksElapsed = ((nCyclesUpdate - timer.nCyclesStart) / this.nTicksDivisor) | 0;
this.assert(ticksElapsed >= 0);
var countStart = this.getTimerStart(iTimer);
var count = countStart - ticksElapsed;
if (timer.mode == ChipSet.PIT_CTRL.MODE3) count -= ticksElapsed;
this.assert(count > 0);
var nCyclesRemain = (count * this.nTicksDivisor) | 0;
if (timer.mode == ChipSet.PIT_CTRL.MODE3) nCyclesRemain >>= 1;
if (nCycles > nCyclesRemain) nCycles = nCyclesRemain;
}
return nCycles;
};
/**
* latchTimer(iTimer)
*
* @this {ChipSet}
* @param {number} iTimer
*/
ChipSet.prototype.latchTimer = function(iTimer)
{
/*
* Update the timer's current count
*/
this.updateTimer(iTimer);
/*
* Now we can latch it
*/
var timer = this.aTimers[iTimer];
timer.countLatched[0] = timer.countCurrent[0];
timer.countLatched[1] = timer.countCurrent[1];
timer.fLatched = true;
/*
* VERIFY: That a latch request resets the timer index
*/
this.resetTimerIndex(iTimer);
};
/**
* setTimerMode(iTimer, bcd, mode, rw)
*
* FYI: After setting a timer's mode, the CPU must set the timer's count before it becomes operational;
* ie, before fCounting becomes true.
*
* @this {ChipSet}
* @param {number} iTimer
* @param {number} bcd
* @param {number} mode
* @param {number} rw
*/
ChipSet.prototype.setTimerMode = function(iTimer, bcd, mode, rw)
{
var timer = this.aTimers[iTimer];
timer.rw = rw;
timer.mode = mode;
timer.bcd = bcd;
timer.countInit = [0, 0];
timer.countCurrent = [0, 0];
timer.countLatched = [0, 0];
timer.fOUT = false;
timer.fLatched = false;
timer.fCounting = false;
this.resetTimerIndex(iTimer);
};
/**
* resetTimerIndex(iTimer)
*
* @this {ChipSet}
* @param {number} iTimer
*/
ChipSet.prototype.resetTimerIndex = function(iTimer)
{
var timer = this.aTimers[iTimer];
timer.countIndex = (timer.rw == ChipSet.PIT_CTRL.RW_MSB? 1 : 0);
timer.countBytes = (timer.rw == ChipSet.PIT_CTRL.RW_BOTH? 2 : 1);
};
/**
* updateTimer(iTimer, fCycleReset)
*
* updateTimer() calculates and updates a timer's current count purely on an "on-demand" basis; we don't
* actually adjust timer counters every 4 CPU cycles on a 4.77Mhz PC, since updating timers that frequently
* would be prohibitively slow. If you're single-stepping the CPU, then yes, updateTimer() will be called
* after every stepCPU(), via updateAllTimers(), but if we're doing our job correctly here, the frequency
* of calls to updateTimer() should not affect timer counts across otherwise identical runs.
*
* TODO: Implement support for all TIMER modes, and verify that all the modes currently implemented are
* "up to spec"; they're close enough to make the ROM BIOS happy, but beyond that, I've done very little.
*
* @this {ChipSet}
* @param {number} iTimer
* 0: Time-of-Day interrupt (~18.2 interrupts/second)
* 1: DMA refresh
* 2: Sound/Cassette
* @param {boolean} [fCycleReset] is true if a cycle-count reset is about to occur
* @return {Object} timer
*/
ChipSet.prototype.updateTimer = function(iTimer, fCycleReset)
{
var timer = this.aTimers[iTimer];
/*
* Every timer's counting state is gated by its own fCounting flag; TIMER2 is further gated by PPI_B's
* CLK_TIMER2 bit.
*/
if (timer.fCounting && (iTimer != ChipSet.PIT0.TIMER2 || (this.bPPIB & ChipSet.PPI_B.CLK_TIMER2))) {
/*
* We determine the current timer count based on how many instruction cycles have elapsed since we started
* the timer. Timers are supposed to be "ticking" at a rate of 1193181.8181 times per second, which is
* the system clock of 14.31818Mhz, divided by 12.
*
* Similarly, for an 8088, there are supposed to be 4.77Mhz instruction cycles per second, which comes from
* the system clock of 14.31818Mhz, divided by 3.
*
* If we divide 4,772,727 CPU cycles per second by 1,193,181 ticks per second, we get 4 cycles per tick,
* which agrees with the ratio of the clock divisors: 12 / 3 == 4.
*
* However, if getCycles() is being called with fScaleTimers == true AND the CPU is running faster than its
* base cycles-per-second setting, then getCycles() will divide the cycle count by the CPU's cycle multiplier,
* so that the timers fire with the same real-world frequency that the user expects. However, that will
* break any code (eg, the ROM BIOS diagnostics) that assumes that the timers are ticking once every 4 cycles
* (or more like every 5 cycles on a 6Mhz 80286).
*
* So, when using a machine with the ChipSet "scaletimers" property set, make sure you reset the machine's
* speed prior to rebooting, otherwise you're likely to see ROM BIOS errors. Ditto for any application code
* that makes similar assumptions about the relationship between CPU and timer speeds.
*
* In general, you're probably better off NOT using the "scaletimers" property, and simply allowing the timers
* to tick faster as you increase CPU speed (which is why fScaleTimers defaults to false).
*/
var nCycles = this.cpu.getCycles(this.fScaleTimers);
/*
* Instead of maintaining partial tick counts, we calculate a fresh countCurrent from countStart every
* time we're called, using the cycle count recorded when the timer was initialized. countStart is set
* to countInit when fCounting is first set, and then it is refreshed from countInit at the expiration of
* every count, so that if someone loaded a new countInit in the meantime (eg, BASICA), we'll pick it up.
*
* For the original MODEL_5170, the number of cycles per tick is approximately 6,000,000 / 1,193,181,
* or 5.028575, so we can no longer always divide cycles by 4 with a simple right-shift by 2. The proper
* divisor (eg, 4 for MODEL_5150 and MODEL_5160, 5 for MODEL_5170, etc) is nTicksDivisor, which initBus()
* calculates using the base CPU speed returned by cpu.getCyclesPerSecond().
*/
var ticksElapsed = ((nCycles - timer.nCyclesStart) / this.nTicksDivisor) | 0;
if (ticksElapsed < 0) {
if (DEBUG && this.messageEnabled(Messages.TIMER)) {
this.printMessage("updateTimer(" + iTimer + "): negative tick count (" + ticksElapsed + ")", true);
}
timer.nCyclesStart = nCycles;
ticksElapsed = 0;
}
var countInit = this.getTimerInit(iTimer);
var countStart = this.getTimerStart(iTimer);
var fFired = false;
var count = countStart - ticksElapsed;
/*
* NOTE: This mode is used by ROM BIOS test code that wants to verify timer interrupts are arriving
* neither too slowly nor too quickly. As a result, I've had to add some corresponding trickery
* in outTimer() to force interrupt simulation immediately after a low initial count (0x16) has been set.
*/
if (timer.mode == ChipSet.PIT_CTRL.MODE0) {
if (count <= 0) count = 0;
if (DEBUG && this.messageEnabled(Messages.TIMER)) {
this.printMessage("updateTimer(" + iTimer + "): MODE0 timer count=" + count, true);
}
if (!count) {
timer.fOUT = true;
timer.fCounting = false;
if (!iTimer) {
fFired = true;
this.setIRR(ChipSet.IRQ.TIMER0);
if (MAXDEBUG && DEBUGGER) this.acTimersFired[iTimer]++;
}
}
}
/*
* Early implementation of this mode was minimal because when using this mode, the ROM BIOS simply wanted
* to see the count changing; it wasn't looking for interrupts. See ROM BIOS "TEST.03" code @F000:E0DE,
* where TIMER1 is programmed for MODE2, LSB (the same settings, incidentally, used immediately afterward
* for TIMER1 in conjunction with DMA channel 0 memory refreshes).
*
* Now this mode generates interrupts. Note that "OUT" goes "low" when the count reaches 1, then "high"
* one tick later, at which point the count is reloaded and counting continues.
*
* Chances are, we will often miss the exact point at which the count becomes 1 (or more importantly, one
* tick later, when the count *would* become 0, since that's when "OUT" transitions from "low" to "high"),
* but as with MODE3, hopefully no one will mind.
*
* FYI, technically, it appears that the count is never supposed to reach 0, and that an initial count of 1
* is "illegal", whatever that means.
*/
else if (timer.mode == ChipSet.PIT_CTRL.MODE2) {
timer.fOUT = (count != 1); // yes, this line does seem rather pointless....
if (count <= 0) {
count = countInit + count;
if (count <= 0) {
/*
* TODO: Consider whether we ever care about TIMER1 or TIMER2 underflow
*/
if (DEBUG && this.messageEnabled(Messages.TIMER) && !iTimer) {
this.printMessage("updateTimer(" + iTimer + "): mode=2, underflow=" + count, true);
}
count = countInit;
}
timer.countStart[0] = count & 0xff;
timer.countStart[1] = count >> 8;
timer.nCyclesStart = nCycles;
if (!iTimer && timer.fOUT) {
fFired = true;
this.setIRR(ChipSet.IRQ.TIMER0);
if (MAXDEBUG && DEBUGGER) this.acTimersFired[iTimer]++;
}
}
}
/*
* NOTE: This is the normal mode for TIMER0, which the ROM BIOS uses to generate h/w interrupts roughly
* 18.2 times per second. In this mode, the count must be decremented twice as fast (hence the extra ticks
* subtraction below, in addition to the subtraction above), but IRQ_TIMER0 is raised only on alternate
* iterations; ie, only when fOUT transitions to true ("high"). The equal alternating fOUT states is why
* this mode is referred to as "square wave" mode.
*
* TODO: Implement the correct behavior for this mode when the count is ODD. In that case, fOUT is supposed
* to be "high" for (N + 1) / 2 ticks and "low" for (N - 1) / 2 ticks.
*/
else if (timer.mode == ChipSet.PIT_CTRL.MODE3) {
count -= ticksElapsed;
if (count <= 0) {
timer.fOUT = !timer.fOUT;
count = countInit + count;
if (count <= 0) {
/*
* TODO: Consider whether we ever care about TIMER1 or TIMER2 underflow
*/
if (DEBUG && this.messageEnabled(Messages.TIMER) && !iTimer) {
this.printMessage("updateTimer(" + iTimer + "): mode=3, underflow=" + count, true);
}
count = countInit;
}
if (MAXDEBUG && DEBUGGER && !iTimer) {
var nCycleDelta = 0;
if (this.acTimer0Counts.length > 0) nCycleDelta = nCycles - this.acTimer0Counts[0][1];
this.acTimer0Counts.push([count, nCycles, nCycleDelta]);
}
timer.countStart[0] = count & 0xff;
timer.countStart[1] = count >> 8;
timer.nCyclesStart = nCycles;
if (!iTimer && timer.fOUT) {
fFired = true;
this.setIRR(ChipSet.IRQ.TIMER0);
if (MAXDEBUG && DEBUGGER) this.acTimersFired[iTimer]++;
}
}
}
if (DEBUG && this.messageEnabled(Messages.TIMER | Messages.LOG)) {
this.log("TIMER" + iTimer + " count: " + count + ", ticks: " + ticksElapsed + ", fired: " + (fFired? "true" : "false"));
}
timer.countCurrent[0] = count & 0xff;
timer.countCurrent[1] = count >> 8;
if (fCycleReset) this.nCyclesStart = 0;
}
return timer;
};
/**
* updateAllTimers(fCycleReset)
*
* @this {ChipSet}
* @param {boolean} [fCycleReset] is true if a cycle-count reset is about to occur
*/
ChipSet.prototype.updateAllTimers = function(fCycleReset)
{
for (var iTimer = 0; iTimer < this.aTimers.length; iTimer++) {
this.updateTimer(iTimer, fCycleReset);
}
if (this.model >= ChipSet.MODEL_5170) this.updateRTCTime();
};
/**
* inPPIA(port, addrFrom)
*
* @this {ChipSet}
* @param {number} port (0x60)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inPPIA = function(port, addrFrom)
{
var b = this.bPPIA;
if (this.bPPICtrl & ChipSet.PPI_CTRL.A_IN) {
if (this.bPPIB & ChipSet.PPI_B.CLEAR_KBD) {
b = this.sw1;
}
else if (this.kbd) {
b = this.kbd.readScanCode();
}
}
this.printMessageIO(port, null, addrFrom, "PPI_A", b);
return b;
};
/**
* outPPIA(port, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} port (0x60)
* @param {number} bOut
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outPPIA = function(port, bOut, addrFrom)
{
this.printMessageIO(port, bOut, addrFrom, "PPI_A");
this.bPPIA = bOut;
};
/**
* inPPIB(port, addrFrom)
*
* @this {ChipSet}
* @param {number} port (0x61)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inPPIB = function(port, addrFrom)
{
var b = this.bPPIB;
this.printMessageIO(port, null, addrFrom, "PPI_B", b);
return b;
};
/**
* outPPIB(port, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} port (0x61)
* @param {number} bOut
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outPPIB = function(port, bOut, addrFrom)
{
this.printMessageIO(port, bOut, addrFrom, "PPI_B");
this.updatePPIB(bOut);
if (this.kbd) this.kbd.setEnabled((bOut & ChipSet.PPI_B.CLEAR_KBD)? false : true, (bOut & ChipSet.PPI_B.CLK_KBD)? true : false);
};
/**
* updatePPIB(bOut)
*
* On MODEL_5170 and up, this updates the "simulated" PPI_B. The only common (and well-documented) PPI_B bits
* across all models are PPI_B.CLK_TIMER2 and PPI_B.SPK_TIMER2, so its possible that this function may need to
* limit its updates to just those bits, and move any model-specific requirements back into the appropriate I/O
* handlers (PPIB or 8042RWReg). We'll see.
*
* @this {ChipSet}
* @param {number} bOut
*/
ChipSet.prototype.updatePPIB = function(bOut)
{
var fNewSpeaker = !!(bOut & ChipSet.PPI_B.SPK_TIMER2);
var fOldSpeaker = !!(this.bPPIB & ChipSet.PPI_B.SPK_TIMER2);
this.bPPIB = bOut;
if (fNewSpeaker != fOldSpeaker) {
/*
* Originally, this code didn't catch the "ERROR_BEEP" case @F000:EC34, which first turns both PPI_B.CLK_TIMER2 (0x01)
* and PPI_B.SPK_TIMER2 (0x02) off, then turns on only PPI_B.SPK_TIMER2 (0x02), then restores the original port value.
*
* So, when the ROM BIOS keyboard buffer got full, we didn't issue a BEEP alert. I've fixed that by limiting the test
* to PPI_B.SPK_TIMER2 and ignoring PPI_B.CLK_TIMER2.
*/
this.setSpeaker(fNewSpeaker);
}
};
/**
* inPPIC(port, addrFrom)
*
* @this {ChipSet}
* @param {number} port (0x62)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inPPIC = function(port, addrFrom)
{
var b = 0;
/*
* If you ever wanted to simulate I/O channel errors or R/W memory parity errors, you could
* add either PPI_C.IO_CHANNEL_CHK (0x40) or PPI_C.RW_PARITY_CHK (0x80) to the return value (b).
*/
if (this.model == ChipSet.MODEL_5150) {
if (this.bPPIB & ChipSet.PPI_B.ENABLE_SW2) {
b |= this.sw2 & ChipSet.PPI_C.SW;
} else {
b |= (this.sw2 >> 4) & 0x1; // QUESTION: Does any component actually care about SW2[5] on a MODEL_5150?
}
} else {
if (this.bPPIB & ChipSet.PPI_B.ENABLE_SW_HI) {
b |= this.sw1 >> 4;
} else {
b |= this.sw1 & 0xf;
}
}
if (this.bPPIB & ChipSet.PPI_B.CLK_TIMER2) {
var timer = this.updateTimer(ChipSet.PIT0.TIMER2);
if (timer.fOUT) {
if (this.bPPIB & ChipSet.PPI_B.SPK_TIMER2)
b |= ChipSet.PPI_C.TIMER2_OUT;
else
b |= ChipSet.PPI_C.CASS_DATA_IN;
}
}
/*
* The ROM BIOS polls this port incessantly during its memory tests, checking for memory parity errors
* (which of course we never report), so we further restrict these port messages to Messages.MEM.
*/
this.printMessageIO(port, null, addrFrom, "PPI_C", b, Messages.CHIPSET | Messages.MEM);
return b;
};
/**
* outPPIC(port, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} port (0x62)
* @param {number} bOut
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.outPPIC = function(port, bOut, addrFrom)
{
this.printMessageIO(port, bOut, addrFrom, "PPI_C");
this.bPPIC = bOut;
};
/**
* inPPICtrl(port, addrFrom)
*
* @this {ChipSet}
* @param {number} port (0x63)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inPPICtrl = function(port, addrFrom)
{
var b = this.bPPICtrl;
this.printMessageIO(port, null, addrFrom, "PPI_CTRL", b);
return b;
};
/**
* outPPICtrl(port, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} port (0x63)
* @param {number} bOut
* @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
*/
ChipSet.prototype.outPPICtrl = function(port, bOut, addrFrom)
{
this.printMessageIO(port, bOut, addrFrom, "PPI_CTRL");
this.bPPICtrl = bOut;
};
/**
* in8042OutBuff(port, addrFrom)
*
* Return the contents of the OUTBUFF register and clear the OUTBUFF_FULL status bit.
*
* This function then calls kbd.checkScanCode(), on the theory that the next buffered scan
* code, if any, can now be delivered to OUTBUFF. However, there are applications like
* BASICA that install a keyboard interrupt handler that reads OUTBUFF, do some scan code
* preprocessing, and then pass control on to the ROM's interrupt handler. As a result,
* OUTBUFF is read multiple times during a single interrupt, so filling it with new data
* after every read would result in lost scan codes.
*
* To avoid that problem, kbd.checkScanCode() also requires that kbd.setEnabled() be called
* before it supplies any more data via notifyKbdData(). That will happen as soon as the
* ROM re-enables the controller, and is why KBC.CMD.ENABLE_KBD processing also ends with a
* call to kbd.checkScanCode().
*
* Note that, the foregoing notwithstanding, I still clear the OUTBUFF_FULL bit here (as I
* believe I should); fortunately, none of the interrupt handlers rely on OUTBUFF_FULL as a
* prerequisite for reading OUTBUFF (not the BASICA handler, and not the ROM). The assumption
* seems to be that if an interrupt occurred, OUTBUFF must contain data, regardless of the
* state of OUTBUFF_FULL.
*
* @this {ChipSet}
* @param {number} port (0x60)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.in8042OutBuff = function(port, addrFrom)
{
var b = this.b8042OutBuff;
this.printMessageIO(port, null, addrFrom, "8042_OUTBUFF", b, Messages.C8042);
this.b8042Status &= ~(ChipSet.KBC.STATUS.OUTBUFF_FULL | ChipSet.KBC.STATUS.OUTBUFF_DELAY);
if (this.kbd) this.kbd.checkScanCode();
return b;
};
/**
* out8042InBuffData(port, bOut, addrFrom)
*
* This writes to the 8042's input buffer; using this port (ie, 0x60 instead of 0x64) designates the
* the byte as a KBC.DATA.CMD "data byte". Before clearing KBC.STATUS.CMD_FLAG, however, we see if it's set,
* and then based on the previous KBC.CMD "command byte", we do whatever needs to be done with this "data byte".
*
* @this {ChipSet}
* @param {number} port (0x60)
* @param {number} bOut
* @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
*/
ChipSet.prototype.out8042InBuffData = function(port, bOut, addrFrom)
{
this.printMessageIO(port, bOut, addrFrom, "8042_INBUF.DATA", null, Messages.C8042);
if (this.b8042Status & ChipSet.KBC.STATUS.CMD_FLAG) {
switch (this.b8042InBuff) {
case ChipSet.KBC.CMD.WRITE_CMD:
this.set8042CmdData(bOut);
break;
case ChipSet.KBC.CMD.WRITE_OUTPORT:
this.set8042OutPort(bOut);
break;
/*
* This case is reserved for command bytes that the 8042 is not expecting, which should therefore be passed on
* to the Keyboard itself.
*
* Here's some relevant MODEL_5170 ROM BIOS code, "XMIT_8042" (missing from the original MODEL_5170 ROM BIOS listing),
* which sends a command code in AL to the Keyboard and waits for a response, returning it in AL. Note that
* the only "success" exit path from this function involves LOOPing 64K times before finally reading the Keyboard's
* response; either the hardware and/or this code seems a bit brain-damaged if that's REALLY what you had to do to ensure
* a valid response....
*
* F000:1B25 86E0 XCHG AH,AL
* F000:1B27 2BC9 SUB CX,CX
* F000:1B29 E464 IN AL,64
* F000:1B2B A802 TEST AL,02 ; WAIT FOR INBUFF_FULL TO BE CLEAR
* F000:1B2D E0FA LOOPNZ 1B29
* F000:1B2F E334 JCXZ 1B65 ; EXIT WITH ERROR (CX == 0)
* F000:1B31 86E0 XCHG AH,AL
* F000:1B33 E660 OUT 60,AL ; SAFE TO WRITE KEYBOARD CMD TO INBUFF NOW
* F000:1B35 2BC9 SUB CX,CX
* F000:1B37 E464 IN AL,64
* F000:1B39 8AE0 MOV AH,AL
* F000:1B3B A801 TEST AL,01
* F000:1B3D 7402 JZ 1B41
* F000:1B3F E460 IN AL,60 ; READ PORT 0x60 IF OUTBUFF_FULL SET ("FLUSH"?)
* F000:1B41 F6C402 TEST AH,02
* F000:1B44 E0F1 LOOPNZ 1B37
* F000:1B46 751D JNZ 1B65 ; EXIT WITH ERROR (CX == 0)
* F000:1B48 B306 MOV BL,06
* F000:1B4A 2BC9 SUB CX,CX
* F000:1B4C E464 IN AL,64
* F000:1B4E A801 TEST AL,01
* F000:1B50 E1FA LOOPZ 1B4C
* F000:1B52 7508 JNZ 1B5C ; PROCEED TO EXIT NOW THAT OUTBUFF_FULL IS SET
* F000:1B54 FECB DEC BL
* F000:1B56 75F4 JNZ 1B4C
* F000:1B58 FEC3 INC BL
* F000:1B5A EB09 JMP 1B65 ; EXIT WITH ERROR (CX == 0)
* F000:1B5C 2BC9 SUB CX,CX
* F000:1B5E E2FE LOOP 1B5E ; LOOOOOOPING....
* F000:1B60 E460 IN AL,60
* F000:1B62 83E901 SUB CX,0001 ; EXIT WITH SUCCESS (CX != 0)
* F000:1B65 C3 RET
*
* But WAIT, the FUN doesn't end there. After this function returns, "KBD_RESET" waits for a Keyboard interrupt
* to occur, hoping for scan code 0xAA as the Keyboard's final response. "KBD_RESET" also returns CX to the caller,
* and the caller ("TEST.21") assumes there was no interrupt if CX is zero.
*
* MOV AL,0FDH
* OUT INTA01,AL
* MOV INTR_FLAG,0
* STI
* MOV BL,10
* SUB CX,CX
* G11: TEST [1NTR_FLAG],02H
* JNZ G12
* LOOP G11
* DEC BL
* JNZ G11
* ...
*
* However, if [INTR_FLAG] is set immediately, the above code will exit immediately, without ever decrementing CX.
* CX can be zero not only if the loop exhausted it, but also if no looping was required; the latter is not an
* error, but "TEST.21" assumes that it is.
*/
default:
this.set8042CmdData(this.b8042CmdData & ~ChipSet.KBC.DATA.CMD.NO_CLOCK);
if (this.kbd) this.set8042OutBuff(this.kbd.sendCmd(bOut));
break;
}
}
this.b8042InBuff = bOut;
this.b8042Status &= ~ChipSet.KBC.STATUS.CMD_FLAG;
};
/**
* in8042RWReg(port, addrFrom)
*
* @this {ChipSet}
* @param {number} port (0x61)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.in8042RWReg = function(port, addrFrom)
{
/*
* Normally, we return whatever was last written to this port, but we do need to mask the
* two upper-most bits (KBC.RWREG.NMI_ERROR), as those are output-only bits used to signal
* parity errors.
*
* Also, "TEST.09" of the MODEL_5170 BIOS expects the REFRESH_BIT to alternate, so we used to
* do this:
*
* this.bPPIB ^= ChipSet.KBC.RWREG.REFRESH_BIT;
*
* However, the MODEL_5170_REV3 BIOS not only checks REFRESH_BIT in "TEST.09", but includes
* an additional test right before "TEST.11A", which requires the bit change "a bit less"
* frequently. This new test sets CX to zero, and at the end of the test (@F000:05B8), CX
* must be in the narrow range of 0xF600 through 0xF9FD.
*
* In fact, the new "WAITF" function @F000:1A3A tells us exactly how frequently REFRESH_BIT
* is expected to change now. That function performs a "FIXED TIME WAIT", where CX is a
* "COUNT OF 15.085737us INTERVALS TO WAIT".
*
* So we now tie the state of the REFRESH_BIT to bit 6 of the current CPU cycle count,
* effectively toggling the bit after every 64 cycles. On an 8Mhz CPU that can do 8 cycles
* in 1us, 64 cycles represents 8us, so that might be a bit fast for "WAITF", but bit 6
* is the only choice that also satisfies the pre-"TEST.11A" test as well.
*/
var b = this.bPPIB & ~(ChipSet.KBC.RWREG.NMI_ERROR | ChipSet.KBC.RWREG.REFRESH_BIT) | ((this.cpu.getCycles() & 0x40)? ChipSet.KBC.RWREG.REFRESH_BIT : 0);
/*
* Thanks to the WAITF function, this has become a very "busy" port, so if this generates too
* many messages, try adding Messages.LOG to the criteria.
*/
this.printMessageIO(port, null, addrFrom, "8042_RWREG", b, Messages.C8042);
return b;
};
/**
* out8042RWReg(port, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} port (0x61)
* @param {number} bOut
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
*/
ChipSet.prototype.out8042RWReg = function(port, bOut, addrFrom)
{
this.printMessageIO(port, bOut, addrFrom, "8042_RWREG", null, Messages.C8042);
this.updatePPIB(bOut);
};
/**
* in8042Status(port, addrFrom)
*
* @this {ChipSet}
* @param {number} port (0x64)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.in8042Status = function(port, addrFrom)
{
this.printMessageIO(port, null, addrFrom, "8042_STATUS", this.b8042Status, Messages.C8042);
var b = this.b8042Status & 0xff;
/*
* There's code in the 5170 BIOS (F000:03BF) that writes an 8042 command (0xAA), waits for
* KBC.STATUS.INBUFF_FULL to go clear (which it always is, because we always accept commands
* immediately), then checks KBC.STATUS.OUTBUFF_FULL and performs a "flush" on port 0x60 if
* it's set, then waits for KBC.STATUS.OUTBUFF_FULL *again*. Unfortunately, the "flush" throws
* away our response if we respond immediately.
*
* So now when out8042InBuffCmd() has a response, it sets KBC.STATUS.OUTBUFF_DELAY instead
* (which is outside the 0xff range of bits we return); when we see KBC.STATUS.OUTBUFF_DELAY,
* we clear it and set KBC.STATUS.OUTBUFF_FULL, which will be returned on the next read.
*
* This provides a single poll delay, so that the aforementioned "flush" won't toss our response.
* If longer delays are needed down the road, we may need to set a delay count in the upper (hidden)
* bits of b8042Status, instead of using a single delay bit.
*/
if (this.b8042Status & ChipSet.KBC.STATUS.OUTBUFF_DELAY) {
this.b8042Status |= ChipSet.KBC.STATUS.OUTBUFF_FULL;
this.b8042Status &= ~ChipSet.KBC.STATUS.OUTBUFF_DELAY;
}
return b;
};
/**
* out8042InBuffCmd(port, bOut, addrFrom)
*
* This writes to the 8042's input buffer; using this port (ie, 0x64 instead of 0x60) designates the
* the byte as a "command byte". We immediately set KBC.STATUS.CMD_FLAG, and then see if we can act upon
* the command immediately (some commands requires us to wait for a "data byte").
*
* @this {ChipSet}
* @param {number} port (0x64)
* @param {number} bOut
* @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
*/
ChipSet.prototype.out8042InBuffCmd = function(port, bOut, addrFrom)
{
this.printMessageIO(port, bOut, addrFrom, "8042_INBUFF.CMD", null, Messages.C8042);
this.assert(!(this.b8042Status & ChipSet.KBC.STATUS.INBUFF_FULL));
this.b8042InBuff = bOut;
this.b8042Status |= ChipSet.KBC.STATUS.CMD_FLAG;
var bPulseBits = 0;
if (this.b8042InBuff >= ChipSet.KBC.CMD.PULSE_OUTPORT) {
bPulseBits = (this.b8042InBuff ^ 0xf);
/*
* Now that we have isolated the bit(s) to pulse, map all pulse commands to KBC.CMD.PULSE_OUTPORT
*/
this.b8042InBuff = ChipSet.KBC.CMD.PULSE_OUTPORT;
}
switch (this.b8042InBuff) {
case ChipSet.KBC.CMD.READ_CMD: // 0x20
this.set8042OutBuff(this.b8042CmdData);
break;
case ChipSet.KBC.CMD.WRITE_CMD: // 0x60
/*
* No further action required for this command; more data is expected via out8042InBuffData()
*/
break;
case ChipSet.KBC.CMD.DISABLE_KBD: // 0xAD
this.set8042CmdData(this.b8042CmdData | ChipSet.KBC.DATA.CMD.NO_CLOCK);
if (DEBUG) this.printMessage("keyboard disabled", Messages.KEYBOARD | Messages.PORT);
/*
* NOTE: The MODEL_5170 BIOS calls "KBD_RESET" (F000:17D2) while the keyboard interface is disabled,
* yet we must still deliver the Keyboard's CMDRES.BAT_OK response code? Seems like an odd thing for
* a "disabled interface" to do.
*/
break;
case ChipSet.KBC.CMD.ENABLE_KBD: // 0xAE
this.set8042CmdData(this.b8042CmdData & ~ChipSet.KBC.DATA.CMD.NO_CLOCK);
if (DEBUG) this.printMessage("keyboard re-enabled", Messages.KEYBOARD | Messages.PORT);
if (this.kbd) this.kbd.checkScanCode();
break;
case ChipSet.KBC.CMD.SELF_TEST: // 0xAA
if (this.kbd) this.kbd.flushScanCode();
this.set8042CmdData(this.b8042CmdData | ChipSet.KBC.DATA.CMD.NO_CLOCK);
if (DEBUG) this.printMessage("keyboard disabled on reset", Messages.KEYBOARD | Messages.PORT);
this.set8042OutBuff(ChipSet.KBC.DATA.SELF_TEST.OK);
this.set8042OutPort(ChipSet.KBC.OUTPORT.NO_RESET | ChipSet.KBC.OUTPORT.A20_ON);
break;
case ChipSet.KBC.CMD.INTF_TEST: // 0xAB
/*
* TODO: Determine all the side-effects of the Interface Test, if any.
*/
this.set8042OutBuff(ChipSet.KBC.DATA.INTF_TEST.OK);
break;
case ChipSet.KBC.CMD.READ_INPORT: // 0xC0
this.set8042OutBuff(this.b8042InPort);
break;
case ChipSet.KBC.CMD.READ_OUTPORT: // 0xD0
this.set8042OutBuff(this.b8042OutPort);
break;
case ChipSet.KBC.CMD.WRITE_OUTPORT: // 0xD1
/*
* No further action required for this command; more data is expected via out8042InBuffData()
*/
break;
case ChipSet.KBC.CMD.READ_TEST: // 0xE0
this.set8042OutBuff((this.b8042CmdData & ChipSet.KBC.DATA.CMD.NO_CLOCK)? 0 : ChipSet.KBC.TESTPORT.KBD_CLOCK);
break;
case ChipSet.KBC.CMD.PULSE_OUTPORT: // 0xF0-0xFF
if (bPulseBits & 0x1) {
/*
* Bit 0 of the 8042's output port is connected to RESET. If it's pulsed, the processor resets.
* We don't want to clear *all* CPU state (eg, cycle counts), so we call cpu.resetRegs() instead
* of cpu.reset().
*/
this.cpu.resetRegs();
}
break;
default:
if (DEBUG && this.messageEnabled(Messages.C8042)) {
this.printMessage("unrecognized 8042 command: " + str.toHexByte(this.b8042InBuff), true);
this.dbg.stopCPU();
}
break;
}
};
/**
* set8042CmdData(b)
*
* @this {ChipSet}
* @param {number} b
*/
ChipSet.prototype.set8042CmdData = function(b)
{
var bClockWasEnabled = !(this.b8042CmdData & ChipSet.KBC.DATA.CMD.NO_CLOCK);
this.b8042CmdData = b;
this.assert(ChipSet.KBC.DATA.CMD.SYS_FLAG === ChipSet.KBC.STATUS.SYS_FLAG);
this.b8042Status = (this.b8042Status & ~ChipSet.KBC.STATUS.SYS_FLAG) | (b & ChipSet.KBC.DATA.CMD.SYS_FLAG);
if (this.kbd) {
/*
* This seems to be what the doctor ordered for the MODEL_5170_REV3 BIOS @F000:0A6D, where it
* sends ChipSet.KBC.CMD.WRITE_CMD to port 0x64, followed by 0x4D to port 0x60, which clears NO_CLOCK
* and enables the keyboard. The BIOS then waits for OUTBUFF_FULL to be set, at which point it seems
* to be anticipating an 0xAA response in the output buffer.
*
* And indeed, if we call the original MODEL_5150/MODEL_5160 setEnabled() Keyboard interface here,
* and both the data and clock lines have transitioned high (ie, both parameters are true), then it
* will call resetDevice(), generating a Keyboard.CMDRES.BAT_OK response.
*
* This agrees with my understanding of what happens when the 8042 toggles the clock line high
* (ie, clears NO_CLOCK): the TechRef's "Basic Assurance Test" section says that when the Keyboard is
* powered on, it performs the BAT, and then when the clock and data lines go high, the keyboard sends
* a completion code (eg, 0xAA for success, or 0xFC or something else for failure).
*/
var bClockEnabled = !(b & ChipSet.KBC.DATA.CMD.NO_CLOCK);
this.kbd.setEnabled(!!(b & ChipSet.KBC.DATA.CMD.NO_INHIBIT), bClockEnabled);
}
};
/**
* set8042OutBuff(b, fNoDelay)
*
* The 5170 ROM BIOS assumed there would be a slight delay after certain 8042 commands, like SELF_TEST
* (0xAA), before there was an OUTBUFF response; in fact, there is BIOS code that will fail without such
* a delay. This is discussed in greater detail in in8042Status().
*
* So we default to a "single poll" delay, setting OUTBUFF_DELAY instead of OUTBUFF_FULL, unless the caller
* explicitly asks for no delay. The fNoDelay parameter was added later, so that notifyKbdData() could
* request immediate delivery of keyboard scan codes, because some operating systems (eg, Microport's 1986
* version of Unix for PC AT machines) poll the status port only once, immediately giving up if no data is
* available.
*
* TODO: Determine if we can/should invert the fNoDelay default (from false to true) and delay only in
* specific cases; perhaps only the SELF_TEST command required a delay.
*
* @this {ChipSet}
* @param {number} b
* @param {boolean} [fNoDelay]
*/
ChipSet.prototype.set8042OutBuff = function(b, fNoDelay)
{
if (b >= 0) {
this.b8042OutBuff = b;
if (fNoDelay) {
this.b8042Status |= ChipSet.KBC.STATUS.OUTBUFF_FULL;
} else {
this.b8042Status &= ~ChipSet.KBC.STATUS.OUTBUFF_FULL;
this.b8042Status |= ChipSet.KBC.STATUS.OUTBUFF_DELAY;
}
if (DEBUG && this.messageEnabled(Messages.KEYBOARD | Messages.PORT)) {
this.printMessage("set8042OutBuff(" + str.toHexByte(b) + ")", true);
}
}
};
/**
* set8042OutPort(b)
*
* @this {ChipSet}
* @param {number} b
*/
ChipSet.prototype.set8042OutPort = function(b)
{
this.b8042OutPort = b;
this.bus.setA20(!!(b & ChipSet.KBC.OUTPORT.A20_ON));
if (!(b & ChipSet.KBC.OUTPORT.NO_RESET)) {
/*
* Bit 0 of the 8042's output port is connected to RESET. Normally, it's "pulsed" with the
* KBC.CMD.PULSE_OUTPORT command, so if a RESET is detected via this command, we should try to
* determine if that's what the caller intended.
*/
if (DEBUG && this.messageEnabled(Messages.C8042)) {
this.printMessage("unexpected 8042 output port reset: " + str.toHexByte(b), true);
this.dbg.stopCPU();
}
this.cpu.resetRegs();
}
};
/**
* notifyKbdData(b)
*
* In the old days of PCjs, the Keyboard component would simply call setIRR() when it had some data for the
* keyboard controller. However, the Keyboard's sole responsibility is to emulate an actual keyboard and call
* notifyKbdData() whenever it has some data; it's not allowed to mess with IRQ lines.
*
* If there's an 8042, we check (this.b8042CmdData & ChipSet.KBC.DATA.CMD.NO_CLOCK); if NO_CLOCK is clear,
* we can raise the IRQ immediately. Well, not quite immediately....
*
* Notes regarding the MODEL_5170 (eg, /devices/pc/machine/5170/ega/1152kb/rev3/machine.xml):
*
* The "Rev3" BIOS, dated 11-Nov-1985, contains the following code in the keyboard interrupt handler at K26A:
*
* F000:3704 FA CLI
* F000:3705 B020 MOV AL,20
* F000:3707 E620 OUT 20,AL
* F000:3709 B0AE MOV AL,AE
* F000:370B E88D02 CALL SHIP_IT
* F000:370E FA CLI <-- window of opportunity
* F000:370F 07 POP ES
* F000:3710 1F POP DS
* F000:3711 5F POP DI
* F000:3712 5E POP SI
* F000:3713 5A POP DX
* F000:3714 59 POP CX
* F000:3715 5B POP BX
* F000:3716 58 POP AX
* F000:3717 5D POP BP
* F000:3718 CF IRET
*
* and SHIP_IT looks like this:
*
* F000:399B 50 PUSH AX
* F000:399C FA CLI
* F000:399D 2BC9 SUB CX,CX
* F000:399F E464 IN AL,64
* F000:39A1 A802 TEST AL,02
* F000:39A3 E0FA LOOPNZ 399F
* F000:39A5 58 POP AX
* F000:39A6 E664 OUT 64,AL
* F000:39A8 FB STI
* F000:39A9 C3 RET
*
* This code *appears* to be trying to ensure that another keyboard interrupt won't occur until after the IRET,
* but sadly, it looks to me like the CLI following the call to SHIP_IT is too late. SHIP_IT should have been
* written with PUSHF/CLI and POPF intro/outro sequences, thereby honoring the first CLI at the top of K26A and
* eliminating the need for the second CLI (@F000:370E).
*
* Of course, in "real life", this was probably never a problem, because the 8042 probably wasn't fast enough to
* generate another interrupt so soon after receiving the ChipSet.KBC.CMD.ENABLE_KBD command. In my case, I ran
* into this problem by 1) turning on "kbd" Debugger messages and 2) rapidly typing lots of keys. The Debugger
* messages bogged the machine down enough for me to hit the "window of opportunity", generating this message in
* PC-DOS 3.20:
*
* "FATAL: Internal Stack Failure, System Halted."
*
* and halting the system @0070:0923 (JMP 0923).
*
* That wasn't the only spot in the BIOS where I hit this problem; here's another "window of opportunity":
*
* F000:3975 FA CLI
* F000:3976 B020 MOV AL,20
* F000:3978 E620 OUT 20,AL
* F000:397A B0AE MOV AL,AE
* F000:397C E81C00 CALL SHIP_IT
* F000:397F B80291 MOV AX,9102 <-- window of opportunity
* F000:3982 CD15 INT 15
* F000:3984 80269600FC AND [0096],FC
* F000:3989 E982FD JMP 370E
*
* In this second, lengthier, example, I counted about 60 instructions being executed from the EOI @F000:3978 to
* the final IRET @F000:3718, most of them in the INT 0x15 handler. So, I'm going to double that count to 120
* instructions, just to be safe, and pass that along to every setIRR() call we make here.
*
* @this {ChipSet}
* @param {number} b
*/
ChipSet.prototype.notifyKbdData = function(b)
{
if (this.model < ChipSet.MODEL_5170) {
/*
* TODO: Should we be checking bPPI for PPI_B.CLK_KBD on these older machines, before calling setIRR()?
*/
this.setIRR(ChipSet.IRQ.KBD, 4);
}
else {
if (!(this.b8042CmdData & ChipSet.KBC.DATA.CMD.NO_CLOCK)) {
/*
* The next read of b8042OutBuff will clear both of these bits and call kbd.checkScanCode(),
* which will call notifyKbdData() again if there's still keyboard data to process.
*/
if (!(this.b8042Status & (ChipSet.KBC.STATUS.OUTBUFF_FULL | ChipSet.KBC.STATUS.OUTBUFF_DELAY))) {
this.set8042OutBuff(b, true);
this.kbd.shiftScanCode();
/*
* A delay of 4 instructions was originally requested as part of the the Keyboard's resetDevice()
* response, but a larger delay (120) is now needed for MODEL_5170 machines, per the discussion above.
*/
this.setIRR(ChipSet.IRQ.KBD, 120);
}
else {
if (DEBUG && this.messageEnabled(Messages.KEYBOARD | Messages.PORT)) {
this.printMessage("notifyKbdData(" + str.toHexByte(b) + "): output buffer full", true);
}
}
} else {
if (DEBUG && this.messageEnabled(Messages.KEYBOARD | Messages.PORT)) {
this.printMessage("notifyKbdData(" + str.toHexByte(b) + "): disabled", true);
}
}
}
};
/**
* inCMOSAddr(port, addrFrom)
*
* @this {ChipSet}
* @param {number} port (0x70)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inCMOSAddr = function(port, addrFrom)
{
this.printMessageIO(port, null, addrFrom, "CMOS.ADDR", this.bCMOSAddr, Messages.CMOS);
return this.bCMOSAddr;
};
/**
* outCMOSAddr(port, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} port (0x70)
* @param {number} bOut
* @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
*/
ChipSet.prototype.outCMOSAddr = function(port, bOut, addrFrom)
{
this.printMessageIO(port, bOut, addrFrom, "CMOS.ADDR", null, Messages.CMOS);
this.bCMOSAddr = bOut;
this.bNMI = (bOut & ChipSet.CMOS.ADDR.NMI_DISABLE)? ChipSet.NMI.DISABLE : ChipSet.NMI.ENABLE;
};
/**
* inCMOSData(port, addrFrom)
*
* @this {ChipSet}
* @param {number} port (0x71)
* @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
* @return {number} simulated port value
*/
ChipSet.prototype.inCMOSData = function(port, addrFrom)
{
var bAddr = this.bCMOSAddr & ChipSet.CMOS.ADDR.MASK;
var bIn = (bAddr <= ChipSet.CMOS.ADDR.STATUSD? this.getRTCByte(bAddr) : this.abCMOSData[bAddr]);
if (this.messageEnabled(Messages.CMOS | Messages.PORT)) {
this.printMessageIO(port, null, addrFrom, "CMOS.DATA[" + str.toHexByte(bAddr) + "]", bIn, true);
}
if (addrFrom != null) {
if (bAddr == ChipSet.CMOS.ADDR.STATUSC) {
/*
* When software reads the STATUSC port, all interrupt bits (PF, AF, and UF) are automatically
* cleared, which in turn clears the IRQF bit, which in turn clears the IRQ.
*/
this.abCMOSData[bAddr] &= ChipSet.CMOS.STATUSC.RESERVED;
if (bIn & ChipSet.CMOS.STATUSC.IRQF) this.clearIRR(ChipSet.IRQ.RTC);
/*
* If we just cleared PF, and PIE is still set, then we need to make sure the next Periodic Interrupt
* occurs in a timely manner, too.
*/
if ((bIn & ChipSet.CMOS.STATUSC.PF) && (this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.PIE)) {
if (DEBUG) this.printMessage("RTC periodic interrupt cleared", Messages.RTC);
this.setRTCCycleLimit();
}
}
}
return bIn;
};
/**
* outCMOSData(port, bOut, addrFrom)
*
* @this {ChipSet}
* @param {number} port (0x71)
* @param {number} bOut
* @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
*/
ChipSet.prototype.outCMOSData = function(port, bOut, addrFrom)
{
var bAddr = this.bCMOSAddr & ChipSet.CMOS.ADDR.MASK;
if (this.messageEnabled(Messages.CMOS | Messages.PORT)) {
this.printMessageIO(port, bOut, addrFrom, "CMOS.DATA[" + str.toHexByte(bAddr) + "]", null, true);
}
var bDelta = bOut ^ this.abCMOSData[bAddr];
this.abCMOSData[bAddr] = (bAddr <= ChipSet.CMOS.ADDR.STATUSD? this.setRTCByte(bAddr, bOut) : bOut);
if (bAddr == ChipSet.CMOS.ADDR.STATUSB && (bDelta & ChipSet.CMOS.STATUSB.PIE)) {
if (bOut & ChipSet.CMOS.STATUSB.PIE) {
if (DEBUG) this.printMessage("RTC periodic interrupts enabled", Messages.RTC);
this.setRTCCycleLimit();
} else {
if (DEBUG) this.printMessage("RTC periodic interrupts disabled", Messages.RTC);
}
}
};
/**
* outNMI(port, bOut, addrFrom)
*
* This handler is installed only for models before MODEL_5170.
*
* @this {ChipSet}
* @param {number} port (0xA0)
* @param {number} bOut
* @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
*/
ChipSet.prototype.outNMI = function(port, bOut, addrFrom)
{
this.printMessageIO(port, bOut, addrFrom, "NMI");
this.bNMI = bOut;
};
/**
* outCoprocClear(port, bOut, addrFrom)
*
* This handler is installed only for MODEL_5170.
*
* @this {ChipSet}
* @param {number} port (0xF0)
* @param {number} bOut (0x00 is the only expected output)
* @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
*/
ChipSet.prototype.outCoprocClear = function(port, bOut, addrFrom)
{
/*
* TODO: Implement
*/
this.printMessageIO(port, bOut, addrFrom, "COPROC.CLEAR");
this.assert(!bOut);
};
/**
* outCoprocReset(port, bOut, addrFrom)
*
* This handler is installed only for MODEL_5170.
*
* @this {ChipSet}
* @param {number} port (0xF1)
* @param {number} bOut (0x00 is the only expected output)
* @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
*/
ChipSet.prototype.outCoprocReset = function(port, bOut, addrFrom)
{
/*
* TODO: Implement
*/
this.printMessageIO(port, bOut, addrFrom, "COPROC.RESET");
this.assert(!bOut);
};
/**
* intBIOSRTC(addr)
*
* INT 0x1A Quick Reference:
*
* AH
* ----
* 0x00 Get current clock count in CX:DX
* 0x01 Set current clock count from CX:DX
* 0x02 Get real-time clock using BCD (CH=hours, CL=minutes, DH=seconds)
* 0x03 Set real-time clock using BCD (CH=hours, CL=minutes, DH=seconds, DL=1 if Daylight Savings Time option)
* 0x04 Get real-time date using BCD (CH=century, CL=year, DH=month, DL=day)
* 0x05 Set real-time date using BCD (CH=century, CL=year, DH=month, DL=day)
* 0x06 Set alarm using BCD (CH=hours, CL=minutes, DH=seconds)
* 0x07 Reset alarm
*
* @this {ChipSet}
* @param {number} addr
* @return {boolean} true to proceed with the INT 0x1A software interrupt, false to skip
*/
ChipSet.prototype.intBIOSRTC = function(addr)
{
if (DEBUGGER) {
if (this.messageEnabled(Messages.RTC) && this.dbg.messageInt(Interrupts.RTC.VECTOR, addr)) {
/*
* By computing AH now, we get the incoming AH value; if we computed it below, along with
* the rest of the register values, we'd get the outgoing AH value, which is not what we want.
*/
var AH = this.cpu.regEAX >> 8;
this.cpu.addIntReturn(addr, function(chipset, nCycles) {
return function onBIOSRTCReturn(nLevel) {
nCycles = chipset.cpu.getCycles() - nCycles;
var sResult;
var CL = chipset.cpu.regEDX & 0xff;
var CH = chipset.cpu.regEDX >> 8;
var DL = chipset.cpu.regEDX & 0xff;
var DH = chipset.cpu.regEDX >> 8;
if (AH == 0x02 || AH == 0x03) {
sResult = " CH(hour)=" + str.toHexWord(CH) + " CL(min)=" + str.toHexByte(CL) + " DH(sec)=" + str.toHexByte(DH);
} else if (AH == 0x04 || AH == 0x05) {
sResult = " CX(year)=" + str.toHexWord(chipset.cpu.regECX) + " DH(month)=" + str.toHexByte(DH) + " DL(day)=" + str.toHexByte(DL);
}
chipset.dbg.messageIntReturn(Interrupts.RTC.VECTOR, nLevel, nCycles, sResult);
};
}(this, this.cpu.getCycles()));
}
}
return true;
};
/**
* parseSwitches(s, def)
*
* @this {ChipSet}
* @param {string|undefined} s describing switch settings
* @param {number} def is a default value to use if s is undefined
* @return {number} value representing the switch settings
*/
ChipSet.prototype.parseSwitches = function(s, def)
{
if (s === undefined) return def;
/*
* NOTE: We can't simply use parseInt() with a base of 2, because the bit order is reversed, as well as the bit sense.
*/
var b = 0, bit = 0x1;
for (var i = 0; i < s.length; i++) {
if (s.charAt(i) == "0") b |= bit;
bit <<= 1;
}
return b;
};
/**
* setSpeaker(fOn)
*
* @this {ChipSet}
* @param {boolean} [fOn] true to turn speaker on, false to turn off, otherwise update as appropriate
*/
ChipSet.prototype.setSpeaker = function(fOn)
{
if (this.contextAudio) {
try {
if (fOn !== undefined) {
this.fSpeaker = fOn;
} else {
fOn = this.fSpeaker && this.cpu && this.cpu.isRunning();
}
var freq = Math.round(ChipSet.TIMER_TICKS_PER_SEC / this.getTimerInit(ChipSet.PIT0.TIMER2));
/*
* Treat frequencies outside the normal hearing range (below 20hz or above 20Khz) as a clever attempt
* to turn sound off; we have to explicitly turn the sound off in those cases, to prevent the Audio API
* from "easing" the audio to the target frequency and creating odd sound effects.
*/
if (freq < 20 || freq > 20000) fOn = false;
if (fOn) {
if (this.sourceAudio) {
this.sourceAudio['frequency']['value'] = freq;
if (this.messageEnabled(Messages.SPEAKER)) this.printMessage("speaker set to " + freq + "hz", true);
} else {
this.sourceAudio = this.contextAudio['createOscillator']();
if (this.sourceAudio) {
if (typeof this.sourceAudio['type'] == "number") {
this.sourceAudio['type'] = 1; // deprecated: 0: "sine", 1: "square", 2: "sawtooth", 3: "triangle"
} else {
this.sourceAudio['type'] = "square";
}
this.sourceAudio['connect'](this.contextAudio['destination']);
this.sourceAudio['frequency']['value'] = freq;
if ('start' in this.sourceAudio) {
this.sourceAudio['start'](0);
} else {
this.sourceAudio['noteOn'](0); // deprecated: this.sourceAudio['noteOn'](0)
}
if (this.messageEnabled(Messages.SPEAKER)) this.printMessage("speaker on at " + freq + "hz", true);
}
}
} else {
if (this.sourceAudio) {
if ('stop' in this.sourceAudio) {
this.sourceAudio['stop'](0);
} else {
this.sourceAudio['noteOff'](0); // deprecated: this.sourceAudio['noteOff'](0)
}
this.sourceAudio['disconnect'](); // QUESTION: is this automatic following a stop(), since this particular source cannot be started again?
delete this.sourceAudio; // QUESTION: ditto?
if (this.messageEnabled(Messages.SPEAKER)) this.printMessage("speaker off at " + freq + "hz", true);
}
}
} catch(e) {
this.notice("AudioContext exception: " + e.message);
this.contextAudio = null;
}
} else if (fOn) {
this.printMessage("BEEP", Messages.SPEAKER);
}
};
/**
* messageBitsDMA(iChannel)
*
* @this {ChipSet}
* @param {number} [iChannel] if the message is associated with a particular IRQ #
* @return {number}
*/
ChipSet.prototype.messageBitsDMA = function(iChannel)
{
var bitsMessage = Messages.DATA;
if (iChannel == ChipSet.DMA_FDC) {
bitsMessage |= Messages.FDC;
} else if (iChannel == ChipSet.DMA_HDC) {
bitsMessage |= Messages.HDC;
}
return bitsMessage;
};
/**
* messageBitsIRQ(nIRQ)
*
* @this {ChipSet}
* @param {number|undefined} [nIRQ] if the message is associated with a particular IRQ #
* @return {number}
*/
ChipSet.prototype.messageBitsIRQ = function(nIRQ)
{
var bitsMessage = Messages.PIC;
if (nIRQ == ChipSet.IRQ.TIMER0) { // IRQ 0
bitsMessage |= Messages.TIMER;
} else if (nIRQ == ChipSet.IRQ.KBD) { // IRQ 1
bitsMessage |= Messages.KEYBOARD;
} else if (nIRQ == ChipSet.IRQ.SLAVE) { // IRQ 2 (MODEL_5170 and up)
bitsMessage |= Messages.CHIPSET;
} else if (nIRQ == ChipSet.IRQ.COM1 || nIRQ == ChipSet.IRQ.COM2) {
bitsMessage |= Messages.SERIAL;
} else if (nIRQ == ChipSet.IRQ.XTC) { // IRQ 5 (MODEL_5160)
bitsMessage |= Messages.HDC;
} else if (nIRQ == ChipSet.IRQ.FDC) { // IRQ 6
bitsMessage |= Messages.FDC;
} else if (nIRQ == ChipSet.IRQ.RTC) { // IRQ 8 (MODEL_5170 and up)
bitsMessage |= Messages.RTC;
} else if (nIRQ == ChipSet.IRQ.ATC) { // IRQ 14 (MODEL_5170 and up)
bitsMessage |= Messages.HDC;
}
return bitsMessage;
};
/*
* Port input notification tables
*/
ChipSet.aPortInput = {
0x00: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelAddr(ChipSet.DMA0.INDEX, 0, port, addrFrom); },
0x01: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelCount(ChipSet.DMA0.INDEX, 0, port, addrFrom); },
0x02: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelAddr(ChipSet.DMA0.INDEX, 1, port, addrFrom); },
0x03: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelCount(ChipSet.DMA0.INDEX, 1, port, addrFrom); },
0x04: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelAddr(ChipSet.DMA0.INDEX, 2, port, addrFrom); },
0x05: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelCount(ChipSet.DMA0.INDEX, 2, port, addrFrom); },
0x06: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelAddr(ChipSet.DMA0.INDEX, 3, port, addrFrom); },
0x07: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelCount(ChipSet.DMA0.INDEX, 3, port, addrFrom); },
0x08: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAStatus(ChipSet.DMA0.INDEX, port, addrFrom); },
0x20: /** @this {ChipSet} */ function(port, addrFrom) { return this.inPICLo(ChipSet.PIC0.INDEX, addrFrom); },
0x21: /** @this {ChipSet} */ function(port, addrFrom) { return this.inPICHi(ChipSet.PIC0.INDEX, addrFrom); },
0x40: /** @this {ChipSet} */ function(port, addrFrom) { return this.inTimer(ChipSet.PIT0.TIMER0, port, addrFrom); },
0x41: /** @this {ChipSet} */ function(port, addrFrom) { return this.inTimer(ChipSet.PIT0.TIMER1, port, addrFrom); },
0x42: /** @this {ChipSet} */ function(port, addrFrom) { return this.inTimer(ChipSet.PIT0.TIMER2, port, addrFrom); },
0x43: ChipSet.prototype.inPIT1Ctrl,
0x81: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageReg(ChipSet.DMA0.INDEX, 2, port, addrFrom); },
0x82: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageReg(ChipSet.DMA0.INDEX, 3, port, addrFrom); },
0x83: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageReg(ChipSet.DMA0.INDEX, 1, port, addrFrom); },
0x87: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageReg(ChipSet.DMA0.INDEX, 0, port, addrFrom); }
};
ChipSet.aPortInput5150 = {
0x60: ChipSet.prototype.inPPIA,
0x61: ChipSet.prototype.inPPIB,
0x62: ChipSet.prototype.inPPIC,
0x63: ChipSet.prototype.inPPICtrl // technically, not actually readable, but I want the Debugger to be able to read this
};
ChipSet.aPortInput5170 = {
0x60: ChipSet.prototype.in8042OutBuff,
0x61: ChipSet.prototype.in8042RWReg,
0x64: ChipSet.prototype.in8042Status,
0x70: ChipSet.prototype.inCMOSAddr,
0x71: ChipSet.prototype.inCMOSData,
0x80: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageSpare(7, port, addrFrom); },
0x84: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageSpare(0, port, addrFrom); },
0x85: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageSpare(1, port, addrFrom); },
0x86: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageSpare(2, port, addrFrom); },
0x88: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageSpare(3, port, addrFrom); },
0x89: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageReg(ChipSet.DMA1.INDEX, 2, port, addrFrom); },
0x8A: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageReg(ChipSet.DMA1.INDEX, 3, port, addrFrom); },
0x8B: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageReg(ChipSet.DMA1.INDEX, 1, port, addrFrom); },
0x8C: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageSpare(4, port, addrFrom); },
0x8D: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageSpare(5, port, addrFrom); },
0x8E: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageSpare(6, port, addrFrom); },
0x8F: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageReg(ChipSet.DMA1.INDEX, 0, port, addrFrom); },
0xA0: /** @this {ChipSet} */ function(port, addrFrom) { return this.inPICLo(ChipSet.PIC1.INDEX, addrFrom); },
0xA1: /** @this {ChipSet} */ function(port, addrFrom) { return this.inPICHi(ChipSet.PIC1.INDEX, addrFrom); },
0xC0: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelAddr(ChipSet.DMA1.INDEX, 0, port, addrFrom); },
0xC2: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelCount(ChipSet.DMA1.INDEX, 0, port, addrFrom); },
0xC4: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelAddr(ChipSet.DMA1.INDEX, 1, port, addrFrom); },
0xC6: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelCount(ChipSet.DMA1.INDEX, 1, port, addrFrom); },
0xC8: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelAddr(ChipSet.DMA1.INDEX, 2, port, addrFrom); },
0xCA: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelCount(ChipSet.DMA1.INDEX, 2, port, addrFrom); },
0xCC: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelAddr(ChipSet.DMA1.INDEX, 3, port, addrFrom); },
0xCE: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelCount(ChipSet.DMA1.INDEX, 3, port, addrFrom); },
0xD0: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAStatus(ChipSet.DMA1.INDEX, port, addrFrom); }
};
/*
* Port output notification tables
*/
ChipSet.aPortOutput = {
0x00: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelAddr(ChipSet.DMA0.INDEX, 0, port, bOut, addrFrom); },
0x01: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelCount(ChipSet.DMA0.INDEX, 0, port, bOut, addrFrom); },
0x02: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelAddr(ChipSet.DMA0.INDEX, 1, port, bOut, addrFrom); },
0x03: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelCount(ChipSet.DMA0.INDEX, 1, port, bOut, addrFrom); },
0x04: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelAddr(ChipSet.DMA0.INDEX, 2, port, bOut, addrFrom); },
0x05: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelCount(ChipSet.DMA0.INDEX, 2, port, bOut, addrFrom); },
0x06: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelAddr(ChipSet.DMA0.INDEX, 3, port, bOut, addrFrom); },
0x07: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelCount(ChipSet.DMA0.INDEX, 3, port, bOut, addrFrom); },
0x08: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMACmd(ChipSet.DMA0.INDEX, port, bOut, addrFrom); },
0x09: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAReq(ChipSet.DMA0.INDEX, port, bOut, addrFrom); },
0x0A: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAMask(ChipSet.DMA0.INDEX, port, bOut, addrFrom); },
0x0B: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAMode(ChipSet.DMA0.INDEX, port, bOut, addrFrom); },
0x0C: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAResetFF(ChipSet.DMA0.INDEX, port, bOut, addrFrom); },
0x0D: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAMasterClear(ChipSet.DMA0.INDEX, port, bOut, addrFrom); },
0x20: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outPICLo(ChipSet.PIC0.INDEX, bOut, addrFrom); },
0x21: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outPICHi(ChipSet.PIC0.INDEX, bOut, addrFrom); },
0x40: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outTimer(ChipSet.PIT0.TIMER0, port, bOut, addrFrom); },
0x41: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outTimer(ChipSet.PIT0.TIMER1, port, bOut, addrFrom); },
0x42: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outTimer(ChipSet.PIT0.TIMER2, port, bOut, addrFrom); },
0x43: ChipSet.prototype.outPIT1Ctrl,
0x81: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageReg(ChipSet.DMA0.INDEX, 2, port, bOut, addrFrom); },
0x82: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageReg(ChipSet.DMA0.INDEX, 3, port, bOut, addrFrom); },
0x83: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageReg(ChipSet.DMA0.INDEX, 1, port, bOut, addrFrom); },
0x87: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageReg(ChipSet.DMA0.INDEX, 0, port, bOut, addrFrom); }
};
ChipSet.aPortOutput5150 = {
0x60: ChipSet.prototype.outPPIA,
0x61: ChipSet.prototype.outPPIB,
0x62: ChipSet.prototype.outPPIC,
0x63: ChipSet.prototype.outPPICtrl,
0xA0: ChipSet.prototype.outNMI
};
ChipSet.aPortOutput5170 = {
0x60: ChipSet.prototype.out8042InBuffData,
0x61: ChipSet.prototype.out8042RWReg,
0x64: ChipSet.prototype.out8042InBuffCmd,
0x70: ChipSet.prototype.outCMOSAddr,
0x71: ChipSet.prototype.outCMOSData,
0x80: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageSpare(7, port, bOut, addrFrom); },
0x84: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageSpare(0, port, bOut, addrFrom); },
0x85: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageSpare(1, port, bOut, addrFrom); },
0x86: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageSpare(2, port, bOut, addrFrom); },
0x88: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageSpare(3, port, bOut, addrFrom); },
0x89: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageReg(ChipSet.DMA1.INDEX, 2, port, bOut, addrFrom); },
0x8A: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageReg(ChipSet.DMA1.INDEX, 3, port, bOut, addrFrom); },
0x8B: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageReg(ChipSet.DMA1.INDEX, 1, port, bOut, addrFrom); },
0x8C: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageSpare(4, port, bOut, addrFrom); },
0x8D: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageSpare(5, port, bOut, addrFrom); },
0x8E: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageSpare(6, port, bOut, addrFrom); },
0x8F: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageReg(ChipSet.DMA1.INDEX, 0, port, bOut, addrFrom); },
0xA0: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outPICLo(ChipSet.PIC1.INDEX, bOut, addrFrom); },
0xA1: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outPICHi(ChipSet.PIC1.INDEX, bOut, addrFrom); },
0xC0: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelAddr(ChipSet.DMA1.INDEX, 0, port, bOut, addrFrom); },
0xC2: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelCount(ChipSet.DMA1.INDEX, 0, port, bOut, addrFrom); },
0xC4: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelAddr(ChipSet.DMA1.INDEX, 1, port, bOut, addrFrom); },
0xC6: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelCount(ChipSet.DMA1.INDEX, 1, port, bOut, addrFrom); },
0xC8: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelAddr(ChipSet.DMA1.INDEX, 2, port, bOut, addrFrom); },
0xCA: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelCount(ChipSet.DMA1.INDEX, 2, port, bOut, addrFrom); },
0xCC: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelAddr(ChipSet.DMA1.INDEX, 3, port, bOut, addrFrom); },
0xCE: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelCount(ChipSet.DMA1.INDEX, 3, port, bOut, addrFrom); },
0xD0: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMACmd(ChipSet.DMA1.INDEX, port, bOut, addrFrom); },
0xD2: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAReq(ChipSet.DMA1.INDEX, port, bOut, addrFrom); },
0xD4: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAMask(ChipSet.DMA1.INDEX, port, bOut, addrFrom); },
0xD6: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAMode(ChipSet.DMA1.INDEX, port, bOut, addrFrom); },
0xD8: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAResetFF(ChipSet.DMA1.INDEX, port, bOut, addrFrom); },
0xDA: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAMasterClear(ChipSet.DMA1.INDEX, port, bOut, addrFrom); },
0xF0: ChipSet.prototype.outCoprocClear,
0xF1: ChipSet.prototype.outCoprocReset
};
/**
* ChipSet.init()
*
* This function operates on every HTML element of class "chipset", extracting the
* JSON-encoded parameters for the ChipSet constructor from the element's "data-value"
* attribute, invoking the constructor to create a ChipSet component, and then binding
* any associated HTML controls to the new component.
*/
ChipSet.init = function()
{
var aeChipSet = Component.getElementsByClass(window.document, PCJSCLASS, "chipset");
for (var iChip = 0; iChip < aeChipSet.length; iChip++) {
var eChipSet = aeChipSet[iChip];
var parmsChipSet = Component.getComponentParms(eChipSet);
var chipset = new ChipSet(parmsChipSet);
Component.bindComponentControls(chipset, eChipSet, PCJSCLASS);
chipset.updateSwitchDesc();
}
};
/*
* Initialize every ChipSet module on the page.
*/
web.onInit(ChipSet.init);
if (typeof module !== 'undefined') module.exports = ChipSet;
/**
* @fileoverview Implements the PCjs Computer component.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-Jun-15
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
/*
* BUILD INSTRUCTIONS
*
* To build PCjs (pc.js), run Google's Closure Compiler, replacing "*.js" with
* the input file sequence defined by the "pcJSFiles" property in package.json:
*
* java -jar compiler.jar
* --compilation_level ADVANCED_OPTIMIZATIONS
* --define='DEBUG=false'
* --warning_level=VERBOSE
* --js *.js
* --js_output_file pc.js
*
* Google's Closure Compiler (compiler.jar) is documented at
* https://developers.google.com/closure/compiler/ and is available
* for download here:
*
* http://closure-compiler.googlecode.com/files/compiler-latest.zip
*
* The PCjs JavaScript files do have some initialization-order dependencies.
* If you load the files individually, it's recommended that you load them in
* the same order that they're compiled.
*
* Generally speaking, component.js should be first, computer.js should be
* last (of the files based on component.js), and panel.js should be listed
* early so that the Control Panel is ready as soon as possible.
*
* Another recent ordering requirement is that rom.js must be loaded before
* ram.js; this was true before, but now it's required, because I'm starting
* to add ROM BIOS Data Area definitions to rom.js, and since the data area
* is in RAM, ram.js may want access to some of those definitions.
*/
"use strict";
if (typeof module !== 'undefined') {
var str = require("../../shared/lib/strlib");
var usr = require("../../shared/lib/usrlib");
var web = require("../../shared/lib/weblib");
var UserAPI = require("../../shared/lib/userapi");
var ReportAPI = require("../../shared/lib/reportapi");
var Component = require("../../shared/lib/component");
var Messages = require("./messages");
var Bus = require("./bus");
var State = require("./state");
}
/**
* Computer(parmsComputer, parmsMachine, fSuspended)
*
* @constructor
* @extends Component
* @param {Object} parmsComputer
* @param {Object} [parmsMachine]
* @param {boolean} [fSuspended]
*
* The Computer component has no required (parmsComputer) properties, but does
* support the following:
*
* busWidth: number of memory address lines (address bits) on the computer's "bus";
* 20 is the minimum (and the default), which implies 8086/8088 real-mode addressing,
* while 24 is required for 80286 protected-mode addressing. This value is passed
* directly through to the Bus component; see that component for more details.
*
* resume: one of the Computer.RESUME constants, which are as follows:
* '0' if resume disabled (default)
* '1' if enabled without prompting
* '2' if enabled with prompting
* '3' if enabled with prompting and auto-delete
* or a string containing the path of a predefined JSON-encoded state
*
* state: the path to JSON-encoded state file (see details regarding 'state' below)
*
* If a predefined state is supplied AND it's successfully loaded, then resume behavior
* defaults to '1' (ie, resume enabled without prompting).
*
* This component insures that all components are ready before "powering" them.
*
* Different components become ready at different times, and initialization order (ie,
* the order the scripts are combined on the page) only partially determines readiness.
* This is because components like ROM and Video must finish loading their resource files
* before they are ready. Other components become ready after we call their initBus()
* function, because they have a Bus or CPU dependency, such as access to memory management
* functions. And other components, like CPU and Panel, are ready as soon as their
* constructor finishes.
*
* Once a component has indicated it's ready, we call its powerUp() notification
* function (if it has one--it's optional). We call the CPU's powerUp() function last,
* so that the CPU is assured that all other components are ready and "powered".
*/
function Computer(parmsComputer, parmsMachine, fSuspended) {
Component.call(this, "Computer", parmsComputer, Computer, Messages.COMPUTER);
this.aFlags.fPowered = false;
/*
* TODO: Deprecate 'buswidth' (it should have always used camelCase)
*/
this.nBusWidth = parmsComputer['busWidth'] || parmsComputer['buswidth'];
this.resume = Computer.RESUME_NONE;
this.sStateData = null;
this.fServerState = false;
this.url = parmsMachine? parmsMachine['url'] : null;
/*
* Generate a random number x (where 0 <= x < 1), add 0.1 so that it's guaranteed to be
* non-zero, convert to base 36, and chop off the leading digit and "decimal" point.
*/
this.sMachineID = (Math.random() + 0.1).toString(36).substr(2,12);
this.sUserID = this.queryUserID();
/*
* Find the appropriate CPU (and Debugger and Control Panel, if any)
*
* CLOSURE COMPILER TIP: To override the type of a right-hand expression (as we need to do here,
* where we know getComponentByType() will only return an X86CPU object or null), wrap the expression
* in parentheses. I never knew this until I stumbled across it in "Closure: The Definitive Guide".
*/
this.cpu = /** @type {X86CPU} */ (Component.getComponentByType("CPU", this.id));
if (!this.cpu) {
Component.error("Unable to find CPU component");
return;
}
this.dbg = /** @type {Debugger} */ (Component.getComponentByType("Debugger", this.id));
/*
* Initialize the Bus component
*/
this.bus = new Bus({'id': this.idMachine + '.bus', 'buswidth': this.nBusWidth}, this.cpu, this.dbg);
/*
* Iterate through all the components and connect them to the Control Panel, if any
*/
var iComponent, component;
var aComponents = Component.getComponents(this.id);
this.panel = Component.getComponentByType("Panel", this.id);
if (this.panel && this.panel.controlPrint) {
for (iComponent = 0; iComponent < aComponents.length; iComponent++) {
component = aComponents[iComponent];
/*
* I can think of many "cleaner" ways for the Control Panel component to pass its
* notice(), println(), etc, overrides on to all the other components, but it's just
* too darn convenient to slam those overrides into the components directly.
*/
component.notice = this.panel.notice;
component.println = this.panel.println;
component.controlPrint = this.panel.controlPrint;
}
}
if (DEBUG && this.messageEnabled()) this.printMessage("PREFETCH: " + PREFETCH + ", TYPEDARRAYS: " + TYPEDARRAYS);
/*
* Iterate through all the components again and call their initBus() handler, if any
*/
for (iComponent = 0; iComponent < aComponents.length; iComponent++) {
component = aComponents[iComponent];
if (component.initBus) component.initBus(this, this.bus, this.cpu, this.dbg);
}
var sStatePath = null;
var sResume = parmsComputer['resume'];
if (sResume !== undefined) {
/*
* DEPRECATE: This goofiness is a holdover from when the 'resume' property was a string (either a
* single-digit string or a path); now it's always a number, so it never has a 'length' property and
* the call to parseInt() is unnecessary.
*/
if (sResume.length > 1) {
sStatePath = this.sResumePath = sResume;
} else {
this.resume = parseInt(sResume, 10);
}
}
/*
* The Computer 'state' property allows a state file to be specified independent of the 'resume' feature;
* previously, you could only use 'resume' to load a state file -- which we still support, but loading a state
* file that way prevents the machine's state from being saved, since we always resume from the 'resume' file.
*
* The other wrinkle is on the restore side: we need to IGNORE the 'state' property if a saved state now exists.
* So we have to peek at localStorage, and unfortunately, the only way to "peek" is to actually load the data,
* but we're not ready to use it yet, so powerUp() has been changed to use any existing stateComputer that we've
* already loaded.
*
* However, there's now a wrinkle to the wrinkle: if a 'state' parameter has been passed via the URL, then that
* OVERRIDES everything; it overrides any 'state' Computer parameter AND it disables resume of any saved state in
* localStorage (in other words, it prevents fAllowResume from being true, and forcing resume off).
*/
var fAllowResume;
var sState = Component.parmsURL && Component.parmsURL['state'] || (fAllowResume = true) && parmsComputer['state'];
if (sState) {
sStatePath = this.sStatePath = sState;
if (!fAllowResume) {
this.fServerState = true;
this.resume = Computer.RESUME_NONE;
}
if (this.resume) {
this.stateComputer = new State(this, Computer.sAppVer);
if (this.stateComputer.load()) {
sStatePath = null;
} else {
delete this.stateComputer;
}
}
}
/*
* If sStatePath is set, we must use it. But if there's no sStatePath AND resume is set,
* then we have the option of resuming from a server-side state, assuming a valid USERID.
*/
if (!sStatePath && this.resume) {
sStatePath = this.getServerStatePath();
if (sStatePath) this.fServerState = true;
}
if (!sStatePath) {
this.setReady();
} else {
web.loadResource(sStatePath, true, null, this, this.onLoadSetReady);
}
if (!fSuspended) {
/*
* Power "up" the computer, giving every component the opportunity to reset or restore itself.
*/
this.wait(this.powerOn);
}
}
Component.subclass(Computer);
/*
* NOTE: 1.01 is the first version to provide limited save/restore support using localStorage.
* From this point on, care must be taken to insure that any new version that's incompatible with
* previous localStorage data be released with a version number that is at least 1 greater,
* since we're tagging the localStorage data with the integer portion of the version string.
*/
Computer.sAppName = APPNAME || "PCjs";
Computer.sAppVer = APPVERSION;
Computer.sCopyright = "Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>";
/*
* I think it's a good idea to also display a GPL notice, putting people on notice that even
* the "compiled" source code has all the same GPL requirements as the uncompiled source code.
*/
Computer.LICENSE = "License: GPL version 3 or later <http://gnu.org/licenses/gpl.html>";
Computer.STATE_FAILSAFE = "failsafe";
Computer.STATE_VALIDATE = "validate";
Computer.STATE_TIMESTAMP = "timestamp";
Computer.STATE_VERSION = "version";
Computer.STATE_HOSTURL = "url";
Computer.STATE_BROWSER = "browser";
Computer.STATE_USERID = "user";
/*
* The following constants define all the resume options. Negative values (eg, RESUME_REPOWER) are for
* internal use only, and RESUME_DELETE is not documented (it provides a way of deleting ALL saved states
* whenever a resume is declined). As a result, the only "end-user" values are 0, 1 and 2.
*/
Computer.RESUME_REPOWER = -1; // resume without changing any state (for internal use only)
Computer.RESUME_NONE = 0; // default (no resume)
Computer.RESUME_AUTO = 1; // automatically save/restore state
Computer.RESUME_PROMPT = 2; // automatically save but conditionally restore (WARNING: if restore is declined, any state is discarded)
Computer.RESUME_DELETE = 3; // same as RESUME_PROMPT but discards ALL machines states whenever ANY machine restore is declined (undocumented)
/**
* getMachineID()
*
* @return {string}
*/
Computer.prototype.getMachineID = function()
{
return this.sMachineID;
};
/**
* getUserID()
*
* @return {string}
*/
Computer.prototype.getUserID = function()
{
return this.sUserID? this.sUserID : "";
};
/**
* onLoadSetReady(sStateFile, sStateData, nErrorCode)
*
* @this {Computer}
* @param {string} sStateFile
* @param {string} sStateData
* @param {number} nErrorCode
*/
Computer.prototype.onLoadSetReady = function(sStateFile, sStateData, nErrorCode)
{
if (!nErrorCode) {
this.sStateData = sStateData;
if (DEBUG && this.messageEnabled()) {
this.printMessage("loaded state file " + sStateFile.replace(this.sUserID || "xxx", "xxx"));
}
} else {
this.sResumePath = null;
this.fServerState = false;
this.notice('Unable to load machine state from server (error ' + nErrorCode + (sStateData? ': ' + str.trim(sStateData) : '') + ')');
}
this.setReady();
};
/**
* wait(fn, parms)
*
* wait() waits until every component is ready (including ourselves, the last component we check),
* then calls the specified Computer method.
*
* TODO: As with web.loadResource(), the Closure Compiler makes it difficult for us to define
* a function type for "fn" that works in all cases; sometimes we want to pass a function that takes
* only a "number", and other times we want to pass a function that takes only an "Array" (the type
* will mirror that of the "parms" parameter). However, the Closure Compiler insists that both functions
* must be declared as accepting both types of parameters. So once again, we must use an untyped function
* declaration, instead of something stricter like:
*
* param {function(this:Computer, (number|Array|undefined)): undefined} fn
*
* @this {Computer}
* @param {function(...)} fn
* @param {number|Array} [parms] optional parameters
*/
Computer.prototype.wait = function(fn, parms)
{
var computer = this;
var aComponents = Component.getComponents(this.id);
for (var iComponent = 0; iComponent <= aComponents.length; iComponent++) {
var component = (iComponent < aComponents.length ? aComponents[iComponent] : this);
if (!component.isReady()) {
component.isReady(function onComponentReady() {
computer.wait(fn, parms);
});
return;
}
}
if (DEBUG && this.messageEnabled()) this.printMessage("Computer.wait(ready)");
fn.call(this, parms);
};
/**
* validateState(stateComputer)
*
* NOTE: We clear() stateValidate only when there's no stateComputer.
*
* @this {Computer}
* @param {State|null} [stateComputer]
* @return {boolean} true if state passes validation, false if not
*/
Computer.prototype.validateState = function(stateComputer)
{
var fValid = true;
var stateValidate = new State(this, Computer.sAppVer, Computer.STATE_VALIDATE);
if (stateValidate.load() && stateValidate.parse()) {
var sTimestampValidate = stateValidate.get(Computer.STATE_TIMESTAMP);
var sTimestampComputer = stateComputer ? stateComputer.get(Computer.STATE_TIMESTAMP) : "unknown";
if (sTimestampValidate != sTimestampComputer) {
this.notice("Machine state may be out-of-date\n(" + sTimestampValidate + " vs. " + sTimestampComputer + ")\nCheck your browser's local storage limits");
fValid = false;
if (!stateComputer) stateValidate.clear();
} else {
if (DEBUG && this.messageEnabled()) {
this.printMessage("Last state: " + sTimestampComputer + " (validate: " + sTimestampValidate + ")");
}
}
}
return fValid;
};
/**
* powerOn(resume)
*
* Power every component "up", applying any previously available state information.
*
* @this {Computer}
* @param {number} [resume] is a valid RESUME value; default is this.resume
*/
Computer.prototype.powerOn = function(resume)
{
if (resume === undefined) {
resume = this.resume || (this.sStateData? Computer.RESUME_AUTO : Computer.RESUME_NONE);
}
if (DEBUG && this.messageEnabled()) {
this.printMessage("Computer.powerOn(" + (resume == Computer.RESUME_REPOWER ? "repower" : (resume ? "resume" : "")) + ")");
}
var fRepower = false;
var fRestore = false;
this.fRestoreError = false;
var stateComputer = this.stateComputer || new State(this, Computer.sAppVer);
if (resume == Computer.RESUME_REPOWER) {
fRepower = true;
}
else if (resume > Computer.RESUME_NONE) {
if (stateComputer.load(this.sStateData)) {
/*
* Since we're resuming something (either a predefined state or a state from localStorage), let's
* create a "failsafe" checkpoint in localStorage, and destroy it at the end of a successful powerOn().
* Which means, of course, that if a previous "failsafe" checkpoint already exists, something bad
* may have happened the last time around.
*/
this.stateFailSafe = new State(this, Computer.sAppVer, Computer.STATE_FAILSAFE);
if (this.stateFailSafe.load()) {
this.powerReport(stateComputer);
/*
* We already know resume is something other than RESUME_NONE, so we'll go ahead and bump it
* all the way to RESUME_PROMPT, so that the user will be prompted, and if the user declines to
* restore, the state will be removed.
*/
resume = Computer.RESUME_PROMPT;
/*
* To ensure that the set() below succeeds, we need to call unload(), otherwise it may fail
* with a "read only" error (eg, "TypeError: Cannot assign to read only property 'timestamp'").
*/
this.stateFailSafe.unload();
}
this.stateFailSafe.set(Computer.STATE_TIMESTAMP, usr.getTimestamp());
this.stateFailSafe.store();
var fValidate = this.resume && !this.fServerState;
if (resume == Computer.RESUME_AUTO || web.confirmUser("Click OK to restore the previous " + Computer.sAppName + " machine state, or CANCEL to reset the machine.")) {
fRestore = stateComputer.parse();
if (fRestore) {
var sCode = stateComputer.get(UserAPI.RES.CODE);
var sData = stateComputer.get(UserAPI.RES.DATA);
if (sCode) {
if (sCode == UserAPI.CODE.OK) {
stateComputer.load(sData);
} else {
/*
* A missing (or not yet created) state file is no cause for alarm, but other errors might be
*/
if (sCode == UserAPI.CODE.FAIL && sData != UserAPI.FAIL.NOSTATE) {
this.notice("Error: " + sData);
if (sData == UserAPI.FAIL.VERIFY) this.resetUserID();
} else {
this.println(sCode + ": " + sData);
}
/*
* Try falling back to the state that we should have saved in localStorage, as a backup to the
* server-side state.
*/
stateComputer.unload(); // discard the invalid server-side state first
if (stateComputer.load()) {
fRestore = stateComputer.parse();
fValidate = true;
} else {
fRestore = false; // hmmm, there was nothing in localStorage either
}
}
}
}
/*
* If the load/parse was successful, and it was from localStorage (not sStateData),
* then we should to try verify that localStorage snapshot is current. One reason it may
* NOT be current is if localStorage was full and we got a quota error during the last
* powerOff().
*/
if (fValidate) this.validateState(fRestore? stateComputer : null);
} else {
/*
* RESUME_PROMPT indicates we should delete the state if they clicked Cancel to confirm() above.
*/
if (resume == Computer.RESUME_PROMPT) stateComputer.clear();
}
} else {
/*
* If there's no state, then there should also be no validation timestamp; if there is, then once again,
* we're probably dealing with a quota error.
*/
this.validateState();
}
delete this.sStateData;
delete this.stateComputer;
}
/*
* Start powering all components, including any data they may need to restore their state;
* we restore power to the CPU last.
*/
var aComponents = Component.getComponents(this.id);
for (var iComponent = 0; iComponent < aComponents.length; iComponent++) {
var component = aComponents[iComponent];
if (component !== this && component != this.cpu) {
fRestore = this.powerRestore(component, stateComputer, fRepower, fRestore);
}
}
/*
* Assuming this is not a repower, we must perform another wait, because some components may
* have marked themselves as "not ready" again (eg, the FDC component, if the restore forced it
* to mount one or more additional disk images).
*/
var aParms = [stateComputer, resume, fRestore];
if (resume != Computer.RESUME_REPOWER) {
this.wait(this.donePowerOn, aParms);
return;
}
this.donePowerOn(aParms);
};
/**
* powerRestore(component, stateComputer, fRepower, fRestore)
*
* @this {Computer}
* @param {Component} component
* @param {State} stateComputer
* @param {boolean} fRepower
* @param {boolean} fRestore
* @return {boolean} true if restore should continue, false if not
*/
Computer.prototype.powerRestore = function(component, stateComputer, fRepower, fRestore)
{
if (!component.aFlags.fPowered) {
component.aFlags.fPowered = true;
if (component.powerUp) {
var data = null;
if (fRestore) {
data = stateComputer.get(component.id);
if (!data) {
/*
* This is a hack that makes it possible for a machine whose ID has been
* supplemented with a suffix (a single letter or digit) to find object IDs
* in states created from a machine without the suffix.
*
* For example, if a state file was created from a machine with ID "ibm5160"
* but the current machine is "ibm5160a", this attempts a second lookup with
* "ibm5160", enabling us to find objects that match the original machine ID
* (eg, "ibm5160.romEGA").
*/
data = stateComputer.get(component.id.replace(/[a-z0-9]\./i, '.'));
}
}
/*
* State.get() will return whatever was originally passed to State.set() (eg, an
* Object or a string), but components are supposed to store only Objects, so if a
* string comes back, something went wrong. By explicitly eliminating "string" data,
* the Closure Compiler stops complaining that we might be passing strings to our
* powerUp() functions (even though we know we're not).
*
* TODO: Determine if there's some way to coerce the Closure Compiler into treating
* data as Object or null, without having to include this runtime check. An assert
* would be a good idea, but this is overkill.
*/
if (typeof data === "string") data = null;
/*
* If computer is null, this is simply a repower notification, which most components
* don't do anything with. Exceptions include: CPU (since it may be halted) and Video
* (since its screen may be "turned off").
*/
if (!component.powerUp(data, fRepower) && data) {
Component.error("Unable to restore state for " + component.type);
/*
* If this is a resume error for a machine that also has a predefined state
* AND we're not restoring from that state, then throw away the current state,
* prevent any new state from being created, and then force a reload, which will
* hopefully restore us to the functioning predefined state.
*
* TODO: Considering doing this in ALL cases, not just in situations where a
* 'state' exists but we're not actually resuming from it.
*/
if (this.sStatePath && !this.sStateData) {
stateComputer.clear();
this.resume = Computer.RESUME_NONE;
web.reloadPage();
} else {
/*
* In all other cases, we set fRestoreError, which should trigger a call to
* powerReport() and then delete the offending state.
*/
this.fRestoreError = true;
}
/*
* Any failure triggers an automatic to call powerUp() again, without any state,
* in the hopes that the component can recover by performing a reset.
*/
component.powerUp(null);
/*
* We also disable the rest of the restore operation, because it's not clear
* the remaining state information can be trusted; the machine is already in an
* inconsistent state, so we're not likely to make things worse, and the only
* alternative (starting over and performing a state-less reset) isn't likely to make
* the user any happier. But, we'll see... we need some experience with the code.
*/
fRestore = false;
}
}
if (!fRepower && component.comment) {
var asComments = component.comment.split("|");
for (var i = 0; i < asComments.length; i++) {
component.status(asComments[i]);
}
}
}
return fRestore;
};
/**
* donePowerOn(aParms)
*
* This is nothing more than a continuation of powerOn(), giving us the option of calling wait() one more time.
*
* @this {Computer}
* @param {Array} aParms containing [stateComputer, resume, fRestore]
*/
Computer.prototype.donePowerOn = function(aParms)
{
var stateComputer = aParms[0];
var fRepower = (aParms[1] < 0);
var fRestore = aParms[2];
if (DEBUG && this.aFlags.fPowered && this.messageEnabled()) {
this.printMessage("Computer.donePowerOn(): redundant");
}
this.aFlags.fPowered = true;
if (!this.fInitialized) {
this.println(Computer.sAppName + " v" + Computer.sAppVer + "\n" + Computer.sCopyright + "\n" + Computer.LICENSE);
this.fInitialized = true;
}
/*
* Once we get to this point, we're guaranteed that all components are ready, so it's safe to power the CPU;
* the CPU should begin executing immediately, unless a debugger is attached.
*/
if (this.cpu) {
/*
* TODO: Do we not care about the return value here? (ie, is checking fRestoreError sufficient)?
*/
this.powerRestore(this.cpu, stateComputer, fRepower, fRestore);
this.cpu.autoStart();
}
/*
* If the state was bad, offer to report it and then delete it. Deleting may be moot, since invariably a new
* state will be created on powerOff() before the next powerOn(), but it seems like good paranoia all the same.
*/
if (this.fRestoreError) {
this.powerReport(stateComputer);
stateComputer.clear();
}
if (!fRepower && this.stateFailSafe) {
this.stateFailSafe.clear();
delete this.stateFailSafe;
}
};
/**
* checkPower()
*
* @this {Computer}
* @return {boolean} true if the computer is fully powered, false otherwise
*/
Computer.prototype.checkPower = function()
{
if (this.aFlags.fPowered) return true;
var component = null, iComponent;
var aComponents = Component.getComponents(this.id);
for (iComponent = 0; iComponent < aComponents.length; iComponent++) {
component = aComponents[iComponent];
if (component !== this && !component.aFlags.fReady) break;
}
if (iComponent == aComponents.length) {
for (iComponent = 0; iComponent < aComponents.length; iComponent++) {
component = aComponents[iComponent];
if (component !== this && !component.aFlags.fPowered) break;
}
}
if (iComponent == aComponents.length) component = this;
var s = "The " + component.type + " component (" + component.id + ") is not " + (!component.aFlags.fReady? "ready yet" + (component.fnReady? " (waiting for notification)" : "") : "powered yet") + ".";
web.alertUser(s);
return false;
};
/**
* powerReport(stateComputer)
*
* @this {Computer}
* @param {State} stateComputer
*/
Computer.prototype.powerReport = function(stateComputer)
{
if (web.confirmUser("There may be a problem with your " + Computer.sAppName + " machine.\n\nTo help us diagnose it, click OK to send this " + Computer.sAppName + " machine state to http://" + SITEHOST + ".")) {
web.sendReport(Computer.sAppName, Computer.sAppVer, this.url, this.getUserID(), ReportAPI.TYPE.BUG, stateComputer.toString());
}
};
/**
* powerOff(fSave, fShutdown)
*
* Power every component "down" and optionally save the machine state.
*
* There's one scenario that powerOff() isn't currently able to deal with very effectively: what to do when
* the user switches away while it's still being restored, causing Disk loadResource() calls to fail. The
* Disk component calls notify() when that happens -- see Disk.mount() -- but the FDC and HDC controllers don't
* notify *us* of those problems, so Computer assumes that the restore was completely successful, when in fact
* it was only partially successful.
*
* Then we immediately arrive here to perform a save, following that incomplete restore. It would be wrong to
* deal with that incomplete restore by setting fRestoreError, because we don't want to trigger a powerReport()
* and the deletion of the previous state, because the state itself was presumably OK. Unfortunately, the new
* state we now save will no longer include manually mounted disk images whose remounts were interrupted, so future
* restores won't remount them either.
*
* We could perhaps solve this by having the Disk component notify us in those situations, set a new flag
* (fRestoreIncomplete?), and set fSave to false if that's ever set. Be careful though: when fSave is false,
* that means MORE than not saving; it also means deleting any previous state, which is NOT what you'd want to
* do in a "fRestoreIncomplete" situation. Also, we have to worry about Disk operations that fail for other reasons,
* making sure those failures don't interfere with the save process in the same way.
*
* As it stands, the worst that happens is any manually mounted disk images might have to be manually remounted,
* which doesn't seem like a huge problem.
*
* @this {Computer}
* @param {boolean} fSave
* @param {boolean} [fShutdown] is true if the machine is being shut down
* @return {string|null} string representing the captured state (or null if error)
*/
Computer.prototype.powerOff = function(fSave, fShutdown)
{
var data;
var sState = "none";
if (DEBUG && this.messageEnabled()) {
this.printMessage("Computer.powerOff(" + (fSave ? "save" : "nosave") + (fShutdown ? ",shutdown" : "") + ")");
}
var stateComputer = new State(this, Computer.sAppVer);
var stateValidate = new State(this, Computer.sAppVer, Computer.STATE_VALIDATE);
var sTimestamp = usr.getTimestamp();
stateValidate.set(Computer.STATE_TIMESTAMP, sTimestamp);
stateComputer.set(Computer.STATE_TIMESTAMP, sTimestamp);
stateComputer.set(Computer.STATE_VERSION, APPVERSION);
stateComputer.set(Computer.STATE_HOSTURL, web.getHostURL());
stateComputer.set(Computer.STATE_BROWSER, web.getUserAgent());
/*
* Always power the CPU "down" first, just to insure it doesn't ask other
* components to do anything after they're no longer ready.
*/
if (this.cpu && this.cpu.powerDown) {
if (fShutdown) this.cpu.stopCPU();
data = this.cpu.powerDown(fSave, fShutdown);
if (typeof data === "object") stateComputer.set(this.cpu.id, data);
if (fShutdown) {
this.cpu.aFlags.fPowered = false;
if (data === false) sState = null;
}
}
var aComponents = Component.getComponents(this.id);
for (var iComponent = 0; iComponent < aComponents.length; iComponent++) {
var component = aComponents[iComponent];
if (component.aFlags.fPowered) {
if (component.powerDown) {
data = component.powerDown(fSave, fShutdown);
if (typeof data === "object") stateComputer.set(component.id, data);
}
if (fShutdown) {
component.aFlags.fPowered = false;
if (data === false) sState = null;
}
}
}
if (sState) {
if (fShutdown) {
var fClear = false;
var fClearAll = false;
if (fSave) {
if (this.sUserID) {
this.saveServerState(this.sUserID, stateComputer.toString());
}
if (!stateValidate.store() || !stateComputer.store()) {
sState = null;
/*
* New behavior as of v1.13.2: if it appears that localStorage is full, we blow it ALL away.
* Dedicated server-side storage is the only way we'll ever be able to reliably preserve a
* particular machine's state. Historically, attempting to limp along with whatever localStorage
* is left just generates the same useless and annoying warnings over and over.
*/
fClear = fClearAll = true;
}
}
else {
/*
* I used to ALWAYS clear (ie, delete) any associated computer state, but now I do this only if the
* current machine is "resumable", because there are situations where I have two configurations
* for the same machine -- one resumable and one not -- and I don't want the latter throwing away the
* state of the former.
*
* So this code is here now strictly for callers to delete the state of a "resumable" machine, not as
* some paranoid clean-up operation.
*
* An undocumented feature of this operation is that if your configuration uses the special 'resume="3"'
* value, and you click the "Reset" button, and then you click OK to reset the everything, this will
* actually reset EVERYTHING (ie, all localStorage for ALL configs will be reclaimed).
*/
if (this.resume) {
fClear = true;
fClearAll = (this.resume == Computer.RESUME_DELETE);
}
}
if (fClear) {
stateComputer.clear(fClearAll);
}
} else {
sState = stateComputer.toString();
}
}
if (fShutdown) this.aFlags.fPowered = false;
return sState;
};
/**
* reset()
*
* Notify all (other) components with a reset() method that the Computer is being reset.
*
* NOTE: We'd like to reset the Bus first (due to the importance of the A20 line), but since we
* allocated the Bus object ourselves, after all the other components were allocated, it ends
* up near the end of Component's list of components. Hence the special case for this.bus below.
*
* @this {Computer}
*/
Computer.prototype.reset = function()
{
if (this.bus && this.bus.reset) {
/*
* TODO: Why does WebStorm think that this.bus.type is undefined? The base class (Component)
* constructor defines it.
*/
this.printMessage("Resetting " + this.bus.type);
this.bus.reset();
}
var aComponents = Component.getComponents(this.id);
for (var iComponent = 0; iComponent < aComponents.length; iComponent++) {
var component = aComponents[iComponent];
if (component !== this && component !== this.bus && component.reset) {
this.printMessage("Resetting " + component.type);
component.reset();
}
}
};
/**
* start(ms, nCycles)
*
* Notify all (other) components with a start() method that the CPU has started.
*
* Note that we're called by runCPU(), which is why we exclude the CPU component,
* as well as ourselves.
*
* @this {Computer}
* @param {number} ms
* @param {number} nCycles
*/
Computer.prototype.start = function(ms, nCycles)
{
var aComponents = Component.getComponents(this.id);
for (var iComponent = 0; iComponent < aComponents.length; iComponent++) {
var component = aComponents[iComponent];
if (component.type == "CPU" || component === this) continue;
if (component.start) {
component.start(ms, nCycles);
}
}
};
/**
* stop(ms, nCycles)
*
* Notify all (other) components with a stop() method that the CPU has stopped.
*
* Note that we're called by runCPU(), which is why we exclude the CPU component,
* as well as ourselves.
*
* @this {Computer}
* @param {number} ms
* @param {number} nCycles
*/
Computer.prototype.stop = function(ms, nCycles)
{
var aComponents = Component.getComponents(this.id);
for (var iComponent = 0; iComponent < aComponents.length; iComponent++) {
var component = aComponents[iComponent];
if (component.type == "CPU" || component === this) continue;
if (component.stop) {
component.stop(ms, nCycles);
}
}
};
/**
* setBinding(sHTMLType, sBinding, control)
*
* @this {Computer}
* @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
* @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "reset")
* @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
* @return {boolean} true if binding was successful, false if unrecognized binding request
*/
Computer.prototype.setBinding = function(sHTMLType, sBinding, control)
{
var computer = this;
switch (sBinding) {
case "save":
this.bindings[sBinding] = control;
control.onclick = function onClickSave() {
var sUserID = computer.queryUserID(true);
if (sUserID) {
var fSave = !!(computer.resume && !computer.sResumePath);
var sState = computer.powerOff(fSave);
if (fSave) {
computer.saveServerState(sUserID, sState);
} else {
computer.notice("Resume disabled, machine state not saved");
}
}
};
return true;
case "reset":
this.bindings[sBinding] = control;
control.onclick = function onClickReset() {
computer.onReset();
};
return true;
default:
break;
}
return false;
};
/**
* resetUserID()
*/
Computer.prototype.resetUserID = function()
{
web.setLocalStorageItem(Computer.STATE_USERID, "");
this.sUserID = null;
};
/**
* queryUserID(fPrompt)
*
* @param {boolean} [fPrompt]
* @returns {string|null|undefined}
*/
Computer.prototype.queryUserID = function(fPrompt)
{
var sUserID = this.sUserID;
if (!sUserID) {
sUserID = web.getLocalStorageItem(Computer.STATE_USERID);
if (sUserID !== undefined) {
if (!sUserID && fPrompt) {
sUserID = web.promptUser("To save machine states on the pcjs.org server, you need a user ID (email support@pcjs.org).\n\nOnce you have an ID, enter it below.");
if (sUserID) {
sUserID = this.verifyUserID(sUserID);
if (!sUserID) this.notice("Your user ID has not been approved.");
}
}
} else if (fPrompt) {
this.notice("Browser local storage is not available");
}
}
return sUserID;
};
/**
* verifyUserID(sUserID)
*
* @this {Computer}
* @param {string} sUserID
* @return {string} validated user ID, or null if error
*/
Computer.prototype.verifyUserID = function(sUserID)
{
this.sUserID = null;
var fMessages = DEBUG && this.messageEnabled();
if (fMessages) this.printMessage("verifyUserID(" + sUserID + ")");
var sRequest = web.getHost() + UserAPI.ENDPOINT + '?' + UserAPI.QUERY.REQ + '=' + UserAPI.REQ.VERIFY + '&' + UserAPI.QUERY.USER + '=' + sUserID;
var response = web.loadResource(sRequest);
var nErrorCode = response[0];
var sResponse = response[1];
if (!nErrorCode && sResponse) {
try {
response = eval("(" + sResponse + ")");
if (response.code && response.code == UserAPI.CODE.OK) {
web.setLocalStorageItem(Computer.STATE_USERID, response.data);
if (fMessages) this.printMessage(Computer.STATE_USERID + " updated: " + response.data);
this.sUserID = response.data;
} else {
if (fMessages) this.printMessage(response.code + ": " + response.data);
}
} catch (e) {
Component.error(e.message + " (" + sResponse + ")");
}
} else {
if (fMessages) this.printMessage("invalid response (error " + nErrorCode + ")");
}
return this.sUserID;
};
/**
* getServerStatePath()
*
* @this {Computer}
* @return {string|null} sStatePath (null if no localStorage or no USERID stored in localStorage)
*/
Computer.prototype.getServerStatePath = function()
{
var sStatePath = null;
if (this.sUserID) {
if (DEBUG && this.messageEnabled()) {
this.printMessage(Computer.STATE_USERID + " for load: " + this.sUserID);
}
sStatePath = web.getHost() + UserAPI.ENDPOINT + '?' + UserAPI.QUERY.REQ + '=' + UserAPI.REQ.LOAD + '&' + UserAPI.QUERY.USER + '=' + this.sUserID + '&' + UserAPI.QUERY.STATE + '=' + State.key(this, Computer.sAppVer);
} else {
if (DEBUG && this.messageEnabled()) {
this.printMessage(Computer.STATE_USERID + " unavailable");
}
}
return sStatePath;
};
/**
* saveServerState(sUserID, sState)
*
* @param {string} sUserID
* @param {string|null} sState
*/
Computer.prototype.saveServerState = function(sUserID, sState)
{
/*
* We must pass fSync == true, because (as I understand it) browsers will blow off any async
* requests when a page is being closed. Since our request is synchronous, storeServerState()
* should also return a result, but there's not much we can do with it, since browsers ALSO
* tend to blow off alerts() and the like when closing down.
*/
if (sState) {
if (DEBUG && this.messageEnabled()) {
this.printMessage("size of server state: " + sState.length + " bytes");
}
var response = this.storeServerState(sUserID, sState, true);
if (response && response[UserAPI.RES.CODE] == UserAPI.CODE.OK) {
this.notice("Machine state saved to server");
} else if (sState) {
var sError = (response && response[UserAPI.RES.DATA]) || UserAPI.FAIL.BADSTORE;
if (response[UserAPI.RES.CODE] == UserAPI.CODE.FAIL) {
sError = "Error: " + sError;
} else {
sError = "Error " + response[UserAPI.RES.CODE] + ": " + sError;
}
this.notice(sError);
this.resetUserID();
}
} else {
if (DEBUG && this.messageEnabled()) {
this.printMessage("no state to store");
}
}
};
/**
* storeServerState(sUserID, sState, fSync)
*
* @this {Computer}
* @param {string} sUserID
* @param {string} sState
* @param {boolean} [fSync] is true if we're powering down and should perform a synchronous request (default is async)
* @return {*} server response if fSync is true and a response was received; otherwise null
*/
Computer.prototype.storeServerState = function(sUserID, sState, fSync)
{
if (DEBUG && this.messageEnabled()) {
this.printMessage(Computer.STATE_USERID + " for store: " + sUserID);
}
/*
* TODO: Determine whether or not any browsers cancel our request if we're called during a browser "shutdown" event,
* and whether or not it matters if we do an async request (currently, we're not, to try to ensure the request goes through).
*/
var data = {};
data[UserAPI.QUERY.REQ] = UserAPI.REQ.STORE;
data[UserAPI.QUERY.USER] = sUserID;
data[UserAPI.QUERY.STATE] = State.key(this, Computer.sAppVer);
data[UserAPI.QUERY.DATA] = sState;
var sRequest = web.getHost() + UserAPI.ENDPOINT;
if (!fSync) {
web.loadResource(sRequest, true, data);
} else {
var response = web.loadResource(sRequest, false, data);
var sResponse = response[1];
if (response[0]) {
if (sResponse) {
var i = sResponse.indexOf('\n');
if (i > 0) sResponse = sResponse.substr(0, i);
if (!sResponse.indexOf("Error: ")) sResponse = sResponse.substr(7);
}
sResponse = '{"' + UserAPI.RES.CODE + '":' + response[0] + ',"' + UserAPI.RES.DATA + '":"' + sResponse + '"}';
}
if (DEBUG && this.messageEnabled()) this.printMessage(sResponse);
return JSON.parse(sResponse);
}
return null;
};
/**
* onReset()
*
* @this {Computer}
*/
Computer.prototype.onReset = function()
{
/*
* If this is a "resumable" machine (and it's not using a predefined state), then we overload the reset
* operation to offer an explicit "save or discard" option first. This is currently the only UI we offer to
* discard a machine's state, including any disk changes. The traditional "reset" operation is still available
* for non-resumable machines.
*
* TODO: Break this behavior out into a separate "discard" operation, in case the designer of the machine really
* wants to clutter the UI with confusing options. ;-)
*/
if (this.resume && !this.sResumePath) {
/*
* I used to bypass the prompt if this.resume == Computer.RESUME_AUTO, setting fSave to true automatically,
* but that gives the user no means of resetting a resumable machine that contains errors in its resume state.
*/
var fSave = (/* this.resume == Computer.RESUME_AUTO || */ web.confirmUser("Click OK to save changes to this " + Computer.sAppName + " machine.\n\nWARNING: If you CANCEL, all disk changes will be discarded."));
this.powerOff(fSave, true);
/*
* Forcing the page to reload is an expedient option, but ugly. It's preferable to call powerOn()
* and rely on all the components to reset themselves to their default state. The components with
* the greatest burden here are FDC and HDC, which must rely on the fReload flag to determine whether
* or not to unload/reload all their original auto-mounted disk images.
*
* However, if we started with a predefined state (ie, sStatePath is set), we take this shortcut, because
* we don't (yet) have code in place to gracefully reload the initial state (requires calling loadResource()
* again); alternatively, we could avoid throwing that state away, but it seems better to save the memory.
*
* TODO: Make this more graceful, so that we can stop using the reloadPage() sledgehammer.
*/
if (!fSave && this.sStatePath) {
web.reloadPage();
return;
}
if (!fSave) this.fReload = true;
this.powerOn(Computer.RESUME_NONE);
this.fReload = false;
} else {
this.reset();
if (this.cpu) this.cpu.autoStart();
}
};
/**
* getComponentByType(sType, componentPrev)
*
* @this {Computer}
* @param {string} sType
* @param {Component|null} [componentPrev] of previously returned component, if any
* @return {Component|null}
*/
Computer.prototype.getComponentByType = function(sType, componentPrev)
{
var aComponents = Component.getComponents(this.id);
for (var iComponent = 0; iComponent < aComponents.length; iComponent++) {
var component = aComponents[iComponent];
if (componentPrev) {
if (componentPrev == component) componentPrev = null;
continue;
}
if (component.type == sType) return component;
}
return null;
};
/**
* Computer.init()
*
* For every machine represented by an HTML element of class "pcjs-machine", this function
* locates the HTML element of class "computer", extracting the JSON-encoded parameters for the
* Computer constructor from the element's "data-value" attribute, invoking the constructor to
* create a Computer component, and then binding any associated HTML controls to the new component.
*/
Computer.init = function()
{
var aeMachines = Component.getElementsByClass(window.document, PCJSCLASS + "-machine");
for (var iMachine = 0; iMachine < aeMachines.length; iMachine++) {
var eMachine = aeMachines[iMachine];
var parmsMachine = Component.getComponentParms(eMachine);
var aeComputers = Component.getElementsByClass(eMachine, PCJSCLASS, "computer");
for (var iComputer = 0; iComputer < aeComputers.length; iComputer++) {
var eComputer = aeComputers[iComputer];
var parmsComputer = Component.getComponentParms(eComputer);
/*
* We set fSuspended in the Computer constructor because we want to "power up" the
* computer ourselves, after any/all bindings are in place.
*/
var computer = new Computer(parmsComputer, parmsMachine, true);
if (DEBUG && computer.messageEnabled()) {
computer.printMessage("onInit(" + computer.aFlags.fPowered + ")");
}
/*
* For now, all we support are "reset" and "save" buttons. We may eventually add a "power"
* button to manually suspend/resume the machine. An "erase" button was also considered, but
* "reset" now provides a way to force the machine to start from scratch again, so "erase"
* might be redundant now.
*/
Component.bindComponentControls(computer, eComputer, PCJSCLASS);
/*
* Power "up" the computer, giving every component the opportunity to reset or restore itself.
*/
computer.wait(computer.powerOn);
}
}
};
/**
* Computer.show()
*
* When exit() is using an "onbeforeunload" handler, this "onpageshow" handler allows us to repower everything,
* without either resetting or restoring. We call powerOn() with a special resume value (RESUME_REPOWER) if the
* computer is already marked as "ready", meaning the browser didn't change anything. This "repower" process
* should be very quick, essentially just marking all components as powered again (so that, for example, the Video
* component will start drawing again) and firing the CPU up again.
*/
Computer.show = function()
{
var aeComputers = Component.getElementsByClass(window.document, PCJSCLASS, "computer");
for (var iComputer = 0; iComputer < aeComputers.length; iComputer++) {
var eComputer = aeComputers[iComputer];
var parmsComputer = Component.getComponentParms(eComputer);
var computer = Component.getComponentByType("Computer", parmsComputer['id']);
if (computer) {
if (DEBUG && computer.messageEnabled()) {
computer.printMessage("onShow(" + computer.fInitialized + "," + computer.aFlags.fPowered + ")");
}
if (computer.fInitialized && !computer.aFlags.fPowered) {
/**
* Repower the computer, notifying every component to continue running as-is.
*/
computer.powerOn(Computer.RESUME_REPOWER);
}
}
}
};
/**
* Computer.exit()
*
* The Computer is currently the only component that uses an "exit" handler, which web.onExit() defines as
* either an "unload" or "onbeforeunload" handler. This gives us the opportunity to save the machine state,
* using our powerOff() function, before the page goes away.
*
* It's worth noting that "onbeforeunload" offers one nice feature when used instead of "onload": the entire
* page (and therefore this entire application) is retained in its current state by the browser (well, some
* browsers), so that if you go to a new URL, either by entering a new URL in the same window/tab, or by pressing
* the FORWARD button, and then you press the BACK button, the page is immediately restored to its previous state.
*
* In fact, that's how some browsers operate whether you have an "onbeforeunload" handler or not; in other words,
* an "onbeforeunload" handler doesn't change the page retention behavior of the browser. By contrast, the mere
* presence of an "onunload" handler generally causes a browser to throw the page away once the handler returns.
*
* However, in order to safely use "onbeforeunload", we must add yet another handler ("onpageshow") to repower
* everything, without either resetting or restoring. Hence, the Computer.show() function, which calls powerOn()
* with a special resume value (RESUME_REPOWER) if the computer is already marked as "ready", meaning the browser
* didn't change anything. This "repower" process should be very quick, essentially just marking all components as
* powered again (so that, for example, the Video component will start drawing again) and firing the CPU up again.
*
* Reportedly, some browsers (eg, Opera) don't support "onbeforeunload", in which case Component will have to use
* "unload" instead. But even when the page must be rebuilt from scratch, the combination of browser cache and
* localStorage means the simulation should be restored and become operational almost immediately.
*/
Computer.exit = function()
{
var aeComputers = Component.getElementsByClass(window.document, PCJSCLASS, "computer");
for (var iComputer = 0; iComputer < aeComputers.length; iComputer++) {
var eComputer = aeComputers[iComputer];
var parmsComputer = Component.getComponentParms(eComputer);
var computer = Component.getComponentByType("Computer", parmsComputer['id']);
if (computer) {
if (DEBUG && computer.messageEnabled()) {
computer.printMessage("onExit(" + computer.aFlags.fPowered + ")");
}
if (computer.aFlags.fPowered) {
/**
* Power "down" the computer, giving every component an opportunity to save its state,
* but only if 'resume' has been set AND there is no valid resume path (because if a valid resume
* path exists, we'll always load our state from there, and not from whatever we save here).
*/
computer.powerOff(!!(computer.resume && !computer.sResumePath), true);
}
}
}
};
/*
* Initialize every Computer on the page.
*/
web.onInit(Computer.init);
web.onShow(Computer.show);
web.onExit(Computer.exit);
if (typeof module !== 'undefined') module.exports = Computer;
/**
* @fileoverview Implements the PCjs CPU component.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-Sep-04
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
if (typeof module !== 'undefined') {
var str = require("../../shared/lib/strlib");
var usr = require("../../shared/lib/usrlib");
var Component = require("../../shared/lib/component");
var Messages = require("./messages");
}
/**
* CPU(parmsCPU, nCyclesDefault)
*
* The CPU class supports the following (parmsCPU) properties:
*
* cycles: the machine's base cycles per second; the X86CPU constructor will
* provide us with a default (based on the CPU model) to use as a fallback
*
* multiplier: base cycle multiplier; default is 1
*
* autoStart: true to automatically start, false to not, or null (default)
* to make the autoStart decision based on whether or not a Debugger is
* installed (if there's no Debugger AND no "Run" button, then auto-start,
* otherwise don't)
*
* csStart: the number of cycles that runCPU() must wait before generating
* checksum records; -1 if disabled. checksum records are a diagnostic aid
* used to help compare one CPU run to another.
*
* csInterval: the number of cycles that runCPU() must execute before
* generating a checksum record; -1 if disabled.
*
* csStop: the number of cycles to stop generating checksum records.
*
* This component is primarily responsible for interfacing the CPU with the outside
* world (eg, Panel and Debugger components), and managing overall CPU operation.
*
* It is extended by the X86CPU component, where all the x86-specific logic resides.
*
* @constructor
* @extends Component
* @param {Object} parmsCPU
* @param {number} nCyclesDefault
*/
function CPU(parmsCPU, nCyclesDefault)
{
Component.call(this, "CPU", parmsCPU, CPU, Messages.CPU);
var nCycles = parmsCPU['cycles'] || nCyclesDefault;
var nMultiplier = parmsCPU['multiplier'] || 1;
this.aCounts = {};
this.aCounts.nCyclesPerSecond = nCycles;
/*
* nCyclesMultiplier replaces the old "speed" variable (0, 1, 2) and eliminates the need for
* the constants (SPEED_SLOW, SPEED_FAST and SPEED_MAX). The UI simply doubles the multiplier
* until we've exceeded the host's speed limit and then starts the multiplier over at 1.
*/
this.aCounts.nCyclesMultiplier = nMultiplier;
this.aCounts.mhzDefault = Math.round(this.aCounts.nCyclesPerSecond / 10000) / 100;
/*
* TODO: Take care of this with an initial setSpeed() call instead?
*/
this.aCounts.mhzTarget = this.aCounts.mhzDefault * this.aCounts.nCyclesMultiplier;
/*
* We add a number of flags to the set initialized by Component
*/
this.aFlags.fRunning = false;
this.aFlags.fStarting = false;
this.aFlags.fAutoStart = parmsCPU['autoStart'];
/*
* TODO: Add some UI for fDisplayLiveRegs (either an XML property, or a UI checkbox, or both)
*/
this.aFlags.fDisplayLiveRegs = false;
/*
* Provide a power-saving URL-based way of overriding the 'autostart' setting;
* if an "autostart" parameter is specified on the URL, anything other than "true"
* or "false" is treated as the null setting (see above for details).
*/
var sAutoStart = Component.parmsURL['autostart'];
if (sAutoStart !== undefined) {
this.aFlags.fAutoStart = (sAutoStart == "true"? true : (sAutoStart == "false"? false : null));
}
/*
* Get checksum parameters, if any. runCPU() behavior is not affected until fChecksum
* is true, which won't happen until resetChecksum() is called with nCyclesChecksumInterval
* ("csInterval") set to a positive value.
*
* As above, any of these parameters can also be set with the Debugger's execution options
* command ("x"); for example, "x cs int 5000" will set nCyclesChecksumInterval to 5000
* and call resetChecksum().
*/
this.aFlags.fChecksum = false;
this.aCounts.nChecksum = this.aCounts.nCyclesChecksumNext = 0;
this.aCounts.nCyclesChecksumStart = parmsCPU["csStart"];
this.aCounts.nCyclesChecksumInterval = parmsCPU["csInterval"];
this.aCounts.nCyclesChecksumStop = parmsCPU["csStop"];
/*
* Initially, no video devices are attached that require CPU-driven updates. initBus() will update this.
*/
this.aVideo = [];
var cpu = this;
this.onRunTimeout = function() { cpu.runCPU(); };
this.setReady();
}
Component.subclass(CPU);
/*
* Constants that control the frequency at which various updates should occur.
*
* These values do NOT control the simulation directly. Instead, they are used by
* calcCycles(), which uses the nCyclesPerSecond passed to the constructor as a starting
* point and computes the following variables:
*
* this.aCounts.nCyclesPerYield (this.aCounts.nCyclesPerSecond / CPU.YIELDS_PER_SECOND)
* this.aCounts.nCyclesPerVideoUpdate (this.aCounts.nCyclesPerSecond / CPU.VIDEO_UPDATES_PER_SECOND)
* this.aCounts.nCyclesPerStatusUpdate (this.aCounts.nCyclesPerSecond / CPU.STATUS_UPDATES_PER_SECOND)
*
* The above variables are also multiplied by any cycle multiplier in effect, via setSpeed(),
* and then they're used to initialize another set of variables for each runCPU() iteration:
*
* this.aCounts.nCyclesNextYield <= this.aCounts.nCyclesPerYield
* this.aCounts.nCyclesNextVideoUpdate <= this.aCounts.nCyclesPerVideoUpdate
* this.aCounts.nCyclesNextStatusUpdate <= this.aCounts.nCyclesPerStatusUpdate
*/
CPU.YIELDS_PER_SECOND = 30;
CPU.VIDEO_UPDATES_PER_SECOND = 60; // WARNING: if you change this, beware of side-effects in the Video component
CPU.STATUS_UPDATES_PER_SECOND = 2;
/**
* initBus(cmp, bus, cpu, dbg)
*
* @this {CPU}
* @param {Computer} cmp
* @param {Bus} bus
* @param {CPU} cpu
* @param {Debugger} dbg
*/
CPU.prototype.initBus = function(cmp, bus, cpu, dbg)
{
this.bus = bus;
this.dbg = dbg;
this.cmp = cmp;
/*
* Attach the Video component to the CPU, so that the CPU can periodically update
* the video display via updateVideo(), as cycles permit.
*/
for (var video = null; (video = cmp.getComponentByType("Video", video));) {
this.aVideo.push(video);
}
/*
* Attach the ChipSet component to the CPU, so that it can obtain the IDT vector number of
* pending hardware interrupts, in response to ChipSet's updateINTR() notifications.
*
* We must also call chipset.updateAllTimers() periodically; stepCPU() takes care of that.
*/
this.chipset = cmp.getComponentByType("ChipSet");
this.setReady();
};
/**
* reset()
*
* This is a placeholder for reset (overridden by the X86CPU component).
*
* @this {CPU}
*/
CPU.prototype.reset = function()
{
};
/**
* save()
*
* This is a placeholder for save support (overridden by the X86CPU component).
*
* @this {CPU}
* @return {Object|null}
*/
CPU.prototype.save = function()
{
return null;
};
/**
* restore(data)
*
* This is a placeholder for restore support (overridden by the X86CPU component).
*
* @this {CPU}
* @param {Object} data
* @return {boolean} true if restore successful, false if not
*/
CPU.prototype.restore = function(data)
{
return false;
};
/**
* powerUp(data, fRepower)
*
* @this {CPU}
* @param {Object|null} data
* @param {boolean} [fRepower]
* @return {boolean} true if successful, false if failure
*/
CPU.prototype.powerUp = function(data, fRepower)
{
if (!fRepower) {
if (!data || !this.restore) {
this.reset();
} else {
this.resetCycles();
if (!this.restore(data)) return false;
this.resetChecksum();
}
/*
* Give the Debugger a chance to do/print something once we've powered up
*/
if (DEBUGGER && this.dbg) {
this.dbg.init();
} else {
/*
* The Computer (this.cmp) knows if there's a Control Panel (this.cmp.panel), and the Control Panel
* knows if there's a "print" control (this.cmp.panel.controlPrint), and if there IS a "print" control
* but no debugger, the machine is probably misconfigured (most likely, the page simply neglected to
* load the Debugger component).
*
* However, we don't actually need to check all that; it's always safe use println(), regardless whether
* a Control Panel with a "print" control is present or not.
*/
this.println("No debugger detected");
}
}
/*
* The Computer component (which is responsible for all powerDown and powerUp notifications)
* is now responsible for managing a component's fPowered flag, not us.
*
* this.aFlags.fPowered = true;
*/
this.updateCPU();
return true;
};
/**
* powerDown(fSave, fShutdown)
*
* @this {CPU}
* @param {boolean} fSave
* @param {boolean} [fShutdown]
* @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
*/
CPU.prototype.powerDown = function(fSave, fShutdown)
{
/*
* The Computer component (which is responsible for all powerDown and powerUp notifications)
* is now responsible for managing a component's fPowered flag, not us.
*
* this.aFlags.fPowered = false;
*/
return fSave && this.save ? this.save() : true;
};
/**
* autoStart()
*
* @this {CPU}
* @return {boolean} true if started, false if not
*/
CPU.prototype.autoStart = function()
{
if (this.aFlags.fAutoStart === true || this.aFlags.fAutoStart === null && (!DEBUGGER || !this.dbg) && this.bindings["run"] === undefined) {
this.runCPU(); // start running automatically on power-up, assuming there's no Debugger and no "Run" button
return true;
}
return false;
};
/**
* isPowered()
*
* @this {CPU}
* @return {boolean}
*/
CPU.prototype.isPowered = function()
{
if (!this.aFlags.fPowered) {
this.println(this.toString() + " not powered");
return false;
}
return true;
};
/**
* isRunning()
*
* @this {CPU}
* @return {boolean}
*/
CPU.prototype.isRunning = function()
{
return this.aFlags.fRunning;
};
/**
* getChecksum()
*
* This will be implemented by the X86CPU component.
*
* @this {CPU}
* @return {number} a 32-bit summation of key elements of the current CPU state (used by the CPU checksum code)
*/
CPU.prototype.getChecksum = function()
{
return 0;
};
/**
* resetChecksum()
*
* If checksum generation is enabled (fChecksum is true), this resets the running 32-bit checksum and the
* cycle counter that will trigger the next displayChecksum(); called by resetCycles(), which is called whenever
* the CPU is reset or restored.
*
* @this {CPU}
* @return {boolean} true if checksum generation enabled, false if not
*/
CPU.prototype.resetChecksum = function()
{
if (this.aCounts.nCyclesChecksumStart === undefined) this.aCounts.nCyclesChecksumStart = 0;
if (this.aCounts.nCyclesChecksumInterval === undefined) this.aCounts.nCyclesChecksumInterval = -1;
if (this.aCounts.nCyclesChecksumStop === undefined) this.aCounts.nCyclesChecksumStop = -1;
this.aFlags.fChecksum = (this.aCounts.nCyclesChecksumStart >= 0 && this.aCounts.nCyclesChecksumInterval > 0);
if (this.aFlags.fChecksum) {
this.aCounts.nChecksum = 0;
this.aCounts.nCyclesChecksumNext = this.aCounts.nCyclesChecksumStart - this.nTotalCycles;
// this.aCounts.nCyclesChecksumNext = this.aCounts.nCyclesChecksumStart + this.aCounts.nCyclesChecksumInterval - (this.nTotalCycles % this.aCounts.nCyclesChecksumInterval);
return true;
}
return false;
};
/**
* updateChecksum(nCycles)
*
* When checksum generation is enabled (fChecksum is true), runCPU() asks stepCPU() to execute a minimum
* number of cycles (1), effectively limiting execution to a single instruction, and then we're called with
* the exact number cycles that were actually executed. This should give us instruction-granular checksums
* at precise intervals that are 100% repeatable.
*
* @this {CPU}
* @param {number} nCycles
*/
CPU.prototype.updateChecksum = function(nCycles)
{
if (this.aFlags.fChecksum) {
/*
* Get a 32-bit summation of the current CPU state and add it to our running 32-bit checksum
*/
var fDisplay = false;
this.aCounts.nChecksum = (this.aCounts.nChecksum + this.getChecksum()) | 0;
this.aCounts.nCyclesChecksumNext -= nCycles;
if (this.aCounts.nCyclesChecksumNext <= 0) {
this.aCounts.nCyclesChecksumNext += this.aCounts.nCyclesChecksumInterval;
fDisplay = true;
}
if (this.aCounts.nCyclesChecksumStop >= 0) {
if (this.aCounts.nCyclesChecksumStop <= this.getCycles()) {
this.aCounts.nCyclesChecksumInterval = this.aCounts.nCyclesChecksumStop = -1;
this.resetChecksum();
this.stopCPU();
fDisplay = true;
}
}
if (fDisplay) this.displayChecksum();
}
};
/**
* displayChecksum()
*
* When checksum generation is enabled (fChecksum is true), this is called to provide a crude log of all
* checksums generated at the specified cycle intervals, as specified by the "csStart" and "csInterval" parmsCPU
* properties).
*
* @this {CPU}
*/
CPU.prototype.displayChecksum = function()
{
this.println(this.getCycles() + " cycles: " + "checksum=" + str.toHex(this.aCounts.nChecksum));
};
/**
* displayValue(sLabel, nValue, cch)
*
* This is principally for displaying register values, but in reality, it can be used to display any
* numeric (hex) value bound to the given label.
*
* @this {CPU}
* @param {string} sLabel
* @param {number} nValue
* @param {number} cch
*/
CPU.prototype.displayValue = function(sLabel, nValue, cch)
{
if (this.bindings[sLabel]) {
if (nValue === undefined) {
this.setError("Value for " + sLabel + " is invalid");
this.stopCPU();
}
var sVal;
if (!this.aFlags.fRunning || this.aFlags.fDisplayLiveRegs) {
sVal = str.toHex(nValue, cch);
} else {
sVal = "--------".substr(0, cch);
}
/*
* TODO: Determine if this test actually avoids any redrawing when a register hasn't changed, and/or if
* we should maintain our own (numeric) cache of displayed register values (to avoid creating these temporary
* string values that will have to garbage-collected), and/or if this is actually slower, and/or if I'm being
* too obsessive.
*/
if (this.bindings[sLabel].textContent != sVal) this.bindings[sLabel].textContent = sVal;
}
};
/**
* updateStatus(fForce)
*
* This provides periodic Control Panel updates (eg, a few times per second; see STATUS_UPDATES_PER_SECOND).
* The X86CPU subclasses updateStatus() to take care of any DOM updates (eg, register values) while the CPU is running.
*
* @this {CPU}
* @param {boolean} [fForce]
*/
CPU.prototype.updateStatus = function(fForce)
{
if (this.cmp && this.cmp.panel) this.cmp.panel.updateStatus();
};
/**
* updateVideo()
*
* Any high-frequency updates should be performed here. Avoid DOM updates, since updateVideo() can be called up to
* 60 times per second (see VIDEO_UPDATES_PER_SECOND).
*
* @this {CPU}
*/
CPU.prototype.updateVideo = function()
{
for (var i = 0; i < this.aVideo.length; i++) {
this.aVideo[i].updateScreen();
}
if (this.cmp && this.cmp.panel) this.cmp.panel.updateAnimation();
};
/**
* setFocus()
*
* @this {CPU}
*/
CPU.prototype.setFocus = function()
{
if (this.aVideo.length) this.aVideo[0].setFocus();
};
/**
* setBinding(sHTMLType, sBinding, control)
*
* @this {CPU}
* @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
* @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "run")
* @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
* @return {boolean} true if binding was successful, false if unrecognized binding request
*/
CPU.prototype.setBinding = function(sHTMLType, sBinding, control)
{
var cpu = this;
var fBound = false;
switch (sBinding) {
case "run":
this.bindings[sBinding] = control;
control.onclick = function onClickRun() {
if (!cpu.cmp || !cpu.cmp.checkPower()) return;
if (!cpu.aFlags.fRunning)
cpu.runCPU(true);
else
cpu.stopCPU(true);
};
fBound = true;
break;
case "reset":
/*
* A "reset" button is really a function of the entire computer, not just the CPU, but
* it's not always convenient to stick a reset button in the computer component definition,
* so we support a "reset" binding both here AND in the Computer component.
*/
this.bindings[sBinding] = control;
control.onclick = function onClickReset() {
if (cpu.cmp) cpu.cmp.onReset();
};
fBound = true;
break;
case "speed":
this.bindings[sBinding] = control;
fBound = true;
break;
case "setSpeed":
this.bindings[sBinding] = control;
control.onclick = function onClickSetSpeed() {
cpu.setSpeed(cpu.aCounts.nCyclesMultiplier << 1, true);
};
control.textContent = this.getSpeedTarget();
fBound = true;
break;
default:
break;
}
return fBound;
};
/**
* setBurstCycles(nCycles)
*
* This function is used by the ChipSet component whenever a very low timer count is set,
* in anticipation of the timer requiring an update sooner than the normal nCyclesPerYield
* period in runCPU() would normally provide.
*
* @this {CPU}
* @param {number} nCycles is the target number of cycles to drop the current burst to
* @return {boolean}
*/
CPU.prototype.setBurstCycles = function(nCycles)
{
if (this.aFlags.fRunning) {
var nDelta = this.nStepCycles - nCycles;
/*
* NOTE: If nDelta is negative, we will actually be increasing nStepCycles and nBurstCycles.
* Which is OK, but if we're also taking snapshots of the cycle counts, to make sure that instruction
* costs are being properly assessed, then we need to update nSnapCycles as well.
*
* TODO: If the delta is negative, we could simply ignore the request, but we must first carefully
* consider the impact on the ChipSet timers.
*/
if (DEBUG) this.nSnapCycles -= nDelta;
this.nStepCycles -= nDelta;
this.nBurstCycles -= nDelta;
return true;
}
return false;
};
/**
* addCycles(nCycles, fEndStep)
*
* @this {CPU}
* @param {number} nCycles
* @param {boolean} [fEndStep]
*/
CPU.prototype.addCycles = function(nCycles, fEndStep)
{
this.nTotalCycles += nCycles;
if (fEndStep) {
this.nBurstCycles = this.nStepCycles = 0;
}
};
/**
* calcCycles(fRecalc)
*
* Calculate the number of cycles to process for each "burst" of CPU activity. The size of a burst
* is driven by the following values:
*
* CPU.YIELDS_PER_SECOND (eg, 30)
* CPU.VIDEO_UPDATES_PER_SECOND (eg, 60)
* CPU.STATUS_UPDATES_PER_SECOND (eg, 5)
*
* The largest of the above values forces the size of the burst to its smallest value. Let's say that
* largest value is 30. Assuming nCyclesPerSecond is 1,000,000, that results in bursts of 33,333 cycles.
*
* At the end of each burst, we subtract burst cycles from yield, video, and status cycle "threshold"
* counters. Whenever the "next yield" cycle counter goes to (or below) zero, we compare elapsed time
* to the time we expected the virtual hardware to take (eg, 1000ms/50 or 20ms), and if we still have time
* remaining, we sleep the remaining time (or 0ms if there's no remaining time), and then restart runCPU().
*
* Similarly, whenever the "next video update" cycle counter goes to (or below) zero, we call updateVideo(),
* and whenever the "next status update" cycle counter goes to (or below) zero, we call updateStatus().
*
* @this {CPU}
* @param {boolean} [fRecalc] is true if the caller wants to recalculate thresholds based on the most recent
* speed calculation (see calcSpeed).
*/
CPU.prototype.calcCycles = function(fRecalc)
{
/*
* Calculate the most cycles we're allowed to execute in a single "burst"
*/
var nMostUpdatesPerSecond = CPU.YIELDS_PER_SECOND;
if (nMostUpdatesPerSecond < CPU.VIDEO_UPDATES_PER_SECOND) nMostUpdatesPerSecond = CPU.VIDEO_UPDATES_PER_SECOND;
if (nMostUpdatesPerSecond < CPU.STATUS_UPDATES_PER_SECOND) nMostUpdatesPerSecond = CPU.STATUS_UPDATES_PER_SECOND;
/*
* Calculate cycle "per" values for the yield, video update, and status update cycle counters
*/
var vMultiplier = 1;
if (fRecalc) {
if (this.aCounts.nCyclesMultiplier > 1 && this.aCounts.mhz) {
vMultiplier = (this.aCounts.mhz / this.aCounts.mhzDefault);
}
}
this.aCounts.msPerYield = Math.round(1000 / CPU.YIELDS_PER_SECOND);
this.aCounts.nCyclesPerBurst = Math.floor(this.aCounts.nCyclesPerSecond / nMostUpdatesPerSecond * vMultiplier);
this.aCounts.nCyclesPerYield = Math.floor(this.aCounts.nCyclesPerSecond / CPU.YIELDS_PER_SECOND * vMultiplier);
this.aCounts.nCyclesPerVideoUpdate = Math.floor(this.aCounts.nCyclesPerSecond / CPU.VIDEO_UPDATES_PER_SECOND * vMultiplier);
this.aCounts.nCyclesPerStatusUpdate = Math.floor(this.aCounts.nCyclesPerSecond / CPU.STATUS_UPDATES_PER_SECOND * vMultiplier);
/*
* And initialize "next" yield, video update, and status update cycle "threshold" counters to those "per" values
*/
if (!fRecalc) {
this.aCounts.nCyclesNextYield = this.aCounts.nCyclesPerYield;
this.aCounts.nCyclesNextVideoUpdate = this.aCounts.nCyclesPerVideoUpdate;
this.aCounts.nCyclesNextStatusUpdate = this.aCounts.nCyclesPerStatusUpdate;
}
this.aCounts.nCyclesRecalc = 0;
};
/**
* getCycles(fScaled)
*
* getCycles() returns the number of cycles executed so far. Note that we can be called after
* runCPU() OR during runCPU(), perhaps from a handler triggered during the current run's stepCPU(),
* so nRunCycles must always be adjusted by number of cycles stepCPU() was asked to run (nBurstCycles),
* less the number of cycles it has yet to run (nStepCycles).
*
* nRunCycles is zeroed whenever the CPU is halted or the CPU speed is changed, which is why we also
* have nTotalCycles, which accumulates all nRunCycles before we zero it. However, nRunCycles and
* nTotalCycles eventually get reset by calcSpeed(), to avoid overflow, so components that rely on
* getCycles() returning steadily increasing values should also be prepared for a reset at any time.
*
* @this {CPU}
* @param {boolean} [fScaled] is true if the caller wants a cycle count relative to a multiplier of 1
* @return {number}
*/
CPU.prototype.getCycles = function(fScaled)
{
var nCycles = this.nTotalCycles + this.nRunCycles + this.nBurstCycles - this.nStepCycles;
if (fScaled && this.aCounts.nCyclesMultiplier > 1 && this.aCounts.mhz > this.aCounts.mhzDefault) {
/*
* We could scale the current cycle count by the current effective speed (this.aCounts.mhz); eg:
*
* nCycles = Math.round(nCycles / (this.aCounts.mhz / this.aCounts.mhzDefault));
*
* but that speed will fluctuate somewhat: large fluctuations at first, but increasingly smaller
* fluctuations after each burst of instructions that runCPU() executes.
*
* Alternatively, we can scale the cycle count by the multiplier, which is good in that the
* multiplier doesn't vary once the user changes it, but a potential downside is that the
* multiplier might be set too high, resulting in a target speed that's higher than the effective
* speed is able to reach.
*
* Also, if multipliers were always limited to a power-of-two, then this could be calculated
* with a simple shift. However, only the "setSpeed" UI binding limits it that way; the Debugger
* interface allows any value, as does the CPU "multiplier" parmsCPU property (from the machine's
* XML file).
*/
nCycles = Math.round(nCycles / this.aCounts.nCyclesMultiplier);
}
return nCycles;
};
/**
* getCyclesPerSecond()
*
* This returns the CPU's "base" speed (ie, the original cycles per second defined for the machine)
*
* @this {CPU}
* @return {number}
*/
CPU.prototype.getCyclesPerSecond = function()
{
return this.aCounts.nCyclesPerSecond;
};
/**
* resetCycles()
*
* Resets speed and cycle information as part of any reset() or restore(); this typically occurs during powerUp().
* It's important that this be called BEFORE the actual restore() call, because restore() may want to call setSpeed(),
* which in turn assumes that all the cycle counts have been initialized to sensible values.
*
* @this {CPU}
*/
CPU.prototype.resetCycles = function()
{
this.aCounts.mhz = 0;
this.nTotalCycles = this.nRunCycles = this.nBurstCycles = this.nStepCycles = 0;
this.resetChecksum();
this.setSpeed(1);
};
/**
* getSpeed()
*
* @this {CPU}
* @return {number} the current speed multiplier
*/
CPU.prototype.getSpeed = function()
{
return this.aCounts.nCyclesMultiplier;
};
/**
* getSpeedCurrent()
*
* @this {CPU}
* @return {string} the current speed, in mhz, as a string formatted to two decimal places
*/
CPU.prototype.getSpeedCurrent = function()
{
/*
* TODO: Has toFixed() been "fixed" in all browsers (eg, IE) to return a rounded value now?
*/
return ((this.aFlags.fRunning && this.aCounts.mhz)? (this.aCounts.mhz.toFixed(2) + "Mhz") : "Stopped");
};
/**
* getSpeedTarget()
*
* @this {CPU}
* @return {string} the target speed, in mhz, as a string formatted to two decimal places
*/
CPU.prototype.getSpeedTarget = function()
{
/*
* TODO: Has toFixed() been "fixed" in all browsers (eg, IE) to return a rounded value now?
*/
return this.aCounts.mhzTarget.toFixed(2) + "Mhz";
};
/**
* setSpeed(nMultiplier, fOnClick)
*
* @this {CPU}
* @param {number} [nMultiplier] is the new proposed multiplier (reverts to 1 if the target was too high)
* @param {boolean} [fOnClick] is true if called from a click handler that might have stolen focus
* @return {number} the target speed, in mhz
* @desc Whenever the speed is changed, the running cycle count and corresponding start time must be reset,
* so that the next effective speed calculation obtains sensible results. In fact, when runCPU() initially calls
* setSpeed() with no parameters, that's all this function does (it doesn't change the current speed setting).
*/
CPU.prototype.setSpeed = function(nMultiplier, fOnClick)
{
if (nMultiplier !== undefined) {
/*
* If we couldn't reach at least 80% (0.8) of the current target speed,
* then revert the multiplier back to one.
*/
if (this.aCounts.mhz / this.aCounts.mhzTarget < 0.8) nMultiplier = 1;
this.aCounts.nCyclesMultiplier = nMultiplier;
var mhz = this.aCounts.mhzDefault * this.aCounts.nCyclesMultiplier;
if (this.aCounts.mhzTarget != mhz) {
this.aCounts.mhzTarget = mhz;
var sSpeed = this.getSpeedTarget();
var controlSpeed = this.bindings["setSpeed"];
if (controlSpeed) controlSpeed.textContent = sSpeed;
this.println("target speed: " + sSpeed);
}
if (fOnClick) this.setFocus();
}
this.addCycles(this.nRunCycles);
this.nRunCycles = 0;
this.aCounts.msStartRun = usr.getTime();
this.aCounts.msEndThisRun = 0;
this.calcCycles();
return this.aCounts.mhzTarget;
};
/**
* calcSpeed(nCycles, msElapsed)
*
* @this {CPU}
* @param {number} nCycles
* @param {number} msElapsed
*/
CPU.prototype.calcSpeed = function(nCycles, msElapsed)
{
if (msElapsed) {
this.aCounts.mhz = Math.round(nCycles / (msElapsed * 10)) / 100;
if (msElapsed >= 86400000) {
this.nTotalCycles = 0;
if (this.chipset) this.chipset.updateAllTimers(true);
this.setSpeed(); // reset all counters once per day so that we never have to worry about overflow
}
}
};
/**
* calcStartTime()
*
* @this {CPU}
*/
CPU.prototype.calcStartTime = function()
{
if (this.aCounts.nCyclesRecalc >= this.aCounts.nCyclesPerSecond) {
this.calcCycles(true);
}
this.aCounts.nCyclesThisRun = 0;
this.aCounts.msStartThisRun = usr.getTime();
/*
* Try to detect situations where the browser may have throttled us, such as when the user switches
* to a different tab; in those situations, Chrome and Safari may restrict setTimeout() callbacks
* to roughly one per second.
*
* Another scenario: the user resizes the browser window. setTimeout() callbacks are not throttled,
* but there can still be enough of a lag between the callbacks that CPU speed will be noticeably
* erratic if we don't compensate for it here.
*
* We can detect throttling/lagging by verifying that msEndThisRun (which was set at the end of the
* previous run and includes any requested sleep time) is comparable to the current msStartThisRun;
* if the delta is significant, we compensate by bumping msStartRun forward by that delta.
*
* This shouldn't be triggered when the Debugger halts the CPU, because setSpeed() -- which is called
* whenever the CPU starts running again -- zeroes msEndThisRun.
*
* This also won't do anything about other internal delays; for example, Debugger message() calls.
* By the time the message() function has called yieldCPU(), the cost of the message has already been
* incurred, so it will be end up being charged against the instruction(s) that triggered it.
*
* TODO: Consider calling yieldCPU() sooner from message(), so that it can arrange for the msEndThisRun
* "snapshot" to occur sooner; it's unclear, however, whether that will really improve the CPU's ability
* to hit its target speed, since you would expect any instruction that displays a message to be an
* EXTREMELY slow instruction.
*/
if (this.aCounts.msEndThisRun) {
var msDelta = this.aCounts.msStartThisRun - this.aCounts.msEndThisRun;
if (msDelta > this.aCounts.msPerYield) {
if (MAXDEBUG) this.println("large time delay: " + msDelta + "ms");
this.aCounts.msStartRun += msDelta;
/*
* Bumping msStartRun forward should NEVER cause it to exceed msStartThisRun; however, just
* in case, I make absolutely sure it cannot happen, since doing so could result in negative
* speed calculations.
*/
this.assert(this.aCounts.msStartRun <= this.aCounts.msStartThisRun);
if (this.aCounts.msStartRun > this.aCounts.msStartThisRun) {
this.aCounts.msStartRun = this.aCounts.msStartThisRun;
}
}
}
};
/**
* calcRemainingTime()
*
* @this {CPU}
* @return {number}
*/
CPU.prototype.calcRemainingTime = function()
{
this.aCounts.msEndThisRun = usr.getTime();
var msYield = this.aCounts.msPerYield;
if (this.aCounts.nCyclesThisRun) {
/*
* Normally, we would assume we executed a full quota of work over msPerYield, but since the CPU
* now has the option of calling yieldCPU(), that might not be true. If nCyclesThisRun is correct, then
* the ratio of nCyclesThisRun/nCyclesPerYield should represent the percentage of work we performed,
* and so applying that percentage to msPerYield should give us a better estimate of work vs. time.
*/
msYield = Math.round(msYield * this.aCounts.nCyclesThisRun / this.aCounts.nCyclesPerYield);
}
var msElapsedThisRun = this.aCounts.msEndThisRun - this.aCounts.msStartThisRun;
var msRemainsThisRun = msYield - msElapsedThisRun;
/*
* We could pass only "this run" results to calcSpeed():
*
* nCycles = this.aCounts.nCyclesThisRun;
* msElapsed = msElapsedThisRun;
*
* but it seems preferable to use longer time periods and hopefully get a more accurate speed.
*
* Also, if msRemainsThisRun >= 0 && this.aCounts.nCyclesMultiplier == 1, we could pass these results instead:
*
* nCycles = this.aCounts.nCyclesThisRun;
* msElapsed = this.aCounts.msPerYield;
*
* to insure that we display a smooth, constant N Mhz. But for now, I prefer seeing any fluctuations.
*/
var nCycles = this.nRunCycles;
var msElapsed = this.aCounts.msEndThisRun - this.aCounts.msStartRun;
if (MAXDEBUG && msRemainsThisRun < 0 && this.aCounts.nCyclesMultiplier > 1) {
this.println("warning: updates @" + msElapsedThisRun + "ms (prefer " + Math.round(msYield) + "ms)");
}
this.calcSpeed(nCycles, msElapsed);
if (msRemainsThisRun < 0 || this.aCounts.mhz < this.aCounts.mhzTarget) {
/*
* If the last burst took MORE time than we allotted (ie, it's taking more than 1 second to simulate
* nCyclesPerSecond), all we can do is yield for as little time as possible (ie, 0ms) and hope that the
* simulation is at least usable.
*/
msRemainsThisRun = 0;
}
/*
* Last but not least, update nCyclesRecalc, so that when runCPU() starts up again and calls calcStartTime(),
* it'll be ready to decide if calcCycles() should be called again.
*/
this.aCounts.nCyclesRecalc += this.aCounts.nCyclesThisRun;
if (DEBUG && this.messageEnabled(Messages.LOG) && msRemainsThisRun) {
this.log("calcRemainingTime: " + msRemainsThisRun + "ms to sleep after " + this.aCounts.msEndThisRun + "ms");
}
this.aCounts.msEndThisRun += msRemainsThisRun;
return msRemainsThisRun;
};
/**
* runCPU(fOnClick)
*
* @this {CPU}
* @param {boolean} [fOnClick] is true if called from a click handler that might have stolen focus
*/
CPU.prototype.runCPU = function(fOnClick)
{
if (!this.setBusy(true)) {
this.updateCPU();
if (this.cmp) this.cmp.stop(usr.getTime(), this.getCycles());
return;
}
this.startCPU(fOnClick);
/*
* calcStartTime() initializes the cycle counter and timestamp for this runCPU() invocation, and optionally
* recalculates the the maximum number of cycles for each burst if the nCyclesRecalc threshold has been reached.
*/
this.calcStartTime();
try {
do {
var nCyclesPerBurst = (this.aFlags.fChecksum? 1 : this.aCounts.nCyclesPerBurst);
if (this.chipset) {
this.chipset.updateAllTimers();
nCyclesPerBurst = this.chipset.getTimerCycleLimit(0, nCyclesPerBurst);
nCyclesPerBurst = this.chipset.getRTCCycleLimit(nCyclesPerBurst);
}
/*
* nCyclesPerBurst is how many cycles we WANT to run on each iteration of stepCPU(), but it may run
* significantly less (or slightly more, since we can't execute partial instructions).
*/
this.stepCPU(nCyclesPerBurst);
/*
* nBurstCycles, less any remaining nStepCycles, is how many cycles stepCPU() ACTUALLY ran (nCycles).
* We add that to nCyclesThisRun, as well as nRunCycles, which is the cycle count since the CPU first
* started running.
*/
var nCycles = this.nBurstCycles - this.nStepCycles;
this.nRunCycles += nCycles;
this.aCounts.nCyclesThisRun += nCycles;
this.addCycles(0, true);
this.updateChecksum(nCycles);
this.aCounts.nCyclesNextVideoUpdate -= nCycles;
if (this.aCounts.nCyclesNextVideoUpdate <= 0) {
this.aCounts.nCyclesNextVideoUpdate += this.aCounts.nCyclesPerVideoUpdate;
this.updateVideo();
}
this.aCounts.nCyclesNextStatusUpdate -= nCycles;
if (this.aCounts.nCyclesNextStatusUpdate <= 0) {
this.aCounts.nCyclesNextStatusUpdate += this.aCounts.nCyclesPerStatusUpdate;
this.updateStatus();
}
this.aCounts.nCyclesNextYield -= nCycles;
if (this.aCounts.nCyclesNextYield <= 0) {
this.aCounts.nCyclesNextYield += this.aCounts.nCyclesPerYield;
break;
}
} while (this.aFlags.fRunning);
}
catch (e) {
this.stopCPU();
this.updateCPU();
if (this.cmp) this.cmp.stop(usr.getTime(), this.getCycles());
this.setBusy(false);
this.setError(e.stack || e.message);
return;
}
setTimeout(this.onRunTimeout, this.calcRemainingTime());
};
/**
* startCPU(fSetFocus)
*
* WARNING: Other components must use runCPU() to get the CPU running; this is a runCPU() helper function only.
*
* @param {boolean} [fSetFocus]
*/
CPU.prototype.startCPU = function(fSetFocus)
{
if (!this.aFlags.fRunning) {
/*
* setSpeed() without a speed parameter leaves the selected speed in place, but also resets the
* cycle counter and timestamp for the current series of runCPU() calls, calculates the maximum number
* of cycles for each burst based on the last known effective CPU speed, and resets the nCyclesRecalc
* threshold counter.
*/
this.setSpeed();
if (this.cmp) this.cmp.start(this.aCounts.msStartRun, this.getCycles());
this.aFlags.fRunning = true;
this.aFlags.fStarting = true;
if (this.chipset) this.chipset.setSpeaker();
var controlRun = this.bindings["run"];
if (controlRun) controlRun.textContent = "Halt";
this.updateStatus(true);
if (fSetFocus) this.setFocus();
}
};
/**
* stepCPU(nMinCycles)
*
* This will be implemented by the X86CPU component.
*
* @this {CPU}
* @param {number} nMinCycles (0 implies a single-step, and therefore breakpoints should be ignored)
* @return {number} of cycles executed; 0 indicates that the last instruction was not executed
*/
CPU.prototype.stepCPU = function(nMinCycles)
{
return 0;
};
/**
* stopCPU(fComplete)
*
* For use by any component that wants to stop the CPU.
*
* This similar to yieldCPU(), but it doesn't need to zero nCyclesNextYield to break out of runCPU();
* it simply needs to clear fRunning (well, "simply" may be oversimplifying a bit....)
*
* @this {CPU}
* @param {boolean} [fComplete]
*/
CPU.prototype.stopCPU = function(fComplete)
{
this.isBusy(true);
this.nBurstCycles -= this.nStepCycles;
this.nStepCycles = 0;
this.addCycles(this.nRunCycles);
this.nRunCycles = 0;
if (this.aFlags.fRunning) {
this.aFlags.fRunning = false;
if (this.chipset) this.chipset.setSpeaker();
var controlRun = this.bindings["run"];
if (controlRun) controlRun.textContent = "Run";
}
this.aFlags.fComplete = fComplete;
};
/**
* updateCPU()
*
* This used to be performed at the end of every stepCPU(), but runCPU() -- which relies upon
* stepCPU() -- needed to have more control over when these updates are performed. However, for
* other callers of stepCPU(), such as the Debugger, the combination of stepCPU() + updateCPU()
* provides the old behavior.
*
* @this {CPU}
*/
CPU.prototype.updateCPU = function()
{
this.updateVideo();
this.updateStatus();
};
/**
* yieldCPU()
*
* Similar to stopCPU() with regard to how it resets various cycle countdown values, but the CPU
* remains in a "running" state.
*
* @this {CPU}
*/
CPU.prototype.yieldCPU = function()
{
this.aCounts.nCyclesNextYield = 0; // this will break us out of runCPU(), once we break out of stepCPU()
this.nBurstCycles -= this.nStepCycles;
this.nStepCycles = 0; // this will break us out of stepCPU()
if (DEBUG) this.nSnapCycles = this.nBurstCycles;
/*
* The Debugger calls yieldCPU() after every message() to ensure browser responsiveness, but it looks
* odd for those messages to show CPU state changes but for the CPU's own status display to not (ditto
* for the Video display), so I've added this call to try to keep things looking synchronized.
*/
this.updateCPU();
};
if (typeof module !== 'undefined') module.exports = CPU;
/**
* @fileoverview Implements the PCjs Debugger component.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-Jun-21
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
if (DEBUGGER) {
if (typeof module !== 'undefined') {
var str = require("../../shared/lib/strlib");
var usr = require("../../shared/lib/usrlib");
var web = require("../../shared/lib/weblib");
var Component = require("../../shared/lib/component");
var Interrupts = require("./interrupts");
var Messages = require("./messages");
var Bus = require("./bus");
var Memory = require("./memory");
var Keyboard = require("./keyboard");
var State = require("./state");
var CPU = require("./cpu");
var X86 = require("./x86");
var X86Seg = require("./x86seg");
}
}
/**
* Debugger Address Object
*
* When off is null, the entire address is considered invalid.
*
* When sel is null, addr must be set to a valid linear address.
*
* When addr is null (or reset to null), it will be recomputed from sel:off.
*
* NOTE: I originally tried to define DbgAddr as a record typedef, which allowed me to reference the type
* as {DbgAddr} instead of {{DbgAddr}}, but my IDE (WebStorm) did not recognize all instances of {DbgAddr}.
* Using this @class definition is a bit cleaner, and it makes both WebStorm and the Closure Compiler happier,
* at the expense of making all references {{DbgAddr}}. Defining a typedef based on this class doesn't help.
*
* @class DbgAddr
* @property {number|null|undefined} off (offset, if any)
* @property {number|null|undefined} sel (selector, if any)
* @property {number|null|undefined} addr (linear address, if any)
* @property {boolean|undefined} fData32 (true if 32-bit operand size in effect)
* @property {boolean|undefined} fAddr32 (true if 32-bit address size in effect)
* @property {boolean|undefined} fOverride (true if any overrides were processed with this address)
* @property {boolean|undefined} fComplete (true if a complete instruction was processed with this address)
* @property {boolean|undefined} fTempBreak (true if this is a temporary breakpoint address)
*/
/**
* Debugger(parmsDbg)
*
* @constructor
* @extends Component
* @param {Object} parmsDbg
*
* The Debugger component supports the following optional (parmsDbg) properties:
*
* commands: string containing zero or more commands, separated by ';'
*
* messages: string containing zero or more message categories to enable;
* multiple categories must be separated by '|' or ';'. Parsed by messageInit().
*
* The Debugger component is an optional component that implements a variety of user
* commands for controlling the CPU, dumping and editing memory, etc.
*/
function Debugger(parmsDbg)
{
if (DEBUGGER) {
Component.call(this, "Debugger", parmsDbg, Debugger);
/*
* These keep track of instruction activity, but only when tracing or when Debugger checks
* have been enabled (eg, one or more breakpoints have been set).
*
* They are zeroed by the reset() notification handler. cInstructions is advanced by
* stepCPU() and checkInstruction() calls. nCycles is updated by every stepCPU() or stop()
* call and simply represents the number of cycles performed by the last run of instructions.
*/
this.nCycles = -1;
this.cInstructions = -1;
/*
* Default number of hex chars in a register and a linear address (ie, for real-mode);
* updated by initBus().
*/
this.cchReg = 4;
this.maskReg = 0xffff;
this.cchAddr = 5;
this.maskAddr = 0xfffff;
/*
* Most commands that require an address call parseAddr(), which defaults to dbgAddrNextCode
* or dbgAddrNextData when no address has been given. doDump() and doUnassemble(), in turn,
* update dbgAddrNextData and dbgAddrNextCode, respectively, when they're done.
*
* All dbgAddr variables contain properties off, sel, and addr, where sel:off represents the
* segmented address and addr is the corresponding linear address (if known). For certain
* segmented addresses (eg, breakpoint addresses), we pre-compute the linear address and save
* that in addr, so that the breakpoint will still operate as intended even if the mode changes
* later (eg, from real-mode to protected-mode).
*
* Finally, for TEMPORARY breakpoint addresses, we set fTempBreak to true, so that they can be
* automatically cleared when they're hit.
*/
this.dbgAddrNextCode = this.newAddr();
this.dbgAddrNextData = this.newAddr();
/*
* This maintains command history. New commands are inserted at index 0 of the array.
* When Enter is pressed on an empty input buffer, we default to the command at aPrevCmds[0].
*/
this.iPrevCmd = -1;
this.aPrevCmds = [];
/*
* fAssemble is true when "assemble mode" is active, false when not.
*/
this.fAssemble = false;
this.dbgAddrAssemble = this.newAddr();
/*
* aSymbolTable is an array of 4-element arrays, one per ROM or other chunk of address space.
* Each 4-element arrays contains:
*
* [0]: addr
* [1]: size
* [2]: aSymbols
* [3]: aOffsetPairs
*
* See addSymbols() for more details, since that's how callers add sets of symbols to the table.
*/
this.aSymbolTable = [];
/*
* clearBreakpoints() initializes the breakpoints lists: aBreakExec is a list of addresses
* to halt on whenever attempting to execute an instruction at the corresponding address,
* and aBreakRead and aBreakWrite are lists of addresses to halt on whenever a read or write,
* respectively, occurs at the corresponding address.
*/
this.clearBreakpoints();
/*
* Execution history is allocated by historyInit() whenever checksEnabled() conditions change.
* Execution history is updated whenever the CPU calls checkInstruction(), which will happen
* only when checksEnabled() returns true (eg, whenever one or more breakpoints have been set).
* This ensures that, by default, the CPU runs as fast as possible.
*/
this.historyInit();
/*
* Initialize Debugger message support
*/
this.messageInit(parmsDbg['messages']);
/*
* The instruction trace buffer is a lightweight logging mechanism with minimal impact
* on the browser (unlike printing to either console.log or an HTML control, which can
* make the browser unusable if printing is too frequent). The Debugger's info command
* ("n dump [#]") dumps this buffer. Note that dumping too much at once can also bog
* things down, but by that point, you've presumably already captured the info you need
* and are willing to wait.
*/
if (DEBUG) this.traceInit();
this.sInitCommands = parmsDbg['commands'];
/*
* Make it easier to access Debugger commands from an external REPL (eg, the WebStorm
* "live" console window); eg:
*
* $('r')
* $('dw 0:0')
* $('h')
* ...
*/
var dbg = this;
if (window) {
if (window['$'] === undefined) {
window['$'] = function(s) { return dbg.doCommand(s); };
}
} else {
if (global['$'] === undefined) {
global['$'] = function(s) { return dbg.doCommand(s); };
}
}
} // endif DEBUGGER
}
if (DEBUGGER) {
Component.subclass(Debugger);
/*
* Information regarding interrupts of interest (used by messageInt() and others)
*/
Debugger.INT_MESSAGES = {
0x10: Messages.VIDEO,
0x13: Messages.FDC,
0x15: Messages.CHIPSET,
0x16: Messages.KEYBOARD,
// 0x1a: Messages.RTC, // ChipSet contains its own custom messageInt() handler for the RTC
0x1c: Messages.TIMER,
0x21: Messages.DOS,
0x33: Messages.MOUSE
};
Debugger.COMMANDS = {
'?': "help",
'a [#]': "assemble",
'b [#]': "breakpoint",
'c': "clear output",
'd [#]': "dump memory",
'e [#]': "edit memory",
'f': "frequencies",
'g [#]': "go [to #]",
'h [#]': "halt/history",
'i [#]': "input port #",
'k': "stack trace",
'l': "load sector(s)",
'm': "messages",
'o [#]': "output port #",
'p': "step over",
'r': "dump/edit registers",
't [#]': "step instruction(s)",
'u [#]': "unassemble",
'x': "execution options",
'reset': "reset computer",
'ver': "display version"
};
/*
* Address types for parseAddr(), to help choose between dbgAddrNextCode and dbgAddrNextData
*/
Debugger.ADDR_CODE = 1;
Debugger.ADDR_DATA = 2;
/*
* Instruction ordinals
*/
Debugger.INS = {
NONE: 0, AAA: 1, AAD: 2, AAM: 3, AAS: 4, ADC: 5, ADD: 6, AND: 7,
ARPL: 8, AS: 9, BOUND: 10, BSF: 11, BSR: 12, BT: 13, BTC: 14, BTR: 15,
BTS: 16, CALL: 17, CBW: 18, CLC: 19, CLD: 20, CLI: 21, CLTS: 22, CMC: 23,
CMP: 24, CMPSB: 25, CMPSW: 26, CS: 27, CWD: 28, DAA: 29, DAS: 30, DEC: 31,
DIV: 32, DS: 33, ENTER: 34, ES: 35, ESC: 36, FADD: 37, FBLD: 38, FBSTP: 39,
FCOM: 40, FCOMP: 41, FDIV: 42, FDIVR: 43, FIADD: 44, FICOM: 45, FICOMP: 46, FIDIV: 47,
FIDIVR: 48, FILD: 49, FIMUL: 50, FIST: 51, FISTP: 52, FISUB: 53, FISUBR: 54, FLD: 55,
FLDCW: 56, FLDENV: 57, FMUL: 58, FNSAVE: 59, FNSTCW: 60, FNSTENV:61, FNSTSW: 62, FRSTOR: 63,
FS: 64, FST: 65, FSTP: 66, FSUB: 67, FSUBR: 68, GS: 69, HLT: 70, IDIV: 71,
IMUL: 72, IN: 73, INC: 74, INS: 75, INT: 76, INT3: 77, INTO: 78, IRET: 79,
JBE: 80, JC: 81, JCXZ: 82, JG: 83, JGE: 84, JL: 85, JLE: 86, JMP: 87,
JA: 88, JNC: 89, JNO: 90, JNP: 91, JNS: 92, JNZ: 93, JO: 94, JP: 95,
JS: 96, JZ: 97, LAHF: 98, LAR: 99, LDS: 100, LEA: 101, LEAVE: 102, LES: 103,
LFS: 104, LGDT: 105, LGS: 106, LIDT: 107, LLDT: 108, LMSW: 109, LOADALL:110, LOCK: 111,
LODSB: 112, LODSW: 113, LOOP: 114, LOOPNZ: 115, LOOPZ: 116, LSL: 117, LSS: 118, LTR: 119,
MOV: 120, MOVSB: 121, MOVSW: 122, MOVSX: 123, MOVZX: 124, MUL: 125, NEG: 126, NOP: 127,
NOT: 128, OR: 129, OS: 130, OUT: 131, OUTS: 132, POP: 133, POPA: 134, POPF: 135,
PUSH: 136, PUSHA: 137, PUSHF: 138, RCL: 139, RCR: 140, REPNZ: 141, REPZ: 142, RET: 143,
RETF: 144, ROL: 145, ROR: 146, SAHF: 147, SALC: 148, SAR: 149, SBB: 150, SCASB: 151,
SCASW: 152, SETBE: 153, SETC: 154, SETG: 155, SETGE: 156, SETL: 157, SETLE: 158, SETNBE: 159,
SETNC: 160, SETNO: 161, SETNP: 162, SETNS: 163, SETNZ: 164, SETO: 165, SETP: 166, SETS: 167,
SETZ: 168, SGDT: 169, SHL: 170, SHLD: 171, SHR: 172, SHRD: 173, SIDT: 174, SLDT: 175,
SMSW: 176, SS: 177, STC: 178, STD: 179, STI: 180, STOSB: 181, STOSW: 182, STR: 183,
SUB: 184, TEST: 185, VERR: 186, VERW: 187, WAIT: 188, XCHG: 189, XLAT: 190, XOR: 191,
GRP1B: 192, GRP1W: 193, GRP1SW: 194, GRP2B: 195, GRP2W: 196, GRP2B1: 197, GRP2W1: 198, GRP2BC: 199,
GRP2WC: 200, GRP3B: 201, GRP3W: 202, GRP4B: 203, GRP4W: 204, OP0F: 205, GRP6: 206, GRP7: 207,
GRP8: 208
};
/*
* Instruction names (mnemonics), indexed by instruction ordinal (above)
*/
Debugger.INS_NAMES = [
"INVALID","AAA", "AAD", "AAM", "AAS", "ADC", "ADD", "AND",
"ARPL", "AS:", "BOUND", "BSF", "BSR", "BT", "BTC", "BTR",
"BTS", "CALL", "CBW", "CLC", "CLD", "CLI", "CLTS", "CMC",
"CMP", "CMPSB", "CMPSW", "CS:", "CWD", "DAA", "DAS", "DEC",
"DIV", "DS:", "ENTER", "ES:", "ESC", "FADD", "FBLD", "FBSTP",
"FCOM", "FCOMP", "FDIV", "FDIVR", "FIADD", "FICOM", "FICOMP", "FIDIV",
"FIDIVR", "FILD", "FIMUL", "FIST", "FISTP", "FISUB", "FISUBR", "FLD",
"FLDCW", "FLDENV", "FMUL", "FNSAVE", "FNSTCW", "FNSTENV","FNSTSW", "FRSTOR",
"FS:", "FST", "FSTP", "FSUB", "FSUBR", "GS:", "HLT", "IDIV",
"IMUL", "IN", "INC", "INS", "INT", "INT3", "INTO", "IRET",
"JBE", "JC", "JCXZ", "JG", "JGE", "JL", "JLE", "JMP",
"JA", "JNC", "JNO", "JNP", "JNS", "JNZ", "JO", "JP",
"JS", "JZ", "LAHF", "LAR", "LDS", "LEA", "LEAVE", "LES",
"LFS", "LGDT", "LGS", "LIDT", "LLDT", "LMSW", "LOADALL","LOCK",
"LODSB", "LODSW", "LOOP", "LOOPNZ", "LOOPZ", "LSL", "LSS", "LTR",
"MOV", "MOVSB", "MOVSW", "MOVSX", "MOVZX", "MUL", "NEG", "NOP",
"NOT", "OR", "OS:", "OUT", "OUTS", "POP", "POPA", "POPF",
"PUSH", "PUSHA", "PUSHF", "RCL", "RCR", "REPNZ", "REPZ", "RET",
"RETF", "ROL", "ROR", "SAHF", "SALC", "SAR", "SBB", "SCASB",
"SCASW", "SETBE", "SETC", "SETG", "SETGE", "SETL", "SETLE", "SETNBE",
"SETNC", "SETNO", "SETNP", "SETNS", "SETNZ", "SETO", "SETP", "SETS",
"SETZ", "SGDT", "SHL", "SHLD", "SHR", "SHRD", "SIDT", "SLDT",
"SMSW", "SS:", "STC", "STD", "STI", "STOSB", "STOSW", "STR",
"SUB", "TEST", "VERR", "VERW", "WAIT", "XCHG", "XLAT", "XOR"
];
Debugger.CPU_8086 = 0;
Debugger.CPU_80186 = 1;
Debugger.CPU_80286 = 2;
Debugger.CPU_80386 = 3;
Debugger.CPUS = [8086, 80186, 80286, 80386];
/*
* ModRM masks and definitions
*/
Debugger.REG_AL = 0x00; // bits 0-2 are standard Reg encodings
Debugger.REG_CL = 0x01;
Debugger.REG_DL = 0x02;
Debugger.REG_BL = 0x03;
Debugger.REG_AH = 0x04;
Debugger.REG_CH = 0x05;
Debugger.REG_DH = 0x06;
Debugger.REG_BH = 0x07;
Debugger.REG_AX = 0x08;
Debugger.REG_CX = 0x09;
Debugger.REG_DX = 0x0A;
Debugger.REG_BX = 0x0B;
Debugger.REG_SP = 0x0C;
Debugger.REG_BP = 0x0D;
Debugger.REG_SI = 0x0E;
Debugger.REG_DI = 0x0F;
Debugger.REG_SEG = 0x10;
Debugger.REG_IP = 0x16;
Debugger.REG_PS = 0x17;
Debugger.REG_EAX = 0x18;
Debugger.REG_ECX = 0x19;
Debugger.REG_EDX = 0x1A;
Debugger.REG_EBX = 0x1B;
Debugger.REG_ESP = 0x1C;
Debugger.REG_EBP = 0x1D;
Debugger.REG_ESI = 0x1E;
Debugger.REG_EDI = 0x1F;
Debugger.REG_CR0 = 0x20;
Debugger.REG_CR1 = 0x21;
Debugger.REG_CR2 = 0x22;
Debugger.REG_CR3 = 0x23;
Debugger.REGS = [
"AL", "CL", "DL", "BL", "AH", "CH", "DH", "BH",
"AX", "CX", "DX", "BX", "SP", "BP", "SI", "DI",
"ES", "CS", "SS", "DS", "FS", "GS", "IP", "PS",
"EAX", "ECX", "EDX", "EBX", "ESP", "EBP", "ESI", "EDI",
"CR0", "CR1", "CR2", "CR3"
];
Debugger.REG_ES = 0x00; // bits 0-1 are standard SegReg encodings
Debugger.REG_CS = 0x01;
Debugger.REG_SS = 0x02;
Debugger.REG_DS = 0x03;
Debugger.REG_FS = 0x04;
Debugger.REG_GS = 0x05;
Debugger.REG_UNKNOWN = 0x00;
Debugger.MOD_NODISP = 0x00; // use RM below, no displacement
Debugger.MOD_DISP8 = 0x01; // use RM below + 8-bit displacement
Debugger.MOD_DISP16 = 0x02; // use RM below + 16-bit displacement
Debugger.MOD_REGISTER = 0x03; // use REG above
Debugger.RM_BXSI = 0x00;
Debugger.RM_BXDI = 0x01;
Debugger.RM_BPSI = 0x02;
Debugger.RM_BPDI = 0x03;
Debugger.RM_SI = 0x04;
Debugger.RM_DI = 0x05;
Debugger.RM_BP = 0x06;
Debugger.RM_IMMOFF = Debugger.RM_BP; // only if MOD_NODISP
Debugger.RM_BX = 0x07;
Debugger.RMS = [
"BX+SI", "BX+DI", "BP+SI", "BP+DI", "SI", "DI", "BP", "BX",
"EAX", "ECX", "EDX", "EBX", "ESP", "EBP", "ESI", "EDI"
];
/*
* Operand type descriptor masks and definitions
*
* Note that the letters in () in the comments refer to Intel's
* nomenclature used in Appendix A of the 80386 Programmers Reference Manual.
*/
Debugger.TYPE_SIZE = 0x000F; // size field
Debugger.TYPE_MODE = 0x00F0; // mode field
Debugger.TYPE_IREG = 0x0F00; // implied register field
Debugger.TYPE_OTHER = 0xF000; // "other" field
/*
* TYPE_SIZE values. Some of the values (eg, TYPE_WORDIB and TYPE_WORDIW)
* imply the presence of a third operand, for those weird cases....
*/
Debugger.TYPE_NONE = 0x0000; // (all other TYPE fields ignored)
Debugger.TYPE_BYTE = 0x0001; // (b) byte, regardless of operand size
Debugger.TYPE_SBYTE = 0x0002; // byte sign-extended to word
Debugger.TYPE_WORD = 0x0003; // (w) word, regardless...
Debugger.TYPE_VWORD = 0x0004; // (v) word or double-word, depending...
Debugger.TYPE_DWORD = 0x0005; // (d) double-word, regardless...
Debugger.TYPE_SEGP = 0x0006; // (p) 32-bit or 48-bit pointer
Debugger.TYPE_FARP = 0x0007; // (p) 32-bit or 48-bit pointer for JMP/CALL
Debugger.TYPE_2WORD = 0x0008; // (a) two memory operands (BOUND only)
Debugger.TYPE_DESC = 0x0009; // (s) 6 byte pseudo-descriptor
Debugger.TYPE_WORDIB = 0x000A; // two source operands (eg, IMUL)
Debugger.TYPE_WORDIW = 0x000B; // two source operands (eg, IMUL)
Debugger.TYPE_PREFIX = 0x000F; // (treat similarly to TYPE_NONE)
/*
* TYPE_MODE values. Order is somewhat important, as all values implying
* the presence of a ModRM byte are assumed to be >= TYPE_MODRM.
*/
Debugger.TYPE_IMM = 0x0000; // (I) immediate data
Debugger.TYPE_ONE = 0x0010; // implicit 1 (eg, shifts/rotates)
Debugger.TYPE_IMMOFF = 0x0020; // (A) immediate offset
Debugger.TYPE_IMMREL = 0x0030; // (J) immediate relative
Debugger.TYPE_DSSI = 0x0040; // (X) memory addressed by DS:SI
Debugger.TYPE_ESDI = 0x0050; // (Y) memory addressed by ES:DI
Debugger.TYPE_IMPREG = 0x0060; // implicit register in TYPE_IREG
Debugger.TYPE_IMPSEG = 0x0070; // implicit segment register in TYPE_IREG
Debugger.TYPE_MODRM = 0x0080; // (E) standard ModRM decoding
Debugger.TYPE_MEM = 0x0090; // (M) ModRM refers to memory only
Debugger.TYPE_REG = 0x00A0; // (G) standard Reg decoding
Debugger.TYPE_SEGREG = 0x00B0; // (S) Reg selects segment register
Debugger.TYPE_MODREG = 0x00C0; // (R) Mod refers to register only
Debugger.TYPE_CTLREG = 0x00D0; // (C) Reg selects control register
Debugger.TYPE_DBGREG = 0x00E0; // (D) Reg selects debug register
Debugger.TYPE_TSTREG = 0x00F0; // (T) Reg selects test register
/*
* TYPE_IREG values, based on the REG_* constants.
* For convenience, they include TYPE_IMPREG or TYPE_IMPSEG as appropriate.
*/
Debugger.TYPE_AL = (Debugger.REG_AL << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_BYTE);
Debugger.TYPE_CL = (Debugger.REG_CL << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_BYTE);
Debugger.TYPE_DL = (Debugger.REG_DL << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_BYTE);
Debugger.TYPE_BL = (Debugger.REG_BL << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_BYTE);
Debugger.TYPE_AH = (Debugger.REG_AH << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_BYTE);
Debugger.TYPE_CH = (Debugger.REG_CH << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_BYTE);
Debugger.TYPE_DH = (Debugger.REG_DH << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_BYTE);
Debugger.TYPE_BH = (Debugger.REG_BH << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_BYTE);
Debugger.TYPE_AX = (Debugger.REG_AX << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_VWORD);
Debugger.TYPE_CX = (Debugger.REG_CX << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_VWORD);
Debugger.TYPE_DX = (Debugger.REG_DX << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_VWORD);
Debugger.TYPE_BX = (Debugger.REG_BX << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_VWORD);
Debugger.TYPE_SP = (Debugger.REG_SP << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_VWORD);
Debugger.TYPE_BP = (Debugger.REG_BP << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_VWORD);
Debugger.TYPE_SI = (Debugger.REG_SI << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_VWORD);
Debugger.TYPE_DI = (Debugger.REG_DI << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_VWORD);
Debugger.TYPE_ES = (Debugger.REG_ES << 8 | Debugger.TYPE_IMPSEG | Debugger.TYPE_WORD);
Debugger.TYPE_CS = (Debugger.REG_CS << 8 | Debugger.TYPE_IMPSEG | Debugger.TYPE_WORD);
Debugger.TYPE_SS = (Debugger.REG_SS << 8 | Debugger.TYPE_IMPSEG | Debugger.TYPE_WORD);
Debugger.TYPE_DS = (Debugger.REG_DS << 8 | Debugger.TYPE_IMPSEG | Debugger.TYPE_WORD);
Debugger.TYPE_FS = (Debugger.REG_FS << 8 | Debugger.TYPE_IMPSEG | Debugger.TYPE_WORD);
Debugger.TYPE_GS = (Debugger.REG_GS << 8 | Debugger.TYPE_IMPSEG | Debugger.TYPE_WORD);
/*
* TYPE_OTHER bit definitions
*/
Debugger.TYPE_IN = 0x1000; // operand is input
Debugger.TYPE_OUT = 0x2000; // operand is output
Debugger.TYPE_BOTH = (Debugger.TYPE_IN | Debugger.TYPE_OUT);
Debugger.TYPE_8086 = (Debugger.CPU_8086 << 14);
Debugger.TYPE_80186 = (Debugger.CPU_80186 << 14);
Debugger.TYPE_80286 = (Debugger.CPU_80286 << 14);
Debugger.TYPE_80386 = (Debugger.CPU_80386 << 14);
Debugger.TYPE_CPU_SHIFT = 14;
/*
* Message categories supported by the messageEnabled() function and other assorted message
* functions. Each category has a corresponding bit value that can be combined (ie, OR'ed) as
* needed. The Debugger's message command ("m") is used to turn message categories on and off,
* like so:
*
* m port on
* m port off
* ...
*
* NOTE: The order of these categories can be rearranged, alphabetized, etc, as desired; just be
* aware that changing the bit values could break saved Debugger states (not a huge concern, just
* something to be aware of).
*/
Debugger.MESSAGES = {
"cpu": Messages.CPU,
"seg": Messages.SEG,
"desc": Messages.DESC,
"tss": Messages.TSS,
"int": Messages.INT,
"fault": Messages.FAULT,
"bus": Messages.BUS,
"mem": Messages.MEM,
"port": Messages.PORT,
"dma": Messages.DMA,
"pic": Messages.PIC,
"timer": Messages.TIMER,
"cmos": Messages.CMOS,
"rtc": Messages.RTC,
"8042": Messages.C8042,
"chipset": Messages.CHIPSET, // ie, anything else in ChipSet besides DMA, PIC, TIMER, CMOS, RTC and 8042
"keyboard": Messages.KEYBOARD,
"key": Messages.KEYS, // using "keys" instead of "key" causes an unfortunate JavaScript property collision
"video": Messages.VIDEO,
"fdc": Messages.FDC,
"hdc": Messages.HDC,
"disk": Messages.DISK,
"serial": Messages.SERIAL,
"speaker": Messages.SPEAKER,
"state": Messages.STATE,
"mouse": Messages.MOUSE,
"computer": Messages.COMPUTER,
"dos": Messages.DOS,
"data": Messages.DATA,
"log": Messages.LOG,
"warn": Messages.WARN,
/*
* Now we turn to message actions rather than message types; for example, setting "halt"
* on or off doesn't enable "halt" messages, but rather halts the CPU on any message above.
*/
"halt": Messages.HALT
};
/*
* Instruction trace categories supported by the traceLog() function. The Debugger's info
* command ("n") is used to turn trace categories on and off, like so:
*
* n shl on
* n shl off
* ...
*
* Note that there are usually multiple entries for each category (one for each supported operand size);
* all matching entries are enabled or disabled as a group.
*/
Debugger.TRACE = {
ROLB: {ins: Debugger.INS.ROL, size: 8},
ROLW: {ins: Debugger.INS.ROL, size: 16},
RORB: {ins: Debugger.INS.ROR, size: 8},
RORW: {ins: Debugger.INS.ROR, size: 16},
RCLB: {ins: Debugger.INS.RCL, size: 8},
RCLW: {ins: Debugger.INS.RCL, size: 16},
RCRB: {ins: Debugger.INS.RCR, size: 8},
RCRW: {ins: Debugger.INS.RCR, size: 16},
SHLB: {ins: Debugger.INS.SHL, size: 8},
SHLW: {ins: Debugger.INS.SHL, size: 16},
MULB: {ins: Debugger.INS.MUL, size: 16}, // dst is 8-bit (AL), src is 8-bit (operand), result is 16-bit (AH:AL)
IMULB: {ins: Debugger.INS.IMUL, size: 16}, // dst is 8-bit (AL), src is 8-bit (operand), result is 16-bit (AH:AL)
DIVB: {ins: Debugger.INS.DIV, size: 16}, // dst is 16-bit (AX), src is 8-bit (operand), result is 16-bit (AH:AL, remainder:quotient)
IDIVB: {ins: Debugger.INS.IDIV, size: 16}, // dst is 16-bit (AX), src is 8-bit (operand), result is 16-bit (AH:AL, remainder:quotient)
MULW: {ins: Debugger.INS.MUL, size: 32}, // dst is 16-bit (AX), src is 16-bit (operand), result is 32-bit (DX:AX)
IMULW: {ins: Debugger.INS.IMUL, size: 32}, // dst is 16-bit (AX), src is 16-bit (operand), result is 32-bit (DX:AX)
DIVW: {ins: Debugger.INS.DIV, size: 32}, // dst is 32-bit (DX:AX), src is 16-bit (operand), result is 32-bit (DX:AX, remainder:quotient)
IDIVW: {ins: Debugger.INS.IDIV, size: 32} // dst is 32-bit (DX:AX), src is 16-bit (operand), result is 32-bit (DX:AX, remainder:quotient)
};
Debugger.TRACE_LIMIT = 100000;
/*
* Opcode 0x0F has a distinguished history:
*
* On the 8086, it functioned as POP CS
* On the 80186, it generated an Invalid Opcode (UD_FAULT) exception
* On the 80286, it introduced a new (and growing) series of two-byte opcodes
*
* Based on the active CPU model, we make every effort to execute and disassemble this (and every other)
* opcode appropriately, by setting the opcode's entry in aaOpDescs accordingly. 0x0F in aaOpDescs points
* to the 8086 table: aOpDescPopCS.
*
* Note that we must NOT modify aaOpDescs directly. this.aaOpDescs will point to Debugger.aaOpDescs
* if the processor is an 8086, because that's the processor that the hard-coded contents of the table
* represent; for all other processors, this.aaOpDescs will contain a copy of the table that we can modify.
*/
Debugger.aOpDescPopCS = [Debugger.INS.POP, Debugger.TYPE_CS | Debugger.TYPE_OUT];
Debugger.aOpDescUndefined = [Debugger.INS.NONE, Debugger.TYPE_NONE];
Debugger.aOpDesc0F = [Debugger.INS.OP0F, Debugger.TYPE_WORD | Debugger.TYPE_BOTH];
/*
* The aaOpDescs array is indexed by opcode, and each element is a sub-array (aOpDesc) that describes
* the corresponding opcode. The sub-elements are as follows:
*
* [0]: {number} of the opcode name (see INS.*)
* [1]: {number} containing the destination operand descriptor bit(s), if any
* [2]: {number} containing the source operand descriptor bit(s), if any
* [3]: {number} containing the occasional third operand descriptor bit(s), if any
*
* These sub-elements are all optional. If [0] is not present, the opcode is undefined; if [1] is not
* present (or contains zero), the opcode has no (or only implied) operands; if [2] is not present, the
* opcode has only a single operand. And so on.
*/
Debugger.aaOpDescs = [
/* 0x00 */ [Debugger.INS.ADD, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_REG | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x01 */ [Debugger.INS.ADD, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x02 */ [Debugger.INS.ADD, Debugger.TYPE_REG | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x03 */ [Debugger.INS.ADD, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x04 */ [Debugger.INS.ADD, Debugger.TYPE_AL | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x05 */ [Debugger.INS.ADD, Debugger.TYPE_AX | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x06 */ [Debugger.INS.PUSH, Debugger.TYPE_ES | Debugger.TYPE_IN],
/* 0x07 */ [Debugger.INS.POP, Debugger.TYPE_ES | Debugger.TYPE_OUT],
/* 0x08 */ [Debugger.INS.OR, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_REG | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x09 */ [Debugger.INS.OR, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x0A */ [Debugger.INS.OR, Debugger.TYPE_REG | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x0B */ [Debugger.INS.OR, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x0C */ [Debugger.INS.OR, Debugger.TYPE_AL | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x0D */ [Debugger.INS.OR, Debugger.TYPE_AX | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x0E */ [Debugger.INS.PUSH, Debugger.TYPE_CS | Debugger.TYPE_IN],
/* 0x0F */ Debugger.aOpDescPopCS,
/* 0x10 */ [Debugger.INS.ADC, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_REG | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x11 */ [Debugger.INS.ADC, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x12 */ [Debugger.INS.ADC, Debugger.TYPE_REG | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x13 */ [Debugger.INS.ADC, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x14 */ [Debugger.INS.ADC, Debugger.TYPE_AL | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x15 */ [Debugger.INS.ADC, Debugger.TYPE_AX | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x16 */ [Debugger.INS.PUSH, Debugger.TYPE_SS | Debugger.TYPE_IN],
/* 0x17 */ [Debugger.INS.POP, Debugger.TYPE_SS | Debugger.TYPE_OUT],
/* 0x18 */ [Debugger.INS.SBB, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_REG | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x19 */ [Debugger.INS.SBB, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x1A */ [Debugger.INS.SBB, Debugger.TYPE_REG | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x1B */ [Debugger.INS.SBB, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x1C */ [Debugger.INS.SBB, Debugger.TYPE_AL | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x1D */ [Debugger.INS.SBB, Debugger.TYPE_AX | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x1E */ [Debugger.INS.PUSH, Debugger.TYPE_DS | Debugger.TYPE_IN],
/* 0x1F */ [Debugger.INS.POP, Debugger.TYPE_DS | Debugger.TYPE_OUT],
/* 0x20 */ [Debugger.INS.AND, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_REG | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x21 */ [Debugger.INS.AND, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x22 */ [Debugger.INS.AND, Debugger.TYPE_REG | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x23 */ [Debugger.INS.AND, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x24 */ [Debugger.INS.AND, Debugger.TYPE_AL | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x25 */ [Debugger.INS.AND, Debugger.TYPE_AX | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x26 */ [Debugger.INS.ES, Debugger.TYPE_PREFIX],
/* 0x27 */ [Debugger.INS.DAA],
/* 0x28 */ [Debugger.INS.SUB, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_REG | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x29 */ [Debugger.INS.SUB, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x2A */ [Debugger.INS.SUB, Debugger.TYPE_REG | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x2B */ [Debugger.INS.SUB, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x2C */ [Debugger.INS.SUB, Debugger.TYPE_AL | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x2D */ [Debugger.INS.SUB, Debugger.TYPE_AX | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x2E */ [Debugger.INS.CS, Debugger.TYPE_PREFIX],
/* 0x2F */ [Debugger.INS.DAS],
/* 0x30 */ [Debugger.INS.XOR, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_REG | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x31 */ [Debugger.INS.XOR, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x32 */ [Debugger.INS.XOR, Debugger.TYPE_REG | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x33 */ [Debugger.INS.XOR, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x34 */ [Debugger.INS.XOR, Debugger.TYPE_AL | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x35 */ [Debugger.INS.XOR, Debugger.TYPE_AX | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x36 */ [Debugger.INS.SS, Debugger.TYPE_PREFIX],
/* 0x37 */ [Debugger.INS.AAA],
/* 0x38 */ [Debugger.INS.CMP, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_IN, Debugger.TYPE_REG | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x39 */ [Debugger.INS.CMP, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x3A */ [Debugger.INS.CMP, Debugger.TYPE_REG | Debugger.TYPE_BYTE | Debugger.TYPE_IN, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x3B */ [Debugger.INS.CMP, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_IN, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x3C */ [Debugger.INS.CMP, Debugger.TYPE_AL | Debugger.TYPE_IN, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x3D */ [Debugger.INS.CMP, Debugger.TYPE_AX | Debugger.TYPE_IN, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x3E */ [Debugger.INS.DS, Debugger.TYPE_PREFIX],
/* 0x3F */ [Debugger.INS.AAS],
/* 0x40 */ [Debugger.INS.INC, Debugger.TYPE_AX | Debugger.TYPE_BOTH],
/* 0x41 */ [Debugger.INS.INC, Debugger.TYPE_CX | Debugger.TYPE_BOTH],
/* 0x42 */ [Debugger.INS.INC, Debugger.TYPE_DX | Debugger.TYPE_BOTH],
/* 0x43 */ [Debugger.INS.INC, Debugger.TYPE_BX | Debugger.TYPE_BOTH],
/* 0x44 */ [Debugger.INS.INC, Debugger.TYPE_SP | Debugger.TYPE_BOTH],
/* 0x45 */ [Debugger.INS.INC, Debugger.TYPE_BP | Debugger.TYPE_BOTH],
/* 0x46 */ [Debugger.INS.INC, Debugger.TYPE_SI | Debugger.TYPE_BOTH],
/* 0x47 */ [Debugger.INS.INC, Debugger.TYPE_DI | Debugger.TYPE_BOTH],
/* 0x48 */ [Debugger.INS.DEC, Debugger.TYPE_AX | Debugger.TYPE_BOTH],
/* 0x49 */ [Debugger.INS.DEC, Debugger.TYPE_CX | Debugger.TYPE_BOTH],
/* 0x4A */ [Debugger.INS.DEC, Debugger.TYPE_DX | Debugger.TYPE_BOTH],
/* 0x4B */ [Debugger.INS.DEC, Debugger.TYPE_BX | Debugger.TYPE_BOTH],
/* 0x4C */ [Debugger.INS.DEC, Debugger.TYPE_SP | Debugger.TYPE_BOTH],
/* 0x4D */ [Debugger.INS.DEC, Debugger.TYPE_BP | Debugger.TYPE_BOTH],
/* 0x4E */ [Debugger.INS.DEC, Debugger.TYPE_SI | Debugger.TYPE_BOTH],
/* 0x4F */ [Debugger.INS.DEC, Debugger.TYPE_DI | Debugger.TYPE_BOTH],
/* 0x50 */ [Debugger.INS.PUSH, Debugger.TYPE_AX | Debugger.TYPE_IN],
/* 0x51 */ [Debugger.INS.PUSH, Debugger.TYPE_CX | Debugger.TYPE_IN],
/* 0x52 */ [Debugger.INS.PUSH, Debugger.TYPE_DX | Debugger.TYPE_IN],
/* 0x53 */ [Debugger.INS.PUSH, Debugger.TYPE_BX | Debugger.TYPE_IN],
/* 0x54 */ [Debugger.INS.PUSH, Debugger.TYPE_SP | Debugger.TYPE_IN],
/* 0x55 */ [Debugger.INS.PUSH, Debugger.TYPE_BP | Debugger.TYPE_IN],
/* 0x56 */ [Debugger.INS.PUSH, Debugger.TYPE_SI | Debugger.TYPE_IN],
/* 0x57 */ [Debugger.INS.PUSH, Debugger.TYPE_DI | Debugger.TYPE_IN],
/* 0x58 */ [Debugger.INS.POP, Debugger.TYPE_AX | Debugger.TYPE_OUT],
/* 0x59 */ [Debugger.INS.POP, Debugger.TYPE_CX | Debugger.TYPE_OUT],
/* 0x5A */ [Debugger.INS.POP, Debugger.TYPE_DX | Debugger.TYPE_OUT],
/* 0x5B */ [Debugger.INS.POP, Debugger.TYPE_BX | Debugger.TYPE_OUT],
/* 0x5C */ [Debugger.INS.POP, Debugger.TYPE_SP | Debugger.TYPE_OUT],
/* 0x5D */ [Debugger.INS.POP, Debugger.TYPE_BP | Debugger.TYPE_OUT],
/* 0x5E */ [Debugger.INS.POP, Debugger.TYPE_SI | Debugger.TYPE_OUT],
/* 0x5F */ [Debugger.INS.POP, Debugger.TYPE_DI | Debugger.TYPE_OUT],
/* 0x60 */ [Debugger.INS.PUSHA, Debugger.TYPE_NONE | Debugger.TYPE_80286],
/* 0x61 */ [Debugger.INS.POPA, Debugger.TYPE_NONE | Debugger.TYPE_80286],
/* 0x62 */ [Debugger.INS.BOUND, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_IN | Debugger.TYPE_80286, Debugger.TYPE_MODRM | Debugger.TYPE_2WORD | Debugger.TYPE_IN],
/* 0x63 */ [Debugger.INS.ARPL, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_OUT, Debugger.TYPE_REG | Debugger.TYPE_WORD | Debugger.TYPE_IN],
/* 0x64 */ [Debugger.INS.FS, Debugger.TYPE_PREFIX | Debugger.TYPE_80386],
/* 0x65 */ [Debugger.INS.GS, Debugger.TYPE_PREFIX | Debugger.TYPE_80386],
/* 0x66 */ [Debugger.INS.OS, Debugger.TYPE_PREFIX | Debugger.TYPE_80386],
/* 0x67 */ [Debugger.INS.AS, Debugger.TYPE_PREFIX | Debugger.TYPE_80386],
/* 0x68 */ [Debugger.INS.PUSH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN | Debugger.TYPE_80286],
/* 0x69 */ [Debugger.INS.IMUL, Debugger.TYPE_REG | Debugger.TYPE_WORD | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_MODRM | Debugger.TYPE_WORDIW | Debugger.TYPE_IN],
/* 0x6A */ [Debugger.INS.PUSH, Debugger.TYPE_IMM | Debugger.TYPE_SBYTE | Debugger.TYPE_IN | Debugger.TYPE_80286],
/* 0x6B */ [Debugger.INS.IMUL, Debugger.TYPE_REG | Debugger.TYPE_WORD | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_MODRM | Debugger.TYPE_WORDIB | Debugger.TYPE_IN],
/* 0x6C */ [Debugger.INS.INS, Debugger.TYPE_ESDI | Debugger.TYPE_BYTE | Debugger.TYPE_OUT | Debugger.TYPE_80286, Debugger.TYPE_DX | Debugger.TYPE_IN],
/* 0x6D */ [Debugger.INS.INS, Debugger.TYPE_ESDI | Debugger.TYPE_VWORD | Debugger.TYPE_OUT | Debugger.TYPE_80286, Debugger.TYPE_DX | Debugger.TYPE_IN],
/* 0x6E */ [Debugger.INS.OUTS, Debugger.TYPE_DX | Debugger.TYPE_IN | Debugger.TYPE_80286, Debugger.TYPE_DSSI | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x6F */ [Debugger.INS.OUTS, Debugger.TYPE_DX | Debugger.TYPE_IN | Debugger.TYPE_80286, Debugger.TYPE_DSSI | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x70 */ [Debugger.INS.JO, Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x71 */ [Debugger.INS.JNO, Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x72 */ [Debugger.INS.JC, Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x73 */ [Debugger.INS.JNC, Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x74 */ [Debugger.INS.JZ, Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x75 */ [Debugger.INS.JNZ, Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x76 */ [Debugger.INS.JBE, Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x77 */ [Debugger.INS.JA, Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x78 */ [Debugger.INS.JS, Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x79 */ [Debugger.INS.JNS, Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x7A */ [Debugger.INS.JP, Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x7B */ [Debugger.INS.JNP, Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x7C */ [Debugger.INS.JL, Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x7D */ [Debugger.INS.JGE, Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x7E */ [Debugger.INS.JLE, Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x7F */ [Debugger.INS.JG, Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x80 */ [Debugger.INS.GRP1B, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x81 */ [Debugger.INS.GRP1W, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x82 */ [Debugger.INS.GRP1B, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x83 */ [Debugger.INS.GRP1SW,Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x84 */ [Debugger.INS.TEST, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_IN, Debugger.TYPE_REG | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x85 */ [Debugger.INS.TEST, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x86 */ [Debugger.INS.XCHG, Debugger.TYPE_REG | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH],
/* 0x87 */ [Debugger.INS.XCHG, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH],
/* 0x88 */ [Debugger.INS.MOV, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_OUT, Debugger.TYPE_REG | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x89 */ [Debugger.INS.MOV, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_OUT, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x8A */ [Debugger.INS.MOV, Debugger.TYPE_REG | Debugger.TYPE_BYTE | Debugger.TYPE_OUT, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0x8B */ [Debugger.INS.MOV, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_OUT, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x8C */ [Debugger.INS.MOV, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_OUT, Debugger.TYPE_SEGREG | Debugger.TYPE_WORD | Debugger.TYPE_IN],
/* 0x8D */ [Debugger.INS.LEA, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_OUT, Debugger.TYPE_MEM | Debugger.TYPE_VWORD],
/* 0x8E */ [Debugger.INS.MOV, Debugger.TYPE_SEGREG | Debugger.TYPE_WORD | Debugger.TYPE_OUT, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0x8F */ [Debugger.INS.POP, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_OUT],
/* 0x90 */ [Debugger.INS.NOP],
/* 0x91 */ [Debugger.INS.XCHG, Debugger.TYPE_AX | Debugger.TYPE_BOTH, Debugger.TYPE_CX | Debugger.TYPE_BOTH],
/* 0x92 */ [Debugger.INS.XCHG, Debugger.TYPE_AX | Debugger.TYPE_BOTH, Debugger.TYPE_DX | Debugger.TYPE_BOTH],
/* 0x93 */ [Debugger.INS.XCHG, Debugger.TYPE_AX | Debugger.TYPE_BOTH, Debugger.TYPE_BX | Debugger.TYPE_BOTH],
/* 0x94 */ [Debugger.INS.XCHG, Debugger.TYPE_AX | Debugger.TYPE_BOTH, Debugger.TYPE_SP | Debugger.TYPE_BOTH],
/* 0x95 */ [Debugger.INS.XCHG, Debugger.TYPE_AX | Debugger.TYPE_BOTH, Debugger.TYPE_BP | Debugger.TYPE_BOTH],
/* 0x96 */ [Debugger.INS.XCHG, Debugger.TYPE_AX | Debugger.TYPE_BOTH, Debugger.TYPE_SI | Debugger.TYPE_BOTH],
/* 0x97 */ [Debugger.INS.XCHG, Debugger.TYPE_AX | Debugger.TYPE_BOTH, Debugger.TYPE_DI | Debugger.TYPE_BOTH],
/* 0x98 */ [Debugger.INS.CBW],
/* 0x99 */ [Debugger.INS.CWD],
/* 0x9A */ [Debugger.INS.CALL, Debugger.TYPE_IMM | Debugger.TYPE_FARP | Debugger.TYPE_IN],
/* 0x9B */ [Debugger.INS.WAIT],
/* 0x9C */ [Debugger.INS.PUSHF],
/* 0x9D */ [Debugger.INS.POPF],
/* 0x9E */ [Debugger.INS.SAHF],
/* 0x9F */ [Debugger.INS.LAHF],
/* 0xA0 */ [Debugger.INS.MOV, Debugger.TYPE_AL | Debugger.TYPE_OUT, Debugger.TYPE_IMMOFF | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0xA1 */ [Debugger.INS.MOV, Debugger.TYPE_AX | Debugger.TYPE_OUT, Debugger.TYPE_IMMOFF | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0xA2 */ [Debugger.INS.MOV, Debugger.TYPE_IMMOFF | Debugger.TYPE_BYTE | Debugger.TYPE_OUT, Debugger.TYPE_AL | Debugger.TYPE_IN],
/* 0xA3 */ [Debugger.INS.MOV, Debugger.TYPE_IMMOFF | Debugger.TYPE_VWORD | Debugger.TYPE_OUT, Debugger.TYPE_AX | Debugger.TYPE_IN],
/* 0xA4 */ [Debugger.INS.MOVSB, Debugger.TYPE_ESDI | Debugger.TYPE_BYTE | Debugger.TYPE_OUT, Debugger.TYPE_DSSI | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0xA5 */ [Debugger.INS.MOVSW, Debugger.TYPE_ESDI | Debugger.TYPE_VWORD | Debugger.TYPE_OUT, Debugger.TYPE_DSSI | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0xA6 */ [Debugger.INS.CMPSB, Debugger.TYPE_ESDI | Debugger.TYPE_BYTE | Debugger.TYPE_IN, Debugger.TYPE_DSSI | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0xA7 */ [Debugger.INS.CMPSW, Debugger.TYPE_ESDI | Debugger.TYPE_VWORD | Debugger.TYPE_IN, Debugger.TYPE_DSSI | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0xA8 */ [Debugger.INS.TEST, Debugger.TYPE_AL | Debugger.TYPE_IN, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0xA9 */ [Debugger.INS.TEST, Debugger.TYPE_AX | Debugger.TYPE_IN, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0xAA */ [Debugger.INS.STOSB, Debugger.TYPE_ESDI | Debugger.TYPE_BYTE | Debugger.TYPE_OUT, Debugger.TYPE_AL | Debugger.TYPE_IN],
/* 0xAB */ [Debugger.INS.STOSW, Debugger.TYPE_ESDI | Debugger.TYPE_VWORD | Debugger.TYPE_OUT, Debugger.TYPE_AX | Debugger.TYPE_IN],
/* 0xAC */ [Debugger.INS.LODSB, Debugger.TYPE_AL | Debugger.TYPE_OUT, Debugger.TYPE_DSSI | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0xAD */ [Debugger.INS.LODSW, Debugger.TYPE_AX | Debugger.TYPE_OUT, Debugger.TYPE_DSSI | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0xAE */ [Debugger.INS.SCASB, Debugger.TYPE_AL | Debugger.TYPE_IN, Debugger.TYPE_ESDI | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0xAF */ [Debugger.INS.SCASW, Debugger.TYPE_AX | Debugger.TYPE_IN, Debugger.TYPE_ESDI | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0xB0 */ [Debugger.INS.MOV, Debugger.TYPE_AL | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0xB1 */ [Debugger.INS.MOV, Debugger.TYPE_CL | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0xB2 */ [Debugger.INS.MOV, Debugger.TYPE_DL | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0xB3 */ [Debugger.INS.MOV, Debugger.TYPE_BL | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0xB4 */ [Debugger.INS.MOV, Debugger.TYPE_AH | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0xB5 */ [Debugger.INS.MOV, Debugger.TYPE_CH | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0xB6 */ [Debugger.INS.MOV, Debugger.TYPE_DH | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0xB7 */ [Debugger.INS.MOV, Debugger.TYPE_BH | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0xB8 */ [Debugger.INS.MOV, Debugger.TYPE_AX | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0xB9 */ [Debugger.INS.MOV, Debugger.TYPE_CX | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0xBA */ [Debugger.INS.MOV, Debugger.TYPE_DX | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0xBB */ [Debugger.INS.MOV, Debugger.TYPE_BX | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0xBC */ [Debugger.INS.MOV, Debugger.TYPE_SP | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0xBD */ [Debugger.INS.MOV, Debugger.TYPE_BP | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0xBE */ [Debugger.INS.MOV, Debugger.TYPE_SI | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0xBF */ [Debugger.INS.MOV, Debugger.TYPE_DI | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0xC0 */ [Debugger.INS.GRP2B, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH | Debugger.TYPE_80186, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0xC1 */ [Debugger.INS.GRP2W, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80186, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0xC2 */ [Debugger.INS.RET, Debugger.TYPE_IMM | Debugger.TYPE_WORD | Debugger.TYPE_IN],
/* 0xC3 */ [Debugger.INS.RET],
/* 0xC4 */ [Debugger.INS.LES, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_OUT, Debugger.TYPE_MEM | Debugger.TYPE_SEGP | Debugger.TYPE_IN],
/* 0xC5 */ [Debugger.INS.LDS, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_OUT, Debugger.TYPE_MEM | Debugger.TYPE_SEGP | Debugger.TYPE_IN],
/* 0xC6 */ [Debugger.INS.MOV, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0xC7 */ [Debugger.INS.MOV, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0xC8 */ [Debugger.INS.ENTER, Debugger.TYPE_IMM | Debugger.TYPE_WORD | Debugger.TYPE_IN | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0xC9 */ [Debugger.INS.LEAVE, Debugger.TYPE_NONE | Debugger.TYPE_80286],
/* 0xCA */ [Debugger.INS.RETF, Debugger.TYPE_IMM | Debugger.TYPE_WORD | Debugger.TYPE_IN],
/* 0xCB */ [Debugger.INS.RETF],
/* 0xCC */ [Debugger.INS.INT3],
/* 0xCD */ [Debugger.INS.INT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0xCE */ [Debugger.INS.INTO],
/* 0xCF */ [Debugger.INS.IRET],
/* 0xD0 */ [Debugger.INS.GRP2B1,Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0xD1 */ [Debugger.INS.GRP2W1,Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0xD2 */ [Debugger.INS.GRP2BC,Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
/* 0xD3 */ [Debugger.INS.GRP2WC,Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
/* 0xD4 */ [Debugger.INS.AAM, Debugger.TYPE_IMM | Debugger.TYPE_BYTE],
/* 0xD5 */ [Debugger.INS.AAD, Debugger.TYPE_IMM | Debugger.TYPE_BYTE],
/* 0xD6 */ [Debugger.INS.SALC],
/* 0xD7 */ [Debugger.INS.XLAT],
/* 0xD8 */ [Debugger.INS.ESC, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0xD9 */ [Debugger.INS.ESC, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0xDA */ [Debugger.INS.ESC, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0xDB */ [Debugger.INS.ESC, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0xDC */ [Debugger.INS.ESC, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0xDD */ [Debugger.INS.ESC, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0xDE */ [Debugger.INS.ESC, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0xDF */ [Debugger.INS.ESC, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0xE0 */ [Debugger.INS.LOOPNZ,Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0xE1 */ [Debugger.INS.LOOPZ, Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0xE2 */ [Debugger.INS.LOOP, Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0xE3 */ [Debugger.INS.JCXZ, Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0xE4 */ [Debugger.INS.IN, Debugger.TYPE_AL | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0xE5 */ [Debugger.INS.IN, Debugger.TYPE_AX | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0xE6 */ [Debugger.INS.OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN, Debugger.TYPE_AL | Debugger.TYPE_IN],
/* 0xE7 */ [Debugger.INS.OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN, Debugger.TYPE_AX | Debugger.TYPE_IN],
/* 0xE8 */ [Debugger.INS.CALL, Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0xE9 */ [Debugger.INS.JMP, Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
/* 0xEA */ [Debugger.INS.JMP, Debugger.TYPE_IMM | Debugger.TYPE_FARP | Debugger.TYPE_IN],
/* 0xEB */ [Debugger.INS.JMP, Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
/* 0xEC */ [Debugger.INS.IN, Debugger.TYPE_AL | Debugger.TYPE_OUT, Debugger.TYPE_DX | Debugger.TYPE_IN],
/* 0xED */ [Debugger.INS.IN, Debugger.TYPE_AX | Debugger.TYPE_OUT, Debugger.TYPE_DX | Debugger.TYPE_IN],
/* 0xEE */ [Debugger.INS.OUT, Debugger.TYPE_DX | Debugger.TYPE_IN, Debugger.TYPE_AL | Debugger.TYPE_IN],
/* 0xEF */ [Debugger.INS.OUT, Debugger.TYPE_DX | Debugger.TYPE_IN, Debugger.TYPE_AX | Debugger.TYPE_IN],
/* 0xF0 */ [Debugger.INS.LOCK, Debugger.TYPE_PREFIX],
/* 0xF1 */ [Debugger.INS.NONE],
/* 0xF2 */ [Debugger.INS.REPNZ, Debugger.TYPE_PREFIX],
/* 0xF3 */ [Debugger.INS.REPZ, Debugger.TYPE_PREFIX],
/* 0xF4 */ [Debugger.INS.HLT],
/* 0xF5 */ [Debugger.INS.CMC],
/* 0xF6 */ [Debugger.INS.GRP3B, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH],
/* 0xF7 */ [Debugger.INS.GRP3W, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH],
/* 0xF8 */ [Debugger.INS.CLC],
/* 0xF9 */ [Debugger.INS.STC],
/* 0xFA */ [Debugger.INS.CLI],
/* 0xFB */ [Debugger.INS.STI],
/* 0xFC */ [Debugger.INS.CLD],
/* 0xFD */ [Debugger.INS.STD],
/* 0xFE */ [Debugger.INS.GRP4B, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH],
/* 0xFF */ [Debugger.INS.GRP4W, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH]
];
Debugger.aaOp0FDescs = {
0x00: [Debugger.INS.GRP6, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_BOTH],
0x01: [Debugger.INS.GRP7, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_BOTH],
0x02: [Debugger.INS.LAR, Debugger.TYPE_REG | Debugger.TYPE_WORD | Debugger.TYPE_OUT | Debugger.TYPE_80286, Debugger.TYPE_MEM | Debugger.TYPE_WORD | Debugger.TYPE_IN],
0x03: [Debugger.INS.LSL, Debugger.TYPE_REG | Debugger.TYPE_WORD | Debugger.TYPE_OUT | Debugger.TYPE_80286, Debugger.TYPE_MEM | Debugger.TYPE_WORD | Debugger.TYPE_IN],
0x05: [Debugger.INS.LOADALL,Debugger.TYPE_80286],
0x06: [Debugger.INS.CLTS, Debugger.TYPE_80286],
0x20: [Debugger.INS.MOV, Debugger.TYPE_REG | Debugger.TYPE_DWORD | Debugger.TYPE_OUT | Debugger.TYPE_80386, Debugger.TYPE_CTLREG | Debugger.TYPE_DWORD | Debugger.TYPE_IN],
0x22: [Debugger.INS.MOV, Debugger.TYPE_CTLREG | Debugger.TYPE_DWORD | Debugger.TYPE_OUT | Debugger.TYPE_80386, Debugger.TYPE_REG | Debugger.TYPE_DWORD | Debugger.TYPE_IN],
0x80: [Debugger.INS.JO, Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN | Debugger.TYPE_80386],
0x81: [Debugger.INS.JNO, Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN | Debugger.TYPE_80386],
0x82: [Debugger.INS.JC, Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN | Debugger.TYPE_80386],
0x83: [Debugger.INS.JNC, Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN | Debugger.TYPE_80386],
0x84: [Debugger.INS.JZ, Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN | Debugger.TYPE_80386],
0x85: [Debugger.INS.JNZ, Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN | Debugger.TYPE_80386],
0x86: [Debugger.INS.JBE, Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN | Debugger.TYPE_80386],
0x87: [Debugger.INS.JA, Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN | Debugger.TYPE_80386],
0x88: [Debugger.INS.JS, Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN | Debugger.TYPE_80386],
0x89: [Debugger.INS.JNS, Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN | Debugger.TYPE_80386],
0x8A: [Debugger.INS.JP, Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN | Debugger.TYPE_80386],
0x8B: [Debugger.INS.JNP, Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN | Debugger.TYPE_80386],
0x8C: [Debugger.INS.JL, Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN | Debugger.TYPE_80386],
0x8D: [Debugger.INS.JGE, Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN | Debugger.TYPE_80386],
0x8E: [Debugger.INS.JLE, Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN | Debugger.TYPE_80386],
0x8F: [Debugger.INS.JG, Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN | Debugger.TYPE_80386],
0x90: [Debugger.INS.SETO, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_OUT | Debugger.TYPE_80386],
0x91: [Debugger.INS.SETNO, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_OUT | Debugger.TYPE_80386],
0x92: [Debugger.INS.SETC, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_OUT | Debugger.TYPE_80386],
0x93: [Debugger.INS.SETNC, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_OUT | Debugger.TYPE_80386],
0x94: [Debugger.INS.SETZ, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_OUT | Debugger.TYPE_80386],
0x95: [Debugger.INS.SETNZ, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_OUT | Debugger.TYPE_80386],
0x96: [Debugger.INS.SETBE, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_OUT | Debugger.TYPE_80386],
0x97: [Debugger.INS.SETNBE, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_OUT | Debugger.TYPE_80386],
0x98: [Debugger.INS.SETS, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_OUT | Debugger.TYPE_80386],
0x99: [Debugger.INS.SETNS, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_OUT | Debugger.TYPE_80386],
0x9A: [Debugger.INS.SETP, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_OUT | Debugger.TYPE_80386],
0x9B: [Debugger.INS.SETNP, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_OUT | Debugger.TYPE_80386],
0x9C: [Debugger.INS.SETL, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_OUT | Debugger.TYPE_80386],
0x9D: [Debugger.INS.SETGE, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_OUT | Debugger.TYPE_80386],
0x9E: [Debugger.INS.SETLE, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_OUT | Debugger.TYPE_80386],
0x9F: [Debugger.INS.SETG, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_OUT | Debugger.TYPE_80386],
0xA0: [Debugger.INS.PUSH, Debugger.TYPE_FS | Debugger.TYPE_IN | Debugger.TYPE_80386],
0xA1: [Debugger.INS.POP, Debugger.TYPE_FS | Debugger.TYPE_OUT | Debugger.TYPE_80386],
0xA3: [Debugger.INS.BT, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN | Debugger.TYPE_80386, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
0xA4: [Debugger.INS.SHLD, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_OUT | Debugger.TYPE_80386, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_IN, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
0xA5: [Debugger.INS.SHLD, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_OUT | Debugger.TYPE_80386, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_IN, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
0xA8: [Debugger.INS.PUSH, Debugger.TYPE_GS | Debugger.TYPE_IN | Debugger.TYPE_80386],
0xA9: [Debugger.INS.POP, Debugger.TYPE_GS | Debugger.TYPE_OUT | Debugger.TYPE_80386],
0xAB: [Debugger.INS.BTS, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_OUT | Debugger.TYPE_80386, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
0xAC: [Debugger.INS.SHRD, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_OUT | Debugger.TYPE_80386, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_IN, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
0xAD: [Debugger.INS.SHRD, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_OUT | Debugger.TYPE_80386, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_IN, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
0xAF: [Debugger.INS.IMUL, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80386, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
0xB2: [Debugger.INS.LSS, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_OUT, Debugger.TYPE_MEM | Debugger.TYPE_SEGP | Debugger.TYPE_IN],
0xB3: [Debugger.INS.BTR, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_OUT | Debugger.TYPE_80386, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
0xB4: [Debugger.INS.LFS, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_OUT, Debugger.TYPE_MEM | Debugger.TYPE_SEGP | Debugger.TYPE_IN],
0xB5: [Debugger.INS.LGS, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_OUT, Debugger.TYPE_MEM | Debugger.TYPE_SEGP | Debugger.TYPE_IN],
0xB6: [Debugger.INS.MOVZX, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_OUT | Debugger.TYPE_80386, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
0xB7: [Debugger.INS.MOVZX, Debugger.TYPE_REG | Debugger.TYPE_DWORD | Debugger.TYPE_OUT | Debugger.TYPE_80386, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_IN],
0xBA: [Debugger.INS.GRP8, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80386, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
0xBB: [Debugger.INS.BTC, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_OUT | Debugger.TYPE_80386, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
0xBC: [Debugger.INS.BSF, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_OUT | Debugger.TYPE_80386, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
0xBD: [Debugger.INS.BSR, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_OUT | Debugger.TYPE_80386, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
0xBE: [Debugger.INS.MOVSX, Debugger.TYPE_REG | Debugger.TYPE_VWORD | Debugger.TYPE_OUT | Debugger.TYPE_80386, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
0xBF: [Debugger.INS.MOVSX, Debugger.TYPE_REG | Debugger.TYPE_DWORD | Debugger.TYPE_OUT | Debugger.TYPE_80386, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_IN]
};
Debugger.aaGrpDescs = [
[
/* GRP1B */
[Debugger.INS.ADD, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.OR, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.ADC, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.SBB, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.AND, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.SUB, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.XOR, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.CMP, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_IN, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN]
],
[
/* GRP1W */
[Debugger.INS.ADD, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
[Debugger.INS.OR, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
[Debugger.INS.ADC, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
[Debugger.INS.SBB, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
[Debugger.INS.AND, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
[Debugger.INS.SUB, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
[Debugger.INS.XOR, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
[Debugger.INS.CMP, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN]
],
[
/* GRP1SW */
[Debugger.INS.ADD, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_SBYTE | Debugger.TYPE_IN],
[Debugger.INS.OR, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_SBYTE | Debugger.TYPE_IN],
[Debugger.INS.ADC, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_SBYTE | Debugger.TYPE_IN],
[Debugger.INS.SBB, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_SBYTE | Debugger.TYPE_IN],
[Debugger.INS.AND, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_SBYTE | Debugger.TYPE_IN],
[Debugger.INS.SUB, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_SBYTE | Debugger.TYPE_IN],
[Debugger.INS.XOR, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_SBYTE | Debugger.TYPE_IN],
[Debugger.INS.CMP, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN, Debugger.TYPE_IMM | Debugger.TYPE_SBYTE | Debugger.TYPE_IN]
],
[
/* GRP2B */
[Debugger.INS.ROL, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.ROR, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.RCL, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.RCR, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.SHL, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.SHR, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
Debugger.aOpDescUndefined,
[Debugger.INS.SAR, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN]
],
[
/* GRP2W */
[Debugger.INS.ROL, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.ROR, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.RCL, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.RCR, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.SHL, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.SHR, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
Debugger.aOpDescUndefined,
[Debugger.INS.SAR, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN]
],
[
/* GRP2B1 */
[Debugger.INS.ROL, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.ROR, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.RCL, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.RCR, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.SHL, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.SHR, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
Debugger.aOpDescUndefined,
[Debugger.INS.SAR, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN]
],
[
/* GRP2W1 */
[Debugger.INS.ROL, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.ROR, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.RCL, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.RCR, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.SHL, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.SHR, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
Debugger.aOpDescUndefined,
[Debugger.INS.SAR, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN]
],
[
/* GRP2BC */
[Debugger.INS.ROL, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
[Debugger.INS.ROR, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
[Debugger.INS.RCL, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
[Debugger.INS.RCR, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
[Debugger.INS.SHL, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
[Debugger.INS.SHR, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
Debugger.aOpDescUndefined,
[Debugger.INS.SAR, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN]
],
[
/* GRP2WC */
[Debugger.INS.ROL, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
[Debugger.INS.ROR, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
[Debugger.INS.RCL, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
[Debugger.INS.RCR, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
[Debugger.INS.SHL, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
[Debugger.INS.SHR, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
Debugger.aOpDescUndefined,
[Debugger.INS.SAR, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN]
],
[
/* GRP3B */
[Debugger.INS.TEST, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_IN, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
Debugger.aOpDescUndefined,
[Debugger.INS.NOT, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH],
[Debugger.INS.NEG, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH],
[Debugger.INS.MUL, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.IMUL, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH],
[Debugger.INS.DIV, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.IDIV, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH]
],
[
/* GRP3W */
[Debugger.INS.TEST, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
Debugger.aOpDescUndefined,
[Debugger.INS.NOT, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH],
[Debugger.INS.NEG, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH],
[Debugger.INS.MUL, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
[Debugger.INS.IMUL, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH],
[Debugger.INS.DIV, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
[Debugger.INS.IDIV, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH]
],
[
/* GRP4B */
[Debugger.INS.INC, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH],
[Debugger.INS.DEC, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH],
Debugger.aOpDescUndefined,
Debugger.aOpDescUndefined,
Debugger.aOpDescUndefined,
Debugger.aOpDescUndefined,
Debugger.aOpDescUndefined,
Debugger.aOpDescUndefined
],
[
/* GRP4W */
[Debugger.INS.INC, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH],
[Debugger.INS.DEC, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH],
[Debugger.INS.CALL, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
[Debugger.INS.CALL, Debugger.TYPE_MODRM | Debugger.TYPE_FARP | Debugger.TYPE_IN],
[Debugger.INS.JMP, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
[Debugger.INS.JMP, Debugger.TYPE_MODRM | Debugger.TYPE_FARP | Debugger.TYPE_IN],
[Debugger.INS.PUSH, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
Debugger.aOpDescUndefined
],
[ /* OP0F */ ],
[
/* GRP6 */
[Debugger.INS.SLDT, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_OUT | Debugger.TYPE_80286],
[Debugger.INS.STR, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_OUT | Debugger.TYPE_80286],
[Debugger.INS.LLDT, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_IN | Debugger.TYPE_80286],
[Debugger.INS.LTR, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_IN | Debugger.TYPE_80286],
[Debugger.INS.VERR, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_IN | Debugger.TYPE_80286],
[Debugger.INS.VERW, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_IN | Debugger.TYPE_80286],
Debugger.aOpDescUndefined,
Debugger.aOpDescUndefined
],
[
/* GRP7 */
[Debugger.INS.SGDT, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_OUT | Debugger.TYPE_80286],
[Debugger.INS.SIDT, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_OUT | Debugger.TYPE_80286],
[Debugger.INS.LGDT, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_IN | Debugger.TYPE_80286],
[Debugger.INS.LIDT, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_IN | Debugger.TYPE_80286],
[Debugger.INS.SMSW, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_OUT | Debugger.TYPE_80286],
Debugger.aOpDescUndefined,
[Debugger.INS.LMSW, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_IN | Debugger.TYPE_80286],
Debugger.aOpDescUndefined
],
[
/* GRP8 */
Debugger.aOpDescUndefined,
Debugger.aOpDescUndefined,
Debugger.aOpDescUndefined,
Debugger.aOpDescUndefined,
[Debugger.INS.BT, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN | Debugger.TYPE_80386, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.BTS, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_OUT | Debugger.TYPE_80386, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.BTR, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_OUT | Debugger.TYPE_80386, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
[Debugger.INS.BTC, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_OUT | Debugger.TYPE_80386, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN]
]
];
Debugger.INT_FUNCS = {
0x13: {
0x00: "disk reset",
0x01: "get status",
0x02: "read drive DL (CH:DH:CL,AL) into ES:BX",
0x03: "write drive DL (CH:DH:CL,AL) from ES:BX",
0x04: "verify drive DL (CH:DH:CL,AL)",
0x05: "format drive DL using ES:BX",
0x08: "read drive DL parameters into ES:DI",
0x15: "get drive DL DASD type",
0x16: "get drive DL change line status",
0x17: "set drive DL DASD type",
0x18: "set drive DL media type"
},
0x15: {
0x80: "open device",
0x81: "close device",
0x82: "program termination",
0x83: "wait CX:DXus for event",
0x84: "joystick support",
0x85: "SYSREQ pressed",
0x86: "wait CX:DXus",
0x87: "move block (CX words)",
0x88: "get extended memory size",
0x89: "processor to virtual mode",
0x90: "device busy loop",
0x91: "interrupt complete flag set"
},
0x21: {
0x00: "terminate program",
0x01: "read character (al) from stdin with echo",
0x02: "write character DL to stdout",
0x03: "read character (al) from stdaux", // eg, COM1
0x04: "write character DL to stdaux", // eg, COM1
0x05: "write character DL to stdprn", // eg, LPT1
0x06: "direct console output (input if DL=FF)",
0x07: "direct console input without echo",
0x08: "read character (al) from stdin without echo",
0x09: "write $-terminated string DS:DX to stdout",
0x0A: "buffered input (ds:dx)", // byte 0 is maximum chars, byte 1 is number of previous characters, byte 2 is number of characters read
0x0B: "get stdin status",
0x0C: "flush buffer and read stdin", // AL is a function # (0x01, 0x06, 0x07, 0x08, or 0x0A)
0x0D: "disk reset",
0x0E: "select default drive DL", // returns # of available drives in AL
0x0F: "open file using fcb DS:DX", // DS:DX -> unopened File Control Block
0x10: "close file using fcb DS:DX",
0x11: "find first matching file using fcb DS:DX",
0x12: "find next matching file using fcb DS:DX",
0x13: "delete file using fcb DS:DX",
0x14: "sequential read from file using fcb DS:DX",
0x15: "sequential write to file using fcb DS:DX",
0x16: "create or truncate file using fcb DS:DX",
0x17: "rename file using fcb DS:DX",
0x19: "get current default drive (al)",
0x1A: "set disk transfer area (dta) DS:DX",
0x1B: "get allocation information for default drive",
0x1C: "get allocation information for specific drive DL",
0x1F: "get drive parameter block for default drive",
0x21: "read random record from file using fcb DS:DX",
0x22: "write random record to file using fcb DS:DX",
0x23: "get file size using fcb DS:DX",
0x24: "set random record number for fcb DS:DX",
0x25: "set address DS:DX of interrupt vector AL",
0x26: "create new program segment prefix (psp) at segment DX",
0x27: "random block read from file using fcb DS:DX",
0x28: "random block write to file using fcb DS:DX",
0x29: "parse filename DS:SI into fcb ES:DI using AL",
0x2A: "get system date (year=cx, mon=dh, day=dl)",
0x2B: "set system date (year=CX, mon=DH, day=DL)",
0x2C: "get system time (hour=ch, min=cl, sec=dh, 100ths=dl)",
0x2D: "set system time (hour=CH, min=CL, sec=DH, 100ths=DL)",
0x2E: "set verify flag AL",
0x2F: "get disk transfer area address (es:bx)", // DOS 2.00+
0x30: "get DOS version (al=major, ah=minor)",
0x31: "terminate and stay resident",
0x32: "get drive parameter block (dpb=ds:bx) for drive DL",
0x33: "extended break check",
0x34: "get address (es:bx) of InDOS flag",
0x35: "get address (es:bx) of interrupt vector AL",
0x36: "get free disk space of drive DL",
0x37: "get(0)/set(1) switch character DL (AL)",
0x38: "get country-specific information",
0x39: "create subdirectory DS:DX",
0x3A: "remove subdirectory DS:DX",
0x3B: "set current directory DS:DX",
0x3C: "create or truncate file DS:DX with attributes CX",
0x3D: "open existing file DS:DX with mode AL",
0x3E: "close file BX",
0x3F: "read CX bytes from file BX into buffer DS:DX",
0x40: "write CX bytes to file BX from buffer DS:DX",
0x41: "delete file DS:DX",
0x42: "set position CX:DX of file BX relative to AL",
0x43: "get(0)/set(1) attributes CX of file DS:DX (AL)",
0x44: "get device information (IOCTL)",
0x45: "duplicate file handle BX",
0x46: "force file handle CX to duplicate file handle BX",
0x47: "get current directory (ds:si) for drive DL",
0x48: "allocate memory segment with BX paragraphs",
0x49: "free memory segment ES",
0x4A: "resize memory segment ES to BX paragraphs",
0x4B: "load program DS:DX using parameter block ES:BX",
0x4C: "terminate with return code AL",
0x4D: "get return code (al)",
0x4E: "find first matching file DS:DX with attributes CX",
0x4F: "find next matching file",
0x50: "set current psp BX",
0x51: "get current psp (bx)",
0x52: "get system variables (es:bx)",
0x53: "translate bpb DS:SI to dpb (es:bp)",
0x54: "get verify flag (al)",
0x55: "create child psp at segment DX",
0x56: "rename file DS:DX to name ES:DI",
0x57: "get(0)/set(1) file date DX and time CX (AL)",
0x58: "get(0)/set(1) memory allocation strategy (AL)", // DOS 2.11+
0x59: "get extended error information", // DOS 3.00+
0x5A: "create temporary file DS:DX with attributes CX", // DOS 3.00+
0x5B: "create file DS:DX with attributes CX", // DOS 3.00+ (doesn't truncate existing files like 0x3C)
0x5C: "lock(0)/unlock(1) file BX region CX:DX length SI:DI (AL)" // DOS 3.00+
}
};
/**
* initBus(bus, cpu, dbg)
*
* @this {Debugger}
* @param {Computer} cmp
* @param {Bus} bus
* @param {X86CPU} cpu
* @param {Debugger} dbg
*/
Debugger.prototype.initBus = function(cmp, bus, cpu, dbg)
{
this.bus = bus;
this.cpu = cpu;
this.cmp = cmp;
this.fdc = cmp.getComponentByType("FDC");
this.hdc = cmp.getComponentByType("HDC");
if (MAXDEBUG) this.chipset = cmp.getComponentByType("ChipSet");
this.cchAddr = bus.getWidth() >> 2;
this.maskAddr = bus.nBusLimit;
this.aaOpDescs = Debugger.aaOpDescs;
if (this.cpu.model >= X86.MODEL_80186) {
this.aaOpDescs = Debugger.aaOpDescs.slice();
this.aaOpDescs[0x0F] = Debugger.aOpDescUndefined;
if (this.cpu.model >= X86.MODEL_80286) {
this.aaOpDescs[0x0F] = Debugger.aOpDesc0F;
if (I386 && this.cpu.model >= X86.MODEL_80386) {
this.cchReg = 8;
this.maskReg = 0xffffffff|0;
}
}
}
this.messageDump(Messages.BUS, function onDumpBus(s) { dbg.dumpBus(s); });
this.messageDump(Messages.DESC, function onDumpDesc(s) { dbg.dumpDesc(s); });
this.messageDump(Messages.TSS, function onDumpTSS(s) { dbg.dumpTSS(s); });
this.messageDump(Messages.DOS, function onDumpDOS(s) { dbg.dumpDOS(s); });
this.setReady();
};
/**
* setBinding(sHTMLType, sBinding, control)
*
* @this {Debugger}
* @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
* @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "debugInput")
* @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
* @return {boolean} true if binding was successful, false if unrecognized binding request
*/
Debugger.prototype.setBinding = function(sHTMLType, sBinding, control)
{
var dbg = this;
switch (sBinding) {
case "debugInput":
this.bindings[sBinding] = control;
this.controlDebug = control;
/*
* For halted machines, this is fine, but for auto-start machines, it can be annoying.
*
* control.focus();
*/
control.onkeydown = function onKeyDownDebugInput(event) {
var sInput;
if (event.keyCode == Keyboard.KEYCODE.CR) {
sInput = control.value;
control.value = "";
var a = dbg.parseCommand(sInput, true);
for (var s in a) dbg.doCommand(a[s]);
}
else if (event.keyCode == Keyboard.KEYCODE.ESC) {
control.value = sInput = "";
}
else {
if (event.keyCode == Keyboard.KEYCODE.UP) {
if (dbg.iPrevCmd < dbg.aPrevCmds.length - 1) {
sInput = dbg.aPrevCmds[++dbg.iPrevCmd];
}
}
else if (event.keyCode == Keyboard.KEYCODE.DOWN) {
if (dbg.iPrevCmd > 0) {
sInput = dbg.aPrevCmds[--dbg.iPrevCmd];
} else {
sInput = "";
dbg.iPrevCmd = -1;
}
}
if (sInput != null) {
var cch = sInput.length;
control.value = sInput;
control.setSelectionRange(cch, cch);
}
}
if (sInput != null && event.preventDefault) event.preventDefault();
};
return true;
case "debugEnter":
this.bindings[sBinding] = control;
web.onClickRepeat(
control,
500, 100,
function onClickDebugEnter(fRepeat) {
if (dbg.controlDebug) {
var sInput = dbg.controlDebug.value;
dbg.controlDebug.value = "";
var a = dbg.parseCommand(sInput, true);
for (var s in a) dbg.doCommand(a[s]);
return true;
}
if (DEBUG) dbg.log("no debugger input buffer");
return false;
}
);
return true;
case "step":
this.bindings[sBinding] = control;
web.onClickRepeat(
control,
500, 100,
function onClickStep(fRepeat) {
var fCompleted = false;
if (!dbg.isBusy(true)) {
dbg.setBusy(true);
fCompleted = dbg.stepCPU(fRepeat? 1 : 0);
dbg.setBusy(false);
}
return fCompleted;
}
);
return true;
default:
break;
}
return false;
};
/**
* setFocus()
*
* @this {Debugger}
*/
Debugger.prototype.setFocus = function()
{
if (this.controlDebug) this.controlDebug.focus();
};
/**
* getSegment(sel)
*
* If the selector matches that of any of the CPU segment registers, then return the CPU's segment
* register, instead of creating our own dummy segment register. This makes it possible for us to
* see what the CPU is seeing at certain critical junctures, such as after an LMSW instruction has
* switched the processor from real to protected mode. Actually loading the selector from the GDT/LDT
* should be done only as a last resort.
*
* @param {number|null|undefined} sel
* @return {X86Seg|null} seg
*/
Debugger.prototype.getSegment = function(sel)
{
if (sel === this.cpu.getCS()) return this.cpu.segCS;
if (sel === this.cpu.getDS()) return this.cpu.segDS;
if (sel === this.cpu.getES()) return this.cpu.segES;
if (sel === this.cpu.getSS()) return this.cpu.segSS;
if (I386 && this.cpu.model >= X86.MODEL_80386) {
if (sel === this.cpu.getFS()) return this.cpu.segFS;
if (sel === this.cpu.getGS()) return this.cpu.segGS;
}
if (this.nBreakSuppress) return null;
var seg = new X86Seg(this.cpu, X86Seg.ID.DEBUG, "DBG");
/*
* Note the load() function's fSuppress parameter, which the Debugger should ALWAYS set to true
* to avoid triggering a fault.
*
* TODO: Confirm that it's OK for getSegment() to drop any error from seg.load() on the floor....
*/
seg.load(sel, true);
return seg;
};
/**
* getAddr(dbgAddr, fWrite, cb)
*
* @this {Debugger}
* @param {{DbgAddr}} dbgAddr
* @param {boolean} [fWrite]
* @param {number} [cb] is number of bytes to check (1, 2 or 4); default is 1
* @return {number} is the corresponding linear address, or X86.ADDR_INVALID
*/
Debugger.prototype.getAddr = function(dbgAddr, fWrite, cb)
{
/*
* Some addresses (eg, breakpoint addresses) save their original linear address in dbgAddr.addr,
* so we want to use that if it's there, but otherwise, dbgAddr is assumed to be a segmented address
* whose linear address must always be (re)calculated based on current machine state (mode, active
* descriptor tables, etc).
*/
var addr = dbgAddr.addr;
if (addr == null) {
addr = X86.ADDR_INVALID;
var seg = this.getSegment(dbgAddr.sel);
if (seg) {
if (!fWrite) {
addr = seg.checkRead(dbgAddr.off, cb || 1, true);
} else {
addr = seg.checkWrite(dbgAddr.off, cb || 1, true);
}
dbgAddr.addr = addr;
}
}
return addr;
};
/**
* getByte(dbgAddr, inc)
*
* We must route all our memory requests through the CPU now, in case paging is enabled.
*
* @this {Debugger}
* @param {{DbgAddr}} dbgAddr
* @param {number} [inc]
* @return {number}
*/
Debugger.prototype.getByte = function(dbgAddr, inc)
{
var b = 0xff;
var addr = this.getAddr(dbgAddr, false, 1);
if (addr !== X86.ADDR_INVALID) {
b = this.cpu.probeAddr(addr) | 0;
if (inc) this.incAddr(dbgAddr, inc);
}
return b;
};
/**
* getWord(dbgAddr, fAdvance)
*
* @this {Debugger}
* @param {{DbgAddr}} dbgAddr
* @param {boolean} [fAdvance]
* @return {number}
*/
Debugger.prototype.getWord = function(dbgAddr, fAdvance)
{
if (!dbgAddr.fData32) {
return this.getShort(dbgAddr, fAdvance? 2 : 0);
}
return this.getLong(dbgAddr, fAdvance? 4 : 0);
};
/**
* getShort(dbgAddr, inc)
*
* @this {Debugger}
* @param {{DbgAddr}} dbgAddr
* @param {number} [inc]
* @return {number}
*/
Debugger.prototype.getShort = function(dbgAddr, inc)
{
var w = 0xffff;
var addr = this.getAddr(dbgAddr, false, 2);
if (addr !== X86.ADDR_INVALID) {
w = this.cpu.probeAddr(addr) | (this.cpu.probeAddr(addr + 1) << 8);
if (inc) this.incAddr(dbgAddr, inc);
}
return w;
};
/**
* getLong(dbgAddr, inc)
*
* @this {Debugger}
* @param {{DbgAddr}} dbgAddr
* @param {number} [inc]
* @return {number}
*/
Debugger.prototype.getLong = function(dbgAddr, inc)
{
var l = -1;
var addr = this.getAddr(dbgAddr, false, 4);
if (addr !== X86.ADDR_INVALID) {
l = this.cpu.probeAddr(addr) | (this.cpu.probeAddr(addr + 1) << 8) | (this.cpu.probeAddr(addr + 2) << 16) | (this.cpu.probeAddr(addr + 3) << 24);
if (inc) this.incAddr(dbgAddr, inc);
}
return l;
};
/**
* setByte(dbgAddr, b, inc)
*
* @this {Debugger}
* @param {{DbgAddr}} dbgAddr
* @param {number} b
* @param {number} [inc]
*/
Debugger.prototype.setByte = function(dbgAddr, b, inc)
{
var addr = this.getAddr(dbgAddr, true, 1);
if (addr !== X86.ADDR_INVALID) {
this.cpu.setByte(addr, b);
if (inc) this.incAddr(dbgAddr, inc);
this.cpu.updateCPU();
}
};
/**
* setShort(dbgAddr, w, inc)
*
* @this {Debugger}
* @param {{DbgAddr}} dbgAddr
* @param {number} w
* @param {number} [inc]
*/
Debugger.prototype.setShort = function(dbgAddr, w, inc)
{
var addr = this.getAddr(dbgAddr, true, 2);
if (addr !== X86.ADDR_INVALID) {
this.cpu.setShort(addr, w);
if (inc) this.incAddr(dbgAddr, inc);
this.cpu.updateCPU();
}
};
/**
* newAddr(off, sel, addr, fData32, fAddr32)
*
* @this {Debugger}
* @param {number|null|undefined} [off] (default is zero)
* @param {number|null|undefined} [sel] (default is undefined)
* @param {number|null|undefined} [addr] (default is undefined)
* @param {boolean} [fData32] (default is false)
* @param {boolean} [fAddr32] (default is false)
* @return {{DbgAddr}}
*/
Debugger.prototype.newAddr = function(off, sel, addr, fData32, fAddr32)
{
if (fData32 === undefined) fData32 = (this.cpu && this.cpu.segCS.dataSize == 4);
if (fAddr32 === undefined) fAddr32 = (this.cpu && this.cpu.segCS.addrSize == 4);
return {off: off || 0, sel: sel, addr: addr, fTempBreak: false, fData32: fData32 || false, fAddr32: fAddr32 || false};
};
/**
* packAddr(dbgAddr)
*
* @this {Debugger}
* @param {{DbgAddr}} dbgAddr
* @return {Array}
*/
Debugger.prototype.packAddr = function(dbgAddr)
{
return [dbgAddr.off, dbgAddr.sel, dbgAddr.addr, dbgAddr.fTempBreak, dbgAddr.fData32, dbgAddr.fAddr32, dbgAddr.fOverride, dbgAddr.fComplete];
};
/**
* unpackAddr(aAddr)
*
* @this {Debugger}
* @param {Array} aAddr
* @return {{DbgAddr}}
*/
Debugger.prototype.unpackAddr = function(aAddr)
{
return {off: aAddr[0], sel: aAddr[1], addr: aAddr[2], fTempBreak: aAddr[3], fData32: aAddr[4], fAddr32: aAddr[5], fOverride: aAddr[6], fComplete: aAddr[7]};
};
/**
* checkLimit(dbgAddr)
*
* @this {Debugger}
* @param {{DbgAddr}} dbgAddr
*/
Debugger.prototype.checkLimit = function(dbgAddr)
{
if (dbgAddr.sel != null) {
var seg = this.getSegment(dbgAddr.sel);
if (!seg || dbgAddr.off > seg.limit) {
/*
* TODO: This automatic wrap-to-zero is OK for normal segments, but for expand-down segments, not so much.
*/
dbgAddr.off = 0;
dbgAddr.addr = null;
}
}
};
/**
* incAddr(dbgAddr, inc)
*
* @this {Debugger}
* @param {{DbgAddr}} dbgAddr
* @param {number|undefined} inc contains value to increment dbgAddr by (default is 1)
*/
Debugger.prototype.incAddr = function(dbgAddr, inc)
{
inc = inc || 1;
if (dbgAddr.addr != null) {
dbgAddr.addr += inc;
}
if (dbgAddr.sel != null) {
dbgAddr.off += inc;
this.checkLimit(dbgAddr);
}
};
/**
* hexOffset(off, sel, fAddr32)
*
* @this {Debugger}
* @param {number|null} [off]
* @param {number|null} [sel]
* @param {boolean} [fAddr32] is true for 32-bit ADDRESS size
* @return {string} the hex representation of off (or sel:off)
*/
Debugger.prototype.hexOffset = function(off, sel, fAddr32)
{
if (sel != null) {
return str.toHex(sel, 4) + ":" + str.toHex(off, (off & (0xffff0000|0)) || fAddr32? 8 : 4);
}
return str.toHex(off);
};
/**
* hexAddr(dbgAddr)
*
* @this {Debugger}
* @param {{DbgAddr}} dbgAddr
* @return {string} the hex representation of the address
*/
Debugger.prototype.hexAddr = function(dbgAddr)
{
return dbgAddr.sel == null? ("%" + str.toHex(dbgAddr.addr)) : this.hexOffset(dbgAddr.off, dbgAddr.sel, dbgAddr.fAddr32);
};
/**
* dumpSZ(dbgAddr, cchMax)
*
* Dump helper for zero-terminated strings.
*
* @this {Debugger}
* @param {{DbgAddr}} dbgAddr
* @param {number} [cchMax]
* @return {string} (and dbgAddr advanced past the terminating zero)
*/
Debugger.prototype.dumpSZ = function(dbgAddr, cchMax)
{
var sChars = "";
cchMax = cchMax || 256;
while (sChars.length < cchMax) {
var b = this.getByte(dbgAddr, 1);
if (!b) break;
sChars += (b >= 32 && b < 128? String.fromCharCode(b) : ".");
}
return sChars;
};
/**
* dumpDOS(s)
*
* This dumps DOS MCBs (Memory Control Blocks).
*
* @this {Debugger}
* @param {string} [s]
*/
Debugger.prototype.dumpDOS = function(s)
{
if (!s) {
this.println("no MCB");
return;
}
this.println("dumpDOS(" + s + ")");
/*
* If s is provided and str.parseInt(s) succeeds, then we assume it represents a starting
* MCB (Memory Control Block) segment, and we dump the corresponding blocks.
*/
var sel = this.parseValue(s);
while (sel) {
var dbgAddr = this.newAddr(0, sel);
var bSig = this.getByte(dbgAddr, 1);
var wPID = this.getShort(dbgAddr, 2);
var wParas = this.getShort(dbgAddr, 5);
if (bSig != 0x4D && bSig != 0x5A) break;
this.println(this.hexOffset(0, sel) + ": '" + String.fromCharCode(bSig) + "' PID=" + str.toHexWord(wPID) + " LEN=" + str.toHexWord(wParas) + ' "' + this.dumpSZ(dbgAddr, 8) + '"');
sel += 1 + wParas;
}
};
Debugger.aTSSFields = {
"PREV_TSS": 0x00,
"CPL0_SP": 0x02,
"CPL0_SS": 0x04,
"CPL1_SP": 0x06,
"CPL1_SS": 0x08,
"CPL2_SP": 0x0a,
"CPL2_SS": 0x0c,
"TASK_IP": 0x0e,
"TASK_PS": 0x10,
"TASK_AX": 0x12,
"TASK_CX": 0x14,
"TASK_DX": 0x16,
"TASK_BX": 0x18,
"TASK_SP": 0x1a,
"TASK_BP": 0x1c,
"TASK_SI": 0x1e,
"TASK_DI": 0x20,
"TASK_ES": 0x22,
"TASK_CS": 0x24,
"TASK_SS": 0x26,
"TASK_DS": 0x28,
"TASK_LDT": 0x2a
};
/**
* dumpBus(s)
*
* This dumps Bus allocations.
*
* @this {Debugger}
* @param {string} [s]
*/
Debugger.prototype.dumpBus = function(s)
{
this.println("id physaddr blkaddr used size type");
this.println("-------- --------- -------- ------ ------ ----");
for (var i = 0; i < this.cpu.aMemBlocks.length; i++) {
var block = this.cpu.aBusBlocks[i];
if (block.type === Memory.TYPE.NONE) continue;
this.println(str.toHex(block.id) + " %" + str.toHex(i << this.cpu.nBlockShift) + ": " + str.toHex(block.addr) + " " + str.toHexWord(block.used) + " " + str.toHexWord(block.size) + " " + Memory.TYPE.NAMES[block.type]);
}
};
/**
* dumpDesc(s)
*
* This dumps a descriptor for the given selector.
*
* @this {Debugger}
* @param {string} [s]
*/
Debugger.prototype.dumpDesc = function(s)
{
if (!s) {
this.println("no selector");
return;
}
var sel = this.parseValue(s);
if (sel === undefined) {
this.println("invalid selector: " + s);
return;
}
var seg = this.getSegment(sel);
this.println("dumpDesc(" + str.toHexWord(seg? seg.sel : sel) + "): %" + str.toHex(seg? seg.addrDesc : null, this.cchAddr));
if (!seg) return;
var sType;
var fGate = false;
if (seg.type & X86.DESC.ACC.TYPE.SEG) {
if (seg.type & X86.DESC.ACC.TYPE.CODE) {
sType = "code";
sType += (seg.type & X86.DESC.ACC.TYPE.READABLE)? ",readable" : ",execonly";
if (seg.type & X86.DESC.ACC.TYPE.CONFORMING) sType += ",conforming";
}
else {
sType = "data";
sType += (seg.type & X86.DESC.ACC.TYPE.WRITABLE)? ",writable" : ",readonly";
if (seg.type & X86.DESC.ACC.TYPE.EXPDOWN) sType += ",expdown";
}
if (seg.type & X86.DESC.ACC.TYPE.ACCESSED) sType += ",accessed";
}
else {
switch(seg.type) {
case X86.DESC.ACC.TYPE.TSS:
sType = "tss";
break;
case X86.DESC.ACC.TYPE.LDT:
sType = "ldt";
break;
case X86.DESC.ACC.TYPE.TSS_BUSY:
sType = "busy tss";
break;
case X86.DESC.ACC.TYPE.GATE_CALL:
sType = "call gate";
fGate = true;
break;
case X86.DESC.ACC.TYPE.GATE_TASK:
sType = "task gate";
fGate = true;
break;
case X86.DESC.ACC.TYPE.GATE_INT:
sType = "int gate";
fGate = true;
break;
case X86.DESC.ACC.TYPE.GATE_TRAP:
sType = "trap gate";
fGate = true;
break;
default:
break;
}
}
if (sType && !(seg.acc & X86.DESC.ACC.PRESENT)) sType += ",not present";
var sDump;
if (fGate) {
sDump = "seg=" + str.toHexWord(seg.base & 0xffff) + " off=" + str.toHexWord(seg.limit);
} else {
sDump = "base=" + str.toHex(seg.base, this.cchAddr) + " limit=" + str.toHex(seg.limit, (seg.limit & ~0xffff)? 8 : 4);
}
/*
* When we dump the EXT word, we mask off the LIMIT1619 and BASE2431 bits, because those have already
* been incorporated into the limit and base properties of the segment register; all we care about here
* are whether EXT contains any of the AVAIL (0x10), BIG (0x40) or LIMITPAGES (0x80) bits.
*/
this.println(sDump + " type=" + str.toHexByte(seg.type >> 8) + " (" + sType + ")" + " ext=" + str.toHexWord(seg.ext & ~(X86.DESC.EXT.LIMIT1619 | X86.DESC.EXT.BASE2431)) + " dpl=" + str.toHexByte(seg.dpl));
};
/**
* dumpHistory(sCount)
*
* @this {Debugger}
* @param {string|undefined} sCount is the number of instructions to rewind to (default is 10)
*/
Debugger.prototype.dumpHistory = function(sCount)
{
var sMore = "";
var cLines = 10;
var iHistory = this.iOpcodeHistory;
var aHistory = this.aOpcodeHistory;
if (aHistory.length) {
var n = (sCount === undefined? this.nextHistory : +sCount);
if (isNaN(n))
n = cLines;
else
sMore = "more ";
if (n > aHistory.length) {
this.println("note: only " + aHistory.length + " available");
n = aHistory.length;
}
iHistory -= n;
if (iHistory < 0) {
if (aHistory[aHistory.length - 1][1] != null) {
iHistory += aHistory.length;
} else {
n = iHistory + n;
iHistory = 0;
}
}
if (sCount !== undefined) {
this.println(n + " instructions earlier:");
}
while (cLines && iHistory != this.iOpcodeHistory) {
var dbgAddr = aHistory[iHistory++];
if (dbgAddr.sel == null) break;
/*
* We must create a new dbgAddr from the address we obtained from aHistory, because dbgAddr
* was a reference, not a copy, and we don't want getInstruction() modifying the original.
*/
dbgAddr = this.newAddr(dbgAddr.off, dbgAddr.sel, dbgAddr.addr);
this.println(this.getInstruction(dbgAddr, "history", n--));
/*
* If there was an OPERAND or ADDRESS override on the previous instruction, getInstruction()
* will have automatically disassembled the next instruction, so skip one more history entry.
*/
if (dbgAddr.fOverride) {
iHistory++; n--;
}
if (iHistory >= aHistory.length) iHistory = 0;
this.nextHistory = n;
cLines--;
}
}
if (cLines == 10) {
this.println("no " + sMore + "history available");
this.nextHistory = undefined;
}
};
/**
* dumpTSS(s)
*
* This dumps a TSS using the given selector. If none is specified, the current TR is used.
*
* @this {Debugger}
* @param {string} [s]
*/
Debugger.prototype.dumpTSS = function(s)
{
var seg;
if (!s) {
seg = this.cpu.segTSS;
} else {
var sel = this.parseValue(s);
if (sel === undefined) {
this.println("invalid task selector: " + s);
return;
}
seg = this.getSegment(sel);
}
this.println("dumpTSS(" + str.toHexWord(seg? seg.sel : sel) + "): %" + str.toHex(seg? seg.base : null, this.cchAddr));
if (!seg) return;
var sDump = "";
for (var sField in Debugger.aTSSFields) {
var off = Debugger.aTSSFields[sField];
var ch = (sField.length < 8? ' ' : '');
var addr = seg.base + off;
var w = this.cpu.probeAddr(addr) | (this.cpu.probeAddr(addr + 1) << 8);
if (sDump) sDump += '\n';
sDump += str.toHexWord(off) + " " + sField + ": " + ch + str.toHexWord(w);
}
this.println(sDump);
};
/**
* messageInit(sEnable)
*
* @this {Debugger}
* @param {string|undefined} sEnable contains zero or more message categories to enable, separated by '|' or ';'
*/
Debugger.prototype.messageInit = function(sEnable)
{
this.dbg = this;
this.bitsMessage = this.bitsWarning = Messages.WARN;
this.sMessagePrev = null;
this.afnDumpers = [];
var aEnable = this.parseCommand(sEnable.replace("keys","key").replace("kbd","keyboard"));
if (aEnable.length) {
for (var m in Debugger.MESSAGES) {
if (usr.indexOf(aEnable, m) >= 0) {
this.bitsMessage |= Debugger.MESSAGES[m];
this.println(m + " messages enabled");
}
}
}
};
/**
* messageDump(bitMessage, fnDumper)
*
* @this {Debugger}
* @param {number} bitMessage is one Messages category flag
* @param {function(string)} fnDumper is a function the Debugger can use to dump data for that category
* @return {boolean} true if successfully registered, false if not
*/
Debugger.prototype.messageDump = function(bitMessage, fnDumper)
{
for (var m in Debugger.MESSAGES) {
if (bitMessage == Debugger.MESSAGES[m]) {
this.afnDumpers[m] = fnDumper;
return true;
}
}
return false;
};
/**
* getRegIndex(sReg)
*
* @this {Debugger}
* @param {string} sReg
* @return {number}
*/
Debugger.prototype.getRegIndex = function(sReg) {
return usr.indexOf(Debugger.REGS, sReg.toUpperCase());
};
/**
* getRegValue(iReg)
*
* @this {Debugger}
* @param {number} iReg
* @return {string}
*/
Debugger.prototype.getRegValue = function(iReg) {
var s = "??";
if (iReg >= 0) {
var n, cch;
var cpu = this.cpu;
switch(iReg) {
case Debugger.REG_AL:
n = cpu.regEAX; cch = 2;
break;
case Debugger.REG_CL:
n = cpu.regECX; cch = 2;
break;
case Debugger.REG_DL:
n = cpu.regEDX; cch = 2;
break;
case Debugger.REG_BL:
n = cpu.regEBX; cch = 2;
break;
case Debugger.REG_AH:
n = cpu.regEAX >> 8; cch = 2;
break;
case Debugger.REG_CH:
n = cpu.regECX >> 8; cch = 2;
break;
case Debugger.REG_DH:
n = cpu.regEDX >> 8; cch = 2;
break;
case Debugger.REG_BH:
n = cpu.regEBX >> 8; cch = 2;
break;
case Debugger.REG_AX:
n = cpu.regEAX; cch = 4;
break;
case Debugger.REG_CX:
n = cpu.regECX; cch = 4;
break;
case Debugger.REG_DX:
n = cpu.regEDX; cch = 4;
break;
case Debugger.REG_BX:
n = cpu.regEBX; cch = 4;
break;
case Debugger.REG_SP:
n = cpu.getSP(); cch = 4;
break;
case Debugger.REG_BP:
n = cpu.regEBP; cch = 4;
break;
case Debugger.REG_SI:
n = cpu.regESI; cch = 4;
break;
case Debugger.REG_DI:
n = cpu.regEDI; cch = 4;
break;
case Debugger.REG_IP:
n = cpu.getIP(); cch = this.cchReg;
break;
case Debugger.REG_PS:
n = cpu.getPS(); cch = this.cchReg;
break;
case Debugger.REG_SEG + Debugger.REG_ES:
n = cpu.getES(); cch = 4;
break;
case Debugger.REG_SEG + Debugger.REG_CS:
n = cpu.getCS(); cch = 4;
break;
case Debugger.REG_SEG + Debugger.REG_SS:
n = cpu.getSS(); cch = 4;
break;
case Debugger.REG_SEG + Debugger.REG_DS:
n = cpu.getDS(); cch = 4;
break;
}
if (!cch) {
if (this.cpu.model == X86.MODEL_80286) {
if (iReg == Debugger.REG_CR0) {
n = cpu.regCR0; cch = 4;
}
}
else if (I386 && this.cpu.model >= X86.MODEL_80386) {
switch(iReg) {
case Debugger.REG_EAX:
n = cpu.regEAX; cch = 8;
break;
case Debugger.REG_ECX:
n = cpu.regECX; cch = 8;
break;
case Debugger.REG_EDX:
n = cpu.regEDX; cch = 8;
break;
case Debugger.REG_EBX:
n = cpu.regEBX; cch = 8;
break;
case Debugger.REG_ESP:
n = cpu.getSP(); cch = 8;
break;
case Debugger.REG_EBP:
n = cpu.regEBP; cch = 8;
break;
case Debugger.REG_ESI:
n = cpu.regESI; cch = 8;
break;
case Debugger.REG_EDI:
n = cpu.regEDI; cch = 8;
break;
case Debugger.REG_CR0:
n = cpu.regCR0; cch = 8;
break;
case Debugger.REG_CR1:
n = cpu.regCR1; cch = 8;
break;
case Debugger.REG_CR2:
n = cpu.regCR2; cch = 8;
break;
case Debugger.REG_CR3:
n = cpu.regCR3; cch = 8;
break;
case Debugger.REG_SEG + Debugger.REG_FS:
n = cpu.getFS(); cch = 4;
break;
case Debugger.REG_SEG + Debugger.REG_GS:
n = cpu.getGS(); cch = 4;
break;
}
}
}
if (cch) s = str.toHex(n, cch);
}
return s;
};
/**
* replaceRegs()
*
* @this {Debugger}
* @param {string} s
* @return {string}
*/
Debugger.prototype.replaceRegs = function(s) {
for (var iReg = 0; iReg < Debugger.REGS.length; iReg++) {
var sReg = Debugger.REGS[iReg];
if (s.indexOf(sReg) >= 0) {
s = str.replaceAll(sReg, this.getRegValue(iReg), s);
}
}
return s;
};
/**
* message(sMessage, fAddress)
*
* @this {Debugger}
* @param {string} sMessage is any caller-defined message string
* @param {boolean} [fAddress] is true to display the current CS:IP
*/
Debugger.prototype.message = function(sMessage, fAddress)
{
if (fAddress) {
sMessage += " @" + this.hexOffset(this.cpu.getIP(), this.cpu.getCS());
}
if (this.sMessagePrev && sMessage == this.sMessagePrev) return;
if (!SAMPLER) this.println(sMessage); // + " (" + this.cpu.getCycles() + " cycles)"
this.sMessagePrev = sMessage;
if (this.cpu) {
if (this.bitsMessage & Messages.HALT) {
this.stopCPU();
}
/*
* We have no idea what the frequency of println() calls might be; all we know is that they easily
* screw up the CPU's careful assumptions about cycles per burst. So we call yieldCPU() after every
* message, to effectively end the current burst and start fresh.
*
* TODO: See CPU.calcStartTime() for a discussion of why we might want to call yieldCPU() *before*
* we display the message.
*/
this.cpu.yieldCPU();
}
};
/**
* messageInt(nInt, addr)
*
* @this {Debugger}
* @param {number} nInt
* @param {number} addr (LIP after the "INT n" instruction has been fetched but not dispatched)
* @return {boolean} true if message generated (which in turn triggers addIntReturn() inside checkIntNotify()), false if not
*/
Debugger.prototype.messageInt = function(nInt, addr)
{
var AH;
var fMessage = false;
var nCategory = Debugger.INT_MESSAGES[nInt];
if (nCategory) {
AH = this.cpu.regEAX >> 8;
if (this.messageEnabled(nCategory)) {
fMessage = true;
} else {
fMessage = (nCategory == Messages.FDC && this.messageEnabled(nCategory = Messages.HDC));
}
}
if (fMessage) {
var DL = this.cpu.regEDX & 0xff;
if (nInt == Interrupts.DOS.VECTOR && AH == 0x0b ||
nCategory == Messages.FDC && DL >= 0x80 || nCategory == Messages.HDC && DL < 0x80) {
fMessage = false;
}
}
if (fMessage) {
var aFuncs = Debugger.INT_FUNCS[nInt];
var sFunc = (aFuncs && aFuncs[AH]) || "";
if (sFunc) sFunc = ' ' + this.replaceRegs(sFunc);
/*
* For purposes of display only, rewind addr to the address of the responsible "INT n" instruction; we
* know it's the two-byte "INT n" instruction because that's the only opcode handler that calls checkIntNotify()
* at the moment. If that changes, then this will have to change as well.
*/
addr -= 2;
this.message("INT " + str.toHexByte(nInt) + ": AH=" + str.toHexByte(AH) + " @" + this.hexOffset(addr - this.cpu.segCS.base, this.cpu.getCS()) + sFunc);
}
return fMessage;
};
/**
* messageIntReturn(nInt, nLevel, nCycles)
*
* @this {Debugger}
* @param {number} nInt
* @param {number} nLevel
* @param {number} nCycles
* @param {string} [sResult]
*/
Debugger.prototype.messageIntReturn = function(nInt, nLevel, nCycles, sResult)
{
this.message("INT " + str.toHexByte(nInt) + ": C=" + (this.cpu.getCF()? 1 : 0) + (sResult || "") + " (cycles=" + nCycles + (nLevel? ",level=" + (nLevel+1) : "") + ")");
};
/**
* messageIO(component, port, bOut, addrFrom, name, bIn, bitsMessage)
*
* @this {Debugger}
* @param {Component} component
* @param {number} port
* @param {number|null} bOut if an output operation
* @param {number|null} [addrFrom]
* @param {string|null} [name] of the port, if any
* @param {number|null} [bIn] is the input value, if known, on an input operation
* @param {number} [bitsMessage] is one or more Messages category flag(s)
*/
Debugger.prototype.messageIO = function(component, port, bOut, addrFrom, name, bIn, bitsMessage)
{
bitsMessage |= Messages.PORT;
if (addrFrom == null || (this.bitsMessage & bitsMessage) == bitsMessage) {
var selFrom = null;
if (addrFrom != null) {
selFrom = this.cpu.getCS();
addrFrom -= this.cpu.segCS.base;
}
this.message(component.idComponent + "." + (bOut != null? "outPort" : "inPort") + '(' + str.toHexWord(port) + ',' + (name? name : "unknown") + (bOut != null? ',' + str.toHexByte(bOut) : "") + ")" + (bIn != null? (": " + str.toHexByte(bIn)) : "") + (addrFrom != null? (" @" + this.hexOffset(addrFrom, selFrom)) : ""));
}
};
/**
* traceInit()
*
* @this {Debugger}
*/
Debugger.prototype.traceInit = function()
{
if (DEBUG) {
this.traceEnabled = {};
for (var prop in Debugger.TRACE) {
this.traceEnabled[prop] = false;
}
this.iTraceBuffer = 0;
this.aTraceBuffer = []; // we now defer TRACE_LIMIT allocation until the first traceLog() call
}
};
/**
* traceLog(prop, dst, src, flagsIn, flagsOut, resultLo, resultHi)
*
* @this {Debugger}
* @param {string} prop
* @param {number} dst
* @param {number} src
* @param {number|null} flagsIn
* @param {number|null} flagsOut
* @param {number} resultLo
* @param {number} [resultHi]
*/
Debugger.prototype.traceLog = function(prop, dst, src, flagsIn, flagsOut, resultLo, resultHi)
{
if (DEBUG) {
if (this.traceEnabled !== undefined && this.traceEnabled[prop]) {
var trace = Debugger.TRACE[prop];
var len = (trace.size >> 2);
var s = this.hexOffset(this.cpu.opLIP - this.cpu.segCS.base, this.cpu.getCS()) + " " + Debugger.INS_NAMES[trace.ins] + "(" + str.toHex(dst, len) + "," + str.toHex(src, len) + "," + (flagsIn === null? "-" : str.toHexWord(flagsIn)) + ") " + str.toHex(resultLo, len) + "," + (flagsOut === null? "-" : str.toHexWord(flagsOut));
if (!this.aTraceBuffer.length) this.aTraceBuffer = new Array(Debugger.TRACE_LIMIT);
this.aTraceBuffer[this.iTraceBuffer++] = s;
if (this.iTraceBuffer >= this.aTraceBuffer.length) {
/*
* Instead of wrapping the buffer, we're going to turn all tracing off.
*
* this.iTraceBuffer = 0;
*/
for (prop in this.traceEnabled) {
this.traceEnabled[prop] = false;
}
this.println("trace buffer full");
}
}
}
};
/**
* init()
*
* @this {Debugger}
*/
Debugger.prototype.init = function()
{
this.println("Type ? for list of debugger commands");
this.updateStatus();
if (this.sInitCommands) {
var a = this.parseCommand(this.sInitCommands);
delete this.sInitCommands;
for (var s in a) this.doCommand(a[s]);
}
};
/**
* historyInit()
*
* This function is intended to be called by the constructor, reset(), addBreakpoint(), findBreakpoint()
* and any other function that changes the checksEnabled() criteria used to decide whether checkInstruction()
* should be called.
*
* That is, if the history arrays need to be allocated and haven't already been allocated, then allocate them,
* and if the arrays are no longer needed, then deallocate them.
*
* @this {Debugger}
*/
Debugger.prototype.historyInit = function()
{
var i;
if (!this.checksEnabled()) {
this.iOpcodeHistory = 0;
this.aOpcodeHistory = [];
this.aaOpcodeCounts = [];
return;
}
if (!this.aOpcodeHistory || !this.aOpcodeHistory.length) {
this.aOpcodeHistory = new Array(10000);
for (i = 0; i < this.aOpcodeHistory.length; i++) {
/*
* Preallocate dummy Addr (Array) objects in every history slot, so that
* checkInstruction() doesn't need to call newAddr() on every slot update.
*/
this.aOpcodeHistory[i] = this.newAddr();
}
this.iOpcodeHistory = 0;
}
if (!this.aaOpcodeCounts || !this.aaOpcodeCounts.length) {
this.aaOpcodeCounts = new Array(256);
for (i = 0; i < this.aaOpcodeCounts.length; i++) {
this.aaOpcodeCounts[i] = [i, 0];
}
}
};
/**
* runCPU(fOnClick)
*
* @this {Debugger}
* @param {boolean} [fOnClick] is true if called from a click handler that might have stolen focus
* @return {boolean} true if run request successful, false if not
*/
Debugger.prototype.runCPU = function(fOnClick)
{
if (!this.isCPUAvail()) return false;
this.cpu.runCPU(fOnClick);
return true;
};
/**
* stepCPU(nCycles, fRegs, fUpdateCPU)
*
* @this {Debugger}
* @param {number} nCycles (0 for one instruction without checking breakpoints)
* @param {boolean} [fRegs] is true to display registers after step (default is false)
* @param {boolean} [fUpdateCPU] is false to disable calls to updateCPU() (default is true)
* @return {boolean}
*/
Debugger.prototype.stepCPU = function(nCycles, fRegs, fUpdateCPU)
{
if (!this.isCPUAvail()) return false;
this.nCycles = 0;
do {
if (!nCycles) {
/*
* When single-stepping, the CPU won't call checkInstruction(), which is good for
* avoiding breakpoints, but bad for instruction data collection if checks are enabled.
* So we call checkInstruction() ourselves.
*/
if (this.checksEnabled()) this.checkInstruction(this.cpu.regLIP, 0);
}
try {
var nCyclesStep = this.cpu.stepCPU(nCycles);
if (nCyclesStep > 0) {
this.nCycles += nCyclesStep;
this.cpu.addCycles(nCyclesStep, true);
this.cpu.updateChecksum(nCyclesStep);
this.cInstructions++;
}
}
catch (e) {
this.nCycles = 0;
this.cpu.setError(e.stack || e.message);
}
} while (this.cpu.opFlags & X86.OPFLAG_PREFIXES);
/*
* Because we called cpu.stepCPU() and not cpu.runCPU(), we must nudge the cpu's update code,
* and then update our own state. Normally, the only time fUpdateCPU will be false is when doStep()
* is calling us in a loop, in which case it will perform its own updateCPU() when it's done.
*/
if (fUpdateCPU !== false) this.cpu.updateCPU();
this.updateStatus(fRegs || false, false);
return (this.nCycles > 0);
};
/**
* stopCPU()
*
* @this {Debugger}
* @param {boolean} [fComplete]
*/
Debugger.prototype.stopCPU = function(fComplete)
{
if (this.cpu) this.cpu.stopCPU(fComplete);
};
/**
* updateStatus(fRegs, fCompact)
*
* @this {Debugger}
* @param {boolean} [fRegs] (default is true)
* @param {boolean} [fCompact] (default is true)
*/
Debugger.prototype.updateStatus = function(fRegs, fCompact)
{
if (fRegs === undefined) fRegs = true;
if (fCompact === undefined) fCompact = true;
this.dbgAddrNextCode = this.newAddr(this.cpu.getIP(), this.cpu.getCS());
/*
* this.fProcStep used to be a simple boolean, but now it's 0 (or undefined)
* if inactive, 1 if stepping over an instruction without a register dump, or 2
* if stepping over an instruction with a register dump.
*/
if (!fRegs || this.fProcStep == 1)
this.doUnassemble();
else {
this.doRegisters(null, fCompact);
}
};
/**
* isCPUAvail()
*
* Make sure the CPU is ready (finished initializing), not busy (already running), and not in an error state.
*
* @this {Debugger}
* @return {boolean}
*/
Debugger.prototype.isCPUAvail = function()
{
if (!this.cpu)
return false;
if (!this.cpu.isReady())
return false;
if (!this.cpu.isPowered())
return false;
if (this.cpu.isBusy())
return false;
return !this.cpu.isError();
};
/**
* powerUp(data, fRepower)
*
* @this {Debugger}
* @param {Object|null} data
* @param {boolean} [fRepower]
* @return {boolean} true if successful, false if failure
*/
Debugger.prototype.powerUp = function(data, fRepower)
{
if (!fRepower) {
/*
* Because Debugger save/restore support is somewhat limited (and didn't always exist),
* we deviate from the typical save/restore design pattern: instead of reset OR restore,
* we always reset and then perform a (potentially limited) restore.
*/
this.reset(true);
// this.println(data? "resuming" : "powering up");
if (data && this.restore) {
if (!this.restore(data)) return false;
}
}
return true;
};
/**
* powerDown(fSave, fShutdown)
*
* @this {Debugger}
* @param {boolean} fSave
* @param {boolean} [fShutdown]
* @return {Object|boolean}
*/
Debugger.prototype.powerDown = function(fSave, fShutdown)
{
if (fShutdown) this.println(fSave? "suspending" : "shutting down");
return fSave && this.save? this.save() : true;
};
/**
* reset(fQuiet)
*
* This is a notification handler, called by the Computer, to inform us of a reset.
*
* @this {Debugger}
* @param {boolean} fQuiet (true only when called from our own powerUp handler)
*/
Debugger.prototype.reset = function(fQuiet)
{
this.historyInit();
this.cInstructions = 0;
this.sMessagePrev = null;
this.nCycles = 0;
this.dbgAddrNextCode = this.newAddr(this.cpu.getIP(), this.cpu.getCS());
/*
* fRunning is set by start() and cleared by stop(). In addition, we clear
* it here, so that if the CPU is reset while running, we can prevent stop()
* from unnecessarily dumping the CPU state.
*/
if (this.aFlags.fRunning !== undefined && !fQuiet) this.println("reset");
this.aFlags.fRunning = false;
this.clearTempBreakpoint();
if (!fQuiet) this.updateStatus();
};
/**
* save()
*
* This implements (very rudimentary) save support for the Debugger component.
*
* @this {Debugger}
* @return {Object}
*/
Debugger.prototype.save = function()
{
var state = new State(this);
state.set(0, this.packAddr(this.dbgAddrNextCode));
state.set(1, this.packAddr(this.dbgAddrAssemble));
state.set(2, [this.aPrevCmds, this.fAssemble, this.bitsMessage]);
return state.data();
};
/**
* restore(data)
*
* This implements (very rudimentary) restore support for the Debugger component.
*
* @this {Debugger}
* @param {Object} data
* @return {boolean} true if successful, false if failure
*/
Debugger.prototype.restore = function(data)
{
var i = 0;
if (data[2] !== undefined) {
this.dbgAddrNextCode = this.unpackAddr(data[i++]);
this.dbgAddrAssemble = this.unpackAddr(data[i++]);
this.aPrevCmds = data[i][0];
if (typeof this.aPrevCmds == "string") this.aPrevCmds = [this.aPrevCmds];
this.fAssemble = data[i][1];
if (!this.bitsMessage) {
/*
* It's actually kind of annoying that a restored (or predefined) state will trump my initial state,
* at least in situations where I've changed the initial state, if I want to diagnose something.
* Perhaps I should save/restore both the initial and current bitsMessageEnabled, and if the initial
* values don't agree, then leave the current value alone.
*
* But, it's much easier to just leave bitsMessageEnabled alone whenever it already contains set bits.
*/
this.bitsMessage = data[i][2];
}
}
return true;
};
/**
* start(ms, nCycles)
*
* This is a notification handler, called by the Computer, to inform us the CPU has started.
*
* @this {Debugger}
* @param {number} ms
* @param {number} nCycles
*/
Debugger.prototype.start = function(ms, nCycles)
{
if (!this.fProcStep) this.println("running");
this.aFlags.fRunning = true;
this.msStart = ms;
this.nCyclesStart = nCycles;
};
/**
* stop(ms, nCycles)
*
* This is a notification handler, called by the Computer, to inform us the CPU has now stopped.
*
* @this {Debugger}
* @param {number} ms
* @param {number} nCycles
*/
Debugger.prototype.stop = function(ms, nCycles)
{
if (this.aFlags.fRunning) {
this.aFlags.fRunning = false;
this.nCycles = nCycles - this.nCyclesStart;
if (!this.fProcStep) {
var sStopped = "stopped";
if (this.nCycles) {
var msTotal = ms - this.msStart;
var nCyclesPerSecond = (msTotal > 0? Math.round(this.nCycles * 1000 / msTotal) : 0);
sStopped += " (";
if (this.checksEnabled()) {
sStopped += this.cInstructions + " ops, ";
this.cInstructions = 0; // remove this line if you want to maintain a longer total
}
sStopped += this.nCycles + " cycles, " + msTotal + " ms, " + nCyclesPerSecond + " hz)";
if (MAXDEBUG && this.chipset) {
var i, c, n;
for (i = 0; i < this.chipset.acInterrupts.length; i++) {
c = this.chipset.acInterrupts[i];
if (!c) continue;
n = c / Math.round(msTotal / 1000);
this.println("IRQ" + i + ": " + c + " interrupts (" + n + " per sec)");
this.chipset.acInterrupts[i] = 0;
}
for (i = 0; i < this.chipset.acTimersFired.length; i++) {
c = this.chipset.acTimersFired[i];
if (!c) continue;
n = c / Math.round(msTotal / 1000);
this.println("TIMER" + i + ": " + c + " fires (" + n + " per sec)");
this.chipset.acTimersFired[i] = 0;
}
n = 0;
for (i = 0; i < this.chipset.acTimer0Counts.length; i++) {
var a = this.chipset.acTimer0Counts[i];
n += a[0];
this.println("TIMER0 update #" + i + ": [" + a[0] + "," + a[1] + "," + a[2] + "]");
}
this.chipset.acTimer0Counts = [];
}
}
this.println(sStopped);
}
this.updateStatus(true, this.fProcStep != 2);
this.setFocus();
this.clearTempBreakpoint(this.cpu.regLIP);
}
};
/**
* checksEnabled(fRelease)
*
* This "check" function is called by the CPU; we indicate whether or not every instruction needs to be checked.
*
* Originally, this returned true even when there were only read and/or write breakpoints, but those breakpoints
* no longer require the intervention of checkInstruction(); the Bus component automatically swaps in/out appropriate
* functions to deal with those breakpoints in the appropriate memory blocks. So I've simplified the test below.
*
* @this {Debugger}
* @param {boolean} [fRelease] is true for release criteria only; default is false (any criteria)
* @return {boolean} true if every instruction needs to pass through checkInstruction(), false if not
*/
Debugger.prototype.checksEnabled = function(fRelease)
{
return ((DEBUG && !fRelease)? true : (this.aBreakExec.length > 1 || this.messageEnabled(Messages.INT) /* || this.aBreakRead.length > 1 || this.aBreakWrite.length > 1 */));
};
/**
* checkInstruction(addr, nState)
*
* This "check" function is called by the CPU to inform us about the next instruction to be executed,
* giving us an opportunity to look for "exec" breakpoints and update opcode frequencies and instruction history.
*
* @this {Debugger}
* @param {number} addr
* @param {number} nState is < 0 if stepping, 0 if starting, or > 0 if running
* @return {boolean} true if breakpoint hit, false if not
*/
Debugger.prototype.checkInstruction = function(addr, nState)
{
if (nState > 0) {
if (this.checkBreakpoint(addr, this.aBreakExec)) {
return true;
}
/*
* Halt whenever ring 3 code is running with interrupts disabled, because that's likely an
* error (TODO: we should also check the IOPL, too, because if IOPL is 3, then this is OK).
*/
if (this.cpu.segCS.cpl == 3 && !(this.cpu.regPS & X86.PS.IF)) {
return true;
}
}
/*
* The rest of the instruction tracking logic can only be performed if historyInit() has allocated the
* necessary data structures. Note that there is no explicit UI for enabling/disabling history, other than
* adding/removing breakpoints, simply because it's breakpoints that trigger the call to checkInstruction();
* well, OK, and a few other things now, like enabling Messages.INT messages.
*/
if (nState >= 0 && this.aaOpcodeCounts.length) {
this.cInstructions++;
var bOpcode = this.cpu.probeAddr(addr);
if (bOpcode != null) {
this.aaOpcodeCounts[bOpcode][1]++;
var dbgAddr = this.aOpcodeHistory[this.iOpcodeHistory];
dbgAddr.off = this.cpu.getIP();
dbgAddr.sel = this.cpu.getCS();
dbgAddr.addr = addr;
if (++this.iOpcodeHistory == this.aOpcodeHistory.length) this.iOpcodeHistory = 0;
}
}
return false;
};
/**
* checkMemoryRead(addr)
*
* This "check" function is called by a Memory block to inform us that a memory read occurred, giving us an
* opportunity to track the read if we want, and look for a matching "read" breakpoint, if any.
*
* @this {Debugger}
* @param {number} addr
* @return {boolean} true if breakpoint hit, false if not
*/
Debugger.prototype.checkMemoryRead = function(addr)
{
if (this.checkBreakpoint(addr, this.aBreakRead)) {
this.stopCPU(true);
return true;
}
return false;
};
/**
* checkMemoryWrite(addr)
*
* This "check" function is called by a Memory block to inform us that a memory write occurred, giving us an
* opportunity to track the write if we want, and look for a matching "write" breakpoint, if any.
*
* @this {Debugger}
* @param {number} addr
* @return {boolean} true if breakpoint hit, false if not
*/
Debugger.prototype.checkMemoryWrite = function(addr)
{
if (this.checkBreakpoint(addr, this.aBreakWrite)) {
this.stopCPU(true);
return true;
}
return false;
};
/**
* checkPortInput(port, bIn)
*
* This "check" function is called by the Bus component to inform us that port input occurred.
*
* @this {Debugger}
* @param {number} port
* @param {number} bIn
* @return {boolean} true if breakpoint hit, false if not
*/
Debugger.prototype.checkPortInput = function(port, bIn)
{
/*
* We trust that the Bus component won't call us unless we told it to, so we halt unconditionally
*/
this.println("break on input from port " + str.toHexWord(port) + ": " + str.toHexByte(bIn));
this.stopCPU(true);
return true;
};
/**
* checkPortOutput(port, bOut)
*
* This "check" function is called by the Bus component to inform us that port output occurred.
*
* @this {Debugger}
* @param {number} port
* @param {number} bOut
* @return {boolean} true if breakpoint hit, false if not
*/
Debugger.prototype.checkPortOutput = function(port, bOut)
{
/*
* We trust that the Bus component won't call us unless we told it to, so we halt unconditionally
*/
this.println("break on output to port " + str.toHexWord(port) + ": " + str.toHexByte(bOut));
this.stopCPU(true);
return true;
};
/**
* clearBreakpoints()
*
* @this {Debugger}
*/
Debugger.prototype.clearBreakpoints = function()
{
var i;
this.aBreakExec = ["exec"];
if (this.aBreakRead !== undefined) {
for (i = 1; i < this.aBreakRead.length; i++) {
this.bus.removeMemBreak(this.getAddr(this.aBreakRead[i]), false);
}
}
this.aBreakRead = ["read"];
if (this.aBreakWrite !== undefined) {
for (i = 1; i < this.aBreakWrite.length; i++) {
this.bus.removeMemBreak(this.getAddr(this.aBreakWrite[i]), true);
}
}
this.aBreakWrite = ["write"];
/*
* nBreakSuppress ensures we can't get into an infinite loop where a breakpoint lookup requires
* reading a segment descriptor via getSegment(), and that triggers more memory reads, which triggers
* more breakpoint checks.
*/
this.nBreakSuppress = 0;
};
/**
* addBreakpoint(aBreak, dbgAddr, fTempBreak)
*
* @this {Debugger}
* @param {Array} aBreak
* @param {{DbgAddr}} dbgAddr
* @param {boolean} [fTempBreak]
* @return {boolean} true if breakpoint added, false if already exists
*/
Debugger.prototype.addBreakpoint = function(aBreak, dbgAddr, fTempBreak)
{
if (!this.findBreakpoint(aBreak, dbgAddr)) {
dbgAddr.fTempBreak = fTempBreak;
aBreak.push(dbgAddr);
if (aBreak != this.aBreakExec) {
this.bus.addMemBreak(this.getAddr(dbgAddr), aBreak == this.aBreakWrite);
}
if (fTempBreak) {
/*
* Force temporary breakpoints to be interpreted as linear breakpoints
* (hence the assertion that there IS a linear address stored in dbgAddr);
* this allows us to step over calls or interrupts that change the processor mode
*/
dbgAddr.sel = null;
this.assert(dbgAddr.addr);
} else {
this.println("breakpoint enabled: " + this.hexAddr(dbgAddr) + " (" + aBreak[0] + ")");
}
this.historyInit();
return true;
}
return false;
};
/**
* findBreakpoint(aBreak, dbgAddr, fRemove)
*
* @this {Debugger}
* @param {Array} aBreak
* @param {{DbgAddr}} dbgAddr
* @param {boolean} [fRemove]
* @return {boolean} true if found, false if not
*/
Debugger.prototype.findBreakpoint = function(aBreak, dbgAddr, fRemove)
{
var fFound = false;
var addr = this.mapBreakpoint(this.getAddr(dbgAddr));
for (var i = 1; i < aBreak.length; i++) {
var dbgAddrBreak = aBreak[i];
if (addr == this.mapBreakpoint(this.getAddr(dbgAddrBreak))) {
fFound = true;
if (fRemove) {
aBreak.splice(i, 1);
if (aBreak != this.aBreakExec) {
this.bus.removeMemBreak(addr, aBreak == this.aBreakWrite);
}
if (!dbgAddrBreak.fTempBreak) this.println("breakpoint cleared: " + this.hexAddr(dbgAddrBreak) + " (" + aBreak[0] + ")");
this.historyInit();
break;
}
this.println("breakpoint exists: " + this.hexAddr(dbgAddrBreak) + " (" + aBreak[0] + ")");
break;
}
}
return fFound;
};
/**
* listBreakpoints(aBreak)
*
* TODO: We may need to start listing linear addresses also, because segmented address can be ambiguous.
*
* @this {Debugger}
* @param {Array} aBreak
* @return {number} of breakpoints listed, 0 if none
*/
Debugger.prototype.listBreakpoints = function(aBreak)
{
for (var i = 1; i < aBreak.length; i++) {
this.println("breakpoint enabled: " + this.hexAddr(aBreak[i]) + " (" + aBreak[0] + ")");
}
return aBreak.length - 1;
};
/**
* redoBreakpoints()
*
* This function is for the Memory component: whenever the Bus allocates a new Memory block, it calls
* the block's setDebugger() method, which clears the memory block's breakpoint counts. setDebugger(),
* in turn, must call this function to re-apply any existing breakpoints to that block.
*
* This ensures that, even if a memory region is remapped (which creates new Memory blocks in the process),
* any breakpoints that were previously applied to that region will still work.
*
* @this {Debugger}
* @param {number} addr of memory block
* @param {number} size of memory block
* @param {Array} [aBreak]
*/
Debugger.prototype.redoBreakpoints = function(addr, size, aBreak)
{
if (aBreak === undefined) {
this.redoBreakpoints(addr, size, this.aBreakRead);
this.redoBreakpoints(addr, size, this.aBreakWrite);
return;
}
for (var i = 1; i < aBreak.length; i++) {
var addrBreak = this.getAddr(aBreak[i]);
if (addrBreak >= addr && addrBreak < addr + size) {
this.bus.addMemBreak(addrBreak, aBreak == this.aBreakWrite);
}
}
};
/**
* setTempBreakpoint(dbgAddr)
*
* @this {Debugger}
* @param {{DbgAddr}} dbgAddr of new temp breakpoint
*/
Debugger.prototype.setTempBreakpoint = function(dbgAddr)
{
this.addBreakpoint(this.aBreakExec, dbgAddr, true);
};
/**
* clearTempBreakpoint(addr)
*
* @this {Debugger}
* @param {number|undefined} [addr] clear all temp breakpoints if no address specified
*/
Debugger.prototype.clearTempBreakpoint = function(addr)
{
if (addr !== undefined) {
this.checkBreakpoint(addr, this.aBreakExec, true);
this.fProcStep = 0;
} else {
for (var i = 1; i < this.aBreakExec.length; i++) {
var dbgAddrBreak = this.aBreakExec[i];
if (dbgAddrBreak.fTempBreak) {
if (!this.findBreakpoint(this.aBreakExec, dbgAddrBreak, true)) break;
i = 0;
}
}
}
};
/**
* mapBreakpoint(addr)
*
* @this {Debugger}
* @param {number} addr
* @return {number}
*/
Debugger.prototype.mapBreakpoint = function(addr)
{
/*
* Map addresses in the top 64Kb at the top of the address space (assuming either a 16Mb or 4Gb
* address space) to the top of the 1Mb range.
*
* The fact that those two 64Kb regions are aliases of each other on an 80286 is a pain in the BUTT,
* because any CS-based breakpoint you set immediately after a CPU reset will have a physical address
* in the top 16Mb, yet after the first inter-segment JMP, you will be running in the first 1Mb.
*/
var mask = (this.maskAddr & ~0xffff);
if ((addr & mask) == mask) addr &= 0x000fffff;
return addr;
};
/**
* checkBreakpoint(addr, aBreak, fTemp)
*
* @this {Debugger}
* @param {number} addr
* @param {Array} aBreak
* @param {boolean} [fTemp]
* @return {boolean} true if breakpoint has been hit, false if not
*/
Debugger.prototype.checkBreakpoint = function(addr, aBreak, fTemp)
{
/*
* Time to check for execution breakpoints; note that this should be done BEFORE updating frequency
* or history data (see checkInstruction), since we might not actually execute the current instruction.
*/
var fBreak = false;
if (!this.nBreakSuppress++) {
addr = this.mapBreakpoint(addr);
for (var i = 1; i < aBreak.length; i++) {
var dbgAddrBreak = aBreak[i];
/*
* We need to zap the linear address field of the breakpoint address before
* calling getAddr(), to force it to recalculate the linear address every time,
* unless this is a breakpoint on a linear address (as indicated by a null sel).
*/
if (dbgAddrBreak.sel != null) dbgAddrBreak.addr = null;
/*
* We used to calculate the linear address of the breakpoint at the time the
* breakpoint was added, so that a breakpoint set in one mode (eg, in real-mode)
* would still work as intended if the mode changed later (eg, to protected-mode).
*
* However, that created difficulties setting protected-mode breakpoints in segments
* that might not be defined yet, or that could move in physical memory.
*
* If you want to create a real-mode breakpoint that will break regardless of mode,
* use the physical address of the real-mode memory location instead.
*/
if (addr == this.mapBreakpoint(this.getAddr(dbgAddrBreak))) {
if (dbgAddrBreak.fTempBreak) {
this.findBreakpoint(aBreak, dbgAddrBreak, true);
} else if (!fTemp) {
this.println("breakpoint hit: " + this.hexAddr(dbgAddrBreak) + " (" + aBreak[0] + ")");
}
fBreak = true;
break;
}
}
}
this.nBreakSuppress--;
return fBreak;
};
/**
* getInstruction(dbgAddr, sComment, nSequence)
*
* @this {Debugger}
* @param {{DbgAddr}} dbgAddr
* @param {string} [sComment] is an associated comment
* @param {number} [nSequence] is an associated sequence number, undefined if none
* @return {string} (and dbgAddr is updated to the next instruction)
*/
Debugger.prototype.getInstruction = function(dbgAddr, sComment, nSequence)
{
var dbgAddrIns = this.newAddr(dbgAddr.off, dbgAddr.sel, dbgAddr.addr);
var bOpcode = this.getByte(dbgAddr, 1);
/*
* Incorporate the following prefixes into the current instruction byte stream.
* TODO: Determine the actual effect of multiple OS (and/or multiple AS) prefixes.
*/
var cMax = 2; // let's make sure unfortunate memory contents don't screw us
while ((bOpcode == X86.OPCODE.OS || bOpcode == X86.OPCODE.AS) && cMax--) {
if (bOpcode == X86.OPCODE.OS) {
dbgAddr.fData32 = !dbgAddr.fData32;
} else {
dbgAddr.fAddr32 = !dbgAddr.fAddr32;
}
bOpcode = this.getByte(dbgAddr, 1);
}
var aOpDesc = this.aaOpDescs[bOpcode];
var iIns = aOpDesc[0];
var bModRM = -1;
if (iIns == Debugger.INS.OP0F) {
var b = this.getByte(dbgAddr, 1);
aOpDesc = Debugger.aaOp0FDescs[b] || Debugger.aOpDescUndefined;
bOpcode |= (b << 8);
iIns = aOpDesc[0];
}
if (iIns >= Debugger.INS_NAMES.length) {
bModRM = this.getByte(dbgAddr, 1);
aOpDesc = Debugger.aaGrpDescs[iIns - Debugger.INS_NAMES.length][(bModRM >> 3) & 0x7];
}
var sOpcode = Debugger.INS_NAMES[aOpDesc[0]];
var cOperands = aOpDesc.length - 1;
var sOperands = "";
if (this.isStringIns(bOpcode)) {
cOperands = 0; // suppress display of operands for string instructions
if (dbgAddr.fData32 && sOpcode.slice(-1) == 'W') sOpcode = sOpcode.slice(0, -1) + 'D';
}
var typeCPU = null;
var fNonPrefix = true;
for (var iOperand = 1; iOperand <= cOperands; iOperand++) {
var disp, offset, cch;
var sOperand = "";
var type = aOpDesc[iOperand];
if (type === undefined) continue;
if (typeCPU == null) typeCPU = type >> Debugger.TYPE_CPU_SHIFT;
var typeSize = type & Debugger.TYPE_SIZE;
if (typeSize == Debugger.TYPE_NONE) {
continue;
}
if (typeSize == Debugger.TYPE_PREFIX) {
fNonPrefix = false;
continue;
}
var typeMode = type & Debugger.TYPE_MODE;
if (typeMode >= Debugger.TYPE_MODRM) {
if (bModRM < 0) {
bModRM = this.getByte(dbgAddr, 1);
}
if (typeMode >= Debugger.TYPE_REG) {
sOperand = this.getRegOperand((bModRM >> 3) & 0x7, type, dbgAddr);
}
else {
sOperand = this.getModRMOperand(bModRM, type, dbgAddr);
}
}
else if (typeMode == Debugger.TYPE_ONE) {
sOperand = "1";
}
else if (typeMode == Debugger.TYPE_IMM) {
sOperand = this.getImmOperand(type, dbgAddr);
}
else if (typeMode == Debugger.TYPE_IMMOFF) {
if (!dbgAddr.fAddr32) {
cch = 4;
offset = this.getShort(dbgAddr, 2);
} else {
cch = 8;
offset = this.getLong(dbgAddr, 4);
}
sOperand = "[" + str.toHex(offset, cch) + "]";
}
else if (typeMode == Debugger.TYPE_IMMREL) {
if (typeSize == Debugger.TYPE_BYTE) {
disp = ((this.getByte(dbgAddr, 1) << 24) >> 24);
}
else {
disp = this.getWord(dbgAddr, true);
}
offset = (dbgAddr.off + disp) & (dbgAddr.fData32? -1 : 0xffff);
var aSymbol = this.findSymbolAtAddr(this.newAddr(offset, dbgAddr.sel));
sOperand = aSymbol[0] || str.toHex(offset, dbgAddr.fData32? 8: 4);
}
else if (typeMode == Debugger.TYPE_IMPREG) {
sOperand = this.getRegOperand((type & Debugger.TYPE_IREG) >> 8, type, dbgAddr);
}
else if (typeMode == Debugger.TYPE_IMPSEG) {
sOperand = this.getRegOperand((type & Debugger.TYPE_IREG) >> 8, Debugger.TYPE_SEGREG, dbgAddr);
}
else if (typeMode == Debugger.TYPE_DSSI) {
sOperand = "DS:[SI]";
}
else if (typeMode == Debugger.TYPE_ESDI) {
sOperand = "ES:[DI]";
}
if (!sOperand || !sOperand.length) {
sOperands = "INVALID";
break;
}
if (sOperands.length > 0) sOperands += ",";
sOperands += sOperand;
}
var sLine = this.hexAddr(dbgAddrIns) + " ";
var sBytes = "";
do {
sBytes += str.toHex(this.getByte(dbgAddrIns, 1), 2);
} while (dbgAddrIns.addr != dbgAddr.addr);
sLine += str.pad(sBytes, 16);
sLine += str.pad(sOpcode, 8);
if (sOperands) sLine += " " + sOperands;
if (this.cpu.model < Debugger.CPUS[typeCPU]) {
sComment = Debugger.CPUS[typeCPU] + " CPU only";
}
if (sComment && fNonPrefix) {
sLine = str.pad(sLine, 56) + ';' + sComment;
if (!this.cpu.aFlags.fChecksum) {
sLine += (nSequence != null? '=' + nSequence.toString() : "");
} else {
var nCycles = this.cpu.getCycles();
sLine += "cycles=" + nCycles.toString() + " cs=" + str.toHex(this.cpu.aCounts.nChecksum);
}
}
this.initAddrSize(dbgAddr, fNonPrefix);
return sLine;
};
/**
* getImmOperand(type, dbgAddr)
*
* @this {Debugger}
* @param {number} type
* @param {{DbgAddr}} dbgAddr
* @return {string} operand
*/
Debugger.prototype.getImmOperand = function(type, dbgAddr)
{
var sOperand = " ";
var typeSize = type & Debugger.TYPE_SIZE;
switch (typeSize) {
case Debugger.TYPE_BYTE:
/*
* There's the occasional immediate byte we don't need to display (eg, the 0x0A
* following an AAM or AAD instruction), so we suppress the byte if it lacks a TYPE_IN
* or TYPE_OUT designation (and TYPE_BOTH, as the name implies, includes both).
*/
if (type & Debugger.TYPE_BOTH) {
sOperand = str.toHex(this.getByte(dbgAddr, 1), 2);
}
break;
case Debugger.TYPE_SBYTE:
sOperand = str.toHex((this.getByte(dbgAddr, 1) << 24) >> 24, 4);
break;
case Debugger.TYPE_VWORD:
case Debugger.TYPE_2WORD:
if (dbgAddr.fData32) {
sOperand = str.toHex(this.getLong(dbgAddr, 4));
break;
}
/* falls through */
case Debugger.TYPE_WORD:
sOperand = str.toHex(this.getShort(dbgAddr, 2), 4);
break;
case Debugger.TYPE_FARP:
sOperand = this.hexAddr(this.newAddr(this.getWord(dbgAddr, true), this.getShort(dbgAddr, 2), null, dbgAddr.fData32, dbgAddr.fAddr32));
break;
default:
sOperand = "imm(" + str.toHexWord(type) + ")";
break;
}
return sOperand;
};
/**
* getRegOperand(bReg, type, dbgAddr)
*
* @this {Debugger}
* @param {number} bReg
* @param {number} type
* @param {{DbgAddr}} dbgAddr
* @return {string} operand
*/
Debugger.prototype.getRegOperand = function(bReg, type, dbgAddr)
{
var typeMode = type & Debugger.TYPE_MODE;
if (typeMode == Debugger.TYPE_SEGREG) {
if (bReg > Debugger.REG_GS ||
bReg >= Debugger.REG_FS && this.cpu.model < X86.MODEL_80386) return "??";
bReg += Debugger.REG_SEG;
}
else if (typeMode == Debugger.TYPE_CTLREG) {
bReg += Debugger.REG_CR0;
}
else {
var typeSize = type & Debugger.TYPE_SIZE;
if (typeSize >= Debugger.TYPE_WORD) {
if (bReg < Debugger.REG_AX) {
bReg += Debugger.REG_AX - Debugger.REG_AL;
}
if (typeSize == Debugger.TYPE_DWORD || typeSize == Debugger.TYPE_VWORD && dbgAddr.fData32) {
bReg += Debugger.REG_EAX - Debugger.REG_AX;
}
}
}
return Debugger.REGS[bReg];
};
/**
* getSIBOperand(bMod, dbgAddr)
*
* @this {Debugger}
* @param {number} bMod
* @param {{DbgAddr}} dbgAddr
* @return {string} operand
*/
Debugger.prototype.getSIBOperand = function(bMod, dbgAddr)
{
var bSIB = this.getByte(dbgAddr, 1);
var bScale = bSIB >> 6;
var bIndex = (bSIB >> 3) & 0x7;
var bBase = bSIB & 0x7;
var sOperand = "";
if (bMod || bBase != 5) {
sOperand = Debugger.RMS[bBase + 8];
}
if (bIndex != 4) {
if (sOperand) sOperand += '+';
sOperand += Debugger.RMS[bIndex + 8];
if (bScale) sOperand += '*' + (0x1 << bScale);
}
return sOperand;
};
/**
* getModRMOperand(bModRM, type, dbgAddr)
*
* @this {Debugger}
* @param {number} bModRM
* @param {number} type
* @param {{DbgAddr}} dbgAddr
* @return {string} operand
*/
Debugger.prototype.getModRMOperand = function(bModRM, type, dbgAddr)
{
var sOperand = "";
var bMod = bModRM >> 6;
var bRM = bModRM & 0x7;
if (bMod < 3) {
var disp;
if (!bMod && (!dbgAddr.fAddr32 && bRM == 6 || dbgAddr.fAddr32 && bRM == 5)) {
bMod = 2;
} else {
if (dbgAddr.fAddr32) {
if (bRM != 4) {
bRM += 8;
} else {
sOperand = this.getSIBOperand(bMod, dbgAddr);
}
}
if (!sOperand) sOperand = Debugger.RMS[bRM];
}
if (bMod == 1) {
disp = this.getByte(dbgAddr, 1);
if (!(disp & 0x80)) {
sOperand += "+" + str.toHex(disp, 2);
}
else {
disp = ((disp << 24) >> 24);
sOperand += "-" + str.toHex(-disp, 2);
}
}
else if (bMod == 2) {
if (sOperand) sOperand += '+';
if (!dbgAddr.fAddr32) {
disp = this.getShort(dbgAddr, 2);
sOperand += str.toHex(disp, 4);
} else {
disp = this.getLong(dbgAddr, 4);
sOperand += str.toHex(disp);
}
}
sOperand = "[" + sOperand + "]";
if ((type & Debugger.TYPE_SIZE) == Debugger.TYPE_FARP) sOperand = "FAR " + sOperand;
}
else {
sOperand = this.getRegOperand(bRM, type, dbgAddr);
}
return sOperand;
};
/**
* parseInstruction(sOp, sOperand, addr)
*
* This generally requires an exact match of both the operation code (sOp) and mode operand
* (sOperand) against the aOps[] and aOpMods[] arrays, respectively; however, the regular
* expression built from aOpMods and stored in regexOpModes does relax the matching criteria
* slightly; ie, a 4-digit hex value ("nnnn") will be satisfied with either 3 or 4 digits, and
* similarly, a 2-digit hex address (nn) will be satisfied with either 1 or 2 digits.
*
* Note that this function does not actually store the instruction into memory, even though it requires
* a target address (addr); that parameter is currently needed ONLY for "branch" instructions, because in
* order to calculate the branch displacement, it needs to know where the instruction will ultimately be
* stored, relative to its target address.
*
* Another handy feature of this function is its ability to display all available modes for a particular
* operation. For example, while in "assemble mode", if one types:
*
* ldy?
*
* the Debugger will display:
*
* supported opcodes:
* A0: LDY nn
* A4: LDY [nn]
* AC: LDY [nnnn]
* B4: LDY [nn+X]
* BC: LDY [nnnn+X]
*
* Use of a trailing "?" on any opcode will display all variations of that opcode; no instruction will be
* assembled, and the operand parameter, if any, will be ignored.
*
* Although this function is capable of reporting numerous errors, roughly half of them indicate internal
* consistency errors, not user errors; the former should really be asserts, but I'm not comfortable bombing
* out because of my error as opposed to their error. The only errors a user should expect to see:
*
* "unknown operation": sOp is not a valid operation (per aOps)
* "unknown operand": sOperand is not a valid operand (per aOpMods)
* "unknown instruction": the combination of sOp + sOperand does not exist (per aaOpDescs)
* "branch out of range": the branch address, relative to addr, is too far away
*
* @this {Debugger}
* @param {string} sOp
* @param {string|undefined} sOperand
* @param {{DbgAddr}} dbgAddr of memory where this instruction is being assembled
* @return {Array.<number>} of opcode bytes; if the instruction can't be parsed, the array will be empty
*/
Debugger.prototype.parseInstruction = function(sOp, sOperand, dbgAddr)
{
var aOpBytes = [];
this.println("not supported yet");
return aOpBytes;
};
/**
* getFlagStr(sFlag)
*
* @this {Debugger}
* @param {string} sFlag
* @return {string} value of flag
*/
Debugger.prototype.getFlagStr = function(sFlag)
{
var b;
switch (sFlag) {
case "V":
b = this.cpu.getOF();
break;
case "D":
b = this.cpu.getDF();
break;
case "I":
b = this.cpu.getIF();
break;
case "T":
b = this.cpu.getTF();
break;
case "S":
b = this.cpu.getSF();
break;
case "Z":
b = this.cpu.getZF();
break;
case "A":
b = this.cpu.getAF();
break;
case "P":
b = this.cpu.getPF();
break;
case "C":
b = this.cpu.getCF();
break;
default:
b = 0;
break;
}
return sFlag + (b? '1' : '0') + ' ';
};
/**
* getRegString(iReg)
*
* @this {Debugger}
* @param {number} iReg
* @return {string}
*/
Debugger.prototype.getRegString = function(iReg)
{
if (iReg >= Debugger.REG_AX && iReg <= Debugger.REG_DI && this.cchReg > 4) iReg += Debugger.REG_EAX - Debugger.REG_AX;
var sReg = Debugger.REGS[iReg];
if (iReg == Debugger.REG_CR0 && this.cpu.model == X86.MODEL_80286) sReg = "MS";
return sReg + '=' + this.getRegValue(iReg) + ' ';
};
/**
* getSegString(seg, fProt)
*
* @this {Debugger}
* @param {X86Seg} seg
* @param {boolean} [fProt]
* @return {string}
*/
Debugger.prototype.getSegString = function(seg, fProt)
{
return seg.sName + '=' + str.toHex(seg.sel, 4) + (fProt? '[' + str.toHex(seg.base, this.cchAddr) + ',' + str.toHex(seg.limit, (seg.limit & ~0xffff)? 8 : 4) + ']' : "");
};
/**
* getDTRString(sName, sel, addr, addrLimit)
*
* @this {Debugger}
* @param {string} sName
* @param {number|null} sel
* @param {number} addr
* @param {number} addrLimit
* @return {string}
*/
Debugger.prototype.getDTRString = function(sName, sel, addr, addrLimit)
{
return sName + '=' + (sel != null? str.toHex(sel, 4) : "") + '[' + str.toHex(addr, this.cchAddr) + ',' + str.toHex(addrLimit - addr, 4) + ']';
};
/**
* getRegDump(fProt)
*
* Sample 8086 and 80286 real-mode register dump:
*
* AX=0000 BX=0000 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
* SS=0000 DS=0000 ES=0000 PS=0002 V0 D0 I0 T0 S0 Z0 A0 P0 C0
* F000:FFF0 EA5BE000F0 JMP F000:E05B
*
* Sample 80386 real-mode register dump:
*
* EAX=00000000 EBX=00000000 ECX=00000000 EDX=00000000
* ESP=00000000 EBP=00000000 ESI=00000000 EDI=00000000
* SS=0000 DS=0000 ES=0000 FS=0000 GS=0000 PS=00000002 V0 D0 I0 T0 S0 Z0 A0 P0 C0
* F000:FFF0 EA05F900F0 JMP F000:F905
*
* Sample 80286 protected-mode register dump:
*
* AX=0000 BX=0000 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
* SS=0000[000000,FFFF] DS=0000[000000,FFFF] ES=0000[000000,FFFF] A20=ON
* CS=F000[FF0000,FFFF] LD=0000[000000,FFFF] GD=[000000,FFFF] ID=[000000,03FF]
* TR=0000 MS=FFF0 PS=0002 V0 D0 I0 T0 S0 Z0 A0 P0 C0
* F000:FFF0 EA5BE000F0 JMP F000:E05B
*
* Sample 80386 protected-mode register dump:
*
* EAX=00000000 EBX=00000000 ECX=00000000 EDX=00000000
* ESP=00000000 EBP=00000000 ESI=00000000 EDI=00000000
* SS=0000[00000000,FFFF] DS=0000[00000000,FFFF] ES=0000[00000000,FFFF]
* CS=F000[FFFF0000,FFFF] FS=0000[00000000,FFFF] GS=0000[00000000,FFFF]
* LD=0000[00000000,FFFF] GD=[00000000,FFFF] ID=[00000000,03FF] TR=0000 A20=ON
* CR0=00000010 CR2=00000000 CR3=00000000 PS=00000002 V0 D0 I0 T0 S0 Z0 A0 P0 C0
* F000:0000FFF0 EA05F900F0 JMP F000:0000F905
*
* This no longer includes CS in real-mode (or EIP in any mode), because that information can be obtained from the
* first line of disassembly, which an "r" or "rp" command will also display.
*
* Note that even when the processor is in real mode, you can always use the "rp" command to force a protected-mode
* dump, in case you need to verify any selector base or limit values, since those do affect real-mode operation.
*
* @this {Debugger}
* @param {boolean} [fProt]
* @return {string}
*/
Debugger.prototype.getRegDump = function(fProt)
{
var s;
if (fProt === undefined) {
fProt = !!(this.cpu.regCR0 & X86.CR0.MSW.PE);
}
s = this.getRegString(Debugger.REG_AX) +
this.getRegString(Debugger.REG_BX) +
this.getRegString(Debugger.REG_CX) +
this.getRegString(Debugger.REG_DX) + (this.cchReg > 4? '\n' : '') +
this.getRegString(Debugger.REG_SP) +
this.getRegString(Debugger.REG_BP) +
this.getRegString(Debugger.REG_SI) +
this.getRegString(Debugger.REG_DI) + '\n' +
this.getSegString(this.cpu.segSS, fProt) + ' ' +
this.getSegString(this.cpu.segDS, fProt) + ' ' +
this.getSegString(this.cpu.segES, fProt) + ' ';
if (fProt) {
var sTR = "TR=" + str.toHex(this.cpu.segTSS.sel, 4);
var sA20 = "A20=" + (this.bus.getA20()? "ON " : "OFF ");
if (this.cpu.model < X86.MODEL_80386) {
sTR = '\n' + sTR;
s += sA20; sA20 = '';
}
s += '\n' + this.getSegString(this.cpu.segCS, fProt) + ' ';
if (I386 && this.cpu.model >= X86.MODEL_80386) {
sA20 += '\n';
s += this.getSegString(this.cpu.segFS, fProt) + ' ' +
this.getSegString(this.cpu.segGS, fProt) + '\n';
}
s += this.getDTRString("LD", this.cpu.segLDT.sel, this.cpu.segLDT.base, this.cpu.segLDT.base + this.cpu.segLDT.limit) + ' ' +
this.getDTRString("GD", null, this.cpu.addrGDT, this.cpu.addrGDTLimit) + ' ' +
this.getDTRString("ID", null, this.cpu.addrIDT, this.cpu.addrIDTLimit) + ' ';
s += sTR + ' ' + sA20;
s += this.getRegString(Debugger.REG_CR0);
if (I386 && this.cpu.model >= X86.MODEL_80386) {
s += this.getRegString(Debugger.REG_CR2) + this.getRegString(Debugger.REG_CR3);
}
} else {
if (I386 && this.cpu.model >= X86.MODEL_80386) {
s += this.getSegString(this.cpu.segFS, fProt) + ' ' +
this.getSegString(this.cpu.segGS, fProt) + ' ';
}
}
s += this.getRegString(Debugger.REG_PS) +
this.getFlagStr("V") + this.getFlagStr("D") + this.getFlagStr("I") + this.getFlagStr("T") +
this.getFlagStr("S") + this.getFlagStr("Z") + this.getFlagStr("A") + this.getFlagStr("P") + this.getFlagStr("C");
return s;
};
/**
* parseAddr(sAddr, type)
*
* As discussed above, dbgAddr variables contain one or more of: off, sel, and addr. They represent
* a segmented address (sel:off) when sel is defined or a linear address (addr) when sel is undefined
* (or null).
*
* To create a segmented address, specify two values separated by ":"; for a linear address, use
* a "%" prefix. We check for ":" after "%", so if for some strange reason you specify both, the
* address will be treated as segmented, not linear.
*
* The "%" syntax is similar to that used by the Windows 80386 kernel debugger (wdeb386) for linear
* addresses. If/when we add support for processors with page tables, we will likely adopt the same
* convention for linear addresses and provide a different syntax (eg, "%%") physical memory references.
*
* Address evaluation and validation (eg, range checks) are no longer performed at this stage. That's
* done later, by getAddr(), which returns X86.ADDR_INVALID for invalid segments, out-of-range offsets,
* etc. The Debugger's low-level get/set memory functions verify all getAddr() results, but even if an
* invalid address is passed through to the Bus memory interfaces, the address will simply be masked with
* Bus.nBusLimit; in the case of X86.ADDR_INVALID, that will generally refer to the top of the physical
* address space.
*
* @this {Debugger}
* @param {string|undefined} sAddr
* @param {number|undefined} type is the address segment type, in case sAddr doesn't specify a segment
* @return {{DbgAddr}}
*/
Debugger.prototype.parseAddr = function(sAddr, type)
{
var dbgAddr;
var dbgAddrNext = (type == Debugger.ADDR_DATA? this.dbgAddrNextData : this.dbgAddrNextCode);
var off = dbgAddrNext.off, sel = dbgAddrNext.sel, addr = dbgAddrNext.addr;
if (sAddr !== undefined) {
if (sAddr.charAt(0) == '%') {
sAddr = sAddr.substr(1);
off = 0;
sel = null;
addr = 0;
}
dbgAddr = this.findSymbolAddr(sAddr);
if (dbgAddr && dbgAddr.off != null) return dbgAddr;
var iColon = sAddr.indexOf(":");
if (iColon < 0) {
if (sel != null) {
off = this.parseValue(sAddr);
addr = null;
} else {
addr = this.parseValue(sAddr);
}
}
else {
sel = this.parseValue(sAddr.substring(0, iColon));
off = this.parseValue(sAddr.substring(iColon + 1));
addr = null;
}
}
dbgAddr = this.newAddr(off, sel, addr);
this.checkLimit(dbgAddr);
return dbgAddr;
};
/**
* parseValue(sValue, sName)
*
* @this {Debugger}
* @param {string|undefined} sValue
* @param {string} [sName] is the name of the value, if any
* @return {number|undefined} numeric value, or undefined if sValue is either undefined or invalid
*/
Debugger.prototype.parseValue = function(sValue, sName)
{
var value;
if (sValue !== undefined) {
var iReg = this.getRegIndex(sValue);
if (iReg >= 0) sValue = this.getRegValue(iReg);
value = str.parseInt(sValue);
if (value === undefined) this.println("invalid " + (sName? sName : "value") + ": " + sValue);
} else {
this.println("missing " + (sName || "value"));
}
return value;
};
/**
* addSymbols(addr, size, aSymbols)
*
* As filedump.js (formerly convrom.php) explains, aSymbols is a JSON-encoded object whose properties consist
* of all the symbols (in upper-case), and the values of those properties are objects containing any or all of
* the following properties:
*
* "v": the value of an absolute (unsized) value
* "b": either 1, 2, 4 or undefined if an unsized value
* "s": either a hard-coded segment or undefined
* "o": the offset of the symbol within the associated address space
* "l": the original-case version of the symbol, present only if it wasn't originally upper-case
* "a": annotation for the specified offset; eg, the original assembly language, with optional comment
*
* To that list of properties, we also add:
*
* "p": the physical address (calculated whenever both "s" and "o" properties are defined)
*
* Note that values for any "v", "b", "s" and "o" properties are unquoted decimal values, and the values
* for any "l" or "a" properties are quoted strings. Also, if double-quotes were used in any of the original
* annotation ("a") values, they will have been converted to two single-quotes, so we're responsible for
* converting them back to individual double-quotes.
*
* For example:
* {
* "HF_PORT": {
* "v":800
* },
* "HDISK_INT": {
* "b":4, "s":0, "o":52
* },
* "ORG_VECTOR": {
* "b":4, "s":0, "o":76
* },
* "CMD_BLOCK": {
* "b":1, "s":64, "o":66
* },
* "DISK_SETUP": {
* "o":3
* },
* ".40": {
* "o":40, "a":"MOV AX,WORD PTR ORG_VECTOR ;GET DISKETTE VECTOR"
* }
* }
*
* If a symbol only has an offset, then that offset value can be assigned to the symbol property directly:
*
* "DISK_SETUP": 3
*
* The last property is an example of an "anonymous" entry, for offsets where there is no associated symbol.
* Such entries are identified by a period followed by a unique number (usually the offset of the entry), and
* they usually only contain offset ("o") and annotation ("a") properties. I could eliminate the leading
* period, but it offers a very convenient way of quickly discriminating among genuine vs. anonymous symbols.
*
* We add all these entries to our internal symbol table, which is an array of 4-element arrays, each of which
* look like:
*
* [addr, size, aSymbols, aOffsetPairs]
*
* There are two basic symbol operations: findSymbolAddr(), which takes a string and attempts to match it
* to a non-anonymous symbol with a matching offset ("o") property, and findSymbolAtAddr(), which takes an
* address and finds the symbol, if any, at that address.
*
* To implement findSymbolAtAddr() efficiently, addSymbols() creates an array of [offset, sSymbol] pairs
* (aOffsetPairs), one pair for each symbol that corresponds to an offset within the specified address space.
*
* We guarantee the elements of aOffsetPairs are in offset order, because we build it using binaryInsert();
* it's quite likely that the MAP file already ordered all its symbols in offset order, but since they're
* hand-edited files, we can't assume that. This insures that findSymbolAtAddr()'s binarySearch() will operate
* properly.
*
* @this {Debugger}
* @param {number} addr is the physical address of the region where the given symbols are located
* @param {number} size is the size of the region, in bytes
* @param {Object} aSymbols is the collection of symbols (the format of this object is described below)
*/
Debugger.prototype.addSymbols = function(addr, size, aSymbols)
{
var dbgAddr = {};
var aOffsetPairs = [];
var fnComparePairs = function(p1, p2) {
return p1[0] > p2[0]? 1 : p1[0] < p2[0]? -1 : 0;
};
for (var sSymbol in aSymbols) {
var symbol = aSymbols[sSymbol];
if (typeof symbol == "number") {
aSymbols[sSymbol] = symbol = {'o': symbol};
}
var off = symbol['o'];
var sel = symbol['s'];
var sAnnotation = symbol['a'];
if (off !== undefined) {
if (sel !== undefined) {
dbgAddr.off = off;
dbgAddr.sel = sel;
dbgAddr.addr = null;
/*
* getAddr() computes the corresponding physical address and saves it in dbgAddr.addr.
*/
this.getAddr(dbgAddr);
/*
* The physical address for any symbol located in the top 64Kb of the machine's address space
* should be relocated to the top 64Kb of the first 1Mb, so that we're immune from any changes
* to the A20 line.
*/
if ((dbgAddr.addr & ~0xffff) == (this.bus.nBusLimit & ~0xffff)) {
dbgAddr.addr &= 0x000fffff;
}
symbol['p'] = dbgAddr.addr;
}
usr.binaryInsert(aOffsetPairs, [off, sSymbol], fnComparePairs);
}
if (sAnnotation) symbol['a'] = sAnnotation.replace(/''/g, "\"");
}
this.aSymbolTable.push([addr, size, aSymbols, aOffsetPairs]);
};
/**
* dumpSymbols()
*
* TODO: Add "numerical" and "alphabetical" dump options. This is simply dumping them in whatever
* order they appeared in the original MAP file.
*
* @this {Debugger}
*/
Debugger.prototype.dumpSymbols = function()
{
for (var i = 0; i < this.aSymbolTable.length; i++) {
var addr = this.aSymbolTable[i][0];
//var size = this.aSymbolTable[i][1];
var aSymbols = this.aSymbolTable[i][2];
for (var sSymbol in aSymbols) {
if (sSymbol.charAt(0) == '.') continue;
var symbol = aSymbols[sSymbol];
var off = symbol['o'];
if (off === undefined) continue;
var sel = symbol['s'];
if (sel === undefined) sel = (addr >>> 4);
var sSymbolOrig = aSymbols[sSymbol]['l'];
if (sSymbolOrig) sSymbol = sSymbolOrig;
this.println(this.hexOffset(off, sel) + " " + sSymbol);
}
}
};
/**
* findSymbolAddr(sSymbol)
*
* Search aSymbolTable for sSymbol, and if found, return a dbgAddr (same as parseAddr())
*
* @this {Debugger}
* @param {string} sSymbol
* @return {{DbgAddr}|null} a valid dbgAddr if a valid symbol, an empty dbgAddr if an unknown symbol, or null if not a symbol
*/
Debugger.prototype.findSymbolAddr = function(sSymbol)
{
var dbgAddr = null;
if (sSymbol.match(/^[a-z_][a-z0-9_]*$/i)) {
dbgAddr = {};
var sUpperCase = sSymbol.toUpperCase();
for (var i = 0; i < this.aSymbolTable.length; i++) {
var addr = this.aSymbolTable[i][0];
//var size = this.aSymbolTable[i][1];
var aSymbols = this.aSymbolTable[i][2];
var symbol = aSymbols[sUpperCase];
if (symbol !== undefined) {
var off = symbol['o'];
if (off !== undefined) {
/*
* We assume that every ROM is ORG'ed at 0x0000, and therefore unless the symbol has an
* explicitly-defined segment, we return the segment as "addr >>> 4". Down the road, we may
* want/need to support a special symbol entry (eg, ".ORG") that defines an alternate origin.
*/
var sel = symbol['s'];
if (sel === undefined) sel = addr >>> 4;
// dbgAddr = this.newAddr(off, sel);
dbgAddr.off = off;
dbgAddr.sel = sel;
if (symbol['p'] !== undefined) dbgAddr.addr = symbol['p'];
}
/*
* The symbol matched, but it wasn't for an address (no "o" offset), and there's no point
* looking any farther, since each symbol appears only once, so we indicate it's an unknown symbol.
*/
break;
}
}
}
return dbgAddr;
};
/**
* findSymbolAtAddr(dbgAddr, fNearest)
*
* Search aSymbolTable for dbgAddr, and return an Array for the corresponding symbol (empty if not found).
*
* If fNearest is true, and no exact match was found, then the Array returned will contain TWO sets of
* entries: [0]-[3] will refer to closest preceding symbol, and [4]-[7] will refer to the closest subsequent symbol.
*
* @this {Debugger}
* @param {{DbgAddr}} dbgAddr
* @param {boolean} [fNearest]
* @return {Array|null} where [0] == symbol name, [1] == symbol value, [2] == any annotation, and [3] == any associated comment
*/
Debugger.prototype.findSymbolAtAddr = function(dbgAddr, fNearest)
{
var aSymbol = [];
var addr = this.getAddr(dbgAddr);
for (var iTable = 0; iTable < this.aSymbolTable.length; iTable++) {
var addrSymbol = this.aSymbolTable[iTable][0];
var sizeSymbol = this.aSymbolTable[iTable][1];
if (addr >= addrSymbol && addr < addrSymbol + sizeSymbol) {
var offset = dbgAddr.off;
var aOffsetPairs = this.aSymbolTable[iTable][3];
var fnComparePairs = function(p1, p2)
{
return p1[0] > p2[0]? 1 : p1[0] < p2[0]? -1 : 0;
};
var result = usr.binarySearch(aOffsetPairs, [offset], fnComparePairs);
if (result >= 0) {
this.returnSymbol(iTable, result, aSymbol);
}
else if (fNearest) {
result = ~result;
this.returnSymbol(iTable, result-1, aSymbol);
this.returnSymbol(iTable, result, aSymbol);
}
break;
}
}
return aSymbol;
};
/**
* returnSymbol(iTable, iOffset, aSymbol)
*
* Helper function for findSymbolAtAddr().
*
* @param {number} iTable
* @param {number} iOffset
* @param {Array} aSymbol is updated with the specified symbol, if it exists
*/
Debugger.prototype.returnSymbol = function(iTable, iOffset, aSymbol)
{
var symbol = {};
var aOffsetPairs = this.aSymbolTable[iTable][3];
var offset = 0, sSymbol = null;
if (iOffset >= 0 && iOffset < aOffsetPairs.length) {
offset = aOffsetPairs[iOffset][0];
sSymbol = aOffsetPairs[iOffset][1];
}
if (sSymbol) {
symbol = this.aSymbolTable[iTable][2][sSymbol];
sSymbol = (sSymbol.charAt(0) == '.'? null : (symbol['l'] || sSymbol));
}
aSymbol.push(sSymbol);
aSymbol.push(offset);
aSymbol.push(symbol['a']);
aSymbol.push(symbol['c']);
};
/**
* doHelp()
*
* @this {Debugger}
*/
Debugger.prototype.doHelp = function()
{
var s = "commands:";
for (var sCommand in Debugger.COMMANDS) {
s += '\n' + str.pad(sCommand, 7) + Debugger.COMMANDS[sCommand];
}
if (!this.checksEnabled()) s += "\nnote: frequency/history disabled if no exec breakpoints";
this.println(s);
};
/**
* doAssemble(asArgs)
*
* This always receives the complete argument array, where the order of the arguments is:
*
* [0]: the assemble command (assumed to be "a")
* [1]: the target address (eg, "200")
* [2]: the operation code, aka instruction name (eg, "adc")
* [3]: the operation mode operand, if any (eg, "14", "[1234]", etc)
*
* The Debugger enters "assemble mode" whenever only the first (or first and second) arguments are present.
* As long as "assemble mode is active, the user can omit the first two arguments on all later assemble commands
* until "assemble mode" is cancelled with an empty command line; the command processor automatically prepends "a"
* and the next available target address to the argument array.
*
* Entering "assemble mode" is optional; one could enter a series of fully-qualified assemble commands; eg:
*
* a ff00 cld
* a ff01 ldx 28
* ...
*
* without ever entering "assemble mode", but of course, that requires more typing and doesn't take advantage
* of automatic target address advancement (see dbgAddrAssemble).
*
* NOTE: As the previous example implies, you can even assemble new instructions into ROM address space;
* as our setByte() function explains, the ROM write-notification handlers only refuse writes from the CPU.
*
* @this {Debugger}
* @param {Array.<string>} asArgs is the complete argument array, beginning with the "a" command in asArgs[0]
*/
Debugger.prototype.doAssemble = function(asArgs)
{
var dbgAddr = this.parseAddr(asArgs[1], Debugger.ADDR_CODE);
if (dbgAddr.off == null) return;
this.dbgAddrAssemble = dbgAddr;
if (asArgs[2] === undefined) {
this.println("begin assemble @" + this.hexAddr(dbgAddr));
this.fAssemble = true;
this.cpu.updateCPU();
return;
}
var aOpBytes = this.parseInstruction(asArgs[2], asArgs[3], dbgAddr);
if (aOpBytes.length) {
for (var i = 0; i < aOpBytes.length; i++) {
this.setByte(dbgAddr, aOpBytes[i], 1);
}
/*
* Since getInstruction() also updates the specified address, dbgAddrAssemble is automatically advanced.
*/
this.println(this.getInstruction(this.dbgAddrAssemble));
}
};
/**
* doBreak(sCmd, sAddr)
*
* As the "help" output below indicates, the following breakpoint commands are supported:
*
* bp [a] set exec breakpoint on linear addr [a]
* br [a] set read breakpoint on linear addr [a]
* bw [a] set write breakpoint on linear addr [a]
* bc [a] clear breakpoint on linear addr [a] (use "*" for all breakpoints)
* bl list breakpoints
*
* to which we have recently added the following I/O breakpoint commands:
*
* bi [p] toggle input breakpoint on port [p] (use "*" for all input ports)
* bo [p] toggle output breakpoint on port [p] (use "*" for all output ports)
*
* These two new commands operate as toggles so that if "*" is used to trap all input (or output),
* you can also use these commands to NOT trap specific ports.
*
* @this {Debugger}
* @param {string} sCmd
* @param {string} [sAddr]
*/
Debugger.prototype.doBreak = function(sCmd, sAddr)
{
var sParm = sCmd.charAt(1);
if (!sParm || sParm == "?") {
this.println("\nbreakpoint commands:");
this.println("\tbi [p]\ttoggle break on input port [p]");
this.println("\tbo [p]\ttoggle break on output port [p]");
this.println("\tbp [a]\tset exec breakpoint at addr [a]");
this.println("\tbr [a]\tset read breakpoint at addr [a]");
this.println("\tbw [a]\tset write breakpoint at addr [a]");
this.println("\tbc [a]\tclear breakpoint at addr [a]");
this.println("\tbl\tlist all breakpoints");
return;
}
if (sParm == "l") {
var cBreaks = 0;
cBreaks += this.listBreakpoints(this.aBreakExec);
cBreaks += this.listBreakpoints(this.aBreakRead);
cBreaks += this.listBreakpoints(this.aBreakWrite);
if (!cBreaks) this.println("no breakpoints");
return;
}
if (sAddr === undefined) {
this.println("missing breakpoint address");
return;
}
var dbgAddr = {};
if (sAddr != "*") {
dbgAddr = this.parseAddr(sAddr, Debugger.ADDR_CODE);
if (dbgAddr.off == null) return;
}
sAddr = (dbgAddr.off == null? sAddr : str.toHexWord(dbgAddr.off));
if (sParm == "c") {
if (dbgAddr.off == null) {
this.clearBreakpoints();
this.println("all breakpoints cleared");
return;
}
if (this.findBreakpoint(this.aBreakExec, dbgAddr, true))
return;
if (this.findBreakpoint(this.aBreakRead, dbgAddr, true))
return;
if (this.findBreakpoint(this.aBreakWrite, dbgAddr, true))
return;
this.println("breakpoint missing: " + this.hexAddr(dbgAddr));
return;
}
if (sParm == "i") {
this.println("breakpoint " + (this.bus.addPortInputBreak(dbgAddr.off)? "enabled" : "cleared") + ": port " + sAddr + " (input)");
return;
}
if (sParm == "o") {
this.println("breakpoint " + (this.bus.addPortOutputBreak(dbgAddr.off)? "enabled" : "cleared") + ": port " + sAddr + " (output)");
return;
}
if (dbgAddr.off == null) return;
if (sParm == "p") {
this.addBreakpoint(this.aBreakExec, dbgAddr);
return;
}
if (sParm == "r") {
this.addBreakpoint(this.aBreakRead, dbgAddr);
return;
}
if (sParm == "w") {
this.addBreakpoint(this.aBreakWrite, dbgAddr);
return;
}
this.println("unknown breakpoint command: " + sParm);
};
/**
* doClear(sCmd)
*
* @this {Debugger}
* @param {string} sCmd (eg, "cls" or "clear")
*/
Debugger.prototype.doClear = function(sCmd)
{
/*
* TODO: There should be a clear() component method that the Control Panel overrides to perform this function.
*/
if (this.controlPrint) this.controlPrint.value = "";
};
/**
* doDump(sCmd, sAddr, sLen)
*
* While sLen is interpreted as a number of bytes or words, it's converted to the appropriate number of lines,
* because we always display whole lines. If sLen is omitted/undefined, then we default to 8 lines, regardless
* whether dumping bytes or words.
*
* Also, unlike sAddr, sLen is interpreted as a decimal number, unless a radix specifier is included (eg, "0x100");
* sLen also supports the DEBUG.COM-style syntax of a preceding "l" (eg, "l16").
*
* @this {Debugger}
* @param {string} sCmd
* @param {string|undefined} sAddr
* @param {string|undefined} sLen (if present, it can be preceded by an "l", which we simply ignore)
*/
Debugger.prototype.doDump = function(sCmd, sAddr, sLen)
{
var m;
if (sAddr == "?") {
var sDumpers = "";
for (m in Debugger.MESSAGES) {
if (this.afnDumpers[m]) {
if (sDumpers) sDumpers += ",";
sDumpers = sDumpers + m;
}
}
sDumpers += ",state,symbols";
this.println("\ndump commands:");
this.println("\tdb [a] [#] dump # bytes at address a");
this.println("\tdw [a] [#] dump # words at address a");
this.println("\tdd [a] [#] dump # dwords at address a");
this.println("\tdh [#] dump # instructions prior");
if (BACKTRACK) this.println("\tdi [a] dump backtrack info at address a");
if (sDumpers.length) this.println("dump extensions:\n\t" + sDumpers);
return;
}
if (sAddr == "state") {
this.println(this.cmp.powerOff(true));
return;
}
if (sAddr == "symbols") {
this.dumpSymbols();
return;
}
if (sCmd == "dh") {
this.dumpHistory(sAddr);
return;
}
if (sCmd == "ds") { // transform a "ds" command into a "d desc" command
sCmd = 'd';
sLen = sAddr;
sAddr = "desc";
}
for (m in Debugger.MESSAGES) {
if (sAddr == m) {
var fnDumper = this.afnDumpers[m];
if (fnDumper) {
fnDumper(sLen);
} else {
this.println("no dump registered for " + sAddr);
}
return;
}
}
var dbgAddr = this.parseAddr(sAddr, Debugger.ADDR_DATA);
if (dbgAddr.off == null || dbgAddr.sel == null && dbgAddr.addr == null) return;
var sDump = "";
if (BACKTRACK && sCmd == "di") {
var addr = this.getAddr(dbgAddr);
sDump += '%' + str.toHex(addr) + ": ";
var sInfo = this.bus.getBackTrackInfoFromAddr(addr);
sDump += sInfo || "no information";
}
else {
var cLines = 0;
var cBytes = (sCmd == "dd"? 4 : (sCmd == "dw"? 2 : 1));
var cNumbers = (16 / cBytes)|0;
if (sLen) {
if (sLen.charAt(0) == "l") sLen = sLen.substr(1);
cLines = +sLen;
if (cLines) cLines = ((cLines + cNumbers - 1) / cNumbers)|0;
}
if (!cLines) cLines = 8;
for (var iLine = 0; iLine < cLines; iLine++) {
var data = 0, iByte = 0;
var sData = "", sChars = "";
sAddr = this.hexAddr(dbgAddr);
for (var i = 0; i < 16; i++) {
var b = this.getByte(dbgAddr, 1);
data |= (b << (iByte++ << 3));
if (iByte == cBytes) {
sData += str.toHex(data, cBytes * 2);
sData += (cBytes == 1? (i == 7? '-' : ' ') : " ");
data = iByte = 0;
}
sChars += (b >= 32 && b < 128? String.fromCharCode(b) : ".");
}
if (sDump) sDump += "\n";
sDump += sAddr + " " + sData + " " + sChars;
}
}
if (sDump) this.println(sDump);
this.dbgAddrNextData = dbgAddr;
};
/**
* doEdit(asArgs)
*
* @this {Debugger}
* @param {Array.<string>} asArgs
*/
Debugger.prototype.doEdit = function(asArgs)
{
var sAddr = asArgs[1];
if (sAddr === undefined) {
this.println("missing address");
return;
}
var dbgAddr = this.parseAddr(sAddr, Debugger.ADDR_DATA);
if (dbgAddr.off == null) return;
for (var i = 2; i < asArgs.length; i++) {
var b = str.parseInt(asArgs[i], 16);
if (b === undefined) {
this.println("unrecognized value: " + str.toHexByte(b));
break;
}
this.println("setting " + this.hexAddr(dbgAddr) + " to " + str.toHexByte(b));
this.setByte(dbgAddr, b, 1);
}
};
/**
* doFreqs(sParm)
*
* @this {Debugger}
* @param {string|undefined} sParm
*/
Debugger.prototype.doFreqs = function(sParm)
{
if (sParm == "?") {
this.println("\nfrequency commands:");
this.println("\tclear\tclear all frequency counts");
return;
}
var i;
var cData = 0;
if (this.aaOpcodeCounts) {
if (sParm == "clear") {
for (i = 0; i < this.aaOpcodeCounts.length; i++)
this.aaOpcodeCounts[i] = [i, 0];
this.println("frequency data cleared");
cData++;
}
else if (sParm !== undefined) {
this.println("unknown frequency command: " + sParm);
cData++;
}
else {
var aaSortedOpcodeCounts = this.aaOpcodeCounts.slice();
aaSortedOpcodeCounts.sort(function(p, q) {
return q[1] - p[1];
});
for (i = 0; i < aaSortedOpcodeCounts.length; i++) {
var bOpcode = aaSortedOpcodeCounts[i][0];
var cFreq = aaSortedOpcodeCounts[i][1];
if (cFreq) {
this.println((Debugger.INS_NAMES[this.aaOpDescs[bOpcode][0]] + " ").substr(0, 5) + " (" + str.toHexByte(bOpcode) + "): " + cFreq + " times");
cData++;
}
}
}
}
if (!cData) {
this.println("no frequency data available");
}
};
/**
* doHalt(sCount)
*
* If the CPU is running and no count is provided, we halt the CPU; otherwise we treat this as a history command.
*
* @this {Debugger}
* @param {string|undefined} sCount is the number of instructions to rewind to (default is 10)
*/
Debugger.prototype.doHalt = function(sCount)
{
if (this.aFlags.fRunning && sCount === undefined) {
this.println("halting");
this.stopCPU();
return;
}
this.dumpHistory(sCount);
};
/**
* doInfo(asArgs)
*
* Prints the contents of the Debugger's instruction trace buffer.
*
* Examples:
*
* n shl
* n shl on
* n shl off
* n dump 100
*
* @this {Debugger}
* @param {Array.<string>} asArgs
* @return {boolean} true only if the instruction info command ("n") is supported
*/
Debugger.prototype.doInfo = function(asArgs)
{
if (DEBUG) {
var sCategory = asArgs[1];
if (sCategory !== undefined) {
sCategory = sCategory.toUpperCase();
}
var sEnable = asArgs[2];
var fPrint = false;
if (sCategory == "DUMP") {
var sDump = "";
var cLines = (sEnable === undefined? -1 : +sEnable);
var i = this.iTraceBuffer;
do {
var s = this.aTraceBuffer[i++];
if (s !== undefined) {
/*
* The browser is MUCH happier if we buffer all the lines for one single enormous print
*
* this.println(s);
*/
sDump += (sDump? "\n" : "") + s;
cLines--;
}
if (i >= this.aTraceBuffer.length)
i = 0;
} while (cLines && i != this.iTraceBuffer);
if (!sDump) sDump = "nothing to dump";
this.println(sDump);
this.println("msPerYield: " + this.cpu.aCounts.msPerYield);
this.println("nCyclesPerBurst: " + this.cpu.aCounts.nCyclesPerBurst);
this.println("nCyclesPerYield: " + this.cpu.aCounts.nCyclesPerYield);
this.println("nCyclesPerVideoUpdate: " + this.cpu.aCounts.nCyclesPerVideoUpdate);
this.println("nCyclesPerStatusUpdate: " + this.cpu.aCounts.nCyclesPerStatusUpdate);
} else {
var fEnable = (sEnable == "on");
for (var prop in this.traceEnabled) {
var trace = Debugger.TRACE[prop];
if (sCategory === undefined || sCategory == "ALL" || sCategory == Debugger.INS_NAMES[trace.ins]) {
if (fEnable !== undefined) {
this.traceEnabled[prop] = fEnable;
}
this.println(Debugger.INS_NAMES[trace.ins] + trace.size + ": " + (this.traceEnabled[prop]? "on" : "off"));
fPrint = true;
}
}
if (!fPrint) this.println("no match");
}
return true;
}
return false;
};
/**
* doInput(sPort)
*
* @this {Debugger}
* @param {string|undefined} sPort
*/
Debugger.prototype.doInput = function(sPort)
{
if (!sPort || sPort == "?") {
this.println("\ninput commands:");
this.println("\ti [p]\tread port [p]");
/*
* TODO: Regarding this warning, consider adding an "unchecked" version of
* bus.checkPortInputNotify(), since all Debugger memory accesses are unchecked, too.
*
* All port I/O handlers ARE aware when the Debugger is calling (addrFrom is undefined),
* but changing them all to be non-destructive would take time, and situations where you
* actually want to affect the hardware state are just as likely as not....
*/
this.println("warning: port accesses can affect hardware state");
return;
}
var port = this.parseValue(sPort);
if (port !== undefined) {
var bIn = this.bus.checkPortInputNotify(port);
this.println(str.toHexWord(port) + ": " + str.toHexByte(bIn));
}
};
/**
* doList(sSymbol)
*
* @this {Debugger}
* @param {string} sSymbol
*/
Debugger.prototype.doList = function(sSymbol)
{
var dbgAddr = this.parseAddr(sSymbol, Debugger.ADDR_CODE);
if (dbgAddr.off == null && dbgAddr.addr == null) return;
var addr = this.getAddr(dbgAddr);
sSymbol = sSymbol? (sSymbol + ": ") : "";
this.println(sSymbol + this.hexAddr(dbgAddr) + " (%" + str.toHex(addr, this.cchAddr) + ")");
var aSymbol = this.findSymbolAtAddr(dbgAddr, true);
if (aSymbol.length) {
var nDelta, sDelta;
if (aSymbol[0]) {
sDelta = "";
nDelta = dbgAddr.off - aSymbol[1];
if (nDelta) sDelta = " + " + str.toHexWord(nDelta);
this.println(aSymbol[0] + " (" + this.hexOffset(aSymbol[1], dbgAddr.sel) + ")" + sDelta);
}
if (aSymbol.length > 4 && aSymbol[4]) {
sDelta = "";
nDelta = aSymbol[5] - dbgAddr.off;
if (nDelta) sDelta = " - " + str.toHexWord(nDelta);
this.println(aSymbol[4] + " (" + this.hexOffset(aSymbol[5], dbgAddr.sel) + ")" + sDelta);
}
} else {
this.println("no symbols");
}
};
/**
* doLoad(asArgs)
*
* The format of this command mirrors the DOS DEBUG "L" command:
*
* l [address] [drive #] [sector #] [# sectors]
*
* The only optional parameter is the last, which defaults to 1 sector if not specified.
*
* As a quick-and-dirty way of getting the current contents of a disk image as a JSON dump
* (which you can then save as .json disk image file), I also allow this command format:
*
* l json [drive #]
*
* @this {Debugger}
* @param {Array.<string>} asArgs
*/
Debugger.prototype.doLoad = function(asArgs)
{
if (asArgs[0] == 'l' && asArgs[1] === undefined || asArgs[1] == "?") {
this.println("\nlist/load commands:");
this.println("\tl [address] [drive #] [sector #] [# sectors]");
this.println("\tln [address] lists symbol(s) nearest to address");
return;
}
if (asArgs[0] == "ln") {
this.doList(asArgs[1]);
return;
}
var fJSON = (asArgs[1] == "json");
var iDrive, iSector = 0, nSectors = 0;
var dbgAddr = (fJSON? {} : this.parseAddr(asArgs[1], Debugger.ADDR_DATA));
iDrive = this.parseValue(asArgs[2], "drive #");
if (iDrive === undefined) return;
if (!fJSON) {
iSector = this.parseValue(asArgs[3], "sector #");
if (iSector === undefined) return;
nSectors = this.parseValue(asArgs[4], "# of sectors");
if (nSectors === undefined) nSectors = 1;
}
/*
* We choose the disk controller very simplistically: FDC for drives 0 or 1, and HDC for drives 2
* and up, unless no HDC is present, in which case we assume FDC for all drive numbers.
*
* Both controllers must obviously support the same interfaces; ie, copyDrive(), seekDrive(),
* and readByte(). We also rely on the disk property to determine whether the drive is "loaded".
*
* In the case of the HDC, if the drive is valid, then by definition it is also "loaded", since an HDC
* drive and its disk are inseparable; it's certainly possible that its disk object may be empty at
* this point, but that will only affect whether the read succeeds or not.
*/
var dc = this.fdc;
if (iDrive >= 2 && this.hdc) {
iDrive -= 2;
dc = this.hdc;
}
if (dc) {
var drive = dc.copyDrive(iDrive);
if (drive) {
if (drive.disk) {
if (fJSON) {
/*
* This is an interim solution to dumping disk images in JSON. It has many problems, the
* "biggest" being that the large disk images really need to be compressed first, because they
* get "inflated" with use. See the dump() method in the Disk component for more details.
*/
this.println(drive.disk.toJSON());
return;
}
if (dc.seekDrive(drive, iSector, nSectors)) {
var cb = 0;
var fAbort = false;
var sAddr = this.hexAddr(dbgAddr);
while (!fAbort && drive.nBytes-- > 0) {
(function(dbg, dbgAddrCur) {
dc.readByte(drive, function(b, fAsync) {
if (b < 0) {
dbg.println("out of data at address " + dbg.hexAddr(dbgAddrCur));
fAbort = true;
return;
}
dbg.setByte(dbgAddrCur, b, 1);
cb++;
});
}(this, dbgAddr));
}
this.println(cb + " bytes read at " + sAddr);
} else {
this.println("sector " + iSector + " request out of range");
}
} else {
this.println("drive " + iDrive + " not loaded");
}
} else {
this.println("invalid drive: " + iDrive);
}
} else {
this.println("disk controller not present");
}
};
/**
* doMessages(asArgs)
*
* @this {Debugger}
* @param {Array.<string>} asArgs
*/
Debugger.prototype.doMessages = function(asArgs)
{
var m;
var fCriteria = null;
var sCategory = asArgs[1];
if (sCategory == "?") sCategory = undefined;
if (sCategory !== undefined) {
var bitsMessage = 0;
if (sCategory == "all") {
bitsMessage = (0xffffffff|0) & ~(Messages.HALT | Messages.KEYS | Messages.LOG);
sCategory = null;
} else if (sCategory == "on") {
fCriteria = true;
sCategory = null;
} else if (sCategory == "off") {
fCriteria = false;
sCategory = null;
} else {
if (sCategory == "keys") sCategory = "key";
if (sCategory == "kbd") sCategory = "keyboard";
for (m in Debugger.MESSAGES) {
if (sCategory == m) {
bitsMessage = Debugger.MESSAGES[m];
fCriteria = !!(this.bitsMessage & bitsMessage);
break;
}
}
if (!bitsMessage) {
this.println("unknown message category: " + sCategory);
return;
}
}
if (bitsMessage) {
if (asArgs[2] == "on") {
this.bitsMessage |= bitsMessage;
fCriteria = true;
}
else if (asArgs[2] == "off") {
this.bitsMessage &= ~bitsMessage;
fCriteria = false;
}
}
}
/*
* Display those message categories that match the current criteria (on or off)
*/
var n = 0;
var sCategories = "";
for (m in Debugger.MESSAGES) {
if (!sCategory || sCategory == m) {
var bitMessage = Debugger.MESSAGES[m];
var fEnabled = !!(this.bitsMessage & bitMessage);
if (fCriteria !== null && fCriteria != fEnabled) continue;
if (sCategories) sCategories += ",";
if (!(++n % 10)) sCategories += "\n\t"; // jshint ignore:line
if (m == "key") m = "keys";
sCategories += m;
}
}
if (sCategory === undefined) {
this.println("\nmessage commands:\n\tm [category] [on|off]\tturn categories on/off");
}
this.println((fCriteria !== null? (fCriteria? "messages on: " : "messages off: ") : "message categories:\n\t") + (sCategories || "none"));
};
/**
* doExecOptions(asArgs)
*
* @this {Debugger}
* @param {Array.<string>} asArgs
*/
Debugger.prototype.doExecOptions = function(asArgs)
{
if (asArgs[1] === undefined || asArgs[1] == "?") {
this.println("\nexecution options:");
this.println("\tcs int #\tset checksum cycle interval to #");
this.println("\tcs start #\tset checksum cycle start count to #");
this.println("\tcs stop #\tset checksum cycle stop count to #");
this.println("\tsp #\t\tset speed multiplier to #");
return;
}
switch (asArgs[1]) {
case "cs":
var nCycles;
if (asArgs[3] !== undefined) nCycles = +asArgs[3];
switch (asArgs[2]) {
case "int":
this.cpu.aCounts.nCyclesChecksumInterval = nCycles;
break;
case "start":
this.cpu.aCounts.nCyclesChecksumStart = nCycles;
break;
case "stop":
this.cpu.aCounts.nCyclesChecksumStop = nCycles;
break;
default:
this.println("unknown cs option");
return;
}
if (nCycles !== undefined) {
this.cpu.resetChecksum();
}
this.println("checksums " + (this.cpu.aFlags.fChecksum? "enabled" : "disabled"));
break;
case "sp":
if (asArgs[2] !== undefined) {
this.cpu.setSpeed(+asArgs[2]);
}
this.println("target speed: " + this.cpu.getSpeedTarget() + " (" + this.cpu.getSpeed() + "x)");
break;
default:
this.println("unknown option: " + asArgs[1]);
break;
}
};
/**
* doOutput(sPort, sByte)
*
* @this {Debugger}
* @param {string|undefined} sPort
* @param {string|undefined} sByte (string representation of 1 byte)
*/
Debugger.prototype.doOutput = function(sPort, sByte)
{
if (!sPort || sPort == "?") {
this.println("\noutput commands:");
this.println("\to [p] [b]\twrite byte [b] to port [p]");
/*
* TODO: Regarding this warning, consider adding an "unchecked" version of
* bus.checkPortOutputNotify(), since all Debugger memory accesses are unchecked, too.
*
* All port I/O handlers ARE aware when the Debugger is calling (addrFrom is undefined),
* but changing them all to be non-destructive would take time, and situations where you
* actually want to affect the hardware state are just as likely as not....
*/
this.println("warning: port accesses can affect hardware state");
return;
}
var port = this.parseValue(sPort, "port #");
var bOut = this.parseValue(sByte);
if (port !== undefined && bOut !== undefined) {
this.bus.checkPortOutputNotify(port, bOut);
this.println(str.toHexWord(port) + ": " + str.toHexByte(bOut));
}
};
/**
* doRegisters(asArgs, fCompact)
*
* @this {Debugger}
* @param {Array.<string>} [asArgs]
* @param {boolean} [fCompact]
*/
Debugger.prototype.doRegisters = function(asArgs, fCompact)
{
if (asArgs && asArgs[1] == "?") {
this.println("\nregister commands:");
this.println("\tr\t\tdisplay all registers");
this.println("\tr [target=#]\tmodify target register");
this.println("supported targets:");
this.println("\tall registers and flags V,D,I,S,Z,A,P,C");
return;
}
var fIns = true, fProt;
if (asArgs != null && asArgs.length > 1) {
var sReg = asArgs[1];
if (sReg == 'p') {
fProt = (this.cpu.model >= X86.MODEL_80286);
} else {
// fIns = false;
var sValue = null;
var i = sReg.indexOf("=");
if (i > 0) {
sValue = sReg.substr(i + 1);
sReg = sReg.substr(0, i);
}
else if (asArgs.length > 2) {
sValue = asArgs[2];
}
else {
this.println("missing value for " + asArgs[1]);
return;
}
var fValid = false;
var w = str.parseInt(sValue, 16);
if (!isNaN(w)) {
fValid = true;
var sRegMatch = sReg.toUpperCase();
if (sRegMatch.charAt(0) == 'E' && this.cchReg <= 4) {
sRegMatch = null;
}
switch (sRegMatch) {
case "AL":
this.cpu.regEAX = (this.cpu.regEAX & ~0xff) | (w & 0xff);
break;
case "AH":
this.cpu.regEAX = (this.cpu.regEAX & ~0xff00) | ((w << 8) & 0xff);
break;
case "AX":
this.cpu.regEAX = (this.cpu.regEAX & ~0xffff) | (w & 0xffff);
break;
case "BL":
this.cpu.regEBX = (this.cpu.regEBX & ~0xff) | (w & 0xff);
break;
case "BH":
this.cpu.regEBX = (this.cpu.regEBX & ~0xff00) | ((w << 8) & 0xff);
break;
case "BX":
this.cpu.regEBX = (this.cpu.regEBX & ~0xffff) | (w & 0xffff);
break;
case "CL":
this.cpu.regECX = (this.cpu.regECX & ~0xff) | (w & 0xff);
break;
case "CH":
this.cpu.regECX = (this.cpu.regECX & ~0xff00) | ((w << 8) & 0xff);
break;
case "CX":
this.cpu.regECX = (this.cpu.regECX & ~0xffff) | (w & 0xffff);
break;
case "DL":
this.cpu.regEDX = (this.cpu.regEDX & ~0xff) | (w & 0xff);
break;
case "DH":
this.cpu.regEDX = (this.cpu.regEDX & ~0xff00) | ((w << 8) & 0xff);
break;
case "DX":
this.cpu.regEDX = (this.cpu.regEDX & ~0xffff) | (w & 0xffff);
break;
case "SP":
this.cpu.setSP((this.cpu.getSP() & ~0xffff) | (w & 0xffff));
break;
case "BP":
this.cpu.regEBP = (this.cpu.regEBP & ~0xffff) | (w & 0xffff);
break;
case "SI":
this.cpu.regESI = (this.cpu.regESI & ~0xffff) | (w & 0xffff);
break;
case "DI":
this.cpu.regEDI = (this.cpu.regEDI & ~0xffff) | (w & 0xffff);
break;
case "DS":
this.cpu.setDS(w);
break;
case "ES":
this.cpu.setES(w);
break;
case "SS":
this.cpu.setSS(w);
break;
case "CS":
// fIns = true;
this.cpu.setCS(w);
this.dbgAddrNextCode = this.newAddr(this.cpu.getIP(), this.cpu.getCS());
break;
case "IP":
// fIns = true;
this.cpu.setIP(w);
this.dbgAddrNextCode = this.newAddr(this.cpu.getIP(), this.cpu.getCS());
break;
/*
* I used to alias "PC" to "IP", until I discovered that early (perhaps ALL) versions of
* DEBUG.COM treat "PC" as an alias for the 16-bit flags register. I, of course, prefer "PS".
*/
case "PC":
case "PS":
this.cpu.setPS(w);
break;
case "C":
if (w) this.cpu.setCF(); else this.cpu.clearCF();
break;
case "P":
if (w) this.cpu.setPF(); else this.cpu.clearPF();
break;
case "A":
if (w) this.cpu.setAF(); else this.cpu.clearAF();
break;
case "Z":
if (w) this.cpu.setZF(); else this.cpu.clearZF();
break;
case "S":
if (w) this.cpu.setSF(); else this.cpu.clearSF();
break;
case "I":
if (w) this.cpu.setIF(); else this.cpu.clearIF();
break;
case "D":
if (w) this.cpu.setDF(); else this.cpu.clearDF();
break;
case "V":
if (w) this.cpu.setOF(); else this.cpu.clearOF();
break;
default:
var fUnknown = true;
if (this.cpu.model >= X86.MODEL_80286) {
fUnknown = false;
switch(sRegMatch){
case "MS":
this.cpu.setMSW(w);
break;
case "TR":
if (this.cpu.segTSS.load(w, true) === X86.ADDR_INVALID) {
fValid = false;
}
break;
/*
* TODO: Add support for GDTR (addr and limit), IDTR (addr and limit), and perhaps
* even the ability to edit descriptor information associated with each segment register.
*/
default:
fUnknown = true;
if (I386 && this.cpu.model >= X86.MODEL_80386) {
fUnknown = false;
switch(sRegMatch){
case "EAX":
this.cpu.regEAX = w;
break;
case "EBX":
this.cpu.regEBX = w;
break;
case "ECX":
this.cpu.regECX = w;
break;
case "EDX":
this.cpu.regEDX = w;
break;
case "ESP":
this.cpu.setSP(w);
break;
case "EBP":
this.cpu.regEBP = w;
break;
case "ESI":
this.cpu.regESI = w;
break;
case "EDI":
this.cpu.regEDI = w;
break;
case "FS":
this.cpu.setFS(w);
break;
case "GS":
this.cpu.setGS(w);
break;
case "CR0":
this.cpu.regCR0 = w;
break;
case "CR2":
this.cpu.regCR2 = w;
break;
case "CR3":
this.cpu.regCR3 = w;
break;
/*
* TODO: Add support for DR0-DR7 and TR6-TR7.
*/
default:
fUnknown = true;
break;
}
}
break;
}
}
if (fUnknown) {
this.println("unknown register: " + sReg);
return;
}
}
}
if (!fValid) {
this.println("invalid value: " + sValue);
return;
}
this.cpu.updateCPU();
this.println("\nupdated registers:");
fCompact = true;
}
}
this.println((fCompact? '' : '\n') + this.getRegDump(fProt));
if (fIns) {
this.dbgAddrNextCode = this.newAddr(this.cpu.getIP(), this.cpu.getCS());
this.doUnassemble(this.hexAddr(this.dbgAddrNextCode));
}
};
/**
* doRun(sAddr)
*
* @this {Debugger}
* @param {string} sAddr
*/
Debugger.prototype.doRun = function(sAddr)
{
if (sAddr !== undefined) {
var dbgAddr = this.parseAddr(sAddr, Debugger.ADDR_CODE);
if (dbgAddr.off == null) return;
this.setTempBreakpoint(dbgAddr);
}
if (!this.runCPU(true)) {
this.println('cpu busy, "g" command ignored');
}
};
/**
* doProcStep(sCmd)
*
* @this {Debugger}
* @param {string} [sCmd] "p" or "pr"
*/
Debugger.prototype.doProcStep = function(sCmd)
{
var fCallStep = true;
var fRegs = (sCmd == "pr"? 1 : 0);
/*
* Set up the value for this.fProcStep (ie, 1 or 2) depending on whether the user wants
* a subsequent register dump ("pr") or not ("p").
*/
var fProcStep = 1 + fRegs;
if (!this.fProcStep) {
var fPrefix;
var fRepeat = false;
var dbgAddr = this.newAddr(this.cpu.getIP(), this.cpu.getCS());
do {
fPrefix = false;
var bOpcode = this.getByte(dbgAddr);
switch (bOpcode) {
case X86.OPCODE.ES:
case X86.OPCODE.CS:
case X86.OPCODE.SS:
case X86.OPCODE.DS:
case X86.OPCODE.FS: // I386 only
case X86.OPCODE.GS: // I386 only
case X86.OPCODE.OS: // I386 only
case X86.OPCODE.AS: // I386 only
case X86.OPCODE.LOCK:
this.incAddr(dbgAddr, 1);
fPrefix = true;
break;
case X86.OPCODE.INT3:
case X86.OPCODE.INTO:
this.fProcStep = fProcStep;
this.incAddr(dbgAddr, 1);
break;
case X86.OPCODE.INTn:
case X86.OPCODE.LOOPNZ:
case X86.OPCODE.LOOPZ:
case X86.OPCODE.LOOP:
this.fProcStep = fProcStep;
this.incAddr(dbgAddr, 2);
break;
case X86.OPCODE.CALL:
if (fCallStep) {
this.fProcStep = fProcStep;
this.incAddr(dbgAddr, 3);
}
break;
case X86.OPCODE.CALLF:
if (fCallStep) {
this.fProcStep = fProcStep;
this.incAddr(dbgAddr, 5);
}
break;
case X86.OPCODE.GRP4W:
if (fCallStep) {
var w = this.getWord(dbgAddr) & X86.OPCODE.CALLMASK;
this.fProcStep = ((w == X86.OPCODE.CALLW || w == X86.OPCODE.CALLFDW)? fProcStep : 0);
}
break;
case X86.OPCODE.REPZ:
case X86.OPCODE.REPNZ:
this.incAddr(dbgAddr, 1);
fRepeat = fPrefix = true;
break;
case X86.OPCODE.INSB:
case X86.OPCODE.INSW:
case X86.OPCODE.OUTSB:
case X86.OPCODE.OUTSW:
case X86.OPCODE.MOVSB:
case X86.OPCODE.MOVSW:
case X86.OPCODE.CMPSB:
case X86.OPCODE.CMPSW:
case X86.OPCODE.STOSB:
case X86.OPCODE.STOSW:
case X86.OPCODE.LODSB:
case X86.OPCODE.LODSW:
case X86.OPCODE.SCASB:
case X86.OPCODE.SCASW:
if (fRepeat) {
this.fProcStep = fProcStep;
this.incAddr(dbgAddr, 1);
}
break;
default:
break;
}
} while (fPrefix);
if (this.fProcStep) {
this.setTempBreakpoint(dbgAddr);
if (!this.runCPU()) {
this.cpu.setFocus();
this.fProcStep = 0;
}
/*
* A successful run will ultimately call stop(), which will in turn call clearTempBreakpoint(),
* which will clear fProcStep, so there's your assurance that fProcStep will be reset. Now we may
* have stopped for reasons unrelated to the temporary breakpoint, but that's OK.
*/
} else {
this.doStep(fRegs? "tr" : "t");
}
} else {
this.println("step in progress");
}
};
/**
* getCall(dbgAddr, fFar)
*
* @this {Debugger}
* @param {{DbgAddr}} dbgAddr
* @param {boolean} [fFar]
* @return {string|null} CALL instruction at or near dbgAddr, or null if none
*/
Debugger.prototype.getCall = function(dbgAddr, fFar)
{
var sCall = null;
var off = dbgAddr.off;
var offOrig = off;
for (var n = 1; n <= 6; n++) {
if (n > 2) {
dbgAddr.off = off;
dbgAddr.addr = null;
var s = this.getInstruction(dbgAddr);
if (s.indexOf("CALL") > 0 || fFar && s.indexOf("INT") > 0) {
sCall = s;
break;
}
}
if (!--off) break;
}
dbgAddr.off = offOrig;
return sCall;
};
/**
* doStackTrace()
*
* @this {Debugger}
*/
Debugger.prototype.doStackTrace = function()
{
var nFrames = 10, cFrames = 0;
var selCode = this.cpu.segCS.sel;
var dbgAddrCall = this.newAddr();
var dbgAddrStack = this.newAddr(this.cpu.getSP(), this.cpu.getSS());
this.println("stack trace for " + this.hexAddr(dbgAddrStack));
while (cFrames < nFrames) {
var sCall = null, cTests = 256;
while ((dbgAddrStack.off >>> 0) < (this.cpu.regLSPLimit >>> 0)) {
dbgAddrCall.off = this.getWord(dbgAddrStack, true);
/*
* Because we're using the auto-increment feature of getWord(), and because that will automatically
* wrap the offset around the end of the segment, we must also check the addr property to detect the wrap.
*/
if (dbgAddrStack.addr == null || !cTests--) break;
dbgAddrCall.sel = selCode;
sCall = this.getCall(dbgAddrCall);
if (sCall) {
break;
}
dbgAddrCall.sel = this.getWord(dbgAddrStack);
sCall = this.getCall(dbgAddrCall, true);
if (sCall) {
selCode = this.getWord(dbgAddrStack, true);
/*
* It's not strictly necessary that we skip over the flags word that's pushed as part of any INT
* instruction, but it reduces the risk of misinterpreting it as a return address on the next iteration.
*/
if (sCall.indexOf("INT") > 0) this.getWord(dbgAddrStack, true);
break;
}
}
if (!sCall) break;
sCall = str.pad(sCall, 50) + ";stack=" + this.hexAddr(dbgAddrStack) + " return=" + this.hexAddr(dbgAddrCall);
this.println(sCall);
cFrames++;
}
if (!cFrames) this.println("no return addresses found");
};
/**
* doStep(sCmd, sCount)
*
* @this {Debugger}
* @param {string} [sCmd] "t" or "tr"
* @param {string} [sCount] # of instructions to step
*/
Debugger.prototype.doStep = function(sCmd, sCount)
{
var dbg = this;
var fRegs = (sCmd == "tr");
var count = (sCount != null? +sCount : 1);
var nCycles = (count == 1? 0 : 1);
web.onCountRepeat(
count,
function onCountStep() {
return dbg.setBusy(true) && dbg.stepCPU(nCycles, fRegs, false);
},
function onCountStepComplete() {
/*
* We explicitly called stepCPU() with fUpdateCPU === false, because repeatedly
* calling updateCPU() can be very slow, especially when fDisplayLiveRegs is true,
* so once the repeat count has been exhausted, we must perform a final updateCPU().
*/
dbg.cpu.updateCPU();
dbg.setBusy(false);
}
);
};
/**
* initAddrSize(dbgAddr, fNonPrefix)
*
* @this {Debugger}
* @param {{DbgAddr}} dbgAddr
* @param {boolean} fNonPrefix
*/
Debugger.prototype.initAddrSize = function(dbgAddr, fNonPrefix)
{
/*
* Use dbgAddr.fOverride to record whether we previously processed any OPERAND or ADDRESS overrides.
*/
dbgAddr.fOverride = (dbgAddr.fData32 || dbgAddr.fAddr32);
/*
* For proper disassembly of instructions preceded by an OPERAND (0x66) size prefix, we set
* dbgAddr.fData32 to true whenever the operand size is 32-bit; similarly, for an ADDRESS (0x67)
* size prefix, we set dbgAddr.fAddr32 to true whenever the address size is 32-bit. Initially,
* both fields must be set to match the size of the current code segment.
*/
if (fNonPrefix) {
dbgAddr.fData32 = (this.cpu.segCS.dataSize == 4);
dbgAddr.fAddr32 = (this.cpu.segCS.addrSize == 4);
}
/*
* We also use dbgAddr.fComplete to record whether the caller (ie, getInstruction()) is reporting that
* it processed a complete instruction (ie, a non-prefix) or not.
*/
dbgAddr.fComplete = fNonPrefix;
};
/**
* isStringIns(bOpcode)
*
* @this {Debugger}
* @param {number} bOpcode
* @return {boolean} true if string instruction, false if not
*/
Debugger.prototype.isStringIns = function(bOpcode)
{
return (bOpcode >= X86.OPCODE.MOVSB && bOpcode <= X86.OPCODE.CMPSW || bOpcode >= X86.OPCODE.STOSB && bOpcode <= X86.OPCODE.SCASW);
};
/**
* doUnassemble(sAddr, sAddrEnd, n)
*
* @this {Debugger}
* @param {string} [sAddr]
* @param {string} [sAddrEnd]
* @param {number} [n]
*/
Debugger.prototype.doUnassemble = function(sAddr, sAddrEnd, n)
{
var dbgAddr = this.parseAddr(sAddr, Debugger.ADDR_CODE);
if (dbgAddr.off == null) return;
if (n === undefined) n = 1;
var dbgAddrEnd = this.newAddr(this.maskReg, dbgAddr.sel, this.bus.nBusLimit);
var cb = 0x100;
if (sAddrEnd !== undefined) {
dbgAddrEnd = this.parseAddr(sAddrEnd, Debugger.ADDR_CODE);
if (dbgAddrEnd.off == null || dbgAddrEnd.off < dbgAddr.off) return;
cb = dbgAddrEnd.off - dbgAddr.off;
if (!DEBUG && cb > 0x100) {
/*
* Limiting the amount of disassembled code to 256 bytes in non-DEBUG builds is partly to
* prevent the user from wedging the browser by dumping too many lines, but also a recognition
* that, in non-DEBUG builds, this.println() keeps print output buffer truncated to 8Kb anyway.
*/
this.println("range too large");
return;
}
n = -1;
}
var fBlank = (dbgAddr.off != this.dbgAddrNextCode.off);
var cLines = 0;
this.initAddrSize(dbgAddr, true);
while (cb > 0 && n--) {
var bOpcode = this.getByte(dbgAddr);
var addr = dbgAddr.addr;
var nSequence = (this.isBusy(false) || this.fProcStep)? this.nCycles : null;
var sComment = (nSequence != null? "cycles" : null);
var aSymbol = this.findSymbolAtAddr(dbgAddr);
if (aSymbol[0]) {
var sLabel = aSymbol[0] + ":";
fBlank = false;
if (aSymbol[2]) sLabel += " " + aSymbol[2];
this.println(sLabel);
}
if (fBlank) this.println();
if (aSymbol[3]) {
sComment = aSymbol[3];
nSequence = null;
}
var sIns = this.getInstruction(dbgAddr, sComment, nSequence);
/*
* If getInstruction() reported that it did not yet process a complete instruction (via dbgAddr.fComplete),
* then bump the instruction count by one, so that we display one more line (and hopefully the complete
* instruction).
*/
if (!dbgAddr.fComplete && !n) n++;
this.println(sIns);
this.dbgAddrNextCode = dbgAddr;
cb -= dbgAddr.addr - addr;
fBlank = false;
cLines++;
}
};
/**
* parseCommand(sCmd, fSave)
*
* @this {Debugger}
* @param {string|undefined} sCmd
* @param {boolean} [fSave] is true to save the command, false if not
* @return {Array.<string>}
*/
Debugger.prototype.parseCommand = function(sCmd, fSave)
{
if (fSave) {
if (!sCmd) {
sCmd = this.aPrevCmds[this.iPrevCmd+1];
} else {
if (this.iPrevCmd < 0 && this.aPrevCmds.length) {
this.iPrevCmd = 0;
}
if (this.iPrevCmd < 0 || sCmd != this.aPrevCmds[this.iPrevCmd]) {
this.aPrevCmds.splice(0, 0, sCmd);
this.iPrevCmd = 0;
}
this.iPrevCmd--;
}
}
var a = (sCmd? sCmd.split(sCmd.indexOf('|') >= 0? '|' : ';') : ['']);
for (var s in a) {
a[s] = str.trim(a[s]);
}
return a;
};
/**
* doCommand(sCmd, fQuiet)
*
* @this {Debugger}
* @param {string} sCmd
* @param {boolean} [fQuiet]
* @return {boolean} true if command processed, false if unrecognized
*/
Debugger.prototype.doCommand = function(sCmd, fQuiet)
{
var result = true;
try {
if (!sCmd.length) {
if (this.fAssemble) {
this.println("ended assemble @" + this.hexAddr(this.dbgAddrAssemble));
this.dbgAddrNextCode = this.dbgAddrAssemble;
this.fAssemble = false;
} else {
sCmd = '?';
}
}
sCmd = sCmd.toLowerCase();
/*
* I'm going to try relaxing the !isBusy() requirement for doCommand(), to maximize our
* ability to issue Debugger commands externally.
*/
if (this.isReady() /* && !this.isBusy(true) */ && sCmd.length > 0) {
if (this.fAssemble) {
sCmd = "a " + this.hexAddr(this.dbgAddrAssemble) + " " + sCmd;
}
else {
/*
* Process any "whole" commands here first (eg, "debug", "nodebug", "reset", etc.)
*
* For all other commands, if they lack a space between the command and argument portions,
* insert a space before the first non-alpha character, so that split() will have the desired effect.
*/
if (!COMPILED) {
if (sCmd == "debug") {
window.DEBUG = true;
this.println("DEBUG checks on");
return true;
}
else if (sCmd == "nodebug") {
window.DEBUG = false;
this.println("DEBUG checks off");
return true;
}
}
var ch, ch0, i;
switch (sCmd) {
case "reset":
if (this.cmp) this.cmp.reset();
return true;
case "ver":
this.println((APPNAME || "PCjs") + " version " + APPVERSION + " (" + this.cpu.model + (COMPILED? ",RELEASE" : (DEBUG? ",DEBUG" : ",NODEBUG")) + (PREFETCH? ",PREFETCH" : ",NOPREFETCH") + (TYPEDARRAYS? ",TYPEDARRAYS" : (FATARRAYS? ",FATARRAYS" : ",LONGARRAYS")) + (BACKTRACK? ",BACKTRACK" : ",NOBACKTRACK") + ")");
return true;
default:
ch0 = sCmd.charAt(0);
for (i = 1; i < sCmd.length; i++) {
ch = sCmd.charAt(i);
if (ch == " ") break;
if (ch0 == "r" || ch < "a" || ch > "z") {
sCmd = sCmd.substring(0, i) + " " + sCmd.substring(i);
break;
}
}
break;
}
}
var asArgs = sCmd.split(" ");
switch (asArgs[0].charAt(0)) {
case "a":
this.doAssemble(asArgs);
break;
case "b":
this.doBreak(asArgs[0], asArgs[1]);
break;
case "c":
this.doClear(asArgs[0]);
break;
case "d":
this.doDump(asArgs[0], asArgs[1], asArgs[2]);
break;
case "e":
this.doEdit(asArgs);
break;
case "f":
this.doFreqs(asArgs[1]);
break;
case "g":
this.doRun(asArgs[1]);
break;
case "h":
this.doHalt(asArgs[1]);
break;
case "i":
this.doInput(asArgs[1]);
break;
case "k":
this.doStackTrace();
break;
case "l":
this.doLoad(asArgs);
break;
case "m":
this.doMessages(asArgs);
break;
case "o":
this.doOutput(asArgs[1], asArgs[2]);
break;
case "p":
case "pr":
this.doProcStep(asArgs[0]);
break;
case "r":
this.doRegisters(asArgs);
break;
case "t":
case "tr":
this.doStep(asArgs[0], asArgs[1]);
break;
case "u":
this.doUnassemble(asArgs[1], asArgs[2], 8);
break;
case "x":
this.doExecOptions(asArgs);
break;
case "?":
this.doHelp();
break;
case "n":
if (this.doInfo(asArgs)) break;
/* falls through */
default:
if (!fQuiet) this.println("unknown command: " + sCmd);
result = false;
break;
}
}
} catch(e) {
this.println("debugger error: " + (e.stack || e.message));
result = false;
}
return result;
};
/**
* Debugger.init()
*
* This function operates on every HTML element of class "debugger", extracting the
* JSON-encoded parameters for the Debugger constructor from the element's "data-value"
* attribute, invoking the constructor to create a Debugger component, and then binding
* any associated HTML controls to the new component.
*/
Debugger.init = function()
{
var aeDbg = Component.getElementsByClass(window.document, PCJSCLASS, "debugger");
for (var iDbg = 0; iDbg < aeDbg.length; iDbg++) {
var eDbg = aeDbg[iDbg];
var parmsDbg = Component.getComponentParms(eDbg);
var dbg = new Debugger(parmsDbg);
Component.bindComponentControls(dbg, eDbg, PCJSCLASS);
}
};
/*
* Initialize every Debugger module on the page (as IF there's ever going to be more than one ;-))
*/
web.onInit(Debugger.init);
} // endif DEBUGGER
if (typeof module !== 'undefined') module.exports = Debugger;
/**
* @fileoverview PCjs-specific compile-time definitions.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2014-May-08
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
/**
* @define {string}
*/
var PCJSCLASS = "pcjs"; // this @define is the default application class (formerly APPCLASS) to use for PCjs
/**
* @define {boolean}
*
* WARNING: DEBUGGER needs to accurately reflect whether or not the Debugger component is (or will be) loaded.
* In the compiled case, we rely on the Closure Compiler to override DEBUGGER as appropriate. When it's *false*,
* nearly all of debugger.js will be conditionally removed by the compiler, reducing it to little more than a
* "type skeleton", which also solves some type-related warnings we would otherwise have if we tried to remove
* debugger.js from the compilation process altogether.
*
* However, when we're in "development mode" and running uncompiled code in debugger-less configurations,
* I would like to skip loading debugger.js altogether. When doing that, we must ALSO arrange for an additional file
* (nodebugger.js) to be loaded immediately after this file, which *explicitly* overrides DEBUGGER with *false*.
*/
var DEBUGGER = true; // this @define is overridden by the Closure Compiler to remove Debugger-related support
/**
* @define {boolean}
*
* PREFETCH enables the use of a prefetch queue.
*
* See the Bus component for details.
*/
var PREFETCH = false;
/**
* @define {boolean}
*
* FATARRAYS is a Closure Compiler compile-time option that allocates an Array of numbers for every Memory block,
* where each a number represents ONE byte; very wasteful, but potentially slightly faster.
*
* See the Memory component for details.
*/
var FATARRAYS = false;
/**
* TYPEDARRAYS enables use of typed arrays for Memory blocks. This used to be a compile-time-only option, but I've
* added Memory access functions for typed arrays (see Memory.afnTypedArray), so support can be enabled dynamically.
*
* See the Memory component for details.
*/
var TYPEDARRAYS = (typeof ArrayBuffer !== 'undefined');
/**
* @define {boolean}
*
* BACKTRACK enables backtracking (disabled in compiled versions). Backtracking is a mechanism that allows
* us to tag every byte of incoming data and follow the flow of that data.
*/
var BACKTRACK = !COMPILED;
/**
* @define {boolean}
*
* SAMPLER enables instruction sampling (a work-in-progress). This was used briefly as an internal debugging aid,
* to periodically record LIP values in a fixed-length sampling buffer, halting execution once the sampling buffer
* was full, and then compare those sampled LIP values to corresponding LIP values on subsequent runs, to look
* for deviations. In theory, every run is supposed to be absolutely identical, even if you interrupt execution
* with the Debugger or enable/disable different sets of messages, but in practice, that's hard to guarantee.
*/
var SAMPLER = false;
/**
* @define {boolean}
*
* BUGS_8086 enables support for known 8086 bugs. It's turned off by default, because 1) it adds overhead, and
* 2) it's hard to imagine any software actually being dependent on any of the bugs covered by this (eg, the failure
* to properly restart string instructions with multiple prefixes, or the failure to inhibit hardware interrupts
* following SS segment loads).
*/
var BUGS_8086 = false;
/**
* @define {boolean}
*
* I386 enables 80386 support. My preference continues to be one "binary" that supports all implemented CPUs, but
* I'm providing this to enable a slimmed-down binary, at least until 80386 support is actually finished; at the
* moment, there's just a lot of scaffolding that bloats the compiled version without adding any real functionality.
*/
var I386 = true;
/**
* @define {boolean}
*
* COMPAQ386 enables Compaq DeskPro 386 support.
*/
var COMPAQ386 = true;
/**
* @define {boolean}
*
* PAGEBLOCKS enables 80386 paging support with assistance from the Bus component. This affects how the Bus component
* defines physical memory parameters for a 32-bit bus. With the 8086 and 80286 processors, the Bus component was free
* to choose any block size for physical memory allocations that made sense for the bus width (eg, 4Kb blocks for a
* 20-bit bus, or 16Kb blocks for 24-bit bus).
*
* However, for the 80386 processor, it makes more sense to choose a block size that matches the page size (ie, 4Kb),
* because then we have the option of altering the address-to-memory mapping for any block to match whatever page table
* mapping is in effect for that address, if any, without requiring another layer of address translation.
*/
var PAGEBLOCKS = I386;
if (typeof module !== 'undefined') {
global.PCJSCLASS = PCJSCLASS;
global.DEBUGGER = DEBUGGER;
global.PREFETCH = PREFETCH;
global.FATARRAYS = FATARRAYS;
global.TYPEDARRAYS = TYPEDARRAYS;
global.BACKTRACK = BACKTRACK;
global.SAMPLER = SAMPLER;
global.BUGS_8086 = BUGS_8086;
global.I386 = I386;
global.COMPAQ386 = COMPAQ386;
global.PAGEBLOCKS = PAGEBLOCKS;
/*
* TODO: When we're "required" by Node, should we return anything via module.exports?
*/
}
/**
* @fileoverview Implements disk image support for both FDC and HDC.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-Nov-26
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
/*
* The Disk component provides methods for:
*
* 1) creating an empty disk: create()
* 2) loading a disk image: load()
* 3) getting disk information: info()
* 4) seeking a disk sector: seek()
* 5) reading data from a sector: read()
* 6) writing data to a sector: write()
* 7) save disk deltas: save()
* 8) restore disk deltas: restore()
* 9) converting disk contents: toJSON()
*
* More functionality may be factored out of the FDC and HDC components later and moved here, to
* further reduce some of the duplication between them, but the above functionality is a good start.
*/
/*
* Client/Server Disk I/O
*
* To support large disks without consuming large amounts of client-side memory, and to push
* client-side disk changes back the server, we need a DiskIO API that can be used in place of
* the DiskDump API.
*
* Use of the DiskIO API and any associated disk images must be tightly coupled to per-user
* storage and specific machine configurations, to prevent the disk images from being corrupted
* by inconsistent I/O operations. Our basic User API (userapi.js) already provides some
* per-user storage that we can use to get the design rolling.
*
* The DiskIO API must also provide the ability to create new (empty) hard disk images in per-user
* storage and automatically associate them with the machine configurations that requested them.
*
* Principles
* ---
* Originally, when the Disk class was given a disk image to load and mount, it would request the
* ENTIRE disk image from the DiskDump module. That works well for small (floppy) disk images, but
* for larger disks -- let's just say anything stored on the server as an "img" file -- we'd prefer
* to interact with that disk using "On-Demand I/O". Any "img" file on the same server as the PCjs
* application should be a candidate for on-demand access.
*
* On-Demand I/O means that nothing is initially transferred from the server. As sectors are
* requested by the PCjs machine, PCjs requests them from the server, and maintains an MRU cache
* of sectors, periodically discarding the least-used clean sectors above a certain memory limit.
* Dirty sectors (ie, those that the PCjs machine has written to) must be periodically sent
* back to the server and then marked as clean, so that they can be discarded like any other
* sector.
*
* We also support "local" init-only disk images, which means that dirty sectors are never sent
* back to the server and are instead retained by the client for the lifetime of the app; such
* images are "read-only" as far as the server is concerned, but "read-write" as far as the client
* is concerned. Reloading/restarting an app with an "local" disk will return the disk to its
* initial state.
*
* Practice
* ---
* Let's first look at what we *already* do for the HDC component:
*
* 1) Creating new (empty) disk images
* 2) Pre-loading pre-built JSON-encoded disk images (converting them to JSON on the fly as needed)
*
* An example of #1 is in /devices/pc/machine/5160/cga/256kb/demo/machine.xml:
*
* <hdc id="hdcXT" drives='[{name:"10Mb Hard Disk",type:3}]'/>
*
* and an example of #2 is in /disks/pc/fixed/win101.xml:
*
* <hdc id="hdcXT" drives='[{name:"10Mb Hard Disk",path:"/disks/pc/fixed/win101/10mb.json",type:3}]'/>
*
* The HDC component expects an array of drive entries. Array position determines drive numbering
* (the first entry is drive 0, the second is drive 1, etc), and each entry contains the following
* properties:
*
* 'name': user-friendly name for the disk, if any
* 'path': URL of the disk image, if any
* 'type': a drive type
*
* Of those properties, only 'type' is required, which provides an index into an HDC "Drive Type"
* table that determines disk geometry and therefore disk size. As we add support for larger disks and
* newer disk controllers, the 'type' parameter will be superseded by either a user-defined 'geometry'
* parameter that will define number of heads, cylinders, tracks, sectors per track, and (max) bytes per
* sector, or perhaps a generic 'size' parameter that leaves geometry choices to the HDC component,
* which will then pass those decisions on to the Disk component.
*
* We will enable on-demand I/O for a disk image with a new 'mode' parameter that looks like:
*
* 'mode': one of "local", "preload", "demandrw", "demandro"
*
* "preload" means the disk image will be completely preloaded, exactly as before; "demandrw" enables
* full on-demand I/O support; and "demandro" enables on-demand I/O for reads only (all writes are retained
* and never written back to the server).
*
* "ro" will be the fallback for "rw" unless TWO other important criteria are met: 1) the user has a
* private user key, and therefore per-user storage; and 2) the disk image 'path' contains an asterisk (*)
* that the server can internally remap to a directory in the user's storage; eg:
*
* 'path': <asterisk>/10mb.img (path components following the asterisk are optional)
*
* If the disk image does not already exist, it will be created (but not formatted).
*
* This preserves the promise that EVERYTHING a user does within a PCjs machine is private (ie, not
* visible to any other PCjs users). I don't want to be in the business of saving any user machine
* states or disk changes, but at least those operations are limited to users who have asked for (and
* received) a private user key.
*
* Another important consideration at this stage is dealing with multiple machines writing to the same
* disk image; even though we're limiting the "demandrw" mode to per-user images, a single user may still
* inadvertently start up multiple machines that refer to the same disk image.
*
* So, every PCjs machine needs to generate a unique token and include that token with every Disk I/O API
* operation, so that the server can revoke a previous machine's "rw" access to a disk image when a new
* machine requests "rw" access to the same disk image.
*
* From the client's perspective, revocation can be quietly dealt with by reverting to "demandro" mode;
* that client becomes stuck with all their dirty sectors until they can reclaim "rw" access, which should
* only happen if no intervening writes to the disk image on the server have occurred (if I bother allowing
* reclamation at all).
*
* The real challenge here is avoiding revocation of a machine that still has critical changes to commit,
* but since we can't even solve the problem of a user closing their browser at an inopportune time
* and potentially leaving a disk image in an inconsistent state, premature revocation is the least of
* our problems. Since a real hard disk could suffer the same fate if the machine's power was turned off
* at the wrong time, you could say that we're simply providing a faithful simulation of reality.
*/
"use strict";
if (typeof module !== 'undefined') {
var str = require("../../shared/lib/strlib");
var usr = require("../../shared/lib/usrlib");
var web = require("../../shared/lib/weblib");
var DiskAPI = require("../../shared/lib/diskapi");
var DumpAPI = require("../../shared/lib/dumpapi");
var Component = require("../../shared/lib/component");
var Messages = require("./messages");
}
/**
* Disk(controller, drive, mode)
*
* Disk contents are stored as an array (aDiskData) of cylinders, each of which is an array of
* heads, each of which is an array of sector objects; the latter contain sector numbers and
* sector data, where sector data is an array of dwords. The format does not impose any
* limitations on number of cylinders, number of heads, sectors per track, or bytes per sector.
*
* WARNING: All accesses to disk sector properties must be via their string names, not their
* "dot" names, otherwise code will break after it's been processed by the Closure Compiler,
* and any dumped disks may be unmountable. This is a side-effect of how we mount and dump
* disk images (ie, as JSON-encoded streams).
*
* This means, for example, that all references to "track[iSector].data" must actually appear as
* "track[iSector]['data']".
*
* @constructor
* @extends Component
* @param {HDC|FDC} controller
* @param {Object} drive
* @param {string} mode
*/
function Disk(controller, drive, mode)
{
Component.call(this, "Disk", {'id': controller.idMachine + ".disk" + (++Disk.nDisks)}, Disk, Messages.DISK);
/*
* Route all non-Debugger messages (eg, notice() and println() calls) through
* this.controller (eg, controller.notice() and controller.println()), because
* the Computer component is unaware of any Disk objects and therefore will not
* set up the usual overrides when a Control Panel is installed.
*/
this.controller = controller;
this.cmp = controller.cmp;
this.dbg = controller.dbg;
this.drive = drive;
/*
* We pull out a number of drive properties that we may or may not need as defaults
*/
this.sDiskName = drive.name;
this.fRemovable = drive.fRemovable;
this.fOnDemand = this.fRemote = false;
/*
* Initialize the disk contents
*/
this.create(mode, drive.nCylinders, drive.nHeads, drive.nSectors, drive.cbSector);
/*
* The following dirty sector and timer properties are used only with fOnDemand disks,
* assuming fRemote was successfully set.
*/
this.aDirtySectors = [];
this.aDirtyTimestamps = []; // this array is parallel to aDirtySectors
this.timerWrite = null; // REMOTE_WRITE_DELAY timer in effect, if any
this.msTimerWrite = 0; // the time that the write timer, if any, is set to fire
this.fWriteInProgress = false;
this.setReady();
}
/**
* @typedef {{
* sPath: string,
* sName: string,
* bAttr: number,
* cbSize: number,
* apba: Array.<number>,
* disk: Disk
* }}
*/
var FileInfo;
/**
* Every Sector object (once loaded and fully parsed) should have ALL of the following named properties:
*
* 'sector': sector number
* 'length': size of the sector, in bytes
* 'data': array of dwords
* 'pattern': dword pattern to use for empty or partial sectors (or null if sector still needs to be loaded)
*
* initSector() also sets the following properties, to help us quickly identify its location within aDiskData:
*
* iCylinder
* iHead
*
* In addition, we will maintain the following information on a per-sector basis, as sectors are modified:
*
* iModify: index of first modified dword in sector
* cModify: number of modified dwords in sector
* fDirty: true if sector is dirty, false if clean (or cleaning in progress)
*
* fDirty is used in conjunction with "demandrw" disks; it is set to true whenever the sector is modified, and is
* set to false whenever the sector has been sent to the server. If the server write succeeds and fDirty is still
* false, then the sector modifications are removed (cModify is set to zero). If the write succeeds but fDirty was
* set to true again in the meantime, then all the sector modifications (even those that were just written) remain
* in place (since we don't keep track of more than one modification range within a sector). And if the write failed,
* then fDirty is set back to true and again all modifications remain in place; the best we can do is schedule another
* write attempt.
*
* TODO: Perhaps we should also maintain a failure count and stop trying to write sectors that reach a certain
* threshold. Error-handling, as usual, is the thorniest problem.
*
* @typedef {{
* sector: number,
* length: number,
* data: Array.<number>,
* pattern: (number|null),
* iCylinder: number,
* iHead: number,
* iModify: number,
* cModify: number
* }}
*/
var SectorData;
/**
* @class SectorInfo
* @property {number} 0 contains iCylinder
* @property {number} 1 contains iHead
* @property {number} 2 contains iSector
* @property {number} 3 contains nSectors
* @property {boolean} 4 contains fAsync
* @property {function(nErrorCode:number,fAsync:boolean)} 5 contains done
*/
/**
* The default number of milliseconds to wait before writing a dirty sector back to a remote disk image
*
* @const {number}
*/
Disk.REMOTE_WRITE_DELAY = 2000; // 2-second delay
/*
* A global disk count, used to form unique Disk component IDs
*/
Disk.nDisks = 0;
Component.subclass(Disk);
/**
* initBus(cmp, bus, cpu, dbg)
*
* We have no real interest in this notification, other than to obtain a reference to the Debugger
* for every disk loaded BEFORE the initBus() phase; any disk loaded AFTER that point will get its Debugger
* reference, if any, from the disk controller passed to the Disk() constructor.
*
* @this {ChipSet}
* @param {Computer} cmp
* @param {Bus} bus
* @param {X86CPU} cpu
* @param {Debugger} dbg
*/
Disk.prototype.initBus = function(cmp, bus, cpu, dbg) {
this.dbg = dbg;
};
/**
* isRemote()
*
* @this {Disk}
* @return {boolean} true if remote disk, false if not
*/
Disk.prototype.isRemote = function() {
/*
* Ironically, we can't rely on fRemote, because that is cleared and set across disconnect and
* reconnect operations. fOnDemand is the next best thing.
*/
return this.fOnDemand;
};
/**
* powerUp(data, fRepower)
*
* As with powerDown(), our sole concern here is for REMOTE disks: if a powerDown() call disconnected an
* "on-demand" disk, we need to get reconnected. Calling our own load() function should get the job done.
*
* The HDC component could have triggered this as well, but its powerUp() function only calls autoMount()
* in case of page (ie, application) reload, which is fine for local disks but insufficient for remote disks,
* which have a server connection that must be re-established.
*
* @this {Disk}
* @param {Object|null} data
* @param {boolean} [fRepower]
* @return {boolean} true if successful, false if failure
*/
Disk.prototype.powerUp = function(data, fRepower) {
if (!fRepower) {
if (this.fOnDemand && !this.fRemote) {
this.setReady(false);
this.load(this.sDiskName, this.sDiskPath, null, this.donePowerUp, this);
}
}
return true;
};
/**
* donePowerUp(drive, disk, sDiskName, sDiskPath)
*
* This is a callback issued by the Disk component once the load() from powerUp() has finished.
*
* @this {HDC}
* @param {Object} drive
* @param {Disk} disk is set if the disk was successfully mounted, null if not
* @param {string} sDiskName
* @param {string} sDiskPath
*/
Disk.prototype.donePowerUp = function(drive, disk, sDiskName, sDiskPath)
{
this.setReady(true);
};
/**
* powerDown(fSave, fShutdown)
*
* Our sole concern here is for REMOTE disks, making sure any unwritten changes get flushed to
* the server during a shutdown. No local state is ever returned, so fSave is ignored.
*
* Local disks are managed by the controller (ie, FDC or HDC) that mounted them; the controller's
* powerDown() handler will take care of calling save() as needed.
*
* TODO: Consider taking responsibility for saving the state of local disks as well; the only reason
* the controllers still take care of them is historical, because this component originally didn't
* exist, and even after it was created, it didn't originally receive powerDown() notifications.
*
* @this {Disk}
* @param {boolean} fSave
* @param {boolean} [fShutdown]
* @return {Object|boolean}
*/
Disk.prototype.powerDown = function(fSave, fShutdown)
{
/*
* If we're connected to a remote disk, take this opportunity to flush any remaining unwritten
* changes and then close the connection.
*/
if (this.fRemote) {
var response;
var nErrorCode = 0;
if (this.fWriteInProgress) {
/*
* TODO: Verify that the Computer's powerOff() handler will actually honor a false return value.
*/
if (!web.confirmUser("Disk writes are still in progress, shut down anyway?")) {
return false;
}
}
while ((response = this.findDirtySectors(false))) {
if ((nErrorCode = response[0])) {
this.controller.notice('Unable to save "' + this.sDiskName + '" (error ' + nErrorCode + ')');
break;
}
}
if (fShutdown) {
this.disconnectRemoteDisk();
}
/*
* I only report that changes to the disk have been "saved" if fSave is true, to avoid confusing
* users who might not understand the difference between discarding local changes (which should restore
* all diskettes to their original state) and discarding remote changes (which could leave the remote disk
* in a bad state).
*/
if (!nErrorCode && fSave) this.controller.notice(this.sDiskName + " saved");
}
return true;
};
/**
* create()
*
* @param {string} mode
* @param {number} nCylinders
* @param {number} nHeads
* @param {number} nSectors (per track)
* @param {number} cbSector
*
* Initializes the disk contents according to the current drive mode and parameters.
*/
Disk.prototype.create = function(mode, nCylinders, nHeads, nSectors, cbSector)
{
this.mode = mode;
this.nCylinders = nCylinders;
this.nHeads = nHeads;
this.nSectors = nSectors;
this.cbSector = cbSector;
this.aDiskData = [];
/*
* If the drive is using PRELOAD mode, then it will use the load()/mount() process to initialize the disk contents;
* it wouldn't hurt to let create() do its thing, too, but it's a waste of time.
*/
if (this.mode != DiskAPI.MODE.PRELOAD) {
if (DEBUG && this.messageEnabled()) {
this.printMessage("blank disk for \"" + this.sDiskName + "\": " + this.nCylinders + " cylinders, " + this.nHeads + " head(s)");
}
var aCylinders = new Array(this.nCylinders);
for (var iCylinder = 0; iCylinder < aCylinders.length; iCylinder++) {
var aHeads = new Array(this.nHeads);
for (var iHead = 0; iHead < aHeads.length; iHead++) {
var aSectors = new Array(this.nSectors);
for (var iSector = 1; iSector <= aSectors.length; iSector++) {
/*
* Now that our read() and write() functions can deal with unallocated data
* arrays, and can read/write the specified pattern on-the-fly, we no longer need
* to pre-allocate and pre-initialize the 'data' array.
*
* For "local" disks, we can assume a 'pattern' of 0, but for "demandrw" and "demandro"
* disks, 'pattern' is set to null, as yet another indication that I/O is required to load
* the sector from the server (or to write it back to the server).
*/
aSectors[iSector - 1] = this.initSector(null, iCylinder, iHead, iSector, this.cbSector, (this.mode == DiskAPI.MODE.LOCAL? 0 : null));
}
aHeads[iHead] = aSectors;
}
aCylinders[iCylinder] = aHeads;
}
this.aDiskData = aCylinders;
}
this.dwChecksum = null;
};
/**
* load(sDiskName, sDiskPath, file, fnNotify)
*
* TODO: Figure out how we can strongly type fnNotify, because the Closure Compiler has issues with:
*
* param {function(Component,Object,Disk,string,string)} fnNotify
*
* for:
*
* this.fnNotify.call(this.controller, this.drive, disk, this.sDiskName, this.sDiskPath);
*
* Also, while we're at it, learn if there are ways to:
*
* 1) declare a function taking NO parameters (ie, generate a warning if any parameters are specified)
* 2) declare a type for a function's return value
*
* @this {Disk}
* @param {string} sDiskName
* @param {string} sDiskPath
* @param {File} [file] is set if there's an associated File object
* @param {function(...)} [fnNotify]
* @param {Component} [controller]
*/
Disk.prototype.load = function(sDiskName, sDiskPath, file, fnNotify, controller)
{
var sDiskURL = sDiskPath;
/*
* We could use this.log() as well, but it wouldn't display which component initiated the load.
*/
if (DEBUG) {
var sMessage = 'load("' + sDiskName + '","' + sDiskPath + '")';
this.controller.log(sMessage);
this.printMessage(sMessage);
}
if (this.fnNotify) {
if (DEBUG) this.controller.log('too many load requests for "' + sDiskName + '" (' + sDiskPath + ')');
return;
}
this.sDiskName = sDiskName;
this.sDiskPath = sDiskPath;
this.fnNotify = fnNotify;
this.controllerNotify = controller || this.controller;
if (file) {
var disk = this;
var reader = new FileReader();
reader.onload = function() {
disk.build(reader.result, true);
};
reader.readAsArrayBuffer(file);
return;
}
/*
* If there's an occurrence of API_ENDPOINT anywhere in the path, we assume we can use it as-is;
* ie, that the user has already formed a URL of the type we use ourselves for unconverted disk images.
*/
if (sDiskPath.indexOf(DumpAPI.ENDPOINT) < 0) {
/*
* If the selected disk image has a "json" extension, then we assume it's a pre-converted
* JSON-encoded disk image, so we load it as-is; otherwise, we ask our server-side disk image
* converter to return the corresponding JSON-encoded data.
*/
var sDiskExt = str.getExtension(sDiskPath);
if (sDiskExt == DumpAPI.FORMAT.JSON) {
sDiskURL = encodeURI(sDiskPath);
} else {
if (this.mode == DiskAPI.MODE.DEMANDRW || this.mode == DiskAPI.MODE.DEMANDRO) {
sDiskURL = this.connectRemoteDisk(sDiskPath);
this.fOnDemand = true;
} else {
var sDiskParm = DumpAPI.QUERY.PATH;
var sSizeParm = '&' + DumpAPI.QUERY.MBHD + "=10";
/*
* 'mbhd' is a new parm added for hard disk support. In the case of 'file' or 'dir' requests,
* 'mbhd' informs DumpAPI.ENDPOINT that it should create a hard disk image, and one not larger than
* the specified size (eg, 10mb). In fact, until DumpAPI.ENDPOINT is changed to create custom hard
* disk BPBs, you'll always get a standard PC XT 10mb disk image, so if the 'file' or 'dir' contains
* more than 10mb of data, the request will fail. Ultimately, I want to honor the controller's
* driveConfig 'size' parm, or to match the capacity required by the driveConfig 'type' parameter.
*
* If a 'disk' is specified, we pass mbhd=0, because the actual size will depend on the image.
* However, I don't currently have any "dsk" or "img" files containing hard disk images; those formats
* were really intended for floppy disk images. If I never create any hard disk image files, then
* we can simply eliminate sSizeParm in the 'disk' case.
*
* Added more extensions to the list of paths-treated-as-disk-images, so that URLs to files located here:
*
* ftp://ftp.oldskool.org/pub/TOPBENCH/dskimage/
*
* can be used as-is. TODO: There's a TODO in netlib.getFile() regarding remote support that needs
* to be resolved first; DiskDump relies on that function for its remote requests, and it currently
* supports only HTTP.
*/
if (!sDiskPath.indexOf("http:") || !sDiskPath.indexOf("ftp:") || ["dsk", "ima", "img", "360", "720", "12", "144"].indexOf(sDiskExt) >= 0) {
sDiskParm = DumpAPI.QUERY.DISK;
sSizeParm = '&' + DumpAPI.QUERY.MBHD + "=0";
} else if (str.endsWith(sDiskPath, '/')) {
sDiskParm = DumpAPI.QUERY.DIR;
}
sDiskURL = web.getHost() + DumpAPI.ENDPOINT + '?' + sDiskParm + '=' + encodeURIComponent(sDiskPath) + (this.fRemovable ? "" : sSizeParm) + "&" + DumpAPI.QUERY.FORMAT + "=" + DumpAPI.FORMAT.JSON;
}
}
}
web.loadResource(sDiskURL, true, null, this, this.doneLoad, sDiskPath);
};
/**
*
* build(buffer, fModified)
*
* Builds a disk image from an ArrayBuffer (eg, from a FileReader object), rather than from JSON-encoded data.
*
* @this {Disk}
* @param {?} buffer (we KNOW this is an ArrayBuffer, but we can't seem to convince the Closure Compiler)
* @param {boolean} [fModified] is true if we should mark the entire disk modified (to ensure that we save/restore it)
*/
Disk.prototype.build = function(buffer, fModified)
{
var disk;
var cbDiskData = buffer? buffer.byteLength : 0;
var disketteFormat = DiskAPI.DISKETTE_FORMATS[cbDiskData];
if (disketteFormat) {
this.nCylinders = disketteFormat[0];
this.nHeads = disketteFormat[1];
this.nSectors = disketteFormat[2];
this.cbSector = 512;
var cdw = this.cbSector >> 2, dwPattern = 0, dwChecksum = 0;
var ib = 0;
var dv = new DataView(buffer, 0, cbDiskData);
this.aDiskData = new Array(this.nCylinders);
for (var iCylinder = 0; iCylinder < this.aDiskData.length; iCylinder++) {
var cylinder = this.aDiskData[iCylinder] = new Array(this.nHeads);
for (var iHead = 0; iHead < cylinder.length; iHead++) {
var head = cylinder[iHead] = new Array(this.nSectors);
for (var iSector = 0; iSector < head.length; iSector++) {
var sector = this.initSector(null, iCylinder, iHead, iSector + 1, this.cbSector, dwPattern);
var adw = sector['data'];
for (var idw = 0; idw < cdw; idw++, ib += 4) {
var dw = adw[idw] = dv.getInt32(ib, true);
dwChecksum = (dwChecksum + dw) & (0xffffffff|0);
}
if (fModified) sector.cModify = cdw;
head[iSector] = sector;
}
}
}
this.dwChecksum = dwChecksum;
disk = this;
} else {
this.notice("Unrecognized diskette format (" + cbDiskData + " bytes)");
}
if (this.fnNotify) {
this.fnNotify.call(this.controller, this.drive, disk, this.sDiskName, this.sDiskPath);
this.fnNotify = null;
}
};
/**
* doneLoad(sDiskFile, sDiskData, nErrorCode, sDiskPath)
*
* This function was originally called mount(). If the mount is successful, we pass the Disk object to the
* caller's fnNotify handler; otherwise, we pass null.
*
* @this {Disk}
* @param {string} sDiskFile
* @param {string} sDiskData
* @param {number} nErrorCode (response from server if anything other than 200)
* @param {string} sDiskPath (passed through from load() to loadResource())
*/
Disk.prototype.doneLoad = function(sDiskFile, sDiskData, nErrorCode, sDiskPath)
{
var disk = null;
this.fWriteProtected = false;
var fPrintOnly = (nErrorCode < 0 && this.cmp && !this.cmp.aFlags.fPowered);
this.sDiskFile = sDiskFile;
if (this.fOnDemand) {
if (!nErrorCode) {
if (DEBUG && this.messageEnabled()) {
this.printMessage('doneLoad("' + sDiskFile + '","' + sDiskPath + '")');
}
this.fRemote = true;
this.buildFileTable();
disk = this;
} else {
this.controller.notice('Unable to connect to disk "' + sDiskPath + '" (error ' + nErrorCode + ': ' + sDiskData + ')', fPrintOnly);
}
}
else if (nErrorCode) {
/*
* This can happen for innocuous reasons, such as the user switching away too quickly, forcing
* the request to be cancelled. And unfortunately, the browser cancels XMLHttpRequest requests
* BEFORE it notifies any page event handlers, so if the Computer's being powered down, we won't know
* that yet. For now, we rely on the lack of a specific error (nErrorCode < 0), and suppress the
* notify() alert if there's no specific error AND the computer is not powered up yet.
*/
this.controller.notice("Unable to load disk \"" + this.sDiskName + "\" (error " + nErrorCode + ")", fPrintOnly);
} else {
if (DEBUG && this.messageEnabled()) {
this.printMessage('doneLoad("' + sDiskFile + '","' + sDiskPath + '")');
}
try {
/*
* The following code was a hack to turn on write-protection for a disk image if there was
* an initial comment line containing the string "write-protected". However, since comments
* are technically not allowed in JSON, I needed an alternative solution. So, if the basename
* contains the suffix "-readonly", then I'll turn on write-protection for that disk as well.
*
* TODO: Provide some UI for turning write-protection on/off for disks at will, and provide
* an XML-based solution (ie, a per-disk XML configuration option) for controlling it as well.
*/
var sBaseName = str.getBaseName(sDiskFile, true).toLowerCase();
if (sBaseName.indexOf("-readonly") > 0) {
this.fWriteProtected = true;
} else {
var iEOL = sDiskData.indexOf("\n");
if (iEOL > 0 && iEOL < 1024) {
var sConfig = sDiskData.substring(0, iEOL);
if (sConfig.indexOf("write-protected") > 0) {
this.fWriteProtected = true;
}
}
}
/*
* The most likely source of any exception will be here, where we're parsing the disk data.
*
* TODO: IE9 is rather unfriendly and restrictive with regard to how much data it's willing to
* eval(). In particular, the 10Mb disk image we use for the Windows 1.01 demo config fails in
* IE9 with an "Out of memory" exception. One work-around would be to chop the data into chunks
* (perhaps one track per chunk, using regular expressions) and then manually re-assemble it.
*
* However, it turns out that using JSON.parse(sDiskData) instead of eval("(" + sDiskData + ")")
* is a much easier fix. The only drawback is that we must first quote any unquoted property names
* and remove any comments, because while eval() was cool with them, JSON.parse() is more particular;
* the following RegExp replacements take care of those requirements.
*
* The use of hex values is something else that eval() was OK with, but JSON.parse() is not, and
* while I've stopped using hex values in DumpAPI responses (at least when "format=json" is specified),
* I can't guarantee they won't show up in "legacy" images, and there's no simple RegExp replacement
* for transforming hex values into decimal values, so I cop out and fall back to eval() if I detect
* any hex prefixes ("0x") in the sequence. Ditto for error messages, which appear like so:
*
* ["unrecognized disk path: test.img"]
*/
var aDiskData;
if (sDiskData.substr(0, 1) == "<") { // if the "data" begins with a "<"...
/*
* Early server configs reported an error (via the nErrorCode parameter) if a disk URL was invalid,
* but more recent server configs now display a somewhat friendlier HTML error page. The downside,
* however, is that the original error has been buried, and we've received "data" that isn't actually
* disk data.
*
* So, if the data we've received appears to be "HTML-like", all we can really do is assume that the
* disk image is missing. And so we pretend we received an error message to that effect.
*/
aDiskData = ["Missing disk image: " + this.sDiskName];
} else {
if (sDiskData.indexOf("0x") < 0 && sDiskData.substr(0, 2) != "[\"") {
aDiskData = JSON.parse(sDiskData.replace(/([a-z]+):/gm, "\"$1\":").replace(/\/\/[^\n]*/gm, ""));
} else {
aDiskData = eval("(" + sDiskData + ")");
}
}
if (!aDiskData.length) {
Component.error("Empty disk image: " + this.sDiskName);
}
else if (aDiskData.length == 1) {
Component.error(aDiskData[0]);
}
/*
* aDiskData is an array of cylinders, each of which is an array of heads, each of which
* is an array of sector objects. The format does not impose any limitations on number of
* cylinders, number of heads, or number of bytes in any of the sector object byte-arrays.
*
* WARNING: All accesses to sector object properties must be via their string names, not their
* "dot" names, otherwise code will break after it's been processed by the Closure Compiler.
*
* Sector object properties include:
*
* 'sector' the sector number (1-based, not required to be sequential)
* 'length' the byte-length (ie, formatted length) of the sector
* 'data' the dword-array containing the sector data
* 'pattern' if the dword-array length is less than 'length'/4, this value must be used
* to pad out the sector; if no 'pattern' is specified, it's assumed to be zero
*
* We still support the older JSON encoding, where sector data was encoded as an array of 'bytes'
* rather than a dword 'data' array. However, our support is strictly limited to an on-the-fly
* conversion to a forward-compatible 'data' array.
*/
else {
if (MAXDEBUG && this.messageEnabled()) {
var sCylinders = aDiskData.length + " track" + (aDiskData.length > 1 ? "s" : "");
var nHeads = aDiskData[0].length;
var sHeads = nHeads + " head" + (nHeads > 1 ? "s" : "");
var nSectorsPerTrack = aDiskData[0][0].length;
var sSectorsPerTrack = nSectorsPerTrack + " sector" + (nSectorsPerTrack > 1 ? "s" : "") + "/track";
this.printMessage(sCylinders + ", " + sHeads + ", " + sSectorsPerTrack);
}
/*
* Before the image is usable, we must "normalize" all the sectors. In the past, this meant
* "inflating" them all. However, that's no longer strictly necessary. Mainly, it just means
* setting 'length', 'data', and 'pattern' properties, so that all the sectors are well-defined.
* This includes detecting sector data in older formats (eg, the old array of 'bytes' instead
* of the new 'data' array of dwords) and converting them on-the-fly to the current format.
*/
this.nCylinders = aDiskData.length;
this.nHeads = aDiskData[0].length;
this.nSectors = aDiskData[0][0].length;
var sector = aDiskData[0][0][0];
this.cbSector = (sector && sector['length']) || 512;
var dwChecksum = 0;
for (var iCylinder = 0; iCylinder < this.nCylinders; iCylinder++) {
for (var iHead = 0; iHead < this.nHeads; iHead++) {
for (var iSector = 0; iSector < this.nSectors; iSector++) {
sector = aDiskData[iCylinder][iHead][iSector];
if (!sector) continue; // non-standard (eg, XDF) disk images may have "unused" (null) sectors
var length = sector['length'];
if (length === undefined) { // provide backward-compatibility with older JSON...
length = sector['length'] = 512;
}
length >>= 2; // convert length from a byte-length to a dword-length
var dwPattern = sector['pattern'];
if (dwPattern === undefined) {
dwPattern = sector['pattern'] = 0;
}
var adw = sector['data'];
if (adw === undefined) {
var ab = sector['bytes'];
if (ab === undefined || !ab.length) {
/*
* It would be odd if there was neither a 'bytes' nor 'data' array; I'm just
* being paranoid. It's more likely that the 'bytes' array is simply empty,
* in which case we need only create an empty 'data' array and turn the byte
* pattern, if any, into a dword pattern.
*/
adw = [];
this.assert((dwPattern & 0xff) == dwPattern);
dwPattern = sector['pattern'] = (dwPattern | (dwPattern << 8) | (dwPattern << 16) | (dwPattern << 24));
sector['data'] = adw;
} else {
/*
* To keep the conversion code simple, we'll do any necessary pattern-filling first,
* to fully "inflate" the sector, eliminating the possibility of partial dwords and
* saving any code downstream from dealing with byte-size patterns.
*/
var cb = length << 2;
for (var ib = ab.length; ib < cb; ib++) {
ab[ib] = dwPattern; // the pattern for byte-arrays was only a byte
}
this.fill(sector, ab, 0);
}
delete sector['bytes'];
}
this.initSector(sector, iCylinder, iHead);
/*
* For the disk as a whole, we maintain a checksum of the original unmodified data:
*
* dwChecksum: summation of all dwords in all non-empty sectors
*
* Pattern-filling of sectors is deferred until absolutely necessary (eg, when a sector is
* being written). So all we need to do at this point is checksum all the initial sector data.
*/
for (var idw = 0; idw < adw.length; idw++) {
dwChecksum = (dwChecksum + adw[idw]) & (0xffffffff|0);
}
}
}
}
this.aDiskData = aDiskData;
this.dwChecksum = dwChecksum;
this.buildFileTable();
disk = this;
}
} catch (e) {
Component.error("Disk image error: " + e.message);
}
}
if (this.fnNotify) {
this.fnNotify.call(this.controllerNotify, this.drive, disk, this.sDiskName, this.sDiskPath);
this.fnNotify = null;
}
};
/**
* buildFileTable()
*
* This function builds a complete file table from the (first) FAT volume found on the current disk, and
* then updates all the sector objects to point back to the corresponding file. Used for BACKTRACK support.
*
* Note that while most of the methods in this module use CHS-style parameters, because our primary clients
* are old disk controllers that deal exclusively with cylinder/head/sector values, here we use 0-based
* "logical" sector numbers for volume-relative block addresses (aka LBAs or Logical Block Addresses), and
* 0-based "physical" sector numbers for disk-relative block addresses (aka PBAs or Physical Block Addresses).
*
* Also, our use of the term LBA differs from that of more modern disk controllers; in the pre-modern world
* of PCjs, what we call PBA numbers are what those controllers would later call LBA numbers.
*
* @this {Disk}
*/
Disk.prototype.buildFileTable = function()
{
if (BACKTRACK) {
var i, off, dir = {};
this.aFileTable = [];
dir.pbaVolume = dir.lbaTotal = 0;
var cbDisk = this.nCylinders * this.nHeads * this.nSectors * this.cbSector;
/*
* At this point, if this is a remote disk, you may see some warning messages in your browser's console,
* like this message from Chrome:
*
* "Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects
* to the end user's experience. For more help, check http://xhr.spec.whatwg.org/."
*
* This is because I was lazy and made the buildFileTable() worker function getSector() use the synchronous
* form of seek(). For development purposes, that was fine, but... TODO: Eventually change buildFileTable()
* to use async I/O.
*/
if (this.fRemote) this.log("ignore any synchronous XMLHttpRequest warnings here (for now)");
var sectorBoot = this.getSector(0);
if (!sectorBoot) {
if (DEBUG && this.messageEnabled()) {
this.printMessage("buildFileTable(): unable to read boot sector");
}
return;
}
dir.cbSector = this.getSectorData(sectorBoot, DiskAPI.BPB.SECTOR_BYTES, 2);
var fValid = true;
if (dir.cbSector != this.cbSector) {
/*
* When the first sector doesn't appear to contain a valid BPB, the most likely explanations are:
*
* 1. The image is from a diskette formatted by DOS 1.xx, which didn't use BPBs
* 2. The image is a fixed (partitioned) disk and the first sector is actually an MBR
* 3. The image is from a diskette that used a non-standard sector size (ie, not 512)
*
* To start, if this is an 160Kb disk (circa DOS 1.00) or a 320Kb disk (circa DOS 1.10), then we'll
* assume it's a 12-bit FAT, set assorted BPB values accordingly, and see if our assumption holds up.
*/
fValid = false;
dir.lbaFAT = 1;
dir.nFATBits = 12;
dir.lbaRoot = dir.lbaFAT + 2; // both 160Kb and 320Kb disks contained 2 FATs, each containing 1 sector
dir.nClusterSecs = 1;
dir.cbSector = this.cbSector;
if (cbDisk == 160 * 1024 && this.getClusterEntry(dir, 0, 0) == DiskAPI.FAT.MEDIA_160KB) {
dir.lbaTotal = 320;
dir.nEntries = 64;
fValid = true;
}
else if (cbDisk == 320 * 1024 && this.getClusterEntry(dir, 0, 0) == DiskAPI.FAT.MEDIA_320KB) {
dir.lbaTotal = 640;
dir.nEntries = 112;
fValid = true;
}
else {
/*
* So, this is either a fixed (partitioned) disk, or a disk using a non-standard sector size; let's assume
* the former and check for an MBR. For now, we're only going to process the first active partition we find.
*/
off = DiskAPI.MBR.PARTITIONS.OFFSET;
for (i = 0; i < 4; i++) {
var bStatus = this.getSectorData(sectorBoot, off + DiskAPI.MBR.PARTITIONS.ENTRY.STATUS, 1);
if (bStatus == DiskAPI.MBR.PARTITIONS.STATUS.ACTIVE) {
dir.pbaVolume = this.getSectorData(sectorBoot, off + DiskAPI.MBR.PARTITIONS.ENTRY.LBA_FIRST, 4);
sectorBoot = this.getSector(dir.pbaVolume);
if (sectorBoot) fValid = true;
break;
}
off += DiskAPI.MBR.PARTITIONS.ENTRY.LENGTH;
}
}
if (!fValid) {
if (DEBUG && this.messageEnabled()) {
this.printMessage("buildFileTable(): unrecognized " + cbDisk + "-byte disk image with " + this.cbSector + "-byte sectors");
}
return;
}
}
if (!dir.lbaTotal) {
dir.lbaTotal = this.getSectorData(sectorBoot, DiskAPI.BPB.TOTAL_SECS, 2) || this.getSectorData(sectorBoot, DiskAPI.BPB.LARGE_SECS, 4);
dir.lbaFAT = this.getSectorData(sectorBoot, DiskAPI.BPB.RESERVED_SECS, 2);
dir.lbaRoot = dir.lbaFAT + this.getSectorData(sectorBoot, DiskAPI.BPB.FAT_SECS, 2) * this.getSectorData(sectorBoot, DiskAPI.BPB.TOTAL_FATS, 1);
dir.nEntries = this.getSectorData(sectorBoot, DiskAPI.BPB.ROOT_DIRENTS, 2);
dir.nClusterSecs = this.getSectorData(sectorBoot, DiskAPI.BPB.CLUSTER_SECS, 1);
}
dir.lbaData = dir.lbaRoot + (((dir.nEntries * DiskAPI.DIRENT.LENGTH + (dir.cbSector - 1)) / dir.cbSector) | 0);
dir.nClusters = (((dir.lbaTotal - dir.lbaData) / dir.nClusterSecs) | 0);
/*
* In all FATs, the first valid cluster number is 2, as 0 is used to indicate a free cluster and 1 is reserved.
*
* In a 12-bit FAT chain, the largest valid cluster number (iClusterMax) is 0xFF6; 0xFF7 is reserved for marking
* bad clusters and should NEVER appear in a cluster chain, and 0xFF8-0xFFF are used to indicate the end of a chain.
* Reports that cluster numbers 0xFF0-0xFF6 are "reserved" (eg, http://support.microsoft.com/KB/65541) should be
* ignored; those numbers may have been considered "reserved" at some early point in FAT's history, but no longer.
*
* Since 12 bits yield 4096 possible values, and since 11 of the values (0, 1, and 0xFF7-0xFFF) cannot be used to
* refer to an actual cluster, that leaves a theoretical maximum of 4085 clusters for a 12-bit FAT. However, for
* reasons that only a small (and shrinking -- RIP AAR) number of people know, the actual cut-off is 4084.
*
* So, a FAT volume with 4084 or fewer clusters uses a 12-bit FAT, a FAT volume with 4085 to 65524 clusters uses
* a 16-bit FAT, and a FAT volume with more than 65524 clusters uses a 32-bit FAT.
*
* TODO: Eventually add support for FAT32.
*/
dir.nFATBits = (dir.nClusters <= DiskAPI.FAT12.MAX_CLUSTERS? 12 : 16);
dir.iClusterMax = (dir.nFATBits == 12? DiskAPI.FAT12.CLUSNUM_MAX : DiskAPI.FAT16.CLUSNUM_MAX);
if (DEBUG && this.messageEnabled()) {
this.printMessage("buildFileTable()\n\tlbaFAT: " + dir.lbaFAT + "\n\tlbaRoot: " + dir.lbaRoot + "\n\tlbaData: " + dir.lbaData + "\n\tlbaTotal: " + dir.lbaTotal + "\n\tnClusterSecs: " + dir.nClusterSecs + "\n\tnClusters: " + dir.nClusters);
}
/*
* The following assertion is here only to catch anomalies; it is NOT a requirement that the number of data sectors
* be a perfect multiple of nClusterSecs, but if it ever happens, it's worth verifying we didn't miscalculate something.
*/
i = (dir.lbaTotal - dir.lbaData) % dir.nClusterSecs;
if (i) {
if (DEBUG && this.messageEnabled()) {
this.printMessage("buildFileTable(): " + cbDisk + "-byte disk image wasting " + i + " sectors");
}
}
/*
* Similarly, it is NOT a requirement that the size of all root directory entries be a perfect multiple of the sector
* size (cbSector), but it may indicate a problem if it's not. Note that when it comes time to read the root directory,
* we treat it exactly like any other directory; that is, we ignore the nEntries value and scan the entire contents of
* every sector allocated to the directory. TODO: Determine whether DOS reads all root sector contents or only nEntries
* (ie, create a test volume where nEntries * 32 is NOT a multiple of cbSector and watch what happens).
*/
this.assert(!((dir.nEntries * DiskAPI.DIRENT.LENGTH) % dir.cbSector));
var apba = [];
for (var lba = dir.lbaRoot; lba < dir.lbaData; lba++) apba.push(dir.pbaVolume + lba);
this.getDir(dir, this.sDiskFile, "", apba);
/*
* Create the sector-to-file mappings now.
*/
for (i = 0; i < this.aFileTable.length; i++) {
var file = this.aFileTable[i];
off = 0;
for (var iSector = 0; iSector < file.apba.length; iSector++) {
this.updateSector(file, file.apba[iSector], off);
off += this.cbSector;
}
}
}
};
/**
* getDir(dir, sDisk, sDir, apba)
*
* @this {Disk}
* @param {Object} dir
* @param {string} sDisk
* @param {string} sDir
* @param {Array.<number>} apba
*/
Disk.prototype.getDir = function(dir, sDisk, sDir, apba)
{
var iStart = this.aFileTable.length;
var nEntriesPerSector = (dir.cbSector / DiskAPI.DIRENT.LENGTH) | 0;
dir.sDir = sDir + "\\";
if (DEBUG && this.messageEnabled()) this.printMessage('getDir("' + sDisk + '","' + dir.sDir + '")');
for (var iSector = 0; iSector < apba.length; iSector++) {
var pba = apba[iSector];
for (var iEntry = 0; iEntry < nEntriesPerSector; iEntry++) {
if (!this.getDirEntry(dir, pba, iEntry)) {
iSector = apba.length;
break;
}
if (dir.sName == null || dir.sName == "." || dir.sName == "..") continue;
var sPath = dir.sDir + dir.sName;
if (DEBUG && this.messageEnabled(Messages.DISK | Messages.DATA)) {
this.printMessage('"' + sPath + '" size=' + dir.cbSize + ' cluster=' + dir.iCluster + ' sectors=' + JSON.stringify(dir.apba));
if (dir.apba.length) this.printMessage(this.dumpSector(this.getSector(dir.apba[0]), dir.apba[0], sPath));
}
this.aFileTable.push({sPath: sPath, sName: dir.sName, bAttr: dir.bAttr, cbSize: dir.cbSize, apba: dir.apba, disk: this});
}
}
var iEnd = this.aFileTable.length;
for (var i = iStart; i < iEnd; i++) {
var file = this.aFileTable[i];
if (file.bAttr & DiskAPI.ATTR.SUBDIR && file.apba.length) this.getDir(dir, sDisk, sDir + "\\" + file.sName, file.apba);
}
};
/**
* getDirEntry(dir, pba, i)
*
* This sets the following properties on the 'dir' object:
*
* sName (null if invalid/deleted entry)
* bAttr
* cbSize
* iCluster
* apba (ie, array of physical block addresses)
*
* On return, it's the caller's responsibility to copy out any data into a new object
* if it wants to preserve any of the above information.
*
* This function also caches the following properties in the 'dir' object:
*
* pbaDirCache (of the last directory sector read, if any)
* sectorDirCache (of the last directory sector read, if any)
*
* Also, the caller must also set the following 'dir' helper properties, so that clusters
* can be located and converted to sectors (see convertClusterToSectors):
*
* lbaFAT
* lbaData
* cbSector
* iClusterMax
* nClusterSecs
* nFATBits
*
* @this {Disk}
* @param {Object} dir (to be filled in)
* @param {number} pba (a sector of the directory)
* @param {number} i (an entry in the directory sector, 0-based)
* @returns {boolean} true if entry was returned (even if invalid/deleted), false if no more entries
*/
Disk.prototype.getDirEntry = function(dir, pba, i)
{
if (!dir.sectorDirCache || !dir.pbaDirCache || dir.pbaDirCache != pba) {
dir.pbaDirCache = pba;
dir.sectorDirCache = this.getSector(dir.pbaDirCache);
if (DEBUG && this.messageEnabled(Messages.DISK | Messages.DATA)) {
this.printMessage(this.dumpSector(dir.sectorDirCache, dir.pbaDirCache, dir.sDir));
}
}
if (dir.sectorDirCache) {
var off = i * DiskAPI.DIRENT.LENGTH;
var b = this.getSectorData(dir.sectorDirCache, off, 1);
if (b == DiskAPI.DIRENT.UNUSED) {
return false;
}
if (b == DiskAPI.DIRENT.INVALID) {
dir.sName = null;
return true;
}
dir.sName = str.trim(this.getSectorString(dir.sectorDirCache, off + DiskAPI.DIRENT.NAME, 8));
var s = str.trim(this.getSectorString(dir.sectorDirCache, off + DiskAPI.DIRENT.EXT, 3));
if (s.length) dir.sName += '.' + s;
dir.bAttr = this.getSectorData(dir.sectorDirCache, off + DiskAPI.DIRENT.ATTR, 1);
dir.cbSize = this.getSectorData(dir.sectorDirCache, off + DiskAPI.DIRENT.SIZE, 2);
dir.iCluster = this.getSectorData(dir.sectorDirCache, off + DiskAPI.DIRENT.CLUSTER, 2);
dir.apba = this.convertClusterToSectors(dir);
return true;
}
return false;
};
/**
* convertClusterToSectors(dir)
*
* @this {Disk}
* @param {Object} dir
* @return {Array.<number>} of PBAs (physical block addresses)
*/
Disk.prototype.convertClusterToSectors = function(dir)
{
var apba = [];
var iCluster = dir.iCluster;
if (iCluster) {
do {
if (iCluster < DiskAPI.FAT12.CLUSNUM_MIN) {
this.assert(false);
break;
}
var lba = dir.lbaData + ((iCluster - DiskAPI.FAT12.CLUSNUM_MIN) * dir.nClusterSecs);
for (var i = 0; i < dir.nClusterSecs; i++) {
apba.push(dir.pbaVolume + lba++);
}
iCluster = this.getClusterEntry(dir, iCluster, 0) | this.getClusterEntry(dir, iCluster, 1);
} while (iCluster <= dir.iClusterMax);
this.assert(iCluster != dir.iClusterMax + 1); // make sure we never see CLUSNUM_BAD in a cluster chain
}
return apba;
};
/**
* getClusterEntry(dir, iCluster, iByte)
*
* @this {Disk}
* @param {Object} dir
* @param {number} iCluster
* @param {number} iByte (0 for low byte of cluster entry, 1 for high byte)
* @return {number}
*/
Disk.prototype.getClusterEntry = function(dir, iCluster, iByte)
{
var w = 0;
var cbitsSector = dir.cbSector * 8;
var offBits = dir.nFATBits * iCluster + (iByte? 8 : 0);
var iSector = (offBits / cbitsSector) | 0;
if (!dir.sectorFATCache || !dir.lbaFATCache || dir.lbaFATCache != dir.lbaFAT + iSector) {
dir.lbaFATCache = dir.lbaFAT + iSector;
dir.sectorFATCache = this.getSector(dir.pbaVolume + dir.lbaFATCache);
}
if (dir.sectorFATCache) {
offBits = (offBits % cbitsSector) | 0;
var off = (offBits >> 3);
w = this.getSectorData(dir.sectorFATCache, off, 1);
if (!iByte) {
if (offBits & 0x7) w >>= 4;
} else {
if (dir.nFATBits == 16) {
w <<= 8;
} else {
this.assert(dir.nFATBits == 12);
if (offBits & 0x7) {
w <<= 4;
} else {
w = (w & 0xf) << 8;
}
}
}
}
return w;
};
/**
* getSector(pba)
*
* @this {Disk}
* @param {number} pba (physical block address)
* @return {Object} sector
*/
Disk.prototype.getSector = function(pba)
{
var nSectorsPerCylinder = this.nHeads * this.nSectors;
var iCylinder = (pba / nSectorsPerCylinder) | 0;
this.assert(iCylinder < this.nCylinders);
var nSectorsRemaining = (pba % nSectorsPerCylinder);
var iHead = (nSectorsRemaining / this.nSectors) | 0;
/*
* PBA numbers are 0-based, but the sector numbers in CHS addressing are 1-based, so add one to iSector
*/
var iSector = (nSectorsRemaining % this.nSectors) + 1;
return this.seek(iCylinder, iHead, iSector);
};
/**
* updateSector(file, pba, off)
*
* Like getSector(), this must convert a PBA into CHS values; consider factoring that conversion code out.
*
* @this {Disk}
* @param {Object} file
* @param {number} pba (physical block address from the file's apba)
* @param {number} off (file offset corresponding to the given pba of the given file)
* @return {boolean} true if successfully updated, false if not
*/
Disk.prototype.updateSector = function(file, pba, off)
{
var nSectorsPerCylinder = this.nHeads * this.nSectors;
var iCylinder = (pba / nSectorsPerCylinder) | 0;
var nSectorsRemaining = (pba % nSectorsPerCylinder);
var iHead = (nSectorsRemaining / this.nSectors) | 0;
var iSector = (nSectorsRemaining % this.nSectors);
var cylinder, head, sector;
if ((cylinder = this.aDiskData[iCylinder]) && (head = cylinder[iHead]) && (sector = head[iSector])) {
this.assert(sector['sector'] == iSector +1);
if (sector.file) {
if (DEBUG && this.messageEnabled()) {
this.printMessage('"' + sector.file.sPath + '" cross-linked at offset ' + sector.file.offFile + ' with "' + file.sPath + '" at offset ' + off);
}
return false;
}
sector.file = file;
sector.offFile = off;
return true;
}
if (DEBUG && this.messageEnabled()) this.printMessage("unable to map PBA " + pba + " to CHS");
return false;
};
/**
* getSectorData(sector, off, len)
*
* NOTE: Yes, this function is not the most efficient way to read a byte/word/dword value from within a sector,
* but given the different states a sector may be in, it's certainly the simplest and safest, and since this is
* only used by buildFileTable() and its progeny, it's not clear that we need to be superfast anyway.
*
* @this {Disk}
* @param {Object} sector
* @param {number} off (byte offset)
* @param {number} len (1 to 4 bytes)
* @return {number}
*/
Disk.prototype.getSectorData = function(sector, off, len)
{
var dw = 0;
var nShift = 0;
this.assert(len > 0 && len <= 4);
while (len--) {
this.assert(off < sector['length']);
var b = this.read(sector, off++);
this.assert(b >= 0);
if (b < 0) break;
dw |= (b << nShift);
nShift += 8;
}
return dw;
};
/**
* getSectorString(sector, off, len)
*
* @this {Disk}
* @param {Object} sector
* @param {number} off (byte offset)
* @param {number} len (use -1 to read a null-terminated string)
* @return {string}
*/
Disk.prototype.getSectorString = function(sector, off, len)
{
var s = "";
while (len--) {
var b = this.read(sector, off++);
if (b <= 0) break;
s += String.fromCharCode(b);
}
return s;
};
/**
* initSector(sector, iCylinder, iHead, iSector, cbSector, dwPattern)
*
* Ensures every sector has ALL the properties of a proper Sector object; ie:
*
* 'sector': sector number
* 'length': size of the sector, in bytes
* 'data': array of dwords
* 'pattern': dword pattern to use for empty or partial sectors (null for unread remote sectors)
*
* In addition, we will maintain the following information on a per-sector basis,
* as sectors are modified:
*
* iModify: index of first modified dword in sector
* cModify: number of modified dwords in sector
* fDirty: true if sector is dirty, false if clean (or cleaning in progress)
*
* @param {Object} sector
* @param {number} iCylinder
* @param {number} iHead
* @param {number} [iSector]
* @param {number} [cbSector]
* @param {number|null} [dwPattern]
* @return {Object}
*/
Disk.prototype.initSector = function(sector, iCylinder, iHead, iSector, cbSector, dwPattern)
{
if (!sector) {
sector = {'sector': iSector, 'length': cbSector, 'data': [], 'pattern': dwPattern};
}
sector.iCylinder = iCylinder;
sector.iHead = iHead;
sector.iModify = sector.cModify = 0;
sector.fDirty = false;
return sector;
};
/**
* connectRemoteDisk(sDiskPath)
*
* Unlike disconnect(), we don't issue the connect request ourselves; instead, we piggyback on the existing
* preload code in load() to establish the connection. That, in turn, will trigger a call to mount(), which
* will check fOnDemand and set fRemote if the connection was successful.
*
* @this {Disk}
* @param {string} sDiskPath
* @return {string} is the URL connection string required to connect to sDiskPath
*/
Disk.prototype.connectRemoteDisk = function(sDiskPath)
{
var sParms = DiskAPI.QUERY.ACTION + '=' + DiskAPI.ACTION.OPEN;
sParms += '&' + DiskAPI.QUERY.VOLUME + '=' + sDiskPath;
sParms += '&' + DiskAPI.QUERY.MODE + '=' + this.mode;
sParms += '&' + DiskAPI.QUERY.CHS + '=' + this.nCylinders + ':' + this.nHeads + ':' + this.nSectors + ':' + this.cbSector;
sParms += '&' + DiskAPI.QUERY.MACHINE + '=' + this.controller.getMachineID();
sParms += '&' + DiskAPI.QUERY.USER + '=' + this.controller.getUserID();
return web.getHost() + DiskAPI.ENDPOINT + '?' + sParms;
};
/**
* readRemoteSectors(iCylinder, iHead, iSector, nSectors, fAsync, done)
*
* @param {number} iCylinder
* @param {number} iHead
* @param {number} iSector
* @param {number} nSectors (to read)
* @param {boolean} fAsync
* @param {function(number,boolean)} [done]
*/
Disk.prototype.readRemoteSectors = function(iCylinder, iHead, iSector, nSectors, fAsync, done)
{
if (DEBUG && this.messageEnabled()) {
this.printMessage("readRemoteSectors(CHS=" + iCylinder + ':' + iHead + ':' + iSector + ",N=" + nSectors + ")");
}
if (this.fRemote) {
var sParms = DiskAPI.QUERY.ACTION + '=' + DiskAPI.ACTION.READ;
sParms += '&' + DiskAPI.QUERY.VOLUME + '=' + this.sDiskPath;
sParms += '&' + DiskAPI.QUERY.CHS + '=' + this.nCylinders + ':' + this.nHeads + ':' + this.nSectors + ':' + this.cbSector;
sParms += '&' + DiskAPI.QUERY.ADDR + '=' + iCylinder + ':' + iHead + ':' + iSector + ':' + nSectors;
sParms += '&' + DiskAPI.QUERY.MACHINE + '=' + this.controller.getMachineID();
sParms += '&' + DiskAPI.QUERY.USER + '=' + this.controller.getUserID();
var sDiskURL = web.getHost() + DiskAPI.ENDPOINT + '?' + sParms;
web.loadResource(sDiskURL, fAsync, null, this, this.doneReadRemoteSectors, [iCylinder, iHead, iSector, nSectors, fAsync, done]);
return;
}
if (done) done(-1, false);
};
/**
* doneReadRemoteSectors(sURLName, sURLData, nErrorCode, sectorInfo)
*
* @param {string} sURLName
* @param {string} sURLData
* @param {number} nErrorCode
* @param {Array} sectorInfo
*/
Disk.prototype.doneReadRemoteSectors = function(sURLName, sURLData, nErrorCode, sectorInfo)
{
var fAsync = false;
var iCylinder = sectorInfo[0];
var iHead = sectorInfo[1];
var iSector = sectorInfo[2];
var nSectors = sectorInfo[3];
if (!nErrorCode) {
var abData = JSON.parse(sURLData);
var offData = 0;
while (nSectors--) {
/*
* We call seek with fWrite == true to prevent seek() from triggering another call
* to readRemoteSectors() and endlessly recursing. That also forces seek() to:
*
* 1) zero the sector's 'pattern'
* 2) disable warning about reading an uninitialized sector
*
* We KNOW this is an uninitialized sector, because we're about to initialize it.
*/
var sector = this.seek(iCylinder, iHead, iSector, true);
if (!sector) {
if (DEBUG && this.messageEnabled()) {
this.printMessage("doneReadRemoteSectors(): seek(CHS=" + iCylinder + ':' + iHead + ':' + iSector + ") failed");
}
break;
}
this.fill(sector, abData, offData);
offData += sector['length'];
/*
* We happen to know that when seek() calls readRemoteSectors(), it limits the number of sectors
* to the current track, so the only variable we need to advance is iSector.
*/
iSector++;
}
fAsync = sectorInfo[4];
} else {
if (DEBUG && this.messageEnabled()) {
this.printMessage("doneReadRemoteSectors(CHS=" + iCylinder + ':' + iHead + ':' + iSector + ",N=" + nSectors + ") returned error " + nErrorCode);
}
}
var done = sectorInfo[5];
if (done) done(nErrorCode, fAsync);
};
/**
* writeRemoteSectors(iCylinder, iHead, iSector, nSectors, abSectors, fAsync)
*
* Writes to a remote disk are performed on a timer-driven basis. When a sector is modified for the first time,
* a reference to that sector is "pushed" onto (ie, appended to the end of) aDirtySectors, and if aDirtySectors was
* originally empty, then a REMOTE_WRITE_DELAY timer is set.
*
* When the timer fires, the first batch of contiguous sectors is sent off the server, and when the server responds
* (ie, when cleanDirtySectors() is called), if the response indicates success, every sector that was sent is marked
* clean -- unless one or more writes to the sector occurred in the meantime, which we track through a per-sector
* fDirty flag.
*
* @param {number} iCylinder
* @param {number} iHead
* @param {number} iSector
* @param {number} nSectors (to write)
* @param {Array.<number>} abSectors
* @param {boolean} fAsync
* @return {boolean|Array}
*/
Disk.prototype.writeRemoteSectors = function(iCylinder, iHead, iSector, nSectors, abSectors, fAsync)
{
if (DEBUG && this.messageEnabled()) {
this.printMessage("writeRemoteSectors(CHS=" + iCylinder + ':' + iHead + ':' + iSector + ",N=" + nSectors + ")");
}
if (this.fRemote) {
var data = {};
this.fWriteInProgress = true;
data[DiskAPI.QUERY.ACTION] = DiskAPI.ACTION.WRITE;
data[DiskAPI.QUERY.VOLUME] = this.sDiskPath;
data[DiskAPI.QUERY.CHS] = this.nCylinders + ':' + this.nHeads + ':' + this.nSectors + ':' + this.cbSector;
data[DiskAPI.QUERY.ADDR] = iCylinder + ':' + iHead + ':' + iSector + ':' + nSectors;
data[DiskAPI.QUERY.MACHINE] = this.controller.getMachineID();
data[DiskAPI.QUERY.USER] = this.controller.getUserID();
data[DiskAPI.QUERY.DATA] = JSON.stringify(abSectors);
var sDiskURL = web.getHost() + DiskAPI.ENDPOINT;
return web.loadResource(sDiskURL, fAsync, data, this, this.doneWriteRemoteSectors, [iCylinder, iHead, iSector, nSectors, fAsync]);
}
return false;
};
/**
* doneWriteRemoteSectors(sURLName, sURLData, nErrorCode, sectorInfo)
*
* @param {string} sURLName
* @param {string} sURLData
* @param {number} nErrorCode
* @param {Array} sectorInfo
*/
Disk.prototype.doneWriteRemoteSectors = function(sURLName, sURLData, nErrorCode, sectorInfo)
{
var iCylinder = sectorInfo[0];
var iHead = sectorInfo[1];
var iSector = sectorInfo[2];
var nSectors = sectorInfo[3];
var fAsync = sectorInfo[4];
this.fWriteInProgress = false;
if (iCylinder >= 0 && iCylinder < this.aDiskData.length && iHead >= 0 && iHead < this.aDiskData[iCylinder].length) {
for (var i = iSector - 1; nSectors-- > 0 && i >= 0 && i < this.aDiskData[iCylinder][iHead].length; i++) {
var sector = this.aDiskData[iCylinder][iHead][i];
if (!nErrorCode) {
if (!sector.fDirty) {
sector.iModify = sector.cModify = 0;
}
} else {
if (DEBUG && this.messageEnabled()) {
this.printMessage("doneWriteRemoteSectors(CHS=" + iCylinder + ':' + iHead + ':' + sector['sector'] + ") returned error " + nErrorCode);
}
this.queueDirtySector(sector, false);
}
}
}
if (fAsync) this.updateWriteTimer();
};
/**
* disconnectRemoteDisk()
*
* This is called by our powerDown() notification handler. If fRemote is true, we issue the disconnect
* request and then immediately set fRemote to false; we don't wait for (or test) the response.
*
* @this {Disk}
*/
Disk.prototype.disconnectRemoteDisk = function()
{
if (this.fRemote) {
var sParms = DiskAPI.QUERY.ACTION + '=' + DiskAPI.ACTION.CLOSE;
sParms += '&' + DiskAPI.QUERY.VOLUME + '=' + this.sDiskPath;
sParms += '&' + DiskAPI.QUERY.MACHINE + '=' + this.controller.getMachineID();
sParms += '&' + DiskAPI.QUERY.USER + '=' + this.controller.getUserID();
var sDiskURL = web.getHost() + DiskAPI.ENDPOINT + '?' + sParms;
web.loadResource(sDiskURL, true);
this.fRemote = false;
}
};
/**
* queueDirtySector(sector, fAsync)
*
* Mark the specified sector as dirty, add it to the queue (aDirtySectors) if not already added,
* and establish a timeout handler (findDirtySectors) if not already established.
*
* A freshly dirtied sector should sit in the queue for a short period of time (eg, 2 seconds)
* before we attempt to write it; that is, a REMOTE_WRITE_DELAY timer should start ticking again
* for any sector that is rewritten. However, there will be exceptions; for example, when a sector
* is finally written, we want to take advantage of the write request to write any additional dirty
* sectors that follow it, even if those additional sectors were written less than 2 seconds ago.
*
* @param {Object} sector
* @param {boolean} fAsync (true to update write timer, false to not)
* @return {boolean} true if write timer set, false if not
*/
Disk.prototype.queueDirtySector = function(sector, fAsync)
{
sector.fDirty = true;
var j = this.aDirtySectors.indexOf(sector);
if (j >= 0) {
this.aDirtySectors.splice(j, 1);
this.aDirtyTimestamps.splice(j, 1);
}
this.aDirtySectors.push(sector);
this.aDirtyTimestamps.push(usr.getTime());
if (DEBUG && this.messageEnabled()) {
this.printMessage("queueDirtySector(CHS=" + sector.iCylinder + ':' + sector.iHead + ':' + sector['sector'] + "): " + this.aDirtySectors.length + " dirty");
}
return fAsync && this.updateWriteTimer();
};
/**
* updateWriteTimer()
*
* If a timer is already active, make sure it's still valid (ie, the time the timer is scheduled to fire is
* >= the timestamp of the next dirty sector + REMOTE_WRITE_DELAY); if not, cancel the timer and start a new one.
*
* @return {boolean} true if write timer set, false if not
*/
Disk.prototype.updateWriteTimer = function()
{
if (this.aDirtySectors.length) {
var msWrite = this.aDirtyTimestamps[0] + Disk.REMOTE_WRITE_DELAY;
if (this.timerWrite) {
if (this.msTimerWrite < msWrite) {
clearTimeout(this.timerWrite);
this.timerWrite = null;
}
}
if (!this.timerWrite) {
var obj = this;
var msNow = usr.getTime();
var msDelay = msWrite - msNow;
if (msDelay < 0) msDelay = 0;
if (msDelay > Disk.REMOTE_WRITE_DELAY) msDelay = Disk.REMOTE_WRITE_DELAY;
this.timerWrite = setTimeout(function() {
obj.findDirtySectors(true);
}, msDelay);
this.msTimerWrite = msNow + msDelay;
}
} else {
if (this.timerWrite) {
clearTimeout(this.timerWrite);
this.timerWrite = null;
}
}
return this.timerWrite !== null;
};
/**
* findDirtySectors(fAsync)
*
* @param {boolean} fAsync is true if this function is being called asynchronously, false otherwise
* @return {boolean|Array} false if no dirty sectors, otherwise true (or a response array if not fAsync)
*
* Starting with the oldest dirty sector in the queue (aDirtySectors), determine the longest contiguous stretch of
* dirty sectors (currently limited to the same track), mark them all as not dirty, and then call writeRemoteSectors().
*/
Disk.prototype.findDirtySectors = function(fAsync)
{
if (fAsync) {
this.timerWrite = null;
}
var sector = this.aDirtySectors[0];
if (sector) {
var iCylinder = sector.iCylinder;
var iHead = sector.iHead;
var iSector = sector['sector'];
var nSectors = 0;
var abSectors = [];
for (var i = iSector - 1; i < this.aDiskData[iCylinder][iHead].length; i++) {
var sectorNext = this.aDiskData[iCylinder][iHead][i];
if (!sectorNext.fDirty) break;
var j = this.aDirtySectors.indexOf(sectorNext);
this.assert(j >= 0, "findDirtySectors(CHS=" + iCylinder + ':' + iHead + ':' + sectorNext['sector'] + ") missing from aDirtySectors");
if (DEBUG && this.messageEnabled()) {
this.printMessage("findDirtySectors(CHS=" + iCylinder + ':' + iHead + ':' + sectorNext['sector'] + ")");
}
this.aDirtySectors.splice(j, 1);
this.aDirtyTimestamps.splice(j, 1);
abSectors = abSectors.concat(this.toBytes(sectorNext));
sectorNext.fDirty = false;
nSectors++;
}
this.assert(!!abSectors.length, "no data for dirty sector (CHS=" + iCylinder + ':' + iHead + ':' + sector['sector'] + ")");
var response = this.writeRemoteSectors(iCylinder, iHead, iSector, nSectors, abSectors, fAsync);
return fAsync || response;
}
return false;
};
/**
* info()
*
* @this {Disk}
* @return {Array} containing: [nCylinders, nHeads, nSectorsPerTrack, nBytesPerSector]
*/
Disk.prototype.info = function()
{
if (!this.aDiskData.length) {
return [0, 0, 0, 0];
}
return [this.aDiskData.length, this.aDiskData[0].length, this.aDiskData[0][0].length, this.aDiskData[0][0][0]['length']];
};
/**
* seek(iCylinder, iHead, iSector, fWrite, done)
*
* TODO: There's some dodgy code in seek() that allows floppy images to be dynamically
* reconfigured with more heads and/or sectors/track, and it does so by peeking at more drive
* properties. That code used to be in the FDC component, where it was perfectly reasonable
* to access those properties. We need a cleaner interface back to the drive, similar to the
* info() interface we provide to the controller.
*
* Whether or not the "dynamic reconfiguration" feature itself is perfectly reasonable is,
* of course, a separate question.
*
* @this {Disk}
* @param {number} iCylinder
* @param {number} iHead
* @param {number} iSector
* @param {boolean} [fWrite]
* @param {function(Object,boolean)} [done]
* @return {Object|null} is the requested sector, or null if not found (or not available yet)
*/
Disk.prototype.seek = function(iCylinder, iHead, iSector, fWrite, done)
{
var sector = null;
var drive = this.drive;
var cylinder = this.aDiskData[iCylinder];
if (cylinder) {
var i;
var track = cylinder[iHead];
/*
* The following code allows a single-sided diskette image to be reformatted (ie, "expanded")
* as a double-sided image, provided the drive has more than one head (see drive.nHeads).
*/
if (!track && drive.bFormatting && iHead < drive.nHeads) {
track = cylinder[iHead] = new Array(drive.bSectorEnd);
for (i = 0; i < track.length; i++) {
track[i] = this.initSector(null, iCylinder, iHead, i + 1, drive.nBytes, 0);
}
}
if (track) {
for (i = 0; i < track.length; i++) {
if (track[i] && track[i]['sector'] == iSector) {
/*
* If the sector's pattern is null, then this sector's true contents have not yet
* been fetched from the server.
*/
sector = track[i];
if (sector['pattern'] === null) {
if (fWrite) {
/*
* Optimization: if the caller has explicitly told us that they're about to WRITE to the
* sector, then we shouldn't need to read it from the server; assume a zero pattern and return.
*/
sector['pattern'] = 0;
} else {
var nSectors = 1;
/*
* We know we need to read at least 1 sector, but let's count the number of trailing sectors
* on the same track that may also be required.
*/
while (++i < track.length) {
if (track[i]['pattern'] === null) nSectors++;
}
this.readRemoteSectors(iCylinder, iHead, iSector, nSectors, done != null, function onReadRemoteComplete(err, fAsync) {
if (err) sector = null;
if (done) { //noinspection JSReferencingMutableVariableFromClosure
done(sector, fAsync);
}
});
return done? null : sector;
}
}
break;
}
}
/*
* The following code allows an 8-sector track to be reformatted (ie, "expanded") as a 9-sector track.
*/
if (!sector && drive.bFormatting && drive.bSector == 9) {
sector = track[i] = this.initSector(null, iCylinder, iHead, drive.bSector, drive.nBytes, 0);
}
}
}
if (done) done(sector, false);
return sector;
};
/**
* fill(sector, ab, off)
*
* @param {Object} sector
* @param {*} ab (technically, this should be typed as Array.<number> but I'm having trouble coercing JSON.parse() to that)
* @param {number} off
*/
Disk.prototype.fill = function(sector, ab, off)
{
var cdw = sector['length'] >> 2;
var adw = new Array(cdw);
for (var idw = 0; idw < cdw; idw++) {
adw[idw] = ab[off] | (ab[off + 1] << 8) | (ab[off + 2] << 16) | (ab[off + 3] << 24);
off += 4;
}
sector['data'] = adw;
/*
* TODO: Consider taking this opportunity to shrink 'data' down by the number of dwords at the end of the buffer that
* contain the same pattern, and setting 'pattern' accordingly.
*/
};
/**
* toBytes(sector)
*
* @param {Object} sector
* @return {Array.<number>} is an array of bytes
*/
Disk.prototype.toBytes = function(sector)
{
var cb = sector['length'];
var ab = new Array(cb);
var ib = 0;
var cdw = cb >> 2;
var adw = sector['data'];
var dwPattern = sector['pattern'];
for (var idw = 0; idw < cdw; idw++) {
var dw = (idw < adw.length? adw[idw] : dwPattern);
ab[ib++] = dw & 0xff;
ab[ib++] = (dw >> 8) & 0xff;
ab[ib++] = (dw >> 16) & 0xff;
ab[ib++] = (dw >> 24) & 0xff;
}
return ab;
};
/**
* read(sector, ibSector, fCompare)
*
* @this {Disk}
* @param {Object} sector (returned from a previous seek)
* @param {number} ibSector a byte index within the given sector
* @param {boolean} [fCompare] is true if this write-compare read
* @return {number} the specified (unsigned) byte, or -1 if no more data in the sector
*/
Disk.prototype.read = function(sector, ibSector, fCompare)
{
var b = -1;
if (sector) {
if (DEBUG && !ibSector && !fCompare && this.messageEnabled()) {
this.printMessage('read("' + this.sDiskFile + '",CHS=' + sector.iCylinder + ':' + sector.iHead + ':' + sector['sector'] + ')');
}
if (ibSector < sector['length']) {
var adw = sector['data'];
var idw = ibSector >> 2;
var dw = (idw < adw.length ? adw[idw] : sector['pattern']);
b = ((dw >> ((ibSector & 0x3) << 3)) & 0xff);
}
}
return b;
};
/**
* write(sector, ibSector, b)
*
* @this {Disk}
* @param {Object} sector (returned from a previous seek)
* @param {number} ibSector a byte index within the given sector
* @param {number} b the byte value to write
* @return {boolean|null} true if write successful, false if write-protected, null if out of bounds
*/
Disk.prototype.write = function(sector, ibSector, b)
{
if (this.fWriteProtected)
return false;
if (DEBUG && !ibSector && this.messageEnabled()) {
this.printMessage('write("' + this.sDiskFile + '",CHS=' + sector.iCylinder + ':' + sector.iHead + ':' + sector['sector'] + ')');
}
if (ibSector < sector['length']) {
if (b != this.read(sector, ibSector, true)) {
var adw = sector['data'];
var dwPattern = sector['pattern'];
var idw = ibSector >> 2;
var nShift = (ibSector & 0x3) << 3;
/*
* Ensure every byte up to the specified byte is properly initialized.
*/
for (var i = adw.length; i <= idw; i++) adw[i] = dwPattern;
if (!sector.cModify) {
sector.iModify = idw;
sector.cModify = 1;
} else if (idw < sector.iModify) {
sector.cModify += sector.iModify - idw;
sector.iModify = idw;
} else if (idw >= sector.iModify + sector.cModify) {
sector.cModify += idw - (sector.iModify + sector.cModify) + 1;
}
adw[idw] = (adw[idw] & ~(0xff << nShift)) | (b << nShift);
if (this.fRemote) this.queueDirtySector(sector, true);
}
return true;
}
return null;
};
/**
* save()
*
* The first array entry contains some disk information:
*
* [sDiskPath, dwChecksum, nCylinders, nHeads, nSectors, cbSector]
*
* Each subsequent entry in the returned array contains the following:
*
* [iCylinder, iHead, iSector, iModify, [...]]
*
* where [...] is an array of modified dword(s) in the corresponding sector.
*
* @this {Disk}
* @return {Array} of modified sectors
*/
Disk.prototype.save = function()
{
var i = 0;
var deltas = [];
deltas[i++] = [this.sDiskPath, this.dwChecksum, this.nCylinders, this.nHeads, this.nSectors, this.cbSector];
if (!this.fRemote && !this.fWriteProtected) {
var aDiskData = this.aDiskData;
for (var iCylinder = 0; iCylinder < aDiskData.length; iCylinder++) {
for (var iHead = 0; iHead < aDiskData[iCylinder].length; iHead++) {
for (var iSector = 0; iSector < aDiskData[iCylinder][iHead].length; iSector++) {
var sector = aDiskData[iCylinder][iHead][iSector];
if (sector && sector.cModify) {
var mods = [], n = 0;
var iModify = sector.iModify, iModifyLimit = sector.iModify + sector.cModify;
while (iModify < iModifyLimit) {
mods[n++] = sector['data'][iModify++];
}
deltas[i++] = [iCylinder, iHead, iSector, sector.iModify, mods];
}
}
}
}
}
if (DEBUG && this.messageEnabled()) {
this.printMessage('save("' + this.sDiskName + '"): saved ' + (deltas.length - 1) + ' change(s)');
}
return deltas;
};
/**
* restore(deltas)
*
* The first array entry contains some disk information:
*
* [sDiskPath, dwChecksum, nCylinders, nHeads, nSectors, cbSector]
*
* Each subsequent entry in the supplied array contains the following:
*
* [iCylinder, iHead, iSector, iModify, [...]]
*
* where [...] is an array of modified dword(s) in the corresponding sector.
*
* @this {Disk}
* @param {Array} deltas
* @return {number} 0 if no changes applied, -1 if an error occurred, otherwise the number of sectors modified
*/
Disk.prototype.restore = function(deltas)
{
/*
* If deltas is undefined, that's not necessarily an error; the controller may simply be (re)initializing
* itself (although neither controller should be calling restore() under those conditions anymore).
*/
var nChanges = 0;
var sReason = "unsupported restore format";
/*
* I originally added a check for aDiskData here on the assumption that if there was an error loading
* a disk image, we will have already notified the user, so any additional errors about differing checksums,
* failure to restore the disk state, etc, would just be annoying. HOWEVER, HDC will create an empty disk
* image if its initialization code discovers that no disk was loaded earlier (see verifyDrive). So while
* checking aDiskData is still a good idea, be aware that it won't necessarily avoid redundant error messages
* (at least in the case of HDC).
*/
if (deltas && deltas.length > 0) {
var i = 0;
var aDiskInfo = deltas[i++];
if (aDiskInfo && aDiskInfo.length >= 2) {
/*
* Before getting to the checksum, we have to deal with a new situation: restoring an uninitialized
* disk image from a complete set of deltas. And that is only possible if the disk was saved with the
* original disk geometry.
*/
if (!this.aDiskData.length && aDiskInfo.length >= 6) {
this.create(DiskAPI.MODE.LOCAL, aDiskInfo[2], aDiskInfo[3], aDiskInfo[4], aDiskInfo[5]);
/*
* TODO: Consider setting a flag here that we can check at the end of the restore() function
* that indicates we should recalculate dwChecksum, because we currently have an inconsistency
* between local disks that are mounted via build() and the same disks that are "remounted"
* later by this code; the former has the correct checksum, while the latter has a null checksum.
*
* As you can see below, we currently deal with this by simply ignoring null checksums....
*/
}
/*
* v1.01 failed to indicate an error if either one of these failure conditions occurred. Although maybe that's
* just as well, since v1.01 also failed to properly deal with situations where the user mounted different diskette(s)
* prior to exiting (hopefully fixed in v1.02).
*/
else if (aDiskInfo[1] != null && this.dwChecksum != null && aDiskInfo[1] != this.dwChecksum) {
sReason = "original checksum (" + aDiskInfo[1] + ") differs from current checksum (" + this.dwChecksum + ")";
nChanges = -2;
}
/*
* Checksum is more important than disk path, and for now, I want the flexibility to move disk images.
*
else if (aDiskInfo[0] != this.sDiskPath) {
sReason = "original path '" + aDiskInfo[0] + "' differs from current path '" + this.sDiskPath + "'";
nChanges = -1;
}
*/
}
if (!this.aDiskData.length) nChanges = -1;
while (i < deltas.length && nChanges >= 0) {
var m = 0;
var mod = deltas[i++];
var iCylinder = mod[m++];
var iHead = mod[m++];
var iSector = mod[m++];
/*
* Note the buried test for write-protection. Yes, an invariant condition should be tested
* outside the loop, not inside, but (a) it's a trivial test, (b) the test should never fail
* because save() should never generate any mods for a write-protected disk, and (c) it
* centralizes all the failure conditions we're currently checking (which, admittedly, ain't much).
*/
if (iCylinder >= this.aDiskData.length || iHead >= this.aDiskData[iCylinder].length || iSector >= this.aDiskData[iCylinder][iHead].length) {
sReason = "sector (CHS=" + iCylinder + ':' + iHead + ':' + iSector + ") out of range (" + nChanges + " changes applied)";
nChanges = -1;
break;
}
if (this.fWriteProtected) {
sReason = "unable to modify write-protected disk";
nChanges = -1;
break;
}
var iModify = mod[m++];
var mods = mod[m++];
var iModifyLimit = iModify + mods.length;
var sector = this.aDiskData[iCylinder][iHead][iSector];
if (!sector) continue;
/*
* Since write() now deals with empty/partial sectors, we no longer need to completely "inflate" the sector prior
* to applying modifications. So let's just make sure that the sector is "inflated" up to iModify.
*/
var idw = sector['data'].length;
while (idw < iModify) {
sector['data'][idw++] = sector['pattern'];
}
var n = 0;
sector.iModify = iModify;
sector.cModify = mods.length;
while (iModify < iModifyLimit) {
sector['data'][iModify++] = mods[n++];
}
nChanges++;
}
}
if (nChanges < 0) {
/*
* We're suppressing checksum messages for the general public for now....
*/
if (DEBUG || nChanges != -2) {
this.controller.notice("Unable to restore disk '" + this.sDiskName + ": " + sReason);
}
} else {
if (DEBUG && this.messageEnabled()) {
this.printMessage('restore("' + this.sDiskName + '"): restored ' + nChanges + ' change(s)');
}
}
return nChanges;
};
/**
* toJSON()
*
* We perform some RegExp massaging on the JSON data to eliminate unnecessary properties
* (eg, 'length' values of 512, 'pattern' values of 0, quotes around the property names, etc).
* Sectors that were initially compressed should remain compressed unless/until they were modified.
*
* TODO: Check sectors (or at least modified sectors) to see if they can be recompressed.
*
* @this {Disk}
* @return {string} containing the entire disk image as JSON-encoded data
*/
Disk.prototype.toJSON = function()
{
var s = JSON.stringify(this.aDiskData);
s = s.replace(/,"length":512/gm, "").replace(/,"pattern":0/gm, "");
/*
* I don't really want to strip quotes from disk image property names, since I would have to put them
* back again during mount() -- or whenever JSON.parse() is used instead of eval(). But I still remove
* them temporarily, so that any remaining property names (eg, "iModify", "cModify", "fDirty") can
* easily be stripped out, by virtue of their being the only quoted properties left. We then "requote"
* all the property names that remain.
*/
s = s.replace(/"(sector|length|data|pattern)":/gm, "$1:");
/*
* The next line will remove any other numeric or boolean properties that were added at runtime, although
* they may have completely different ("minified") names if the code has been compiled.
*/
s = s.replace(/,"[^"]*":([0-9]+|true|false)/gm, "");
s = s.replace(/(sector|length|data|pattern):/gm, "\"$1\":");
return s;
};
/**
* dumpSector(sector, pba, sDesc)
*
* @param {Object} sector (returned from a previous seek)
* @param {number} [pba]
* @param {string} [sDesc]
* @return {string}
*/
Disk.prototype.dumpSector = function(sector, pba, sDesc)
{
var sDump = "";
if (DEBUG && sector) {
if (pba != null) sDump += "sector " + pba + (sDesc? (" for " + sDesc) : "") + ':';
var sBytes = "", sChars = "";
var cbSector = sector['length'];
var cdwData = sector['data'].length;
var dw = 0;
for (var i = 0; i < cbSector; i++) {
if ((i % 16) === 0) {
if (sDump) sDump += sBytes + ' ' + sChars + '\n';
sDump += str.toHex(i, 4) + ": ";
sBytes = sChars = "";
}
if ((i % 4) === 0) {
var idw = i >> 2;
dw = (idw < cdwData? sector['data'][idw] : sector['pattern']);
}
var b = dw & 0xff;
dw >>>= 8;
sBytes += str.toHex(b, 2) + (i % 16 == 7? "-" : " ");
sChars += (b >= 32 && b < 128? String.fromCharCode(b) : ".");
}
if (sBytes) sDump += sBytes + ' ' + sChars;
}
return sDump;
};
if (typeof module !== 'undefined') module.exports = Disk;
/**
* @fileoverview Implements the PCjs Floppy Drive Controller (FDC) component.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-Aug-09
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
if (typeof module !== 'undefined') {
var str = require("../../shared/lib/strlib");
var web = require("../../shared/lib/weblib");
var DiskAPI = require("../../shared/lib/diskapi");
var Component = require("../../shared/lib/component");
var Messages = require("./messages");
var ChipSet = require("./chipset");
var Disk = require("./disk");
var Computer = require("./computer");
var State = require("./state");
}
/*
* FDC Terms (see FDC.TERMS)
*
* C Cylinder Number the current or selected cylinder number
*
* D Data the data pattern to be written to a sector
*
* DS Drive Select the selected driver number encoded the same as bits 0 and 1 of the Digital Output
* Register (DOR); eg, DS0, DS1, DS2, or DS3
*
* DTL Data Length when N is 00, DTL is the data length to be read from or written to a sector
*
* EOT End Of Track the final sector number on a cylinder
*
* GPL Gap Length the length of gap 3 (spacing between sectors excluding the VCO synchronous field)
*
* H Head Address the head number, either 0 or 1, as specified in the ID field
*
* HD Head the selected head number, 0 or 1 (H = HD in all command words)
*
* HLT Head Load Time the head load time in the selected drive (2 to 256 milliseconds in 2-millisecond
* increments for the 1.2M-byte drive and 4 to 512 milliseconds in 4 millisecond increments
* for the 320K-byte drive)
*
* HUT Head Unload Time the head unload time after a read or write operation (0 to 240 milliseconds in
* 16-millisecond increments for the 1.2M-byte drive and 0 to 480 milliseconds in
* 32-millisecond increments for the 320K-byte drive)
*
* MF FM or MFM Mode 0 selects FM mode and 1 selects MFM (MFM is selected only if it is implemented)
*
* MT Multitrack 1 selects multitrack operation (both HD0 and HD1 will be read or written)
*
* N Number the number of data bytes written in a sector
*
* NCN New Cylinder Number the new cylinder number for a SEEK operation
*
* ND Non-Data Mode indicates an operation in the non-data mode
*
* PCN Present Cylinder Number the cylinder number at the completion of a SENSE INTERRUPT STATUS command
* (present position of the head)
*
* R Record the sector number to be read or written
*
* SC Sectors Per Cylinder the number of sectors per cylinder
*
* SK Skip this stands for skip deleted-data address mark
*
* SRT Stepping Rate this 4 bit byte indicates the stepping rate for the diskette drive as follows:
* 1.2M-Byte Diskette Drive: 1111=1ms, 1110=2ms, 1101=3ms
* 320K-Byte Diskette Drive: 1111=2ms, 1110=4ms, 1101=6ms
*
* STP STP Scan Test if STP is 1, the data in contiguous sectors is compared with the data sent
* by the processor during a scan operation; if STP is 2, then alternate sections
* are read and compared
*/
/**
* FDC(parmsFDC)
*
* The FDC component simulates a NEC µPD765A or Intel 8272A compatible floppy disk controller, and has one
* component-specific property:
*
* autoMount: one or more JSON-encoded objects, each containing 'name' and 'path' properties
*
* Regarding early diskette drives: the IBM PC Model 5150 originally shipped with single-sided drives,
* and therefore supported only 160Kb diskettes. That's the only diskette format PC-DOS 1.00 supported, too.
*
* At some point, 5150's started shipping with double-sided drives, but I'm not sure whether the ROMs changed;
* they probably did NOT change, because the original ROM BIOS already supported drives with multiple heads.
* However, what the ROM BIOS did NOT do was provide any indication of drive type, which as far as I can tell,
* meant you had to simply read/write/format tracks with the second head and check for errors.
*
* Presumably at the same time double-sided drives started shipping, PC-DOS 1.10 shipped, which added
* support for 320Kb diskettes. And the FORMAT command changed as well, defaulting to a double-sided format
* operation UNLESS you specified "FORMAT /1". If I run PC-DOS 1.10 and try to simulate a single-sided drive
* (by setting drive.nHeads = 1 in initDrive), FORMAT will balk with "Track 0 bad - disk unusable". I have to
* wonder if everyone with single-sided drives who upgraded to PC-DOS 1.10 also got that error, forcing them
* to always specify "FORMAT /1", or if I'm doing something wrong wrt single-sided drive simulation.
*
* I've noticed that if I turn FDC messages on ("m fdc on"), and then run "FORMAT B:/1", the command still
* tries to format head 1/track 0, followed by head 0/track 0, and then the FDC is reset, and the format operation
* proceeds with only head 0 for all tracks 0 through 39. FORMAT successfully creates a 160Kb single-sided diskette,
* but why it also tries to initially format track 0 using the second head remains a bit of a mystery.
*
* @constructor
* @extends Component
* @param {Object} parmsFDC
*/
function FDC(parmsFDC) {
/*
* TODO: Indicate the type of diskette image being loaded (this might help folks understand what's going
* on when they try to load a diskette image that's larger than what the selected operating system supports).
*/
Component.call(this, "FDC", parmsFDC, FDC, Messages.FDC);
this['dmaRead'] = this.dmaRead;
this['dmaWrite'] = this.dmaWrite;
this['dmaFormat'] = this.dmaFormat;
this.configMount = null;
if (parmsFDC['autoMount']) {
this.configMount = parmsFDC['autoMount'];
if (typeof this.configMount == "string") {
try {
/*
* The most likely source of any exception will be right here, where we're parsing
* the JSON-encoded diskette data.
*/
this.configMount = eval("(" + parmsFDC['autoMount'] + ")");
} catch (e) {
Component.error("FDC auto-mount error: " + e.message + " (" + parmsFDC['autoMount'] + ")");
this.configMount = null;
}
}
}
/*
* The following array keeps track of every disk image we've ever mounted. Each entry in the
* array is another array whose elements are:
*
* [0]: name of disk
* [1]: path of disk
* [2]: array of deltas, uninitialized until the disk is unmounted and/or all state is saved
*
* See functions addDiskHistory() and updateDiskHistory().
*/
this.aDiskHistory = [];
/*
* Support for local disk images is currently limited to desktop browsers with FileReader support;
* when this flag is set, setBinding() allows local disk bindings and informs initBus() to update the
* "listDisks" binding accordingly.
*/
this.fLocalDisks = (!web.isMobile() && window && 'FileReader' in window);
/*
* The remainder of FDC initialization now takes place in our initBus() handler, largely because we
* want initController() to have access to the ChipSet component, so that it can query switches and/or CMOS
* settings that determine the number of drives and their characteristics (eg, 40-track vs. 80-track),
* which it can then pass on to initDrive().
*/
}
Component.subclass(FDC);
FDC.DEFAULT_DRIVE_NAME = "Floppy Drive";
if (DEBUG) {
FDC.TERMS = {
C: "C", // Cylinder Number
D: "D", // Data (eg, pattern to be written to a sector)
H: "H", // Head Address
R: "R", // Record (ie, sector number to be read or written)
N: "N", // Number (ie, number of data bytes to write)
DS: "DS", // Drive Select
SC: "SC", // Sectors per Cylinder
DTL: "DTL", // Data Length
EOT: "EOT", // End of Track
GPL: "GPL", // Gap Length
HLT: "HLT", // Head Load Time
NCN: "NCN", // New Cylinder Number
PCN: "PCN", // Present Cylinder Number
SRT: "SRT", // Stepping Rate
ST0: "ST0", // Status Register 0
ST1: "ST1", // Status Register 1
ST2: "ST2", // Status Register 2
ST3: "ST3" // Status Register 3
};
} else {
FDC.TERMS = {};
}
/*
* FDC Digital Output Register (DOR) (0x3F2, write-only)
*
* NOTE: Reportedly, a drive's MOTOR had to be ON before the drive could be selected; however, outFDCOutput() no
* longer verifies that. Also, motor start time for original drives was 500ms, but we make no attempt to simulate that.
*
* On the MODEL_5170 "PC AT Fixed Disk and Diskette Drive Adapter", this port is called the Digital Output Register
* or DOR. It uses the same bit definitions as the original FDC Output Register, except that only two diskette drives
* are supported, hence bit 1 is always 0 (ie, FDC.REG_OUTPUT.DS2 and FDC.REG_OUTPUT.DS3 are not supported) and bits
* 6 and 7 are unused (FDC.REG_OUTPUT.MOTOR_D2 and FDC.REG_OUTPUT.MOTOR_D3 are not supported).
*/
FDC.REG_OUTPUT = {
PORT: 0x3F2,
DS: 0x03, // drive select bits
DS0: 0x00,
DS1: 0x01,
DS2: 0x02, // reserved on the MODEL_5170
DS3: 0x03, // reserved on the MODEL_5170
ENABLE: 0x04, // clearing this bit resets the FDC
INT_ENABLE: 0x08, // enables both FDC and DMA (Channel 2) interrupt requests (IRQ 6)
MOTOR_D0: 0x10,
MOTOR_D1: 0x20,
MOTOR_D2: 0x40, // reserved on the MODEL_5170
MOTOR_D3: 0x80 // reserved on the MODEL_5170
};
/*
* FDC Main Status Register (0x3F4, read-only)
*
* On the MODEL_5170 "PC AT Fixed Disk and Diskette Drive Adapter", bits 2 and 3 are reserved, since that adapter
* supported a maximum of two diskette drives.
*/
FDC.REG_STATUS = {
PORT: 0x3F4,
BUSY_A: 0x01,
BUSY_B: 0x02,
BUSY_C: 0x04, // reserved on the MODEL_5170
BUSY_D: 0x08, // reserved on the MODEL_5170
BUSY: 0x10, // a read or write command is in progress
NON_DMA: 0x20, // FDC is in non-DMA mode
READ_DATA: 0x40, // transfer is from FDC Data Register to processor (if clear, then transfer is from processor to the FDC Data Register)
RQM: 0x80 // indicates FDC Data Register is ready to send or receive data to or from the processor (Request for Master)
};
/*
* FDC Data Register (0x3F5, read-write)
*/
FDC.REG_DATA = {
PORT: 0x3F5,
/*
* FDC Commands
*
* NOTE: FDC command bytes need to be masked with FDC.REG_DATA.CMD.MASK before comparing to the values below, since a
* number of commands use the following additional bits as follows:
*
* SK (0x20): Skip Deleted Data Address Mark
* MF (0x40): Modified Frequency Modulation (as opposed to FM or Frequency Modulation)
* MT (0x80): multi-track operation (ie, data processed under both head 0 and head 1)
*
* We don't support MT (Multi-Track) operations at this time, and the MF and SK designations cannot be supported as long
* as our diskette images contain only the original data bytes without any formatting information.
*/
CMD: {
READ_TRACK: 0x02,
SPECIFY: 0x03,
SENSE_DRIVE: 0x04,
WRITE_DATA: 0x05,
READ_DATA: 0x06,
RECALIBRATE: 0x07,
SENSE_INT: 0x08, // this command is used to clear the FDC interrupt following the clearing/setting of FDC.REG_OUTPUT.ENABLE
WRITE_DEL_DATA: 0x09,
READ_ID: 0x0A,
READ_DEL_DATA: 0x0C,
FORMAT_TRACK: 0x0D,
SEEK: 0x0F,
SCAN_EQUAL: 0x11,
SCAN_LO_EQUAL: 0x19,
SCAN_HI_EQUAL: 0x1D,
MASK: 0x1F,
SK: 0x20, // SK (Skip Deleted Data Address Mark)
MF: 0x40, // MF (Modified Frequency Modulation)
MT: 0x80 // MT (Multi-Track; ie, data under both heads will be processed)
},
/*
* FDC status/error results, generally assigned according to the corresponding ST0, ST1, ST2 or ST3 status bit.
*
* TODO: Determine when EQUIP_CHECK is *really* set; also, "77 step pulses" sounds suspiciously like a typo (it's not 79?)
*/
RES: {
NONE: 0x00000000, // ST0 (IC): Normal termination of command (NT)
NOT_READY: 0x00000008, // ST0 (NR): When the FDD is in the not-ready state and a read or write command is issued, this flag is set; if a read or write command is issued to side 1 of a single sided drive, then this flag is set
EQUIP_CHECK: 0x00000010, // ST0 (EC): If a fault signal is received from the FDD, or if the track 0 signal fails to occur after 77 step pulses (recalibrate command), then this flag is set
SEEK_END: 0x00000020, // ST0 (SE): When the FDC completes the Seek command, this flag is set to 1 (high)
INCOMPLETE: 0x00000040, // ST0 (IC): Abnormal termination of command (AT); execution of command was started, but was not successfully completed
RESET: 0x000000C0, // ST0 (IC): Abnormal termination because during command execution the ready signal from the drive changed state
INVALID: 0x00000080, // ST0 (IC): Invalid command issue (IC); command which was issued was never started
ST0: 0x000000FF,
NO_ID_MARK: 0x00000100, // ST1 (MA): If the FDC cannot detect the ID Address Mark, this flag is set; at the same time, the MD (Missing Address Mark in Data Field) of Status Register 2 is set
NOT_WRITABLE: 0x00000200, // ST1 (NW): During Execution of a Write Data, Write Deleted Data, or Format a Cylinder command, if the FDC detects a write protect signal from the FDD, then this flag is set
NO_DATA: 0x00000400, // ST1 (ND): FDC cannot find specified sector (or specified ID if READ_ID command)
DMA_OVERRUN: 0x00001000, // ST1 (OR): If the FDC is not serviced by the main systems during data transfers within a certain time interval, this flag is set
CRC_ERROR: 0x00002000, // ST1 (DE): When the FDC detects a CRC error in either the ID field or the data field, this flag is set
END_OF_CYL: 0x00008000, // ST1 (EN): When the FDC tries to access a sector beyond the final sector of a cylinder, this flag is set
ST1: 0x0000FF00,
NO_DATA_MARK: 0x00010000, // ST2 (MD): When data is read from the medium, if the FDC cannot find a Data Address Mark or Deleted Data Address Mark, then this flag is set
BAD_CYL: 0x00020000, // ST2 (BC): This bit is related to the ND bit, and when the contents of C on the medium are different from that stored in the ID Register, and the content of C is FF, then this flag is set
SCAN_FAILED: 0x00040000, // ST2 (SN): During execution of the Scan command, if the FDC cannot find a sector on the cylinder which meets the condition, then this flag is set
SCAN_EQUAL: 0x00080000, // ST2 (SH): During execution of the Scan command, if the condition of "equal" is satisfied, this flag is set
WRONG_CYL: 0x00100000, // ST2 (WC): This bit is related to the ND bit, and when the contents of C on the medium are different from that stored in the ID Register, this flag is set
DATA_FIELD: 0x00200000, // ST2 (DD): If the FDC detects a CRC error in the data, then this flag is set
STRL_MARK: 0x00400000, // ST2 (CM): During execution of the Read Data or Scan command, if the FDC encounters a sector which contains a Deleted Data Address Mark, this flag is set
ST2: 0x00FF0000,
DRIVE: 0x03000000, // ST3 (Ux): Status of the "Drive Select" signals from the diskette drive
HEAD: 0x04000000, // ST3 (HD): Status of the "Side Select" signal from the diskette drive
TWOSIDE: 0x08000000, // ST3 (TS): Status of the "Two Side" signal from the diskette drive
TRACK0: 0x10000000, // ST3 (T0): Status of the "Track 0" signal from the diskette drive
READY: 0x20000000, // ST3 (RY): Status of the "Ready" signal from the diskette drive
WRITEPROT: 0x40000000, // ST3 (WP): Status of the "Write Protect" signal from the diskette drive
FAULT: 0x80000000|0, // ST3 (FT): Status of the "Fault" signal from the diskette drive
ST3: 0xFF000000|0
}
};
/*
* FDC "Fixed Disk" Register (0x3F6, write-only)
*
* Since this register's functions are all specific to the Hard Disk Controller, see the HDC component for details.
* The fact that this HDC register is in the middle of the FDC I/O port range is an oddity of the "HFCOMBO" controller.
*/
/*
* FDC Digital Input Register (0x3F7, read-only, MODEL_5170 only)
*
* Bit 7 indicates a diskette change (the MODEL_5170 introduced change-line support). Bits 0-6 are for the selected
* hard disk drive, so this port must be shared with the HDC; bits 0-6 are valid for 50 microseconds after a write to
* the Drive Head Register.
*/
FDC.REG_INPUT = {
PORT: 0x3F7,
DS0: 0x01, // Drive Select 0
DS1: 0x02, // Drive Select 1
HS0: 0x04, // Head Select 0
HS1: 0x08, // Head Select 1
HS2: 0x10, // Head Select 2
HS3: 0x20, // Head Select 3
WRITE_GATE: 0x40, // Write Gate
DISK_CHANGE:0x80 // Diskette Change
};
/*
* FDC Diskette Control Register (0x3F7, write-only, MODEL_5170 only)
*
* Only bits 0-1 are used; bits 2-7 are reserved.
*/
FDC.REG_CONTROL = {
PORT: 0x3F7,
RATE500K: 0x00, // 500,000 bps
RATE300K: 0x02, // 300,000 bps
RATE250K: 0x01, // 250,000 bps
RATEUNUSED: 0x03
};
/*
* FDC Command Sequences
*
* For each command, cbReq indicates the total number of bytes in the command request sequence,
* including the first (command) byte; cbRes indicates total number of bytes in the response sequence.
*/
if (DEBUG) {
FDC.CMDS = {
SPECIFY: "SPECIFY",
SENSE_DRIVE: "SENSE DRIVE",
WRITE_DATA: "WRITE DATA",
READ_DATA: "READ DATA",
RECALIBRATE: "RECALIBRATE",
SENSE_INT: "SENSE INTERRUPT",
READ_ID: "READ ID",
FORMAT: "FORMAT",
SEEK: "SEEK"
};
} else {
FDC.CMDS = {};
}
FDC.aCmdInfo = {
0x03: {cbReq: 3, cbRes: 0, name: FDC.CMDS.SPECIFY},
0x04: {cbReq: 2, cbRes: 1, name: FDC.CMDS.SENSE_DRIVE},
0x05: {cbReq: 9, cbRes: 7, name: FDC.CMDS.WRITE_DATA},
0x06: {cbReq: 9, cbRes: 7, name: FDC.CMDS.READ_DATA},
0x07: {cbReq: 2, cbRes: 0, name: FDC.CMDS.RECALIBRATE},
0x08: {cbReq: 1, cbRes: 2, name: FDC.CMDS.SENSE_INT},
0x0A: {cbReq: 2, cbRes: 7, name: FDC.CMDS.READ_ID},
0x0D: {cbReq: 6, cbRes: 7, name: FDC.CMDS.FORMAT},
0x0F: {cbReq: 3, cbRes: 0, name: FDC.CMDS.SEEK}
};
/**
* setBinding(sHTMLType, sBinding, control)
*
* @this {FDC}
* @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
* @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "listDisks")
* @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
* @return {boolean} true if binding was successful, false if unrecognized binding request
*/
FDC.prototype.setBinding = function(sHTMLType, sBinding, control)
{
var fdc = this;
switch (sBinding) {
case "listDisks":
this.bindings[sBinding] = control;
control.onchange = function onChangeListDisks(event) {
var controlDesc = fdc.bindings["descDisk"];
var controlOption = control.options[control.selectedIndex];
if (controlDesc && controlOption) {
var dataValue = {};
var sValue = controlOption.getAttribute("data-value");
if (sValue) {
try {
dataValue = eval("({" + sValue + "})");
} catch (e) {
Component.error("FDC option error: " + e.message);
}
}
var sHTML = dataValue['desc'];
if (sHTML === undefined) sHTML = "";
var sHRef = dataValue['href'];
if (sHRef !== undefined) sHTML = "<a href=\"" + sHRef + "\" target=\"_blank\">" + sHTML + "</a>";
controlDesc.innerHTML = sHTML;
}
};
return true;
case "descDisk":
case "listDrives":
this.bindings[sBinding] = control;
/*
* I tried going with onclick instead of onchange, so that if you wanted to confirm what's
* loaded in a particular drive, you could click the drive control without having to change it.
* However, that doesn't seem to work for all browsers, so I've reverted to onchange.
*/
control.onchange = function onChangeListDrives(event) {
var iDrive = str.parseInt(control.value, 10);
if (iDrive != null) fdc.displayDiskette(iDrive);
};
return true;
case "loadDrive":
this.bindings[sBinding] = control;
control.onclick = function onClickLoadDrive(event) {
var controlDisks = fdc.bindings["listDisks"];
if (controlDisks) {
var sDisketteName = controlDisks.options[controlDisks.selectedIndex].text;
var sDiskettePath = controlDisks.value;
fdc.loadSelectedDrive(sDisketteName, sDiskettePath);
}
};
return true;
case "mountDrive":
if (this.fLocalDisks) {
this.bindings[sBinding] = control;
/*
* Enable "Mount" button only if a file is actually selected
*/
control.addEventListener('change', function() {
var fieldset = control.children[0];
var files = fieldset.children[0].files;
var submit = fieldset.children[1];
submit.disabled = !files.length;
});
control.onsubmit = function(event) {
var file = event.currentTarget[1].files[0];
if (file) {
var sDiskettePath = file.name;
var sDisketteName = str.getBaseName(sDiskettePath, true);
fdc.loadSelectedDrive(sDisketteName, sDiskettePath, file);
}
/*
* Prevent reloading of web page after form submission
*/
return false;
};
}
else {
if (DEBUG) this.log("Local file support not available");
control.parentNode.removeChild(control);
}
return true;
default:
break;
}
return false;
};
/**
* initBus(cmp, bus, cpu, dbg)
*
* @this {FDC}
* @param {Computer} cmp
* @param {Bus} bus
* @param {X86CPU} cpu
* @param {Debugger} dbg
*/
FDC.prototype.initBus = function(cmp, bus, cpu, dbg)
{
this.bus = bus;
this.cpu = cpu;
this.dbg = dbg;
this.cmp = cmp;
this.chipset = cmp.getComponentByType("ChipSet");
/*
* If we didn't need auto-mount support, we could defer controller initialization until we received a powerUp() notification,
* at which point reset() would call initController(), or restore() would restore the controller; in that case, all we'd need
* to do here is call setReady().
*/
this.initController();
bus.addPortInputTable(this, FDC.aPortInput);
bus.addPortOutputTable(this, FDC.aPortOutput);
if (this.fLocalDisks) {
this.addDiskette("Local Disk", "?");
}
this.addDiskette("Remote Disk", "??");
if (!this.autoMount()) this.setReady();
};
/**
* powerUp(data, fRepower)
*
* @this {FDC}
* @param {Object|null} data
* @param {boolean} [fRepower]
* @return {boolean} true if successful, false if failure
*/
FDC.prototype.powerUp = function(data, fRepower)
{
if (!fRepower) {
if (!data || !this.restore) {
this.reset();
if (this.cmp.fReload) {
/*
* If the computer's fReload flag is set, we're required to toss all currently
* loaded disks and remount all disks specified in the auto-mount configuration.
*/
this.unloadAllDrives(true);
this.autoMount(true);
}
} else {
if (!this.restore(data)) return false;
}
/*
* Populate the HTML controls to match the actual (well, um, specified) number of floppy drives.
*/
var controlDrives;
if ((controlDrives = this.bindings['listDrives'])) {
while (controlDrives.firstChild) {
controlDrives.removeChild(controlDrives.firstChild);
}
controlDrives.textContent = "";
for (var iDrive = 0; iDrive < this.nDrives; iDrive++) {
var controlOption = window.document.createElement("option");
controlOption['value'] = iDrive;
/*
* TODO: This conversion of drive number to drive letter, starting with A:, is very simplistic
* and will NOT match the drive mappings that DOS ultimately uses. We'll need to spiff this up at
* some point.
*/
controlOption.textContent = String.fromCharCode(0x41 + iDrive) + ":";
controlDrives.appendChild(controlOption);
}
if (this.nDrives > 0) {
controlDrives.value = "0";
this.displayDiskette(0);
}
}
}
return true;
};
/**
* powerDown(fSave, fShutdown)
*
* @this {FDC}
* @param {boolean} fSave
* @param {boolean} [fShutdown]
* @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
*/
FDC.prototype.powerDown = function(fSave, fShutdown)
{
return fSave && this.save? this.save() : true;
};
/**
* reset()
*
* NOTE: initController() establishes the maximum possible number of drives, but it's not until
* we interrogate the current SW1 settings that we will have an ACTUAL number of drives (nDrives),
* at which point we can also update the contents of the "listDrives" HTML control, if any.
*
* @this {FDC}
*/
FDC.prototype.reset = function()
{
/*
* NOTE: The controller is also initialized by the constructor, to assist with auto-mount support,
* so think about whether we can skip powerUp initialization.
*/
this.initController();
};
/**
* save()
*
* This implements save support for the FDC component.
*
* @this {FDC}
* @return {Object}
*/
FDC.prototype.save = function()
{
var state = new State(this);
state.set(0, this.saveController());
return state.data();
};
/**
* restore(data)
*
* This implements restore support for the FDC component.
*
* @this {FDC}
* @param {Object} data
* @return {boolean} true if successful, false if failure
*/
FDC.prototype.restore = function(data)
{
return this.initController(data[0]);
};
/**
* initController(data)
*
* @this {FDC}
* @param {Array} [data]
* @return {boolean} true if successful, false if failure
*/
FDC.prototype.initController = function(data)
{
var i = 0, iDrive;
var fSuccess = true;
if (data === undefined) {
data = [0, 0, FDC.REG_STATUS.RQM, new Array(9), 0, 0, 0, []];
}
/*
* Selected drive (from regOutput), which can only be selected if its motor is on (see regOutput).
*/
this.iDrive = data[i++];
i++; // unused slot (if reused, bias by +4, since it was formerly a unit #)
/*
* Defaults to FDC.REG_STATUS.RQM set (ready for command) and FDC.REG_STATUS.READ_DATA clear (data direction
* is from processor to the FDC Data Register).
*/
this.regStatus = data[i++];
/*
* There can be up to 9 command bytes, and 7 result bytes, so 9 data registers are sufficient for communicating
* in both directions (hence, the new Array(9) default above).
*/
this.regDataArray = data[i++];
/*
* Determines the next data byte to be received.
*/
this.regDataIndex = data[i++];
/*
* Determines the next data byte to be sent (internally, we use regDataIndex to read data bytes, up to this total).
*/
this.regDataTotal = data[i++];
this.regOutput = data[i++];
var dataDrives = data[i++];
/*
* Initialize the disk history (if available) before initializing the drives, so that any disk deltas can be
* applied to disk images that are already loaded.
*/
var aDiskHistory = data[i++];
if (aDiskHistory != null) this.aDiskHistory = aDiskHistory;
if (this.aDrives === undefined) {
this.nDrives = 4; // default to the maximum number of drives
if (this.chipset) this.nDrives = this.chipset.getSWFloppyDrives();
/*
* I would prefer to allocate only nDrives, but as discussed in the handling of the FDC.REG_DATA.CMD.SENSE_INT
* command, we're faced with situations where the controller must respond to any drive in the range 0-3, regardless
* how many drives are actually installed. We still rely upon nDrives to determine the number of drives displayed
* to the user, however.
*/
this.aDrives = new Array(4);
}
for (iDrive = 0; iDrive < this.aDrives.length; iDrive++) {
var drive = this.aDrives[iDrive];
if (drive === undefined) {
/*
* The first time each drive is initialized, we query its capacity (based on switches or CMOS) and set
* the drive's physical limits accordingly (ie, max tracks, max heads, and max sectors/track).
*/
drive = this.aDrives[iDrive] = {};
var nKb = (this.chipset? this.chipset.getSWFloppyDriveSize(iDrive) : 0);
switch(nKb) {
case 160:
case 180:
drive.nHeads = 1; // required for single-sided drives only (all others default to double-sided)
/* falls through */
case 320:
case 360:
/* falls through */
default: // drives that don't have a recognized capacity default to 360
drive.nCylinders = 40;
drive.nSectors = 9; // drives capable of writing 8 sectors/track can also write 9 sectors/track
break;
case 720:
drive.nCylinders = 80;
drive.nSectors = 9;
break;
case 1200:
drive.nCylinders = 80;
drive.nSectors = 15;
break;
case 1440:
drive.nCylinders = 80;
drive.nSectors = 18;
break;
}
}
if (!this.initDrive(drive, iDrive, dataDrives[iDrive])) {
fSuccess = false;
}
}
/*
* regInput and regControl (port 0x3F7) were not present on controllers prior to MODEL_5170, which is why
* we don't include initializers for them in the default data array; we could eliminate them on older models,
* but we don't have access to the model info right now, and there's no real cost to always including them
* in the FDC state.
*
* The bigger compatibility question is whether to always include hooks for them (see aPortInput and aPortOutput).
*/
this.regInput = data[i++] || 0; // TODO: Determine if we should default to FDC.REG_INPUT.DISK_CHANGE instead of 0
this.regControl = data[i] || FDC.REG_CONTROL.RATE500K; // default to maximum data rate
if (DEBUG && this.messageEnabled()) {
this.printMessage("FDC initialized for " + this.aDrives.length + " drive(s)");
}
return fSuccess;
};
/**
* saveController()
*
* @this {FDC}
* @return {Array}
*/
FDC.prototype.saveController = function()
{
var i = 0;
var data = [];
data[i++] = this.iDrive;
data[i++] = 0;
data[i++] = this.regStatus;
data[i++] = this.regDataArray;
data[i++] = this.regDataIndex;
data[i++] = this.regDataTotal;
data[i++] = this.regOutput;
data[i++] = this.saveDrives();
data[i++] = this.saveDeltas();
data[i++] = this.regInput;
data[i] = this.regControl;
return data;
};
/**
* initDrive(drive, iDrive, data)
*
* TODO: Consider a separate Drive class that both FDC and HDC can use, since there's a lot of commonality
* between the drive objects created by both controllers. This will clean up overall drive management and allow
* us to factor out some common Drive methods (eg, advanceSector()).
*
* @this {FDC}
* @param {Object} drive
* @param {number} iDrive
* @param {Array|undefined} data
* @return {boolean} true if successful, false if failure
*/
FDC.prototype.initDrive = function(drive, iDrive, data)
{
var i = 0;
var fSuccess = true;
drive.iDrive = iDrive;
drive.fBusy = drive.fLocal = false;
if (data === undefined) {
/*
* We set a default of two heads (MODEL_5150 PCs originally shipped with single-sided drives,
* but the ROM BIOS appears to have always supported both drive types).
*/
data = [FDC.REG_DATA.RES.RESET, true, 0, 2, 0];
}
if (typeof data[1] == "boolean") {
/*
* Note that when no data is provided (eg, when the controller is being reinitialized), we now take
* care to preserve any drive defaults that initController() already obtained for us, falling back to
* bare minimums only when all else fails.
*/
data[1] = [
FDC.DEFAULT_DRIVE_NAME, // a[0]
drive.nCylinders || 40, // a[1]
drive.nHeads || data[3],// a[2]
drive.nSectors || 9, // a[3]
drive.cbSector || 512, // a[4]
data[1], // a[5]
drive.nDiskCylinders, // a[6]
drive.nDiskHeads, // a[7]
drive.nDiskSectors // a[8]
];
}
/*
* resCode used to be an FDC global, but in order to insulate FDC state from the operation of various functions
* that operate on drive objects (eg, readData and writeData), I've made it a per-drive variable. This choice,
* similar to my choice for handling PCN, may be contrary to how the actual hardware works, but I prefer this
* approach, as long as it doesn't expose any incompatibilities that any software actually cares about.
*/
drive.resCode = data[i++];
/*
* Some additional drive properties/defaults that are largely for the Disk component's benefit.
*/
var a = data[i++];
drive.name = a[0];
drive.nCylinders = a[1]; // cylinders
drive.nHeads = a[2]; // heads/cylinders
drive.nSectors = a[3]; // sectors/track
drive.cbSector = a[4]; // bytes/sector
drive.fRemovable = a[5];
/*
* If we have current media parameters, restore them; otherwise, default to the drive's physical parameters.
*/
if (drive.nDiskCylinders = a[6]) {
drive.nDiskHeads = a[7];
drive.nDiskSectors = a[8];
} else {
drive.nDiskCylinders = drive.nCylinders;
drive.nDiskHeads = drive.nHeads;
drive.nDiskSectors = drive.nSectors;
}
/*
* The next group of properties are set by various FDC command sequences.
*
* We initialize this.iDrive (above) and drive.bHead and drive.bCylinder (below) to zero, but leave the rest undefined,
* awaiting their first FDC command. We do this because the initial SENSE_INT command returns a PCN, which will also
* be undefined unless we have at least zeroed both the current drive and the "present" cylinder on that drive.
*
* Alternatively, I could make PCN a global FDC variable. That may be closer to how the actual hardware operates,
* but I'm using per-drive variables so that the FDC component can be a good client to both the CPU and other components.
*
* COMPATIBILITY ALERT: The MODEL_5170 BIOS ("DSKETTE_SETUP") attempts to discern the drive type (double-density vs.
* high-capacity) by "slapping" the heads around -- "litrally" (it uses a constant named "TRK_SLAP" equal to 48).
* After seeking to "TRK_SLAP", the BIOS performs a series of seeks, looking for the precise point where the heads
* return to track 0.
*
* Here's how it works: the BIOS seeks to track 48 (which is fine on an 80-track 1.2Mb high-capacity drive, but 9 tracks
* too far on a 40-track 360Kb double-density drive), then seeks to track 10, and then seeks in single-track increments
* up to 10 more times until the SENSE_DRIVE command returns ST3 with the TRACK0 bit set.
*
* This implies that SEEK isn't really seeking to a specified cylinder, but rather it is calculating a delta from
* the previous cylinder to the specified cylinder, and stepping over that number of tracks. Which means that SEEK
* is updating a "logical" cylinder number, not the "physical" (actual) cylinder number. Presumably a RECALIBRATE
* command will bring the logical and physical values into sync, but once an out-of-bounds cylinder is requested, they
* will be out of sync.
*
* To simulate this, bCylinder is now treated as the "physical" cylinder (since that's how it's ALWAYS been used here),
* and bCylinderSeek will now track (pun intended) the "logical" cylinder that's programmed via SEEK commands.
*/
drive.bHead = data[i++];
drive.bCylinderSeek = data[i++]; // the data[] slot where we used to store drive.nHeads (or -1)
drive.bCylinder = data[i++];
if (drive.bCylinderSeek >= 100) { // verify that the saved bCylinderSeek is valid, otherwise sync it with bCylinder
drive.bCylinderSeek -= 100;
} else {
drive.bCylinderSeek -= drive.bCylinder;
}
drive.bSector = data[i++];
drive.bSectorEnd = data[i++]; // aka EOT
drive.nBytes = data[i++];
/*
* We no longer reinitialize drive.disk, in order to retain previously mounted diskette across resets.
*/
/*
* The next group of properties are managed by worker functions (eg, doRead()) to maintain state across DMA requests.
*/
drive.ibSector = data[i++]; // location of the next byte to be accessed in the current sector
drive.sector = null;
if (!drive.disk) {
drive.sDiskettePath = ""; // ensure this is initialized to a default that displayDiskette() can deal with
}
var deltas = data[i++];
if (deltas == 102) deltas = false; // v1.02 backward-compatibility
if (typeof deltas == "boolean") {
var fLocal = deltas;
var sDisketteName = data[i++];
var sDiskettePath = data[i];
/*
* If we're restoring a local disk image, then the entire disk contents should be captured in aDiskHistory,
* so all we have to do is mount a blank diskette and let disk.restore() do the rest; ie, there's nothing to
* "load" (it's a purely synchronous operation).
*
* Otherwise, we must call loadDiskette(); in the common case, loadDiskette() will have already "auto-mounted"
* the diskette, so it will return true, and then we restore any deltas to the current image.
*
* However, if loadDiskette() returns false, then it has initiated the load for a *different* disk image,
* so we must mark ourselves as "not ready" again, and add another "wait for ready" test in Computer before
* finally powering the CPU.
*/
if (fLocal) {
this.mountDiskette(iDrive, sDisketteName, sDiskettePath);
}
else if (this.loadDiskette(iDrive, sDisketteName, sDiskettePath, true)) {
if (drive.disk) {
if (sDiskettePath) {
this.addDiskHistory(sDisketteName, sDiskettePath, drive.disk);
} else {
if (DEBUG) Component.warning("Disk '" + (drive.disk.sDiskName || sDisketteName) + "' not recorded properly in drive " + iDrive);
}
}
} else {
this.setReady(false);
}
} else if (deltas !== undefined) {
/*
* If there's any data at all (ie, if this is a restore and not a reset), then it must be in the
* pre-v1.02 save/restore format, so we'll restore as best we can, but be aware that if disk.restore()
* notices that the currently mounted disk image differs from the disk image that these deltas belong to,
* it will return false, and the restore operation will be aborted.
*/
if (drive.disk && drive.disk.restore(deltas) < 0) {
fSuccess = false;
}
}
/*
* TODO: If loadDiskette() returned true, then this can happen immediately. Otherwise, loadDiskette()
* will have merely "queued up" the load request and drive.disk won't be ready yet, so figure out how/when
* we can properly restore drive.sector in that case.
*/
if (fSuccess && drive.disk && drive.ibSector !== undefined) {
drive.sector = drive.disk.seek(drive.bCylinder, drive.bHead, drive.bSector);
}
return fSuccess;
};
/**
* saveDrives()
*
* @this {FDC}
* @return {Array}
*/
FDC.prototype.saveDrives = function()
{
var i = 0;
var data = [];
for (var iDrive = 0; iDrive < this.aDrives.length; iDrive++) {
data[i++] = this.saveDrive(this.aDrives[iDrive]);
}
return data;
};
/**
* saveDrive(drive)
*
* @this {FDC}
* @return {Array}
*/
FDC.prototype.saveDrive = function(drive)
{
var i = 0;
var data = [];
data[i++] = drive.resCode;
data[i++] = [drive.name, drive.nCylinders, drive.nHeads, drive.nSectors, drive.cbSector, drive.fRemovable, drive.nDiskCylinders, drive.nDiskHeads, drive.nDiskSectors];
data[i++] = drive.bHead;
/*
* We used to store drive.nHeads in the next slot, but now we store bCylinderSeek,
* and we bias it by +100 so that initDrive() can distinguish it from older values.
*/
data[i++] = drive.bCylinderSeek + 100;
data[i++] = drive.bCylinder;
data[i++] = drive.bSector;
data[i++] = drive.bSectorEnd;
data[i++] = drive.nBytes;
data[i++] = drive.ibSector;
/*
* Now we deviate from the 1.01a save format: instead of next storing all the deltas for the
* currently mounted disk (if any), we store only the name and path of the currently mounted disk
* (if any). Deltas for ALL disks, both currently mounted and previously mounted, are stored later.
*
* data[i++] = drive.disk? drive.disk.save() : null;
*
* To indicate this deviation, we store neither a null nor a delta array, but a boolean (fLocal);
* if that boolean is not present, then the restore code will know it's dealing with a pre-v1.02 state.
*/
data[i++] = drive.fLocal;
data[i++] = drive.sDisketteName;
data[i] = drive.sDiskettePath;
if (DEBUG && !drive.sDiskettePath && drive.disk && drive.disk.sDiskPath) {
Component.warning("Disk '" + drive.disk.sDiskName + "' not saved properly in drive " + drive.iDrive);
}
return data;
};
/**
* saveDeltas()
*
* This returns an array of entries, one for each disk image we've ever mounted, including any deltas; ie:
*
* [name, path, deltas]
*
* aDiskHistory contains exactly that, except that deltas may not be up-to-date for any currently mounted
* disk image(s), so we call updateHistory() for all those disks, and then aDiskHistory is ready to be saved.
*
* @this {FDC}
* @return {Array}
*/
FDC.prototype.saveDeltas = function()
{
for (var iDrive = 0; iDrive < this.aDrives.length; iDrive++) {
var drive = this.aDrives[iDrive];
if (drive.disk) {
this.updateDiskHistory(drive.sDisketteName, drive.sDiskettePath, drive.disk);
}
}
return this.aDiskHistory;
};
/**
* copyDrive(iDrive)
*
* @this {FDC}
* @param {number} iDrive
* @return {Object|undefined} drive (which may be undefined if the requested drive does not exist)
*/
FDC.prototype.copyDrive = function(iDrive)
{
var driveNew;
var driveOld = this.aDrives[iDrive];
if (driveOld !== undefined) {
driveNew = {};
for (var p in driveOld) {
driveNew[p] = driveOld[p];
}
}
return driveNew;
};
/**
* seekDrive(drive, iSector, nSectors)
*
* The FDC doesn't need this function, since all FDC requests from the CPU are handled by doCmd(). This function
* is used by other components (eg, Debugger) to mimic an FDC request, using a drive object obtained from copyDrive(),
* to avoid disturbing the internal state of the FDC's drive objects.
*
* Also note that in an actual FDC request, drive.nBytes is initialized to the size of a single sector; the extent
* of the entire transfer is actually determined by a count that has been pre-loaded into the DMA controller. The FDC
* isn't even aware of the extent of the transfer, so in the case of a read request, all readData() can do is return
* bytes until the current track (or, in the case of a multi-track request, the current cylinder) has been exhausted.
*
* Since seekDrive() is for use with non-DMA requests, we use nBytes to specify the length of the entire transfer.
*
* @this {FDC}
* @param {Object} drive
* @param {number} iSector (a "logical" sector number, relative to the entire disk, NOT a physical sector number)
* @param {number} nSectors
* @return {boolean} true if successful, false if invalid position request
*/
FDC.prototype.seekDrive = function(drive, iSector, nSectors)
{
if (drive.disk) {
var aDiskInfo = drive.disk.info();
var nCylinders = aDiskInfo[0];
var nHeads = aDiskInfo[1];
var nSectorsPerTrack = aDiskInfo[2];
var nSectorsPerCylinder = nHeads * nSectorsPerTrack;
var nSectorsPerDisk = nCylinders * nSectorsPerCylinder;
if (iSector + nSectors <= nSectorsPerDisk) {
drive.bCylinder = Math.floor(iSector / nSectorsPerCylinder);
iSector %= nSectorsPerCylinder;
drive.bHead = Math.floor(iSector / nSectorsPerTrack);
drive.bSector = (iSector % nSectorsPerTrack) + 1;
drive.nBytes = nSectors * aDiskInfo[3];
/*
* NOTE: We don't set bSectorEnd, as an FDC command would, but it's irrelevant, because we don't actually
* do anything with bSectorEnd at this point. Perhaps someday, when we faithfully honor/restrict requests
* to a single track (or a single cylinder, in the case of multi-track requests).
*/
drive.resCode = FDC.REG_DATA.RES.NONE;
/*
* At this point, we've finished simulating what an FDC.REG_DATA.CMD.READ_DATA command would have performed,
* up through doRead(). Now it's the caller responsibility to call readData(), just like the DMA Controller would.
*/
return true;
}
}
return false;
};
/**
* autoMount(fRemount)
*
* @this {FDC}
* @param {boolean} [fRemount] is true if we're remounting all auto-mounted diskettes
* @return {boolean} true if one or more diskette images are being auto-mounted, false if none
*/
FDC.prototype.autoMount = function(fRemount)
{
if (!fRemount) this.cAutoMount = 0;
if (this.configMount) {
for (var sDrive in this.configMount) {
var configDrive = this.configMount[sDrive];
if (configDrive['name'] && configDrive['path']) {
/*
* WARNING: This conversion of drive letter to drive number, starting with A:, is very simplistic
* and is not guaranteed to match the drive mapping that DOS ultimately uses.
*/
var iDrive = sDrive.charCodeAt(0) - 0x41;
if (iDrive >= 0 && iDrive < this.aDrives.length) {
if (!this.loadDiskette(iDrive, configDrive['name'], configDrive['path'], true) && fRemount)
this.setReady(false);
continue;
}
}
this.notice("Unrecognized auto-mount specification for drive " + sDrive);
}
}
return !!this.cAutoMount;
};
/**
* loadSelectedDrive(sDisketteName, sDiskettePath, file)
*
* @this {FDC}
* @param {string} sDisketteName
* @param {string} sDiskettePath
* @param {File} [file] is set if there's an associated File object
*/
FDC.prototype.loadSelectedDrive = function(sDisketteName, sDiskettePath, file)
{
var iDrive;
var controlDrives = this.bindings["listDrives"];
if (controlDrives && !isNaN(iDrive = str.parseInt(controlDrives.value, 10)) && iDrive >= 0 && iDrive < this.aDrives.length) {
if (!sDiskettePath) {
this.unloadDrive(iDrive);
return;
}
if (sDiskettePath == "?") {
this.notice('Use "Choose File" and "Mount" to select and load a local disk.');
return;
}
/*
* If the special path of "??" is selected, then we want to prompt the user for a URL. Oh, and
* make sure we pass an empty string as the 2nd parameter to prompt(), so that IE won't display
* "undefined" -- because after all, undefined and "undefined" are EXACTLY the same thing, right?
*
* TODO: This is literally all I've done to support remote disk images. There's probably more
* I should do, like dynamically updating "listDisks" to include new entries, and adding new entries
* to the save/restore data.
*/
if (sDiskettePath == "??") {
sDiskettePath = window.prompt("Enter the URL of a remote disk image.", "") || "";
if (!sDiskettePath) return;
sDisketteName = str.getBaseName(sDiskettePath);
this.println("Attempting to load " + sDiskettePath + " as \"" + sDisketteName + "\"");
}
this.println("loading disk " + sDiskettePath + "...");
while (this.loadDiskette(iDrive, sDisketteName, sDiskettePath, false, file)) {
if (!window.confirm("Click OK to reload the original disk.\n(WARNING: All disk changes will be discarded)")) {
return;
}
/*
* So here's the story: loadDiskette() returned true, which it does ONLY if the specified disk is already
* mounted, AND the user clicked OK to reload the original disk image. So we must toss any history we have
* for the disk, unload it, and then loop back around to loadDiskette().
*
* loadDiskette() should NEVER return true the second time, since no disk is loaded. In other words,
* this isn't really a loop so much as a one-time retry operation.
*/
this.removeDiskHistory(sDisketteName, sDiskettePath);
this.unloadDrive(iDrive, false, true);
}
return;
}
this.notice("Nothing to load");
};
/**
* mountDiskette(iDrive, sDisketteName, sDiskettePath)
*
* @this {FDC}
* @param {number} iDrive
* @param {string} sDisketteName
* @param {string} sDiskettePath
*/
FDC.prototype.mountDiskette = function(iDrive, sDisketteName, sDiskettePath)
{
var drive = this.aDrives[iDrive];
this.unloadDrive(iDrive, true, true);
drive.fLocal = true;
var disk = new Disk(this, drive, DiskAPI.MODE.PRELOAD);
this.doneLoadDiskette(drive, disk, sDisketteName, sDiskettePath, true);
};
/**
* loadDiskette(iDrive, sDisketteName, sDiskettePath, fAutoMount, file)
*
* NOTE: If sDiskettePath is already loaded in the drive, nothing needs to be done.
*
* @this {FDC}
* @param {number} iDrive
* @param {string} sDisketteName
* @param {string} sDiskettePath
* @param {boolean} [fAutoMount]
* @param {File} [file] is set if there's an associated File object
* @return {boolean} true if diskette (already) loaded, false if queued up (or busy)
*/
FDC.prototype.loadDiskette = function(iDrive, sDisketteName, sDiskettePath, fAutoMount, file)
{
var drive = this.aDrives[iDrive];
if (sDiskettePath && drive.sDiskettePath != sDiskettePath) {
this.unloadDrive(iDrive, fAutoMount, true);
if (drive.fBusy) {
this.notice("Drive " + iDrive + " busy");
return true;
}
drive.fBusy = true;
if (fAutoMount) {
drive.fAutoMount = true;
this.cAutoMount++;
if (this.messageEnabled()) this.printMessage("loading diskette '" + sDisketteName + "'");
}
drive.fLocal = !!file;
var disk = new Disk(this, drive, DiskAPI.MODE.PRELOAD);
disk.load(sDisketteName, sDiskettePath, file, this.doneLoadDiskette);
return false;
}
return true;
};
/**
* doneLoadDiskette(drive, disk, sDisketteName, sDiskettePath, fAutoMount)
*
* @this {FDC}
* @param {Object} drive
* @param {Disk} disk is set if the disk was successfully loaded, null if not
* @param {string} sDisketteName
* @param {string} sDiskettePath
* @param {boolean} [fAutoMount]
*/
FDC.prototype.doneLoadDiskette = function onFDCLoadNotify(drive, disk, sDisketteName, sDiskettePath, fAutoMount)
{
var aDiskInfo;
drive.fBusy = false;
if (disk) {
/*
* We shouldn't mount the diskette unless the drive is able to handle it; for example, FD360 (40-track)
* drives cannot read FD1200 (80-track) diskettes. However, I no longer require that the diskette's
* sectors/track fall within the drive's standard maximum, because XDF diskettes use 19 physical sectors/track
* on the first cylinder (1 more than the typical 18 sectors/track found on 1.44Mb diskettes) but declare
* a larger logical size (23 512-byte sectors/track) to reflect the actual capacity of XDF tracks beyond the
* first cylinder (ie, one 8Kb sector, one 2Kb sector, one 1Kb sector, and one 512-byte sector).
*/
aDiskInfo = disk.info();
if (disk && aDiskInfo[0] > drive.nCylinders || aDiskInfo[1] > drive.nHeads /* || aDiskInfo[2] > drive.nSectors */) {
this.notice("Diskette \"" + sDisketteName + "\" too large for drive " + String.fromCharCode(0x41 + drive.iDrive));
disk = null;
}
}
if (disk) {
drive.disk = disk;
drive.sDisketteName = sDisketteName;
drive.sDiskettePath = sDiskettePath;
/*
* Adding local disk image names to the disk list seems like a nice idea, but it's too confusing,
* because then it looks like the "Mount" button should be able to (re)load them, and that can NEVER
* happen, for security reasons; local disk images can ONLY be loaded via the "Mount" button after
* the user has selected them via the "Choose File" button.
*
* this.addDiskette(sDisketteName, sDiskettePath);
*
* So we're going to take a different approach: when displayDiskette() is asked to display the name
* of a local disk image, it will map all such disks to "Local Disk", and any attempt to "Mount" such
* a disk, will essentially result in a "Disk not found" error.
*/
this.addDiskHistory(sDisketteName, sDiskettePath, disk);
/*
* For a local disk (ie, one loaded via mountDiskette()), the disk.restore() performed by addDiskHistory()
* may have altered the disk geometry, so refresh the disk info.
*/
aDiskInfo = disk.info();
/*
* Clearly, a successful mount implies a disk change, and I suppose that, technically, an *unsuccessful*
* mount should imply the same, but what would the real-world analog be? Inserting a piece of cardboard
* instead of an actual diskette? In any case, if we can do the user a favor by pretending (as far as the
* disk change line is concerned) that an unsuccessful mount never happened, let's do it.
*
* Successful unmounts are a different story, however; those *do* trigger a change. See unloadDrive().
*/
this.regInput |= FDC.REG_INPUT.DISK_CHANGE;
/*
* With the addition of notify(), users are now "alerted" whenever a diskette has finished loading;
* notify() is selective about its output, using print() if a print window is open, alert() otherwise.
*
* WARNING: This conversion of drive number to drive letter, starting with A:, is very simplistic
* and will not match the drive mappings that DOS ultimately uses (ie, for drives beyond B:).
*/
this.notice("Mounted diskette \"" + sDisketteName + "\" in drive " + String.fromCharCode(0x41 + drive.iDrive), drive.fAutoMount || fAutoMount);
/*
* Update the drive's current media parameters to match the disk's.
*/
drive.nDiskCylinders = aDiskInfo[0];
drive.nDiskHeads = aDiskInfo[1];
drive.nDiskSectors = aDiskInfo[2];
}
else {
drive.fLocal = false;
}
if (drive.fAutoMount) {
drive.fAutoMount = false;
if (!--this.cAutoMount) this.setReady();
}
this.displayDiskette(drive.iDrive);
};
/**
* addDiskette(sName, sPath)
*
* @param {string} sName
* @param {string} sPath
*/
FDC.prototype.addDiskette = function(sName, sPath)
{
var controlDisks = this.bindings["listDisks"];
if (controlDisks) {
for (var i = 0; i < controlDisks.options.length; i++) {
if (controlDisks.options[i].value == sPath) return;
}
var controlOption = window.document.createElement("option");
controlOption['value'] = sPath;
controlOption.textContent = sName;
controlDisks.appendChild(controlOption);
}
};
/**
* displayDiskette(iDrive, fUpdateDrive)
*
* @this {FDC}
* @param {number} iDrive (unvalidated)
* @param {boolean} [fUpdateDrive] is true to update the drive list to match the specified drive (eg, the auto-mount case)
*/
FDC.prototype.displayDiskette = function(iDrive, fUpdateDrive)
{
/*
* First things first: validate iDrive.
*/
if (iDrive >= 0 && iDrive < this.aDrives.length) {
var drive = this.aDrives[iDrive];
var controlDisks = this.bindings["listDisks"];
var controlDrives = this.bindings["listDrives"];
/*
* Next, make sure controls for both drives and disks exist.
*/
if (controlDisks && controlDrives) {
/*
* Next, make sure the drive whose disk we're updating is the currently selected drive.
*/
var i;
var iDriveSelected = str.parseInt(controlDrives.value, 10);
var sTargetPath = (drive.fLocal? "?" : drive.sDiskettePath);
if (!isNaN(iDriveSelected) && iDriveSelected == iDrive) {
for (i = 0; i < controlDisks.options.length; i++) {
if (controlDisks.options[i].value == sTargetPath) {
if (controlDisks.selectedIndex != i) {
controlDisks.selectedIndex = i;
}
break;
}
}
if (i == controlDisks.options.length) controlDisks.selectedIndex = 0;
}
if (fUpdateDrive) {
for (i = 0; i < controlDrives.options.length; i++) {
if (str.parseInt(controlDrives.options[i].value, 10) == drive.iDrive) {
if (controlDrives.selectedIndex != i) {
controlDrives.selectedIndex = i;
}
break;
}
}
}
}
}
};
/**
* unloadDrive(iDrive, fAutoUnload, fQuiet)
*
* @this {FDC}
* @param {number} iDrive (pre-validated)
* @param {boolean} [fAutoUnload] is true if this unload is being forced as part of an automount and/or restored mount
* @param {boolean} [fQuiet]
*/
FDC.prototype.unloadDrive = function(iDrive, fAutoUnload, fQuiet)
{
var drive = this.aDrives[iDrive];
if (drive.disk) {
/*
* Before we toss the disk's information, capture any deltas that may have occurred.
*/
this.updateDiskHistory(drive.sDisketteName, drive.sDiskettePath, drive.disk);
drive.sDisketteName = "";
drive.sDiskettePath = "";
drive.disk = null;
drive.fLocal = false;
this.regInput |= FDC.REG_INPUT.DISK_CHANGE;
/*
* WARNING: This conversion of drive number to drive letter, starting with A:, is very simplistic
* and is not guaranteed to match the drive mapping that DOS ultimately uses.
*/
if (!fQuiet) {
this.notice("Drive " + String.fromCharCode(0x41 + iDrive) + " unloaded", fAutoUnload);
}
/*
* Try to avoid any unnecessary hysteresis regarding the diskette display if this unload is merely
* a prelude to another load.
*/
if (!fAutoUnload && !fQuiet) {
this.displayDiskette(iDrive);
}
}
};
/**
* unloadAllDrives(fDiscard)
*
* @this {FDC}
* @param {boolean} fDiscard to discard all disk history before unloading
*/
FDC.prototype.unloadAllDrives = function(fDiscard)
{
if (fDiscard) {
this.aDiskHistory = [];
}
for (var iDrive = 0; iDrive < this.aDrives.length; iDrive++) {
this.unloadDrive(iDrive, true);
}
};
/**
* addDiskHistory(sDisketteName, sDiskettePath, disk)
*
* @this {FDC}
* @param {string} sDisketteName
* @param {string} sDiskettePath
* @param {Disk} disk containing corresponding disk image
*/
FDC.prototype.addDiskHistory = function(sDisketteName, sDiskettePath, disk)
{
var i;
this.assert(!!sDiskettePath);
for (i = 0; i < this.aDiskHistory.length; i++) {
if (this.aDiskHistory[i][1] == sDiskettePath) {
var nChanges = disk.restore(this.aDiskHistory[i][2]);
if (DEBUG && this.messageEnabled()) {
this.printMessage("disk '" + sDisketteName + "' restored from history (" + nChanges + " changes)");
}
return;
}
}
if (DEBUG && this.messageEnabled()) {
this.printMessage("disk '" + sDisketteName + "' added to history (nothing to restore)");
}
this.aDiskHistory[i] = [sDisketteName, sDiskettePath, []];
};
/**
* removeDiskHistory(sDisketteName, sDiskettePath)
*
* @this {FDC}
* @param {string} sDisketteName
* @param {string} sDiskettePath
*/
FDC.prototype.removeDiskHistory = function(sDisketteName, sDiskettePath)
{
var i;
for (i = 0; i < this.aDiskHistory.length; i++) {
if (this.aDiskHistory[i][1] == sDiskettePath) {
this.aDiskHistory.splice(i, 1);
if (DEBUG && this.messageEnabled()) {
this.printMessage("disk '" + sDisketteName + "' removed from history");
}
return;
}
}
if (DEBUG && this.messageEnabled()) {
this.printMessage("unable to remove disk '" + sDisketteName + "' from history (" + sDiskettePath + ")");
}
};
/**
* updateDiskHistory(sDisketteName, sDiskettePath, disk)
*
* @this {FDC}
* @param {string} sDisketteName
* @param {string} sDiskettePath
* @param {Disk} disk containing corresponding disk image, with possible deltas
*/
FDC.prototype.updateDiskHistory = function(sDisketteName, sDiskettePath, disk)
{
var i;
for (i = 0; i < this.aDiskHistory.length; i++) {
if (this.aDiskHistory[i][1] == sDiskettePath) {
this.aDiskHistory[i][2] = disk.save();
if (DEBUG && this.messageEnabled()) {
this.printMessage("disk '" + sDisketteName + "' updated in history");
}
return;
}
}
/*
* I used to report this as an error (at least in the DEBUG release), but it's no longer really
* an error, because if we're trying to re-mount a clean copy of a disk, we toss its history, then
* unload, and then reload/remount. And since unloadDrive's normal behavior is to call updateDiskHistory()
* before unloading, the fact that the disk is no longer listed here can't be treated as an error.
*/
if (DEBUG && this.messageEnabled()) {
this.printMessage("unable to update disk '" + sDisketteName + "' in history (" + sDiskettePath + ")");
}
};
/**
* outFDCOutput(port, bOut, addrFrom)
*
* @this {FDC}
* @param {number} port (0x3F2, output only)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
FDC.prototype.outFDCOutput = function(port, bOut, addrFrom)
{
this.printMessageIO(port, bOut, addrFrom, "OUTPUT");
if (!(bOut & FDC.REG_OUTPUT.ENABLE)) {
this.initController();
/*
* initController() resets, among other things, the selected drive (this.iDrive), so if we were
* still updating this.iDrive below based on the "drive select" bits in regOutput, we would want
* to make sure those bits now match what initController() set. But since we no longer do that
* (see below), this is no longer needed either.
*
* bOut = (bOut & ~FDC.REG_OUTPUT.DS) | this.iDrive;
*/
}
else if (!(this.regOutput & FDC.REG_OUTPUT.ENABLE)) {
/*
* When FDC.REG_OUTPUT.ENABLE transitions from 0 to 1, generate an interrupt.
*/
if (this.regOutput & FDC.REG_OUTPUT.INT_ENABLE) {
if (this.chipset) this.chipset.setIRR(ChipSet.IRQ.FDC);
}
}
/*
* This no longer updates the internally selected drive (this.iDrive) based on regOutput, because (a) there seems
* to be no point, as all drive-related commands include their own "drive select" bits, and (b) it breaks the
* MODEL_5170 boot code. Here's why:
*
* Unlike previous models, the MODEL_5170 BIOS probes all installed diskette drives to determine drive type;
* ie, FD360 (40-track) or FD1200 (80-track). So if there are two drives, the last selected drive will be drive 1.
* Immediately before booting, the BIOS issues an INT 0x13/AH=0 reset, which writes regOutput two times: first
* with FDC.REG_OUTPUT.ENABLE clear, and then with it set. However, both times, it ALSO loads the last selected
* drive number into regOutput's "drive select" bits.
*
* If we switched our selected drive to match regOutput, then the ST0 value we returned on an SENSE_INT command
* following the regOutput reset operation would indicate drive 1 instead of drive 0. But the BIOS requires
* the ST0 result from the SENSE_INT command ALWAYS be 0xC0 (not 0xC1), so the controller must not be propagating
* regOutput's "drive select" bits in the way I originally assumed.
*
* var iDrive = bOut & FDC.REG_OUTPUT.DS;
* if (bOut & (FDC.REG_OUTPUT.MOTOR_D0 << iDrive)) this.iDrive = iDrive;
*/
this.regOutput = bOut;
};
/**
* inFDCStatus(port, addrFrom)
*
* @this {FDC}
* @param {number} port (0x3F4, input only)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
FDC.prototype.inFDCStatus = function(port, addrFrom)
{
this.printMessageIO(port, null, addrFrom, "STATUS", this.regStatus);
return this.regStatus;
};
/**
* inFDCData(port, addrFrom)
*
* @this {FDC}
* @param {number} port (0x3F5, input/output)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
FDC.prototype.inFDCData = function(port, addrFrom)
{
var bIn = 0;
if (this.regDataIndex < this.regDataTotal) {
bIn = this.regDataArray[this.regDataIndex];
}
/*
* As per the discussion in doCmd(), once the first byte of the Result Phase has been read, the interrupt must be cleared.
*/
if (this.regOutput & FDC.REG_OUTPUT.INT_ENABLE) {
if (this.chipset) this.chipset.clearIRR(ChipSet.IRQ.FDC);
}
if (this.messageEnabled()) {
this.printMessageIO(port, null, addrFrom, "DATA[" + this.regDataIndex + "]", bIn);
}
if (++this.regDataIndex >= this.regDataTotal) {
this.regStatus &= ~(FDC.REG_STATUS.READ_DATA | FDC.REG_STATUS.BUSY);
this.regDataIndex = this.regDataTotal = 0;
}
return bIn;
};
/**
* outFDCData(port, bOut, addrFrom)
*
* @this {FDC}
* @param {number} port (0x3F5, input/output)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
FDC.prototype.outFDCData = function(port, bOut, addrFrom)
{
if (this.messageEnabled()) {
this.printMessageIO(port, bOut, addrFrom, "DATA[" + this.regDataTotal + "]");
}
if (this.regDataTotal < this.regDataArray.length) {
this.regDataArray[this.regDataTotal++] = bOut;
}
var bCmd = this.regDataArray[0];
var bCmdMasked = bCmd & FDC.REG_DATA.CMD.MASK;
if (FDC.aCmdInfo[bCmdMasked] !== undefined) {
if (this.regDataTotal >= FDC.aCmdInfo[bCmdMasked].cbReq) {
this.doCmd();
}
return;
}
if (DEBUG && this.messageEnabled()) {
this.printMessage("unsupported FDC command: " + str.toHexByte(bCmd));
this.dbg.stopCPU();
}
};
/**
* inFDCInput(port, addrFrom)
*
* @this {FDC}
* @param {number} port (0x3F7, input only, MODEL_5170 only)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
FDC.prototype.inFDCInput = function(port, addrFrom)
{
var bIn = this.regInput;
/*
* TODO: Determine when the DISK_CHANGE bit is *really* cleared (this is just a guess)
*/
this.regInput &= ~FDC.REG_INPUT.DISK_CHANGE;
this.printMessageIO(port, null, addrFrom, "INPUT", bIn);
return bIn;
};
/**
* outFDCControl(port, bOut, addrFrom)
*
* @this {FDC}
* @param {number} port (0x3F7, output only, MODEL_5170 only)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
FDC.prototype.outFDCControl = function(port, bOut, addrFrom)
{
this.printMessageIO(port, bOut, addrFrom, "CONTROL");
this.regControl = bOut;
};
/**
* doCmd()
*
* @this {FDC}
*/
FDC.prototype.doCmd = function()
{
var fIRQ = false;
this.regDataIndex = 0;
var bCmd = this.popCmd();
var drive, bDrive, bHead, c, h, r, n;
/*
* NOTE: We currently ignore the FDC.REG_DATA.CMD.SK, FDC.REG_DATA.CMD.MF and FDC.REG_DATA.CMD.MT bits of every command.
* The only command bit of possible interest down the road might be the FDC.REG_DATA.CMD.MT (Multi-Track); the rest relate
* to storage format details that we cannot emulate as long as our diskette images contain nothing more than sector
* data without any formatting data.
*
* Similarly, we ignore parameters like SRT, HUT, HLT and the like, since our "motors" don't require physical delays;
* however, if timing issues become compatibility issues, we'll have to revisit those delays. In any case, the maximum
* speed of the simulation will still be limited by various spin-loops in the ROM BIOS that wait prescribed times, so even
* with infinitely fast hardware, the simulation will never run as fast as it theoretically could, unless we opt to identify
* those spin-loops and either patch them or skip over them.
*/
var bCmdMasked = bCmd & FDC.REG_DATA.CMD.MASK;
switch (bCmdMasked) {
case FDC.REG_DATA.CMD.SPECIFY: // 0x03
this.popSRT(); // SRT and HUT (encodings?)
this.popHLT(); // HLT and ND (encodings?)
this.beginResult();
/*
* No results are provided by this command, and fIRQ should remain false
*/
break;
case FDC.REG_DATA.CMD.SENSE_DRIVE: // 0x04
bDrive = this.popCmd(FDC.TERMS.DS);
bHead = (bDrive >> 2) & 0x1;
this.iDrive = (bDrive & 0x3);
drive = this.aDrives[this.iDrive];
this.beginResult();
this.pushST3(drive);
break;
case FDC.REG_DATA.CMD.WRITE_DATA: // 0x05
case FDC.REG_DATA.CMD.READ_DATA: // 0x06
bDrive = this.popCmd(FDC.TERMS.DS); // Drive Select
bHead = (bDrive >> 2) & 0x1; // isolate HD (Head Select) bits
this.iDrive = (bDrive & 0x3); // isolate DS (Drive Select, aka Unit Select) bits
drive = this.aDrives[this.iDrive];
drive.bHead = bHead;
c = drive.bCylinder = this.popCmd(FDC.TERMS.C); // C
h = this.popCmd(FDC.TERMS.H); // H
/*
* Controller docs say that H should always match HD, so I assert that, but what if someone
* made a mistake and didn't program them identically -- what would happen? Which should we honor?
*/
this.assert(h == bHead);
r = drive.bSector = this.popCmd(FDC.TERMS.R); // R
n = this.popCmd(FDC.TERMS.N); // N
drive.nBytes = 128 << n; // 0 => 128, 1 => 256, 2 => 512, 3 => 1024
drive.bSectorEnd = this.popCmd(FDC.TERMS.EOT); // EOT (final sector number on a cylinder)
this.popCmd(FDC.TERMS.GPL); // GPL (spacing between sectors, excluding VCO Sync Field; 3)
this.popCmd(FDC.TERMS.DTL); // DTL (when N is 0, DTL stands for the data length to read out or write into the sector)
if (bCmdMasked == FDC.REG_DATA.CMD.READ_DATA)
this.doRead(drive);
else
this.doWrite(drive);
this.pushResults(drive, bCmd, bHead, c, h, r, n);
fIRQ = true;
break;
case FDC.REG_DATA.CMD.RECALIBRATE: // 0x07
bDrive = this.popCmd(FDC.TERMS.DS);
this.iDrive = (bDrive & 0x3);
drive = this.aDrives[this.iDrive];
drive.bCylinder = drive.bCylinderSeek = 0;
drive.resCode = FDC.REG_DATA.RES.SEEK_END | FDC.REG_DATA.RES.TRACK0;
this.beginResult(); // no results provided; this command is typically followed by FDC.REG_DATA.CMD.SENSE_INT
fIRQ = true;
break;
case FDC.REG_DATA.CMD.SENSE_INT: // 0x08
drive = this.aDrives[this.iDrive];
drive.bHead = 0; // this command is documented as ALWAYS returning a head address of 0 in ST0; see pushST0()
this.beginResult();
this.pushST0(drive);
this.pushResult(drive.bCylinder, FDC.TERMS.PCN);
/*
* For some strange reason, the "DISK_RESET" function in the MODEL_5170_REV3 BIOS resets the
* adapter and then issues FOUR -- that's right, not ONE but FOUR -- SENSE INTERRUPT STATUS commands
* in a row, and expects ST0 to contain a different drive number after each command (first 0, then 1,
* then 2, and finally 3). What makes this doubly weird is SENSE INTERRUPT STATUS (unlike SENSE
* DRIVE STATUS) is a drive-agnostic command.
*
* Didn't the original PC AT "HFCOMBO" controller limit support to TWO diskette drives max?
* And even if the PC AT supported other FDC controllers that DID support up to FOUR diskette drives,
* why should "DISK_RESET" hard-code a 4-drive loop?
*
* Well, whatever. All this head-scratching doesn't change the fact that I apparently have to
* "auto-increment" the internal drive number (this.iDrive) after each SENSE INTERRUPT STATUS command.
*/
this.iDrive = (this.iDrive + 1) & 0x3;
/*
* No interrupt is generated by this command, so fIRQ should remain false.
*/
break;
case FDC.REG_DATA.CMD.READ_ID: // 0x0A
/*
* This command is used by "SETUP_DBL" in the MODEL_5170_REV3 BIOS to determine if a double-density
* (40-track) diskette has been inserted in a high-density (80-track) drive; ie, whether "double stepping"
* is required, since only 40 of the 80 possible "steps" are valid for a double-density diskette.
*
* To start, we'll focus on making this work in the normal case (80-track diskette in 80-track drive).
*/
bDrive = this.popCmd(FDC.TERMS.DS);
bHead = (bDrive >> 2) & 0x1;
this.iDrive = (bDrive & 0x3);
drive = this.aDrives[this.iDrive];
c = drive.bCylinder;
h = drive.bHead = bHead;
r = drive.bSector = 1;
n = 0;
drive.resCode = FDC.REG_DATA.RES.NONE;
if (drive.disk && (drive.sector = drive.disk.seek(drive.bCylinder, drive.bHead, drive.bSector))) {
n = drive.sector.length;
} else {
/*
* TODO: Determine the appropriate response code(s) for the possible errors that can occur here.
*/
drive.resCode = FDC.REG_DATA.RES.NOT_READY | FDC.REG_DATA.RES.INCOMPLETE;
}
this.pushResults(drive, bCmd, bHead, c, h, r, n);
fIRQ = true;
break;
case FDC.REG_DATA.CMD.FORMAT_TRACK: // 0x0D
bDrive = this.popCmd(FDC.TERMS.DS);
bHead = (bDrive >> 2) & 0x1;
this.iDrive = (bDrive & 0x3);
drive = this.aDrives[this.iDrive];
c = drive.bCylinder;
h = drive.bHead = bHead;
r = 1;
n = this.popCmd(FDC.TERMS.N); // N
drive.nBytes = 128 << n; // 0 => 128, 1 => 256, 2 => 512, 3 => 1024 (bytes/sector)
drive.bSectorEnd = this.popCmd(FDC.TERMS.SC); // SC (sectors/track)
this.popCmd(FDC.TERMS.GPL); // GPL (spacing between sectors, excluding VCO Sync Field; 3)
drive.bFiller = this.popCmd(FDC.TERMS.D); // D (filler byte)
this.doFormat(drive);
this.pushResults(drive, bCmd, bHead, c, h, r, n);
fIRQ = true;
break;
case FDC.REG_DATA.CMD.SEEK: // 0x0F
bDrive = this.popCmd(FDC.TERMS.DS);
bHead = (bDrive >> 2) & 0x1;
this.iDrive = (bDrive & 0x3);
drive = this.aDrives[this.iDrive];
drive.bHead = bHead;
/*
* As discussed in initDrive(), we can no longer simply set bCylinder to the specified NCN;
* instead, we must calculate the delta between bCylinderSeek and the NCN, and adjust bCylinder
* by that amount. Then we simply move the NCN into bCylinderSeek without any range checking.
*
* Since bCylinder is now expressly defined as the "physical" cylinder number, it must never
* be allowed to exceed the physical boundaries of the drive (ie, never lower than 0, and never
* greater than or equal to nCylinders).
*/
c = this.popCmd(FDC.TERMS.NCN);
drive.bCylinder += c - drive.bCylinderSeek;
if (drive.bCylinder < 0) drive.bCylinder = 0;
if (drive.bCylinder >= drive.nCylinders) drive.bCylinder = drive.nCylinders - 1;
drive.bCylinderSeek = c;
drive.resCode = FDC.REG_DATA.RES.SEEK_END;
/*
* TODO: To properly support ALL the ST3 result bits (not just TRACK0), we need a resCode
* update() function that all FDC commands can use. This code is merely sufficient to get us
* through the "DSKETTE_SETUP" gauntlet in the MODEL_5170 BIOS.
*/
if (!drive.bCylinder) {
drive.resCode |= FDC.REG_DATA.RES.TRACK0;
}
this.beginResult(); // like FDC.REG_DATA.CMD.RECALIBRATE, no results are provided
fIRQ = true;
break;
default:
if (DEBUG && this.messageEnabled()) {
this.printMessage("FDC operation unsupported (command=" + str.toHexByte(bCmd) + ")");
this.dbg.stopCPU();
}
break;
}
if (this.regDataTotal > 0) this.regStatus |= (FDC.REG_STATUS.READ_DATA | FDC.REG_STATUS.BUSY);
/*
* After the Execution Phase (eg, DMA Terminal Count has occurred, or the EOT sector has been read/written),
* an interrupt is supposed to occur, signaling the beginning of the Result Phase. Once the first byte of the
* result has been read, the interrupt is cleared (see inFDCData).
*
* TODO: Technically, interrupt request status should be cleared by the FDC.REG_DATA.CMD.SENSE_INT command; in fact,
* if that command is issued and no interrupt was pending, then FDC.REG_DATA.RES.INVALID should be returned (via ST0).
*/
if (this.regOutput & FDC.REG_OUTPUT.INT_ENABLE) {
if (drive && !(drive.resCode & FDC.REG_DATA.RES.NOT_READY) && fIRQ) {
if (this.chipset) this.chipset.setIRR(ChipSet.IRQ.FDC);
}
}
};
/**
* pushResults(drive, bCmd, bHead, c, h, r, n)
*
* @param {Object} drive
* @param {number} bCmd
* @param {number} bHead
* @param {number} c
* @param {number} h
* @param {number} r
* @param {number} n
*/
FDC.prototype.pushResults = function(drive, bCmd, bHead, c, h, r, n)
{
this.beginResult();
this.pushST0(drive);
this.pushST1(drive);
this.pushST2(drive);
/*
* NOTE: I used to set the following C/H/R/N results using the values that advanceSector() had "advanced"
* them to, which seemed logical but was technically incorrect. For non-multi-track reads, they should match
* the programmed C/H/R/N values, except when EOT has been reached, in which case C = C + 1 and R = 1.
*
* For multi-track, the LSB of H should be complemented whenever EOT has been reached, which I "informally"
* detect by testing if the drive's current bCylinder and/or bHead positions advanced to a new cylinder or head,
* and apparently, C should never be advanced if H was initially 0.
*
* I don't do strict EOT comparisons here or elsewhere, because it allows the controller to work with a wider
* range of disks (eg, "fake" XDF disk images that contain 23 512-byte sectors/track).
*/
var i = 0;
if (c != drive.bCylinder || h != drive.bHead) {
i = r = 1;
}
if (bCmd & FDC.REG_DATA.CMD.MT) {
h ^= i;
if (!bHead) i = 0;
}
c += i;
this.pushResult(c, FDC.TERMS.C); // formerly drive.bCylinder
this.pushResult(h, FDC.TERMS.H); // formerly drive.bHead
this.pushResult(r, FDC.TERMS.R); // formerly drive.bSector
this.pushResult(n, FDC.TERMS.N);
};
/**
* popCmd(name)
*
* @this {FDC}
* @param {string|undefined} [name]
* @return {number}
*/
FDC.prototype.popCmd = function(name)
{
this.assert((!this.regDataIndex || name !== undefined) && this.regDataIndex < this.regDataTotal);
var bCmd = this.regDataArray[this.regDataIndex];
if (DEBUG && this.messageEnabled(Messages.PORT | Messages.FDC)) {
var bCmdMasked = bCmd & FDC.REG_DATA.CMD.MASK;
if (!name && !this.regDataIndex && FDC.aCmdInfo[bCmdMasked]) name = FDC.aCmdInfo[bCmdMasked].name;
this.printMessage("FDC.CMD[" + (name || this.regDataIndex) + "]: " + str.toHexByte(bCmd), true);
}
this.regDataIndex++;
return bCmd;
};
/**
* popHLT()
*
* NOTE: This byte is actually a combination of HLT (Head Load Time) and ND (Non-DMA Mode)
*
* @this {FDC}
*/
FDC.prototype.popHLT = function()
{
this.popCmd(FDC.TERMS.HLT);
// this.nHLT = this.popCmd(FDC.TERMS.HLT);
};
/**
* popSRT()
*
* NOTE: This byte is actually a combination of SRT (Step Rate Time) and HUT (Head Unload Time)
*
* @this {FDC}
*/
FDC.prototype.popSRT = function()
{
this.popCmd(FDC.TERMS.SRT);
// this.nSRT = this.popCmd(FDC.TERMS.SRT);
};
/**
* beginResult()
*
* @this {FDC}
*/
FDC.prototype.beginResult = function()
{
this.regDataIndex = this.regDataTotal = 0;
};
/**
* pushResult(bResult, name)
*
* @this {FDC}
* @param {number} bResult
* @param {string|undefined} [name]
*/
FDC.prototype.pushResult = function(bResult, name)
{
if (DEBUG && this.messageEnabled(Messages.PORT | Messages.FDC)) {
this.printMessage("FDC.RES[" + (name || this.regDataTotal) + "]: " + str.toHexByte(bResult), true);
}
this.regDataArray[this.regDataTotal++] = bResult;
};
/**
* pushST0(drive)
*
* @this {FDC}
* @param {Object} drive
*/
FDC.prototype.pushST0 = function(drive)
{
this.pushResult(drive.iDrive | (drive.bHead << 2) | (drive.resCode & FDC.REG_DATA.RES.ST0), FDC.TERMS.ST0);
};
/**
* pushST1(drive)
*
* @this {FDC}
* @param {Object} drive
*/
FDC.prototype.pushST1 = function(drive)
{
this.pushResult((drive.resCode & FDC.REG_DATA.RES.ST1) >>> 8, FDC.TERMS.ST1);
};
/**
* pushST2(drive)
*
* @this {FDC}
* @param {Object} drive
*/
FDC.prototype.pushST2 = function(drive)
{
this.pushResult((drive.resCode & FDC.REG_DATA.RES.ST2) >>> 16, FDC.TERMS.ST2);
};
/**
* pushST3(drive)
*
* @this {FDC}
* @param {Object} drive
*/
FDC.prototype.pushST3 = function(drive)
{
this.pushResult((drive.resCode & FDC.REG_DATA.RES.ST3) >>> 24, FDC.TERMS.ST3);
};
/**
* dmaRead(drive, b, done)
*
* @this {FDC}
* @param {Object} drive
* @param {number} b
* @param {function(number,boolean)} done
*/
FDC.prototype.dmaRead = function(drive, b, done)
{
if (b === undefined || b < 0) {
this.readData(drive, done);
return;
}
/*
* The DMA controller should be ASKING for data, not GIVING us data; this suggests an internal DMA miscommunication
*/
if (DEBUG) this.printMessage("dmaRead(): invalid DMA acknowledgement");
done(-1, false);
};
/**
* dmaWrite(drive, b)
*
* @this {FDC}
* @param {Object} drive
* @param {number} b
* @return {number}
*/
FDC.prototype.dmaWrite = function(drive, b)
{
if (b !== undefined && b >= 0)
return this.writeData(drive, b);
/*
* The DMA controller should be GIVING us data, not ASKING for data; this suggests an internal DMA miscommunication
*/
if (DEBUG) this.printMessage("dmaWrite(): invalid DMA acknowledgement");
return -1;
};
/**
* dmaFormat(drive, b)
*
* @this {FDC}
* @param {Object} drive
* @param {number} b
* @returns {number}
*/
FDC.prototype.dmaFormat = function(drive, b)
{
if (b !== undefined && b >= 0)
return this.writeFormat(drive, b);
/*
* The DMA controller should be GIVING us data, not ASKING for data; this suggests an internal DMA miscommunication
*/
if (DEBUG) this.printMessage("dmaFormat(): invalid DMA acknowledgement");
return -1;
};
/**
* doRead(drive)
*
* @this {FDC}
* @param {Object} drive
*/
FDC.prototype.doRead = function(drive)
{
/*
* With only NOT_READY and INCOMPLETE set, an empty drive causes DOS to report "General Failure";
* with the addition of NO_DATA, DOS reports "Sector not found". The traditional "Drive not ready"
* error message is not triggered by anything we return here, but simply by BIOS commands timing out.
*/
drive.resCode = FDC.REG_DATA.RES.NOT_READY | FDC.REG_DATA.RES.INCOMPLETE;
if (drive.disk) {
if (DEBUG && this.messageEnabled()) {
this.printMessage("FDC.doRead(CHS=" + drive.bCylinder + ':' + drive.bHead + ':' + drive.bSector + ",PBA=" + (drive.bCylinder * (drive.disk.nHeads * drive.disk.nSectors) + drive.bHead * drive.disk.nSectors + drive.bSector-1) + ')');
}
drive.sector = null;
drive.resCode = FDC.REG_DATA.RES.NONE;
if (this.chipset) {
this.chipset.connectDMA(ChipSet.DMA_FDC, this, 'dmaRead', drive);
this.chipset.requestDMA(ChipSet.DMA_FDC);
}
}
};
/**
* doWrite(drive)
*
* @this {FDC}
* @param {Object} drive
*/
FDC.prototype.doWrite = function(drive)
{
drive.resCode = FDC.REG_DATA.RES.NOT_READY | FDC.REG_DATA.RES.INCOMPLETE;
if (drive.disk) {
if (DEBUG && this.messageEnabled()) {
this.printMessage("FDC.doWrite(CHS=" + drive.bCylinder + ':' + drive.bHead + ':' + drive.bSector + ",PBA=" + (drive.bCylinder * (drive.disk.nHeads * drive.disk.nSectors) + drive.bHead * drive.disk.nSectors + drive.bSector-1) + ')');
}
if (drive.disk.fWriteProtected) {
drive.resCode = FDC.REG_DATA.RES.NOT_WRITABLE | FDC.REG_DATA.RES.INCOMPLETE;
return;
}
drive.sector = null;
drive.resCode = FDC.REG_DATA.RES.NONE;
if (this.chipset) {
this.chipset.connectDMA(ChipSet.DMA_FDC, this, 'dmaWrite', drive);
this.chipset.requestDMA(ChipSet.DMA_FDC);
}
}
};
/**
* doFormat(drive)
*
* drive is initialized by doCmd() to the following extent:
*
* drive.bHead (ignored)
* drive.nBytes (bytes/sector)
* drive.bSectorEnd (sectors/track)
* drive.bFiller (fill byte)
*
* and we expect the DMA controller to provide C, H, R and N (ie, 4 bytes) for each sector to be formatted.
*
* @this {FDC}
* @param {Object} drive
*/
FDC.prototype.doFormat = function(drive)
{
drive.resCode = FDC.REG_DATA.RES.NOT_READY | FDC.REG_DATA.RES.INCOMPLETE;
if (drive.disk) {
drive.sector = null;
drive.resCode = FDC.REG_DATA.RES.NONE;
if (this.chipset) {
drive.cbFormat = 0;
drive.abFormat = new Array(4);
drive.bFormatting = true;
drive.cSectorsFormatted = 0;
this.chipset.connectDMA(ChipSet.DMA_FDC, this, 'dmaFormat', drive);
this.chipset.requestDMA(ChipSet.DMA_FDC);
drive.bFormatting = false;
}
}
};
/**
* readData(drive, done)
*
* The following drive properties must have been setup prior to our first call:
*
* drive.bHead
* drive.bCylinder
* drive.bSector
* drive.sector (initialized to null)
*
* On the first readData() request, since drive.sector will be null, we ask the Disk object to look
* up the first sector of the request. We then ask the Disk for bytes from that sector until the sector
* is exhausted, and then we look up the next sector and continue the process.
*
* NOTE: Since the FDC isn't aware of the extent of the transfer, all readData() can do is return bytes
* until the current track (or, in the case of a multi-track request, the current cylinder) has been exhausted.
*
* TODO: Research the requirements, if any, for multi-track I/O and determine what else needs to be done.
*
* @this {FDC}
* @param {Object} drive
* @param {function(number,boolean,Object,number)} done (number is next available byte from drive, or -1 if no more bytes available)
*/
FDC.prototype.readData = function(drive, done)
{
var b = -1;
var obj = null, off = 0; // these variables are purely for BACKTRACK purposes
if (!drive.resCode && drive.disk) {
do {
if (drive.sector) {
off = drive.ibSector;
if ((b = drive.disk.read(drive.sector, drive.ibSector++)) >= 0) {
obj = drive.sector;
break;
}
}
/*
* Locate the next sector, and then try reading again.
*/
drive.sector = drive.disk.seek(drive.bCylinder, drive.bHead, drive.bSector);
if (!drive.sector) {
drive.resCode = FDC.REG_DATA.RES.NO_DATA | FDC.REG_DATA.RES.INCOMPLETE;
break;
}
drive.ibSector = 0;
/*
* We "pre-advance" bSector et al now, instead of waiting to advance it right before the seek().
* This allows the initial call to readData() to perform a seek without triggering an unwanted advance.
*/
this.advanceSector(drive);
} while (true);
}
done(b, false, obj, off);
};
/**
* writeData(drive, b)
*
* The following drive properties must have been setup prior to our first call:
*
* drive.bHead
* drive.bCylinder
* drive.bSector
* drive.sector (initialized to null)
*
* On the first writeData() request, since drive.sector will be null, we ask the Disk object to look
* up the first sector of the request. We then send the Disk bytes for that sector until the sector
* is full, and then we look up the next sector and continue the process.
*
* NOTE: Since the FDC isn't aware of the extent of the transfer, all writeData() can do is accept bytes
* until the current track (or, in the case of a multi-track request, the current cylinder) has been exhausted.
*
* TODO: Research the requirements, if any, for multi-track I/O and determine what else needs to be done.
*
* @this {FDC}
* @param {Object} drive
* @param {number} b containing next byte to write
* @return {number} (b unchanged; return -1 if command should be terminated)
*/
FDC.prototype.writeData = function(drive, b)
{
if (drive.resCode || !drive.disk) return -1;
do {
if (drive.sector) {
if (drive.disk.write(drive.sector, drive.ibSector++, b))
break;
}
/*
* Locate the next sector, and then try writing again.
*/
drive.sector = drive.disk.seek(drive.bCylinder, drive.bHead, drive.bSector);
if (!drive.sector) {
/*
* TODO: Determine whether this should be FDC.REG_DATA.RES.CRC_ERROR or FDC.REG_DATA.RES.DATA_FIELD
*/
drive.resCode = FDC.REG_DATA.RES.CRC_ERROR | FDC.REG_DATA.RES.INCOMPLETE;
b = -1;
break;
}
drive.ibSector = 0;
/*
* We "pre-advance" bSector et al now, instead of waiting to advance it right before the seek().
* This allows the initial call to writeData() to perform a seek without triggering an unwanted advance.
*/
this.advanceSector(drive);
} while (true);
return b;
};
/**
* advanceSector(drive)
*
* This increments the sector number; when the sector number reaches drive.nDiskSectors on the current track, we
* increment drive.bHead and reset drive.bSector, and when drive.bHead reaches drive.nDiskHeads, we reset drive.bHead
* and increment drive.bCylinder.
*
* @this {FDC}
* @param {Object} drive
*/
FDC.prototype.advanceSector = function(drive)
{
this.assert(drive.bCylinder < drive.nDiskCylinders);
drive.bSector++;
var bSectorStart = 1;
if (drive.bSector >= drive.nDiskSectors + bSectorStart) {
drive.bSector = bSectorStart;
drive.bHead++;
if (drive.bHead >= drive.nDiskHeads) {
drive.bHead = 0;
drive.bCylinder++;
}
}
};
/**
* writeFormat(drive, b)
*
* @this {FDC}
* @param {Object} drive
* @param {number} b containing a format command byte
* @return {number} (b if successful, -1 if command should be terminated)
*/
FDC.prototype.writeFormat = function(drive, b)
{
if (drive.resCode) return -1;
drive.abFormat[drive.cbFormat++] = b;
if (drive.cbFormat == drive.abFormat.length) {
drive.bCylinder = drive.abFormat[0]; // C
drive.bHead = drive.abFormat[1]; // H
drive.bSector = drive.abFormat[2]; // R
drive.nBytes = 128 << drive.abFormat[3];// N (0 => 128, 1 => 256, 2 => 512, 3 => 1024)
drive.cbFormat = 0;
if (DEBUG && this.messageEnabled()) {
this.printMessage("writeFormat(head=" + str.toHexByte(drive.bHead) + ",cyl=" + str.toHexByte(drive.bCylinder) + ",sec=" + str.toHexByte(drive.bSector) + ",len=" + str.toHexWord(drive.nBytes) + ")");
}
for (var i = 0; i < drive.nBytes; i++) {
if (this.writeData(drive, drive.bFiller) < 0) {
return -1;
}
}
drive.cSectorsFormatted++;
}
if (drive.cSectorsFormatted >= drive.bSectorEnd) b = -1;
return b;
};
/*
* Port input notification table
*
* TODO: Even though port 0x3F7 was not present on controllers prior to MODEL_5170, I'm taking the easy
* way out and always emulating it. So, consider an FDC parameter to disable that feature for stricter compatibility.
*/
FDC.aPortInput = {
0x3F4: FDC.prototype.inFDCStatus,
0x3F5: FDC.prototype.inFDCData,
0x3F7: FDC.prototype.inFDCInput
};
/*
* Port output notification table
*
* TODO: Even though port 0x3F7 was not present on controllers prior to MODEL_5170, I'm taking the easy
* way out and always emulating it. So, consider an FDC parameter to disable that feature for stricter compatibility.
*/
FDC.aPortOutput = {
0x3F2: FDC.prototype.outFDCOutput,
0x3F5: FDC.prototype.outFDCData,
0x3F7: FDC.prototype.outFDCControl
};
/**
* FDC.init()
*
* This function operates on every HTML element of class "fdc", extracting the
* JSON-encoded parameters for the FDC constructor from the element's "data-value"
* attribute, invoking the constructor to create a FDC component, and then binding
* any associated HTML controls to the new component.
*/
FDC.init = function() {
var aeFDC = Component.getElementsByClass(window.document, PCJSCLASS, "fdc");
for (var iFDC = 0; iFDC < aeFDC.length; iFDC++) {
var eFDC = aeFDC[iFDC];
var parmsFDC = Component.getComponentParms(eFDC);
var fdc = new FDC(parmsFDC);
Component.bindComponentControls(fdc, eFDC, PCJSCLASS);
}
};
/*
* Initialize every Floppy Drive Controller (FDC) module on the page.
*/
web.onInit(FDC.init);
if (typeof module !== 'undefined') module.exports = FDC;
/**
* @fileoverview Implements the PCjs Hard Drive Controller (HDC) component.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-Nov-26
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
if (typeof module !== 'undefined') {
var str = require("../../shared/lib/strlib");
var web = require("../../shared/lib/weblib");
var DiskAPI = require("../../shared/lib/diskapi");
var Component = require("../../shared/lib/component");
var Messages = require("./messages");
var ChipSet = require("./chipset");
var Disk = require("./disk");
var State = require("./state");
}
/**
* HDC(parmsHDC)
*
* The HDC component simulates an STC-506/412 interface to an IBM-compatible fixed disk drive. The first
* such drive was a 10Mb 5.25-inch drive containing two platters and 4 heads. Data spanned 306 cylinders
* for a total of 1224 tracks, with 17 sectors/track and 512 bytes/sector. Support has since been expanded
* to include the original PC AT Western Digital controller.
*
* HDC supports the following component-specific properties:
*
* drives: an array of driveConfig objects, each containing 'name', 'path', 'size' and 'type' properties
* type: either 'xt' (for the PC XT Xebec controller) or 'at' (for the PC AT Western Digital controller)
*
* The 'type' parameter defaults to 'xt'. All ports for the PC XT controller are referred to as XTC ports,
* and similarly, all PC AT controller ports are referred to as ATC ports.
*
* If 'path' is empty, a scratch disk image is created; otherwise, we make a note of the path, but we will NOT
* pre-load it like we do for floppy disk images.
*
* My current plan is to read all disk data on-demand, keeping a cache of what we've read, and possibly adding
* some read-ahead as well. Any portions of the disk image that are written before being read will never be read.
*
* TRIVIA: On p.1-179 of the PC XT Technical Reference Manual (revised APR83), it reads:
*
* "WARNING: The last cylinder on the fixed disk drive is reserved for diagnostic use.
* Diagnostic write tests will destroy any data on this cylinder."
*
* Does FDISK insure that the last cylinder is reserved? I'm sure we'll eventually find out.
*
* @constructor
* @extends Component
* @param {Object} parmsHDC
*/
function HDC(parmsHDC) {
Component.call(this, "HDC", parmsHDC, HDC, Messages.HDC);
this['dmaRead'] = this.dmaRead;
this['dmaWrite'] = this.dmaWrite;
this['dmaWriteBuffer'] = this.dmaWriteBuffer;
this['dmaWriteFormat'] = this.dmaWriteFormat;
this.aDriveConfigs = [];
if (parmsHDC['drives']) {
try {
/*
* The most likely source of any exception will be right here, where we're parsing
* the JSON-encoded drive data.
*/
this.aDriveConfigs = eval("(" + parmsHDC['drives'] + ")");
/*
* Nothing more to do with aDriveConfigs now. initController() and autoMount() (if there are
* any disk image "path" properties to process) will take care of the rest.
*/
} catch (e) {
Component.error("HDC drive configuration error: " + e.message + " (" + parmsHDC['drives'] + ")");
}
}
/*
* Set fATC (AT Controller flag) according to the 'type' parameter. This in turn determines other
* defaults. For example, the default XT drive type is 3 (for a 10Mb disk drive), whereas the default
* AT drive type is 2 (for a 20Mb disk drive).
*/
this.fATC = (parmsHDC['type'] == "at");
this.iHDC = this.fATC? 1 : 0;
this.iDriveTypeDefault = this.fATC? 2 : 3;
/*
* The remainder of HDC initialization now takes place in our initBus() handler
*/
}
Component.subclass(HDC);
/*
* HDC defaults, in case drive parameters weren't specified
*/
HDC.DEFAULT_DRIVE_NAME = "Hard Drive";
/*
* Each of the following DriveType entries contain (up to) 4 values:
*
* [0]: total cylinders
* [1]: total heads
* [2]: total sectors/tracks (optional; default is 17)
* [3]: total bytes/sector (optional; default is 512)
*
* verifyDrive() attempts to confirm that these values agree with the programmed drive characteristics.
*/
HDC.aDriveTypes = [
{
0x00: [306, 2],
0x01: [375, 8],
0x02: [306, 6],
0x03: [306, 4] // 10Mb (default XTC drive type)
},
/*
* Sadly, drive types differ across controller models (XTC drive types don't match ATC drive types),
* so aDriveTypes must first be indexed by a controller index (this.iHDC).
*
* The following is a more complete description of the drive types supported by the MODEL_5170, where C is
* Cylinders, H is Heads, WP is Write Pre-Comp, and LZ is Landing Zone (in practice, we don't need WP or LZ).
*
* Type C H WP LZ
* ---- --- -- --- ---
* 1 306 4 128 305
* 2 615 4 300 615
* 3 615 6 300 615
* 4 940 8 512 940
* 5 940 6 512 940
* 6 615 4 no 615
* 7 462 8 256 511
* 8 733 5 no 733
* 9 900 15 no8 901
* 10 820 3 no 820
* 11 855 5 no 855
* 12 855 7 no 855
* 13 306 8 128 319
* 14 733 7 no 733
* 15 (reserved--all zeros)
*/
{
0x01: [306, 4], // 10Mb
0x02: [615, 4], // 20Mb (default ATC drive type)
0x03: [615, 6],
0x04: [940, 8],
0x05: [940, 6],
0x06: [615, 4],
0x07: [462, 8],
0x08: [733, 5],
0x09: [900,15],
0x0A: [820, 3],
0x0B: [855, 5],
0x0C: [855, 7],
0x0D: [306, 8],
0x0E: [733, 7]
}
];
/*
* ATC (AT Controller) Registers
*
* The "IBM Personal Computer AT Fixed Disk and Diskette Drive Adapter", aka the HFCOMBO card, contains what we refer
* to here as the ATC (AT Controller). Even though that card contains both Fixed Disk and Diskette Drive controllers,
* this component (HDC) still deals only with the "Fixed Disk" portion. Fortunately, the "Diskette Drive Adapter"
* portion of the card is compatible with the existing FDC component, so that component continues to be responsible
* for all diskette operations.
*
* ATC ports default to their primary addresses; secondary port addresses are 0x80 lower (eg, 0x170 instead of 0x1F0).
*
* It's important to know that the MODEL_5170 BIOS has a special relationship with the "Combo Hard File/Diskette
* (HFCOMBO) Card" (see @F000:144C). Initially, the ChipSet component intercepted reads for HFCOMBO's STATUS port
* and returned the BUSY bit clear to reduce boot time; however, it turned out that was also a prerequisite for the
* BIOS to write test patterns to the CYLLO port and set the "DUAL" bit (bit 0) of the "HFCNTRL" byte at 40:8Fh if
* those CYLLO operations succeeded (now that the HDC is "ATC-aware", those ChipSet port intercepts have been removed).
*
* Without the "DUAL" bit set, when it came time later to report the diskette drive type, the "DISK_TYPE" function
* (@F000:273D) would branch to one of two almost-identical blocks of code -- specifically, a block that disallowed
* diskette drive types >= 2 (ChipSet.CMOS.FDRIVE.FD360) instead of >= 3 (ChipSet.CMOS.FDRIVE.FD1200).
*
* In other words, the "Fixed Disk" portion of the HFCOMBO controller has to be present and operational if the user
* wants to use high-capacity (80-track) diskettes with "Diskette Drive" portion of the controller. This may not be
* immediately obvious to anyone creating a 5170 machine configuration with the FDC component but no HDC component.
*
* TODO: Investigate what a MODEL_5170 can do, if anything, with diskettes if an "HFCOMBO card" was NOT installed
* (eg, was there Diskette-only Controller that could be installed, and if so, did it support high-capacity diskettes?)
* Also, consider making the FDC component able to detect when the HDC is missing and provide the same minimal HFCOMBO
* port intercepts that ChipSet once provided (this is not a compatibility requirement, just a usability improvement).
*/
HDC.ATC = {
DATA: { PORT: 0x1F0}, // no register (read-write)
DIAG: { // this.regError (read-only)
PORT: 0x1F1,
NO_ERROR: 0x01,
CTRL_ERROR: 0x02,
SEC_ERROR: 0x03,
ECC_ERROR: 0x04,
PROC_ERROR: 0x05
},
ERROR: { // this.regError (read-only)
PORT: 0x1F1,
NONE: 0x00,
NO_DAM: 0x01, // Data Address Mark (DAM) not found
NO_TRK0: 0x02, // Track 0 not detected
CMD_ABORT: 0x04, // Aborted Command
NO_CHS: 0x10, // ID field with the specified C:H:S not found
ECC_ERR: 0x40, // Data ECC Error
BAD_BLOCK: 0x80 // Bad Block Detect
},
WPREC: { PORT: 0x1F1}, // this.regWPreC (write-only)
SECCNT: { PORT: 0x1F2}, // this.regSecCnt (read-write; 0 implies a 256-sector request)
SECNUM: { PORT: 0x1F3}, // this.regSecNum (read-write)
CYLLO: { PORT: 0x1F4}, // this.regCylLo (read-write; all 8 bits are used)
CYLHI: { // this.regCylHi (read-write; only bits 0-1 are used, for a total of 10 bits, or 1024 max cylinders)
PORT: 0x1F5,
MASK: 0x03
},
DRVHD: { // this.regDrvHd (read-write)
PORT: 0x1F6,
HEAD_MASK: 0x0F, // set this to the max number of heads before issuing a SET PARAMETERS command
DRIVE_MASK: 0x10,
SET_MASK: 0xE0,
SET_BITS: 0xA0 // for whatever reason, these bits must always be set
},
STATUS: { // this.regStatus (read-only; reading clears IRQ.ATC)
PORT: 0x1F7,
BUSY: 0x80, // if this is set, no other STATUS bits are valid
READY: 0x40, // if this is set (along with the SEEK_OK bit), the drive is ready to read/write/seek again
WFAULT: 0x20, // write fault
SEEK_OK: 0x10, // seek operation complete
DATA_REQ: 0x08, // indicates that "the sector buffer requires servicing during a Read or Write command. If either bit 7 (BUSY) or this bit is active, a command is being executed. Upon receipt of any command, this bit is reset."
CORRECTED: 0x04,
INDEX: 0x02, // set once for every revolution of the disk
ERROR: 0x01 // set when the previous command ended in an error; one or more bits are set in the ERROR register (the next command to the controller resets the ERROR bit)
},
COMMAND: { // this.regCommand (write-only)
PORT: 0x1F7,
RESTORE: 0x10, // low nibble x 500us equal stepping rate (except for 0, which corresponds to 35us) (aka RECALIBRATE)
READ_DATA: 0x20, // also supports NO_RETRIES and WITH_ECC
WRITE_DATA: 0x30, // also supports NO_RETRIES and WITH_ECC
READ_VERF: 0x40, // also supports NO_RETRIES
FORMAT_TRK: 0x50,
SEEK: 0x70, // low nibble x 500us equal stepping rate (except for 0, which corresponds to 35us)
DIAGNOSE: 0x90,
SETPARMS: 0x91,
NO_RETRIES: 0x01,
WITH_ECC: 0x02,
MASK: 0xF0
},
FDR: { // this.regFDR
PORT: 0x3F6,
INT_DISABLE: 0x02, // a logical 0 enables fixed disk interrupts
RESET: 0x04, // a logical 1 enables reset fixed disk function
HS3: 0x08, // a logical 1 enables head select 3 (a logical 0 enables reduced write current)
RESERVED: 0xF1
}
};
/*
* XTC (XT Controller) Registers
*/
HDC.XTC = {
/*
* XTC Data Register (0x320, read-write)
*
* Writes to this register are discussed below; see HDC Commands.
*
* Reads from this register after a command has been executed retrieve a "status byte",
* which must NOT be confused with the Status Register (see below). This data "status byte"
* contains only two bits of interest: XTC.DATA.STATUS.ERROR and XTC.DATA.STATUS.UNIT.
*/
DATA: {
PORT: 0x320, // port address
STATUS: {
OK: 0x00, // no error
ERROR: 0x02, // error occurred during command execution
UNIT: 0x20 // logical unit number of the drive
},
/*
* XTC Commands, as issued to XTC_DATA
*
* Commands are multi-byte sequences sent to XTC_DATA, starting with a XTC_DATA.CMD byte,
* and followed by 5 more bytes, for a total of 6 bytes, which collectively are called a
* Device Control Block (DCB). Not all commands use all 6 bytes, but all 6 bytes must be present;
* unused bytes are simply ignored.
*
* XTC_DATA.CMD (3-bit class code, 5-bit operation code)
* XTC_DATA.HEAD (1-bit drive number, 5-bit head number)
* XTC_DATA.CLSEC (upper bits of 10-bit cylinder number, 6-bit sector number)
* XTC_DATA.CH (lower bits of 10-bit cylinder number)
* XTC_DATA.COUNT (8-bit interleave or block count)
* XTC_DATA.CTRL (8-bit control field)
*
* One command, HDC.XTC.DATA.CMD.INIT_DRIVE, must include 8 additional bytes following the DCB:
*
* maximum number of cylinders (high)
* maximum number of cylinders (low)
* maximum number of heads
* start reduced write current cylinder (high)
* start reduced write current cylinder (low)
* start write precompensation cylinder (high)
* start write precompensation cylinder (low)
* maximum ECC data burst length
*
* Note that the 3 word values above are stored in "big-endian" format (high byte followed by low byte),
* rather than the more typical "little-endian" format (low byte followed by high byte).
*/
CMD: {
TEST_READY: 0x00, // Test Drive Ready
RECALIBRATE: 0x01, // Recalibrate
REQUEST_SENSE: 0x03, // Request Sense Status
FORMAT_DRIVE: 0x04, // Format Drive
READ_VERF: 0x05, // Read Verify
FORMAT_TRK: 0x06, // Format Track
FORMAT_BAD: 0x07, // Format Bad Track
READ_DATA: 0x08, // Read
WRITE_DATA: 0x0A, // Write
SEEK: 0x0B, // Seek
INIT_DRIVE: 0x0C, // Initialize Drive Characteristics
READ_ECC_BURST: 0x0D, // Read ECC Burst Error Length
READ_BUFFER: 0x0E, // Read Data from Sector Buffer
WRITE_BUFFER: 0x0F, // Write Data to Sector Buffer
RAM_DIAGNOSTIC: 0xE0, // RAM Diagnostic
DRV_DIAGNOSTIC: 0xE3, // HDC BIOS: CHK_DRV_CMD
CTL_DIAGNOSTIC: 0xE4, // HDC BIOS: CNTLR_DIAG_CMD
READ_LONG: 0xE5, // HDC BIOS: RD_LONG_CMD
WRITE_LONG: 0xE6 // HDC BIOS: WR_LONG_CMD
},
ERR: {
/*
* HDC error conditions, as returned in byte 0 of the (4) bytes returned by the Request Sense Status command
*/
NONE: 0x00,
NO_INDEX: 0x01, // no index signal detected
SEEK_INCOMPLETE:0x02, // no seek-complete signal
WRITE_FAULT: 0x03,
NOT_READY: 0x04, // after the controller selected the drive, the drive did not respond with a ready signal
NO_TRACK: 0x06, // after stepping the max number of cylinders, the controller did not receive the track 00 signal from the drive
STILL_SEEKING: 0x08,
ECC_ID_ERROR: 0x10,
ECC_DATA_ERROR: 0x11,
NO_ADDR_MARK: 0x12,
NO_SECTOR: 0x14,
BAD_SEEK: 0x15, // seek error: the cylinder and/or head address did not compare with the expected target address
ECC_CORRECTABLE:0x18, // correctable data error
BAD_TRACK: 0x19,
BAD_CMD: 0x20,
BAD_DISK_ADDR: 0x21,
RAM: 0x30,
CHECKSUM: 0x31,
POLYNOMIAL: 0x32,
MASK: 0x3F
},
SENSE: {
ADDR_VALID: 0x80
}
},
/*
* XTC Status Register (0x321, read-only)
*
* WARNING: The IBM Technical Reference Manual *badly* confuses the XTC_DATA "status byte" (above)
* that the controller sends following an HDC.XTC.DATA.CMD operation with the Status Register (below).
* In fact, it's so badly confused that it completely fails to document any of the Status Register
* bits below; I'm forced to guess at their meanings from the HDC BIOS listing.
*/
STATUS: {
PORT: 0x321, // port address
NONE: 0x00,
REQ: 0x01, // HDC BIOS: request bit
IOMODE: 0x02, // HDC BIOS: mode bit (GUESS: set whenever XTC_DATA contains a response?)
BUS: 0x04, // HDC BIOS: command/data bit (GUESS: set whenever XTC_DATA ready for request?)
BUSY: 0x08, // HDC BIOS: busy bit
INTERRUPT: 0x20 // HDC BIOS: interrupt bit
}
};
/*
* XTC Config Register (0x322, read-only)
*
* This register is used to read HDC card switch settings that defined the "Drive Type" for
* drives 0 and 1. SW[1],SW[2] (for drive 0) and SW[3],SW[4] (for drive 1) are set as follows:
*
* ON, ON Drive Type 0 (306 cylinders, 2 heads)
* ON, OFF Drive Type 1 (375 cylinders, 8 heads)
* OFF, ON Drive Type 2 (306 cylinders, 6 heads)
* OFF, OFF Drive Type 3 (306 cylinders, 4 heads)
*/
/*
* HDC Command Sequences
*
* Unlike the FDC, all the HDC commands have fixed-length command request sequences (well, OK, except for
* HDC.XTC.DATA.CMD.INIT_DRIVE) and fixed-length response sequences (well, OK, except for HDC.XTC.DATA.CMD.REQUEST_SENSE),
* so a table of byte-lengths isn't much use, but having names for all the commands is still handy for debugging.
*/
if (DEBUG) {
HDC.aATCCommands = {
0x10: "Restore (Recalibrate)",
0x20: "Read",
0x30: "Write",
0x40: "Read Verify",
0x50: "Format Track",
0x70: "Seek",
0x90: "Diagnose",
0x91: "Set Parameters"
};
HDC.aXTCCommands = {
0x00: "Test Drive Ready",
0x01: "Recalibrate",
0x03: "Request Sense Status",
0x04: "Format Drive",
0x05: "Read Verify",
0x06: "Format Track",
0x07: "Format Bad Track",
0x08: "Read",
0x0A: "Write",
0x0B: "Seek",
0x0C: "Initialize Drive Characteristics",
0x0D: "Read ECC Burst Error Length",
0x0E: "Read Data from Sector Buffer",
0x0F: "Write Data to Sector Buffer",
0xE0: "RAM Diagnostic",
0xE3: "Drive Diagnostic",
0xE4: "Controller Diagnostic",
0xE5: "Read Long",
0xE6: "Write Long"
};
}
/*
* HDC BIOS interrupts, functions, and other parameters
*
* When the HDC BIOS overwrites the ROM BIOS INT 0x13 address, it saves the original INT 0x13 address
* in the INT 0x40 vector.
*/
HDC.BIOS = {
INT_DISK: 0x13,
INT_DISKETTE: 0x40
};
/*
* NOTE: These are useful values for reference, but they're not actually used for anything at the moment.
*/
HDC.BIOS.DISK_CMD = {
RESET: 0x00,
GET_STATUS: 0x01,
READ_SECTORS: 0x02,
WRITE_SECTORS: 0x03,
VERIFY_SECTORS: 0x04,
FORMAT_TRK: 0x05,
FORMAT_BAD: 0x06,
FORMAT_DRIVE: 0x07,
GET_DRIVEPARMS: 0x08,
SET_DRIVEPARMS: 0x09,
READ_LONG: 0x0A,
WRITE_LONG: 0x0B,
SEEK: 0x0C,
ALT_RESET: 0x0D,
READ_BUFFER: 0x0E,
WRITE_BUFFER: 0x0F,
TEST_READY: 0x10,
RECALIBRATE: 0x11,
RAM_DIAGNOSTIC: 0x12,
DRV_DIAGNOSTIC: 0x13,
CTL_DIAGNOSTIC: 0x14
};
/**
* setBinding(sHTMLType, sBinding, control)
*
* @this {HDC}
* @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
* @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "listDisks")
* @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
* @return {boolean} true if binding was successful, false if unrecognized binding request
*/
HDC.prototype.setBinding = function(sHTMLType, sBinding, control)
{
/*
* This is reserved for future use; for now, hard disk images can be specified during initialization only (no "hot-swapping")
*/
return false;
};
/**
* initBus(cmp, bus, cpu, dbg)
*
* @this {HDC}
* @param {Computer} cmp
* @param {Bus} bus
* @param {X86CPU} cpu
* @param {Debugger} dbg
*/
HDC.prototype.initBus = function(cmp, bus, cpu, dbg)
{
this.bus = bus;
this.cpu = cpu;
this.dbg = dbg;
this.cmp = cmp;
/*
* We need access to the ChipSet component, because we need to communicate with
* the PIC and DMA controller.
*/
this.chipset = cmp.getComponentByType("ChipSet");
bus.addPortInputTable(this, this.fATC? HDC.aATCPortInput : HDC.aXTCPortInput);
bus.addPortOutputTable(this, this.fATC? HDC.aATCPortOutput : HDC.aXTCPortOutput);
cpu.addIntNotify(HDC.BIOS.INT_DISK, this, this.intBIOSDisk);
cpu.addIntNotify(HDC.BIOS.INT_DISKETTE, this, this.intBIOSDiskette);
/*
* The following code used to be performed in the HDC constructor, but now we need to wait for information
* about the Computer to be available (eg, getMachineID() and getUserID()) before we start loading and/or
* connecting to disk images.
*
* If we didn't need auto-mount support, we could defer controller initialization until we received a powerUp()
* notification, at which point reset() would call initController(), or restore() would restore the controller;
* in that case, all we'd need to do here is call setReady().
*/
this.reset();
if (!this.autoMount()) this.setReady();
};
/**
* powerUp(data, fRepower)
*
* @this {HDC}
* @param {Object|null} data
* @param {boolean} [fRepower]
* @return {boolean} true if successful, false if failure
*/
HDC.prototype.powerUp = function(data, fRepower)
{
if (!fRepower) {
if (!data || !this.restore) {
this.initController();
if (this.cmp.fReload) {
/*
* If the computer's fReload flag is set, we're required to toss all currently
* loaded disks and remount all disks specified in the auto-mount configuration.
*/
this.autoMount(true);
}
} else {
if (!this.restore(data)) return false;
}
}
return true;
};
/**
* powerDown(fSave, fShutdown)
*
* @this {HDC}
* @param {boolean} fSave
* @param {boolean} [fShutdown]
* @return {Object|boolean}
*/
HDC.prototype.powerDown = function(fSave, fShutdown)
{
return fSave && this.save? this.save() : true;
};
/**
* getMachineID()
*
* @return {string}
*/
HDC.prototype.getMachineID = function()
{
return this.cmp? this.cmp.getMachineID() : "";
};
/**
* getUserID()
*
* @return {string}
*/
HDC.prototype.getUserID = function()
{
return this.cmp? this.cmp.getUserID() : "";
};
/**
* reset()
*
* @this {HDC}
*/
HDC.prototype.reset = function()
{
/*
* TODO: The controller is also initialized by the constructor, to assist with auto-mount support,
* so think about whether we can skip powerUp initialization.
*/
this.initController(null, true);
};
/**
* save()
*
* This implements save support for the HDC component.
*
* @this {HDC}
* @return {Object}
*/
HDC.prototype.save = function()
{
var state = new State(this);
state.set(0, this.saveController());
return state.data();
};
/**
* restore(data)
*
* This implements restore support for the HDC component.
*
* @this {HDC}
* @param {Object} data
* @return {boolean} true if successful, false if failure
*/
HDC.prototype.restore = function(data)
{
return this.initController(data[0]);
};
/**
* initController(data, fHard)
*
* @this {HDC}
* @param {Array} [data]
* @param {boolean} [fHard] true if a machine reset (not just a controller reset)
* @return {boolean} true if successful, false if failure
*/
HDC.prototype.initController = function(data, fHard)
{
var i = 0;
var fSuccess = true;
/*
* At this point, it's worth calling into question my decision to NOT split the HDC component into separate XTC
* and ATC components, given all the differences, and given that I'm about to write some "if (ATC) else (XTC) ..."
* code. And all I can say in my defense is, yes, it's definitely worth calling that into question.
*
* However, there's also some common code, mostly in the area of disk management rather than controller management,
* and if the components were split, then I'd have to create a third component for that common code (although again,
* disk management probably belongs in its own component anyway).
*
* However, let's not forget that since my overall plan is to have only one PCjs "binary", everything's going to end
* up in the same bucket anyway, so let's not be too obsessive about organizational details. As long as the number
* of these conditionals is small and they're not performance-critical, this seems much ado about nothing.
*/
if (this.fATC) {
/*
* Since there's no way (and never will be a way) for an HDC to change its "personality" (from 'xt' to 'at'
* or vice versa), we're under no obligation to use the same number of registers, or save/restore format, etc,
* as the original XT controller.
*/
if (data == null) data = [0, 0, 0, 0, 0, 0, 0, 0, HDC.ATC.STATUS.READY, 0];
this.regError = data[i++];
this.regWPreC = data[i++];
this.regSecCnt = data[i++];
this.regSecNum = data[i++];
this.regCylLo = data[i++];
this.regCylHi = data[i++];
this.regDrvHd = data[i++];
this.regStatus = data[i++];
this.regCommand = data[i++];
this.regFDR = data[i++];
/*
* Additional state is maintained by the Drive object (eg, abSector, ibSector)
*/
} else {
if (data == null) data = [0, HDC.XTC.STATUS.NONE, new Array(14), 0, 0];
this.regConfig = data[i++];
this.regStatus = data[i++];
this.regDataArray = data[i++]; // there can be up to 14 command bytes (6 for normal commands, plus 8 more for HDC.XTC.DATA.CMD.INIT_DRIVE)
this.regDataIndex = data[i++]; // used to control the next data byte to be received
this.regDataTotal = data[i++]; // used to control the next data byte to be sent (internally, we use regDataIndex to read data bytes, up to this total)
this.regReset = data[i++];
this.regPulse = data[i++];
this.regPattern = data[i++];
/*
* Initialize iDriveAllowFail only if it's never been initialized, otherwise its entire purpose will be defeated.
* See the related HACK in intBIOSDisk() for more details.
*/
var iDriveAllowFail = data[i++];
if (iDriveAllowFail !== undefined) {
this.iDriveAllowFail = iDriveAllowFail;
} else {
if (this.iDriveAllowFail === undefined) this.iDriveAllowFail = -1;
}
}
if (this.aDrives === undefined) {
this.aDrives = new Array(this.aDriveConfigs.length);
}
var dataDrives = data[i];
if (dataDrives === undefined) dataDrives = [];
for (var iDrive = 0; iDrive < this.aDrives.length; iDrive++) {
if (this.aDrives[iDrive] === undefined) {
this.aDrives[iDrive] = {};
}
var drive = this.aDrives[iDrive];
var driveConfig = this.aDriveConfigs[iDrive];
if (!this.initDrive(iDrive, drive, driveConfig, dataDrives[iDrive], fHard)) {
fSuccess = false;
}
/*
* XTC only: the original STC-506/412 controller had two pairs of DIP switches to indicate a drive
* type (0, 1, 2 or 3) for drives 0 and 1. Those switch settings are recorded in regConfig, now that
* drive.type has been validated by initDrive().
*/
if (this.regConfig != null && iDrive <= 1) {
this.regConfig |= (drive.type & 0x3) << ((1 - iDrive) << 1);
}
}
if (DEBUG && this.messageEnabled()) {
this.printMessage("HDC initialized for " + this.aDrives.length + " drive(s)");
}
return fSuccess;
};
/**
* saveController()
*
* @this {HDC}
* @return {Array}
*/
HDC.prototype.saveController = function()
{
var i = 0;
var data = [];
if (this.fATC) {
data[i++] = this.regError;
data[i++] = this.regWPreC;
data[i++] = this.regSecCnt;
data[i++] = this.regSecNum;
data[i++] = this.regCylLo;
data[i++] = this.regCylHi;
data[i++] = this.regDrvHd;
data[i++] = this.regStatus;
data[i++] = this.regCommand;
data[i++] = this.regFDR;
} else {
data[i++] = this.regConfig;
data[i++] = this.regStatus;
data[i++] = this.regDataArray;
data[i++] = this.regDataIndex;
data[i++] = this.regDataTotal;
data[i++] = this.regReset;
data[i++] = this.regPulse;
data[i++] = this.regPattern;
data[i++] = this.iDriveAllowFail;
}
data[i] = this.saveDrives();
return data;
};
/**
* initDrive(iDrive, drive, driveConfig, data, fHard)
*
* TODO: Consider a separate Drive class that both FDC and HDC can use, since there's a lot of commonality
* between the drive objects created by both controllers. This will clean up overall drive management and allow
* us to factor out some common Drive methods (eg, advanceSector()).
*
* @this {HDC}
* @param {number} iDrive
* @param {Object} drive
* @param {Object} driveConfig (contains one or more of the following properties: 'name', 'path', 'size', 'type')
* @param {Array} [data]
* @param {boolean} [fHard] true if a machine reset (not just a controller reset)
* @return {boolean} true if successful, false if failure
*/
HDC.prototype.initDrive = function(iDrive, drive, driveConfig, data, fHard)
{
var i = 0;
var fSuccess = true;
if (data === undefined) data = [HDC.XTC.DATA.ERR.NONE, 0, false, new Array(8)];
drive.iDrive = iDrive;
/*
* errorCode could be an HDC global, but in order to insulate HDC state from the operation of various functions
* that operate on drive objects (eg, readData and writeData), I've made it a per-drive variable. This choice may
* be contrary to how the actual hardware works, but I prefer this approach, as long as it doesn't expose any
* incompatibilities that any software actually cares about.
*/
drive.errorCode = data[i++];
drive.senseCode = data[i++];
drive.fRemovable = data[i++];
drive.abDriveParms = data[i++]; // captures drive parameters programmed via HDC.XTC.DATA.CMD.INIT_DRIVE
/*
* TODO: Make abSector a DWORD array rather than a BYTE array (we could even allocate a Memory block for it);
* alternatively, eliminate the buffer entirely and re-establish a reference to the appropriate Disk sector object.
*/
drive.abSector = data[i++];
/*
* The next group of properties are set by various HDC command sequences.
*/
drive.bHead = data[i++];
drive.nHeads = data[i++];
drive.wCylinder = data[i++];
drive.bSector = data[i++];
drive.bSectorEnd = data[i++]; // aka EOT
drive.nBytes = data[i++];
drive.bSectorBias = (this.fATC? 0: 1);
drive.name = driveConfig['name'];
if (drive.name === undefined) drive.name = HDC.DEFAULT_DRIVE_NAME;
drive.path = driveConfig['path'];
/*
* If no 'mode' is specified, we fall back to the original behavior, which is to completely preload
* any specific disk image, or create an empty (purely local) disk image.
*/
drive.mode = driveConfig['mode'] || (drive.path? DiskAPI.MODE.PRELOAD : DiskAPI.MODE.LOCAL);
/*
* On-demand I/O of raw disk images is supported only if there's a valid user ID; fall back to an empty
* local disk image if there's not.
*/
if (drive.mode == DiskAPI.MODE.DEMANDRO || drive.mode == DiskAPI.MODE.DEMANDRW) {
if (!this.getUserID()) drive.mode = DiskAPI.MODE.LOCAL;
}
drive.type = driveConfig['type'];
if (drive.type === undefined || HDC.aDriveTypes[this.iHDC][drive.type] === undefined) drive.type = this.iDriveTypeDefault;
var driveType = HDC.aDriveTypes[this.iHDC][drive.type];
drive.nSectors = driveType[2] || 17; // sectors/track
drive.cbSector = driveType[3] || 512; // bytes/sector (default is 512 if unspecified in the table)
/*
* On a full machine reset, pass the current drive type to setCMOSDriveType() (a no-op on pre-CMOS machines)
*/
if (fHard && this.chipset) {
this.chipset.setCMOSDriveType(iDrive, drive.type);
}
/*
* The next group of properties are set by user requests to load/unload disk images.
*
* We no longer reinitialize drive.disk, in order to retain previously mounted disk across resets.
*/
if (drive.disk === undefined) {
drive.disk = null;
this.notice("Type " + drive.type + " \"" + drive.name + "\" is fixed disk " + iDrive, true);
}
/*
* With the advent of save/restore, we need to verify every drive at initialization, not just whenever
* drive characteristics are initialized. Thus, if we've restored a sensible set of drive characteristics,
* then verifyDrive will create an empty disk if none has been provided, insuring we are ready for
* disk.restore().
*/
this.verifyDrive(drive);
/*
* The next group of properties are managed by worker functions (eg, doDMARead()) to maintain state across DMA requests.
*/
drive.ibSector = data[i++]; // location of the next byte to be accessed in the above sector
drive.sector = null; // initialized to null by worker, and then set to the next sector satisfying the request
if (drive.disk) {
var deltas = data[i];
if (deltas !== undefined && drive.disk.restore(deltas) < 0) {
fSuccess = false;
}
if (fSuccess && drive.ibSector !== undefined) {
drive.sector = drive.disk.seek(drive.wCylinder, drive.bHead, drive.bSector + drive.bSectorBias);
}
}
return fSuccess;
};
/**
* saveDrives()
*
* @this {HDC}
* @return {Array}
*/
HDC.prototype.saveDrives = function()
{
var i = 0;
var data = [];
for (var iDrive = 0; iDrive < this.aDrives.length; iDrive++) {
data[i++] = this.saveDrive(this.aDrives[iDrive]);
}
return data;
};
/**
* saveDrive(drive)
*
* @this {HDC}
* @return {Array}
*/
HDC.prototype.saveDrive = function(drive)
{
var i = 0;
var data = [];
data[i++] = drive.errorCode;
data[i++] = drive.senseCode;
data[i++] = drive.fRemovable;
data[i++] = drive.abDriveParms;
data[i++] = drive.abSector;
data[i++] = drive.bHead;
data[i++] = drive.nHeads;
data[i++] = drive.wCylinder;
data[i++] = drive.bSector;
data[i++] = drive.bSectorEnd;
data[i++] = drive.nBytes;
data[i++] = drive.ibSector;
data[i] = drive.disk? drive.disk.save() : null;
return data;
};
/**
* copyDrive(iDrive)
*
* @this {HDC}
* @param {number} iDrive
* @return {Object|undefined} (undefined if the requested drive does not exist)
*/
HDC.prototype.copyDrive = function(iDrive)
{
var driveNew;
var driveOld = this.aDrives[iDrive];
if (driveOld !== undefined) {
driveNew = {};
for (var p in driveOld) {
driveNew[p] = driveOld[p];
}
}
return driveNew;
};
/**
* verifyDrive(drive, type)
*
* If no disk image is attached, create an empty disk with the specified drive characteristics.
* Normally, we'd rely on the drive characteristics programmed via the HDC.XTC.DATA.CMD.INIT_DRIVE
* command, but if an explicit drive type is specified, then we use the characteristics (geometry)
* associated with that type.
*
* @this {HDC}
* @param {Object} drive
* @param {number} [type] to create a disk of the specified type, if no disk exists yet
*/
HDC.prototype.verifyDrive = function(drive, type)
{
if (drive) {
var nHeads = 0, nCylinders = 0;
if (type == null) {
/*
* If the caller wants us to use the programmed drive parameters, we use those,
* but if there aren't any drive parameters (yet), then use default parameters based
* on drive.type.
*
* We used to do the last step ONLY if there was no drive.path -- otherwise, we'd waste
* time creating an empty disk if autoMount() was going to load an image from drive.path;
* but hopefully the Disk component is smarter now.
*/
nHeads = drive.abDriveParms[2];
if (nHeads) {
nCylinders = (drive.abDriveParms[0] << 8) | drive.abDriveParms[1];
} else {
type = drive.type;
}
}
if (type != null && !nHeads) {
nHeads = HDC.aDriveTypes[this.iHDC][type][1];
nCylinders = HDC.aDriveTypes[this.iHDC][type][0];
}
if (nHeads) {
/*
* The assumption here is that if the 3rd drive parameter byte (abDriveParms[2]) has been set
* (ie, if nHeads is valid) then the first two bytes (ie, the low and high cylinder byte values)
* must have been set as well.
*
* Do these values agree with those for the given drive type? Even if they don't, all we do is warn.
*/
var driveType = HDC.aDriveTypes[this.iHDC][drive.type];
if (driveType) {
if (nCylinders != driveType[0] && nHeads != driveType[1]) {
this.notice("Warning: drive parameters (" + nCylinders + "," + nHeads + ") do not match drive type " + drive.type + " (" + driveType[0] + "," + driveType[1] + ")");
}
}
drive.nCylinders = nCylinders;
drive.nHeads = nHeads;
if (drive.disk == null) {
drive.disk = new Disk(this, drive, drive.mode);
}
}
}
};
/**
* seekDrive(drive, iSector, nSectors)
*
* The HDC doesn't need this function, since all HDC requests from the CPU are handled by doXTCmd(). This function
* is used by other components (eg, Debugger) to mimic an HDC request, using a drive object obtained from copyDrive(),
* to avoid disturbing the internal state of the HDC's drive objects.
*
* Also note that in an actual HDC request, drive.nBytes is initialized to the size of a single sector; the extent
* of the entire transfer is actually determined by a count that has been pre-loaded into the DMA controller. The HDC
* isn't aware of the extent of the transfer, so in the case of a read request, all readData() can do is return bytes
* until the current track (or, in the case of a multi-track request, the current cylinder) has been exhausted.
*
* Since seekDrive() is for use with non-DMA requests, we use nBytes to specify the length of the entire transfer.
*
* @this {HDC}
* @param {Object} drive
* @param {number} iSector (a "logical" sector number, relative to the entire disk, NOT a physical sector number)
* @param {number} nSectors
* @return {boolean} true if successful, false if invalid position request
*/
HDC.prototype.seekDrive = function(drive, iSector, nSectors)
{
if (drive.disk) {
var aDiskInfo = drive.disk.info();
var nCylinders = aDiskInfo[0];
/*
* If nCylinders is zero, we probably have an empty disk image, awaiting initialization (see verifyDrive())
*/
if (nCylinders) {
var nHeads = aDiskInfo[1];
var nSectorsPerTrack = aDiskInfo[2];
var nSectorsPerCylinder = nHeads * nSectorsPerTrack;
var nSectorsPerDisk = nCylinders * nSectorsPerCylinder;
if (iSector + nSectors <= nSectorsPerDisk) {
drive.wCylinder = Math.floor(iSector / nSectorsPerCylinder);
iSector %= nSectorsPerCylinder;
drive.bHead = Math.floor(iSector / nSectorsPerTrack);
/*
* Important difference between the FDC and the XTC: the XTC uses 0-based sector numbers, so unlike
* FDC.seekDrive(), we must NOT add 1 to bSector below. I could change how sector numbers are stored in
* hard disk images, but it seems preferable to keep the image format consistent and controller-independent.
*/
drive.bSector = (iSector % nSectorsPerTrack);
drive.nBytes = nSectors * aDiskInfo[3];
/*
* NOTE: We don't set nSectorEnd, as an HDC command would, but it's irrelevant, because we don't actually
* do anything with nSectorEnd at this point. Perhaps someday, when we faithfully honor/restrict requests
* to a single track (or a single cylinder, in the case of multi-track requests).
*/
drive.errorCode = HDC.XTC.DATA.ERR.NONE;
/*
* At this point, we've finished simulating what an HDC.XTC.DATA.CMD.READ_DATA command would have performed,
* up through doDMARead(). Now it's the caller responsibility to call readData(), like the DMA Controller would.
*/
return true;
}
}
}
return false;
};
/**
* autoMount(fRemount)
*
* @this {HDC}
* @param {boolean} [fRemount] is true if we're remounting all auto-mounted disks
* @return {boolean} true if one or more disk images are being auto-mounted, false if none
*/
HDC.prototype.autoMount = function(fRemount)
{
if (!fRemount) this.cAutoMount = 0;
for (var iDrive = 0; iDrive < this.aDrives.length; iDrive++) {
var drive = this.aDrives[iDrive];
if (drive.name && drive.path) {
if (fRemount && drive.disk && drive.disk.isRemote()) {
/*
* The Disk component has its own logic for remounting remote disks, so skip this disk.
*
* TODO: Consider rewriting how ALL disks are automounted/remounted, now that the Disk component
* is receiving its own powerDown() and powerUp() notifications (originally, it didn't receive them).
*/
continue;
}
if (!this.loadDisk(iDrive, drive.name, drive.path, true) && fRemount)
this.setReady(false);
continue;
}
if (fRemount && drive.type !== undefined) {
drive.disk = null;
this.verifyDrive(drive, drive.type);
}
}
return !!this.cAutoMount;
};
/**
* loadDisk(iDrive, sDiskName, sDiskPath, fAutoMount)
*
* @this {HDC}
* @param {number} iDrive
* @param {string} sDiskName
* @param {string} sDiskPath
* @param {boolean} fAutoMount
* @return {boolean} true if disk (already) loaded, false if queued up (or busy)
*/
HDC.prototype.loadDisk = function(iDrive, sDiskName, sDiskPath, fAutoMount)
{
var drive = this.aDrives[iDrive];
if (drive.fBusy) {
this.notice("Drive " + iDrive + " busy");
return true;
}
drive.fBusy = true;
if (fAutoMount) {
drive.fAutoMount = true;
this.cAutoMount++;
if (this.messageEnabled()) this.printMessage("loading " + sDiskName);
}
var disk = drive.disk || new Disk(this, drive, drive.mode);
disk.load(sDiskName, sDiskPath, null, this.doneLoadDisk);
return false;
};
/**
* doneLoadDisk(drive, disk, sDiskName, sDiskPath)
*
* This is a callback issued by the Disk component once the load() operation has finished.
*
* @this {HDC}
* @param {Object} drive
* @param {Disk} disk is set if the disk was successfully mounted, null if not
* @param {string} sDiskName
* @param {string} sDiskPath
*/
HDC.prototype.doneLoadDisk = function(drive, disk, sDiskName, sDiskPath)
{
drive.fBusy = false;
if ((drive.disk = disk)) {
/*
* With the addition of notify(), users are now "alerted" whenever a diskette has finished loading;
* notify() is selective about its output, using print() if a print window is open, otherwise alert().
*
* WARNING: This conversion of drive number to drive letter, starting with "C:" (0x43), is very simplistic
* and is not guaranteed to match the drive mapping that DOS ultimately uses.
*/
this.notice("Mounted disk \"" + sDiskName + "\" in drive " + String.fromCharCode(0x43 + drive.iDrive), drive.fAutoMount);
}
if (drive.fAutoMount) {
drive.fAutoMount = false;
if (!--this.cAutoMount) this.setReady();
}
};
/**
* unloadDrive(iDrive)
*
* NOTE: At the moment, we support only auto-mounts; there is no user interface for selecting hard disk images,
* let alone unloading them, so there is currently no need for the following function.
*
* @this {HDC}
* @param {number} iDrive
*
HDC.prototype.unloadDrive = function(iDrive)
{
this.aDrives[iDrive].disk = null;
//
// WARNING: This conversion of drive number to drive letter, starting with "C:" (0x43), is very simplistic
// and is not guaranteed to match the drive mapping that DOS ultimately uses.
//
this.notice("Drive " + String.fromCharCode(0x43 + iDrive) + " unloaded");
};
*/
/**
* intXTCData(port, addrFrom)
*
* @this {HDC}
* @param {number} port (0x320)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
HDC.prototype.inXTCData = function(port, addrFrom)
{
var bIn = 0;
if (this.regDataIndex < this.regDataTotal) {
bIn = this.regDataArray[this.regDataIndex];
}
if (this.chipset) this.chipset.clearIRR(ChipSet.IRQ.XTC);
this.regStatus &= ~HDC.XTC.STATUS.INTERRUPT;
this.printMessageIO(port, null, addrFrom, "DATA[" + this.regDataIndex + "]", bIn);
if (++this.regDataIndex >= this.regDataTotal) {
this.regDataIndex = this.regDataTotal = 0;
this.regStatus &= ~(HDC.XTC.STATUS.IOMODE | HDC.XTC.STATUS.BUS | HDC.XTC.STATUS.BUSY);
}
return bIn;
};
/**
* outXTCData(port, bOut, addrFrom)
*
* @this {HDC}
* @param {number} port (0x320)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
*/
HDC.prototype.outXTCData = function(port, bOut, addrFrom)
{
this.printMessageIO(port, bOut, addrFrom, "DATA[" + this.regDataTotal + "]");
if (this.regDataTotal < this.regDataArray.length) {
this.regDataArray[this.regDataTotal++] = bOut;
}
var bCmd = this.regDataArray[0];
var cbCmd = (bCmd != HDC.XTC.DATA.CMD.INIT_DRIVE? 6 : this.regDataArray.length);
if (this.regDataTotal == 6) {
/*
* XTC.STATUS.REQ must be CLEAR following any 6-byte command sequence that the HDC BIOS "COMMAND" function outputs,
* yet it must also be SET before the HDC BIOS will proceed with the remaining the 8-byte sequence that's part of
* HDC.XTC.DATA.CMD.INIT_DRIVE command. See inXTCStatus() for HACK details.
*/
this.regStatus &= ~HDC.XTC.STATUS.REQ;
}
if (this.regDataTotal >= cbCmd) {
/*
* It's essential that XTC.STATUS.IOMODE be set here, at least after the final 8-byte HDC.XTC.DATA.CMD.INIT_DRIVE sequence.
*/
this.regStatus |= HDC.XTC.STATUS.IOMODE;
this.regStatus &= ~HDC.XTC.STATUS.REQ;
this.doXTC();
}
};
/**
* inXTCStatus(port, addrFrom)
*
* @this {HDC}
* @param {number} port (0x321)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
HDC.prototype.inXTCStatus = function(port, addrFrom)
{
var b = this.regStatus;
this.printMessageIO(port, null, addrFrom, "STATUS", b);
/*
* HACK: The HDC BIOS will not finish the HDC.XTC.DATA.CMD.INIT_DRIVE sequence unless it sees XTC.STATUS.REQ set again, nor will
* it read any of the XTC.DATA bytes returned from a HDC.XTC.DATA.CMD.REQUEST_SENSE command unless XTC.STATUS.REQ is set again, so
* we turn it back on if there are unprocessed data bytes.
*/
if (this.regDataIndex < this.regDataTotal) {
this.regStatus |= HDC.XTC.STATUS.REQ;
}
return b;
};
/**
* outXTCReset(port, bOut, addrFrom)
*
* @this {HDC}
* @param {number} port (0x321)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
*/
HDC.prototype.outXTCReset = function(port, bOut, addrFrom)
{
this.printMessageIO(port, bOut, addrFrom, "RESET");
/*
* Not sure what to do with this value, and the value itself may be "don't care", but we'll save it anyway.
*/
this.regReset = bOut;
if (this.chipset) this.chipset.clearIRR(ChipSet.IRQ.XTC);
this.initController();
};
/**
* inXTCConfig(port, addrFrom)
*
* @this {HDC}
* @param {number} port (0x322)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
HDC.prototype.inXTCConfig = function(port, addrFrom)
{
this.printMessageIO(port, null, addrFrom, "CONFIG", this.regConfig);
return this.regConfig;
};
/**
* outXTCPulse(port, bOut, addrFrom)
*
* @this {HDC}
* @param {number} port (0x322)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
*/
HDC.prototype.outXTCPulse = function(port, bOut, addrFrom)
{
this.printMessageIO(port, bOut, addrFrom, "PULSE");
/*
* Not sure what to do with this value, and the value itself may be "don't care", but we'll save it anyway.
*/
this.regPulse = bOut;
/*
* The HDC BIOS "COMMAND" function (@C800:0562) waits for these ALL status bits after writing to both regPulse
* and regPattern, so we must oblige it.
*
* TODO: Figure out exactly when either XTC.STATUS.BUS or XTC.STATUS.BUSY are supposed to be cleared.
* The HDC BIOS doesn't care much about them, except for the one location mentioned above. However, MS-DOS 4.0
* (aka the unreleased "multitasking" version of MS-DOS) cares, so I'm going to start by clearing them at the
* same point I clear XTC.STATUS.IOMODE.
*/
this.regStatus = HDC.XTC.STATUS.REQ | HDC.XTC.STATUS.BUS | HDC.XTC.STATUS.BUSY;
};
/**
* outXTCPattern(port, bOut, addrFrom)
*
* @this {HDC}
* @param {number} port (0x323)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
*/
HDC.prototype.outXTCPattern = function(port, bOut, addrFrom)
{
this.printMessageIO(port, bOut, addrFrom, "PATTERN");
this.regPattern = bOut;
};
/**
* outXTCNoise(port, bOut, addrFrom)
*
* @this {HDC}
* @param {number} port (0x327, 0x32B or 0x32F)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
*/
HDC.prototype.outXTCNoise = function(port, bOut, addrFrom)
{
this.printMessageIO(port, bOut, addrFrom, "NOISE");
};
/**
* inATCData(port, addrFrom)
*
* @this {HDC}
* @param {number} port (0x1F0)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
HDC.prototype.inATCData = function(port, addrFrom)
{
var bIn = -1;
if (this.drive) {
/*
* We use the synchronous form of readData() at this point because we have no choice; an I/O instruction
* has just occurred and cannot be delayed. The good news is that doATCommand() should have already primed
* the pump; all we can do is assert that the pump has something in it. If bIn is inexplicably negative,
* well, then the caller will get 0xff.
*/
var hdc = this;
bIn = this.readData(this.drive, function(b, fAsync, obj, off) {
hdc.assert(!fAsync);
if (BACKTRACK) {
if (!off && obj.file && hdc.messageEnabled(Messages.DISK)) {
hdc.printMessage("loading " + obj.file.sPath + '[' + obj.offFile + "] via port " + str.toHexWord(port), true);
}
/*
* TODO: We could define a cached BTO that's reset prior to a new ATC command, and then pass that
* to addBackTrackObject() here instead of null; but for now, we're going to rely on that function's
* simplistic MRU logic. If that fails, the worst that will (or should) happen is we'll burn through
* more BackTrack wrapper objects than necessary, and risk running out.
*/
var bto = hdc.bus.addBackTrackObject(obj, null, off);
hdc.cpu.backTrack.btiIO = hdc.bus.getBackTrackIndex(bto, off);
}
});
this.assert(bIn >= 0);
if (this.drive.ibSector == 1) {
/*
* printMessageIO() calls, if enabled, can be overwhelming for this port, so limit them to the first byte
* of each sector.
*/
if (this.messageEnabled(Messages.PORT | Messages.HDC)) {
this.printMessageIO(port, null, addrFrom, "DATA[" + this.drive.ibSector + "]", bIn);
}
}
else if (this.drive.ibSector == this.drive.cbSector) {
/*
* Now that we've supplied a full sector of data, see if the caller's expecting additional sectors;
* if so, prime the pump again. The caller should not poll us again until another interrupt's been delivered.
*/
if (this.messageEnabled(Messages.DATA | Messages.HDC)) {
var sDump = this.drive.disk.dumpSector(this.drive.sector);
if (sDump) this.dbg.message(sDump);
}
this.drive.nBytes -= this.drive.cbSector;
this.regSecCnt = (this.regSecCnt - 1) & 0xff;
/*
* TODO: If the WITH_ECC bit is set in the READ_DATA command, then we need to support "stuffing" 4
* additional bytes into the inATCData() stream. And we must first set DATA_REQ in the STATUS register.
*/
if (this.drive.nBytes >= this.drive.cbSector) {
hdc.regStatus = HDC.ATC.STATUS.BUSY | HDC.ATC.STATUS.DATA_REQ;
this.readData(this.drive, function(b, fAsync) {
if (b >= 0) {
hdc.setATCIRR();
hdc.regStatus = HDC.ATC.STATUS.READY | HDC.ATC.STATUS.SEEK_OK;
} else {
/*
* TODO: It would be nice to be a bit more specific about the error (if any) that just occurred.
* Consult drive.errorCode (it uses older XTC error codes, but mapping those codes should be trivial).
*/
hdc.regStatus = HDC.ATC.STATUS.ERROR;
hdc.regError = HDC.ATC.ERROR.NO_CHS;
if (DEBUG) hdc.printMessage("HDC.inATCData(): read failed");
}
}, false);
} else {
this.assert(!this.drive.nBytes);
this.regStatus = HDC.ATC.STATUS.READY | HDC.ATC.STATUS.SEEK_OK;
}
}
}
return bIn;
};
/**
* outATCData(port, bOut, addrFrom)
*
* @this {HDC}
* @param {number} port (0x1F0)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
*/
HDC.prototype.outATCData = function(port, bOut, addrFrom)
{
if (this.drive) {
if (this.drive.nBytes >= this.drive.cbSector) {
if (this.writeData(this.drive, bOut) < 0) {
/*
* TODO: It would be nice to be a bit more specific about the error (if any) that just occurred.
* Consult drive.errorCode (it uses older XTC error codes, but mapping those codes should be trivial).
*/
this.regStatus = HDC.ATC.STATUS.ERROR;
this.regError = HDC.ATC.ERROR.NO_CHS;
if (DEBUG && this.messageEnabled()) {
this.printMessage("HDC.outATCData(" + str.toHexByte(bOut) + "): write failed");
}
}
else if (this.drive.ibSector == 1) {
/*
* printMessageIO() calls, if enabled, can be overwhelming for this port, so limit them to the first byte
* of each sector.
*/
if (this.messageEnabled(Messages.PORT | Messages.HDC)) {
this.printMessageIO(port, bOut, addrFrom, "DATA[" + this.drive.ibSector + "]");
}
}
else if (this.drive.ibSector == this.drive.cbSector) {
if (this.messageEnabled(Messages.DATA | Messages.HDC)) {
var sDump = this.drive.disk.dumpSector(this.drive.sector);
if (sDump) this.dbg.message(sDump);
}
this.drive.nBytes -= this.drive.cbSector;
this.regSecCnt = (this.regSecCnt - 1) & 0xff;
this.setATCIRR(true);
this.regStatus = HDC.ATC.STATUS.READY | HDC.ATC.STATUS.SEEK_OK;
if (this.drive.nBytes >= this.drive.cbSector) {
this.regStatus |= HDC.ATC.STATUS.DATA_REQ;
} else {
this.assert(!this.drive.nBytes);
}
}
} else {
/*
* TODO: What to do about unexpected writes? The number of bytes has exceeded what the command specified.
*/
if (DEBUG && this.messageEnabled()) {
this.printMessage("HDC.outATCData(" + str.toHexByte(bOut) + "): write exceeds count (" + this.drive.nBytes + ")");
}
}
} else {
/*
* TODO: What to do about unexpected writes? No command was specified.
*/
if (DEBUG && this.messageEnabled()) {
this.printMessage("HDC.outATCData(" + str.toHexByte(bOut) + "): write without command");
}
}
};
/**
* inATCError(port, addrFrom)
*
* @this {HDC}
* @param {number} port (0x1F1)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
HDC.prototype.inATCError = function(port, addrFrom)
{
var bIn = this.regError;
this.printMessageIO(port, null, addrFrom, "ERROR", bIn);
return bIn;
};
/**
* outATCWPreC(port, bOut, addrFrom)
*
* @this {HDC}
* @param {number} port (0x1F1)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
*/
HDC.prototype.outATCWPreC = function(port, bOut, addrFrom)
{
this.printMessageIO(port, bOut, addrFrom, "WPREC");
this.regWPreC = bOut;
};
/**
* inATCSecCnt(port, addrFrom)
*
* @this {HDC}
* @param {number} port (0x1F2)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
HDC.prototype.inATCSecCnt = function(port, addrFrom)
{
var bIn = this.regSecCnt;
this.printMessageIO(port, null, addrFrom, "SECCNT", bIn);
return bIn;
};
/**
* outATCSecCnt(port, bOut, addrFrom)
*
* @this {HDC}
* @param {number} port (0x1F2)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
*/
HDC.prototype.outATCSecCnt = function(port, bOut, addrFrom)
{
this.printMessageIO(port, bOut, addrFrom, "SECCNT");
this.regSecCnt = bOut;
};
/**
* inATCSecNum(port, addrFrom)
*
* @this {HDC}
* @param {number} port (0x1F3)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
HDC.prototype.inATCSecNum = function(port, addrFrom)
{
var bIn = this.regSecNum;
this.printMessageIO(port, null, addrFrom, "SECNUM", bIn);
return bIn;
};
/**
* outATCSecNum(port, bOut, addrFrom)
*
* @this {HDC}
* @param {number} port (0x1F3)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
*/
HDC.prototype.outATCSecNum = function(port, bOut, addrFrom)
{
this.printMessageIO(port, bOut, addrFrom, "SECNUM");
this.regSecNum = bOut;
};
/**
* inATCCylLo(port, addrFrom)
*
* @this {HDC}
* @param {number} port (0x1F4)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
HDC.prototype.inATCCylLo = function(port, addrFrom)
{
var bIn = this.regCylLo;
this.printMessageIO(port, null, addrFrom, "CYLLO", bIn);
return bIn;
};
/**
* outATCCylLo(port, bOut, addrFrom)
*
* @this {HDC}
* @param {number} port (0x1F4)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
*/
HDC.prototype.outATCCylLo = function(port, bOut, addrFrom)
{
this.printMessageIO(port, bOut, addrFrom, "CYLLO");
this.regCylLo = bOut;
};
/**
* inATCCylHi(port, addrFrom)
*
* @this {HDC}
* @param {number} port (0x1F5)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
HDC.prototype.inATCCylHi = function(port, addrFrom)
{
var bIn = this.regCylHi;
this.printMessageIO(port, null, addrFrom, "CYLHI", bIn);
return bIn;
};
/**
* outATCCylHi(port, bOut, addrFrom)
*
* @this {HDC}
* @param {number} port (0x1F5)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
*/
HDC.prototype.outATCCylHi = function(port, bOut, addrFrom)
{
this.printMessageIO(port, bOut, addrFrom, "CYLHI");
this.regCylHi = bOut;
};
/**
* inATCDrvHd(port, addrFrom)
*
* @this {HDC}
* @param {number} port (0x1F6)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
HDC.prototype.inATCDrvHd = function(port, addrFrom)
{
var bIn = this.regDrvHd;
this.printMessageIO(port, null, addrFrom, "DRVHD", bIn);
return bIn;
};
/**
* outATCDrvHd(port, bOut, addrFrom)
*
* @this {HDC}
* @param {number} port (0x1F6)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
*/
HDC.prototype.outATCDrvHd = function(port, bOut, addrFrom)
{
this.printMessageIO(port, bOut, addrFrom, "DRVHD");
this.regDrvHd = bOut;
/*
* The MODEL_5170_REV3 BIOS (see "POST2_CHK_HF2" @F000:14FC) probes for a 2nd hard drive when the number
* of configured hard drives is something other than 2, using INT 0x13/AH=0x10. This in turn calls the
* BIOS "TST_RDY" function, which selects the drive in this register (see DRIVE_MASK), and then immediately
* expects regStatus to reflect success or failure.
*
* We were always returning success, because no ATC command was actually issued, and so the user would
* always get a spurious CMOS configuration error: "System Options Not Set-(Run SETUP)".
*
* So now we update regStatus here. I'm not sure which status bits are normally set to indicate failure,
* but it should be sufficient to set or clear the READY bit according to whether the drive exists or not.
*
* TODO: Dig into the ATC documentation some more, and determine what other situations, if any, regStatus
* needs to be updated.
*/
var iDrive = (this.regDrvHd & HDC.ATC.DRVHD.DRIVE_MASK? 1 : 0);
if (this.aDrives[iDrive]) {
this.regStatus |= HDC.ATC.STATUS.READY;
} else {
this.regStatus &= ~HDC.ATC.STATUS.READY;
}
};
/**
* inATCStatus(port, addrFrom)
*
* @this {HDC}
* @param {number} port (0x1F7)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
HDC.prototype.inATCStatus = function(port, addrFrom)
{
var bIn = this.regStatus;
this.printMessageIO(port, null, addrFrom, "STATUS", bIn);
/*
* Despite what IBM's documentation for the "Personal Computer AT Fixed Disk and Diskette Drive Adapter"
* (August 31, 1984) says (ie, "A read of the status register clears interrupt request 14"), we cannot
* unilaterally clear the IRQ on any read of STATUS. For starters, that would completely break the PC AT
* ROM BIOS; here's what it does for multi-sector reads:
*
* (1) read sector (REP INSW)
* (2) check STATUS
* (3) check sector count, exit if done
* (4) wait for interrupt
* (5) repeat
*
* Since we set the IRR immediately after (1), we cannot immediately clear the IRR at (2), otherwise the
* interrupt at (4) never happens. So, maybe there are SOME situations where IRR should be cleared on
* a read, but I don't know what they are.
*
* if (this.chipset) this.chipset.clearIRR(ChipSet.IRQ.ATC);
*/
return bIn;
};
/**
* outATCCommand(port, bOut, addrFrom)
*
* @this {HDC}
* @param {number} port (0x1F7)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
*/
HDC.prototype.outATCCommand = function(port, bOut, addrFrom)
{
this.printMessageIO(port, bOut, addrFrom, "COMMAND");
this.regCommand = bOut;
if (this.chipset) this.chipset.clearIRR(ChipSet.IRQ.ATC);
this.doATC();
};
/**
* outATCFDR(port, bOut, addrFrom)
*
* This is referred to in IBM's docs as the "Fixed Disk Register" (write-only)
*
* @this {HDC}
* @param {number} port (0x3F6)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
*/
HDC.prototype.outATCFDR = function(port, bOut, addrFrom)
{
this.printMessageIO(port, bOut, addrFrom, "FDR");
/*
* I'm not really sure if I should set HDC.ATC.DIAG.NO_ERROR in regError after *every* write where
* HDC.ATC.FDR.RESET is clear, or only after it has transitioned from set to clear; since the BIOS only
* requires the latter, I'm going to be conservative and restrict regError updates to the latter.
*/
if ((this.regFDR & HDC.ATC.FDR.RESET) && !(bOut & HDC.ATC.FDR.RESET)) this.regError = HDC.ATC.DIAG.NO_ERROR;
this.regFDR = bOut;
};
/**
* doATC()
*
* Handles ATC (AT Controller) commands
*
* @this {HDC}
*/
HDC.prototype.doATC = function()
{
var hdc = this;
var fInterrupt = false;
var bCmd = this.regCommand;
var iDrive = (this.regDrvHd & HDC.ATC.DRVHD.DRIVE_MASK? 1 : 0);
var nHead = this.regDrvHd & HDC.ATC.DRVHD.HEAD_MASK;
var nCylinder = this.regCylLo | ((this.regCylHi & HDC.ATC.CYLHI.MASK) << 8);
var nSector = this.regSecNum;
var nSectors = this.regSecCnt || 256;
this.drive = null;
this.regError = HDC.ATC.ERROR.NONE;
this.regStatus = HDC.ATC.STATUS.READY | HDC.ATC.STATUS.SEEK_OK;
var drive = this.aDrives[iDrive];
if (!drive) {
bCmd = -1;
} else {
/*
* Update the Drive object with the new positional information associated with this command.
*/
drive.wCylinder = nCylinder;
drive.bHead = nHead;
drive.bSector = nSector;
drive.nBytes = nSectors * drive.cbSector;
bCmd = (bCmd >= HDC.ATC.COMMAND.DIAGNOSE? bCmd : (bCmd & HDC.ATC.COMMAND.MASK));
/*
* Since the ATC doesn't use DMA, we must now set some additional Drive state for the benefit of any
* follow-up I/O instructions. For example, any subsequent inATCData() and outATCData() calls need to
* know which drive to talk to ("this.drive"), to issue their own readData() and writeData() calls.
*
* The XTC didn't need this, because it used doDMARead(), doDMAWrite(), doDMAFormat() helper functions,
* which reset the current drive's "sector" and "errorCode" properties themselves and then used DMA
* functions that delivered drive data with direct calls to readData() and writeData().
*/
drive.sector = null;
drive.ibSector = 0;
drive.errorCode = 0;
this.drive = drive;
}
if (DEBUG && this.messageEnabled(Messages.HDC)) {
this.printMessage("HDC.doATC(" + str.toHexByte(bCmd) + "): " + HDC.aATCCommands[bCmd], true);
}
switch (bCmd & HDC.ATC.COMMAND.MASK) {
case HDC.ATC.COMMAND.READ_DATA:
if (DEBUG && this.messageEnabled(Messages.HDC)) {
this.printMessage("HDC.doRead(" + iDrive + ',' + drive.wCylinder + ':' + drive.bHead + ':' + drive.bSector + ',' + nSectors + ")", true);
}
/*
* We're using a call to readData() that disables auto-increment, so that once we've got the first
* byte of the next sector, we can signal an interrupt without also consuming the first byte, allowing
* inATCData() to begin with that byte.
*
* As with the WRITE_DATA command, I'm not sure which of BUSY and DATA_REQ (or both) should be set here,
* so I'm setting both of them for now. I clear them as soon as I have data.
*/
hdc.regStatus = HDC.ATC.STATUS.BUSY | HDC.ATC.STATUS.DATA_REQ;
this.readData(drive, function(b, fAsync) {
if (b >= 0 && hdc.chipset) {
hdc.setATCIRR();
hdc.regStatus = HDC.ATC.STATUS.READY | HDC.ATC.STATUS.SEEK_OK;
} else {
/*
* TODO: It would be nice to be a bit more specific about the error (if any) that just occurred.
* Consult drive.errorCode (it uses older XTC error codes, but mapping those codes should be trivial).
*/
hdc.regStatus = HDC.ATC.STATUS.ERROR;
hdc.regError = HDC.ATC.ERROR.NO_CHS;
}
}, false);
break;
case HDC.ATC.COMMAND.WRITE_DATA:
if (DEBUG && this.messageEnabled(Messages.HDC)) {
this.printMessage("HDC.doWrite(" + iDrive + ',' + drive.wCylinder + ':' + drive.bHead + ':' + drive.bSector + ',' + nSectors + ")", true);
}
this.regStatus = HDC.ATC.STATUS.DATA_REQ;
break;
case HDC.ATC.COMMAND.RESTORE:
/*
* Physically, this retracts the heads to cylinder 0, but logically, there isn't anything to do.
*/
fInterrupt = true;
break;
case HDC.ATC.COMMAND.READ_VERF:
/*
* Since the READ VERIFY command returns no data, once again, logically, there isn't much we HAVE to
* to do, but... TODO: Verify that all the disk parameters are valid, and return an error if they're not.
*/
fInterrupt = true;
break;
case HDC.ATC.COMMAND.DIAGNOSE:
this.regError = HDC.ATC.DIAG.NO_ERROR;
fInterrupt = true;
break;
case HDC.ATC.COMMAND.SETPARMS:
/*
* The documentation implies that the only parameters this command really affects are the number
* of heads (from regDrvHd) and sectors/track (from regSecCnt) -- this despite the fact that the BIOS
* programs all the other registers. For a type 2 drive, that includes:
*
* WPREC: 0x4B
* SECCNT: 0x11 (for 17 sectors per track)
* CYL: 0x100 (256 -- huh?)
* SECNUM: 0x0C (12 -- huh?)
* DRVHD: 0xA3 (max head of 0x03, for 4 total heads)
*
* The importance of SECCNT (nSectors) and DRVHD (nHeads) is controlling how multi-sector operations
* advance to the next sector; see advanceSector().
*/
this.assert(drive.nHeads == nHead + 1);
this.assert(drive.nSectors == nSectors);
drive.nHeads = nHead + 1;
drive.nSectors = nSectors;
fInterrupt = true;
break;
default:
if (DEBUG && this.messageEnabled()) {
this.printMessage("HDC.doATC(" + str.toHexByte(this.regCommand) + "): " + (bCmd < 0? ("invalid drive (" + iDrive + ")") : "unsupported operation"));
if (bCmd >= 0) this.dbg.stopCPU();
}
break;
}
if (fInterrupt) this.setATCIRR();
};
/**
* setATCIRR(fWrite)
*
* Raise the ATC's IRQ, provided ATC interrupts are enabled.
*
* @this {HDC}
* @param {boolean} [fWrite] is true on completion of a write to the sector buffer
*/
HDC.prototype.setATCIRR = function(fWrite)
{
if (this.chipset) {
if (!(this.regFDR & HDC.ATC.FDR.INT_DISABLE)) {
/*
* TODO: Determine what the "correct" instruction delay should be here. When the OS/2 1.0 Install Disk
* begins copying files to the hard disk, at one point it performs the following 125-sector write (use the
* Debugger's "m hdc on" and "m pic on" commands to enable HDC and PIC messages, along with "m data on"
* if you also want to see the actual sector data being written):
*
* HDC.doATC(0x30): Write
* HDC.doWrite(0,2:0:5,125)
*
* As the write progresses, you'll notice that the HDC interrupt after each sector occurs at decreasingly
* lower points in the stack, until we eventually start overwriting non-stack data:
*
* getIRRVector(): IRQ 14 interrupting @0090:52A6 stack=0050:1906
* getIRRVector(): IRQ 14 interrupting @0318:196B stack=0050:18D6
* getIRRVector(): IRQ 14 interrupting @0318:196B stack=0050:18A6
* ...
* getIRRVector(): IRQ 14 interrupting @0318:196B stack=0050:1156
*
* At roughly this point, very bad things start happening. I decided to try an arbitrarily large delay
* on the setIRR() call here (120), and the problem vanished, so it seems likely that the OS/2 disk driver
* has a low tolerance for fast controller interrupts during multi-sector operations.
*/
this.chipset.setIRR(ChipSet.IRQ.ATC, 120);
if (DEBUG) this.printMessage("HDC.setATCIRR(): enabled", Messages.PIC | Messages.HDC);
} else {
if (DEBUG) this.printMessage("HDC.setATCIRR(): disabled", Messages.PIC | Messages.HDC);
}
}
};
/**
* doXTC()
*
* Handles XTC (XT Controller) commands
*
* @this {HDC}
*/
HDC.prototype.doXTC = function()
{
var hdc = this;
this.regDataIndex = 0;
var bCmd = this.popCmd();
var bCmdOrig = bCmd;
var b1 = this.popCmd();
var bDrive = b1 & 0x20;
var iDrive = (bDrive >> 5);
var bHead = b1 & 0x1f;
var b2 = this.popCmd();
var b3 = this.popCmd();
var wCylinder = ((b2 << 2) & 0x300) | b3;
var bSector = b2 & 0x3f;
var bCount = this.popCmd(); // block count or interleave count, depending on the command
var bControl = this.popCmd();
var bParm, bDataStatus;
var drive = this.aDrives[iDrive];
if (drive) {
drive.wCylinder = wCylinder;
drive.bHead = bHead;
drive.bSector = bSector;
drive.nBytes = bCount * drive.cbSector;
}
/*
* I tried to save normal command processing from having to deal with invalid drives,
* but the HDC BIOS initializes both drive 0 AND drive 1 on a HDC.XTC.DATA.CMD.INIT_DRIVE command,
* and apparently that particular command has no problem with non-existent drives.
*
* So I've separated the commands into two groups: drive-ambivalent commands should be
* processed in the first group, and all the rest should be processed in the second group.
*/
switch (bCmd) {
case HDC.XTC.DATA.CMD.REQUEST_SENSE: // 0x03
this.beginResult(drive? drive.errorCode : HDC.XTC.DATA.ERR.NOT_READY);
this.pushResult(b1);
this.pushResult(b2);
this.pushResult(b3);
/*
* Although not terribly clear from IBM's "Fixed Disk Adapter" documentation, a data "status byte"
* also follows the 4 "sense bytes". Interestingly, The HDC BIOS checks that data status byte for
* XTC.DATA.STATUS.ERROR, but I have to wonder if it would have ever been set for this command....
*
* The whole point of the HDC.XTC.DATA.CMD.REQUEST_SENSE command is to obtain details about a
* previous error, so if HDC.XTC.DATA.CMD.REQUEST_SENSE itself reports an error, what would that mean?
*/
this.pushResult(HDC.XTC.DATA.STATUS.OK | bDrive);
bCmd = -1; // mark the command as complete
break;
case HDC.XTC.DATA.CMD.INIT_DRIVE: // 0x0C
/*
* Pop off all the extra "Initialize Drive Characteristics" bytes and store them, for the benefit of
* other functions, like verifyDrive().
*/
var i = 0;
while ((bParm = this.popCmd()) >= 0) {
if (drive && i < drive.abDriveParms.length) {
drive.abDriveParms[i++] = bParm;
}
}
if (drive) this.verifyDrive(drive);
bDataStatus = HDC.XTC.DATA.STATUS.OK;
if (!drive && this.iDriveAllowFail == iDrive) {
this.iDriveAllowFail = -1;
if (DEBUG) this.printMessage("HDC.doXTC(): fake failure triggered");
bDataStatus = HDC.XTC.DATA.STATUS.ERROR;
}
this.beginResult(bDataStatus | bDrive);
bCmd = -1; // mark the command as complete
break;
case HDC.XTC.DATA.CMD.RAM_DIAGNOSTIC: // 0xE0
case HDC.XTC.DATA.CMD.CTL_DIAGNOSTIC: // 0xE4
this.beginResult(HDC.XTC.DATA.STATUS.OK | bDrive);
bCmd = -1; // mark the command as complete
break;
default:
break;
}
if (bCmd >= 0) {
if (drive === undefined) {
bCmd = -1;
} else {
/*
* In preparation for this command, zero out the drive's errorCode and senseCode.
* Commands that require a disk address should update senseCode with HDC.XTC.DATA.SENSE_ADDR_VALID.
* And of course, any command that encounters an error should set the appropriate error code.
*/
drive.errorCode = HDC.XTC.DATA.ERR.NONE;
drive.senseCode = 0;
}
switch (bCmd) {
case HDC.XTC.DATA.CMD.TEST_READY: // 0x00
this.beginResult(HDC.XTC.DATA.STATUS.OK | bDrive);
break;
case HDC.XTC.DATA.CMD.RECALIBRATE: // 0x01
drive.bControl = bControl;
if (DEBUG && this.messageEnabled()) {
this.printMessage("HDC.doXTC(): drive " + iDrive + " control byte: " + str.toHexByte(bControl));
}
this.beginResult(HDC.XTC.DATA.STATUS.OK | bDrive);
break;
case HDC.XTC.DATA.CMD.READ_VERF: // 0x05
/*
* This is a non-DMA operation, so we simply pretend everything is OK for now. TODO: Revisit.
*/
this.beginResult(HDC.XTC.DATA.STATUS.OK | bDrive);
break;
case HDC.XTC.DATA.CMD.READ_DATA: // 0x08
this.doDMARead(drive, function(bStatus) {
hdc.beginResult(bStatus | bDrive);
});
break;
case HDC.XTC.DATA.CMD.WRITE_DATA: // 0x0A
/*
* QUESTION: The IBM TechRef (p.1-188) implies that bCount is used as part of HDC.XTC.DATA.CMD.WRITE_DATA command,
* but it is omitted from the HDC.XTC.DATA.CMD.READ_DATA command. Is that correct? Note that, as far as the length
* of the transfer is concerned, we rely exclusively on the DMA controller being programmed with the appropriate byte count.
*/
this.doDMAWrite(drive, function(bStatus) {
hdc.beginResult(bStatus | bDrive);
});
break;
case HDC.XTC.DATA.CMD.WRITE_BUFFER: // 0x0F
this.doDMAWriteBuffer(drive, function(bStatus) {
hdc.beginResult(bStatus | bDrive);
});
break;
default:
this.beginResult(HDC.XTC.DATA.STATUS.ERROR | bDrive);
if (DEBUG && this.messageEnabled()) {
this.printMessage("HDC.doXTC(" + str.toHexByte(bCmdOrig) + "): " + (bCmd < 0? ("invalid drive (" + iDrive + ")") : "unsupported operation"));
if (bCmd >= 0) this.dbg.stopCPU();
}
break;
}
}
};
/**
* popCmd()
*
* @this {HDC}
* @return {number}
*/
HDC.prototype.popCmd = function()
{
var bCmd = -1;
var bCmdIndex = this.regDataIndex;
if (bCmdIndex < this.regDataTotal) {
bCmd = this.regDataArray[this.regDataIndex++];
if (DEBUG && this.messageEnabled((bCmdIndex > 0? Messages.PORT : 0) | Messages.HDC)) {
this.printMessage("HDC.CMD[" + bCmdIndex + "]: " + str.toHexByte(bCmd) + (!bCmdIndex && HDC.aXTCCommands[bCmd]? (" (" + HDC.aXTCCommands[bCmd] + ")") : ""), true);
}
}
return bCmd;
};
/**
* beginResult(bResult)
*
* @this {HDC}
* @param {number} [bResult]
*/
HDC.prototype.beginResult = function(bResult)
{
this.regDataIndex = this.regDataTotal = 0;
if (bResult !== undefined) {
if (DEBUG && this.messageEnabled()) {
this.printMessage("HDC.beginResult(" + str.toHexByte(bResult) + ")");
}
this.pushResult(bResult);
}
/*
* After the Execution phase (eg, DMA Terminal Count has occurred, or the EOT sector has been read/written),
* an interrupt is supposed to occur, signaling the beginning of the Result Phase. Once the data "status byte"
* has been read from XTC.DATA, the interrupt is cleared (see inXTCData).
*/
if (this.chipset) this.chipset.setIRR(ChipSet.IRQ.XTC);
this.regStatus |= HDC.XTC.STATUS.INTERRUPT;
};
/**
* pushResult(bResult)
*
* @this {HDC}
* @param {number} bResult
*/
HDC.prototype.pushResult = function(bResult)
{
if (DEBUG && this.messageEnabled((this.regDataTotal > 0? Messages.PORT : 0) | Messages.HDC)) {
this.printMessage("HDC.RES[" + this.regDataTotal + "]: " + str.toHexByte(bResult), true);
}
this.regDataArray[this.regDataTotal++] = bResult;
};
/**
* dmaRead(drive, b, done)
*
* @this {HDC}
* @param {Object} drive
* @param {number} b
* @param {function(number,boolean)} done
*/
HDC.prototype.dmaRead = function(drive, b, done)
{
if (b === undefined || b < 0) {
this.readData(drive, done);
return;
}
/*
* The DMA controller should be ASKING for data, not GIVING us data; this suggests an internal DMA miscommunication
*/
if (DEBUG) this.printMessage("dmaRead(): invalid DMA acknowledgement");
done(-1, false);
};
/**
* dmaWrite(drive, b)
*
* @this {HDC}
* @param {Object} drive
* @param {number} b
* @return {number}
*/
HDC.prototype.dmaWrite = function(drive, b)
{
if (b !== undefined && b >= 0)
return this.writeData(drive, b);
/*
* The DMA controller should be GIVING us data, not ASKING for data; this suggests an internal DMA miscommunication
*/
if (DEBUG) this.printMessage("dmaWrite(): invalid DMA acknowledgement");
return -1;
};
/**
* dmaWriteBuffer(drive, b)
*
* @this {HDC}
* @param {Object} drive
* @param {number} b
* @return {number}
*/
HDC.prototype.dmaWriteBuffer = function(drive, b)
{
if (b !== undefined && b >= 0)
return this.writeBuffer(drive, b);
/*
* The DMA controller should be GIVING us data, not ASKING for data; this suggests an internal DMA miscommunication
*/
if (DEBUG) this.printMessage("dmaWriteBuffer(): invalid DMA acknowledgement");
return -1;
};
/**
* dmaWriteFormat(drive, b)
*
* @this {HDC}
* @param {Object} drive
* @param {number} b
* @returns {number}
*/
HDC.prototype.dmaWriteFormat = function(drive, b)
{
if (b !== undefined && b >= 0)
return this.writeFormat(drive, b);
/*
* The DMA controller should be GIVING us data, not ASKING for data; this suggests an internal DMA miscommunication
*/
if (DEBUG) this.printMessage("dmaWriteFormat(): invalid DMA acknowledgement");
return -1;
};
/**
* doDMARead(drive, done)
*
* @this {HDC}
* @param {Object} drive
* @param {function(number)} done (dataStatus is XTC.DATA.STATUS.OK or XTC.DATA.STATUS.ERROR; if error, then drive.errorCode should be set as well)
*/
HDC.prototype.doDMARead = function(drive, done)
{
drive.errorCode = HDC.XTC.DATA.ERR.NOT_READY;
if (DEBUG && this.messageEnabled()) {
this.printMessage("HDC.doDMARead(" + drive.iDrive + ',' + drive.wCylinder + ':' + drive.bHead + ':' + drive.bSector + ',' + ((drive.nBytes / drive.cbSector)|0) + ")");
}
if (drive.disk) {
drive.sector = null;
if (this.chipset) {
/*
* We need to reverse the original logic, and default to success unless/until an actual error occurs;
* otherwise dmaRead()/readData() will bail on us. The original approach used to work because requestDMA()
* would immediately call us back with fComplete set to true EVEN if the DMA channel was not yet unmasked;
* now the callback is deferred until the DMA channel has been unmasked and the DMA request has finished.
*/
drive.errorCode = HDC.XTC.DATA.ERR.NONE;
this.chipset.connectDMA(ChipSet.DMA_HDC, this, 'dmaRead', drive);
this.chipset.requestDMA(ChipSet.DMA_HDC, function(fComplete) {
if (!fComplete) {
/*
* If an incomplete request wasn't triggered by an explicit error, then let's make explicit
* (ie, revert to the default failure code that we originally set above).
*/
if (drive.errorCode == HDC.XTC.DATA.ERR.NONE) {
drive.errorCode = HDC.XTC.DATA.ERR.NOT_READY;
}
}
done(drive.errorCode? HDC.XTC.DATA.STATUS.ERROR : HDC.XTC.DATA.STATUS.OK);
});
return;
}
}
done(drive.errorCode? HDC.XTC.DATA.STATUS.ERROR : HDC.XTC.DATA.STATUS.OK);
};
/**
* doDMAWrite(drive, done)
*
* @this {HDC}
* @param {Object} drive
* @param {function(number)} done (dataStatus is XTC.DATA.STATUS.OK or XTC.DATA.STATUS.ERROR; if error, then drive.errorCode should be set as well)
*/
HDC.prototype.doDMAWrite = function(drive, done)
{
drive.errorCode = HDC.XTC.DATA.ERR.NOT_READY;
if (DEBUG && this.messageEnabled()) {
this.printMessage("HDC.doDMAWrite(" + drive.iDrive + ',' + drive.wCylinder + ':' + drive.bHead + ':' + drive.bSector + ',' + ((drive.nBytes / drive.cbSector)|0) + ")");
}
if (drive.disk) {
drive.sector = null;
if (this.chipset) {
/*
* We need to reverse the original logic, and default to success unless/until an actual error occurs;
* otherwise dmaWrite()/writeData() will bail on us. The original approach would work because requestDMA()
* would immediately call us back with fComplete set to true EVEN if the DMA channel was not yet unmasked;
* now the callback is deferred until the DMA channel has been unmasked and the DMA request has finished.
*/
drive.errorCode = HDC.XTC.DATA.ERR.NONE;
this.chipset.connectDMA(ChipSet.DMA_HDC, this, 'dmaWrite', drive);
this.chipset.requestDMA(ChipSet.DMA_HDC, function(fComplete) {
if (!fComplete) {
/*
* If an incomplete request wasn't triggered by an explicit error, then let's make explicit
* (ie, revert to the default failure code that we originally set above).
*/
if (drive.errorCode == HDC.XTC.DATA.ERR.NONE) {
drive.errorCode = HDC.XTC.DATA.ERR.NOT_READY;
}
/*
* Mask any error that's the result of an attempt to write beyond the end of the track (which is
* something the MS-DOS 4.0M's FORMAT utility seems to like to do).
*/
if (drive.errorCode == HDC.XTC.DATA.ERR.NO_SECTOR) {
drive.errorCode = HDC.XTC.DATA.ERR.NONE;
}
}
done(drive.errorCode? HDC.XTC.DATA.STATUS.ERROR : HDC.XTC.DATA.STATUS.OK);
});
return;
}
}
done(drive.errorCode? HDC.XTC.DATA.STATUS.ERROR : HDC.XTC.DATA.STATUS.OK);
};
/**
* doDMAWriteBuffer(drive, done)
*
* @this {HDC}
* @param {Object} drive
* @param {function(number)} done (dataStatus is XTC.DATA.STATUS.OK or XTC.DATA.STATUS.ERROR; if error, then drive.errorCode should be set as well)
*/
HDC.prototype.doDMAWriteBuffer = function(drive, done)
{
drive.errorCode = HDC.XTC.DATA.ERR.NOT_READY;
if (DEBUG) this.printMessage("HDC.doDMAWriteBuffer()");
if (!drive.abSector || drive.abSector.length != drive.nBytes) {
drive.abSector = new Array(drive.nBytes);
}
drive.ibSector = 0;
if (this.chipset) {
/*
* We need to reverse the original logic, and default to success unless/until an actual error occurs;
* otherwise dmaWriteBuffer() will bail on us. The original approach would work because requestDMA()
* would immediately call us back with fComplete set to true EVEN if the DMA channel was not yet unmasked;
* now the callback is deferred until the DMA channel has been unmasked and the DMA request has finished.
*/
drive.errorCode = HDC.XTC.DATA.ERR.NONE;
this.chipset.connectDMA(ChipSet.DMA_HDC, this, 'dmaWriteBuffer', drive);
this.chipset.requestDMA(ChipSet.DMA_HDC, function(fComplete) {
if (!fComplete) {
/*
* If an incomplete request wasn't triggered by an explicit error, then let's make explicit
* (ie, revert to the default failure code that we originally set above).
*/
if (drive.errorCode == HDC.XTC.DATA.ERR.NONE) {
drive.errorCode = HDC.XTC.DATA.ERR.NOT_READY;
}
}
done(drive.errorCode? HDC.XTC.DATA.STATUS.ERROR : HDC.XTC.DATA.STATUS.OK);
});
return;
}
done(drive.errorCode? HDC.XTC.DATA.STATUS.ERROR : HDC.XTC.DATA.STATUS.OK);
};
/**
* doDMAFormat(drive, done)
*
* The drive variable is initialized by doXTC() to the following extent:
*
* drive.bHead (ignored)
* drive.nBytes (bytes/sector)
* drive.bSectorEnd (sectors/track)
* drive.bFiller (fill byte)
*
* and we expect the DMA controller to provide C, H, R and N (ie, 4 bytes) for each sector to be formatted.
*
* NOTE: This function is not currently used.
*
* @this {HDC}
* @param {Object} drive
* @param {function(number)} done (dataStatus is XTC.DATA.STATUS.OK or XTC.DATA.STATUS.ERROR; if error, then drive.errorCode should be set as well)
*
HDC.prototype.doDMAFormat = function(drive, done)
{
drive.errorCode = HDC.XTC.DATA.ERR.NOT_READY;
if (drive.disk) {
drive.sector = null;
if (this.chipset) {
drive.cbFormat = 0;
drive.abFormat = new Array(4);
drive.bFormatting = true;
drive.cSectorsFormatted = 0;
//
// We need to reverse the original logic, and default to success unless/until an actual error occurs;
// otherwise dmaWriteFormat() will bail on us. The original approach would work because requestDMA()
// would immediately call us back with fComplete set to true EVEN if the DMA channel was not yet unmasked;
// now the callback is deferred until the DMA channel has been unmasked and the DMA request has finished.
//
drive.errorCode = HDC.XTC.DATA.ERR.NONE;
this.chipset.connectDMA(ChipSet.DMA_HDC, this, 'dmaWriteFormat', drive);
this.chipset.requestDMA(ChipSet.DMA_HDC, function(fComplete) {
if (!fComplete) {
//
// If an incomplete request wasn't triggered by an explicit error, then let's make explicit
// (ie, revert to the default failure code that we originally set above).
//
if (drive.errorCode == HDC.XTC.DATA.ERR.NONE) {
drive.errorCode = HDC.XTC.DATA.ERR.NOT_READY;
}
}
drive.bFormatting = false;
done(drive.errorCode? HDC.XTC.DATA.STATUS.ERROR : HDC.XTC.DATA.STATUS.OK);
});
return;
}
}
done(drive.errorCode? HDC.XTC.DATA.STATUS.ERROR : HDC.XTC.DATA.STATUS.OK);
};
*/
/**
* readData(drive, done)
*
* The following drive variable properties must have been setup prior to our first call:
*
* drive.wCylinder
* drive.bHead
* drive.bSector
* drive.sector (initialized to null)
*
* On the first readData() request, since drive.sector will be null, we ask the Disk object to look
* up the first sector of the request. We then ask the Disk for bytes from that sector until the sector
* is exhausted, and then we look up the next sector and continue the process.
*
* NOTE: Since the HDC isn't aware of the extent of the transfer, all readData() can do is return bytes
* until the current track (or, in the case of a multi-track request, the current cylinder) has been exhausted.
*
* @this {HDC}
* @param {Object} drive
* @param {function(number,boolean,Object,number)} [done] (number is next available byte from drive, or -1 if no more bytes available)
* @param {boolean} [fAutoInc] (default is true to auto-increment)
* @return {number} the requested byte, or -1 if unavailable
*/
HDC.prototype.readData = function(drive, done, fAutoInc)
{
var b = -1;
var obj = null, off = 0; // these variables are purely for BACKTRACK purposes
if (drive.errorCode) {
if (done) done(b, false, obj, off);
return b;
}
var inc = (fAutoInc !== false? 1 : 0);
if (drive.sector) {
off = drive.ibSector;
b = drive.disk.read(drive.sector, drive.ibSector);
drive.ibSector += inc;
if (b >= 0) {
obj = drive.sector;
if (done) done(b, false, obj, off);
return b;
}
}
/*
* Locate the next sector, and then try reading again.
*
* Important difference between the FDC and the XTC: the XTC uses 0-based sector numbers,
* hence the bSectorBias below. I could change how sector numbers are stored in the image,
* but it seems preferable to keep the image format consistent and controller-independent.
*/
if (done) {
var hdc = this;
if (drive.disk) {
drive.disk.seek(drive.wCylinder, drive.bHead, drive.bSector + drive.bSectorBias, false, function(sector, fAsync) {
if ((drive.sector = sector)) {
obj = sector;
off = drive.ibSector = 0;
/*
* We "pre-advance" bSector et al now, instead of waiting to advance it right before the seek().
* This allows the initial call to readData() to perform a seek without triggering an unwanted advance.
*/
hdc.advanceSector(drive);
b = drive.disk.read(drive.sector, drive.ibSector);
drive.ibSector += inc;
} else {
drive.errorCode = HDC.XTC.DATA.ERR.NO_SECTOR;
}
done(b, fAsync, obj, off);
});
return b;
}
drive.errorCode = HDC.XTC.DATA.ERR.NO_SECTOR;
done(b, false, obj, off);
}
return b;
};
/**
* writeData(drive, b)
*
* The following drive variable properties must have been setup prior to our first call:
*
* drive.wCylinder
* drive.bHead
* drive.bSector
* drive.sector (initialized to null)
*
* On the first writeData() request, since drive.sector will be null, we ask the Disk object to look
* up the first sector of the request. We then send the Disk bytes for that sector until the sector
* is full, and then we look up the next sector and continue the process.
*
* NOTE: Since the HDC isn't aware of the extent of the transfer, all writeData() can do is accept bytes
* until the current track (or, in the case of a multi-track request, the current cylinder) has been exhausted.
*
* @this {HDC}
* @param {Object} drive
* @param {number} b containing next byte to write
* @return {number} (b unchanged; return -1 if command should be terminated)
*/
HDC.prototype.writeData = function(drive, b)
{
if (drive.errorCode) return -1;
do {
if (drive.sector) {
if (drive.disk.write(drive.sector, drive.ibSector++, b))
break;
}
/*
* Locate the next sector, and then try writing again.
*
* Important difference between the FDC and the XTC: the XTC uses 0-based sector numbers,
* hence the bSectorBias below. I could change how sector numbers are stored in the image,
* but it seems preferable to keep the image format consistent and controller-independent.
*/
if (drive.disk) {
drive.disk.seek(drive.wCylinder, drive.bHead, drive.bSector + drive.bSectorBias, true, function(sector, fAsync) {
drive.sector = sector;
});
}
if (!drive.sector) {
drive.errorCode = HDC.XTC.DATA.ERR.NO_SECTOR;
b = -1;
break;
}
drive.ibSector = 0;
/*
* We "pre-advance" bSector et al now, instead of waiting to advance it right before the seek().
* This allows the initial call to writeData() to perform a seek without triggering an unwanted advance.
*/
this.advanceSector(drive);
} while (true);
return b;
};
/**
* advanceSector(drive)
*
* This increments the sector number; when the sector number reaches drive.nSectors on the current track, we
* increment drive.bHead and reset drive.bSector, and when drive.bHead reaches drive.nHeads, we reset drive.bHead
* and increment drive.wCylinder.
*
* One wrinkle is that the ATC uses 1-based sector numbers (bSectorBias is 0), whereas the XTC uses 0-based sector
* numbers (bSectorBias is 1). Thus, the correct "reset" value for bSector is (1 - bSectorBias), and the correct
* limit for bSector is (nSectors + bSectorStart).
*
* @this {HDC}
* @param {Object} drive
*/
HDC.prototype.advanceSector = function(drive)
{
this.assert(drive.wCylinder < drive.nCylinders);
drive.bSector++;
var bSectorStart = (1 - drive.bSectorBias);
if (drive.bSector >= drive.nSectors + bSectorStart) {
drive.bSector = bSectorStart;
drive.bHead++;
if (drive.bHead >= drive.nHeads) {
drive.bHead = 0;
drive.wCylinder++;
}
}
};
/**
* writeBuffer(drive, b)
*
* NOTE: Since the HDC isn't aware of the extent of the transfer, all writeBuffer() can do is accept bytes
* until the buffer is full.
*
* TODO: Support for HDC.XTC.DATA.CMD.READ_BUFFER is missing, and support for HDC.XTC.DATA.CMD.WRITE_BUFFER may not be complete;
* tests required.
*
* @this {HDC}
* @param {Object} drive
* @param {number} b containing next byte to write
* @return {number} (b unchanged; return -1 if command should be terminated)
*/
HDC.prototype.writeBuffer = function(drive, b)
{
if (drive.ibSector < drive.abSector.length) {
drive.abSector[drive.ibSector++] = b;
} else {
/*
* TODO: Determine the proper error code to return here.
*/
drive.errorCode = HDC.XTC.DATA.ERR.NO_SECTOR;
b = -1;
}
return b;
};
/**
* writeFormat(drive, b)
*
* @this {HDC}
* @param {Object} drive
* @param {number} b containing a format command byte
* @return {number} (b if successful, -1 if command should be terminated)
*/
HDC.prototype.writeFormat = function(drive, b)
{
if (drive.errorCode) return -1;
drive.abFormat[drive.cbFormat++] = b;
if (drive.cbFormat == drive.abFormat.length) {
drive.wCylinder = drive.abFormat[0]; // C
drive.bHead = drive.abFormat[1]; // H
drive.bSector = drive.abFormat[2]; // R
drive.nBytes = 128 << drive.abFormat[3];// N (0 => 128, 1 => 256, 2 => 512, 3 => 1024)
drive.cbFormat = 0;
if (DEBUG && this.messageEnabled()) {
this.printMessage("HDC.writeFormat(" + drive.wCylinder + ":" + drive.bHead + ":" + drive.bSector + ":" + drive.nBytes + ")");
}
for (var i = 0; i < drive.nBytes; i++) {
if (this.writeData(drive, drive.bFiller) < 0) {
return -1;
}
}
drive.cSectorsFormatted++;
}
if (drive.cSectorsFormatted >= drive.bSectorEnd) b = -1;
return b;
};
/**
* intBIOSDisk(addr)
*
* NOTE: This function differentiates HDC requests from FDC requests, based on whether the INT 0x13 drive number
* in DL is >= 0x80.
*
* HACK: The HDC BIOS code for both INT 0x13/AH=0x00 and INT 0x13/AH=0x09 calls "INIT_DRV" @C800:0427, which is
* hard-coded to issue the HDC.XTC.DATA.CMD.INIT_DRIVE command for BOTH drives 0 and 1 (aka drive numbers 0x80 and
* 0x81), regardless of the drive number specified in DL; this means that the HDC.XTC.DATA.CMD.INIT_DRIVE command
* must always succeed for drive 1 if it also succeeds for drive 0 -- even if there is no drive 1. Bizarre, but OK,
* whatever.
*
* So assuming we a have drive 0, when the power-on diagnostics in "DISK_SETUP" @C800:0003 call INT 0x13/AH=0x09
* (@C800:00DB) for drive 0, it must succeed. No problem. But when "DISK_SETUP" starts probing for additional drives,
* it first issues INT 0x13/AH=0x00, followed by INT 0x13/AH=0x11, and finally INT 0x13/AH=0x09. If the first
* (AH=0x00) or third (AH=0x09) INT 0x13 fails, it quickly moves on (ie, it jumps to "POD_DONE"). But as we just
* discussed, both those operations call "INIT_DRV", which can't return an error. This means the only function that
* can return an error in this context is the recalibrate function (AH=0x11). That sucks, because the way the HDC
* BIOS is written, it will loop for anywhere from 1.5 seconds to 25 seconds (depending on whether the controller
* is part of the "System Unit" or not; see port 0x213), attempting to recalibrate drive 1 until it finally times out.
*
* Normally, you'll only experience the 1.5 second delay, but even so, it's a ridiculous waste of time and a lot of
* useless INT 0x13 calls. So I monitor INT 0x13/AH=0x00 for DL >= 0x80 and set a special HDC.XTC.DATA.CMD.INIT_DRIVE
* override flag (iDriveAllowFail) that will allow that command to fail, and in theory, make the the HDC BIOS
* "DISK_SETUP" code much more efficient.
*
* @this {HDC}
* @param {number} addr
* @return {boolean} true to proceed with the INT 0x13 software interrupt, false to skip
*/
HDC.prototype.intBIOSDisk = function(addr)
{
var AH = this.cpu.regEAX >> 8;
var DL = this.cpu.regEDX & 0xff;
if (!AH && DL > 0x80) this.iDriveAllowFail = DL - 0x80;
return true;
};
/**
* intBIOSDiskette(addr)
*
* When the HDC BIOS overwrites the ROM BIOS INT 0x13 address, it saves the original INT 0x13 address
* in the INT 0x40 vector. This function intercepts calls to that vector to work around a minor nuisance.
*
* The HDC BIOS's plan was simple, albeit slightly flawed: assign fixed disks drive numbers >= 0x80,
* and whenever someone calls INT 0x13 with a drive number < 0x80, invoke the original INT 0x13 diskette
* code via INT 0x40 and return via RET 2.
*
* Unfortunately, not all original INT 0x13 functions required a drive number in DL (eg, the "reset"
* function, where AH=0). And the HDC BIOS knew this, which is why, in the case of the "reset" function,
* the HDC BIOS performs BOTH an INT 0x40 diskette reset AND an HDC reset -- it can't be sure which
* controller the caller really wants to reset.
*
* An unfortunate side-effect of this behavior: when the HDC BIOS is initialized for the first time, it may
* issue several resets internally, depending on whether there are 0, 1 or 2 hard disks installed, and each
* of those resets also triggers completely useless diskette resets, each wasting up to two seconds waiting
* for the FDC to interrupt. The FDC tries to interrupt, but it can't, because at this early stage of
* ROM BIOS initialization, IRQ.FDC hasn't been unmasked yet.
*
* My work-around: have the HDC component hook INT 0x40, and every time an INT 0x40 is issued with AH=0 and
* IRQ.FDC masked, bypass the INT 0x40 interrupt. This is as close as PCjs has come to patching any BIOS code
* (something I've refused to do), and even here, I'm not doing it out of necessity, just annoyance.
*
* @this {HDC}
* @param {number} addr
* @return {boolean} true to proceed with the INT 0x40 software interrupt, false to skip
*/
HDC.prototype.intBIOSDiskette = function(addr)
{
var AH = this.cpu.regEAX >> 8;
if ((!AH && this.chipset && this.chipset.checkIMR(ChipSet.IRQ.FDC))) {
if (DEBUG) this.printMessage("HDC.intBIOSDiskette(): skipping useless INT 0x40 diskette reset");
return false;
}
return true;
};
/*
* Port input notification tables
*/
HDC.aXTCPortInput = {
0x320: HDC.prototype.inXTCData,
0x321: HDC.prototype.inXTCStatus,
0x322: HDC.prototype.inXTCConfig
};
HDC.aATCPortInput = {
0x1F0: HDC.prototype.inATCData,
0x1F1: HDC.prototype.inATCError,
0x1F2: HDC.prototype.inATCSecCnt,
0x1F3: HDC.prototype.inATCSecNum,
0x1F4: HDC.prototype.inATCCylLo,
0x1F5: HDC.prototype.inATCCylHi,
0x1F6: HDC.prototype.inATCDrvHd,
0x1F7: HDC.prototype.inATCStatus
};
/*
* Port output notification tables
*/
HDC.aXTCPortOutput = {
0x320: HDC.prototype.outXTCData,
0x321: HDC.prototype.outXTCReset,
0x322: HDC.prototype.outXTCPulse,
0x323: HDC.prototype.outXTCPattern,
/*
* The PC XT Fixed Disk BIOS includes some additional "housekeeping" that it performs
* not only on port 0x323 but also on three additional ports, at increments of 4 (see all
* references to "RESET INT/DMA MASK" in the Fixed Disk BIOS). It's not clear to me if
* those ports refer to additional HDC controllers, and I haven't seen other references to
* them, but in any case, they represent a lot of "I/O noise" that we simply squelch here.
*/
0x327: HDC.prototype.outXTCNoise,
0x32B: HDC.prototype.outXTCNoise,
0x32F: HDC.prototype.outXTCNoise
};
HDC.aATCPortOutput = {
0x1F0: HDC.prototype.outATCData,
0x1F1: HDC.prototype.outATCWPreC,
0x1F2: HDC.prototype.outATCSecCnt,
0x1F3: HDC.prototype.outATCSecNum,
0x1F4: HDC.prototype.outATCCylLo,
0x1F5: HDC.prototype.outATCCylHi,
0x1F6: HDC.prototype.outATCDrvHd,
0x1F7: HDC.prototype.outATCCommand,
0x3F6: HDC.prototype.outATCFDR
};
/**
* HDC.init()
*
* This function operates on every HTML element of class "hdc", extracting the
* JSON-encoded parameters for the HDC constructor from the element's "data-value"
* attribute, invoking the constructor to create a HDC component, and then binding
* any associated HTML controls to the new component.
*/
HDC.init = function()
{
var aeHDC = Component.getElementsByClass(window.document, PCJSCLASS, "hdc");
for (var iHDC = 0; iHDC < aeHDC.length; iHDC++) {
var eHDC = aeHDC[iHDC];
var parmsHDC = Component.getComponentParms(eHDC);
var hdc = new HDC(parmsHDC);
Component.bindComponentControls(hdc, eHDC, PCJSCLASS);
}
};
/*
* Initialize every Hard Drive Controller (HDC) module on the page.
*/
web.onInit(HDC.init);
if (typeof module !== 'undefined') module.exports = HDC;
/**
* @fileoverview PCjs-specific BIOS/DOS interrupt definitions.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2014-Dec-11
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
/*
* Components that previously used Debugger interrupt definitions by including:
*
* var Debugger = require("./debugger");
*
* and using:
*
* Debugger.INT.FOO
*
* must now instead include:
*
* var Interrupts = require("./interrupts");
*
* and then replace all occurrences of "Debugger.INT.FOO" with "Interrupts.FOO.VECTOR".
*/
var Interrupts = {
VIDEO: {
VECTOR: 0x10
},
DISK: {
VECTOR: 0x13
},
CASSETTE: {
VECTOR: 0x15
},
KBD: {
VECTOR: 0x16
},
RTC: {
VECTOR: 0x1a
},
TIMER_TICK: {
VECTOR: 0x1c
},
DOS: {
VECTOR: 0x21
},
MOUSE: {
VECTOR: 0x33
}
};
if (typeof module !== 'undefined') module.exports = Interrupts;
/**
* @fileoverview Implements the PCjs Keyboard component.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-Jun-20
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
if (typeof module !== 'undefined') {
var str = require("../../shared/lib/strlib");
var web = require("../../shared/lib/weblib");
var Component = require("../../shared/lib/component");
var Messages = require("./messages");
var ChipSet = require("./chipset");
var State = require("./state");
var CPU = require("./cpu");
}
/**
* Keyboard(parmsKbd)
*
* The Keyboard component can be configured with the following (parmsKbd) properties:
*
* model: model string; should be one of:
*
* us83 (default)
* us84 (TODO: awaiting implementation)
* us101 (TODO: awaiting implementation)
*
* Its main purpose is to receive binding requests for various keyboard events, and to use those events
* to simulate the PC's keyboard hardware.
*
* @constructor
* @extends Component
* @param {Object} parmsKbd
*/
function Keyboard(parmsKbd)
{
Component.call(this, "Keyboard", parmsKbd, Keyboard, Messages.KEYBOARD);
this.nDefaultModel = parmsKbd['model'];
this.fMobile = web.isMobile();
this.fMSIE = web.isUserAgent("MSIE");
this.printMessage("mobile keyboard support: " + (this.fMobile? "true" : "false"));
/*
* This is count of the number of "soft keyboard" keys present. At the moment, its only
* purpose is to signal findBinding() whether to waste any time looking for SOFTCODE matches.
*/
this.cSoftCodes = 0;
/*
* Updated by onFocusChange()
*/
this.fHasFocus = true;
/*
* This is true whenever the physical Escape key is disabled (eg, by pointer locking code),
* giving us the opportunity to map a different physical key to machine's virtual Escape key.
*/
this.fEscapeDisabled = false;
/*
* This is set whenever we notice a discrepancy between our internal CAPS_LOCK state and its
* apparent state; we check whenever aKeysActive has been emptied.
*/
this.fToggleCapsLock = false;
/*
* New unified approach to key event processing: When we process a key on the "down" event,
* we check the aKeysActive array: if the key is already active, do nothing; otherwise, insert
* it into the table, generate the "make" scan code(s), and set a timeout for "repeat" if it's
* a repeatable key (most are).
*
* Similarly, when a key goes "up", if it's already not active, do nothing; otherwise, generate
* the "break" scan code(s), cancel any pending timeout, and remove it from the active key table.
*
* If a "press" event is received, then if the key is already active, remove it and (re)insert
* it at the head of the table, generate the "make" scan code(s), set nRepeat to -1, and set a
* timeout for "break".
*
* This requires an aKeysActive array that keeps track of the status of every active key; only the
* first entry in the array is allowed to repeat. Each entry is a key object with the following
* properties:
*
* simCode: our simulated keyCode from onKeyDown, onKeyUp, or onKeyPress
* fDown: next state to simulate (true for down, false for up)
* nRepeat: > 0 if timer should generate more "make" scan code(s), -1 for "break" scan code(s)
* timer: timer for next key operation, if any
*
* Keys are inserted at the head of aKeysActive, using splice(0, 0, key), but not before zeroing
* nRepeat of any repeating key that already occupies the head (index 0), so that at most only one
* key (ie, the most recent) will ever be in a repeating state.
*
* IBM PC keyboard repeat behavior: when pressing CTRL, then C, and then releasing CTRL while still
* holding C, the repeated CTRL_C characters turn into 'c' characters. We emulate that behavior.
* However, when pressing C, then CTRL, all repeating stops: not a single CTRL_C is generated, and
* even if the CTRL is released before the C, no more more 'c' characters are generated either.
* We do NOT fully emulate that behavior -- we DO stop the repeating, but we also generate one CTRL_C.
* More investigation is required, because I need to confirm whether the IBM keyboard automatically
* "breaks" all non-shift keys before it "makes" the CTRL.
*/
this.aKeysActive = [];
this.msAutoRepeat = 500;
this.msNextRepeat = 100;
this.msAutoRelease = 50;
this.msInjectDelay = 300; // number of milliseconds between injected keystrokes
/*
* HACK: We set fAllDown to false to ignore all down/up events for keys not explicitly marked as ONDOWN;
* even though that prevents those keys from being repeated properly (ie, at the simulation's repeat rate
* rather than the browser's repeat rate), it's the safest thing to do when dealing with international keyboards,
* because our mapping tables are designed for US keyboards, and testing all the permutations of international
* keyboards and web browsers is more work than I can take on right now. TODO: Dig into this some day.
*/
this.fAllDown = false;
this.setReady();
}
Component.subclass(Keyboard);
/**
* Alphanumeric and other common (printable) ASCII codes.
*
* TODO: Determine what we can do to get ALL constants like these inlined (enum doesn't seem to
* get the job done); the problem seems to be limited to property references that use quotes, which
* is why I've 'unquoted' as many of them as possible.
*
* @enum {number}
*/
Keyboard.ASCII = {
CTRL_A: 1, CTRL_C: 3, CTRL_Z: 26,
' ': 32, '!': 33, '"': 34, '#': 35, '$': 36, '%': 37, '&': 38, "'": 39,
'(': 40, ')': 41, '*': 42, '+': 43, ',': 44, '-': 45, '.': 46, '/': 47,
'0': 48, '1': 49, '2': 50, '3': 51, '4': 52, '5': 53, '6': 54, '7': 55,
'8': 56, '9': 57, ':': 58, ';': 59, '<': 60, '=': 61, '>': 62, '?': 63,
'@': 64, A: 65, B: 66, C: 67, D: 68, E: 69, F: 70, G: 71,
H: 72, I: 73, J: 74, K: 75, L: 76, M: 77, N: 78, O: 79,
P: 80, Q: 81, R: 82, S: 83, T: 84, U: 85, V: 86, W: 87,
X: 88, Y: 89, Z: 90, '[': 91, '\\':92, ']': 93, '^': 94, '_': 95,
'`': 96, a: 97, b: 98, c: 99, d: 100, e: 101, f: 102, g: 103,
h: 104, i: 105, j: 106, k: 107, l: 108, m: 109, n: 110, o: 111,
p: 112, q: 113, r: 114, s: 115, t: 116, u: 117, v: 118, w: 119,
x: 120, y: 121, z: 122, '{':123, '|':124, '}':125, '~':126
};
/**
* Browser keyCodes we must pay particular attention to. For the most part, these are
* non-alphanumeric or function keys, some which may require special treatment (eg,
* preventDefault() if returning false on the initial keyDown event is insufficient).
*
* keyCodes for most common ASCII keys can simply use the appropriate ASCII code above.
*
* Most of these represent non-ASCII keys (eg, the LEFT arrow key), yet for some reason,
* browsers defined them using ASCII codes (eg, the LEFT arrow key uses the ASCII code
* for '%' or 37). This conflict is discussed further in the definition of CLICKCODE below.
*
* @enum {number}
*/
Keyboard.KEYCODE = {
/* 0x08 */ BS: 8,
/* 0x09 */ TAB: 9,
/* 0x0A */ LF: 10,
/* 0x0D */ CR: 13,
/* 0x10 */ SHIFT: 16,
/* 0x11 */ CTRL: 17,
/* 0x12 */ ALT: 18,
/* 0x13 */ PAUSE: 19, // PAUSE/BREAK
/* 0x14 */ CAPS_LOCK: 20,
/* 0x1B */ ESC: 27,
/* 0x21 */ PGUP: 33,
/* 0x22 */ PGDN: 34,
/* 0x23 */ END: 35,
/* 0x24 */ HOME: 36,
/* 0x25 */ LEFT: 37,
/* 0x26 */ UP: 38,
/* 0x27 */ RIGHT: 39,
/* 0x27 */ FF_QUOTE: 39,
/* 0x28 */ DOWN: 40,
/* 0x2C */ FF_COMMA: 44,
/* 0x2C */ PRTSC: 44,
/* 0x2D */ INS: 45,
/* 0x2E */ DEL: 46,
/* 0x2E */ FF_PERIOD: 46,
/* 0x2F */ FF_SLASH: 47,
/* 0x3B */ FF_SEMI: 59,
/* 0x3D */ FF_EQUALS: 61,
/* 0x5B */ CMD: 91, // aka WIN
/* 0x5B */ FF_LBRACK: 91,
/* 0x5C */ FF_BSLASH: 92,
/* 0x5D */ RCMD: 93, // aka MENU
/* 0x5D */ FF_RBRACK: 93,
/* 0x60 */ NUM_INS: 96, // 0
/* 0x60 */ FF_BQUOTE: 96,
/* 0x61 */ NUM_END: 97, // 1
/* 0x62 */ NUM_DOWN: 98, // 2
/* 0x63 */ NUM_PGDN: 99, // 3
/* 0x64 */ NUM_LEFT: 100, // 4
/* 0x65 */ NUM_CENTER: 101, // 5
/* 0x66 */ NUM_RIGHT: 102, // 6
/* 0x67 */ NUM_HOME: 103, // 7
/* 0x68 */ NUM_UP: 104, // 8
/* 0x69 */ NUM_PGUP: 105, // 9
/* 0x6A */ NUM_MUL: 106,
/* 0x6B */ NUM_ADD: 107,
/* 0x6D */ NUM_SUB: 109,
/* 0x6E */ NUM_DEL: 110, // .
/* 0x6F */ NUM_DIV: 111,
/* 0x70 */ F1: 112,
/* 0x71 */ F2: 113,
/* 0x72 */ F3: 114,
/* 0x73 */ F4: 115,
/* 0x74 */ F5: 116,
/* 0x75 */ F6: 117,
/* 0x76 */ F7: 118,
/* 0x77 */ F8: 119,
/* 0x78 */ F9: 120,
/* 0x79 */ F10: 121,
/* 0x7A */ F11: 122,
/* 0x7B */ F12: 123,
/* 0x90 */ NUM_LOCK: 144,
/* 0x91 */ SCROLL_LOCK: 145,
/* 0xAD */ FF_DASH: 173,
/* 0xBA */ SEMI: 186, // Firefox: 59
/* 0xBB */ EQUALS: 187, // Firefox: 61
/* 0xBC */ COMMA: 188, // Firefox: 44
/* 0xBD */ DASH: 189, // Firefox: 173
/* 0xBE */ PERIOD: 190, // Firefox: 46
/* 0xBF */ SLASH: 191, // Firefox: 47
/* 0xC0 */ BQUOTE: 192, // Firefox: 96
/* 0xDB */ LBRACK: 219, // Firefox: 91
/* 0xDC */ BSLASH: 220, // Firefox: 92
/* 0xDD */ RBRACK: 221, // Firefox: 93
/* 0xDE */ QUOTE: 222, // Firefox: 39
/* 0xE0 */ FF_CMD: 224, // Firefox only (used for both CMD and RCMD)
//
// The following biases use what I'll call Decimal Coded Binary or DCB (the opposite of BCD),
// where the thousands digit is used to store the sum of "binary" digits 1 and/or 2 and/or 4.
//
// Technically, that makes it DCO (Decimal Coded Octal), but then again, BCD should have really
// been called HCD (Hexadecimal Coded Decimal), so if "they" can take liberties, so can I.
//
// ONDOWN is a bias we add to browser keyCodes that we want to handle on "down" rather than on "press".
//
ONDOWN: 1000,
//
// ONRIGHT is a bias we add to browser keyCodes that need to check for a "right" location (default is "left")
//
ONRIGHT: 2000,
//
// FAKE is a bias we add to signal these are fake keyCodes corresponding to internal keystroke combinations.
// The actual values are for internal use only and merely need to be unique and used consistently.
//
FAKE: 4000
};
/*
* Maps "stupid" keyCodes to their "non-stupid" counterparts
*/
Keyboard.STUPID_KEYCODES = {};
Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.SEMI] = Keyboard.ASCII[';']; // 186 -> 59
Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.EQUALS] = Keyboard.ASCII['=']; // 187 -> 61
Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.COMMA] = Keyboard.ASCII[',']; // 188 -> 44
Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.DASH] = Keyboard.ASCII['-']; // 189 -> 45
Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.PERIOD] = Keyboard.ASCII['.']; // 190 -> 46
Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.SLASH] = Keyboard.ASCII['/']; // 191 -> 47
Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.BQUOTE] = Keyboard.ASCII['`']; // 192 -> 96
Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.LBRACK] = Keyboard.ASCII['[']; // 219 -> 91
Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.BSLASH] = Keyboard.ASCII['\\']; // 220 -> 92
Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.RBRACK] = Keyboard.ASCII[']']; // 221 -> 93
Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.QUOTE] = Keyboard.ASCII["'"]; // 222 -> 39
Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.FF_DASH] = Keyboard.ASCII['-'];
/*
* Maps unshifted keyCodes to their shifted counterparts; to be used when a shift-key is down.
* Alphabetic characters are handled in code, since they must also take CAPS_LOCK into consideration.
*/
Keyboard.SHIFTED_KEYCODES = {};
Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['1']] = Keyboard.ASCII['!'];
Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['2']] = Keyboard.ASCII['@'];
Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['3']] = Keyboard.ASCII['#'];
Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['4']] = Keyboard.ASCII['$'];
Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['5']] = Keyboard.ASCII['%'];
Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['6']] = Keyboard.ASCII['^'];
Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['7']] = Keyboard.ASCII['&'];
Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['8']] = Keyboard.ASCII['*'];
Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['9']] = Keyboard.ASCII['('];
Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['0']] = Keyboard.ASCII[')'];
Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.SEMI] = Keyboard.ASCII[':'];
Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.EQUALS] = Keyboard.ASCII['+'];
Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.COMMA] = Keyboard.ASCII['<'];
Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.DASH] = Keyboard.ASCII['_'];
Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.PERIOD] = Keyboard.ASCII['>'];
Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.SLASH] = Keyboard.ASCII['?'];
Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.BQUOTE] = Keyboard.ASCII['~'];
Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.LBRACK] = Keyboard.ASCII['{'];
Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.BSLASH] = Keyboard.ASCII['|'];
Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.RBRACK] = Keyboard.ASCII['}'];
Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.QUOTE] = Keyboard.ASCII['"'];
Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.FF_DASH] = Keyboard.ASCII['_'];
Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.FF_EQUALS] = Keyboard.ASCII['+'];
Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.FF_SEMI] = Keyboard.ASCII[':'];
Keyboard.SIMCODE = {
BS: Keyboard.KEYCODE.BS + Keyboard.KEYCODE.ONDOWN,
TAB: Keyboard.KEYCODE.TAB + Keyboard.KEYCODE.ONDOWN,
SHIFT: Keyboard.KEYCODE.SHIFT + Keyboard.KEYCODE.ONDOWN,
RSHIFT: Keyboard.KEYCODE.SHIFT + Keyboard.KEYCODE.ONDOWN + Keyboard.KEYCODE.ONRIGHT,
CTRL: Keyboard.KEYCODE.CTRL + Keyboard.KEYCODE.ONDOWN,
ALT: Keyboard.KEYCODE.ALT + Keyboard.KEYCODE.ONDOWN,
CAPS_LOCK: Keyboard.KEYCODE.CAPS_LOCK + Keyboard.KEYCODE.ONDOWN,
ESC: Keyboard.KEYCODE.ESC + Keyboard.KEYCODE.ONDOWN,
F1: Keyboard.KEYCODE.F1 + Keyboard.KEYCODE.ONDOWN,
F2: Keyboard.KEYCODE.F2 + Keyboard.KEYCODE.ONDOWN,
F3: Keyboard.KEYCODE.F3 + Keyboard.KEYCODE.ONDOWN,
F4: Keyboard.KEYCODE.F4 + Keyboard.KEYCODE.ONDOWN,
F5: Keyboard.KEYCODE.F5 + Keyboard.KEYCODE.ONDOWN,
F6: Keyboard.KEYCODE.F6 + Keyboard.KEYCODE.ONDOWN,
F7: Keyboard.KEYCODE.F7 + Keyboard.KEYCODE.ONDOWN,
F8: Keyboard.KEYCODE.F8 + Keyboard.KEYCODE.ONDOWN,
F9: Keyboard.KEYCODE.F9 + Keyboard.KEYCODE.ONDOWN,
F10: Keyboard.KEYCODE.F10 + Keyboard.KEYCODE.ONDOWN,
F11: Keyboard.KEYCODE.F11 + Keyboard.KEYCODE.ONDOWN,
F12: Keyboard.KEYCODE.F12 + Keyboard.KEYCODE.ONDOWN,
NUM_LOCK: Keyboard.KEYCODE.NUM_LOCK + Keyboard.KEYCODE.ONDOWN,
SCROLL_LOCK: Keyboard.KEYCODE.SCROLL_LOCK + Keyboard.KEYCODE.ONDOWN,
PRTSC: Keyboard.KEYCODE.PRTSC + Keyboard.KEYCODE.ONDOWN,
HOME: Keyboard.KEYCODE.HOME + Keyboard.KEYCODE.ONDOWN,
UP: Keyboard.KEYCODE.UP + Keyboard.KEYCODE.ONDOWN,
PGUP: Keyboard.KEYCODE.PGUP + Keyboard.KEYCODE.ONDOWN,
NUM_SUB: Keyboard.KEYCODE.NUM_SUB + Keyboard.KEYCODE.ONDOWN,
LEFT: Keyboard.KEYCODE.LEFT + Keyboard.KEYCODE.ONDOWN,
NUM_CENTER: Keyboard.KEYCODE.NUM_CENTER + Keyboard.KEYCODE.ONDOWN,
RIGHT: Keyboard.KEYCODE.RIGHT + Keyboard.KEYCODE.ONDOWN,
NUM_ADD: Keyboard.KEYCODE.NUM_ADD + Keyboard.KEYCODE.ONDOWN,
END: Keyboard.KEYCODE.END + Keyboard.KEYCODE.ONDOWN,
DOWN: Keyboard.KEYCODE.DOWN + Keyboard.KEYCODE.ONDOWN,
PGDN: Keyboard.KEYCODE.PGDN + Keyboard.KEYCODE.ONDOWN,
INS: Keyboard.KEYCODE.INS + Keyboard.KEYCODE.ONDOWN,
DEL: Keyboard.KEYCODE.DEL + Keyboard.KEYCODE.ONDOWN,
CMD: Keyboard.KEYCODE.CMD + Keyboard.KEYCODE.ONDOWN,
RCMD: Keyboard.KEYCODE.RCMD + Keyboard.KEYCODE.ONDOWN,
FF_CMD: Keyboard.KEYCODE.FF_CMD + Keyboard.KEYCODE.ONDOWN,
CTRL_C: Keyboard.ASCII.CTRL_C + Keyboard.KEYCODE.FAKE,
CTRL_BREAK: Keyboard.KEYCODE.BS + Keyboard.KEYCODE.FAKE,
CTRL_ALT_DEL: Keyboard.KEYCODE.DEL + Keyboard.KEYCODE.FAKE
};
/*
* Scan code constants
*/
Keyboard.SCANCODE = {
/* 0x01 */ ESC: 1,
/* 0x02 */ ONE: 2,
/* 0x03 */ TWO: 3,
/* 0x04 */ THREE: 4,
/* 0x05 */ FOUR: 5,
/* 0x06 */ FIVE: 6,
/* 0x07 */ SIX: 7,
/* 0x08 */ SEVEN: 8,
/* 0x09 */ EIGHT: 9,
/* 0x0A */ NINE: 10,
/* 0x0B */ ZERO: 11,
/* 0x0C */ DASH: 12,
/* 0x0D */ EQUALS: 13,
/* 0x0E */ BS: 14,
/* 0x0F */ TAB: 15,
/* 0x10 */ Q: 16,
/* 0x11 */ W: 17,
/* 0x12 */ E: 18,
/* 0x13 */ R: 19,
/* 0x14 */ T: 20,
/* 0x15 */ Y: 21,
/* 0x16 */ U: 22,
/* 0x17 */ I: 23,
/* 0x18 */ O: 24,
/* 0x19 */ P: 25,
/* 0x1A */ LBRACK: 26,
/* 0x1B */ RBRACK: 27,
/* 0x1C */ ENTER: 28,
/* 0x1D */ CTRL: 29,
/* 0x1E */ A: 30,
/* 0x1F */ S: 31,
/* 0x20 */ D: 32,
/* 0x21 */ F: 33,
/* 0x22 */ G: 34,
/* 0x23 */ H: 35,
/* 0x24 */ J: 36,
/* 0x25 */ K: 37,
/* 0x26 */ L: 38,
/* 0x27 */ SEMI: 39,
/* 0x28 */ QUOTE: 40,
/* 0x29 */ BQUOTE: 41,
/* 0x2A */ SHIFT: 42,
/* 0x2B */ BSLASH: 43,
/* 0x2C */ Z: 44,
/* 0x2D */ X: 45,
/* 0x2E */ C: 46,
/* 0x2F */ V: 47,
/* 0x30 */ B: 48,
/* 0x31 */ N: 49,
/* 0x32 */ M: 50,
/* 0x33 */ COMMA: 51,
/* 0x34 */ PERIOD: 52,
/* 0x35 */ SLASH: 53,
/* 0x36 */ RSHIFT: 54,
/* 0x37 */ PRTSC: 55, // unshifted '*'; becomes dedicated 'Print Screen' key on 101-key keyboards
/* 0x38 */ ALT: 56,
/* 0x39 */ SPACE: 57,
/* 0x3A */ CAPS_LOCK: 58,
/* 0x3B */ F1: 59,
/* 0x3C */ F2: 60,
/* 0x3D */ F3: 61,
/* 0x3E */ F4: 62,
/* 0x3F */ F5: 63,
/* 0x40 */ F6: 64,
/* 0x41 */ F7: 65,
/* 0x42 */ F8: 66,
/* 0x43 */ F9: 67,
/* 0x44 */ F10: 68,
/* 0x45 */ NUM_LOCK: 69,
/* 0x46 */ SCROLL_LOCK: 70,
/* 0x47 */ NUM_HOME: 71,
/* 0x48 */ NUM_UP: 72,
/* 0x49 */ NUM_PGUP: 73,
/* 0x4A */ NUM_SUB: 74,
/* 0x4B */ NUM_LEFT: 75,
/* 0x4C */ NUM_CENTER: 76,
/* 0x4D */ NUM_RIGHT: 77,
/* 0x4E */ NUM_ADD: 78,
/* 0x4F */ NUM_END: 79,
/* 0x50 */ NUM_DOWN: 80,
/* 0x51 */ NUM_PGDN: 81,
/* 0x52 */ NUM_INS: 82,
/* 0x53 */ NUM_DEL: 83,
/* 0x54 */ SYSREQ: 84, // 84-key keyboard only (simulated with 'alt'+'prtsc' on 101-key keyboards)
/* 0x54 */ PAUSE: 84, // 101-key keyboard only
/* 0x57 */ F11: 87,
/* 0x58 */ F12: 88,
/* 0x5B */ WIN: 91, // aka CMD
/* 0x5C */ RWIN: 92,
/* 0x5D */ MENU: 93, // aka CMD + ONRIGHT
/* 0x7F */ MAKE: 127,
/* 0x80 */ BREAK: 128,
/* 0xE0 */ EXTEND1: 224,
/* 0xE1 */ EXTEND2: 225
};
/**
* The set of values that a browser may store in the 'location' property of a keyboard event object
* which we also support.
*
* @enum {number}
*/
Keyboard.LOCATION = {
LEFT: 1,
RIGHT: 2,
NUMPAD: 3
};
/**
* These internal "shift key" states are used to indicate BOTH the physical shift-key states (in bitsState)
* and the simulated shift-key states (in bitsStateSim). The LOCK keys are problematic in both cases: the
* browsers give us no way to query the LOCK key states, so we can only infer them, and because they are "soft"
* locks, the machine's notion of their state is subject to change at any time as well. Granted, the IBM PC
* ROM BIOS will store its LOCK states in the ROM BIOS Data Area (@0040:0017), but that's just a BIOS convention.
*
* Also, because this is purely for internal use, don't make the mistake of thinking that these bits have any
* connection to the ROM BIOS bits @0040:0017 (they don't). We emulate hardware, not ROMs.
*
* TODO: Consider taking notice of the ROM BIOS Data Area state anyway, even though I'd rather remain ROM-agnostic;
* at the very least, it would help us keep our LOCK LEDs in sync with the machine's LOCK states. However, the LED
* issue will be largely moot (at least for MODEL_5170 machines) once we add support for PC AT keyboard LED commands.
*
* Note that right-hand state bits are equal to the left-hand bits shifted right 1 bit; makes sense, "right"? ;-)
*
* @enum {number}
*/
Keyboard.STATE = {
RSHIFT: 0x0001,
SHIFT: 0x0002,
RCTRL: 0x0004, // 101-key keyboard only
CTRL: 0x0008,
CTRLS: 0x000c,
RALT: 0x0010, // 101-key keyboard only
ALT: 0x0020,
ALTS: 0x0030,
RCMD: 0x0040, // 101-key keyboard only
CMD: 0x0080, // 101-key keyboard only
CMDS: 0x00c0,
ALL_RIGHT: 0x0055, // RSHIFT | RCTRL | RALT | RCMD
ALL_SHIFT: 0x00ff, // SHIFT | RSHIFT | CTRL | RCTRL | ALT | RALT | CMD | RCMD
INSERT: 0x0100, // TODO: Placeholder (we currently have no notion of any "insert" states)
CAPS_LOCK: 0x0200,
NUM_LOCK: 0x0400,
SCROLL_LOCK: 0x0800,
ALL_LOCKS: 0x0e00 // CAPS_LOCK | NUM_LOCK | SCROLL_LOCK
};
/**
* Maps KEYCODES of shift/modifier keys to their corresponding (default) STATES bit above.
*
* @enum {number}
*/
Keyboard.KEYSTATES = {};
Keyboard.KEYSTATES[Keyboard.SIMCODE.RSHIFT] = Keyboard.STATE.RSHIFT;
Keyboard.KEYSTATES[Keyboard.SIMCODE.SHIFT] = Keyboard.STATE.SHIFT;
Keyboard.KEYSTATES[Keyboard.SIMCODE.CTRL] = Keyboard.STATE.CTRL;
Keyboard.KEYSTATES[Keyboard.SIMCODE.ALT] = Keyboard.STATE.ALT;
Keyboard.KEYSTATES[Keyboard.SIMCODE.CMD] = Keyboard.STATE.CMD;
Keyboard.KEYSTATES[Keyboard.SIMCODE.RCMD] = Keyboard.STATE.RCMD;
Keyboard.KEYSTATES[Keyboard.SIMCODE.FF_CMD] = Keyboard.STATE.CMD;
Keyboard.KEYSTATES[Keyboard.SIMCODE.CAPS_LOCK] = Keyboard.STATE.CAPS_LOCK;
Keyboard.KEYSTATES[Keyboard.SIMCODE.NUM_LOCK] = Keyboard.STATE.NUM_LOCK;
Keyboard.KEYSTATES[Keyboard.SIMCODE.SCROLL_LOCK] = Keyboard.STATE.SCROLL_LOCK;
/**
* Maps CLICKCODE (string) to SIMCODE (number).
*
* @enum {number}
*/
Keyboard.CLICKCODES = {
'TAB': Keyboard.SIMCODE.TAB,
'ESC': Keyboard.SIMCODE.ESC,
'F1': Keyboard.SIMCODE.F1,
'F2': Keyboard.SIMCODE.F2,
'F3': Keyboard.SIMCODE.F3,
'F4': Keyboard.SIMCODE.F4,
'F5': Keyboard.SIMCODE.F5,
'F6': Keyboard.SIMCODE.F6,
'F7': Keyboard.SIMCODE.F7,
'F8': Keyboard.SIMCODE.F8,
'F9': Keyboard.SIMCODE.F9,
'F10': Keyboard.SIMCODE.F10,
'LEFT': Keyboard.SIMCODE.LEFT, // formerly "left-arrow"
'UP': Keyboard.SIMCODE.UP, // formerly "up-arrow"
'RIGHT': Keyboard.SIMCODE.RIGHT, // formerly "right-arrow"
'DOWN': Keyboard.SIMCODE.DOWN, // formerly "down-arrow"
/*
* These bindings are for convenience (common key combinations that can be bound to a single control)
*/
'CTRL_C': Keyboard.SIMCODE.CTRL_C,
'CTRL_BREAK': Keyboard.SIMCODE.CTRL_BREAK,
'CTRL_ALT_DEL': Keyboard.SIMCODE.CTRL_ALT_DEL
};
/**
* Maps SOFTCODE (string) to KEYCODE or SIMCODE (number).
*
* We define identifiers for all possible keys, based on their primary (unshifted) character or function.
* This also serves as a definition of all supported keys, making it possible to create full-featured
* "soft keyboards".
*
* One exception to the (unshifted) rule above is 'prtsc': on the original IBM 83-key and 84-key keyboards,
* its primary (unshifted) character was '*', but on 101-key keyboards, it became a separate key ('prtsc',
* now labeled "Print Screen"), as did the num-pad '*' ('num-mul'), so 'prtsc' seems worthy of an exception
* to the rule.
*
* On 83-key and 84-key keyboards, 'ctrl'+'num-lock' triggered a "pause" operation and 'ctrl'+'scroll-lock'
* triggered a "break" operation.
*
* On 101-key keyboards, IBM decided to move both those special operations to a new 'pause' ("Pause/Break")
* key, near the new dedicated 'prtsc' ("Print Screen/SysRq") key -- and to drop the "e" from "SysReq".
* Those keys behave as follows:
*
* When 'pause' is pressed alone, it generates 0xe1 0x1d 0x45 0xe1 0x9d 0xc5 on make (nothing on break),
* which essentially simulates the make-and-break of the 'ctrl' and 'num-lock' keys (ignoring the 0xe1),
* triggering a "pause" operation.
*
* When 'pause' is pressed with 'ctrl', it generates 0xe0 0x46 0xe0 0xc6 on make (nothing on break) and
* does not repeat, which essentially simulates the make-and-break of 'scroll-lock', which, in conjunction
* with the separate make-and-break of 'ctrl', triggers a "break" operation.
*
* When 'prtsc' is pressed alone, it generates 0xe0 0x2a 0xe0 0x37, simulating the make of both 'shift'
* and 'prtsc'; when pressed with 'shift' or 'ctrl', it generates only 0xe0 0x37; and when pressed with
* 'alt', it generates only 0x54 (to simulate 'sysreq').
*
* TODO: Implement the above behaviors.
*
* All key identifiers must be quotable using single-quotes, because that's how components.xsl will encode them
* *inside* the "data-value" attribute of the corresponding HTML control. Which, in turn, is why the single-quote
* key is defined as 'quote' rather than "'". Similarly, if there was unshifted "double-quote" key, it could
* not be called '"', because components.xsl quotes the *entire* "data-value" attribute using double-quotes.
*
* In the (informal) numbering of keys below, two keys are deliberately numbered 84, reflecting the fact that
* the 'sysreq' key was added to the 84-key keyboard but then dropped from the 101-key keyboard as a stand-alone key.
*
* @enum {number}
*/
Keyboard.SOFTCODES = {
/* 1 */ 'esc': Keyboard.SIMCODE.ESC,
/* 2 */ '1': Keyboard.ASCII['1'],
/* 3 */ '2': Keyboard.ASCII['2'],
/* 4 */ '3': Keyboard.ASCII['3'],
/* 5 */ '4': Keyboard.ASCII['4'],
/* 6 */ '5': Keyboard.ASCII['5'],
/* 7 */ '6': Keyboard.ASCII['6'],
/* 8 */ '7': Keyboard.ASCII['7'],
/* 9 */ '8': Keyboard.ASCII['8'],
/* 10 */ '9': Keyboard.ASCII['9'],
/* 11 */ '0': Keyboard.ASCII['0'],
/* 12 */ '-': Keyboard.ASCII['-'],
/* 13 */ '=': Keyboard.ASCII['='],
/* 14 */ 'bs': Keyboard.SIMCODE.BS,
/* 15 */ 'tab': Keyboard.SIMCODE.TAB,
/* 16 */ 'q': Keyboard.ASCII.Q,
/* 17 */ 'w': Keyboard.ASCII.W,
/* 18 */ 'e': Keyboard.ASCII.E,
/* 19 */ 'r': Keyboard.ASCII.R,
/* 20 */ 't': Keyboard.ASCII.T,
/* 21 */ 'y': Keyboard.ASCII.Y,
/* 22 */ 'u': Keyboard.ASCII.U,
/* 23 */ 'i': Keyboard.ASCII.I,
/* 24 */ 'o': Keyboard.ASCII.O,
/* 25 */ 'p': Keyboard.ASCII.P,
/* 26 */ '[': Keyboard.ASCII['['],
/* 27 */ ']': Keyboard.ASCII[']'],
/* 28 */ 'enter': Keyboard.KEYCODE.CR,
/* 29 */ 'ctrl': Keyboard.SIMCODE.CTRL,
/* 30 */ 'a': Keyboard.ASCII.A,
/* 31 */ 's': Keyboard.ASCII.S,
/* 32 */ 'd': Keyboard.ASCII.D,
/* 33 */ 'f': Keyboard.ASCII.F,
/* 34 */ 'g': Keyboard.ASCII.G,
/* 35 */ 'h': Keyboard.ASCII.H,
/* 36 */ 'j': Keyboard.ASCII.J,
/* 37 */ 'k': Keyboard.ASCII.K,
/* 38 */ 'l': Keyboard.ASCII.L,
/* 39 */ ';': Keyboard.ASCII[';'],
/* 40 */ 'quote': Keyboard.ASCII["'"], // formerly "squote"
/* 41 */ '`': Keyboard.ASCII['`'], // formerly "bquote"
/* 42 */ 'shift': Keyboard.SIMCODE.SHIFT, // formerly "lshift"
/* 43 */ '\\': Keyboard.ASCII['\\'], // formerly "bslash"
/* 44 */ 'z': Keyboard.ASCII.Z,
/* 45 */ 'x': Keyboard.ASCII.X,
/* 46 */ 'c': Keyboard.ASCII.C,
/* 47 */ 'v': Keyboard.ASCII.V,
/* 48 */ 'b': Keyboard.ASCII.B,
/* 49 */ 'n': Keyboard.ASCII.N,
/* 50 */ 'm': Keyboard.ASCII.M,
/* 51 */ ',': Keyboard.ASCII[','],
/* 52 */ '.': Keyboard.ASCII['.'],
/* 53 */ '/': Keyboard.ASCII['/'],
/* 54 */ 'right-shift': Keyboard.SIMCODE.RSHIFT, // formerly "rshift"
/* 55 */ 'prtsc': Keyboard.SIMCODE.PRTSC, // unshifted '*'; becomes dedicated 'Print Screen' key on 101-key keyboards
/* 56 */ 'alt': Keyboard.SIMCODE.ALT,
/* 57 */ 'space': Keyboard.ASCII[' '],
/* 58 */ 'caps-lock': Keyboard.SIMCODE.CAPS_LOCK,
/* 59 */ 'f1': Keyboard.SIMCODE.F1,
/* 60 */ 'f2': Keyboard.SIMCODE.F2,
/* 61 */ 'f3': Keyboard.SIMCODE.F3,
/* 62 */ 'f4': Keyboard.SIMCODE.F4,
/* 63 */ 'f5': Keyboard.SIMCODE.F5,
/* 64 */ 'f6': Keyboard.SIMCODE.F6,
/* 65 */ 'f7': Keyboard.SIMCODE.F7,
/* 66 */ 'f8': Keyboard.SIMCODE.F8,
/* 67 */ 'f9': Keyboard.SIMCODE.F9,
/* 68 */ 'f10': Keyboard.SIMCODE.F10,
/* 69 */ 'num-lock': Keyboard.SIMCODE.NUM_LOCK,
/* 70 */ 'scroll-lock': Keyboard.SIMCODE.SCROLL_LOCK, // TODO: 0xe046 on 101-key keyboards?
/* 71 */ 'num-home': Keyboard.SIMCODE.HOME, // formerly "home"
/* 72 */ 'num-up': Keyboard.SIMCODE.UP, // formerly "up-arrow"
/* 73 */ 'num-pgup': Keyboard.SIMCODE.PGUP, // formerly "page-up"
/* 74 */ 'num-sub': Keyboard.SIMCODE.NUM_SUB, // formerly "num-minus"
/* 75 */ 'num-left': Keyboard.SIMCODE.LEFT, // formerly "left-arrow"
/* 76 */ 'num-center': Keyboard.SIMCODE.NUM_CENTER, // formerly "center"
/* 77 */ 'num-right': Keyboard.SIMCODE.RIGHT, // formerly "right-arrow"
/* 78 */ 'num-add': Keyboard.SIMCODE.NUM_ADD, // formerly "num-plus"
/* 79 */ 'num-end': Keyboard.SIMCODE.END, // formerly "end"
/* 80 */ 'num-down': Keyboard.SIMCODE.DOWN, // formerly "down-arrow"
/* 81 */ 'num-pgdn': Keyboard.SIMCODE.PGDN, // formerly "page-down"
/* 82 */ 'num-ins': Keyboard.SIMCODE.INS, // formerly "ins"
/* 83 */ 'num-del': Keyboard.SIMCODE.DEL // formerly "del"
// /* 84 */ 'sysreq': Keyboard.SCANCODE.SYSREQ, // 84-key keyboard only (simulated with 'alt'+'prtsc' on 101-key keyboards)
// /* 84 */ 'pause': Keyboard.SCANCODE.PAUSE, // 101-key keyboard only
// /* 85 */ 'f11': Keyboard.SCANCODE.F11,
// /* 86 */ 'f12': Keyboard.SCANCODE.F12,
// /* 87 */ 'num-enter': Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.ENTER << 8),
// /* 88 */ 'right-ctrl': Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.CTRL << 8),
// /* 89 */ 'num-div': Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.SLASH << 8),
// /* 90 */ 'num-mul': Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.PRTSC << 8),
// /* 91 */ 'right-alt': Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.ALT << 8),
// /* 92 */ 'home': Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_HOME << 8),
// /* 93 */ 'up': Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_UP << 8),
// /* 94 */ 'pgup': Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_PGUP << 8),
// /* 95 */ 'left': Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_LEFT << 8),
// /* 96 */ 'right': Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_RIGHT << 8),
// /* 97 */ 'end': Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_END << 8),
// /* 98 */ 'down': Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_DOWN << 8),
// /* 99 */ 'pgdn': Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_PGDN << 8),
// /*100 */ 'ins': Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_INS << 8),
// /*101 */ 'del': Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_DEL << 8),
// 'win': Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.WIN << 8),
// 'right-win': Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.RWIN << 8),
// 'menu': Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.MENU << 8)
};
/**
* Maps "soft-key" definitions (above) of shift/modifier keys to their corresponding (default) STATES bit.
*
* @enum {number}
*/
Keyboard.LEDSTATES = {
'caps-lock': Keyboard.STATE.CAPS_LOCK,
'num-lock': Keyboard.STATE.NUM_LOCK,
'scroll-lock': Keyboard.STATE.SCROLL_LOCK
};
/**
* Maps SIMCODE (number) to SCANCODE (number(s)).
*
* This array is used by keySimulate() to lookup a given SIMCODE and convert it to a SCANCODE
* (lower byte), plus any required shift key SCANCODES (upper bytes).
*
* Using keyCodes from keyPress events proved to be more robust than using keyCodes from keyDown and
* keyUp events, in part because of differences in the way browsers generate the keyDown and keyUp events.
* For example, Safari on iOS devices will not generate up/down events for shift keys, and for other keys,
* the up/down events are usually generated after the actual press is complete, and in rapid succession.
*
* The other problem (which is more of a problem with keyboards like the C1P than any IBM keyboards) is
* that the shift/modifier state for a character on the "source" keyboard may not match the shift/modifier
* state for the same character on the "target" keyboard. And since this code is inherited from C1Pjs,
* we've inherited the same solution: keySimulate() has the ability to "undo" any states in bitsState
* that conflict with the state(s) required for the character in question.
*
* @enum {number}
*/
Keyboard.SIMCODES = {};
Keyboard.SIMCODES[Keyboard.SIMCODE.ESC] = Keyboard.SCANCODE.ESC;
Keyboard.SIMCODES[Keyboard.ASCII['1']] = Keyboard.SCANCODE.ONE;
Keyboard.SIMCODES[Keyboard.ASCII['!']] = Keyboard.SCANCODE.ONE | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII['2']] = Keyboard.SCANCODE.TWO;
Keyboard.SIMCODES[Keyboard.ASCII['@']] = Keyboard.SCANCODE.TWO | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII['3']] = Keyboard.SCANCODE.THREE;
Keyboard.SIMCODES[Keyboard.ASCII['#']] = Keyboard.SCANCODE.THREE | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII['4']] = Keyboard.SCANCODE.FOUR;
Keyboard.SIMCODES[Keyboard.ASCII['$']] = Keyboard.SCANCODE.FOUR | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII['5']] = Keyboard.SCANCODE.FIVE;
Keyboard.SIMCODES[Keyboard.ASCII['%']] = Keyboard.SCANCODE.FIVE | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII['6']] = Keyboard.SCANCODE.SIX;
Keyboard.SIMCODES[Keyboard.ASCII['^']] = Keyboard.SCANCODE.SIX | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII['7']] = Keyboard.SCANCODE.SEVEN;
Keyboard.SIMCODES[Keyboard.ASCII['&']] = Keyboard.SCANCODE.SEVEN | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII['8']] = Keyboard.SCANCODE.EIGHT;
Keyboard.SIMCODES[Keyboard.ASCII['*']] = Keyboard.SCANCODE.EIGHT | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII['9']] = Keyboard.SCANCODE.NINE;
Keyboard.SIMCODES[Keyboard.ASCII['(']] = Keyboard.SCANCODE.NINE | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII['0']] = Keyboard.SCANCODE.ZERO;
Keyboard.SIMCODES[Keyboard.ASCII[')']] = Keyboard.SCANCODE.ZERO | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII['-']] = Keyboard.SCANCODE.DASH;
Keyboard.SIMCODES[Keyboard.ASCII['_']] = Keyboard.SCANCODE.DASH | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII['=']] = Keyboard.SCANCODE.EQUALS;
Keyboard.SIMCODES[Keyboard.ASCII['+']] = Keyboard.SCANCODE.EQUALS | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.SIMCODE.BS] = Keyboard.SCANCODE.BS;
Keyboard.SIMCODES[Keyboard.SIMCODE.TAB] = Keyboard.SCANCODE.TAB;
Keyboard.SIMCODES[Keyboard.ASCII.q] = Keyboard.SCANCODE.Q;
Keyboard.SIMCODES[Keyboard.ASCII.Q] = Keyboard.SCANCODE.Q | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII.w] = Keyboard.SCANCODE.W;
Keyboard.SIMCODES[Keyboard.ASCII.W] = Keyboard.SCANCODE.W | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII.e] = Keyboard.SCANCODE.E;
Keyboard.SIMCODES[Keyboard.ASCII.E] = Keyboard.SCANCODE.E | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII.r] = Keyboard.SCANCODE.R;
Keyboard.SIMCODES[Keyboard.ASCII.R] = Keyboard.SCANCODE.R | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII.t] = Keyboard.SCANCODE.T;
Keyboard.SIMCODES[Keyboard.ASCII.T] = Keyboard.SCANCODE.T | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII.y] = Keyboard.SCANCODE.Y;
Keyboard.SIMCODES[Keyboard.ASCII.Y] = Keyboard.SCANCODE.Y | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII.u] = Keyboard.SCANCODE.U;
Keyboard.SIMCODES[Keyboard.ASCII.U] = Keyboard.SCANCODE.U | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII.i] = Keyboard.SCANCODE.I;
Keyboard.SIMCODES[Keyboard.ASCII.I] = Keyboard.SCANCODE.I | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII.o] = Keyboard.SCANCODE.O;
Keyboard.SIMCODES[Keyboard.ASCII.O] = Keyboard.SCANCODE.O | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII.p] = Keyboard.SCANCODE.P;
Keyboard.SIMCODES[Keyboard.ASCII.P] = Keyboard.SCANCODE.P | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII['[']] = Keyboard.SCANCODE.LBRACK;
Keyboard.SIMCODES[Keyboard.ASCII['{']] = Keyboard.SCANCODE.LBRACK | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII[']']] = Keyboard.SCANCODE.RBRACK;
Keyboard.SIMCODES[Keyboard.ASCII['}']] = Keyboard.SCANCODE.RBRACK | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.KEYCODE.CR] = Keyboard.SCANCODE.ENTER;
Keyboard.SIMCODES[Keyboard.SIMCODE.CTRL] = Keyboard.SCANCODE.CTRL;
Keyboard.SIMCODES[Keyboard.ASCII.a] = Keyboard.SCANCODE.A;
Keyboard.SIMCODES[Keyboard.ASCII.A] = Keyboard.SCANCODE.A | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII.s] = Keyboard.SCANCODE.S;
Keyboard.SIMCODES[Keyboard.ASCII.S] = Keyboard.SCANCODE.S | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII.d] = Keyboard.SCANCODE.D;
Keyboard.SIMCODES[Keyboard.ASCII.D] = Keyboard.SCANCODE.D | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII.f] = Keyboard.SCANCODE.F;
Keyboard.SIMCODES[Keyboard.ASCII.F] = Keyboard.SCANCODE.F | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII.g] = Keyboard.SCANCODE.G;
Keyboard.SIMCODES[Keyboard.ASCII.G] = Keyboard.SCANCODE.G | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII.h] = Keyboard.SCANCODE.H;
Keyboard.SIMCODES[Keyboard.ASCII.H] = Keyboard.SCANCODE.H | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII.j] = Keyboard.SCANCODE.J;
Keyboard.SIMCODES[Keyboard.ASCII.J] = Keyboard.SCANCODE.J | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII.k] = Keyboard.SCANCODE.K;
Keyboard.SIMCODES[Keyboard.ASCII.K] = Keyboard.SCANCODE.K | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII.l] = Keyboard.SCANCODE.L;
Keyboard.SIMCODES[Keyboard.ASCII.L] = Keyboard.SCANCODE.L | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII[';']] = Keyboard.SCANCODE.SEMI;
Keyboard.SIMCODES[Keyboard.ASCII[':']] = Keyboard.SCANCODE.SEMI | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII["'"]] = Keyboard.SCANCODE.QUOTE;
Keyboard.SIMCODES[Keyboard.ASCII['"']] = Keyboard.SCANCODE.QUOTE | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII['`']] = Keyboard.SCANCODE.BQUOTE;
Keyboard.SIMCODES[Keyboard.ASCII['~']] = Keyboard.SCANCODE.BQUOTE | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.SIMCODE.SHIFT] = Keyboard.SCANCODE.SHIFT;
Keyboard.SIMCODES[Keyboard.ASCII['\\']] = Keyboard.SCANCODE.BSLASH;
Keyboard.SIMCODES[Keyboard.ASCII['|']] = Keyboard.SCANCODE.BSLASH | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII.z] = Keyboard.SCANCODE.Z;
Keyboard.SIMCODES[Keyboard.ASCII.Z] = Keyboard.SCANCODE.Z | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII.x] = Keyboard.SCANCODE.X;
Keyboard.SIMCODES[Keyboard.ASCII.X] = Keyboard.SCANCODE.X | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII.c] = Keyboard.SCANCODE.C;
Keyboard.SIMCODES[Keyboard.ASCII.C] = Keyboard.SCANCODE.C | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII.v] = Keyboard.SCANCODE.V;
Keyboard.SIMCODES[Keyboard.ASCII.V] = Keyboard.SCANCODE.V | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII.b] = Keyboard.SCANCODE.B;
Keyboard.SIMCODES[Keyboard.ASCII.B] = Keyboard.SCANCODE.B | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII.n] = Keyboard.SCANCODE.N;
Keyboard.SIMCODES[Keyboard.ASCII.N] = Keyboard.SCANCODE.N | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII.m] = Keyboard.SCANCODE.M;
Keyboard.SIMCODES[Keyboard.ASCII.M] = Keyboard.SCANCODE.M | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII[',']] = Keyboard.SCANCODE.COMMA;
Keyboard.SIMCODES[Keyboard.ASCII['<']] = Keyboard.SCANCODE.COMMA | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII['.']] = Keyboard.SCANCODE.PERIOD;
Keyboard.SIMCODES[Keyboard.ASCII['>']] = Keyboard.SCANCODE.PERIOD | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.ASCII['/']] = Keyboard.SCANCODE.SLASH;
Keyboard.SIMCODES[Keyboard.ASCII['?']] = Keyboard.SCANCODE.SLASH | (Keyboard.SCANCODE.SHIFT << 8);
Keyboard.SIMCODES[Keyboard.SIMCODE.RSHIFT] = Keyboard.SCANCODE.RSHIFT;
Keyboard.SIMCODES[Keyboard.SIMCODE.PRTSC] = Keyboard.SCANCODE.PRTSC;
Keyboard.SIMCODES[Keyboard.SIMCODE.ALT] = Keyboard.SCANCODE.ALT;
Keyboard.SIMCODES[Keyboard.ASCII[' ']] = Keyboard.SCANCODE.SPACE;
Keyboard.SIMCODES[Keyboard.SIMCODE.CAPS_LOCK] = Keyboard.SCANCODE.CAPS_LOCK;
Keyboard.SIMCODES[Keyboard.SIMCODE.F1] = Keyboard.SCANCODE.F1;
Keyboard.SIMCODES[Keyboard.SIMCODE.F2] = Keyboard.SCANCODE.F2;
Keyboard.SIMCODES[Keyboard.SIMCODE.F3] = Keyboard.SCANCODE.F3;
Keyboard.SIMCODES[Keyboard.SIMCODE.F4] = Keyboard.SCANCODE.F4;
Keyboard.SIMCODES[Keyboard.SIMCODE.F5] = Keyboard.SCANCODE.F5;
Keyboard.SIMCODES[Keyboard.SIMCODE.F6] = Keyboard.SCANCODE.F6;
Keyboard.SIMCODES[Keyboard.SIMCODE.F7] = Keyboard.SCANCODE.F7;
Keyboard.SIMCODES[Keyboard.SIMCODE.F8] = Keyboard.SCANCODE.F8;
Keyboard.SIMCODES[Keyboard.SIMCODE.F9] = Keyboard.SCANCODE.F9;
Keyboard.SIMCODES[Keyboard.SIMCODE.F10] = Keyboard.SCANCODE.F10;
Keyboard.SIMCODES[Keyboard.SIMCODE.NUM_LOCK] = Keyboard.SCANCODE.NUM_LOCK;
Keyboard.SIMCODES[Keyboard.SIMCODE.SCROLL_LOCK] = Keyboard.SCANCODE.SCROLL_LOCK;
Keyboard.SIMCODES[Keyboard.SIMCODE.HOME] = Keyboard.SCANCODE.NUM_HOME;
Keyboard.SIMCODES[Keyboard.SIMCODE.UP] = Keyboard.SCANCODE.NUM_UP;
Keyboard.SIMCODES[Keyboard.SIMCODE.PGUP] = Keyboard.SCANCODE.NUM_PGUP;
Keyboard.SIMCODES[Keyboard.SIMCODE.NUM_SUB] = Keyboard.SCANCODE.NUM_SUB;
Keyboard.SIMCODES[Keyboard.SIMCODE.LEFT] = Keyboard.SCANCODE.NUM_LEFT;
Keyboard.SIMCODES[Keyboard.SIMCODE.NUM_CENTER] = Keyboard.SCANCODE.NUM_CENTER;
Keyboard.SIMCODES[Keyboard.SIMCODE.RIGHT] = Keyboard.SCANCODE.NUM_RIGHT;
Keyboard.SIMCODES[Keyboard.SIMCODE.NUM_ADD] = Keyboard.SCANCODE.NUM_ADD;
Keyboard.SIMCODES[Keyboard.SIMCODE.END] = Keyboard.SCANCODE.NUM_END;
Keyboard.SIMCODES[Keyboard.SIMCODE.DOWN] = Keyboard.SCANCODE.NUM_DOWN;
Keyboard.SIMCODES[Keyboard.SIMCODE.PGDN] = Keyboard.SCANCODE.NUM_PGDN;
Keyboard.SIMCODES[Keyboard.SIMCODE.INS] = Keyboard.SCANCODE.NUM_INS;
Keyboard.SIMCODES[Keyboard.SIMCODE.DEL] = Keyboard.SCANCODE.NUM_DEL;
/*
* Entries beyond this point are for keys that existed only on 101-key keyboards (well, except for 'sysreq',
* which also existed on the 84-key keyboard), which ALSO means that these keys essentially did not exist
* for a MODEL_5150 or MODEL_5160 machine, because those machines could use only 83-key keyboards. Remember
* that IBM machines and IBM keyboards are our reference point here, so while there were undoubtedly 5150/5160
* clones that could use newer keyboards, as well as 3rd-party keyboards that could work with older machines,
* support for non-IBM configurations is left for another day.
*
* TODO: The only relevance of newer keyboards to older machines is the fact that you're probably using a newer
* keyboard with your browser, which raises the question of what to do with newer keys that older machines
* wouldn't understand. I don't attempt to filter out any of the entries below based on machine model, but that
* would seem like a wise thing to do.
*
* TODO: Add entries for 'num-mul', 'num-div', 'num-enter', the stand-alone arrow keys, etc, AND at the same time,
* make sure that keys with multi-byte sequences (eg, 0xe0 0x1c) work properly.
*/
Keyboard.SIMCODES[Keyboard.SIMCODE.F11] = Keyboard.SCANCODE.F11;
Keyboard.SIMCODES[Keyboard.SIMCODE.F12] = Keyboard.SCANCODE.F12;
Keyboard.SIMCODES[Keyboard.SIMCODE.CMD] = Keyboard.SCANCODE.WIN;
Keyboard.SIMCODES[Keyboard.SIMCODE.RCMD] = Keyboard.SCANCODE.MENU;
Keyboard.SIMCODES[Keyboard.SIMCODE.FF_CMD] = Keyboard.SCANCODE.WIN;
Keyboard.SIMCODES[Keyboard.SIMCODE.CTRL_C] = Keyboard.SCANCODE.C | (Keyboard.SCANCODE.CTRL << 8);
Keyboard.SIMCODES[Keyboard.SIMCODE.CTRL_BREAK] = Keyboard.SCANCODE.SCROLL_LOCK | (Keyboard.SCANCODE.CTRL << 8);
Keyboard.SIMCODES[Keyboard.SIMCODE.CTRL_ALT_DEL] = Keyboard.SCANCODE.NUM_DEL | (Keyboard.SCANCODE.CTRL << 8) | (Keyboard.SCANCODE.ALT << 16);
/**
* Commands that can be sent to the Keyboard via the 8042; see sendCmd()
*
* @enum {number}
*/
Keyboard.CMD = {
RESET: 0xFF,
RESEND: 0xFE,
DEF_ON: 0xF6,
DEF_OFF: 0xF5,
ENABLE: 0xF4,
SET_RATE: 0xF3,
ECHO: 0xEE,
SET_LEDS: 0xED
};
/**
* Command responses returned to the Keyboard via the 8042; see sendCmd()
*
* @enum {number}
*/
Keyboard.CMDRES = {
OVERRUN: 0x00,
LOAD_TEST: 0x65, // undocumented "LOAD MANUFACTURING TEST REQUEST" response code
BAT_OK: 0xAA, // Basic Assurance Test (BAT) succeeded
ECHO: 0xEE,
BREAK_PREF: 0xF0, // break prefix
ACK: 0xFA,
BAT_FAIL: 0xFC, // Basic Assurance Test (BAT) failed
DIAG_FAIL: 0xFD,
RESEND: 0xFE,
BUFF_FULL: 0xFF // TODO: Verify this response code (is it just for older 83-key keyboards?)
};
Keyboard.LIMIT = {
MAX_SCANCODES: 20 // TODO: Verify this limit for newer keyboards (84-key and up)
};
/**
* setBinding(sHTMLType, sBinding, control)
*
* @this {Keyboard}
* @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
* @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "esc")
* @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
* @return {boolean} true if binding was successful, false if unrecognized binding request
*/
Keyboard.prototype.setBinding = function(sHTMLType, sBinding, control)
{
/*
* There's a special binding that the Video component uses ("kbd") to effectively bind its
* screen to the entire keyboard, in Video.powerUp(); ie:
*
* video.kbd.setBinding("canvas", "kbd", video.canvasScreen);
* or:
* video.kbd.setBinding("textarea", "kbd", video.textareaScreen);
*
* However, it's also possible for the keyboard XML definition to define a control that serves
* a similar purpose; eg:
*
* <control type="text" binding="kbd" width="2em">Kbd</control>
*
* The latter is purely experimental, while we work on finding ways to trigger the soft keyboard on
* certain pesky devices (like the Kindle Fire). Note that even if you use the latter, the former will
* still be enabled (there's currently no way to configure the Video component to not bind its screen,
* but we could certainly add one if the need ever arose).
*/
var kbd = this;
var id = sHTMLType + '-' + sBinding;
if (this.bindings[id] === undefined) {
switch (sBinding) {
case "kbd":
/*
* Recording the binding ID prevents multiple controls (or components) from attempting to erroneously
* bind a control to the same ID, but in the case of a "dual display" configuration, we actually want
* to allow BOTH video components to call setBinding() for "kbd", so that it doesn't matter which
* display the user gives focus to.
*
* this.bindings[id] = control;
*/
control.onkeydown = function onKeyDown(event) {
return kbd.onKeyDown(event, true);
};
control.onkeypress = function onKeyPressKbd(event) {
return kbd.onKeyPress(event);
};
control.onkeyup = function onKeyUp(event) {
return kbd.onKeyDown(event, false);
};
return true;
case "caps-lock":
this.bindings[id] = control;
control.onclick = function onClickCapsLock(event) {
if (kbd.cpu) kbd.cpu.setFocus();
return kbd.toggleCapsLock();
};
return true;
case "num-lock":
this.bindings[id] = control;
control.onclick = function onClickNumLock(event) {
if (kbd.cpu) kbd.cpu.setFocus();
return kbd.toggleNumLock();
};
return true;
case "scroll-lock":
this.bindings[id] = control;
control.onclick = function onClickScrollLock(event) {
if (kbd.cpu) kbd.cpu.setFocus();
return kbd.toggleScrollLock();
};
return true;
default:
/*
* Maintain support for older button codes; eg, map button code "ctrl-c" to CLICKCODE "CTRL_C"
*/
var sCode = sBinding.toUpperCase().replace(/-/g, '_');
if (Keyboard.CLICKCODES[sCode] !== undefined && sHTMLType == "button") {
this.bindings[id] = control;
control.onclick = function(kbd, sKey, simCode) {
return function onClickKeyboard(event) {
if (!COMPILED && kbd.messageEnabled()) kbd.printMessage(sKey + " clicked", Messages.KEYS);
if (kbd.cpu) kbd.cpu.setFocus();
kbd.updateShiftState(simCode, true); // future-proofing if/when any LOCK keys are added to CLICKCODES
kbd.addActiveKey(simCode, true);
};
}(this, sCode, Keyboard.CLICKCODES[sCode]);
return true;
} else if (Keyboard.SOFTCODES[sBinding] !== undefined) {
this.cSoftCodes++;
this.bindings[id] = control;
var fnDown = function(kbd, sKey, simCode) {
return function onMouseOrTouchDownKeyboard(event) {
kbd.addActiveKey(simCode);
};
}(this, sBinding, Keyboard.SOFTCODES[sBinding]);
var fnUp = function (kbd, sKey, simCode) {
return function onMouseOrTouchUpKeyboard(event) {
kbd.removeActiveKey(simCode);
};
}(this, sBinding, Keyboard.SOFTCODES[sBinding]);
if ('ontouchstart' in window) {
control.ontouchstart = fnDown;
control.ontouchend = fnUp;
} else {
control.onmousedown = fnDown;
control.onmouseup = control.onmouseout = fnUp;
}
return true;
}
break;
}
}
return false;
};
/**
* findBinding(simCode, sType, fDown)
*
* TODO: This function is woefully inefficient, because the SOFTCODES table is designed for converting
* soft key presses into SIMCODES, whereas this function is doing the reverse: looking for the soft key,
* if any, that corresponds to a SIMCODE, simply so we can provide visual feedback of keys activated
* by other means (eg, real keyboard events, button clicks that generate key sequences like CTRL_ALT_DEL,
* etc).
*
* To minimize this function's cost, we would want to dynamically create a reverse-lookup table after
* all the setBinding() calls for the soft keys have been established; note that the reverse-lookup table
* would contain MORE entries than the SOFTCODES table, because there are multiple simCodes that correspond
* to a given soft key (eg, '1' and '!' both map to the same soft key).
*
* @this {Keyboard}
* @param {number} simCode
* @param {string} sType is the type of control (eg, "button" or "key")
* @param {boolean} [fDown] is true if the key is going down, false if up, or undefined if unchanged
* @return {Object} is the HTML control DOM object (eg, HTMLButtonElement), or undefined if no such control exists
*/
Keyboard.prototype.findBinding = function(simCode, sType, fDown)
{
var control;
if (this.cSoftCodes) {
for (var code in Keyboard.SHIFTED_KEYCODES) {
if (simCode == Keyboard.SHIFTED_KEYCODES[code]) {
simCode = +code;
code = Keyboard.STUPID_KEYCODES[code];
if (code) simCode = code;
break;
}
}
for (var sBinding in Keyboard.SOFTCODES) {
if (Keyboard.SOFTCODES[sBinding] == simCode || Keyboard.SOFTCODES[sBinding] == this.toUpperKey(simCode)) {
var id = sType + '-' + sBinding;
control = this.bindings[id];
if (control && fDown !== undefined) {
this.setSoftKeyState(control, fDown);
}
break;
}
}
}
return control;
};
/**
* initBus(cmp, bus, cpu, dbg)
*
* @this {Keyboard}
* @param {Computer} cmp
* @param {Bus} bus
* @param {X86CPU} cpu
* @param {Debugger} dbg
*/
Keyboard.prototype.initBus = function(cmp, bus, cpu, dbg)
{
this.bus = bus;
this.cpu = cpu;
this.dbg = dbg;
this.chipset = cmp.getComponentByType("ChipSet");
};
/**
* notifyEscape(fDisabled, fAllDown)
*
* When ESC is used by the browser to disable pointer lock, this gives us the option of mapping a different key to ESC.
*
* @this {Keyboard}
* @param {boolean} fDisabled
* @param {boolean} [fAllDown] (an experimental option to re-enable processing of all onkeydown/onkeyup events)
*/
Keyboard.prototype.notifyEscape = function(fDisabled, fAllDown)
{
this.fEscapeDisabled = fDisabled;
if (fAllDown !== undefined) this.fAllDown = fAllDown;
};
/**
* setModel(nModel)
*
* @this {Keyboard}
* @param {number} nModel
*/
Keyboard.prototype.setModel = function(nModel)
{
};
/**
* resetDevice(fNotify)
*
* @this {Keyboard}
* @param {boolean} [fNotify]
*/
Keyboard.prototype.resetDevice = function(fNotify)
{
/*
* TODO: There's more to reset, like LED indicators, default type rate, and emptying the scan code buffer.
*/
this.printMessage("keyboard reset", Messages.KEYBOARD | Messages.PORT);
this.abBuffer = [Keyboard.CMDRES.BAT_OK];
this.fAdvance = true;
if (fNotify && this.chipset) this.chipset.notifyKbdData(this.abBuffer[0]);
};
/**
* setEnabled(fData, fClock)
*
* This is the ChipSet's primary interface for toggling keyboard "data" and "clock" lines.
* For MODEL_5150 and MODEL_5160 machines, this function is called from the ChipSet's PPI_B
* output handler. For MODEL_5170 machines, this function is called when selected CMD
* "data bytes" have been written.
*
* @this {Keyboard}
* @param {boolean} fData is true if the keyboard simulated data line should be enabled
* @param {boolean} fClock is true if the keyboard's simulated clock line should be enabled
* @return {boolean} true if keyboard was re-enabled, false if not (or no change)
*/
Keyboard.prototype.setEnabled = function(fData, fClock)
{
var fReset = false;
if (this.fClock !== fClock) {
if (!COMPILED && this.messageEnabled(Messages.KEYBOARD | Messages.PORT)) {
this.printMessage("keyboard clock line changing to " + fClock, true);
}
/*
* Toggling the clock line low and then high signals a "reset", which we acknowledge once the
* data line is high as well.
*/
this.fClock = this.fResetOnEnable = fClock;
/*
* Allow the next buffered scan code, if any, to advance.
*/
if (fClock) this.fAdvance = true;
}
if (this.fData !== fData) {
if (!COMPILED && this.messageEnabled(Messages.KEYBOARD | Messages.PORT)) {
this.printMessage("keyboard data line changing to " + fData, true);
}
this.fData = fData;
/*
* TODO: Review this code; it was added during the early days of MODEL_5150 testing and may not be
* *exactly* what's called for here.
*/
if (fData && !this.fResetOnEnable) {
this.shiftScanCode(true);
}
}
if (this.fData && this.fResetOnEnable) {
this.resetDevice(true);
this.fResetOnEnable = false;
fReset = true;
}
return fReset;
};
/**
* sendCmd(bCmd)
*
* This is the ChipSet's primary interface for controlling "Model M" keyboards (ie, those used
* with MODEL_5170 machines). Commands are delivered through the ChipSet's 8042 Keyboard Controller.
*
* @this {Keyboard}
* @param {number} bCmd should be one of the Keyboard.CMD.* command codes (Model M keyboards only)
* @return {number} response should be one of the Keyboard.CMDRES.* response codes, or -1 if unrecognized
*/
Keyboard.prototype.sendCmd = function(bCmd)
{
var b = -1;
switch(bCmd) {
case Keyboard.CMD.RESET:
b = Keyboard.CMDRES.ACK;
this.resetDevice();
break;
default:
break;
}
return b;
};
/**
* checkScanCode()
*
* This is the ChipSet's interface for checking data availability.
*
* Note that even if we have data, we don't provide it unless fAdvance is set as well.
* This ensures that we wait until the ROM to disable and re-enable the controller before
* making more data available.
*
* @this {Keyboard}
* @return {number} next scan code, or 0 if none
*/
Keyboard.prototype.checkScanCode = function()
{
var b = 0;
if (this.abBuffer.length && this.fAdvance) {
b = this.abBuffer[0];
if (this.chipset) this.chipset.notifyKbdData(b);
}
if (this.messageEnabled()) this.printMessage("scan code " + str.toHexByte(b) + " available");
return b;
};
/**
* readScanCode()
*
* This is the ChipSet's interface for reading scan codes.
*
* @this {Keyboard}
* @return {number} next scan code, or 0 if none
*/
Keyboard.prototype.readScanCode = function()
{
var b = 0;
if (this.abBuffer.length) {
b = this.abBuffer[0];
}
if (this.messageEnabled()) this.printMessage("scan code " + str.toHexByte(b) + " delivered");
return b;
};
/**
* flushScanCode()
*
* This is the ChipSet's interface to flush scan codes.
*
* @this {Keyboard}
*/
Keyboard.prototype.flushScanCode = function()
{
this.abBuffer = [];
if (this.messageEnabled()) this.printMessage("scan codes flushed");
};
/**
* shiftScanCode(fNotify)
*
* This is the ChipSet's interface to advance scan codes.
*
* @this {Keyboard}
* @param {boolean} [fNotify] is true to notify ChipSet if more data is available.
*/
Keyboard.prototype.shiftScanCode = function(fNotify)
{
if (this.abBuffer.length > 0) {
/*
* The keyboard interrupt service routine toggles the enable bit after reading a scan code, so
* presumably this is the proper point at which to shift the last scan code out, and then assert
* another interrupt if more scan codes exist.
*/
this.abBuffer.shift();
this.fAdvance = fNotify;
if (fNotify) {
if (!this.abBuffer.length || !this.chipset) {
fNotify = false;
} else {
this.chipset.notifyKbdData(this.abBuffer[0]);
}
}
if (this.messageEnabled()) this.printMessage("scan codes shifted, notify " + (fNotify? "true" : "false"));
}
};
/**
* powerUp(data, fRepower)
*
* @this {Keyboard}
* @param {Object|null} data
* @param {boolean} [fRepower]
* @return {boolean} true if successful, false if failure
*/
Keyboard.prototype.powerUp = function(data, fRepower)
{
if (!fRepower) {
/*
* TODO: Save/restore support for Keyboard is the barest minimum. In fact, originally, I wasn't
* saving/restoring anything, and that was OK, but if we don't at least re-initialize fClock/fData,
* we can get a spurious reset following a restore. In an ideal world, we might choose to save/restore
* abBuffer as well, but realistically, I think it's going to be safer to always start with an
* empty buffer--and who's going to notice anyway?
*
* So, like Debugger, we deviate from the typical save/restore pattern: instead of reset OR restore,
* we always reset and then perform a (very limited) restore.
*/
this.reset();
if (data && this.restore) {
if (!this.restore(data)) return false;
}
}
return true;
};
/**
* powerDown(fSave, fShutdown)
*
* @this {Keyboard}
* @param {boolean} fSave
* @param {boolean} [fShutdown]
* @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
*/
Keyboard.prototype.powerDown = function(fSave, fShutdown)
{
return fSave && this.save? this.save() : true;
};
/**
* reset()
*
* @this {Keyboard}
*/
Keyboard.prototype.reset = function()
{
this.setModel(this.nDefaultModel);
this.initState();
/*
* The current (assumed) physical (and simulated) states of the various shift/lock keys.
*
* TODO: Determine how (or whether) we can query the browser's initial shift/lock key states.
*/
this.bitsState = this.bitsStateSim = 0;
/*
* New scan codes are "pushed" onto abBuffer and then "shifted" off.
*/
this.abBuffer = [];
this.fAdvance = true;
this.prevCharDown = 0;
this.prevKeyDown = 0;
/*
* Make sure the auto-injection buffer is empty (an injection could have been in progress on any reset after the first).
*/
this.sInjectBuffer = "";
};
/**
* save()
*
* This implements save support for the Keyboard component.
*
* @this {Keyboard}
* @return {Object}
*/
Keyboard.prototype.save = function()
{
var state = new State(this);
state.set(0, this.saveState());
return state.data();
};
/**
* restore(data)
*
* This implements restore support for the Keyboard component.
*
* @this {Keyboard}
* @param {Object} data
* @return {boolean} true if successful, false if failure
*/
Keyboard.prototype.restore = function(data)
{
return this.initState(data[0]);
};
/**
* initState(data)
*
* @this {Keyboard}
* @param {Array} [data]
* @return {boolean} true if successful, false if failure
*/
Keyboard.prototype.initState = function(data)
{
var i = 0;
if (data === undefined) data = [];
this.fClock = this.fAdvance = data[i++];
this.fData = data[i];
return true;
};
/**
* saveState()
*
* @this {Keyboard}
* @return {Array}
*/
Keyboard.prototype.saveState = function()
{
var i = 0;
var data = [];
data[i++] = this.fClock;
data[i] = this.fData;
return data;
};
/**
* setSoftKeyState(control, f)
*
* @this {Keyboard}
* @param {Object} control is an HTML control DOM object
* @param {boolean} f is true if the key represented by e should be "on", false if "off"
*/
Keyboard.prototype.setSoftKeyState = function(control, f)
{
control.style.color = (f? "#ffffff" : "#000000");
control.style.backgroundColor = (f? "#000000" : "#ffffff");
};
/**
* addScanCode(bScan)
*
* @this {Keyboard}
* @param {number} bScan
*/
Keyboard.prototype.addScanCode = function(bScan)
{
/*
* Prepare for the possibility that our reset() function may not have been called yet.
*
* TODO: Determine whether we need to reset() the Keyboard sooner (ie, in the constructor),
* or if we need to protect other methods from prematurely accessing certain Keyboard structures,
* as a result of calls from any of the key event handlers established by setBinding().
*/
if (this.abBuffer) {
if (this.abBuffer.length < Keyboard.LIMIT.MAX_SCANCODES) {
if (this.messageEnabled()) this.printMessage("scan code " + str.toHexByte(bScan) + " buffered");
this.abBuffer.push(bScan);
if (this.abBuffer.length == 1) {
if (this.chipset) this.chipset.notifyKbdData(bScan);
}
return;
}
if (this.abBuffer.length == Keyboard.LIMIT.MAX_SCANCODES) {
this.abBuffer.push(Keyboard.CMDRES.BUFF_FULL);
}
this.printMessage("scan code buffer overflow");
}
};
/**
* injectKeys(sKeyCodes, msDelay)
*
* @this {Keyboard}
* @param {string} sKeyCodes
* @param {number|undefined} [msDelay] is an optional injection delay (default is msInjectDelay)
*/
Keyboard.prototype.injectKeys = function(sKeyCodes, msDelay)
{
this.sInjectBuffer = sKeyCodes;
if (!COMPILED) this.log("injectKeys(" + this.sInjectBuffer.split("\n").join("\\n") + ")");
this.injectKeysFromBuffer(msDelay || this.msInjectDelay);
};
/**
* injectKeysFromBuffer(msDelay)
*
* @this {Keyboard}
* @param {number} msDelay is the delay between injected keys
*/
Keyboard.prototype.injectKeysFromBuffer = function(msDelay)
{
if (this.sInjectBuffer.length > 0) {
var ch = this.sInjectBuffer.charCodeAt(0);
/*
* I could require all callers to supply CRs instead of LFs, but this is friendlier.
*/
if (ch == 0x0a) ch = 0x0d;
this.sInjectBuffer = this.sInjectBuffer.substr(1);
this.addActiveKey(ch, true);
}
if (this.sInjectBuffer.length > 0) {
setTimeout(function (kbd) {
return function onInjectKeyTimeout() {
kbd.injectKeysFromBuffer(msDelay);
};
}(this), msDelay);
}
};
/**
* setLED(control, f)
*
* @this {Keyboard}
* @param {Object} control is an HTML control DOM object
* @param {boolean} f is true if the LED represented by control should be "on", false if "off"
*/
Keyboard.prototype.setLED = function(control, f)
{
control.style.backgroundColor = (f? "#00ff00" : "#000000");
};
/**
* updateLEDs(bitState)
*
* Updates any and all shift-related LEDs with the corresponding state in bitsStateSim.
*
* @this {Keyboard}
* @param {number} [bitState] is the bit in bitsStateSim that may have changed, if known; undefined if not
*/
Keyboard.prototype.updateLEDs = function(bitState)
{
var control;
for (var sBinding in Keyboard.LEDSTATES) {
var id = "led-" + sBinding;
var bitLED = Keyboard.LEDSTATES[sBinding];
if ((!bitState || bitState == bitLED) && (control = this.bindings[id])) {
this.setLED(control, !!(this.bitsStateSim & bitLED));
}
}
};
/**
* toggleCapsLock()
*
* @this {Keyboard}
*/
Keyboard.prototype.toggleCapsLock = function()
{
this.addActiveKey(Keyboard.SIMCODE.CAPS_LOCK, true);
};
/**
* toggleNumLock()
*
* @this {Keyboard}
*/
Keyboard.prototype.toggleNumLock = function()
{
this.addActiveKey(Keyboard.SIMCODE.NUM_LOCK, true);
};
/**
* toggleScrollLock()
*
* @this {Keyboard}
*/
Keyboard.prototype.toggleScrollLock = function()
{
this.addActiveKey(Keyboard.SIMCODE.SCROLL_LOCK, true);
};
/**
* updateShiftState(simCode, fSim, fDown)
*
* For non-locking shift keys, this function is straightforward: when fDown is true, the corresponding bitState
* is set, and when fDown is false, it's cleared. However, for LOCK keys, fDown true means toggle, and fDown false
* means no change.
*
* @this {Keyboard}
* @param {number} simCode (includes any ONDOWN and/or ONRIGHT modifiers)
* @param {boolean} [fSim] is true to update simulated state only
* @param {boolean|null} [fDown] is true for down, false for up, undefined for toggle
* @return {boolean} true if simCode was a shift key, false if not
*/
Keyboard.prototype.updateShiftState = function(simCode, fSim, fDown)
{
if (Keyboard.SIMCODES[simCode]) {
var fRight = (Math.floor(simCode / 1000) & 2);
var bitState = Keyboard.KEYSTATES[simCode] || 0;
if (bitState) {
if (fRight && !(bitState & Keyboard.STATE.ALL_RIGHT)) {
bitState >>= 1;
}
if (bitState & Keyboard.STATE.ALL_LOCKS) {
if (fDown === false) return true;
fDown = null;
}
if (fDown == null) { // ie, null or undefined
fDown = !((fSim? this.bitsStateSim : this.bitsState) & bitState);
}
else if (!fDown) {
/*
* In current webkit browsers, pressing and then releasing both left and right shift keys together
* (or both alt keys, or both cmd/windows keys, or presumably both ctrl keys) results in 4 events, as
* you would expect, but 3 of the 4 are "down" events; only the last of the 4 is an "up" event.
*
* Perhaps this is a browser accessibility feature (ie, deliberately suppressing the "up" event
* of one of the shift keys to implement a "sticky shift mode"?), but in any case, to maintain our
* internal consistency, if this is an "up" event and the shift state bit is any of ALL_SHIFT, then
* we set it to ALL_SHIFT, so that we'll automatically clear ALL shift states.
*
* TODO: The only downside to this work-around is that the simulation will still think a shift key is
* down. So in effect, we have enabled a "sticky shift mode" inside the simulation, whether or not that
* was the browser's intent. To fix that, we would have to identify the shift key that never went up
* and simulate the "up". That's more work than I think the problem merits. The user just needs to tap
* a single shift key to get out that mode.
*/
if (bitState & Keyboard.STATE.ALL_SHIFT) bitState = Keyboard.STATE.ALL_SHIFT;
}
if (!fSim) {
this.bitsState &= ~bitState;
if (fDown) this.bitsState |= bitState;
} else {
this.bitsStateSim &= ~bitState;
if (fDown) this.bitsStateSim |= bitState;
this.updateLEDs(bitState);
}
return true;
}
}
return false;
};
/**
* addActiveKey(simCode, fPress)
*
* @this {Keyboard}
* @param {number} simCode
* @param {boolean} [fPress]
*/
Keyboard.prototype.addActiveKey = function(simCode, fPress)
{
if (!Keyboard.SIMCODES[simCode]) {
if (!COMPILED && this.messageEnabled(Messages.KEYS)) {
this.printMessage("addActiveKey(" + simCode + "," + (fPress? "press" : "down") + "): unrecognized", true);
}
return;
}
/*
* Ignore all active keys if the CPU is not running.
*/
if (!this.cpu || !this.cpu.isRunning()) return;
/*
* If this simCode is in the KEYSTATE table, then stop all repeating.
*/
if (Keyboard.KEYSTATES[simCode] && this.aKeysActive.length) {
if (this.aKeysActive[0].nRepeat > 0) this.aKeysActive[0].nRepeat = 0;
}
var key;
for (var i = 0; i < this.aKeysActive.length; i++) {
key = this.aKeysActive[i];
if (key.simCode == simCode) {
/*
* This key is already active, so if this a "down" request (or a "press" for a key we already
* processed as a "down"), ignore it.
*/
if (!fPress || key.nRepeat >= 0) {
i = -1;
break;
}
if (i > 0) {
if (this.aKeysActive[0].nRepeat > 0) this.aKeysActive[0].nRepeat = 0;
this.aKeysActive.splice(i, 1);
}
break;
}
}
if (!COMPILED && this.messageEnabled(Messages.KEYS)) {
this.printMessage("addActiveKey(" + simCode + "," + (fPress? "press" : "down") + "): " + (i < 0? "already active" : (i == this.aKeysActive.length? "adding" : "updating")), true);
}
if (i < 0) return;
if (i == this.aKeysActive.length) {
key = {};
key.simCode = simCode;
key.bitsState = this.bitsState;
this.findBinding(simCode, "key", true);
i++;
}
if (i > 0) {
this.aKeysActive.splice(0, 0, key);
}
key.fDown = true;
key.nRepeat = (fPress? -1: (Keyboard.KEYSTATES[simCode]? 0 : 1));
this.updateActiveKey(key);
};
/**
* checkActiveKey()
*
* @this {Keyboard}
* @return {number} simCode of active key, 0 if none
*/
Keyboard.prototype.checkActiveKey = function()
{
return this.aKeysActive.length? this.aKeysActive[0].simCode : 0;
};
/**
* checkActiveKeyShift()
*
* @this {Keyboard}
* @return {number|null} bitsState for active key, null if none
*
Keyboard.prototype.checkActiveKeyShift = function()
{
return this.aKeysActive.length? this.aKeysActive[0].bitsState : null;
};
*/
/**
* isAlphaKey(code)
*
* @this {Keyboard}
* @param {number} code
* @returns {boolean} true if alpha key, false if not
*/
Keyboard.prototype.isAlphaKey = function(code)
{
return (code >= Keyboard.ASCII.A && code <= Keyboard.ASCII.Z || code >= Keyboard.ASCII.a && code <= Keyboard.ASCII.z);
};
/**
* toUpperKey(code)
*
* @this {Keyboard}
* @param {number} code
* @returns {number}
*/
Keyboard.prototype.toUpperKey = function(code)
{
if (code >= Keyboard.ASCII.a && code <= Keyboard.ASCII.z) {
code -= (Keyboard.ASCII.a - Keyboard.ASCII.A);
}
return code;
};
/**
* clearActiveKeys()
*
* Force all active keys to "self-deactivate".
*
* TODO: Consider limiting this to non-shift keys only.
*
* @this {Keyboard}
*/
Keyboard.prototype.clearActiveKeys = function()
{
for (var i = 0; i < this.aKeysActive.length; i++) {
var key = this.aKeysActive[i];
key.fDown = false;
if (key.nRepeat > 0) key.nRepeat = 0;
}
};
/**
* removeActiveKey(simCode, fFlush)
*
* @param {number} simCode
* @param {boolean} [fFlush] is true whenever the key must be removed, independent of other factors
* @return {boolean} true if successfully removed, false if not
*/
Keyboard.prototype.removeActiveKey = function(simCode, fFlush)
{
if (!Keyboard.SIMCODES[simCode]) {
if (!COMPILED && this.messageEnabled(Messages.KEYS)) {
this.printMessage("removeActiveKey(" + simCode + "): unrecognized", true);
}
return false;
}
/*
* Ignore all active keys if the CPU is not running.
*/
if (!fFlush && (!this.cpu || !this.cpu.isRunning())) return false;
var fRemoved = false;
for (var i = 0; i < this.aKeysActive.length; i++) {
var key = this.aKeysActive[i];
if (key.simCode == simCode || key.simCode == Keyboard.SHIFTED_KEYCODES[simCode]) {
this.aKeysActive.splice(i, 1);
if (key.timer) clearTimeout(key.timer);
if (key.fDown && !fFlush) this.keySimulate(key.simCode, false);
this.findBinding(simCode, "key", false);
fRemoved = true;
break;
}
}
if (!COMPILED && !fFlush && this.messageEnabled(Messages.KEYS)) {
this.printMessage("removeActiveKey(" + simCode + "): " + (fRemoved? "removed" : "not active"), true);
}
if (!this.aKeysActive.length && this.fToggleCapsLock) {
if (!COMPILED) this.printMessage("removeActiveKey(): inverting caps-lock now", Messages.KEYS);
this.updateShiftState(Keyboard.SIMCODE.CAPS_LOCK);
this.fToggleCapsLock = false;
}
return fRemoved;
};
/**
* updateActiveKey(key, msTimer)
*
* @param {Object} key
* @param {number} [msTimer]
*/
Keyboard.prototype.updateActiveKey = function(key, msTimer)
{
/*
* All active keys are automatically removed once the CPU stops running.
*/
if (!this.cpu || !this.cpu.isRunning()) {
this.removeActiveKey(key.simCode, true);
return;
}
if (!COMPILED && this.messageEnabled(Messages.KEYS)) {
this.printMessage((msTimer? '\n' : "") + "updateActiveKey(" + key.simCode + (msTimer? "," + msTimer + "ms" : "") + "): " + (key.fDown? "down" : "up"), true);
}
this.keySimulate(key.simCode, key.fDown);
if (!key.nRepeat) return;
var ms;
if (key.nRepeat < 0) {
if (!key.fDown) {
this.removeActiveKey(key.simCode);
return;
}
key.fDown = false;
ms = this.msAutoRelease;
}
else {
ms = (key.nRepeat++ == 1? this.msAutoRepeat : this.msNextRepeat);
}
key.timer = setTimeout(function(kbd) {
return function onUpdateActiveKey() {
kbd.updateActiveKey(key, ms);
};
}(this), ms);
};
/**
* getSimCode(keyCode)
*
* @this {Keyboard}
* @param {number} keyCode
* @param {boolean} fShifted
* @return {number} simCode
*/
Keyboard.prototype.getSimCode = function(keyCode, fShifted)
{
var code;
var simCode = keyCode;
if (keyCode >= Keyboard.ASCII.A && keyCode <= Keyboard.ASCII.Z) {
if (!(this.bitsState & (Keyboard.STATE.SHIFT | Keyboard.STATE.RSHIFT | Keyboard.STATE.CAPS_LOCK)) == fShifted) {
simCode = keyCode + (Keyboard.ASCII.a - Keyboard.ASCII.A);
}
}
else if (keyCode >= Keyboard.ASCII.a && keyCode <= Keyboard.ASCII.z) {
if (!!(this.bitsState & (Keyboard.STATE.SHIFT | Keyboard.STATE.RSHIFT | Keyboard.STATE.CAPS_LOCK)) == fShifted) {
simCode = keyCode - (Keyboard.ASCII.a - Keyboard.ASCII.A);
}
}
else if (!!(this.bitsState & (Keyboard.STATE.SHIFT | Keyboard.STATE.RSHIFT)) == fShifted) {
if (code = Keyboard.SHIFTED_KEYCODES[keyCode]) {
simCode = code;
}
}
else {
if (code = Keyboard.STUPID_KEYCODES[keyCode]) {
simCode = code;
}
}
return simCode;
};
/**
* onFocusChange(fFocus)
*
* @this {Keyboard}
* @param {boolean} fFocus is true if gaining focus, false if losing it
*/
Keyboard.prototype.onFocusChange = function(fFocus)
{
if (this.fHasFocus != fFocus && !COMPILED && this.messageEnabled(Messages.KEYS)) {
this.printMessage("onFocusChange(" + (fFocus? "true" : "false") + ")", true);
}
this.fHasFocus = fFocus;
/*
* Since we can't be sure of any shift states after losing focus, we clear them all.
*/
if (!fFocus) this.bitsState &= ~Keyboard.STATE.ALL_SHIFT;
};
/**
* onKeyDown(event, fDown)
*
* @this {Keyboard}
* @param {Object} event
* @param {boolean} fDown is true for a keyDown event, false for a keyUp event
* @return {boolean} true to pass the event along, false to consume it
*/
Keyboard.prototype.onKeyDown = function(event, fDown)
{
var fPass = true;
var fPress = false;
var fIgnore = false;
var keyCode = event.keyCode;
/*
* Although it would be nice to pay attention ONLY to these "up" and "down" events, and ignore "press"
* events, iOS devices force us to process "press" events, because they don't give us shift-key events,
* so we have to infer the shift state from the character code in the "press" event.
*
* So, to seamlessly blend "up" and "down" events with "press" events, we must convert any keyCodes we
* receive here to a compatibly shifted simCode.
*/
var simCode = this.getSimCode(keyCode, true);
if (this.fEscapeDisabled && simCode == Keyboard.ASCII['`']) {
keyCode = simCode = Keyboard.KEYCODE.ESC;
}
if (Keyboard.SIMCODES[keyCode + Keyboard.KEYCODE.ONDOWN]) {
simCode += Keyboard.KEYCODE.ONDOWN;
if (event.location == Keyboard.LOCATION.RIGHT) {
simCode += Keyboard.KEYCODE.ONRIGHT;
}
if (this.updateShiftState(simCode, false, fDown)) {
if (keyCode == Keyboard.KEYCODE.CAPS_LOCK || keyCode == Keyboard.KEYCODE.NUM_LOCK || keyCode == Keyboard.KEYCODE.SCROLL_LOCK) {
/*
* FYI, "lock" keys generate a "down" event ONLY when getting locked and an "up" event ONLY
* when getting unlocked--which is a little odd, since the key did go UP and DOWN each time.
*
* We must treat each event like a "down", and also as a "press", so that addActiveKey() will
* automatically generate both the "make" and "break".
*
* Of course, there have to be exceptions, most notably MSIE, which sends both "up" and down"
* on every press, so there's no need for trickery.
*/
if (!this.fMSIE) {
fDown = fPress = true;
}
}
/*
* As a safeguard, whenever the CMD key goes up, clear all active keys, because there appear to be
* cases where we don't always get notification of a CMD key's companion key going up (this probably
* overlaps with most if not all situations where we also lose focus).
*/
if (!fDown && (keyCode == Keyboard.KEYCODE.CMD || keyCode == Keyboard.KEYCODE.RCMD)) {
this.clearActiveKeys();
}
}
else {
/*
* Here we have all the non-shift keys in the ONDOWN category; eg, BS, TAB, ESC, UP, DOWN, LEFT, RIGHT,
* and many more.
*
* For various reasons (some of which are discussed below), we don't want to pass these on (ie, we want
* to suppress their "press" event), which means we must perform all key simulation on the "up" and "down"
* events.
*
* Regarding BS: I never want the browser to act on BS, since it does double-duty as the BACK button,
* leaving the current page.
*
* Regarding TAB: If I don't consume TAB on the "down" event, then that's all I'll see, because the browser
* act on it by giving focus to the next control.
*
* Regarding ESC: This key generates "down" and "up" events (LOTS of "down" events for that matter), but no
* "press" event.
*/
/*
* HACK for simulating CTRL_BREAK using CTRL_DEL (Mac) or CTRL_BS (Windows)
*/
if (keyCode == Keyboard.KEYCODE.BS && (this.bitsState & (Keyboard.STATE.CTRL|Keyboard.STATE.ALT)) == Keyboard.STATE.CTRL) {
simCode = Keyboard.SIMCODE.CTRL_BREAK;
}
/*
* There are a number of other common key sequences that interfere with our machines; for example,
* the up/down arrows have a "default" behavior of scrolling the web page up and down, which is
* definitely NOT a behavior we want. Since we mark those keys as ONDOWN, we'll catch them all here.
*/
fPass = false;
}
}
else {
/*
* When I have defined system-wide CTRL-key sequences to perform common editing operations (eg, CTRL_W
* and CTRL_Z to scroll pages of text), the browser likes to act on those operations, so let's set fPass
* to false to prevent that.
*
* Also, we don't want to set fIgnore in such cases, because the browser may not give us a press event for
* these CTRL-key sequences, so we can't risk ignoring them.
*/
if (Keyboard.SIMCODES[simCode] && (this.bitsState & (Keyboard.STATE.CTRLS | Keyboard.STATE.ALTS))) {
fPass = false;
}
/*
* Don't simulate any key not explicitly marked ONDOWN, as well as any key sequence with the CMD key held.
*/
if (!this.fAllDown && fPass && fDown || !!(this.bitsState & Keyboard.STATE.CMDS)) fIgnore = true;
}
if (!fPass) {
event.preventDefault();
}
if (!COMPILED && this.messageEnabled(Messages.KEYS)) {
this.printMessage("\nonKey" + (fDown? "Down" : "Up") + "(" + keyCode + "): " + (fIgnore? "ignore" : (fPass? "true" : "false")), true);
}
/*
* Mobile (eg, iOS) keyboards don't fully support onKeyDown/onKeyUp events; for example, they usually
* don't generate ANY events when a shift key is pressed, and even for normal keys, they seem to generate
* rapid (ie, fake) "up" and "down" events around "press" events, probably more to satisfy compatibility
* issues rather than making a serious effort to indicate when a key ACTUALLY went down or up.
*/
if (!fIgnore && (!this.fMobile || !fPass)) {
if (fDown) {
this.addActiveKey(simCode, fPress);
} else {
if (!this.removeActiveKey(simCode)) {
var code = this.getSimCode(keyCode, false);
if (code != simCode) this.removeActiveKey(code);
}
}
}
return fPass;
};
/**
* onKeyPress(event)
*
* @this {Keyboard}
* @param {Object} event
* @return {boolean} true to pass the event along, false to consume it
*/
Keyboard.prototype.onKeyPress = function(event)
{
event = event || window.event;
var keyCode = event.which || event.keyCode;
if (this.fAllDown) {
var simCode = this.checkActiveKey();
if (simCode && this.isAlphaKey(simCode) && this.isAlphaKey(keyCode) && simCode != keyCode) {
if (!COMPILED && this.messageEnabled(Messages.KEYS)) {
this.printMessage("onKeyPress(" + keyCode + ") out of sync with " + simCode + ", invert caps-lock", true);
}
this.fToggleCapsLock = true;
keyCode = simCode;
}
}
/*
* Let's stop any injection currently in progress, too
*/
this.sInjectBuffer = "";
var fPass = !Keyboard.SIMCODES[keyCode] || !!(this.bitsState & Keyboard.STATE.CMD);
if (!COMPILED && this.messageEnabled(Messages.KEYS)) {
this.printMessage("\nonKeyPress(" + keyCode + "): " + (fPass? "true" : "false"), true);
}
if (!fPass) {
this.addActiveKey(keyCode, true);
}
return fPass;
};
/**
* keySimulate(simCode, fDown)
*
* @this {Keyboard}
* @param {number} simCode
* @param {boolean} fDown
* @return {boolean} true if successfully simulated, false if unrecognized/unsupported key
*/
Keyboard.prototype.keySimulate = function(simCode, fDown)
{
var fSimulated = false;
this.updateShiftState(simCode, true, fDown);
var wCode = Keyboard.SIMCODES[simCode] || Keyboard.SIMCODES[simCode + Keyboard.KEYCODE.ONDOWN];
if (wCode !== undefined) {
/*
* Hack to transform the IBM "BACKSPACE" key (which we normally map to KEYCODE_DELETE) to the IBM "DEL" key
* whenever both CTRL and ALT are pressed as well, so that it's easier to simulate that old favorite: CTRL_ALT_DEL
*/
if (wCode == Keyboard.SCANCODE.BS) {
if ((this.bitsState & (Keyboard.STATE.CTRL | Keyboard.STATE.ALT)) == (Keyboard.STATE.CTRL | Keyboard.STATE.ALT)) {
wCode = Keyboard.SCANCODE.NUM_DEL;
}
}
var abScanCodes = [];
var bCode = wCode & 0xff;
abScanCodes.push(bCode | (fDown? 0 : Keyboard.SCANCODE.BREAK));
var fAlpha = (simCode >= Keyboard.ASCII.A && simCode <= Keyboard.ASCII.Z || simCode >= Keyboard.ASCII.a && simCode <= Keyboard.ASCII.z);
while (wCode >>>= 8) {
var bShift = 0;
var bScan = wCode & 0xff;
/*
* TODO: The handling of SIMCODE entries with "extended" codes still needs to be tested, and
* moreover, if any of them need to perform any shift-state modifications, those modifications
* may need to be encoded differently.
*/
if (bCode == Keyboard.SCANCODE.EXTEND1 || bCode == Keyboard.SCANCODE.EXTEND2) {
abScanCodes.push(bCode | (fDown? 0 : Keyboard.SCANCODE.BREAK));
continue;
}
if (bScan == Keyboard.SCANCODE.SHIFT) {
if (!(this.bitsStateSim & (Keyboard.STATE.SHIFT | Keyboard.STATE.RSHIFT))) {
if (!(this.bitsStateSim & Keyboard.STATE.CAPS_LOCK) || !fAlpha) {
bShift = bScan;
}
}
} else if (bScan == Keyboard.SCANCODE.CTRL) {
if (!(this.bitsStateSim & (Keyboard.STATE.CTRL | Keyboard.STATE.RCTRL))) {
bShift = bScan;
}
} else if (bScan == Keyboard.SCANCODE.ALT) {
if (!(this.bitsStateSim & (Keyboard.STATE.ALT | Keyboard.STATE.RALT))) {
bShift = bScan;
}
} else {
abScanCodes.push(bCode | (fDown? 0 : Keyboard.SCANCODE.BREAK));
}
if (bShift) {
if (fDown)
abScanCodes.unshift(bShift);
else
abScanCodes.push(bShift | Keyboard.SCANCODE.BREAK);
}
}
for (var i = 0; i < abScanCodes.length; i++) {
this.addScanCode(abScanCodes[i]);
}
fSimulated = true;
}
if (!COMPILED && this.messageEnabled(Messages.KEYS)) {
this.printMessage("keySimulate(" + simCode + "," + (fDown? "down" : "up") + "): " + (fSimulated? "true" : "false"), true);
}
return fSimulated;
};
/**
* Keyboard.init()
*
* This function operates on every HTML element of class "keyboard", extracting the
* JSON-encoded parameters for the Keyboard constructor from the element's "data-value"
* attribute, invoking the constructor to create a Keyboard component, and then binding
* any associated HTML controls to the new component.
*/
Keyboard.init = function()
{
var aeKbd = Component.getElementsByClass(window.document, PCJSCLASS, "keyboard");
for (var iKbd = 0; iKbd < aeKbd.length; iKbd++) {
var eKbd = aeKbd[iKbd];
var parmsKbd = Component.getComponentParms(eKbd);
var kbd = new Keyboard(parmsKbd);
Component.bindComponentControls(kbd, eKbd, PCJSCLASS);
}
};
/*
* Initialize every Keyboard module on the page.
*/
web.onInit(Keyboard.init);
if (typeof module !== 'undefined') module.exports = Keyboard;
/**
* @fileoverview Implements the PCjs "physical" Memory component.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-Sep-04
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
if (typeof module !== 'undefined') {
var str = require("../../shared/lib/strlib");
var Component = require("../../shared/lib/component");
var Messages = require("./messages");
var X86 = require("./x86");
}
/**
* @class DataView
* @property {function(number,boolean):number} getUint8
* @property {function(number,number,boolean)} setUint8
* @property {function(number,boolean):number} getUint16
* @property {function(number,number,boolean)} setUint16
* @property {function(number,boolean):number} getInt32
* @property {function(number,number,boolean)} setInt32
*/
var littleEndian = (TYPEDARRAYS? (function() {
var buffer = new ArrayBuffer(2);
new DataView(buffer).setUint16(0, 256, true);
return new Uint16Array(buffer)[0] === 256;
})() : false);
/**
* Memory(addr, used, size, type, controller)
*
* The Bus component allocates Memory objects so that each has a memory buffer with a
* block-granular starting address and an address range equal to bus.nBlockSize; however,
* the size of any given Memory object's underlying buffer can be either zero or bus.nBlockSize;
* memory read/write functions for empty (buffer-less) blocks are mapped to readNone/writeNone.
*
* The Bus allocates empty blocks for the entire address space during initialization, so that
* any reads/writes to undefined addresses will have no effect. Later, the ROM and RAM
* components will ask the Bus to allocate memory for specific ranges, and the Bus will allocate
* as many new blockSize Memory objects as the ranges require. Partial Memory blocks could
* also be supported in theory, but in practice, they're not.
*
* Because Memory blocks now allow us to have a "sparse" address space, we could choose to
* take the memory hit of allocating 4K arrays per block, where each element stores only one byte,
* instead of the more frugal but slightly slower approach of allocating arrays of 32-bit dwords
* (LONGARRAYS) and shifting/masking bytes/words to/from dwords; in theory, byte accesses would
* be faster and word accesses somewhat less faster.
*
* However, preliminary testing of that feature (FATARRAYS) did not yield significantly faster
* performance, so it is OFF by default to minimize our memory consumption. Using TYPEDARRAYS
* would seem best, but as discussed in defines.js, it's off by default, because it doesn't perform
* as well as LONGARRAYS; the other advantage of TYPEDARRAYS is that it should theoretically use
* about 1/2 the memory of LONGARRAYS (32-bit elements vs 64-bit numbers), but I value speed over
* size at this point. Also, not all JavaScript implementations support TYPEDARRAYS (IE9 is probably
* the only real outlier: it lacks typed arrays but otherwise has all the necessary HTML5 support).
*
* WARNING: Since Memory blocks are low-level objects that have no UI requirements, they
* do not inherit from the Component class, so if you want to use any Component class methods,
* such as Component.assert(), use the corresponding Debugger methods instead (assuming a debugger
* is available).
*
* @constructor
* @param {number|null} [addr] of lowest used address in block
* @param {number} [used] portion of block in bytes (0 for none); must be a multiple of 4
* @param {number} [size] of block's buffer in bytes (0 for none); must be a multiple of 4
* @param {number} [type] is one of the Memory.TYPE constants (default is Memory.TYPE.NONE)
* @param {Object} [controller] is an optional memory controller component
* @param {X86CPU} [cpu] is required for UNPAGED memory blocks, so that the CPU can map it to a PAGED block
*/
function Memory(addr, used, size, type, controller, cpu)
{
var i;
this.id = (Memory.idBlock += 2);
this.adw = null;
this.offset = 0;
this.addr = addr;
this.used = used;
this.size = size || 0;
this.type = type || Memory.TYPE.NONE;
this.fReadOnly = (type == Memory.TYPE.ROM);
this.controller = null;
this.cpu = cpu;
this.fDirty = this.fDirtyEver = false;
this.setPhysBlock();
if (BACKTRACK) {
if (!size || controller) {
this.fModBackTrack = false;
this.readBackTrack = this.readBackTrackNone;
this.writeBackTrack = this.writeBackTrackNone;
this.modBackTrack = this.modBackTrackNone;
} else {
this.fModBackTrack = true;
this.readBackTrack = this.readBackTrackIndex;
this.writeBackTrack = this.writeBackTrackIndex;
this.modBackTrack = this.modBackTrackIndex;
this.abtIndexes = new Array(size);
for (i = 0; i < size; i++) this.abtIndexes[i] = 0;
}
}
/*
* For empty memory blocks, all we need to do is ensure all access functions
* are mapped to "none" handlers (or "unpaged" handlers if paging is enabled).
*/
if (!size) {
this.setAccess();
return;
}
/*
* When a controller is specified, the controller must provide a buffer,
* via getMemoryBuffer(), and memory access functions, via getMemoryAccess().
*/
if (controller) {
this.controller = controller;
var a = controller.getMemoryBuffer(addr);
this.adw = a[0];
this.offset = a[1];
this.setAccess(controller.getMemoryAccess());
return;
}
/*
* This is the normal case: allocate a buffer that provides 8 bits of data per address;
* no controller is required because our default memory access functions (see afnMemory)
* know how to deal with this simple 1-1 mapping of addresses to bytes and words.
*
* TODO: Consider initializing the memory array to random (or pseudo-random) values in DEBUG
* mode; pseudo-random might be best, to help make any bugs reproducible.
*/
if (TYPEDARRAYS) {
this.buffer = new ArrayBuffer(size);
this.dv = new DataView(this.buffer, 0, size);
/*
* If littleEndian is true, we can use ab[], aw[] and adw[] directly; well, we can use them
* whenever the offset is a multiple of 1, 2 or 4, respectively. Otherwise, we must fallback to
* dv.getUint8()/dv.setUint8(), dv.getUint16()/dv.setUint16() and dv.getInt32()/dv.setInt32().
*/
this.ab = new Uint8Array(this.buffer, 0, size);
this.aw = new Uint16Array(this.buffer, 0, size >> 1);
this.adw = new Int32Array(this.buffer, 0, size >> 2);
this.setAccess(littleEndian? Memory.afnLittleEndian : Memory.afnBigEndian);
} else {
if (FATARRAYS) {
this.ab = new Array(size);
} else {
/*
* NOTE: This is the default mode of operation (!TYPEDARRAYS && !FATARRAYS), because it
* seems to provide the best performance; and although in theory, that performance might
* come at twice the overhead of TYPEDARRAYS, it's increasingly likely that the JavaScript
* runtime will notice that all we ever store are 32-bit values, and optimize accordingly.
*/
this.adw = new Array(size >> 2);
for (i = 0; i < this.adw.length; i++) this.adw[i] = 0;
}
this.setAccess(Memory.afnMemory);
}
}
/*
* Basic memory types
*
* RAM is the most conventional memory type, providing full read/write capability to x86-compatible (ie,
* 'little endian") storage. ROM is equally conventional, except that the fReadOnly property is set,
* disabling writes. VIDEO is treated exactly like RAM, unless a controller is provided. Both RAM and
* VIDEO memory are always considered writable, and even ROM can be written using the Bus setByteDirect()
* interface (which in turn uses the Memory writeByteDirect() interface), allowing the ROM component to
* initialize its own memory. The CTRL type is used to identify memory-mapped devices that do not need
* any default storage and always provide their own controller.
*
* UNPAGED and PAGED blocks are created by the CPU when paging is enabled; the role of an UNPAGED block
* is simply to perform page translation and replace itself with a PAGED block, which redirects read/write
* requests to the physical page located during translation. UNPAGED and PAGED blocks are considered
* "logical" blocks that don't contain any storage of their own; all other block types represent "physical"
* memory (or a memory-mapped device).
*
* Unallocated regions of the address space contain a special memory block of type NONE that contains
* no storage. Mapping every addressible location to a memory block allows all accesses to be routed in
* exactly the same manner, without resorting to any range or processor checks.
*
* Originally, the Debugger always went through the Bus interfaces, and could therefore modify ROMs as well,
* but with the introduction of protected mode memory segmentation (and later paging), where logical and
* phsycial addresses were no longer the same, that is no longer true. For coherency, all Debugger memory
* accesses now go through the X86Seg and X86CPU memory interfaces, so that the user sees the same segment
* and page translation that the CPU sees. However, the Debugger uses special "fSuppress" flags to prevent
* those X86 interfaces from triggering segment and/or page faults when invalid or not-present segments
* or pages are accessed.
*
* These types are not mutually exclusive. For example, VIDEO memory could be allocated as RAM, with or
* without a custom controller (the original Monochrome and CGA video cards used read/write storage that
* was indistiguishable from RAM), and CTRL memory could be allocated as an empty block of any type, with
* a custom controller. A few types are required for certain features (eg, ROM is required if you want
* read-only memory), but the larger purpose of these types is to help document the caller's intent and to
* provide the Control Panel with the ability to highlight memory regions accordingly.
*/
Memory.TYPE = {
NONE: 0,
RAM: 1,
ROM: 2,
VIDEO: 3,
CTRL: 4,
UNPAGED: 5,
PAGED: 6,
NAMES: ["NONE", "RAM", "ROM", "VIDEO", "H/W", "UNPAGED", "PAGED"],
COLORS: ["black", "blue", "green", "cyan"]
};
/*
* Last used block ID (used for debugging only)
*/
Memory.idBlock = 0;
/**
* adjustEndian(dw)
*
* @param {number} dw
* @return {number}
*/
Memory.adjustEndian = function(dw) {
if (TYPEDARRAYS && !littleEndian) {
dw = (dw << 24) | ((dw << 8) & 0x00ff0000) | ((dw >> 8) & 0x0000ff00) | (dw >>> 24);
}
return dw;
};
Memory.prototype = {
constructor: Memory,
parent: null,
/**
* clone(mem, type)
*
* Converts the current Memory block (this) into a clone of the given Memory block (mem),
* and optionally overrides the current block's type with the specified type.
*
* @this {Memory}
* @param {Memory} mem
* @param {number} [type]
*/
clone: function(mem, type) {
/*
* Original memory block IDs are even; cloned memory block IDs are odd;
* the original ID of the current block is lost, but that's OK, since it was presumably
* produced merely to become a clone.
*/
this.id = mem.id | 0x1;
this.used = mem.used;
this.size = mem.size;
if (type) {
this.type = type;
this.fReadOnly = (type == Memory.TYPE.ROM);
}
if (TYPEDARRAYS) {
this.buffer = mem.buffer;
this.dv = mem.dv;
this.ab = mem.ab;
this.aw = mem.aw;
this.adw = mem.adw;
this.setAccess(littleEndian? Memory.afnLittleEndian : Memory.afnBigEndian);
} else {
if (FATARRAYS) {
this.ab = mem.ab;
} else {
this.adw = mem.adw;
}
this.setAccess(Memory.afnMemory);
}
},
/**
* save()
*
* This gets the contents of a Memory block as an array of 32-bit values;
* used by Bus.saveMemory(), which in turn is called by X86CPU.save().
*
* Memory blocks with custom memory controllers do NOT save their contents;
* that's the responsibility of the controller component.
*
* @this {Memory}
* @return {Array|Int32Array|null}
*/
save: function() {
var adw, i;
if (this.controller) {
adw = null;
}
else if (FATARRAYS) {
adw = new Array(this.size >> 2);
var off = 0;
for (i = 0; i < adw.length; i++) {
adw[i] = this.ab[off] | (this.ab[off + 1] << 8) | (this.ab[off + 2] << 16) | (this.ab[off + 3] << 24);
off += 4;
}
}
else if (TYPEDARRAYS) {
/*
* It might be tempting to just return a copy of Int32Array(this.buffer, 0, this.size >> 2),
* but we can't be sure of the "endianness" of an Int32Array -- which would be OK if the array
* was always saved/restored on the same machine, but there's no guarantee of that, either.
* So we use getInt32() and require little-endian values.
*
* Moreover, an Int32Array isn't treated by JSON.stringify() and JSON.parse() exactly like
* a normal array; it's serialized as an Object rather than an Array, so it lacks a "length"
* property and causes problems for State.store() and State.parse().
*/
adw = new Array(this.size >> 2);
for (i = 0; i < adw.length; i++) {
adw[i] = this.dv.getInt32(i << 2, true);
}
}
else {
adw = this.adw;
}
return adw;
},
/**
* restore(adw)
*
* This restores the contents of a Memory block from an array of 32-bit values;
* used by Bus.restoreMemory(), which is called by X86CPU.restore(), after all other
* components have been restored and thus all Memory blocks have been allocated
* by their respective components.
*
* @this {Memory}
* @param {Array|null} adw
* @return {boolean} true if successful, false if block size mismatch
*/
restore: function(adw) {
if (this.controller) {
return (adw == null);
}
/*
* At this point, it's a consistency error for adw to be null; it's happened once already,
* when there was a restore bug in the Video component that added the frame buffer at the video
* card's "spec'ed" address instead of the programmed address, so there were no controller-owned
* memory blocks installed at the programmed address, and so we arrived here at a block with
* no controller AND no data.
*/
Component.assert(adw != null);
if (adw && this.size == adw.length << 2) {
var i;
if (FATARRAYS) {
var off = 0;
for (i = 0; i < adw.length; i++) {
this.ab[off] = adw[i] & 0xff;
this.ab[off + 1] = (adw[i] >> 8) & 0xff;
this.ab[off + 2] = (adw[i] >> 16) & 0xff;
this.ab[off + 3] = (adw[i] >> 24) & 0xff;
off += 4;
}
} else if (TYPEDARRAYS) {
for (i = 0; i < adw.length; i++) {
this.dv.setInt32(i << 2, adw[i], true);
}
} else {
this.adw = adw;
}
this.fDirty = true;
return true;
}
return false;
},
/**
* setAccess(afn)
*
* If no function table is specified, a default is selected based on the Memory type.
*
* @this {Memory}
* @param {Array.<function()>} [afn] function table
*/
setAccess: function(afn) {
if (!afn) {
if (this.type == Memory.TYPE.UNPAGED) {
afn = Memory.afnUnpaged;
}
else if (this.type == Memory.TYPE.PAGED) {
afn = Memory.afnPaged;
} else {
Component.assert(this.type == Memory.TYPE.NONE);
afn = Memory.afnNone;
}
}
this.setReadAccess(afn, true);
this.setWriteAccess(afn, true);
},
/**
* setReadAccess(afn, fDirect)
*
* @this {Memory}
* @param {Array.<function()>} afn
* @param {boolean} [fDirect]
*/
setReadAccess: function(afn, fDirect) {
this.readByte = afn[0] || this.readNone;
this.readShort = afn[1] || this.readShortDefault;
this.readLong = afn[2] || this.readLongDefault;
if (fDirect) {
this.readByteDirect = afn[0] || this.readNone;
this.readShortDirect = afn[1] || this.readShortDefault;
this.readLongDirect = afn[2] || this.readLongDefault;
}
},
/**
* setWriteAccess(afn, fDirect)
*
* @this {Memory}
* @param {Array.<function()>} afn
* @param {boolean} [fDirect]
*/
setWriteAccess: function(afn, fDirect) {
this.writeByte = !this.fReadOnly && afn[3] || this.writeNone;
this.writeShort = !this.fReadOnly && afn[4] || this.writeShortDefault;
this.writeLong = !this.fReadOnly && afn[5] || this.writeLongDefault;
if (fDirect) {
this.writeByteDirect = afn[3] || this.writeNone;
this.writeShortDirect = afn[4] || this.writeShortDefault;
this.writeLongDirect = afn[5] || this.writeLongDefault;
}
},
/**
* resetReadAccess()
*
* @this {Memory}
*/
resetReadAccess: function() {
this.readByte = this.readByteDirect;
this.readShort = this.readShortDirect;
this.readLong = this.readLongDirect;
},
/**
* resetWriteAccess()
*
* @this {Memory}
*/
resetWriteAccess: function() {
this.writeByte = this.fReadOnly? this.writeNone : this.writeByteDirect;
this.writeShort = this.fReadOnly? this.writeNone : this.writeShortDirect;
this.writeLong = this.fReadOnly? this.writeNone : this.writeLongDirect;
},
/**
* setDebugger(dbg, addr, size)
*
* @this {Memory}
* @param {Debugger} dbg
* @param {number} addr of block
* @param {number} size of block
*/
setDebugger: function(dbg, addr, size) {
if (DEBUGGER) {
this.dbg = dbg;
this.cReadBreakpoints = this.cWriteBreakpoints = 0;
Component.assert(this.dbg);
this.dbg.redoBreakpoints(addr, size);
}
},
/**
* getPageBlock(addr, fWrite)
*
* @this {Memory}
* @param {number} addr
* @param {boolean} fWrite (true if called for a write, false if for a read)
* @return {Memory}
*/
getPageBlock: function(addr, fWrite) {
var block = this.cpu.mapPageBlock(addr, fWrite);
/*
* If mapPageBlock() fails -- which can easily happen if the page is not present or has insufficient
* privileges -- then a fault will be triggered and block will be null. We still have to return a block,
* but it will be our old "unpaged" self.
*/
return block || this;
},
/**
* setPhysBlock(blockPhys, blockPDE, offPDE, blockPTE, offPTE)
*
* @this {Memory}
* @param {Memory|null} [blockPhys]
* @param {Memory|null} [blockPDE]
* @param {number} [offPDE]
* @param {Memory|null} [blockPTE]
* @param {number} [offPTE]
*/
setPhysBlock: function(blockPhys, blockPDE, offPDE, blockPTE, offPTE) {
this.blockPhys = blockPhys;
this.blockPDE = blockPDE;
this.iPDE = offPDE >> 2; // convert offPDE into iPDE (an adw index)
this.blockPTE = blockPTE;
this.iPTE = offPTE >> 2; // convert offPTE into iPTE (an adw index)
this.bitPTEDirty = blockPhys? Memory.adjustEndian(X86.PTE.ACCESSED | X86.PTE.DIRTY) : 0;
this.bitPTEAccessed = blockPhys? Memory.adjustEndian(X86.PTE.ACCESSED) : 0;
},
/**
* addBreakpoint(off, fWrite)
*
* @this {Memory}
* @param {number} off
* @param {boolean} fWrite
*/
addBreakpoint: function(off, fWrite) {
if (DEBUGGER && this.dbg) {
if (!fWrite) {
if (this.cReadBreakpoints++ === 0) {
this.setReadAccess(Memory.afnChecked);
}
if (DEBUG) this.dbg.println("read breakpoint added to memory block " + str.toHex(this.addr));
}
else {
if (this.cWriteBreakpoints++ === 0) {
this.setWriteAccess(Memory.afnChecked);
}
if (DEBUG) this.dbg.println("write breakpoint added to memory block " + str.toHex(this.addr));
}
}
},
/**
* removeBreakpoint(off, fWrite)
*
* @this {Memory}
* @param {number} off
* @param {boolean} fWrite
*/
removeBreakpoint: function(off, fWrite) {
if (DEBUGGER && this.dbg) {
if (!fWrite) {
if (--this.cReadBreakpoints === 0) {
this.resetReadAccess();
if (DEBUG) this.dbg.println("all read breakpoints removed from memory block " + str.toHex(this.addr));
}
this.dbg.assert(this.cReadBreakpoints >= 0);
}
else {
if (--this.cWriteBreakpoints === 0) {
this.resetWriteAccess();
if (DEBUG) this.dbg.println("all write breakpoints removed from memory block " + str.toHex(this.addr));
}
this.dbg.assert(this.cWriteBreakpoints >= 0);
}
}
},
/**
* readNone(off)
*
* Previously, this always returned 0x00, but the initial memory probe by the Compaq DeskPro 386 ROM BIOS
* writes 0x0000 to the first word of every 64Kb block in the nearly 16Mb address space it supports, and
* if it reads back 0x0000, it will initially think that LOTS of RAM exists, only to be disappointed later
* when it performs a more exhaustive memory test, generating unwanted error messages in the process.
*
* TODO: Determine if we should have separate readByteNone(), readShortNone() and readLongNone() functions
* to return 0xff, 0xffff and 0xffffffff|0, respectively. This seems sufficient for now, as it seems unlikely
* that a system would require nonexistent memory locations to return ALL bits set.
*
* Also, I'm reluctant to address that potential issue by simply returning -1, because to date, the above
* Memory interfaces have always returned values that are properly masked to 8, 16 or 32 bits, respectively.
*
* @this {Memory}
* @param {number} off
* @param {number} addr
* @return {number}
*/
readNone: function readNone(off, addr) {
if (DEBUGGER && this.dbg && this.dbg.messageEnabled(Messages.MEM) /* && !off */) {
this.dbg.message("attempt to read invalid block %" + str.toHex(this.addr), true);
}
return 0xff;
},
/**
* writeNone(off, v, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} v (could be either a byte or word value, since we use the same handler for both kinds of accesses)
* @param {number} addr
*/
writeNone: function writeNone(off, v, addr) {
if (DEBUGGER && this.dbg && this.dbg.messageEnabled(Messages.MEM) /* && !off */) {
this.dbg.message("attempt to write " + str.toHexWord(v) + " to invalid block %" + str.toHex(this.addr), true);
}
},
/**
* readShortDefault(off, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} addr
* @return {number}
*/
readShortDefault: function readShortDefault(off, addr) {
return this.readByte(off, addr) | (this.readByte(off + 1, addr) << 8);
},
/**
* readLongDefault(off, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} addr
* @return {number}
*/
readLongDefault: function readLongDefault(off, addr) {
return this.readByte(off, addr) | (this.readByte(off + 1, addr) << 8) | (this.readByte(off + 2, addr) << 16) | (this.readByte(off + 3, addr) << 24);
},
/**
* writeShortDefault(off, w, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} w
* @param {number} addr
*/
writeShortDefault: function writeShortDefault(off, w, addr) {
Component.assert(!(w & ~0xffff));
this.writeByte(off, w & 0xff);
this.writeByte(off + 1, w >> 8);
},
/**
* writeLongDefault(off, w, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} w
* @param {number} addr
*/
writeLongDefault: function writeLongDefault(off, w, addr) {
this.writeByte(off, w & 0xff);
this.writeByte(off + 1, (w >> 8) & 0xff);
this.writeByte(off + 2, (w >> 16) & 0xff);
this.writeByte(off + 3, (w >>> 24));
},
/**
* readByteMemory(off, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} addr
* @return {number}
*/
readByteMemory: function readByteMemory(off, addr) {
Component.assert(off >= 0 && off < this.size);
if (FATARRAYS) {
return this.ab[off];
}
return ((this.adw[off >> 2] >>> ((off & 0x3) << 3)) & 0xff);
},
/**
* readShortMemory(off, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} addr
* @return {number}
*/
readShortMemory: function readShortMemory(off, addr) {
Component.assert(off >= 0 && off < this.size - 1);
if (FATARRAYS) {
return this.ab[off] | (this.ab[off + 1] << 8);
}
var w;
var idw = off >> 2;
var nShift = (off & 0x3) << 3;
var dw = (this.adw[idw] >> nShift);
if (nShift < 24) {
w = dw & 0xffff;
} else {
w = (dw & 0xff) | ((this.adw[idw + 1] & 0xff) << 8);
}
return w;
},
/**
* readLongMemory(off, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} addr
* @return {number}
*/
readLongMemory: function readLongMemory(off, addr) {
Component.assert(off >= 0 && off < this.size - 3);
if (FATARRAYS) {
return this.ab[off] | (this.ab[off + 1] << 8) | (this.ab[off + 2] << 16) | (this.ab[off + 3] << 24);
}
var idw = off >> 2;
var nShift = (off & 0x3) << 3;
var l = this.adw[idw];
if (nShift) {
l >>>= nShift;
l |= this.adw[idw + 1] << (32 - nShift);
}
return l;
},
/**
* writeByteMemory(off, b, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} b
* @param {number} addr
*/
writeByteMemory: function writeByteMemory(off, b, addr) {
Component.assert(off >= 0 && off < this.size && (b & 0xff) == b);
if (FATARRAYS) {
this.ab[off] = b;
} else {
var idw = off >> 2;
var nShift = (off & 0x3) << 3;
this.adw[idw] = (this.adw[idw] & ~(0xff << nShift)) | (b << nShift);
}
this.fDirty = true;
},
/**
* writeShortMemory(off, w, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} w
* @param {number} addr
*/
writeShortMemory: function writeShortMemory(off, w, addr) {
Component.assert(off >= 0 && off < this.size - 1 && (w & 0xffff) == w);
if (FATARRAYS) {
this.ab[off] = (w & 0xff);
this.ab[off + 1] = (w >> 8);
} else {
var idw = off >> 2;
var nShift = (off & 0x3) << 3;
if (nShift < 24) {
this.adw[idw] = (this.adw[idw] & ~(0xffff << nShift)) | (w << nShift);
} else {
this.adw[idw] = (this.adw[idw] & 0x00ffffff) | (w << 24);
idw++;
this.adw[idw] = (this.adw[idw] & (0xffffff00|0)) | (w >> 8);
}
}
this.fDirty = true;
},
/**
* writeLongMemory(off, l, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} l
* @param {number} addr
*/
writeLongMemory: function writeLongMemory(off, l, addr) {
Component.assert(off >= 0 && off < this.size - 3);
if (FATARRAYS) {
this.ab[off] = (l & 0xff);
this.ab[off + 1] = (l >> 8) & 0xff;
this.ab[off + 2] = (l >> 16) & 0xff;
this.ab[off + 3] = (l >> 24) & 0xff;
} else {
var idw = off >> 2;
var nShift = (off & 0x3) << 3;
if (!nShift) {
this.adw[idw] = l;
} else {
var mask = (0xffffffff|0) << nShift;
this.adw[idw] = (this.adw[idw] & ~mask) | (l << nShift);
idw++;
this.adw[idw] = (this.adw[idw] & mask) | (l >>> (32 - nShift));
}
}
this.fDirty = true;
},
/**
* readByteChecked(off, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} addr
* @return {number}
*/
readByteChecked: function readByteChecked(off, addr) {
if (DEBUGGER && this.dbg) this.dbg.checkMemoryRead(addr);
return this.readByteDirect(off, addr);
},
/**
* readShortChecked(off, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} addr
* @return {number}
*/
readShortChecked: function readShortChecked(off, addr) {
if (DEBUGGER && this.dbg) {
this.dbg.checkMemoryRead(addr) ||
this.dbg.checkMemoryRead(addr + 1);
}
return this.readShortDirect(off, addr);
},
/**
* readLongChecked(off, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} addr
* @return {number}
*/
readLongChecked: function readLongChecked(off, addr) {
if (DEBUGGER && this.dbg) {
this.dbg.checkMemoryRead(addr) ||
this.dbg.checkMemoryRead(addr + 1) ||
this.dbg.checkMemoryRead(addr + 2) ||
this.dbg.checkMemoryRead(addr + 3);
}
return this.readLongDirect(off, addr);
},
/**
* writeByteChecked(off, b, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} addr
* @param {number} b
*/
writeByteChecked: function writeByteChecked(off, b, addr) {
if (DEBUGGER && this.dbg) this.dbg.checkMemoryWrite(addr);
if (this.fReadOnly) this.writeNone(off, b, addr); else this.writeByteDirect(off, b, addr);
},
/**
* writeShortChecked(off, w, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} addr
* @param {number} w
*/
writeShortChecked: function writeShortChecked(off, w, addr) {
if (DEBUGGER && this.dbg) {
this.dbg.checkMemoryWrite(addr) ||
this.dbg.checkMemoryWrite(addr + 1);
}
if (this.fReadOnly) this.writeNone(off, w, addr); else this.writeShortDirect(off, w, addr);
},
/**
* writeLongChecked(off, l, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} l
* @param {number} addr
*/
writeLongChecked: function writeLongChecked(off, l, addr) {
if (DEBUGGER && this.dbg) {
this.dbg.checkMemoryWrite(this.addr + off) ||
this.dbg.checkMemoryWrite(this.addr + off + 1) ||
this.dbg.checkMemoryWrite(this.addr + off + 2) ||
this.dbg.checkMemoryWrite(this.addr + off + 3);
}
if (this.fReadOnly) this.writeNone(off, l, addr); else this.writeLongDirect(off, l, addr);
},
/**
* readBytePaged(off, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} addr
* @return {number}
*/
readBytePaged: function readBytePaged(off, addr) {
this.blockPDE.adw[this.iPDE] |= this.bitPTEAccessed;
this.blockPTE.adw[this.iPTE] |= this.bitPTEAccessed;
return this.blockPhys.readByte(off, addr);
},
/**
* readShortPaged(off, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} addr
* @return {number}
*/
readShortPaged: function readShortPaged(off, addr) {
this.blockPDE.adw[this.iPDE] |= this.bitPTEAccessed;
this.blockPTE.adw[this.iPTE] |= this.bitPTEAccessed;
return this.blockPhys.readShort(off, addr);
},
/**
* readLongPaged(off, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} addr
* @return {number}
*/
readLongPaged: function readLongPaged(off, addr) {
this.blockPDE.adw[this.iPDE] |= this.bitPTEAccessed;
this.blockPTE.adw[this.iPTE] |= this.bitPTEAccessed;
return this.blockPhys.readLong(off, addr);
},
/**
* writeBytePaged(off, b, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} b
* @param {number} addr
*/
writeBytePaged: function writeBytePaged(off, b, addr) {
this.blockPDE.adw[this.iPDE] |= this.bitPTEAccessed;
this.blockPTE.adw[this.iPTE] |= this.bitPTEDirty;
this.blockPhys.writeByte(off, b, addr);
},
/**
* writeShortPaged(off, w, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} w
* @param {number} addr
*/
writeShortPaged: function writeShortPaged(off, w, addr) {
this.blockPDE.adw[this.iPDE] |= this.bitPTEAccessed;
this.blockPTE.adw[this.iPTE] |= this.bitPTEDirty;
this.blockPhys.writeShort(off, w, addr);
},
/**
* writeLongPaged(off, l, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} l
* @param {number} addr
*/
writeLongPaged: function writeLongPaged(off, l, addr) {
this.blockPDE.adw[this.iPDE] |= this.bitPTEAccessed;
this.blockPTE.adw[this.iPTE] |= this.bitPTEDirty;
this.blockPhys.writeLong(off, l, addr);
},
/**
* readByteUnpaged(off, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} addr
* @return {number}
*/
readByteUnpaged: function readByteUnpaged(off, addr) {
return this.getPageBlock(addr, false).readByte(off, addr);
},
/**
* readShortUnpaged(off, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} addr
* @return {number}
*/
readShortUnpaged: function readShortUnpaged(off, addr) {
return this.getPageBlock(addr, false).readShort(off, addr);
},
/**
* readLongUnpaged(off, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} addr
* @return {number}
*/
readLongUnpaged: function readLongUnpaged(off, addr) {
return this.getPageBlock(addr, false).readLong(off, addr);
},
/**
* writeByteUnpaged(off, b, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} b
* @param {number} addr
*/
writeByteUnpaged: function writeByteUnpaged(off, b, addr) {
this.getPageBlock(addr, true).writeByte(off, b, addr);
},
/**
* writeShortUnpaged(off, w, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} w
* @param {number} addr
*/
writeShortUnpaged: function writeShortUnpaged(off, w, addr) {
this.getPageBlock(addr, true).writeShort(off, w, addr);
},
/**
* writeLongUnpaged(off, l, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} l
* @param {number} addr
*/
writeLongUnpaged: function writeLongUnpaged(off, l, addr) {
this.getPageBlock(addr, true).writeLong(off, l, addr);
},
/**
* readByteBigEndian(off, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} addr
* @return {number}
*/
readByteBigEndian: function readByteBigEndian(off, addr) {
Component.assert(off >= 0 && off < this.size);
return this.ab[off];
},
/**
* readByteLittleEndian(off, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} addr
* @return {number}
*/
readByteLittleEndian: function readByteLittleEndian(off, addr) {
Component.assert(off >= 0 && off < this.size);
return this.ab[off];
},
/**
* readShortBigEndian(off, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} addr
* @return {number}
*/
readShortBigEndian: function readShortBigEndian(off, addr) {
Component.assert(off >= 0 && off < this.size - 1);
return this.dv.getUint16(off, true);
},
/**
* readShortLittleEndian(off, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} addr
* @return {number}
*/
readShortLittleEndian: function readShortLittleEndian(off, addr) {
Component.assert(off >= 0 && off < this.size - 1);
/*
* TODO: It remains to be seen if there's any advantage to checking the offset
* for an aligned read vs. always reading the bytes separately; it seems a safe bet
* for longs, but it's less clear for shorts.
*/
return (off & 0x1)? (this.ab[off] | (this.ab[off+1] << 8)) : this.aw[off >> 1];
},
/**
* readLongBigEndian(off, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} addr
* @return {number}
*/
readLongBigEndian: function readLongBigEndian(off, addr) {
Component.assert(off >= 0 && off < this.size - 3);
return this.dv.getInt32(off, true);
},
/**
* readLongLittleEndian(off, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} addr
* @return {number}
*/
readLongLittleEndian: function readLongLittleEndian(off, addr) {
Component.assert(off >= 0 && off < this.size - 3);
/*
* TODO: It remains to be seen if there's any advantage to checking the offset
* for an aligned read vs. always reading the bytes separately; it seems a safe bet
* for longs, but it's less clear for shorts.
*/
return (off & 0x3)? (this.ab[off] | (this.ab[off+1] << 8) | (this.ab[off+2] << 16) | (this.ab[off+3] << 24)) : this.adw[off >> 2];
},
/**
* writeByteBigEndian(off, b, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} b
* @param {number} addr
*/
writeByteBigEndian: function writeByteBigEndian(off, b, addr) {
Component.assert(off >= 0 && off < this.size);
this.ab[off] = b;
this.fDirty = true;
},
/**
* writeByteLittleEndian(off, b, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} addr
* @param {number} b
*/
writeByteLittleEndian: function writeByteLittleEndian(off, b, addr) {
Component.assert(off >= 0 && off < this.size);
this.ab[off] = b;
this.fDirty = true;
},
/**
* writeShortBigEndian(off, w, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} addr
* @param {number} w
*/
writeShortBigEndian: function writeShortBigEndian(off, w, addr) {
Component.assert(off >= 0 && off < this.size - 1);
this.dv.setUint16(off, w, true);
this.fDirty = true;
},
/**
* writeShortLittleEndian(off, w, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} addr
* @param {number} w
*/
writeShortLittleEndian: function writeShortLittleEndian(off, w, addr) {
Component.assert(off >= 0 && off < this.size - 1);
/*
* TODO: It remains to be seen if there's any advantage to checking the offset
* for an aligned write vs. always writing the bytes separately; it seems a safe bet
* for longs, but it's less clear for shorts.
*/
if (off & 0x1) {
this.ab[off] = w;
this.ab[off+1] = w >> 8;
} else {
this.aw[off >> 1] = w;
}
this.fDirty = true;
},
/**
* writeLongBigEndian(off, l, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} l
* @param {number} addr
*/
writeLongBigEndian: function writeLongBigEndian(off, l, addr) {
Component.assert(off >= 0 && off < this.size - 3);
this.dv.setInt32(off, l, true);
this.fDirty = true;
},
/**
* writeLongLittleEndian(off, l, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} l
* @param {number} addr
*/
writeLongLittleEndian: function writeLongLittleEndian(off, l, addr) {
Component.assert(off >= 0 && off < this.size - 3);
/*
* TODO: It remains to be seen if there's any advantage to checking the offset
* for an aligned write vs. always writing the bytes separately; it seems a safe bet
* for longs, but it's less clear for shorts.
*/
if (off & 0x3) {
this.ab[off] = l;
this.ab[off+1] = (l >> 8);
this.ab[off+2] = (l >> 16);
this.ab[off+3] = (l >> 24);
} else {
this.adw[off >> 2] = l;
}
this.fDirty = true;
},
/**
* readBackTrackNone(off)
*
* @this {Memory}
* @param {number} off
* @return {number}
*/
readBackTrackNone: function readBackTrackNone(off) {
return 0;
},
/**
* writeBackTrackNone(off, bti)
*
* @this {Memory}
* @param {number} off
* @param {number} bti
*/
writeBackTrackNone: function writeBackTrackNone(off, bti) {
},
/**
* modBackTrackNone(fMod)
*
* @this {Memory}
* @param {boolean} fMod
*/
modBackTrackNone: function modBackTrackNone(fMod) {
return false;
},
/**
* readBackTrackIndex(off)
*
* @this {Memory}
* @param {number} off
* @return {number}
*/
readBackTrackIndex: function readBackTrackIndex(off) {
Component.assert(off >= 0 && off < this.size);
return this.abtIndexes[off];
},
/**
* writeBackTrackIndex(off, bti)
*
* @this {Memory}
* @param {number} off
* @param {number} bti
* @return {number} previous bti (0 if none)
*/
writeBackTrackIndex: function writeBackTrackIndex(off, bti) {
var btiPrev;
Component.assert(off >= 0 && off < this.size);
btiPrev = this.abtIndexes[off];
this.abtIndexes[off] = bti;
return btiPrev;
},
/**
* modBackTrackIndex(fMod)
*
* @this {Memory}
* @param {boolean} fMod
* @return {boolean} previous value
*/
modBackTrackIndex: function modBackTrackIndex(fMod) {
var fModPrev = this.fModBackTrack;
this.fModBackTrack = fMod;
return fModPrev;
}
};
/*
* This is the effective definition of afnNone, but we need not fully define it, because setAccess()
* uses these defaults when any of the 6 handlers (ie, 3 read handlers and 3 write handlers) are undefined.
*
Memory.afnNone = [Memory.prototype.readNone, Memory.prototype.readShortDefault, Memory.prototype.readLongDefault, Memory.prototype.writeNone, Memory.prototype.writeShortDefault, Memory.prototype.writeLongDefault];
*/
Memory.afnNone = [];
Memory.afnMemory = [Memory.prototype.readByteMemory, Memory.prototype.readShortMemory, Memory.prototype.readLongMemory, Memory.prototype.writeByteMemory, Memory.prototype.writeShortMemory, Memory.prototype.writeLongMemory];
Memory.afnChecked = [Memory.prototype.readByteChecked, Memory.prototype.readShortChecked, Memory.prototype.readLongChecked, Memory.prototype.writeByteChecked, Memory.prototype.writeShortChecked, Memory.prototype.writeLongChecked];
if (PAGEBLOCKS) {
Memory.afnPaged = [Memory.prototype.readBytePaged, Memory.prototype.readShortPaged, Memory.prototype.readLongPaged, Memory.prototype.writeBytePaged, Memory.prototype.writeShortPaged, Memory.prototype.writeLongPaged];
Memory.afnUnpaged = [Memory.prototype.readByteUnpaged, Memory.prototype.readShortUnpaged, Memory.prototype.readLongUnpaged, Memory.prototype.writeByteUnpaged, Memory.prototype.writeShortUnpaged, Memory.prototype.writeLongUnpaged];
}
if (TYPEDARRAYS) {
Memory.afnBigEndian = [Memory.prototype.readByteBigEndian, Memory.prototype.readShortBigEndian, Memory.prototype.readLongBigEndian, Memory.prototype.writeByteBigEndian, Memory.prototype.writeShortBigEndian, Memory.prototype.writeLongBigEndian];
Memory.afnLittleEndian = [Memory.prototype.readByteLittleEndian, Memory.prototype.readShortLittleEndian, Memory.prototype.readLongLittleEndian, Memory.prototype.writeByteLittleEndian, Memory.prototype.writeShortLittleEndian, Memory.prototype.writeLongLittleEndian];
}
if (typeof module !== 'undefined') module.exports = Memory;
/**
* @fileoverview PCjs-specific message definitions.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2014-Dec-11
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
/*
* Components that previously used Debugger messages definitions by including:
*
* var Debugger = require("./debugger");
*
* and using:
*
* Debugger.MESSAGE.FOO
*
* must now instead include:
*
* var Messages = require("./messages");
*
* and then replace all occurrences of "Debugger.MESSAGE.FOO" with "Messages.FOO".
*/
var Messages = {
CPU: 0x00000001,
SEG: 0x00000002,
DESC: 0x00000004,
TSS: 0x00000008,
INT: 0x00000010,
FAULT: 0x00000020,
BUS: 0x00000040,
MEM: 0x00000080,
PORT: 0x00000100,
DMA: 0x00000200,
PIC: 0x00000400,
TIMER: 0x00000800,
CMOS: 0x00001000,
RTC: 0x00002000,
C8042: 0x00004000,
CHIPSET: 0x00008000,
KEYBOARD: 0x00010000,
KEYS: 0x00020000,
VIDEO: 0x00040000,
FDC: 0x00080000,
HDC: 0x00100000,
DISK: 0x00200000,
SERIAL: 0x00400000,
SPEAKER: 0x00800000,
STATE: 0x01000000,
MOUSE: 0x02000000,
COMPUTER: 0x04000000,
DOS: 0x08000000,
DATA: 0x10000000,
LOG: 0x20000000,
WARN: 0x40000000,
HALT: 0x80000000|0
};
if (typeof module !== 'undefined') module.exports = Messages;
/**
* @fileoverview Implements the PCjs Mouse component.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-Jul-01
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
if (typeof module !== 'undefined') {
var str = require("../../shared/lib/strlib");
var web = require("../../shared/lib/weblib");
var Component = require("../../shared/lib/component");
var Messages = require("./messages");
var SerialPort = require("./serialport");
var State = require("./state");
}
/**
* Mouse(parmsMouse)
*
* The Mouse component has the following component-specific (parmsMouse) properties:
*
* serial: the ID of the corresponding serial component
*
* Since the first version of this component supports ONLY emulation of the original Microsoft
* serial mouse, a valid serial component ID is required. It's possible that future versions
* of this component may support other types of simulated hardware (eg, the Microsoft InPort
* bus mouse adapter), or a virtual driver interface that would eliminate the need for any
* intermediate hardware simulation (at the expense of writing an intermediate software layer or
* virtual driver for each supported operating system). However, those possibilities are extremely
* unlikely in the near term.
*
* If the 'serial' property is specified, then communication will be established with the
* SerialPort component, requesting access to the corresponding serial component ID. If the
* SerialPort component is not installed and/or the specified serial component ID is not present,
* a configuration error will be reported.
*
* TODO: Just out of curiosity, verify that the Microsoft Bus Mouse used ports 0x23D and 0x23F,
* because I saw Windows v1.01 probing those ports immediately prior to probing COM2 (and then COM1)
* for a serial mouse.
*
* @constructor
* @extends Component
* @param {Object} parmsMouse
*/
function Mouse(parmsMouse)
{
Component.call(this, "Mouse", parmsMouse, Mouse, Messages.MOUSE);
this.idAdapter = parmsMouse['serial'];
if (this.idAdapter) {
this.sAdapterType = "SerialPort";
}
this.setActive(false);
this.fCaptured = this.fLocked = false;
/*
* Initially, no video devices, and therefore no input devices, are attached. initBus() will update aVideo,
* and powerUp() will update aInput.
*/
this.aVideo = [];
this.aInput = [];
this.setReady();
}
/*
* From http://paulbourke.net/dataformats/serialmouse:
*
* The old MicroSoft serial mouse, while no longer in general use, can be employed to provide a low cost input device,
* for example, coupling the internal mechanism to other moving objects. The serial protocol for the mouse is:
*
* 1200 baud, 7 bit, 1 stop bit, no parity.
*
* The pinout of the connector follows the standard serial interface, as shown below:
*
* Pin Abbr Description
* 1 DCD Data Carrier Detect
* 2 RD Receive Data [serial data from mouse to host]
* 3 TD Transmit Data
* 4 DTR Data Terminal Ready [used to provide positive voltage to mouse, plus reset/detection]
* 5 SG Signal Ground
* 6 DSR Data Set Ready
* 7 RTS Request To Send [used to provide positive voltage to mouse]
* 8 CTS Clear To Send
* 9 RI Ring
*
* Every time the mouse changes state (moved or button pressed) a three byte "packet" is sent to the serial interface.
* For reasons known only to the engineers, the data is arranged as follows, most notably the two high order bits for the
* x and y coordinates share the first byte with the button status.
*
* D6 D5 D4 D3 D2 D1 D0
* 1st byte 1 LB RB Y7 Y6 X7 X6
* 2nd byte 0 X5 X4 X3 X2 X1 X0
* 3rd byte 0 Y5 Y4 Y3 Y2 Y1 Y0
*
* where:
*
* LB is the state of the left button, 1 = pressed, 0 = released.
* RB is the state of the right button, 1 = pressed, 0 = released
* X0-7 is movement of the mouse in the X direction since the last packet. Positive movement is toward the right.
* Y0-7 is movement of the mouse in the Y direction since the last packet. Positive movement is back, toward the user.
*
* From http://www.kryslix.com/nsfaq/Q.12.html:
*
* The Microsoft serial mouse is the most popular 2-button mouse. It is supported by all major operating systems.
* The maximum tracking rate for a Microsoft mouse is 40 reports/second * 127 counts per report, in other words, 5080 counts
* per second. The most common range for mice is is 100 to 400 CPI (counts per inch) but can be up to 1000 CPI. A 100 CPI mouse
* can discriminate motion up to 50.8 inches/second while a 400 CPI mouse can only discriminate motion up to 12.7 inches/second.
*
* 9-pin 25-pin Line Comments
* shell 1 GND
* 3 2 TD Serial data from host to mouse (only for power)
* 2 3 RD Serial data from mouse to host
* 7 4 RTS Positive voltage to mouse
* 8 5 CTS
* 6 6 DSR
* 5 7 SGND
* 4 20 DTR Positive voltage to mouse and reset/detection
*
* To function correctly, both the RTS and DTR lines must be positive. DTR/DSR and RTS/CTS must NOT be shorted.
* RTS may be toggled negative for at least 100ms to reset the mouse. (After a cold boot, the RTS line is usually negative.
* This provides an automatic toggle when RTS is brought positive). When DTR is toggled the mouse should send a single byte
* (0x4D, ASCII 'M').
*
* Serial data parameters: 1200bps, 7 data bits, 1 stop bit
*
* Data is sent in 3 byte packets for each event (a button is pressed or released, or the mouse moves):
*
* D7 D6 D5 D4 D3 D2 D1 D0
* Byte 1 X 1 LB RB Y7 Y6 X7 X6
* Byte 2 X 0 X5 X4 X3 X2 X1 X0
* Byte 3 X 0 Y5 Y4 Y3 Y2 Y1 Y0
*
* LB is the state of the left button (1 means down).
* RB is the state of the right button (1 means down).
* X7-X0 movement in X direction since last packet (signed byte).
* Y7-Y0 movement in Y direction since last packet (signed byte).
* The high order bit of each byte (D7) is ignored. Bit D6 indicates the start of an event, which allows the software to
* synchronize with the mouse.
*/
Component.subclass(Mouse);
Mouse.ID_SERIAL = 0x4D;
/**
* initBus(cmp, bus, cpu, dbg)
*
* @this {Mouse}
* @param {Computer} cmp
* @param {Bus} bus
* @param {X86CPU} cpu
* @param {Debugger} dbg
*/
Mouse.prototype.initBus = function(cmp, bus, cpu, dbg)
{
this.cmp = cmp;
this.bus = bus;
this.cpu = cpu;
this.dbg = dbg;
/*
* Attach the Video component to the CPU, so that the CPU can periodically update
* the video display via updateVideo(), as cycles permit.
*/
for (var video = null; (video = cmp.getComponentByType("Video", video));) {
this.aVideo.push(video);
}
};
/**
* isActive()
*
* @this {Mouse}
* @return {boolean} true if active, false if not
*/
Mouse.prototype.isActive = function()
{
return this.fActive && (this.cpu? this.cpu.isRunning() : false);
};
/**
* setActive(fActive)
*
* @this {Mouse}
* @param {boolean} fActive is true if active, false if not
*/
Mouse.prototype.setActive = function(fActive)
{
this.fActive = fActive;
/*
* It's currently not possible to automatically lock the pointer outside the context of a user action
* (eg, a button or screen click), so this code is for naught.
*
* if (this.aVideo.length) this.aVideo[0].notifyPointerActive(fActive);
*
* We now rely on similar code in clickMouse().
*/
};
/**
* powerUp(data, fRepower)
*
* @this {Mouse}
* @param {Object|null} data
* @param {boolean} [fRepower]
* @return {boolean} true if successful, false if failure
*/
Mouse.prototype.powerUp = function(data, fRepower)
{
if (!fRepower) {
if (!data || !this.restore) {
this.reset();
} else {
if (!this.restore(data)) return false;
}
if (this.sAdapterType && !this.componentAdapter) {
var componentAdapter = null;
while ((componentAdapter = this.cmp.getComponentByType(this.sAdapterType, componentAdapter))) {
if (componentAdapter.attachMouse) {
this.componentAdapter = componentAdapter.attachMouse(this.idAdapter, this);
if (this.componentAdapter) {
/*
* It's possible that the SerialPort we've just attached to might want to bring us "up to speed"
* on the adapter's state, which is why I envisioned a subsequent syncMouse() call. And you would
* want to do that as a separate call, not as part of attachMouse(), because componentAdapter
* isn't set until attachMouse() returns.
*
* However, syncMouse() seems unnecessary, given that SerialPort initializes its MCR to an "inactive"
* state, and even when restoring a previous state, if we've done our job properly, both SerialPort
* and Mouse should be restored in sync, making any explicit attempt at sync'ing unnecessary (or so I hope).
*/
// this.componentAdapter.syncMouse();
break;
}
}
}
if (this.componentAdapter) {
this.aInput = []; // ensure the input device array is empty before (re)filling it
for (var i = 0; i < this.aVideo.length; i++) {
var input = this.aVideo[i].getInput(this);
if (input) this.aInput.push(input);
}
} else {
Component.warning(this.id + ": " + this.sAdapterType + " " + this.idAdapter + " unavailable");
}
}
if (this.fActive) {
this.captureAll();
} else {
this.releaseAll();
}
}
return true;
};
/**
* powerDown(fSave, fShutdown)
*
* @this {Mouse}
* @param {boolean} fSave
* @param {boolean} [fShutdown]
* @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
*/
Mouse.prototype.powerDown = function(fSave, fShutdown)
{
return fSave && this.save? this.save() : true;
};
/**
* reset()
*
* @this {Mouse}
*/
Mouse.prototype.reset = function()
{
this.initState();
};
/**
* save()
*
* This implements save support for the Mouse component.
*
* @this {Mouse}
* @return {Object}
*/
Mouse.prototype.save = function()
{
var state = new State(this);
state.set(0, this.saveState());
return state.data();
};
/**
* restore(data)
*
* This implements restore support for the Mouse component.
*
* @this {Mouse}
* @param {Object} data
* @return {boolean} true if successful, false if failure
*/
Mouse.prototype.restore = function(data)
{
return this.initState(data[0]);
};
/**
* initState(data)
*
* @this {Mouse}
* @param {Array} [data]
* @return {boolean} true if successful, false if failure
*/
Mouse.prototype.initState = function(data)
{
var i = 0;
if (data === undefined) data = [false, -1, -1, 0, 0, false, false, 0];
this.setActive(data[i++]);
this.xMouse = data[i++];
this.yMouse = data[i++];
this.xDelta = data[i++];
this.yDelta = data[i++];
this.fButton1 = data[i++]; // FYI, we consider button1 to be the LEFT button
this.fButton2 = data[i++]; // FYI, we consider button2 to be the RIGHT button
this.bMCR = data[i];
return true;
};
/**
* saveState()
*
* @this {Mouse}
* @return {Array}
*/
Mouse.prototype.saveState = function()
{
var i = 0;
var data = [];
data[i++] = this.fActive;
data[i++] = this.xMouse;
data[i++] = this.yMouse;
data[i++] = this.xDelta;
data[i++] = this.yDelta;
data[i++] = this.fButton1;
data[i++] = this.fButton2;
data[i] = this.bMCR;
return data;
};
/**
* notifyPointerLocked()
*
* @this {Mouse}
* @param {boolean} fLocked
*/
Mouse.prototype.notifyPointerLocked = function(fLocked)
{
this.fLocked = fLocked;
};
/**
* captureAll()
*
* @this {Mouse}
*/
Mouse.prototype.captureAll = function()
{
if (!this.fCaptured) {
for (var i = 0; i < this.aInput.length; i++) {
if (this.captureMouse(this.aInput[i])) this.fCaptured = true;
}
}
};
/**
* releaseAll()
*
* @this {Mouse}
*/
Mouse.prototype.releaseAll = function()
{
if (this.fCaptured) {
for (var i = 0; i < this.aInput.length; i++) {
if (this.releaseMouse(this.aInput[i])) this.fCaptured = false;
}
}
};
/**
* captureMouse(control)
*
* NOTE: addEventListener() wasn't supported in Internet Explorer until IE9, but that's OK, because
* IE9 is the oldest IE we support anyway (since versions prior to IE9 lack the necessary HTML5 support).
*
* @this {Mouse}
* @param {Object} control from the HTML DOM (eg, the control for the simulated screen)
* @return {boolean} true if event handlers were actually added, false if not
*/
Mouse.prototype.captureMouse = function(control)
{
if (control) {
var mouse = this;
control.addEventListener(
'mousemove',
function onMouseMove(event) {
mouse.moveMouse(event);
},
false // we'll specify false for the 'useCapture' parameter for now...
);
control.addEventListener(
'mousedown',
function onMouseDown(event) {
mouse.clickMouse(event.button, true);
},
false // we'll specify false for the 'useCapture' parameter for now...
);
control.addEventListener(
'mouseup',
function onMouseUp(event) {
mouse.clickMouse(event.button, false);
},
false // we'll specify false for the 'useCapture' parameter for now...
);
/*
* None of these tricks seemed to work for IE10, so I'm giving up hiding the browser's mouse pointer in IE for now.
*
* control['style']['cursor'] = "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjbQg61aAAAADUlEQVQYV2P4//8/IwAI/QL/+TZZdwAAAABJRU5ErkJggg=='), url('/versions/images/current/blank.cur'), none";
*
* Setting the cursor style to "none" may not be a standard, but it works in Safari, Firefox and Chrome, so that's pretty
* good for a non-standard!
*
* TODO: The reference to '/versions/images/current/blank.cur' is also problematic for anyone who might want
* to run this app from a different server, so think about that as well.
*/
control['style']['cursor'] = "none";
return true;
}
return false;
};
/**
* releaseMouse(control)
*
* TODO: Use removeEventListener() to clean up our handlers; since I'm currently using anonymous functions,
* and since I'm not seeing any compelling reason to remove the handlers once they've been established, it's
* less code to leave them in place.
*
* @this {Mouse}
* @param {Object} control from the HTML DOM
* @return {boolean} true if event handlers were actually released, false if not
*/
Mouse.prototype.releaseMouse = function(control)
{
if (control) {
control['style']['cursor'] = "auto";
}
return false;
};
/**
* moveMouse(event)
*
* MouseEvent objects contain, among other things, the following properties:
*
* clientX
* clientY
*
* I've selected the above properties because they're widely supported, not because I need
* client-area coordinates. In fact, layerX and layerY are probably closer to what I really want,
* but I don't think they're available in all browsers. screenX and screenY would work as well.
*
* This is because all we care about are deltas. We record clientX and clientY (as xMouse and yMouse)
* merely to calculate xDelta and yDelta.
*
* @this {Mouse}
* @param {Object} event object from a 'mousemove' event (specifically, a MouseEvent object)
*/
Mouse.prototype.moveMouse = function(event)
{
if (this.isActive()) {
if (this.xMouse < 0 || this.yMouse < 0) {
this.xMouse = event.clientX;
this.yMouse = event.clientY;
}
if (this.fLocked) {
this.xDelta = event['movementX'] || event['mozMovementX'] || event['webkitMovementX'] || 0;
this.yDelta = event['movementY'] || event['mozMovementY'] || event['webkitMovementY'] || 0;
} else {
this.xDelta = event.clientX - this.xMouse;
this.yDelta = event.clientY - this.yMouse;
}
if (this.xDelta || this.yDelta) {
/*
* As sendPacket() indicates, any x and y coordinates we supply are for diagnostic purposes only.
* sendPacket() only cares about the xDelta and yDelta properties, which it then zeroes on completion.
*/
this.sendPacket(null, event.clientX, event.clientY);
}
this.xMouse = event.clientX;
this.yMouse = event.clientY;
}
};
/**
* clickMouse(iButton, fDown)
*
* @this {Mouse}
* @param {number} iButton is 0 for fButton1 (the LEFT button), 2 for fButton2 (the RIGHT button)
* @param {boolean} fDown
*/
Mouse.prototype.clickMouse = function(iButton, fDown)
{
if (this.isActive()) {
if (this.fLocked === false) {
/*
* If there's no support for automatic pointer locking in the Video component, then notifyPointerActive()
* will return false, and we will set fLocked to null, ensuring that we never attempt this again.
*/
if (!this.aVideo.length || !this.aVideo[0].notifyPointerActive(true)) {
this.fLocked = null;
}
}
var sDiag = DEBUGGER? ("mouse button" + iButton + ' ' + (fDown? "dn" : "up")) : null;
switch (iButton) {
case 0:
if (this.fButton1 != fDown) {
this.fButton1 = fDown;
this.sendPacket(sDiag);
}
break;
case 2:
if (this.fButton2 != fDown) {
this.fButton2 = fDown;
this.sendPacket(sDiag);
}
break;
default:
break;
}
}
};
/**
* sendPacket(sDiag, xDiag, yDiag)
*
* If we're called, something changed.
*
* Let's review the 3-byte packet format:
*
* D7 D6 D5 D4 D3 D2 D1 D0
* Byte 1 X 1 LB RB Y7 Y6 X7 X6
* Byte 2 X 0 X5 X4 X3 X2 X1 X0
* Byte 3 X 0 Y5 Y4 Y3 Y2 Y1 Y0
*
* @this {Mouse}
* @param {string|null} [sDiag] diagnostic message
* @param {number} [xDiag] original x-coordinate (optional; for diagnostic use only)
* @param {number} [yDiag] original y-coordinate (optional; for diagnostic use only)
*/
Mouse.prototype.sendPacket = function(sDiag, xDiag, yDiag)
{
var b1 = 0x40 | (this.fButton1? 0x20 : 0) | (this.fButton2? 0x10 : 0) | ((this.yDelta & 0xC0) >> 4) | ((this.xDelta & 0xC0) >> 6);
var b2 = this.xDelta & 0x3F;
var b3 = this.yDelta & 0x3F;
if (this.messageEnabled(Messages.SERIAL)) {
this.printMessage((sDiag? (sDiag + ": ") : "") + (yDiag !== undefined? ("mouse (" + xDiag + "," + yDiag + "): ") : "") + "serial packet [" + str.toHexByte(b1) + "," + str.toHexByte(b2) + "," + str.toHexByte(b3) + "]", 0, true);
}
this.componentAdapter.sendRBR([b1, b2, b3]);
this.xDelta = this.yDelta = 0;
};
/**
* notifyMCR(bMCR)
*
* The SerialPort notifies us whenever SerialPort.MCR.DTR or SerialPort.MCR.RTS changes.
*
* During normal serial mouse operation, both RTS and DTR must be "positive".
*
* Setting RTS "negative" for 100ms resets the mouse. Toggling DTR requests an identification byte (ID_SERIAL).
*
* NOTES: The above 3rd-party information notwithstanding, I've observed that Windows v1.01 initially writes 0x01
* to the MCR (DTR on, RTS off), spins in a loop that reads the RBR (probably to avoid a bogus identification byte
* sitting in the RBR), and then writes 0x0B to the MCR (DTR on, RTS on). This last step is consistent with making
* the mouse "active", but it is NOT consistent with "toggling DTR", so I conclude that a reset is ALSO sufficient
* for sending the identification byte. Right or wrong, this gets the ball rolling for Windows v1.01.
*
* @this {Mouse}
* @param {number} bMCR
*/
Mouse.prototype.notifyMCR = function(bMCR)
{
var fActive = ((bMCR & (SerialPort.MCR.DTR | SerialPort.MCR.RTS)) == (SerialPort.MCR.DTR | SerialPort.MCR.RTS));
if (fActive) {
if (!this.fActive) {
var fIdentify = false;
if (!(this.bMCR & SerialPort.MCR.RTS)) {
this.reset();
this.printMessage("serial mouse reset");
fIdentify = true;
}
if (!(this.bMCR & SerialPort.MCR.DTR)) {
this.printMessage("serial mouse ID requested");
fIdentify = true;
}
if (fIdentify) {
/*
* HEADS UP: Everything I'd read about the (original) Microsoft Serial Mouse "reset" protocol says
* that the device sends a single byte (0x4D aka 'M'). It's not surprising to think that newer mice
* might send additional bytes, but you would think that newer mouse drivers (eg, MOUSE.COM v8.20)
* would always be able to deal with mice that sent only one byte.
*
* You would be wrong. On an INT 0x33 reset, the v8.20 driver looks for an 'M', then it waits for
* another byte (0x42 aka 'B'). If it doesn't receive a 'B', it will accept another 'M'. But if it
* receives something else (or nothing at all), it will spend a long time waiting for it, and then
* return an error.
*
* It's entirely possible that I've done something wrong and inadvertently "tricked" MOUSE.COM into
* using the wrong detection logic. But given the other problems I've seen in MOUSE.COM v8.20, including
* its failure to properly terminate-and-stay-resident when its initial INT 0x33 reset returns an error,
* I'm not in the mood to give it the benefit of the doubt.
*
* So, anyway, I solve the terminate-and-stay-resident bug in MOUSE.COM v8.20 by feeding it *two* ID_SERIAL
* bytes on a reset. This doesn't seem to adversely affect serial mouse emulation for Windows 1.01, so
* I'm calling this good enough for now.
*/
this.componentAdapter.sendRBR([Mouse.ID_SERIAL, Mouse.ID_SERIAL]);
this.printMessage("serial mouse ID sent");
}
this.captureAll();
this.setActive(fActive);
}
} else {
if (this.fActive) {
/*
* Although this would seem nice (ie, for the Windows v1.01 mouse driver to turn RTS off when its mouse
* driver shuts down and Windows exits, since it DID turn RTS on), that doesn't appear to actually happen.
* At the very least, Windows will have (re)masked the serial port's IRQ, so what does it matter? Not much,
* I just would have preferred that fActive properly reflect whether we should continue dispatching mouse
* events, displaying MOUSE messages, etc.
*
* We could ask the ChipSet component to notify the SerialPort component whenever its IRQ is masked/unmasked,
* and then have the SerialPort pass that notification on to us, but I'm assuming that in the real world,
* a mouse device that's still powered may still send event data to the serial port, and if there was software
* polling the serial port, it might expect to see that data. Unlikely, but not impossible.
*/
this.printMessage("serial mouse inactive");
this.releaseAll();
this.setActive(fActive);
}
}
this.bMCR = bMCR;
};
/**
* Mouse.init()
*
* This function operates on every HTML element of class "mouse", extracting the
* JSON-encoded parameters for the Mouse constructor from the element's "data-value"
* attribute, invoking the constructor to create a Mouse component, and then binding
* any associated HTML controls to the new component.
*/
Mouse.init = function()
{
var aeMouse = Component.getElementsByClass(window.document, PCJSCLASS, "mouse");
for (var iMouse = 0; iMouse < aeMouse.length; iMouse++) {
var eMouse = aeMouse[iMouse];
var parmsMouse = Component.getComponentParms(eMouse);
var mouse = new Mouse(parmsMouse);
Component.bindComponentControls(mouse, eMouse, PCJSCLASS);
}
};
/*
* Initialize every Mouse module on the page.
*/
web.onInit(Mouse.init);
if (typeof module !== 'undefined') module.exports = Mouse;
/** * @fileoverview Compile-time definitions for Debugger-less configurations. * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> * @version 1.0 * Created 2014-May-08 * * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org> * * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines) * at <http://jsmachines.net/> and <http://pcjs.org/>. * * PCjs is free software: you can redistribute it and/or modify it under the terms of the * GNU General Public License as published by the Free Software Foundation, either version 3 * of the License, or (at your option) any later version. * * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with PCjs. If not, * see <http://www.gnu.org/licenses/gpl.html>. * * You are required to include the above copyright notice in every source code file of every * copy or modified version of this work, and to display that copyright notice on every screen * that loads or runs any version of this software (see Computer.sCopyright). * * Some PCjs files also attempt to load external resource files, such as character-image files, * ROM files, and disk image files. Those external resource files are not considered part of the * PCjs program for purposes of the GNU General Public License, and the author does not claim * any copyright as to their contents. */ "use strict"; /* * WARNING: DEBUGGER needs to accurately reflect whether or not the Debugger component is (or will be) loaded. * In the compiled case, we rely on the Closure Compiler to override DEBUGGER as appropriate. When it's *false*, * nearly all of debugger.js will be conditionally removed by the compiler, reducing it to little more than a * "type skeleton", which also solves some type-related warnings we would otherwise have if we tried to remove * debugger.js from the compilation process altogether. * * However, when we're in "development mode" and running uncompiled code in debugger-less configurations, * I would still like to skip loading debugger.js altogether. To do that, we must arrange for this additional file, * nodebugger.js, to be loaded as early as possible, which explicitly UPDATES the value of DEBUGGER to false. */ var DEBUGGER = false;
/**
* @fileoverview Implements the PCjs Panel component.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-Jun-19
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
if (typeof module !== 'undefined') {
var str = require("../../shared/lib/strlib");
var usr = require("../../shared/lib/usrlib");
var web = require("../../shared/lib/weblib");
var Component = require("../../shared/lib/component");
var Bus = require("./bus");
var Memory = require("./memory");
var X86 = require("./x86");
}
/**
* Panel(parmsPanel)
*
* The Panel component has no required (parmsPanel) properties.
*
* @constructor
* @extends Component
* @param {Object} parmsPanel
*/
function Panel(parmsPanel)
{
Component.call(this, "Panel", parmsPanel, Panel);
this.canvas = null;
this.lockMouse = -1;
this.fMouseDown = false;
this.xMouse = this.yMouse = -1;
if (BACKTRACK) {
this.busInfo = null;
this.fBackTrack = false;
}
}
Component.subclass(Panel);
/*
* The "Live" canvases that we create internally have the following fixed dimensions, to make drawing
* simpler. We then render, via drawImage(), these canvases onto the supplied canvas, which will automatically
* stretch the live images to fit.
*/
Panel.LIVECANVAS = {
CX: 1280,
CY: 720,
FONT: {
CY: 18,
FACE: "Monaco, Lucida Console, Courier New"
}
};
Panel.LIVEMEM = {
CX: (Panel.LIVECANVAS.CX * 3) >> 2,
CY: (Panel.LIVECANVAS.CY)
};
Panel.LIVEREGS = {
CX: (Panel.LIVECANVAS.CX - Panel.LIVEMEM.CX),
CY: (Panel.LIVECANVAS.CY),
COLOR: "black"
};
Panel.LIVEDUMP = {
CX: (Panel.LIVECANVAS.CX - Panel.LIVEMEM.CX),
CY: (Panel.LIVECANVAS.CY >> 1)
};
/*
* findRegions() records block numbers in bits 0-14, a BackTrack "mod" bit in bit 15, and the block type at bit 16.
*/
Panel.REGION = {
MASK: 0x7fff,
BTMOD_SHIFT: 15,
TYPE_SHIFT: 16
};
/**
* Color(r, g, b, a)
*
* @constructor
* @param {number} [r]
* @param {number} [g]
* @param {number} [b]
* @param {number} [a]
*/
function Color(r, g, b, a)
{
this.rgb = [r, g, b, a];
this.sValue = null;
if (r === undefined) this.randomize();
}
/**
* getRandom(nLimit)
*
* @this {Color}
* @param {number} [nLimit]
*/
Color.prototype.getRandom = function(nLimit)
{
return (Math.random() * (nLimit || 0x100)) | 0;
};
/**
* randomize()
*
* @this {Color}
*/
Color.prototype.randomize = function()
{
this.rgb[0] = this.getRandom(); this.rgb[1] = this.getRandom(); this.rgb[2] = this.getRandom(); this.rgb[3] = 0xff;
this.sValue = null;
};
/**
* toString()
*
* @this {Color}
* @return {string}
*/
Color.prototype.toString = function()
{
if (!this.sValue) this.sValue = '#' + str.toHex(this.rgb[0], 2) + str.toHex(this.rgb[1], 2) + str.toHex(this.rgb[2], 2);
return this.sValue;
};
/**
* Rectangle(x, y, cx, cy)
*
* @constructor
* @param {number} x
* @param {number} y
* @param {number} cx
* @param {number} cy
*/
function Rectangle(x, y, cx, cy)
{
this.x = x;
this.y = y;
this.cx = cx;
this.cy = cy;
}
/**
* contains(x, y)
*
* @param {number} x
* @param {number} y
* @return {boolean} true if (x,y) lies within the rectangle, false if not
*/
Rectangle.prototype.contains = function(x, y)
{
return (x >= this.x && x < this.x + this.cx && y >= this.y && y < this.y + this.cy);
};
/**
* subDivide(units, unitsTotal, fHorizontal)
*
* Return a new rectangle that is a subset of the current rectangle, based on the ratio of
* units to unitsTotal, and then update the dimensions of the current rectangle. Whether the
* original rectangle is divided horizontally or vertically is entirely arbitrary; currently,
* the criteria is horizontal if the ratio is 1/4 or more, vertical otherwise.
*
* @this {Rectangle}
* @param {number} units
* @param {number} unitsTotal
* @param {boolean} [fHorizontal]
* @return {Rectangle}
*/
Rectangle.prototype.subDivide = function(units, unitsTotal, fHorizontal)
{
var rect;
if (fHorizontal === undefined) {
fHorizontal = units >= (unitsTotal >> 2);
}
if (fHorizontal) {
rect = new Rectangle(this.x, this.y, this.cx, ((this.cy * units) / unitsTotal) | 0);
this.y += rect.cy;
this.cy -= rect.cy;
Component.assert(this.cy >= 0);
} else {
rect = new Rectangle(this.x, this.y, ((this.cx * units) / unitsTotal) | 0, this.cy);
this.x += rect.cx;
this.cx -= rect.cx;
Component.assert(this.cx >= 0);
}
return rect;
};
/**
* drawWith(context, color)
*
* @param {Object} context
* @param {Color|string} [color]
*/
Rectangle.prototype.drawWith = function(context, color)
{
if (!color) color = new Color();
context.strokeStyle = "black";
context.strokeRect(this.x, this.y, this.cx, this.cy);
context.fillStyle = (typeof color == "string"? color : color.toString());
context.fillRect(this.x, this.y, this.cx, this.cy);
};
/**
* setBinding(sHTMLType, sBinding, control)
*
* Most panel layouts don't have bindings of their own, so we pass along all binding requests to the
* Computer, CPU, Keyboard and Debugger components first. The order shouldn't matter, since any component
* that doesn't recognize the specified binding should simply ignore it.
*
* @this {Panel}
* @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
* @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "reset")
* @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
* @return {boolean} true if binding was successful, false if unrecognized binding request
*/
Panel.prototype.setBinding = function(sHTMLType, sBinding, control)
{
if (this.cmp && this.cmp.setBinding(sHTMLType, sBinding, control)) return true;
if (this.cpu && this.cpu.setBinding(sHTMLType, sBinding, control)) return true;
if (this.kbd && this.kbd.setBinding(sHTMLType, sBinding, control)) return true;
if (DEBUGGER && this.dbg && this.dbg.setBinding(sHTMLType, sBinding, control)) return true;
if (!this.canvas && sHTMLType == "canvas") {
var panel = this;
var fPanel = false;
if (BACKTRACK && sBinding == "btpanel") {
this.fBackTrack = fPanel = true;
}
if (fPanel) {
this.canvas = control;
this.context = this.canvas.getContext("2d");
/*
* Employ the same gross onresize() hack for IE9/IE10 that we had to use for the Video canvas
*/
if (web.getUserAgent().indexOf("MSIE") >= 0) {
this.canvas.onresize = function(canvas, cx, cy) {
return function onResizeVideo() {
canvas.style.height = (((canvas.clientWidth * cy) / cx) | 0) + "px";
};
}(this.canvas, this.canvas.width, this.canvas.height);
this.canvas.onresize();
}
this.xMem = this.yMem = 0;
this.cxMem = ((this.canvas.width * Panel.LIVEMEM.CX) / Panel.LIVECANVAS.CX) | 0;
this.cyMem = this.canvas.height;
this.xReg = this.cxMem;
this.yReg = 0;
this.cxReg = this.canvas.width - this.cxMem;
this.cyReg = this.canvas.height;
this.xDump = this.xReg;
this.yDump = ((this.canvas.height * (Panel.LIVEREGS.CY - Panel.LIVEDUMP.CY)) / Panel.LIVECANVAS.CY) | 0;
this.cxDump = this.cxReg;
this.cyDump = ((this.canvas.height * Panel.LIVEDUMP.CY) / Panel.LIVECANVAS.CY) | 0;
this.canvasLiveMem = window.document.createElement("canvas");
this.canvasLiveMem.width = Panel.LIVEMEM.CX;
this.canvasLiveMem.height = Panel.LIVEMEM.CY;
this.contextLiveMem = this.canvasLiveMem.getContext("2d");
this.imageLiveMem = this.contextLiveMem.createImageData(this.canvasLiveMem.width, this.canvasLiveMem.height);
this.canvasLiveRegs = window.document.createElement("canvas");
this.canvasLiveRegs.width = Panel.LIVEREGS.CX;
this.canvasLiveRegs.height = Panel.LIVEREGS.CY;
this.contextLiveRegs = this.canvasLiveRegs.getContext("2d");
this.canvas.addEventListener(
'mousemove',
function onMouseMove(event) {
panel.moveMouse(event);
},
false // we'll specify false for the 'useCapture' parameter for now...
);
this.canvas.addEventListener(
'mousedown',
function onMouseDown(event) {
panel.clickMouse(event, true);
},
false // we'll specify false for the 'useCapture' parameter for now...
);
this.canvas.addEventListener(
'mouseup',
function onMouseUp(event) {
panel.clickMouse(event, false);
},
false // we'll specify false for the 'useCapture' parameter for now...
);
this.fRedraw = true;
return true;
}
}
return this.parent.setBinding.call(this, sHTMLType, sBinding, control);
};
/**
* initBus(cmp, bus, cpu, dbg)
*
* @this {Panel}
* @param {Computer} cmp
* @param {Bus} bus
* @param {X86CPU} cpu
* @param {Debugger} dbg
*/
Panel.prototype.initBus = function(cmp, bus, cpu, dbg)
{
this.cmp = cmp;
this.bus = bus;
this.cpu = cpu;
this.dbg = dbg;
this.kbd = cmp.getComponentByType("Keyboard");
};
/**
* powerUp(data, fRepower)
*
* @this {Panel}
* @param {Object|null} data
* @param {boolean} [fRepower]
* @return {boolean} true if successful, false if failure
*/
Panel.prototype.powerUp = function(data, fRepower)
{
if (!fRepower) Panel.init();
return true;
};
/**
* powerDown(fSave, fShutdown)
*
* @this {Panel}
* @param {boolean} fSave
* @param {boolean} [fShutdown]
* @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
*/
Panel.prototype.powerDown = function(fSave, fShutdown)
{
return true;
};
/**
* clickMouse(event, fDown)
*
* @this {Panel}
* @param {Object} event object from a 'mousedown' or 'mouseup' event
* @param {boolean} fDown
*/
Panel.prototype.clickMouse = function(event, fDown)
{
/*
* event.button is 0 for the LEFT button and 2 for the RIGHT button
*/
if (!event.button) {
this.lockMouse = fDown? 0 : -1;
this.fMouseDown = fDown;
this.updateMouse(event, fDown);
}
};
/**
* moveMouse(event)
*
* @this {Panel}
* @param {Object} event object from a 'mousemove' event
*/
Panel.prototype.moveMouse = function(event)
{
this.updateMouse(event);
};
/**
* updateMouse(event, fDown)
*
* MouseEvent objects contain, among other things, the following properties:
*
* clientX
* clientY
*
* I've selected the above properties because they're widely supported, not because I need
* client-area coordinates. In fact, layerX and layerY are probably closer to what I really want,
* but I don't think they're available in all browsers. screenX and screenY would work as well.
*
* @this {Panel}
* @param {Object} event object from a mouse event (specifically, a MouseEvent object)
* @param {boolean} [fDown] is true or false if this was a click event, otherwise it's just a move event
*/
Panel.prototype.updateMouse = function(event, fDown)
{
/*
* Due to the responsive nature of our pages, the displayed size of the canvas may be smaller than the
* allocated size, and the coordinates we receive from mouse events are based on the currently displayed size.
*/
var xScale = Panel.LIVECANVAS.CX / this.canvas.offsetWidth;
var yScale = Panel.LIVECANVAS.CY / this.canvas.offsetHeight;
var rect = this.canvas.getBoundingClientRect();
var x = ((event.clientX - rect.left) * xScale) | 0;
var y = ((event.clientY - rect.top) * yScale) | 0;
if (fDown == null) {
if (!this.lockMouse) {
this.lockMouse = Math.abs(this.xMouse - x) > Math.abs(this.yMouse - y)? 1 : 2;
}
if (this.lockMouse == 1) {
y = this.yMouse;
} else if (this.lockMouse == 2) {
x = this.xMouse;
}
}
this.xMouse = x;
this.yMouse = y;
if (MAXDEBUG) this.log("Panel.moveMouse(" + x + "," + y + ")");
if (x >= 0 && x < Panel.LIVECANVAS.CX && y >= 0 && y < Panel.LIVECANVAS.CY) {
/*
* Convert the mouse position into the corresponding memory address, assuming it's over the live memory area
*/
var addr = this.findAddress(x, y);
if (addr !== X86.ADDR_INVALID) {
addr &= ~0xf;
if (addr != this.addrDumpLast) {
this.dumpMemory(addr, true);
this.addrDumpLast = addr;
}
}
}
};
/**
* findAddress(x, y)
*
* @this {Panel}
* @param {number} x
* @param {number} y
* @return {number} address corresponding to (x,y) canvas coordinates, or ADDR_INVALID if none
*/
Panel.prototype.findAddress = function(x, y)
{
if (x < Panel.LIVEMEM.CX && this.busInfo && this.busInfo.aRects) {
var i, rect;
for (i = 0; i < this.busInfo.aRects.length; i++) {
rect = this.busInfo.aRects[i];
if (rect.contains(x, y)) {
x -= rect.x;
y -= rect.y;
var region = this.busInfo.aRegions[i];
var iBlock = usr.getBitField(Bus.BlockInfo.num, this.busInfo.aBlocks[region.iBlock]);
var addr = iBlock * this.bus.nBlockSize;
var addrLimit = (iBlock + region.cBlocks) * this.bus.nBlockSize - 1;
/*
* If you want memory to be arranged "vertically" instead of "horizontally", do this:
*
* if (x > 0) addr += rect.cy * (x - 1) * this.ratioMemoryToPixels;
* addr += (y * this.ratioMemoryToPixels);
*/
if (y > 0) addr += rect.cx * (y - 1) * this.ratioMemoryToPixels;
addr += (x * this.ratioMemoryToPixels);
addr |= 0;
if (addr > addrLimit) addr = addrLimit;
if (MAXDEBUG) this.log("Panel.findAddress(" + x + "," + y + ") found type " + Memory.TYPE.NAMES[region.type] + ", address %" + str.toHex(addr));
return addr;
}
}
}
return X86.ADDR_INVALID;
};
/**
* updateAnimation()
*
* If the given Control Panel contains a canvas requiring animation (eg, "btpanel"), then this is where that happens.
*
* @this {Panel}
*/
Panel.prototype.updateAnimation = function()
{
if (this.fRedraw) {
this.initPen(10, Panel.LIVECANVAS.FONT.CY, this.canvasLiveMem, this.contextLiveMem, this.canvas.style.color);
if (this.fBackTrack) {
if (DEBUG) this.log("begin scanMemory()");
this.busInfo = this.bus.scanMemory(this.busInfo);
/*
* Calculate the pixel-to-memory-address ratio
*/
this.ratioMemoryToPixels = (this.busInfo.cBlocks * this.bus.nBlockSize) / (Panel.LIVEMEM.CX * Panel.LIVEMEM.CY);
/*
* Update the BusInfo object with region information (cRegions and aRegions); return true if region
* information has changed since the last call.
*/
if (this.findRegions()) {
/*
* For each region, I choose a slice of the LiveMem canvas and record the corresponding rectangle
* within an aRects array (parallel to the aRegions array) in the BusInfo object.
*
* I don't need a sophisticated Treemap algorithm, because at this level, the data is not hierarchical.
* subDivide() makes a simple horizontal or vertical slicing decision based on the ratio of region blocks
* to remaining blocks.
*/
var i, rect;
var rectAvail = new Rectangle(0, 0, this.canvasLiveMem.width, this.canvasLiveMem.height);
this.busInfo.aRects = [];
var cBlocksRemaining = this.busInfo.cBlocks;
for (i = 0; i < this.busInfo.cRegions; i++) {
var cBlocksRegion = this.busInfo.aRegions[i].cBlocks;
this.busInfo.aRects.push(rect = rectAvail.subDivide(cBlocksRegion, cBlocksRemaining, !i));
if (MAXDEBUG) this.log("region " + i + " rectangle: (" + rect.x + "," + rect.y + " " + rect.cx + "," + rect.cy + ")");
cBlocksRemaining -= cBlocksRegion;
}
/*
* Assert that not only did all the specified regions account for all the specified blocks, but also that
* the series of subDivide() calls exhausted the original rectangle to one of either zero width or zero height.
*/
this.assert(!cBlocksRemaining && (!rectAvail.cx || !rectAvail.cy));
/*
* Now draw all the rectangles produced by the series of subDivide() calls.
*/
for (i = 0; i < this.busInfo.aRects.length; i++) {
var region = this.busInfo.aRegions[i];
rect = this.busInfo.aRects[i];
rect.drawWith(this.contextLiveMem, Memory.TYPE.COLORS[region.type]);
this.centerPen(rect);
this.centerText(Memory.TYPE.NAMES[region.type] + " (" + (((region.cBlocks * this.bus.nBlockSize) / 1024) | 0) + "Kb)");
}
}
if (DEBUG) this.log("end scanMemory(): total bytes: " + this.busInfo.cbTotal + ", total blocks: " + this.busInfo.cBlocks + ", total regions: " + this.busInfo.cRegions);
} else {
this.drawText("This space intentionally left blank");
}
this.context.drawImage(this.canvasLiveMem, 0, 0, this.canvasLiveMem.width, this.canvasLiveMem.height, this.xMem, this.yMem, this.cxMem, this.cyMem);
this.fRedraw = false;
}
};
/**
* updateStatus()
*
* Update function for Control Panels containing DOM elements with low-frequencyxt display requirements.
*
* For the time being, the X86CPU component has its own updateStatus() handler, and displays all CPU registers itself.
*
* @this {Panel}
*/
Panel.prototype.updateStatus = function()
{
if (this.canvas) {
this.dumpRegisters();
}
};
/**
* findRegions()
*
* This takes the BusInfo object produced by scanMemory() and adds the following:
*
* cRegions: number of contiguous memory regions
* aRegions: array of aBlocks [index, count, type] objects
*
* It calls addRegion() for each discrete region (set of contiguous blocks with the same type) that it finds.
*
* @this {Panel}
* @return {boolean} true if current region checksum differed from previous checksum (ie, one or more regions changed)
*/
Panel.prototype.findRegions = function()
{
var checksum = 0;
this.busInfo.cRegions = 0;
if (!this.busInfo.aRegions) this.busInfo.aRegions = [];
var typeRegion = -1, iBlockRegion = 0, addrRegion = 0, nBlockPrev = -1;
for (var iBlock = 0; iBlock < this.busInfo.cBlocks; iBlock++) {
var blockInfo = this.busInfo.aBlocks[iBlock];
var typeBlock = usr.getBitField(Bus.BlockInfo.type, blockInfo);
var nBlockCurr = usr.getBitField(Bus.BlockInfo.num, blockInfo);
if (typeBlock != typeRegion || nBlockCurr != nBlockPrev + 1) {
var cBlocks = iBlock - iBlockRegion;
if (cBlocks) {
checksum += this.addRegion(addrRegion, iBlockRegion, cBlocks, typeRegion);
}
typeRegion = typeBlock;
iBlockRegion = iBlock;
addrRegion = nBlockCurr << this.bus.nBlockShift;
}
nBlockPrev = nBlockCurr;
}
checksum += this.addRegion(addrRegion, iBlockRegion, iBlock - iBlockRegion, typeRegion);
var fChanged = (this.busInfo.checksumRegions != checksum);
this.busInfo.checksumRegions = checksum;
return fChanged;
};
/**
* Region object definition
*
* iBlock: starting block number
* cBlocks: number of blocks spanned by region
* type: type of all blocks in the region (see Memory.TYPE.*)
*
* @typedef {{
* iBlock: number,
* cBlocks: number,
* type: number
* }}
*/
var Region;
/**
* addRegion(addr, iBlock, cBlocks, type)
*
* @this {Panel}
* @param {number} addr
* @param {number} iBlock
* @param {number} cBlocks
* @param {number} type
* @return {number} bitfield containing the above values (used for checksum)
*/
Panel.prototype.addRegion = function(addr, iBlock, cBlocks, type)
{
if (DEBUG) this.log("region " + this.busInfo.cRegions + " (addr " + str.toHexLong(addr) + ", type " + Memory.TYPE.NAMES[type] + ") contains " + cBlocks + " blocks");
this.busInfo.aRegions[this.busInfo.cRegions++] = {iBlock: iBlock, cBlocks: cBlocks, type: type};
return usr.initBitFields(Bus.BlockInfo, iBlock, cBlocks, 0, type);
};
/**
* dumpRegisters()
*
* Updates the live register portion of the panel.
*
* @this {Panel}
*/
Panel.prototype.dumpRegisters = function()
{
if (this.context && this.canvasLiveRegs && this.contextLiveRegs) {
var x = 0, y = 0, cx = this.canvasLiveRegs.width, cy = this.canvasLiveRegs.height;
this.contextLiveRegs.fillStyle = Panel.LIVEREGS.COLOR;
this.contextLiveRegs.fillRect(x, y, cx, cy);
this.initPen(x + 10, y + Panel.LIVECANVAS.FONT.CY, this.canvasLiveRegs, this.contextLiveRegs, this.canvas.style.color);
this.initCols(3);
this.drawText("CPU");
this.drawText("Target");
this.drawText("Current");
this.skipLines();
this.drawText(this.cpu.model);
this.drawText(this.cpu.getSpeedTarget());
this.drawText(this.cpu.getSpeedCurrent());
this.skipLines(2);
this.initCols(8);
this.initNumberFormat(16, this.cpu.model < X86.MODEL_80386? 4 : 8);
this.drawText("AX", this.cpu.regEAX, 2);
this.drawText("DS", this.cpu.getDS(), 0, 1);
this.drawText("DX", this.cpu.regEDX, 2);
this.drawText("SI", this.cpu.regESI, 0, 1.5);
this.drawText("BX", this.cpu.regEBX, 2);
this.drawText("ES", this.cpu.getES(), 0, 1);
this.drawText("CX", this.cpu.regECX, 2);
this.drawText("DI", this.cpu.regEDI, 0, 1.5);
this.drawText("CS", this.cpu.getCS(), 2);
this.drawText("SS", this.cpu.getSS(), 0, 1);
this.drawText("IP", this.cpu.getIP(), 2);
this.drawText("SP", this.cpu.getSP(), 0, 1.5);
var regPS;
this.drawText("PS", regPS = this.cpu.getPS(), 2);
this.drawText("BP", this.cpu.regEBP, 0, 1.5);
if (this.cpu.model >= X86.MODEL_80386) {
this.drawText("FS", this.cpu.getFS(), 2);
this.drawText("CR0", this.cpu.regCR0, 0, 1);
this.drawText("GS", this.cpu.getGS(), 2);
this.drawText("CR3", this.cpu.regCR3, 0, 1.5);
}
this.initCols(9);
this.drawText("V" + ((regPS & X86.PS.OF)? 1 : 0));
this.drawText("D" + ((regPS & X86.PS.DF)? 1 : 0));
this.drawText("I" + ((regPS & X86.PS.IF)? 1 : 0));
this.drawText("T" + ((regPS & X86.PS.TF)? 1 : 0));
this.drawText("S" + ((regPS & X86.PS.SF)? 1 : 0));
this.drawText("Z" + ((regPS & X86.PS.ZF)? 1 : 0));
this.drawText("A" + ((regPS & X86.PS.AF)? 1 : 0));
this.drawText("P" + ((regPS & X86.PS.PF)? 1 : 0));
this.drawText("C" + ((regPS & X86.PS.CF)? 1 : 0), 0, 2);
this.dumpMemory(this.addrDumpLast);
this.context.drawImage(this.canvasLiveRegs, x, y, cx, cy, this.xReg, this.yReg, this.cxReg, this.cyReg);
}
};
/**
* dumpMemory(addr, fDraw)
*
* @this {Panel}
* @param {number} addr
* @param {boolean} [fDraw]
*/
Panel.prototype.dumpMemory = function(addr, fDraw)
{
if (this.context && this.canvasLiveRegs && this.contextLiveRegs) {
var x = 0, y = Panel.LIVEREGS.CY - Panel.LIVEDUMP.CY, cx = this.canvasLiveRegs.width, cy = Panel.LIVEDUMP.CY;
this.contextLiveRegs.fillStyle = Panel.LIVEREGS.COLOR;
this.contextLiveRegs.fillRect(x, y, cx, cy);
this.initPen(x + 10, y + Panel.LIVECANVAS.FONT.CY, this.canvasLiveRegs, this.contextLiveRegs, this.canvas.style.color);
this.initCols(24);
if (addr == null) {
this.drawText("Mouse over memory to dump");
} else {
this.drawText(str.toHexLong(addr), null, 0, 1);
for (var iLine = 1; iLine <= 16; iLine++) {
var sChars = "";
for (var iCol = 1; iCol <= 8; iCol++) {
var b = this.bus.getByteDirect(addr++);
this.drawText(str.toHex(b, 2), null, 1);
sChars += (b >= 32 && b < 128? String.fromCharCode(b) : ".");
}
this.drawText(sChars, null, 0, 1);
}
}
if (fDraw) this.context.drawImage(this.canvasLiveRegs, x, y, cx, cy, this.xDump, this.yDump, this.cxDump, this.cyDump);
}
};
/**
* initPen(xLeft, yTop, canvas, context, sColor, cyFont, sFontFace)
*
* @this {Panel}
* @param {number} xLeft
* @param {number} yTop
* @param {HTMLCanvasElement} [canvas]
* @param {Object} [context]
* @param {string} [sColor]
* @param {number} [cyFont]
* @param {string} [sFontFace]
*/
Panel.prototype.initPen = function(xLeft, yTop, canvas, context, sColor, cyFont, sFontFace)
{
this.setPen(this.xLeftMargin = xLeft, yTop);
this.heightText = this.heightDefault = cyFont || Panel.LIVECANVAS.FONT.CY;
if (!sFontFace) sFontFace = this.fontDefault || (this.heightDefault + "px " + Panel.LIVECANVAS.FONT.FACE);
this.fontText = this.fontDefault = sFontFace;
if (canvas) {
this.canvasText = canvas;
}
if (context) {
this.contextText = context;
this.colorText = sColor || "white";
}
};
/**
* setPen(x, y)
*
* @this {Panel}
* @param {number} x
* @param {number} y
*/
Panel.prototype.setPen = function(x, y)
{
this.xText = x;
this.yText = y;
};
/**
* centerPen(rect)
*
* @this {Panel}
* @param {Rectangle} rect
*/
Panel.prototype.centerPen = function(rect)
{
this.fontText = this.fontDefault;
this.heightText = this.heightDefault;
var x = rect.x + (rect.cx >> 1);
var y = rect.y + (rect.cy >> 1);
var maxText = rect.cy;
if (rect.cx < rect.cy) {
maxText = rect.cx;
this.fVerticalText = true;
this.contextText.save();
this.contextText.translate(x, y);
this.contextText.rotate(-Math.PI/2);
x = y = 0;
}
if (maxText < this.heightText) {
this.heightText = maxText;
this.fontText = this.heightText + "px " + Panel.LIVECANVAS.FONT.FACE;
}
this.setPen(x, y);
};
/**
* initCols(nCols)
*
* @this {Panel}
* @param {number} nCols
*/
Panel.prototype.initCols = function(nCols)
{
this.cxColumn = (this.canvasText.width / nCols) | 0;
};
/**
* skipCols(nCols)
*
* @this {Panel}
* @param {number} nCols
*/
Panel.prototype.skipCols = function(nCols)
{
this.xText += this.cxColumn * nCols;
};
/**
* skipLines(nLines)
*
* @this {Panel}
* @param {number} [nLines]
*/
Panel.prototype.skipLines = function(nLines)
{
this.xText = this.xLeftMargin;
this.yText += (this.heightText + 2) * (nLines || 1);
};
/**
* initNumberFormat(nBase, nDigits)
*
* @this {Panel}
* @param {number} nBase
* @param {number} nDigits
*/
Panel.prototype.initNumberFormat = function(nBase, nDigits)
{
this.nDefaultBase = nBase;
this.nDefaultDigits = nDigits;
};
/**
* drawText(sText)
*
* @this {Panel}
* @param {string} sText
* @param {number|null} [nValue]
* @param {number} [nColsSkip]
* @param {number} [nLinesSkip]
*/
Panel.prototype.drawText = function(sText, nValue, nColsSkip, nLinesSkip)
{
this.contextText.font = this.fontText;
this.contextText.fillStyle = this.colorText;
this.contextText.fillText(sText, this.xText, this.yText);
this.xText += this.cxColumn;
if (nValue != null) {
var sValue;
if (this.nDefaultBase != 16) {
sValue = nValue.toString();
} else {
sValue = this.nDefaultDigits < 8? "0x" : "";
sValue += str.toHex(nValue, this.nDefaultDigits);
}
this.contextText.fillText(sValue, this.xText, this.yText);
this.xText += this.cxColumn;
}
if (nColsSkip) this.skipCols(nColsSkip);
if (nLinesSkip) this.skipLines(nLinesSkip);
};
/**
* centerText(sText)
*
* To center text within a given Rectangle:
*
* centerPen(rect)
* centerText(sText)
*
* centerPen() sets xLeft and yTop to the center of the specified rectangle, and centerText() calculates
* the width of the text, adjusting the horizontal centering by its width and the vertical centering by the
* default font height. Then it calls drawText().
*
* @this {Panel}
* @param {string} sText
*/
Panel.prototype.centerText = function(sText)
{
this.contextText.font = this.fontText;
var tm = this.contextText.measureText(sText);
this.xText -= tm.width >> 1;
this.yText += (this.heightText >> 1) - 2;
this.drawText(sText);
if (this.fVerticalText) {
this.contextText.restore();
this.fVerticalText = false;
}
};
/**
* Panel.init()
*
* This function operates on every HTML element of class "panel", extracting the
* JSON-encoded parameters for the Panel constructor from the element's "data-value"
* attribute, invoking the constructor to create a Panel component, and then binding
* any associated HTML controls to the new component.
*
* NOTE: Unlike most other component init() functions, this one is designed to be
* called multiple times: once at load time, so that we can binding our print()
* function to the panel's output control ASAP, and again when the Computer component
* is verifying that all components are ready and invoking their powerUp() functions.
*
* Our powerUp() method gives us a second opportunity to notify any components that
* that might care (eg, CPU, Keyboard, and Debugger) that we have some controls they
* might want to use.
*/
Panel.init = function()
{
var fReady = false;
var aePanels = Component.getElementsByClass(window.document, PCJSCLASS, "panel");
for (var iPanel=0; iPanel < aePanels.length; iPanel++) {
var ePanel = aePanels[iPanel];
var parmsPanel = Component.getComponentParms(ePanel);
var panel = Component.getComponentByID(parmsPanel['id']);
if (!panel) {
fReady = true;
panel = new Panel(parmsPanel);
}
Component.bindComponentControls(panel, ePanel, PCJSCLASS);
if (fReady) panel.setReady();
}
};
/*
* Initialize every Panel module on the page.
*/
web.onInit(Panel.init);
if (typeof module !== 'undefined') module.exports = Panel;
/**
* @fileoverview Implements the PCjs RAM component.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-Jun-15
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
if (typeof module !== 'undefined') {
var str = require("../../shared/lib/strlib");
var web = require("../../shared/lib/weblib");
var Component = require("../../shared/lib/component");
var Memory = require("./memory");
var ROM = require("./rom");
}
/**
* RAM(parmsRAM)
*
* The RAM component expects the following (parmsRAM) properties:
*
* addr: starting physical address of RAM
* size: amount of RAM, in bytes (optional)
*
* NOTE: We make a note of the specified size, but no memory is initially allocated
* for the RAM until the Computer component calls powerUp().
*
* @constructor
* @extends Component
* @param {Object} parmsRAM
*/
function RAM(parmsRAM)
{
Component.call(this, "RAM", parmsRAM, RAM);
this.addrRAM = parmsRAM['addr'];
this.sizeRAM = parmsRAM['size'];
this.fTestRAM = parmsRAM['test'];
this.fInstalled = (!!this.sizeRAM); // 0 is the default value for 'size' when none is specified
this.fAllocated = false;
}
Component.subclass(RAM);
/**
* initBus(cmp, bus, cpu, dbg)
*
* @this {RAM}
* @param {Computer} cmp
* @param {Bus} bus
* @param {X86CPU} cpu
* @param {Debugger} dbg
*/
RAM.prototype.initBus = function(cmp, bus, cpu, dbg)
{
this.bus = bus;
this.cpu = cpu;
this.dbg = dbg;
this.chipset = cmp.getComponentByType("ChipSet");
this.setReady();
};
/**
* powerUp(data, fRepower)
*
* @this {RAM}
* @param {Object|null} data
* @param {boolean} [fRepower]
* @return {boolean} true if successful, false if failure
*/
RAM.prototype.powerUp = function(data, fRepower)
{
if (!fRepower) {
/*
* The Computer powers up the CPU last, at which point the X86 state is restored,
* which includes the Bus state, and since we use the Bus to allocate all our memory,
* memory contents are already restored for us, so we don't need the usual restore
* logic. We just need to call reset(), to allocate memory for the RAM.
*
if (!data || !this.restore) {
this.reset();
} else {
if (!this.restore(data)) return false;
}
*/
this.reset();
}
return true;
};
/**
* powerDown(fSave, fShutdown)
*
* @this {RAM}
* @param {boolean} fSave
* @param {boolean} [fShutdown]
* @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
*/
RAM.prototype.powerDown = function(fSave, fShutdown)
{
/*
* The Computer powers down the CPU first, at which point the X86 state is saved,
* which includes the Bus state, and since we use the Bus component to allocate all
* our memory, memory contents are already saved for us, so we don't need the usual
* save logic.
*
return fSave && this.save ? this.save() : true;
*/
return true;
};
/**
* reset()
*
* NOTE: When we were initialized, we were given an amount of INSTALLED memory (see sizeRAM above).
* The ChipSet component, on the other hand, tells us how much SPECIFIED memory there is -- which,
* like a real PC, may not match the amount of installed memory (due to either user error or perhaps
* an attempt to prevent some portion of the installed memory from being used).
*
* However, since we're a virtual machine, we can defer allocation of RAM until we're able to query the
* ChipSet component, and then allocate an amount of memory that matches the SPECIFIED memory, making
* it easy to reconfigure the machine on the fly and prevent mismatches.
*
* But, we do that ONLY for the RAM instance configured with an addrRAM of 0x0000, and ONLY if that RAM
* object was not given a specific size (see fInstalled). If there are other RAM objects in the system,
* they must necessarily specify a non-conflicting, non-zero start address, in which case their sizeRAM
* value will never be affected by the ChipSet settings.
*
* @this {RAM}
*/
RAM.prototype.reset = function()
{
if (!this.addrRAM && !this.fInstalled && this.chipset) {
var baseRAM = this.chipset.getSWMemorySize() * 1024;
if (this.sizeRAM && baseRAM != this.sizeRAM) {
this.bus.removeMemory(this.addrRAM, this.sizeRAM);
this.fAllocated = false;
}
this.sizeRAM = baseRAM;
}
if (!this.fAllocated && this.sizeRAM) {
if (this.bus.addMemory(this.addrRAM, this.sizeRAM, Memory.TYPE.RAM)) {
this.fAllocated = true;
this.status(Math.floor(this.sizeRAM / 1024) + "Kb allocated");
/*
* NOTE: I'm specifying MAXDEBUG for status() messages because I'm not yet sure I want these
* messages buried in the app, since they're seen only when a Control Panel is active. Another
* and perhaps better alternative is to add "comment" attributes to the XML configuration file
* for these components, which the Computer component will display as it "powers up" components.
*/
if (MAXDEBUG && this.fInstalled) this.status("specified size overrides SW1");
/*
* Memory with an ID of "ramCPQ" is reserved for built-in memory located just below the 16Mb
* boundary on Compaq DeskPro 386 machines.
*
* Technically, that memory is part of the first 1Mb of memory that also provides up to 640Kb
* of conventional memory (ie, memory below 1Mb).
*
* However, PCjs doesn't support individual memory allocations that (a) are discontiguous
* or (b) dynamically change location. Components must simulate those features by performing
* a separate allocation for each starting address, and removing/adding memory allocations
* whenever their starting address changes.
*
* Therefore, a DeskPro 386's first 1Mb of physical memory is allocated by PCjs in two pieces,
* and the second piece must have an ID of "ramCPQ", triggering the additional allocation of
* Compaq-specific memory-mapped registers.
*
* See CompaqController for more details.
*/
if (COMPAQ386) {
if (this.idComponent == "ramCPQ") {
this.controller = new CompaqController(this);
this.bus.addMemory(CompaqController.ADDR, 1, Memory.TYPE.CTRL, this.controller);
}
}
}
}
if (this.fAllocated) {
if (!this.fTestRAM) {
/*
* HACK: Set the word at 40:72 in the ROM BIOS Data Area (RBDA) to 0x1234 to bypass the ROM BIOS
* memory storage tests. See rom.js for all RBDA definitions.
*/
if (MAXDEBUG) this.status("ROM BIOS memory test has been disabled");
this.bus.setShortDirect(ROM.BIOS.RESET_FLAG, ROM.BIOS.RESET_FLAG_WARMBOOT);
}
/*
* Don't add the "ramCPQ" memory to the CMOS total, because addCMOSMemory() will add it to the extended
* memory total, which will just confuse the Compaq BIOS.
*/
if (!COMPAQ386 || this.idComponent != "ramCPQ") {
if (this.chipset) this.chipset.addCMOSMemory(this.addrRAM, this.sizeRAM);
}
} else {
Component.error("No RAM allocated");
}
};
/**
* RAM.init()
*
* This function operates on every HTML element of class "ram", extracting the
* JSON-encoded parameters for the RAM constructor from the element's "data-value"
* attribute, invoking the constructor to create a RAM component, and then binding
* any associated HTML controls to the new component.
*/
RAM.init = function()
{
var aeRAM = Component.getElementsByClass(window.document, PCJSCLASS, "ram");
for (var iRAM = 0; iRAM < aeRAM.length; iRAM++) {
var eRAM = aeRAM[iRAM];
var parmsRAM = Component.getComponentParms(eRAM);
var ram = new RAM(parmsRAM);
Component.bindComponentControls(ram, eRAM, PCJSCLASS);
}
};
/**
* CompaqController(ram)
*
* DeskPro 386 machines came with a minimum of 1Mb of RAM, which could be configured (via jumpers)
* for 256Kb, 512Kb or 640Kb of conventional memory, starting at address 0x00000000, with the
* remainder (768Kb, 512Kb, or 384Kb) accessible only at an address just below 0x01000000. In PCjs,
* this second chunk of RAM must be separately allocated, with an ID of "ramCPQ".
*
* The typical configuration was 640Kb of conventional memory, leaving 384Kb accessible at 0x00FA0000.
* Presumably, the other configurations (256Kb and 512Kb) would leave 768Kb and 512Kb accessible at
* 0x00F40000 and 0x00F80000, respectively.
*
* The DeskPro 386 also contained two memory-mapped registers at 0x80C00000. The first is a write-only
* mapping register that provides the ability to map the 128Kb at 0x00FE0000 to 0x000E0000, replacing
* any ROMs in the range 0x000E0000-0x000FFFFF, and optionally write-protecting that 128Kb; internally,
* this register corresponds to wMappings.
*
* The second register is a read-only diagnostics register that indicates jumper configuration and
* parity errors; internally, this register corresponds to wSettings.
*
* To emulate the memory-mapped registers at 0x80C00000, the RAM component allocates a block at that
* address using this custom controller once it sees an allocation for "ramCPQ".
*
* Later, when the addressibility of "ramCPQ" memory is altered, we record the blocks in all the
* memory slots spanning 0x000E0000-0x000FFFFF, and then update those slots with the blocks from
* 0x00FE0000-0x00FFFFFF. Note that only the top 128Kb of "ramCPQ" addressibility is affected; the
* rest of that memory, ranging anywhere from 256Kb to 640Kb, remains addressible at its original
* location. Compaq's CEMM and VDISK utilities were generally the only software able to access that
* remaining memory (what Compaq refers to as "Compaq Built-in Memory").
*
* @constructor
* @param {RAM} ram
*/
function CompaqController(ram)
{
this.ram = ram;
this.wMappings = CompaqController.MAPPINGS.DEFAULT;
/*
* TODO: wSettings needs to reflect the actual amount of configured memory....
*/
this.wSettings = CompaqController.SETTINGS.DEFAULT;
this.wRAMSetup = CompaqController.RAMSETUP.DEFAULT;
this.aBlocksDst = null;
}
CompaqController.ADDR = 0x80C00000|0;
CompaqController.MAP_SRC = 0x00FE0000;
CompaqController.MAP_DST = 0x000E0000;
CompaqController.MAP_SIZE = 0x00020000;
/*
* Bit definitions for the 16-bit write-only memory-mapping register (wMappings)
*
* NOTE: Although Compaq says the memory at %FE0000 is "relocated", it actually remains addressable
* at %FE0000; it simply becomes addressable at %0E0000 as well, displacing any ROMs that used to be
* addressable at %0E0000 through %0FFFFF.
*/
CompaqController.MAPPINGS = {
UNMAPPED: 0x0001, // is this bit is CLEAR, the last 128Kb (at 0x00FE0000) is mapped to 0x000E0000
READWRITE: 0x0002, // if this bit is CLEAR, the last 128Kb (at 0x00FE0000) is read-only (ie, write-protected)
RESERVED: 0xFFFC, // the remaining 6 bits are reserved and should always be SET
DEFAULT: 0xFFFF // our default settings (no mapping, no write-protection)
};
/*
* Bit definitions for the 16-bit read-only settings/diagnostics register (wSettings)
*
* SW1-7 and SW1-8 are mapped to bits 5 and 4 of wSettings, respectively, as follows:
*
* SW1-7 SW1-8 Bit5 Bit4 Amount (of base memory provided by the Compaq 32-bit memory board)
* ----- ----- ---- ---- ------
* ON ON 0 0 640Kb
* ON OFF 0 1 Invalid
* OFF ON 1 0 512Kb
* OFF OFF 1 1 256Kb
*
* Other SW1 switches include:
*
* SW1-1: ON enables fail-safe timer
* SW1-2: ON indicates 80387 coprocessor installed
* SW1-3: ON sets memory from 0xC00000 to 0xFFFFFF (between 12 and 16 megabytes) non-cacheable
* SW1-4: ON selects AUTO system speed (OFF selects HIGH system speed)
* SW1-5: RESERVED (however, the system can read its state; see below)
* SW1-6: Compaq Dual-Mode Monitor or Color Monitor (OFF selects Monochrome monitor other than Compaq)
*
* While SW1-7 and SW1-8 are connected to this memory-mapped register, other SW1 DIP switches are accessible
* through the 8042 Keyboard Controller's KBC.INPORT register, as follows:
*
* SW1-1: TODO: Determine
* SW1-2: ChipSet.KBC.INPORT.COMPAQ_NO80387 clear if ON, set (0x04) if OFF
* SW1-3: TODO: Determine
* SW1-4: ChipSet.KBC.INPORT.COMPAQ_HISPEED clear if ON, set (0x10) if OFF
* SW1-5: ChipSet.KBC.INPORT.COMPAQ_DIP5OFF clear if ON, set (0x20) if OFF
* SW1-6: ChipSet.KBC.INPORT.COMPAQ_NONDUAL clear if ON, set (0x40) if OFF
*/
CompaqController.SETTINGS = {
B0_PARITY: 0x0001, // parity OK in byte 0
B1_PARITY: 0x0002, // parity OK in byte 1
B2_PARITY: 0x0004, // parity OK in byte 2
B3_PARITY: 0x0008, // parity OK in byte 3
BASE_640KB: 0x0000, // SW1-7,8: ON ON Bits 5,4: 00
BASE_ERROR: 0x0010, // SW1-7,8: ON OFF Bits 5,4: 01
BASE_512KB: 0x0020, // SW1-7,8: OFF ON Bits 5,4: 10
BASE_256KB: 0x0030, // SW1-7,8: OFF OFF Bits 5,4: 11
/*
* TODO: The DeskPro 386/25 TechRef says bit 6 (0x40) is always set,
* but setting it results in memory configuration errors; review.
*/
ADDED_1MB: 0x0040,
/*
* TODO: The DeskPro 386/25 TechRef says bit 7 (0x80) is always clear; review.
*/
PIGGYBACK: 0x0080,
SYS_4MB: 0x0100, // 4Mb on system board
SYS_1MB: 0x0200, // 1Mb on system board
SYS_NONE: 0x0300, // no memory on system board
MODA_4MB: 0x0400, // 4Mb on module A board
MODA_1MB: 0x0800, // 1Mb on module A board
MODA_NONE: 0x0C00, // no memory on module A board
MODB_4MB: 0x1000, // 4Mb on module B board
MODB_1MB: 0x2000, // 1Mb on module B board
MODB_NONE: 0x3000, // no memory on module B board
MODC_4MB: 0x4000, // 4Mb on module C board
MODC_1MB: 0x8000, // 1Mb on module C board
MODC_NONE: 0xC000, // no memory on module C board
/*
* NOTE: It doesn't seem to matter to the ROM whether I set any of bits 8-15 or not....
*/
DEFAULT: 0x0A0F // our default settings (ie, parity OK, 640Kb base memory, 1Mb system memory, 1Mb module A memory)
};
CompaqController.RAMSETUP = {
SETUP: 0x000F,
CACHE: 0x0040,
RESERVED: 0xFFB0,
DEFAULT: 0x0002 // our default settings (ie, 2Mb, cache disabled)
};
/**
* readByte(off, addr)
*
* @this {Memory}
* @param {number} off (relative to 0x80C00000)
* @param {number} [addr]
* @return {number}
*/
CompaqController.readByte = function readCompaqControllerByte(off, addr)
{
var b = 0xff;
if (off < 0x02) {
b = (off & 0x1)? (this.controller.wSettings >> 8) : (this.controller.wSettings & 0xff);
}
else if (off < 0x4) {
b = (off & 0x1)? (this.controller.wRAMSetup >> 8) : (this.controller.wRAMSetup & 0xff);
}
if (DEBUG) {
this.controller.ram.printMessage("CompaqController.readByte(" + str.toHexWord(off) + ") returned " + str.toHexByte(b), true, true);
if (MAXDEBUG && DEBUGGER && off >= 0x2) this.dbg.stopCPU();
}
return b;
};
/**
* writeByte(off, b, addr)
*
* @this {Memory}
* @param {number} off (relative to 0x80C00000)
* @param {number} b
* @param {number} [addr]
*/
CompaqController.writeByte = function writeCompaqControllerByte(off, b, addr)
{
var controller = this.controller;
/*
* Check for write to 0x80C00000
*/
if (!off) {
if (b != (controller.wMappings & 0xff)) {
var bus = controller.ram.bus;
if (!(b & CompaqController.MAPPINGS.UNMAPPED)) {
if (!controller.aBlocksDst) {
controller.aBlocksDst = bus.getMemoryBlocks(CompaqController.MAP_DST, CompaqController.MAP_SIZE);
}
/*
* You might think that the next three lines could ALSO be moved to the preceding IF,
* but it's possible for the write-protection feature to be enabled/disabled separately
* from the mapping feature. We could avoid executing this code as well by checking the
* current read-write state, but this is an infrequent operation, so there's no point.
*/
var aBlocks = bus.getMemoryBlocks(CompaqController.MAP_SRC, CompaqController.MAP_SIZE);
var type = (b & CompaqController.MAPPINGS.READWRITE)? Memory.TYPE.RAM : Memory.TYPE.ROM;
bus.setMemoryBlocks(CompaqController.MAP_DST, CompaqController.MAP_SIZE, aBlocks, type);
}
else {
if (controller.aBlocksDst) {
bus.setMemoryBlocks(CompaqController.MAP_DST, CompaqController.MAP_SIZE, controller.aBlocksDst);
controller.aBlocksDst = null;
}
}
controller.wMappings = (controller.wMappings & ~0xff) | b;
if (MAXDEBUG && DEBUGGER) this.dbg.stopCPU();
}
}
/*
* Check for write to 0x80C00002
*/
else if (off == 0x2) {
controller.wRAMSetup = (controller.wRAMSetup & ~0xff) | b;
if (MAXDEBUG && DEBUGGER) this.dbg.stopCPU();
}
/*
* All bits in 0x80C00001 and 0x80C00003 are reserved, so we can simply ignore those writes.
*/
if (DEBUG) {
this.controller.ram.printMessage("CompaqController.writeByte(" + str.toHexWord(off) + "," + str.toHexByte(b) + ")", true, true);
}
};
CompaqController.BUFFER = [null, 0];
CompaqController.ACCESS = [CompaqController.readByte, null, null, CompaqController.writeByte, null, null];
/**
* getMemoryBuffer(addr)
*
* @this {CompaqController}
* @param {number} addr
* @return {Array} containing the buffer (and an offset within that buffer)
*/
CompaqController.prototype.getMemoryBuffer = function(addr)
{
return CompaqController.BUFFER;
};
/**
* getMemoryAccess()
*
* @this {CompaqController}
* @return {Array.<function()>}
*/
CompaqController.prototype.getMemoryAccess = function()
{
return CompaqController.ACCESS;
};
/*
* Initialize all the RAM modules on the page.
*/
web.onInit(RAM.init);
if (typeof module !== 'undefined') module.exports = RAM;
/**
* @fileoverview Implements the PCjs ROM component.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-Jun-15
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
if (typeof module !== 'undefined') {
var str = require("../../shared/lib/strlib");
var web = require("../../shared/lib/weblib");
var DumpAPI = require("../../shared/lib/dumpapi");
var Component = require("../../shared/lib/component");
var Memory = require("./memory");
}
/**
* ROM(parmsROM)
*
* The ROM component expects the following (parmsROM) properties:
*
* addr: physical address of ROM
* size: amount of ROM, in bytes
* alias: physical alias address (null if none)
* file: name of ROM data file
* notify: ID of a component to notify once the ROM is in place (optional)
*
* NOTE: The ROM data will not be copied into place until the Bus is ready (see initBus()) AND the
* ROM data file has finished loading (see onLoadROM()).
*
* Also, while the size parameter may seem redundant, I consider it useful to confirm that the ROM you received
* is the ROM you expected.
*
* @constructor
* @extends Component
* @param {Object} parmsROM
*/
function ROM(parmsROM)
{
Component.call(this, "ROM", parmsROM, ROM);
this.abROM = null;
this.addrROM = parmsROM['addr'];
this.sizeROM = parmsROM['size'];
/*
* The new 'alias' property can now be EITHER a single physical address (like 'addr') OR an array of
* physical addresses; eg:
*
* [0xf0000,0xffff0000,0xffff8000]
*
* We could have overloaded 'addr' to accomplish the same thing, but I think it's better to have any
* aliased locations listed under a separate property.
*
* Most ROMs are not aliased, in which case the 'alias' property should have the default value of null.
*/
this.addrAlias = parmsROM['alias'];
this.sFilePath = parmsROM['file'];
this.sFileName = str.getBaseName(this.sFilePath);
/*
* The 'notify' property can now (as of v1.18.2) contain an array of parameters that the notified
* component (typically Video) may use as it sees fit. For example, the Video component is generally
* interested in knowing the offsets of specific font tables within the ROM, which used to be hard-coded
* when all we supported were a few specific IBM video cards, but that's no longer feasible as we move
* beyond the original handful of IBM cards.
*
* It's up to the notified component to decide how to interpret the parameters it receives, if any.
*/
this.idNotify = parmsROM['notify'];
this.aNotifyParms = null;
if (this.idNotify) {
var i = this.idNotify.indexOf('[');
if (i > 0) {
try {
this.aNotifyParms = eval(this.idNotify.substr(i));
} catch (e) {}
this.idNotify = this.idNotify.substr(0, i);
}
}
if (this.sFilePath) {
var sFileURL = this.sFilePath;
if (DEBUG) this.log('load("' + sFileURL + '")');
/*
* If the selected ROM file has a ".json" extension, then we assume it's pre-converted
* JSON-encoded ROM data, so we load it as-is; ditto for ROM files with a ".hex" extension.
* Otherwise, we ask our server-side ROM converter to return the file in a JSON-compatible format.
*/
var sFileExt = str.getExtension(this.sFileName);
if (sFileExt != DumpAPI.FORMAT.JSON && sFileExt != DumpAPI.FORMAT.HEX) {
sFileURL = web.getHost() + DumpAPI.ENDPOINT + '?' + DumpAPI.QUERY.FILE + '=' + this.sFilePath + '&' + DumpAPI.QUERY.FORMAT + '=' + DumpAPI.FORMAT.BYTES + '&' + DumpAPI.QUERY.DECIMAL + '=true';
}
web.loadResource(sFileURL, true, null, this, ROM.prototype.onLoadROM);
}
}
Component.subclass(ROM);
/*
* ROM BIOS Data Area (RBDA) definitions, in physical address form, using the same ALL-CAPS names
* found in the original IBM PC ROM BIOS listing. TODO: Fill in remaining RBDA holes.
*/
ROM.BIOS = {
RS232_BASE: 0x400, // 4 (word) I/O addresses of RS-232 adapters
PRINTER_BASE: 0x408, // 4 (word) I/O addresses of printer adapters
EQUIP_FLAG: 0x410, // installed hardware (word)
MFG_TEST: 0x412, // initialization flag (byte)
MEMORY_SIZE: 0x413, // memory size in K-bytes (word)
RESET_FLAG: 0x472 // set to 0x1234 if keyboard reset underway (word)
};
// RESET_FLAG is the traditional end of the RBDA, as originally defined at real-mode segment 0x40.
ROM.BIOS.RESET_FLAG_WARMBOOT = 0x1234; // value stored at ROM.BIOS.RESET_FLAG to indicate a "warm boot", bypassing memory tests
/*
* NOTE: There's currently no need for this component to have a reset() function, since
* once the ROM data is loaded, it can't be changed, so there's nothing to reinitialize.
*
* OK, well, I take that back, because the Debugger, if installed, has the ability to modify
* ROM contents, so in that case, having a reset() function that restores the original ROM data
* might be useful; then again, it might not, depending on what you're trying to debug.
*
* If we do add reset(), then we'll want to change copyROM() to hang onto the original
* ROM data; currently, we release it after copying it into the read-only memory allocated
* via bus.addMemory().
*/
/**
* initBus(cmp, bus, cpu, dbg)
*
* @this {ROM}
* @param {Computer} cmp
* @param {Bus} bus
* @param {X86CPU} cpu
* @param {Debugger} dbg
*/
ROM.prototype.initBus = function(cmp, bus, cpu, dbg)
{
this.bus = bus;
this.cpu = cpu;
this.dbg = dbg;
this.copyROM();
};
/**
* powerUp(data, fRepower)
*
* @this {ROM}
* @param {Object|null} data
* @param {boolean} [fRepower]
* @return {boolean} true if successful, false if failure
*/
ROM.prototype.powerUp = function(data, fRepower)
{
if (this.aSymbols) {
if (this.dbg) {
this.dbg.addSymbols(this.addrROM, this.sizeROM, this.aSymbols);
}
/*
* Our only role in the handling of symbols is to hand them off to the Debugger at our
* first opportunity. Now that we've done that, our copy of the symbols, if any, are toast.
*/
delete this.aSymbols;
}
return true;
};
/**
* powerDown(fSave, fShutdown)
*
* Since we have nothing to do on powerDown(), and no state to return, we could simply omit
* this function. But it doesn't hurt anything, and maybe we'll use our state to save something
* useful down the road, like user-defined symbols (ie, symbols that the Debugger may have
* created, above and beyond those symbols we automatically loaded, if any, along with the ROM).
*
* @this {ROM}
* @param {boolean} fSave
* @param {boolean} [fShutdown]
* @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
*/
ROM.prototype.powerDown = function(fSave, fShutdown)
{
return true;
};
/**
* onLoadROM(sROMFile, sROMData, nErrorCode)
*
* @this {ROM}
* @param {string} sROMFile
* @param {string} sROMData
* @param {number} nErrorCode (response from server if anything other than 200)
*/
ROM.prototype.onLoadROM = function(sROMFile, sROMData, nErrorCode)
{
if (nErrorCode) {
this.notice("Unable to load system ROM (error " + nErrorCode + ")");
return;
}
if (sROMData.charAt(0) == "[" || sROMData.charAt(0) == "{") {
try {
/*
* The most likely source of any exception will be here: parsing the JSON-encoded ROM data.
*/
var rom = eval("(" + sROMData + ")");
var ab = rom['bytes'];
var adw = rom['data'];
if (ab) {
this.abROM = ab;
}
else if (adw) {
/*
* Convert all the DWORDs into BYTEs, so that subsequent code only has to deal with abROM.
*/
this.abROM = new Array(adw.length * 4);
for (var idw = 0, ib = 0; idw < adw.length; idw++) {
this.abROM[ib++] = adw[idw] & 0xff;
this.abROM[ib++] = (adw[idw] >> 8) & 0xff;
this.abROM[ib++] = (adw[idw] >> 16) & 0xff;
this.abROM[ib++] = (adw[idw] >> 24) & 0xff;
}
}
else {
this.abROM = rom;
}
this.aSymbols = rom['symbols'];
if (!this.abROM.length) {
Component.error("Empty ROM: " + sROMFile);
return;
}
else if (this.abROM.length == 1) {
Component.error(this.abROM[0]);
return;
}
} catch (e) {
this.notice("ROM data error: " + e.message);
return;
}
}
else {
/*
* Parse the ROM data manually; we assume it's in "simplified" hex form (a series of hex byte-values
* separated by whitespace).
*/
var sHexData = sROMData.replace(/\n/gm, " ").replace(/ +$/, "");
var asHexData = sHexData.split(" ");
this.abROM = new Array(asHexData.length);
for (var i = 0; i < asHexData.length; i++) {
this.abROM[i] = str.parseInt(asHexData[i], 16);
}
}
this.copyROM();
};
/**
* copyROM()
*
* This function is called by both initBus() and onLoadROM(), but it cannot copy the the ROM data into place
* until after initBus() has received the Bus component AND onloadROM() has received the abROM data. When both
* those criteria are satisfied, the component becomes "ready".
*
* @this {ROM}
*/
ROM.prototype.copyROM = function()
{
if (!this.isReady()) {
if (!this.sFilePath) {
this.setReady();
}
else if (this.abROM && this.bus) {
if (this.abROM.length != this.sizeROM) {
/*
* Note that setError() sets the component's fError flag, which in turn prevents setReady() from
* marking the component ready. TODO: Revisit this decision. On the one hand, it sounds like a
* good idea to stop the machine in its tracks whenever a setError() occurs, but there may also be
* times when we'd like to forge ahead anyway.
*/
this.setError("ROM size (" + str.toHexLong(this.abROM.length) + ") does not match specified size (" + str.toHexLong(this.sizeROM) + ")");
}
else if (this.addROM(this.addrROM)) {
var aliases = [];
if (typeof this.addrAlias == "number") {
aliases.push(this.addrAlias);
} else if (this.addrAlias != null && this.addrAlias.length) {
aliases = this.addrAlias;
}
for (var i = 0; i < aliases.length; i++) {
this.cloneROM(aliases[i]);
}
/*
* If there's a component we should notify, notify it now, and give it the internal byte array, so that
* it doesn't have to ask the CPU for the data. Currently, the only component that uses this notification
* option is the Video component, and only when the associated ROM contains font data that it needs.
*/
if (this.idNotify) {
var component = Component.getComponentByID(this.idNotify, this.id);
if (component) {
component.onROMLoad(this.abROM, this.aNotifyParms);
} else {
this.notice("Unable to find component: " + this.idNotify);
}
}
/*
* We used to hang onto the original ROM data so that we could restore any bytes the CPU overwrote,
* using memory write-notification handlers, but with the introduction of read-only memory blocks, that's
* no longer necessary.
*
* TODO: Consider an option to retain the ROM data, and give the user some way of restoring ROMs.
* That may be useful for "resumable" machines that save/restore all dirty block of memory, regardless
* whether they're ROM or RAM. However, the only way to modify a machine's ROM is with the Debugger,
* and Debugger users should know better.
*/
delete this.abROM;
}
this.setReady();
}
}
};
/**
* addROM(addr)
*
* @this {ROM}
* @param {number} addr
* @return {boolean}
*/
ROM.prototype.addROM = function(addr)
{
if (this.bus.addMemory(addr, this.sizeROM, Memory.TYPE.ROM)) {
if (DEBUG) this.log("addROM(): copying ROM to " + str.toHexLong(addr) + " (" + str.toHexLong(this.abROM.length) + " bytes)");
var bto = null;
for (var off = 0; off < this.abROM.length; off++) {
this.bus.setByteDirect(addr + off, this.abROM[off]);
if (BACKTRACK) {
bto = this.bus.addBackTrackObject(this, bto, off);
this.bus.writeBackTrackObject(addr + off, bto, off);
}
}
return true;
}
/*
* We don't need to report an error here, because addMemory() already takes care of that.
*/
return false;
};
/**
* cloneROM(addr)
*
* For ROMs with one or more alias addresses, we used to call addROM() for each address. However,
* that obviously wasted memory, since each alias was an independent copy, and if you used the
* Debugger to edit the ROM in one location, the changes would not appear in the other location(s).
*
* Now that the Bus component provides low-level getMemoryBlocks() and setMemoryBlocks() methods
* to manually get and set the blocks of any memory range, it is now possible to create true aliases.
*
* @this {ROM}
* @param {number} addr
*/
ROM.prototype.cloneROM = function(addr)
{
var aBlocks = this.bus.getMemoryBlocks(this.addrROM, this.sizeROM);
this.bus.setMemoryBlocks(addr, this.sizeROM, aBlocks);
};
/**
* ROM.init()
*
* This function operates on every HTML element of class "rom", extracting the
* JSON-encoded parameters for the ROM constructor from the element's "data-value"
* attribute, invoking the constructor to create a ROM component, and then binding
* any associated HTML controls to the new component.
*/
ROM.init = function()
{
var aeROM = Component.getElementsByClass(window.document, PCJSCLASS, "rom");
for (var iROM = 0; iROM < aeROM.length; iROM++) {
var eROM = aeROM[iROM];
var parmsROM = Component.getComponentParms(eROM);
var rom = new ROM(parmsROM);
Component.bindComponentControls(rom, eROM, PCJSCLASS);
}
};
/*
* Initialize all the ROM modules on the page.
*/
web.onInit(ROM.init);
if (typeof module !== 'undefined') module.exports = ROM;
/**
* @fileoverview Implements the PCjs SerialPort component.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-Jul-01
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
if (typeof module !== 'undefined') {
var web = require("../../shared/lib/weblib");
var Component = require("../../shared/lib/component");
var Messages = require("./messages");
var ChipSet = require("./chipset");
var State = require("./state");
}
/**
* SerialPort(parmsSerial)
*
* The SerialPort component has the following component-specific (parmsSerial) properties:
*
* adapter: 1 (for port 0x3F8) or 2 (for port 0x2F8); 0 if not defined
*
* WARNING: Since the XSL file defines 'adapter' as a number, not a string, there's no need to
* use parseInt(), and as an added benefit, we don't need to worry about whether a hex or decimal
* format was used.
*
* This hard-coded approach mimics the original IBM PC Asynchronous Adapter configuration, which
* contained a pair of "shunt modules" that allowed the user to select a port address of either
* 0x3F8 ("Primary") or 0x2F8 ("Secondary").
*
* DOS typically names the Primary adapter "COM1" and the Secondary adapter "COM2", but I prefer
* to stick to adapter numbers, since not all operating systems follow those naming conventions.
*
* @constructor
* @extends Component
* @param {Object} parmsSerial
*/
function SerialPort(parmsSerial) {
this.iAdapter = parmsSerial['adapter'];
switch (this.iAdapter) {
case 1:
this.portBase = 0x3F8;
this.nIRQ = ChipSet.IRQ.COM1;
break;
case 2:
this.portBase = 0x2F8;
this.nIRQ = ChipSet.IRQ.COM2;
break;
default:
Component.warning("Unrecognized serial adapter #" + this.iAdapter);
return;
}
/**
* controlIOBuffer is a DOM element, if any, bound to the port (currently for output purposes only; see echoByte())
*
* @type {Object}
*/
this.controlIOBuffer = null;
Component.call(this, "SerialPort", parmsSerial, SerialPort, Messages.SERIAL);
Component.bindExternalControl(this, parmsSerial['binding'], SerialPort.sIOBuffer);
}
/*
* class SerialPort
* property {number} iAdapter
* property {number} portBase
* property {number} nIRQ
* property {Object} controlIOBuffer is a DOM element, if any, bound to the port (for rudimentary output; see echoByte())
*
* NOTE: This class declaration started as a way of informing the code inspector of the controlIOBuffer property,
* which remained undefined until a setBinding() call set it later, but I've since decided that explicitly
* initializing such properties in the constructor is a better way to go -- even though it's more code -- because
* JavaScript compilers are supposed to be happier when the underlying object structures aren't constantly changing.
*
* Besides, I'm not sure I want to get into documenting every property this way, for this or any/every other class,
* let alone getting into which ones should be considered private or protected, because PCjs isn't really a library
* for third-party apps.
*/
Component.subclass(SerialPort);
/*
* Internal name used for the I/O buffer control, if any, that we bind to the SerialPort.
*
* Alternatively, if SerialPort wants to use another component's control (eg, the Panel's
* "print" control), it can specify the name of that control with the 'binding' property.
*
* For that binding to succeed, we also need to know the target component; for now, that's
* been hard-coded to "Panel", in part because that's one of the few components we can rely
* upon initializing before we do, but it would be a simple matter to include a component type
* or ID as part of the 'binding' property as well, if we need more flexibility later.
*/
SerialPort.sIOBuffer = "buffer";
/*
* 8250 I/O register offsets (add these to a I/O base address to obtain an I/O port address)
*
* NOTE: DLL.REG and DLM.REG form a 16-bit divisor into a clock input frequency of 1.8432Mhz. The following
* values should be used for the corresponding baud rates. Rates above 9600 are discouraged by the IBM Tech Ref,
* but rates as high as 128000 are listed on the NS8250A data sheet.
*
* Divisor Rate Percent Error
* 0x0900 50
* 0x0600 75
* 0x0417 110 0.026%
* 0x0359 134.5 0.058%
* 0x0300 150
* 0x0180 300
* 0x00C0 600
* 0x0060 1200
* 0x0040 1800
* 0x003A 2000 0.69%
* 0x0030 2400
* 0x0020 3600
* 0x0018 4800
* 0x0010 7200
* 0x000C 9600
* 0x0006 19200
* 0x0003 38400
* 0x0002 56000 2.86%
* 0x0001 128000
*/
SerialPort.DLL = {REG: 0}; // Divisor Latch LSB (only when SerialPort.LCR.DLAB is set)
SerialPort.THR = {REG: 0}; // Transmitter Holding Register (write)
SerialPort.DL_DEFAULT = 0x180; // we select an arbitrary default Divisor Latch equivalent to 300 baud
/*
* The divisor is stored in wDL. If we take the frequency value 1843200 and divide it by wDL*128, we get the
* maximum number of bytes per second that the SerialPort interface should generate. For example, if a baud
* rate of 1200 is being used, the divisor will be 0x60 (96), so we calculate 1843200/(96*128) = 150, which means
* there should be a 1000ms/150 or 6.667ms delay between bytes delivered.
*
* TODO: Enforce that delay. However, the delay should be converted from real-world milliseconds to the
* appropriate number of CPU cycles we can pass to setBurstCycles(). This will also require the CPU to call
* us at the start of each burst, to see if advanceRBR() has more data to deliver. For now, I'm throttling
* SerialPort interrupts by passing a hard-coded delay to setIRR(). The setIRR() delay does not ensure any
* particular baud rate, it simply gives the underlying Interrupt Service Routine (ISR) some breathing room.
*
* The Microsoft Windows 1.01 serial mouse driver ISR issues an EOI before it has safely exited, relying solely
* on the fact that a 1200 baud serial device would not normally interrupt frequently enough to blow the stack.
* However, in PCjs, all you have to do is enable Debugger messages on every serial interrupt and mouse event,
* eg:
*
* m serial on;m pic on;m mouse on
*
* to slow the machine down to the point where serial mouse interrupts overwhelm the ISR. The Debugger messages
* display the current stack pointer, which you can watch drop to zero and then wrap around, no doubt trampling
* lots of code and data along the way.
*
* This problem can also occur without being forced by the Debugger; eg, whenever the physical machine's mouse is
* configured for a high interrupt rate.
*/
/*
* Receiver Buffer Register (RBR.REG, offset 0; eg, 0x3F8 or 0x2F8)
*/
SerialPort.RBR = {REG: 0}; // (read)
/*
* Interrupt Enable Register (IER.REG, offset 1; eg, 0x3F9 or 0x2F9)
*/
SerialPort.IER = {};
SerialPort.IER.REG = 1; // Interrupt Enable Register
SerialPort.IER.RBR_AVAIL = 0x01;
SerialPort.IER.THR_EMPTY = 0x02;
SerialPort.IER.LSR_DELTA = 0x04;
SerialPort.IER.MSR_DELTA = 0x08;
SerialPort.IER.UNUSED = 0xF0; // always zero
SerialPort.DLM = {REG: 1}; // Divisor Latch MSB (only when SerialPort.LCR.DLAB is set)
/*
* Interrupt ID Register (IIR.REG, offset 2; eg, 0x3FA or 0x2FA)
*
* All interrupt conditions cleared by reading the corresponding register (or, in the case of IRR_INT_THR, writing a new value to THR.REG)
*/
SerialPort.IIR = {};
SerialPort.IIR.REG = 2; // Interrupt ID Register (read-only)
SerialPort.IIR.NO_INT = 0x01;
SerialPort.IIR.INT_LSR = 0x06; // Line Status (highest priority: Overrun error, Parity error, Framing error, or Break Interrupt)
SerialPort.IIR.INT_RBR = 0x04; // Receiver Data Available
SerialPort.IIR.INT_THR = 0x02; // Transmitter Holding Register Empty
SerialPort.IIR.INT_MSR = 0x00; // Modem Status Register (lowest priority: Clear To Send, Data Set Ready, Ring Indicator, or Data Carrier Detect)
SerialPort.IIR.INT_BITS = 0x06;
SerialPort.IIR.UNUSED = 0xF8; // always zero (the ROM BIOS relies on these bits "floating to 1" when no SerialPort is present)
/*
* Line Control Register (LCR.REG, offset 3; eg, 0x3FB or 0x2FB)
*/
SerialPort.LCR = {};
SerialPort.LCR.REG = 3; // Line Control Register
SerialPort.LCR.DATA_5BITS = 0x00;
SerialPort.LCR.DATA_6BITS = 0x01;
SerialPort.LCR.DATA_7BITS = 0x02;
SerialPort.LCR.DATA_8BITS = 0x03;
SerialPort.LCR.STOP_BITS = 0x04; // clear: 1 stop bit; set: 1.5 stop bits for LCR_DATA_5BITS, 2 stop bits for all other data lengths
SerialPort.LCR.PARITY_BIT = 0x08; // if set, a parity bit is inserted/expected between the last data bit and the first stop bit; no parity bit if clear
SerialPort.LCR.PARITY_EVEN = 0x10; // if set, even parity is selected (ie, the parity bit insures an even number of set bits); if clear, odd parity
SerialPort.LCR.PARITY_STICK = 0x20; // if set, parity bit is transmitted inverted; if clear, parity bit is transmitted normally
SerialPort.LCR.BREAK = 0x40; // if set, serial output (SOUT) signal is forced to logical 0 for the duration
SerialPort.LCR.DLAB = 0x80; // Divisor Latch Access Bit; if set, DLL.REG and DLM.REG can be read or written
/*
* Modem Control Register (MCR.REG, offset 4; eg, 0x3FC or 0x2FC)
*/
SerialPort.MCR = {};
SerialPort.MCR.REG = 4; // Modem Control Register
SerialPort.MCR.DTR = 0x01; // when set, DTR goes high, indicating ready to establish link (looped back to DSR in loop-back mode)
SerialPort.MCR.RTS = 0x02; // when set, RTS goes high, indicating ready to exchange data (looped back to CTS in loop-back mode)
SerialPort.MCR.OUT1 = 0x04; // when set, OUT1 goes high (looped back to RI in loop-back mode)
SerialPort.MCR.OUT2 = 0x08; // when set, OUT2 goes high (looped back to RLSD in loop-back mode)
SerialPort.MCR.LOOPBACK = 0x10; // when set, enables loop-back mode
SerialPort.MCR.UNUSED = 0xE0; // always zero
/*
* Line Status Register (LSR.REG, offset 5; eg, 0x3FD or 0x2FD)
*
* NOTE: I've seen different specs for the LSR_TSRE. I'm following the IBM Tech Ref's lead here, but the data sheet I have calls it TEMT
* instead of TSRE, and claims that it is set whenever BOTH the THR and TSR are empty, and clear whenever EITHER the THR or TSR contain data.
*/
SerialPort.LSR = {};
SerialPort.LSR.REG = 5; // Line Status Register
SerialPort.LSR.DR = 0x01; // Data Ready (set when new data in RBR.REG; cleared when RBR.REG read)
SerialPort.LSR.OE = 0x02; // Overrun Error (set when new data arrives in RBR.REG before previous data read; cleared when LSR.REG read)
SerialPort.LSR.PE = 0x04; // Parity Error (set when new data has incorrect parity; cleared when LSR.REG read)
SerialPort.LSR.FE = 0x08; // Framing Error (set when new data has invalid stop bit; cleared when LSR.REG read)
SerialPort.LSR.BI = 0x10; // Break Interrupt (set when new data exceeded normal transmission time; cleared LSR.REG when read)
SerialPort.LSR.THRE = 0x20; // Transmitter Holding Register Empty (set when UART ready to accept new data; cleared when THR.REG written)
SerialPort.LSR.TSRE = 0x40; // Transmitter Shift Register Empty (set when the TSR is empty; cleared when the THR is transferred to the TSR)
SerialPort.LSR.UNUSED = 0x80; // always zero
/*
* Modem Status Register (MSR.REG, offset 6; eg, 0x3FE or 0x2FE)
*/
SerialPort.MSR = {};
SerialPort.MSR.REG = 6; // Modem Status Register
SerialPort.MSR.DCTS = 0x01; // when set, CTS (Clear To Send) has changed since last read
SerialPort.MSR.DDSR = 0x02; // when set, DSR (Data Set Ready) has changed since last read
SerialPort.MSR.TERI = 0x04; // when set, TERI (Trailing Edge Ring Indicator) indicates RI has changed from 1 to 0
SerialPort.MSR.DRLSD = 0x08; // when set, RLSD (Received Line Signal Detector) has changed
SerialPort.MSR.CTS = 0x10; // when set, the modem or data set is ready to exchange data (complement of the Clear To Send input signal)
SerialPort.MSR.DSR = 0x20; // when set, the modem or data set is ready to establish link (complement of the Data Set Ready input signal)
SerialPort.MSR.RI = 0x40; // complement of the RI (Ring Indicator) input
SerialPort.MSR.RLSD = 0x80; // complement of the RLSD (Received Line Signal Detect) input
/*
* Scratch Register (SCR.REG, offset 7; eg, 0x3FF or 0x2FF)
*/
SerialPort.SCR = {REG: 7};
/**
* attachMouse(id, mouse)
*
* @this {SerialPort}
* @param {string} id
* @param {Mouse} mouse component
* @return {Component} this or null, based on whether or not the specified ID matches
*/
SerialPort.prototype.attachMouse = function(id, mouse)
{
if (id == this.idComponent) {
this.mouse = mouse;
return this;
}
return null;
};
/**
* syncMouse()
*
* NOTE: This is probably obsolete, but the Mouse component still might discover a need for it. See Mouse.powerUp().
*
* @this {SerialPort}
*
SerialPort.prototype.syncMouse = function()
{
if (this.mouse) this.mouse.notifyMCR(this.bMCR);
};
*/
/**
* setBinding(sHTMLType, sBinding, control)
*
* @this {SerialPort}
* @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
* @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "buffer")
* @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
* @return {boolean} true if binding was successful, false if unrecognized binding request
*/
SerialPort.prototype.setBinding = function(sHTMLType, sBinding, control)
{
var serial = this;
switch (sBinding) {
case SerialPort.sIOBuffer:
this.bindings[sBinding] = this.controlIOBuffer = control;
/*
* By establishing an onkeypress handler here, we make it possible for DOS commands like
* "CTTY COM1" to more or less work (use "CTTY CON" to restore control to the DOS console).
*
* WARNING: This isn't really a supported feature yet; very much a work-in-progress.
*/
control.onkeydown = function onKeyDownSerial(event) {
/*
* This is required in addition to onkeypress, because it's the only way to prevent
* BACKSPACE from being interpreted by the browser as a "Back" operation.
*/
event = event || window.event;
var keyCode = event.keyCode;
if (keyCode === 8) {
if (event.preventDefault) event.preventDefault();
serial.sendRBR([keyCode]);
}
};
control.onkeypress = function onKeyPressSerial(event) {
/*
* Browser-independent keyCode extraction (refer to keyPress() and the other key
* event handlers in keyboard.js).
*/
event = event || window.event;
var keyCode = event.which || event.keyCode;
serial.sendRBR([keyCode]);
};
return true;
default:
break;
}
return false;
};
/**
* initBus(cmp, bus, cpu, dbg)
*
* @this {SerialPort}
* @param {Computer} cmp
* @param {Bus} bus
* @param {X86CPU} cpu
* @param {Debugger} dbg
*/
SerialPort.prototype.initBus = function(cmp, bus, cpu, dbg)
{
this.bus = bus;
this.cpu = cpu;
this.dbg = dbg;
this.chipset = cmp.getComponentByType("ChipSet");
bus.addPortInputTable(this, SerialPort.aPortInput, this.portBase);
bus.addPortOutputTable(this, SerialPort.aPortOutput, this.portBase);
this.setReady();
};
/**
* powerUp(data, fRepower)
*
* @this {SerialPort}
* @param {Object|null} data
* @param {boolean} [fRepower]
* @return {boolean} true if successful, false if failure
*/
SerialPort.prototype.powerUp = function(data, fRepower)
{
if (!fRepower) {
if (!data || !this.restore) {
this.reset();
} else {
if (!this.restore(data)) return false;
}
}
return true;
};
/**
* powerDown(fSave, fShutdown)
*
* @this {SerialPort}
* @param {boolean} fSave
* @param {boolean} [fShutdown]
* @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
*/
SerialPort.prototype.powerDown = function(fSave, fShutdown)
{
return fSave && this.save ? this.save() : true;
};
/**
* reset()
*
* @this {SerialPort}
*/
SerialPort.prototype.reset = function()
{
this.initState();
};
/**
* save()
*
* This implements save support for the SerialPort component.
*
* @this {SerialPort}
* @return {Object}
*/
SerialPort.prototype.save = function()
{
var state = new State(this);
state.set(0, this.saveRegisters());
return state.data();
};
/**
* restore(data)
*
* This implements restore support for the SerialPort component.
*
* @this {SerialPort}
* @param {Object} data
* @return {boolean} true if successful, false if failure
*/
SerialPort.prototype.restore = function(data)
{
return this.initState(data[0]);
};
/**
* initState(data)
*
* @this {SerialPort}
* @param {Array} [data]
* @return {boolean} true if successful, false if failure
*/
SerialPort.prototype.initState = function(data)
{
/*
* The NS8250A spec doesn't explicitly say what the RBR and THR are initialized to on a reset,
* but I think we can safely assume zeros. Similarly, we reset the baud rate Divisor Latch (wDL)
* to an arbitrary but consistent default (DL_DEFAULT).
*/
var i = 0;
if (data === undefined) {
data = [
0, // RBR
0, // THR
SerialPort.DL_DEFAULT, // DL
0, // IER
SerialPort.IIR.NO_INT, // IIR
0, // LCR
0, // MCR
SerialPort.LSR.THRE | SerialPort.LSR.TSRE, // LSR
SerialPort.MSR.CTS | SerialPort.MSR.DSR, // MSR (instead of the normal 0 default, we indicate a state of readiness -- to be revisited)
[]
];
}
this.bRBR = data[i++];
this.bTHR = data[i++];
this.wDL = data[i++];
this.bIER = data[i++];
this.bIIR = data[i++];
this.bLCR = data[i++];
this.bMCR = data[i++];
this.bLSR = data[i++];
this.bMSR = data[i++];
this.abReceive = data[i];
return true;
};
/**
* saveRegisters()
*
* @this {SerialPort}
* @return {Array}
*/
SerialPort.prototype.saveRegisters = function()
{
var i = 0;
var data = [];
data[i++] = this.bRBR;
data[i++] = this.bTHR;
data[i++] = this.wDL;
data[i++] = this.bIER;
data[i++] = this.bIIR;
data[i++] = this.bLCR;
data[i++] = this.bMCR;
data[i++] = this.bLSR;
data[i++] = this.bMSR;
data[i] = this.abReceive;
return data;
};
/**
* sendRBR(ab)
*
* @this {SerialPort}
* @param {Array} ab is an array of bytes to propagate to the bRBR (Receiver Buffer Register)
*/
SerialPort.prototype.sendRBR = function(ab)
{
this.abReceive = this.abReceive.concat(ab);
this.advanceRBR();
};
/**
* advanceRBR()
*
* @this {SerialPort}
*/
SerialPort.prototype.advanceRBR = function()
{
if (this.abReceive.length > 0 && !(this.bLSR & SerialPort.LSR.DR)) {
this.bRBR = this.abReceive.shift();
this.bLSR |= SerialPort.LSR.DR;
}
this.updateIRR();
};
/**
* inRBR(port, addrFrom)
*
* @this {SerialPort}
* @param {number} port (0x3F8 or 0x2F8)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
SerialPort.prototype.inRBR = function(port, addrFrom)
{
var b = ((this.bLCR & SerialPort.LCR.DLAB) ? (this.wDL & 0xff) : this.bRBR);
this.printMessageIO(port, null, addrFrom, (this.bLCR & SerialPort.LCR.DLAB) ? "DLL" : "RBR", b);
this.bLSR &= ~SerialPort.LSR.DR;
this.advanceRBR();
return b;
};
/**
* inIER(port, addrFrom)
*
* @this {SerialPort}
* @param {number} port (0x3F9 or 0x2F9)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
SerialPort.prototype.inIER = function(port, addrFrom)
{
var b = ((this.bLCR & SerialPort.LCR.DLAB) ? (this.wDL >> 8) : this.bIER);
this.printMessageIO(port, null, addrFrom, (this.bLCR & SerialPort.LCR.DLAB) ? "DLM" : "IER", b);
return b;
};
/**
* inIIR(port, addrFrom)
*
* @this {SerialPort}
* @param {number} port (0x3FA or 0x2FA)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
SerialPort.prototype.inIIR = function(port, addrFrom)
{
var b = this.bIIR;
this.printMessageIO(port, null, addrFrom, "IIR", b);
return b;
};
/**
* inLCR(port, addrFrom)
*
* @this {SerialPort}
* @param {number} port (0x3FB or 0x2FB)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
SerialPort.prototype.inLCR = function(port, addrFrom)
{
var b = this.bLCR;
this.printMessageIO(port, null, addrFrom, "LCR", b);
return b;
};
/**
* inMCR(port, addrFrom)
*
* @this {SerialPort}
* @param {number} port (0x3FC or 0x2FC)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
SerialPort.prototype.inMCR = function(port, addrFrom)
{
var b = this.bMCR;
this.printMessageIO(port, null, addrFrom, "MCR", b);
return b;
};
/**
* inLSR(port, addrFrom)
*
* @this {SerialPort}
* @param {number} port (0x3FD or 0x2FD)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
SerialPort.prototype.inLSR = function(port, addrFrom)
{
var b = this.bLSR;
this.printMessageIO(port, null, addrFrom, "LSR", b);
return b;
};
/**
* inMSR(port, addrFrom)
*
* @this {SerialPort}
* @param {number} port (0x3FE or 0x2FE)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number} simulated port value
*/
SerialPort.prototype.inMSR = function(port, addrFrom)
{
var b = this.bMSR;
this.printMessageIO(port, null, addrFrom, "MSR", b);
return b;
};
/**
* outTHR(port, bOut, addrFrom)
*
* @this {SerialPort}
* @param {number} port (0x3F8 or 0x2F8)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
*/
SerialPort.prototype.outTHR = function(port, bOut, addrFrom)
{
this.printMessageIO(port, bOut, addrFrom, (this.bLCR & SerialPort.LCR.DLAB) ? "DLL" : "THR");
if (this.bLCR & SerialPort.LCR.DLAB) {
this.wDL = (this.wDL & ~0xff) | bOut;
} else {
this.bTHR = bOut;
this.bLSR &= ~(SerialPort.LSR.THRE | SerialPort.LSR.TSRE);
if (this.echoByte(bOut)) {
this.bLSR |= (SerialPort.LSR.THRE | SerialPort.LSR.TSRE);
/*
* QUESTION: Does this mean we should also flush/zero bTHR?
*/
}
}
};
/**
* outIER(port, bOut, addrFrom)
*
* @this {SerialPort}
* @param {number} port (0x3F9 or 0x2F9)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
*/
SerialPort.prototype.outIER = function(port, bOut, addrFrom)
{
this.printMessageIO(port, bOut, addrFrom, (this.bLCR & SerialPort.LCR.DLAB) ? "DLM" : "IER");
if (this.bLCR & SerialPort.LCR.DLAB) {
this.wDL = (this.wDL & 0xff) | (bOut << 8);
} else {
this.bIER = bOut;
}
};
/**
* outLCR(port, bOut, addrFrom)
*
* @this {SerialPort}
* @param {number} port (0x3FB or 0x2FB)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
*/
SerialPort.prototype.outLCR = function(port, bOut, addrFrom)
{
this.printMessageIO(port, bOut, addrFrom, "LCR");
this.bLCR = bOut;
};
/**
* outMCR(port, bOut, addrFrom)
*
* @this {SerialPort}
* @param {number} port (0x3FC or 0x2FC)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
*/
SerialPort.prototype.outMCR = function(port, bOut, addrFrom)
{
var bPrev = this.bMCR;
this.printMessageIO(port, bOut, addrFrom, "MCR");
this.bMCR = bOut;
if (this.mouse && (bPrev ^ bOut) & (SerialPort.MCR.DTR | SerialPort.MCR.RTS)) {
this.mouse.notifyMCR(this.bMCR);
}
};
/**
* updateIRR()
*
* @this {SerialPort}
*/
SerialPort.prototype.updateIRR = function()
{
var bIIR = -1;
if ((this.bLSR & SerialPort.LSR.DR) && (this.bIER & SerialPort.IER.RBR_AVAIL)) {
bIIR = SerialPort.IIR.INT_RBR;
}
if (bIIR >= 0) {
this.bIIR &= ~(SerialPort.IIR.NO_INT | SerialPort.IIR.INT_BITS);
this.bIIR |= bIIR;
/*
* TODO: Remove this arbitrary 100-instruction delay once we've added support for baud rate throttling
* (see TODO above regarding baud rate).
*/
if (this.chipset && this.nIRQ) this.chipset.setIRR(this.nIRQ, 100);
} else {
this.bIIR |= SerialPort.IIR.NO_INT;
if (this.chipset && this.nIRQ) this.chipset.clearIRR(this.nIRQ);
}
};
/**
* echoByte(b)
*
* @this {SerialPort}
* @param {number} b
* @return {boolean} true if echoed, false if not
*/
SerialPort.prototype.echoByte = function(b)
{
if (this.controlIOBuffer) {
if (b != 0x0D) {
if (b == 0x08) {
this.controlIOBuffer.value = this.controlIOBuffer.value.slice(0, -1);
} else {
this.controlIOBuffer.value += String.fromCharCode(b);
this.controlIOBuffer.scrollTop = this.controlIOBuffer.scrollHeight;
}
}
return true;
}
return false;
};
/*
* Port input notification table
*/
SerialPort.aPortInput = {
0x0: SerialPort.prototype.inRBR, // or DLL if DLAB set
0x1: SerialPort.prototype.inIER, // or DLM if DLAB set
0x2: SerialPort.prototype.inIIR,
0x3: SerialPort.prototype.inLCR,
0x4: SerialPort.prototype.inMCR,
0x5: SerialPort.prototype.inLSR,
0x6: SerialPort.prototype.inMSR
};
/*
* Port output notification table
*/
SerialPort.aPortOutput = {
0x0: SerialPort.prototype.outTHR, // or DLL if DLAB set
0x1: SerialPort.prototype.outIER, // or DLM if DLAB set
0x3: SerialPort.prototype.outLCR,
0x4: SerialPort.prototype.outMCR
};
/**
* SerialPort.init()
*
* This function operates on every HTML element of class "serial", extracting the
* JSON-encoded parameters for the SerialPort constructor from the element's "data-value"
* attribute, invoking the constructor to create a SerialPort component, and then binding
* any associated HTML controls to the new component.
*/
SerialPort.init = function()
{
var aeSerial = Component.getElementsByClass(window.document, PCJSCLASS, "serial");
for (var iSerial = 0; iSerial < aeSerial.length; iSerial++) {
var eSerial = aeSerial[iSerial];
var parmsSerial = Component.getComponentParms(eSerial);
var serial = new SerialPort(parmsSerial);
Component.bindComponentControls(serial, eSerial, PCJSCLASS);
}
};
/*
* Initialize every SerialPort module on the page.
*/
web.onInit(SerialPort.init);
if (typeof module !== 'undefined') module.exports = SerialPort;
/**
* @fileoverview The State class used by C1Pjs and PCjs.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-May-14
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
if (typeof module !== 'undefined') {
var web = require("./../../shared/lib/weblib");
var Component = require("./../../shared/lib/component");
var Messages = require("./messages");
}
/**
* State(component, sVersion, sSuffix)
*
* State objects are used by components to save/restore their state.
*
* During a save operation, components add data to a State object via set(),
* and then return the resulting data using data().
*
* During a restore operation, the Computer component passes the results of each
* data() call back to the originating component.
*
* WARNING: Since State objects are low-level objects that have no UI requirements,
* they do not inherit from the Component class, so you should only use class methods
* of Component, such as Component.assert(), or Debugger methods if the Debugger
* is available.
*
* @constructor
* @param {Component} component
* @param {string} [sVersion] is used to append a major version number to the key
* @param {string} [sSuffix] is used to append any additional suffixes to the key
*/
function State(component, sVersion, sSuffix) {
this.id = component.id;
this.key = State.key(component, sVersion, sSuffix);
this.dbg = component.dbg;
this.unload(component.parms);
}
/**
* State.key(component, sVersion, sSuffix)
*
* This encapsulates the key generation code.
*
* @param {Component} component
* @param {string} [sVersion] is used to append a major version number to the key
* @param {string} [sSuffix] is used to append any additional suffixes to the key
* @return {string} key
*/
State.key = function(component, sVersion, sSuffix) {
var key = component.id;
if (sVersion) {
var i = sVersion.indexOf('.');
if (i > 0) key += ".v" + sVersion.substr(0, i);
}
if (sSuffix) {
key += "." + sSuffix;
}
return key;
};
/**
* State.compress(aSrc)
*
* @param {Array.<number>|null} aSrc
* @return {Array.<number>|null} is either the original array (aSrc), or a smaller array of "count, value" pairs (aComp)
*/
State.compress = function(aSrc) {
if (aSrc) {
var iSrc = 0;
var iComp = 0;
var aComp = [];
while (iSrc < aSrc.length) {
var n = aSrc[iSrc];
Component.assert(n !== undefined);
var iCompare = iSrc + 1;
while (iCompare < aSrc.length && aSrc[iCompare] === n) iCompare++;
aComp[iComp++] = iCompare - iSrc;
aComp[iComp++] = n;
iSrc = iCompare;
}
if (aComp.length < aSrc.length) return aComp;
}
return aSrc;
};
/**
* State.decompress(aComp)
*
* @param {Array.<number>} aComp
* @param {number} nLength is expected length of decompressed data
* @return {Array.<number>}
*/
State.decompress = function(aComp, nLength) {
var iDst = 0;
var aDst = new Array(nLength);
var iComp = 0;
while (iComp < aComp.length - 1) {
var c = aComp[iComp++];
var n = aComp[iComp++];
while (c--) {
aDst[iDst++] = n;
}
}
Component.assert(aDst.length == nLength);
return aDst;
};
/**
* State.compressEvenOdd(aSrc)
*
* This is a very simple variation on compress() that compresses all the EVEN elements of aSrc first,
* followed by all the ODD elements. This tends to work better on EGA video memory, because when odd/even
* addressing is enabled (eg, for text modes), the DWORD values tend to alternate, which is the worst case
* for compress(), but the best case for compressEvenOdd().
*
* One wrinkle we support: if the first element is uninitialized, then we assume the entire array is undefined,
* and return an empty compressed array. Conversely, decompressEvenOdd() will take an empty compressed array
* and return an uninitialized array.
*
* @param {Array.<number>|null} aSrc
* @return {Array.<number>|null} is either the original array (aSrc), or a smaller array of "count, value" pairs (aComp)
*/
State.compressEvenOdd = function(aSrc) {
if (aSrc) {
var iComp = 0, aComp = [];
if (aSrc[0] !== undefined) {
for (var off = 0; off < 2; off++) {
var iSrc = off;
while (iSrc < aSrc.length) {
var n = aSrc[iSrc];
var iCompare = iSrc + 2;
while (iCompare < aSrc.length && aSrc[iCompare] === n) iCompare += 2;
aComp[iComp++] = (iCompare - iSrc) >> 1;
aComp[iComp++] = n;
iSrc = iCompare;
}
}
}
if (aComp.length < aSrc.length) return aComp;
}
return aSrc;
};
/**
* State.decompressEvenOdd(aComp, nLength)
*
* This is the counterpart to compressEvenOdd(). Note that because there's nothing in the compressed sequence
* that differentiates a compress() sequence from a compressEvenOdd() sequence, you simply have to be consistent:
* if you used even/odd compression, then you must use even/odd decompression.
*
* @param {Array.<number>} aComp
* @param {number} nLength is expected length of decompressed data
* @return {Array.<number>}
*/
State.decompressEvenOdd = function(aComp, nLength) {
var iDst = 0;
var aDst = new Array(nLength);
var iComp = 0;
while (iComp < aComp.length - 1) {
var c = aComp[iComp++];
var n = aComp[iComp++];
while (c--) {
aDst[iDst] = n;
iDst += 2;
}
/*
* The output of a "count,value" pair will never exceed the end of the output array, so as soon as we reach it
* the first time, we know it's time to switch to ODD elements, and as soon as we reach it again, we should be
* done.
*/
Component.assert(iDst <= nLength || iComp == aComp.length);
if (iDst == nLength) iDst = 1;
}
Component.assert(aDst.length == nLength);
return aDst;
};
State.prototype = {
constructor: State,
/**
* set(id, data)
*
* @this {State}
* @param {number|string} id
* @param {Object|string} data
*/
set: function(id, data) {
try {
this[this.id][id] = data;
} catch(e) {
Component.log(e.message);
}
},
/**
* get(id)
*
* @this {State}
* @param {number|string} id
* @return {Object|string|null}
*/
get: function(id) {
return this[this.id][id] || null;
},
/**
* value()
*
* Use this instead of data() if you haven't called parse() yet.
*
* @this {State}
* @return {string}
*/
value: function() {
return this[this.id];
},
/**
* data()
*
* @this {State}
* @return {Object}
*/
data: function() {
return this[this.id];
},
/**
* load(s)
*
* WARNING: Make sure you follow this call with either a call to parse() or unload(),
* because any stringified data that we've loaded isn't usable until it's been parsed.
*
* @this {State}
* @param {Object|string|null} [s]
* @return {boolean} true if state exists in localStorage, false if not
*/
load: function(s) {
if (s) {
this[this.id] = s;
this.fLoaded = true;
return true;
}
if (this.fLoaded) {
/*
* This is assumed to be a redundant load().
*/
return true;
}
if (web.hasLocalStorage()) {
s = web.getLocalStorageItem(this.key);
if (s) {
this[this.id] = s;
this.fLoaded = true;
if (DEBUG && this.messageEnabled()) {
this.printMessage("localStorage(" + this.key + "): " + s.length + " bytes loaded");
}
return true;
}
}
return false;
},
/**
* parse()
*
* This completes the load() operation, by parsing what was loaded, on the assumption there
* might be some benefit to deferring parsing until we've given the user a chance to confirm.
* Otherwise, load() could have just as easily done this, too.
*
* @this {State}
* @return {boolean} true if successful, false if error
*/
parse: function() {
var fSuccess = true;
try {
this[this.id] = JSON.parse(this[this.id]);
} catch (e) {
Component.error(e.message || e);
fSuccess = false;
}
return fSuccess;
},
/**
* store()
*
* @this {State}
* @return {boolean} true if successful, false if error
*/
store: function() {
var fSuccess = true;
if (web.hasLocalStorage()) {
var s = JSON.stringify(this[this.id]);
if (web.setLocalStorageItem(this.key, s)) {
if (DEBUG && this.messageEnabled()) {
this.printMessage("localStorage(" + this.key + "): " + s.length + " bytes stored");
}
} else {
/*
* WARNING: Because browsers tend to disable all alerts() during an "unload" operation,
* it's unlikely anyone will ever see the "quota" errors that occur at this point. Need to
* think of some way to notify the user that there's a problem, and offer a way of cleaning
* up old states.
*/
Component.error("Unable to store " + s.length + " bytes in browser local storage");
fSuccess = false;
}
}
return fSuccess;
},
/**
* toString()
*
* We can't know whether this might be called before parse() or after parse(), so we check.
* If before, then this[this.id] will still be in string form; if after, it will be an Object.
*
* @this {State}
* @return {string} JSON-encoded state
*/
toString: function() {
var value = this[this.id];
return (typeof value == "string"? value : JSON.stringify(value));
},
/**
* unload(parms)
*
* This discards any data saved via set() or loaded via load(), creating an empty State object.
* Note that you have to follow this call with an explicit call to store() if you want to remove
* the state from localStorage as well.
*
* @this {State}
* @param {Object} [parms]
*/
unload: function(parms) {
this[this.id] = {};
if (parms) this.set("parms", parms);
this.fLoaded = false;
},
/**
* clear(fAll)
*
* This unloads the current state, and then clears ALL localStorage for the current machine,
* independent of version, to reduce the chance of orphaned states wasting part of our limited allocation.
*
* @this {State}
* @param {boolean} [fAll] true to unconditionally clear ALL localStorage for the current domain
*/
clear: function(fAll) {
this.unload();
var aKeys = web.getLocalStorageKeys();
for (var i = 0; i < aKeys.length; i++) {
var sKey = aKeys[i];
if (sKey && (fAll || sKey.substr(0, this.key.length) == this.key)) {
web.removeLocalStorageItem(sKey);
if (DEBUG && this.messageEnabled()) {
this.printMessage("localStorage(" + sKey + ") removed");
}
aKeys.splice(i, 1);
i = 0;
}
}
},
/**
* messageEnabled(bitsMessage)
*
* @this {State}
* @param {number} [bitsMessage] is one or more Messages category flag(s)
* @return {boolean}
*/
messageEnabled: function(bitsMessage) {
if (DEBUGGER && this.dbg) {
if (bitsMessage == null) {
bitsMessage = Messages.STATE;
} else {
bitsMessage |= Messages.STATE;
}
return this.dbg.messageEnabled(bitsMessage);
}
return false;
},
/**
* printMessage(sMessage)
*
* @this {State}
* @param {string} sMessage is any caller-defined message string
*/
printMessage: function(sMessage) {
if (DEBUGGER && this.dbg) this.dbg.message(sMessage);
}
};
if (typeof module !== 'undefined') module.exports = State;
/**
* @fileoverview Implements the PCjs Video component.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-Jun-15
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
if (typeof module !== 'undefined') {
var str = require("../../shared/lib/strlib");
var web = require("../../shared/lib/weblib");
var DumpAPI = require("../../shared/lib/dumpapi");
var Component = require("../../shared/lib/component");
var Memory = require("./memory");
var Messages = require("./messages");
var ChipSet = require("./chipset");
var Keyboard = require("./keyboard");
var State = require("./state");
}
/**
* Video(parmsVideo, canvas, context, textarea, container)
*
* The Video component can be configured with the following (parmsVideo) properties:
*
* model: model (eg, "mda" for Monochrome Display Adapter)
* mode: mode number (hardware-specific, 7 is the default)
* memory: amount of installed memory (ignored for MDA/CGA)
* screenWidth: width of the screen canvas, in pixels
* screenHeight: height of the screen canvas, in pixels
* scale: true for font scaling, false (default) to center the display on the screen
* charCols: number of character columns
* charRows: number of character rows
* fontROM: path to .rom file (or a JSON representation) that defines the character set
* screenColor: background color of the screen canvas (default is black)
* autoLock: true to (attempt to) automatically lock the mouse to the canvas (default is false)
*
* An EGA may specify the following additional properties:
*
* switches: string representing EGA switches (see "SW1-SW4" documentation below)
* memory: the size of the EGA's on-board memory (overrides EGA's Video.cardSpecs)
*
* This calls the Bus to allocate a video buffer at the appropriate memory location whenever
* a reset() or setMode() occurs; setMode() is called whenever a mode change is detected at
* the port level, and whenever reset() is called. setMode() also invokes updateScreen(true),
* which forces reallocation of our internal buffer (aCellCache) that mirrors the video buffer.
*
* The CPU periodically calls updateScreen(), at an assumed rate of 60 times/second,
* to update any blinking elements (the cursor and any characters with the blink attribute),
* to compare/update the contents of our internal buffer with the video buffer, and to render
* any differences between the two buffers into the associated screen canvas, via either
* updateChar() or setPixel().
*
* Thanks to the CPU's new block-based memory manager that allows us to sparse-allocate memory
* (in 4Kb increments on 20-bit buses, 16Kb increments on 24-bit buses), updateScreen()
* can also ask the CPU for the "dirty" state of all the blocks underlying the video buffer,
* bypassing the update completely if the buffer is still clean.
*
* Unfortunately, that optimization is defeated if our count of active blink elements is non-zero,
* because we must rescan the entire buffer to locate and redraw them all; I'm assuming for now
* that, more often than not, blink attributes will not be present, and therefore they're not worth
* a separate caching mechanism. If the only blinking element is the cursor, that's no problem,
* as we redraw only the one cell containing the cursor (assuming the buffer is otherwise clean).
*
* @constructor
* @extends Component
* @param {Object} parmsVideo
* @param {Object} [canvas]
* @param {Object} [context]
* @param {Object} [textarea]
* @param {Object} [container]
*/
function Video(parmsVideo, canvas, context, textarea, container)
{
Component.call(this, "Video", parmsVideo, Video, Messages.VIDEO);
/*
* This records the model specified (eg, "mda", "cga", "ega", "vga" or "" if none specified);
* when a model is specified, it overrides whatever model we infer from the ChipSet's switches
* (since those motherboard switches tell us only the type of monitor, not the type of card).
*/
this.model = parmsVideo['model'];
this.nCard = Video.CARD.NAMES[this.model] || Video.CARD.MDA;
this.cbMemory = parmsVideo['memory'] || 0; // zero means fallback to the cardSpec's default size
this.sSwitches = parmsVideo['switches'];
/*
* powerUp() uses the default mode ONLY if ChipSet doesn't give us a default.
*/
this.nModeDefault = parmsVideo['mode'];
if (this.nModeDefault === undefined || Video.aModeParms[this.nModeDefault] === undefined) {
this.nModeDefault = Video.MODE.MDA_80X25;
}
/*
* setDimensions() uses these values ONLY if it doesn't recognize the video mode.
*/
this.nColsDefault = parmsVideo['charCols'];
this.nRowsDefault = parmsVideo['charRows'];
if (this.nColsDefault === undefined || this.nRowsDefault === undefined) {
this.nColsDefault = Video.aModeParms[this.nModeDefault][0];
this.nRowsDefault = Video.aModeParms[this.nModeDefault][1];
}
/*
* setDimensions() uses these values unconditionally, as the machine has no idea what the
* physical screen size should be.
*/
this.cxScreen = parmsVideo['screenWidth'];
this.cyScreen = parmsVideo['screenHeight'];
/*
* We might consider another component parameter to specify the font-doubling setting.
* For now, it's based on whether the default SCREEN cell size is sufficiently larger than
* the default FONT cell size.
*/
this.fScaleFont = parmsVideo['scale'];
this.fDoubleFont = Math.round(this.cxScreen / this.nColsDefault) >= 12;
this.fTouchScreen = parmsVideo['touchScreen'];
this.canvasScreen = canvas;
this.contextScreen = context;
this.textareaScreen = textarea;
this.inputScreen = textarea || canvas || null;
/*
* If a Mouse exists, we'll be notified when it requests our canvas, and we make a note of it
* so that if lockPointer() is ever invoked, we can notify the Mouse.
*/
this.mouse = null;
this.fAutoLock = parmsVideo['autoLock'];
/*
* Originally, setMode() would map/unmap the video buffer ONLY when the active card changed,
* because as long as an MDA or CGA remained active, its video buffer never changed. However,
* since the EGA can change its video buffer on the fly, setMode() must also compare the card's
* hard-coded and/or programmed buffer address/size to the "active" address/size; the latter
* is recorded here.
*/
this.addrBuffer = this.sizeBuffer = 0;
/*
* aFonts is an array of font objects indexed by FONT ID. Font characters are arranged
* in 16x16 grids, with one grid per canvas object in the aCanvas array of each font object.
*
* Each element is a Font object that describes the font size and provides bitmaps for all the font
* color permutations. aFonts.length will be non-zero if ANY fonts are loaded, but do NOT assume
* that EVERY font has been loaded; check for the existence of a font by checking for its unique ID
* within this sparse array.
*/
this.aFonts = [];
/*
* Instead of (re)allocating a new color array every time getCardColors() is called, we preallocate
* an array now and simply update the entries as needed.
*/
this.aRGB = new Array(16);
/*
* Since I've not found clear documentation on a reliable way to check whether a particular DOM element
* (other than the BODY element) has focus at any given time, I've added onfocus() and onblur() handlers
* to the screen to maintain my own focus state.
*/
this.fHasFocus = false;
var video = this;
/*
* Here's the gross code to handle full-screen support across all supported browsers. The lack of standards
* is exasperating; browsers can't agree on 'full' or 'Full, 'request' or 'Request', 'screen' or 'Screen', and
* while some browsers honor other browser prefixes, most browsers don't.
*/
this.fGecko = web.isUserAgent("Gecko/");
var i, sEvent, asPrefixes = ['', 'moz', 'webkit', 'ms'];
this.container = container;
if (this.container) {
this.container.doFullScreen = container['requestFullscreen'] || container['msRequestFullscreen'] || container['mozRequestFullScreen'] || container['webkitRequestFullscreen'];
if (this.container.doFullScreen) {
for (i = 0; i < asPrefixes.length; i++) {
sEvent = asPrefixes[i] + 'fullscreenchange';
if ('on' + sEvent in document) {
var onFullScreenChange = function() {
var fFullScreen = (document['fullscreenElement'] || document['mozFullScreenElement'] || document['webkitFullscreenElement'] || document['msFullscreenElement']);
video.notifyFullScreen(fFullScreen? true : false);
};
document.addEventListener(sEvent, onFullScreenChange, false);
break;
}
}
for (i = 0; i < asPrefixes.length; i++) {
sEvent = asPrefixes[i] + 'fullscreenerror';
if ('on' + sEvent in document) {
var onFullScreenError = function() {
video.notifyFullScreen(null);
};
document.addEventListener(sEvent, onFullScreenError, false);
break;
}
}
}
}
/*
* More gross code to handle pointer-locking support across all supported browsers.
*
* TODO: Consider "upgrading" this code to use the same asPrefixes array as above, especially once Microsoft
* finally releases a browser that supports pointer-locking (post-Windows 10?)
*/
if (this.inputScreen) {
this.inputScreen.onfocus = function onFocusScreen() {
return video.onFocusChange(true);
};
this.inputScreen.onblur = function onBlurScreen() {
return video.onFocusChange(false);
};
this.inputScreen.lockPointer = this.inputScreen['requestPointerLock'] || this.inputScreen['mozRequestPointerLock'] || this.inputScreen['webkitRequestPointerLock'];
this.inputScreen.unlockPointer = this.inputScreen['exitPointerLock'] || this.inputScreen['mozExitPointerLock'] || this.inputScreen['webkitExitPointerLock'];
if (this.inputScreen.lockPointer) {
var onPointerLockChange = function() {
var fLocked = (
document['pointerLockElement'] === video.inputScreen ||
document['mozPointerLockElement'] === video.inputScreen ||
document['webkitPointerLockElement'] === video.inputScreen);
video.notifyPointerLocked(fLocked);
};
if ('onpointerlockchange' in document) {
document.addEventListener('pointerlockchange', onPointerLockChange, false);
} else if ('onmozpointerlockchange' in document) {
document.addEventListener('mozpointerlockchange', onPointerLockChange, false);
} else if ('onwebkitpointerlockchange' in document) {
document.addEventListener('webkitpointerlockchange', onPointerLockChange, false);
}
}
}
/*
* As far as overall image quality of scaled fonts, these options don't seem necessary for Safari (and
* don't have any discernible effect anyway). Turning 'webkitImageSmoothingEnabled' off DOES have an effect
* on Chrome, but it's not really a positive effect overall, so I'm leaving these off for now.
*
* if (this.contextScreen) {
* this.contextScreen['mozImageSmoothingEnabled'] = false;
* this.contextScreen['webkitImageSmoothingEnabled'] = false;
* }
*/
var sFileURL = parmsVideo['fontROM'];
if (sFileURL) {
var sFileExt = str.getExtension(sFileURL);
if (sFileExt != "json") {
sFileURL = web.getHost() + DumpAPI.ENDPOINT + '?' + DumpAPI.QUERY.FILE + '=' + sFileURL + '&' + DumpAPI.QUERY.FORMAT + '=' + DumpAPI.FORMAT.BYTES;
}
web.loadResource(sFileURL, true, null, this, this.onLoadSetFonts);
}
}
Component.subclass(Video);
Video.TRAPALL = true; // monitor all I/O by default (not just deltas)
/*
* MDA/CGA Support
*
* Since there's a lot of similarity between the MDA and CGA (eg, their text-mode video buffer
* format, and their use of the 6845 CRT controller), since the MDA ROM contains the fonts used
* by both devices, and since the same ROM BIOS supports both (in fact, the BIOS indiscriminately
* initializes both, regardless which is actually installed), this same component emulates both
* devices.
*
* When no model is specified, this component supports the ability to dynamically switch between
* MDA and CGA emulation, by simply toggling the SW1 motherboard "monitor type" switch settings
* and resetting the machine. In that model-less configuration, we install I/O port handlers for
* both MDA and CGA cards, regardless which monitor type is initially selected.
*
* To simulate an IBM PC containing both an MDA and CGA (ie, a "dual display" system), the machine
* configuration simply defines two video components, one with model "mda" and the other with model
* "cga", resulting in two displays; setting a specific model forces each instance of this component
* to register only those I/O ports belonging to that model.
*
* In a single-display system, dynamically switching cards (ie, between MDA and CGA) creates some
* visual challenges. For one, the MDA prefers a native screen size of 720x350, as it supports only
* one video mode, 80x25, with a 9x14 cell size. The CGA, on the other hand, has an 8x8 cell size,
* so when using an MDA-size screen, an 80x25 CGA screen will end up with 40-pixel borders on the
* left and right, and 75-pixel borders on the top and bottom. The result is a rather tiny CGA font
* surrounded by lots of wasted space, so it's best to turn on font scaling (see the "scale" property)
* and go with a larger screen size of, say, 960x400 (50% larger in width, 100% larger in height).
*
* I've also added support for font-doubling in createFont(). We use the 8x8 font for 80-column
* modes and the "doubled" 16x16 font for 40-column modes OR whenever the screen is large enough
* to use the 16x16 font, since font rendering without scaling provides the sharpest results.
* In fact, there's special logic in setDimensions() to ignore fScaleFont in certain cases (eg,
* 40-column modes, to improve sharpness and avoid stretching the font beyond readability).
*
* Graphics modes, on the other hand, are always scaled to the screen size. Pixels are captured
* in an off-screen buffer, which is then drawn to match the size of the virtual screen.
*
* TODO: Whenever there are borders, they should be filled with the CGA's overscan colors. However,
* in the case of graphics modes (and text modes whenever font scaling is enabled), we don't reserve
* any space for borders, so if borders are important, explicit border support will be required.
*/
/*
* EGA Support
*
* EGA support piggy-backs on the existing MDA/CGA support. All the existing MDA/CGA port handlers
* now refer to either cardMono or cardColor (instead of directly to cardMDA or cardCGA), enabling
* the handlers to be redirected to cardMDA, cardCGA or cardEGA as appropriate.
*
* Note that an MDA card supported only a Monochrome Display and a CGA card supported only a Color
* Display (well, OK, *or* a TV monitor, which we don't currently support), but the EGA is much
* more flexible: the Enhanced Color Display was the preferred display, but the EGA also supported
* older displays; a Color Display on EGA wasn't ideal (same low resolutions but with more colors),
* but the EGA also brought high-resolution graphics to Monochrome displays, which was nice. Anyway,
* while all those EGA/monitor combinations will be nice to support, our virtual display support
* will focus initially on the Enhanced Color Display.
*
* TODO: Add support for jumpers P1 and P3 (see EGA TechRef p.85). P1 selects either 5-color-output
* for a CGA monitor or 6-color-output for an EGA monitor; we would presumably use this only to
* control certain assumptions about the virtual display's capabilities (ie, Color Display vs. Enhanced
* Color Display). P3 can switch all the I/O ports from 0x3nn to 0x2nn; the default is 0x3nn, and
* that's the only port range the EGA ROM supports as well.
*/
/*
* VGA Support
*
* More will be said here about PCjs VGA support later. But first, a word from IBM: "Video Graphics Array [VGA]
* Programming Considerations":
*
* Certain internal timings must be guaranteed by the user, in order to have the CRTC perform properly.
* This is due to the physical design of the chip. These timings can be guaranteed by ensuring that the
* rules listed below are followed when programming the CRTC.
*
* 1. The Horizontal Total [HORZ_TOTAL] register (R0) must be greater than or equal to a value of
* 25 decimal.
*
* 2. The minimum positive pulse width of the HSYNC output must be four character clock units.
*
* 3. Register R5, Horizontal Sync End [HORZ_RETRACE_END], must be programmed such that the HSYNC
* output goes to a logic 0 a minimum of one character clock time before the 'horizontal display enable'
* signal goes to a logical 1.
*
* 4. Register R16, Vsync Start [VERT_RETRACE_START], must be a minimum of one horizontal scan line greater
* than register R18 [VERT_DISP_END]. Register R18 defines where the 'vertical display enable' signal ends.
*
* When bit 5 of the Attribute Mode Control register equals 1, a successful line compare (see Line Compare
* [LINE_COMPARE] register) in the CRT Controller forces the output of the PEL Panning register to 0's until Vsync
* occurs. When Vsync occurs, the output returns to the programmed value. This allows the portion of the screen
* indicated by the Line Compare register to be operated on by the PEL Panning register.
*
* A write to the Character Map Select register becomes valid on the next whole character line. No deformed
* characters are displayed by changing character generators in the middle of a character scan line.
*
* For 256-color 320 x 200 graphics mode hex 13, the attribute controller is configured so that the 8-bit attribute
* stored in video memory for each PEL becomes the 8-bit address (P0 - P7) into the integrated DAC. The user should
* not modify the contents of the internal Palette registers when using this mode.
*
* The following sequence should be followed when accessing any of the Attribute Data registers pointed to by the
* Attribute Index register:
*
* 1. Disable interrupts
* 2. Reset read/write flip/flop
* 3. Write to Index register
* 4. Read from or write to a data register
* 5. Enable interrupts
*
* The Color Select register in the Attribute Controller section may be used to rapidly switch between sets of colors
* in the video DAC. When bit 7 of the Attribute Mode Control register equals 0, the 8-bit color value presented to the
* video DAC is composed of 6 bits from the internal Palette registers and bits 2 and 3 from the Color Select register.
* When bit 7 of the Attribute Mode Control register equals 1, the 8-bit color value presented to the video DAC is
* composed of the lower four bits from the internal Palette registers and the four bits in the Color Select register.
* By changing the value in the Color Select register, software rapidly switches between sets of colors in the video DAC.
* Note that BIOS does not support multiple sets of colors in the video DAC. The user must load these colors if this
* function is to be used. Also see the Attribute Controller block diagram on page 4-26. Note that the above discussion
* applies to all modes except 256 Color Graphics mode. In this mode the Color Select register is not used to switch
* between sets of colors.
*
* An application that saves the "Video State" must store the 4 bytes of information contained in the system microprocessor
* latches in the graphics controller subsection. These latches are loaded with 32 bits from video memory (8 bits per map)
* each time the system microprocessor does a read from video memory. The application needs to:
*
* 1. Use write mode 1 to write the values in the latches to a location in video memory that is not part of
* the display buffer. The last location in the address range is a good choice.
*
* 2. Save the values of the latches by reading them back from video memory.
*
* Note: If in a chain 4 or odd/even mode, it will be necessary to reconfigure the memory organization as four
* sequential maps prior to performing the sequence above. BIOS provides support for completely saving and
* restoring video state. See the IBM Personal System/2 and Personal Computer BIOS Interface Technical Reference
* for more information.
*
* The description of the Horizontal PEL Panning register includes a figure showing the number of PELs shifted left
* for each valid value of the PEL Panning register and each valid video mode. Further panning beyond that shown in
* the figure may be accomplished by changing the start address in the CRT Controller registers, Start Address High
* and Start Address Low. The sequence involved in further panning would be as follows:
*
* 1. Use the PEL Panning register to shift the maximum number of bits to the left. See Figure 4-103 on page
* 4-106 for the appropriate values.
*
* 2. Increment the start address.
*
* 3. If you are not using Modes 0 + , 1 + , 2 + , 3 + ,7, or7 + , set the PEL Panning register to 0. If you
* are using these modes, set the PEL Panning register to 8. The screen will now be shifted one PEL left
* of the position it was in at the end of step 1. Step 1 through Step 3 may be repeated as desired.
*
* The Line Compare register (CRTC register hex 18) should be programmed with even values in 200 line modes when
* used in split screen applications that scroll a second screen on top of a first screen. This is a requirement
* imposed by the scan doubling logic in the CRTC.
*
* If the Cursor Start register (CRTC register hex 0A) is programmed with a value greater than that in the Cursor End
* register (CRTC register hex 0B), then no cursor is displayed. A split cursor is not possible.
*
* In 8-dot character modes, the underline attribute produces a solid line across adjacent characters, as in the IBM
* Color/Graphics Monitor Adapter, Monochrome Display Adapter and the Enhanced Graphics Adapter. In 9-dot modes, the
* underline across adjacent characters is dashed, as in the IBM 327X display terminals. In 9-dot modes, the line
* graphics characters (C0 - DF character codes) have solid underlines.
*
* For compatibility with the IBM Enhanced Graphics Adapter (EGA), the internal VGA palette is programmed the same
* as the EGA. The video DAC is programmed by BIOS so that the compatible values in the internal VGA palette produce
* a color compatible with what was produced by EGA. Mode hex 13 (256 colors) is programmed so that the first 16
* locations in the DAC produce compatible colors.
*
* Summing: When BIOS is used to load the video DAC palette for a color mode and a monochrome display is connected
* to the system unit, the color palette is changed. The colors are summed to produce shades of gray that allow
* color applications to produce a readable screen.
*
* There are 4 bits that should not be modified unless the sequencer is reset by setting bit 1 of the Reset register
* to 0. These bits are:
*
* • Bit 3, or bit 0 of the Clocking Mode register
* • Bit 3, or bit 2 of the Miscellaneous Output register
*/
/*
* Supported Cards
*
* Note that we choose IDs that match the default font ID for each card as well, for convenience.
*/
Video.CARD = {
MDA: 1,
CGA: 3,
EGA: 5,
VGA: 7,
NAMES: {
"mda": 1,
"cga": 3,
"ega": 5,
"vga": 7
}
};
/*
* Supported Modes
*
* Although this component is designed to be a video hardware emulation, not a BIOS simulation, we DO
* look for changes to the hardware state that correspond to standard BIOS mode settings, so our internal
* mode setting will normally match the current BIOS mode setting; however, this a debugging convenience,
* not an attempt to monitor or emulate the BIOS.
*
* We do have some BIOS awareness (eg, when loading ROM-based fonts, and some special code to ensure all
* the BIOS diagnostics pass), but for the most part, we treat the BIOS like any other application code.
*
* As we expand support to include more programmable cards like the EGA, it becomes quite easy for the card
* to enter a "mode" that has no BIOS counterpart (eg, non-standard combinations of video buffer address,
* memory access modes, fonts, display regions, etc). Our hardware emulation routines will cope with those
* situations as best they can (and when they don't, it should be considered a bug if some application is
* broken as a result), but realistically, our hardware emulation is never likely to be 100% accurate.
*/
Video.MODE = {
CGA_40X25_BW: 0,
CGA_40X25: 1,
CGA_80X25_BW: 2,
CGA_80X25: 3,
CGA_320X200: 4,
CGA_320X200_BW: 5,
CGA_640X200: 6,
MDA_80X25: 7,
EGA_320X200: 0x0D, // mapped at A000:0000
EGA_640X200: 0x0E, // mapped at A000:0000
EGA_640X350_MONO: 0x0F, // mapped at A000:0000, monochrome
EGA_640X350: 0x10, // mapped at A000:0000, color
VGA_640X480_MONO: 0x11, // mapped at A000:0000, monochrome
VGA_640X480: 0x12, // mapped at A000:0000, color
VGA_320X200: 0x13, // mapped at A000:0000, color
UNKNOWN: 0xFF
};
/*
* Supported Monitors
*
* The MDA monitor displays 350 lines of vertical resolution, 720 lines of horizontal resolution, and refreshes
* at ~50Hz. The CGA monitor displays 200 lines vertically, 640 horizontally, and refreshes at ~60Hz.
*
* Based on actual MDA timings (see http://diylab.atwebpages.com/pressureDev.htm), the total horizontal
* period (drawing a line and retracing) is ~54.25uSec (1000000uSec / 18432) and the horizontal retrace interval
* is about 15% of that, or ~8.14uSec. Vertical sync occurs once every 370 horizontal periods. Of those 370,
* only 354 represent actively drawn lines (and of those, only 350 are visible); the remaining 16 horizontal
* periods, or 4% of the 370 total, represent the vertical retrace interval.
*
* I don't have similar numbers for the CGA or EGA, so for now, I assume similar percentages; ie, 15% of
* the horizontal period will represent horizontal retrace, and 4% of the vertical pixel maximum (262) will
* represent vertical retrace. However, 24% of the CGA's 262 vertical maximum represents non-visible lines,
* whereas only 5% of the MDA's 370 maximum represents non-visible lines; is there really that much "overscan"
* on the CGA?
*
* For each monitor type, there's a Video.monitorSpecs object that describes the horizontal and vertical
* timings, along with my assumptions about the percentage of time that drawing is "active" within those periods,
* and then based on the selected monitor type, I compute the number of CPU cycles that each period lasts,
* as well as the number of CPU cycles that drawing lasts within each period, so that the horizontal and vertical
* retrace status flags can be quickly calculated.
*
* For reference, here are some important numbers to know (from https://github.com/reenigne/reenigne/blob/master/8088/cga/register_values.txt):
*
* CGA MDA
* Pixel clock 14.318 MHz 16.257 MHz (aka "maximum video bandwidth", as IBM Tech Refs sometimes call it)
* Horizontal 15.700 KHz 18.432 KHz (aka "horizontal drive", as IBM Tech Refs sometimes call it)
* Vertical 59.923 Hz 49.816 Hz
* Usage 53.69% 77.22%
* H pix 912 = 114*8 882 = 98*9
* V pix 262 370
* Dots 238944 326340
*/
/**
* @class MonitorSpecs
* @property {number} nHorzPeriodsPerSec
* @property {number} nHorzPeriodsPerFrame
* @property {number} percentHorzActive
* @property {number} percentVertActive
*
* From these monitor specs, we calculate the following values for a given Card:
*
* nCyclesPerSecond = cpu.getCyclesPerSecond(); // eg, 4772727
* nCyclesHorzPeriod = (nCyclesPerSecond / monitorSpecs.nHorzPeriodsPerSec) | 0;
* nCyclesHorzActive = (nCyclesHorzPeriod * monitorSpecs.percentHorzActive / 100) | 0;
* nCyclesVertPeriod = nCyclesHorzPeriod * monitorSpecs.nHorzPeriodsPerFrame;
* nCyclesVertActive = (nCyclesVertPeriod * monitorSpecs.percentVertActive / 100) | 0;
*/
/**
* @type {Object}
*/
Video.monitorSpecs = {};
/**
* NOTE: Based on trial-and-error, 208 is the magic number of horizontal syncs per vertical sync that
* yielded the necessary number of "horizontal enables" (200 or 0xC8) in the EGA ROM BIOS at C000:03D0.
*
* @type {{MonitorSpecs}}
*/
Video.monitorSpecs[ChipSet.MONITOR.COLOR] = {
nHorzPeriodsPerSec: 15700,
nHorzPeriodsPerFrame: 208,
percentHorzActive: 85,
percentVertActive: 96
};
/**
* NOTE: Based on trial-and-error, 364 is the magic number of horizontal syncs per vertical sync that
* yielded the necessary number of "horizontal enables" (350 or 0x15E) in the EGA ROM BIOS at C000:03D0.
*
* @type {{MonitorSpecs}}
*/
Video.monitorSpecs[ChipSet.MONITOR.MONO] = {
nHorzPeriodsPerSec: 18432,
nHorzPeriodsPerFrame: 364,
percentHorzActive: 85,
percentVertActive: 96
};
/**
* @type {{MonitorSpecs}}
*/
Video.monitorSpecs[ChipSet.MONITOR.EGACOLOR] = {
nHorzPeriodsPerSec: 21850,
nHorzPeriodsPerFrame: 364,
percentHorzActive: 85,
percentVertActive: 96
};
/**
* NOTE: As above, the following values are based purely on trial-and-error, to yield results that fall
* squarely within the bounds of the IBM VGA ROM timing requirements; see the IBM VGA ROM code at C000:024A.
*
* @type {{MonitorSpecs}}
*/
Video.monitorSpecs[ChipSet.MONITOR.VGACOLOR] = {
nHorzPeriodsPerSec: 16700,
nHorzPeriodsPerFrame: 480,
percentHorzActive: 85,
percentVertActive: 83
};
/*
* EGA Miscellaneous ports and SW1-Sw4
*
* The Card.MISC.CLOCK_SELECT bits determine which of the EGA board's 4 configuration switches are
* returned via Card.STATUS0.SWSENSE (when SWSENSE is zero, the switch is closed):
*
* 0xC: return SW1
* 0x8: return SW2
* 0x4: return SW3
* 0x0: return SW4
*
* These 4 bits are also copied to the byte at 40:88h by the EGA BIOS, where bit 0 is SW1, bit 1 is SW2,
* bit 2 is SW3 and bit 3 is SW4. Our switch settings come from bEGASwitches, which in turn comes from sSwitches,
* which in turn comes from the "switches" property passed to the Video component, if any.
*
* As usual, the switch settings are reversed in both direction and sense from the switch settings; the
* good news, however, is that we can use the parseSwitches() method in the ChipSet component to parse them.
*
* The set of valid EGA switch values, after conversion, is stored in the table below. For each value,
* there is an array that defines the corresponding monitor type(s) for the EGA adapter and any secondary
* adapter. The third value is a boolean indicating whether the EGA is the primary adapter.
*/
Video.aEGAMonitorSwitches = {
0x06: [ChipSet.MONITOR.TV, ChipSet.MONITOR.MONO, true], // "1001"
0x07: [ChipSet.MONITOR.COLOR, ChipSet.MONITOR.MONO, true], // "0001"
0x08: [ChipSet.MONITOR.EGAEMULATION, ChipSet.MONITOR.MONO, true], // "1110"
0x09: [ChipSet.MONITOR.EGACOLOR, ChipSet.MONITOR.MONO, true], // "0110" [our default; see bEGASwitches below]
0x0a: [ChipSet.MONITOR.MONO, ChipSet.MONITOR.TV, true], // "1010"
0x0b: [ChipSet.MONITOR.MONO, ChipSet.MONITOR.COLOR, true], // "0010"
0x00: [ChipSet.MONITOR.TV, ChipSet.MONITOR.MONO, false], // "1111"
0x01: [ChipSet.MONITOR.COLOR, ChipSet.MONITOR.MONO, false], // "0111"
0x02: [ChipSet.MONITOR.EGAEMULATION, ChipSet.MONITOR.MONO, false], // "1011"
0x03: [ChipSet.MONITOR.EGACOLOR, ChipSet.MONITOR.MONO, false], // "0011"
0x04: [ChipSet.MONITOR.MONO, ChipSet.MONITOR.TV, false], // "1101"
0x05: [ChipSet.MONITOR.MONO, ChipSet.MONITOR.COLOR, false] // "0101"
};
/**
* @class Font
* @property {number} cxCell
* @property {number} cyCell
* @property {Array} aCSSColors
* @property {Array} aRGBColors
* @property {Array} aColorMap
* @property {Array} aCanvas
*/
/*
* Supported Fonts
*
* Once we've finished loading the standard 8K font file, aFonts[] should contain one or more of the
* fonts listed below. For the standard MDA/CGA font ROM, the first (MDA) font resides in the first 4Kb,
* and the second and third (CGA) fonts reside in the two 2K halves of the second 4Kb.
*
* It may seem odd that the cell size for FONT_CGAD is *larger* than the cell size for FONT_CGA,
* since 40-column mode is actually lower resolution, but since we don't shrink the screen canvas when we
* shrink the mode, the characters must be drawn larger, and they look better if we don't have to scale them.
*
* From the IBM EGA Manual (p.5):
*
* "In alphanumeric modes, characters are formed from one of two ROM (Read Only Memory) character
* generators on the adapter. One character generator defines 7x9 characters in a 9x14 character box.
* For Enhanced Color Display support, the 9x14 character set is modified to provide an 8x14 character set.
* The second character generator defines 7x7 characters in an 8x8 character box. These generators contain
* dot patterns for 256 different characters. The character sets are identical to those provided by the
* IBM Monochrome Display Adapter and the IBM Color/Graphics Monitor Adapter."
*/
Video.FONT = {
MDA: 1, // 9x14 monochrome font
MDAD: 2, // 18x28 monochrome font (this is the 9x14 font doubled)
CGA: 3, // 8x8 color font
CGAD: 6, // 16x16 color font (this is the 8x8 CGA font doubled)
EGA: 5, // 8x14 color font
EGAD: 10, // 16x28 color font (this is the 8x14 EGA font doubled)
VGA: 7, // 8x16 color font
VGAD: 14 // 16x32 color font (this is the 8x16 VGA font doubled)
};
/*
* For each video mode, we need to know the following pieces of information:
*
* 0: # of columns (nCols)
* 1: # of rows (nRows)
* 2: # cells per word (nCellsPerWord: # of characters or pixels per word)
* 3: # bytes of visible screen padding, if any (used for CGA graphics modes only)
* 4: font ID (nFont: undefined if graphics mode)
*
* By calculating ([0] * [1]) / [2], we obtain the number of 16-bit words that mode actively displays;
* for example, the amount of visible memory used by mode 0x04 is (320 * 200) / 4, or 16000.
*
* The MODES.CGA_40X25 modes specify FONT_CGA instead of FONT_CGAD because we don't automatically
* load the FONT_CGAD unless the screen is large enough to accommodate it (see the fDoubleFont calculation).
*
* To compensate, we have code in setDimensions() that automatically switches to FONT_CGAD if it's loaded AND
* the cell size warrants the larger font. We could hard-code FONT_CGAD here, but then we'd always load it,
* and it might not always be the best fit.
*/
Video.aModeParms = []; // Mode
Video.aModeParms[Video.MODE.CGA_40X25] = [ 40, 25, 1, 0, Video.FONT.CGA]; // 0x00
Video.aModeParms[Video.MODE.CGA_80X25] = [ 80, 25, 1, 0, Video.FONT.CGA]; // 0x02
Video.aModeParms[Video.MODE.CGA_320X200] = [320, 200, 8, 192]; // 0x04
Video.aModeParms[Video.MODE.CGA_640X200] = [640, 200, 16, 192]; // 0x06
Video.aModeParms[Video.MODE.MDA_80X25] = [ 80, 25, 1, 0, Video.FONT.MDA]; // 0x07
Video.aModeParms[Video.MODE.EGA_320X200] = [320, 200, 16]; // 0x0D
Video.aModeParms[Video.MODE.EGA_640X200] = [640, 200, 16]; // 0x0E
Video.aModeParms[Video.MODE.EGA_640X350_MONO] = [640, 350, 16]; // 0x0F
Video.aModeParms[Video.MODE.EGA_640X350] = [640, 350, 16]; // 0x10
Video.aModeParms[Video.MODE.VGA_640X480_MONO] = [640, 480, 16]; // 0x11
Video.aModeParms[Video.MODE.VGA_640X480] = [640, 480, 16]; // 0x12
Video.aModeParms[Video.MODE.VGA_320X200] = [320, 200, 16]; // 0x13
Video.aModeParms[Video.MODE.CGA_40X25_BW] = Video.aModeParms[Video.MODE.CGA_40X25]; // 0x01
Video.aModeParms[Video.MODE.CGA_80X25_BW] = Video.aModeParms[Video.MODE.CGA_80X25]; // 0x03
Video.aModeParms[Video.MODE.CGA_320X200_BW] = Video.aModeParms[Video.MODE.CGA_320X200]; // 0x05
/*
* MDA attribute byte definitions
*
* For MDA, only the following group of ATTR definitions are supported; any FGND/BGND value combinations
* outside this group will be treated as "normal" (ATTR_FGND_WHITE | ATTR_BGND_BLACK).
*
* NOTE: Assuming MDA.MODE.BLINK_ENABLE is set (which the ROM BIOS sets by default), ATTR_BGND_BLINK will
* cause the *foreground* element of the cell to blink, even though it is part of the *background* attribute bits.
*
* Regarding blink rate, characters are supposed to blink every 16 vertical frames, which amounts to .26667 blinks
* per second, assuming a 60Hz vertical refresh rate. So roughly every 267ms, we need to take care of any blinking
* characters. updateScreen() maintains a global count (cBlinkVisible) of blinking characters, to simplify the
* decision of when to redraw the screen.
*/
Video.ATTRS = {};
Video.ATTRS.FGND_BLACK = 0x00;
Video.ATTRS.FGND_ULINE = 0x01;
Video.ATTRS.FGND_WHITE = 0x07;
Video.ATTRS.FGND_BRIGHT = 0x08;
Video.ATTRS.BGND_BLACK = 0x00;
Video.ATTRS.BGND_WHITE = 0x70;
Video.ATTRS.BGND_BLINK = 0x80;
Video.ATTRS.BGND_BRIGHT = 0x80;
Video.ATTRS.DRAW_FGND = 0x100; // this is an internal attribute bit, indicating the foreground should be drawn
Video.ATTRS.DRAW_CURSOR = 0x200; // this is an internal attribute bit, indicating when the cursor should be drawn
/*
* Here's a "cheat sheet" for attribute byte combinations that the IBM MDA could have supported. The original (Aug 1981)
* IBM Tech Ref is very terse and implies that only those marked with * are actually supported.
*
* *0x00: non-display ATTR_FGND_BLACK | ATTR_BGND_BLACK
* *0x01: underline ATTR_FGND_ULINE | ATTR_BGND_BLACK
* *0x07: normal (white on black) ATTR_FGND_WHITE | ATTR_BGND_BLACK
* **0x09: bright underline ATTR_FGND_ULINE | ATTR_FGND_BRIGHT | ATTR_BGND_BLACK
* **0x0F: bold (bright white on black) ATTR_FGND_WHITE | ATTR_FGND_BRIGHT | ATTR_BGND_BLACK
* *0x70: reverse (black on white) ATTR_FGND_BLACK | | ATTR_BGND_WHITE
* 0x81: blinking underline ATTR_FGND_ULINE | | ATTR_BGND_BLINK (or dim background if blink disabled)
* **0x87: blinking normal ATTR_FGND_WHITE | | ATTR_BGND_BLINK (or dim background if blink disabled)
* 0x89: blinking bright underline ATTR_FGND_ULINE | ATTR_FGND_BRIGHT | ATTR_BGND_BLINK (or dim background if blink disabled)
* **0x8F: blinking bold ATTR_FGND_WHITE | ATTR_FGND_BRIGHT | ATTR_BGND_BLINK (or dim background if blink disabled)
* **0xF0: blinking reverse ATTR_FGND_WHITE | ATTR_FGND_BRIGHT | ATTR_BGND_BLINK (or bright background if blink disabled)
*
* Unsupported attributes reportedly display as "normal" (ATTR_FGND_WHITE | ATTR_BGND_BLACK). However, precisely which
* attributes are unsupported on the MDA varies depending on the source. Some sources (eg, the IBM Tech Ref) imply that
* only those marked by * are supported, while others (eg, some--but not all--Peter Norton guides) include those marked
* by **, and still others include ALL the combinations listed above.
*
* Furthermore, according to http://www.seasip.info/VintagePC/mda.html:
*
* Attributes 0x00, 0x08, 0x80 and 0x88 display as black space;
* Attribute 0x78 displays as dark green on green; depending on the monitor, there may be a green "halo" where the dark and bright bits meet;
* Attribute 0xF0 displays as a blinking version of 0x70 if blink enabled, and black on bright green otherwise;
* Attribute 0xF8 displays as a blinking version of 0x78 if blink enabled, and as dark green on bright green otherwise.
*
* However, I'm rather skeptical about supporting 0x78 and 0xF8, until I see some evidence that "bright black" actually
* produced dark green on IBM equipment; it also doesn't sound like a combination many people would have used. I'll probably
* treat all of 0x08, 0x80 and 0x88 the same as 0x00, only because it seems logical (they're all "black on black" combinations
* with only BRIGHT and/or BLINK bits set). Beyond that, I'll likely treat any other combination not listed in the above cheat
* sheet as "normal".
*
* All the discrepancies/disagreements I've found are probably due in part to the proliferation of IBM and non-IBM MDA
* cards, combined with IBM and non-IBM monochrome monitors, and people assuming that their non-IBM card and/or monitor
* behaved exactly like the original IBM equipment, which probably wasn't true in all cases.
*
* I would like to limit my MDA display support to EXACTLY everything that the IBM MDA supported and nothing more, but
* since there will be combinations that will logically "fall out" unless I specifically exclude them, it's very likely
* this implementation will end up being a superset.
*/
/*
* CGA attribute byte definitions; these simply extend the set of MDA attributes, with the exception of ATTR_FNGD_ULINE,
* which the CGA can treat only as ATTR_FGND_BLUE.
*/
Video.ATTRS.FGND_BLUE = 0x01;
Video.ATTRS.FGND_GREEN = 0x02;
Video.ATTRS.FGND_CYAN = 0x03;
Video.ATTRS.FGND_RED = 0x04;
Video.ATTRS.FGND_MAGENTA = 0x05;
Video.ATTRS.FGND_BROWN = 0x06;
Video.ATTRS.BGND_BLUE = 0x10;
Video.ATTRS.BGND_GREEN = 0x20;
Video.ATTRS.BGND_CYAN = 0x30;
Video.ATTRS.BGND_RED = 0x40;
Video.ATTRS.BGND_MAGENTA = 0x50;
Video.ATTRS.BGND_BROWN = 0x60;
/* For the MDA, the length of aMDAColors is 5, based on the following supported FGND attribute values:
*
* 0x0: black font (attribute value 0x8 is mapped to 0x0)
* 0x1: green font with underline
* 0x7: green font without underline (attribute values 0x2-0x6 are mapped to 0x7)
* 0x9: bright green font with underline
* 0xf: bright green font without underline (attribute values 0xa-0xe are mapped to 0xf)
*
* I'm still not sure about 0x8 (dark green?); for now, I'm mapping it to 0x0, but it may become a 6th supported color.
*/
Video.aMDAColors = new Array(5);
Video.aMDAColors[0] = [0x00, 0x00, 0x00, 0xff];
Video.aMDAColors[1] = [0x7f, 0xc0, 0x7f, 0xff];
Video.aMDAColors[2] = [0x7f, 0xc0, 0x7f, 0xff];
Video.aMDAColors[3] = [0x7f, 0xff, 0x7f, 0xff];
Video.aMDAColors[4] = [0x7f, 0xff, 0x7f, 0xff];
Video.aMDAColorMap = [0x0, 0x1, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x0, 0x3, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4];
Video.aCGAColors = new Array(16);
Video.aCGAColors[0] = [0x00, 0x00, 0x00, 0xff]; // ATTR_FGND_BLACK
Video.aCGAColors[1] = [0x00, 0x00, 0xaa, 0xff]; // ATTR_FGND_BLUE
Video.aCGAColors[2] = [0x00, 0xaa, 0x00, 0xff]; // ATTR_FGND_GREEN
Video.aCGAColors[3] = [0x00, 0xaa, 0xaa, 0xff]; // ATTR_FGND_CYAN
Video.aCGAColors[4] = [0xaa, 0x00, 0x00, 0xff]; // ATTR_FGND_RED
Video.aCGAColors[5] = [0xaa, 0x00, 0xaa, 0xff]; // ATTR_FGND_MAGENTA
Video.aCGAColors[6] = [0xaa, 0x55, 0x00, 0xff]; // ATTR_FGND_BROWN
Video.aCGAColors[7] = [0xaa, 0xaa, 0xaa, 0xff]; // ATTR_FGND_WHITE (aka light gray)
Video.aCGAColors[8] = [0x55, 0x55, 0x55, 0xff]; // ATTR_FGND_BLACK | ATTR_FGND_BRIGHT (aka gray)
Video.aCGAColors[9] = [0x55, 0x55, 0xff, 0xff]; // ATTR_FGND_BLUE | ATTR_FGND_BRIGHT
Video.aCGAColors[10] = [0x55, 0xff, 0x55, 0xff]; // ATTR_FGND_GREEN | ATTR_FGND_BRIGHT
Video.aCGAColors[11] = [0x55, 0xff, 0xff, 0xff]; // ATTR_FGND_CYAN | ATTR_FGND_BRIGHT
Video.aCGAColors[12] = [0xff, 0x55, 0x55, 0xff]; // ATTR_FGND_RED | ATTR_FGND_BRIGHT
Video.aCGAColors[13] = [0xff, 0x55, 0xff, 0xff]; // ATTR_FGND_MAGENTA | ATTR_FGND_BRIGHT
Video.aCGAColors[14] = [0xff, 0xff, 0x55, 0xff]; // ATTR_FGND_BROWN | ATTR_FGND_BRIGHT (aka yellow)
Video.aCGAColors[15] = [0xff, 0xff, 0xff, 0xff]; // ATTR_FGND_WHITE | ATTR_FGND_BRIGHT (aka white)
Video.aCGAColorSet1 = [Video.ATTRS.FGND_GREEN, Video.ATTRS.FGND_RED, Video.ATTRS.FGND_BROWN];
Video.aCGAColorSet2 = [Video.ATTRS.FGND_CYAN, Video.ATTRS.FGND_MAGENTA, Video.ATTRS.FGND_WHITE];
/*
* Here is the EGA BIOS default ATC palette register set for color text modes, from which getCardColors()
* builds a default RGB array, similar to aCGAColors above.
*/
Video.aEGAPalDef = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F];
Video.aEGAByteToDW = [
0x00000000, 0x000000ff, 0x0000ff00, 0x0000ffff,
0x00ff0000, 0x00ff00ff, 0x00ffff00, 0x00ffffff,
0xff000000|0, 0xff0000ff|0, 0xff00ff00|0, 0xff00ffff|0,
0xffff0000|0, 0xffff00ff|0, 0xffffff00|0, 0xffffffff|0
];
Video.aEGADWToByte = [];
Video.aEGADWToByte[0x00000000] = 0x0;
Video.aEGADWToByte[0x00000080] = 0x1;
Video.aEGADWToByte[0x00008000] = 0x2;
Video.aEGADWToByte[0x00008080] = 0x3;
Video.aEGADWToByte[0x00800000] = 0x4;
Video.aEGADWToByte[0x00800080] = 0x5;
Video.aEGADWToByte[0x00808000] = 0x6;
Video.aEGADWToByte[0x00808080] = 0x7;
Video.aEGADWToByte[0x80000000|0] = 0x8;
Video.aEGADWToByte[0x80000080|0] = 0x9;
Video.aEGADWToByte[0x80008000|0] = 0xa;
Video.aEGADWToByte[0x80008080|0] = 0xb;
Video.aEGADWToByte[0x80800000|0] = 0xc;
Video.aEGADWToByte[0x80800080|0] = 0xd;
Video.aEGADWToByte[0x80808000|0] = 0xe;
Video.aEGADWToByte[0x80808080|0] = 0xf;
/**
* Card(video, iCard, data, cbMemory)
*
* Creates an object representing an initial video card state;
* can also restore a video card from state data created by saveCard().
*
* WARNING: Since Card objects are low-level objects that have no UI requirements,
* they do not inherit from the Component class, so you should only use class methods
* of Component, such as Component.assert(), or methods of the parent (video) object.
*
* @constructor
* @param {Video} [video]
* @param {number} [iCard] (see Video.CARD.*)
* @param {Array|null} [data]
* @param {number} [cbMemory] is specified if the card must allocate its own memory buffer
*/
function Card(video, iCard, data, cbMemory)
{
/*
* If a card was originally not present (eg, EGA), then the state will be empty,
* so we need to detect that case and continue indicating that the card is not present.
*/
if (iCard !== undefined && (!data || data.length)) {
this.video = video;
var specs = Video.cardSpecs[iCard];
var nMonitorType = video.nMonitorType || specs[5];
if (!data || data.length < 6) {
data = [false, 0, null, null, 0, new Array(iCard < Video.CARD.EGA? Card.CRTC.TOTAL_REGS : Card.CRTC.EGA.TOTAL_REGS)];
}
/*
* If a Debugger is present, we want to stash a bit more info in each Card.
*/
if (DEBUGGER) {
this.dbg = video.dbg;
this.type = specs[0];
this.port = specs[1];
}
this.nCard = iCard;
this.addrBuffer = specs[2]; // default (physical) video buffer address
this.sizeBuffer = specs[3]; // default video buffer length (this is the total size, not the current visible size; this.cbScreen is calculated on the fly to reflect the latter)
/*
* If no memory size is specified, then setMode() will use addMemory() to automatically add enough
* memory blocks to cover the video buffer specified above; otherwise, it instructs addMemory() to call
* getMemoryBuffer(), which will return a portion of the buffer (adwMemory) allocated below. This allows
* a card like the EGA to move/resize its video buffer as needed, as well as giving it total control over
* the underlying memory.
*/
this.cbMemory = cbMemory || specs[4];
/*
* All of our cardSpec video buffer sizes are based on the default text mode (eg, 4Kb for an MDA, 16Kb for
* a CGA), but for a card with 64Kb or more of memory (ie, any EGA card), the default text mode video buffer
* size should be dynamically recalculated as the smaller of: cbMemory divided by 4, or 32Kb.
*/
if (this.cbMemory >= 0x10000 && this.addrBuffer >= 0xB0000) {
this.sizeBuffer = Math.min(this.cbMemory >> 2, 0x8000);
}
this.fActive = data[0];
this.regMode = data[1]; // see MDA.MODE* or CGA.MODE_* (use (MDA.MODE.HIRES | MDA.MODE.VIDEO_ENABLE | MDA.MODE.BLINK_ENABLE) if you want to test blinking immediately after the initial power-on reset)
this.regColor = data[2]; // see CGA.COLOR.* (undefined on MDA)
this.regStatus = data[3]; // see MDA.STATUS.* or CGA.STATUS.*
this.regCRTIndx = data[4] & 0xff;
this.regCRTPrev = (data[4] >> 8) & 0xff;
this.regCRTData = data[5];
this.nCRTCRegs = Card.CRTC.TOTAL_REGS;
this.asCRTCRegs = DEBUGGER? Card.CRTC.REGS : [];
if (iCard >= Video.CARD.EGA) {
this.nCRTCRegs = Card.CRTC.EGA.TOTAL_REGS;
this.asCRTCRegs = DEBUGGER? Card.CRTC.EGA_REGS : [];
this.initEGA(data[6], nMonitorType);
}
var monitorSpecs = Video.monitorSpecs[nMonitorType] || Video.monitorSpecs[ChipSet.MONITOR.MONO];
var nCyclesPerSecond = video.cpu.getCyclesPerSecond(); // eg, 4772727
this.nCyclesHorzPeriod = (nCyclesPerSecond / monitorSpecs.nHorzPeriodsPerSec) | 0;
this.nCyclesHorzActive = (this.nCyclesHorzPeriod * monitorSpecs.percentHorzActive / 100) | 0;
this.nCyclesVertPeriod = this.nCyclesHorzPeriod * monitorSpecs.nHorzPeriodsPerFrame;
this.nCyclesVertActive = (this.nCyclesVertPeriod * monitorSpecs.percentVertActive / 100) | 0;
this.nInitCycles = (data[7] == null? 0 : data[7]);
}
}
/*
* MDA Registers (ports 0x3B4, 0x3B5, 0x3B8, and 0x3BA)
*/
Card.MDA = {
CRTC: {
INDX: {
PORT: 0x3B4, // NOTE: the low byte of this port address (0xB4) is mirrored at 40:0063 (0x0463)
MASK: 0x1F
},
DATA: {
PORT: 0x3B5
}
},
MODE: {
PORT: 0x3B8, // Mode Select Register, aka CRT Control Port 1 (write-only); the BIOS mirrors this register at 40:0065 (0x0465)
HIRES: 0x01,
VIDEO_ENABLE: 0x08,
BLINK_ENABLE: 0x20
},
STATUS: {
PORT: 0x3BA,
HDRIVE: 0x01,
BWVIDEO: 0x08
},
/*
* TODO: Add support for parallel port(s) someday....
*/
PRT_DATA: {
PORT: 0x3BC
},
PRT_STATUS: {
PORT: 0x3BD
},
PRT_CTRL: {
PORT: 0x3BE
}
};
/*
* CGA Registers (ports 0x3D4, 0x3D5, 0x3D8, 0x3D9, and 0x3DA)
*/
Card.CGA = {
CRTC: {
INDX: {
PORT: 0x3D4, // NOTE: the low byte of this port address (0xB4) is mirrored at 40:0063 (0x0463)
MASK: 0x1F
},
DATA: {
PORT: 0x3D5
}
},
MODE: {
PORT: 0x3D8, // Mode Select Register (write-only); the BIOS mirrors this register at 40:0065 (0x0465)
_80X25: 0x01,
GRAPHIC_SEL: 0x02,
BW_SEL: 0x04,
VIDEO_ENABLE: 0x08, // same as MDA.MODE.VIDEO_ENABLE
HIRES_BW: 0x10,
BLINK_ENABLE: 0x20 // same as MDA.MODE.BLINK_ENABLE
},
COLOR: {
PORT: 0x3D9, // write-only
BORDER: 0x07,
BRIGHT: 0x08,
BGND_ALT: 0x10, // alternate, intensified background colors in text mode
COLORSET2: 0x20 // selects aCGAColorSet2 colors for 320x200 graphics mode; aCGAColorSet1 otherwise
},
STATUS: {
PORT: 0x3DA, // read-only; same for EGA (although the EGA calls this STATUS1, to distinguish it from STATUS0)
DISP_RETRACE: 0x01,
PEN_TRIGGER: 0x02,
PEN_ON: 0x04,
VERT_RETRACE: 0x08 // when set, this indicates the CGA is performing a vertical retrace
},
/*
* TODO: Add support for light pen port(s) someday....
*/
CLEAR_PEN: {
PORT: 0x3DB
},
PRESET_PEN: {
PORT: 0x3DC
}
};
/*
* Common CRT hardware registers (ports 0x3B4/0x3B5 or 0x3D4/0x3D5)
*
* NOTE: In this implementation, because we have to make at least two of the registers readable (CURSOR_ADDR_HI and CURSOR_ADDR_LO),
* we end up making ALL the registers readable, otherwise we would have to explicitly block any register marked write-only. I don't
* think making the CRT registers fully readable presents any serious compatibility issues, and it actually offers some benefits
* (eg, improved debugging).
*
* However, some things are broken: the (readable) light pen registers on the EGA are overloaded as (writable) vertical retrace
* registers, so the vertical retrace registers cannot actually be read that way. I'm sure the VGA solved that problem, but I haven't
* looked into it yet.
*/
Card.CRTC = {
HORZ_TOTAL: 0x00,
HORZ_DISP: 0x01,
HORZ_SYNC_POS: 0x02,
HORZ_SYNC_WIDTH: 0x03,
VERT_TOTAL: 0x04,
VERT_TOTAL_ADJ: 0x05,
VERT_DISP_TOTAL: 0x06,
VERT_SYNC_POS: 0x07,
INTERLACE_POS: 0x08,
MAX_SCAN_LINE: 0x09,
CURSOR_START: {
INDX: 0x0A,
MASK: 0x1F,
/*
* I don't entirely understand these cursor blink control bits. Here's what the MC6845 datasheet says:
*
* Bit 5 is the blink timing control. When bit 5 is low, the blink frequency is 1/16 of the vertical field rate,
* and when bit 5 is high, the blink frequency is 1/32 of the vertical field rate. Bit 6 is used to enable a blink.
*/
BLINKON: 0x00, // (supposedly, 0x04 has the same effect as 0x00)
BLINKOFF: 0x20, // if blinking is disabled, the cursor is effectively hidden
BLINKFAST: 0x60 // default is 1/16 of the frame rate; this switches to 1/32 of the frame rate
},
CURSOR_END: {
INDX: 0x0B,
MASK: 0x1F
},
START_ADDR_HI: 0x0C,
START_ADDR_LO: 0x0D,
CURSOR_ADDR_HI: 0x0E,
CURSOR_ADDR_LO: 0x0F,
LIGHT_PEN_HI: 0x10,
LIGHT_PEN_LO: 0x11,
TOTAL_REGS: 0x12, // total CRT registers on MDA/CGA
EGA: {
HORZ_DISP_END: 0x01,
HORZ_BLANK_START: 0x02,
HORZ_BLANK_END: 0x03,
HORZ_RETRACE_START: 0x04,
HORZ_RETRACE_END: 0x05,
VERT_TOTAL: 0x06,
OVERFLOW: {
INDX: 0x07,
VERT_TOTAL_BIT8: 0x01, // bit 8 of register 0x06
VERT_DISP_END_BIT8: 0x02, // bit 8 of register 0x12
VERT_RETRACE_START_BIT8:0x04, // bit 8 of register 0x10
VERT_BLANK_START_BIT8: 0x08, // bit 8 of register 0x15
LINE_COMPARE_BIT8: 0x10, // bit 8 of register 0x18
CURSOR_START_BIT8: 0x20, // bit 8 of register 0x0A (EGA only)
VERT_TOTAL_BIT9: 0x20, // bit 9 of register 0x06 (VGA only)
VERT_DISP_END_BIT9: 0x40, // bit 9 of register 0x12 (VGA only, unused on EGA)
VERT_RETRACE_START_BIT9:0x80 // bit 9 of register 0x10 (VGA only, unused on EGA)
},
PRESET_ROW_SCAN: 0x08,
/* EGA/VGA CRTC registers 0x09-0x0F are the same as the MDA/CGA CRTC registers defined above */
VERT_RETRACE_START: 0x10,
VERT_RETRACE_END: 0x11,
VERT_DISP_END: 0x12,
/*
* The OFFSET register (bits 0-7) specifies the logical line width of the screen. The starting memory address
* for the next character row is larger than the current character row by two or four times this amount.
* The OFFSET register is programmed with a word address. Depending on the method of clocking the CRT Controller,
* this word address is [effectively] either a word or doubleword address. #IBMVGATechRef
*/
OFFSET: 0x13,
UNDERLINE: 0x14,
VERT_BLANK_START: 0x15,
VERT_BLANK_END: 0x16,
MODE_CTRL: {
INDX: 0x17,
CMS: 0x01, // Compatibility Mode Support (CGA A13 control)
SRSC: 0x02, // Select Row Scan Counter
HRS: 0x04, // Horizontal Retrace Select
CBT: 0x08, // Count By Two
OC: 0x10, // Output Control
AW: 0x20, // Address Wrap (in Word mode, 1 maps A15 to A0 and 0 maps A13; use the latter when only 64Kb is installed)
BM: 0x40, // Byte Mode (1 selects Byte Mode; 0 selects Word Mode)
HR: 0x80 // Hardware Reset
},
LINE_COMPARE: 0x18,
TOTAL_REGS: 0x19 // total CRT registers on EGA/VGA
},
ADDR_HI_MASK: 0x3F
};
if (DEBUGGER) {
Card.CRTC.REGS = ["HORZ_TOTAL","HORZ_DISP","HORZ_SYNC_POS","HORZ_SYNC_WIDTH","VERT_TOTAL","VERT_TOTAL_ADJ",
"VERT_DISP","VERT_SYNC_POS","INTERLACE_POS","MAX_SCAN_LINE","CURSOR_START","CURSOR_END",
"START_ADDR_HI","START_ADDR_LO","CURSOR_ADDR_HI","CURSOR_ADDR_LO","LIGHT_PEN_HI","LIGHT_PEN_LO"];
Card.CRTC.EGA_REGS = ["HORZ_TOTAL","HORZ_DISP_END","HORZ_BLANK_START","HORZ_BLANK_END","HORZ_RETRACE_START","HORZ_RETRACE_END",
"VERT_TOTAL","OVERFLOW","PRESET_ROW_SCAN","MAX_SCAN_LINE","CURSOR_START","CURSOR_END",
"START_ADDR_HI","START_ADDR_LO","CURSOR_ADDR_HI","CURSOR_ADDR_LO","VERT_RETRACE_START","VERT_RETRACE_END",
"VERT_DISP_END","OFFSET","UNDERLINE","VERT_BLANK_START","VERT_BLANK_END","MODE_CTRL","LINE_COMPARE"];
}
/*
* EGA/VGA Input Status 1 Register (port 0x3DA)
*
* STATUS1 bit 0 has confusing documentation: the EGA Tech Ref says "Logical 0 indicates the CRT raster is in a
* horizontal or vertical retrace interval", whereas the VGA Tech Ref says "Logical 1 indicates a horizontal or
* vertical retrace interval," but then clarifies: "This bit is the real-time status of the INVERTED display enable
* signal". So, instead of calling bit 0 DISP_ENABLE (or more precisely, DISP_ENABLE_INVERTED), it's simply DISP_RETRACE.
*
* STATUS1 diagnostic bits 5 and 4 are set according to the Card.ATC.PLANES.MUX bits:
*
* MUX Bit 5 Bit 4
* --- ---- ----
* 00: Red Blue
* 01: SecBlue Green
* 10: SecRed SecGreen
* 11: unused unused
*/
Card.STATUS1 = {
PORT: 0x3DA,
DISP_RETRACE: 0x01, // bit 0: logical OR of horizontal and vertical retrace
VERT_RETRACE: 0x08, // bit 3: set during vertical retrace interval
DIAGNOSTIC: 0x30, // bits 5,4 are controlled by the Card.ATC.PLANES.MUX bits
RESERVED: 0xC6
};
/*
* EGA/VGA Attribute Controller Registers (port 0x3C0: regATCIndx and regATCData)
*
* The current ATC INDX value is stored in cardEGA.regATCIndx (including the Card.ATC.INDX_ENABLE bit), and the
* ATC DATA values are stored in cardEGA.regATCData. The state of the ATC INDX/DATA flip-flop is stored in fATCData.
*
* Note that the ATC palette registers (0x0-0xf) all use the following 6 bit assignments, with bits 6 and 7 unused:
*
* 0: Blue
* 1: Green
* 2: Red
* 3: SecBlue (or mono video)
* 4: SecGreen (or intensity)
* 5: SecRed
*/
Card.ATC = {
PORT: 0x3C0, // ATC Index/Data Port
INDX_MASK: 0x1F,
INDX_PAL_ENABLE: 0x20, // must be clear when loading palette registers
PALETTE: {
INDX: 0x00, // 16 registers: 0x00 - 0x0F
BLUE: 0x01,
GREEN: 0x02,
RED: 0x04,
SECBLUE: 0x08,
BRIGHT: 0x10, // NOTE: The IBM EGA manual (p.56) also calls this the "intensity" bit
SECGREEN: 0x10,
SECRED: 0x20
},
PALETTE_REGS: 0x10, // 16 total palette registers
MODE: {
INDX: 0x10, // ATC Mode Control Register
GRAPHICS: 0x01, // bit 0: set for graphics mode, clear for alphanumeric mode
MONOEM: 0x02, // bit 1: set for monochrome emulation mode, clear for color emulation
TEXTGRCC: 0x04, // bit 2: set for line graphics in character codes 0xC0-0xDF, clear otherwise
TEXTBLINK: 0x08, // bit 3: set for text blink attribute, clear for background intensity attribute
RESERVED: 0x10, // bit 4: reserved
PANCOMPAT: 0x20, // bit 5: set for PEL panning compatibility
PELWIDTH: 0x40, // bit 6: set for 256-color modes, clear for all other modes
COLORSEL: 0x80 // bit 7: set for P5,P4 mapped to bits 1,0 of the Color Select register
},
OVERSCAN: {
INDX: 0x11 // ATC Overscan Color Register
},
PLANES: {
INDX: 0x12, // ATC Color Plane Enable Register
MASK: 0x0F,
MUX: 0x30,
RESERVED: 0xC0
},
HORZPAN: {
INDX: 0x13, // ATC Horizontal PEL Panning Register
SHIFT_LEFT: 0x0F // bits 0-3 indicate # of PELs to shift left
},
COLORSEL: {
INDX: 0x14, // ATC Color Select Register (VGA only)
S_COLOR_7: 0x08, // selects bit 7 of 8-bit color values sent to DAC (except 256-color modes)
S_COLOR_6: 0x04, // selects bit 6 of 8-bit color values sent to DAC (except 256-color modes)
S_COLOR_5: 0x02, // selects bit 5 of 8-bit color values sent to DAC
S_COLOR_4: 0x01 // selects bit 4 of 8-bit color values sent to DAC
},
TOTAL_REGS: 0x14
};
if (DEBUGGER) {
Card.ATC.REGS = ["PAL00","PAL01","PAL02","PAL03","PAL04","PAL05","PAL06","PAL07",
"PAL08","PAL09","PAL0A","PAL0B","PAL0C","PAL0D","PAL0E","PAL0F",
"MODE","OVERSCAN","PLANES","HORZPAN"];
}
/*
* EGA/VGA Feature Control Register (port 0x3BA or 0x3DA: regFeat)
*
* The EGA BIOS writes 0x1 to Card.FEAT_CTRL.BITS and reads Card.STATUS0.FEAT, then writes 0x2 to
* Card.FEAT_CTRL.BITS and reads Card.STATUS0.FEAT. The bits from the first and second reads are shifted
* into the high nibble of the byte at 40:88h.
*/
Card.FEAT_CTRL = {
PORT_MONO: 0x3BA, // write port address (other than the two bits below, the rest are reserved and/or unused)
PORT_COLOR: 0x3DA, // write port address (other than the two bits below, the rest are reserved and/or unused)
PORT_READ: 0x3CA, // read port address (VGA only)
BITS: 0x03 // feature control bits
};
/*
* EGA/VGA Miscellaneous Output Register (port 0x3C2: regMisc)
*/
Card.MISC = {
PORT_WRITE: 0x3C2, // write port address (EGA and VGA)
PORT_READ: 0x3CC, // read port addresss (VGA only)
IO_SELECT: 0x01, // 0 sets CRT ports to 0x3Bn, 1 sets CRT ports to 0x3Dn
ENABLE_RAM: 0x02, // 0 disables video RAM, 1 enables
CLOCK_SELECT: 0x0C, // 0x0: 14Mhz I/O clock, 0x4: 16Mhz on-board clock, 0x8: external clock, 0xC: unused
DISABLE_DRV: 0x10, // 0 activates internal video drivers, 1 activates feature connector direct drive outputs
PAGE_ODD_EVEN: 0x20, // 0 selects the low 64Kb page of video RAM for text modes, 1 selects the high page
HORZ_POLARITY: 0x40, // 0 selects positive horizontal retrace
VERT_POLARITY: 0x80 // 0 selects positive vertical retrace
};
/*
* EGA/VGA Input Status 0 Register (port 0x3C2: regStatus0)
*/
Card.STATUS0 = {
PORT: 0x3C2, // read-only (aka STATUS0, to distinguish it from PORT_CGA_STATUS)
RESERVED: 0x0F,
SWSENSE: 0x10,
SWSENSE_SHIFT: 4,
FEAT: 0x60, // VGA: reserved
INTERRUPT: 0x80 // 1: video is being displayed; 0: vertical retrace is occurring
};
/*
* VGA Subsystem Enable Register (port 0x3C3: regVGAEnable)
*/
Card.VGA_ENABLE = {
PORT: 0x3C3,
ENABLED: 0x01, // when set, all VGA I/O and memory decoding is enabled; otherwise disabled (TODO: Implement)
RESERVED: 0xFE
};
/*
* EGA/VGA Sequencer Registers (ports 0x3C4/0x3C5: regSEQIndx and regSEQData)
*/
Card.SEQ = {
INDX: {
PORT: 0x3C4, // Sequencer Index Port
MASK: 0x07
},
DATA: {
PORT: 0x3C5 // Sequencer Data Port
},
RESET: {
INDX: 0x00, // Sequencer Reset Register
ASYNC: 0x01,
SYNC: 0x02
},
CLOCKING: {
INDX: 0x01, // Sequencer Clocking Mode Register
DOTS8: 0x01, // 1: 8 dots; 0: 9 dots
BANDWIDTH: 0x02, // 0: CRTC has access 4 out of every 5 cycles (for high-res modes); 1: CRTC has access 2 out of 5 (VGA: reserved)
SHIFTLOAD: 0x04,
DOTCLOCK: 0x08, // 0: normal dot clock; 1: master clock divided by two (used for 320x200 modes: 0, 1, 4, 5, and D)
SHIFT4: 0x10, // VGA only
SCREEN_OFF: 0x20, // VGA only
RESERVED: 0xC0
},
MAPMASK: {
INDX: 0x02, // Sequencer Map Mask Register
PL0: 0x01,
PL1: 0x02,
PL2: 0x04,
PL3: 0x08,
MAPS: 0x0F,
RESERVED: 0xF0
},
CHARMAP: {
INDX: 0x03, // Sequencer Character Map Select Register
SELB: 0x03, // 0x0: 1st 8Kb of plane 2; 0x1: 2nd 8Kb; 0x2: 3rd 8Kb; 0x3: 4th 8Kb
SELA: 0x0C, // 0x0: 1st 8Kb of plane 2; 0x4: 2nd 8Kb; 0x8: 3rd 8Kb; 0xC: 4th 8Kb
SELB_HIGH: 0x10, // VGA only
SELA_HIGH: 0x20 // VGA only
},
MEMMODE: {
INDX: 0x04, // Sequencer Memory Mode Register
ALPHA: 0x01, // set for alphanumeric (A/N) mode, clear for graphics (APA or "All Points Addressable") mode (EGA only)
EXT: 0x02, // set if memory expansion installed, clear if not installed
SEQUENTIAL: 0x04, // set for sequential memory access, clear for mapping even addresses to planes 0/2, odd addresses to planes 1/3
CHAIN4: 0x08 // VGA only: set to select memory map (plane) based on low 2 bits of address
},
TOTAL_REGS: 0x05
};
if (DEBUGGER) Card.SEQ.REGS = ["RESET","CLOCKING","MAPMASK","CHARMAP","MEMMODE"];
/*
* VGA Digital-to-Analog Converter (DAC) Registers (regDACMask, regDACState, regDACAddr, and regDACData)
*
* To write PEL data, write an address to DAC.ADDR.PORT_WRITE, then write 3 bytes to DAC.DATA.PORT; the low 6 bits
* of each byte will be concatenated to form an 18-bit DAC value (red is least significant, followed by green, then blue).
* When the final byte is received, the 18-bit DAC value is updated and regDACAddr is auto-incremented.
*
* To read PEL data, the process is similar, but the initial address is written to DAC.ADDR.PORT_READ instead.
*
* DAC.STATE.PORT and DAC.ADDR.PORT_WRITE can be read at any time and will not interfere with a read or write operation
* in progress. To prevent "snow", reading or writing DAC values should be limited to retrace intervals (see regStatus1),
* or by using the SCREEN_OFF bit in the SEQ.CLOCKING register.
*/
Card.DAC = {
MASK: {
PORT: 0x3C6, // initialized to 0xFF and should not be changed
DEFAULT: 0xFF
},
STATE: {
PORT: 0x3C7,
MODE_WRITE: 0x00, // the DAC is in write mode if bits 0 and 1 are clear
MODE_READ: 0x03 // the DAC is in read mode if bits 0 and 1 are set
},
ADDR: {
PORT_READ: 0x3C7, // write to initiate a read
PORT_WRITE: 0x3C8 // write to initiate a write; read to determine the current ADDR
},
DATA: {
PORT: 0x3C9
},
TOTAL_REGS: 0x100
};
/*
* EGA/VGA Graphics Controller Registers (ports 0x3CE/0x3CF: regGRCIndx and regGRCData)
*
* The VGA added Write Mode 3, which is described as follows:
*
* "Each map is written with 8 bits of the value contained in the Set/Reset register for that map
* (the Enable Set/Reset register has no effect). Rotated system microprocessor data is ANDed with the
* Bit Mask register data to form an 8-bit value that performs the same function as the Bit Mask register
* does in write modes 0 and 2."
*/
Card.GRC = {
POS1_PORT: 0x3CC, // EGA only, write-only
POS2_PORT: 0x3CA, // EGA only, write-only
INDX: {
PORT: 0x3CE, // GRC Index Port
MASK: 0x0F
},
DATA: {
PORT: 0x3CF // GRC Data Port
},
SRESET: {
INDX: 0x00 // GRC Set/Reset Register (write-only; each bit used only if WRITE_MODE is 0 and corresponding ESR bit set)
},
ESRESET: {
INDX: 0x01 // GRC Enable Set/Reset Register
},
COLORCMP: {
INDX: 0x02 // GRC Color Compare Register
},
DATAROT: {
INDX: 0x03, // GRC Data Rotate Register
COUNT: 0x07,
AND: 0x08,
OR: 0x10,
XOR: 0x18,
FUNC: 0x18,
MASK: 0x1F
},
READMAP: {
INDX: 0x04, // GRC Read Map Select Register
NUM: 0x03
},
MODE: {
INDX: 0x05, // GRC Mode Register
WRITE_MODE0: 0x00, // write mode 0x0: each plane written with CPU data, rotated as needed, unless SR enabled
WRITE_MODE1: 0x01, // write mode 0x1: each plane written with contents of the processor latches (loaded by a read)
WRITE_MODE2: 0x02, // write mode 0x2: memory plane N is written with 8 bits matching data bit N
WRITE_MODE3: 0x03, // write mode 0x3: VGA only
WRITE: 0x03,
TEST: 0x04,
READ_MODE0: 0x00, // read mode 0x0: read map mode
READ_MODE1: 0x08, // read mode 0x1: color compare mode
EVENODD: 0x10,
SHIFT: 0x20,
COLOR256: 0x40 // VGA only
},
MISC: {
INDX: 0x06, // GRC Miscellaneous Register
GRAPHICS: 0x01, // set for graphics mode addressing, clear for text mode addressing
CHAIN: 0x02, // set for odd/even planes selected with odd/even values of the processor AO bit
MAPMEM: 0x0C, //
MAPA0128: 0x00, //
MAPA064: 0x04, //
MAPB032: 0x08, //
MAPB832: 0x0C //
},
COLORDC: {
INDX: 0x07 // GRC Color "Don't Care" Register
},
BITMASK: {
INDX: 0x08 // GRC Bit Mask Register
},
TOTAL_REGS: 0x09
};
if (DEBUGGER) Card.GRC.REGS = ["SRESET","ESRESET","COLORCMP","DATAROT","READMAP","MODE","MISC","COLORDC","BITMASK"];
/*
* EGA Memory Access Functions
*
* Here's where we define all the getMemoryAccess() functions that know how to deal with "planar" EGA memory,
* which consists of 32-bit values for every byte of address space, allowing us to internally store plane 0
* bytes in bits 0-7, plane 1 bytes in bits 8-15, plane 2 bytes in bits 16-23, and plane 3 bytes in bits 24-31.
*
* All our functions have slightly more overhead than the standard Bus memory access functions, because the
* offset (off) parameter is block-relative, which we must transform into a buffer-relative offset. Fortunately,
* all our Memory objects know this and have already recorded their buffer-relative offset in "this.offset".
*
* Also, the EGA includes a set of latches, one for each plane, which must be updated on most reads/writes;
* we rely on the Memory object's "this.controller" property to give us access to the Card's state.
*
* And we take a little extra time to conditionally set fDirty on writes, meaning if a write did not actually
* change the value of the memory, we will not set fDirty. The default write functions in memory.js don't take
* that performance hit, but here, it may be worthwhile, because if it results in fewer dirty blocks, display
* updates may be faster.
*
* Note that we don't have to worry about dealing with word accesses that straddle block boundaries, because
* the Bus component automatically breaks those accesses into separate byte requests. Similarly, byte and word
* values for the write functions have already been pre-masked by the Bus component to 8 and 16 bits, respectively.
*
* My motto: Be paranoid, but also be careful not to do any more work than you absolutely have to.
*
*
* CGA Emulation on the EGA
*
* Modes 4/5 (320x200 low-res graphics) emulate the same buffer format that the CGA uses. To recap: 1 byte contains
* 4 pixels (pixel 0 in bits 7-6, pixel 1 in bits 5-4, etc), and thus one row of pixels is 80 (0x50) bytes long.
* Moreover, all even rows are stored in the first 8K of the video buffer (at 0xB8000), and all odd rows are stored
* in the second 8K (at 0xBA000). Of each 8K, only 8000 (0x1F40) bytes are used (80 bytes X 100 rows); the remaining
* 192 bytes of each 8K are unused.
*
* For these modes, the EGA's GRC.MODE is programmed with 0x30: Card.GRC.MODE.EVENODD and Card.GRC.MODE.SHIFT.
* The latter claims to work by forming each 2-bit pixel with even bits from plane 0 and odd bits from plane 1;
* however, I'm unclear how that works if even bytes are only written to plane 0 and odd bytes are only written to
* plane 1, as Card.GRC.MODE.EVENODD implies, because plane 0 would never have any bits for the odd bytes, and
* plane 1 would never have any bits for the even bytes. TODO: Figure this out.
*
*
* Even/Odd Memory Access Functions
*
* The "EVENODD" functions deal with the EGA's default text-mode addressing, where EVEN addresses are mapped to
* plane 0 (and 2) and ODD addresses are mapped to plane 1 (and 3). This occurs when SEQ.MEMMODE.SEQUENTIAL
* is clear (and GRC.MODE.EVENODD is set), turning address bit 0 (A0) into a "plane select" bit. Whether A0 is
* also used as a memory address bit depends on CRTC.MODE_CTRL.BM: if it's set, then we're in "Byte Mode" and A0 is
* used as-is; if it's clear, then we're in "Word Mode", and either A15 (when CRTC.MODE_CTRL.AW is set) or A13
* (when CRTC.MODE_CTRL.AW is clear, typically when only 64Kb of EGA memory is installed) is substituted for A0.
*
* Note that A13 remains clear until addresses reach 8K, at which point we've spanned 32Kb of EGA memory, so it makes
* sense to propagate A13 to A0 at that point, so that the next 8K of addresses start using ODD instead of EVEN bytes,
* and no memory is wasted on a 64Kb EGA card.
*
* These functions, however, don't yet deal with all those subtleties: A0 is currently used only as a "plane select"
* bit and set to zero for addressing purposes, meaning that only the EVEN bytes in EGA memory will ever be used.
* TODO: Implement the subtleties.
*/
/*
* Values returned by getAccess(); the high byte describes the read mode, and the low byte describes the write mode.
*
* V2 should never appear in any values used by getAccess() or setAccess()/setMemoryAccess(); the sole purpose of V2 is
* to distinguish newer (V2) access values from older (V1) access values in saved contexts. It's set when the context
* is saved, and cleared when the context is restored. Thus, if V2 is not set on restore, we assume we're dealing with
* a V1 value, so we run it through the V1 table (below) to produce a V2 value. Hopefully at some point V1 contexts
* can be deprecated, and the V2 bit can be eliminated/repurposed.
*/
Card.ACCESS = {
READ: { // READ values are designed to be OR'ed with WRITE values
MODE0: 0x0400,
MODE1: 0x0500,
EVENODD: 0x1000,
MASK: 0xFF00
},
WRITE: { // and WRITE values are designed to be OR'ed with READ values
MODE0: 0x0000,
MODE1: 0x0001,
MODE2: 0x0002,
MODE3: 0x0003, // VGA only
EVENODD: 0x0010,
ROT: 0x0020,
AND: 0x0060,
OR: 0x00A0,
XOR: 0x00E0,
MASK: 0x00F7 // 0xF7 ensures we strip any lingering V2 bit from the value
},
V2: 0x0008 // this is a signature bit used ONLY to differentiate V2 access values from V1
};
/*
* Table of older (V1) access values and their corresponding new values; the new values are similar but a little
* more rational (for example, using common values for all the logical operations across modes).
*/
Card.ACCESS.V1 = [];
Card.ACCESS.V1[0x0002] = Card.ACCESS.READ.MODE0;
Card.ACCESS.V1[0x0003] = Card.ACCESS.READ.MODE0 | Card.ACCESS.READ.EVENODD;
Card.ACCESS.V1[0x0010] = Card.ACCESS.READ.MODE1;
Card.ACCESS.V1[0x0200] = Card.ACCESS.WRITE.MODE0;
Card.ACCESS.V1[0x0400] = Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.ROT;
Card.ACCESS.V1[0x0600] = Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.AND;
Card.ACCESS.V1[0x0A00] = Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.OR;
Card.ACCESS.V1[0x0E00] = Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.XOR;
Card.ACCESS.V1[0x0300] = Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.EVENODD;
Card.ACCESS.V1[0x1000] = Card.ACCESS.WRITE.MODE1;
Card.ACCESS.V1[0x2000] = Card.ACCESS.WRITE.MODE2;
Card.ACCESS.V1[0x6000] = Card.ACCESS.WRITE.MODE2 | Card.ACCESS.WRITE.AND;
Card.ACCESS.V1[0xA000] = Card.ACCESS.WRITE.MODE2 | Card.ACCESS.WRITE.OR;
Card.ACCESS.V1[0xE000] = Card.ACCESS.WRITE.MODE2 | Card.ACCESS.WRITE.XOR;
/**
* readByteMode0(off, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} [addr]
* @return {number}
*/
Card.ACCESS.readByteMode0 = function readByteMode0(off, addr)
{
off += this.offset;
var dw = this.controller.latches = this.adw[off];
return (dw >> this.controller.nReadMapShift) & 0xff;
};
/**
* readByteMode0EvenOdd(off, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} [addr]
* @return {number}
*/
Card.ACCESS.readByteMode0EvenOdd = function readByteMode0EvenOdd(off, addr)
{
/*
* TODO: As discussed in getAccess(), we need to run some tests on real EGA/VGA hardware to determine
* exactly what gets latched (ie, from which address) when EVENODD is in effect. Whatever we learn may
* also dictate a special EVENODD function for Read Mode 1 as well.
*/
off += this.offset;
var idw = off & ~0x1;
var dw = this.controller.latches = this.adw[idw];
return (!(off & 1)? dw : (dw >> 8)) & 0xff;
};
/**
* readByteMode1(off, addr)
*
* This mode requires us to step through each of the 8 sets of 4 bits in the specified DWORD of video memory,
* returning a 1 wherever all 4 match the Color Compare (COLORCMP) Register and a 0 otherwise. An added wrinkle
* is that the Color Don't Care (COLORDC) Register can specify that any/all/none of the 4 bits must be ignored.
*
* We perform the comparison from most to least significant bit, because that matches how the nColorCompare and
* nColorDontCare masks are initialized; we could have gone either way, but this is more consistent with the rest
* of the component (eg, pixels are drawn across the screen from left to right, starting with the most significant
* bit of each byte).
*
* Also note that, while not well-documented, this mode also affects the internal latches, so we make sure those
* are updated as well.
*
* @this {Memory}
* @param {number} off
* @param {number} [addr]
* @return {number}
*/
Card.ACCESS.readByteMode1 = function readByteMode1(off, addr)
{
off += this.offset;
var dw = this.controller.latches = this.adw[off];
/*
* Minor optimization: we could pre-mask nColorCompare with nColorDontCare, whenever either register is updated,
* but that's a drop in the bucket compared to all the other work this function must do.
*/
var mask = this.controller.nColorDontCare;
var color = this.controller.nColorCompare & mask;
var b = 0, bit = 0x80;
while (bit) {
if ((dw & mask) == color) b |= bit;
color >>>= 1; mask >>>= 1; bit >>= 1;
}
return b;
};
/**
* writeByteMode0(off, b, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
* @param {number} [addr]
*/
Card.ACCESS.writeByteMode0 = function writeByteMode0(off, b, addr)
{
var idw = off + this.offset;
var dw = b | (b << 8) | (b << 16) | (b << 24);
dw = (this.adw[idw] & ~this.controller.nWriteMapMask) | (dw & this.controller.nWriteMapMask);
dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
if (this.adw[idw] != dw) {
this.adw[idw] = dw;
this.fDirty = true;
}
};
/**
* writeByteMode0EvenOdd(off, b, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
* @param {number} [addr]
*/
Card.ACCESS.writeByteMode0EvenOdd = function writeByteMode0EvenOdd(off, b, addr)
{
off += this.offset;
var dw = b | (b << 8) | (b << 16) | (b << 24);
//
// When even/odd addressing is enabled, nWriteMapMask must be cleared for planes 1 and 3 if
// the address is even, and cleared for planes 0 and 2 if the address is odd.
//
var idw = off & ~0x1;
var maskMaps = this.controller.nWriteMapMask & (idw == off? 0x00ff00ff : (0xff00ff00|0));
dw = (dw & maskMaps) | (this.adw[idw] & ~maskMaps);
dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
if (this.adw[idw] != dw) {
this.adw[idw] = dw;
this.fDirty = true;
}
};
/**
* writeByteMode0Rot(off, b, addr)
*
* Supporting Set/Reset means that for every plane for which Set/Reset is enabled, we must
* replace the corresponding byte in "dw" with a byte of zeros or ones. This is accomplished with
* nSetMapMask, nSetMapData, and nSetMapBits. nSetMapMask is the inverse of the ESRESET bits,
* because we use it to mask the processor data; nSetMapData records the desired SRESET bits; and
* nSetMapBits contains the bits to replace those that we masked in the processor data.
*
* We could have done this:
*
* dw = (dw & this.controller.nSetMapMask) | (this.controller.nSetMapData & ~this.controller.nSetMapMask)
*
* but by maintaining nSetMapBits equal to (nSetMapData & ~nSetMapMask), we are able to make the writes
* slightly more efficient.
*
* @this {Memory}
* @param {number} off
* @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
* @param {number} [addr]
*/
Card.ACCESS.writeByteMode0Rot = function writeByteMode0Rot(off, b, addr)
{
var idw = off + this.offset;
b = ((b >> this.controller.nDataRotate) | (b << (8 - this.controller.nDataRotate)) & 0xff);
var dw = b | (b << 8) | (b << 16) | (b << 24);
dw = (dw & this.controller.nSetMapMask) | this.controller.nSetMapBits;
dw = (dw & this.controller.nWriteMapMask) | (this.adw[idw] & ~this.controller.nWriteMapMask);
dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
if (this.adw[idw] != dw) {
this.adw[idw] = dw;
this.fDirty = true;
}
};
/**
* writeByteMode0And(off, b, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
* @param {number} [addr]
*/
Card.ACCESS.writeByteMode0And = function writeByteMode0And(off, b, addr)
{
var idw = off + this.offset;
b = ((b >> this.controller.nDataRotate) | (b << (8 - this.controller.nDataRotate)) & 0xff);
var dw = b | (b << 8) | (b << 16) | (b << 24);
dw = (dw & this.controller.nSetMapMask) | this.controller.nSetMapBits;
dw &= this.controller.latches;
dw = (dw & this.controller.nWriteMapMask) | (this.adw[idw] & ~this.controller.nWriteMapMask);
dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
if (this.adw[idw] != dw) {
this.adw[idw] = dw;
this.fDirty = true;
}
};
/**
* writeByteMode0Or(off, b, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
* @param {number} [addr]
*/
Card.ACCESS.writeByteMode0Or = function writeByteMode0Or(off, b, addr)
{
var idw = off + this.offset;
b = ((b >> this.controller.nDataRotate) | (b << (8 - this.controller.nDataRotate)) & 0xff);
var dw = b | (b << 8) | (b << 16) | (b << 24);
dw = (dw & this.controller.nSetMapMask) | this.controller.nSetMapBits;
dw |= this.controller.latches;
dw = (dw & this.controller.nWriteMapMask) | (this.adw[idw] & ~this.controller.nWriteMapMask);
dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
if (this.adw[idw] != dw) {
this.adw[idw] = dw;
this.fDirty = true;
}
};
/**
* writeByteMode0Xor(off, b, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
* @param {number} [addr]
*/
Card.ACCESS.writeByteMode0Xor = function writeByteMode0Xor(off, b, addr)
{
var idw = off + this.offset;
b = ((b >> this.controller.nDataRotate) | (b << (8 - this.controller.nDataRotate)) & 0xff);
var dw = b | (b << 8) | (b << 16) | (b << 24);
dw = (dw & this.controller.nSetMapMask) | this.controller.nSetMapBits;
dw ^= this.controller.latches;
dw = (dw & this.controller.nWriteMapMask) | (this.adw[idw] & ~this.controller.nWriteMapMask);
dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
if (this.adw[idw] != dw) {
this.adw[idw] = dw;
this.fDirty = true;
}
};
/**
* writeByteMode1(off, b, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} b (ignored; the EGA latches provide the source data)
* @param {number} [addr]
*/
Card.ACCESS.writeByteMode1 = function writeByteMode1(off, b, addr)
{
var idw = off + this.offset;
var dw = (this.adw[idw] & ~this.controller.nWriteMapMask) | (this.controller.latches & this.controller.nWriteMapMask);
if (this.adw[idw] != dw) {
this.adw[idw] = dw;
this.fDirty = true;
}
};
/**
* writeByteMode1EvenOdd(off, b, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} b (ignored; the EGA latches provide the source data)
* @param {number} [addr]
*/
Card.ACCESS.writeByteMode1EvenOdd = function writeByteMode1EvenOdd(off, b, addr)
{
/*
* TODO: As discussed in getAccess(), we need to run some tests on real EGA/VGA hardware to determine
* exactly where latches are written (ie, to which address) when EVENODD is in effect.
*/
off += this.offset;
//
// When even/odd addressing is enabled, nWriteMapMask must be cleared for planes 1 and 3 if
// the address is even, and cleared for planes 0 and 2 if the address is odd.
//
var idw = off & ~0x1;
var maskMaps = this.controller.nWriteMapMask & (idw == off? 0x00ff00ff : (0xff00ff00|0));
var dw = (this.adw[idw] & ~maskMaps) | (this.controller.latches & maskMaps);
if (this.adw[idw] != dw) {
this.adw[idw] = dw;
this.fDirty = true;
}
};
/**
* writeByteMode2(off, b, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
* @param {number} [addr]
*/
Card.ACCESS.writeByteMode2 = function writeByteMode2(off, b, addr)
{
var idw = off + this.offset;
var dw = Video.aEGAByteToDW[b & 0xf];
dw = (dw & this.controller.nWriteMapMask) | (this.adw[idw] & ~this.controller.nWriteMapMask);
dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
if (this.adw[idw] != dw) {
this.adw[idw] = dw;
this.fDirty = true;
}
};
/**
* writeByteMode2And(off, b, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
* @param {number} [addr]
*/
Card.ACCESS.writeByteMode2And = function writeByteMode2And(off, b, addr)
{
var idw = off + this.offset;
var dw = Video.aEGAByteToDW[b & 0xf];
dw &= this.controller.latches;
dw = (dw & this.controller.nWriteMapMask) | (this.adw[idw] & ~this.controller.nWriteMapMask);
dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
if (this.adw[idw] != dw) {
this.adw[idw] = dw;
this.fDirty = true;
}
};
/**
* writeByteMode2Or(off, b, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
* @param {number} [addr]
*/
Card.ACCESS.writeByteMode2Or = function writeByteMode2Or(off, b, addr)
{
var idw = off + this.offset;
var dw = Video.aEGAByteToDW[b & 0xf];
dw |= this.controller.latches;
dw = (dw & this.controller.nWriteMapMask) | (this.adw[idw] & ~this.controller.nWriteMapMask);
dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
if (this.adw[idw] != dw) {
this.adw[idw] = dw;
this.fDirty = true;
}
};
/**
* writeByteMode2Xor(off, b, addr)
*
* @this {Memory}
* @param {number} off
* @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
* @param {number} [addr]
*/
Card.ACCESS.writeByteMode2Xor = function writeByteMode2Xor(off, b, addr)
{
var idw = off + this.offset;
var dw = Video.aEGAByteToDW[b & 0xf];
dw ^= this.controller.latches;
dw = (dw & this.controller.nWriteMapMask) | (this.adw[idw] & ~this.controller.nWriteMapMask);
dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
if (this.adw[idw] != dw) {
this.adw[idw] = dw;
this.fDirty = true;
}
};
/*
* Mappings from getAccess() values to access functions above
*/
Card.ACCESS.afn = [];
Card.ACCESS.afn[Card.ACCESS.READ.MODE0] = Card.ACCESS.readByteMode0;
Card.ACCESS.afn[Card.ACCESS.READ.MODE0 | Card.ACCESS.READ.EVENODD] = Card.ACCESS.readByteMode0EvenOdd;
Card.ACCESS.afn[Card.ACCESS.READ.MODE1] = Card.ACCESS.readByteMode1;
Card.ACCESS.afn[Card.ACCESS.WRITE.MODE0] = Card.ACCESS.writeByteMode0;
Card.ACCESS.afn[Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.ROT] = Card.ACCESS.writeByteMode0Rot;
Card.ACCESS.afn[Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.AND] = Card.ACCESS.writeByteMode0And;
Card.ACCESS.afn[Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.OR] = Card.ACCESS.writeByteMode0Or;
Card.ACCESS.afn[Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.XOR] = Card.ACCESS.writeByteMode0Xor;
Card.ACCESS.afn[Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.EVENODD] = Card.ACCESS.writeByteMode0EvenOdd;
Card.ACCESS.afn[Card.ACCESS.WRITE.MODE1] = Card.ACCESS.writeByteMode1;
Card.ACCESS.afn[Card.ACCESS.WRITE.MODE1 | Card.ACCESS.WRITE.EVENODD] = Card.ACCESS.writeByteMode1EvenOdd;
Card.ACCESS.afn[Card.ACCESS.WRITE.MODE2] = Card.ACCESS.writeByteMode2;
Card.ACCESS.afn[Card.ACCESS.WRITE.MODE2 | Card.ACCESS.WRITE.AND] = Card.ACCESS.writeByteMode2And;
Card.ACCESS.afn[Card.ACCESS.WRITE.MODE2 | Card.ACCESS.WRITE.OR] = Card.ACCESS.writeByteMode2Or;
Card.ACCESS.afn[Card.ACCESS.WRITE.MODE2 | Card.ACCESS.WRITE.XOR] = Card.ACCESS.writeByteMode2Xor;
/**
* initEGA(data)
*
* Another one of my frustrations with JSON is that it encodes empty arrays with non-zero lengths as
* arrays of nulls, which means that any uninitialized register arrays whose elements were all originally
* undefined come back via the JSON round-trip as *initialized* arrays whose elements are now all null.
*
* I'm a bit surprised, because JavaScript purists tell us to always use the '===' operator (eg, use
* 'aReg[i] === undefined' to determine if an element is initialized), but because of this JSON stupidity,
* that would require all such tests to become 'aReg[i] === undefined || aReg[i] === null'. I'm puzzled
* why the coercion of '==' is considered evil but JSON's coercion of undefined to null is perfectly fine.
*
* The simple solution is to change such comparisons to 'aReg[i] == null', because undefined is coerced
* to null, whereas numeric values are not.
*
* [What do I mean by "another" frustration? Let me talk to you some day about disallowing hex constants,
* or insisting that property names be quoted, or refusing to allow comments. I think it's fine for
* JSON.stringify() to produce output that adheres to rules like that -- although some parameters to control
* the output would be nice -- but it's completely unnecessary for JSON.parse() to refuse to parse objects
* that are perfectly valid.]
*
* @this {Card}
* @param {Array|undefined} data
* @param {number} nMonitorType
*/
Card.prototype.initEGA = function(data, nMonitorType)
{
if (data === undefined) {
data = [
/* 0*/ false,
/* 1*/ 0,
/* 2*/ new Array(Card.ATC.TOTAL_REGS),
/* 3*/ 0,
/* 4*/ (nMonitorType == ChipSet.MONITOR.MONO? 0: Card.MISC.IO_SELECT),
/* 5*/ 0,
/* 6*/ 0,
/* 7*/ new Array(Card.SEQ.TOTAL_REGS),
/* 8*/ 0,
/* 9*/ 0,
/*10*/ 0,
/*11*/ new Array(Card.GRC.TOTAL_REGS),
/*12*/ 0,
/*13*/ [this.addrBuffer, this.sizeBuffer, this.cbMemory],
/*14*/ new Array(this.cbMemory >> 2), // divide cbMemory by 4 since this is an array of DWORDs (8 bits for each of 4 planes)
/*
* Card.ACCESS.WRITE.MODE0 by itself is a pretty good default, but if we choose to "randomize" the screen with
* text characters prior to starting the machine, defaulting to Card.ACCESS.WRITE.EVENODD is more faithful to how
* characters and attributes are typically stored (ie, in planes 0 and 1, respectively). As soon as the machine
* starts up and initializes the hardware itself, these defaults won't matter.
*/
/*15*/ Card.ACCESS.READ.MODE0 | Card.ACCESS.READ.EVENODD | Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.EVENODD | Card.ACCESS.V2,
/*16*/ 0,
/*17*/ 0xffffffff|0,
/*18*/ 0,
/*19*/ 0xffffffff|0,
/*20*/ 0,
/*21*/ 0xffffffff|0,
/*22*/ 0,
/*23*/ 0,
/*24*/ 0,
/*25*/ Card.VGA_ENABLE.ENABLED,
/*26*/ Card.DAC.MASK.DEFAULT,
/*27*/ 0,
/*28*/ 0,
/*29*/ Card.DAC.STATE.MODE_WRITE,
/*30*/ new Array(Card.DAC.TOTAL_REGS)
];
}
this.fATCData = data[0];
this.regATCIndx = data[1];
this.regATCData = data[2];
this.asATCRegs = DEBUGGER? Card.ATC.REGS : [];
this.regStatus0 = data[3]; // aka STATUS0 (not to be confused with this.regStatus, which the EGA refers to as STATUS1)
this.regMisc = data[4];
this.regFeat = data[5]; // for feature control bits, see Card.FEAT_CTRL.BITS; for feature status bits, see Card.STATUS0.FEAT
this.regSEQIndx = data[6];
this.regSEQData = data[7];
this.asSEQRegs = DEBUGGER? Card.SEQ.REGS : [];
this.regGRCPos1 = data[8];
this.regGRCPos2 = data[9];
this.regGRCIndx = data[10];
this.regGRCData = data[11];
this.asGRCRegs = DEBUGGER? Card.GRC.REGS : [];
this.latches = data[12];
/*
* Since we originally neglected to save/restore the card's active video buffer address and length,
* we're now stashing all that information in data[13]. So if we're presented with an old data entry
* that contains only the card's memory size, fix it up.
*
* TODO: This code just creates the required array; the correct video buffer address and length would
* still need to be calculated from the current GRC registers; checkMode() knows how to do that, but I'm
* not prepared to shoehorn in a call to checkMode() here, and potentially create more issues, for an
* old problem that will eventually disappear anyway.
*/
var a = data[13];
if (typeof a == "number") {
a = [this.addrBuffer, this.sizeBuffer, a];
}
this.addrBuffer = a[0];
this.sizeBuffer = a[1];
this.video.assert(this.cbMemory === a[2]);
var cdw = this.cbMemory >> 2;
this.adwMemory = data[14];
if (this.adwMemory && this.adwMemory.length < cdw) {
this.adwMemory = State.decompressEvenOdd(this.adwMemory, cdw);
}
var nAccess = data[15];
if (nAccess) {
if (nAccess & Card.ACCESS.V2) {
nAccess &= ~Card.ACCESS.V2;
} else {
this.video.assert(Card.ACCESS.V1[nAccess & 0xff00] !== undefined && Card.ACCESS.V1[nAccess & 0xff] !== undefined);
nAccess = Card.ACCESS.V1[nAccess & 0xff00] | Card.ACCESS.V1[nAccess & 0xff];
}
}
this.setMemoryAccess(nAccess);
/*
* nReadMapShift must perfectly track how the GRC.READMAP register is programmed, so that Card.ACCESS.READ.MODE0
* memory read functions read the appropriate plane. This default is not terribly critical, unless Card.ACCESS.WRITE.MODE0
* is chosen as our default AND you want the screen randomizer to work.
*/
this.nReadMapShift = data[16];
/*
* Similarly, nWriteMapMask must perfectly track how the SEQ.MAPMASK register is programmed, so that memory write
* functions write the appropriate plane(s). Again, this default is not terribly critical, unless Card.ACCESS.WRITE.MODE0
* is chosen as our default AND you want the screen randomizer to work.
*/
this.nWriteMapMask = data[17];
this.nDataRotate = data[18];
this.nBitMapMask = data[19];
this.nSetMapData = data[20];
this.nSetMapMask = data[21];
this.nSetMapBits = data[22];
this.nColorCompare = data[23];
this.nColorDontCare = data[24];
if (this.nCard == Video.CARD.VGA) {
this.regVGAEnable = data[25];
this.regDACMask = data[26];
this.regDACAddr = data[27];
this.regDACShift = data[28];
this.regDACState = data[29];
this.regDACData = data[30];
}
};
/**
* saveCard()
*
* @this {Card}
* @return {Array}
*/
Card.prototype.saveCard = function()
{
var data = [];
if (this.nCard !== undefined) {
data[0] = this.fActive;
data[1] = this.regMode;
data[2] = this.regColor;
data[3] = this.regStatus;
data[4] = this.regCRTIndx | (this.regCRTPrev << 8);
data[5] = this.regCRTData;
if (this.nCard >= Video.CARD.EGA) {
data[6] = this.saveEGA();
}
data[7] = this.nInitCycles;
}
return data;
};
/**
* saveEGA()
*
* @this {Card}
* @return {Array}
*/
Card.prototype.saveEGA = function()
{
var data = [];
data[0] = this.fATCData;
data[1] = this.regATCIndx;
data[2] = this.regATCData;
data[3] = this.regStatus0;
data[4] = this.regMisc;
data[5] = this.regFeat;
data[6] = this.regSEQIndx;
data[7] = this.regSEQData;
data[8] = this.regGRCPos1;
data[9] = this.regGRCPos2;
data[10] = this.regGRCIndx;
data[11] = this.regGRCData;
data[12] = this.latches;
data[13] = [this.addrBuffer, this.sizeBuffer, this.cbMemory];
data[14] = State.compressEvenOdd(this.adwMemory);
data[15] = this.nAccess | Card.ACCESS.V2;
data[16] = this.nReadMapShift;
data[17] = this.nWriteMapMask;
data[18] = this.nDataRotate;
data[19] = this.nBitMapMask;
data[20] = this.nSetMapData;
data[21] = this.nSetMapMask;
data[22] = this.nSetMapBits;
data[23] = this.nColorCompare;
data[24] = this.nColorDontCare;
if (this.nCard == Video.CARD.VGA) {
data[25] = this.regVGAEnable;
data[26] = this.regDACMask;
data[27] = this.regDACAddr;
data[28] = this.regDACShift;
data[29] = this.regDACState;
data[30] = this.regDACData;
}
return data;
};
/**
* dumpRegs()
*
* Since we don't pre-allocate the register arrays (eg, ATC, CRTC, GRC, etc) on a Card, we can't
* rely on their array length, so we instead rely on the number of register names supplied in asRegs.
*
* @this {Card}
* @param {string} sName
* @param {number} iReg
* @param {Array} [aRegs]
* @param {Array} [asRegs]
*/
Card.prototype.dumpRegs = function(sName, iReg, aRegs, asRegs)
{
if (DEBUGGER) {
if (!aRegs) {
this.dbg.println(sName + ": " + str.toHexByte(iReg));
return;
}
var i, cchMax = 19, s = "";
/*
var s = "", i, cchMax = 0;
for (i = 0; i < asRegs.length; i++) {
if (cchMax < asRegs[i].length) cchMax = asRegs[i].length;
}
cchMax++;
*/
for (i = 0; i < asRegs.length; i++) {
if (s) s += '\n';
s += sName + "[" + str.toHexByte(i) + "]: " + str.pad(asRegs[i], cchMax) + str.toHexByte(aRegs[i]) + (i === iReg? "*" : "");
}
this.dbg.println(s);
}
};
/**
* dumpCard()
*
* @this {Card}
*/
Card.prototype.dumpCard = function()
{
if (DEBUGGER) {
/*
* Start with registers that are common to all cards....
*/
this.dumpRegs("CRTC", this.regCRTIndx, this.regCRTData, this.asCRTCRegs);
if (this.nCard >= Video.CARD.EGA) {
this.dumpRegs(" GRC", this.regGRCIndx, this.regGRCData, this.asGRCRegs);
this.dumpRegs(" SEQ", this.regSEQIndx, this.regSEQData, this.asSEQRegs);
this.dumpRegs(" ATC", this.regATCIndx, this.regATCData, this.asATCRegs);
this.dbg.println(" ATCDATA: " + this.fATCData);
this.dumpRegs(" FEAT", this.regFeat);
this.dumpRegs(" MISC", this.regMisc);
this.dumpRegs(" STATUS0", this.regStatus0);
/*
* There are few more EGA regs we could dump, like GRCPos1, GRCPos2, but does anyone care?
*/
}
this.dumpRegs(" STATUS1", this.regStatus);
if (this.nCard == Video.CARD.MDA || this.nCard == Video.CARD.CGA) {
this.dumpRegs(" MODEREG", this.regMode);
}
if (this.nCard == Video.CARD.CGA) {
this.dumpRegs(" COLOR", this.regColor);
}
if (this.nCard >= Video.CARD.EGA) {
this.dbg.println(" LATCHES: 0x" + str.toHex(this.latches));
this.dbg.println(" ACCESS: " + str.toHexWord(this.nAccess));
this.dbg.println("Use 'dump video [addr]' to dump video memory");
/*
* There are few more EGA regs we could dump, like GRCPos1, GRCPos2, but does anyone care?
*/
}
}
};
/**
* dumpBuffer()
*
* @this {Card}
* @param {string} sParm
*/
Card.prototype.dumpBuffer = function(sParm)
{
if (DEBUGGER) {
if (!this.adwMemory) {
this.dbg.println("no buffer");
return;
}
var idw = str.parseInt(sParm);
idw = (idw !== undefined? idw - this.addrBuffer : (this.prevDump || 0));
if (idw < 0) idw = 0;
var cLines = 8, sDump = "";
for (var iLine = 0; iLine < cLines; iLine++) {
var sData = str.toHex(this.addrBuffer + idw) + ":";
for (var i = 0; i < 8 && idw < this.adwMemory.length; i++) {
var dw = this.adwMemory[idw++];
sData += " " + str.toHex(dw);
}
if (sDump) sDump += "\n";
sDump += sData;
}
if (sDump) this.dbg.println(sDump);
this.prevDump = idw;
}
};
/**
* getMemoryBuffer(addr)
*
* If we passed a controller object (ie, this card) to addMemory(), then each allocated Memory block
* will call this function to obtain a buffer.
*
* @this {Card}
* @param {number} addr
* @return {Array} containing the buffer (and the offset within that buffer that corresponds to the requested block)
*/
Card.prototype.getMemoryBuffer = function(addr)
{
return [this.adwMemory, addr - this.addrBuffer];
};
/**
* getMemoryAccess()
*
* Return the last set of memory access functions recorded by setMemoryAccess().
*
* @this {Card}
* @return {Array.<function()>}
*/
Card.prototype.getMemoryAccess = function()
{
return this.afnAccess;
};
/**
* setMemoryAccess(nAccess)
*
* This transforms the memory access value that getAccess() returns into the best available set of
* memory access functions, which are then returned via getMemoryAccess() to any memory blocks we allocate
* or modify.
*
* @this {Card}
* @param {number|undefined} nAccess
*/
Card.prototype.setMemoryAccess = function(nAccess)
{
if (nAccess != null && nAccess != this.nAccess) {
var nReadAccess = nAccess & Card.ACCESS.READ.MASK;
var fnReadByte = Card.ACCESS.afn[nReadAccess];
if (!fnReadByte) {
if (DEBUG && this.dbg) {
this.dbg.message("Card.setMemoryAccess(" + str.toHexWord(nAccess) + "): missing readByte handler");
this.dbg.stopCPU(); // let's take a look
}
if (nReadAccess & Card.ACCESS.READ.EVENODD) {
fnReadByte = Card.ACCESS.afn[Card.ACCESS.READ.EVENODD];
}
}
var nWriteAccess = nAccess & Card.ACCESS.WRITE.MASK;
var fnWriteByte = Card.ACCESS.afn[nWriteAccess];
if (!fnWriteByte) {
if (DEBUG && this.dbg) {
this.dbg.message("Card.setMemoryAccess(" + str.toHexWord(nAccess) + "): missing writeByte handler");
this.dbg.stopCPU(); // let's take a look
}
if (nWriteAccess & Card.ACCESS.WRITE.EVENODD) {
fnWriteByte = Card.ACCESS.afn[Card.ACCESS.WRITE.EVENODD];
}
}
if (!this.afnAccess) this.afnAccess = new Array(6);
this.afnAccess[0] = fnReadByte;
this.afnAccess[3] = fnWriteByte;
this.nAccess = nAccess;
}
};
/*
* Card Specifications
*
* We support dynamically switching between MDA and CGA cards by simply flipping switches on
* the virtual SW1 switch block and resetting the machine. However, I'm not sure I'll support
* dynamically switching the EGA card the same way; there's certainly no UI for it at this point.
*
* For each supported card, there is a cardSpec array that the Card class uses to initialize the
* card's defaults:
*
* [0]: card descriptor
* [1]: default CRTC port address
* [2]: default video buffer address
* [3]: default video buffer size
* [4]: total on-board memory (if no "memory" parm was specified)
* [5]: default monitor type
*
* If total on-board memory is zero, then addMemory() will simply add the specified video buffer
* to the address space; otherwise, we will allocate an internal buffer (adwMemory) and tell addMemory()
* to map it to the video buffer address. The latter approach gives us total control over the buffer;
* refer to getMemoryAccess().
*
* TODO: Consider allocating our own buffer for all video cards, not just EGA/VGA. For MDA/CGA, I'm not
* sure it would offer any benefits, other than allowing our internal update functions, like updateScreen(),
* to access the buffer directly, instead of going through the Bus memory interface.
*/
Video.cardSpecs = [];
Video.cardSpecs[Video.CARD.MDA] = ["MDA", Card.MDA.CRTC.INDX.PORT, 0xB0000, 0x01000, 0, ChipSet.MONITOR.MONO];
Video.cardSpecs[Video.CARD.CGA] = ["CGA", Card.CGA.CRTC.INDX.PORT, 0xB8000, 0x04000, 0, ChipSet.MONITOR.COLOR];
Video.cardSpecs[Video.CARD.EGA] = ["EGA", Card.CGA.CRTC.INDX.PORT, 0xB8000, 0x04000, 0x10000, ChipSet.MONITOR.EGACOLOR];
Video.cardSpecs[Video.CARD.VGA] = ["VGA", Card.CGA.CRTC.INDX.PORT, 0xB8000, 0x04000, 0x40000, ChipSet.MONITOR.VGACOLOR];
/**
* initBus(cmp, bus, cpu, dbg)
*
* This is a notification issued by the Computer component, after all the other components (notably the CPU)
* have had a chance to initialize.
*
* @this {Video}
* @param {Computer} cmp
* @param {Bus} bus
* @param {X86CPU} cpu
* @param {Debugger} dbg
*/
Video.prototype.initBus = function(cmp, bus, cpu, dbg)
{
this.bus = bus;
this.cpu = cpu;
this.dbg = dbg;
/*
* The only time we do NOT want to trap MDA ports is when the model has been specifically set to CGA.
*/
if (Video.CARD.NAMES[this.model] != Video.CARD.CGA) {
bus.addPortInputTable(this, Video.aMDAPortInput);
bus.addPortOutputTable(this, Video.aMDAPortOutput);
}
/*
* Similarly, the only time we do NOT want to trap CGA ports is when the model has been specifically set to MDA.
*/
if (Video.CARD.NAMES[this.model] != Video.CARD.MDA) {
bus.addPortInputTable(this, Video.aCGAPortInput);
bus.addPortOutputTable(this, Video.aCGAPortOutput);
}
/*
* Note that in the case of EGA and VGA models, the above code ensures that we will trap both MDA and CGA
* port ranges -- which is good, because both the EGA and VGA can be reprogrammed to respond to those ports,
* but also potentially bad if you want to simulate a "dual display" system, where one of the displays is
* driven by either an MDA or CGA.
*
* However, you should still be able to make that work by loading the MDA or CGA video component first, because
* components should be initialized in the order they appear in the machine configuration file. Any attempt
* by another component to trap the same ports should be ignored.
*/
if (this.nCard >= Video.CARD.EGA) {
bus.addPortInputTable(this, Video.aEGAPortInput);
bus.addPortOutputTable(this, Video.aEGAPortOutput);
}
if (this.nCard == Video.CARD.VGA) {
bus.addPortInputTable(this, Video.aVGAPortInput);
bus.addPortOutputTable(this, Video.aVGAPortOutput);
}
if (DEBUGGER && dbg) {
var video = this;
dbg.messageDump(Messages.VIDEO, function onDumpVideo(sParm) {
video.dumpVideo(sParm);
});
}
/*
* If we have an associated keyboard, then ensure that the keyboard will be notified whenever
* the canvas gets focus and receives input.
*/
this.kbd = cmp.getComponentByType("Keyboard");
if (this.kbd && this.canvasScreen) {
for (var s in this.bindings) {
if (s.indexOf("lock") > 0) this.kbd.setBinding("led", s, this.bindings[s]);
}
this.kbd.setBinding(this.textareaScreen? "textarea" : "canvas", "kbd", this.inputScreen);
}
this.bEGASwitches = 0x09; // our default "switches" setting (see aEGAMonitorSwitches)
this.chipset = cmp.getComponentByType("ChipSet");
if (this.chipset && this.sSwitches) {
if (this.nCard == Video.CARD.EGA) this.bEGASwitches = this.chipset.parseSwitches(this.sSwitches, this.bEGASwitches);
}
if (this.kbd && this.fTouchScreen) this.captureTouch();
};
/**
* setBinding(sHTMLType, sBinding, control)
*
* @this {Video}
* @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
* @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "refresh")
* @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
* @return {boolean} true if binding was successful, false if unrecognized binding request
*/
Video.prototype.setBinding = function(sHTMLType, sBinding, control)
{
var video = this;
if (!this.bindings[sBinding]) {
/*
* We now save every binding that comes in, so that if there are bindings for "caps-lock' and the like,
* we can forward them to the Keyboard.
*/
this.bindings[sBinding] = control;
switch (sBinding) {
case "fullScreen":
if (this.container && this.container.doFullScreen) {
control.onclick = function onClickFullScreen() {
if (DEBUG) video.printMessage("fullScreen()");
video.doFullScreen();
};
} else {
if (DEBUG) this.log("FullScreen API not available");
control.parentNode.removeChild(control);
}
return true;
case "lockPointer":
this.sLockMessage = control.textContent;
if (this.inputScreen && this.inputScreen.lockPointer) {
control.onclick = function onClickLockPointer() {
if (DEBUG) video.printMessage("lockPointer()");
video.lockPointer(true);
};
} else {
if (DEBUG) this.log("Pointer Lock API not available");
control.parentNode.removeChild(control);
}
return true;
case "refresh":
control.onclick = function onClickRefresh() {
if (DEBUG) video.printMessage("refreshScreen()");
video.updateScreen(true);
};
return true;
default:
break;
}
}
return false;
};
/**
* setFocus()
*
* @this {Video}
*/
Video.prototype.setFocus = function()
{
if (this.inputScreen) this.inputScreen.focus();
};
/**
* getInput()
*
* This is an interface used by the Mouse component, so that it can invoke capture/release mouse events from the screen element.
*
* @this {Video}
* @param {Mouse} [mouse]
* @return {Object|undefined}
*/
Video.prototype.getInput = function(mouse)
{
this.mouse = mouse;
return this.inputScreen;
};
/**
* doFullScreen()
*
* @this {Video}
* @return {boolean} true if request successful, false if not (eg, failed OR not supported)
*/
Video.prototype.doFullScreen = function()
{
var fSuccess = false;
if (this.container) {
if (this.container.doFullScreen) {
/*
* Styling the container with a width of "100%" and a height of "auto" works great when the aspect ratio
* of our virtual screen is at least roughly equivalent to the physical screen's aspect ratio, but now that
* we support virtual VGA screens with an aspect ratio of 1.33, that's very much out of step with modern
* wide-screen monitors, which usually have an aspect ratio of 1.6 or greater.
*
* And unfortunately, none of the browsers I've tested appear to make any attempt to scale our container to
* the physical screen's dimensions, so the bottom of our screen gets clipped. To prevent that, I reduce
* the width from 100% to whatever percentage will accommodate the entire height of the virtual screen.
*
* NOTE: Mozilla recommends both a width and a height of "100%", but all my tests suggest that using "auto"
* for height works equally well, so I'm sticking with it, because "auto" is also consistent with how I've
* implemented a responsive canvas when the browser window is being resized.
*/
var sWidth = "100%";
var sHeight = "auto";
if (screen && screen.width && screen.height) {
var aspectPhys = screen.width / screen.height;
var aspectVirt = this.cxScreen / this.cyScreen;
if (aspectPhys > aspectVirt) {
sWidth = Math.round(aspectVirt / aspectPhys * 100) + '%';
}
// TODO: We may need to someday consider the case of a physical screen with an aspect ratio < 1.0....
}
if (!this.fGecko) {
this.container.style.width = sWidth;
this.container.style.height = sHeight;
} else {
/*
* Sadly, the above code doesn't work for Firefox, because as http://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Using_full_screen_mode
* explains:
*
* 'It's worth noting a key difference here between the Gecko and WebKit implementations at this time:
* Gecko automatically adds CSS rules to the element to stretch it to fill the screen: "width: 100%; height: 100%".
*
* Which would be OK if Gecko did that BEFORE we're called, but apparently it does that AFTER, effectively
* overwriting our careful calculations. So we style the inner element (canvasScreen) instead, which
* requires even more work to ensure that the canvas is properly centered. FYI, this solution is consistent
* with Mozilla's recommendation for working around their automatic CSS rules:
*
* '[I]f you're trying to emulate WebKit's behavior on Gecko, you need to place the element you want
* to present inside another element, which you'll make fullscreen instead, and use CSS rules to adjust
* the inner element to match the appearance you want.'
*/
this.canvasScreen.style.width = sWidth;
this.canvasScreen.style.width = sWidth;
this.canvasScreen.style.display = "block";
this.canvasScreen.style.margin = "auto";
}
this.container.style.backgroundColor = "black";
this.container.doFullScreen();
fSuccess = true;
}
this.setFocus();
}
return fSuccess;
};
/**
* notifyFullScreen(fFullScreen)
*
* @this {Video}
* @param {boolean|null} fFullScreen (null if there was a full-screen error)
*/
Video.prototype.notifyFullScreen = function(fFullScreen)
{
if (!fFullScreen && this.container) {
if (!this.fGecko) {
this.container.style.width = this.container.style.height = "";
} else {
this.canvasScreen.style.width = this.canvasScreen.style.height = "";
}
}
this.printMessage("notifyFullScreen(" + fFullScreen + ")", true);
if (this.kbd) this.kbd.notifyEscape(fFullScreen);
};
/**
* lockPointer()
*
* @this {Video}
* @param {boolean} fLock
* @return {boolean} true if request successful, false if not (eg, failed OR not supported)
*/
Video.prototype.lockPointer = function(fLock)
{
var fSuccess = false;
if (this.inputScreen) {
if (fLock) {
if (this.inputScreen.lockPointer) {
this.inputScreen.lockPointer();
this.mouse.notifyPointerLocked(true);
fSuccess = true;
}
} else {
if (this.inputScreen.unlockPointer) {
this.inputScreen.unlockPointer();
this.mouse.notifyPointerLocked(false);
fSuccess = true;
}
}
this.setFocus();
}
return fSuccess;
};
/**
* notifyPointerActive(fActive)
*
* @this {Video}
* @param {boolean} fActive
* @return {boolean} true if autolock enabled AND pointer lock supported, false if not
*/
Video.prototype.notifyPointerActive = function(fActive)
{
if (this.fAutoLock) {
return this.lockPointer(fActive);
}
return false;
};
/**
* notifyPointerLocked(fLocked)
*
* @this {Video}
* @param {boolean} fLocked
*/
Video.prototype.notifyPointerLocked = function(fLocked)
{
if (this.mouse) {
this.mouse.notifyPointerLocked(fLocked);
if (this.kbd) this.kbd.notifyEscape(fLocked);
}
var control = this.bindings["lockPointer"];
if (control) control.textContent = (fLocked? "Press Esc to Unlock Pointer" : this.sLockMessage);
};
/**
* captureTouch()
*
* @this {Video}
*/
Video.prototype.captureTouch = function()
{
var control = this.inputScreen;
if (control) {
var video = this;
if (!this.fCaptured) {
control.addEventListener(
'touchstart',
function onTouchStart(event) { video.onTouchStart(event); },
false // we'll specify false for the 'useCapture' parameter for now...
);
control.addEventListener(
'touchmove',
function onTouchMove(event) { video.onTouchMove(event); },
true
);
control.addEventListener(
'touchend',
function onTouchEnd(event) { video.onTouchEnd(event); },
false // we'll specify false for the 'useCapture' parameter for now...
);
if (DEBUG) {
/*
*/
control.addEventListener(
'mousedown',
function onMouseDown(event) { video.onTouchStart(event); },
false // we'll specify false for the 'useCapture' parameter for now...
);
/*
control.addEventListener(
'mousemove',
function onMouseMove(event) { video.onTouchMove(event); },
true
);
control.addEventListener(
'mouseup',
function onMouseUp(event) { video.onTouchEnd(event); },
false // we'll specify false for the 'useCapture' parameter for now...
);
*/
}
// this.log("touch events captured");
this.fCaptured = true;
}
}
};
/**
* onFocusChange(fFocus)
*
* @this {Video}
* @param {boolean} fFocus is true if gaining focus, false if losing it
*/
Video.prototype.onFocusChange = function(fFocus)
{
/*
* As per http://stackoverflow.com/questions/6740253/disable-scrolling-when-changing-focus-form-elements-ipad-web-app,
* I decided to try this work-around to prevent the webpage from scrolling around whenever the canvas is given
* focus. That sort of scrolling-into-view sounds great in principle, but in practice, if you were reading some other
* portion of the page, it can be irritating to be scrolled away from that portion when refreshing/returning to the page.
*
* However, this work-around doesn't seem to work with the latest version of Safari (or else I misunderstood something).
*
* if (fFocus) {
* window.scrollTo(0, 0);
* window.document.body.scrollTop = 0;
* }
*/
this.fHasFocus = fFocus;
if (this.kbd) this.kbd.onFocusChange(fFocus);
};
/*
Video.prototype.releaseTouch = function()
{
};
*/
/**
* onTouchStart(event)
*
* @this {Video}
* @param {Event} event object from a 'touch' event
*/
Video.prototype.onTouchStart = function(event)
{
if (DEBUG) this.printMessage("onTouchStart()");
this.processTouchEvent(event, true);
};
/**
* onTouchMove(event)
*
* @this {Video}
* @param {Event} event object from a 'touch' event
*/
Video.prototype.onTouchMove = function(event)
{
if (DEBUG) this.printMessage("onTouchMove()");
this.processTouchEvent(event, false);
};
/**
* onTouchEnd(event)
*
* @this {Video}
* @param {Event} event object from a 'touch' event
*/
Video.prototype.onTouchEnd = function(event)
{
if (DEBUG) this.printMessage("onTouchEnd()");
};
/**
* processTouchEvent(event, fStart)
*
* @this {Video}
* @param {Event} event object from a 'touch' event
* @param {boolean} fStart if this is a 'touchstart' event
*/
Video.prototype.processTouchEvent = function(event, fStart)
{
// if (!event) event = window.event;
/*
* My thinking here is that if the canvas does NOT yet have focus, then we should actually SKIP
* the usual preventDefault() call, so that everything the user has come to expect (eg, activation of
* the soft keyboard) will work as before.
*
* The process of touching the canvas means it should ultimately receive focus, and as long as it
* retains focus, preventDefault() will always be called.
*/
if (this.fHasFocus) event.preventDefault();
/*
* Touch coordinates (that is, the pageX and pageY properties) are relative to the page, so to make
* them relative to the canvas, we must subtract the canvas's left and top positions. This Apple web page:
*
* https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/AddingMouseandTouchControlstoCanvas/AddingMouseandTouchControlstoCanvas.html
*
* makes it sound simple, but it turns out we have to walk the canvas' entire "parentage" of DOM elements
* to get the exact offsets.
*
* TODO: Determine whether the getBoundingClientRect() code used in panel.js for mouse events can also
* be used here to simplify this annoyingly complicated code for touch events.
*/
var xTouchOffset = 0;
var yTouchOffset = 0;
var eCurrent = this.canvasScreen;
do {
if (!isNaN(eCurrent.offsetLeft)) {
xTouchOffset += eCurrent.offsetLeft;
yTouchOffset += eCurrent.offsetTop;
}
} while ((eCurrent = eCurrent.offsetParent));
/*
* Due to the responsive nature of our pages, the displayed size of the canvas may be smaller than the
* allocated size, and the coordinates we receive from touch events are based on the currently displayed size.
*/
var xScale = this.cxScreen / this.canvasScreen.offsetWidth;
var yScale = this.cyScreen / this.canvasScreen.offsetHeight;
/**
* @name Event
* @property {Array} targetTouches
*/
var xTouch, yTouch;
if (!event.targetTouches) {
xTouch = event.pageX;
yTouch = event.pageY;
} else {
xTouch = event.targetTouches[0].pageX;
yTouch = event.targetTouches[0].pageY;
}
xTouch = ((xTouch - xTouchOffset) * xScale);
yTouch = ((yTouch - yTouchOffset) * yScale);
var xThird = (xTouch / (this.cxScreen / 3)) | 0;
var yThird = (yTouch / (this.cyScreen / 3)) | 0;
/*
* At this point, xThird and yThird should both be one of 0, 1 or 2, indicating which horizontal and vertical
* third of the virtual screen the touch event occurred.
*/
if (/* xThird == 1 && */ yThird != 1) {
if (!yThird) {
this.kbd.addActiveKey(Keyboard.CLICKCODES.UP, true);
} else {
this.kbd.addActiveKey(Keyboard.CLICKCODES.DOWN, true);
}
} else if (/* yThird == 1 && */ xThird != 1) {
if (!xThird) {
this.kbd.addActiveKey(Keyboard.CLICKCODES.LEFT, true);
} else {
this.kbd.addActiveKey(Keyboard.CLICKCODES.RIGHT, true);
}
}
};
/**
* powerUp(data, fRepower)
*
* @this {Video}
* @param {Object|null} data
* @param {boolean} [fRepower]
* @return {boolean} true if successful, false if failure
*/
Video.prototype.powerUp = function(data, fRepower)
{
if (!fRepower) {
if (!data || !this.restore) {
this.reset();
} else {
if (!this.restore(data)) return false;
}
}
return true;
};
/**
* powerDown(fSave, fShutdown)
*
* This is where we might add some method of blanking the display, without the disturbing the video
* buffer contents, and blocking all further updates to the display.
*
* @this {Video}
* @param {boolean} fSave
* @param {boolean} [fShutdown]
* @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
*/
Video.prototype.powerDown = function(fSave, fShutdown)
{
return fSave && this.save? this.save() : true;
};
/**
* reset()
*
* @this {Video}
*/
Video.prototype.reset = function()
{
var fRandomize = true;
var nMonitorType = ChipSet.MONITOR.NONE;
/*
* We'll ask the ChipSet what SW1 indicates for monitor type, but we may override it if a specific
* video card model is set. For EGA, SW1 is supposed to be set to indicate NO monitor, and we rely
* on the EGA's own switch settings instead.
*/
if (this.chipset) {
nMonitorType = this.chipset.getSWVideoMonitor();
}
/*
* As we noted in the constructor, when a model is specified, that takes precedence over any monitor
* switch settings. Conversely, when no model is specified, the nCard setting is considered provisional,
* so the monitor switch settings, if any, are allowed to determine the card type.
*/
if (!this.model) {
this.nCard = (nMonitorType == ChipSet.MONITOR.MONO? Video.CARD.MDA : Video.CARD.CGA);
}
this.nModeDefault = Video.MODE.CGA_80X25;
switch (this.nCard) {
case Video.CARD.VGA:
nMonitorType = ChipSet.MONITOR.VGACOLOR;
break;
case Video.CARD.EGA:
var aMonitors = Video.aEGAMonitorSwitches[this.bEGASwitches];
/*
* TODO: Figure out how to deal with aMonitors[2], the boolean which indicates
* whether the EGA is driving the primary monitor (true) or the secondary monitor (false).
*/
if (aMonitors) nMonitorType = aMonitors[0];
if (!nMonitorType) nMonitorType = ChipSet.MONITOR.EGACOLOR;
break;
case Video.CARD.MDA:
nMonitorType = ChipSet.MONITOR.MONO;
this.nModeDefault = Video.MODE.MDA_80X25;
break;
case Video.CARD.CGA:
/* falls through */
default:
nMonitorType = ChipSet.MONITOR.COLOR;
break;
}
if (this.nMonitorType !== nMonitorType) {
this.nMonitorType = nMonitorType;
fRandomize = true;
}
this.cardActive = null;
this.cardMono = this.cardMDA = new Card(this, Video.CARD.MDA);
this.cardColor = this.cardCGA = new Card(this, Video.CARD.CGA);
if (this.nCard < Video.CARD.EGA) {
this.cardEGA = new Card(); // define a dummy (uninitialized) EGA card for now
}
else {
this.cardEGA = new Card(this, this.nCard, null, this.cbMemory);
this.enableEGA();
}
/*
* We need to call buildFonts() *after* the card(s) are initialized but *before* setMode() is called.
*/
this.buildFonts();
this.nMode = null;
this.iCellCursor = -1; // initially, there is no visible cursor cell
this.cBlinks = -1; // initially, blinking is not active
this.cBlinkVisible = 0; // no visible blinking characters (yet)
this.setMode(this.nModeDefault);
if (this.cardActive.addrBuffer && fRandomize) {
/*
* On the initial power-on, we initialize the video buffer to random characters, as a way of testing
* whether our font(s) were successfully loaded. It's assumed that our default display mode is a text mode,
* and that since this is a reset, the CRTC.START_ADDR registers are zero as well.
*
* If this is an MDA device, then the buffer should reside at 0xB0000 through 0xB0FFF, for a total length
* of 4Kb (0x1000), where every even byte contains a character code, and every odd byte contains an attribute
* code. See the ATTR bit definitions above for applicable color, intensity, and blink values. On a CGA
* device, the buffer resides at 0xB8000 through 0xBBFFF, for a total length of 16Kb.
*
* Note that the only valid MDA display mode (7) is the 80x25 text mode, which uses 4000 bytes (2000 character
* bytes + 2000 attribute bytes), not all 4096 bytes; addrScreenLimit reflects the visible limit, not the
* physical limit. Also, as noted in updateScreen(), this simplistic calculation of the extent of visible
* screen memory is valid only for text modes; in general, it's safer to use cardActive.sizeBuffer as the extent.
*/
var addrScreenLimit = this.cardActive.addrBuffer + this.cbScreen;
for (var addrScreen = this.cardActive.addrBuffer; addrScreen < addrScreenLimit; addrScreen += 2) {
var dataRandom = (Math.random() * 0x10000)|0;
var bChar, bAttr;
if (this.nMonitorType == ChipSet.MONITOR.EGACOLOR || this.nMonitorType == ChipSet.MONITOR.VGACOLOR) {
/*
* For the EGA, we choose sequential characters; for random characters, copy the MDA/CGA code below.
*/
bChar = (addrScreen >> 1) & 0xff;
bAttr = (dataRandom >> 8) & ~Video.ATTRS.BGND_BLINK; // TODO: turn blink attributes off unless we can ensure blinking is initially disabled
if ((bAttr >> 4) == (bAttr & 0xf)) {
bAttr ^= 0x0f; // if background matches foreground, invert foreground to ensure character visibility
}
} else {
bChar = dataRandom & 0xff;
bAttr = ((dataRandom & 0x100)? (Video.ATTRS.FGND_WHITE | Video.ATTRS.BGND_BLACK) : (Video.ATTRS.FGND_BLACK | Video.ATTRS.BGND_WHITE)) | ((Video.ATTRS.FGND_BRIGHT /* | Video.ATTRS.BGND_BLINK */) & (dataRandom >> 8));
}
this.bus.setShortDirect(addrScreen, bChar | (bAttr << 8));
}
this.updateScreen(true);
}
};
/**
* enableEGA()
*
* Redirect cardMono or cardColor to cardEGA as appropriate.
*
* @this {Video}
*/
Video.prototype.enableEGA = function()
{
if (!(this.cardEGA.regMisc & Card.MISC.IO_SELECT)) {
this.cardMono = this.cardEGA;
this.cardColor = this.cardCGA; // this is done mainly to siphon away any CGA I/O
} else {
this.cardMono = this.cardMDA; // similarly, this is done to siphon away any MDA I/O
this.cardColor = this.cardEGA;
}
};
/**
* save()
*
* This implements save support for the Video component.
*
* @this {Video}
* @return {Object}
*/
Video.prototype.save = function()
{
var state = new State(this);
state.set(0, this.cardMDA.saveCard());
state.set(1, this.cardCGA.saveCard());
state.set(2, [this.nMonitorType, this.nModeDefault, this.nMode]);
state.set(3, this.cardEGA.saveCard());
return state.data();
};
/**
* restore(data)
*
* This implements restore support for the Video component.
*
* @this {Video}
* @param {Object} data
* @return {boolean} true if successful, false if failure
*/
Video.prototype.restore = function(data)
{
var a = data[2];
this.nMonitorType = a[0];
this.nModeDefault = a[1];
this.nMode = a[2];
this.cardActive = null;
this.cardMono = this.cardMDA = new Card(this, Video.CARD.MDA, data[0]);
this.cardColor = this.cardCGA = new Card(this, Video.CARD.CGA, data[1]);
/*
* If no EGA was originally initialized, then cardEGA will remain uninitialized.
*/
this.cardEGA = new Card(this, this.nCard, data[3], this.cbMemory);
if (this.cardEGA.fActive) this.enableEGA();
/*
* We need to call buildFonts() *after* the card(s) are initialized but *before* setMode() is called.
*/
this.buildFonts();
/*
* While I could restore the active card here, it's better for setMode() to do it, because
* setMode() will also take care of mapping the appropriate video buffer. So, after restore() has
* finished, we call checkMode(), because the current video mode (nMode) is determined by the
* active card state.
*
* Unfortunately, that creates a chicken-and-egg problem, since I just said I didn't want to select
* the active card here.
*
* So, we'll add some "cop-out" code to checkMode(): if there's no active card, then fall-back
* to the last known video mode (nMode) and force a call to setMode().
*
* this.cardActive = (this.cardMDA.fActive? this.cardMDA : (this.cardCGA.fActive? this.cardCGA : undefined));
*/
if (!this.checkMode()) return false;
this.checkCursor();
return true;
};
/**
* onLoadSetFonts(sFontFile, sFontData, nErrorCode)
*
* @this {Video}
* @param {string} sFontFile
* @param {string} sFontData
* @param {number} nErrorCode (response from server if anything other than 200)
*/
Video.prototype.onLoadSetFonts = function(sFontFile, sFontData, nErrorCode)
{
if (nErrorCode) {
this.notice("Unable to load font ROM image (error " + nErrorCode + ")");
return;
}
try {
/*
* The most likely source of any exception will be right here, where we're parsing the JSON-encoded data.
*/
var abFontData = eval("(" + sFontData + ")");
if (!abFontData.length) {
Component.error("Empty font ROM image: " + sFontFile);
return;
}
else if (abFontData.length == 1) {
Component.error(abFontData[0]);
return;
}
/*
* Translate the character data into separate "fonts", each of which will be a separate canvas object, with all
* 256 characters arranged in a 16x16 grid.
*/
if (abFontData.length == 8192) {
/*
* Here are the first few rows of MDA font data, at the 0K and 2K boundaries:
*
* 00000000 00 00 00 00 00 00 00 00 00 00 7e 81 a5 81 81 bd |..........~.....|
* 00000010 00 00 7e ff db ff ff c3 00 00 00 36 7f 7f 7f 7f |..~........6....|
* ...
* 00000800 00 00 00 00 00 00 00 00 99 81 7e 00 00 00 00 00 |..........~.....|
* 00000810 e7 ff 7e 00 00 00 00 00 3e 1c 08 00 00 00 00 00 |..~.....>.......|
*
* 8 bytes of data from a row in each of the 2K chunks are combined to form a 8-bit wide character with
* a maximum height of 16 bits. Assembling the bits for character 0x01 (a happy face), we observe the following:
*
* 0 0 0 0 0 0 0 0 <== 00 from offset 0x0008
* 0 0 0 0 0 0 0 0 <== 00 from offset 0x0009
* 0 1 1 1 1 1 1 0 <== 7e from offset 0x000A
* 1 0 0 0 0 0 0 1 <== 81 from offset 0x000B
* 1 0 1 0 0 1 0 1 <== a5 from offset 0x000C
* 1 0 0 0 0 0 0 1 <== 81 from offset 0x000D
* 1 0 0 0 0 0 0 1 <== 81 from offset 0x000E
* 1 0 1 1 1 1 0 1 <== bd from offset 0x000F
* 1 0 0 1 1 0 0 1 <== 99 from offset 0x0808
* 1 0 0 0 0 0 0 1 <== 81 from offset 0x0809
* 0 1 1 1 1 1 1 0 <== 7e from offset 0x080A
* 0 0 0 0 0 0 0 0 <== 00 from offset 0x080B
* 0 0 0 0 0 0 0 0 <== 00 from offset 0x080C
* 0 0 0 0 0 0 0 0 <== 00 from offset 0x080D
* 0 0 0 0 0 0 0 0 <== 00 from offset 0x080E
* 0 0 0 0 0 0 0 0 <== 00 from offset 0x080F
*
* In the second 2K chunk, we observe that the last two bytes of every font cell definition are zero;
* this confirms our understanding that MDA font cell size is 8x14.
*
* Finally, there's the issue of screen cell size, which is actually 9x14 on the MDA. We compensate for that
* by building a 9x14 font, even though there's only 8x14 bits of data. As http://www.seasip.info/VintagePC/mda.html
* explains:
*
* "For characters C0h-DFh, the ninth pixel column is a duplicate of the eighth; for others, it's blank."
*
* This last point is confirmed by "The IBM Personal Computer From The Inside Out", p.295:
*
* "Another unique feature of the monochrome adapter is a set of line-drawing and area-fill characters
* that give continuous lines and filled areas. This is unusual for a display with a 9x14 character box
* because the character generator provides a row only eight dots wide. On most displays, a blank 9th
* dot is then inserted between characters. On the monochrome display, there is circuitry that duplicates
* the 8th dot into the 9th dot position for characters whose ASCII codes are 0xB0 [sic] through 0xDF."
*
* However, the above text is mistaken about the start of the range. While there ARE line-drawing characters
* in the range 0xB0-0xBF, none of them extend all the way to the right edge; IBM carefully segregated them.
* And in fact, characters 0xB0-0xB2 contain hash patterns that you would NOT want extended into the 9th column.
*
* The CGA font is part of the same ROM. In fact, there are TWO CGA fonts in the ROM: a thin 5x7 "single dot"
* font located at offset 0x1000, and a thick 7x7 "double dot" font at offset 0x1800. The latter is the default
* font, unless overridden by a jumper setting on the CGA card, so it is our default CGA font as well (although
* someday we may provide a virtual jumper setting that allows you to select the thinner font).
*
* The first offset we must pass to setFontData() is the offset of the CGA font; we choose the thicker "double dot"
* CGA font at 0x1800 (which was the PC's default font as well), instead of the thinner "single dot" font at 0x1000.
* The second offset is for the MDA font.
*/
this.setFontData(abFontData, [0x1800, 0x0000]);
}
else {
this.notice("Unrecognized font data length (" + abFontData.length + ")");
return;
}
} catch (e) {
this.notice("Font ROM data error: " + e.message);
return;
}
/*
* If we're still here, then we're ready!
*
* UPDATE: Per issue #21, I'm issuing setReady() *only* if a valid contextScreen exists *or* a Debugger is attached.
*
* TODO: Consider a more general-purpose solution for deciding whether or not the user wants to run in a "headless" mode.
*/
if (this.contextScreen || this.dbg) this.setReady();
};
/**
* onROMLoad(abRom, aParms)
*
* Called by the ROM's copyROM() function whenever a ROM component with a 'notify' attribute containing
* our component ID has been loaded.
*
* @this {Video}
* @param {Array.<number>} abROM
* @param {Array.<number>} [aParms]
*/
Video.prototype.onROMLoad = function(abROM, aParms)
{
if (this.nCard == Video.CARD.EGA) {
/*
* TODO: Unlike the MDA/CGA font data, we may want to hang onto this data, so that we can
* regenerate the color font(s) whenever the foreground and/or background colors have changed.
*/
if (DEBUG) this.printMessage("onROMLoad(): EGA fonts loaded");
/*
* For EGA cards, in the absence of any parameters, we assume that we're receiving the original
* IBM EGA ROM, which stores its 8x14 font data at 0x2230 as a contiguous stream; the total size
* of the 8x14 font is 0xE00 bytes.
*
* At 0x3030, there is an "ALPHA SUPPLEMENT" table, which contains 15 bytes per row instead of 14,
* because each row is preceded by one byte containing the corresponding ASCII code; there are 20
* entries in the supplemental table, for a total size of 0x12C bytes.
*
* Finally, at 0x3160, we have the 8x8 font data (also known as the thicker "double dot" CGA font);
* the total size of the 8x8 font is 0x800 bytes. No other font data is present in the EGA ROM;
* the thin 5x7 "single dot" CGA font is notably absent, which is fine, because we never loaded it for
* the MDA/CGA either.
*
* TODO: Determine how the supplemental table is used and whether we need to add some "run-time"
* font generation to support it (as opposed to "init-time" generation, which is all we do now).
* There's probably a similar need for user-defined fonts; for now, they're simply not supported.
*/
this.setFontData(abROM, aParms || [0x3160, 0x2230], 8);
}
else if (this.nCard == Video.CARD.VGA) {
if (DEBUG) this.printMessage("onROMLoad(): VGA fonts loaded");
/*
* For VGA cards, in the absence of any parameters, we assume that we're receiving the original
* IBM VGA ROM, which contains an 8x14 font at 0x3F8D (and corresponding supplemental table at 0x4D8D)
* and an 8x8 font at 0x378D; however, it also contains an 8x16 font at 0x4EBA (and corresponding
* supplemental table at 0x5EBA). See our reconstructed source code in ibm-vga.nasm.
*/
this.setFontData(abROM, aParms || [0x378d, 0x3f8d], 8);
}
this.setReady();
};
/**
* getCardColors(nBitsPerPixel)
*
* @this {Video}
* @param {number} [nBitsPerPixel]
* @returns {Array}
*/
Video.prototype.getCardColors = function(nBitsPerPixel)
{
if (nBitsPerPixel == 1) {
/*
* Only 2 total colors.
*/
this.aRGB[0] = Video.aCGAColors[Video.ATTRS.FGND_BLACK];
this.aRGB[1] = Video.aCGAColors[Video.ATTRS.FGND_WHITE];
return this.aRGB;
}
if (nBitsPerPixel == 2) {
/*
* Of the 4 colors returned, the first color comes from regColor and the other 3 come from one of
* the two hard-coded CGA color sets:
*
* Color Set 1 Color Set 2
* ----------- -----------
* Background (0x00) Background (0x00)
* Green (0x12) Cyan (0x13)
* Red (0x14) Magenta (0x15)
* Brown (0x16) White (0x17)
*
* The numbers in parentheses are the EGA ATC palette register values that the EGA BIOS uses for each
* color set; on an EGA, I synthesize a fake CGA regColor value, until I figure out exactly how the EGA
* simulates the CGA color palette. TODO: Figure it out.
*/
var regColor = this.cardActive.regColor;
if (this.cardActive === this.cardEGA) {
var bBackground = this.cardEGA.regATCData[0];
regColor = bBackground & Card.CGA.COLOR.BORDER;
if (bBackground & Card.ATC.PALETTE.BRIGHT) regColor |= Card.CGA.COLOR.BRIGHT;
if (this.cardEGA.regATCData[1] != 0x12) regColor |= Card.CGA.COLOR.COLORSET2;
}
this.aRGB[0] = Video.aCGAColors[regColor & (Card.CGA.COLOR.BORDER | Card.CGA.COLOR.BRIGHT)];
var aColorSet = (regColor & Card.CGA.COLOR.COLORSET2)? Video.aCGAColorSet2 : Video.aCGAColorSet1;
for (var iColor = 0; iColor < aColorSet.length; iColor++) {
this.aRGB[iColor+1] = Video.aCGAColors[aColorSet[iColor]];
}
return this.aRGB;
}
if (this.cardColor === this.cardCGA) {
/*
* There's no need to update this.aRGB if we simply want to return a hard-coded set of 16 colors.
*/
return Video.aCGAColors;
}
this.assert(this.cardColor === this.cardEGA);
var aRegs = (this.cardEGA.regATCData[15] != null? this.cardEGA.regATCData : Video.aEGAPalDef);
for (var i = 0; i < this.aRGB.length; i++) {
var b = aRegs[i] || 0;
var bRed = (((b & 0x04)? 0xaa : 0) | ((b & 0x20)? 0x55 : 0));
var bGreen = (((b & 0x02)? 0xaa : 0) | ((b & 0x10)? 0x55 : 0));
var bBlue = (((b & 0x01)? 0xaa : 0) | ((b & 0x08)? 0x55 : 0));
this.aRGB[i] = [bRed, bGreen, bBlue, 0xff];
}
return this.aRGB;
};
/**
* setFontData(abFontData, aFontOffsets, cxFontChar)
*
* To support partial font rebuilds (required for the EGA), we now preserve the original font data (abFontData),
* font offsets (aFontOffsets), and font character width (8 for the EGA, undefined for the MDA/CGA).
*
* TODO: Ultimately, we want to have exactly one dedicated font for the EGA, the data for which we'll read directly
* from plane 2 of video memory, instead of relying on the original font data in ROM. Relying on the ROM data was
* originally just a crutch to help get EGA support bootstrapped.
*
* Also, for the MDA/CGA, we should be discarding the font data after the first buildFonts() call, because we
* should not need to ever rebuild the fonts for those cards (both their font patterns and colors were hard-coded).
*
* @this {Video}
* @param {*} abFontData is the raw font data, from the ROM font file
* @param {Array.<number>} aFontOffsets contains offsets into abFontData: [0] for CGA, [1] for MDA
* @param {number} [cxFontChar] is a fixed character width to use for all fonts; undefined to use MDA/CGA defaults
*/
Video.prototype.setFontData = function(abFontData, aFontOffsets, cxFontChar)
{
this.abFontData = abFontData;
this.aFontOffsets = aFontOffsets;
this.cxFontChar = cxFontChar;
};
/**
* buildFonts()
*
* buildFonts() is called whenever the Video component is reset or restored; we used to build the fonts as soon
* as the ROM containing them was loaded, and then throw away the underlying font data, but with the EGA's ability
* to change the color of any font, font building must now be deferred until the reset or restore notifications,
* ensuring we have access to all the colors the card is currently programmed to use.
*
* We're also called whenever EGA palette registers are modified, since one or more fonts will likely need
* to be rebuilt (this is because our fonts contain pre-rendered images of all glyphs for all 16 active colors).
* Calls to buildFonts() should not be expensive though: the underlying createFont() function rebuilds a font only
* if its color has actually changed.
*
* TODO: We should avoid rebuilding fonts when palette registers change in graphics modes. More importantly, our
* font code is still written with the assumption that, like the MDA/CGA, the underlying font data never changes.
* The EGA, however, stores its fonts in plane 2, which means fonts are dynamic; this needs to be fixed.
*
* Supporting dynamic EGA fonts should not be hard though. We can get rid of abFontData and simply build a
* temporary snapshot of all the font bytes in plane 2 of the EGA's video buffer (adwMemory), and pass that on to
* buildFont() instead. We'll also need to either invalidate the existing font's color (to trigger a rebuild) or
* pass a new "force rebuild" flag.
*
* Once that's done, an added benefit will be that we can build just the font(s) that have been loaded into plane 2,
* instead of the multitude of fonts that we now build on a just-in-case basis (eg, the MDA font, the 8x8 CGA font
* for 43-line mode, and so on).
*
* @this {Video}
* @return {boolean} true if any or all fonts were (re)built, false if nothing changed
*/
Video.prototype.buildFonts = function()
{
var fChanges = false;
/*
* There's no point building any fonts if we're in a non-windowed (eg, command-line) environment or no font data was loaded.
*/
if (window && this.abFontData) {
var aRGBColors = this.getCardColors();
var offSplit = 0x0000;
var cxChar = this.cxFontChar? this.cxFontChar : 8;
if (this.buildFont(Video.FONT.CGA, this.aFontOffsets[0], offSplit, cxChar, 8, this.abFontData, aRGBColors)) {
fChanges = true;
}
offSplit = this.cxFontChar? 0 : 0x0800;
cxChar = this.cxFontChar? this.cxFontChar : 9;
if (this.buildFont(Video.FONT.MDA, this.aFontOffsets[1], offSplit, cxChar, 14, this.abFontData, Video.aMDAColors, Video.aMDAColorMap)) {
fChanges = true;
}
if (this.cxFontChar) {
if (this.buildFont(this.nCard, this.aFontOffsets[1], 0, this.cxFontChar, 14, this.abFontData, aRGBColors)) {
fChanges = true;
}
}
}
return fChanges;
};
/**
* buildFont(nFont, offData, offSplit, cxChar, cyChar, abFontData, aRGBColors, aColorMap)
*
* This is a wrapper for createFont() which also takes care loading double-size fonts when fDoubleFont is set.
*
* @this {Video}
* @param {number} nFont
* @param {number|null} offData is the offset of the font data, null if none
* @param {number} offSplit is the offset of any split font data, or zero if not split
* @param {number} cxChar is the width of the font characters
* @param {number} cyChar is the height of the font characters
* @param {*} abFontData is the raw font data, from the ROM font file
* @param {Array} aRGBColors is an array of color RGB variations, corresponding to supported FGND attribute values
* @param {Array} [aColorMap] contains color indexes corresponding to attribute values (if not supplied, the mapping is assumed to be 1-1)
* @return {boolean} true if any or all fonts were (re)built, false if nothing changed
*/
Video.prototype.buildFont = function(nFont, offData, offSplit, cxChar, cyChar, abFontData, aRGBColors, aColorMap)
{
var fChanges = false;
if (offData != null) {
if (DEBUG && this.messageEnabled()) {
this.printMessage("buildFont(" + nFont + "): building " + Video.cardSpecs[nFont][0] + " font");
}
if (this.createFont(nFont, offData, offSplit, cxChar, cyChar, abFontData, aRGBColors, aColorMap)) fChanges = true;
/*
* If font-doubling is enabled, then load a double-size version of the font as well, as it provides
* sharper rendering, especially when the screen cell size is a multiple of the above font cell size;
* in the case of the CGA, this may also be useful for 40-column modes.
*/
if (this.fDoubleFont) {
nFont <<= 1;
if (DEBUG && this.messageEnabled()) {
this.printMessage("buildFont(" + nFont + "): building " + Video.cardSpecs[nFont >> 1][0] + " double-size font");
}
if (this.createFont(nFont, offData, offSplit, cxChar, cyChar, abFontData, aRGBColors, aColorMap)) fChanges = true;
}
}
return fChanges;
};
/**
* createFont(nFont, offData, offSplit, cxChar, cyChar, abFontData, aRGBColors, aColorMap)
*
* All color variations are stored on the same font canvas, arranged vertically as a series of grids, where each
* grid is a 16x16 character glyph array.
*
* Since every character must be drawn first with its background color and then with the foreground shape on top,
* I used to include a series of empty cells at the top every font canvas containing all supported background colors
* (ie, before the character grids). But now createFont() also creates an aCSSColors array that is saved alongside
* the font canvas, and updateChar() uses that array in conjunction with fillRect() to draw character backgrounds.
*
* @this {Video}
* @param {number} nFont
* @param {number} offData is the offset of the font data
* @param {number} offSplit is the offset of any split font data, or zero if not split
* @param {number} cxChar is the width of the font characters
* @param {number} cyChar is the height of the font characters
* @param {*} abFontData is the raw font data, from the ROM font file
* @param {Array} aRGBColors is an array of color RGB variations, corresponding to supported FGND attribute values
* @param {Array|undefined} aColorMap contains color indexes corresponding to attribute values (if not supplied, the mapping is assumed to be 1-1)
* @return {boolean} true if any or all fonts were (re)created, false if nothing changed
*/
Video.prototype.createFont = function(nFont, offData, offSplit, cxChar, cyChar, abFontData, aRGBColors, aColorMap)
{
var fChanges = false;
var nDouble = (nFont & 0x1)? 0 : 1;
var font = this.aFonts[nFont];
if (!font) {
font = {
cxCell: cxChar << nDouble,
cyCell: cyChar << nDouble,
aCSSColors: new Array(aRGBColors.length),
aRGBColors: aRGBColors.slice(), // using the Array slice() method to simply make a copy
aColorMap: aColorMap,
aCanvas: new Array(aRGBColors.length)
};
}
for (var iColor = 0; iColor < aRGBColors.length; iColor++) {
var rgbColor = aRGBColors[iColor];
var rgbColorOrig = font.aCSSColors[iColor]? font.aRGBColors[iColor] : [];
if (rgbColor[0] !== rgbColorOrig[0] || rgbColor[1] !== rgbColorOrig[1] || rgbColor[2] !== rgbColorOrig[2]) {
if (DEBUG && this.messageEnabled()) {
this.printMessage("creating font color " + iColor + " for font " + nFont);
}
this.createFontColor(font, iColor, rgbColor, nDouble, offData, offSplit, cxChar, cyChar, abFontData);
fChanges = true;
}
}
this.aFonts[nFont] = font;
return fChanges;
};
/**
* createFontColor(font, iColor, rgbColor, nDouble, offData, offSplit, cxChar, cyChar, abFontData)
*
* @this {Video}
* @param {Object} font
* @param {number} iColor
* @param {Array} rgbColor contains the RGB values for iColor
* @param {number} nDouble is 1 to double output font dimensions, 0 to match input dimensions
* @param {number} offData is the offset of the font data
* @param {number} offSplit is the offset of any split font data, or zero if not split
* @param {number} cxChar is the width of the font characters
* @param {number} cyChar is the height of the font characters
* @param {*} abFontData is the raw font data, from the ROM font file
*/
Video.prototype.createFontColor = function(font, iColor, rgbColor, nDouble, offData, offSplit, cxChar, cyChar, abFontData)
{
/*
* Now we're ready to create a 16x16 character grid for the specified color. Note that all
* the character bits are opaque (alpha=0xff) while all the surrounding bits are transparent
* (alpha=0x00, as specified in the 4th byte of rgbOff).
*
* Originally, I created 256 ImageData objects, using context.createImageData(cxChar,cyChar),
* then setting its pixels to match those of an individual character, and then drawing characters
* with contextFont.putImageData(). But putImageData() is relatively slow....
*
* Now I create a new canvas, with dimensions that allow me to arrange all 256 characters in an
* 16x16 grid -- much like the "chargen.png" bitmap used in the C1Pjs version of the Video component.
* Then drawing becomes much the same as before, because it turns out that drawImage() accepts either
* an image object OR a canvas object.
*
* This also yields better performance, since drawImage() is much faster than putImageData().
* We still have to use putImageData() to build the font canvas, but that's a one-time operation.
*/
var rgbOff = [0x00, 0x00, 0x00, 0x00];
var canvasFont = window.document.createElement("canvas");
canvasFont.width = font.cxCell << 4;
canvasFont.height = (font.cyCell << 4);
var contextFont = canvasFont.getContext("2d");
/*
* See notes above regarding ImageSmoothingEnabled....
*
contextFont['mozImageSmoothingEnabled'] = false;
contextFont['webkitImageSmoothingEnabled'] = false;
*/
var iChar, x, y;
var cyLimit = (cyChar < 8 || !offSplit)? cyChar : 8;
var imageChar = contextFont.createImageData(font.cxCell, font.cyCell);
for (iChar = 0; iChar < 256; iChar++) {
for (y = 0; y < cyChar; y++) {
/*
* fUnderline should be true only in the FONT_MDA case, and only for the odd color variations
* (1 and 3, out of variations 0 to 4), and only for the two bottom-most rows of the character cell
* (which I still need to confirm)
*/
var fUnderline = (font.aColorMap && (iColor & 0x1) && y >= cyChar - 2);
var offChar = (y < cyLimit? offData + iChar * cyLimit + y : offSplit + iChar * cyLimit + y - cyLimit);
var b = abFontData[offChar];
for (var nRowDoubler = 0; nRowDoubler <= nDouble; nRowDoubler++) {
for (x = 0; x < cxChar; x++) {
/*
* This "bit" of logic takes care of those characters (0xC0-0xDF) whose 9th bit must mirror the 8th bit;
* in all other cases, any bit past the 8th bit is automatically zero. It also takes care of embedding a solid
* row of bits whenever fUnderline is true.
*/
var bit = (fUnderline? 1 : (b & (0x80 >> (x >= 8 && iChar >= 0xC0 && iChar <= 0xDF? 7 : x))));
var xDst = (x << nDouble);
var yDst = (y << nDouble) + nRowDoubler;
var rgb = (bit? rgbColor : rgbOff);
this.setPixel(imageChar, xDst, yDst, rgb);
if (nDouble) this.setPixel(imageChar, xDst + 1, yDst, rgb);
}
}
}
/*
* (iChar >> 4) performs the integer equivalent of Math.floor(iChar / 16), and (iChar & 0xf) is the equivalent of (iChar % 16).
*/
contextFont.putImageData(imageChar, x = (iChar & 0xf) * font.cxCell, y = (iChar >> 4) * font.cyCell);
}
/*
* The colors for cell backgrounds and cursor elements must be converted to CSS color strings.
*/
font.aCSSColors[iColor] = "#" + str.toHex(rgbColor[0], 2) + str.toHex(rgbColor[1], 2) + str.toHex(rgbColor[2], 2);
font.aRGBColors[iColor] = rgbColor;
/*
* Enable this code if you want to see what the generated font looks like....
*
if (MAXDEBUG) {
var iSrcColor = (iColor == 15? 0 : iColor + 1);
this.contextScreen.fillStyle = aCSSColors[iSrcColor];
this.contextScreen.fillRect(iColor*(font.cxCell<<2), 0, canvasFont.width>>2, font.cyCell<<4);
this.contextScreen.drawImage(canvasFont, 0, iColor*(font.cyCell<<4), canvasFont.width>>2, font.cyCell<<4, iColor*(font.cxCell<<2), 0, canvasFont.width>>2, font.cyCell<<4);
}
*/
font.aCanvas[iColor] = canvasFont;
};
/**
* checkBlink()
*
* Called at the end of every updateScreen(), which may have updated cBlinkVisible to a non-zero value.
*
* Also called at the end of every checkCursor(); ie, whenever the CRT register(s) affecting the position or shape
* of the hardware cursor have been modified, and any of iCellCursor, yCursor or cyCursor have been modified as a result.
*
* Note that the cursor always blinks when it's ON; it can only be turned OFF, moved off-screen, or its rate set to half
* the normal blink rate (by default, it blinks at the normal blink rate). Bits 5-6 of the CRTC.CURSOR_START register can
* be set as follows:
*
* 00: Cursor blinks at normal blink rate
* 01: Cursor is off
* 10: (Same as 00)
* 11: Cursor blinks at half the normal blink rate
*
* According to documentation, the normal blink rate is 1/16 of the frame rate (8 frames on, 8 off).
*
* TODO: As an aside, I've observed in the "real world" that the MDA cursor cycles about 3 times per second, and by "cycle"
* I mean one full off-and-on-again cycle. I'm assuming that's the normal rate (00), not the slower "half rate" (11).
* Since that's faster than our current cursor blink rate, we should look into an option to boost our rate, without adversely
* affecting the attribute blink rate (which is currently hard-coded at half the cursor blink rate), and we should look into
* supporting "half rate" blinking, too.
*
* @this {Video}
* @return {boolean} true if there are things to blink, false if not
*/
Video.prototype.checkBlink = function()
{
if (this.cBlinkVisible > 0 || this.iCellCursor >= 0) {
if (this.cBlinks < 0) {
this.cBlinks = 0;
/*
* At this point, we can either fire up our own timer (doBlink), or rely on updateScreen()
* being called by the CPU at a regular rate (eg, CPU.VIDEO_UPDATES_PER_SECOND = 60) and advance
* cBlinks at the start of updateScreen() accordingly.
*
* doBlink() wants to increment cBlinks every 266ms. On the other hand, if updateScreen() is being
* called 60 times per second, that's about once every 16ms, so if every 16th updateScreen() increments
* cBlinks, cBlinks should advance at the same rate.
*
* The only downside to relying on the CPU driving our blink count is that whenever the CPU is halted
* (eg, by the PCjs debugger) all blinking stops -- all characters with the blink attribute AND the cursor.
*
* But we can simply say that when we halt, we mean "halt everything" (ie, call it a feature).
*
* this.doBlink(true);
*/
}
return true;
}
this.cBlinks = -1;
return false;
};
/**
* checkCursor()
*
* Called whenever a CRT data register is updated, since there are multiple registers that can affect the
* visibility of the cursor (more than these, actually, but I'm going to limit my initial support to standard
* ROM BIOS controller settings):
*
* CRTC.MAX_SCAN_LINE
* CRTC.CURSOR_START
* CRTC.CURSOR_END
* CRTC.START_ADDR_HI
* CRTC.START_ADDR_LO
* CRTC.CURSOR_ADDR_HI
* CRTC.CURSOR_ADDR_LO
*
* @this {Video}
* @return {boolean} true if the cursor is visible, false if not
*/
Video.prototype.checkCursor = function()
{
/*
* The "hardware cursor" is never visible in graphics modes.
*/
if (!this.nFont) return false;
for (var i = Card.CRTC.CURSOR_START.INDX; i <= Card.CRTC.CURSOR_ADDR_LO; i++) {
if (this.cardActive.regCRTData[i] == null)
return false;
}
var bCursorFlags = this.cardActive.regCRTData[Card.CRTC.CURSOR_START.INDX];
var bCursorStart = bCursorFlags & Card.CRTC.CURSOR_START.MASK;
var bCursorEnd = this.cardActive.regCRTData[Card.CRTC.CURSOR_END.INDX] & Card.CRTC.CURSOR_END.MASK;
var bCursorMax = this.cardActive.regCRTData[Card.CRTC.MAX_SCAN_LINE] & Card.CRTC.CURSOR_END.MASK;
/*
* HACK: The original EGA BIOS has a cursor emulation bug when 43-line mode is enabled, so we attempt to detect
* that particular combination of bad values and automatically fix them (we're so thoughtful!)
*/
var fEGAHack = false;
if (this.cardActive === this.cardEGA) {
fEGAHack = true;
if (bCursorMax == 7 && bCursorStart == 4 && !bCursorEnd) bCursorEnd = 7;
}
/*
* One way of disabling the cursor is to set bit 5 (Card.CRTC.CURSOR_START.BLINKOFF) of the CRTC.CURSOR_START flags;
* another way is setting bCursorStart > bCursorEnd (unless it's an EGA, in which case we must actually draw a
* "split block" cursor instead).
*
* TODO: Verify whether the second test (bCursorStart > bCursorMax) should also result in a hidden cursor;
* ThinkTank sets both start and end values to 0x0f, which doesn't make sense on a CGA, where the max is 0x07.
*/
if ((bCursorFlags & Card.CRTC.CURSOR_START.BLINKOFF) || bCursorStart > bCursorEnd && !fEGAHack || bCursorStart > bCursorMax) {
this.removeCursor();
return false;
}
/*
* The most compatible way of disabling the cursor is to simply move the cursor to an off-screen position.
*/
var iCellCursor = (this.cardActive.regCRTData[Card.CRTC.CURSOR_ADDR_LO] + ((this.cardActive.regCRTData[Card.CRTC.CURSOR_ADDR_HI] & Card.CRTC.ADDR_HI_MASK) << 8));
if (this.iCellCursor != iCellCursor) {
if (DEBUG && this.messageEnabled()) {
this.printMessage("checkCursor(): cursor moved from " + this.iCellCursor + " to " + iCellCursor);
}
this.removeCursor();
this.iCellCursor = iCellCursor;
}
/*
* yCursor and cyCursor are no longer scaled at this point, because the necessary scaling will depend on whether we're
* drawing the cursor to the on-screen or off-screen buffer, and updateChar() is in the best position to determine that.
*
* We also record cyCursorCell, the hardware cell height, since we'll need to know what the yCursor and cyCursor values
* are relative to when it's time to scale them.
*/
var bCursorSize = bCursorEnd - bCursorStart + 1;
if (this.yCursor != bCursorStart || this.cyCursor != bCursorSize) {
this.yCursor = bCursorStart;
this.cyCursor = bCursorSize;
}
this.cyCursorCell = bCursorMax + 1;
this.checkBlink();
return true;
};
/**
* removeCursor()
*
* @this {Video}
*/
Video.prototype.removeCursor = function()
{
if (this.iCellCursor >= 0) {
if (this.aCellCache !== undefined) {
var drawCursor = (Video.ATTRS.DRAW_CURSOR << 8);
var data = this.aCellCache[this.iCellCursor];
if (data & drawCursor) {
data &= ~drawCursor;
var col = this.iCellCursor % this.nCols;
var row = (this.iCellCursor / this.nCols)|0;
if (this.nFont && this.aFonts[this.nFont]) {
/*
* If we're using an off-screen buffer in text mode, then we need to keep it in sync with "reality".
*/
if (this.contextScreenBuffer) {
this.updateChar(col, row, data, this.contextScreenBuffer);
}
/*
* While updating the on-screen canvas directly could open us up to potential subpixel artifacts again,
* I'm hopeful that won't be the case, since removeCursor() is called only during certain well-defined
* events. The alternative to this simple updateChar() call is unappealing: redrawing the ENTIRE off-screen
* buffer to the on-screen canvas, just as updateScreen() does.
*/
this.updateChar(col, row, data);
}
if (DEBUG && this.messageEnabled()) {
this.printMessage("removeCursor(): removed from " + row + "," + col);
}
this.aCellCache[this.iCellCursor] = data;
}
}
this.iCellCursor = -1;
}
};
/**
* getAccess()
*
* @this {Video}
* @return {number|undefined} current memory access setting, or undefined if unknown
*/
Video.prototype.getAccess = function()
{
var nAccess;
var card = this.cardActive;
var regGRCMode = card.regGRCData[Card.GRC.MODE.INDX];
if (regGRCMode != null) {
var nReadAccess = Card.ACCESS.READ.MODE0;
var nWriteAccess = Card.ACCESS.WRITE.MODE0;
var nWriteMode = regGRCMode & Card.GRC.MODE.WRITE;
var regDataRotate = card.regGRCData[Card.GRC.DATAROT.INDX] & Card.GRC.DATAROT.MASK;
switch (nWriteMode) {
case Card.GRC.MODE.WRITE_MODE0:
if (regDataRotate) {
nWriteAccess = Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.ROT;
switch (regDataRotate & Card.GRC.DATAROT.FUNC) {
case Card.GRC.DATAROT.AND:
nWriteAccess = Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.AND;
break;
case Card.GRC.DATAROT.OR:
nWriteAccess = Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.OR;
break;
case Card.GRC.DATAROT.XOR:
nWriteAccess = Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.XOR;
break;
default:
break;
}
card.nDataRotate = regDataRotate & Card.GRC.DATAROT.COUNT;
}
break;
case Card.GRC.MODE.WRITE_MODE1:
nWriteAccess = Card.ACCESS.WRITE.MODE1;
break;
case Card.GRC.MODE.WRITE_MODE2:
switch (regDataRotate & Card.GRC.DATAROT.FUNC) {
default:
nWriteAccess = Card.ACCESS.WRITE.MODE2;
break;
case Card.GRC.DATAROT.AND:
nWriteAccess = Card.ACCESS.WRITE.MODE2 | Card.ACCESS.WRITE.AND;
break;
case Card.GRC.DATAROT.OR:
nWriteAccess = Card.ACCESS.WRITE.MODE2 | Card.ACCESS.WRITE.OR;
break;
case Card.GRC.DATAROT.XOR:
nWriteAccess = Card.ACCESS.WRITE.MODE2 | Card.ACCESS.WRITE.XOR;
break;
}
break;
default:
if (DEBUG && this.messageEnabled()) {
this.printMessage("getAccess(): invalid GRC mode (" + str.toHexByte(regGRCMode) + ")");
}
break;
}
if (regGRCMode & Card.GRC.MODE.READ_MODE1) {
nReadAccess = Card.ACCESS.READ.MODE1;
}
/*
* I discovered that when the IBM EGA ROM scrolls the screen in graphics modes 0x0D and 0x0E, it
* reprograms this register for WRITE_MODE1 (which is fine) *and* EVENODD (which is, um, very odd).
* Moreover, it does NOT make the complementary change to the SEQ.MEMMODE.SEQUENTIAL bit; under
* "normal" circumstances, those two bits are always supposed to programmed oppositely.
*
* Until I can perform some tests on real hardware, I have to assume that the EGA scroll operation
* is supposed to actually WORK in modes 0x0D and 0x0E, so I've decided to tie the trigger for my own
* EVENODD functions to SEQ.MEMMODE.SEQUENTIAL being clear, instead of GRC.MODE.EVENODD being set.
*
* It's also possible that my EVENODD read/write functions are not implemented properly; when EVENODD
* is in effect, which addresses get latched by a read, and to which addresses are latches written?
* If EVENODD has no effect on the effective address used with the latches, then I should change the
* EVENODD read/write functions accordingly.
*
* However, I've also done some limited testing with an emulated VGA running in text mode, and I've
* discovered that toggling the GRC.MODE.EVENODD bit *alone* doesn't seem to affect the delivery of
* text mode attributes from plane 1. So maybe this is the wiser change after all.
*
* TODO: Perform some tests on actual EGA/VGA hardware, to determine the proper course of action.
*
* if (regGRCMode & Card.GRC.MODE.EVENODD) {
* nReadAccess |= Card.ACCESS.READ.EVENODD;
* nWriteAccess |= Card.ACCESS.WRITE.EVENODD;
* }
*/
var regSEQMode = card.regSEQData[Card.SEQ.MEMMODE.INDX];
if (regSEQMode != null) {
if (!(regSEQMode & Card.SEQ.MEMMODE.SEQUENTIAL)) {
nReadAccess |= Card.ACCESS.READ.EVENODD;
nWriteAccess |= Card.ACCESS.WRITE.EVENODD;
}
}
nAccess = nReadAccess | nWriteAccess;
}
return nAccess;
};
/**
* setAccess(nAccess)
*
* @this {Video}
* @param {number|undefined} nAccess (one of the Card.ACCESS.* constants)
*/
Video.prototype.setAccess = function(nAccess)
{
var card = this.cardActive;
if (card && nAccess != null && nAccess != card.nAccess) {
if (DEBUG && this.messageEnabled()) {
this.printMessage("setAccess(" + str.toHexWord(nAccess) + ")");
}
card.setMemoryAccess(nAccess);
/*
* Note that setMemoryAccess() can fail, in which case it will an report error, indicating either a
* misconfiguration or some sort of internal inconsistency; in any case, there's not much we can do about
* it at this point, other than possibly reverting the current access setting. There's probably not much
* point, however, because there's no guarantee that setMemoryAccess() didn't modify one or more blocks
* before choking.
*/
this.bus.setMemoryAccess(card.addrBuffer, card.sizeBuffer, card.getMemoryAccess());
}
};
/**
* setDimensions()
*
* @this {Video}
*/
Video.prototype.setDimensions = function()
{
this.nFont = 0;
this.nCols = this.nColsDefault;
this.nRows = this.nRowsDefault;
this.nColsLogical = this.nCols;
this.nCellsPerWord = Video.aModeParms[Video.MODE.MDA_80X25][2];
this.cbPadding = 0;
var modeParms = Video.aModeParms[this.nMode];
if (modeParms) {
this.nCols = modeParms[0];
this.nRows = modeParms[1];
this.nCellsPerWord = modeParms[2];
this.cbPadding = modeParms[3] || 0;
this.nFont = modeParms[4]; // this will be undefined for graphics modes
if (this.nMonitorType == ChipSet.MONITOR.EGACOLOR || this.nMonitorType == ChipSet.MONITOR.VGACOLOR) {
/*
* When an EGA is connected to a CGA monitor, the old aModeParms table is correct: we must
* use the hard-coded 8x8 "CGA_80" font. But when it's connected to an EGA monitor, we want
* to use the 9x14 "EGA" color font instead.
*
* TODO: Can an EGA with a monochrome monitor be programmed for 43-line mode as well? If so,
* then we'll need to load another MDA font variation, because we only load an 9x14 font for MDA.
*/
if (this.cardActive === this.cardEGA && this.nFont == Video.FONT.CGA) {
if (this.cardEGA.regCRTData[Card.CRTC.MAX_SCAN_LINE] == 7) {
/*
* Vertical resolution of 350 divided by 8 (ie, scan lines 0-7) yields 43 whole rows.
*/
this.nRows = 43;
}
/*
* Since we can also be called before any hardware registers have been initialized,
* it may be best to not perform the following test (which is why it's commented out).
*/
else /* if (this.cardEGA.regCRTData[Card.CRTC.MAX_SCAN_LINE] == 13) */ {
/*
* Vertical resolution of 350 divided by 14 (ie, scan lines 0-13) yields exactly 25 rows.
*
* Note that a card's default font matches its card ID (eg, Video.CARD.EGA == Video.FONT.EGA,
* and Video.CARD.VGA == Video.FONT.VGA)
*/
this.nFont = this.nCard;
}
}
}
}
this.nCells = (this.nCols * this.nRows)|0;
this.nCellCache = (this.nCells / this.nCellsPerWord)|0;
this.cbScreen = ((this.nCellCache << 1) + this.cbPadding)|0;
this.cbSplit = (this.cbPadding? ((this.cbScreen + this.cbPadding) >> 1) : 0);
if (this.nMode >= Video.MODE.EGA_320X200) {
/*
* Double nCellCache when every cell is a byte rather than a word, and add an extra byte for every row
* to handle instances where horizontal panning is used.
*/
this.nCellCache += (this.nCellCache + this.nRows);
}
/*
* If no fonts were successfully loaded, there's no point in initializing the remaining drawing parameters.
*/
if (!this.aFonts.length) return;
this.cxScreenCell = (this.cxScreen / this.nCols)|0;
this.cyScreenCell = (this.cyScreen / this.nRows)|0;
/*
* Now we make the all-important scaling determination: if the font cell dimensions (cxCell, cyCell)
* don't match the physical screen cell dimensions (cxCell, cyCell), then we look at the caller's
* fScaleFont setting: if it's false, we draw the characters as-is, with a border if the characters
* are smaller than the cells; and if fScaleFont is true, we simply tell drawImage to draw the
* characters to fit.
*
* WARNING: The only problem with fScaleFont is that any stretching or shrinking tends to be accompanied
* by subpixel artifacts along the boundaries of the font images. Definitely annoying, and apparently
* there are no standard mechanisms for turning that behavior off. So, for now, I've "neutered" the
* fScaleFont test slightly, by adding the "nCols == 80" test that prevents scaling from kicking in for
* 40-column modes.
*
* Also, whether scaling or not, if it makes sense to use a "doubled" font, we'll switch the font as
* well. Note that the doubled font for any existing font also has an ID that is double the existing ID,
* making it easy to check for the existence of a font's "double" (shift the ID left by 1).
*
* TODO: Since we now use an off-screen buffer for ALL modes, both text and graphics, we should
* revisit changes that were made to work around subpixel artifacts; those should no longer be an issue.
*/
if (this.nFont) {
var font = this.aFonts[this.nFont];
var fontDoubled = this.aFonts[this.nFont << 1];
if (this.fScaleFont && this.nCols == 80) {
if (fontDoubled) {
if (this.cxScreenCell >= (fontDoubled.cxCell * 3) >> 2) { // && this.cyScreenCell > (fontDoubled.cyCell * 3) >> 2) {
this.nFont <<= 1;
font = fontDoubled;
if (DEBUG) this.log("setDimensions(): switching to double-size font, scaled");
}
}
} else {
if (fontDoubled) {
if (this.cxScreenCell >= fontDoubled.cxCell) { // && this.cyScreenCell == fontDoubled.cyCell) {
this.nFont <<= 1;
font = fontDoubled;
if (DEBUG) this.log("setDimensions(): switching to double-size font, unscaled");
}
}
if (font) {
this.cxScreenCell = font.cxCell;
this.cyScreenCell = font.cyCell;
}
}
/*
* In text modes, we have the option of setting all the *ScreenBuffer variables to null instead of
* allocating them, because updateChar(), as currently written, is capable of writing characters to
* either an off-screen or on-screen context.
*
* this.imageScreenBuffer = this.canvasScreenBuffer = this.contextScreenBuffer = null;
*/
this.cxBuffer = this.cyBuffer = 0;
if (font) {
this.cxBuffer = this.nCols * font.cxCell;
this.cyBuffer = this.nRows * font.cyCell;
}
} else {
/*
* CGA graphics modes have their "cells" (pixels) split evenly across two halves of the video buffer, with
* EVEN scan lines in the first half and ODD scan lines in the second half, so unlike text modes, we can't set a
* limit of what's visible on-screen to "columns * rows", so the screen limit is set to match the buffer limit.
*
* In addition, updateScreen() requires an off-screen imageData buffer that matches the size of the entire screen,
* so that updateScreen() can set all pixels that have changed and then update the screen with a single drawImage().
*
* An alternative approach, with a smaller footprint, would be to allocate an off-screen buffer large enough for a
* single scan line, and redraw one scan line at a time, but given how EVEN and ODD scan lines are spread across the
* entire buffer, it's not clear there would be enough unchanged scan lines on average to make that approach faster.
*/
this.cxScreenCell = this.cyScreenCell = 1; // in graphics mode, a cell is exactly one pixel
this.cxBuffer = this.nCols;
this.cyBuffer = this.nRows;
}
/*
* Allocate the off-screen buffers
*/
this.imageScreenBuffer = this.contextScreen.createImageData(this.cxBuffer, this.cyBuffer);
this.canvasScreenBuffer = window.document.createElement("canvas");
this.canvasScreenBuffer.width = this.cxBuffer;
this.canvasScreenBuffer.height = this.cyBuffer;
this.contextScreenBuffer = this.canvasScreenBuffer.getContext("2d");
/*
* Since cxCell and cyCell were originally defined in terms of cxScreen/nCols and cyScreen/nRows, you might think
* these border calculations would always be zero, but that would mean you overlooked the code above which tries to
* avoid stretching 40-column modes into an unpleasantly wide shape.
*/
this.xScreenOffset = this.yScreenOffset = 0;
this.cxScreenOffset = this.cxScreen;
this.cyScreenOffset = this.cyScreen;
var cxBorder = this.cxScreen - (this.nCols * this.cxScreenCell);
var cyBorder = this.cyScreen - (this.nRows * this.cyScreenCell);
if (cxBorder > 0) {
this.xScreenOffset = (cxBorder >> 1);
this.cxScreenOffset -= cxBorder;
}
if (cyBorder > 0) {
this.yScreenOffset = (cyBorder >> 1);
this.cyScreenOffset -= cyBorder;
}
if (cxBorder || cyBorder) {
this.contextScreen.fillStyle = this.canvasScreen.style.backgroundColor;
this.contextScreen.fillRect(0, 0, this.cxScreen, this.cyScreen);
}
};
/**
* checkMode(fForce)
*
* Called whenever the MDA/CGA's mode register (eg, Card.MDA.MODE.PORT, Card.CGA.MODE.PORT) is updated,
* or whenever the EGA's GRC Misc register is updated, or when we've just finished a restore().
*
* @this {Video}
* @param {boolean} [fForce] is used to force a mode update, if we recognize the current mode
* @return {boolean} true if successful, false if not
*/
Video.prototype.checkMode = function(fForce)
{
var nAccess;
var nMode = this.nMode;
var card = this.cardActive;
if (!card) {
/*
* We are likely being called after a restore(), which needs us to call setMode() to insure the proper video
* buffer is mapped in. So we unset this.nMode to guarantee that setMode() will be called, and if it wasn't set
* to anything before, then we fall-back to the default mode.
*/
this.nMode = null;
if (nMode == null) nMode = this.nModeDefault;
}
else {
if (card.nCard == Video.CARD.MDA) {
nMode = Video.MODE.MDA_80X25;
}
else if (card.nCard >= Video.CARD.EGA) {
/*
* The sizeBuffer we choose reflects the amount of physical address space that all 4 planes
* of EGA memory normally span, NOT the total amount of EGA memory. So for a 64Kb EGA card,
* we would set card.sizeBuffer to 16Kb (0x4000).
*
* TODO: Need to take into account modes that "chain" planes together (eg, mode 0x0F, and
* presumably mode 0x10, on an EGA card with only 64Kb).
*/
nMode = null;
var cbBuffer = card.cbMemory >> 2;
var cbBufferText = (cbBuffer > 0x8000? 0x8000 : cbBuffer);
var regGRCMisc = card.regGRCData[Card.GRC.MISC.INDX];
if (regGRCMisc != null) {
switch(regGRCMisc & Card.GRC.MISC.MAPMEM) {
case Card.GRC.MISC.MAPA0128:
card.addrBuffer = 0xA0000;
card.sizeBuffer = cbBuffer; // 0x20000
nMode = Video.MODE.UNKNOWN; // no BIOS mode uses this mapping, but we don't want to leave nMode null if we've come this far
break;
case Card.GRC.MISC.MAPA064:
card.addrBuffer = 0xA0000;
card.sizeBuffer = cbBuffer; // 0x10000
nMode = (this.nMonitorType == ChipSet.MONITOR.MONO? Video.MODE.EGA_640X350_MONO : Video.MODE.EGA_640X350);
break;
case Card.GRC.MISC.MAPB032:
card.addrBuffer = 0xB0000;
card.sizeBuffer = cbBufferText;
nMode = Video.MODE.MDA_80X25;
break;
case Card.GRC.MISC.MAPB832:
card.addrBuffer = 0xB8000;
card.sizeBuffer = cbBufferText;
nMode = (this.nMonitorType == ChipSet.MONITOR.MONO? Video.MODE.CGA_80X25_BW : Video.MODE.CGA_80X25);
break;
default:
break;
}
var fSEQDotClock = (card.regSEQData[Card.SEQ.CLOCKING.INDX] & Card.SEQ.CLOCKING.DOTCLOCK);
var nCRTCVertTotal = card.regCRTData[Card.CRTC.EGA.VERT_TOTAL];
nCRTCVertTotal |= ((card.regCRTData[Card.CRTC.EGA.OVERFLOW.INDX] & Card.CRTC.EGA.OVERFLOW.VERT_TOTAL_BIT8)? 0x100 : 0);
if (card.nCard == Video.CARD.VGA) {
nCRTCVertTotal |= ((card.regCRTData[Card.CRTC.EGA.OVERFLOW.INDX] & Card.CRTC.EGA.OVERFLOW.VERT_TOTAL_BIT9)? 0x200 : 0);
}
if (nMode != Video.MODE.UNKNOWN) {
if (!(regGRCMisc & Card.GRC.MISC.GRAPHICS)) {
if (fSEQDotClock) nMode -= 2;
} else {
if (card.addrBuffer == 0xB8000) {
//
// Since nMode will have been assigned a default of either 0x02 or 0x03, convert that to either
// 0x05 or 0x04 if we're in a low-res graphics mode, 0x06 otherwise.
//
nMode = fSEQDotClock? (7 - nMode) : Video.MODE.CGA_640X200;
} else {
//
// card.addrBuffer must be 0xA0000, so we need to discriminate between modes 0x0D through 0x10;
// we've already defaulted to 0x0F or 0x10, so determine if it's 0x0D or 0x0E (ie, a 200-row mode)
// and then which one (ie, 320 wide or 640 wide).
//
if (nCRTCVertTotal < 500) {
if (nCRTCVertTotal < 350) {
nMode = (fSEQDotClock? Video.MODE.EGA_320X200 : Video.MODE.EGA_640X200);
}
} else {
nMode = (this.nMonitorType == ChipSet.MONITOR.MONO? Video.MODE.VGA_640X480_MONO : Video.MODE.VGA_640X480);
}
if (DEBUG && this.messageEnabled()) {
this.printMessage("checkMode(): nCRTCVertTotal=" + nCRTCVertTotal + ", mode=" + str.toHexByte(nMode));
this.cpu.stopCPU();
}
}
}
}
nAccess = this.getAccess();
}
}
else if (card.regMode & Card.CGA.MODE.VIDEO_ENABLE) {
/*
* NOTE: For the CGA, we precondition any mode change on CGA.MODE.VIDEO_ENABLE being set, otherwise
* we'll get spoofed by the ROM BIOS scroll code, which waits for vertical retrace and then turns CGA.MODE.VIDEO_ENABLE
* off, using a hard-coded mode value (0x25) that does NOT necessarily match the the CGA video mode currently in effect.
*/
if (!(card.regMode & Card.CGA.MODE.GRAPHIC_SEL)) {
nMode = ((card.regMode & Card.CGA.MODE._80X25)? Video.MODE.CGA_80X25 : Video.MODE.CGA_40X25);
if (card.regMode & Card.CGA.MODE.BW_SEL) nMode -= 1;
} else {
nMode = ((card.regMode & Card.CGA.MODE.HIRES_BW)? Video.MODE.CGA_640X200 : Video.MODE.CGA_320X200_BW);
if (!(card.regMode & Card.CGA.MODE.BW_SEL)) nMode -= 1;
}
}
}
/*
* NOTE: If setMode() remaps the video memory, that will trigger calls to getMemoryAccess() to also update the
* memory's access functions. However, if the memory access setting (nAccess) is about to change as well, those
* changes will be moot until the setAccess() call that follows. Basically, whenever both memory mapping AND access
* functions are changing, the memory will be in an inconsistent state until both setMode() and setAccess() are
* finished.
*
* The setMode() call takes precedence; if we called setAccess() first, it might attempt to modify memory access
* functions based on the card's addrBuffer setting, and if that doesn't match what's currently mapped, assertions
* will be triggered (probably not fatal, but it would defeat the point of the assertions).
*/
if (!this.setMode(nMode, fForce)) return false;
this.setAccess(nAccess);
return true;
};
/**
* setMode(nMode, fForce)
*
* Set fForce to true to update the mode regardless of previous mode, or false to perform a normal update
* that bypasses updateScreen() but still calls initCellCache().
*
* @this {Video}
* @param {number|null} nMode
* @param {boolean|undefined} [fForce] is set when checkMode() wants to force a mode update
* @return {boolean} true if successful, false if failure
*/
Video.prototype.setMode = function(nMode, fForce)
{
if (nMode != null && (nMode != this.nMode || fForce)) {
if (DEBUG && this.messageEnabled()) {
this.printMessage("setMode(" + str.toHexByte(nMode) + (fForce? ",force" : "") + ")");
}
this.cUpdates = 0; // count updateScreen() calls as a means of driving blink updates
this.nMode = nMode;
/*
* On an EGA, it's CRITICAL that a reset() invalidate cardActive, to ensure that the code below
* releases the previous video buffer and installs a new one, even if there was no change in the
* video buffer address or size, because otherwise the Memory blocks installed at the video buffer
* address may still be using blocks of the EGA's previous memory buffer.
*
* When the EGA is reinitialized, a new memory buffer (adwMemory) is allocated (see initEGA()), and
* this is where the mapping of that EGA memory buffer to the video buffer occurs. Other cards
* (MDA or CGA) don't allocate/manage their own memory buffer, but even then, it's still a good idea
* to always force this operation (eg, in case a switch setting changed the active video card).
*/
var card = this.cardActive || (nMode == Video.MODE.MDA_80X25? this.cardMono : this.cardColor);
if (card != this.cardActive || card.addrBuffer != this.addrBuffer || card.sizeBuffer != this.sizeBuffer) {
this.removeCursor();
if (this.addrBuffer) {
if (DEBUG && this.messageEnabled()) {
this.printMessage("setMode(" + str.toHexByte(nMode) + "): removing " + str.toHexLong(this.sizeBuffer) + " bytes from " + str.toHexLong(this.addrBuffer));
}
if (!this.bus.removeMemory(this.addrBuffer, this.sizeBuffer)) {
/*
* TODO: Force this failure case and see how well the Video component deals with it.
*/
return false;
}
if (this.cardActive) this.cardActive.fActive = false;
}
this.cardActive = card;
card.fActive = true;
this.addrBuffer = card.addrBuffer;
this.sizeBuffer = card.sizeBuffer;
if (DEBUG && this.messageEnabled()) {
this.printMessage("setMode(" + str.toHexByte(nMode) + "): adding " + str.toHexLong(this.sizeBuffer) + " bytes to " + str.toHexLong(this.addrBuffer));
}
var controller = (card === this.cardEGA? card : null);
if (!this.bus.addMemory(card.addrBuffer, card.sizeBuffer, Memory.TYPE.VIDEO, controller)) {
/*
* TODO: Force this failure case and see how well the Video component deals with it.
*/
return false;
}
}
this.setDimensions();
if (fForce !== false) {
this.updateScreen(true);
} else {
this.initCellCache(true);
}
}
return true;
};
/**
* setPixel(imageData, x, y, rgb)
*
* Worker function used by createFontColor() and updateScreen() (graphics modes only).
*
* @this {Video}
* @param {Object} imageData
* @param {number} x
* @param {number} y
* @param {Array.<number>} rgb is a 4-element array containing the red, green, blue and alpha values
*/
Video.prototype.setPixel = function(imageData, x, y, rgb)
{
var index = (x + y * imageData.width) * rgb.length;
imageData.data[index] = rgb[0];
imageData.data[index+1] = rgb[1];
imageData.data[index+2] = rgb[2];
imageData.data[index+3] = rgb[3];
};
/**
* initCellCache(fNew)
*
* Invalidates the contents of our internal cell cache.
*
* @this {Video}
* @param {boolean} fNew is true to reallocate/resize the cell cache; in any case, it's still reinitialized
*/
Video.prototype.initCellCache = function(fNew)
{
var nCells;
if (!fNew) {
if (this.aCellCache === undefined) return;
nCells = this.aCellCache.length;
} else {
nCells = this.nCellCache;
if (this.aCellCache === undefined || this.aCellCache.length != nCells) {
this.aCellCache = new Array(nCells);
}
}
for (var iCell = 0; iCell < nCells; iCell++) {
this.aCellCache[iCell] = -1; // invalidate every cell of our internal cell cache (-1 is an invalid cell value)
}
this.cBlinkVisible = -1; // also invalidate the visible blinking character count, to force updateScreen() to recount
};
/**
* doBlink()
*
* This function is obsolete, now that the checkBlink() function is called on every updateScreen()
* and checkCursor() call. updateScreen() is driven by the CPU timer, so piggy-backing on that to
* drive blink updates seems preferable to having another active timer in the system.
*
* @this {Video}
* @param {boolean} [fStart]
*
Video.prototype.doBlink = function(fStart)
{
if (this.cBlinks >= 0) {
this.cBlinks++;
if (this.cBlinkVisible || this.iCellCursor >= 0) {
if (!fStart && !this.cpu.isRunning()) {
this.updateScreen();
}
setTimeout(function(video) { return function onBlinkTimeout() {video.doBlink();}; }(this), 266);
return;
}
this.cBlinks = -1;
}
},
*/
/**
* updateChar(col, row, data, context)
*
* Updates a particular character cell (row,col) in the associated window.
*
* The data parameter is the attribute byte from the display buffer (fgnd attribute in the low nibble,
* bgnd attribute in the high nibble), but updateScreen() supplements data with a couple internal attribute bits:
*
* ATTRS.DRAW_FGND: set for every cell whose fgnd element is currently on (ie, non-blinking, or whenever blink is on)
* ATTRS.DRAW_CURSOR: set only for the cell containing the cursor, if any
*
* To make a character blink, we alternately draw its cell with ATTRS.DRAW_FGND set, and then again with
* ATTRS.DRAW_FGND clear (meaning only the cell background is drawn).
*
* To make the cursor blink, we must alternately draw its entire cell with ATTRS.DRAW_CURSOR set, and then
* draw it again with ATTRS.DRAW_CURSOR clear.
*
* @this {Video}
* @param {number} col
* @param {number} row
* @param {number} data (if text mode, character code in low byte, attribute code in high byte)
* @param {Object} [context]
*/
Video.prototype.updateChar = function(col, row, data, context)
{
/*
* The caller MUST promise this.nFont is defined, and that the font in this.aFonts[this.nFont] has been loaded.
*/
var bChar = data & 0xff;
var bAttr = data >> 8;
var iFgnd = bAttr & 0xf;
var font = this.aFonts[this.nFont];
if (font.aColorMap) iFgnd = font.aColorMap[iFgnd];
/*
* Just as aColorMap maps the foreground attribute to the appropriate foreground character grid,
* it also maps the background attribute to the appropriate background color.
*/
var xDst, yDst;
var iBgnd = (bAttr >> 4) & 0xf;
if (font.aColorMap) iBgnd = font.aColorMap[iBgnd];
if (context) {
xDst = col * font.cxCell;
yDst = row * font.cyCell;
context.fillStyle = font.aCSSColors[iBgnd];
context.fillRect(xDst, yDst, font.cxCell, font.cyCell);
} else {
xDst = col * this.cxScreenCell + this.xScreenOffset;
yDst = row * this.cyScreenCell + this.yScreenOffset;
this.contextScreen.fillStyle = font.aCSSColors[iBgnd];
this.contextScreen.fillRect(xDst, yDst, this.cxScreenCell, this.cyScreenCell);
}
if (MAXDEBUG && this.messageEnabled(Messages.VIDEO | Messages.LOG)) {
this.log("updateCharBgnd(" + col + "," + row + "," + bChar + "): filled " + xDst + "," + yDst);
}
if (bAttr & Video.ATTRS.DRAW_FGND) {
/*
* (bChar & 0xf) is the equivalent of (bChar % 16), and (bChar >> 4) is the equivalent of Math.floor(bChar / 16)
*/
var xSrcFgnd = (bChar & 0xf) * font.cxCell;
var ySrcFgnd = (bChar >> 4) * font.cyCell;
if (MAXDEBUG && this.messageEnabled(Messages.VIDEO | Messages.LOG)) {
this.log("updateCharFgnd(" + col + "," + row + "," + bChar + "): draw from " + xSrcFgnd + "," + ySrcFgnd + " (" + font.cxCell + "," + font.cyCell + ") to " + xDst + "," + yDst);
}
if (context) {
context.drawImage(font.aCanvas[iFgnd], xSrcFgnd, ySrcFgnd, font.cxCell, font.cyCell, xDst, yDst, font.cxCell, font.cyCell);
} else {
this.contextScreen.drawImage(font.aCanvas[iFgnd], xSrcFgnd, ySrcFgnd, font.cxCell, font.cyCell, xDst, yDst, this.cxScreenCell, this.cyScreenCell);
}
}
if (bAttr & Video.ATTRS.DRAW_CURSOR) {
/*
* Drawing the cursor with lineTo() seemed logical, but it was complicated by the fact that the
* TOP of the line must appear at "yDst + this.yCursor", whereas lineTo() wants to know the CENTER
* of the line. So it's simpler to draw the cursor with another fillRect(). Here's the old code:
*
* this.contextScreen.strokeStyle = font.aCSSColors[iFgnd];
* this.contextScreen.lineWidth = this.cyCursor;
* this.contextScreen.beginPath();
* this.contextScreen.moveTo(xDst, yDst + this.yCursor);
* this.contextScreen.lineTo(xDst + this.cxScreenCell, yDst + this.yCursor);
* this.contextScreen.stroke();
*
* Also, note that we're scaling the yCursor and cyCursor values here, instead of in checkCursor(), because
* this is where we have all the required information: in the first case (off-screen buffer), the scaling must
* be based on the font cell size (cxCell, cyCell), whereas in the second case (on-screen buffer), the scaling
* must be based on the screen cell size (cxScreenCell,cyScreenCell).
*
* yCursor and cyCursor are actual hardware values, both relative to another hardware value: cyCursorCell.
*/
var yCursor = this.yCursor;
var cyCursor = this.cyCursor;
if (context) {
if (this.cyCursorCell && this.cyCursorCell !== font.cyCell) {
yCursor = ((yCursor * font.cyCell) / this.cyCursorCell)|0;
cyCursor = ((cyCursor * font.cyCell) / this.cyCursorCell)|0;
}
context.fillStyle = font.aCSSColors[iFgnd];
context.fillRect(xDst, yDst + yCursor, font.cxCell, cyCursor);
} else {
if (this.cyCursorCell && this.cyCursorCell !== this.cyScreenCell) {
yCursor = ((yCursor * this.cyScreenCell) / this.cyCursorCell)|0;
cyCursor = ((cyCursor * this.cyScreenCell) / this.cyCursorCell)|0;
}
this.contextScreen.fillStyle = font.aCSSColors[iFgnd];
this.contextScreen.fillRect(xDst, yDst + yCursor, this.cxScreenCell, cyCursor);
}
}
};
/**
* updateScreen(fForce)
*
* Propagates the video buffer to the cell cache and updates the screen with any changes. Forced updates
* are generally internal updates triggered by an I/O operation or other state change, while non-forced updates
* are the periodic updates coming from the CPU.
*
* For every cell in the video buffer, compare it to the cell stored in the cell cache, render if it differs,
* and then update the cell cache to match. Since initCellCache() sets every cell in the cell cache to an
* invalid value, we're assured that the next call to updateScreen() will redraw the entire (visible) video buffer.
*
* @this {Video}
* @param {boolean} [fForce] is used by setMode() to reset the cell cache and force a redraw
*/
Video.prototype.updateScreen = function(fForce)
{
/*
* The Computer component maintains the fPowered setting on our behalf, so we use it.
*/
if (!this.aFlags.fPowered) return;
/*
* If the card's video signal is disabled (eg, during a mode change), then skip the update,
* unless fForce is set.
*/
var fEnabled = false;
if (this.cardActive) {
if (this.cardActive === this.cardEGA) {
if (this.cardEGA.regATCIndx & Card.ATC.INDX_PAL_ENABLE) fEnabled = true;
}
else {
if (this.cardActive.regMode & Card.CGA.MODE.VIDEO_ENABLE) fEnabled = true;
}
}
if (!fEnabled && !fForce) return;
if (fForce) {
this.initCellCache(true);
}
else {
/*
* This should never happen, but since updateScreen() is also called by CPU.updateVideo(),
* better safe than sorry.
*/
if (this.aCellCache === undefined) return;
}
/*
* If cBlinks is "enabled" (ie, >= 0), then advance it once every 16 updateScreen() calls
* (assuming an updateScreen() frequency of 60 per second; see CPU.VIDEO_UPDATES_PER_SECOND).
*
* We assume that the CPU is calling us whenever fForce is undefined.
*/
var fBlinkUpdate = false;
if (!fForce && !(++this.cUpdates & 0xf) && this.cBlinks >= 0) {
this.cBlinks++;
fBlinkUpdate = true;
}
var iCell = 0;
var nCells = this.nCells;
/*
* Calculate the VISIBLE start of screen memory (addrScreen), not merely the PHYSICAL start,
* as well as the extent of it (cbScreen) and use those values for all addressing operations
* to follow. FYI, in these calculations, offScreen does not refer to "off-screen" memory,
* but rather the "offset" of the start of visible screen memory.
*/
var addrScreen = this.cardActive.addrBuffer;
var addrScreenLimit = addrScreen + this.cardActive.sizeBuffer;
var offScreen = ((this.cardActive.regCRTData[Card.CRTC.START_ADDR_HI] << 8) + this.cardActive.regCRTData[Card.CRTC.START_ADDR_LO])|0;
/*
* Any screen (aka "page") offset must be doubled for text modes, due to the attribute bytes.
*
* TODO: Come up with a more robust method of deciding when any screen offset should be doubled.
*/
if (this.nFont) offScreen <<= 1;
addrScreen += offScreen;
var cbScreen = this.cbScreen;
if (this.nCard >= Video.CARD.EGA && this.cardActive.regCRTData[Card.CRTC.EGA.OFFSET]) {
/*
* Pre-EGA, the extent of visible screen memory (cbScreen) was derived from nCols * nRows, but since
* then, the logical width of screen memory (nColsLogical) can differ from the visible width (nCols).
* We now calculate the logical width, and the compute a new cbScreen in much the same way the original
* cbScreen was computed (but without any CGA-related padding considerations).
*/
this.nColsLogical = this.cardActive.regCRTData[Card.CRTC.EGA.OFFSET] << (this.nFont? 1 : 4);
cbScreen = ((((this.nColsLogical * (this.nRows-1) + this.nCols) / this.nCellsPerWord) << 1) + this.cbPadding)|0;
}
if (addrScreen + cbScreen > addrScreenLimit) {
cbScreen = addrScreenLimit - addrScreen;
if (cbScreen < 0) cbScreen = 0;
}
/*
* addrScreenLimit was initially the limit of the entire video buffer, but we now adjust it
* to the limit of what's visible, since that's all we want to draw.
*/
addrScreenLimit = addrScreen + cbScreen;
/*
* This next bit of code can be completely disabled if we discover problems with the dirty
* memory block tracking feature, or if we need to remove or disable that feature in the future.
*
* We use cleanMemory() to check the video buffer's dirty state. If the buffer is clean
* AND there are no visible blinking characters (as of the last updateScreen) AND there is
* no visible cursor, then we're done; simply return. Otherwise, if there's only a blinking
* cursor, then update JUST that one cell.
*
* When dealing with blinking characters, note that we need to run through the entire buffer
* ONLY if the low bits of the blink count just transitioned to 2 or 0; hence, we could return if
* the blink count was ODD. But we'd still have to worry about the cursor, so it's simpler to blow
* that small optimization off. Further optimizations are certainly possible, such as a hash table
* of all blinking character locations, but all those optimizations are saved for a rainy day.
*/
if (!fForce && this.bus.cleanMemory(addrScreen, cbScreen)) {
if (!fBlinkUpdate) return;
if (!this.cBlinkVisible) {
if (this.iCellCursor < 0) return;
iCell = this.iCellCursor;
nCells = iCell + 1;
}
// else if (this.cBlinks & 0x1) return;
}
if (this.nFont) {
/*
* This is the text-mode update case. We're required to FIRST verify that the current font
* has been successfully loaded, because we're not allowed to call updateChar() if there's no font.
*/
if (this.aFonts[this.nFont]) {
this.updateScreenText(addrScreen, addrScreenLimit, iCell, nCells);
this.checkBlink();
}
}
else if (this.cbSplit) {
this.updateScreenGraphicsCGA(addrScreen, addrScreenLimit);
}
else {
this.updateScreenGraphicsEGA(addrScreen, addrScreenLimit);
}
};
/**
* updateScreenText(addrScreen, addrScreenLimit, iCell, nCells)
*
* @param addrScreen
* @param addrScreenLimit
* @param iCell
* @param nCells
*/
Video.prototype.updateScreenText = function(addrScreen, addrScreenLimit, iCell, nCells)
{
var addr, data, dataCache, cUpdated = 0;
/*
* If MDA.MODE.BLINK_ENABLE is set and a cell's blink bit is set, then if (cBlinks & 0x2) != 0,
* we want the foreground element of the cell to be drawn; otherwise we don't. So every 16-bit
* data word we pull from the video buffer will be supplemented with our own special attribute bit
* (ATTRS.DRAW_FGND = 0x100) accordingly; and to simplify the drawing code, we will also mask the
* blink bit from the cell's attribute bits.
*
* If MDA.MODE.BLINK_ENABLE is clear, then we always set ATTRS.DRAW_FGND and never mask the blink
* bit in a cell's attributes bits, since it's actually an intensity bit in that case.
*/
this.cBlinkVisible = 0;
var dataBlink = 0;
var dataDraw = (Video.ATTRS.DRAW_FGND << 8);
var dataMask = 0xfffff;
if (this.cardActive.regMode & Card.MDA.MODE.BLINK_ENABLE) {
dataBlink = (Video.ATTRS.BGND_BLINK << 8);
dataMask &= ~dataBlink;
if (!(this.cBlinks & 0x2)) dataMask &= ~dataDraw;
}
addr = addrScreen + (iCell << 1);
while (addr < addrScreenLimit && iCell < nCells) {
data = this.bus.getShortDirect(addr);
data |= dataDraw;
if (data & dataBlink) {
this.cBlinkVisible++;
data &= dataMask;
}
if (iCell == this.iCellCursor) {
data |= ((this.cBlinks & 0x1)? (Video.ATTRS.DRAW_CURSOR << 8) : 0);
}
this.assert(iCell < this.aCellCache.length);
dataCache = this.aCellCache[iCell];
if (dataCache != data) {
var col = iCell % this.nCols;
var row = (iCell / this.nCols)|0;
this.updateChar(col, row, data, this.contextScreenBuffer);
this.aCellCache[iCell] = data;
cUpdated++;
}
addr += 2;
iCell++;
}
if (cUpdated && this.contextScreenBuffer) {
this.contextScreen.drawImage(this.canvasScreenBuffer, 0, 0, this.cxBuffer, this.cyBuffer, this.xScreenOffset, this.yScreenOffset, this.cxScreenOffset, this.cyScreenOffset);
}
};
/**
* updateScreenGraphicsCGA(addrScreen, addrScreenLimit)
*
* @param addrScreen
* @param addrScreenLimit
*/
Video.prototype.updateScreenGraphicsCGA = function(addrScreen, addrScreenLimit)
{
var addr, data, dataCache;
/*
* This is the CGA graphics-mode update case, where cells are pixels spread across two halves of the buffer.
*/
addr = addrScreen;
this.cBlinkVisible = 0;
var iCell = 0, nPixelsPerCell = this.nCellsPerWord;
var wPixelMask = (nPixelsPerCell == 16? 0x10000 : 0x30000);
var nPixelShift = (nPixelsPerCell == 16? 1 : 2);
var aPixelColors = this.getCardColors(nPixelShift);
var x = 0, y = 0;
var xDirty = this.nCols, xMaxDirty = 0, yDirty = this.nRows, yMaxDirty = 0;
while (addr < addrScreenLimit) {
data = this.bus.getShortDirect(addr);
this.assert(iCell < this.aCellCache.length);
dataCache = this.aCellCache[iCell];
if (dataCache === data) {
x += nPixelsPerCell;
} else {
this.aCellCache[iCell] = data;
var wPixels = (data >> 8) | ((data & 0xff) << 8);
var wMask = wPixelMask, nShift = 16;
if (x < xDirty) xDirty = x;
for (var iPixel = 0; iPixel < nPixelsPerCell; iPixel++) {
var bPixel = (wPixels & (wMask >>= nPixelShift)) >> (nShift -= nPixelShift);
this.setPixel(this.imageScreenBuffer, x++, y, aPixelColors[bPixel]);
}
if (x > xMaxDirty) xMaxDirty = x;
if (y < yDirty) yDirty = y;
if (y >= yMaxDirty) yMaxDirty = y + 1;
}
addr += 2;
iCell++;
if (x >= this.nCols) {
x = 0;
y += 2;
if (y > this.nRows)
break;
if (y == this.nRows) {
y = 1;
addr = addrScreen + this.cbSplit;
}
}
}
/*
* Instead of blasting the ENTIRE imageScreenBuffer into contextScreenBuffer, and then blasting the ENTIRE
* canvasScreenBuffer onto contextScreen, even for the smallest change, let's try to be a bit smarter about
* the update (well, to the extent that the canvas APIs permit).
*/
if (xDirty < this.nCols) {
var cxDirty = xMaxDirty - xDirty;
var cyDirty = yMaxDirty - yDirty;
// this.contextScreenBuffer.putImageData(this.imageScreenBuffer, 0, 0);
this.contextScreenBuffer.putImageData(this.imageScreenBuffer, 0, 0, xDirty, yDirty, cxDirty, cyDirty);
/*
* While ideally I would draw only the dirty portion of canvasScreenBuffer, there usually isn't a 1-1 pixel mapping
* between canvasScreenBuffer and contextScreen. In fact, the WHOLE POINT of the canvasScreenBuffer is to leverage
* drawImage()'s scaling ability; for example, a CGA graphics mode might be 640x200, whereas the canvas representing
* the screen might be 960x400. In those situations, if we draw interior rectangles, we often end up with subpixel
* artifacts along the edges of those rectangles. So it appears I must continue to redraw the entire canvasScreenBuffer
* on every change.
*
var xScreen = (((xDirty * this.cxScreen) / this.nCols) | 0);
var yScreen = (((yDirty * this.cyScreen) / this.nRows) | 0);
var cxScreen = (((cxDirty * this.cxScreen) / this.nCols) | 0);
var cyScreen = (((cyDirty * this.cyScreen) / this.nRows) | 0);
this.contextScreen.drawImage(this.canvasScreenBuffer, xDirty, yDirty, cxDirty, cyDirty, xScreen, yScreen, cxScreen, cyScreen);
*/
this.contextScreen.drawImage(this.canvasScreenBuffer, 0, 0, this.nCols, this.nRows, 0, 0, this.cxScreen, this.cyScreen);
}
};
/**
* updateScreenGraphicsEGA(addrScreen, addrScreenLimit)
*
* @param addrScreen
* @param addrScreenLimit
*/
Video.prototype.updateScreenGraphicsEGA = function(addrScreen, addrScreenLimit)
{
var addr, data, dataCache;
addr = addrScreen;
this.cBlinkVisible = 0;
var iCell = 0;
var aPixelColors = this.getCardColors();
var adwMemory = this.cardActive.adwMemory;
var x = 0, y = 0;
var xDirty = this.nCols, xMaxDirty = 0, yDirty = this.nRows, yMaxDirty = 0;
var iPixelFirst = this.cardActive.regATCData[Card.ATC.HORZPAN.INDX] & Card.ATC.HORZPAN.SHIFT_LEFT;
/*
* TODO: What should happen if the card is programmed such that nColsLogical is LESS THAN nCols?
*/
var nRowAdjust = (this.nColsLogical > this.nCols? ((this.nColsLogical - this.nCols - iPixelFirst) >> 3) : 0);
var nCellAdjust = (iPixelFirst == 0? 1 : 0);
while (addr < addrScreenLimit) {
var idw = addr++ - this.addrBuffer;
this.assert(idw >= 0 && idw < adwMemory.length);
data = adwMemory[idw];
this.assert(iCell < this.aCellCache.length);
dataCache = this.aCellCache[iCell];
/*
* Figure out how many visible pixels this byte represents; usually 8, unless panning is being used.
*/
var iPixel, nPixels = 8;
if (!x) {
data <<= iPixelFirst;
dataCache <<= iPixelFirst;
nPixels -= iPixelFirst;
this.assert(iCell == y * ((this.nCols >> 3) + 1));
} else {
iPixel = this.nCols - x;
if (nPixels > iPixel) nPixels = iPixel;
}
if (data === dataCache) {
x += nPixels;
} else {
this.aCellCache[iCell] = data;
if (x < xDirty) xDirty = x;
for (iPixel = 0; iPixel < nPixels; iPixel++) {
/*
* We must follow the golden JavaScript rule of appending "|0" to all hex constants with bit 31 set.
* The innocuous use of the bit-wise OR operator has the side-effect of producing a negative value,
* matching how entries in Video.aEGADWToByte are initialized (eg, "Video.aEGADWToByte[0x80000000|0]").
*/
var dwPixel = data & (0x80808080|0);
/*
* This was the old approach to dealing with negative hex values, by converting them to positive
* values that didn't alter the low 32 bits. But it's not ideal, because it requires using values here
* and in the array that are outside the signed 32-bit range, potentially triggering floating-point.
*
* if (dwPixel < 0) dwPixel += 0x100000000;
*/
this.assert(Video.aEGADWToByte[dwPixel] !== undefined);
/*
* Since assertions don't fix problems (only catch them, and only in DEBUG builds), I'm also ensuring
* that bPixel will always default to 0 if an undefined value ever slips through again.
*/
var bPixel = Video.aEGADWToByte[dwPixel] || 0;
this.setPixel(this.imageScreenBuffer, x++, y, aPixelColors[bPixel]);
data <<= 1;
}
if (x > xMaxDirty) xMaxDirty = x;
if (y < yDirty) yDirty = y;
if (y >= yMaxDirty) yMaxDirty = y + 1;
}
iCell++;
this.assert(x <= this.nCols);
if (x >= this.nCols) {
x = 0;
if (++y > this.nRows) break;
addr += nRowAdjust;
iCell += nCellAdjust;
}
}
/*
* For a fascinating discussion of the best way to update the screen canvas at this point, see updateScreenGraphicsCGA().
*/
if (xDirty < this.nCols) {
var cxDirty = xMaxDirty - xDirty;
var cyDirty = yMaxDirty - yDirty;
this.contextScreenBuffer.putImageData(this.imageScreenBuffer, 0, 0, xDirty, yDirty, cxDirty, cyDirty);
this.contextScreen.drawImage(this.canvasScreenBuffer, 0, 0, this.nCols, this.nRows, 0, 0, this.cxScreen, this.cyScreen);
}
};
/**
* inMDAIndx(port, addrFrom)
*
* @this {Video}
* @param {number} port (0x3B4)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number|undefined}
*/
Video.prototype.inMDAIndx = function(port, addrFrom)
{
return this.inCRTCIndx(this.cardMono, port, addrFrom);
};
/**
* outMDAIndx(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3B4)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outMDAIndx = function(port, bOut, addrFrom)
{
this.outCRTCIndx(this.cardMono, port, bOut, addrFrom);
};
/**
* inMDAData(port, addrFrom)
*
* @this {Video}
* @param {number} port (0x3B5)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number|undefined}
*/
Video.prototype.inMDAData = function(port, addrFrom)
{
return this.inCRTCData(this.cardMono, port, addrFrom);
};
/**
* outMDAData(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3B5)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outMDAData = function(port, bOut, addrFrom)
{
this.outCRTCData(this.cardMono, port, bOut, addrFrom);
};
/**
* inMDAMode(port, addrFrom)
*
* @this {Video}
* @param {number} port (0x3B8)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inMDAMode = function(port, addrFrom)
{
return this.inCardMode(this.cardMono, addrFrom);
};
/**
* outMDAMode(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3B8)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outMDAMode = function(port, bOut, addrFrom)
{
this.outCardMode(this.cardMono, bOut, addrFrom);
};
/**
* inMDAStatus(port, addrFrom)
*
* @this {Video}
* @param {number} port (0x3BA)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inMDAStatus = function(port, addrFrom)
{
return this.inCardStatus(this.cardMono, addrFrom);
};
/**
* outFeat(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3BA or 0x3DA)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*
* NOTE: While this port also existed on the MDA and CGA, it existed only as an INPUT port, not an OUTPUT port.
*/
Video.prototype.outFeat = function(port, bOut, addrFrom)
{
this.cardEGA.regFeat = (this.cardEGA.regFeat & ~Card.FEAT_CTRL.BITS) | (bOut & Card.FEAT_CTRL.BITS);
this.printMessageIO(port, bOut, addrFrom, "FEAT");
};
/**
* inATC(port, addrFrom)
*
* @this {Video}
* @param {number} port (0x3C0)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inATC = function(port, addrFrom)
{
var b = this.cardEGA.fATCData? this.cardEGA.regATCData[this.cardEGA.regATCIndx & Card.ATC.INDX_MASK] : this.cardEGA.regATCIndx;
if (!addrFrom || this.messageEnabled()) {
this.printMessageIO(Card.ATC.PORT, null, addrFrom, "ATC." + (this.cardEGA.fATCData? this.cardEGA.asATCRegs[this.cardEGA.regATCIndx & Card.ATC.INDX_MASK] : "INDX"), b);
}
this.cardEGA.fATCData = !this.cardEGA.fATCData;
return b;
};
/**
* outATC(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3C0)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outATC = function(port, bOut, addrFrom)
{
var fPalEnabled = (this.cardEGA.regATCIndx & Card.ATC.INDX_PAL_ENABLE);
if (!this.cardEGA.fATCData) {
this.cardEGA.regATCIndx = bOut;
this.printMessageIO(port, bOut, addrFrom, "ATC.INDX");
this.cardEGA.fATCData = true;
if ((bOut & Card.ATC.INDX_PAL_ENABLE) && !fPalEnabled) {
if (!this.buildFonts()) {
if (DEBUG && (!addrFrom || this.messageEnabled())) {
this.printMessage("outATC(" + str.toHexByte(bOut) + "): no font changes required");
}
} else {
if (DEBUG && (!addrFrom || this.messageEnabled())) {
this.printMessage("outATC(" + str.toHexByte(bOut) + "): redraw screen for font changes");
}
this.updateScreen(true);
}
}
} else {
var iReg = this.cardEGA.regATCIndx & Card.ATC.INDX_MASK;
if (iReg >= Card.ATC.PALETTE_REGS || !fPalEnabled) {
if (Video.TRAPALL || this.cardEGA.regATCData[iReg] !== bOut) {
if (!addrFrom || this.messageEnabled()) {
this.printMessageIO(port, bOut, addrFrom, "ATC." + this.cardEGA.asATCRegs[iReg]);
}
this.cardEGA.regATCData[iReg] = bOut;
}
}
this.cardEGA.fATCData = false;
}
};
/**
* inStatus0(port, addrFrom)
*
* @this {Video}
* @param {number} port (0x3C2)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inStatus0 = function(port, addrFrom)
{
var bSWBit = 0;
if (this.nCard == Video.CARD.EGA) {
var iBit = 3 - ((this.cardEGA.regMisc & Card.MISC.CLOCK_SELECT) >> 2); // this is the desired SW # (0-3)
bSWBit = (this.bEGASwitches & (1 << iBit)) << (Card.STATUS0.SWSENSE_SHIFT - iBit);
} else {
/*
* The IBM VGA ROM expects the SWSENSE bit to change according to how the DAC is programmed.
*
* At C000:0391, the ROM selects the following array at 0x0454:
*
* db 0x12,0x12,0x12,0x10
*
* and writes the first 3 bytes to DAC register #0, and then compares SWSENSE to the 4th byte (0x10).
*
* If the 4th byte matches, then the ROM clears the BIOS "monochrome monitor" bit, and does the same
* thing again with 5 more arrays, expecting the 4th byte in all 5 arrays to match SWSENSE, and being
* very unhappy if they don't:
*
* db 0x14,0x14,0x14,0x10
* db 0x2D,0x14,0x14,0x00
* db 0x14,0x2D,0x14,0x00
* db 0x14,0x14,0x2D,0x00
* db 0x2D,0x2D,0x2D,0x00
*
* So I ensure happiness by setting SWSENSE unless any of the three 6-bit DAC values contain 0x2D.
*
* This hard-coded behavior assumes a color monitor. If you really want to simulate a monochrome monitor,
* then the 1st array (above) must mismatch, and a different set of arrays must all match:
*
* db 0x04,0x12,0x04,0x10
* db 0x1E,0x12,0x04,0x00
* db 0x04,0x2D,0x04,0x00
* db 0x04,0x16,0x15,0x00
* db 0x00,0x00,0x00,0x10
*
* In other words, for a monochrome monitor, set SWSENSE only when DAC register #0 matches the first and last
* sets of values.
*/
var dwDAC = this.cardEGA.regDACData[0];
if ((dwDAC & 0x3f) != 0x2d && (dwDAC & (0x3f << 6)) != (0x2d << 6) && (dwDAC & (0x3f << 12)) != (0x2d << 12)) {
bSWBit |= Card.STATUS0.SWSENSE;
}
}
var b = ((this.cardEGA.regStatus0 & ~Card.STATUS0.SWSENSE) | bSWBit);
/*
* TODO: Figure out where Card.STATUS0.FEAT bits should come from....
*/
this.cardEGA.regStatus0 = b;
this.printMessageIO(Card.STATUS0.PORT, null, addrFrom, "STATUS0", b);
return b;
};
/**
* @this {Video}
* @param {number} port (0x3C2)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outMisc = function(port, bOut, addrFrom)
{
this.cardEGA.regMisc = bOut;
this.enableEGA();
this.printMessageIO(Card.MISC.PORT_WRITE, bOut, addrFrom, "MISC");
};
/**
* inVGAEnable(port, addrFrom)
*
* @this {Video}
* @param {number} port (0x3C3)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inVGAEnable = function(port, addrFrom)
{
var b = this.cardEGA.regVGAEnable;
this.printMessageIO(Card.VGA_ENABLE.PORT, null, addrFrom, "VGA_ENABLE", b);
return b;
};
/**
* outVGAEnable(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3C3)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outVGAEnable = function(port, bOut, addrFrom)
{
this.cardEGA.regVGAEnable = bOut;
this.printMessageIO(Card.VGA_ENABLE.PORT, bOut, addrFrom, "VGA_ENABLE");
};
/**
* inSEQIndx(port, addrFrom)
*
* @this {Video}
* @param {number} port (0x3C4)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inSEQIndx = function(port, addrFrom)
{
var b = this.cardEGA.regSEQIndx;
this.printMessageIO(Card.SEQ.INDX.PORT, null, addrFrom, "SEQ.INDX", b);
return b;
};
/**
* outSEQIndx(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3C4)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outSEQIndx = function(port, bOut, addrFrom)
{
this.cardEGA.regSEQIndx = bOut;
this.printMessageIO(Card.SEQ.INDX.PORT, bOut, addrFrom, "SEQ.INDX");
};
/**
* inSEQData(port, addrFrom)
*
* @this {Video}
* @param {number} port (0x3C5)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inSEQData = function(port, addrFrom)
{
var b = this.cardEGA.regSEQData[this.cardEGA.regSEQIndx];
if (!addrFrom || this.messageEnabled()) {
this.printMessageIO(Card.SEQ.DATA.PORT, null, addrFrom, "SEQ" + this.cardEGA.asSEQRegs[this.cardEGA.regSEQIndx], b);
}
return b;
};
/**
* outSEQData(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3C5)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outSEQData = function(port, bOut, addrFrom)
{
if (Video.TRAPALL || this.cardEGA.regSEQData[this.cardEGA.regSEQIndx] !== bOut) {
if (!addrFrom || this.messageEnabled()) {
this.printMessageIO(Card.SEQ.DATA.PORT, bOut, addrFrom, "SEQ." + this.cardEGA.asSEQRegs[this.cardEGA.regSEQIndx]);
}
this.cardEGA.regSEQData[this.cardEGA.regSEQIndx] = bOut;
}
switch(this.cardEGA.regSEQIndx) {
case Card.SEQ.MAPMASK.INDX:
this.cardEGA.nWriteMapMask = Video.aEGAByteToDW[bOut & Card.SEQ.MAPMASK.MAPS];
break;
case Card.SEQ.MEMMODE.INDX:
this.setAccess(this.getAccess());
break;
default:
break;
}
};
/**
* inDACMask(port, addrFrom)
*
* @this {Video}
* @param {number} port (0x3C6)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inDACMask = function(port, addrFrom)
{
var b = this.cardEGA.regDACMask;
if (!addrFrom || this.messageEnabled()) {
this.printMessageIO(Card.DAC.MASK.PORT, null, addrFrom, "DAC.MASK", b);
}
return b;
};
/**
* outDACMask(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3C6)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outDACMask = function(port, bOut, addrFrom)
{
if (Video.TRAPALL || this.cardEGA.regDACMask !== bOut) {
if (!addrFrom || this.messageEnabled()) {
this.printMessageIO(Card.DAC.MASK.PORT, bOut, addrFrom, "DAC.MASK");
}
this.cardEGA.regDACMask = bOut;
}
};
/**
* inDACState(port, addrFrom)
*
* @this {Video}
* @param {number} port (0x3C7)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inDACState = function(port, addrFrom)
{
var b = this.cardEGA.regDACState;
if (!addrFrom || this.messageEnabled()) {
this.printMessageIO(Card.DAC.STATE.PORT, null, addrFrom, "DAC.STATE", b);
}
return b;
};
/**
* outDACRead(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3C7)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outDACRead = function(port, bOut, addrFrom)
{
if (!addrFrom || this.messageEnabled()) {
this.printMessageIO(Card.DAC.ADDR.PORT_READ, bOut, addrFrom, "DAC.READ");
}
this.cardEGA.regDACAddr = bOut;
this.cardEGA.regDACState = Card.DAC.STATE.MODE_READ;
this.cardEGA.regDACShift = 0;
};
/**
* outDACWrite(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3C8)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outDACWrite = function(port, bOut, addrFrom)
{
if (!addrFrom || this.messageEnabled()) {
this.printMessageIO(Card.DAC.ADDR.PORT_WRITE, bOut, addrFrom, "DAC.WRITE");
}
this.cardEGA.regDACAddr = bOut;
this.cardEGA.regDACState = Card.DAC.STATE.MODE_WRITE;
this.cardEGA.regDACShift = 0;
};
/**
* inDACData(port, addrFrom)
*
* @this {Video}
* @param {number} port (0x3C9)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inDACData = function(port, addrFrom)
{
var b = (this.cardEGA.regDACData[this.cardEGA.regDACAddr] >> this.cardEGA.regDACShift) & 0x3f;
if (!addrFrom || this.messageEnabled()) {
this.printMessageIO(Card.DAC.DATA.PORT, null, addrFrom, "DAC.DATA[" + str.toHexByte(this.cardEGA.regDACAddr) + "][" + str.toHexByte(this.cardEGA.regDACShift) + "]", b);
}
this.cardEGA.regDACShift += 6;
if (this.cardEGA.regDACShift > 12) {
this.cardEGA.regDACShift = 0;
this.cardEGA.regDACAddr = (this.cardEGA.regDACAddr + 1) & (Card.DAC.TOTAL_REGS-1);
}
return b;
};
/**
* outDACData(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3C9)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outDACData = function(port, bOut, addrFrom)
{
var dw = this.cardEGA.regDACData[this.cardEGA.regDACAddr];
if (!addrFrom || this.messageEnabled()) {
this.printMessageIO(Card.DAC.DATA.PORT, bOut, addrFrom, "DAC.DATA[" + str.toHexByte(this.cardEGA.regDACAddr) + "][" + str.toHexByte(this.cardEGA.regDACShift) + "]");
}
this.cardEGA.regDACData[this.cardEGA.regDACAddr] = (dw & ~(0x3f << this.cardEGA.regDACShift)) | ((bOut & 0x3f) << this.cardEGA.regDACShift);
this.cardEGA.regDACShift += 6;
if (this.cardEGA.regDACShift > 12) {
this.cardEGA.regDACShift = 0;
this.cardEGA.regDACAddr = (this.cardEGA.regDACAddr + 1) & (Card.DAC.TOTAL_REGS-1);
}
};
/**
* inVGAFeat(port, addrFrom)
*
* @this {Video}
* @param {number} port (0x3CA)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inVGAFeat = function(port, addrFrom)
{
var b = this.cardEGA.regFeat;
this.printMessageIO(Card.FEAT_CTRL.PORT_READ, null, addrFrom, "FEAT", b);
return b;
};
/**
* outGRCPos2(port, bOut, addrFrom)
*
* "The EGA was originally implemented by IBM using two Graphics Controller Chips. This register is used to program
* the Graphics #2 chip. See the Graphics #1 Position Register for details."
*
* "A one should be loaded into this location to map host data bus bits 2 and 3 to display planes 2 and 3, respectively."
*
* @this {Video}
* @param {number} port (0x3CA)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outGRCPos2 = function(port, bOut, addrFrom)
{
this.cardEGA.regGRCPos2 = bOut;
this.printMessageIO(Card.GRC.POS2_PORT, bOut, addrFrom, "GRC2");
};
/**
* inVGAMisc(port, addrFrom)
*
* @this {Video}
* @param {number} port (0x3CC)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inVGAMisc = function(port, addrFrom)
{
var b = this.cardEGA.regMisc;
this.printMessageIO(Card.MISC.PORT_READ, null, addrFrom, "MISC", b);
return b;
};
/**
* outGRCPos1(port, bOut, addrFrom)
*
* "The EGA was originally implemented by IBM using two Graphics Controller Chips. It was necessary to program
* each to respond to a different set of two consecutive bits of the 8-bit host data bus. In the IBM EGA implementation,
* a 0 must be loaded into this register. In the VGA, there is no analogous register."
*
* "A zero should be loaded into this location to map host data bus bits 0 and 1 to display planes 0 and 1 respectively."
*
* Note that this register was not readable on the EGA, and when the VGA came along, reads of this port read the Misc reg.
*
* @this {Video}
* @param {number} port (0x3CC)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outGRCPos1 = function(port, bOut, addrFrom)
{
this.cardEGA.regGRCPos1 = bOut;
this.printMessageIO(Card.GRC.POS1_PORT, bOut, addrFrom, "GRC1");
};
/**
* inGRCIndx(port, addrFrom)
*
* @this {Video}
* @param {number} port (0x3CE)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inGRCIndx = function(port, addrFrom)
{
var b = this.cardEGA.regGRCIndx;
this.printMessageIO(Card.GRC.INDX.PORT, null, addrFrom, "GRC.INDX", b);
return b;
};
/**
* outGRCIndx(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3CE)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outGRCIndx = function(port, bOut, addrFrom)
{
this.cardEGA.regGRCIndx = bOut;
this.printMessageIO(Card.GRC.INDX.PORT, bOut, addrFrom, "GRC.INDX");
};
/**
* inGRCData(port, addrFrom)
*
* @this {Video}
* @param {number} port (0x3CF)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inGRCData = function(port, addrFrom)
{
var b = this.cardEGA.regGRCData[this.cardEGA.regGRCIndx];
if (!addrFrom || this.messageEnabled()) {
this.printMessageIO(Card.GRC.DATA.PORT, null, addrFrom, "GRC." + this.cardEGA.asGRCRegs[this.cardEGA.regGRCIndx], b);
}
return b;
};
/**
* outGRCData(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3CF)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outGRCData = function(port, bOut, addrFrom)
{
if (Video.TRAPALL || this.cardEGA.regGRCData[this.cardEGA.regGRCIndx] !== bOut) {
if (!addrFrom || this.messageEnabled()) {
this.printMessageIO(Card.GRC.DATA.PORT, bOut, addrFrom, "GRC." + this.cardEGA.asGRCRegs[this.cardEGA.regGRCIndx]);
}
this.cardEGA.regGRCData[this.cardEGA.regGRCIndx] = bOut;
}
switch(this.cardEGA.regGRCIndx) {
case Card.GRC.SRESET.INDX:
this.cardEGA.nSetMapData = Video.aEGAByteToDW[bOut & 0xf];
this.cardEGA.nSetMapBits = this.cardEGA.nSetMapData & ~this.cardEGA.nSetMapMask;
break;
case Card.GRC.ESRESET.INDX:
this.cardEGA.nSetMapMask = ~Video.aEGAByteToDW[bOut & 0xf];
this.cardEGA.nSetMapBits = this.cardEGA.nSetMapData & ~this.cardEGA.nSetMapMask;
break;
case Card.GRC.COLORCMP.INDX:
this.cardEGA.nColorCompare = Video.aEGAByteToDW[bOut & 0xf] & (0x80808080|0);
break;
case Card.GRC.DATAROT.INDX:
case Card.GRC.MODE.INDX:
this.setAccess(this.getAccess());
break;
case Card.GRC.READMAP.INDX:
this.cardEGA.nReadMapShift = (bOut & Card.GRC.READMAP.NUM) << 3;
break;
case Card.GRC.MISC.INDX:
this.checkMode(false);
break;
case Card.GRC.COLORDC.INDX:
this.cardEGA.nColorDontCare = Video.aEGAByteToDW[bOut & 0xf] & (0x80808080|0);
break;
case Card.GRC.BITMASK.INDX:
this.cardEGA.nBitMapMask = bOut | (bOut << 8) | (bOut << 16) | (bOut << 24);
break;
default:
break;
}
};
/**
* inCGAIndx(port, addrFrom)
*
* @this {Video}
* @param {number} port (0x3D4)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number|undefined}
*/
Video.prototype.inCGAIndx = function(port, addrFrom)
{
return this.inCRTCIndx(this.cardColor, port, addrFrom);
};
/**
* outCGAIndx(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3D4)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outCGAIndx = function(port, bOut, addrFrom)
{
this.outCRTCIndx(this.cardColor, port, bOut, addrFrom);
};
/**
* inCGAData(port, addrFrom)
*
* @this {Video}
* @param {number} port (0x3D5)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number|undefined}
*/
Video.prototype.inCGAData = function(port, addrFrom)
{
return this.inCRTCData(this.cardColor, port, addrFrom);
};
/**
* outCGAData(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3D5)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outCGAData = function(port, bOut, addrFrom)
{
this.outCRTCData(this.cardColor, port, bOut, addrFrom);
};
/**
* inCGAMode(port, addrFrom)
*
* @this {Video}
* @param {number} port (0x3D8)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inCGAMode = function(port, addrFrom)
{
return this.inCardMode(this.cardColor, addrFrom);
};
/**
* outCGAMode(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3D8)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outCGAMode = function(port, bOut, addrFrom)
{
this.outCardMode(this.cardColor, bOut, addrFrom);
};
/**
* inCGAColor(port, addrFrom)
*
* @this {Video}
* @param {number} port (0x3D9)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inCGAColor = function(port, addrFrom)
{
var b = this.cardColor.regColor;
if (!addrFrom || this.messageEnabled()) {
this.printMessageIO(port /* this.cardColor.port + 5 */, null, addrFrom, this.cardColor.type + ".COLOR", b);
}
return b;
};
/**
* outCGAColor(port, bOut, addrFrom)
*
* @this {Video}
* @param {number} port (0x3D9)
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outCGAColor = function(port, bOut, addrFrom)
{
if (!addrFrom || this.messageEnabled()) {
this.printMessageIO(port /* this.cardColor.port + 5 */, bOut, addrFrom, this.cardColor.type + ".COLOR");
}
if (this.cardColor.regColor !== bOut) {
this.cardColor.regColor = bOut;
/*
* When this color register changes, it can automatically change the appearance of any number of cells, so we make
* a special call to initCellCache() to invalidate every cell, forcing all cells to be redrawn on the next updateScreen().
*/
this.initCellCache(false);
}
};
/**
* inCGAStatus(port, addrFrom)
*
* @this {Video}
* @param {number} port (0x3DA)
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inCGAStatus = function(port, addrFrom)
{
return this.inCardStatus(this.cardColor, addrFrom);
};
/**
* inCRTCIndx(card, port, addrFrom)
*
* @this {Video}
* @param {Object} card
* @param {number} port
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number|undefined}
*/
Video.prototype.inCRTCIndx = function(card, port, addrFrom)
{
var b;
/*
* The IBM VGA ROM makes some hardware determinations based on how the CRTC controller responds when
* the IO_SELECT bit in the Miscellaneous Output Register is cleared; normally, that would mean ports
* 0x3B? are decoded and ports 0x3D? are ignored. We didn't used to bother ignoring them, but the
* VGA ROM's logic requires it, so now we also check fActive. However, we ignore only CTRC reads;
* we retain any writes in case that information proves useful later.
*
* Note that returning an undefined value now signals the Bus component to return whatever default value
* it prefers (normally 0xff).
*/
if (card.fActive) b = card.regCRTIndx;
this.printMessageIO(port, null, addrFrom, "CRTC.INDX", b);
return b;
};
/**
* outCRTCIndx(card, port, bOut, addrFrom)
*
* @this {Video}
* @param {Object} card
* @param {number} port
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outCRTCIndx = function(card, port, bOut, addrFrom)
{
card.regCRTPrev = card.regCRTIndx;
card.regCRTIndx = bOut & Card.CGA.CRTC.INDX.MASK;
this.printMessageIO(port /* card.port */, bOut, addrFrom, "CRTC.INDX");
};
/**
* inCRTCData(card, port, addrFrom)
*
* @this {Video}
* @param {Object} card
* @param {number} port
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number|undefined}
*/
Video.prototype.inCRTCData = function(card, port, addrFrom)
{
var b;
/*
* The IBM VGA ROM makes some hardware determinations based on how the CRTC controller responds when
* the IO_SELECT bit in the Miscellaneous Output Register is cleared; normally, that would mean ports
* 0x3B? are decoded and ports 0x3D? are ignored. We didn't used to bother ignoring them, but the
* VGA ROM's logic requires it, so now we also check fActive. However, we ignore only CTRC reads;
* we retain any writes in case that information proves useful later.
*
* Note that returning an undefined value now signals the Bus component to return whatever default value
* it prefers (normally 0xff).
*/
if (card.fActive && card.regCRTIndx < card.nCRTCRegs) b = card.regCRTData[card.regCRTIndx];
if (!addrFrom || this.messageEnabled()) {
this.printMessageIO(port /* card.port + 1 */, null, addrFrom, "CRTC." + card.asCRTCRegs[card.regCRTIndx], b);
}
return b;
};
/**
* outCRTCData(card, port, bOut, addrFrom)
*
* @this {Video}
* @param {Object} card
* @param {number} port
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outCRTCData = function(card, port, bOut, addrFrom)
{
if (card.regCRTIndx < card.nCRTCRegs) {
if (Video.TRAPALL || card.regCRTData[card.regCRTIndx] !== bOut) {
if (!addrFrom || this.messageEnabled()) {
this.printMessageIO(port /* card.port + 1 */, bOut, addrFrom, "CRTC." + card.asCRTCRegs[card.regCRTIndx]);
}
card.regCRTData[card.regCRTIndx] = bOut;
}
/*
* During mode changes on the EGA, all the CRTC regs are typically programmed in sequence,
* and if that's all that's happening with Card.CRTC.MAX_SCAN_LINE, then we don't want to treat
* it special; let the mode change be detected normally (eg, when the GRC regs are written later).
*
* On the other hand, if this was an out-of-sequence write to Card.CRTC.MAX_SCAN_LINE, then
* yes, we want to force setMode() to call setDimensions(), which is key to setting the proper
* number of screen rows.
*/
if (card.regCRTIndx == Card.CRTC.MAX_SCAN_LINE && card.regCRTPrev != Card.CRTC.MAX_SCAN_LINE-1) {
this.checkMode(true);
}
this.checkCursor();
} else {
if (DEBUG && (!addrFrom || this.messageEnabled())) {
this.printMessage("outCRTCData(): ignoring unexpected write to CRTC[" + str.toHexByte(card.regCRTIndx) + "]: " + str.toHexByte(bOut));
}
}
};
/**
* inCardMode(card, addrFrom)
*
* @this {Video}
* @param {Object} card
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inCardMode = function(card, addrFrom)
{
var b = card.regMode;
this.printMessageIO(card.port + 4, null, addrFrom, "MODE", b);
return b;
};
/**
* outCardMode(card, bOut, addrFrom)
*
* @this {Video}
* @param {Object} card
* @param {number} bOut
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
*/
Video.prototype.outCardMode = function(card, bOut, addrFrom)
{
this.printMessageIO(card.port + 4, bOut, addrFrom, "MODE");
card.regMode = bOut;
this.checkMode(false);
};
/**
* inCardStatus(card, addrFrom)
*
* On an EGA, this register is called "Status Register One" (0x3BA/0x3DA aka STATUS1), to distinguish it from
* "Status Register Zero" (0x3C2 aka STATUS0). One of the side-effects of reading STATUS1 is that it resets the
* ATC address/data flip-flop to "address" mode, which we emulate by setting cardEGA.fATCData to false, indicating
* that the ATC is not in "data" mode.
*
* @this {Video}
* @param {Object} card
* @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
* @return {number}
*/
Video.prototype.inCardStatus = function(card, addrFrom)
{
var b = 0;
/*
* NOTE: The CGA bits CGA.STATUS.DISP_RETRACE (0x01) and CGA.STATUS.VERT_RETRACE (0x08) match the EGA definitions,
* and they also correspond to the MDA bits MDA.STATUS.HDRIVE (0x01) and MDA.STATUS.BWVIDEO (0x08); I'm not sure why
* the MDA uses different designations, but the bits appear to serve the same purpose.
*
* TODO: Decide whether this more faithful emulation of the retrace bits should be extended to the MDA/CGA, too;
* doing so might slow down the BIOS scroll code a bit, though.
*/
var nCycles = this.cpu.getCycles();
var nElapsedCycles = nCycles - card.nInitCycles;
if (nElapsedCycles < 0) nElapsedCycles = 0; // TODO: Determine if this ever happens
var nCyclesHorzRemain = nElapsedCycles % card.nCyclesHorzPeriod;
if (nCyclesHorzRemain > card.nCyclesHorzActive) b |= Card.CGA.STATUS.DISP_RETRACE;
var nCyclesVertRemain = nElapsedCycles % card.nCyclesVertPeriod;
if (nCyclesVertRemain > card.nCyclesVertActive) b |= Card.CGA.STATUS.VERT_RETRACE;
/*
* This is optional: the number of CPU cycles that remain in the current vertical period is all we need to keep
* track of (the number of cycles since the card was initialized is fine, too, but that delta can become extremely
* large after a while).
*/
card.nInitCycles = nCycles - nCyclesVertRemain;
if (card === this.cardEGA) {
/*
* STATUS1 diagnostic bits 5 and 4 are set according to the Card.ATC.PLANES.MUX bits:
*
* MUX Bit 5 Bit 4
* --- ---- ----
* 00: Red Blue
* 01: SecBlue Green
* 10: SecRed SecGreen
* 11: unused unused
*
* Depending on where we are in the horizontal and vertical periods (which can be inferred from the
* same elapsed cycle count that we used to simulate the retrace bits above), we could extract 4 bits
* from a corresponding region of the video buffer, "and" them with Card.ATC.PLANES.MASK, use
* that to index into the palette registers (cardEGA.regATCData), and use the resulting palette register
* bits to set these diagnostics bits. However, that's all rather tedious, and the process of extracting
* 4 appropriate bits from the video buffer varies depending on the video mode.
*
* Why are we even considering this? Because the EGA BIOS diagnostic code draws a bright reverse-video
* line of text blocks across the top of the screen, writes 0x3F to palette register 0x0f, and then
* monitors the STATUS1 diagnostic bits, waiting for those palette bits to show up. It turns out, however,
* that we can easily fool the EGA BIOS by simply toggling the diagnostic bits. So we take the easy way out.
*
* TODO: Faithful emulation of these bits is certainly doable, so consider doing that at some point.
*/
b |= ((card.regStatus & Card.STATUS1.DIAGNOSTIC) ^ Card.STATUS1.DIAGNOSTIC);
/*
* Last but not least, we must reset the EGA's ATC flip-flop whenever this register is read.
*/
card.fATCData = false;
}
else {
/*
* On the MDA/CGA, to satisfy ROM BIOS testing ("TEST.10"), it's sufficient to do a simple toggle of
* bits 0 and 3 on every read.
*
* Also, according to http://www.seasip.info/VintagePC/mda.html, on an MDA, bits 7-4 are always ON and
* bits 2-1 are always OFF, hence the "OR" of 0xf0.
*/
b = (card.regStatus ^= (Card.CGA.STATUS.DISP_RETRACE | Card.CGA.STATUS.VERT_RETRACE)) | 0xf0;
}
card.regStatus = b;
this.printMessageIO(card.port + 6, null, addrFrom, (card === this.cardEGA? "STATUS1" : "STATUS"), b);
return b;
};
/**
* dumpVideo(sParm)
*
* @this {Video}
* @param {string|undefined} sParm
*/
Video.prototype.dumpVideo = function(sParm)
{
if (DEBUGGER) {
if (!this.cardActive) {
this.dbg.println("no active video card");
return;
}
if (sParm) {
this.cardActive.dumpBuffer(sParm);
return;
}
this.dbg.println("BIOSMODE: " + str.toHexByte(this.nMode));
this.cardActive.dumpCard();
}
};
/*
* Port input/output notification tables
*
* TODO: At one point, I'd added some "duplicate" entries for the MDA because, according to docs I'd read,
* MDA ports are decoded at multiple addresses. However, if this is important, then it should be verified
* and implemented consistently (eg, for CGA as well). For now, I'm decoding only the standard port addresses.
*
* For example, 0x3B5 is apparently also decoded at 0x3B1, 0x3B3, and 0x3B7, while 0x3B4 is also decoded at
* 0x3B0, 0x3B2, and 0x3B6.
*/
Video.aMDAPortInput = {
0x3B4: Video.prototype.inMDAIndx, // technically, not actually readable, but I want the Debugger to be able to read this
0x3B5: Video.prototype.inMDAData, // technically, the only Data registers that are readable are R14-R17
0x3B8: Video.prototype.inMDAMode, // technically, not actually readable, but I want the Debugger to be able to read this
0x3BA: Video.prototype.inMDAStatus
};
Video.aMDAPortOutput = {
0x3B4: Video.prototype.outMDAIndx,
0x3B5: Video.prototype.outMDAData,
0x3B8: Video.prototype.outMDAMode
};
Video.aCGAPortInput = {
0x3D4: Video.prototype.inCGAIndx, // technically, not actually readable, but I want the Debugger to be able to read this
0x3D5: Video.prototype.inCGAData, // technically, the only Data registers that are readable are R14-R17
0x3D8: Video.prototype.inCGAMode, // technically, not actually readable, but I want the Debugger to be able to read this
0x3D9: Video.prototype.inCGAColor, // technically, not actually readable, but I want the Debugger to be able to read this
0x3DA: Video.prototype.inCGAStatus
};
Video.aCGAPortOutput = {
0x3D4: Video.prototype.outCGAIndx,
0x3D5: Video.prototype.outCGAData,
0x3D8: Video.prototype.outCGAMode,
0x3D9: Video.prototype.outCGAColor
};
Video.aEGAPortInput = {
0x3C0: Video.prototype.inATC, // technically, only readable on a VGA, but I want the Debugger to be able to read this, too
0x3C1: Video.prototype.inATC, // technically, only readable on a VGA, but I want the Debugger to be able to read this, too
0x3C2: Video.prototype.inStatus0,
0x3C4: Video.prototype.inSEQIndx, // technically, only readable on a VGA, but I want the Debugger to be able to read this, too
0x3C5: Video.prototype.inSEQData, // technically, only readable on a VGA, but I want the Debugger to be able to read this, too
0x3CE: Video.prototype.inGRCIndx, // technically, only readable on a VGA, but I want the Debugger to be able to read this, too
0x3CF: Video.prototype.inGRCData // technically, only readable on a VGA, but I want the Debugger to be able to read this, too
};
/*
* WARNING: Unlike the EGA, a standard VGA does not support writes to 0x3C1, but it's easier for me to leave that
* ability in place, treating the VGA as a superset of the EGA as much as possible; will any code break because word
* I/O to port 0x3C0 actually works? Possibly, but highly unlikely.
*/
Video.aEGAPortOutput = {
0x3BA: Video.prototype.outFeat,
0x3C0: Video.prototype.outATC,
0x3C1: Video.prototype.outATC, // the EGA BIOS writes to this port (see C000:0416), implying that 0x3C0 and 0x3C1 both decode the same register
0x3C2: Video.prototype.outMisc, // FYI, since this overlaps with STATUS0.PORT, there's currently no way for the Debugger to read the Misc register
0x3C4: Video.prototype.outSEQIndx,
0x3C5: Video.prototype.outSEQData,
0x3CA: Video.prototype.outGRCPos2,
0x3CC: Video.prototype.outGRCPos1,
0x3CE: Video.prototype.outGRCIndx,
0x3CF: Video.prototype.outGRCData,
0x3DA: Video.prototype.outFeat
};
Video.aVGAPortInput = {
0x3C3: Video.prototype.inVGAEnable,
0x3C6: Video.prototype.inDACMask,
0x3C7: Video.prototype.inDACState,
0x3C9: Video.prototype.inDACData,
0x3CA: Video.prototype.inVGAFeat,
0x3CC: Video.prototype.inVGAMisc
};
Video.aVGAPortOutput = {
0x3C3: Video.prototype.outVGAEnable,
0x3C6: Video.prototype.outDACMask,
0x3C7: Video.prototype.outDACRead,
0x3C8: Video.prototype.outDACWrite,
0x3C9: Video.prototype.outDACData
};
/**
* Video.init()
*
* This function operates on every HTML element of class "video", extracting the
* JSON-encoded parameters for the Video constructor from the element's "data-value"
* attribute, invoking the constructor to create a Video component, and then binding
* any associated HTML controls to the new component.
*/
Video.init = function()
{
var aeVideo = Component.getElementsByClass(window.document, PCJSCLASS, "video");
for (var iVideo = 0; iVideo < aeVideo.length; iVideo++) {
var eVideo = aeVideo[iVideo];
var parmsVideo = Component.getComponentParms(eVideo);
var eCanvas = window.document.createElement("canvas");
if (eCanvas === undefined || !eCanvas.getContext) {
eVideo.innerHTML = "<br/>Missing <canvas> support. Please try a newer web browser.";
return;
}
eCanvas.setAttribute("class", PCJSCLASS + "-canvas");
eCanvas.setAttribute("width", parmsVideo['screenWidth']);
eCanvas.setAttribute("height", parmsVideo['screenHeight']);
eCanvas.style.backgroundColor = parmsVideo['screenColor'];
/*
* The "contenteditable" attribute on a canvas element NOTICEABLY slows down canvas drawing on
* Safari as soon as you give the canvas focus (ie, click away from the canvas, and drawing speeds
* up; click on the canvas, and drawing slows down). So the "transparent textarea hack" that we
* once employed as only a work-around for Android devices is now our default.
*
* eCanvas.setAttribute("contenteditable", "true");
*/
/*
* HACK: A canvas style of "auto" provides for excellent responsive canvas scaling in EVERY browser
* except IE9/IE10, so I recalculate the appropriate CSS height every time the parent DIV is resized;
* IE11 works without this hack, so we take advantage of the fact that IE11 doesn't report itself as "MSIE".
*/
eCanvas.style.height = "auto";
if (web.getUserAgent().indexOf("MSIE") >= 0) {
eVideo.onresize = function(eParent, eChild, cx, cy) {
return function onResizeVideo() {
eChild.style.height = (((eParent.clientWidth * cy) / cx) | 0) + "px";
};
}(eVideo, eCanvas, parmsVideo['screenWidth'], parmsVideo['screenHeight']);
eVideo.onresize();
}
eVideo.appendChild(eCanvas);
/*
* HACK: Android-based browsers, like the Silk (Amazon) browser and Chrome for Android, don't honor the
* "contenteditable" attribute; that is, when the canvas receives focus, they don't activate the on-screen
* keyboard. So my fallback is to create a transparent textarea on top of the canvas.
*
* The parent DIV must have a style of "position:relative" (alternatively, a class of "pcjs-container"),
* so that we can position the textarea using absolute coordinates. Also, we don't want the textarea to be
* visible, but we must use "opacity:0" instead of "visibility:hidden", because the latter seems to prevent
* the element from receiving events. These styling requirements are taken care of in components.css
* (see references to the "pcjs-video-object" class).
*
* UPDATE: Unfortunately, Android keyboards like to compose whole words before transmitting any of the
* intervening characters; our textarea's keyDown/keyUp event handlers DO receive intervening key events,
* but their keyCode property is ZERO. Virtually the only usable key event we receive is the Enter key.
* Android users will have to use machines that include their own on-screen "soft keyboard", or use an
* external keyboard.
*
* The following attempt to use a password-enabled input field didn't work any better on Android. You could
* clearly see the overlaid semi-transparent input field, but none of the input characters were passed along,
* with the exception of the "Go" (Enter) key.
*
* var eInput = window.document.createElement("input");
* eInput.setAttribute("type", "password");
* eInput.setAttribute("style", "position:absolute; left:0; top:0; width:100%; height:100%; opacity:0.5");
* eVideo.appendChild(eInput);
*
* See this Chromium issue for more information: https://code.google.com/p/chromium/issues/detail?id=118639
*/
var eTextArea = window.document.createElement("textarea");
/*
* As noted in keyboard.js, the keyboard on an iOS device pops up with the SHIFT key depressed,
* which is not the initial keyboard state that the Keyboard component expects.
*/
if (web.isUserAgent("iOS")) {
eTextArea.setAttribute("autocapitalize", "off");
eTextArea.setAttribute("autocorrect", "off");
}
eVideo.appendChild(eTextArea);
/*
* Now we can create the Video object, record it, and wire it up to the associated document elements.
*/
var eContext = eCanvas.getContext("2d");
var video = new Video(parmsVideo, eCanvas, eContext, eTextArea /* || eInput */, eVideo);
/*
* Bind any video-specific controls (eg, the Refresh button). There are no essential controls, however;
* even the "Refresh" button is just a diagnostic tool, to ensure that the screen contents are up-to-date.
*/
Component.bindComponentControls(video, eVideo, PCJSCLASS);
}
};
/*
* Initialize every Video module on the page.
*/
web.onInit(Video.init);
if (typeof module !== 'undefined') module.exports = Video;
/**
* @fileoverview Defines PCjs x86 constants.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-Sep-05
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
var X86 = {
/*
* CPU model numbers
*/
MODEL_8086: 8086,
MODEL_8088: 8088,
MODEL_80186: 80186,
MODEL_80188: 80188,
MODEL_80286: 80286,
MODEL_80386: 80386,
/*
* This constant is used to mark points in the code where the physical address being returned
* is invalid and should not be used. TODO: There are still functions that will use an invalid
* address, which is why we've tried to choose a value that causes the least harm, but ultimately,
* we must add checks to those functions or throw special JavaScript exceptions to bypass them.
*
* This value is also used to indicate non-existent EA address calculations, which are usually
* detected with "regEA === ADDR_INVALID" and "regEAWrite === ADDR_INVALID" tests. In a 32-bit
* CPU, -1 (ie, 0xffffffff) could actually be a valid address, so consider changing ADDR_INVALID
* to NaN or null (which is also why all ADDR_INVALID tests should use strict equality operators).
*
* The main reason I'm NOT using NaN or null now is my concern that, by mixing non-numbers
* (specifically, values outside the range of signed 32-bit integers), performance may suffer.
*/
ADDR_INVALID: -1,
/*
* Processor Status flag definitions (stored in regPS)
*/
PS: {
CF: 0x0001, // bit 0: Carry flag
BIT1: 0x0002, // bit 1: reserved, always set
PF: 0x0004, // bit 2: Parity flag
BIT3: 0x0008, // bit 3: reserved, always clear
AF: 0x0010, // bit 4: Auxiliary Carry flag (aka Arithmetic flag)
BIT5: 0x0020, // bit 5: reserved, always clear
ZF: 0x0040, // bit 6: Zero flag
SF: 0x0080, // bit 7: Sign flag
TF: 0x0100, // bit 8: Trap flag
IF: 0x0200, // bit 9: Interrupt flag
DF: 0x0400, // bit 10: Direction flag
OF: 0x0800, // bit 11: Overflow flag
IOPL: {
MASK: 0x3000, // bits 12-13: I/O Privilege Level (always set on 8086/80186, clear on 80286 reset)
SHIFT: 12
},
NT: 0x4000, // bit 14: Nested Task flag (always set on 8086/80186, clear on 80286 reset)
BIT15: 0x8000 // bit 15: reserved (always set on 8086/80186, clear otherwise)
},
CR0: {
/*
* Machine Status Word (MSW) bit definitions
*/
MSW: {
PE: 0x0001, // protected-mode enabled
MP: 0x0002, // monitor processor extension (ie, coprocessor)
EM: 0x0004, // emulate processor extension
TS: 0x0008, // task switch indicator
ON: 0xfff0, // on the 80286, these bits are always on (TODO: Verify)
MASK: 0xffff // these are the only (MSW) bits that the 80286 can access (within CR0)
},
ET: 0x00000010, // coprocessor type (80287 or 80387); always 1 on post-80386 CPUs
PG: 0x80000000|0 // 0: paging disabled
},
SEL: {
RPL: 0x0003, // requested privilege level (0-3)
LDT: 0x0004, // table indicator (0: GDT, 1: LDT)
MASK: 0xfff8 // table index
},
DESC: { // Descriptor Table Entry
LIMIT: { // LIMIT bits 0-15 (or OFFSET if this is an INTERRUPT or TRAP gate)
OFFSET: 0x0
},
BASE: { // BASE bits 0-15 (or SELECTOR if this is a TASK, INTERRUPT or TRAP gate)
OFFSET: 0x2
},
ACC: { // bit definitions for the access word (offset 0x4)
OFFSET: 0x4,
BASE1623: 0x00ff, // (not used if this a TASK, INTERRUPT or TRAP gate; bits 0-5 are parm count for CALL gates)
TYPE: {
OFFSET: 0x5,
MASK: 0x1f00,
SEG: 0x1000,
NONSEG: 0x0f00,
/*
* The following bits apply only when SEG is set
*/
CODE: 0x0800, // set for CODE, clear for DATA
ACCESSED: 0x0100, // set if accessed, clear if not accessed
READABLE: 0x0200, // CODE: set if readable, clear if exec-only
WRITABLE: 0x0200, // DATA: set if writable, clear if read-only
CONFORMING: 0x0400, // CODE: set if conforming, clear if not
EXPDOWN: 0x0400, // DATA: set if expand-down, clear if not
/*
* The following are all the possible (valid) types (well, except for the variations
* of DATA and CODE where the ACCESSED bit (0x0100) may also be set)
*/
TSS: 0x0100,
LDT: 0x0200,
TSS_BUSY: 0x0300,
GATE_CALL: 0x0400,
GATE_TASK: 0x0500,
GATE_INT: 0x0600,
GATE_TRAP: 0x0700,
DATA_READONLY: 0x1000,
DATA_WRITABLE: 0x1200,
DATA_EXPDOWN_READONLY: 0x1400,
DATA_EXPDOWN_WRITABLE: 0x1600,
CODE_EXECONLY: 0x1800,
CODE_READABLE: 0x1a00,
CODE_CONFORMING: 0x1c00,
CODE_CONFORMING_READABLE: 0x1e00
},
DPL: {
MASK: 0x6000,
SHIFT: 13
},
PRESENT: 0x8000,
INVALID: 0 // use X86.DESC.ACC.INVALID for invalid ACC values
},
EXT: { // descriptor extension word (reserved on the 80286; "must be zero")
OFFSET: 0x6,
LIMIT1619: 0x000f,
AVAIL: 0x0010, // NOTE: set in various descriptors in OS/2
/*
* The BIG bit is known as the D bit for code segments; when set, all addresses and operands
* in that code segment are assumed to be 32-bit.
*
* The BIG bit is known as the B bit for data segments; when set, it indicates: 1) all pushes,
* pops, calls and returns use ESP instead of SP, and 2) the upper bound of an expand-down segment
* is 0xffffffff instead of 0xffff.
*/
BIG: 0x0040, // clear if default operand/address size is 16-bit, set if 32-bit
LIMITPAGES: 0x0080, // clear if limit granularity is bytes, set if limit granularity is 4Kb pages
BASE2431: 0xff00
},
INVALID: 0 // use X86.DESC.INVALID for invalid DESC values
},
LADDR: { // linear address
PDE: { // index of page directory entry
MASK: 0xffc00000|0,
SHIFT: 20 // (addr & DIR.MASK) >>> DIR.SHIFT yields a page directory offset (ie, index * 4)
},
PTE: { // index of page table entry
MASK: 0x003ff000,
SHIFT: 10 // (addr & PAGE.MASK) >>> PAGE.SHIFT yields a page table offset (ie, index * 4)
},
OFFSET: 0x00000fff
},
PTE: {
FRAME: 0xfffff000|0,
DIRTY: 0x00000040, // page has been modified
ACCESSED: 0x00000020, // page has been accessed
USER: 0x00000004, // set for user level (CPL 3), clear for supervisor level (CPL 0-2)
READWRITE: 0x00000002, // set for read/write, clear for read-only (affects CPL 3 only)
PRESENT: 0x00000001 // set for present page, clear for not-present page
},
TSS: {
PREV_TSS: 0x00,
CPL0_SP: 0x02, // start of values altered by task switches
CPL0_SS: 0x04,
CPL1_SP: 0x06,
CPL1_SS: 0x08,
CPL2_SP: 0x0a,
CPL2_SS: 0x0c,
TASK_IP: 0x0e,
TASK_PS: 0x10,
TASK_AX: 0x12,
TASK_CX: 0x14,
TASK_DX: 0x16,
TASK_BX: 0x18,
TASK_SP: 0x1a,
TASK_BP: 0x1c,
TASK_SI: 0x1e,
TASK_DI: 0x20,
TASK_ES: 0x22,
TASK_CS: 0x24,
TASK_SS: 0x26,
TASK_DS: 0x28, // end of values altered by task switches
TASK_LDT: 0x2a
},
/*
* Processor Exception Interrupts
*
* Of the following exceptions, all are designed to be restartable, except for 0x08 and 0x09 (and 0x0D
* after an attempt to write to a read-only segment).
*
* Error codes are pushed onto the stack for 0x08 (always 0) and 0x0A through 0x0D.
*
* Priority: Instruction exception, TRAP, NMI, Processor Extension Segment Overrun, and finally INTR.
*
* All exceptions can also occur in real-mode, except where noted. A GP_FAULT in real-mode can be triggered
* by "any memory reference instruction that attempts to reference [a] 16-bit word at offset 0FFFFH".
*
* Interrupts beyond 0x10 (up through 0x1F) are reserved for future exceptions.
*
* Implementation Detail: For any opcode we know must generate a UD_FAULT interrupt, we invoke opInvalid(),
* NOT opUndefined(). UD_FAULT is for INVALID opcodes, Intel's choice of "UD" notwithstanding.
*
* We reserve the term "undefined" for opcodes that require more investigation, and we invoke opUndefined()
* ONLY until an opcode's behavior has finally been defined, at which point it becomes either valid or invalid.
* The term "illegal" seems completely superfluous; we don't need a third way of describing invalid opcodes.
*
* The term "undocumented" should be limited to operations that are valid but Intel simply never documented.
*/
EXCEPTION: {
DIV_ERR: 0x00, // Divide Error Interrupt
TRAP: 0x01, // Single Step (aka Trap) Interrupt
NMI: 0x02, // Non-Maskable Interrupt
BREAKPOINT: 0x03, // Breakpoint Interrupt
OVERFLOW: 0x04, // INTO Overflow Interrupt (FYI, return address does NOT point to offending instruction)
BOUND_ERR: 0x05, // BOUND Error Interrupt
UD_FAULT: 0x06, // Invalid (aka Undefined or Illegal) Opcode (see implementation detail above)
NM_FAULT: 0x07, // No Math Unit Available (see ESC or WAIT)
DF_FAULT: 0x08, // Double Fault (see LIDT)
MP_FAULT: 0x09, // Math Unit Protection Fault (see ESC)
TS_FAULT: 0x0A, // Invalid Task State Segment Fault (protected-mode only)
NP_FAULT: 0x0B, // Not Present Fault (protected-mode only)
SS_FAULT: 0x0C, // Stack Fault (protected-mode only)
GP_FAULT: 0x0D, // General Protection Fault
PG_FAULT: 0x0E, // Page Fault
MF_FAULT: 0x10 // Math Fault (see ESC or WAIT)
},
ERRCODE: {
EXT: 0x0001,
IDT: 0x0002,
LDT: 0x0004,
MASK: 0xfff8 // index of corresponding entry in GDT, LDT or IDT
},
RESULT: {
/*
* Flags were originally computed using 16-bit result registers:
*
* CF: resultZeroCarry & resultSize (ie, 0x100 or 0x10000)
* PF: resultParitySign & 0xff
* AF: (resultParitySign ^ resultAuxOverflow) & 0x0010
* ZF: resultZeroCarry & (resultSize - 1)
* SF: resultParitySign & (resultSize >> 1)
* OF: (resultParitySign ^ resultAuxOverflow ^ (resultParitySign >> 1)) & (resultSize >> 1)
*
* I386 support requires that we now rely on 32-bit result registers:
*
* resultDst, resultSrc, resultArith, resultLogic and resultType
*
* and flags are now computed as follows:
*
* CF: ((resultDst ^ ((resultDst ^ resultSrc) & (resultSrc ^ resultArith))) & resultType)
* PF: (resultLogic & 0xff)
* AF: ((resultArith ^ (resultDst ^ resultSrc)) & 0x0010)
* ZF: (resultLogic & ((resultType - 1) | resultType))
* SF: (resultLogic & resultType)
* OF: (((resultDst ^ resultArith) & (resultSrc ^ resultArith)) & resultType)
*
* where resultType contains both a size, which must be one of BYTE (0x80), WORD (0x8000),
* or DWORD (0x80000000), along with bits for each of the arithmetic and/or logical flags that
* are currently "cached" in the result registers (eg, X86.RESULT.CF for carry, X86.RESULT.OF
* for overflow, etc).
*
* WARNING: Do not confuse these RESULT flag definitions with the PS flag definitions. RESULT
* flags are used only as "cached" flag indicators, packed into bits 0-5 of resultType; they do
* not match the actual flag bit definitions within the Processor Status (PS) register.
*
* Arithmetic operations should call:
*
* setArithResult(dst, src, value, type)
* eg:
* setArithResult(dst, src, dst+src, X86.RESULT.BYTE | X86.RESULT.ALL)
*
* and logical operations should call:
*
* setLogicResult(value, type [, carry [, overflow]])
*
* Since most logical operations clear both CF and OF, most calls to setLogicResult() can omit the
* last two optional parameters.
*
* The type parameter of these methods indicates both the size of the result (BYTE, WORD or DWORD)
* and which of the flags should now be considered "cached" by the result registers. If the previous
* resultType specifies any flags not present in the new type parameter, then those flags are
* calculated and written to the appropriate regPS bit(s) *before* the result registers are updated.
*
* Arithmetic operations are assumed to represent an "added" result; if a "subtracted" result is
* provided instead (eg, from CMP, DEC, SUB, etc), then setArithResult() must include a 5th parameter
* (fSubtract); eg:
*
* setArithResult(dst, src, dst-src, X86.RESULT.BYTE | X86.RESULT.ALL, true)
*
* TODO: Consider separating setArithResult() into two functions: setAddResult() and setSubResult().
*/
BYTE: 0x80, // result is byte value
WORD: 0x8000, // result is word value
DWORD: 0x80000000|0,
TYPE: 0x80008080|0,
CF: 0x01, // carry flag is cached
PF: 0x02, // parity flag is cached
AF: 0x04, // aux carry flag is cached
ZF: 0x08, // zero flag is cached
SF: 0x10, // sign flag is cached
OF: 0x20, // overflow flag is cached
ALL: 0x3F, // all result flags are cached
LOGIC: 0x1A, // all logical flags are cached; see setLogicResult()
NOTCF: 0x3E // all result flags EXCEPT carry are cached
},
/*
* Bit values for opFlags, which are all reset to zero prior to each instruction
*/
OPFLAG: {
NOREAD: 0x0001,
NOWRITE: 0x0002,
NOINTR: 0x0004, // indicates a segreg has been set, or a prefix, or an STI (delay INTR acknowledgement)
SEG: 0x0010, // segment override
LOCK: 0x0020, // lock prefix
REPZ: 0x0040, // repeat while Z (NOTE: this value MUST match PS.ZF; see opCMPSb/opCMPSw/opSCASb/opSCASw)
REPNZ: 0x0080, // repeat while NZ
REPEAT: 0x0100, // indicates that an instruction is being repeated (ie, some iteration AFTER the first)
PUSHSP: 0x0200, // the SP register is potentially being referenced by a PUSH SP opcode, adjustment may be required
DATASIZE: 0x1000, // data size override
ADDRSIZE: 0x2000 // address size override
},
/*
* Bit values for intFlags
*/
INTFLAG: {
NONE: 0x00,
INTR: 0x01, // h/w interrupt requested
TRAP: 0x02, // trap (INT 0x01) requested
HALT: 0x04, // halt (HLT) requested
DMA: 0x08 // async DMA operation in progress
},
/*
* Common opcodes (and/or any opcodes we need to refer to explicitly)
*/
OPCODE: {
ES: 0x26, // opES()
CS: 0x2E, // opCS()
SS: 0x36, // opSS()
DS: 0x3E, // opDS()
PUSHSP: 0x54, // opPUSHSP()
PUSHA: 0x60, // opPUHSA() (80186 and up)
POPA: 0x61, // opPOPA() (80186 and up)
BOUND: 0x62, // opBOUND() (80186 and up)
ARPL: 0x63, // opARPL() (80286 and up)
FS: 0x64, // opFS() (80386 and up)
GS: 0x65, // opGS() (80386 and up)
OS: 0x66, // opOS() (80386 and up)
AS: 0x67, // opAS() (80386 and up)
PUSHN: 0x68, // opPUSHn() (80186 and up)
IMULN: 0x69, // opIMULn() (80186 and up)
PUSH8: 0x6A, // opPUSH8() (80186 and up)
IMUL8: 0x6B, // opIMUL8() (80186 and up)
INSB: 0x6C, // opINSb() (80186 and up)
INSW: 0x6D, // opINSw() (80186 and up)
OUTSB: 0x6E, // opOUTSb() (80186 and up)
OUTSW: 0x6F, // opOUTSw() (80186 and up)
ENTER: 0xC8, // opENTER() (80186 and up)
LEAVE: 0xC9, // opLEAVE() (80186 and up)
CALLF: 0x9A, // opCALLF()
MOVSB: 0xA4, // opMOVSb()
MOVSW: 0xA5, // opMOVSw()
CMPSB: 0xA6, // opCMPSb()
CMPSW: 0xA7, // opCMPSw()
STOSB: 0xAA, // opSTOSb()
STOSW: 0xAB, // opSTOSw()
LODSB: 0xAC, // opLODSb()
LODSW: 0xAD, // opLODSw()
SCASB: 0xAE, // opSCASb()
SCASW: 0xAF, // opSCASw()
INT3: 0xCC, // opINT3()
INTn: 0xCD, // opINTn()
INTO: 0xCE, // opINTO()
LOOPNZ: 0xE0, // opLOOPNZ()
LOOPZ: 0xE1, // opLOOPZ()
LOOP: 0xE2, // opLOOP()
CALL: 0xE8, // opCALL()
JMP: 0xE9, // opJMP() (2-byte displacement)
JMPF: 0xEA, // opJMPF()
JMPS: 0xEB, // opJMPs() (1-byte displacement)
LOCK: 0xF0, // opLOCK()
REPNZ: 0xF2, // opREPNZ()
REPZ: 0xF3, // opREPZ()
GRP4W: 0xFF,
CALLW: 0x10FF, // GRP4W: fnCALLw()
CALLFDW: 0x18FF, // GRP4W: fnCALLFdw()
CALLMASK: 0x38FF, // mask 2-byte GRP4W opcodes with this before comparing to CALLW or CALLFDW
UD2: 0x0B0F // UD2 (invalid opcode "guaranteed" to generate UD_FAULT on all post-8086 processors)
}
};
/*
* BACKTRACK-related definitions (used only if BACKTRACK is defined)
*/
X86.BACKTRACK = {
SP_LO: 0,
SP_HI: 0
};
/*
* These PS flags are always stored directly in regPS for the 8086/8088, hence the
* "direct" designation; other processors must adjust these bits accordingly. The final
* adjusted value is stored in PS_DIRECT.
*/
X86.PS_DIRECT_8086 = (X86.PS.TF | X86.PS.IF | X86.PS.DF);
/*
* These are the default "always set" PS bits for the 8086/8088; other processors must
* adjust these bits accordingly. The final adjusted value is stored in PS_SET.
*/
X86.PS_SET_8086 = (X86.PS.BIT1 | X86.PS.IOPL.MASK | X86.PS.NT | X86.PS.BIT15);
/*
* These PS arithmetic and logical flags may be "cached" across several result registers;
* whether or not they're currently cached depends on the RESULT bits in resultType.
*/
X86.PS_CACHED = (X86.PS.CF | X86.PS.PF | X86.PS.AF | X86.PS.ZF | X86.PS.SF | X86.PS.OF);
/*
* PS_SAHF is a subset of the arithmetic flags, and refers only to those flags that the
* SAHF and LAHF "8080 legacy" opcodes affect.
*/
X86.PS_SAHF = (X86.PS.CF | X86.PS.PF | X86.PS.AF | X86.PS.ZF | X86.PS.SF);
/*
* Before we zero opFlags, we first see if any of the following PREFIX bits were set. If any were set,
* they are OR'ed into opPrefixes; otherwise, opPrefixes is zeroed as well. This gives prefix-conscious
* instructions like LODS, MOVS, STOS, CMPS, etc, a way of determining which prefixes, if any, immediately
* preceded them.
*/
X86.OPFLAG_PREFIXES = (X86.OPFLAG.SEG | X86.OPFLAG.LOCK | X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ | X86.OPFLAG.DATASIZE | X86.OPFLAG.ADDRSIZE);
if (typeof module !== 'undefined') module.exports = X86;
/**
* @fileoverview Implements PCjs 8086/8088 CPU logic.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-Sep-05
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
if (typeof module !== 'undefined') {
var str = require("../../shared/lib/strlib");
var web = require("../../shared/lib/weblib");
var Component = require("../../shared/lib/component");
var Messages = require("./messages");
var Bus = require("./bus");
var Memory = require("./memory");
var State = require("./state");
var CPU = require("./cpu");
var X86 = require("./x86");
var X86Seg = require("./x86seg");
}
if (!I386) {
/*
* These are the original ModRM decoders, which were simpler and faster because they could treat all
* word instructions as 16-bit, assume bits 15-31 of all registers were always zero, and use masking
* constants instead of variables. If I386 is enabled, these decoders are not used, and the compiler
* will eliminate them from the compiled code.
*/
if (typeof module !== 'undefined') {
var X86ModB = require("./x86modb");
var X86ModW = require("./x86modw");
}
} else {
/*
* These are the more general-purpose ModRM decoders, required for I386 suppport. The current addressing
* mode (16-bit or 32-bit) dynamically selects the appropriate byte and word decoders.
*/
if (typeof module !== 'undefined') {
var X86ModB16 = require("./x86modb16");
var X86ModW16 = require("./x86modw16");
var X86ModB32 = require("./x86modb32");
var X86ModW32 = require("./x86modw32");
var X86ModSIB = require("./x86modsib");
}
}
/**
* X86CPU(parmsCPU)
*
* The X86CPU class uses the following (parmsCPU) properties:
*
* model: a number (eg, 8088) that should match one of the X86.MODEL values
*
* This extends the CPU class and passes any remaining parmsCPU properties to the CPU class
* constructor, along with a default speed (cycles per second) based on the specified (or default)
* CPU model number.
*
* The X86CPU class was initially written to simulate a 8086/8088 microprocessor, although over time
* it has evolved to support later microprocessors (eg, the 80186/80188 and the 80286, including
* protected-mode support).
*
* This is a logical simulation, not a physical simulation, and performance is critical, second only
* to the accuracy of the simulation when running real-world x86 software. Consequently, it takes a
* few liberties with the operation of the simulated hardware, especially with regard to timings,
* little-used features, etc. We do make an effort to maintain accurate instruction cycle counts,
* but there are many other obstacles (eg, prefetch queue, wait states) to achieving perfect timings.
*
* For example, our 8237 DMA controller performs all DMA transfers immediately, since internally
* they are all memory-to-memory, and attempting to interleave DMA cycles with instruction execution
* cycles would hurt overall performance. Similarly, 8254 timer counters are updated only on-demand.
*
* The 8237 and 8254, along with the 8259 interrupt controller and several other "chips", are combined
* into a single ChipSet component, to keep the number of components we juggle to a minimum.
*
* All that being said, this does not change the overall goal: to produce as accurate a simulation as
* possible, within the limits of what JavaScript allows and how precisely/predictably it behaves.
*
* @constructor
* @extends CPU
* @param {Object} parmsCPU
*/
function X86CPU(parmsCPU)
{
this.model = parmsCPU['model'] || X86.MODEL_8088;
var nCyclesDefault = 0;
switch(this.model) {
case X86.MODEL_8088:
default:
nCyclesDefault = 4772727;
break;
case X86.MODEL_80286:
nCyclesDefault = 6000000;
break;
case X86.MODEL_80386:
nCyclesDefault = 16000000;
break;
}
CPU.call(this, parmsCPU, nCyclesDefault);
/*
* Initialize processor operation to match the requested model
*/
this.initProcessor();
/*
* List of software interrupt notification functions: aIntNotify is an array, indexed by
* interrupt number, of 2-element sub-arrays that, in turn, contain:
*
* [0]: registered component
* [1]: registered function to call for every software interrupt
*
* The registered function is called with the linear address (LIP) following the software interrupt;
* if any function returns false, the software interrupt will be skipped (presumed to be emulated),
* and no further notification functions will be called.
*
* NOTE: Registered functions are called only for "INT N" instructions -- NOT "INT 3" or "INTO" or the
* "INT 0x00" generated by a divide-by-zero or any other kind of interrupt (nor any interrupt simulated
* with "PUSHF/CALLF").
*
* aIntReturn is a hash of return address notifications set up by software interrupt notification
* functions that want to receive return notifications. A software interrupt function must call
* cpu.addIntReturn(fn).
*
* WARNING: There's no mechanism in place to insure that software interrupt return notifications don't
* get "orphaned" if an interrupt handler bypasses the normal return path (INT 0x24 is one example of an
* "evil" software interrupt).
*/
this.aIntNotify = [];
this.aIntReturn = [];
/*
* Since aReturnNotify is a "sparse array", this global count gives the CPU a quick way of knowing whether
* or not RETF or IRET instructions need to bother calling checkIntReturn().
*/
this.cIntReturn = 0;
/*
* A variety of stepCPU() state variables that don't strictly need to be initialized before the first
* stepCPU() call, but it's good form to do so.
*/
this.nBurstCycles = 0;
this.aFlags.fComplete = this.aFlags.fDebugCheck = false;
/*
* If there are no live registers to display, then updateStatus() can skip a bit....
*/
this.cLiveRegs = 0;
/*
* We're just declaring aMemBlocks and associated Bus parameters here; they'll be initialized by initMemory()
* when the Bus is initialized.
*/
this.aBusBlocks = this.aMemBlocks = [];
this.nBusMask = this.nMemMask = 0;
this.nBlockShift = this.nBlockSize = this.nBlockLimit = this.nBlockTotal = this.nBlockMask = 0;
if (SAMPLER) {
/*
* For now, we're just going to sample LIP values (well, LIP + cycle count)
*/
this.nSamples = 50000;
this.nSampleFreq = 1000;
this.nSampleSkip = 0;
this.aSamples = new Array(this.nSamples);
for (var i = 0; i < this.nSamples; i++) this.aSamples[i] = -1;
this.iSampleNext = 0;
this.iSampleFreq = 0;
this.iSampleSkip = 0;
}
/*
* This initial resetRegs() call is important to create all the registers (eg, the X86Seg registers),
* so that if/when we call restore(), it will have something to fill in.
*/
this.resetRegs();
}
Component.subclass(X86CPU, CPU);
X86CPU.CYCLES_8088 = {
nWordCyclePenalty: 4, // NOTE: accurate for the 8088/80188 only (on the 8086/80186, it applies to odd addresses only)
nEACyclesBase: 5, // base or index only (BX, BP, SI or DI)
nEACyclesDisp: 6, // displacement only
nEACyclesBaseIndex: 7, // base + index (BP+DI and BX+SI)
nEACyclesBaseIndexExtra: 8, // base + index (BP+SI and BX+DI require an extra cycle)
nEACyclesBaseDisp: 9, // base or index + displacement
nEACyclesBaseIndexDisp: 11, // base + index + displacement (BP+DI+n and BX+SI+n)
nEACyclesBaseIndexDispExtra:12, // base + index + displacement (BP+SI+n and BX+DI+n require an extra cycle)
nOpCyclesAAA: 4, // AAA, AAS, DAA, DAS, TEST acc,imm
nOpCyclesAAD: 60,
nOpCyclesAAM: 83,
nOpCyclesArithRR: 3, // ADC, ADD, AND, OR, SBB, SUB, XOR and CMP reg,reg cycle time
nOpCyclesArithRM: 9, // ADC, ADD, AND, OR, SBB, SUB, and XOR reg,mem (and CMP mem,reg) cycle time
nOpCyclesArithMR: 16, // ADC, ADD, AND, OR, SBB, SUB, and XOR mem,reg cycle time
nOpCyclesArithMID: 1, // ADC, ADD, AND, OR, SBB, SUB, XOR and CMP mem,imm cycle delta
nOpCyclesCall: 19,
nOpCyclesCallF: 28,
nOpCyclesCallWR: 16,
nOpCyclesCallWM: 21,
nOpCyclesCallDM: 37,
nOpCyclesCLI: 2,
nOpCyclesCompareRM: 9, // CMP reg,mem cycle time (same as nOpCyclesArithRM on an 8086 but not on a 80286)
nOpCyclesCWD: 5,
nOpCyclesBound: 33, // N/A if 8086/8088, 33-35 if 80186/80188 (TODO: Determine what the range means for an 80186/80188)
nOpCyclesInP: 10,
nOpCyclesInDX: 8,
nOpCyclesIncR: 3, // INC reg, DEC reg
nOpCyclesIncM: 15, // INC mem, DEC mem
nOpCyclesInt: 51,
nOpCyclesInt3D: 1,
nOpCyclesIntOD: 2,
nOpCyclesIntOFall: 4,
nOpCyclesIRet: 32,
nOpCyclesJmp: 15,
nOpCyclesJmpF: 15,
nOpCyclesJmpC: 16,
nOpCyclesJmpCFall: 4,
nOpCyclesJmpWR: 11,
nOpCyclesJmpWM: 18,
nOpCyclesJmpDM: 24,
nOpCyclesLAHF: 4, // LAHF, SAHF, MOV reg,imm
nOpCyclesLEA: 2,
nOpCyclesLS: 16, // LDS, LES
nOpCyclesLoop: 17, // LOOP, LOOPNZ
nOpCyclesLoopZ: 18, // LOOPZ, JCXZ
nOpCyclesLoopNZ: 19, // LOOPNZ
nOpCyclesLoopFall: 5, // LOOP
nOpCyclesLoopZFall: 6, // LOOPZ, JCXZ
nOpCyclesMovRR: 2,
nOpCyclesMovRM: 8,
nOpCyclesMovMR: 9,
nOpCyclesMovRI: 10,
nOpCyclesMovMI: 10,
nOpCyclesMovAM: 10,
nOpCyclesMovMA: 10,
nOpCyclesDivBR: 80, // range of 80-90
nOpCyclesDivWR: 144, // range of 144-162
nOpCyclesDivBM: 86, // range of 86-96
nOpCyclesDivWM: 154, // range of 154-172
nOpCyclesIDivBR: 101, // range of 101-112
nOpCyclesIDivWR: 165, // range of 165-184
nOpCyclesIDivBM: 107, // range of 107-118
nOpCyclesIDivWM: 171, // range of 171-190
nOpCyclesMulBR: 70, // range of 70-77
nOpCyclesMulWR: 113, // range of 113-118
nOpCyclesMulBM: 76, // range of 76-83
nOpCyclesMulWM: 124, // range of 124-139
nOpCyclesIMulBR: 80, // range of 80-98
nOpCyclesIMulWR: 128, // range of 128-154
nOpCyclesIMulBM: 86, // range of 86-104
nOpCyclesIMulWM: 134, // range of 134-160
nOpCyclesNegR: 3, // NEG reg, NOT reg
nOpCyclesNegM: 16, // NEG mem, NOT mem
nOpCyclesOutP: 10,
nOpCyclesOutDX: 8,
nOpCyclesPopAll: 51, // N/A if 8086/8088, 51 if 80186, 83 if 80188 (TODO: Verify)
nOpCyclesPopReg: 8,
nOpCyclesPopMem: 17,
nOpCyclesPushAll: 36, // N/A if 8086/8088, 36 if 80186, 68 if 80188 (TODO: Verify)
nOpCyclesPushReg: 11, // NOTE: "The 8086 Book" claims this is 10, but it's an outlier....
nOpCyclesPushMem: 16,
nOpCyclesPushSeg: 10,
nOpCyclesPrefix: 2,
nOpCyclesCmpS: 18,
nOpCyclesCmpSr0: 9-2, // reduced by nOpCyclesPrefix
nOpCyclesCmpSrn: 17-2, // reduced by nOpCyclesPrefix
nOpCyclesLodS: 12,
nOpCyclesLodSr0: 9-2, // reduced by nOpCyclesPrefix
nOpCyclesLodSrn: 13-2, // reduced by nOpCyclesPrefix
nOpCyclesMovS: 18,
nOpCyclesMovSr0: 9-2, // reduced by nOpCyclesPrefix
nOpCyclesMovSrn: 17-2, // reduced by nOpCyclesPrefix
nOpCyclesScaS: 15,
nOpCyclesScaSr0: 9-2, // reduced by nOpCyclesPrefix
nOpCyclesScaSrn: 15-2, // reduced by nOpCyclesPrefix
nOpCyclesStoS: 11,
nOpCyclesStoSr0: 9-2, // reduced by nOpCyclesPrefix
nOpCyclesStoSrn: 10-2, // reduced by nOpCyclesPrefix
nOpCyclesRet: 8,
nOpCyclesRetn: 12,
nOpCyclesRetF: 18,
nOpCyclesRetFn: 17,
nOpCyclesShift1M: 15, // ROL/ROR/RCL/RCR/SHL/SHR/SAR reg,1
nOpCyclesShiftCR: 8, // ROL/ROR/RCL/RCR/SHL/SHR/SAR reg,CL
nOpCyclesShiftCM: 20, // ROL/ROR/RCL/RCR/SHL/SHR/SAR mem,CL
nOpCyclesShiftCS: 2, // this is the left-shift value used to convert the count to the cycle cost
nOpCyclesTestRR: 3,
nOpCyclesTestRM: 9,
nOpCyclesTestRI: 5,
nOpCyclesTestMI: 11,
nOpCyclesXchgRR: 4,
nOpCyclesXchgRM: 17,
nOpCyclesXLAT: 11
};
X86CPU.CYCLES_80286 = {
nWordCyclePenalty: 0,
nEACyclesBase: 0,
nEACyclesDisp: 0,
nEACyclesBaseIndex: 0,
nEACyclesBaseIndexExtra: 0,
nEACyclesBaseDisp: 0,
nEACyclesBaseIndexDisp: 1,
nEACyclesBaseIndexDispExtra:1,
nOpCyclesAAA: 3,
nOpCyclesAAD: 14,
nOpCyclesAAM: 16,
nOpCyclesArithRR: 2,
nOpCyclesArithRM: 7,
nOpCyclesArithMR: 7,
nOpCyclesArithMID: 0,
nOpCyclesCall: 7, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesCallF: 13, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesCallWR: 7, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesCallWM: 11, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesCallDM: 16, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesCLI: 3,
nOpCyclesCompareRM: 6,
nOpCyclesCWD: 2,
nOpCyclesBound: 13,
nOpCyclesInP: 5,
nOpCyclesInDX: 5,
nOpCyclesIncR: 2,
nOpCyclesIncM: 7,
nOpCyclesInt: 23, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesInt3D: 0,
nOpCyclesIntOD: 1,
nOpCyclesIntOFall: 3,
nOpCyclesIRet: 17, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesJmp: 7, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesJmpF: 11, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesJmpC: 7, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesJmpCFall: 3,
nOpCyclesJmpWR: 7, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesJmpWM: 11, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesJmpDM: 15, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesLAHF: 2,
nOpCyclesLEA: 3,
nOpCyclesLS: 7,
nOpCyclesLoop: 8, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesLoopZ: 8, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesLoopNZ: 8, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesLoopFall: 4,
nOpCyclesLoopZFall: 4,
nOpCyclesMovRR: 2, // this is actually the same as the 8086...
nOpCyclesMovRM: 3,
nOpCyclesMovMR: 5,
nOpCyclesMovRI: 2,
nOpCyclesMovMI: 3,
nOpCyclesMovAM: 5, // this is actually slower than the MOD/RM form of MOV AX,mem (see nOpCyclesMovRM)
nOpCyclesMovMA: 3,
nOpCyclesDivBR: 14,
nOpCyclesDivWR: 22,
nOpCyclesDivBM: 17,
nOpCyclesDivWM: 25,
nOpCyclesIDivBR: 17,
nOpCyclesIDivWR: 25,
nOpCyclesIDivBM: 20,
nOpCyclesIDivWM: 28,
nOpCyclesMulBR: 13,
nOpCyclesMulWR: 21,
nOpCyclesMulBM: 16,
nOpCyclesMulWM: 24,
nOpCyclesIMulBR: 13,
nOpCyclesIMulWR: 21,
nOpCyclesIMulBM: 16,
nOpCyclesIMulWM: 24,
nOpCyclesNegR: 2,
nOpCyclesNegM: 7,
nOpCyclesOutP: 5,
nOpCyclesOutDX: 5,
nOpCyclesPopAll: 19,
nOpCyclesPopReg: 5,
nOpCyclesPopMem: 5,
nOpCyclesPushAll: 17,
nOpCyclesPushReg: 3,
nOpCyclesPushMem: 5,
nOpCyclesPushSeg: 3,
nOpCyclesPrefix: 0,
nOpCyclesCmpS: 8,
nOpCyclesCmpSr0: 5,
nOpCyclesCmpSrn: 9,
nOpCyclesLodS: 5,
nOpCyclesLodSr0: 5,
nOpCyclesLodSrn: 4,
nOpCyclesMovS: 5,
nOpCyclesMovSr0: 5,
nOpCyclesMovSrn: 4,
nOpCyclesScaS: 7,
nOpCyclesScaSr0: 5,
nOpCyclesScaSrn: 8,
nOpCyclesStoS: 3,
nOpCyclesStoSr0: 4,
nOpCyclesStoSrn: 3,
nOpCyclesRet: 11, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesRetn: 11, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesRetF: 15, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesRetFn: 15, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesShift1M: 7,
nOpCyclesShiftCR: 5,
nOpCyclesShiftCM: 8,
nOpCyclesShiftCS: 0,
nOpCyclesTestRR: 2,
nOpCyclesTestRM: 6,
nOpCyclesTestRI: 3,
nOpCyclesTestMI: 6,
nOpCyclesXchgRR: 3,
nOpCyclesXchgRM: 5,
nOpCyclesXLAT: 5
};
/*
* TODO: Except for the cycle counts at the end of this table (ie, those marked "unique to the 80386"), all these
* values were simply copied from the 80286 table and still need to be modified and verified.
*/
X86CPU.CYCLES_80386 = {
nWordCyclePenalty: 0,
nEACyclesBase: 0,
nEACyclesDisp: 0,
nEACyclesBaseIndex: 0,
nEACyclesBaseIndexExtra: 0,
nEACyclesBaseDisp: 0,
nEACyclesBaseIndexDisp: 1,
nEACyclesBaseIndexDispExtra:1,
nOpCyclesAAA: 3,
nOpCyclesAAD: 14,
nOpCyclesAAM: 16,
nOpCyclesArithRR: 2,
nOpCyclesArithRM: 7,
nOpCyclesArithMR: 7,
nOpCyclesArithMID: 0,
nOpCyclesCall: 7, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesCallF: 13, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesCallWR: 7, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesCallWM: 11, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesCallDM: 16, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesCLI: 3,
nOpCyclesCompareRM: 6,
nOpCyclesCWD: 2,
nOpCyclesBound: 13,
nOpCyclesInP: 5,
nOpCyclesInDX: 5,
nOpCyclesIncR: 2,
nOpCyclesIncM: 7,
nOpCyclesInt: 23, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesInt3D: 0,
nOpCyclesIntOD: 1,
nOpCyclesIntOFall: 3,
nOpCyclesIRet: 17, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesJmp: 7, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesJmpF: 11, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesJmpC: 7, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesJmpCFall: 3,
nOpCyclesJmpWR: 7, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesJmpWM: 11, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesJmpDM: 15, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesLAHF: 2,
nOpCyclesLEA: 3,
nOpCyclesLS: 7,
nOpCyclesLoop: 8, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesLoopZ: 8, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesLoopNZ: 8, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesLoopFall: 4,
nOpCyclesLoopZFall: 4,
nOpCyclesMovRR: 2, // this is actually the same as the 8086...
nOpCyclesMovRM: 3,
nOpCyclesMovMR: 5,
nOpCyclesMovRI: 2,
nOpCyclesMovMI: 3,
nOpCyclesMovAM: 5, // this is actually slower than the MOD/RM form of MOV AX,mem (see nOpCyclesMovRM)
nOpCyclesMovMA: 3,
nOpCyclesDivBR: 14,
nOpCyclesDivWR: 22,
nOpCyclesDivBM: 17,
nOpCyclesDivWM: 25,
nOpCyclesIDivBR: 17,
nOpCyclesIDivWR: 25,
nOpCyclesIDivBM: 20,
nOpCyclesIDivWM: 28,
nOpCyclesMulBR: 13,
nOpCyclesMulWR: 21,
nOpCyclesMulBM: 16,
nOpCyclesMulWM: 24,
nOpCyclesIMulBR: 13,
nOpCyclesIMulWR: 21,
nOpCyclesIMulBM: 16,
nOpCyclesIMulWM: 24,
nOpCyclesNegR: 2,
nOpCyclesNegM: 7,
nOpCyclesOutP: 5,
nOpCyclesOutDX: 5,
nOpCyclesPopAll: 19,
nOpCyclesPopReg: 5,
nOpCyclesPopMem: 5,
nOpCyclesPushAll: 17,
nOpCyclesPushReg: 3,
nOpCyclesPushMem: 5,
nOpCyclesPushSeg: 3,
nOpCyclesPrefix: 0,
nOpCyclesCmpS: 8,
nOpCyclesCmpSr0: 5,
nOpCyclesCmpSrn: 9,
nOpCyclesLodS: 5,
nOpCyclesLodSr0: 5,
nOpCyclesLodSrn: 4,
nOpCyclesMovS: 5,
nOpCyclesMovSr0: 5,
nOpCyclesMovSrn: 4,
nOpCyclesScaS: 7,
nOpCyclesScaSr0: 5,
nOpCyclesScaSrn: 8,
nOpCyclesStoS: 3,
nOpCyclesStoSr0: 4,
nOpCyclesStoSrn: 3,
nOpCyclesRet: 11, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesRetn: 11, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesRetF: 15, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesRetFn: 15, // on the 80286, this ALSO includes the number of bytes in the target instruction
nOpCyclesShift1M: 7,
nOpCyclesShiftCR: 5,
nOpCyclesShiftCM: 8,
nOpCyclesShiftCS: 0,
nOpCyclesTestRR: 2,
nOpCyclesTestRM: 6,
nOpCyclesTestRI: 3,
nOpCyclesTestMI: 6,
nOpCyclesXchgRR: 3,
nOpCyclesXchgRM: 5,
nOpCyclesXLAT: 5,
/*
* Cycle counts unique to the 80386
*/
nOpCyclesBitScan: 11,
nOpCyclesBitSetR: 6,
nOpCyclesBitSetM: 8,
nOpCyclesBitSetMExtra: 5, // extra cycle cost for non-immediate BTC/BTR/BTS opcodes
nOpCyclesBitTestR: 3,
nOpCyclesBitTestM: 6,
nOpCyclesBitTestMExtra: 6, // extra cycle cost for non-immediate BT opcode
nOpCyclesIMulR: 9,
nOpCyclesIMulM: 12,
nOpCyclesMovXR: 3,
nOpCyclesMovXM: 6,
nOpCyclesSetR: 4,
nOpCyclesSetM: 5,
nOpCyclesShiftDR: 3,
nOpCyclesShiftDM: 7
};
/**
* Memory Simulation Notes
*
* Memory accesses are currently hard-coded to simulate 8088 characteristics.
* For example, every 16-bit memory access is assumed to require an additional 4 cycles
* for the upper byte; on an 8086, that would be true only when the memory address was odd.
*
* Similarly, the effective prefetch queue size is 4 bytes (same as an 8088), although
* that can easily be changed to 6 bytes if/when we decide to fully implement 8086 support
* (see X86CPU.PREFETCH.QUEUE). It's just not clear whether that support will be a goal.
*/
X86CPU.PREFETCH = {
QUEUE: 4,
ARRAY: 8, // smallest power-of-two > PREFETCH.QUEUE
MASK: 0x7 // (X86CPU.PREFETCH.ARRAY - 1)
};
/**
* initMemory(aMemBlocks, nBlockShift)
*
* Notification from Bus.initMemory(), giving us direct access to the entire memory space
* (aMemBlocks).
*
* We also initialize an instruction byte prefetch queue, aPrefetch, which is an N-element
* array with slots that look like:
*
* 0: [tag, b] <-- iPrefetchTail
* 1: [tag, b]
* 2: [ -1, 0] <-- iPrefetchHead (eg, when cbPrefetchQueued == 2)
* ...
* 7: [ -1, 0]
*
* where tag is the linear address of the byte that's been prefetched, and b is the
* value of the byte. N is currently 8 (PREFETCH.ARRAY), but it can be any power-of-two
* that is equal to or greater than (PREFETCH.QUEUE), the effective size of the prefetch
* queue (6 on an 8086, 4 on an 8088; currently hard-coded to the latter). All slots
* are initialized to [-1, 0] when preallocating the prefetch queue, but those initial
* values are quickly overwritten and never seen again.
*
* iPrefetchTail is the index (0-7) of the next prefetched byte to be returned to the CPU,
* and iPrefetchHead is the index (0-7) of the next slot to be filled. The prefetch queue
* is empty IFF the two indexes are equal and IFF cbPrefetchQueued is zero. cbPrefetchQueued
* is simply the number of bytes between the tail and the head (from 0 to PREFETCH.QUEUE).
*
* cbPrefetchValid indicates how many bytes behind iPrefetchHead are still valid, allowing us
* to "rewind" the tail up to that many bytes. For example, let's imagine that we prefetched
* 2 bytes, and then we immediately consumed both bytes, leaving iPrefetchTail == iPrefetchHead
* again; however, those previous 2 bytes are still valid, and if, for example, we wanted to
* rewind the IP by 2 (which we might want to do in the case of a repeated string instruction),
* we could rewind the prefetch queue tail as well.
*
* Corresponding to iPrefetchHead is addrPrefetchHead; both are incremented in lock-step.
* Whenever the prefetch queue is flushed, it's typically because a new, non-incremental
* regLIP has been set, so flushPrefetch() expects to receive that address.
*
* If the prefetch queue does not contain any (or enough) bytes to satisfy a getBytePrefetch()
* or getShortPrefetch() request, we force the queue to be filled with the necessary number
* of bytes first.
*
* @this {X86CPU}
* @param {Array} aMemBlocks
* @param {number} nBlockShift
*/
X86CPU.prototype.initMemory = function(aMemBlocks, nBlockShift)
{
/*
* aBusBlocks preserves the Bus block array for the life of the machine, whereas aMemBlocks
* will be altered if/when the CPU enables paging. PAGEBLOCKS must be true when using Memory
* blocks to simulate paging, ensuring that physical blocks and pages have the same size (4Kb).
*/
this.aBusBlocks = aMemBlocks;
this.aMemBlocks = aMemBlocks;
this.nBlockShift = nBlockShift;
this.nBlockSize = 1 << this.nBlockShift;
this.nBlockLimit = this.nBlockSize - 1;
this.nBlockTotal = aMemBlocks.length;
this.nBlockMask = this.nBlockTotal - 1;
if (PREFETCH) {
this.nBusCycles = 0;
this.aPrefetch = new Array(X86CPU.PREFETCH.ARRAY);
for (var i = 0; i < X86CPU.PREFETCH.ARRAY; i++) {
this.aPrefetch[i] = 0;
}
this.flushPrefetch(0);
}
};
/**
* setAddressMask(nBusMask)
*
* Notification from Bus.initMemory() and Bus.setA20(); the latter calls us whenever the physical
* A20 line changes (note that on a 20-bit bus machine, address lines A20 and higher are always zero).
*
* For 32-bit bus machines (eg, 80386), nBusMask is never changed after the initial call, because A20
* wrap-around is simulated by changing the physical memory map rather than altering the A20 bit in nBusMask.
*
* We maintain nMemMask separate from nBusMask, because when paging is enabled on the 80386, the CPU memory
* functions are now dealing with linear addresses rather than physical addresses, so it would be incorrect
* to apply nBusMask to those addresses; nMemMask must remain 0xffffffff (-1) for the duration. If we change
* how A20 is simulated on the 80386, then enablePageBlocks() and disablePageBlocks() will need to override
* nMemMask appropriately.
*
* TODO: Ideally, we would eliminate masking altogether of 32-bit addresses, but that would require different
* sets of memory access functions for different machines (ie, those with 20-bit or 24-bit buses).
*
* @this {X86CPU}
* @param {number} nBusMask
*/
X86CPU.prototype.setAddressMask = function(nBusMask)
{
this.nBusMask = this.nMemMask = nBusMask;
};
/**
* enablePageBlocks()
*
* Whenever the CPU turns on paging and/or updates CR3, this function is called to update our copy
* of the Bus block array, to simulate paging. Whenever the CPU turns paging off, disablePageBlocks()
* must be called to restore our copy of the Bus block array to its original (physical) mapping.
*
* This also requires PAGEBLOCKS be enabled, ensuring that the Bus is configured with a 4Kb block size.
*
* The first time this function is called, aMemBlocks and aBusBlocks are identical, so aMemBlocks is
* reinitialized with special UNPAGED Memory blocks that know how to perform page directory/page table
* lookup and replace themselves with special PAGED Memory blocks that reference memory from the
* appropriate block in aBusBlocks. A parallel array, aBlocksPaged, keeps track (by block number) of
* which blocks have been PAGED, so that whenever CR3 is updated, those blocks can be quickly UNPAGED.
*
* @this {X86CPU}
*/
X86CPU.prototype.enablePageBlocks = function()
{
if (!PAGEBLOCKS) {
this.setError("PAGEBLOCK support required");
return;
}
if (this.aMemBlocks === this.aBusBlocks) {
this.aMemBlocks = new Array(this.nBlockTotal);
this.blockUnpaged = new Memory(null, 0, 0, Memory.TYPE.UNPAGED, null, this);
for (var iBlock = 0; iBlock < this.nBlockTotal; iBlock++) {
this.aMemBlocks[iBlock] = this.blockUnpaged;
}
} else {
for (var i = 0; i < this.aBlocksPaged.length; i++) {
this.aMemBlocks[this.aBlocksPaged[i]] = this.blockUnpaged;
}
}
this.aBlocksPaged = [];
};
/**
* mapPageBlock(addr, fWrite)
*
* Locate the corresponding physical PDE, PTE and memory blocks for the given linear address, and then
* upgrade the block from an UNPAGED Memory block to a new PAGED Memory block; all future accesses to
* the current page will go directly to that block, instead of coming here through the UNPAGED block
* handlers.
*
* Note that since the incoming address (addr) is a linear address, we never need to mask it with nBusMask,
* but all the intermediate (PDE, PTE) and final physical addresses we calculate should still be masked.
*
* Granted, nBusMask on a 32-bit bus is generally going to be 0xffffffff (-1), so making might seem like
* a waste of time; however, if we decide to once again rely on nBusMask for emulating A20 wrap-around
* (instead of changing the physical memory map to alias the 2nd Mb to the 1st Mb), then performing
* consistent masking will be important.
*
* Also, addrPDE, addrPTE and addrPhys do not need any offsets added to them, because we immediately shift
* the offset portion of those addresses out. But for now, at least for debugging and documentation purposes,
* my preference is to perform full address calculations.
*
* Besides, this should not be a performance-critical function; it's normally called only once per UNPAGED
* page. Obviously, if CR3 is constantly being updated, that will trigger repeated calls to enablePageBlocks(),
* which will perform our equivalent of a TLB flush (ie, resetting all PAGED blocks back to UNPAGED blocks).
* That would hurt our performance, but it would hurt performance on a real machine as well, so let's see
* what real-world scenarios we run into.
*
* @this {X86CPU}
* @param {number} addr is a linear address
* @param {boolean} fWrite (true if called for a write, false if for a read)
* @param {boolean} [fSuppress] (true if any faults, remapping, etc should be suppressed)
* @return {Memory|null}
*/
X86CPU.prototype.mapPageBlock = function(addr, fWrite, fSuppress)
{
var offPDE = (addr & X86.LADDR.PDE.MASK) >>> X86.LADDR.PDE.SHIFT;
var addrPDE = this.regCR3 + offPDE;
/*
* bus.getLong(addrPDE) would be simpler, but setPhysBlock() needs to know blockPDE and offPDE, too.
* TODO: Since we're immediately shifting addrPDE by nBlockShift, then we could also skip adding offPDE.
*/
var blockPDE = this.aBusBlocks[(addrPDE & this.nBusMask) >>> this.nBlockShift];
var pde = blockPDE.readLong(offPDE);
if (!(pde & X86.PTE.PRESENT)) {
if (!fSuppress) X86.fnPageFault.call(this, addr, false, fWrite);
return null;
}
if (!(pde & X86.PTE.USER) && this.segCS.cpl == 3) {
if (!fSuppress) X86.fnPageFault.call(this, addr, true, fWrite);
return null;
}
var offPTE = (addr & X86.LADDR.PTE.MASK) >>> X86.LADDR.PTE.SHIFT;
var addrPTE = (pde & X86.PTE.FRAME) + offPTE;
/*
* bus.getLong(addrPTE) would be simpler, but setPhysBlock() needs to know blockPTE and offPTE, too.
* TODO: Since we're immediately shifting addrPDE by nBlockShift, then we could also skip adding offPTE.
*/
var blockPTE = this.aBusBlocks[(addrPTE & this.nBusMask) >>> this.nBlockShift];
var pte = blockPTE.readLong(offPTE);
if (!(pte & X86.PTE.PRESENT) && !fSuppress) {
if (!fSuppress) X86.fnPageFault.call(this, addr, false, fWrite);
return null;
}
if (!(pte & X86.PTE.USER) && this.segCS.cpl == 3) {
if (!fSuppress) X86.fnPageFault.call(this, addr, true, fWrite);
return null;
}
var addrPhys = (pte & X86.PTE.FRAME) + (addr & X86.LADDR.OFFSET);
/*
* TODO: Since we're immediately shifting addrPhys by nBlockShift, we could also skip adding the addr's offset.
*/
var blockPhys = this.aBusBlocks[(addrPhys & this.nBusMask) >>> this.nBlockShift];
if (fSuppress) return blockPhys;
/*
* So we have the block containing the physical memory corresponding to the given linear address.
*
* Now we can create a new PAGED Memory block and record the physical block info using setPhysBlock().
*/
var addrPage = addr & ~X86.LADDR.OFFSET;
var blockPage = new Memory(addrPage, 0, 0, Memory.TYPE.PAGED);
blockPage.setPhysBlock(blockPhys, blockPDE, offPDE, blockPTE, offPTE);
var iBlock = addr >>> this.nBlockShift;
this.aMemBlocks[iBlock] = blockPage;
this.aBlocksPaged.push(iBlock);
return blockPage;
};
/**
* disablePageBlocks()
*
* Whenever the CPU turns off paging, this function restores the CPU's original aMemBlocks.
*
* @this {X86CPU}
*/
X86CPU.prototype.disablePageBlocks = function()
{
if (this.aMemBlocks != this.aBusBlocks) {
this.aMemBlocks = this.aBusBlocks;
this.blockUnpaged = null;
this.aBlocksPaged = null;
}
};
/**
* initProcessor()
*
* This isolates 80186/80188/80286/80386 support, so that it can be selectively enabled/tested.
*
* Here's a summary of 80186/80188 differences according to "AP-186: Introduction to the 80186
* Microprocessor, March 1983" (pp.55-56). "The iAPX 86,88 and iAPX 186,188 User's Manual Programmer's
* Reference", p.3-38, apparently contains the same information, but I've not seen that document.
*
* Undefined [Invalid] Opcodes:
*
* When the opcodes 63H, 64H, 65H, 66H, 67H, F1H, FEH/xx111xxxB and FFH/xx111xxxB are executed,
* the 80186 will execute an illegal [invalid] instruction exception, interrupt 0x06.
* The 8086 will ignore the opcode.
*
* 0FH opcode:
*
* When the opcode 0FH is encountered, the 8086 will execute a POP CS, while the 80186 will
* execute an illegal [invalid] instruction exception, interrupt 0x06.
*
* Word Write at Offset FFFFH:
*
* When a word write is performed at offset FFFFH in a segment, the 8086 will write one byte
* at offset FFFFH, and the other at offset 0, while the 80186 will write one byte at offset
* FFFFH, and the other at offset 10000H (one byte beyond the end of the segment). One byte segment
* underflow will also occur (on the 80186) if a stack PUSH is executed and the Stack Pointer
* contains the value 1.
*
* Shift/Rotate by Value Greater Then [sic] 31:
*
* Before the 80186 performs a shift or rotate by a value (either in the CL register, or by an
* immediate value) it ANDs the value with 1FH, limiting the number of bits rotated to less than 32.
* The 8086 does not do this.
*
* LOCK prefix:
*
* The 8086 activates its LOCK signal immediately after executing the LOCK prefix. The 80186 does
* not activate the LOCK signal until the processor is ready to begin the data cycles associated
* with the LOCKed instruction.
*
* Interrupted String Move Instructions:
*
* If an 8086 is interrupted during the execution of a repeated string move instruction, the return
* value it will push on the stack will point to the last prefix instruction before the string move
* instruction. If the instruction had more than one prefix (e.g., a segment override prefix in
* addition to the repeat prefix), it will not be re-executed upon returning from the interrupt.
* The 80186 will push the value of the first prefix to the repeated instruction, so long as prefixes
* are not repeated, allowing the string instruction to properly resume.
*
* Conditions causing divide error with an integer divide:
*
* The 8086 will cause a divide error whenever the absolute value of the quotient is greater then
* [sic] 7FFFH (for word operations) or if the absolute value of the quotient is greater than 7FH
* (for byte operations). The 80186 has expanded the range of negative numbers allowed as a quotient
* by 1 to include 8000H and 80H. These numbers represent the most negative numbers representable
* using 2's complement arithmetic (equaling -32768 and -128 in decimal, respectively).
*
* ESC Opcode:
*
* The 80186 may be programmed to cause an interrupt type 7 whenever an ESCape instruction (used for
* co-processors like the 8087) is executed. The 8086 has no such provision. Before the 80186 performs
* this trap, it must be programmed to do so. [The details of this "programming" are not included.]
*
* Here's a summary of 80286 differences according to "80286 and 80287 Programmer's Reference Manual",
* Appendix C, p.C-1 (p.329):
*
* 1. Add Six Interrupt Vectors
*
* The 80286 adds six interrupts which arise only if the 8086 program has a hidden bug. These interrupts
* occur only for instructions which were undefined on the 8086/8088 or if a segment wraparound is attempted.
* It is recommended that you add an interrupt handler to the 8086 software that is to be run on the 80286,
* which will treat these interrupts as invalid operations.
*
* This additional software does not significantly effect the existing 8086 software because the interrupts
* do not normally occur and should not already have been used since they are in the interrupt group reserved
* by Intel. [Note to Intel: IBM caaaaaaan't hear you].
*
* 2. Do not Rely on 8086/8088 Instruction Clock Counts
*
* The 80286 takes fewer clocks for most instructions than the 8086/8088. The areas to look into are delays
* between I/0 operations, and assumed delays in 8086/8088 operating in parallel with an 8087.
*
* 3. Divide Exceptions Point at the DIV Instruction
*
* Any interrupt on the 80286 will always leave the saved CS:IP value pointing at the beginning of the
* instruction that failed (including prefixes). On the 8086, the CS:IP value saved for a divide exception
* points at the next instruction.
*
* 4. Use Interrupt 16 (0x10) for Numeric Exceptions
*
* Any 80287 system must use interrupt vector 16 for the numeric error interrupt. If an 8086/8087 or 8088/8087
* system uses another vector for the 8087 interrupt, both vectors should point at the numeric error interrupt
* handler.
*
* 5. Numeric Exception Handlers Should allow Prefixes
*
* The saved CS:IP value in the NPX environment save area will point at any leading prefixes before an ESC
* instruction. On 8086/8088 systems, this value points only at the ESC instruction.
*
* 6. Do Not Attempt Undefined 8086/8088 Operations
*
* Instructions like POP CS or MOV CS,op will either cause exception 6 (undefined [invalid] opcode) or perform
* a protection setup operation like LIDT on the 80286. Undefined bit encodings for bits 5-3 of the second byte
* of POP MEM or PUSH MEM will cause exception 13 on the 80286.
*
* 7. Place a Far JMP Instruction at FFFF0H
*
* After reset, CS:IP = F000:FFF0 on the 80286 (versus FFFF:0000 on the 8086/8088). This change was made to allow
* sufficient code space to enter protected mode without reloading CS. Placing a far JMP instruction at FFFF0H
* will avoid this difference. Note that the BOOTSTRAP option of LOC86 will automatically generate this jump
* instruction.
*
* 8. Do not Rely on the Value Written by PUSH SP
*
* The 80286 will push a different value on the stack for PUSH SP than the 8086/8088. If the value pushed is
* important [and when would it NOT be???], replace PUSH SP instructions with the following three instructions:
*
* PUSH BP
* MOV BP,SP
* XCHG BP,[BP]
*
* This code functions as the 8086/8088 PUSH SP instruction on the 80286.
*
* 9. Do not Shift or Rotate by More than 31 Bits
*
* The 80286 masks all shift/rotate counts to the low 5 bits. This MOD 32 operation limits the count to a maximum
* of 31 bits. With this change, the longest shift/rotate instruction is 39 clocks. Without this change, the longest
* shift/rotate instruction would be 264 clocks, which delays interrupt response until the instruction completes
* execution.
*
* 10. Do not Duplicate Prefixes
*
* The 80286 sets an instruction length limit of 10 bytes. The only way to violate this limit is by duplicating
* a prefix two or more times before an instruction. Exception 6 occurs if the instruction length limit is violated.
* The 8086/8088 has no instruction length limit.
*
* 11. Do not Rely on Odd 8086/8088 LOCK Characteristics
*
* The LOCK prefix and its corresponding output signal should only be used to prevent other bus masters from
* interrupting a data movement operation. The 80286 will always assert LOCK during an XCHG instruction with memory
* (even if the LOCK prefix was not used). LOCK should only be used with the XCHG, MOV, MOVS, INS, and OUTS instructions.
*
* The 80286 LOCK signal will not go active during an instruction prefetch.
*
* 12. Do not Single Step External Interrupt Handlers
*
* The priority of the 80286 single step interrupt is different from that of the 8086/8088. This change was made
* to prevent an external interrupt from being single-stepped if it occurs while single stepping through a program.
* The 80286 single step interrupt has higher priority than any external interrupt.
*
* The 80286 will still single step through an interrupt handler invoked by INT instructions or an instruction
* exception.
*
* 13. Do not Rely on IDIV Exceptions for Quotients of 80H or 8000H
*
* The 80286 can generate the largest negative number as a quotient for IDIV instructions. The 8086 will instead
* cause exception O.
*
* 14. Do not Rely on NMI Interrupting NMI Handlers
*
* After an NMI is recognized, the NMI input and processor extension limit error interrupt is masked until the
* first IRET instruction is executed.
*
* 15. The NPX error signal does not pass through an interrupt controller (an 8087 INT signal does). Any interrupt
* controller-oriented instructions for the 8087 may have to be deleted.
*
* 16. If any real-mode program relies on address space wrap-around (e.g., FFF0:0400=0000:0300), then external hardware
* should be used to force the upper 4 addresses to zero during real mode.
*
* 17. Do not use I/O ports 00F8-00FFH. These are reserved for controlling 80287 and future processor extensions.
*
* @this {X86CPU}
*/
X86CPU.prototype.initProcessor = function()
{
this.PS_SET = X86.PS_SET_8086;
this.PS_DIRECT = X86.PS_DIRECT_8086;
this.OPFLAG_NOINTR_8086 = X86.OPFLAG.NOINTR;
this.nShiftCountMask = 0xff; // on an 8086/8088, all shift counts are used as-is
this.cycleCounts = (this.model == X86.MODEL_80386? X86CPU.CYCLES_80386 : (this.model == X86.MODEL_80286? X86CPU.CYCLES_80286 : X86CPU.CYCLES_8088));
this.aOps = X86.aOps;
this.aOpGrp4b = X86.aOpGrp4b;
this.aOpGrp4w = X86.aOpGrp4w;
this.aOpGrp6 = X86.aOpGrp6Real; // setProtMode() will ensure that aOpGrp6 is switched
if (this.model >= X86.MODEL_80186) {
/*
* I don't go out of my way to make 80186/80188 cycle times accurate, since I'm not aware of any
* IBM PC models that used those processors; beyond the 8086, my next priorities are the 80286 and
* 80386, but I might revisit the 80186 someday.
*
* Instruction handlers that contain "hard-coded" 80286 cycle times include: opINSb, opINSw, opOUTSb,
* opOUTSw, opENTER, and opLEAVE.
*/
this.aOps = X86.aOps.slice(); // make copies of aOps and others before modifying them
this.aOpGrp4b = X86.aOpGrp4b.slice();
this.aOpGrp4w = X86.aOpGrp4w.slice();
this.nShiftCountMask = 0x1f; // on newer processors, all shift counts are MOD 32
this.aOps[0x0F] = X86.opInvalid;
this.aOps[X86.OPCODE.PUSHA] = X86.opPUSHA; // 0x60
this.aOps[X86.OPCODE.POPA] = X86.opPOPA; // 0x61
this.aOps[X86.OPCODE.BOUND] = X86.opBOUND; // 0x62
this.aOps[X86.OPCODE.ARPL] = X86.opInvalid; // 0x63
this.aOps[X86.OPCODE.FS] = X86.opInvalid; // 0x64
this.aOps[X86.OPCODE.GS] = X86.opInvalid; // 0x65
this.aOps[X86.OPCODE.OS] = X86.opInvalid; // 0x66
this.aOps[X86.OPCODE.AS] = X86.opInvalid; // 0x67
this.aOps[X86.OPCODE.PUSHN] = X86.opPUSHn; // 0x68
this.aOps[X86.OPCODE.IMULN] = X86.opIMULn; // 0x69
this.aOps[X86.OPCODE.PUSH8] = X86.opPUSH8; // 0x6A
this.aOps[X86.OPCODE.IMUL8] = X86.opIMUL8; // 0x6B
this.aOps[X86.OPCODE.INSB] = X86.opINSb; // 0x6C
this.aOps[X86.OPCODE.INSW] = X86.opINSw; // 0x6D
this.aOps[X86.OPCODE.OUTSB] = X86.opOUTSb; // 0x6E
this.aOps[X86.OPCODE.OUTSW] = X86.opOUTSw; // 0x6F
this.aOps[0xC0] = X86.opGRP2bn; // 0xC0
this.aOps[0xC1] = X86.opGRP2wn; // 0xC1
this.aOps[X86.OPCODE.ENTER] = X86.opENTER; // 0xC8
this.aOps[X86.OPCODE.LEAVE] = X86.opLEAVE; // 0xC9
this.aOps[0xF1] = X86.opINT1; // 0xF1
this.aOpGrp4b[0x07] = X86.fnGRPInvalid;
this.aOpGrp4w[0x07] = X86.fnGRPInvalid;
if (this.model >= X86.MODEL_80286) {
this.PS_SET = X86.PS.BIT1; // on the 80286, only BIT1 of Processor Status (flags) is always set
this.PS_DIRECT |= X86.PS.IOPL.MASK | X86.PS.NT;
this.OPFLAG_NOINTR_8086 = 0; // used with instructions that should *not* set NOINTR on an 80286 (eg, non-SS segment loads)
this.aOps[0x0F] = X86.op0F;
this.aOps0F = X86.aOps0F.slice();
for (var i = 0; i < this.aOps0F.length; i++) {
if (!this.aOps0F[i]) this.aOps0F[i] = X86.opUndefined;
}
this.aOps[X86.OPCODE.PUSHSP] = X86.opPUSHSP; // 0x54
this.aOps[X86.OPCODE.ARPL] = X86.opARPL; // 0x63
if (I386 && this.model >= X86.MODEL_80386) {
var bOpcode;
this.aOps[X86.OPCODE.FS] = X86.opFS; // 0x64
this.aOps[X86.OPCODE.GS] = X86.opGS; // 0x65
this.aOps[X86.OPCODE.OS] = X86.opOS; // 0x66
this.aOps[X86.OPCODE.AS] = X86.opAS; // 0x67
for (bOpcode in X86.aOps0F386) {
this.aOps0F[+bOpcode] = X86.aOps0F386[bOpcode];
}
}
}
}
};
/**
* reset()
*
* @this {X86CPU}
*/
X86CPU.prototype.reset = function()
{
if (this.aFlags.fRunning) this.stopCPU();
this.resetRegs();
this.resetCycles();
this.clearError(); // clear any fatal error/exception that setError() may have flagged
if (SAMPLER) this.iSampleNext = this.iSampleFreq = this.iSampleSkip = 0;
};
/**
* resetRegs()
*
* According to "The 8086 Book", p.7-5, a RESET signal initializes the following registers:
*
* PS = 0x0000 (which has the important side-effect of disabling interrupts and traps)
* IP = 0x0000
* CS = 0xFFFF
* DS/ES/SS = 0x0000
*
* It is silent as to whether the remaining registers are initialized to any particular values.
*
* According to the "80286 and 80287 Programmer's Reference Manual", these 80286 registers are reset:
*
* PS = 0x0002
* MSW = 0xFFF0
* IP = 0xFFF0
* CS Selector = 0xF000 DS/ES/SS Selector = 0x0000
* CS Base = 0xFF0000 DS/ES/SS Base = 0x000000 IDT Base = 0x000000
* CS Limit = 0xFFFF DS/ES/SS Limit = 0xFFFF IDT Limit = 0x03FF
*
* And from the "INTEL 80386 PROGRAMMER'S REFERENCE MANUAL 1986", section 10.1:
*
* The contents of EAX depend upon the results of the power-up self test. The self-test may be requested
* externally by assertion of BUSY# at the end of RESET. The EAX register holds zero if the 80386 passed
* the test. A nonzero value in EAX after self-test indicates that the particular 80386 unit is faulty.
* If the self-test is not requested, the contents of EAX after RESET is undefined.
*
* DX holds a component identifier and revision number after RESET as Figure 10-1 illustrates. DH contains
* 3, which indicates an 80386 component. DL contains a unique identifier of the revision level.
*
* EFLAGS = 0x00000002
* IP = 0x0000FFF0
* CS selector = 0xF000 (base of 0xFFFF0000 and limit of 0xFFFF)
* DS selector = 0x0000
* ES selector = 0x0000
* SS selector = 0x0000
* FS selector = 0x0000
* GS selector = 0x0000
* IDTR = base of 0 and limit of 0x3FF
*
* All other 80386 registers are undefined after a reset (ie, Intel did not document how or if they are set).
*
* We've elected to set DX to 0x0304 on a reset, which is consistent with a 80386-C0, since we have no desire to
* try to emulate all the bugs in older (eg, B1) steppings -- at least not initially. We leave stepping-accurate
* emulation for another day. It's also known that the B1 (and possibly B0) reported 0x0303 in DX, and that
* the D0 stepping reported 0x0305; beyond that, it's not known exactly what revision numbers Intel used for all
* 80386 revisions.
*
* We define some additional "registers", such as regLIP. which mirrors the linear address corresponding to
* CS:IP (the address of the next opcode byte). In fact, regLIP functions as our internal IP register, so any
* code that needs the real IP must call getIP(). This, in turn, means that whenever CS or IP must be modified,
* regLIP must be recalculated, so you must use either setCSIP(), which takes both an offset and a segment,
* or setIP(), whichever is appropriate; in unusual cases where only segCS is changing (eg, undocumented 8086
* opcodes), use setCS().
*
* Similarly, regLSP mirrors the linear address corresponding to SS:SP, and therefore you must rely on getSP()
* to read the current SP, and setSP() and setSS() to update SP and SS.
*
* The other segment registers, such as segDS and segES, have similar getters and setters, but they do not mirror
* any segment:offset values in the same way that regLIP mirrors CS:IP, or that regLSP mirrors SS:SP.
*
* @this {X86CPU}
*/
X86CPU.prototype.resetRegs = function()
{
this.regEAX = 0;
this.regEBX = 0;
this.regECX = 0;
this.regEDX = 0;
this.regESP = 0; // this isn't needed in a 16-bit environment, but is required for I386
this.regEBP = 0;
this.regESI = 0;
this.regEDI = 0;
/*
* The following are internal "registers" used to capture intermediate values inside selected helper
* functions and use them if they've been modified (or are known to change); for example, the MUL and DIV
* instructions perform calculations that must be propagated to specific registers (eg, AX and/or DX), which
* the ModRM decoder functions don't know about. We initialize them here mainly for documentation purposes.
*/
this.fMDSet = false; // regMDHi and/or regMDLo are invalid unless fMDSet is true
this.regMDLo = this.regMDHi = 0;
this.regXX = 0; // internal register for segment register and control register moves
/*
* Another internal "register" we occasionally need is an interim copy of bModRM, set inside selected opcode
* handlers so that the helper function can have access to the instruction's bModRM without resorting to a
* closure (which, in the Chrome V8 engine, for example, may cause constant recompilation).
*/
this.bModRM = 0;
/*
* NOTE: Even though the 8086 doesn't have CR0 (aka MSW) and IDTR, we initialize them for ALL CPUs, so
* that functions like X86.fnINT() can use the same code for both. The 8086/8088 have no direct way
* of accessing or changing them, so this is an implementation detail those processors are unaware of.
*/
this.regCR0 = X86.CR0.MSW.ON;
this.addrIDT = 0; this.addrIDTLimit = 0x03FF;
this.regPS = this.nIOPL = 0; // these should be set before the first setPS() call
/*
* Define all the result registers that can be used to "cache" arithmetic and logical flags.
*
* In addition, setPS() will initialize resultType, which keeps track of which flags are cached,
* and resultSize, which maintains the size of the last result; initially, no flags are cached.
*/
this.resultDst = this.resultSrc = this.resultArith = this.resultLogic = 0;
/*
* This is set by fnFault() and reset (to -1) by resetRegs() and opIRET(); its initial purpose is to
* "help" fnFault() determine when a nested fault should be converted into either a double-fault (DF_FAULT)
* or a triple-fault (ie, a processor reset).
*/
this.nFault = -1;
/*
* Segment registers used to be defined as separate variables (eg, regCS and regCS0 stored the segment
* number and base linear address, respectively), but segment registers are now defined as X86Seg objects.
*/
this.segCS = new X86Seg(this, X86Seg.ID.CODE, "CS");
this.segDS = new X86Seg(this, X86Seg.ID.DATA, "DS");
this.segES = new X86Seg(this, X86Seg.ID.DATA, "ES");
this.segSS = new X86Seg(this, X86Seg.ID.STACK, "SS");
this.setSP(0);
this.setSS(0);
if (I386 && this.model >= X86.MODEL_80386) {
this.regEDX = 0x0304; // Intel errata sheets indicate this is what an 80386-C0 reported
this.regCR0 = X86.CR0.ET; // formerly MSW
this.regCR1 = 0; // reserved
this.regCR2 = 0; // page fault linear address (PFLA)
this.regCR3 = 0; // page directory base register (PDBR)
this.aRegDR = new Array(8); // Debug Registers DR0-DR7
this.aRegTR = new Array(8); // Test Registers TR0-TR7
this.segFS = new X86Seg(this, X86Seg.ID.DATA, "FS");
this.segGS = new X86Seg(this, X86Seg.ID.DATA, "GS");
}
this.segNULL = new X86Seg(this, X86Seg.ID.NULL, "NULL");
/*
* The next few initializations mirror what we must do prior to each instruction (ie, inside the stepCPU() function);
* note that opPrefixes, along with segData and segStack, are reset only after we've executed a non-prefix instruction.
*/
this.segData = this.segDS;
this.segStack = this.segSS;
this.opFlags = this.opPrefixes = 0;
this.regEA = this.regEAWrite = X86.ADDR_INVALID;
/*
* intFlags contains some internal states we use to indicate whether a hardware interrupt (INTFLAG.INTR) or
* Trap software interrupt (INTR.TRAP) has been requested, as well as when we're in a "HLT" state (INTFLAG.HALT)
* that requires us to wait for a hardware interrupt (INTFLAG.INTR) before continuing execution.
*
* intFlags must be cleared only by checkINTR(), whereas opFlags must be cleared prior to every CPU operation.
*/
this.intFlags = X86.INTFLAG.NONE;
this.setCSIP(0, 0xffff); // this should be called before the first setPS() call
if (!I386) this.resetSizes();
if (BACKTRACK) {
/*
* Initialize the backtrack indexes for all registers to zero. And while, yes, it IS possible
* for raw data to flow through segment registers as well, it's not common enough in real-mode
* (and too difficult in protected-mode) to merit the overhead. Ditto for SP, which can't really
* be considered a general-purpose register.
*
* Every time getByte() is called, btMemLo is filled with the matching backtrack info; similarly,
* every time getWord() is called, btMemLo and btMemHi are filled with the matching backtrack info
* for the low and high bytes, respectively.
*/
this.backTrack = {
btiAL: 0,
btiAH: 0,
btiBL: 0,
btiBH: 0,
btiCL: 0,
btiCH: 0,
btiDL: 0,
btiDH: 0,
btiBPLo: 0,
btiBPHi: 0,
btiSILo: 0,
btiSIHi: 0,
btiDILo: 0,
btiDIHi: 0,
btiMemLo: 0,
btiMemHi: 0,
btiEALo: 0,
btiEAHi: 0,
btiIO: 0
};
}
/*
* Assorted 80286-specific registers. The GDTR and IDTR registers are stored as the following pieces:
*
* GDTR: addrGDT (24 bits) and addrGDTLimit (24 bits)
* IDTR: addrIDT (24 bits) and addrIDTLimit (24 bits)
*
* while the LDTR and TR are stored as special segment registers: segLDT and segTSS.
*
* So, yes, our GDTR and IDTR "registers" differ from other segment registers in that we do NOT record
* the 16-bit limit specified by the LGDT or LIDT instructions; instead, we immediately calculate the limiting
* address, and record that instead.
*
* In addition to different CS:IP reset values, the CS base address must be set to the top of the 16Mb
* address space rather than the top of the first 1Mb (which is why the MODEL_5170 ROM must be addressable
* at both 0x0F0000 and 0xFF0000; see the ROM component's "alias" parameter).
*/
if (this.model >= X86.MODEL_80286) {
/*
* TODO: Verify what the 80286 actually sets addrGDT and addrGDTLimit to on reset (or if it leaves them alone).
*/
this.addrGDT = 0; this.addrGDTLimit = 0xffff; // GDTR
this.segLDT = new X86Seg(this, X86Seg.ID.LDT, "LDT", true); // LDTR
this.segTSS = new X86Seg(this, X86Seg.ID.TSS, "TSS", true); // TR
this.segVER = new X86Seg(this, X86Seg.ID.OTHER, "VER", true); // a scratch segment register for VERR and VERW instructions
this.setCSIP(0xfff0, 0xf000); // on an 80286 or 80386, the default CS:IP is 0xF000:0xFFF0 instead of 0xFFFF:0x0000
this.setCSBase(0xffff0000|0); // on an 80286 or 80386, all CS base address bits above bit 15 must be set
}
/*
* This resets the Processor Status flags (regPS), along with all the internal "result registers";
* we've taken care to ensure that both segCS.cpl and nIOPL are initialized before this first setPS() call.
*/
this.setPS(0);
/*
* Now that all the segment registers have been created, it's safe to set the current addressing mode.
*/
this.setProtMode();
};
/**
* updateAddrSize()
*
* Select the appropriate ModRM dispatch tables, based on the current ADDRESS size (addrSize), which
* is based foremost on segCS.addrSize, but can also be overridden by an ADDRESS size instruction prefix.
*
* @this {X86CPU}
*/
X86CPU.prototype.updateAddrSize = function()
{
if (!I386) {
this.getAddr = this.getShort;
this.aOpModRegByte = X86ModB.aOpModReg;
this.aOpModMemByte = X86ModB.aOpModMem;
this.aOpModGrpByte = X86ModB.aOpModGrp;
this.aOpModRegWord = X86ModW.aOpModReg;
this.aOpModMemWord = X86ModW.aOpModMem;
this.aOpModGrpWord = X86ModW.aOpModGrp;
} else {
if (this.addrSize == 2) {
this.getAddr = this.getShort;
this.aOpModRegByte = X86ModB16.aOpModReg;
this.aOpModMemByte = X86ModB16.aOpModMem;
this.aOpModGrpByte = X86ModB16.aOpModGrp;
this.aOpModRegWord = X86ModW16.aOpModReg;
this.aOpModMemWord = X86ModW16.aOpModMem;
this.aOpModGrpWord = X86ModW16.aOpModGrp;
} else {
this.getAddr = this.getLong;
this.aOpModRegByte = X86ModB32.aOpModReg;
this.aOpModMemByte = X86ModB32.aOpModMem;
this.aOpModGrpByte = X86ModB32.aOpModGrp;
this.aOpModRegWord = X86ModW32.aOpModReg;
this.aOpModMemWord = X86ModW32.aOpModMem;
this.aOpModGrpWord = X86ModW32.aOpModGrp;
}
}
};
/**
* setDataSize(size)
*
* This is used by opcodes that require a particular OPERAND size, which we enforce by
* internally simulating an OPERAND size override, if needed.
*
* @this {X86CPU}
* @param {number} size (2 for 2-byte/16-bit operands, or 4 for 4-byte/32-bit operands)
*/
X86CPU.prototype.setDataSize = function(size)
{
if (this.dataSize != size) {
this.opPrefixes |= X86.OPFLAG.DATASIZE;
this.dataSize = size;
this.dataMask = (size == 2? 0xffff : (0xffffffff|0));
this.updateDataSize();
}
};
/**
* updateDataSize()
*
* @this {X86CPU}
*/
X86CPU.prototype.updateDataSize = function()
{
if (this.dataSize == 2) {
this.dataType = X86.RESULT.WORD;
this.getWord = this.getShort;
this.setWord = this.setShort;
} else {
this.dataType = X86.RESULT.DWORD;
this.getWord = this.getLong;
this.setWord = this.setLong;
}
};
/**
* resetSizes()
*
* @this {X86CPU}
*/
X86CPU.prototype.resetSizes = function()
{
/*
* The following contain the (default) ADDRESS size (2 for 16 bits, 4 for 32 bits), and the corresponding
* masks for isolating the (src) bits of an address and clearing the (dst) bits of an address. Like the
* OPERAND size properties, these are reset to their segCS counterparts at the start of every new instruction.
*/
this.addrSize = this.segCS.addrSize;
this.addrMask = this.segCS.addrMask;
/*
* It's also worth noting that instructions that implicitly use the stack also rely on STACK size,
* which is based on the BIG bit of the last descriptor loaded into SS; use the following segSS properties:
*
* segSS.addrSize (2 or 4)
* segSS.addrMask (0xffff or 0xffffffff)
*
* As there is no STACK size instruction prefix override, there's no need to propagate these segSS properties
* to separate X86CPU properties, as we do for the OPERAND size and ADDRESS size properties.
*/
this.updateAddrSize();
/*
* The following contain the (default) OPERAND size (2 for 16 bits, 4 for 32 bits), and the corresponding masks
* for isolating the (src) bits of an OPERAND and clearing the (dst) bits of an OPERAND. These are reset to
* their segCS counterparts at the start of every new instruction, but are also set here for documentation purposes.
*/
this.dataSize = this.segCS.dataSize;
this.dataMask = this.segCS.dataMask;
this.updateDataSize();
this.opPrefixes &= ~(X86.OPFLAG.ADDRSIZE | X86.OPFLAG.DATASIZE);
};
/**
* getChecksum()
*
* @this {X86CPU}
* @return {number} a 32-bit summation of key elements of the current CPU state (used by the CPU checksum code)
*/
X86CPU.prototype.getChecksum = function()
{
var sum = (this.regEAX + this.regEBX + this.regECX + this.regEDX + this.getSP() + this.regEBP + this.regESI + this.regEDI) | 0;
sum = (sum + this.getIP() + this.getCS() + this.getDS() + this.getSS() + this.getES() + this.getPS()) | 0;
return sum;
};
/**
* addIntNotify(nInt, component, fn)
*
* Add an software interrupt notification handler to the CPU's list of such handlers.
*
* @this {X86CPU}
* @param {number} nInt
* @param {Component} component
* @param {function(number)} fn is called with the LIP value following the software interrupt
*/
X86CPU.prototype.addIntNotify = function(nInt, component, fn)
{
if (fn !== undefined) {
if (this.aIntNotify[nInt] === undefined) {
this.aIntNotify[nInt] = [];
}
this.aIntNotify[nInt].push([component, fn]);
if (MAXDEBUG) this.log("addIntNotify(" + str.toHexWord(nInt) + "," + component.id + ")");
}
};
/**
* checkIntNotify(nInt)
*
* NOTE: This is called ONLY for "INT N" instructions -- not "INTO" or breakpoint or single-step interrupts
* or divide exception interrupts, or hardware interrupts, or any simulation of an interrupt (eg, "PUSHF/CALLF").
*
* @this {X86CPU}
* @param {number} nInt
* @return {boolean} true if software interrupt may proceed, false if software interrupt should be skipped
*/
X86CPU.prototype.checkIntNotify = function(nInt)
{
var aNotify = this.aIntNotify[nInt];
if (aNotify !== undefined) {
for (var i = 0; i < aNotify.length; i++) {
if (!aNotify[i][1].call(aNotify[i][0], this.regLIP)) {
return false;
}
}
}
/*
* The enabling of INT messages is one of the criteria that's also included in the Debugger's
* checksEnabled() function, and therefore in fDebugCheck, so for maximum speed, we check fDebugCheck first.
*/
if (DEBUGGER && this.aFlags.fDebugCheck) {
if (this.messageEnabled(Messages.INT) && this.dbg.messageInt(nInt, this.regLIP)) {
this.addIntReturn(this.regLIP, function(cpu, nCycles) {
return function onIntReturn(nLevel) {
cpu.dbg.messageIntReturn(nInt, nLevel, cpu.getCycles() - nCycles);
};
}(this, this.getCycles()));
}
}
return true;
};
/**
* addIntReturn(addr, fn)
*
* Add a return notification handler to the CPU's list of such handlers.
*
* When fn(n) is called, it's passed a "software interrupt level", which will normally be 0,
* unless it's a return from a nested software interrupt (eg, return from INT 0x10 Video BIOS
* call issued inside another INT 0x10 Video BIOS call).
*
* Note that the nesting could be due to a completely different software interrupt that
* another interrupt notification function is intercepting, so use it as an advisory value only.
*
* @this {X86CPU}
* @param {number} addr is a linear address
* @param {function(number)} fn is an interrupt-return notification function
*/
X86CPU.prototype.addIntReturn = function(addr, fn)
{
if (fn !== undefined) {
if (this.aIntReturn[addr] == null) {
this.cIntReturn++;
}
this.aIntReturn[addr] = fn;
}
};
/**
* checkIntReturn(addr)
*
* We check for possible "INT n" software interrupt returns in the cases of "IRET" (fnIRET), "RETF 2"
* (fnRETF) and "JMPF [DWORD]" (fnJMPFdw).
*
* "JMPF [DWORD]" is an unfortunate choice that newer versions of DOS (as of at least 3.20, and probably
* earlier) employed in their INT 0x13 hooks; I would have preferred not making this call for that opcode.
*
* It is expected (though not required) that callers will check cIntReturn and avoid calling this function
* if the count is zero, for maximum performance.
*
* @this {X86CPU}
* @param {number} addr is a linear address
*/
X86CPU.prototype.checkIntReturn = function(addr)
{
var fn = this.aIntReturn[addr];
if (fn != null) {
fn(--this.cIntReturn);
delete this.aIntReturn[addr];
}
};
/**
* setProtMode(fProt)
*
* Update any opcode handlers that operate significantly differently in real-mode vs. protected-mode, and
* notify all the segment registers about the mode change as well -- but only those that are "bi-modal"; internal
* segment registers like segLDT and segTSS do not need to be notified, because they cannot be accessed in real-mode
* (ie, LLDT, LTR, SLDT, STR are invalid instructions in real-mode, and are among the opcode handlers that we
* update here).
*
* NOTE: Ideally, this function would do its work ONLY on mode *transitions*, but we assume calls to setProtMode()
* are sufficiently infrequent that it doesn't really matter.
*
* @this {X86CPU}
* @param {boolean} [fProt] (use the current MSW PE bit if not specified)
*/
X86CPU.prototype.setProtMode = function(fProt)
{
if (fProt === undefined) {
fProt = !!(this.regCR0 & X86.CR0.MSW.PE);
}
if (!fProt != !(this.regCR0 & X86.CR0.MSW.PE) && this.messageEnabled()) {
this.printMessage("CPU switching to " + (fProt? "protected" : "real") + "-mode", this.bitsMessage, true);
}
this.aOpGrp6 = (fProt? X86.aOpGrp6Prot : X86.aOpGrp6Real);
this.segCS.updateMode();
this.segDS.updateMode();
this.segSS.updateMode();
this.segES.updateMode();
if (I386 && this.model >= X86.MODEL_80386) {
this.segFS.updateMode();
this.segGS.updateMode();
this.resetSizes();
}
};
/**
* saveProtMode()
*
* Save CPU state related to protected-mode, for save()
*
* @this {X86CPU}
* @return {Array}
*/
X86CPU.prototype.saveProtMode = function()
{
if (this.addrGDT != null) {
var a = [
this.regCR0,
this.addrGDT,
this.addrGDTLimit,
this.addrIDT,
this.addrIDTLimit,
this.segLDT.save(),
this.segTSS.save(),
this.nIOPL
];
if (I386) {
a.push(this.regCR1);
a.push(this.regCR2);
a.push(this.regCR3);
a.push(this.aRegDR);
a.push(this.aRegTR);
}
return a;
}
return null;
};
/**
* restoreProtMode()
*
* Restore CPU state related to protected-mode, for restore()
*
* @this {X86CPU}
* @param {Array} a
*/
X86CPU.prototype.restoreProtMode = function(a)
{
if (a && a.length) {
this.regCR0 = a[0];
this.addrGDT = a[1];
this.addrGDTLimit = a[2];
this.addrIDT = a[3];
this.addrIDTLimit = a[4];
this.segLDT.restore(a[5]);
this.segTSS.restore(a[6]);
this.nIOPL = a[7];
if (I386 && this.model >= X86.MODEL_80386) {
this.regCR1 = a[8];
this.regCR2 = a[9];
this.regCR3 = a[10];
this.aRegDR = a[11];
this.aRegTR = a[12];
}
this.setProtMode();
}
};
/**
* save()
*
* This implements save support for the X86 component.
*
* UPDATES: The current speed multiplier from getSpeed() is now saved in group #3, so that your speed is preserved.
*
* @this {X86CPU}
* @return {Object|null}
*/
X86CPU.prototype.save = function()
{
var state = new State(this);
state.set(0, [this.regEAX, this.regEBX, this.regECX, this.regEDX, this.getSP(), this.regEBP, this.regESI, this.regEDI]);
var a = [this.getIP(), this.segCS.save(), this.segDS.save(), this.segSS.save(), this.segES.save(), this.saveProtMode(), this.getPS()];
if (I386 && this.model >= X86.MODEL_80386) {
a.push(this.segFS.save());
a.push(this.segGS.save());
}
state.set(1, a);
state.set(2, [this.segData.sName, this.segStack.sName, this.opFlags, this.opPrefixes, this.intFlags, this.regEA, this.regEAWrite]);
state.set(3, [0, this.nTotalCycles, this.getSpeed()]);
state.set(4, this.bus.saveMemory());
return state.data();
};
/**
* restore(data)
*
* This implements restore support for the X86 component.
*
* @this {X86CPU}
* @param {Object} data
* @return {boolean} true if restore successful, false if not
*/
X86CPU.prototype.restore = function(data)
{
var a = data[0];
this.regEAX = a[0];
this.regEBX = a[1];
this.regECX = a[2];
this.regEDX = a[3];
var regESP = a[4];
this.regEBP = a[5];
this.regESI = a[6];
this.regEDI = a[7];
a = data[1];
this.segCS.restore(a[1]);
this.segDS.restore(a[2]);
this.segSS.restore(a[3]);
this.segES.restore(a[4]);
this.restoreProtMode(a[5]);
this.setPS(a[6]);
/*
* It's important to call setCSIP(), both to ensure that the CPU's linear IP register (regLIP) is updated
* properly AND to ensure the CPU's default ADDRESS and OPERAND sizes are set properly.
*/
this.setCSIP(a[0], this.segCS.sel);
/*
* It's also important to call setSP(), so that the linear SP register (regLSP) will be updated properly;
* we also need to call setSS(), to ensure that the lower and upper stack limits are properly initialized.
*/
this.setSP(regESP);
this.setSS(this.segSS.sel);
if (I386 && this.model >= X86.MODEL_80386) {
this.segFS.restore(a[7]);
this.segGS.restore(a[8]);
}
a = data[2];
this.segData = a[0] != null && this.getSeg(a[0]) || this.segDS;
this.segStack = a[1] != null && this.getSeg(a[1]) || this.segSS;
this.opFlags = a[2];
this.opPrefixes = a[3];
this.intFlags = a[4];
this.regEA = a[5];
this.regEAWrite = a[6]; // save/restore of last EA calculation(s) isn't strictly necessary, but they may be of some interest to, say, the Debugger
a = data[3]; // a[0] was previously nBurstDivisor (no longer used)
this.nTotalCycles = a[1];
this.setSpeed(a[2]); // if we're restoring an old state that doesn't contain a value from getSpeed(), that's OK; setSpeed() checks for an undefined value
return this.bus.restoreMemory(data[4]);
};
/**
* getSeg(sName)
*
* @param {string} sName
* @return {Array}
*/
X86CPU.prototype.getSeg = function(sName)
{
switch(sName) {
case "CS":
return this.segCS;
case "DS":
return this.segDS;
case "SS":
return this.segSS;
case "ES":
return this.segES;
case "NULL":
return this.segNULL;
default:
/*
* HACK: We return a fake segment register object in which only the base linear address is valid,
* because that's all the caller provided (ie, we must be restoring from an older state).
*/
this.assert(typeof sName == "number");
return [0, sName, 0, 0, ""];
}
};
/**
* getCS()
*
* @this {X86CPU}
* @return {number}
*/
X86CPU.prototype.getCS = function()
{
return this.segCS.sel;
};
/**
* setCS(sel)
*
* NOTE: This is used ONLY by those few undocumented 8086/8088/80186/80188 instructions that "MOV" or "POP" a value
* into CS, which we assume have the same behavior as any other instruction that moves or pops a segment register
* (ie, suppresses h/w interrupts for one instruction). Instructions that "JMP" or "CALL" or "INT" or "IRET" a new
* value into CS are always accompanied by a new IP value, so they use setCSIP() instead, which does NOT suppress
* h/w interrupts.
*
* @this {X86CPU}
* @param {number} sel
*/
X86CPU.prototype.setCS = function(sel)
{
var regEIP = this.getIP();
this.regLIP = (this.segCS.load(sel) + regEIP)|0;
this.regLIPLimit = (this.segCS.base + this.segCS.limit)|0;
if (I386) this.resetSizes();
if (!BUGS_8086) this.opFlags |= this.OPFLAG_NOINTR_8086;
if (PREFETCH) this.flushPrefetch(this.regLIP);
};
/**
* getDS()
*
* @this {X86CPU}
* @return {number}
*/
X86CPU.prototype.getDS = function()
{
return this.segDS.sel;
};
/**
* setDS(sel)
*
* @this {X86CPU}
* @param {number} sel
*/
X86CPU.prototype.setDS = function(sel)
{
this.segDS.load(sel);
if (!BUGS_8086) this.opFlags |= this.OPFLAG_NOINTR_8086;
};
/**
* getSS()
*
* @this {X86CPU}
* @return {number}
*/
X86CPU.prototype.getSS = function()
{
return this.segSS.sel;
};
/**
* setSS(sel)
*
* @this {X86CPU}
* @param {number} sel
* @param {boolean} [fInterruptable]
*/
X86CPU.prototype.setSS = function(sel, fInterruptable)
{
var regESP = this.getSP();
this.regLSP = (this.segSS.load(sel) + regESP)|0;
if (this.segSS.fExpDown) {
this.regLSPLimit = (this.segSS.base + this.segSS.addrMask)|0;
this.regLSPLimitLow = (this.segSS.base + this.segSS.limit)|0;
} else {
this.regLSPLimit = (this.segSS.base + this.segSS.limit)|0;
this.regLSPLimitLow = this.segSS.base;
}
if (!BUGS_8086 && !fInterruptable) this.opFlags |= X86.OPFLAG.NOINTR;
};
/**
* getES()
*
* @this {X86CPU}
* @return {number}
*/
X86CPU.prototype.getES = function()
{
return this.segES.sel;
};
/**
* setES(sel)
*
* @this {X86CPU}
* @param {number} sel
*/
X86CPU.prototype.setES = function(sel)
{
this.segES.load(sel);
if (!BUGS_8086) this.opFlags |= this.OPFLAG_NOINTR_8086;
};
/**
* getFS()
*
* NOTE: segFS is defined for I386 only.
*
* @this {X86CPU}
* @return {number}
*/
X86CPU.prototype.getFS = function()
{
return this.segFS.sel;
};
/**
* setFS(sel)
*
* NOTE: segFS is defined for I386 only.
*
* @this {X86CPU}
* @param {number} sel
*/
X86CPU.prototype.setFS = function(sel)
{
this.segFS.load(sel);
};
/**
* getGS()
*
* NOTE: segGS is defined for I386 only.
*
* @this {X86CPU}
* @return {number}
*/
X86CPU.prototype.getGS = function()
{
return this.segGS.sel;
};
/**
* setGS(sel)
*
* NOTE: segGS is defined for I386 only.
*
* @this {X86CPU}
* @param {number} sel
*/
X86CPU.prototype.setGS = function(sel)
{
this.segGS.load(sel);
};
/**
* getIP()
*
* @this {X86CPU}
* @return {number}
*/
X86CPU.prototype.getIP = function()
{
return (this.regLIP - this.segCS.base)|0;
};
/**
* setIP(off)
*
* With the addition of flushPrefetch(), this function should only be called
* for non-incremental IP updates; setIP(this.getIP()+1) is no longer appropriate.
*
* In fact, for performance reasons, it's preferable to increment regLIP yourself,
* but you can also call advanceIP() if speed is not important.
*
* @this {X86CPU}
* @param {number} off
*/
X86CPU.prototype.setIP = function(off)
{
this.regLIP = (this.segCS.base + (off & (I386? this.dataMask : 0xffff)))|0;
if (PREFETCH) this.flushPrefetch(this.regLIP);
};
/**
* setCSIP(off, sel, fCall)
*
* This function is a little different from the other segment setters, only because it turns out that CS is
* never set without an accompanying IP (well, except for a few undocumented instructions, like POP CS, which
* were available ONLY on the 8086/8088/80186/80188; see setCS() for details).
*
* And even though this function is called setCSIP(), please note the order of the parameters is IP,CS,
* which matches the order that CS:IP values are normally stored in memory, allowing us to make calls like this:
*
* this.setCSIP(this.popWord(), this.popWord());
*
* @this {X86CPU}
* @param {number} off
* @param {number} sel
* @param {boolean} [fCall] is true if CALLF in progress, false if RETF/IRET in progress, null/undefined otherwise
* @return {boolean|null} true if a stack switch occurred; the only opcode that really needs to pay attention is opRETFn()
*/
X86CPU.prototype.setCSIP = function(off, sel, fCall)
{
this.segCS.fCall = fCall;
/*
* We break this operation into the following discrete steps (eg, set IP, load CS, and then update IP) so
* that segCS.load(sel) has the ability to modify IP when sel refers to a gate (call, interrupt, trap, etc).
*
* NOTE: regEIP acts merely as a conduit for the IP, if any, that segCS.load() may load; regLIP is still our
* internal instruction pointer. Callers that need the real IP must call getIP().
*/
this.regEIP = off;
var base = this.segCS.load(sel);
if (base !== X86.ADDR_INVALID) {
this.regLIP = (base + (this.regEIP & (I386? this.dataMask : 0xffff)))|0;
this.regLIPLimit = (base + this.segCS.limit)|0;
if (I386) this.resetSizes();
if (PREFETCH) this.flushPrefetch(this.regLIP);
return this.segCS.fStackSwitch;
}
return null;
};
/**
* setCSBase(addr)
*
* Since the CPU must maintain regLIP as the sum of the CS base and the current IP, all calls to setBase()
* for segCS need to go through here.
*
* @param {number} addr
*/
X86CPU.prototype.setCSBase = function(addr)
{
var regIP = this.getIP();
addr = this.segCS.setBase(addr);
this.regLIP = (addr + regIP)|0;
this.regLIPLimit = (addr + this.segCS.limit)|0;
};
/**
* advanceIP(inc)
*
* @this {X86CPU}
* @param {number} inc (positive)
*/
X86CPU.prototype.advanceIP = function(inc)
{
this.assert(inc > 0);
this.regLIP = (this.regLIP + inc)|0;
/*
* Properly comparing regLIP to regLIPLimit would normally require coercing both to unsigned
* (ie, floating-point) values. But instead, we do a subtraction, (regLIPLimit - regLIP), and
* if the result is negative, we need only be concerned if the signs of both numbers are the same
* (ie, the sign of their XOR'ed union is positive).
*
* TODO: I'm combining the old 8088 address-wrap check with the new segment-limit check,
* even though the correct time to do the latter is immediately BEFORE a fetch, not AFTER; eg,
* consider the following code:
*
* AX=0100 BX=0015 CX=0080 DX=F859 SP=0A62 BP=0A98 SI=0000 DI=0000
* SS=0038[1759E0,0B5F] DS=02E8[0107A0,017F] ES=0970[009700,6949] A20=ON
* CS=02E0[010080,06FB] LD=0028[000000,0000] GD=[11AEE0,4977] ID=[120082,03FF]
* TR=0010 MS=FFF3 PS=3202 V0 D0 I1 T0 S0 Z0 A0 P0 C0
* 02E0:06F9 C20400 RET 0004
*
* After fetching the 3rd byte of the "RET 0004" instruction at CS:06FB, the CPU wants to automatically
* advance IP to 06FC, which of course, exceeds the limit, but that doesn't matter unless we actually
* fetch a byte from 06FC, which won't happen. I'm working around this for now by applying a -1
* fudge factor to the fault check below.
*/
var off = (this.regLIPLimit - this.regLIP)|0;
if (off < 0 && (this.regLIPLimit ^ this.regLIP) >= 0) {
/*
* There's no such thing as a GP fault on the 8086/8088, and I'm assuming that, on newer
* processors, when the segment limit is set to the maximum, it's OK for IP to wrap.
*/
if (this.model <= X86.MODEL_8088 || this.segCS.limit == this.segCS.addrMask) {
this.setIP(this.regLIP - this.segCS.base);
} else if (off < -1) { // fudge factor
X86.fnFault.call(this, X86.EXCEPTION.GP_FAULT, 0);
}
}
};
/**
* rewindIP(dec)
*
* @this {X86CPU}
* @param {number} dec (negative)
*/
X86CPU.prototype.rewindIP = function(dec)
{
this.assert(dec < 0);
this.regLIP = (this.regLIP + dec)|0;
/*
* Since rewindIP() is used only for discrete "intra-instruction" IP adjustments, there should be no need
* to perform all the same limit checks as advanceIP().
*/
if (PREFETCH) this.advancePrefetch(dec);
};
/**
* getSP()
*
* @this {X86CPU}
* @return {number}
*/
X86CPU.prototype.getSP = function()
{
if (I386) {
// assert(!((this.regLSP - this.segSS.base) & ~this.segSS.addrMask));
return (this.regESP & ~this.segSS.addrMask) | (this.regLSP - this.segSS.base);
}
return (this.regLSP - this.segSS.base)|0;
};
/**
* setSP(off)
*
* @this {X86CPU}
* @param {number} off
*/
X86CPU.prototype.setSP = function(off)
{
if (I386) {
this.regESP = off;
this.regLSP = (this.segSS.base + (off & this.segSS.addrMask))|0;
} else {
this.regLSP = (this.segSS.base + off)|0;
}
};
/**
* setArithResult(dst, src, value, type, fSubtract)
*
* Updates the flags for arithmetic instructions; use setLogicResult() for logical instructions.
*
* The type parameter indicates both the size of the result (BYTE, WORD or DWORD) and which of the
* flags should now be considered "cached" by the new result variables. If the previous resultType
* specifies any flags not contained in the new type parameter, then those flags must be immediately
* calculated and written to the appropriate bit(s) in regPS.
*
* The fSubtract parameter is used to indicate a "subtracted" result (eg, CMP, DEC, SUB, SBB); the
* default assumes an "added" result (eg, ADD, ADC, INC).
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @param {number} value
* @param {number} type
* @param {boolean} [fSubtract]
*/
X86CPU.prototype.setArithResult = function(dst, src, value, type, fSubtract)
{
if ((type & X86.RESULT.ALL) != X86.RESULT.ALL && type != this.resultType) {
var diff = ((type ^ this.resultType) & this.resultType);
if (diff) {
if (diff & X86.RESULT.CF) this.getCF();
if (diff & X86.RESULT.PF) this.getPF();
if (diff & X86.RESULT.AF) this.getAF();
if (diff & X86.RESULT.ZF) this.getZF();
if (diff & X86.RESULT.SF) this.getSF();
if (diff & X86.RESULT.OF) this.getOF();
}
}
if (!fSubtract) {
this.resultDst = dst;
this.resultArith = value;
} else {
this.resultDst = value;
this.resultArith = dst;
}
this.resultSrc = src;
this.resultLogic = value;
this.resultType = type;
};
/**
* setLogicResult(value, type, carry, overflow)
*
* Updates the flags for logical instructions (eg, AND, OR, TEST, XOR); ie, instructions
* that update PF, ZF, and SF, while clearing CF and OF (although CF and OF can be explicitly
* set via the carry and overflow parameters as needed). AF is always considered undefined.
*
* TODO: We should observe the behavior of AF on real CPUs, and determine if there is a
* well-defined behavior, even though none is documented. Ditto for OF on shift instructions
* when the shift count > 1.
*
* @this {X86CPU}
* @param {number} value
* @param {number} type
* @param {number} [carry]
* @param {number} [overflow]
* @return {number} value
*/
X86CPU.prototype.setLogicResult = function(value, type, carry, overflow)
{
this.resultType = type | X86.RESULT.LOGIC;
this.resultLogic = value;
if (carry) this.setCF(); else this.clearCF();
if (overflow) this.setOF(); else this.clearOF();
return value;
};
/**
* setRotateResult(result, carry, size)
*
* Used by all rotate instructions (ie, RCL, RCR, ROL, ROR) to update CF and OF.
*
* TODO: We should observe the behavior of OF on real CPUs whenever the rotate count > 1,
* and determine if there is a well-defined behavior, even though none is documented.
*
* @this {X86CPU}
* @param {number} result
* @param {number} carry
* @param {number} size
*/
X86CPU.prototype.setRotateResult = function(result, carry, size)
{
if (carry & size) this.setCF(); else this.clearCF();
if ((result ^ carry) & size) this.setOF(); else this.clearOF();
};
/**
* getCarry()
*
* @this {X86CPU}
* @return {number} 0 or 1, depending on whether CF is clear or set
*/
X86CPU.prototype.getCarry = function()
{
return this.getCF()? 1 : 0;
};
/**
* getCF()
*
* Notes regarding carry following an I386 addition:
*
* The following table summarizes bit 31 of dst, src, and result, along with the expected carry:
*
* dst src res carry
* --- --- --- -----
* 0 0 0 0 no
* 0 0 1 0 no (there must have been a carry out of bit 30, but it was "absorbed")
* 0 1 0 1 yes (there must have been a carry out of bit 30, but it was NOT "absorbed")
* 0 1 1 0 no
* 1 0 0 1 yes (same as the preceding "yes" case)
* 1 0 1 0 no
* 1 1 0 1 yes (since the addition of two ones must always produce a carry)
* 1 1 1 1 yes (since the addition of two ones must always produce a carry)
*
* So, we use the following calculation:
*
* (resultDst ^ ((resultDst ^ resultSrc) & (resultSrc ^ resultArith))) & resultType
*
* @this {X86CPU}
* @return {number} 0 or X86.PS.CF
*/
X86CPU.prototype.getCF = function()
{
if (this.resultType & X86.RESULT.CF) {
this.regPS &= ~X86.PS.CF;
if ((this.resultDst ^ ((this.resultDst ^ this.resultSrc) & (this.resultSrc ^ this.resultArith))) & (this.resultType & X86.RESULT.TYPE)) {
this.regPS |= X86.PS.CF;
}
this.resultType &= ~X86.RESULT.CF;
}
return this.regPS & X86.PS.CF;
};
/**
* getPF()
*
* From http://graphics.stanford.edu/~seander/bithacks.html#ParityParallel:
*
* unsigned int v; // word value to compute the parity of
* v ^= v >> 16;
* v ^= v >> 8;
* v ^= v >> 4;
* v &= 0xf;
* return (0x6996 >> v) & 1;
*
* The method above takes around 9 operations, and works for 32-bit words. It may be optimized to work just on
* bytes in 5 operations by removing the two lines immediately following "unsigned int v;". The method first shifts
* and XORs the eight nibbles of the 32-bit value together, leaving the result in the lowest nibble of v. Next,
* the binary number 0110 1001 1001 0110 (0x6996 in hex) is shifted to the right by the value represented in the
* lowest nibble of v. This number is like a miniature 16-bit parity-table indexed by the low four bits in v.
* The result has the parity of v in bit 1, which is masked and returned.
*
* The x86 parity flag (PF) is based exclusively on the low 8 bits of resultParitySign, and PF must be SET if that byte
* has EVEN parity; the above calculation yields ODD parity, so we use the conditional operator to invert the result.
*
* @this {X86CPU}
* @return {number} 0 or X86.PS.PF
*/
X86CPU.prototype.getPF = function()
{
if (this.resultType & X86.RESULT.PF) {
this.regPS &= ~X86.PS.PF;
if ((0x9669 >> ((this.resultLogic ^ (this.resultLogic >> 4)) & 0xf)) & 1) {
this.regPS |= X86.PS.PF;
}
this.resultType &= ~X86.RESULT.PF;
}
return this.regPS & X86.PS.PF;
};
/**
* getAF()
*
* To determine if there's been a carry out of the low 4 bits of an arithmetic operation,
* we look at all the possible inputs for bit 4, and calculate AF = PS^(D^S):
*
* D S A D^S AF
* - - - --- --
* 0 0 0 0 0
* 0 0 1 0 1
* 0 1 0 1 1
* 0 1 1 1 0
* 1 0 0 1 1
* 1 0 1 1 0
* 1 1 0 0 0
* 1 1 1 0 1
*
* The final calculation looks like:
*
* (resultArith ^ (resultDst ^ resultSrc)) & 0x0010
*
* @this {X86CPU}
* @return {number} 0 or X86.PS.AF
*/
X86CPU.prototype.getAF = function()
{
if (this.resultType & X86.RESULT.AF) {
this.regPS &= ~X86.PS.AF;
if ((this.resultArith ^ (this.resultDst ^ this.resultSrc)) & 0x0010) {
this.regPS |= X86.PS.AF;
}
this.resultType &= ~X86.RESULT.AF;
}
return this.regPS & X86.PS.AF;
};
/**
* getZF()
*
* @this {X86CPU}
* @return {number} 0 or X86.PS.ZF
*/
X86CPU.prototype.getZF = function()
{
if (this.resultType & X86.RESULT.ZF) {
this.regPS &= ~X86.PS.ZF;
if (!(this.resultLogic & (((this.resultType & X86.RESULT.TYPE) - 1) | (this.resultType & X86.RESULT.TYPE)))) {
this.regPS |= X86.PS.ZF;
}
this.resultType &= ~X86.RESULT.ZF;
}
return this.regPS & X86.PS.ZF;
};
/**
* getSF()
*
* @this {X86CPU}
* @return {number} 0 or X86.PS.SF
*/
X86CPU.prototype.getSF = function()
{
if (this.resultType & X86.RESULT.SF) {
this.regPS &= ~X86.PS.SF;
if (this.resultLogic & (this.resultType & X86.RESULT.TYPE)) {
this.regPS |= X86.PS.SF;
}
this.resultType &= ~X86.RESULT.SF;
}
return this.regPS & X86.PS.SF;
};
/**
* getOF()
*
* Overflow was originally calculated as:
*
* (resultParitySign ^ resultAuxOverflow ^ (resultParitySign >> 1)) & (resultSize >> 1)
*
* but as you can see, that calculation depends on the carry out of the 8/16/32-bit result in
* resultParitySign, which we don't have access to for 32-bit results. So we fall-back to the
* following:
*
* ((resultDst ^ resultArith) & (resultSrc ^ resultArith)) & resultType
*
* which you can verify from the following table of sign bits (where x1 is resultDst ^ resultArith,
* and x2 is resultSrc ^ resultArith):
*
* D S A x1 x2 OF
* - - - -- -- --
* 0 0 0 0 0 0
* 0 0 1 1 1 1 (adding two positive values yielded a negative value)
* 0 1 0 0 1 0
* 0 1 1 1 0 0
* 1 0 0 1 0 0
* 1 0 1 0 1 0
* 1 1 0 1 1 1 (adding two negative values yielded a positive value)
* 1 1 1 0 0 0
*
* @this {X86CPU}
* @return {number} 0 or X86.PS.OF
*/
X86CPU.prototype.getOF = function()
{
if (this.resultType & X86.RESULT.OF) {
this.regPS &= ~X86.PS.OF;
if (((this.resultDst ^ this.resultArith) & (this.resultSrc ^ this.resultArith)) & (this.resultType & X86.RESULT.TYPE)) {
this.regPS |= X86.PS.OF;
}
this.resultType &= ~X86.RESULT.OF;
}
return this.regPS & X86.PS.OF;
};
/**
* getTF()
*
* @this {X86CPU}
* @return {number} 0 or X86.PS.TF
*/
X86CPU.prototype.getTF = function()
{
return (this.regPS & X86.PS.TF);
};
/**
* getIF()
*
* @this {X86CPU}
* @return {number} 0 or X86.PS.IF
*/
X86CPU.prototype.getIF = function()
{
return (this.regPS & X86.PS.IF);
};
/**
* getDF()
*
* @this {X86CPU}
* @return {number} 0 or X86.PS.DF
*/
X86CPU.prototype.getDF = function()
{
return (this.regPS & X86.PS.DF);
};
/**
* clearCF()
*
* @this {X86CPU}
*/
X86CPU.prototype.clearCF = function()
{
this.resultType &= ~X86.RESULT.CF;
this.regPS &= ~X86.PS.CF;
};
/**
* clearPF()
*
* @this {X86CPU}
*/
X86CPU.prototype.clearPF = function()
{
this.resultType &= ~X86.RESULT.PF;
this.regPS &= ~X86.PS.PF;
};
/**
* clearAF()
*
* @this {X86CPU}
*/
X86CPU.prototype.clearAF = function()
{
this.resultType &= ~X86.RESULT.AF;
this.regPS &= ~X86.PS.AF;
};
/**
* clearZF()
*
* @this {X86CPU}
*/
X86CPU.prototype.clearZF = function()
{
this.resultType &= ~X86.RESULT.ZF;
this.regPS &= ~X86.PS.ZF;
};
/**
* clearSF()
*
* @this {X86CPU}
*/
X86CPU.prototype.clearSF = function()
{
this.resultType &= ~X86.RESULT.SF;
this.regPS &= ~X86.PS.SF;
};
/**
* clearIF()
*
* @this {X86CPU}
*/
X86CPU.prototype.clearIF = function()
{
this.regPS &= ~X86.PS.IF;
};
/**
* clearDF()
*
* @this {X86CPU}
*/
X86CPU.prototype.clearDF = function()
{
this.regPS &= ~X86.PS.DF;
};
/**
* clearOF()
*
* @this {X86CPU}
*/
X86CPU.prototype.clearOF = function()
{
this.resultType &= ~X86.RESULT.OF;
this.regPS &= ~X86.PS.OF;
};
/**
* setCF()
*
* @this {X86CPU}
*/
X86CPU.prototype.setCF = function()
{
this.resultType &= ~X86.RESULT.CF;
this.regPS |= X86.PS.CF;
};
/**
* setPF()
*
* @this {X86CPU}
*/
X86CPU.prototype.setPF = function()
{
this.resultType &= ~X86.RESULT.PF;
this.regPS |= X86.PS.PF;
};
/**
* setAF()
*
* @this {X86CPU}
*/
X86CPU.prototype.setAF = function()
{
this.resultType &= ~X86.RESULT.AF;
this.regPS |= X86.PS.AF;
};
/**
* setZF()
*
* @this {X86CPU}
*/
X86CPU.prototype.setZF = function()
{
this.resultType &= ~X86.RESULT.ZF;
this.regPS |= X86.PS.ZF;
};
/**
* setSF()
*
* @this {X86CPU}
*/
X86CPU.prototype.setSF = function()
{
this.resultType &= ~X86.RESULT.SF;
this.regPS |= X86.PS.SF;
};
/**
* setIF()
*
* @this {X86CPU}
*/
X86CPU.prototype.setIF = function()
{
this.regPS |= X86.PS.IF;
};
/**
* setDF()
*
* @this {X86CPU}
*/
X86CPU.prototype.setDF = function()
{
this.regPS |= X86.PS.DF;
};
/**
* setOF()
*
* @this {X86CPU}
*/
X86CPU.prototype.setOF = function()
{
this.resultType &= ~X86.RESULT.OF;
this.regPS |= X86.PS.OF;
};
/**
* getPS()
*
* @this {X86CPU}
* @return {number}
*/
X86CPU.prototype.getPS = function()
{
return (this.regPS & ~X86.PS_CACHED) | (this.getCF() | this.getPF() | this.getAF() | this.getZF() | this.getSF() | this.getOF());
};
/**
* setMSW(w)
*
* Factored out of x86op0f.js, since both opLMSW and opLOADALL are capable of setting a new MSW.
* The caller is responsible for assessing the appropriate cycle cost.
*
* @this {X86CPU}
* @param {number} w
*/
X86CPU.prototype.setMSW = function(w)
{
/*
* This instruction is always allowed to set MSW.PE, but it cannot clear MSW.PE once set;
* therefore, we always OR the previous value of MSW.PE into the new value before loading.
*/
w |= (this.regCR0 & X86.CR0.MSW.PE) | X86.CR0.MSW.ON;
this.regCR0 = (this.regCR0 & ~X86.CR0.MSW.MASK) | (w & X86.CR0.MSW.MASK);
/*
* Since the 80286 cannot return to real-mode via this instruction, the only transition we
* must worry about is to protected-mode. And there's no harm calling setProtMode() if the
* CPU is already in protected-mode; we could certainly optimize out the call in that case,
* but the instruction isn't used frequently enough to warrant it.
*/
if (this.regCR0 & X86.CR0.MSW.PE) this.setProtMode(true);
};
/**
* setPS(regPS)
*
* @this {X86CPU}
* @param {number} regPS
* @param {number} [cpl]
*/
X86CPU.prototype.setPS = function(regPS, cpl)
{
/*
* OS/2 1.0 discriminates between an 80286 and an 80386 based on whether an IRET in real-mode that
* pops 0xF000 into the flags is able to set *any* of flag bits 12-15: if it can, then OS/2 declares
* the CPU an 80386. Therefore, in real-mode, we must zero all incoming bits 12-15.
*
* This has the added benefit of relieving us from zeroing the effective IOPL (this.nIOPL) whenever
* we're in real-mode, since we're zeroing the incoming IOPL bits up front now.
*/
if (!(this.regCR0 & X86.CR0.MSW.PE)) {
regPS &= ~(X86.PS.IOPL.MASK | X86.PS.NT | X86.PS.BIT15);
}
/*
* There are some cases (eg, an IRET returning to a less privileged code segment) where the CPL
* we compare against should come from the outgoing code segment, so if the caller provided it, use it.
*/
if (cpl === undefined) cpl = this.segCS.cpl;
/*
* Since PS.IOPL and PS.IF are part of PS_DIRECT, we need to take care of any 80286-specific behaviors
* before setting the PS_DIRECT bits from the incoming regPS bits.
*
* Specifically, PS.IOPL is unchanged if CPL > 0, and PS.IF is unchanged if CPL > IOPL.
*/
if (!cpl) {
this.nIOPL = (regPS & X86.PS.IOPL.MASK) >> X86.PS.IOPL.SHIFT; // IOPL allowed to change
} else {
regPS = (regPS & ~X86.PS.IOPL.MASK) | (this.regPS & X86.PS.IOPL.MASK); // IOPL not allowed to change
}
if (cpl > this.nIOPL) {
regPS = (regPS & ~X86.PS.IF) | (this.regPS & X86.PS.IF); // IF not allowed to change
}
this.resultType = X86.RESULT.BYTE;
this.regPS = (this.regPS & ~(this.PS_DIRECT|X86.PS_CACHED)) | (regPS & (this.PS_DIRECT|X86.PS_CACHED)) | this.PS_SET;
if (this.regPS & X86.PS.TF) {
this.intFlags |= X86.INTFLAG.TRAP;
this.opFlags |= X86.OPFLAG.NOINTR;
}
};
/**
* traceLog(prop, dst, src, flagsIn, flagsOut, resultLo, resultHi)
*
* @this {X86CPU}
* @param {string} prop
* @param {number} dst
* @param {number} src
* @param {number|null} flagsIn
* @param {number|null} flagsOut
* @param {number} resultLo
* @param {number} [resultHi]
*/
X86CPU.prototype.traceLog = function(prop, dst, src, flagsIn, flagsOut, resultLo, resultHi)
{
if (DEBUG && this.dbg) {
this.dbg.traceLog(prop, dst, src, flagsIn, flagsOut, resultLo, resultHi);
}
};
/**
* setBinding(sHTMLType, sBinding, control)
*
* @this {X86CPU}
* @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
* @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "AX")
* @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
* @return {boolean} true if binding was successful, false if unrecognized binding request
*/
X86CPU.prototype.setBinding = function(sHTMLType, sBinding, control)
{
var fBound = false;
switch (sBinding) {
case "EAX":
case "EBX":
case "ECX":
case "EDX":
case "ESP":
case "EBP":
case "ESI":
case "EDI":
case "EIP":
case "AX":
case "BX":
case "CX":
case "DX":
case "SP":
case "BP":
case "SI":
case "DI":
case "IP":
case "PC": // deprecated as an alias for "IP" (still used by older XML files, like the one at http://tpoindex.github.io/crobots/)
case "CS":
case "DS":
case "SS":
case "ES":
case "PS": // this refers to "Processor Status", aka the 16-bit flags register (although DEBUG.COM refers to this as "PC", surprisingly)
case "C":
case "P":
case "A":
case "Z":
case "S":
case "T":
case "I":
case "D":
case "V":
this.bindings[sBinding] = control;
this.cLiveRegs++;
fBound = true;
break;
default:
fBound = this.parent.setBinding.call(this, sHTMLType, sBinding, control);
break;
}
return fBound;
};
/**
* probeAddr(addr)
*
* Used by the Debugger to probe addresses without risk of triggering a page fault, and by internal
* functions, like fnFaultMessage(), that also need to avoid triggering faults, since they're not part
* of standard CPU operation.
*
* @this {X86CPU}
* @param {number} addr is a linear address
* @return {number|null} byte (8-bit) value at that address, or null if invalid
*/
X86CPU.prototype.probeAddr = function(addr)
{
var block = this.aMemBlocks[(addr & this.nMemMask) >>> this.nBlockShift];
if (block.type == Memory.TYPE.UNPAGED) {
block = this.mapPageBlock(addr, false, true);
if (!block) return null;
}
return block.readByteDirect(addr & this.nBlockLimit, addr);
};
/**
* getByte(addr)
*
* Use bus.getByte() for physical addresses, and cpu.getByte() for linear addresses; the latter takes care
* of paging, cycle counts, and BACKTRACK states, if any.
*
* @this {X86CPU}
* @param {number} addr is a linear address
* @return {number} byte (8-bit) value at that address
*/
X86CPU.prototype.getByte = function getByte(addr)
{
if (BACKTRACK) this.backTrack.btiMemLo = this.bus.readBackTrack(addr);
return this.aMemBlocks[(addr & this.nMemMask) >>> this.nBlockShift].readByte(addr & this.nBlockLimit, addr);
};
/**
* getShort(addr)
*
* Use bus.getShort() for physical addresses, and cpu.getShort() for linear addresses; the latter takes care
* of paging, cycle counts, and BACKTRACK states, if any.
*
* @this {X86CPU}
* @param {number} addr is a linear address
* @return {number} word (16-bit) value at that address
*/
X86CPU.prototype.getShort = function getShort(addr)
{
var off = addr & this.nBlockLimit;
var iBlock = (addr & this.nMemMask) >>> this.nBlockShift;
/*
* On the 8088, it takes 4 cycles to read the additional byte REGARDLESS whether the address is odd or even.
* TODO: For the 8086, the penalty is actually "(addr & 0x1) << 2" (4 additional cycles only when the address is odd).
*/
this.nStepCycles -= this.cycleCounts.nWordCyclePenalty;
if (BACKTRACK) {
this.backTrack.btiMemLo = this.bus.readBackTrack(addr);
this.backTrack.btiMemHi = this.bus.readBackTrack(addr + 1);
}
if (off < this.nBlockLimit) {
return this.aMemBlocks[iBlock].readShort(off, addr);
}
return this.aMemBlocks[iBlock].readByte(off, addr) | (this.aMemBlocks[(iBlock + 1) & this.nBlockMask].readByte(0, addr + 1) << 8);
};
/**
* getLong(addr)
*
* Use bus.getLong() for physical addresses, and cpu.getLong() for linear addresses; the latter takes care
* of paging, cycle counts, and BACKTRACK states, if any.
*
* @this {X86CPU}
* @param {number} addr is a linear address
* @return {number} long (32-bit) value at that address
*/
X86CPU.prototype.getLong = function getLong(addr)
{
var off = addr & this.nBlockLimit;
var iBlock = (addr & this.nMemMask) >>> this.nBlockShift;
if (BACKTRACK) {
this.backTrack.btiMemLo = this.bus.readBackTrack(addr);
this.backTrack.btiMemHi = this.bus.readBackTrack(addr + 1);
}
if (off < this.nBlockLimit - 2) {
return this.aMemBlocks[iBlock].readLong(off, addr);
}
var nShift = (off & 0x3) << 3;
return (this.aMemBlocks[iBlock].readLong(off & ~0x3, addr) >>> nShift) | (this.aMemBlocks[(iBlock + 1) & this.nBlockMask].readLong(0, addr + 3) << (32 - nShift));
};
/**
* setByte(addr, b)
*
* Use bus.setByte() for physical addresses, and cpu.setByte() for linear addresses; the latter takes care
* of paging, cycle counts, and BACKTRACK states, if any.
*
* @this {X86CPU}
* @param {number} addr is a linear address
* @param {number} b is the byte (8-bit) value to write (which we truncate to 8 bits; required by opSTOSb)
*/
X86CPU.prototype.setByte = function setByte(addr, b)
{
if (BACKTRACK) this.bus.writeBackTrack(addr, this.backTrack.btiMemLo);
this.aMemBlocks[(addr & this.nMemMask) >>> this.nBlockShift].writeByte(addr & this.nBlockLimit, b & 0xff, addr);
};
/**
* setShort(addr, w)
*
* Use bus.setShort() for physical addresses, and cpu.setShort() for linear addresses; the latter takes care
* of paging, cycle counts, and BACKTRACK states, if any.
*
* @this {X86CPU}
* @param {number} addr is a linear address
* @param {number} w is the word (16-bit) value to write (which we truncate to 16 bits to be safe)
*/
X86CPU.prototype.setShort = function setShort(addr, w)
{
var off = addr & this.nBlockLimit;
var iBlock = (addr & this.nMemMask) >>> this.nBlockShift;
/*
* On the 8088, it takes 4 cycles to write the additional byte REGARDLESS whether the address is odd or even.
* TODO: For the 8086, the penalty is actually "(addr & 0x1) << 2" (4 additional cycles only when the address is odd).
*/
this.nStepCycles -= this.cycleCounts.nWordCyclePenalty;
if (BACKTRACK) {
this.bus.writeBackTrack(addr, this.backTrack.btiMemLo);
this.bus.writeBackTrack(addr + 1, this.backTrack.btiMemHi);
}
if (off < this.nBlockLimit) {
this.aMemBlocks[iBlock].writeShort(off, w & 0xffff, addr);
return;
}
this.aMemBlocks[iBlock++].writeByte(off, w & 0xff, addr);
this.aMemBlocks[iBlock & this.nBlockMask].writeByte(0, (w >> 8) & 0xff, addr + 1);
};
/**
* setLong(addr, l)
*
* Use bus.setLong() for physical addresses, and cpu.setLong() for linear addresses; the latter takes care
* of paging, cycle counts, and BACKTRACK states, if any.
*
* @this {X86CPU}
* @param {number} addr is a linear address
* @param {number} l is the long (32-bit) value to write
*/
X86CPU.prototype.setLong = function setLong(addr, l)
{
var off = addr & this.nBlockLimit;
var iBlock = (addr & this.nMemMask) >>> this.nBlockShift;
this.nStepCycles -= this.cycleCounts.nWordCyclePenalty;
if (BACKTRACK) {
this.bus.writeBackTrack(addr, this.backTrack.btiMemLo);
this.bus.writeBackTrack(addr + 1, this.backTrack.btiMemHi);
}
if (off < this.nBlockLimit - 2) {
this.aMemBlocks[iBlock].writeLong(off, l, addr);
return;
}
var lPrev, nShift = (off & 0x3) << 3;
off &= ~0x3;
lPrev = this.aMemBlocks[iBlock].readLong(off, addr);
this.aMemBlocks[iBlock].writeLong(off, (lPrev & ~(-1 << nShift)) | (l << nShift), addr);
iBlock = (iBlock + 1) & this.nBlockMask;
addr += 3;
lPrev = this.aMemBlocks[iBlock].readLong(0, addr);
this.aMemBlocks[iBlock].writeLong(0, (lPrev & (-1 << nShift)) | (l >>> (32 - nShift)), addr);
};
/**
* getEAByte(seg, off)
*
* @this {X86CPU}
* @param {X86Seg} seg register (eg, segDS)
* @param {number} off is a segment-relative offset
* @return {number} byte (8-bit) value at that address
*/
X86CPU.prototype.getEAByte = function(seg, off)
{
this.segEA = seg;
this.regEA = seg.checkRead(this.offEA = off, 1);
if (this.opFlags & X86.OPFLAG.NOREAD) return 0;
var b = this.getByte(this.regEA);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiMemLo;
return b;
};
/**
* getEAByteData(off)
*
* @this {X86CPU}
* @param {number} off is a segment-relative offset
* @return {number} byte (8-bit) value at that address
*/
X86CPU.prototype.getEAByteData = function(off)
{
return this.getEAByte(this.segData, off & (I386? this.addrMask : 0xffff));
};
/**
* getEAByteStack(off)
*
* @this {X86CPU}
* @param {number} off is a segment-relative offset
* @return {number} byte (8-bit) value at that address
*/
X86CPU.prototype.getEAByteStack = function(off)
{
return this.getEAByte(this.segStack, off & (I386? this.addrMask : 0xffff));
};
/**
* getEAWord(seg, off)
*
* @this {X86CPU}
* @param {X86Seg} seg register (eg, segDS)
* @param {number} off is a segment-relative offset
* @return {number} word (16-bit) value at that address
*/
X86CPU.prototype.getEAWord = function(seg, off)
{
this.segEA = seg;
this.regEA = seg.checkRead(this.offEA = off, (I386? this.dataSize : 2));
if (this.opFlags & X86.OPFLAG.NOREAD) return 0;
var w = this.getWord(this.regEA);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiMemLo;
this.backTrack.btiEAHi = this.backTrack.btiMemHi;
}
return w;
};
/**
* getEAWordData(off)
*
* @this {X86CPU}
* @param {number} off is a segment-relative offset
* @return {number} word (16-bit) value at that address
*/
X86CPU.prototype.getEAWordData = function(off)
{
return this.getEAWord(this.segData, off & (I386? this.addrMask : 0xffff));
};
/**
* getEAWordStack(off)
*
* @this {X86CPU}
* @param {number} off is a segment-relative offset
* @return {number} word (16-bit) value at that address
*/
X86CPU.prototype.getEAWordStack = function(off)
{
return this.getEAWord(this.segStack, off & (I386? this.addrMask : 0xffff));
};
/**
* modEAByte(seg, off)
*
* @this {X86CPU}
* @param {X86Seg} seg register (eg, segDS)
* @param {number} off is a segment-relative offset
* @return {number} byte (8-bit) value at that address
*/
X86CPU.prototype.modEAByte = function(seg, off)
{
this.segEA = seg;
this.regEAWrite = this.regEA = seg.checkRead(this.offEA = off, 1);
if (this.opFlags & X86.OPFLAG.NOREAD) return 0;
var b = this.getByte(this.regEA);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiMemLo;
return b;
};
/**
* modEAByteData(off)
*
* @this {X86CPU}
* @param {number} off is a segment-relative offset
* @return {number} byte (8-bit) value at that address
*/
X86CPU.prototype.modEAByteData = function(off)
{
return this.modEAByte(this.segData, off & (I386? this.addrMask : 0xffff));
};
/**
* modEAByteStack(off)
*
* @this {X86CPU}
* @param {number} off is a segment-relative offset
* @return {number} byte (8-bit) value at that address
*/
X86CPU.prototype.modEAByteStack = function(off)
{
return this.modEAByte(this.segStack, off & (I386? this.addrMask : 0xffff));
};
/**
* modEAWord(seg, off)
*
* @this {X86CPU}
* @param {X86Seg} seg register (eg, segDS)
* @param {number} off is a segment-relative offset
* @return {number} word (16-bit) value at that address
*/
X86CPU.prototype.modEAWord = function(seg, off)
{
this.segEA = seg;
this.regEAWrite = this.regEA = seg.checkRead(this.offEA = off, (I386? this.dataSize : 2));
if (this.opFlags & X86.OPFLAG.NOREAD) return 0;
var w = this.getWord(this.regEA);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiMemLo;
this.backTrack.btiEAHi = this.backTrack.btiMemHi;
}
return w;
};
/**
* modEAWordData(off)
*
* @this {X86CPU}
* @param {number} off is a segment-relative offset
* @return {number} word (16-bit) value at that address
*/
X86CPU.prototype.modEAWordData = function(off)
{
return this.modEAWord(this.segData, off & (I386? this.addrMask : 0xffff));
};
/**
* modEAWordStack(off)
*
* @this {X86CPU}
* @param {number} off is a segment-relative offset
* @return {number} word (16-bit) value at that address
*/
X86CPU.prototype.modEAWordStack = function(off)
{
return this.modEAWord(this.segStack, off & (I386? this.addrMask : 0xffff));
};
/**
* setEAByte(b)
*
* @this {X86CPU}
* @param {number} b is the byte (8-bit) value to write
*/
X86CPU.prototype.setEAByte = function(b)
{
if (this.opFlags & X86.OPFLAG.NOWRITE) return;
if (BACKTRACK) this.backTrack.btiMemLo = this.backTrack.btiEALo;
this.setByte(this.segEA.checkWrite(this.offEA, 1), b);
};
/**
* setEAWord(w)
*
* @this {X86CPU}
* @param {number} w is the word (16-bit) value to write
*/
X86CPU.prototype.setEAWord = function(w)
{
if (this.opFlags & X86.OPFLAG.NOWRITE) return;
if (BACKTRACK) {
this.backTrack.btiMemLo = this.backTrack.btiEALo;
this.backTrack.btiMemHi = this.backTrack.btiEAHi;
}
if (!I386) {
this.setShort(this.segEA.checkWrite(this.offEA, 2), w);
} else {
this.setWord(this.segEA.checkWrite(this.offEA, this.dataSize), w);
}
};
/**
* getSOByte(seg, off)
*
* This is like getEAByte(), but it does NOT update regEA.
*
* @this {X86CPU}
* @param {X86Seg} seg register (eg, segDS)
* @param {number} off is a segment-relative offset
* @return {number} byte (8-bit) value at that address
*/
X86CPU.prototype.getSOByte = function(seg, off)
{
return this.getByte(seg.checkRead(off, 1));
};
/**
* getSOWord(seg, off)
*
* This is like getEAWord(), but it does NOT update regEA.
*
* @this {X86CPU}
* @param {X86Seg} seg register (eg, segDS)
* @param {number} off is a segment-relative offset
* @return {number} word (16-bit) value at that address
*/
X86CPU.prototype.getSOWord = function(seg, off)
{
if (!I386) {
return this.getShort(seg.checkRead(off, 2));
} else {
return this.getWord(seg.checkRead(off, this.dataSize));
}
};
/**
* setSOByte(seg, off, b)
*
* This is like setEAByte(), but it does NOT update regEAWrite.
*
* @this {X86CPU}
* @param {X86Seg} seg register (eg, segDS)
* @param {number} off is a segment-relative offset
* @param {number} b is the byte (8-bit) value to write
*/
X86CPU.prototype.setSOByte = function(seg, off, b)
{
this.setByte(seg.checkWrite(off, 1), b);
};
/**
* setSOWord(seg, off, w)
*
* This is like setEAWord(), but it does NOT update regEAWrite.
*
* @this {X86CPU}
* @param {X86Seg} seg register (eg, segDS)
* @param {number} off is a segment-relative offset
* @param {number} w is the word (16-bit) value to write
*/
X86CPU.prototype.setSOWord = function(seg, off, w)
{
if (!I386) {
this.setShort(seg.checkWrite(off, 2), w);
} else {
this.setWord(seg.checkWrite(off, this.dataSize), w);
}
};
/**
* getBytePrefetch(addr)
*
* Return the next byte from the prefetch queue, prefetching it now if necessary.
*
* @this {X86CPU}
* @param {number} addr is a linear address
* @return {number} byte (8-bit) value at that address
*/
X86CPU.prototype.getBytePrefetch = function(addr)
{
if (this.opFlags & X86.OPFLAG.NOREAD) return 0;
var b;
if (!this.cbPrefetchQueued) {
if (MAXDEBUG) {
this.printMessage(" getBytePrefetch[" + this.iPrefetchTail + "]: filling");
this.assert(addr == this.addrPrefetchHead, "X86CPU.getBytePrefetch(" + str.toHex(addr) + "): invalid head address (" + str.toHex(this.addrPrefetchHead) + ")");
this.assert(this.iPrefetchTail == this.iPrefetchHead, "X86CPU.getBytePrefetch(" + str.toHex(addr) + "): head (" + this.iPrefetchHead + ") does not match tail (" + this.iPrefetchTail + ")");
}
this.fillPrefetch(1);
this.nBusCycles += 4;
/*
* This code effectively inlines this.fillPrefetch(1), but without queueing the byte, so it's an optimization
* with side-effects we may not want, and in any case, while it seemed to improve Safari's performance slightly,
* it did nothing for the oddball Chrome performance I'm seeing with PREFETCH enabled.
*
* b = this.aMemBlocks[(addr & this.nMemMask) >>> this.nBlockShift].readByte(addr & this.nBlockLimit, addr);
* this.nBusCycles += 4;
* this.cbPrefetchValid = 0;
* this.addrPrefetchHead = (addr + 1) & this.nMemMask;
* return b;
*/
}
b = this.aPrefetch[this.iPrefetchTail] & 0xff;
if (MAXDEBUG) {
this.printMessage(" getBytePrefetch[" + this.iPrefetchTail + "]: " + str.toHex(addr) + ":" + str.toHexByte(b));
this.assert(addr == (this.aPrefetch[this.iPrefetchTail] >> 8), "X86CPU.getBytePrefetch(" + str.toHex(addr) + "): invalid tail address (" + str.toHex(this.aPrefetch[this.iPrefetchTail] >> 8) + ")");
}
this.iPrefetchTail = (this.iPrefetchTail + 1) & X86CPU.PREFETCH.MASK;
this.cbPrefetchQueued--;
return b;
};
/**
* getShortPrefetch(addr)
*
* Return the next short from the prefetch queue. There are 3 cases to consider:
*
* 1) Both bytes have been prefetched; no bytes need be fetched from memory
* 2) Only the low byte has been prefetched; the high byte must be fetched from memory
* 3) Neither byte has been prefetched; both bytes must be fetched from memory
*
* However, since we want to mirror getBytePrefetch's behavior of fetching all bytes through
* the prefetch queue, we're taking the easy way out and simply calling getBytePrefetch() twice.
*
* @this {X86CPU}
* @param {number} addr is a linear address
* @return {number} short (16-bit) value at that address
*/
X86CPU.prototype.getShortPrefetch = function(addr)
{
return this.getBytePrefetch(addr) | (this.getBytePrefetch(addr + 1) << 8);
};
/**
* getLongPrefetch(addr)
*
* Return the next long from the prefetch queue. Similar to getShortPrefetch(), we take the
* easy way out and call getShortPrefetch() twice.
*
* @this {X86CPU}
* @param {number} addr is a linear address
* @return {number} long (32-bit) value at that address
*/
X86CPU.prototype.getLongPrefetch = function(addr)
{
return this.getShortPrefetch(addr) | (this.getShortPrefetch(addr + 2) << 16);
};
/**
* getWordPrefetch(addr)
*
* @this {X86CPU}
* @param {number} addr is a linear address
* @return {number} short (16-bit) or long (32-bit value as appropriate
*/
X86CPU.prototype.getWordPrefetch = function(addr)
{
return (I386 && this.dataSize == 4? this.getLongPrefetch(addr) : this.getShortPrefetch(addr));
};
/**
* fillPrefetch(n)
*
* Fill the prefetch queue with n instruction bytes.
*
* @this {X86CPU}
* @param {number} n is the number of instruction bytes to fetch
*/
X86CPU.prototype.fillPrefetch = function(n)
{
while (n-- > 0 && this.cbPrefetchQueued < X86CPU.PREFETCH.QUEUE) {
var addr = this.addrPrefetchHead;
var b = this.aMemBlocks[(addr & this.nMemMask) >>> this.nBlockShift].readByte(addr & this.nBlockLimit, addr);
this.aPrefetch[this.iPrefetchHead] = b | (addr << 8);
if (MAXDEBUG) this.printMessage(" fillPrefetch[" + this.iPrefetchHead + "]: " + str.toHex(addr) + ":" + str.toHexByte(b));
this.addrPrefetchHead = (addr + 1) & this.nMemMask;
this.iPrefetchHead = (this.iPrefetchHead + 1) & X86CPU.PREFETCH.MASK;
this.cbPrefetchQueued++;
/*
* We could probably allow cbPrefetchValid to grow as large as X86CPU.PREFETCH.ARRAY-1, but I'm not
* sure there's any advantage to that; certainly the tiny values we expect to see from advancePrefetch()
* wouldn't justify that.
*/
if (this.cbPrefetchValid < X86CPU.PREFETCH.QUEUE) this.cbPrefetchValid++;
}
};
/**
* flushPrefetch(addr)
*
* Empty the prefetch queue.
*
* @this {X86CPU}
* @param {number} addr is a linear address of the current program counter (regLIP)
*/
X86CPU.prototype.flushPrefetch = function(addr)
{
this.addrPrefetchHead = addr;
this.iPrefetchTail = this.iPrefetchHead = this.cbPrefetchQueued = this.cbPrefetchValid = 0;
if (MAXDEBUG && addr !== undefined) this.printMessage(" flushPrefetch[-]: " + str.toHex(addr));
};
/**
* advancePrefetch(inc)
*
* Advance the prefetch queue tail. This is used, for example, in cases where the IP is rewound
* to the start of a repeated string instruction (ie, a string instruction with a REP and possibly
* other prefixes).
*
* If a negative increment takes us beyond what's still valid in the prefetch queue, or if a positive
* increment takes us beyond what's been queued so far, then we simply flush the queue.
*
* @this {X86CPU}
* @param {number} inc (may be +/-)
*/
X86CPU.prototype.advancePrefetch = function(inc)
{
if (inc < 0 && this.cbPrefetchQueued - inc <= this.cbPrefetchValid || inc > 0 && inc < this.cbPrefetchQueued) {
this.iPrefetchTail = (this.iPrefetchTail + inc) & X86CPU.PREFETCH.MASK;
this.cbPrefetchQueued -= inc;
} else {
this.flushPrefetch(this.regLIP);
if (MAXDEBUG) this.printMessage("advancePrefetch(" + inc + "): flushed");
}
};
/**
* getIPByte()
*
* @this {X86CPU}
* @return {number} byte at the current IP; IP advanced by 1
*/
X86CPU.prototype.getIPByte = function()
{
var b = (PREFETCH? this.getBytePrefetch(this.regLIP) : this.getByte(this.regLIP));
if (BACKTRACK) this.bus.updateBackTrackCode(this.regLIP, this.backTrack.btiMemLo);
this.advanceIP(1);
return b;
};
/**
* getIPShort()
*
* @this {X86CPU}
* @return {number} short at the current IP; IP advanced by 2
*/
X86CPU.prototype.getIPShort = function()
{
var w = (PREFETCH? this.getShortPrefetch(this.regLIP) : this.getShort(this.regLIP));
if (BACKTRACK) {
this.bus.updateBackTrackCode(this.regLIP, this.backTrack.btiMemLo);
this.bus.updateBackTrackCode(this.regLIP + 1, this.backTrack.btiMemHi);
}
this.advanceIP(2);
return w;
};
/**
* getIPLong()
*
* @this {X86CPU}
* @return {number} long at the current IP; IP advanced by 4
*/
X86CPU.prototype.getIPLong = function()
{
var l = (PREFETCH? this.getLongPrefetch(this.regLIP) : this.getLong(this.regLIP));
if (BACKTRACK) {
this.bus.updateBackTrackCode(this.regLIP, this.backTrack.btiMemLo);
this.bus.updateBackTrackCode(this.regLIP + 1, this.backTrack.btiMemHi);
}
this.advanceIP(4);
return l;
};
/**
* getIPAddr()
*
* @this {X86CPU}
* @return {number} word at the current IP; IP advanced by 2 or 4, depending on address size
*/
X86CPU.prototype.getIPAddr = function()
{
/*
* TODO: Add PREFETCH support to this function
*/
var w = this.getAddr(this.regLIP);
if (BACKTRACK) {
this.bus.updateBackTrackCode(this.regLIP, this.backTrack.btiMemLo);
this.bus.updateBackTrackCode(this.regLIP + 1, this.backTrack.btiMemHi);
}
this.advanceIP(this.addrSize);
return w;
};
/**
* getIPWord()
*
* @this {X86CPU}
* @return {number} word at the current IP; IP advanced by 2 or 4, depending on operand size
*/
X86CPU.prototype.getIPWord = function()
{
var w = (PREFETCH? this.getWordPrefetch(this.regLIP) : this.getWord(this.regLIP));
if (BACKTRACK) {
this.bus.updateBackTrackCode(this.regLIP, this.backTrack.btiMemLo);
this.bus.updateBackTrackCode(this.regLIP + 1, this.backTrack.btiMemHi);
}
this.advanceIP(this.dataSize);
return w;
};
/**
* getIPDisp()
*
* @this {X86CPU}
* @return {number} sign-extended value from the byte at the current IP; IP advanced by 1
*/
X86CPU.prototype.getIPDisp = function()
{
var w = ((PREFETCH? this.getBytePrefetch(this.regLIP) : this.getByte(this.regLIP)) << 24) >> 24;
if (BACKTRACK) this.bus.updateBackTrackCode(this.regLIP, this.backTrack.btiMemLo);
this.advanceIP(1);
return w;
};
/**
* getSIBAddr(mod)
*
* @this {X86CPU}
* @param {number} mod
* @return {number}
*/
X86CPU.prototype.getSIBAddr = function(mod)
{
var b = PREFETCH? this.getBytePrefetch(this.regLIP) : this.getByte(this.regLIP);
if (BACKTRACK) this.bus.updateBackTrackCode(this.regLIP, this.backTrack.btiMemLo);
this.advanceIP(1);
return X86ModSIB.aOpModSIB[b].call(this, mod);
};
/**
* popWord()
*
* @this {X86CPU}
* @return {number} word popped from the current SP; SP increased by 2 or 4
*/
X86CPU.prototype.popWord = function()
{
var w = this.getWord(this.regLSP);
this.regLSP = (this.regLSP + (I386? this.dataSize : 2))|0;
/*
* Properly comparing regLSP to regLSPLimit would normally require coercing both to unsigned
* (ie, floating-point) values. But instead, we do a subtraction, (regLSPLimit - regLSP), and
* if the result is negative, we need only be concerned if the signs of both numbers are the same
* (ie, the sign of their XOR'ed union is positive).
*
* TODO: I'm combining the old 8088 address-wrap check with the new segment-limit check,
* even though the correct time to do the latter is immediately BEFORE the fetch, not AFTER;
* I'm working around this for now by applying a -1 fudge factor to the fault check below.
*/
var off = ((this.regLSPLimit - this.regLSP)|0);
if (off < 0 && (this.regLSPLimit ^ this.regLSP) >= 0) {
/*
* There's no such thing as an SS fault on the 8086/8088, and I'm assuming that, on newer
* processors, when the stack segment limit is set to the maximum, it's OK for the stack to wrap.
*/
if (this.model <= X86.MODEL_8088 || !this.segSS.fExpDown && this.segSS.limit == this.segSS.addrMask || this.segSS.fExpDown && !this.segSS.limit) {
this.setSP((this.regLSP - this.segSS.base) & this.segSS.addrMask);
} else if (off < -1) { // fudge factor
X86.fnFault.call(this, X86.EXCEPTION.SS_FAULT, 0);
}
}
return w;
};
/**
* pushWord(w)
*
* @this {X86CPU}
* @param {number} w is the word (16-bit) value to push at current SP; SP decreased by 2 or 4
*/
X86CPU.prototype.pushWord = function(w)
{
this.assert((w & this.dataMask) == w);
this.regLSP = (this.regLSP - (I386? this.dataSize : 2))|0;
/*
* Properly comparing regLSP to regLSPLimitLow would normally require coercing both to unsigned
* (ie, floating-point) values. But instead, we do a subtraction, (regLSP - regLSPLimitLow), and
* if the result is negative, we need only be concerned if the signs of both numbers are the same
* (ie, the sign of their XOR'ed union is positive).
*/
if (((this.regLSP - this.regLSPLimitLow)|0) < 0 && (this.regLSPLimitLow ^ this.regLSP) >= 0) {
/*
* There's no such thing as an SS fault on the 8086/8088, and I'm assuming that, on newer
* processors, when the stack segment limit is set to the maximum, it's OK for the stack to wrap.
*/
if (this.model <= X86.MODEL_8088 || !this.segSS.fExpDown && this.segSS.limit == this.segSS.addrMask || this.segSS.fExpDown && !this.segSS.limit) {
this.setSP((this.regLSP - this.segSS.base) & this.segSS.addrMask);
} else {
X86.fnFault.call(this, X86.EXCEPTION.SS_FAULT, 0);
}
}
this.setWord(this.regLSP, w);
};
/**
* setDMA(fActive)
*
* This is called by the ChipSet component to update DMA status.
*
* @this {X86CPU}
* @param {boolean} fActive is true to set INTFLAG.DMA, false to clear
*
X86CPU.prototype.setDMA = function(fActive)
{
if (this.chipset) {
if (fActive) {
this.intFlags |= X86.INTFLAG.DMA;
} else {
this.intFlags &= ~X86.INTFLAG.DMA;
}
}
};
*/
/**
* checkINTR()
*
* This must only be called when intFlags (containing the simulated INTFLAG.INTR signal) is known to be set.
* Note that it's perfectly possible that between the time updateINTR(true) was called and we request the
* interrupt vector number below, the interrupt could have been cleared or masked, in which case getIRRVector()
* will return -1 and we'll simply clear INTFLAG.INTR.
*
* intFlags has been overloaded with the INTFLAG.TRAP bit as well, since the acknowledgment of h/w interrupts
* and the Trap flag are similar; they must both honor the NOINTR suppression flag, and stepCPU() shouldn't
* have to check multiple variables when deciding whether to simulate an interrupt.
*
* This function also includes a check for the new async INTFLAG.DMA flag, which is triggered by a ChipSet call
* to setDMA(). This DMA flag actually has nothing to do with interrupts; it's simply an expedient way to
* piggy-back on the CPU's execution logic, to help drive async DMA requests.
*
* Originally, DMA requests (eg, FDC or HDC I/O operations) were all handled synchronously, since no actual
* I/O was required to satisfy the request; from the CPU's perspective, this meant DMA operations were virtually
* instantaneous. However, with the introduction of remote disk connections, some actual I/O may now be required;
* in practice, this means that the FIRST byte requested as part of a DMA operation may require a callback to
* finish, while all remaining bytes will be retrieved during subsequent checkINTR() calls -- unless of course
* additional remote I/O operations are required to complete the DMA operation.
*
* As a result, the CPU will run slightly slower while an async DMA request is in progress, but the slowdown
* should be negligible. One downside is that this slowdown will be in effect for the entire duration of the
* I/O (ie, even while we're waiting for the remote I/O to finish), so the ChipSet component should avoid
* calling setDMA() whenever possible.
*
* TODO: While comparing SYMDEB tracing in both PCjs and VMware, I noticed that after single-stepping ANY
* segment-load instruction, SYMDEB would get control immediately after that instruction in VMware, whereas
* I delay acknowledgment of the Trap flag until the *following* instruction, so in PCjs, SYMDEB doesn't get
* control until the following instruction. I think PCjs behavior is correct, at least for SS.
*
* ERRATA: Early revisions of the 8086/8088 failed to suppress hardware interrupts (and possibly also Trap
* acknowledgements) after an SS load, but Intel corrected the problem at some point; however, I don't know when
* that change was made or which IBM PC models may have been affected, if any. TODO: More research required.
*
* WARNING: There is also a priority consideration here. On the 8086/8088, hardware interrupts have higher
* priority than Trap interrupts (which is why the code below is written the way it is). A potentially
* undesirable side-effect is that a hardware interrupt handler could end up being single-stepped if an
* external interrupt occurs immediately after the Trap flag is set. This is why some 8086 debuggers temporarily
* mask all hardware interrupts during a single-step operation (although that doesn't help with NMIs generated
* by a coprocessor). As of the 80286, those priorities were inverted, giving the Trap interrupt higher priority
* than external interrupts.
*
* TODO: Determine the priorities for the 80186.
*
* @this {X86CPU}
* @return {boolean} true if h/w interrupt (or trap) has just been acknowledged, false if not
*/
X86CPU.prototype.checkINTR = function()
{
this.assert(this.intFlags);
if (!(this.opFlags & X86.OPFLAG.NOINTR)) {
/*
* As discussed above, the 8086/8088 give hardware interrupts higher priority than the TRAP interrupt,
* whereas the 80286 and up give TRAPs higher priority.
*/
var iPriority = (this.model < X86.MODEL_80286? 0 : 1);
for (var cPriorities = 0; cPriorities < 2; cPriorities++) {
switch(iPriority) {
case 0:
if ((this.intFlags & X86.INTFLAG.INTR) && (this.regPS & X86.PS.IF)) {
var nIDT = this.chipset.getIRRVector();
if (nIDT >= -1) {
this.intFlags &= ~X86.INTFLAG.INTR;
if (nIDT >= 0) {
this.intFlags &= ~X86.INTFLAG.HALT;
X86.fnINT.call(this, nIDT, null, 11);
return true;
}
}
}
break;
case 1:
if ((this.intFlags & X86.INTFLAG.TRAP)) {
this.intFlags &= ~X86.INTFLAG.TRAP;
X86.fnINT.call(this, X86.EXCEPTION.TRAP, null, 11);
return true;
}
break;
}
iPriority = 1 - iPriority;
}
}
if (this.intFlags & X86.INTFLAG.DMA) {
if (!this.chipset.checkDMA()) {
this.intFlags &= ~X86.INTFLAG.DMA;
}
}
return false;
};
/**
* updateINTR(fRaise)
*
* This is called by the ChipSet component whenever a h/w interrupt needs to be simulated.
* This is how the PIC component simulates raising the INTFLAG.INTR signal. We will honor the request
* only if we have a reference back to the ChipSet component. The CPU will then "respond" by calling
* checkINTR() and request the corresponding interrupt vector from the ChipSet.
*
* @this {X86CPU}
* @param {boolean} fRaise is true to raise INTFLAG.INTR, false to lower
*/
X86CPU.prototype.updateINTR = function(fRaise)
{
if (this.chipset) {
if (fRaise) {
this.intFlags |= X86.INTFLAG.INTR;
} else {
this.intFlags &= ~X86.INTFLAG.INTR;
}
}
};
/**
* delayINTR()
*
* This is called by the ChipSet component whenever the IMR register is being unmasked, to avoid
* interrupts being simulated too quickly. This works around a problem in the ROM BIOS "KBD_RESET"
* (F000:E688) function, which is called with interrupts enabled by the "TST8" (F000:E30D) code.
*
* "KBD_RESET" appears to be written with the assumption that CLI is in effect, because it issues an
* STI immediately after unmasking the keyboard IRQ. And normally, the STI would delay INTFLAG.INTR
* long enough to allow AH to be set to 0. But if interrupts are already enabled, an interrupt could
* theoretically occur before the STI. And since AH isn't initialized until after the STI, such an
* interrupt would be missed.
*
* I'm assuming this never happens in practice because the PIC isn't that fast. But for us to
* guarantee that, we need to provide this function to the ChipSet component.
*
* @this {X86CPU}
*/
X86CPU.prototype.delayINTR = function()
{
this.opFlags |= X86.OPFLAG.NOINTR;
};
/**
* updateReg(sReg, nValue)
*
* This function helps updateStatus() by massaging the register names and values according to
* CPU type before passing the call to displayValue(); in the "old days", updateStatus() called
* displayValue() directly (although then it was called displayReg()).
*
* @this {X86CPU}
* @param {string} sReg
* @param {number} nValue
*/
X86CPU.prototype.updateReg = function(sReg, nValue)
{
var cch = 4;
if (sReg.length == 1) {
cch = 1;
nValue = nValue? 1 : 0;
}
if (this.model < 80386) {
if (sReg.length > 2) {
sReg = sReg.substr(1, 2);
}
} else {
if (sReg == "PS" || sReg.length > 2) {
cch = 8;
}
}
this.displayValue(sReg, nValue, cch);
};
/**
* updateStatus()
*
* This provides periodic Control Panel updates (eg, a few times per second; see STATUS_UPDATES_PER_SECOND).
* this is where we take care of any DOM updates (eg, register values) while the CPU is running.
*
* Any high-frequency updates should be performed in updateVideo(), which should avoid DOM updates, since updateVideo()
* can be called up to 60 times per second (see VIDEO_UPDATES_PER_SECOND).
*
* @this {X86CPU}
* @param {boolean} [fForce] (true will display registers even if the CPU is running and "live" registers are not enabled)
*/
X86CPU.prototype.updateStatus = function(fForce)
{
if (this.cLiveRegs) {
if (fForce || !this.aFlags.fRunning || this.aFlags.fDisplayLiveRegs) {
this.updateReg("EAX", this.regEAX);
this.updateReg("EBX", this.regEBX);
this.updateReg("ECX", this.regECX);
this.updateReg("EDX", this.regEDX);
this.updateReg("ESP", this.getSP());
this.updateReg("EBP", this.regEBP);
this.updateReg("ESI", this.regESI);
this.updateReg("EDI", this.regEDI);
this.updateReg("CS", this.getCS());
this.updateReg("DS", this.getDS());
this.updateReg("SS", this.getSS());
this.updateReg("ES", this.getES());
this.updateReg("EIP", this.getIP());
var regPS = this.getPS();
this.updateReg("PS", regPS);
this.updateReg("V", (regPS & X86.PS.OF));
this.updateReg("D", (regPS & X86.PS.DF));
this.updateReg("I", (regPS & X86.PS.IF));
this.updateReg("T", (regPS & X86.PS.TF));
this.updateReg("S", (regPS & X86.PS.SF));
this.updateReg("Z", (regPS & X86.PS.ZF));
this.updateReg("A", (regPS & X86.PS.AF));
this.updateReg("P", (regPS & X86.PS.PF));
this.updateReg("C", (regPS & X86.PS.CF));
}
}
var controlSpeed = this.bindings["speed"];
if (controlSpeed) controlSpeed.textContent = this.getSpeedCurrent();
this.parent.updateStatus.call(this, fForce);
};
/**
* stepCPU(nMinCycles)
*
* NOTE: Single-stepping should not be confused with the Trap flag; single-stepping is a Debugger
* operation that's completely independent of Trap status. The CPU can go in and out of Trap mode,
* in and out of h/w interrupt service routines (ISRs), etc, but from the Debugger's perspective,
* they're all one continuous stream of instructions that can be stepped or run at will. Moreover,
* stepping vs. running should never change the behavior of the simulation.
*
* Similarly, the Debugger's execution breakpoints have no involvement with the x86 breakpoint instruction
* (0xCC); the Debugger monitors changes to the regLIP register to implement its own execution breakpoints.
*
* As a result, the Debugger's complete independence means you can run other 8086/8088 debuggers
* (eg, DEBUG) inside the simulation without interference; you can even "debug" them with the Debugger.
*
* @this {X86CPU}
* @param {number} nMinCycles (0 implies a single-step, and therefore breakpoints should be ignored)
* @return {number} of cycles executed; 0 indicates a pre-execution condition (ie, an execution breakpoint
* was hit), -1 indicates a post-execution condition (eg, a read or write breakpoint was hit), and a positive
* number indicates successful completion of that many cycles (which should always be >= nMinCycles).
*/
X86CPU.prototype.stepCPU = function(nMinCycles)
{
/*
* The Debugger uses fComplete to determine if the instruction completed (true) or was interrupted
* by a breakpoint or some other exceptional condition (false). NOTE: this does NOT include JavaScript
* exceptions, which stepCPU() expects the caller to catch using its own exception handler.
*
* The CPU relies on the use of stopCPU() rather than fComplete, because the CPU never single-steps
* (ie, nMinCycles is always some large number), whereas the Debugger does. And conversely, when the
* Debugger is single-stepping (even when performing multiple single-steps), fRunning is never set,
* so stopCPU() would have no effect as far as the Debugger is concerned.
*/
this.aFlags.fComplete = true;
/*
* fDebugCheck is true if we need to "check" every instruction with the Debugger.
*/
var fDebugCheck = this.aFlags.fDebugCheck = (DEBUGGER && this.dbg && this.dbg.checksEnabled());
/*
* nDebugState is checked only when fDebugCheck is true, and its sole purpose is to tell the first call
* to checkInstruction() that it can skip breakpoint checks, and that will be true ONLY when fStarting is
* true OR nMinCycles is zero (the latter means the Debugger is single-stepping).
*
* Once we snap fStarting, we clear it, because technically, we've moved beyond "starting" and have
* officially "started" now.
*/
var nDebugState = (!nMinCycles)? -1 : (this.aFlags.fStarting? 0 : 1);
this.aFlags.fStarting = false;
/*
* We move the minimum cycle count to nStepCycles (the number of cycles left to step), so that other
* functions have the ability to force that number to zero (eg, stopCPU()), and thus we don't have to check
* any other criteria to determine whether we should continue stepping or not.
*/
this.nBurstCycles = this.nStepCycles = nMinCycles;
/*
* NOTE: Even though runCPU() calls updateAllTimers(), we need an additional call here if we're being
* called from the Debugger, so that any single-stepping will update the timers as well.
*/
if (this.chipset && !nMinCycles) this.chipset.updateAllTimers();
/*
* Let's also suppress h/w interrupts whenever the Debugger is single-stepping an instruction; I'm loathe
* to allow Debugger interactions to affect the behavior of the virtual machine in ANY way, but I'm making
* this small concession to avoid the occasional and sometimes unexpected Debugger command that ends up
* stepping into a hardware interrupt service routine (ISR).
*
* Note that this is similar to the problem discussed in checkINTR() regarding the priority of external h/w
* interrupts vs. Trap interrupts, but they require different solutions, because our Debugger operates
* independently of the CPU.
*
* One exception I make here is when you've asked the Debugger to display PIC messages, the idea being that
* if you're watching the PIC that closely, then you want to hardware interrupts to occur regardless.
*/
if (!nMinCycles && !this.messageEnabled(Messages.PIC)) this.opFlags |= X86.OPFLAG.NOINTR;
do {
var opPrefixes = this.opFlags & X86.OPFLAG_PREFIXES;
if (opPrefixes) {
this.opPrefixes |= opPrefixes;
} else {
/*
* opLIP is used, among other things, to help string instructions rewind to the first prefix
* byte whenever the instruction needs to be repeated. Repeating string instructions in this
* manner (essentially restarting them) is a bit heavy-handed, but ultimately it's more compatible,
* because it allows hardware interrupts (as well as Trap processing and Debugger single-stepping)
* to occur at any point during the string operation, without any additional effort.
*
* NOTE: The way we restart string instructions actually fixes an 8086/8088 flaw, because string
* instructions with multiple prefixes (eg, a REP and a segment override) would not be restarted
* properly following a hardware interrupt. The recommended workarounds were to either turn off
* interrupts or to follow the string instruction with a LOOPNZ back to the first prefix byte.
* To emulate the flawed behavior, turn on BUGS_8086.
*/
this.opLIP = this.regLIP;
this.segData = this.segDS;
this.segStack = this.segSS;
this.regEA = this.regEAWrite = X86.ADDR_INVALID;
if (I386 && (this.opPrefixes & (X86.OPFLAG.ADDRSIZE | X86.OPFLAG.DATASIZE))) {
this.resetSizes();
}
this.opPrefixes = this.opFlags & X86.OPFLAG.REPEAT;
if (this.intFlags) {
if (this.checkINTR()) {
if (!nMinCycles) {
this.assert(DEBUGGER); // nMinCycles of zero should be generated ONLY by the Debugger
if (DEBUGGER) {
this.println("interrupt dispatched");
this.opFlags = 0;
break;
}
}
}
if (this.intFlags & X86.INTFLAG.HALT) {
/*
* As discussed in opHLT(), the CPU is never REALLY halted by a HLT instruction; instead,
* opHLT() sets X86.INTFLAG.HALT, signalling to us that we're free to end the current burst
* AND that we should not execute any more instructions until checkINTR() indicates a hardware
* interrupt has been requested.
*
* One downside to this approach is that it *might* appear to the careful observer that we
* executed a full complement of instructions during bursts where X86.INTFLAG.HALT was set,
* when in fact we did not. However, the steady advance of the overall cycle count, and thus
* the steady series calls to stepCPU(), is needed to ensure that timer updates, video updates,
* etc, all continue to occur at the expected rates.
*
* If necessary, we can add another bookkeeping cycle counter (eg, one that keeps tracks of the
* number of cycles during which we did not actually execute any instructions).
*/
this.nStepCycles = 0;
this.opFlags = 0;
break;
}
}
}
if (DEBUGGER && fDebugCheck) {
if (this.dbg.checkInstruction(this.regLIP, nDebugState)) {
this.stopCPU();
break;
}
nDebugState = 1;
}
if (SAMPLER) {
if (++this.iSampleFreq >= this.nSampleFreq) {
this.iSampleFreq = 0;
if (this.iSampleSkip < this.nSampleSkip) {
this.iSampleSkip++;
} else {
if (this.iSampleNext == this.nSamples) {
this.println("sample buffer full");
this.stopCPU();
break;
}
var t = this.regLIP + this.getCycles();
var n = this.aSamples[this.iSampleNext];
if (n !== -1) {
if (n !== t) {
this.println("sample deviation at index " + this.iSampleNext + ": current LIP=" + str.toHex(this.regLIP));
this.stopCPU();
break;
}
} else {
this.aSamples[this.iSampleNext] = t;
}
this.iSampleNext++;
}
}
}
this.opFlags = 0;
if (DEBUG || PREFETCH) {
this.nBusCycles = 0;
this.nSnapCycles = this.nStepCycles;
}
this.aOps[this.getIPByte()].call(this);
if (PREFETCH) {
var nSpareCycles = (this.nSnapCycles - this.nStepCycles) - this.nBusCycles;
if (nSpareCycles >= 4) {
this.fillPrefetch(nSpareCycles >> 2); // for every 4 spare cycles, fetch 1 instruction byte
}
}
if (DEBUG) {
/*
* Make sure that every instruction is assessing a cycle cost, and that the cost is a net positive.
*/
if (this.aFlags.fComplete && this.nStepCycles >= this.nSnapCycles && !(this.opFlags & X86.OPFLAG_PREFIXES)) {
this.println("cycle miscount: " + (this.nSnapCycles - this.nStepCycles));
this.setIP(this.opLIP - this.segCS.base);
this.stopCPU();
break;
}
}
} while (this.nStepCycles > 0);
return (this.aFlags.fComplete? this.nBurstCycles - this.nStepCycles : (this.aFlags.fComplete === undefined? 0 : -1));
};
/**
* X86CPU.init()
*
* This function operates on every HTML element of class "cpu", extracting the
* JSON-encoded parameters for the X86CPU constructor from the element's "data-value"
* attribute, invoking the constructor (which in turn invokes the CPU constructor)
* to create a X86CPU component, and then binding any associated HTML controls to the
* new component.
*/
X86CPU.init = function()
{
var aeCPUs = Component.getElementsByClass(window.document, PCJSCLASS, "cpu");
for (var iCPU = 0; iCPU < aeCPUs.length; iCPU++) {
var eCPU = aeCPUs[iCPU];
var parmsCPU = Component.getComponentParms(eCPU);
var cpu = new X86CPU(parmsCPU);
Component.bindComponentControls(cpu, eCPU, PCJSCLASS);
}
};
/*
* Initialize every CPU module on the page
*/
web.onInit(X86CPU.init);
if (typeof module !== 'undefined') module.exports = X86CPU;
/**
* @fileoverview Implements PCjs 8086 opcode helpers.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-Sep-05
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
if (typeof module !== 'undefined') {
var str = require("../../shared/lib/strlib");
var Messages = require("./messages");
var X86 = require("./x86");
}
/**
* fnADCb(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnADCb = function ADCb(dst, src)
{
var b = (dst + src + this.getCarry())|0;
this.setArithResult(dst, src, b, X86.RESULT.BYTE | X86.RESULT.ALL);
this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
return b & 0xff;
};
/**
* fnADCw(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnADCw = function ADCw(dst, src)
{
var w = (dst + src + this.getCarry())|0;
this.setArithResult(dst, src, w, this.dataType | X86.RESULT.ALL);
this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
return w & this.dataMask;
};
/**
* fnADDb(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnADDb = function ADDb(dst, src)
{
var b = (dst + src)|0;
this.setArithResult(dst, src, b, X86.RESULT.BYTE | X86.RESULT.ALL);
this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
return b & 0xff;
};
/**
* fnADDw(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnADDw = function ADDw(dst, src)
{
var w = (dst + src)|0;
this.setArithResult(dst, src, w, this.dataType | X86.RESULT.ALL);
this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
return w & this.dataMask;
};
/**
* fnANDb(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnANDb = function ANDb(dst, src)
{
var b = dst & src;
this.setLogicResult(b, X86.RESULT.BYTE);
this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
return b;
};
/**
* fnANDw(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnANDw = function ANDw(dst, src)
{
this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
return this.setLogicResult(dst & src, this.dataType);
};
/**
* fnARPL(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnARPL = function ARPL(dst, src)
{
this.nStepCycles -= (10 + (this.regEA === X86.ADDR_INVALID? 0 : 1));
if ((dst & X86.SEL.RPL) < (src & X86.SEL.RPL)) {
dst = (dst & ~X86.SEL.RPL) | (src & X86.SEL.RPL);
this.setZF();
return dst;
}
this.clearZF();
return dst;
};
/**
* fnBOUND(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnBOUND = function BOUND(dst, src)
{
if (this.regEA === X86.ADDR_INVALID) {
/*
* Generate UD_FAULT (INT 0x06: Invalid Opcode) if src is not a memory operand.
*/
X86.opInvalid.call(this);
return dst;
}
/*
* Note that BOUND performs signed comparisons, so we must transform all arguments into signed values.
*/
var wIndex = dst;
var wLower = this.getWord(this.regEA);
var wUpper = this.getWord(this.regEA + this.dataSize);
if (this.dataSize == 2) {
wIndex = (dst << 16) >> 16;
wLower = (wLower << 16) >> 16;
wUpper = (wUpper << 16) >> 16;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesBound;
if (wIndex < wLower || wIndex > wUpper) {
/*
* The INT 0x05 handler must be called with CS:IP pointing to the BOUND instruction.
*
* TODO: Determine the cycle cost when a BOUND exception is triggered, over and above nCyclesBound.
*/
this.setIP(this.opLIP - this.segCS.base);
X86.fnINT.call(this, X86.EXCEPTION.BOUND_ERR, null, 0);
}
this.opFlags |= X86.OPFLAG.NOWRITE;
return dst;
};
/**
* fnBSF(dst, src)
*
* Scan src starting at bit 0. If a set bit is found, the bit index is stored in dst and ZF is cleared;
* otherwise, ZF is set and dst is unchanged.
*
* NOTES: Early versions of the 80386 manuals misstated how ZF was set/cleared. Also, Intel insists that
* dst is undefined whenever ZF is set, but in fact, the 80386 leaves dst unchanged when that happens;
* unfortunately, some early 80486s would always modify dst, so it is unsafe to rely on dst when ZF is set.
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnBSF = function BSF(dst, src)
{
var n = 0;
if (!src) {
this.setZF();
} else {
this.clearZF();
var bit = 0x1;
while (bit & this.dataMask) {
if (src & bit) {
dst = n;
break;
}
bit <<= 1;
n++; // TODO: Determine if n should be incremented before the bailout for an accurate cycle count
}
}
this.nStepCycles -= this.cycleCounts.nOpCyclesBitScan + n * 3;
return dst;
};
/**
* fnBSR(dst, src)
*
* Scan src starting from the highest bit. If a set bit is found, the bit index is stored in dst and ZF is
* cleared; otherwise, ZF is set and dst is unchanged.
*
* NOTES: Early versions of the 80386 manuals misstated how ZF was set/cleared. Also, Intel insists that
* dst is undefined whenever ZF is set, but in fact, the 80386 leaves dst unchanged when that happens;
* unfortunately, some early 80486s would always modify dst, so it is unsafe to rely on dst when ZF is set.
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnBSR = function BSR(dst, src)
{
var n = 0;
if (!src) {
this.setZF();
} else {
this.clearZF();
var i = (this.dataSize == 2? 15 : 31), bit = 1 << i;
while (bit) {
if (src & bit) {
dst = i;
break;
}
bit >>>= 1;
n++; i--; // TODO: Determine if n should be incremented before the bailout for an accurate cycle count
}
}
this.nStepCycles -= this.cycleCounts.nOpCyclesBitScan + n * 3;
return dst;
};
/**
* fnBT(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnBT = function BT(dst, src)
{
if (dst & (1 << (src & 0x1f))) this.setCF(); else this.clearCF();
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesBitTestR : this.cycleCounts.nOpCyclesBitTestM);
this.opFlags |= X86.OPFLAG.NOWRITE;
return dst;
};
/**
* fnBTC(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnBTC = function BTC(dst, src)
{
var bit = 1 << (src & 0x1f);
if (dst & bit) this.setCF(); else this.clearCF();
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesBitSetR : this.cycleCounts.nOpCyclesBitSetM);
return dst ^ bit;
};
/**
* fnBTR(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnBTR = function BTR(dst, src)
{
var bit = 1 << (src & 0x1f);
if (dst & bit) this.setCF(); else this.clearCF();
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesBitSetR : this.cycleCounts.nOpCyclesBitSetM);
return dst & ~bit;
};
/**
* fnBTS(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnBTS = function BTS(dst, src)
{
var bit = 1 << (src & 0x1f);
if (dst & bit) this.setCF(); else this.clearCF();
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesBitSetR : this.cycleCounts.nOpCyclesBitSetM);
return dst | bit;
};
/**
* fnCALLw(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null)
* @return {number}
*/
X86.fnCALLw = function CALLw(dst, src)
{
if (DEBUG) this.printMessage("calling " + str.toHex(dst, this.dataSize << 1), this.bitsMessage, true);
this.pushWord(this.getIP());
this.setIP(dst);
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesCallWR : this.cycleCounts.nOpCyclesCallWM);
this.opFlags |= X86.OPFLAG.NOWRITE;
return dst;
};
/**
* fnCALLF(off, sel)
*
* For protected-mode, this function must attempt to load the new code segment first, because if the new segment
* requires a change in privilege level, the return address must be pushed on the NEW stack, not the current stack.
*
* @this {X86CPU}
* @param {number} off
* @param {number} sel
*/
X86.fnCALLF = function CALLF(off, sel)
{
if (DEBUG) this.printMessage("calling " + str.toHex(sel, 4) + ':' + str.toHex(off, this.dataSize << 1), this.bitsMessage, true);
var oldCS = this.getCS();
var oldIP = this.getIP();
if (this.setCSIP(off, sel, true) != null) {
this.pushWord(oldCS);
this.pushWord(oldIP);
}
};
/**
* fnCALLFdw(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null)
* @return {number}
*/
X86.fnCALLFdw = function CALLFdw(dst, src)
{
if (this.regEA === X86.ADDR_INVALID) {
return X86.fnGRPUndefined.call(this, dst, src);
}
X86.fnCALLF.call(this, dst, this.getShort(this.regEA + this.dataSize));
this.nStepCycles -= this.cycleCounts.nOpCyclesCallDM;
this.opFlags |= X86.OPFLAG.NOWRITE;
return dst;
};
/**
* fnCMPb(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number} dst unchanged
*/
X86.fnCMPb = function CMPb(dst, src)
{
var b = (dst - src)|0;
this.setArithResult(dst, src, b, X86.RESULT.BYTE | X86.RESULT.ALL, true);
this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesCompareRM) : this.cycleCounts.nOpCyclesArithRM);
this.opFlags |= X86.OPFLAG.NOWRITE;
return dst;
};
/**
* fnCMPw(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number} dst unchanged
*/
X86.fnCMPw = function CMPw(dst, src)
{
var w = (dst - src)|0;
this.setArithResult(dst, src, w, this.dataType | X86.RESULT.ALL, true);
this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesCompareRM) : this.cycleCounts.nOpCyclesArithRM);
this.opFlags |= X86.OPFLAG.NOWRITE;
return dst;
};
/**
* fnDECb(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null)
* @return {number}
*/
X86.fnDECb = function DECb(dst, src)
{
var b = (dst - 1)|0;
this.setArithResult(dst, 1, b, X86.RESULT.BYTE | X86.RESULT.NOTCF, true);
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIncR : this.cycleCounts.nOpCyclesIncM);
return b & 0xff;
};
/**
* fnDECr(w)
*
* @this {X86CPU}
* @param {number} w
* @return {number}
*/
X86.fnDECr = function DECr(w)
{
var result = ((w & this.dataMask) - 1)|0;
this.setArithResult(w, 1, result, X86.RESULT.WORD | X86.RESULT.NOTCF, true);
this.nStepCycles -= 2; // the register form of INC takes 2 cycles on all CPUs
return (w & ~this.dataMask) | (result & this.dataMask);
};
/**
* fnDECw(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null)
* @return {number}
*/
X86.fnDECw = function DECw(dst, src)
{
var w = (dst - 1)|0;
this.setArithResult(dst, 1, w, X86.RESULT.WORD | X86.RESULT.NOTCF, true);
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIncR : this.cycleCounts.nOpCyclesIncM);
return w & 0xffff;
};
/**
* fnSet64(lo, hi)
*
* @param {number} lo
* @param {number} hi
*/
X86.fnSet64 = function Set64(lo, hi)
{
return [lo >>> 0, hi >>> 0];
};
/**
* fnAdd64(dst, src)
*
* Adds src to dst.
*
* @param {Array} dst is a 64-bit value
* @param {Array} src is a 64-bit value
*/
X86.fnAdd64 = function Add64(dst, src)
{
dst[0] += src[0];
dst[1] += src[1];
if (dst[0] > 0xffffffff) {
dst[0] >>>= 0; // truncate dst[0] to 32 bits AND keep it unsigned
dst[1]++;
}
};
/**
* fnCmp64(dst, src)
*
* Compares dst to src, by computing dst - src.
*
* @param {Array} dst is a 64-bit value
* @param {Array} src is a 64-bit value
* @return {number} > 0 if dst > src, == 0 if dst == src, < 0 if dst < src
*/
X86.fnCmp64 = function Cmp64(dst, src)
{
var result = dst[1] - src[1];
if (!result) result = dst[0] - src[0];
return result;
};
/**
* fnSub64(dst, src)
*
* Subtracts src from dst.
*
* @param {Array} dst is a 64-bit value
* @param {Array} src is a 64-bit value
*/
X86.fnSub64 = function Sub64(dst, src)
{
dst[0] -= src[0];
dst[1] -= src[1];
if (dst[0] < 0) {
dst[0] >>>= 0; // truncate dst[0] to 32 bits AND keep it unsigned
dst[1]--;
}
};
/**
* fnShr64(dst)
*
* Shifts dst right one bit.
*
* @param {Array} dst is a 64-bit value
*/
X86.fnShr64 = function Shr64(dst)
{
dst[0] >>>= 1;
if (dst[1] & 0x1) {
dst[0] = (dst[0] | 0x80000000) >>> 0;
}
dst[1] >>>= 1;
};
/**
* fnDIV32(dstLo, dstHi, src)
*
* This sets regMDLo to dstHi:dstLo / src, and regMDHi to dstHi:dstLo % src; all inputs are treated as unsigned.
*
* If fMDset is not set, however, then there was a divide exception (ie, the divisor was either zero or too small).
*
* Refer to: http://lxr.linux.no/linux+v2.6.22/lib/div64.c
*
* @this {X86CPU}
* @param {number} dstLo (low 32-bit portion of dividend)
* @param {number} dstHi (high 32-bit portion of dividend)
* @param {number} src (32-bit divisor)
*/
X86.fnDIV32 = function DIV32(dstLo, dstHi, src)
{
this.fMDSet = false;
src >>>= 0;
if (!src || src <= (dstHi >>> 0)) return;
var result = 0, bit = 1;
var div = X86.fnSet64(src, 0);
var rem = X86.fnSet64(dstLo, dstHi);
while (X86.fnCmp64(rem, div) > 0) {
X86.fnAdd64(div, div);
bit += bit;
}
do {
if (X86.fnCmp64(rem, div) >= 0) {
X86.fnSub64(rem, div);
result += bit;
}
X86.fnShr64(div);
bit >>>= 1;
} while (bit);
this.assert(result <= 0xffffffff && !rem[1]);
this.regMDLo = result; // result is the quotient, which callers expect in the low MD register
this.regMDHi = rem[0]; // rem[0] is the remainder, which callers expect in the high MD register
this.fMDSet = true;
};
/**
* fnIDIV32(dstLo, dstHi, src)
*
* This sets regMDLo to dstHi:dstLo / src, and regMDHi to dstHi:dstLo % src; all inputs are treated as signed.
*
* If fMDset is not set, however, then there was a divide exception (ie, the divisor was either zero or too small).
*
* Refer to: http://lxr.linux.no/linux+v2.6.22/lib/div64.c
*
* @this {X86CPU}
* @param {number} dstLo (low 32-bit portion of dividend)
* @param {number} dstHi (high 32-bit portion of dividend)
* @param {number} src (32-bit divisor)
*/
X86.fnIDIV32 = function IDIV32(dstLo, dstHi, src)
{
var fNegLo = false, fNegHi = false;
if (src < 0) {
src = -src|0;
fNegLo = !fNegLo;
}
if (dstHi < 0) {
dstLo = -dstLo|0;
dstHi = (~dstHi + (dstLo? 0 : 1))|0;
fNegHi = true;
fNegLo = !fNegLo;
}
X86.fnDIV32.call(this, dstLo, dstHi, src);
if (this.regMDLo > 0x7fffffff) this.fMDSet = false;
if (fNegLo) this.regMDLo = -this.regMDLo;
if (fNegHi) this.regMDHi = -this.regMDHi;
};
/**
* fnDIVb(dst, src)
*
* @this {X86CPU}
* @param {number} dst (the divisor)
* @param {number} src (null; AX is the implied src)
* @return {number} (we return dst unchanged, since it's actually AX that's modified)
*/
X86.fnDIVb = function DIVb(dst, src)
{
/*
* Detect zero divisor
*/
if (!dst) {
X86.fnDIVOverflow.call(this);
return dst;
}
/*
* Detect too-small divisor (quotient overflow)
*/
var result = ((src = this.regEAX & 0xffff) / dst);
if (result > 0xff) {
X86.fnDIVOverflow.call(this);
return dst;
}
this.fMDSet = true;
this.regMDLo = (result & 0xff) | (((src % dst) & 0xff) << 8);
/*
* Multiply/divide instructions specify only a single operand, which the decoders pass to us
* via the dst parameter, so we set src to the other implied operand (either AX or DX:AX).
* However, src is technically an output, and dst is merely an input (which is why we must return
* dst unchanged). So, to make traceLog() more consistent, we reverse the order of dst and src.
*/
if (DEBUG && DEBUGGER) this.traceLog('DIVb', src, dst, null, this.getPS(), this.regMDLo);
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesDivBR : this.cycleCounts.nOpCyclesDivBM);
this.opFlags |= X86.OPFLAG.NOWRITE;
return dst;
};
/**
* fnDIVw(dst, src)
*
* @this {X86CPU}
* @param {number} dst (the divisor)
* @param {number} src (null; DX:AX or EDX:EAX is the implied src)
* @return {number} (we return dst unchanged, since it's actually DX:AX that's modified)
*/
X86.fnDIVw = function DIVw(dst, src)
{
if (this.dataSize == 2) {
/*
* Detect zero divisor
*/
if (!dst) {
X86.fnDIVOverflow.call(this);
return dst;
}
/*
* Detect too-small divisor (quotient overflow)
*
* WARNING: We CANNOT simply do "src = (this.regEDX << 16) | this.regEAX", because if bit 15 of DX
* is set, JavaScript will create a negative 32-bit number. So we instead use non-bit-wise operators
* to force JavaScript to create a floating-point value that won't suffer from 32-bit-math side-effects.
*/
src = (this.regEDX & 0xffff) * 0x10000 + (this.regEAX & 0xffff);
var result = (src / dst)|0;
if (result >= 0x10000) {
X86.fnDIVOverflow.call(this);
return dst;
}
this.fMDSet = true;
this.regMDLo = (result & 0xffff);
this.regMDHi = (src % dst) & 0xffff;
}
else {
X86.fnDIV32.call(this, this.regEAX, this.regEDX, dst);
if (!this.fMDSet) {
X86.fnDIVOverflow.call(this);
return dst;
}
this.regMDLo |= 0;
this.regMDHi |= 0;
}
/*
* Multiply/divide instructions specify only a single operand, which the decoders pass to us
* via the dst parameter, so we set src to the other implied operand (either AX or DX:AX).
* However, src is technically an output, and dst is merely an input (which is why we must return
* dst unchanged). So, to make traceLog() more consistent, we reverse the order of dst and src.
*/
if (DEBUG && DEBUGGER) {
if (this.dataSize == 2) {
this.traceLog('DIVw', src, dst, null, this.getPS(), this.regMDLo | (this.regMDHi << 16));
} else {
this.traceLog('DIVd', src, dst, null, this.getPS(), this.regMDLo, this.regMDHi);
}
}
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesDivWR : this.cycleCounts.nOpCyclesDivWM);
this.opFlags |= X86.OPFLAG.NOWRITE;
return dst;
};
/**
* fnESC(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number} dst unchanged
*/
X86.fnESC = function ESC(dst, src)
{
return dst;
};
/**
* fnIDIVb(dst, src)
*
* @this {X86CPU}
* @param {number} dst (the divisor)
* @param {number} src (null; AX is the implied src)
* @return {number} (we return dst unchanged, since it's actually AX that's modified)
*/
X86.fnIDIVb = function IDIVb(dst, src)
{
/*
* Detect zero divisor
*/
if (!dst) {
X86.fnDIVOverflow.call(this);
return dst;
}
/*
* Detect too-small divisor (quotient overflow)
*/
var div = ((dst << 24) >> 24);
var result = ((src = (this.regEAX << 16) >> 16) / div)|0;
/*
* Note the following difference, from "AP-186: Introduction to the 80186 Microprocessor, March 1983":
*
* "The 8086 will cause a divide error whenever the absolute value of the quotient is greater then 7FFFH
* (for word operations) or if the absolute value of the quotient is greater than 7FH (for byte operations).
* The 80186 has expanded the range of negative numbers allowed as a quotient by 1 to include 8000H and 80H.
* These numbers represent the most negative numbers representable using 2's complement arithmetic (equaling
* -32768 and -128 in decimal, respectively)."
*/
if (result != ((result << 24) >> 24) || this.model == X86.MODEL_8086 && result == -128) {
X86.fnDIVOverflow.call(this);
return dst;
}
this.fMDSet = true;
this.regMDLo = (result & 0xff) | (((src % div) & 0xff) << 8);
/*
* Multiply/divide instructions specify only a single operand, which the decoders pass to us
* via the dst parameter, so we set src to the other implied operand (either AX or DX:AX).
* However, src is technically an output, and dst is merely an input (which is why we must return
* dst unchanged). So, to make traceLog() more consistent, we reverse the order of dst and src.
*/
if (DEBUG && DEBUGGER) this.traceLog('IDIVb', src, dst, null, this.getPS(), this.regMDLo);
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIDivBR : this.cycleCounts.nOpCyclesIDivBM);
this.opFlags |= X86.OPFLAG.NOWRITE;
return dst;
};
/**
* fnIDIVw(dst, src)
*
* @this {X86CPU}
* @param {number} dst (the divisor)
* @param {number} src (null; DX:AX or EDX:EAX is the implied src)
* @return {number} (we return dst unchanged, since it's actually DX:AX that's modified)
*/
X86.fnIDIVw = function IDIVw(dst, src)
{
if (this.dataSize == 2) {
/*
* Detect zero divisor
*/
if (!dst) {
X86.fnDIVOverflow.call(this);
return dst;
}
/*
* Detect too-small divisor (quotient overflow)
*/
var div = ((dst << 16) >> 16);
var result = ((src = (this.regEDX << 16) | (this.regEAX & 0xffff)) / div)|0;
/*
* Note the following difference, from "AP-186: Introduction to the 80186 Microprocessor, March 1983":
*
* "The 8086 will cause a divide error whenever the absolute value of the quotient is greater then 7FFFH
* (for word operations) or if the absolute value of the quotient is greater than 7FH (for byte operations).
* The 80186 has expanded the range of negative numbers allowed as a quotient by 1 to include 8000H and 80H.
* These numbers represent the most negative numbers representable using 2's complement arithmetic (equaling
* -32768 and -128 in decimal, respectively)."
*/
if (result != ((result << 16) >> 16) || this.model == X86.MODEL_8086 && result == -32768) {
X86.fnDIVOverflow.call(this);
return dst;
}
this.fMDSet = true;
this.regMDLo = (result & 0xffff);
this.regMDHi = (src % div) & 0xffff;
}
else {
X86.fnIDIV32.call(this, this.regEAX, this.regEDX, dst);
if (!this.fMDSet) {
X86.fnDIVOverflow.call(this);
return dst;
}
this.regMDLo |= 0;
this.regMDHi |= 0;
}
/*
* Multiply/divide instructions specify only a single operand, which the decoders pass to us
* via the dst parameter, so we set src to the other implied operand (either AX or DX:AX).
* However, src is technically an output, and dst is merely an input (which is why we must return
* dst unchanged). So, to make traceLog() more consistent, we reverse the order of dst and src.
*/
if (DEBUG && DEBUGGER) {
if (this.dataSize == 2) {
this.traceLog('IDIVw', src, dst, null, this.getPS(), this.regMDLo | (this.regMDHi << 16));
} else {
this.traceLog('IDIVd', src, dst, null, this.getPS(), this.regMDLo, this.regMDHi);
}
}
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIDivWR : this.cycleCounts.nOpCyclesIDivWM);
this.opFlags |= X86.OPFLAG.NOWRITE;
return dst;
};
/**
* fnIMUL8(dst, src)
*
* 80286_and_80287_Programmers_Reference_Manual_1987.pdf, p.B-44 (p.254) notes that:
*
* "The low 16 bits of the product of a 16-bit signed multiply are the same as those of an
* unsigned multiply. The three operand IMUL instruction can be used for unsigned operands as well."
*
* However, we still sign-extend the operands before multiplying, making it easier to range-check the result.
*
* (80186/80188 and up)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnIMUL8 = function IMUL8(dst, src)
{
dst = this.getIPByte();
var result = (((src << 16) >> 16) * ((dst << 24) >> 24))|0;
if (result > 32767 || result < -32768) {
this.setCF(); this.setOF();
} else {
this.clearCF(); this.clearOF();
}
result &= 0xffff;
if (DEBUG && DEBUGGER) this.traceLog('IMUL8', dst, src, null, this.getPS(), result);
/*
* NOTE: These are the cycle counts for the 80286; the 80186/80188 have slightly different values (ranges):
* 22-25 and 29-32 instead of 21 and 24, respectively. However, accurate cycle counts for the 80186/80188 is
* not super-critical. TODO: Fix this someday.
*/
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? 21 : 24);
return result;
};
/**
* fnIMULb(dst, src)
*
* This 16-bit multiplication must indicate when the upper 8 bits are simply a sign-extension of the
* lower 8 bits (carry clear) and when the upper 8 bits contain significant bits (carry set). The latter
* will occur whenever a positive result is > 127 (0x007f) and whenever a negative result is < -128
* (0xff80).
*
* Example 1: 16 * 4 = 64 (0x0040): carry is clear
* Example 2: 16 * 8 = 128 (0x0080): carry is set (the sign bit no longer fits in the lower 8 bits)
* Example 3: 16 * -8 (0xf8) = -128 (0xff80): carry is clear (the sign bit *still* fits in the lower 8 bits)
* Example 4: 16 * -16 (0xf0) = -256 (0xff00): carry is set (the sign bit no longer fits in the lower 8 bits)
*
* An earlier version of this function assumed it simply needed to check bit 7 of the result to determine carry,
* which was completely broken.
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null; AL is the implied src)
* @return {number} (we return dst unchanged, since it's actually AX that's modified)
*/
X86.fnIMULb = function IMULb(dst, src)
{
var result = ((((src = this.regEAX) << 24) >> 24) * ((dst << 24) >> 24))|0;
this.fMDSet = true;
this.regMDLo = result & 0xffff;
if (result > 127 || result < -128) {
this.setCF(); this.setOF();
} else {
this.clearCF(); this.clearOF();
}
/*
* Multiply/divide instructions specify only a single operand, which the decoders pass to us
* via the dst parameter, so we set src to the other implied operand (either AX or DX:AX).
* However, src is technically an output, and dst is merely an input (which is why we must return
* dst unchanged). So, to make traceLog() more consistent, we reverse the order of dst and src.
*/
if (DEBUG && DEBUGGER) this.traceLog('IMULb', src, dst, null, this.getPS(), this.regMDLo);
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIMulBR : this.cycleCounts.nOpCyclesIMulBM);
this.opFlags |= X86.OPFLAG.NOWRITE;
return dst;
};
/**
* fnIMULn(dst, src)
*
* 80286_and_80287_Programmers_Reference_Manual_1987.pdf, p.B-44 (p.254) notes that:
*
* "The low 16 bits of the product of a 16-bit signed multiply are the same as those of an
* unsigned multiply. The three operand IMUL instruction can be used for unsigned operands as well."
*
* However, we still sign-extend the operands before multiplying, making it easier to range-check the result.
*
* (80186/80188 and up)
*
* @this {X86CPU}
* @param {number} dst (not used)
* @param {number} src
* @return {number}
*/
X86.fnIMULn = function IMULn(dst, src)
{
var fOverflow, result;
dst = this.getIPWord();
if (this.dataSize == 2) {
result = (((src << 16) >> 16) * ((dst << 16) >> 16))|0;
fOverflow = (result > 32767 || result < -32768);
} else {
result = (src * dst);
fOverflow = (result > 2147483647 || result < -2147483648);
this.assert(fOverflow == (result != (result|0)));
}
if (fOverflow) {
this.setCF(); this.setOF();
} else {
this.clearCF(); this.clearOF();
}
result &= this.dataMask;
if (DEBUG && DEBUGGER) this.traceLog('IMULn', dst, src, null, this.getPS(), result);
/*
* NOTE: These are the cycle counts for the 80286; the 80186/80188 have slightly different values (ranges):
* 22-25 and 29-32 instead of 21 and 24, respectively. However, accurate cycle counts for the 80186/80188 is
* not super-critical. TODO: Fix this someday.
*/
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? 21 : 24);
return result;
};
/**
* fnIMUL32(dst, src)
*
* This sets regMDHi:regMDLo to the 64-bit result of dst * src, both of which are treated as signed.
*
* TODO: Some potential optimizations include:
*
* 1) Early outs if either parameter is zero, since the result will obviously be zero
* 2) Using "normal" JavaScript multiplication if both parameters are >= -32768 && <= 32767
*
* Refer to: http://stackoverflow.com/questions/13597364/32-bit-signed-multiplication-with-a-64-bit-result-in-javascript
*
* @this {X86CPU}
* @param {number} dst (any 32-bit number, treated as signed)
* @param {number} src (any 32-bit number, treated as signed)
*/
X86.fnIMUL32 = function IMUL32(dst, src)
{
var fNeg = false;
if (src < 0) {
src = -src|0;
fNeg = !fNeg;
}
if (dst < 0) {
dst = -dst|0;
fNeg = !fNeg;
}
X86.fnMUL32.call(this, dst, src);
if (fNeg) {
this.regMDLo = (~this.regMDLo + 1)|0;
this.regMDHi = (~this.regMDHi + (this.regMDLo? 0 : 1))|0;
}
};
/**
* fnIMULw(dst, src)
*
* regMDHi:regMDLo = dst * regEAX
*
* This 32-bit multiplication must indicate when the upper 16 bits are simply a sign-extension of the
* lower 16 bits (carry clear) and when the upper 16 bits contain significant bits (carry set). The latter
* will occur whenever a positive result is > 32767 (0x00007fff) and whenever a negative result is < -32768
* (0xffff8000).
*
* Example 1: 256 * 64 = 16384 (0x00004000): carry is clear
* Example 2: 256 * 128 = 32768 (0x00008000): carry is set (the sign bit no longer fits in the lower 16 bits)
* Example 3: 256 * -128 (0xff80) = -32768 (0xffff8000): carry is clear (the sign bit *still* fits in the lower 16 bits)
* Example 4: 256 * -256 (0xff00) = -65536 (0xffff0000): carry is set (the sign bit no longer fits in the lower 16 bits)
*
* An earlier version of this function assumed it simply needed to check bit 15 of the result to determine carry,
* which was completely broken.
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null; AX or EAX is the implied src)
* @return {number} (we return dst unchanged, since it's actually DX:AX that's modified)
*/
X86.fnIMULw = function IMULw(dst, src)
{
var fOverflow;
if (this.dataSize == 2) {
src = this.regEAX & 0xffff;
var result = (((src << 16) >> 16) * ((dst << 16) >> 16))|0;
this.fMDSet = true;
this.regMDLo = result & 0xffff;
this.regMDHi = (result >> 16) & 0xffff;
fOverflow = (result > 32767 || result < -32768);
} else {
X86.fnIMUL32.call(this, dst, this.regEAX);
fOverflow = (this.regMDHi != (this.regMDLo >> 31));
}
if (fOverflow) {
this.setCF(); this.setOF();
} else {
this.clearCF(); this.clearOF();
}
/*
* Multiply/divide instructions specify only a single operand, which the decoders pass to us
* via the dst parameter, so we set src to the other implied operand (either AX or DX:AX).
* However, src is technically an output, and dst is merely an input (which is why we must return
* dst unchanged). So, to make traceLog() more consistent, we reverse the order of dst and src.
*/
if (DEBUG && DEBUGGER) {
if (this.dataSize == 2) {
this.traceLog('IMULw', src, dst, null, this.getPS(), this.regMDLo | (this.regMDHi << 16));
} else {
this.traceLog('IMULd', src, dst, null, this.getPS(), this.regMDLo, this.regMDHi);
}
}
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIMulWR : this.cycleCounts.nOpCyclesIMulWM);
this.opFlags |= X86.OPFLAG.NOWRITE;
return dst;
};
/**
* fnIMULrw(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnIMULrw = function IMULrw(dst, src)
{
var result = (((dst << 16) >> 16) * ((src << 16) >> 16))|0;
if (result > 32767 || result < -32768) {
this.setCF(); this.setOF();
} else {
this.clearCF(); this.clearOF();
}
result &= 0xffff;
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIMulR : this.cycleCounts.nOpCyclesIMulM);
return result;
};
/**
* fnIMULrd(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnIMULrd = function IMULrd(dst, src)
{
var result = dst * src;
if (result > 2147483647 || result < -2147483648) {
this.setCF(); this.setOF();
} else {
this.clearCF(); this.clearOF();
}
result |= 0;
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIMulR : this.cycleCounts.nOpCyclesIMulM);
return result;
};
/**
* fnINCb(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null)
* @return {number}
*/
X86.fnINCb = function INCb(dst, src)
{
var b = (dst + 1)|0;
this.setArithResult(dst, 1, b, X86.RESULT.BYTE | X86.RESULT.NOTCF);
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIncR : this.cycleCounts.nOpCyclesIncM);
return b & 0xff;
};
/**
* fnINCr(w)
*
* @this {X86CPU}
* @param {number} w
* @return {number}
*/
X86.fnINCr = function INCr(w)
{
var result = ((w & this.dataMask) + 1)|0;
this.setArithResult(w, 1, result, X86.RESULT.WORD | X86.RESULT.NOTCF);
this.nStepCycles -= 2; // the register form of INC takes 2 cycles on all CPUs
return (w & ~this.dataMask) | (result & this.dataMask);
};
/**
* fnINCw(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null)
* @return {number}
*/
X86.fnINCw = function INCw(dst, src)
{
var w = (dst + 1)|0;
this.setArithResult(dst, 1, w, X86.RESULT.WORD | X86.RESULT.NOTCF);
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIncR : this.cycleCounts.nOpCyclesIncM);
return w & 0xffff;
};
/**
* fnINT(nIDT, nError, nCycles)
*
* NOTE: We no longer use setCSIP(), because it always loads the new CS using segCS.load(), which
* only knows how to load GDT and LDT descriptors, whereas interrupts must use setCS.loadIDT(), which
* deals exclusively with IDT descriptors.
*
* This means we must take care to replicate critical features of setCSIP(); ie, setting segCS.fCall
* BEFORE calling loadIDT(), and updating regLIP and regLIPLimit, resetting default operand and address sizes,
* and flushing the prefetch queue AFTER calling loadIDT().
*
* @this {X86CPU}
* @param {number} nIDT
* @param {number|null|undefined} nError
* @param {number} nCycles (in addition to the default of nOpCyclesInt)
*/
X86.fnINT = function INT(nIDT, nError, nCycles)
{
/*
* TODO: We assess the cycle cost up front, because otherwise, if loadIDT() fails, no cost may be assessed.
*/
this.nStepCycles -= this.cycleCounts.nOpCyclesInt + nCycles;
this.segCS.fCall = true;
var oldPS = this.getPS();
var oldCS = this.getCS();
var oldIP = this.getIP();
var addr = this.segCS.loadIDT(nIDT);
if (addr !== X86.ADDR_INVALID) {
this.pushWord(oldPS);
this.pushWord(oldCS);
this.pushWord(oldIP);
if (nError != null) this.pushWord(nError);
this.nFault = -1;
this.regLIP = addr;
this.regLIPLimit = (this.segCS.base + this.segCS.limit)|0;
if (I386) this.resetSizes();
if (PREFETCH) this.flushPrefetch(this.regLIP);
}
};
/**
* fnIRET()
*
* @this {X86CPU}
*/
X86.fnIRET = function IRET()
{
/*
* TODO: We assess a fixed cycle cost up front, because at the moment, switchTSS() doesn't assess anything.
*/
this.nStepCycles -= this.cycleCounts.nOpCyclesIRet;
if (this.regCR0 & X86.CR0.MSW.PE) {
if (this.regPS & X86.PS.NT) {
var addrNew = this.segTSS.base;
var sel = this.getShort(addrNew + X86.TSS.PREV_TSS);
this.segCS.switchTSS(sel, false);
return;
}
}
var cpl = this.segCS.cpl;
var newIP = this.popWord();
var newCS = this.popWord();
var newPS = this.popWord();
if (DEBUG) this.printMessage(" returning to " + str.toHex(newCS, 4) + ':' + str.toHex(newIP, this.dataSize << 1), this.bitsMessage, true);
if (this.setCSIP(newIP, newCS, false) != null) {
this.setPS(newPS, cpl);
if (this.cIntReturn) this.checkIntReturn(this.regLIP);
}
};
/**
* fnJMPw(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null)
* @return {number}
*/
X86.fnJMPw = function JMPw(dst, src)
{
this.setIP(dst);
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesJmpWR : this.cycleCounts.nOpCyclesJmpWM);
this.opFlags |= X86.OPFLAG.NOWRITE;
return dst;
};
/**
* fnJMPFdw(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null)
* @return {number}
*/
X86.fnJMPFdw = function JMPFdw(dst, src)
{
if (this.regEA === X86.ADDR_INVALID) {
return X86.fnGRPUndefined.call(this, dst, src);
}
this.setCSIP(dst, this.getShort(this.regEA + this.dataSize));
if (this.cIntReturn) this.checkIntReturn(this.regLIP);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpDM;
this.opFlags |= X86.OPFLAG.NOWRITE;
return dst;
};
/**
* fnLAR(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnLAR = function LAR(dst, src)
{
this.nStepCycles -= (14 + (this.regEA === X86.ADDR_INVALID? 0 : 2));
/*
* Currently, segVER.load() will return an error only if the selector is beyond the bounds of the
* descriptor table or the descriptor is not for a segment.
*
* TODO: This instruction's 80286 documentation does not discuss conforming code segments; determine
* if we need a special check for them.
*/
this.clearZF();
if (this.segVER.load(src, true) !== X86.ADDR_INVALID) {
if (this.segVER.dpl >= this.segCS.cpl && this.segVER.dpl >= (src & X86.SEL.RPL)) {
this.setZF();
dst = this.segVER.acc & ~X86.DESC.ACC.BASE1623;
if (this.dataSize > 2) {
dst |= ((this.segVER.ext & ~X86.DESC.EXT.BASE2431) << 16);
}
}
}
return dst;
};
/**
* fnLCR0(l)
*
* This is called by an 80386 control instruction (ie, MOV CR0,reg).
*
* TODO: Determine which CR0 bits, if any, cannot be modified by MOV CR0,reg.
*
* @this {X86CPU}
* @param {number} l
*/
X86.fnLCR0 = function LCR0(l)
{
this.regCR0 = l;
this.setProtMode();
if (this.regCR0 & X86.CR0.PG) {
this.enablePageBlocks();
} else {
this.disablePageBlocks();
}
};
/**
* fnLCR3(l)
*
* This is called by an 80386 control instruction (ie, MOV CR3,reg) or an 80386 task switch.
*
* @this {X86CPU}
* @param {number} l
*/
X86.fnLCR3 = function LCR3(l)
{
this.regCR3 = l;
/*
* Normal use of regCR3 involves adding a 0-4K (12-bit) offset to obtain a page directory entry,
* so let's ensure that the low 12 bits of regCR3 are always zero.
*/
this.assert(!(this.regCR3 & X86.LADDR.OFFSET));
if (this.regCR0 & X86.CR0.PG) this.enablePageBlocks();
};
/**
* fnLDS(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnLDS = function LDS(dst, src)
{
if (this.regEA === X86.ADDR_INVALID) {
X86.opUndefined.call(this);
return dst;
}
this.setDS(this.getShort(this.regEA + this.dataSize));
this.nStepCycles -= this.cycleCounts.nOpCyclesLS;
return src;
};
/**
* fnLEA(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnLEA = function LEA(dst, src)
{
if (this.regEA === X86.ADDR_INVALID) {
/*
* TODO: After reading http://www.os2museum.com/wp/undocumented-8086-opcodes/, it seems that this
* form of LEA (eg, "LEA AX,DX") simply returns the last calculated EA. Since we always reset regEA
* at the start of a new instruction, we would need to preserve the previous EA if we want to mimic
* that (undocumented) behavior.
*
* And for completeness, we would have to extend EA tracking beyond the usual ModRM instructions
* (eg, XLAT, instructions that modify the stack pointer, and string instructions). Anything else?
*/
X86.opUndefined.call(this);
return dst;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesLEA;
return this.regEA;
};
/**
* fnLES(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnLES = function LES(dst, src)
{
if (this.regEA === X86.ADDR_INVALID) {
X86.opUndefined.call(this);
return dst;
}
this.setES(this.getShort(this.regEA + this.dataSize));
this.nStepCycles -= this.cycleCounts.nOpCyclesLS;
return src;
};
/**
* fnLFS(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnLFS = function LFS(dst, src)
{
if (this.regEA === X86.ADDR_INVALID) {
X86.opUndefined.call(this);
return dst;
}
this.setFS(this.getShort(this.regEA + this.dataSize));
this.nStepCycles -= this.cycleCounts.nOpCyclesLS;
return src;
};
/**
* fnLGDT(dst, src)
*
* op=0x0F,0x01,reg=0x2 (GRP7:LGDT)
*
* The 80286 LGDT instruction assumes a 40-bit operand: a 16-bit limit followed by a 24-bit base address;
* the ModRM decoder has already supplied the first word of the operand (in dst), which corresponds to
* the limit, so we must fetch the remaining bits ourselves.
*
* The 80386 LGDT instruction assumes a 48-bit operand: a 16-bit limit followed by a 32-bit base address,
* but it ignores the last 8 bits of the base address if the OPERAND size is 16 bits; we interpret that to
* mean that the 24-bit base address should be zero-extended to 32 bits.
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null)
* @return {number}
*/
X86.fnLGDT = function LGDT(dst, src)
{
if (this.regEA === X86.ADDR_INVALID) {
X86.opInvalid.call(this);
} else {
/*
* Hopefully it won't hurt to always fetch a 32-bit base address (even on an 80286), which we then
* mask apppropriately.
*/
this.addrGDT = this.getLong(this.regEA + 2) & (this.dataMask | (this.dataMask << 8));
/*
* An idiosyncrasy of our ModRM decoders is that, if the OPERAND size is 32 bits, then it will have
* fetched a 32-bit dst operand; we mask off those extra bits now.
*/
dst &= 0xffff;
this.addrGDTLimit = this.addrGDT + dst;
this.opFlags |= X86.OPFLAG.NOWRITE;
this.nStepCycles -= 11;
}
return dst;
};
/**
* fnLGS(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnLGS = function LGS(dst, src)
{
if (this.regEA === X86.ADDR_INVALID) {
X86.opUndefined.call(this);
return dst;
}
this.setGS(this.getShort(this.regEA + this.dataSize));
this.nStepCycles -= this.cycleCounts.nOpCyclesLS;
return src;
};
/**
* fnLIDT(dst, src)
*
* op=0x0F,0x01,reg=0x3 (GRP7:LIDT)
*
* The 80286 LIDT instruction assumes a 40-bit operand: a 16-bit limit followed by a 24-bit base address;
* the ModRM decoder has already supplied the first word of the operand (in dst), which corresponds to
* the limit, so we must fetch the remaining bits ourselves.
*
* The 80386 LIDT instruction assumes a 48-bit operand: a 16-bit limit followed by a 32-bit base address,
* but it ignores the last 8 bits of the base address if the OPERAND size is 16 bits; we interpret that to
* mean that the 24-bit base address should be zero-extended to 32 bits.
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null)
* @return {number}
*/
X86.fnLIDT = function LIDT(dst, src)
{
if (this.regEA === X86.ADDR_INVALID) {
X86.opInvalid.call(this);
} else {
/*
* Hopefully it won't hurt to always fetch a 32-bit base address (even on an 80286), which we then
* mask apppropriately.
*/
this.addrIDT = this.getLong(this.regEA + 2) & (this.dataMask | (this.dataMask << 8));
/*
* An idiosyncrasy of our ModRM decoders is that, if the OPERAND size is 32 bits, then it will have
* fetched a 32-bit dst operand; we mask off those extra bits now.
*/
dst &= 0xffff;
this.addrIDTLimit = this.addrIDT + dst;
this.opFlags |= X86.OPFLAG.NOWRITE;
this.nStepCycles -= 12;
}
return dst;
};
/**
* fnLLDT(dst, src)
*
* op=0x0F,0x00,reg=0x2 (GRP6:LLDT)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null)
* @return {number}
*/
X86.fnLLDT = function LLDT(dst, src) {
this.opFlags |= X86.OPFLAG.NOWRITE;
this.segLDT.load(dst);
this.nStepCycles -= (17 + (this.regEA === X86.ADDR_INVALID? 0 : 2));
return dst;
};
/**
* fnLMSW(dst, src)
*
* op=0x0F,0x01,reg=0x6 (GRP7:LMSW)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null)
* @return {number}
*/
X86.fnLMSW = function LMSW(dst, src)
{
this.setMSW(dst);
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? 3 : 6);
this.opFlags |= X86.OPFLAG.NOWRITE;
return dst;
};
/**
* fnLSL(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (the selector)
* @return {number}
*/
X86.fnLSL = function LSL(dst, src)
{
/*
* TODO: Is this an invalid operation if regEAWrite is set? dst is required to be a register.
*/
this.nStepCycles -= (14 + (this.regEA === X86.ADDR_INVALID? 0 : 2));
/*
* Currently, segVER.load() will return an error only if the selector is beyond the bounds of the
* descriptor table or the descriptor is not for a segment.
*
* TODO: LSL is explicitly documented as ALSO requiring a non-null selector, so we check X86.SEL.MASK;
* are there any other instructions that were, um, less explicit but also require a non-null selector?
*/
if ((src & X86.SEL.MASK) && this.segVER.load(src, true) !== X86.ADDR_INVALID) {
var fConforming = ((this.segVER.acc & X86.DESC.ACC.TYPE.CODE_CONFORMING) == X86.DESC.ACC.TYPE.CODE_CONFORMING);
if ((fConforming || this.segVER.dpl >= this.segCS.cpl) && this.segVER.dpl >= (src & X86.SEL.RPL)) {
this.setZF();
return this.segVER.limit;
}
}
this.clearZF();
return dst;
};
/**
* fnLSS(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnLSS = function LSS(dst, src)
{
if (this.regEA === X86.ADDR_INVALID) {
X86.opUndefined.call(this);
return dst;
}
this.setSS(this.getShort(this.regEA + this.dataSize));
this.nStepCycles -= this.cycleCounts.nOpCyclesLS;
return src;
};
/**
* fnLTR(dst, src)
*
* op=0x0F,0x00,reg=0x3 (GRP6:LTR)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null)
* @return {number}
*/
X86.fnLTR = function LTR(dst, src)
{
this.opFlags |= X86.OPFLAG.NOWRITE;
if (this.segTSS.load(dst) !== X86.ADDR_INVALID) {
this.setShort(this.segTSS.addrDesc + X86.DESC.ACC.OFFSET, this.segTSS.acc |= X86.DESC.ACC.TYPE.LDT);
this.segTSS.type = X86.DESC.ACC.TYPE.TSS_BUSY;
}
this.nStepCycles -= (17 + (this.regEA === X86.ADDR_INVALID? 0 : 2));
return dst;
};
/**
* fnMOV(dst, src)
*
* @this {X86CPU}
* @param {number} dst (current value, ignored)
* @param {number} src (new value)
* @return {number} dst (updated value, from src)
*/
X86.fnMOV = function MOV(dst, src)
{
this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesMovRR : this.cycleCounts.nOpCyclesMovRM) : this.cycleCounts.nOpCyclesMovMR);
return src;
};
/**
* fnMOVX(dst, src)
*
* @this {X86CPU}
* @param {number} dst (current value, ignored)
* @param {number} src (new value)
* @return {number} dst (updated value, from src)
*/
X86.fnMOVX = function MOVX(dst, src)
{
return src;
};
/**
* fnMOVn(dst, src)
*
* @this {X86CPU}
* @param {number} dst (current value, ignored)
* @param {number} src (new value)
* @return {number} dst (updated value, from src)
*/
X86.fnMOVn = function MOVn(dst, src)
{
this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesMovRI : this.cycleCounts.nOpCyclesMovMI);
return src;
};
/**
* fnMOVxx(dst, src)
*
* @this {X86CPU}
* @param {number} dst (current value, ignored)
* @param {number} src (new value)
* @return {number} dst (src is overridden, replaced with regXX, as specified by opMOVwsr() or opMOVrc())
*/
X86.fnMOVxx = function MOVxx(dst, src)
{
if (this.regEAWrite !== X86.ADDR_INVALID) {
/*
* When a 32-bit OPERAND size is in effect, opMOVwsr() will write 32 bits (zero-extended) if the destination
* is a register, but only 16 bits if the destination is memory. The only other caller, opMOVrc(), is not
* affected, because it writes only to register destinations.
*/
this.setDataSize(2);
}
return X86.fnMOV.call(this, dst, this.regXX);
};
/**
* fnMULb(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null)
* @return {number} (we return dst unchanged, since it's actually AX that's modified)
*/
X86.fnMULb = function MULb(dst, src)
{
this.fMDSet = true;
this.regMDLo = ((src = this.regEAX & 0xff) * dst) & 0xffff;
if (this.regMDLo & 0xff00) {
this.setCF(); this.setOF();
} else {
this.clearCF(); this.clearOF();
}
/*
* Multiply/divide instructions specify only a single operand, which the decoders pass to us
* via the dst parameter, so we set src to the other implied operand (either AX or DX:AX).
* However, src is technically an output, and dst is merely an input (which is why we must return
* dst unchanged). So, to make traceLog() more consistent, we reverse the order of dst and src.
*/
if (DEBUG && DEBUGGER) this.traceLog('MULb', src, dst, null, this.getPS(), this.regMDLo);
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesMulBR : this.cycleCounts.nOpCyclesMulBM);
this.opFlags |= X86.OPFLAG.NOWRITE;
return dst;
};
/**
* fnMUL32(dst, src)
*
* This sets regMDHi:regMDLo to the 64-bit result of dst * src, both of which are treated as unsigned.
*
* TODO: Some potential optimizations include:
*
* 1) Early outs if either parameter is zero, since the result will obviously be zero
* 2) Using "normal" JavaScript multiplication if both parameters are < 32767
*
* Refer to: http://stackoverflow.com/questions/13597364/32-bit-signed-multiplication-with-a-64-bit-result-in-javascript
*
* @this {X86CPU}
* @param {number} dst (any 32-bit number, treated as unsigned)
* @param {number} src (any 32-bit number, treated as unsigned)
*/
X86.fnMUL32 = function MUL32(dst, src)
{
var srcLo = src & 0xffff;
var srcHi = src >>> 16;
var dstLo = dst & 0xffff;
var dstHi = dst >>> 16;
var mul00 = srcLo * dstLo;
var mul16 = ((mul00 >>> 16) + (srcHi * dstLo));
var mul32 = mul16 >>> 16;
mul16 = ((mul16 & 0xffff) + (srcLo * dstHi));
mul32 += ((mul16 >>> 16) + (srcHi * dstHi));
this.fMDSet = true;
this.regMDLo = (mul16 << 16) | (mul00 & 0xffff);
this.regMDHi = mul32|0;
};
/**
* fnMULw(dst, src)
*
* regMDHi:regMDLo = dst * regEAX
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null; AX or EAX is the implied src)
* @return {number} (we return dst unchanged, since it's actually DX:AX that's modified)
*/
X86.fnMULw = function MULw(dst, src)
{
if (this.dataSize == 2) {
src = this.regEAX & 0xffff;
var result = (src * dst)|0;
this.fMDSet = true;
this.regMDLo = result & 0xffff;
this.regMDHi = (result >> 16) & 0xffff;
} else {
X86.fnMUL32.call(this, dst, this.regEAX);
}
if (this.regMDHi) {
this.setCF(); this.setOF();
} else {
this.clearCF(); this.clearOF();
}
/*
* Multiply/divide instructions specify only a single operand, which the decoders pass to us
* via the dst parameter, so we set src to the other implied operand (either AX or DX:AX).
* However, src is technically an output, and dst is merely an input (which is why we must return
* dst unchanged). So, to make traceLog() more consistent, we reverse the order of dst and src.
*/
if (DEBUG && DEBUGGER) {
if (this.dataSize == 2) {
this.traceLog('MULw', src, dst, null, this.getPS(), this.regMDLo | (this.regMDHi << 16));
} else {
this.traceLog('MULd', src, dst, null, this.getPS(), this.regMDLo, this.regMDHi);
}
}
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesMulWR : this.cycleCounts.nOpCyclesMulWM);
this.opFlags |= X86.OPFLAG.NOWRITE;
return dst;
};
/**
* fnNEGb(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null)
* @return {number}
*/
X86.fnNEGb = function NEGb(dst, src)
{
var b = (-dst)|0;
this.setArithResult(0, dst, b, X86.RESULT.BYTE | X86.RESULT.ALL, true);
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesNegR : this.cycleCounts.nOpCyclesNegM);
return b & 0xff;
};
/**
* fnNEGw(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null)
* @return {number}
*/
X86.fnNEGw = function NEGw(dst, src)
{
var w = (-dst)|0;
this.setArithResult(0, dst, w, X86.RESULT.WORD | X86.RESULT.ALL, true);
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesNegR : this.cycleCounts.nOpCyclesNegM);
return w & 0xffff;
};
/**
* fnNOTb(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null)
* @return {number}
*/
X86.fnNOTb = function NOTb(dst, src)
{
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesNegR : this.cycleCounts.nOpCyclesNegM);
return dst ^ 0xff;
};
/**
* fnNOTw(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null)
* @return {number}
*/
X86.fnNOTw = function NOTw(dst, src)
{
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesNegR : this.cycleCounts.nOpCyclesNegM);
return dst ^ 0xffff;
};
/**
* fnORb(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnORb = function ORb(dst, src)
{
this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
return this.setLogicResult(dst | src, X86.RESULT.BYTE);
};
/**
* fnORw(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnORw = function ORw(dst, src)
{
this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
return this.setLogicResult(dst | src, this.dataType);
};
/**
* fnPOPw(dst, src)
*
* @this {X86CPU}
* @param {number} dst (current value, ignored)
* @param {number} src (new value)
* @return {number} dst (updated value, from src)
*/
X86.fnPOPw = function POPw(dst, src)
{
this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesPopReg : this.cycleCounts.nOpCyclesPopMem);
return src;
};
/**
* fnPUSHw(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null)
* @return {number}
*/
X86.fnPUSHw = function PUSHw(dst, src)
{
var w = dst;
if (this.opFlags & X86.OPFLAG.PUSHSP) {
/*
* This is the one case where must actually modify dst, so that the ModRM function will
* not put a stale value back into the SP register.
*/
dst = (dst - 2) & 0xffff;
/*
* And on the 8086/8088, the value we just calculated also happens to be the value that must
* be pushed.
*/
if (this.model < X86.MODEL_80286) w = dst;
}
this.pushWord(w);
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesPushReg : this.cycleCounts.nOpCyclesPushMem);
/*
* The PUSH is the only write that needs to occur; dst was the source operand and does not need to be rewritten.
*/
this.opFlags |= X86.OPFLAG.NOWRITE;
return dst;
};
/**
* fnRCLb(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (1 or CL)
* @return {number}
*/
X86.fnRCLb = function RCLb(dst, src)
{
var result = dst;
var flagsIn = (DEBUG? this.getPS() : 0);
var count = src & this.nShiftCountMask;
if (count) {
var carry = this.getCarry();
count %= 9;
if (!count) {
carry <<= 7;
} else {
result = ((dst << count) | (carry << (count - 1)) | (dst >> (9 - count))) & 0xff;
carry = dst << (count - 1);
}
this.setRotateResult(result, carry, X86.RESULT.BYTE);
}
if (DEBUG && DEBUGGER) this.traceLog('RCLb', dst, src, flagsIn, this.getPS(), result);
return result;
};
/**
* fnRCLw(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (1 or CL)
* @return {number}
*/
X86.fnRCLw = function RCLw(dst, src)
{
var result = dst;
var flagsIn = (DEBUG? this.getPS() : 0);
var count = src & this.nShiftCountMask;
if (count) {
var carry = this.getCarry();
count %= 17;
if (!count) {
carry <<= 15;
} else {
result = ((dst << count) | (carry << (count - 1)) | (dst >> (17 - count))) & 0xffff;
carry = dst << (count - 1);
}
this.setRotateResult(result, carry, X86.RESULT.WORD);
}
if (DEBUG && DEBUGGER) this.traceLog('RCLw', dst, src, flagsIn, this.getPS(), result);
return result;
};
/**
* fnRCLd(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (1 or CL)
* @return {number}
*/
X86.fnRCLd = function RCLd(dst, src)
{
var result = dst;
var flagsIn = (DEBUG? this.getPS() : 0);
var count = src & this.nShiftCountMask; // this 32-bit-only function could mask with 0x1f directly
if (count) {
var carry = this.getCarry();
/*
* JavaScript Alert: much like a post-8086 Intel CPU, JavaScript shift counts are mod 32,
* so "dst >>> 32" is equivalent to "dst >>> 0", which doesn't shift any bits at all. To
* compensate, we shift one bit less than the maximum, and then shift one bit farther.
*/
result = (dst << count) | (carry << (count - 1)) | ((dst >>> (32 - count)) >>> 1);
carry = dst << (count - 1);
this.setRotateResult(result, carry, X86.RESULT.DWORD);
}
if (DEBUG && DEBUGGER) this.traceLog('RCLd', dst, src, flagsIn, this.getPS(), result);
return result;
};
/**
* fnRCRb(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (1 or CL)
* @return {number}
*/
X86.fnRCRb = function RCRb(dst, src)
{
var result = dst;
var flagsIn = (DEBUG? this.getPS() : 0);
var count = src & this.nShiftCountMask;
if (count) {
var carry = this.getCarry();
count %= 9;
if (!count) {
carry <<= 7;
} else {
result = ((dst >> count) | (carry << (8 - count)) | (dst << (9 - count))) & 0xff;
carry = dst << (8 - count);
}
this.setRotateResult(result, carry, X86.RESULT.BYTE);
}
if (DEBUG && DEBUGGER) this.traceLog('RCRb', dst, src, flagsIn, this.getPS(), result);
return result;
};
/**
* fnRCRw(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (1 or CL)
* @return {number}
*/
X86.fnRCRw = function RCRw(dst, src)
{
var result = dst;
var flagsIn = (DEBUG? this.getPS() : 0);
var count = src & this.nShiftCountMask;
if (count) {
var carry = this.getCarry();
count %= 17;
if (!count) {
carry <<= 15;
} else {
result = ((dst >> count) | (carry << (16 - count)) | (dst << (17 - count))) & 0xffff;
carry = dst << (16 - count);
}
this.setRotateResult(result, carry, X86.RESULT.WORD);
}
if (DEBUG && DEBUGGER) this.traceLog('RCRw', dst, src, flagsIn, this.getPS(), result);
return result;
};
/**
* fnRCRd(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (1 or CL)
* @return {number}
*/
X86.fnRCRd = function RCRd(dst, src)
{
var result = dst;
var flagsIn = (DEBUG? this.getPS() : 0);
var count = src & this.nShiftCountMask; // this 32-bit-only function could mask with 0x1f directly
if (count) {
var carry = this.getCarry();
/*
* JavaScript Alert: much like a post-8086 Intel CPU, JavaScript shift counts are mod 32,
* so "dst << 32" is equivalent to "dst << 0", which doesn't shift any bits at all. To
* compensate, we shift one bit less than the maximum, and then shift one bit farther.
*/
result = (dst >>> count) | (carry << (32 - count)) | ((dst << (32 - count)) << 1);
carry = dst << (32 - count);
this.setRotateResult(result, carry, X86.RESULT.DWORD);
}
if (DEBUG && DEBUGGER) this.traceLog('RCRd', dst, src, flagsIn, this.getPS(), result);
return result;
};
/**
* fnRETF(n)
*
* For protected-mode, this function must be prepared to pop any arguments off the current stack AND
* whatever stack we may have switched to (setCSIP() returns true only when a stack switch has occurred).
*
* @this {X86CPU}
* @param {number} n
*/
X86.fnRETF = function RETF(n)
{
var newIP = this.popWord();
var newCS = this.popWord();
if (DEBUG) this.printMessage(" returning to " + str.toHex(newCS, 4) + ':' + str.toHex(newIP, this.dataSize << 1), this.bitsMessage, true);
n <<= (this.dataSize >> 2);
if (n) this.setSP(this.getSP() + n); // TODO: optimize
if (this.setCSIP(newIP, newCS, false)) {
if (n) this.setSP(this.getSP() + n); // TODO: optimize
/*
* As per Intel documentation: "If any of [the DS or ES] registers refer to segments whose DPL is
* less than the new CPL (excluding conforming code segments), the segment register is loaded with
* the null selector."
*
* TODO: I'm not clear on whether a conforming code segment must also be marked readable, so I'm playing
* it safe and using CODE_CONFORMING instead of CODE_CONFORMING_READABLE. Also, for the record, I've not
* seen this situation occur yet (eg, in OS/2 1.0).
*/
if ((this.segDS.sel & X86.SEL.MASK) && this.segDS.dpl < this.segCS.cpl && (this.segDS.acc & X86.DESC.ACC.TYPE.CODE_CONFORMING) != X86.DESC.ACC.TYPE.CODE_CONFORMING) {
this.assert(false); // I'm not asserting this is bad, I just want to see it in action
this.segDS.load(0);
}
if ((this.segES.sel & X86.SEL.MASK) && this.segES.dpl < this.segCS.cpl && (this.segES.acc & X86.DESC.ACC.TYPE.CODE_CONFORMING) != X86.DESC.ACC.TYPE.CODE_CONFORMING) {
this.assert(false); // I'm not asserting this is bad, I just want to see it in action
this.segES.load(0);
}
}
if (n == 2 && this.cIntReturn) this.checkIntReturn(this.regLIP);
};
/**
* fnROLb(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (1 or CL)
* @return {number}
*/
X86.fnROLb = function ROLb(dst, src)
{
var result = dst;
var flagsIn = (DEBUG? this.getPS() : 0);
var count = src & this.nShiftCountMask;
if (count) {
var carry;
count &= 0x7;
if (!count) {
carry = dst << 7;
} else {
carry = dst << (count - 1);
result = ((dst << count) | (dst >> (8 - count))) & 0xff;
}
this.setRotateResult(result, carry, X86.RESULT.BYTE);
}
if (DEBUG && DEBUGGER) this.traceLog('ROLb', dst, src, flagsIn, this.getPS(), result);
return result;
};
/**
* fnROLw(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (1 or CL)
* @return {number}
*/
X86.fnROLw = function ROLw(dst, src)
{
var result = dst;
var flagsIn = (DEBUG? this.getPS() : 0);
var count = src & this.nShiftCountMask;
if (count) {
var carry;
count &= 0xf;
if (!count) {
carry = dst << 15;
} else {
carry = dst << (count - 1);
result = ((dst << count) | (dst >> (16 - count))) & 0xffff;
}
this.setRotateResult(result, carry, X86.RESULT.WORD);
}
if (DEBUG && DEBUGGER) this.traceLog('ROLw', dst, src, flagsIn, this.getPS(), result);
return result;
};
/**
* fnROLd(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (1 or CL)
* @return {number}
*/
X86.fnROLd = function ROLd(dst, src)
{
var result = dst;
var flagsIn = (DEBUG? this.getPS() : 0);
var count = src & this.nShiftCountMask;
if (count) {
var carry = dst << (count - 1);
result = (dst << count) | (dst >>> (32 - count));
this.setRotateResult(result, carry, X86.RESULT.DWORD);
}
if (DEBUG && DEBUGGER) this.traceLog('ROLd', dst, src, flagsIn, this.getPS(), result);
return result;
};
/**
* fnRORb(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (1 or CL)
* @return {number}
*/
X86.fnRORb = function RORb(dst, src)
{
var result = dst;
var flagsIn = (DEBUG? this.getPS() : 0);
var count = src & this.nShiftCountMask;
if (count) {
var carry;
count &= 0x7;
if (!count) {
carry = dst;
} else {
carry = dst << (8 - count);
result = ((dst >>> count) | carry) & 0xff;
}
this.setRotateResult(result, carry, X86.RESULT.BYTE);
}
if (DEBUG && DEBUGGER) this.traceLog('RORb', dst, src, flagsIn, this.getPS(), result);
return result;
};
/**
* fnRORw(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (1 or CL)
* @return {number}
*/
X86.fnRORw = function RORw(dst, src)
{
var result = dst;
var flagsIn = (DEBUG? this.getPS() : 0);
var count = src & this.nShiftCountMask;
if (count) {
var carry;
count &= 0xf;
if (!count) {
carry = dst;
} else {
carry = dst << (16 - count);
result = ((dst >>> count) | carry) & 0xffff;
}
this.setRotateResult(result, carry, X86.RESULT.WORD);
}
if (DEBUG && DEBUGGER) this.traceLog('RORw', dst, src, flagsIn, this.getPS(), result);
return result;
};
/**
* fnRORd(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (1 or CL)
* @return {number}
*/
X86.fnRORd = function RORd(dst, src)
{
var result = dst;
var flagsIn = (DEBUG? this.getPS() : 0);
var count = src & this.nShiftCountMask;
if (count) {
var carry = dst << (32 - count);
result = (dst >>> count) | carry;
this.setRotateResult(result, carry, X86.RESULT.DWORD);
}
if (DEBUG && DEBUGGER) this.traceLog('RORd', dst, src, flagsIn, this.getPS(), result);
return result;
};
/**
* fnSARb(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (1 or CL, or an immediate byte for 80186/80188 and up)
* @return {number}
*/
X86.fnSARb = function SARb(dst, src)
{
var count = src & this.nShiftCountMask;
if (count) {
if (count > 9) count = 9;
var carry = ((dst << 24) >> 24) >> (count - 1);
dst = (carry >> 1) & 0xff;
this.setLogicResult(dst, X86.RESULT.BYTE, carry & 0x1);
}
return dst;
};
/**
* fnSARw(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (1 or CL, or an immediate byte for 80186/80188 and up)
* @return {number}
*/
X86.fnSARw = function SARw(dst, src)
{
var count = src & this.nShiftCountMask;
if (count) {
if (count > 17) count = 17;
var carry = ((dst << 16) >> 16) >> (count - 1);
dst = (carry >> 1) & 0xffff;
this.setLogicResult(dst, X86.RESULT.WORD, carry & 0x1);
}
return dst;
};
/**
* fnSARd(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (1 or CL, or an immediate byte for 80186/80188 and up)
* @return {number}
*/
X86.fnSARd = function SARd(dst, src)
{
var count = src & this.nShiftCountMask;
if (count) {
var carry = dst >> (count - 1);
dst = (carry >> 1);
this.setLogicResult(dst, X86.RESULT.DWORD, carry & 0x1);
}
return dst;
};
/**
* fnSBBb(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnSBBb = function SBBb(dst, src)
{
var b = (dst - src - this.getCarry())|0;
this.setArithResult(dst, src, b, X86.RESULT.BYTE | X86.RESULT.ALL, true);
this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
return b & 0xff;
};
/**
* fnSBBw(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnSBBw = function SBBw(dst, src)
{
var w = (dst - src - this.getCarry())|0;
this.setArithResult(dst, src, w, this.dataType | X86.RESULT.ALL, true);
this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
return w & this.dataMask;
};
/**
* fnSETcc()
*
* @this {X86CPU}
* @param {function(number,number)} fnSet
*/
X86.fnSETcc = function SETcc(fnSet)
{
this.opFlags |= X86.OPFLAG.NOREAD;
this.aOpModMemByte[this.getIPByte()].call(this, fnSet);
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesSetR : this.cycleCounts.nOpCyclesSetM);
};
/**
* fnSETO(dst, src)
*
* @this {X86CPU}
* @param {number} dst (ignored)
* @param {number} src (ignored)
* @return {number}
*/
X86.fnSETO = function SETO(dst, src)
{
return (this.getOF()? 1 : 0);
};
/**
* fnSETNO(dst, src)
*
* @this {X86CPU}
* @param {number} dst (ignored)
* @param {number} src (ignored)
* @return {number}
*/
X86.fnSETNO = function SETNO(dst, src)
{
return (this.getOF()? 0 : 1);
};
/**
* fnSETC(dst, src)
*
* @this {X86CPU}
* @param {number} dst (ignored)
* @param {number} src (ignored)
* @return {number}
*/
X86.fnSETC = function SETC(dst, src)
{
return (this.getCF()? 1 : 0);
};
/**
* fnSETNC(dst, src)
*
* @this {X86CPU}
* @param {number} dst (ignored)
* @param {number} src (ignored)
* @return {number}
*/
X86.fnSETNC = function SETNC(dst, src)
{
return (this.getCF()? 0 : 1);
};
/**
* fnSETZ(dst, src)
*
* @this {X86CPU}
* @param {number} dst (ignored)
* @param {number} src (ignored)
* @return {number}
*/
X86.fnSETZ = function SETZ(dst, src)
{
return (this.getZF()? 1 : 0);
};
/**
* fnSETNZ(dst, src)
*
* @this {X86CPU}
* @param {number} dst (ignored)
* @param {number} src (ignored)
* @return {number}
*/
X86.fnSETNZ = function SETNZ(dst, src)
{
return (this.getZF()? 0 : 1);
};
/**
* fnSETBE(dst, src)
*
* @this {X86CPU}
* @param {number} dst (ignored)
* @param {number} src (ignored)
* @return {number}
*/
X86.fnSETBE = function SETBE(dst, src)
{
return (this.getCF() || this.getZF()? 1 : 0);
};
/**
* fnSETNBE(dst, src)
*
* @this {X86CPU}
* @param {number} dst (ignored)
* @param {number} src (ignored)
* @return {number}
*/
X86.fnSETNBE = function SETNBE(dst, src)
{
return (this.getCF() || this.getZF()? 0 : 1);
};
/**
* fnSETS(dst, src)
*
* @this {X86CPU}
* @param {number} dst (ignored)
* @param {number} src (ignored)
* @return {number}
*/
X86.fnSETS = function SETS(dst, src)
{
return (this.getSF()? 1 : 0);
};
/**
* fnSETNS(dst, src)
*
* @this {X86CPU}
* @param {number} dst (ignored)
* @param {number} src (ignored)
* @return {number}
*/
X86.fnSETNS = function SETNS(dst, src)
{
return (this.getSF()? 0 : 1);
};
/**
* fnSETP(dst, src)
*
* @this {X86CPU}
* @param {number} dst (ignored)
* @param {number} src (ignored)
* @return {number}
*/
X86.fnSETP = function SETP(dst, src)
{
return (this.getPF()? 1 : 0);
};
/**
* fnSETNP(dst, src)
*
* @this {X86CPU}
* @param {number} dst (ignored)
* @param {number} src (ignored)
* @return {number}
*/
X86.fnSETNP = function SETNP(dst, src)
{
return (this.getPF()? 0 : 1);
};
/**
* fnSETL(dst, src)
*
* @this {X86CPU}
* @param {number} dst (ignored)
* @param {number} src (ignored)
* @return {number}
*/
X86.fnSETL = function SETL(dst, src)
{
return (!this.getSF() != !this.getOF()? 1 : 0);
};
/**
* fnSETNL(dst, src)
*
* @this {X86CPU}
* @param {number} dst (ignored)
* @param {number} src (ignored)
* @return {number}
*/
X86.fnSETNL = function SETNL(dst, src)
{
return (!this.getSF() != !this.getOF()? 0 : 1);
};
/**
* fnSETLE(dst, src)
*
* @this {X86CPU}
* @param {number} dst (ignored)
* @param {number} src (ignored)
* @return {number}
*/
X86.fnSETLE = function SETLE(dst, src)
{
return (this.getZF() || !this.getSF() != !this.getOF()? 1 : 0);
};
/**
* fnSETNLE(dst, src)
*
* @this {X86CPU}
* @param {number} dst (ignored)
* @param {number} src (ignored)
* @return {number}
*/
X86.fnSETNLE = function SETNLE(dst, src)
{
return (this.getZF() || !this.getSF() != !this.getOF()? 0 : 1);
};
/**
* fnSGDT(dst, src)
*
* op=0x0F,0x01,reg=0x0 (GRP7:SGDT)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null)
* @return {number}
*/
X86.fnSGDT = function SGDT(dst, src)
{
if (this.regEA === X86.ADDR_INVALID) {
X86.opInvalid.call(this);
} else {
/*
* We don't need to setShort() the first word of the operand, because the ModRM group decoder that
* calls us does that automatically with the value we return (dst).
*/
dst = this.addrGDTLimit - this.addrGDT;
this.assert(!(dst & ~0xffff));
/*
* We previously left the 6th byte of the target operand "undefined". But it turns out we have to set
* it to *something*, because there's processor detection in PC-DOS 7.0 (at least in the SETUP portion)
* that looks like this:
*
* 145E:4B84 9C PUSHF
* 145E:4B85 55 PUSH BP
* 145E:4B86 8BEC MOV BP,SP
* 145E:4B88 B80000 MOV AX,0000
* 145E:4B8B 50 PUSH AX
* 145E:4B8C 9D POPF
* 145E:4B8D 9C PUSHF
* 145E:4B8E 58 POP AX
* 145E:4B8F 2500F0 AND AX,F000
* 145E:4B92 3D00F0 CMP AX,F000
* 145E:4B95 7511 JNZ 4BA8
* 145E:4BA8 C8060000 ENTER 0006,00
* 145E:4BAC 0F0146FA SGDT [BP-06]
* 145E:4BB0 807EFFFF CMP [BP-01],FF
* 145E:4BB4 C9 LEAVE
* 145E:4BB5 BA8603 MOV DX,0386
* 145E:4BB8 7503 JNZ 4BBD
* 145E:4BBA BA8602 MOV DX,0286
* 145E:4BBD 89163004 MOV [0430],DX
* 145E:4BC1 5D POP BP
* 145E:4BC2 9D POPF
* 145E:4BC3 CB RETF
*
* This code is expecting SGDT on an 80286 to set the 6th "undefined" byte to 0xFF.
*
* The 80386 adds an additional wrinkle: the 6th byte must be 0x00 if the OPERAND size is 2, whereas
* it must passed through if the OPERAND size is 4.
*
* In addition, when the OPERAND size is 4, the ModRM group decoder will call setLong(dst) rather than
* setShort(dst); we could fix that by forcing the dataSize to 2, but it seems simpler to set the high
* bits (16-31) of dst to match the low bits (0-15) of addr, so that the caller will harmlessly rewrite
* what we already wrote with the setLong() below.
*/
var addr = this.addrGDT;
if (this.model == X86.MODEL_80286) {
addr |= (0xff000000|0);
}
else if (this.model >= X86.MODEL_80386) {
if (this.dataSize == 2) {
addr &= 0x00ffffff;
} else {
dst |= (addr << 16);
}
}
this.setLong(this.regEA + 2, addr);
this.nStepCycles -= 11;
}
return dst;
};
/**
* fnSHLb(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (1 or CL, or an immediate byte for 80186/80188 and up)
* @return {number}
*/
X86.fnSHLb = function SHLb(dst, src)
{
var result = dst;
var flagsIn = (DEBUG? this.getPS() : 0);
var count = src & this.nShiftCountMask;
if (count) {
var carry = 0;
if (count > 8) {
result = 0;
} else {
carry = dst << (count - 1);
result = (carry << 1) & 0xff;
}
this.setLogicResult(result, X86.RESULT.BYTE, carry & X86.RESULT.BYTE, (result ^ carry) & X86.RESULT.BYTE);
}
if (DEBUG && DEBUGGER) this.traceLog('SHLb', dst, src, flagsIn, this.getPS(), result);
return result;
};
/**
* fnSHLw(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (1 or CL, or an immediate byte for 80186/80188 and up)
* @return {number}
*/
X86.fnSHLw = function SHLw(dst, src)
{
var result = dst;
var flagsIn = (DEBUG? this.getPS() : 0);
var count = src & this.nShiftCountMask;
if (count) {
var carry = 0;
if (count > 16) {
result = 0;
} else {
carry = dst << (count - 1);
result = (carry << 1) & 0xffff;
}
this.setLogicResult(result, X86.RESULT.WORD, carry & X86.RESULT.WORD, (result ^ carry) & X86.RESULT.WORD);
}
if (DEBUG && DEBUGGER) this.traceLog('SHLw', dst, src, flagsIn, this.getPS(), result);
return result;
};
/**
* fnSHLd(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (1 or CL, or an immediate byte for 80186/80188 and up)
* @return {number}
*/
X86.fnSHLd = function SHLd(dst, src)
{
var result = dst;
var flagsIn = (DEBUG? this.getPS() : 0);
var count = src & this.nShiftCountMask; // this 32-bit-only function could mask with 0x1f directly
if (count) {
var carry = dst << (count - 1);
result = (carry << 1);
this.setLogicResult(result, X86.RESULT.DWORD, carry & X86.RESULT.DWORD, (result ^ carry) & X86.RESULT.DWORD);
}
if (DEBUG && DEBUGGER) this.traceLog('SHLd', dst, src, flagsIn, this.getPS(), result);
return result;
};
/**
* fnSHLDw(dst, src, count)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @param {number} count (0-31)
* @return {number}
*/
X86.fnSHLDw = function SHLDw(dst, src, count)
{
if (count) {
if (count > 16) {
dst = src;
count -= 16;
}
var carry = dst << (count - 1);
dst = ((carry << 1) | (src >> (16 - count))) & 0xffff;
this.setLogicResult(dst, X86.RESULT.WORD, carry & X86.RESULT.WORD);
}
return dst;
};
/**
* fnSHLDd(dst, src, count)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @param {number} count
* @return {number}
*/
X86.fnSHLDd = function SHLDd(dst, src, count)
{
if (count) {
var carry = dst << (count - 1);
dst = (carry << 1) | (src >> (32 - count));
this.setLogicResult(dst, X86.RESULT.DWORD, carry & X86.RESULT.DWORD);
}
return dst;
};
/**
* fnSHLDwi(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnSHLDwi = function SHLDwi(dst, src)
{
return X86.fnSHLDw.call(this, dst, src, this.getIPByte());
};
/**
* fnSHLDdi(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnSHLDdi = function SHLDdi(dst, src)
{
return X86.fnSHLDd.call(this, dst, src, this.getIPByte());
};
/**
* fnSHLDwCL(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnSHLDwCL = function SHLDwCL(dst, src)
{
return X86.fnSHLDw.call(this, dst, src, this.regECX & 0x1f);
};
/**
* fnSHLDdCL(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnSHLDdCL = function SHLDdCL(dst, src)
{
return X86.fnSHLDd.call(this, dst, src, this.regECX & 0x1f);
};
/**
* fnSHRb(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (1 or CL, or an immediate byte for 80186/80188 and up)
* @return {number}
*/
X86.fnSHRb = function SHRb(dst, src)
{
var count = src & this.nShiftCountMask;
if (count) {
var carry = (count > 8? 0 : (dst >>> (count - 1)));
dst = (carry >>> 1) & 0xff;
this.setLogicResult(dst, X86.RESULT.BYTE, carry & 0x1, dst & X86.RESULT.BYTE);
}
return dst;
};
/**
* fnSHRw(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (1 or CL, or an immediate byte for 80186/80188 and up)
* @return {number}
*/
X86.fnSHRw = function SHRw(dst, src)
{
var count = src & this.nShiftCountMask;
if (count) {
var carry = (count > 16? 0 : (dst >>> (count - 1)));
dst = (carry >>> 1) & 0xffff;
this.setLogicResult(dst, X86.RESULT.WORD, carry & 0x1, dst & X86.RESULT.WORD);
}
return dst;
};
/**
* fnSHRd(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (1 or CL, or an immediate byte for 80186/80188 and up)
* @return {number}
*/
X86.fnSHRd = function SHRd(dst, src)
{
var count = src & this.nShiftCountMask;
if (count) {
var carry = (dst >>> (count - 1));
dst = (carry >>> 1);
this.setLogicResult(dst, X86.RESULT.DWORD, carry & 0x1, dst & X86.RESULT.DWORD);
}
return dst;
};
/**
* fnSHRDw(dst, src, count)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @param {number} count (0-31)
* @return {number}
*/
X86.fnSHRDw = function SHRDw(dst, src, count)
{
if (count) {
if (count > 16) {
dst = src;
count -= 16;
}
var carry = dst >> (count - 1);
dst = ((carry >> 1) | (src << (16 - count))) & 0xffff;
this.setLogicResult(dst, X86.RESULT.WORD, carry & 0x1);
}
return dst;
};
/**
* fnSHRDd(dst, src, count)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @param {number} count
* @return {number}
*/
X86.fnSHRDd = function SHRDd(dst, src, count)
{
if (count) {
var carry = dst >> (count - 1);
dst = (carry >> 1) | (src << (32 - count));
this.setLogicResult(dst, X86.RESULT.DWORD, carry & 0x1);
}
return dst;
};
/**
* fnSHRDwi(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnSHRDwi = function SHRDwi(dst, src)
{
return X86.fnSHRDw.call(this, dst, src, this.getIPByte());
};
/**
* fnSHRDdi(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnSHRDdi = function SHRDdi(dst, src)
{
return X86.fnSHRDd.call(this, dst, src, this.getIPByte());
};
/**
* fnSHRDwCL(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnSHRDwCL = function SHRDwCL(dst, src)
{
return X86.fnSHRDw.call(this, dst, src, this.regECX & 0x1f);
};
/**
* fnSHRDdCL(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnSHRDdCL = function SHRDdCL(dst, src)
{
return X86.fnSHRDd.call(this, dst, src, this.regECX & 0x1f);
};
/**
* fnSIDT(dst, src)
*
* op=0x0F,0x01,reg=0x1 (GRP7:SIDT)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null)
* @return {number}
*/
X86.fnSIDT = function SIDT(dst, src)
{
if (this.regEA === X86.ADDR_INVALID) {
X86.opInvalid.call(this);
} else {
/*
* We don't need to setShort() the first word of the operand, because the ModRM group decoder that calls
* us does that automatically with the value we return (dst).
*/
dst = this.addrIDTLimit - this.addrIDT;
this.assert(!(dst & ~0xffff));
/*
* As with SGDT, the 6th byte is technically "undefined" on an 80286, but we now set it to 0xFF, for the
* same reasons discussed in SGDT (above).
*/
var addr = this.addrIDT;
if (this.model == X86.MODEL_80286) {
addr |= (0xff000000|0);
}
else if (this.model >= X86.MODEL_80386) {
if (this.dataSize == 2) {
addr &= 0x00ffffff;
} else {
dst |= (addr << 16);
}
}
this.setLong(this.regEA + 2, addr);
this.nStepCycles -= 12;
}
return dst;
};
/**
* fnSLDT(dst, src)
*
* op=0x0F,0x00,reg=0x0 (GRP6:SLDT)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null)
* @return {number}
*/
X86.fnSLDT = function SLDT(dst, src)
{
this.nStepCycles -= (2 + (this.regEA === X86.ADDR_INVALID? 0 : 1));
return this.segLDT.sel;
};
/**
* fnSMSW(dst, src)
*
* op=0x0F,0x01,reg=0x4 (GRP7:SMSW)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null)
* @return {number}
*/
X86.fnSMSW = function SMSW(dst, src)
{
this.nStepCycles -= (2 + (this.regEA === X86.ADDR_INVALID? 0 : 1));
return this.regCR0;
};
/**
* fnSTR(dst, src)
*
* op=0x0F,0x00,reg=0x1 (GRP6:STR)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null)
* @return {number}
*/
X86.fnSTR = function STR(dst, src)
{
this.nStepCycles -= (2 + (this.regEA === X86.ADDR_INVALID? 0 : 1));
return this.segTSS.sel;
};
/**
* fnSUBb(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnSUBb = function SUBb(dst, src)
{
var b = (dst - src)|0;
this.setArithResult(dst, src, b, X86.RESULT.BYTE | X86.RESULT.ALL, true);
this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
return b & 0xff;
};
/**
* fnSUBw(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnSUBw = function SUBw(dst, src)
{
var w = (dst - src)|0;
this.setArithResult(dst, src, w, this.dataType | X86.RESULT.ALL, true);
this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
return w & this.dataMask;
};
/**
* fnTEST8(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null; we have to supply the source ourselves)
* @return {number}
*/
X86.fnTEST8 = function TEST8(dst, src)
{
src = this.getIPByte();
this.setLogicResult(dst & src, X86.RESULT.BYTE);
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesTestRI : this.cycleCounts.nOpCyclesTestMI);
this.opFlags |= X86.OPFLAG.NOWRITE;
return dst;
};
/**
* fnTEST16(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null; we have to supply the source ourselves)
* @return {number}
*/
X86.fnTEST16 = function TEST16(dst, src)
{
src = this.getIPWord();
this.setLogicResult(dst & src, X86.RESULT.WORD);
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesTestRI : this.cycleCounts.nOpCyclesTestMI);
this.opFlags |= X86.OPFLAG.NOWRITE;
return dst;
};
/**
* fnTESTb(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnTESTb = function TESTb(dst, src)
{
this.setLogicResult(dst & src, X86.RESULT.BYTE);
this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesTestRR : this.cycleCounts.nOpCyclesTestRM) : this.cycleCounts.nOpCyclesTestRM);
this.opFlags |= X86.OPFLAG.NOWRITE;
return dst;
};
/**
* fnTESTw(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnTESTw = function TESTw(dst, src)
{
this.setLogicResult(dst & src, X86.RESULT.WORD);
this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesTestRR : this.cycleCounts.nOpCyclesTestRM) : this.cycleCounts.nOpCyclesTestRM);
this.opFlags |= X86.OPFLAG.NOWRITE;
return dst;
};
/**
* fnVERR(dst, src)
*
* op=0x0F,0x00,reg=0x4 (GRP6:VERR)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null)
* @return {number}
*/
X86.fnVERR = function VERR(dst, src)
{
this.opFlags |= X86.OPFLAG.NOWRITE;
/*
* Currently, segVER.load() will return an error only if the selector is beyond the bounds of the
* descriptor table or the descriptor is not for a segment.
*/
this.nStepCycles -= (14 + (this.regEA === X86.ADDR_INVALID? 0 : 2));
if (this.segVER.load(dst, true) !== X86.ADDR_INVALID) {
/*
* Verify that this is a readable segment; that is, of these four combinations (code+readable,
* code+nonreadable, data+writable, date+nonwritable), make sure we're not the second combination.
*/
if ((this.segVER.acc & (X86.DESC.ACC.TYPE.READABLE | X86.DESC.ACC.TYPE.CODE)) != X86.DESC.ACC.TYPE.CODE) {
/*
* For VERR, if the code segment is readable and conforming, the descriptor privilege level
* (DPL) can be any value.
*
* Otherwise, DPL must be greater than or equal to (have less or the same privilege as) both the
* current privilege level and the selector's RPL.
*/
if (this.segVER.dpl >= this.segCS.cpl && this.segVER.dpl >= (dst & X86.SEL.RPL) ||
(this.segVER.acc & X86.DESC.ACC.TYPE.CODE_CONFORMING) == X86.DESC.ACC.TYPE.CODE_CONFORMING) {
this.setZF();
return dst;
}
}
}
this.clearZF();
return dst;
};
/**
* fnVERW(dst, src)
*
* op=0x0F,0x00,reg=0x5 (GRP6:VERW)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src (null)
* @return {number}
*/
X86.fnVERW = function VERW(dst, src)
{
this.opFlags |= X86.OPFLAG.NOWRITE;
/*
* Currently, segVER.load() will return an error only if the selector is beyond the bounds of the
* descriptor table or the descriptor is not for a segment.
*/
this.nStepCycles -= (14 + (this.regEA === X86.ADDR_INVALID? 0 : 2));
if (this.segVER.load(dst, true) !== X86.ADDR_INVALID) {
/*
* Verify that this is a writable data segment
*/
if ((this.segVER.acc & (X86.DESC.ACC.TYPE.WRITABLE | X86.DESC.ACC.TYPE.CODE)) == X86.DESC.ACC.TYPE.WRITABLE) {
/*
* DPL must be greater than or equal to (have less or the same privilege as) both the current
* privilege level and the selector's RPL.
*/
if (this.segVER.dpl >= this.segCS.cpl && this.segVER.dpl >= (dst & X86.SEL.RPL)) {
this.setZF();
return dst;
}
}
}
this.clearZF();
return dst;
};
/**
* fnXCHGrb(dst, src)
*
* If an instruction like "XCHG AL,AH" was a traditional "op dst,src" instruction, dst would contain AL,
* src would contain AH, and we would return src, which the caller would then store in AL, and we'd be done.
*
* However, that's only half of what XCHG does, so THIS function must perform the other half; in the previous
* example, that means storing the original AL (dst) into AH (src).
*
* BACKTRACK support is incomplete without also passing bti values as parameters, because the caller will
* store btiAH in btiAL, but the original btiAL will be lost. Similarly, if src is a memory operand, the
* caller will store btiEALo in btiAL, but again, the original btiAL will be lost.
*
* BACKTRACK support for memory operands could be fixed by decoding the dst register in order to determine the
* corresponding bti and then temporarily storing it in btiEALo around the setEAByte() call below. Register-only
* XCHGs would require a more extensive hack. For now, I'm going to live with one-way BACKTRACK support here.
*
* TODO: Implement full BACKTRACK support for XCHG instructions.
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnXCHGrb = function XCHGRb(dst, src)
{
if (this.regEA === X86.ADDR_INVALID) {
/*
* Decode which register was src
*/
switch (this.bModRM & 0x7) {
case 0x0: // AL
this.regEAX = (this.regEAX & ~0xff) | dst;
break;
case 0x1: // CL
this.regECX = (this.regECX & ~0xff) | dst;
break;
case 0x2: // DL
this.regEDX = (this.regEDX & ~0xff) | dst;
break;
case 0x3: // BL
this.regEBX = (this.regEBX & ~0xff) | dst;
break;
case 0x4: // AH
this.regEAX = (this.regEAX & 0xff) | (dst << 8);
break;
case 0x5: // CH
this.regECX = (this.regECX & 0xff) | (dst << 8);
break;
case 0x6: // DH
this.regEDX = (this.regEDX & 0xff) | (dst << 8);
break;
case 0x7: // BH
this.regEBX = (this.regEBX & 0xff) | (dst << 8);
break;
default:
break; // there IS no other case, but JavaScript inspections don't know that
}
this.nStepCycles -= this.cycleCounts.nOpCyclesXchgRR;
} else {
/*
* This is a case where the ModRM decoder that's calling us didn't know it should have called modEAByte()
* instead of getEAByte(), so we compensate by updating regEAWrite. However, setEAByte() has since been
* changed to revalidate the write using segEA:offEA, so updating regEAWrite here isn't strictly necessary.
*/
this.regEAWrite = this.regEA;
this.setEAByte(dst);
this.nStepCycles -= this.cycleCounts.nOpCyclesXchgRM;
}
return src;
};
/**
* fnXCHGrw(dst, src)
*
* If an instruction like "XCHG AX,DX" was a traditional "op dst,src" instruction, dst would contain AX,
* src would contain DX, and we would return src, which the caller would then store in AX, and we'd be done.
*
* However, that's only half of what XCHG does, so THIS function must perform the other half; in the previous
* example, that means storing the original AX (dst) into DX (src).
*
* TODO: Implement full BACKTRACK support for XCHG instructions (see fnXCHGrb comments).
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnXCHGrw = function XCHGRw(dst, src)
{
if (this.regEA === X86.ADDR_INVALID) {
/*
* Decode which register was src
*/
switch (this.bModRM & 0x7) {
case 0x0: // AX
this.regEAX = dst;
break;
case 0x1: // CX
this.regECX = dst;
break;
case 0x2: // DX
this.regEDX = dst;
break;
case 0x3: // BX
this.regEBX = dst;
break;
case 0x4: // SP
this.setSP(dst);
break;
case 0x5: // BP
this.regEBP = dst;
break;
case 0x6: // SI
this.regESI = dst;
break;
case 0x7: // DI
this.regEDI = dst;
break;
default:
break; // there IS no other case, but JavaScript inspections don't know that
}
this.nStepCycles -= this.cycleCounts.nOpCyclesXchgRR;
} else {
/*
* This is a case where the ModRM decoder that's calling us didn't know it should have called modEAWord()
* instead of getEAWord(), so we compensate by updating regEAWrite. However, setEAWord() has since been
* changed to revalidate the write using segEA:offEA, so updating regEAWrite here isn't strictly necessary.
*/
this.regEAWrite = this.regEA;
this.setEAWord(dst);
this.nStepCycles -= this.cycleCounts.nOpCyclesXchgRM;
}
return src;
};
/**
* fnXORb(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnXORb = function XORb(dst, src)
{
var b = dst ^ src;
this.setLogicResult(b, X86.RESULT.BYTE);
this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
return b;
};
/**
* fnXORw(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnXORw = function XORw(dst, src)
{
this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
return this.setLogicResult(dst ^ src, this.dataType);
};
/**
* fnGRPFault(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnGRPFault = function GRPFault(dst, src)
{
X86.fnFault.call(this, X86.EXCEPTION.GP_FAULT, 0);
return dst;
};
/**
* fnGRPInvalid(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnGRPInvalid = function GRPInvalid(dst, src)
{
X86.opInvalid.call(this);
return dst;
};
/**
* fnGRPUndefined(dst, src)
*
* @this {X86CPU}
* @param {number} dst
* @param {number} src
* @return {number}
*/
X86.fnGRPUndefined = function GRPUndefined(dst, src)
{
X86.opUndefined.call(this);
return dst;
};
/**
* fnDIVOverflow()
*
* @this {X86CPU}
*/
X86.fnDIVOverflow = function DIVOverflow()
{
this.setIP(this.opLIP - this.segCS.base);
/*
* TODO: Determine the proper cycle cost.
*/
X86.fnINT.call(this, X86.EXCEPTION.DIV_ERR, null, 2);
};
/**
* fnSrcCount1()
*
* @this {X86CPU}
* @return {number}
*/
X86.fnSrcCount1 = function SrcCount1()
{
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? 2 : this.cycleCounts.nOpCyclesShift1M);
return 1;
};
/**
* fnSrcCountCL()
*
* @this {X86CPU}
* @return {number}
*/
X86.fnSrcCountCL = function SrcCountCL()
{
var count = this.regECX & 0xff;
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesShiftCR : this.cycleCounts.nOpCyclesShiftCM) + (count << this.cycleCounts.nOpCyclesShiftCS);
return count;
};
/**
* fnSrcCountN()
*
* @this {X86CPU}
* @return {number}
*/
X86.fnSrcCountN = function SrcCountN()
{
var count = this.getIPByte();
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesShiftCR : this.cycleCounts.nOpCyclesShiftCM) + (count << this.cycleCounts.nOpCyclesShiftCS);
return count;
};
/**
* fnSrcNone()
*
* @this {X86CPU}
* @return {number|null}
*/
X86.fnSrcNone = function SrcNone()
{
return null;
};
/**
* fnFault(nFault, nError, fHalt)
*
* Helper to dispatch faults.
*
* @this {X86CPU}
* @param {number} nFault
* @param {number} [nError] (if omitted, no error code will be pushed)
* @param {boolean} [fHalt] will halt the CPU if true *and* a Debugger is loaded
*/
X86.fnFault = function(nFault, nError, fHalt)
{
if (!this.aFlags.fComplete) {
this.printMessage("Fault " + str.toHexByte(nFault) + " blocked by Debugger", Messages.WARN);
this.setIP(this.opLIP - this.segCS.base);
return;
}
var fDispatch = false;
if (this.model >= X86.MODEL_80186) {
if (this.nFault < 0) {
/*
* Single-fault (error code is passed through, and the responsible instruction is restartable)
*/
this.setIP(this.opLIP - this.segCS.base);
fDispatch = true;
} else if (this.nFault != X86.EXCEPTION.DF_FAULT) {
/*
* Double-fault (error code is always zero, and the responsible instruction is not restartable)
*/
nError = 0;
nFault = X86.EXCEPTION.DF_FAULT;
fDispatch = true;
} else {
/*
* Triple-fault (usually referred to in Intel literature as a "shutdown", but at least on the 80286,
* it's actually a "reset")
*/
X86.fnFaultMessage.call(this, -1, 0, fHalt);
this.resetRegs();
return;
}
}
if (X86.fnFaultMessage.call(this, nFault, nError, fHalt)) {
fDispatch = false;
}
if (fDispatch) X86.fnINT.call(this, this.nFault = nFault, nError, 0);
/*
* Since this fault is likely being issued in the context of an instruction that hasn't finished
* executing, and since we currently don't do anything to interrupt that execution (eg, throw a
* JavaScript exception), we should shut off all further reads/writes for the current instruction.
*
* That's easy for any EA-based memory accesses: simply set both the NOREAD and NOWRITE flags.
* However, there are also direct, non-EA-based memory accesses to consider. A perfect example is
* opPUSHA(): if a GP fault occurs on any PUSH other than the last, a subsequent PUSH is likely to
* cause another fault, which we will misinterpret as a double-fault.
*
* TODO: Throw a special JavaScript exception that cpu.js must intercept and quietly ignore.
*/
this.opFlags |= (X86.OPFLAG.NOREAD | X86.OPFLAG.NOWRITE);
};
/**
* fnPageFault(addr, fPresent, fWrite)
*
* Helper to dispatch page faults.
*
* @this {X86CPU}
* @param {number} addr
* @param {boolean} fPresent
* @param {boolean} fWrite
*/
X86.fnPageFault = function(addr, fPresent, fWrite)
{
this.regCR2 = addr;
var nError = 0;
if (fPresent) nError |= X86.PTE.PRESENT;
if (fWrite) nError |= X86.PTE.READWRITE;
if (this.segCS.cpl == 3) nError |= X86.PTE.USER;
X86.fnFault.call(this, X86.EXCEPTION.PG_FAULT, nError);
};
/**
* fnFaultMessage()
*
* Aside from giving the Debugger an opportunity to report every fault, this also gives us the ability to
* halt exception processing in tracks: return true to prevent the fault handler from being dispatched.
*
* At the moment, the only Debugger control you have over fault interception is setting MESSAGE.FAULT, which
* will display faults as they occur, and MESSAGE.HALT, which will halt after any Debugger message, including
* MESSAGE.FAULT. If you want execution to continue after halting, clear MESSAGE.FAULT and/or MESSAGE.HALT,
* or single-step over the offending instruction, which will allow the fault to be dispatched.
*
* @this {X86CPU}
* @param {number} nFault
* @param {number} [nError] (if omitted, no error code will be reported)
* @param {boolean} [fHalt] true if the CPU should always be halted, false if "it depends"
* @return {boolean|undefined} true to block the fault (often desirable when fHalt is true), otherwise dispatch it
*/
X86.fnFaultMessage = function(nFault, nError, fHalt)
{
var bitsMessage = Messages.FAULT;
var bOpcode = this.probeAddr(this.regLIP);
/*
* OS/2 1.0 uses an INT3 (0xCC) opcode in conjunction with an invalid IDT to trigger a triple-fault
* reset and return to real-mode, and these resets happen quite frequently during boot; for example,
* OS/2 startup messages are displayed using a series of INT 0x10 BIOS calls for each character, and
* each series of BIOS calls requires a round-trip mode switch.
*
* Since we really only want to halt on "bad" faults, not "good" (ie, intentional) faults, we take
* advantage of the fact that all 3 faults comprising the triple-fault point to an INT3 (0xCC) opcode,
* and so whenever we see that opcode, we ignore the caller's fHalt flag, and suppress FAULT messages
* unless CPU messages are also enabled.
*
* When a triple fault shows up, nFault is -1; it displays as 0xff only because we use toHexByte().
*/
if (bOpcode == X86.OPCODE.INT3) {
fHalt = false;
bitsMessage |= Messages.CPU;
}
/*
* Similarly, the PC AT ROM BIOS deliberately generates a couple of GP faults as part of the POST
* (Power-On Self Test); we don't want to ignore those, but we don't want to halt on them either. We
* detect those faults by virtue of the LIP being in the range 0x0F0000 to 0x0FFFFF.
*/
if (this.regLIP >= 0x0F0000 && this.regLIP <= 0x0FFFFF) {
fHalt = false;
}
/*
* However, the foregoing notwithstanding, if MESSAGE.HALT is enabled along with all the other required
* MESSAGE bits, then we want to halt regardless.
*/
if (this.messageEnabled(bitsMessage | Messages.HALT)) {
fHalt = true;
}
if (this.messageEnabled(bitsMessage) || fHalt) {
var sMessage = (fHalt? '\n' : '') + "Fault " + str.toHexByte(nFault) + (nError != null? " (" + str.toHexWord(nError) + ")" : "") + " on opcode " + str.toHexByte(bOpcode) + " at " + this.dbg.hexOffset(this.getIP(), this.getCS()) + " (%" + str.toHex(this.regLIP, 6) + ")";
var fRunning = this.aFlags.fRunning;
if (this.printMessage(sMessage, bitsMessage)) {
if (fHalt) {
/*
* By setting fHalt to fRunning (which is true while running but false while single-stepping),
* this allows a fault to be dispatched when you single-step over a faulting instruction; you can
* then continue single-stepping into the fault handler, or start running again.
*
* Note that we had to capture fRunning before calling printMessage(), because if MESSAGE.HALT
* is set, printMessage() will have already halted the CPU.
*/
fHalt = fRunning;
this.dbg.stopCPU();
}
} else {
/*
* If printMessage() returned false, then messageEnabled() must have returned false as well, which
* means that fHalt must be true. Which means we should shut the machine down.
*/
this.assert(fHalt);
this.notice(sMessage);
this.stopCPU();
}
}
return fHalt;
};
/**
* @fileoverview Implements PCjs 8086 mode-byte decoding.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-Sep-05
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
if (typeof module !== 'undefined') {
var X86 = require("./x86");
}
var X86ModB = {};
X86ModB.aOpModReg = [
/**
* opModRegByte00(fn): mod=00 (src:mem) reg=000 (dst:AL) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte00(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regESI));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegByte01(fn): mod=00 (src:mem) reg=000 (dst:AL) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte01(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegByte02(fn): mod=00 (src:mem) reg=000 (dst:AL) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte02(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegByte03(fn): mod=00 (src:mem) reg=000 (dst:AL) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte03(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegByte04(fn): mod=00 (src:mem) reg=000 (dst:AL) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte04(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regESI));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegByte05(fn): mod=00 (src:mem) reg=000 (dst:AL) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte05(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDI));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegByte06(fn): mod=00 (src:mem) reg=000 (dst:AL) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte06(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModRegByte07(fn): mod=00 (src:mem) reg=000 (dst:AL) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte07(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegByte08(fn): mod=00 (src:mem) reg=001 (dst:CL) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte08(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regESI));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegByte09(fn): mod=00 (src:mem) reg=001 (dst:CL) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte09(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegByte0A(fn): mod=00 (src:mem) reg=001 (dst:CL) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte0A(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegByte0B(fn): mod=00 (src:mem) reg=001 (dst:CL) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte0B(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegByte0C(fn): mod=00 (src:mem) reg=001 (dst:CL) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte0C(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regESI));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegByte0D(fn): mod=00 (src:mem) reg=001 (dst:CL) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte0D(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDI));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegByte0E(fn): mod=00 (src:mem) reg=001 (dst:CL) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte0E(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.getIPAddr()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModRegByte0F(fn): mod=00 (src:mem) reg=001 (dst:CL) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte0F(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegByte10(fn): mod=00 (src:mem) reg=010 (dst:DL) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte10(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regESI));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegByte11(fn): mod=00 (src:mem) reg=010 (dst:DL) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte11(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegByte12(fn): mod=00 (src:mem) reg=010 (dst:DL) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte12(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegByte13(fn): mod=00 (src:mem) reg=010 (dst:DL) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte13(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegByte14(fn): mod=00 (src:mem) reg=010 (dst:DL) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte14(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regESI));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegByte15(fn): mod=00 (src:mem) reg=010 (dst:DL) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte15(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDI));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegByte16(fn): mod=00 (src:mem) reg=010 (dst:DL) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte16(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModRegByte17(fn): mod=00 (src:mem) reg=010 (dst:DL) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte17(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegByte18(fn): mod=00 (src:mem) reg=011 (dst:BL) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte18(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regESI));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegByte19(fn): mod=00 (src:mem) reg=011 (dst:BL) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte19(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegByte1A(fn): mod=00 (src:mem) reg=011 (dst:BL) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte1A(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegByte1B(fn): mod=00 (src:mem) reg=011 (dst:BL) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte1B(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegByte1C(fn): mod=00 (src:mem) reg=011 (dst:BL) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte1C(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regESI));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegByte1D(fn): mod=00 (src:mem) reg=011 (dst:BL) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte1D(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDI));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegByte1E(fn): mod=00 (src:mem) reg=011 (dst:BL) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte1E(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModRegByte1F(fn): mod=00 (src:mem) reg=011 (dst:BL) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte1F(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegByte20(fn): mod=00 (src:mem) reg=100 (dst:AH) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte20(fn) {
var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEBX + this.regESI));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegByte21(fn): mod=00 (src:mem) reg=100 (dst:AH) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte21(fn) {
var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEBX + this.regEDI));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegByte22(fn): mod=00 (src:mem) reg=100 (dst:AH) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte22(fn) {
var b = fn.call(this, this.regEAX >> 8, this.getEAByteStack(this.regEBP + this.regESI));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegByte23(fn): mod=00 (src:mem) reg=100 (dst:AH) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte23(fn) {
var b = fn.call(this, this.regEAX >> 8, this.getEAByteStack(this.regEBP + this.regEDI));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegByte24(fn): mod=00 (src:mem) reg=100 (dst:AH) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte24(fn) {
var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regESI));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegByte25(fn): mod=00 (src:mem) reg=100 (dst:AH) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte25(fn) {
var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEDI));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegByte26(fn): mod=00 (src:mem) reg=100 (dst:AH) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte26(fn) {
var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.getIPAddr()));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModRegByte27(fn): mod=00 (src:mem) reg=100 (dst:AH) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte27(fn) {
var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEBX));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegByte28(fn): mod=00 (src:mem) reg=101 (dst:CH) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte28(fn) {
var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEBX + this.regESI));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegByte29(fn): mod=00 (src:mem) reg=101 (dst:CH) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte29(fn) {
var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEBX + this.regEDI));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegByte2A(fn): mod=00 (src:mem) reg=101 (dst:CH) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte2A(fn) {
var b = fn.call(this, this.regECX >> 8, this.getEAByteStack(this.regEBP + this.regESI));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegByte2B(fn): mod=00 (src:mem) reg=101 (dst:CH) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte2B(fn) {
var b = fn.call(this, this.regECX >> 8, this.getEAByteStack(this.regEBP + this.regEDI));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegByte2C(fn): mod=00 (src:mem) reg=101 (dst:CH) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte2C(fn) {
var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regESI));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegByte2D(fn): mod=00 (src:mem) reg=101 (dst:CH) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte2D(fn) {
var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEDI));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegByte2E(fn): mod=00 (src:mem) reg=101 (dst:CH) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte2E(fn) {
var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.getIPAddr()));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModRegByte2F(fn): mod=00 (src:mem) reg=101 (dst:CH) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte2F(fn) {
var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEBX));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegByte30(fn): mod=00 (src:mem) reg=110 (dst:DH) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte30(fn) {
var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEBX + this.regESI));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegByte31(fn): mod=00 (src:mem) reg=110 (dst:DH) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte31(fn) {
var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEBX + this.regEDI));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegByte32(fn): mod=00 (src:mem) reg=110 (dst:DH) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte32(fn) {
var b = fn.call(this, this.regEDX >> 8, this.getEAByteStack(this.regEBP + this.regESI));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegByte33(fn): mod=00 (src:mem) reg=110 (dst:DH) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte33(fn) {
var b = fn.call(this, this.regEDX >> 8, this.getEAByteStack(this.regEBP + this.regEDI));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegByte34(fn): mod=00 (src:mem) reg=110 (dst:DH) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte34(fn) {
var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regESI));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegByte35(fn): mod=00 (src:mem) reg=110 (dst:DH) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte35(fn) {
var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEDI));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegByte36(fn): mod=00 (src:mem) reg=110 (dst:DH) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte36(fn) {
var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.getIPAddr()));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModRegByte37(fn): mod=00 (src:mem) reg=110 (dst:DH) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte37(fn) {
var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEBX));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegByte38(fn): mod=00 (src:mem) reg=111 (dst:BH) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte38(fn) {
var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEBX + this.regESI));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegByte39(fn): mod=00 (src:mem) reg=111 (dst:BH) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte39(fn) {
var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEBX + this.regEDI));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegByte3A(fn): mod=00 (src:mem) reg=111 (dst:BH) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte3A(fn) {
var b = fn.call(this, this.regEBX >> 8, this.getEAByteStack(this.regEBP + this.regESI));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegByte3B(fn): mod=00 (src:mem) reg=111 (dst:BH) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte3B(fn) {
var b = fn.call(this, this.regEBX >> 8, this.getEAByteStack(this.regEBP + this.regEDI));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegByte3C(fn): mod=00 (src:mem) reg=111 (dst:BH) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte3C(fn) {
var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regESI));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegByte3D(fn): mod=00 (src:mem) reg=111 (dst:BH) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte3D(fn) {
var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEDI));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegByte3E(fn): mod=00 (src:mem) reg=111 (dst:BH) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte3E(fn) {
var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.getIPAddr()));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModRegByte3F(fn): mod=00 (src:mem) reg=111 (dst:BH) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte3F(fn) {
var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEBX));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegByte40(fn): mod=01 (src:mem+d8) reg=000 (dst:AL) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte40(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByte41(fn): mod=01 (src:mem+d8) reg=000 (dst:AL) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte41(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByte42(fn): mod=01 (src:mem+d8) reg=000 (dst:AL) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte42(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByte43(fn): mod=01 (src:mem+d8) reg=000 (dst:AL) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte43(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByte44(fn): mod=01 (src:mem+d8) reg=000 (dst:AL) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte44(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte45(fn): mod=01 (src:mem+d8) reg=000 (dst:AL) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte45(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte46(fn): mod=01 (src:mem+d8) reg=000 (dst:AL) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte46(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte47(fn): mod=01 (src:mem+d8) reg=000 (dst:AL) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte47(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte48(fn): mod=01 (src:mem+d8) reg=001 (dst:CL) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte48(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByte49(fn): mod=01 (src:mem+d8) reg=001 (dst:CL) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte49(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByte4A(fn): mod=01 (src:mem+d8) reg=001 (dst:CL) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte4A(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByte4B(fn): mod=01 (src:mem+d8) reg=001 (dst:CL) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte4B(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByte4C(fn): mod=01 (src:mem+d8) reg=001 (dst:CL) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte4C(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte4D(fn): mod=01 (src:mem+d8) reg=001 (dst:CL) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte4D(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte4E(fn): mod=01 (src:mem+d8) reg=001 (dst:CL) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte4E(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte4F(fn): mod=01 (src:mem+d8) reg=001 (dst:CL) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte4F(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte50(fn): mod=01 (src:mem+d8) reg=010 (dst:DL) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte50(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByte51(fn): mod=01 (src:mem+d8) reg=010 (dst:DL) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte51(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByte52(fn): mod=01 (src:mem+d8) reg=010 (dst:DL) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte52(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByte53(fn): mod=01 (src:mem+d8) reg=010 (dst:DL) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte53(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByte54(fn): mod=01 (src:mem+d8) reg=010 (dst:DL) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte54(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte55(fn): mod=01 (src:mem+d8) reg=010 (dst:DL) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte55(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte56(fn): mod=01 (src:mem+d8) reg=010 (dst:DL) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte56(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte57(fn): mod=01 (src:mem+d8) reg=010 (dst:DL) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte57(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte58(fn): mod=01 (src:mem+d8) reg=011 (dst:BL) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte58(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByte59(fn): mod=01 (src:mem+d8) reg=011 (dst:BL) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte59(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByte5A(fn): mod=01 (src:mem+d8) reg=011 (dst:BL) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte5A(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByte5B(fn): mod=01 (src:mem+d8) reg=011 (dst:BL) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte5B(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByte5C(fn): mod=01 (src:mem+d8) reg=011 (dst:BL) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte5C(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte5D(fn): mod=01 (src:mem+d8) reg=011 (dst:BL) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte5D(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte5E(fn): mod=01 (src:mem+d8) reg=011 (dst:BL) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte5E(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte5F(fn): mod=01 (src:mem+d8) reg=011 (dst:BL) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte5F(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte60(fn): mod=01 (src:mem+d8) reg=100 (dst:AH) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte60(fn) {
var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByte61(fn): mod=01 (src:mem+d8) reg=100 (dst:AH) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte61(fn) {
var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByte62(fn): mod=01 (src:mem+d8) reg=100 (dst:AH) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte62(fn) {
var b = fn.call(this, this.regEAX >> 8, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByte63(fn): mod=01 (src:mem+d8) reg=100 (dst:AH) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte63(fn) {
var b = fn.call(this, this.regEAX >> 8, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByte64(fn): mod=01 (src:mem+d8) reg=100 (dst:AH) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte64(fn) {
var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regESI + this.getIPDisp()));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte65(fn): mod=01 (src:mem+d8) reg=100 (dst:AH) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte65(fn) {
var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEDI + this.getIPDisp()));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte66(fn): mod=01 (src:mem+d8) reg=100 (dst:AH) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte66(fn) {
var b = fn.call(this, this.regEAX >> 8, this.getEAByteStack(this.regEBP + this.getIPDisp()));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte67(fn): mod=01 (src:mem+d8) reg=100 (dst:AH) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte67(fn) {
var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEBX + this.getIPDisp()));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte68(fn): mod=01 (src:mem+d8) reg=101 (dst:CH) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte68(fn) {
var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByte69(fn): mod=01 (src:mem+d8) reg=101 (dst:CH) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte69(fn) {
var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByte6A(fn): mod=01 (src:mem+d8) reg=101 (dst:CH) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte6A(fn) {
var b = fn.call(this, this.regECX >> 8, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByte6B(fn): mod=01 (src:mem+d8) reg=101 (dst:CH) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte6B(fn) {
var b = fn.call(this, this.regECX >> 8, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByte6C(fn): mod=01 (src:mem+d8) reg=101 (dst:CH) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte6C(fn) {
var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regESI + this.getIPDisp()));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte6D(fn): mod=01 (src:mem+d8) reg=101 (dst:CH) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte6D(fn) {
var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEDI + this.getIPDisp()));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte6E(fn): mod=01 (src:mem+d8) reg=101 (dst:CH) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte6E(fn) {
var b = fn.call(this, this.regECX >> 8, this.getEAByteStack(this.regEBP + this.getIPDisp()));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte6F(fn): mod=01 (src:mem+d8) reg=101 (dst:CH) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte6F(fn) {
var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEBX + this.getIPDisp()));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte70(fn): mod=01 (src:mem+d8) reg=110 (dst:DH) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte70(fn) {
var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByte71(fn): mod=01 (src:mem+d8) reg=110 (dst:DH) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte71(fn) {
var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByte72(fn): mod=01 (src:mem+d8) reg=110 (dst:DH) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte72(fn) {
var b = fn.call(this, this.regEDX >> 8, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByte73(fn): mod=01 (src:mem+d8) reg=110 (dst:DH) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte73(fn) {
var b = fn.call(this, this.regEDX >> 8, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByte74(fn): mod=01 (src:mem+d8) reg=110 (dst:DH) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte74(fn) {
var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regESI + this.getIPDisp()));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte75(fn): mod=01 (src:mem+d8) reg=110 (dst:DH) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte75(fn) {
var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEDI + this.getIPDisp()));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte76(fn): mod=01 (src:mem+d8) reg=110 (dst:DH) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte76(fn) {
var b = fn.call(this, this.regEDX >> 8, this.getEAByteStack(this.regEBP + this.getIPDisp()));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte77(fn): mod=01 (src:mem+d8) reg=110 (dst:DH) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte77(fn) {
var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEBX + this.getIPDisp()));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte78(fn): mod=01 (src:mem+d8) reg=111 (dst:BH) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte78(fn) {
var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByte79(fn): mod=01 (src:mem+d8) reg=111 (dst:BH) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte79(fn) {
var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByte7A(fn): mod=01 (src:mem+d8) reg=111 (dst:BH) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte7A(fn) {
var b = fn.call(this, this.regEBX >> 8, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByte7B(fn): mod=01 (src:mem+d8) reg=111 (dst:BH) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte7B(fn) {
var b = fn.call(this, this.regEBX >> 8, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByte7C(fn): mod=01 (src:mem+d8) reg=111 (dst:BH) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte7C(fn) {
var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regESI + this.getIPDisp()));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte7D(fn): mod=01 (src:mem+d8) reg=111 (dst:BH) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte7D(fn) {
var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEDI + this.getIPDisp()));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte7E(fn): mod=01 (src:mem+d8) reg=111 (dst:BH) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte7E(fn) {
var b = fn.call(this, this.regEBX >> 8, this.getEAByteStack(this.regEBP + this.getIPDisp()));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte7F(fn): mod=01 (src:mem+d8) reg=111 (dst:BH) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte7F(fn) {
var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEBX + this.getIPDisp()));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte80(fn): mod=10 (src:mem+d16) reg=000 (dst:AL) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte80(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByte81(fn): mod=10 (src:mem+d16) reg=000 (dst:AL) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte81(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByte82(fn): mod=10 (src:mem+d16) reg=000 (dst:AL) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte82(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByte83(fn): mod=10 (src:mem+d16) reg=000 (dst:AL) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte83(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByte84(fn): mod=10 (src:mem+d16) reg=000 (dst:AL) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte84(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte85(fn): mod=10 (src:mem+d16) reg=000 (dst:AL) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte85(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte86(fn): mod=10 (src:mem+d16) reg=000 (dst:AL) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte86(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte87(fn): mod=10 (src:mem+d16) reg=000 (dst:AL) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte87(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte88(fn): mod=10 (src:mem+d16) reg=001 (dst:CL) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte88(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByte89(fn): mod=10 (src:mem+d16) reg=001 (dst:CL) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte89(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByte8A(fn): mod=10 (src:mem+d16) reg=001 (dst:CL) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte8A(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByte8B(fn): mod=10 (src:mem+d16) reg=001 (dst:CL) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte8B(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByte8C(fn): mod=10 (src:mem+d16) reg=001 (dst:CL) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte8C(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte8D(fn): mod=10 (src:mem+d16) reg=001 (dst:CL) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte8D(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte8E(fn): mod=10 (src:mem+d16) reg=001 (dst:CL) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte8E(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte8F(fn): mod=10 (src:mem+d16) reg=001 (dst:CL) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte8F(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte90(fn): mod=10 (src:mem+d16) reg=010 (dst:DL) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte90(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByte91(fn): mod=10 (src:mem+d16) reg=010 (dst:DL) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte91(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByte92(fn): mod=10 (src:mem+d16) reg=010 (dst:DL) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte92(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByte93(fn): mod=10 (src:mem+d16) reg=010 (dst:DL) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte93(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByte94(fn): mod=10 (src:mem+d16) reg=010 (dst:DL) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte94(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte95(fn): mod=10 (src:mem+d16) reg=010 (dst:DL) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte95(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte96(fn): mod=10 (src:mem+d16) reg=010 (dst:DL) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte96(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte97(fn): mod=10 (src:mem+d16) reg=010 (dst:DL) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte97(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte98(fn): mod=10 (src:mem+d16) reg=011 (dst:BL) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte98(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByte99(fn): mod=10 (src:mem+d16) reg=011 (dst:BL) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte99(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByte9A(fn): mod=10 (src:mem+d16) reg=011 (dst:BL) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte9A(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByte9B(fn): mod=10 (src:mem+d16) reg=011 (dst:BL) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte9B(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByte9C(fn): mod=10 (src:mem+d16) reg=011 (dst:BL) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte9C(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte9D(fn): mod=10 (src:mem+d16) reg=011 (dst:BL) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte9D(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte9E(fn): mod=10 (src:mem+d16) reg=011 (dst:BL) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte9E(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByte9F(fn): mod=10 (src:mem+d16) reg=011 (dst:BL) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByte9F(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByteA0(fn): mod=10 (src:mem+d16) reg=100 (dst:AH) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteA0(fn) {
var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByteA1(fn): mod=10 (src:mem+d16) reg=100 (dst:AH) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteA1(fn) {
var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByteA2(fn): mod=10 (src:mem+d16) reg=100 (dst:AH) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteA2(fn) {
var b = fn.call(this, this.regEAX >> 8, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByteA3(fn): mod=10 (src:mem+d16) reg=100 (dst:AH) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteA3(fn) {
var b = fn.call(this, this.regEAX >> 8, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByteA4(fn): mod=10 (src:mem+d16) reg=100 (dst:AH) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteA4(fn) {
var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regESI + this.getIPAddr()));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByteA5(fn): mod=10 (src:mem+d16) reg=100 (dst:AH) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteA5(fn) {
var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEDI + this.getIPAddr()));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByteA6(fn): mod=10 (src:mem+d16) reg=100 (dst:AH) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteA6(fn) {
var b = fn.call(this, this.regEAX >> 8, this.getEAByteStack(this.regEBP + this.getIPAddr()));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByteA7(fn): mod=10 (src:mem+d16) reg=100 (dst:AH) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteA7(fn) {
var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEBX + this.getIPAddr()));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByteA8(fn): mod=10 (src:mem+d16) reg=101 (dst:CH) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteA8(fn) {
var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByteA9(fn): mod=10 (src:mem+d16) reg=101 (dst:CH) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteA9(fn) {
var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByteAA(fn): mod=10 (src:mem+d16) reg=101 (dst:CH) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteAA(fn) {
var b = fn.call(this, this.regECX >> 8, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByteAB(fn): mod=10 (src:mem+d16) reg=101 (dst:CH) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteAB(fn) {
var b = fn.call(this, this.regECX >> 8, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByteAC(fn): mod=10 (src:mem+d16) reg=101 (dst:CH) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteAC(fn) {
var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regESI + this.getIPAddr()));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByteAD(fn): mod=10 (src:mem+d16) reg=101 (dst:CH) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteAD(fn) {
var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEDI + this.getIPAddr()));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByteAE(fn): mod=10 (src:mem+d16) reg=101 (dst:CH) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteAE(fn) {
var b = fn.call(this, this.regECX >> 8, this.getEAByteStack(this.regEBP + this.getIPAddr()));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByteAF(fn): mod=10 (src:mem+d16) reg=101 (dst:CH) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteAF(fn) {
var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEBX + this.getIPAddr()));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByteB0(fn): mod=10 (src:mem+d16) reg=110 (dst:DH) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteB0(fn) {
var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByteB1(fn): mod=10 (src:mem+d16) reg=110 (dst:DH) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteB1(fn) {
var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByteB2(fn): mod=10 (src:mem+d16) reg=110 (dst:DH) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteB2(fn) {
var b = fn.call(this, this.regEDX >> 8, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByteB3(fn): mod=10 (src:mem+d16) reg=110 (dst:DH) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteB3(fn) {
var b = fn.call(this, this.regEDX >> 8, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByteB4(fn): mod=10 (src:mem+d16) reg=110 (dst:DH) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteB4(fn) {
var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regESI + this.getIPAddr()));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByteB5(fn): mod=10 (src:mem+d16) reg=110 (dst:DH) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteB5(fn) {
var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEDI + this.getIPAddr()));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByteB6(fn): mod=10 (src:mem+d16) reg=110 (dst:DH) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteB6(fn) {
var b = fn.call(this, this.regEDX >> 8, this.getEAByteStack(this.regEBP + this.getIPAddr()));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByteB7(fn): mod=10 (src:mem+d16) reg=110 (dst:DH) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteB7(fn) {
var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEBX + this.getIPAddr()));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByteB8(fn): mod=10 (src:mem+d16) reg=111 (dst:BH) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteB8(fn) {
var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByteB9(fn): mod=10 (src:mem+d16) reg=111 (dst:BH) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteB9(fn) {
var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByteBA(fn): mod=10 (src:mem+d16) reg=111 (dst:BH) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteBA(fn) {
var b = fn.call(this, this.regEBX >> 8, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegByteBB(fn): mod=10 (src:mem+d16) reg=111 (dst:BH) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteBB(fn) {
var b = fn.call(this, this.regEBX >> 8, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegByteBC(fn): mod=10 (src:mem+d16) reg=111 (dst:BH) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteBC(fn) {
var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regESI + this.getIPAddr()));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByteBD(fn): mod=10 (src:mem+d16) reg=111 (dst:BH) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteBD(fn) {
var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEDI + this.getIPAddr()));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByteBE(fn): mod=10 (src:mem+d16) reg=111 (dst:BH) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteBE(fn) {
var b = fn.call(this, this.regEBX >> 8, this.getEAByteStack(this.regEBP + this.getIPAddr()));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByteBF(fn): mod=10 (src:mem+d16) reg=111 (dst:BH) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteBF(fn) {
var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEBX + this.getIPAddr()));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegByteC0(fn): mod=11 (src:reg) reg=000 (dst:AL) r/m=000 (AL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteC0(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.regEAX & 0xff);
this.regEAX = (this.regEAX & ~0xff) | b;
},
/**
* opModRegByteC1(fn): mod=11 (src:reg) reg=000 (dst:AL) r/m=001 (CL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteC1(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.regECX & 0xff);
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiCL;
},
/**
* opModRegByteC2(fn): mod=11 (src:reg) reg=000 (dst:AL) r/m=010 (DL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteC2(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.regEDX & 0xff);
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiDL;
},
/**
* opModRegByteC3(fn): mod=11 (src:reg) reg=000 (dst:AL) r/m=011 (BL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteC3(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.regEBX & 0xff);
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiBL;
},
/**
* opModRegByteC4(fn): mod=11 (src:reg) reg=000 (dst:AL) r/m=100 (AH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteC4(fn) {
var b = fn.call(this, this.regEAX & 0xff, (this.regEAX >> 8));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiAH;
},
/**
* opModRegByteC5(fn): mod=11 (src:reg) reg=000 (dst:AL) r/m=101 (CH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteC5(fn) {
var b = fn.call(this, this.regEAX & 0xff, (this.regECX >> 8));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiCH;
},
/**
* opModRegByteC6(fn): mod=11 (src:reg) reg=000 (dst:AL) r/m=110 (DH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteC6(fn) {
var b = fn.call(this, this.regEAX & 0xff, (this.regEDX >> 8));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiDH;
},
/**
* opModRegByteC7(fn): mod=11 (src:reg) reg=000 (dst:AL) r/m=111 (BH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteC7(fn) {
var b = fn.call(this, this.regEAX & 0xff, (this.regEBX >> 8));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiBH;
},
/**
* opModRegByteC8(fn): mod=11 (src:reg) reg=001 (dst:CL) r/m=000 (AL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteC8(fn) {
var b = fn.call(this, this.regECX & 0xff, this.regEAX & 0xff);
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiAL;
},
/**
* opModRegByteC9(fn): mod=11 (src:reg) reg=001 (dst:CL) r/m=001 (CL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteC9(fn) {
var b = fn.call(this, this.regECX & 0xff, this.regECX & 0xff);
this.regECX = (this.regECX & ~0xff) | b;
},
/**
* opModRegByteCA(fn): mod=11 (src:reg) reg=001 (dst:CL) r/m=010 (DL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteCA(fn) {
var b = fn.call(this, this.regECX & 0xff, this.regEDX & 0xff);
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiDL;
},
/**
* opModRegByteCB(fn): mod=11 (src:reg) reg=001 (dst:CL) r/m=011 (BL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteCB(fn) {
var b = fn.call(this, this.regECX & 0xff, this.regEBX & 0xff);
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiBL;
},
/**
* opModRegByteCC(fn): mod=11 (src:reg) reg=001 (dst:CL) r/m=100 (AH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteCC(fn) {
var b = fn.call(this, this.regECX & 0xff, (this.regEAX >> 8));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiAH;
},
/**
* opModRegByteCD(fn): mod=11 (src:reg) reg=001 (dst:CL) r/m=101 (CH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteCD(fn) {
var b = fn.call(this, this.regECX & 0xff, (this.regECX >> 8));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiCH;
},
/**
* opModRegByteCE(fn): mod=11 (src:reg) reg=001 (dst:CL) r/m=110 (DH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteCE(fn) {
var b = fn.call(this, this.regECX & 0xff, (this.regEDX >> 8));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiDH;
},
/**
* opModRegByteCF(fn): mod=11 (src:reg) reg=001 (dst:CL) r/m=111 (BH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteCF(fn) {
var b = fn.call(this, this.regECX & 0xff, (this.regEBX >> 8));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiBH;
},
/**
* opModRegByteD0(fn): mod=11 (src:reg) reg=010 (dst:DL) r/m=000 (AL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteD0(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.regEAX & 0xff);
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiAL;
},
/**
* opModRegByteD1(fn): mod=11 (src:reg) reg=010 (dst:DL) r/m=001 (CL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteD1(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.regECX & 0xff);
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiCL;
},
/**
* opModRegByteD2(fn): mod=11 (src:reg) reg=010 (dst:DL) r/m=010 (DL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteD2(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.regEDX & 0xff);
this.regEDX = (this.regEDX & ~0xff) | b;
},
/**
* opModRegByteD3(fn): mod=11 (src:reg) reg=010 (dst:DL) r/m=011 (BL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteD3(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.regEBX & 0xff);
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiBL;
},
/**
* opModRegByteD4(fn): mod=11 (src:reg) reg=010 (dst:DL) r/m=100 (AH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteD4(fn) {
var b = fn.call(this, this.regEDX & 0xff, (this.regEAX >> 8));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiAH;
},
/**
* opModRegByteD5(fn): mod=11 (src:reg) reg=010 (dst:DL) r/m=101 (CH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteD5(fn) {
var b = fn.call(this, this.regEDX & 0xff, (this.regECX >> 8));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiCH;
},
/**
* opModRegByteD6(fn): mod=11 (src:reg) reg=010 (dst:DL) r/m=110 (DH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteD6(fn) {
var b = fn.call(this, this.regEDX & 0xff, (this.regEDX >> 8));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiDH;
},
/**
* opModRegByteD7(fn): mod=11 (src:reg) reg=010 (dst:DL) r/m=111 (BH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteD7(fn) {
var b = fn.call(this, this.regEDX & 0xff, (this.regEBX >> 8));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiBH;
},
/**
* opModRegByteD8(fn): mod=11 (src:reg) reg=011 (dst:BL) r/m=000 (AL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteD8(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.regEAX & 0xff);
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiAL;
},
/**
* opModRegByteD9(fn): mod=11 (src:reg) reg=011 (dst:BL) r/m=001 (CL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteD9(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.regECX & 0xff);
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiCL;
},
/**
* opModRegByteDA(fn): mod=11 (src:reg) reg=011 (dst:BL) r/m=010 (DL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteDA(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.regEDX & 0xff);
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiDL;
},
/**
* opModRegByteDB(fn): mod=11 (src:reg) reg=011 (dst:BL) r/m=011 (BL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteDB(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.regEBX & 0xff);
this.regEBX = (this.regEBX & ~0xff) | b;
},
/**
* opModRegByteDC(fn): mod=11 (src:reg) reg=011 (dst:BL) r/m=100 (AH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteDC(fn) {
var b = fn.call(this, this.regEBX & 0xff, (this.regEAX >> 8));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiAH;
},
/**
* opModRegByteDD(fn): mod=11 (src:reg) reg=011 (dst:BL) r/m=101 (CH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteDD(fn) {
var b = fn.call(this, this.regEBX & 0xff, (this.regECX >> 8));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiCH;
},
/**
* opModRegByteDE(fn): mod=11 (src:reg) reg=011 (dst:BL) r/m=110 (DH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteDE(fn) {
var b = fn.call(this, this.regEBX & 0xff, (this.regEDX >> 8));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiDH;
},
/**
* opModRegByteDF(fn): mod=11 (src:reg) reg=011 (dst:BL) r/m=111 (BH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteDF(fn) {
var b = fn.call(this, this.regEBX & 0xff, (this.regEBX >> 8));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiBH;
},
/**
* opModRegByteE0(fn): mod=11 (src:reg) reg=100 (dst:AH) r/m=000 (AL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteE0(fn) {
var b = fn.call(this, this.regEAX >> 8, this.regEAX & 0xff);
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiAL;
},
/**
* opModRegByteE1(fn): mod=11 (src:reg) reg=100 (dst:AH) r/m=001 (CL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteE1(fn) {
var b = fn.call(this, this.regEAX >> 8, this.regECX & 0xff);
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiCL;
},
/**
* opModRegByteE2(fn): mod=11 (src:reg) reg=100 (dst:AH) r/m=010 (DL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteE2(fn) {
var b = fn.call(this, this.regEAX >> 8, this.regEDX & 0xff);
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiDL;
},
/**
* opModRegByteE3(fn): mod=11 (src:reg) reg=100 (dst:AH) r/m=011 (BL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteE3(fn) {
var b = fn.call(this, this.regEAX >> 8, this.regEBX & 0xff);
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiBL;
},
/**
* opModRegByteE4(fn): mod=11 (src:reg) reg=100 (dst:AH) r/m=100 (AH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteE4(fn) {
var b = fn.call(this, this.regEAX >> 8, (this.regEAX >> 8));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
},
/**
* opModRegByteE5(fn): mod=11 (src:reg) reg=100 (dst:AH) r/m=101 (CH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteE5(fn) {
var b = fn.call(this, this.regEAX >> 8, (this.regECX >> 8));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiCH;
},
/**
* opModRegByteE6(fn): mod=11 (src:reg) reg=100 (dst:AH) r/m=110 (DH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteE6(fn) {
var b = fn.call(this, this.regEAX >> 8, (this.regEDX >> 8));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiDH;
},
/**
* opModRegByteE7(fn): mod=11 (src:reg) reg=100 (dst:AH) r/m=111 (BH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteE7(fn) {
var b = fn.call(this, this.regEAX >> 8, (this.regEBX >> 8));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiBH;
},
/**
* opModRegByteE8(fn): mod=11 (src:reg) reg=101 (dst:CH) r/m=000 (AL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteE8(fn) {
var b = fn.call(this, this.regECX >> 8, this.regEAX & 0xff);
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiAL;
},
/**
* opModRegByteE9(fn): mod=11 (src:reg) reg=101 (dst:CH) r/m=001 (CL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteE9(fn) {
var b = fn.call(this, this.regECX >> 8, this.regECX & 0xff);
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiCL;
},
/**
* opModRegByteEA(fn): mod=11 (src:reg) reg=101 (dst:CH) r/m=010 (DL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteEA(fn) {
var b = fn.call(this, this.regECX >> 8, this.regEDX & 0xff);
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiDL;
},
/**
* opModRegByteEB(fn): mod=11 (src:reg) reg=101 (dst:CH) r/m=011 (BL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteEB(fn) {
var b = fn.call(this, this.regECX >> 8, this.regEBX & 0xff);
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiBL;
},
/**
* opModRegByteEC(fn): mod=11 (src:reg) reg=101 (dst:CH) r/m=100 (AH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteEC(fn) {
var b = fn.call(this, this.regECX >> 8, (this.regEAX >> 8));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiAH;
},
/**
* opModRegByteED(fn): mod=11 (src:reg) reg=101 (dst:CH) r/m=101 (CH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteED(fn) {
var b = fn.call(this, this.regECX >> 8, (this.regECX >> 8));
this.regECX = (this.regECX & 0xff) | (b << 8);
},
/**
* opModRegByteEE(fn): mod=11 (src:reg) reg=101 (dst:CH) r/m=110 (DH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteEE(fn) {
var b = fn.call(this, this.regECX >> 8, (this.regEDX >> 8));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiDH;
},
/**
* opModRegByteEF(fn): mod=11 (src:reg) reg=101 (dst:CH) r/m=111 (BH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteEF(fn) {
var b = fn.call(this, this.regECX >> 8, (this.regEBX >> 8));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiBH;
},
/**
* opModRegByteF0(fn): mod=11 (src:reg) reg=110 (dst:DH) r/m=000 (AL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteF0(fn) {
var b = fn.call(this, this.regEDX >> 8, this.regEAX & 0xff);
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiAL;
},
/**
* opModRegByteF1(fn): mod=11 (src:reg) reg=110 (dst:DH) r/m=001 (CL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteF1(fn) {
var b = fn.call(this, this.regEDX >> 8, this.regECX & 0xff);
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiCL;
},
/**
* opModRegByteF2(fn): mod=11 (src:reg) reg=110 (dst:DH) r/m=010 (DL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteF2(fn) {
var b = fn.call(this, this.regEDX >> 8, this.regEDX & 0xff);
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiDL;
},
/**
* opModRegByteF3(fn): mod=11 (src:reg) reg=110 (dst:DH) r/m=011 (BL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteF3(fn) {
var b = fn.call(this, this.regEDX >> 8, this.regEBX & 0xff);
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiBL;
},
/**
* opModRegByteF4(fn): mod=11 (src:reg) reg=110 (dst:DH) r/m=100 (AH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteF4(fn) {
var b = fn.call(this, this.regEDX >> 8, (this.regEAX >> 8));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiAH;
},
/**
* opModRegByteF5(fn): mod=11 (src:reg) reg=110 (dst:DH) r/m=101 (CH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteF5(fn) {
var b = fn.call(this, this.regEDX >> 8, (this.regECX >> 8));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiCH;
},
/**
* opModRegByteF6(fn): mod=11 (src:reg) reg=110 (dst:DH) r/m=110 (DH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteF6(fn) {
var b = fn.call(this, this.regEDX >> 8, (this.regEDX >> 8));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
},
/**
* opModRegByteF7(fn): mod=11 (src:reg) reg=110 (dst:DH) r/m=111 (BH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteF7(fn) {
var b = fn.call(this, this.regEDX >> 8, (this.regEBX >> 8));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiBH;
},
/**
* opModRegByteF8(fn): mod=11 (src:reg) reg=111 (dst:BH) r/m=000 (AL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteF8(fn) {
var b = fn.call(this, this.regEBX >> 8, this.regEAX & 0xff);
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiAL;
},
/**
* opModRegByteF9(fn): mod=11 (src:reg) reg=111 (dst:BH) r/m=001 (CL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteF9(fn) {
var b = fn.call(this, this.regEBX >> 8, this.regECX & 0xff);
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiCL;
},
/**
* opModRegByteFA(fn): mod=11 (src:reg) reg=111 (dst:BH) r/m=010 (DL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteFA(fn) {
var b = fn.call(this, this.regEBX >> 8, this.regEDX & 0xff);
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiDL;
},
/**
* opModRegByteFB(fn): mod=11 (src:reg) reg=111 (dst:BH) r/m=011 (BL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteFB(fn) {
var b = fn.call(this, this.regEBX >> 8, this.regEBX & 0xff);
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiBL;
},
/**
* opModRegByteFC(fn): mod=11 (src:reg) reg=111 (dst:BH) r/m=100 (AH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteFC(fn) {
var b = fn.call(this, this.regEBX >> 8, (this.regEAX >> 8));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiAH;
},
/**
* opModRegByteFD(fn): mod=11 (src:reg) reg=111 (dst:BH) r/m=101 (CH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteFD(fn) {
var b = fn.call(this, this.regEBX >> 8, (this.regECX >> 8));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiCH;
},
/**
* opModRegByteFE(fn): mod=11 (src:reg) reg=111 (dst:BH) r/m=110 (DH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteFE(fn) {
var b = fn.call(this, this.regEBX >> 8, (this.regEDX >> 8));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiDH;
},
/**
* opModRegByteFF(fn): mod=11 (src:reg) reg=111 (dst:BH) r/m=111 (BH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegByteFF(fn) {
var b = fn.call(this, this.regEBX >> 8, (this.regEBX >> 8));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
}
];
X86ModB.aOpModMem = [
/**
* opModMemByte00(fn): mod=00 (dst:mem) reg=000 (src:AL) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte00(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemByte01(fn): mod=00 (dst:mem) reg=000 (src:AL) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte01(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemByte02(fn): mod=00 (dst:mem) reg=000 (src:AL) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte02(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemByte03(fn): mod=00 (dst:mem) reg=000 (src:AL) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte03(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemByte04(fn): mod=00 (dst:mem) reg=000 (src:AL) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte04(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemByte05(fn): mod=00 (dst:mem) reg=000 (src:AL) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte05(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemByte06(fn): mod=00 (dst:mem) reg=000 (src:AL) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte06(fn) {
var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModMemByte07(fn): mod=00 (dst:mem) reg=000 (src:AL) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte07(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemByte08(fn): mod=00 (dst:mem) reg=001 (src:CL) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte08(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemByte09(fn): mod=00 (dst:mem) reg=001 (src:CL) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte09(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemByte0A(fn): mod=00 (dst:mem) reg=001 (src:CL) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte0A(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemByte0B(fn): mod=00 (dst:mem) reg=001 (src:CL) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte0B(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemByte0C(fn): mod=00 (dst:mem) reg=001 (src:CL) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte0C(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemByte0D(fn): mod=00 (dst:mem) reg=001 (src:CL) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte0D(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemByte0E(fn): mod=00 (dst:mem) reg=001 (src:CL) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte0E(fn) {
var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModMemByte0F(fn): mod=00 (dst:mem) reg=001 (src:CL) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte0F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemByte10(fn): mod=00 (dst:mem) reg=010 (src:DL) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte10(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemByte11(fn): mod=00 (dst:mem) reg=010 (src:DL) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte11(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemByte12(fn): mod=00 (dst:mem) reg=010 (src:DL) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte12(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemByte13(fn): mod=00 (dst:mem) reg=010 (src:DL) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte13(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemByte14(fn): mod=00 (dst:mem) reg=010 (src:DL) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte14(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemByte15(fn): mod=00 (dst:mem) reg=010 (src:DL) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte15(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemByte16(fn): mod=00 (dst:mem) reg=010 (src:DL) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte16(fn) {
var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModMemByte17(fn): mod=00 (dst:mem) reg=010 (src:DL) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte17(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemByte18(fn): mod=00 (dst:mem) reg=011 (src:BL) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte18(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemByte19(fn): mod=00 (dst:mem) reg=011 (src:BL) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte19(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemByte1A(fn): mod=00 (dst:mem) reg=011 (src:BL) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte1A(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemByte1B(fn): mod=00 (dst:mem) reg=011 (src:BL) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte1B(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemByte1C(fn): mod=00 (dst:mem) reg=011 (src:BL) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte1C(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemByte1D(fn): mod=00 (dst:mem) reg=011 (src:BL) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte1D(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemByte1E(fn): mod=00 (dst:mem) reg=011 (src:BL) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte1E(fn) {
var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModMemByte1F(fn): mod=00 (dst:mem) reg=011 (src:BL) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte1F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemByte20(fn): mod=00 (dst:mem) reg=100 (src:AH) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte20(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regEAX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemByte21(fn): mod=00 (dst:mem) reg=100 (src:AH) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte21(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regEAX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemByte22(fn): mod=00 (dst:mem) reg=100 (src:AH) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte22(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regEAX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemByte23(fn): mod=00 (dst:mem) reg=100 (src:AH) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte23(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regEAX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemByte24(fn): mod=00 (dst:mem) reg=100 (src:AH) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte24(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI), this.regEAX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemByte25(fn): mod=00 (dst:mem) reg=100 (src:AH) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte25(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEAX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemByte26(fn): mod=00 (dst:mem) reg=100 (src:AH) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte26(fn) {
var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEAX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModMemByte27(fn): mod=00 (dst:mem) reg=100 (src:AH) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte27(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEAX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemByte28(fn): mod=00 (dst:mem) reg=101 (src:CH) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte28(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regECX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemByte29(fn): mod=00 (dst:mem) reg=101 (src:CH) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte29(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regECX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemByte2A(fn): mod=00 (dst:mem) reg=101 (src:CH) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte2A(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regECX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemByte2B(fn): mod=00 (dst:mem) reg=101 (src:CH) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte2B(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regECX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemByte2C(fn): mod=00 (dst:mem) reg=101 (src:CH) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte2C(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI), this.regECX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemByte2D(fn): mod=00 (dst:mem) reg=101 (src:CH) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte2D(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI), this.regECX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemByte2E(fn): mod=00 (dst:mem) reg=101 (src:CH) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte2E(fn) {
var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regECX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModMemByte2F(fn): mod=00 (dst:mem) reg=101 (src:CH) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte2F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX), this.regECX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemByte30(fn): mod=00 (dst:mem) reg=110 (src:DH) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte30(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regEDX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemByte31(fn): mod=00 (dst:mem) reg=110 (src:DH) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte31(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regEDX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemByte32(fn): mod=00 (dst:mem) reg=110 (src:DH) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte32(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regEDX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemByte33(fn): mod=00 (dst:mem) reg=110 (src:DH) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte33(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regEDX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemByte34(fn): mod=00 (dst:mem) reg=110 (src:DH) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte34(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI), this.regEDX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemByte35(fn): mod=00 (dst:mem) reg=110 (src:DH) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte35(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEDX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemByte36(fn): mod=00 (dst:mem) reg=110 (src:DH) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte36(fn) {
var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEDX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModMemByte37(fn): mod=00 (dst:mem) reg=110 (src:DH) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte37(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEDX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemByte38(fn): mod=00 (dst:mem) reg=111 (src:BH) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte38(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regEBX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemByte39(fn): mod=00 (dst:mem) reg=111 (src:BH) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte39(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regEBX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemByte3A(fn): mod=00 (dst:mem) reg=111 (src:BH) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte3A(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regEBX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemByte3B(fn): mod=00 (dst:mem) reg=111 (src:BH) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte3B(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regEBX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemByte3C(fn): mod=00 (dst:mem) reg=111 (src:BH) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte3C(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI), this.regEBX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemByte3D(fn): mod=00 (dst:mem) reg=111 (src:BH) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte3D(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEBX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemByte3E(fn): mod=00 (dst:mem) reg=111 (src:BH) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte3E(fn) {
var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEBX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModMemByte3F(fn): mod=00 (dst:mem) reg=111 (src:BH) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte3F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEBX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemByte40(fn): mod=01 (dst:mem+d8) reg=000 (src:AL) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte40(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByte41(fn): mod=01 (dst:mem+d8) reg=000 (src:AL) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte41(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByte42(fn): mod=01 (dst:mem+d8) reg=000 (src:AL) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte42(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByte43(fn): mod=01 (dst:mem+d8) reg=000 (src:AL) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte43(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByte44(fn): mod=01 (dst:mem+d8) reg=000 (src:AL) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte44(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte45(fn): mod=01 (dst:mem+d8) reg=000 (src:AL) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte45(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte46(fn): mod=01 (dst:mem+d8) reg=000 (src:AL) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte46(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte47(fn): mod=01 (dst:mem+d8) reg=000 (src:AL) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte47(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte48(fn): mod=01 (dst:mem+d8) reg=001 (src:CL) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte48(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByte49(fn): mod=01 (dst:mem+d8) reg=001 (src:CL) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte49(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByte4A(fn): mod=01 (dst:mem+d8) reg=001 (src:CL) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte4A(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByte4B(fn): mod=01 (dst:mem+d8) reg=001 (src:CL) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte4B(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByte4C(fn): mod=01 (dst:mem+d8) reg=001 (src:CL) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte4C(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte4D(fn): mod=01 (dst:mem+d8) reg=001 (src:CL) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte4D(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte4E(fn): mod=01 (dst:mem+d8) reg=001 (src:CL) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte4E(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte4F(fn): mod=01 (dst:mem+d8) reg=001 (src:CL) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte4F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte50(fn): mod=01 (dst:mem+d8) reg=010 (src:DL) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte50(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByte51(fn): mod=01 (dst:mem+d8) reg=010 (src:DL) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte51(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByte52(fn): mod=01 (dst:mem+d8) reg=010 (src:DL) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte52(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByte53(fn): mod=01 (dst:mem+d8) reg=010 (src:DL) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte53(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByte54(fn): mod=01 (dst:mem+d8) reg=010 (src:DL) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte54(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte55(fn): mod=01 (dst:mem+d8) reg=010 (src:DL) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte55(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte56(fn): mod=01 (dst:mem+d8) reg=010 (src:DL) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte56(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte57(fn): mod=01 (dst:mem+d8) reg=010 (src:DL) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte57(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte58(fn): mod=01 (dst:mem+d8) reg=011 (src:BL) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte58(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByte59(fn): mod=01 (dst:mem+d8) reg=011 (src:BL) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte59(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByte5A(fn): mod=01 (dst:mem+d8) reg=011 (src:BL) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte5A(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByte5B(fn): mod=01 (dst:mem+d8) reg=011 (src:BL) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte5B(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByte5C(fn): mod=01 (dst:mem+d8) reg=011 (src:BL) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte5C(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte5D(fn): mod=01 (dst:mem+d8) reg=011 (src:BL) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte5D(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte5E(fn): mod=01 (dst:mem+d8) reg=011 (src:BL) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte5E(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte5F(fn): mod=01 (dst:mem+d8) reg=011 (src:BL) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte5F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte60(fn): mod=01 (dst:mem+d8) reg=100 (src:AH) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte60(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regEAX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByte61(fn): mod=01 (dst:mem+d8) reg=100 (src:AH) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte61(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEAX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByte62(fn): mod=01 (dst:mem+d8) reg=100 (src:AH) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte62(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEAX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByte63(fn): mod=01 (dst:mem+d8) reg=100 (src:AH) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte63(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEAX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByte64(fn): mod=01 (dst:mem+d8) reg=100 (src:AH) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte64(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEAX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte65(fn): mod=01 (dst:mem+d8) reg=100 (src:AH) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte65(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEAX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte66(fn): mod=01 (dst:mem+d8) reg=100 (src:AH) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte66(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEAX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte67(fn): mod=01 (dst:mem+d8) reg=100 (src:AH) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte67(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEAX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte68(fn): mod=01 (dst:mem+d8) reg=101 (src:CH) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte68(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regECX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByte69(fn): mod=01 (dst:mem+d8) reg=101 (src:CH) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte69(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regECX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByte6A(fn): mod=01 (dst:mem+d8) reg=101 (src:CH) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte6A(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regECX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByte6B(fn): mod=01 (dst:mem+d8) reg=101 (src:CH) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte6B(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regECX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByte6C(fn): mod=01 (dst:mem+d8) reg=101 (src:CH) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte6C(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regECX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte6D(fn): mod=01 (dst:mem+d8) reg=101 (src:CH) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte6D(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regECX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte6E(fn): mod=01 (dst:mem+d8) reg=101 (src:CH) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte6E(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regECX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte6F(fn): mod=01 (dst:mem+d8) reg=101 (src:CH) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte6F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regECX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte70(fn): mod=01 (dst:mem+d8) reg=110 (src:DH) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte70(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regEDX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByte71(fn): mod=01 (dst:mem+d8) reg=110 (src:DH) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte71(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEDX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByte72(fn): mod=01 (dst:mem+d8) reg=110 (src:DH) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte72(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEDX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByte73(fn): mod=01 (dst:mem+d8) reg=110 (src:DH) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte73(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEDX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByte74(fn): mod=01 (dst:mem+d8) reg=110 (src:DH) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte74(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEDX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte75(fn): mod=01 (dst:mem+d8) reg=110 (src:DH) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte75(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEDX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte76(fn): mod=01 (dst:mem+d8) reg=110 (src:DH) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte76(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEDX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte77(fn): mod=01 (dst:mem+d8) reg=110 (src:DH) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte77(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEDX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte78(fn): mod=01 (dst:mem+d8) reg=111 (src:BH) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte78(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regEBX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByte79(fn): mod=01 (dst:mem+d8) reg=111 (src:BH) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte79(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEBX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByte7A(fn): mod=01 (dst:mem+d8) reg=111 (src:BH) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte7A(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEBX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByte7B(fn): mod=01 (dst:mem+d8) reg=111 (src:BH) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte7B(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEBX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByte7C(fn): mod=01 (dst:mem+d8) reg=111 (src:BH) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte7C(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEBX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte7D(fn): mod=01 (dst:mem+d8) reg=111 (src:BH) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte7D(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEBX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte7E(fn): mod=01 (dst:mem+d8) reg=111 (src:BH) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte7E(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEBX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte7F(fn): mod=01 (dst:mem+d8) reg=111 (src:BH) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte7F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEBX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte80(fn): mod=10 (dst:mem+d16) reg=000 (src:AL) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte80(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByte81(fn): mod=10 (dst:mem+d16) reg=000 (src:AL) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte81(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByte82(fn): mod=10 (dst:mem+d16) reg=000 (src:AL) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte82(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByte83(fn): mod=10 (dst:mem+d16) reg=000 (src:AL) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte83(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByte84(fn): mod=10 (dst:mem+d16) reg=000 (src:AL) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte84(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte85(fn): mod=10 (dst:mem+d16) reg=000 (src:AL) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte85(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte86(fn): mod=10 (dst:mem+d16) reg=000 (src:AL) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte86(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte87(fn): mod=10 (dst:mem+d16) reg=000 (src:AL) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte87(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte88(fn): mod=10 (dst:mem+d16) reg=001 (src:CL) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte88(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByte89(fn): mod=10 (dst:mem+d16) reg=001 (src:CL) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte89(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByte8A(fn): mod=10 (dst:mem+d16) reg=001 (src:CL) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte8A(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByte8B(fn): mod=10 (dst:mem+d16) reg=001 (src:CL) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte8B(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByte8C(fn): mod=10 (dst:mem+d16) reg=001 (src:CL) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte8C(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte8D(fn): mod=10 (dst:mem+d16) reg=001 (src:CL) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte8D(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte8E(fn): mod=10 (dst:mem+d16) reg=001 (src:CL) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte8E(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte8F(fn): mod=10 (dst:mem+d16) reg=001 (src:CL) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte8F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte90(fn): mod=10 (dst:mem+d16) reg=010 (src:DL) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte90(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByte91(fn): mod=10 (dst:mem+d16) reg=010 (src:DL) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte91(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByte92(fn): mod=10 (dst:mem+d16) reg=010 (src:DL) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte92(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByte93(fn): mod=10 (dst:mem+d16) reg=010 (src:DL) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte93(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByte94(fn): mod=10 (dst:mem+d16) reg=010 (src:DL) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte94(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte95(fn): mod=10 (dst:mem+d16) reg=010 (src:DL) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte95(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte96(fn): mod=10 (dst:mem+d16) reg=010 (src:DL) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte96(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte97(fn): mod=10 (dst:mem+d16) reg=010 (src:DL) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte97(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte98(fn): mod=10 (dst:mem+d16) reg=011 (src:BL) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte98(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByte99(fn): mod=10 (dst:mem+d16) reg=011 (src:BL) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte99(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByte9A(fn): mod=10 (dst:mem+d16) reg=011 (src:BL) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte9A(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByte9B(fn): mod=10 (dst:mem+d16) reg=011 (src:BL) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte9B(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByte9C(fn): mod=10 (dst:mem+d16) reg=011 (src:BL) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte9C(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte9D(fn): mod=10 (dst:mem+d16) reg=011 (src:BL) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte9D(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte9E(fn): mod=10 (dst:mem+d16) reg=011 (src:BL) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte9E(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByte9F(fn): mod=10 (dst:mem+d16) reg=011 (src:BL) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByte9F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByteA0(fn): mod=10 (dst:mem+d16) reg=100 (src:AH) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteA0(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regEAX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByteA1(fn): mod=10 (dst:mem+d16) reg=100 (src:AH) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteA1(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEAX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByteA2(fn): mod=10 (dst:mem+d16) reg=100 (src:AH) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteA2(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEAX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByteA3(fn): mod=10 (dst:mem+d16) reg=100 (src:AH) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteA3(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEAX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByteA4(fn): mod=10 (dst:mem+d16) reg=100 (src:AH) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteA4(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEAX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByteA5(fn): mod=10 (dst:mem+d16) reg=100 (src:AH) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteA5(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEAX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByteA6(fn): mod=10 (dst:mem+d16) reg=100 (src:AH) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteA6(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEAX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByteA7(fn): mod=10 (dst:mem+d16) reg=100 (src:AH) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteA7(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEAX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByteA8(fn): mod=10 (dst:mem+d16) reg=101 (src:CH) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteA8(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regECX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByteA9(fn): mod=10 (dst:mem+d16) reg=101 (src:CH) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteA9(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regECX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByteAA(fn): mod=10 (dst:mem+d16) reg=101 (src:CH) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteAA(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regECX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByteAB(fn): mod=10 (dst:mem+d16) reg=101 (src:CH) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteAB(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regECX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByteAC(fn): mod=10 (dst:mem+d16) reg=101 (src:CH) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteAC(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regECX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByteAD(fn): mod=10 (dst:mem+d16) reg=101 (src:CH) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteAD(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regECX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByteAE(fn): mod=10 (dst:mem+d16) reg=101 (src:CH) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteAE(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regECX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByteAF(fn): mod=10 (dst:mem+d16) reg=101 (src:CH) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteAF(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regECX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByteB0(fn): mod=10 (dst:mem+d16) reg=110 (src:DH) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteB0(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regEDX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByteB1(fn): mod=10 (dst:mem+d16) reg=110 (src:DH) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteB1(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEDX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByteB2(fn): mod=10 (dst:mem+d16) reg=110 (src:DH) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteB2(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEDX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByteB3(fn): mod=10 (dst:mem+d16) reg=110 (src:DH) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteB3(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEDX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByteB4(fn): mod=10 (dst:mem+d16) reg=110 (src:DH) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteB4(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEDX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByteB5(fn): mod=10 (dst:mem+d16) reg=110 (src:DH) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteB5(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEDX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByteB6(fn): mod=10 (dst:mem+d16) reg=110 (src:DH) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteB6(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEDX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByteB7(fn): mod=10 (dst:mem+d16) reg=110 (src:DH) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteB7(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEDX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByteB8(fn): mod=10 (dst:mem+d16) reg=111 (src:BH) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteB8(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regEBX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByteB9(fn): mod=10 (dst:mem+d16) reg=111 (src:BH) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteB9(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEBX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByteBA(fn): mod=10 (dst:mem+d16) reg=111 (src:BH) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteBA(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEBX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemByteBB(fn): mod=10 (dst:mem+d16) reg=111 (src:BH) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteBB(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEBX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemByteBC(fn): mod=10 (dst:mem+d16) reg=111 (src:BH) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteBC(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEBX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByteBD(fn): mod=10 (dst:mem+d16) reg=111 (src:BH) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteBD(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEBX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByteBE(fn): mod=10 (dst:mem+d16) reg=111 (src:BH) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteBE(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEBX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemByteBF(fn): mod=10 (dst:mem+d16) reg=111 (src:BH) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemByteBF(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEBX >> 8);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
X86ModB.aOpModReg[0xC0], X86ModB.aOpModReg[0xC8], X86ModB.aOpModReg[0xD0], X86ModB.aOpModReg[0xD8],
X86ModB.aOpModReg[0xE0], X86ModB.aOpModReg[0xE8], X86ModB.aOpModReg[0xF0], X86ModB.aOpModReg[0xF8],
X86ModB.aOpModReg[0xC1], X86ModB.aOpModReg[0xC9], X86ModB.aOpModReg[0xD1], X86ModB.aOpModReg[0xD9],
X86ModB.aOpModReg[0xE1], X86ModB.aOpModReg[0xE9], X86ModB.aOpModReg[0xF1], X86ModB.aOpModReg[0xF9],
X86ModB.aOpModReg[0xC2], X86ModB.aOpModReg[0xCA], X86ModB.aOpModReg[0xD2], X86ModB.aOpModReg[0xDA],
X86ModB.aOpModReg[0xE2], X86ModB.aOpModReg[0xEA], X86ModB.aOpModReg[0xF2], X86ModB.aOpModReg[0xFA],
X86ModB.aOpModReg[0xC3], X86ModB.aOpModReg[0xCB], X86ModB.aOpModReg[0xD3], X86ModB.aOpModReg[0xDB],
X86ModB.aOpModReg[0xE3], X86ModB.aOpModReg[0xEB], X86ModB.aOpModReg[0xF3], X86ModB.aOpModReg[0xFB],
X86ModB.aOpModReg[0xC4], X86ModB.aOpModReg[0xCC], X86ModB.aOpModReg[0xD4], X86ModB.aOpModReg[0xDC],
X86ModB.aOpModReg[0xE4], X86ModB.aOpModReg[0xEC], X86ModB.aOpModReg[0xF4], X86ModB.aOpModReg[0xFC],
X86ModB.aOpModReg[0xC5], X86ModB.aOpModReg[0xCD], X86ModB.aOpModReg[0xD5], X86ModB.aOpModReg[0xDD],
X86ModB.aOpModReg[0xE5], X86ModB.aOpModReg[0xED], X86ModB.aOpModReg[0xF5], X86ModB.aOpModReg[0xFD],
X86ModB.aOpModReg[0xC6], X86ModB.aOpModReg[0xCE], X86ModB.aOpModReg[0xD6], X86ModB.aOpModReg[0xDE],
X86ModB.aOpModReg[0xE6], X86ModB.aOpModReg[0xEE], X86ModB.aOpModReg[0xF6], X86ModB.aOpModReg[0xFE],
X86ModB.aOpModReg[0xC7], X86ModB.aOpModReg[0xCF], X86ModB.aOpModReg[0xD7], X86ModB.aOpModReg[0xDF],
X86ModB.aOpModReg[0xE7], X86ModB.aOpModReg[0xEF], X86ModB.aOpModReg[0xF7], X86ModB.aOpModReg[0xFF]
];
X86ModB.aOpModGrp = [
/**
* opModGrpByte00(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte00(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpByte01(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte01(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpByte02(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte02(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpByte03(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte03(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpByte04(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte04(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpByte05(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte05(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpByte06(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte06(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModGrpByte07(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte07(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpByte08(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte08(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpByte09(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte09(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpByte0A(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte0A(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpByte0B(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte0B(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpByte0C(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte0C(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpByte0D(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte0D(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpByte0E(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte0E(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModGrpByte0F(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte0F(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpByte10(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte10(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpByte11(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte11(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpByte12(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte12(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpByte13(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte13(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpByte14(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte14(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpByte15(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte15(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpByte16(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte16(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModGrpByte17(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte17(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpByte18(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte18(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpByte19(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte19(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpByte1A(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte1A(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpByte1B(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte1B(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpByte1C(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte1C(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpByte1D(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte1D(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpByte1E(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte1E(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModGrpByte1F(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte1F(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpByte20(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte20(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpByte21(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte21(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpByte22(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte22(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpByte23(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte23(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpByte24(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte24(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpByte25(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte25(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpByte26(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte26(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModGrpByte27(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte27(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpByte28(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte28(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpByte29(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte29(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpByte2A(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte2A(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpByte2B(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte2B(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpByte2C(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte2C(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpByte2D(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte2D(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpByte2E(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte2E(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModGrpByte2F(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte2F(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpByte30(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte30(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpByte31(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte31(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpByte32(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte32(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpByte33(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte33(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpByte34(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte34(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpByte35(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte35(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpByte36(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte36(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModGrpByte37(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte37(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpByte38(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte38(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpByte39(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte39(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpByte3A(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte3A(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpByte3B(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte3B(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpByte3C(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte3C(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpByte3D(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte3D(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpByte3E(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte3E(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModGrpByte3F(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte3F(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpByte40(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte40(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByte41(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte41(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByte42(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte42(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByte43(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte43(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByte44(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte44(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte45(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte45(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte46(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte46(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte47(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte47(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte48(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte48(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByte49(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte49(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByte4A(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte4A(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByte4B(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte4B(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByte4C(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte4C(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte4D(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte4D(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte4E(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte4E(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte4F(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte4F(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte50(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte50(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByte51(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte51(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByte52(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte52(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByte53(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte53(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByte54(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte54(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte55(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte55(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte56(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte56(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte57(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte57(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte58(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte58(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByte59(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte59(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByte5A(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte5A(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByte5B(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte5B(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByte5C(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte5C(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte5D(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte5D(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte5E(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte5E(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte5F(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte5F(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte60(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte60(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByte61(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte61(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByte62(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte62(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByte63(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte63(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByte64(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte64(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte65(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte65(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte66(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte66(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte67(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte67(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte68(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte68(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByte69(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte69(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByte6A(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte6A(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByte6B(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte6B(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByte6C(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte6C(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte6D(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte6D(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte6E(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte6E(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte6F(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte6F(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte70(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte70(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByte71(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte71(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByte72(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte72(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByte73(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte73(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByte74(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte74(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte75(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte75(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte76(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte76(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte77(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte77(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte78(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte78(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByte79(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte79(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByte7A(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte7A(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByte7B(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte7B(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByte7C(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte7C(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte7D(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte7D(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte7E(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte7E(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte7F(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte7F(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte80(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte80(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByte81(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte81(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByte82(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte82(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByte83(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte83(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByte84(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte84(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte85(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte85(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte86(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte86(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte87(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte87(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte88(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte88(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByte89(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte89(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByte8A(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte8A(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByte8B(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte8B(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByte8C(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte8C(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte8D(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte8D(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte8E(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte8E(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte8F(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte8F(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte90(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte90(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByte91(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte91(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByte92(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte92(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByte93(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte93(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByte94(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte94(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte95(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte95(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte96(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte96(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte97(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte97(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte98(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte98(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByte99(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte99(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByte9A(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte9A(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByte9B(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte9B(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByte9C(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte9C(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte9D(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte9D(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte9E(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte9E(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByte9F(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByte9F(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByteA0(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteA0(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByteA1(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteA1(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByteA2(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteA2(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByteA3(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteA3(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByteA4(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteA4(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByteA5(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteA5(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByteA6(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteA6(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByteA7(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteA7(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByteA8(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteA8(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByteA9(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteA9(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByteAA(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteAA(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByteAB(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteAB(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByteAC(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteAC(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByteAD(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteAD(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByteAE(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteAE(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByteAF(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteAF(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByteB0(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteB0(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByteB1(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteB1(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByteB2(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteB2(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByteB3(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteB3(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByteB4(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteB4(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByteB5(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteB5(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByteB6(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteB6(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByteB7(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteB7(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByteB8(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteB8(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByteB9(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteB9(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByteBA(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteBA(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpByteBB(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteBB(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpByteBC(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteBC(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByteBD(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteBD(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByteBE(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteBE(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByteBF(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteBF(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpByteC0(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=000 (AL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteC0(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.regEAX & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
},
/**
* opModGrpByteC1(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=001 (CL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteC1(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.regECX & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
},
/**
* opModGrpByteC2(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=010 (DL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteC2(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.regEDX & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
},
/**
* opModGrpByteC3(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=011 (BL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteC3(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.regEBX & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
},
/**
* opModGrpByteC4(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=100 (AH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteC4(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, (this.regEAX >> 8), fnSrc.call(this));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
},
/**
* opModGrpByteC5(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=101 (CH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteC5(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, (this.regECX >> 8), fnSrc.call(this));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
},
/**
* opModGrpByteC6(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=110 (DH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteC6(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, (this.regEDX >> 8), fnSrc.call(this));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
},
/**
* opModGrpByteC7(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=111 (BH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteC7(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, (this.regEBX >> 8), fnSrc.call(this));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
},
/**
* opModGrpByteC8(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=000 (AL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteC8(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.regEAX & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
},
/**
* opModGrpByteC9(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=001 (CL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteC9(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.regECX & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
},
/**
* opModGrpByteCA(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=010 (DL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteCA(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.regEDX & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
},
/**
* opModGrpByteCB(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=011 (BL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteCB(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.regEBX & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
},
/**
* opModGrpByteCC(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=100 (AH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteCC(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, (this.regEAX >> 8), fnSrc.call(this));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
},
/**
* opModGrpByteCD(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=101 (CH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteCD(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, (this.regECX >> 8), fnSrc.call(this));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
},
/**
* opModGrpByteCE(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=110 (DH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteCE(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, (this.regEDX >> 8), fnSrc.call(this));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
},
/**
* opModGrpByteCF(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=111 (BH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteCF(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, (this.regEBX >> 8), fnSrc.call(this));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
},
/**
* opModGrpByteD0(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=000 (AL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteD0(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.regEAX & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
},
/**
* opModGrpByteD1(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=001 (CL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteD1(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.regECX & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
},
/**
* opModGrpByteD2(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=010 (DL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteD2(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.regEDX & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
},
/**
* opModGrpByteD3(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=011 (BL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteD3(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.regEBX & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
},
/**
* opModGrpByteD4(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=100 (AH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteD4(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, (this.regEAX >> 8), fnSrc.call(this));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
},
/**
* opModGrpByteD5(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=101 (CH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteD5(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, (this.regECX >> 8), fnSrc.call(this));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
},
/**
* opModGrpByteD6(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=110 (DH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteD6(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, (this.regEDX >> 8), fnSrc.call(this));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
},
/**
* opModGrpByteD7(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=111 (BH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteD7(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, (this.regEBX >> 8), fnSrc.call(this));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
},
/**
* opModGrpByteD8(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=000 (AL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteD8(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.regEAX & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
},
/**
* opModGrpByteD9(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=001 (CL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteD9(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.regECX & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
},
/**
* opModGrpByteDA(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=010 (DL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteDA(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.regEDX & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
},
/**
* opModGrpByteDB(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=011 (BL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteDB(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.regEBX & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
},
/**
* opModGrpByteDC(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=100 (AH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteDC(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, (this.regEAX >> 8), fnSrc.call(this));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
},
/**
* opModGrpByteDD(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=101 (CH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteDD(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, (this.regECX >> 8), fnSrc.call(this));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
},
/**
* opModGrpByteDE(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=110 (DH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteDE(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, (this.regEDX >> 8), fnSrc.call(this));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
},
/**
* opModGrpByteDF(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=111 (BH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteDF(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, (this.regEBX >> 8), fnSrc.call(this));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
},
/**
* opModGrpByteE0(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=000 (AL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteE0(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.regEAX & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
},
/**
* opModGrpByteE1(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=001 (CL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteE1(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.regECX & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
},
/**
* opModGrpByteE2(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=010 (DL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteE2(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.regEDX & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
},
/**
* opModGrpByteE3(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=011 (BL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteE3(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.regEBX & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
},
/**
* opModGrpByteE4(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=100 (AH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteE4(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, (this.regEAX >> 8), fnSrc.call(this));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
},
/**
* opModGrpByteE5(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=101 (CH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteE5(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, (this.regECX >> 8), fnSrc.call(this));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
},
/**
* opModGrpByteE6(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=110 (DH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteE6(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, (this.regEDX >> 8), fnSrc.call(this));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
},
/**
* opModGrpByteE7(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=111 (BH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteE7(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, (this.regEBX >> 8), fnSrc.call(this));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
},
/**
* opModGrpByteE8(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=000 (AL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteE8(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.regEAX & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
},
/**
* opModGrpByteE9(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=001 (CL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteE9(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.regECX & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
},
/**
* opModGrpByteEA(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=010 (DL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteEA(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.regEDX & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
},
/**
* opModGrpByteEB(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=011 (BL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteEB(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.regEBX & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
},
/**
* opModGrpByteEC(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=100 (AH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteEC(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, (this.regEAX >> 8), fnSrc.call(this));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
},
/**
* opModGrpByteED(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=101 (CH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteED(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, (this.regECX >> 8), fnSrc.call(this));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
},
/**
* opModGrpByteEE(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=110 (DH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteEE(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, (this.regEDX >> 8), fnSrc.call(this));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
},
/**
* opModGrpByteEF(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=111 (BH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteEF(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, (this.regEBX >> 8), fnSrc.call(this));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
},
/**
* opModGrpByteF0(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=000 (AL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteF0(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.regEAX & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
},
/**
* opModGrpByteF1(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=001 (CL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteF1(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.regECX & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
},
/**
* opModGrpByteF2(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=010 (DL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteF2(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.regEDX & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
},
/**
* opModGrpByteF3(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=011 (BL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteF3(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.regEBX & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
},
/**
* opModGrpByteF4(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=100 (AH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteF4(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, (this.regEAX >> 8), fnSrc.call(this));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
},
/**
* opModGrpByteF5(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=101 (CH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteF5(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, (this.regECX >> 8), fnSrc.call(this));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
},
/**
* opModGrpByteF6(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=110 (DH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteF6(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, (this.regEDX >> 8), fnSrc.call(this));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
},
/**
* opModGrpByteF7(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=111 (BH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteF7(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, (this.regEBX >> 8), fnSrc.call(this));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
},
/**
* opModGrpByteF8(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=000 (AL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteF8(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.regEAX & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
},
/**
* opModGrpByteF9(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=001 (CL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteF9(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.regECX & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
},
/**
* opModGrpByteFA(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=010 (DL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteFA(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.regEDX & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
},
/**
* opModGrpByteFB(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=011 (BL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteFB(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.regEBX & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
},
/**
* opModGrpByteFC(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=100 (AH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteFC(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, (this.regEAX >> 8), fnSrc.call(this));
this.regEAX = (this.regEAX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
},
/**
* opModGrpByteFD(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=101 (CH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteFD(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, (this.regECX >> 8), fnSrc.call(this));
this.regECX = (this.regECX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
},
/**
* opModGrpByteFE(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=110 (DH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteFE(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, (this.regEDX >> 8), fnSrc.call(this));
this.regEDX = (this.regEDX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
},
/**
* opModGrpByteFF(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=111 (BH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpByteFF(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, (this.regEBX >> 8), fnSrc.call(this));
this.regEBX = (this.regEBX & 0xff) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
}
];
if (typeof module !== 'undefined') module.exports = X86ModB;
/**
* @fileoverview Implements PCjs 8086 mode-byte decoding.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-Sep-05
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
if (typeof module !== 'undefined') {
var X86 = require("./x86");
}
var X86ModB16 = {};
X86ModB16.aOpModReg = [
/**
* opMod16RegByte00(fn): mod=00 (src:mem) reg=000 (dst:AL) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte00(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regESI));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegByte01(fn): mod=00 (src:mem) reg=000 (dst:AL) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte01(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegByte02(fn): mod=00 (src:mem) reg=000 (dst:AL) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte02(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegByte03(fn): mod=00 (src:mem) reg=000 (dst:AL) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte03(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegByte04(fn): mod=00 (src:mem) reg=000 (dst:AL) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte04(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regESI));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegByte05(fn): mod=00 (src:mem) reg=000 (dst:AL) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte05(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDI));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegByte06(fn): mod=00 (src:mem) reg=000 (dst:AL) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte06(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16RegByte07(fn): mod=00 (src:mem) reg=000 (dst:AL) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte07(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegByte08(fn): mod=00 (src:mem) reg=001 (dst:CL) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte08(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regESI));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegByte09(fn): mod=00 (src:mem) reg=001 (dst:CL) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte09(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegByte0A(fn): mod=00 (src:mem) reg=001 (dst:CL) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte0A(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegByte0B(fn): mod=00 (src:mem) reg=001 (dst:CL) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte0B(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegByte0C(fn): mod=00 (src:mem) reg=001 (dst:CL) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte0C(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regESI));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegByte0D(fn): mod=00 (src:mem) reg=001 (dst:CL) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte0D(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDI));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegByte0E(fn): mod=00 (src:mem) reg=001 (dst:CL) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte0E(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.getIPAddr()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16RegByte0F(fn): mod=00 (src:mem) reg=001 (dst:CL) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte0F(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegByte10(fn): mod=00 (src:mem) reg=010 (dst:DL) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte10(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regESI));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegByte11(fn): mod=00 (src:mem) reg=010 (dst:DL) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte11(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegByte12(fn): mod=00 (src:mem) reg=010 (dst:DL) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte12(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegByte13(fn): mod=00 (src:mem) reg=010 (dst:DL) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte13(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegByte14(fn): mod=00 (src:mem) reg=010 (dst:DL) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte14(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regESI));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegByte15(fn): mod=00 (src:mem) reg=010 (dst:DL) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte15(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDI));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegByte16(fn): mod=00 (src:mem) reg=010 (dst:DL) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte16(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16RegByte17(fn): mod=00 (src:mem) reg=010 (dst:DL) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte17(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegByte18(fn): mod=00 (src:mem) reg=011 (dst:BL) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte18(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regESI));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegByte19(fn): mod=00 (src:mem) reg=011 (dst:BL) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte19(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegByte1A(fn): mod=00 (src:mem) reg=011 (dst:BL) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte1A(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegByte1B(fn): mod=00 (src:mem) reg=011 (dst:BL) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte1B(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegByte1C(fn): mod=00 (src:mem) reg=011 (dst:BL) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte1C(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regESI));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegByte1D(fn): mod=00 (src:mem) reg=011 (dst:BL) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte1D(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDI));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegByte1E(fn): mod=00 (src:mem) reg=011 (dst:BL) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte1E(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16RegByte1F(fn): mod=00 (src:mem) reg=011 (dst:BL) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte1F(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegByte20(fn): mod=00 (src:mem) reg=100 (dst:AH) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte20(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegByte21(fn): mod=00 (src:mem) reg=100 (dst:AH) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte21(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegByte22(fn): mod=00 (src:mem) reg=100 (dst:AH) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte22(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegByte23(fn): mod=00 (src:mem) reg=100 (dst:AH) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte23(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegByte24(fn): mod=00 (src:mem) reg=100 (dst:AH) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte24(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regESI));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegByte25(fn): mod=00 (src:mem) reg=100 (dst:AH) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte25(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEDI));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegByte26(fn): mod=00 (src:mem) reg=100 (dst:AH) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte26(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16RegByte27(fn): mod=00 (src:mem) reg=100 (dst:AH) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte27(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegByte28(fn): mod=00 (src:mem) reg=101 (dst:CH) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte28(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegByte29(fn): mod=00 (src:mem) reg=101 (dst:CH) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte29(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegByte2A(fn): mod=00 (src:mem) reg=101 (dst:CH) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte2A(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegByte2B(fn): mod=00 (src:mem) reg=101 (dst:CH) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte2B(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegByte2C(fn): mod=00 (src:mem) reg=101 (dst:CH) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte2C(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regESI));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegByte2D(fn): mod=00 (src:mem) reg=101 (dst:CH) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte2D(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEDI));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegByte2E(fn): mod=00 (src:mem) reg=101 (dst:CH) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte2E(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.getIPAddr()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16RegByte2F(fn): mod=00 (src:mem) reg=101 (dst:CH) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte2F(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegByte30(fn): mod=00 (src:mem) reg=110 (dst:DH) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte30(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegByte31(fn): mod=00 (src:mem) reg=110 (dst:DH) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte31(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegByte32(fn): mod=00 (src:mem) reg=110 (dst:DH) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte32(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegByte33(fn): mod=00 (src:mem) reg=110 (dst:DH) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte33(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegByte34(fn): mod=00 (src:mem) reg=110 (dst:DH) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte34(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regESI));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegByte35(fn): mod=00 (src:mem) reg=110 (dst:DH) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte35(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEDI));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegByte36(fn): mod=00 (src:mem) reg=110 (dst:DH) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte36(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16RegByte37(fn): mod=00 (src:mem) reg=110 (dst:DH) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte37(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegByte38(fn): mod=00 (src:mem) reg=111 (dst:BH) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte38(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegByte39(fn): mod=00 (src:mem) reg=111 (dst:BH) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte39(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegByte3A(fn): mod=00 (src:mem) reg=111 (dst:BH) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte3A(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegByte3B(fn): mod=00 (src:mem) reg=111 (dst:BH) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte3B(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegByte3C(fn): mod=00 (src:mem) reg=111 (dst:BH) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte3C(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regESI));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegByte3D(fn): mod=00 (src:mem) reg=111 (dst:BH) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte3D(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEDI));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegByte3E(fn): mod=00 (src:mem) reg=111 (dst:BH) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte3E(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16RegByte3F(fn): mod=00 (src:mem) reg=111 (dst:BH) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte3F(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegByte40(fn): mod=01 (src:mem+d8) reg=000 (dst:AL) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte40(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByte41(fn): mod=01 (src:mem+d8) reg=000 (dst:AL) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte41(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByte42(fn): mod=01 (src:mem+d8) reg=000 (dst:AL) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte42(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByte43(fn): mod=01 (src:mem+d8) reg=000 (dst:AL) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte43(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByte44(fn): mod=01 (src:mem+d8) reg=000 (dst:AL) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte44(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte45(fn): mod=01 (src:mem+d8) reg=000 (dst:AL) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte45(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte46(fn): mod=01 (src:mem+d8) reg=000 (dst:AL) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte46(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte47(fn): mod=01 (src:mem+d8) reg=000 (dst:AL) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte47(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte48(fn): mod=01 (src:mem+d8) reg=001 (dst:CL) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte48(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByte49(fn): mod=01 (src:mem+d8) reg=001 (dst:CL) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte49(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByte4A(fn): mod=01 (src:mem+d8) reg=001 (dst:CL) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte4A(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByte4B(fn): mod=01 (src:mem+d8) reg=001 (dst:CL) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte4B(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByte4C(fn): mod=01 (src:mem+d8) reg=001 (dst:CL) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte4C(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte4D(fn): mod=01 (src:mem+d8) reg=001 (dst:CL) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte4D(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte4E(fn): mod=01 (src:mem+d8) reg=001 (dst:CL) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte4E(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte4F(fn): mod=01 (src:mem+d8) reg=001 (dst:CL) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte4F(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte50(fn): mod=01 (src:mem+d8) reg=010 (dst:DL) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte50(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByte51(fn): mod=01 (src:mem+d8) reg=010 (dst:DL) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte51(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByte52(fn): mod=01 (src:mem+d8) reg=010 (dst:DL) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte52(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByte53(fn): mod=01 (src:mem+d8) reg=010 (dst:DL) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte53(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByte54(fn): mod=01 (src:mem+d8) reg=010 (dst:DL) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte54(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte55(fn): mod=01 (src:mem+d8) reg=010 (dst:DL) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte55(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte56(fn): mod=01 (src:mem+d8) reg=010 (dst:DL) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte56(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte57(fn): mod=01 (src:mem+d8) reg=010 (dst:DL) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte57(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte58(fn): mod=01 (src:mem+d8) reg=011 (dst:BL) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte58(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByte59(fn): mod=01 (src:mem+d8) reg=011 (dst:BL) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte59(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByte5A(fn): mod=01 (src:mem+d8) reg=011 (dst:BL) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte5A(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByte5B(fn): mod=01 (src:mem+d8) reg=011 (dst:BL) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte5B(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByte5C(fn): mod=01 (src:mem+d8) reg=011 (dst:BL) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte5C(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte5D(fn): mod=01 (src:mem+d8) reg=011 (dst:BL) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte5D(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte5E(fn): mod=01 (src:mem+d8) reg=011 (dst:BL) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte5E(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte5F(fn): mod=01 (src:mem+d8) reg=011 (dst:BL) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte5F(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte60(fn): mod=01 (src:mem+d8) reg=100 (dst:AH) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte60(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByte61(fn): mod=01 (src:mem+d8) reg=100 (dst:AH) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte61(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByte62(fn): mod=01 (src:mem+d8) reg=100 (dst:AH) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte62(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByte63(fn): mod=01 (src:mem+d8) reg=100 (dst:AH) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte63(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByte64(fn): mod=01 (src:mem+d8) reg=100 (dst:AH) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte64(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte65(fn): mod=01 (src:mem+d8) reg=100 (dst:AH) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte65(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte66(fn): mod=01 (src:mem+d8) reg=100 (dst:AH) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte66(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte67(fn): mod=01 (src:mem+d8) reg=100 (dst:AH) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte67(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte68(fn): mod=01 (src:mem+d8) reg=101 (dst:CH) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte68(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByte69(fn): mod=01 (src:mem+d8) reg=101 (dst:CH) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte69(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByte6A(fn): mod=01 (src:mem+d8) reg=101 (dst:CH) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte6A(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByte6B(fn): mod=01 (src:mem+d8) reg=101 (dst:CH) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte6B(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByte6C(fn): mod=01 (src:mem+d8) reg=101 (dst:CH) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte6C(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte6D(fn): mod=01 (src:mem+d8) reg=101 (dst:CH) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte6D(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte6E(fn): mod=01 (src:mem+d8) reg=101 (dst:CH) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte6E(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte6F(fn): mod=01 (src:mem+d8) reg=101 (dst:CH) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte6F(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte70(fn): mod=01 (src:mem+d8) reg=110 (dst:DH) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte70(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByte71(fn): mod=01 (src:mem+d8) reg=110 (dst:DH) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte71(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByte72(fn): mod=01 (src:mem+d8) reg=110 (dst:DH) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte72(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByte73(fn): mod=01 (src:mem+d8) reg=110 (dst:DH) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte73(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByte74(fn): mod=01 (src:mem+d8) reg=110 (dst:DH) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte74(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte75(fn): mod=01 (src:mem+d8) reg=110 (dst:DH) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte75(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte76(fn): mod=01 (src:mem+d8) reg=110 (dst:DH) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte76(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte77(fn): mod=01 (src:mem+d8) reg=110 (dst:DH) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte77(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte78(fn): mod=01 (src:mem+d8) reg=111 (dst:BH) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte78(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByte79(fn): mod=01 (src:mem+d8) reg=111 (dst:BH) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte79(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByte7A(fn): mod=01 (src:mem+d8) reg=111 (dst:BH) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte7A(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByte7B(fn): mod=01 (src:mem+d8) reg=111 (dst:BH) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte7B(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByte7C(fn): mod=01 (src:mem+d8) reg=111 (dst:BH) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte7C(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte7D(fn): mod=01 (src:mem+d8) reg=111 (dst:BH) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte7D(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte7E(fn): mod=01 (src:mem+d8) reg=111 (dst:BH) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte7E(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte7F(fn): mod=01 (src:mem+d8) reg=111 (dst:BH) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte7F(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte80(fn): mod=10 (src:mem+d16) reg=000 (dst:AL) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte80(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByte81(fn): mod=10 (src:mem+d16) reg=000 (dst:AL) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte81(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByte82(fn): mod=10 (src:mem+d16) reg=000 (dst:AL) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte82(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByte83(fn): mod=10 (src:mem+d16) reg=000 (dst:AL) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte83(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByte84(fn): mod=10 (src:mem+d16) reg=000 (dst:AL) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte84(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte85(fn): mod=10 (src:mem+d16) reg=000 (dst:AL) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte85(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte86(fn): mod=10 (src:mem+d16) reg=000 (dst:AL) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte86(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte87(fn): mod=10 (src:mem+d16) reg=000 (dst:AL) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte87(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte88(fn): mod=10 (src:mem+d16) reg=001 (dst:CL) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte88(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByte89(fn): mod=10 (src:mem+d16) reg=001 (dst:CL) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte89(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByte8A(fn): mod=10 (src:mem+d16) reg=001 (dst:CL) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte8A(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByte8B(fn): mod=10 (src:mem+d16) reg=001 (dst:CL) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte8B(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByte8C(fn): mod=10 (src:mem+d16) reg=001 (dst:CL) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte8C(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte8D(fn): mod=10 (src:mem+d16) reg=001 (dst:CL) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte8D(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte8E(fn): mod=10 (src:mem+d16) reg=001 (dst:CL) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte8E(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte8F(fn): mod=10 (src:mem+d16) reg=001 (dst:CL) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte8F(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte90(fn): mod=10 (src:mem+d16) reg=010 (dst:DL) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte90(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByte91(fn): mod=10 (src:mem+d16) reg=010 (dst:DL) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte91(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByte92(fn): mod=10 (src:mem+d16) reg=010 (dst:DL) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte92(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByte93(fn): mod=10 (src:mem+d16) reg=010 (dst:DL) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte93(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByte94(fn): mod=10 (src:mem+d16) reg=010 (dst:DL) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte94(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte95(fn): mod=10 (src:mem+d16) reg=010 (dst:DL) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte95(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte96(fn): mod=10 (src:mem+d16) reg=010 (dst:DL) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte96(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte97(fn): mod=10 (src:mem+d16) reg=010 (dst:DL) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte97(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte98(fn): mod=10 (src:mem+d16) reg=011 (dst:BL) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte98(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByte99(fn): mod=10 (src:mem+d16) reg=011 (dst:BL) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte99(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByte9A(fn): mod=10 (src:mem+d16) reg=011 (dst:BL) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte9A(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByte9B(fn): mod=10 (src:mem+d16) reg=011 (dst:BL) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte9B(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByte9C(fn): mod=10 (src:mem+d16) reg=011 (dst:BL) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte9C(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte9D(fn): mod=10 (src:mem+d16) reg=011 (dst:BL) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte9D(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte9E(fn): mod=10 (src:mem+d16) reg=011 (dst:BL) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte9E(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByte9F(fn): mod=10 (src:mem+d16) reg=011 (dst:BL) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByte9F(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByteA0(fn): mod=10 (src:mem+d16) reg=100 (dst:AH) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteA0(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByteA1(fn): mod=10 (src:mem+d16) reg=100 (dst:AH) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteA1(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByteA2(fn): mod=10 (src:mem+d16) reg=100 (dst:AH) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteA2(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByteA3(fn): mod=10 (src:mem+d16) reg=100 (dst:AH) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteA3(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByteA4(fn): mod=10 (src:mem+d16) reg=100 (dst:AH) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteA4(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByteA5(fn): mod=10 (src:mem+d16) reg=100 (dst:AH) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteA5(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByteA6(fn): mod=10 (src:mem+d16) reg=100 (dst:AH) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteA6(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByteA7(fn): mod=10 (src:mem+d16) reg=100 (dst:AH) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteA7(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByteA8(fn): mod=10 (src:mem+d16) reg=101 (dst:CH) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteA8(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByteA9(fn): mod=10 (src:mem+d16) reg=101 (dst:CH) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteA9(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByteAA(fn): mod=10 (src:mem+d16) reg=101 (dst:CH) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteAA(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByteAB(fn): mod=10 (src:mem+d16) reg=101 (dst:CH) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteAB(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByteAC(fn): mod=10 (src:mem+d16) reg=101 (dst:CH) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteAC(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByteAD(fn): mod=10 (src:mem+d16) reg=101 (dst:CH) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteAD(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByteAE(fn): mod=10 (src:mem+d16) reg=101 (dst:CH) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteAE(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByteAF(fn): mod=10 (src:mem+d16) reg=101 (dst:CH) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteAF(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByteB0(fn): mod=10 (src:mem+d16) reg=110 (dst:DH) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteB0(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByteB1(fn): mod=10 (src:mem+d16) reg=110 (dst:DH) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteB1(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByteB2(fn): mod=10 (src:mem+d16) reg=110 (dst:DH) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteB2(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByteB3(fn): mod=10 (src:mem+d16) reg=110 (dst:DH) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteB3(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByteB4(fn): mod=10 (src:mem+d16) reg=110 (dst:DH) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteB4(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByteB5(fn): mod=10 (src:mem+d16) reg=110 (dst:DH) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteB5(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByteB6(fn): mod=10 (src:mem+d16) reg=110 (dst:DH) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteB6(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByteB7(fn): mod=10 (src:mem+d16) reg=110 (dst:DH) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteB7(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByteB8(fn): mod=10 (src:mem+d16) reg=111 (dst:BH) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteB8(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByteB9(fn): mod=10 (src:mem+d16) reg=111 (dst:BH) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteB9(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByteBA(fn): mod=10 (src:mem+d16) reg=111 (dst:BH) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteBA(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegByteBB(fn): mod=10 (src:mem+d16) reg=111 (dst:BH) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteBB(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegByteBC(fn): mod=10 (src:mem+d16) reg=111 (dst:BH) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteBC(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByteBD(fn): mod=10 (src:mem+d16) reg=111 (dst:BH) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteBD(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByteBE(fn): mod=10 (src:mem+d16) reg=111 (dst:BH) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteBE(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByteBF(fn): mod=10 (src:mem+d16) reg=111 (dst:BH) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteBF(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegByteC0(fn): mod=11 (src:reg) reg=000 (dst:AL) r/m=000 (AL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteC0(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.regEAX & 0xff);
this.regEAX = (this.regEAX & ~0xff) | b;
},
/**
* opMod16RegByteC1(fn): mod=11 (src:reg) reg=000 (dst:AL) r/m=001 (CL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteC1(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.regECX & 0xff);
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiCL;
},
/**
* opMod16RegByteC2(fn): mod=11 (src:reg) reg=000 (dst:AL) r/m=010 (DL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteC2(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.regEDX & 0xff);
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiDL;
},
/**
* opMod16RegByteC3(fn): mod=11 (src:reg) reg=000 (dst:AL) r/m=011 (BL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteC3(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.regEBX & 0xff);
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiBL;
},
/**
* opMod16RegByteC4(fn): mod=11 (src:reg) reg=000 (dst:AL) r/m=100 (AH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteC4(fn) {
var b = fn.call(this, this.regEAX & 0xff, (this.regEAX >> 8) & 0xff);
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiAH;
},
/**
* opMod16RegByteC5(fn): mod=11 (src:reg) reg=000 (dst:AL) r/m=101 (CH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteC5(fn) {
var b = fn.call(this, this.regEAX & 0xff, (this.regECX >> 8) & 0xff);
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiCH;
},
/**
* opMod16RegByteC6(fn): mod=11 (src:reg) reg=000 (dst:AL) r/m=110 (DH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteC6(fn) {
var b = fn.call(this, this.regEAX & 0xff, (this.regEDX >> 8) & 0xff);
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiDH;
},
/**
* opMod16RegByteC7(fn): mod=11 (src:reg) reg=000 (dst:AL) r/m=111 (BH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteC7(fn) {
var b = fn.call(this, this.regEAX & 0xff, (this.regEBX >> 8) & 0xff);
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiBH;
},
/**
* opMod16RegByteC8(fn): mod=11 (src:reg) reg=001 (dst:CL) r/m=000 (AL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteC8(fn) {
var b = fn.call(this, this.regECX & 0xff, this.regEAX & 0xff);
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiAL;
},
/**
* opMod16RegByteC9(fn): mod=11 (src:reg) reg=001 (dst:CL) r/m=001 (CL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteC9(fn) {
var b = fn.call(this, this.regECX & 0xff, this.regECX & 0xff);
this.regECX = (this.regECX & ~0xff) | b;
},
/**
* opMod16RegByteCA(fn): mod=11 (src:reg) reg=001 (dst:CL) r/m=010 (DL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteCA(fn) {
var b = fn.call(this, this.regECX & 0xff, this.regEDX & 0xff);
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiDL;
},
/**
* opMod16RegByteCB(fn): mod=11 (src:reg) reg=001 (dst:CL) r/m=011 (BL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteCB(fn) {
var b = fn.call(this, this.regECX & 0xff, this.regEBX & 0xff);
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiBL;
},
/**
* opMod16RegByteCC(fn): mod=11 (src:reg) reg=001 (dst:CL) r/m=100 (AH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteCC(fn) {
var b = fn.call(this, this.regECX & 0xff, (this.regEAX >> 8) & 0xff);
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiAH;
},
/**
* opMod16RegByteCD(fn): mod=11 (src:reg) reg=001 (dst:CL) r/m=101 (CH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteCD(fn) {
var b = fn.call(this, this.regECX & 0xff, (this.regECX >> 8) & 0xff);
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiCH;
},
/**
* opMod16RegByteCE(fn): mod=11 (src:reg) reg=001 (dst:CL) r/m=110 (DH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteCE(fn) {
var b = fn.call(this, this.regECX & 0xff, (this.regEDX >> 8) & 0xff);
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiDH;
},
/**
* opMod16RegByteCF(fn): mod=11 (src:reg) reg=001 (dst:CL) r/m=111 (BH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteCF(fn) {
var b = fn.call(this, this.regECX & 0xff, (this.regEBX >> 8) & 0xff);
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiBH;
},
/**
* opMod16RegByteD0(fn): mod=11 (src:reg) reg=010 (dst:DL) r/m=000 (AL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteD0(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.regEAX & 0xff);
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiAL;
},
/**
* opMod16RegByteD1(fn): mod=11 (src:reg) reg=010 (dst:DL) r/m=001 (CL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteD1(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.regECX & 0xff);
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiCL;
},
/**
* opMod16RegByteD2(fn): mod=11 (src:reg) reg=010 (dst:DL) r/m=010 (DL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteD2(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.regEDX & 0xff);
this.regEDX = (this.regEDX & ~0xff) | b;
},
/**
* opMod16RegByteD3(fn): mod=11 (src:reg) reg=010 (dst:DL) r/m=011 (BL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteD3(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.regEBX & 0xff);
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiBL;
},
/**
* opMod16RegByteD4(fn): mod=11 (src:reg) reg=010 (dst:DL) r/m=100 (AH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteD4(fn) {
var b = fn.call(this, this.regEDX & 0xff, (this.regEAX >> 8) & 0xff);
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiAH;
},
/**
* opMod16RegByteD5(fn): mod=11 (src:reg) reg=010 (dst:DL) r/m=101 (CH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteD5(fn) {
var b = fn.call(this, this.regEDX & 0xff, (this.regECX >> 8) & 0xff);
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiCH;
},
/**
* opMod16RegByteD6(fn): mod=11 (src:reg) reg=010 (dst:DL) r/m=110 (DH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteD6(fn) {
var b = fn.call(this, this.regEDX & 0xff, (this.regEDX >> 8) & 0xff);
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiDH;
},
/**
* opMod16RegByteD7(fn): mod=11 (src:reg) reg=010 (dst:DL) r/m=111 (BH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteD7(fn) {
var b = fn.call(this, this.regEDX & 0xff, (this.regEBX >> 8) & 0xff);
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiBH;
},
/**
* opMod16RegByteD8(fn): mod=11 (src:reg) reg=011 (dst:BL) r/m=000 (AL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteD8(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.regEAX & 0xff);
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiAL;
},
/**
* opMod16RegByteD9(fn): mod=11 (src:reg) reg=011 (dst:BL) r/m=001 (CL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteD9(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.regECX & 0xff);
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiCL;
},
/**
* opMod16RegByteDA(fn): mod=11 (src:reg) reg=011 (dst:BL) r/m=010 (DL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteDA(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.regEDX & 0xff);
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiDL;
},
/**
* opMod16RegByteDB(fn): mod=11 (src:reg) reg=011 (dst:BL) r/m=011 (BL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteDB(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.regEBX & 0xff);
this.regEBX = (this.regEBX & ~0xff) | b;
},
/**
* opMod16RegByteDC(fn): mod=11 (src:reg) reg=011 (dst:BL) r/m=100 (AH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteDC(fn) {
var b = fn.call(this, this.regEBX & 0xff, (this.regEAX >> 8) & 0xff);
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiAH;
},
/**
* opMod16RegByteDD(fn): mod=11 (src:reg) reg=011 (dst:BL) r/m=101 (CH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteDD(fn) {
var b = fn.call(this, this.regEBX & 0xff, (this.regECX >> 8) & 0xff);
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiCH;
},
/**
* opMod16RegByteDE(fn): mod=11 (src:reg) reg=011 (dst:BL) r/m=110 (DH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteDE(fn) {
var b = fn.call(this, this.regEBX & 0xff, (this.regEDX >> 8) & 0xff);
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiDH;
},
/**
* opMod16RegByteDF(fn): mod=11 (src:reg) reg=011 (dst:BL) r/m=111 (BH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteDF(fn) {
var b = fn.call(this, this.regEBX & 0xff, (this.regEBX >> 8) & 0xff);
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiBH;
},
/**
* opMod16RegByteE0(fn): mod=11 (src:reg) reg=100 (dst:AH) r/m=000 (AL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteE0(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.regEAX & 0xff);
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiAL;
},
/**
* opMod16RegByteE1(fn): mod=11 (src:reg) reg=100 (dst:AH) r/m=001 (CL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteE1(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.regECX & 0xff);
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiCL;
},
/**
* opMod16RegByteE2(fn): mod=11 (src:reg) reg=100 (dst:AH) r/m=010 (DL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteE2(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.regEDX & 0xff);
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiDL;
},
/**
* opMod16RegByteE3(fn): mod=11 (src:reg) reg=100 (dst:AH) r/m=011 (BL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteE3(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.regEBX & 0xff);
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiBL;
},
/**
* opMod16RegByteE4(fn): mod=11 (src:reg) reg=100 (dst:AH) r/m=100 (AH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteE4(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, (this.regEAX >> 8) & 0xff);
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
},
/**
* opMod16RegByteE5(fn): mod=11 (src:reg) reg=100 (dst:AH) r/m=101 (CH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteE5(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, (this.regECX >> 8) & 0xff);
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiCH;
},
/**
* opMod16RegByteE6(fn): mod=11 (src:reg) reg=100 (dst:AH) r/m=110 (DH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteE6(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, (this.regEDX >> 8) & 0xff);
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiDH;
},
/**
* opMod16RegByteE7(fn): mod=11 (src:reg) reg=100 (dst:AH) r/m=111 (BH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteE7(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, (this.regEBX >> 8) & 0xff);
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiBH;
},
/**
* opMod16RegByteE8(fn): mod=11 (src:reg) reg=101 (dst:CH) r/m=000 (AL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteE8(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.regEAX & 0xff);
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiAL;
},
/**
* opMod16RegByteE9(fn): mod=11 (src:reg) reg=101 (dst:CH) r/m=001 (CL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteE9(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.regECX & 0xff);
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiCL;
},
/**
* opMod16RegByteEA(fn): mod=11 (src:reg) reg=101 (dst:CH) r/m=010 (DL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteEA(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.regEDX & 0xff);
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiDL;
},
/**
* opMod16RegByteEB(fn): mod=11 (src:reg) reg=101 (dst:CH) r/m=011 (BL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteEB(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.regEBX & 0xff);
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiBL;
},
/**
* opMod16RegByteEC(fn): mod=11 (src:reg) reg=101 (dst:CH) r/m=100 (AH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteEC(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, (this.regEAX >> 8) & 0xff);
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiAH;
},
/**
* opMod16RegByteED(fn): mod=11 (src:reg) reg=101 (dst:CH) r/m=101 (CH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteED(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, (this.regECX >> 8) & 0xff);
this.regECX = (this.regECX & ~0xff00) | (b << 8);
},
/**
* opMod16RegByteEE(fn): mod=11 (src:reg) reg=101 (dst:CH) r/m=110 (DH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteEE(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, (this.regEDX >> 8) & 0xff);
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiDH;
},
/**
* opMod16RegByteEF(fn): mod=11 (src:reg) reg=101 (dst:CH) r/m=111 (BH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteEF(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, (this.regEBX >> 8) & 0xff);
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiBH;
},
/**
* opMod16RegByteF0(fn): mod=11 (src:reg) reg=110 (dst:DH) r/m=000 (AL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteF0(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.regEAX & 0xff);
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiAL;
},
/**
* opMod16RegByteF1(fn): mod=11 (src:reg) reg=110 (dst:DH) r/m=001 (CL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteF1(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.regECX & 0xff);
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiCL;
},
/**
* opMod16RegByteF2(fn): mod=11 (src:reg) reg=110 (dst:DH) r/m=010 (DL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteF2(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.regEDX & 0xff);
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiDL;
},
/**
* opMod16RegByteF3(fn): mod=11 (src:reg) reg=110 (dst:DH) r/m=011 (BL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteF3(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.regEBX & 0xff);
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiBL;
},
/**
* opMod16RegByteF4(fn): mod=11 (src:reg) reg=110 (dst:DH) r/m=100 (AH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteF4(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, (this.regEAX >> 8) & 0xff);
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiAH;
},
/**
* opMod16RegByteF5(fn): mod=11 (src:reg) reg=110 (dst:DH) r/m=101 (CH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteF5(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, (this.regECX >> 8) & 0xff);
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiCH;
},
/**
* opMod16RegByteF6(fn): mod=11 (src:reg) reg=110 (dst:DH) r/m=110 (DH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteF6(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, (this.regEDX >> 8) & 0xff);
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
},
/**
* opMod16RegByteF7(fn): mod=11 (src:reg) reg=110 (dst:DH) r/m=111 (BH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteF7(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, (this.regEBX >> 8) & 0xff);
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiBH;
},
/**
* opMod16RegByteF8(fn): mod=11 (src:reg) reg=111 (dst:BH) r/m=000 (AL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteF8(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.regEAX & 0xff);
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiAL;
},
/**
* opMod16RegByteF9(fn): mod=11 (src:reg) reg=111 (dst:BH) r/m=001 (CL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteF9(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.regECX & 0xff);
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiCL;
},
/**
* opMod16RegByteFA(fn): mod=11 (src:reg) reg=111 (dst:BH) r/m=010 (DL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteFA(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.regEDX & 0xff);
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiDL;
},
/**
* opMod16RegByteFB(fn): mod=11 (src:reg) reg=111 (dst:BH) r/m=011 (BL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteFB(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.regEBX & 0xff);
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiBL;
},
/**
* opMod16RegByteFC(fn): mod=11 (src:reg) reg=111 (dst:BH) r/m=100 (AH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteFC(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, (this.regEAX >> 8) & 0xff);
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiAH;
},
/**
* opMod16RegByteFD(fn): mod=11 (src:reg) reg=111 (dst:BH) r/m=101 (CH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteFD(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, (this.regECX >> 8) & 0xff);
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiCH;
},
/**
* opMod16RegByteFE(fn): mod=11 (src:reg) reg=111 (dst:BH) r/m=110 (DH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteFE(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, (this.regEDX >> 8) & 0xff);
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiDH;
},
/**
* opMod16RegByteFF(fn): mod=11 (src:reg) reg=111 (dst:BH) r/m=111 (BH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegByteFF(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, (this.regEBX >> 8) & 0xff);
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
}
];
X86ModB16.aOpModMem = [
/**
* opMod16MemByte00(fn): mod=00 (dst:mem) reg=000 (src:AL) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte00(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemByte01(fn): mod=00 (dst:mem) reg=000 (src:AL) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte01(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemByte02(fn): mod=00 (dst:mem) reg=000 (src:AL) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte02(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemByte03(fn): mod=00 (dst:mem) reg=000 (src:AL) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte03(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemByte04(fn): mod=00 (dst:mem) reg=000 (src:AL) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte04(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemByte05(fn): mod=00 (dst:mem) reg=000 (src:AL) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte05(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemByte06(fn): mod=00 (dst:mem) reg=000 (src:AL) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte06(fn) {
var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16MemByte07(fn): mod=00 (dst:mem) reg=000 (src:AL) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte07(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemByte08(fn): mod=00 (dst:mem) reg=001 (src:CL) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte08(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemByte09(fn): mod=00 (dst:mem) reg=001 (src:CL) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte09(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemByte0A(fn): mod=00 (dst:mem) reg=001 (src:CL) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte0A(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemByte0B(fn): mod=00 (dst:mem) reg=001 (src:CL) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte0B(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemByte0C(fn): mod=00 (dst:mem) reg=001 (src:CL) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte0C(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemByte0D(fn): mod=00 (dst:mem) reg=001 (src:CL) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte0D(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemByte0E(fn): mod=00 (dst:mem) reg=001 (src:CL) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte0E(fn) {
var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16MemByte0F(fn): mod=00 (dst:mem) reg=001 (src:CL) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte0F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemByte10(fn): mod=00 (dst:mem) reg=010 (src:DL) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte10(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemByte11(fn): mod=00 (dst:mem) reg=010 (src:DL) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte11(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemByte12(fn): mod=00 (dst:mem) reg=010 (src:DL) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte12(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemByte13(fn): mod=00 (dst:mem) reg=010 (src:DL) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte13(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemByte14(fn): mod=00 (dst:mem) reg=010 (src:DL) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte14(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemByte15(fn): mod=00 (dst:mem) reg=010 (src:DL) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte15(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemByte16(fn): mod=00 (dst:mem) reg=010 (src:DL) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte16(fn) {
var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16MemByte17(fn): mod=00 (dst:mem) reg=010 (src:DL) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte17(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemByte18(fn): mod=00 (dst:mem) reg=011 (src:BL) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte18(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemByte19(fn): mod=00 (dst:mem) reg=011 (src:BL) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte19(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemByte1A(fn): mod=00 (dst:mem) reg=011 (src:BL) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte1A(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemByte1B(fn): mod=00 (dst:mem) reg=011 (src:BL) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte1B(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemByte1C(fn): mod=00 (dst:mem) reg=011 (src:BL) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte1C(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemByte1D(fn): mod=00 (dst:mem) reg=011 (src:BL) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte1D(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemByte1E(fn): mod=00 (dst:mem) reg=011 (src:BL) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte1E(fn) {
var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16MemByte1F(fn): mod=00 (dst:mem) reg=011 (src:BL) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte1F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemByte20(fn): mod=00 (dst:mem) reg=100 (src:AH) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte20(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemByte21(fn): mod=00 (dst:mem) reg=100 (src:AH) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte21(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemByte22(fn): mod=00 (dst:mem) reg=100 (src:AH) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte22(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemByte23(fn): mod=00 (dst:mem) reg=100 (src:AH) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte23(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemByte24(fn): mod=00 (dst:mem) reg=100 (src:AH) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte24(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemByte25(fn): mod=00 (dst:mem) reg=100 (src:AH) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte25(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemByte26(fn): mod=00 (dst:mem) reg=100 (src:AH) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte26(fn) {
var b = fn.call(this, this.modEAByteData(this.getIPAddr()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16MemByte27(fn): mod=00 (dst:mem) reg=100 (src:AH) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte27(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemByte28(fn): mod=00 (dst:mem) reg=101 (src:CH) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte28(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemByte29(fn): mod=00 (dst:mem) reg=101 (src:CH) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte29(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemByte2A(fn): mod=00 (dst:mem) reg=101 (src:CH) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte2A(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemByte2B(fn): mod=00 (dst:mem) reg=101 (src:CH) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte2B(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemByte2C(fn): mod=00 (dst:mem) reg=101 (src:CH) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte2C(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemByte2D(fn): mod=00 (dst:mem) reg=101 (src:CH) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte2D(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemByte2E(fn): mod=00 (dst:mem) reg=101 (src:CH) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte2E(fn) {
var b = fn.call(this, this.modEAByteData(this.getIPAddr()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16MemByte2F(fn): mod=00 (dst:mem) reg=101 (src:CH) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte2F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemByte30(fn): mod=00 (dst:mem) reg=110 (src:DH) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte30(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemByte31(fn): mod=00 (dst:mem) reg=110 (src:DH) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte31(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemByte32(fn): mod=00 (dst:mem) reg=110 (src:DH) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte32(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemByte33(fn): mod=00 (dst:mem) reg=110 (src:DH) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte33(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemByte34(fn): mod=00 (dst:mem) reg=110 (src:DH) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte34(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemByte35(fn): mod=00 (dst:mem) reg=110 (src:DH) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte35(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemByte36(fn): mod=00 (dst:mem) reg=110 (src:DH) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte36(fn) {
var b = fn.call(this, this.modEAByteData(this.getIPAddr()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16MemByte37(fn): mod=00 (dst:mem) reg=110 (src:DH) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte37(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemByte38(fn): mod=00 (dst:mem) reg=111 (src:BH) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte38(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemByte39(fn): mod=00 (dst:mem) reg=111 (src:BH) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte39(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemByte3A(fn): mod=00 (dst:mem) reg=111 (src:BH) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte3A(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemByte3B(fn): mod=00 (dst:mem) reg=111 (src:BH) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte3B(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemByte3C(fn): mod=00 (dst:mem) reg=111 (src:BH) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte3C(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemByte3D(fn): mod=00 (dst:mem) reg=111 (src:BH) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte3D(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemByte3E(fn): mod=00 (dst:mem) reg=111 (src:BH) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte3E(fn) {
var b = fn.call(this, this.modEAByteData(this.getIPAddr()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16MemByte3F(fn): mod=00 (dst:mem) reg=111 (src:BH) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte3F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemByte40(fn): mod=01 (dst:mem+d8) reg=000 (src:AL) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte40(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByte41(fn): mod=01 (dst:mem+d8) reg=000 (src:AL) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte41(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByte42(fn): mod=01 (dst:mem+d8) reg=000 (src:AL) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte42(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByte43(fn): mod=01 (dst:mem+d8) reg=000 (src:AL) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte43(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByte44(fn): mod=01 (dst:mem+d8) reg=000 (src:AL) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte44(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte45(fn): mod=01 (dst:mem+d8) reg=000 (src:AL) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte45(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte46(fn): mod=01 (dst:mem+d8) reg=000 (src:AL) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte46(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte47(fn): mod=01 (dst:mem+d8) reg=000 (src:AL) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte47(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte48(fn): mod=01 (dst:mem+d8) reg=001 (src:CL) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte48(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByte49(fn): mod=01 (dst:mem+d8) reg=001 (src:CL) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte49(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByte4A(fn): mod=01 (dst:mem+d8) reg=001 (src:CL) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte4A(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByte4B(fn): mod=01 (dst:mem+d8) reg=001 (src:CL) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte4B(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByte4C(fn): mod=01 (dst:mem+d8) reg=001 (src:CL) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte4C(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte4D(fn): mod=01 (dst:mem+d8) reg=001 (src:CL) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte4D(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte4E(fn): mod=01 (dst:mem+d8) reg=001 (src:CL) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte4E(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte4F(fn): mod=01 (dst:mem+d8) reg=001 (src:CL) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte4F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte50(fn): mod=01 (dst:mem+d8) reg=010 (src:DL) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte50(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByte51(fn): mod=01 (dst:mem+d8) reg=010 (src:DL) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte51(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByte52(fn): mod=01 (dst:mem+d8) reg=010 (src:DL) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte52(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByte53(fn): mod=01 (dst:mem+d8) reg=010 (src:DL) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte53(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByte54(fn): mod=01 (dst:mem+d8) reg=010 (src:DL) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte54(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte55(fn): mod=01 (dst:mem+d8) reg=010 (src:DL) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte55(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte56(fn): mod=01 (dst:mem+d8) reg=010 (src:DL) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte56(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte57(fn): mod=01 (dst:mem+d8) reg=010 (src:DL) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte57(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte58(fn): mod=01 (dst:mem+d8) reg=011 (src:BL) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte58(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByte59(fn): mod=01 (dst:mem+d8) reg=011 (src:BL) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte59(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByte5A(fn): mod=01 (dst:mem+d8) reg=011 (src:BL) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte5A(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByte5B(fn): mod=01 (dst:mem+d8) reg=011 (src:BL) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte5B(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByte5C(fn): mod=01 (dst:mem+d8) reg=011 (src:BL) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte5C(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte5D(fn): mod=01 (dst:mem+d8) reg=011 (src:BL) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte5D(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte5E(fn): mod=01 (dst:mem+d8) reg=011 (src:BL) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte5E(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte5F(fn): mod=01 (dst:mem+d8) reg=011 (src:BL) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte5F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte60(fn): mod=01 (dst:mem+d8) reg=100 (src:AH) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte60(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByte61(fn): mod=01 (dst:mem+d8) reg=100 (src:AH) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte61(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByte62(fn): mod=01 (dst:mem+d8) reg=100 (src:AH) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte62(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByte63(fn): mod=01 (dst:mem+d8) reg=100 (src:AH) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte63(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByte64(fn): mod=01 (dst:mem+d8) reg=100 (src:AH) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte64(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte65(fn): mod=01 (dst:mem+d8) reg=100 (src:AH) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte65(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte66(fn): mod=01 (dst:mem+d8) reg=100 (src:AH) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte66(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte67(fn): mod=01 (dst:mem+d8) reg=100 (src:AH) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte67(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte68(fn): mod=01 (dst:mem+d8) reg=101 (src:CH) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte68(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByte69(fn): mod=01 (dst:mem+d8) reg=101 (src:CH) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte69(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByte6A(fn): mod=01 (dst:mem+d8) reg=101 (src:CH) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte6A(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByte6B(fn): mod=01 (dst:mem+d8) reg=101 (src:CH) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte6B(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByte6C(fn): mod=01 (dst:mem+d8) reg=101 (src:CH) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte6C(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte6D(fn): mod=01 (dst:mem+d8) reg=101 (src:CH) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte6D(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte6E(fn): mod=01 (dst:mem+d8) reg=101 (src:CH) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte6E(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte6F(fn): mod=01 (dst:mem+d8) reg=101 (src:CH) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte6F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte70(fn): mod=01 (dst:mem+d8) reg=110 (src:DH) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte70(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByte71(fn): mod=01 (dst:mem+d8) reg=110 (src:DH) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte71(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByte72(fn): mod=01 (dst:mem+d8) reg=110 (src:DH) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte72(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByte73(fn): mod=01 (dst:mem+d8) reg=110 (src:DH) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte73(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByte74(fn): mod=01 (dst:mem+d8) reg=110 (src:DH) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte74(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte75(fn): mod=01 (dst:mem+d8) reg=110 (src:DH) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte75(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte76(fn): mod=01 (dst:mem+d8) reg=110 (src:DH) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte76(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte77(fn): mod=01 (dst:mem+d8) reg=110 (src:DH) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte77(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte78(fn): mod=01 (dst:mem+d8) reg=111 (src:BH) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte78(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByte79(fn): mod=01 (dst:mem+d8) reg=111 (src:BH) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte79(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByte7A(fn): mod=01 (dst:mem+d8) reg=111 (src:BH) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte7A(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByte7B(fn): mod=01 (dst:mem+d8) reg=111 (src:BH) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte7B(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByte7C(fn): mod=01 (dst:mem+d8) reg=111 (src:BH) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte7C(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte7D(fn): mod=01 (dst:mem+d8) reg=111 (src:BH) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte7D(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte7E(fn): mod=01 (dst:mem+d8) reg=111 (src:BH) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte7E(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte7F(fn): mod=01 (dst:mem+d8) reg=111 (src:BH) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte7F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte80(fn): mod=10 (dst:mem+d16) reg=000 (src:AL) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte80(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByte81(fn): mod=10 (dst:mem+d16) reg=000 (src:AL) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte81(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByte82(fn): mod=10 (dst:mem+d16) reg=000 (src:AL) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte82(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByte83(fn): mod=10 (dst:mem+d16) reg=000 (src:AL) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte83(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByte84(fn): mod=10 (dst:mem+d16) reg=000 (src:AL) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte84(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte85(fn): mod=10 (dst:mem+d16) reg=000 (src:AL) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte85(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte86(fn): mod=10 (dst:mem+d16) reg=000 (src:AL) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte86(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte87(fn): mod=10 (dst:mem+d16) reg=000 (src:AL) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte87(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte88(fn): mod=10 (dst:mem+d16) reg=001 (src:CL) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte88(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByte89(fn): mod=10 (dst:mem+d16) reg=001 (src:CL) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte89(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByte8A(fn): mod=10 (dst:mem+d16) reg=001 (src:CL) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte8A(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByte8B(fn): mod=10 (dst:mem+d16) reg=001 (src:CL) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte8B(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByte8C(fn): mod=10 (dst:mem+d16) reg=001 (src:CL) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte8C(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte8D(fn): mod=10 (dst:mem+d16) reg=001 (src:CL) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte8D(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte8E(fn): mod=10 (dst:mem+d16) reg=001 (src:CL) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte8E(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte8F(fn): mod=10 (dst:mem+d16) reg=001 (src:CL) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte8F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte90(fn): mod=10 (dst:mem+d16) reg=010 (src:DL) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte90(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByte91(fn): mod=10 (dst:mem+d16) reg=010 (src:DL) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte91(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByte92(fn): mod=10 (dst:mem+d16) reg=010 (src:DL) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte92(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByte93(fn): mod=10 (dst:mem+d16) reg=010 (src:DL) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte93(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByte94(fn): mod=10 (dst:mem+d16) reg=010 (src:DL) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte94(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte95(fn): mod=10 (dst:mem+d16) reg=010 (src:DL) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte95(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte96(fn): mod=10 (dst:mem+d16) reg=010 (src:DL) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte96(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte97(fn): mod=10 (dst:mem+d16) reg=010 (src:DL) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte97(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte98(fn): mod=10 (dst:mem+d16) reg=011 (src:BL) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte98(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByte99(fn): mod=10 (dst:mem+d16) reg=011 (src:BL) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte99(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByte9A(fn): mod=10 (dst:mem+d16) reg=011 (src:BL) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte9A(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByte9B(fn): mod=10 (dst:mem+d16) reg=011 (src:BL) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte9B(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByte9C(fn): mod=10 (dst:mem+d16) reg=011 (src:BL) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte9C(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte9D(fn): mod=10 (dst:mem+d16) reg=011 (src:BL) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte9D(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte9E(fn): mod=10 (dst:mem+d16) reg=011 (src:BL) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte9E(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByte9F(fn): mod=10 (dst:mem+d16) reg=011 (src:BL) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByte9F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByteA0(fn): mod=10 (dst:mem+d16) reg=100 (src:AH) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteA0(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByteA1(fn): mod=10 (dst:mem+d16) reg=100 (src:AH) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteA1(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByteA2(fn): mod=10 (dst:mem+d16) reg=100 (src:AH) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteA2(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByteA3(fn): mod=10 (dst:mem+d16) reg=100 (src:AH) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteA3(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByteA4(fn): mod=10 (dst:mem+d16) reg=100 (src:AH) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteA4(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByteA5(fn): mod=10 (dst:mem+d16) reg=100 (src:AH) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteA5(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByteA6(fn): mod=10 (dst:mem+d16) reg=100 (src:AH) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteA6(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByteA7(fn): mod=10 (dst:mem+d16) reg=100 (src:AH) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteA7(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByteA8(fn): mod=10 (dst:mem+d16) reg=101 (src:CH) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteA8(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByteA9(fn): mod=10 (dst:mem+d16) reg=101 (src:CH) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteA9(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByteAA(fn): mod=10 (dst:mem+d16) reg=101 (src:CH) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteAA(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByteAB(fn): mod=10 (dst:mem+d16) reg=101 (src:CH) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteAB(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByteAC(fn): mod=10 (dst:mem+d16) reg=101 (src:CH) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteAC(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByteAD(fn): mod=10 (dst:mem+d16) reg=101 (src:CH) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteAD(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByteAE(fn): mod=10 (dst:mem+d16) reg=101 (src:CH) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteAE(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByteAF(fn): mod=10 (dst:mem+d16) reg=101 (src:CH) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteAF(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByteB0(fn): mod=10 (dst:mem+d16) reg=110 (src:DH) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteB0(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByteB1(fn): mod=10 (dst:mem+d16) reg=110 (src:DH) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteB1(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByteB2(fn): mod=10 (dst:mem+d16) reg=110 (src:DH) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteB2(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByteB3(fn): mod=10 (dst:mem+d16) reg=110 (src:DH) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteB3(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByteB4(fn): mod=10 (dst:mem+d16) reg=110 (src:DH) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteB4(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByteB5(fn): mod=10 (dst:mem+d16) reg=110 (src:DH) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteB5(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByteB6(fn): mod=10 (dst:mem+d16) reg=110 (src:DH) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteB6(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByteB7(fn): mod=10 (dst:mem+d16) reg=110 (src:DH) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteB7(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByteB8(fn): mod=10 (dst:mem+d16) reg=111 (src:BH) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteB8(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByteB9(fn): mod=10 (dst:mem+d16) reg=111 (src:BH) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteB9(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByteBA(fn): mod=10 (dst:mem+d16) reg=111 (src:BH) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteBA(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemByteBB(fn): mod=10 (dst:mem+d16) reg=111 (src:BH) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteBB(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemByteBC(fn): mod=10 (dst:mem+d16) reg=111 (src:BH) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteBC(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByteBD(fn): mod=10 (dst:mem+d16) reg=111 (src:BH) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteBD(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByteBE(fn): mod=10 (dst:mem+d16) reg=111 (src:BH) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteBE(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemByteBF(fn): mod=10 (dst:mem+d16) reg=111 (src:BH) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemByteBF(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
X86ModB16.aOpModReg[0xC0], X86ModB16.aOpModReg[0xC8], X86ModB16.aOpModReg[0xD0], X86ModB16.aOpModReg[0xD8],
X86ModB16.aOpModReg[0xE0], X86ModB16.aOpModReg[0xE8], X86ModB16.aOpModReg[0xF0], X86ModB16.aOpModReg[0xF8],
X86ModB16.aOpModReg[0xC1], X86ModB16.aOpModReg[0xC9], X86ModB16.aOpModReg[0xD1], X86ModB16.aOpModReg[0xD9],
X86ModB16.aOpModReg[0xE1], X86ModB16.aOpModReg[0xE9], X86ModB16.aOpModReg[0xF1], X86ModB16.aOpModReg[0xF9],
X86ModB16.aOpModReg[0xC2], X86ModB16.aOpModReg[0xCA], X86ModB16.aOpModReg[0xD2], X86ModB16.aOpModReg[0xDA],
X86ModB16.aOpModReg[0xE2], X86ModB16.aOpModReg[0xEA], X86ModB16.aOpModReg[0xF2], X86ModB16.aOpModReg[0xFA],
X86ModB16.aOpModReg[0xC3], X86ModB16.aOpModReg[0xCB], X86ModB16.aOpModReg[0xD3], X86ModB16.aOpModReg[0xDB],
X86ModB16.aOpModReg[0xE3], X86ModB16.aOpModReg[0xEB], X86ModB16.aOpModReg[0xF3], X86ModB16.aOpModReg[0xFB],
X86ModB16.aOpModReg[0xC4], X86ModB16.aOpModReg[0xCC], X86ModB16.aOpModReg[0xD4], X86ModB16.aOpModReg[0xDC],
X86ModB16.aOpModReg[0xE4], X86ModB16.aOpModReg[0xEC], X86ModB16.aOpModReg[0xF4], X86ModB16.aOpModReg[0xFC],
X86ModB16.aOpModReg[0xC5], X86ModB16.aOpModReg[0xCD], X86ModB16.aOpModReg[0xD5], X86ModB16.aOpModReg[0xDD],
X86ModB16.aOpModReg[0xE5], X86ModB16.aOpModReg[0xED], X86ModB16.aOpModReg[0xF5], X86ModB16.aOpModReg[0xFD],
X86ModB16.aOpModReg[0xC6], X86ModB16.aOpModReg[0xCE], X86ModB16.aOpModReg[0xD6], X86ModB16.aOpModReg[0xDE],
X86ModB16.aOpModReg[0xE6], X86ModB16.aOpModReg[0xEE], X86ModB16.aOpModReg[0xF6], X86ModB16.aOpModReg[0xFE],
X86ModB16.aOpModReg[0xC7], X86ModB16.aOpModReg[0xCF], X86ModB16.aOpModReg[0xD7], X86ModB16.aOpModReg[0xDF],
X86ModB16.aOpModReg[0xE7], X86ModB16.aOpModReg[0xEF], X86ModB16.aOpModReg[0xF7], X86ModB16.aOpModReg[0xFF]
];
X86ModB16.aOpModGrp = [
/**
* opMod16GrpByte00(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte00(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpByte01(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte01(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpByte02(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte02(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpByte03(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte03(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpByte04(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte04(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpByte05(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte05(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpByte06(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte06(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16GrpByte07(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte07(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpByte08(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte08(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpByte09(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte09(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpByte0A(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte0A(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpByte0B(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte0B(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpByte0C(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte0C(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpByte0D(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte0D(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpByte0E(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte0E(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16GrpByte0F(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte0F(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpByte10(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte10(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpByte11(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte11(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpByte12(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte12(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpByte13(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte13(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpByte14(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte14(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpByte15(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte15(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpByte16(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte16(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16GrpByte17(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte17(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpByte18(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte18(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpByte19(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte19(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpByte1A(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte1A(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpByte1B(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte1B(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpByte1C(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte1C(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpByte1D(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte1D(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpByte1E(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte1E(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16GrpByte1F(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte1F(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpByte20(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte20(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpByte21(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte21(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpByte22(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte22(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpByte23(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte23(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpByte24(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte24(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpByte25(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte25(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpByte26(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte26(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16GrpByte27(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte27(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpByte28(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte28(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpByte29(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte29(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpByte2A(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte2A(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpByte2B(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte2B(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpByte2C(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte2C(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpByte2D(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte2D(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpByte2E(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte2E(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16GrpByte2F(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte2F(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpByte30(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte30(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpByte31(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte31(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpByte32(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte32(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpByte33(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte33(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpByte34(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte34(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpByte35(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte35(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpByte36(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte36(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16GrpByte37(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte37(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpByte38(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte38(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpByte39(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte39(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpByte3A(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte3A(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpByte3B(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte3B(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpByte3C(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte3C(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpByte3D(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte3D(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpByte3E(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte3E(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16GrpByte3F(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte3F(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpByte40(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte40(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByte41(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte41(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByte42(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte42(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByte43(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte43(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByte44(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte44(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte45(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte45(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte46(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte46(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte47(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte47(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte48(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte48(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByte49(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte49(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByte4A(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte4A(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByte4B(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte4B(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByte4C(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte4C(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte4D(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte4D(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte4E(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte4E(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte4F(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte4F(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte50(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte50(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByte51(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte51(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByte52(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte52(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByte53(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte53(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByte54(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte54(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte55(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte55(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte56(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte56(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte57(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte57(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte58(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte58(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByte59(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte59(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByte5A(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte5A(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByte5B(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte5B(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByte5C(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte5C(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte5D(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte5D(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte5E(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte5E(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte5F(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte5F(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte60(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte60(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByte61(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte61(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByte62(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte62(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByte63(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte63(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByte64(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte64(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte65(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte65(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte66(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte66(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte67(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte67(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte68(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte68(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByte69(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte69(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByte6A(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte6A(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByte6B(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte6B(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByte6C(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte6C(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte6D(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte6D(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte6E(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte6E(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte6F(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte6F(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte70(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte70(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByte71(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte71(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByte72(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte72(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByte73(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte73(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByte74(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte74(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte75(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte75(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte76(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte76(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte77(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte77(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte78(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte78(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByte79(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte79(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByte7A(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte7A(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByte7B(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte7B(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByte7C(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte7C(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte7D(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte7D(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte7E(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte7E(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte7F(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte7F(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte80(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte80(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByte81(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte81(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByte82(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte82(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByte83(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte83(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByte84(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte84(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte85(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte85(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte86(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte86(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte87(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte87(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte88(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte88(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByte89(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte89(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByte8A(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte8A(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByte8B(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte8B(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByte8C(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte8C(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte8D(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte8D(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte8E(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte8E(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte8F(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte8F(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte90(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte90(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByte91(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte91(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByte92(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte92(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByte93(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte93(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByte94(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte94(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte95(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte95(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte96(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte96(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte97(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte97(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte98(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte98(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByte99(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte99(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByte9A(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte9A(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByte9B(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte9B(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByte9C(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte9C(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte9D(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte9D(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte9E(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte9E(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByte9F(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByte9F(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByteA0(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteA0(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByteA1(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteA1(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByteA2(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteA2(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByteA3(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteA3(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByteA4(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteA4(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByteA5(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteA5(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByteA6(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteA6(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByteA7(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteA7(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByteA8(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteA8(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByteA9(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteA9(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByteAA(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteAA(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByteAB(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteAB(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByteAC(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteAC(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByteAD(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteAD(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByteAE(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteAE(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByteAF(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteAF(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByteB0(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteB0(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByteB1(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteB1(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByteB2(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteB2(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByteB3(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteB3(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByteB4(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteB4(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByteB5(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteB5(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByteB6(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteB6(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByteB7(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteB7(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByteB8(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteB8(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByteB9(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteB9(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByteBA(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteBA(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpByteBB(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteBB(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpByteBC(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteBC(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByteBD(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteBD(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByteBE(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteBE(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByteBF(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteBF(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpByteC0(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=000 (AL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteC0(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.regEAX & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteC1(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=001 (CL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteC1(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.regECX & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteC2(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=010 (DL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteC2(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.regEDX & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteC3(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=011 (BL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteC3(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.regEBX & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteC4(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=100 (AH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteC4(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteC5(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=101 (CH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteC5(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteC6(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=110 (DH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteC6(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteC7(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=111 (BH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteC7(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteC8(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=000 (AL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteC8(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.regEAX & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteC9(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=001 (CL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteC9(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.regECX & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteCA(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=010 (DL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteCA(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.regEDX & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteCB(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=011 (BL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteCB(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.regEBX & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteCC(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=100 (AH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteCC(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteCD(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=101 (CH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteCD(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteCE(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=110 (DH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteCE(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteCF(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=111 (BH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteCF(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteD0(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=000 (AL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteD0(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.regEAX & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteD1(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=001 (CL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteD1(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.regECX & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteD2(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=010 (DL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteD2(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.regEDX & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteD3(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=011 (BL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteD3(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.regEBX & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteD4(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=100 (AH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteD4(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteD5(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=101 (CH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteD5(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteD6(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=110 (DH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteD6(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteD7(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=111 (BH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteD7(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteD8(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=000 (AL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteD8(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.regEAX & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteD9(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=001 (CL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteD9(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.regECX & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteDA(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=010 (DL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteDA(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.regEDX & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteDB(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=011 (BL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteDB(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.regEBX & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteDC(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=100 (AH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteDC(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteDD(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=101 (CH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteDD(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteDE(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=110 (DH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteDE(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteDF(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=111 (BH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteDF(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteE0(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=000 (AL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteE0(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.regEAX & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteE1(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=001 (CL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteE1(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.regECX & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteE2(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=010 (DL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteE2(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.regEDX & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteE3(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=011 (BL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteE3(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.regEBX & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteE4(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=100 (AH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteE4(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteE5(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=101 (CH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteE5(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteE6(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=110 (DH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteE6(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteE7(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=111 (BH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteE7(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteE8(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=000 (AL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteE8(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.regEAX & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteE9(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=001 (CL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteE9(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.regECX & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteEA(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=010 (DL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteEA(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.regEDX & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteEB(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=011 (BL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteEB(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.regEBX & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteEC(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=100 (AH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteEC(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteED(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=101 (CH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteED(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteEE(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=110 (DH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteEE(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteEF(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=111 (BH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteEF(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteF0(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=000 (AL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteF0(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.regEAX & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteF1(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=001 (CL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteF1(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.regECX & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteF2(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=010 (DL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteF2(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.regEDX & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteF3(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=011 (BL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteF3(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.regEBX & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteF4(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=100 (AH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteF4(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteF5(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=101 (CH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteF5(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteF6(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=110 (DH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteF6(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteF7(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=111 (BH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteF7(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteF8(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=000 (AL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteF8(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.regEAX & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteF9(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=001 (CL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteF9(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.regECX & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteFA(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=010 (DL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteFA(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.regEDX & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteFB(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=011 (BL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteFB(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.regEBX & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteFC(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=100 (AH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteFC(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteFD(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=101 (CH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteFD(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteFE(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=110 (DH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteFE(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
},
/**
* opMod16GrpByteFF(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=111 (BH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpByteFF(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
}
];
if (typeof module !== 'undefined') module.exports = X86ModB16;
/**
* @fileoverview Implements PCjs 80386 mode-byte decoding.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2015-Jan-20
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
if (typeof module !== 'undefined') {
var X86 = require("./x86");
}
var X86ModB32 = {};
X86ModB32.aOpModReg = [
/**
* opMod32RegByte00(fn): mod=00 (src:mem) reg=000 (dst:AL) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte00(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEAX));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte01(fn): mod=00 (src:mem) reg=000 (dst:AL) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte01(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regECX));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte02(fn): mod=00 (src:mem) reg=000 (dst:AL) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte02(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDX));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte03(fn): mod=00 (src:mem) reg=000 (dst:AL) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte03(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte04(fn): mod=00 (src:mem) reg=000 (dst:AL) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte04(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.getSIBAddr(0)));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte05(fn): mod=00 (src:mem) reg=000 (dst:AL) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte05(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32RegByte06(fn): mod=00 (src:mem) reg=000 (dst:AL) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte06(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regESI));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte07(fn): mod=00 (src:mem) reg=000 (dst:AL) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte07(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDI));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte08(fn): mod=00 (src:mem) reg=001 (dst:CL) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte08(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEAX));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte09(fn): mod=00 (src:mem) reg=001 (dst:CL) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte09(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regECX));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte0A(fn): mod=00 (src:mem) reg=001 (dst:CL) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte0A(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDX));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte0B(fn): mod=00 (src:mem) reg=001 (dst:CL) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte0B(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte0C(fn): mod=00 (src:mem) reg=001 (dst:CL) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte0C(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.getSIBAddr(0)));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte0D(fn): mod=00 (src:mem) reg=001 (dst:CL) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte0D(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.getIPAddr()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32RegByte0E(fn): mod=00 (src:mem) reg=001 (dst:CL) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte0E(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regESI));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte0F(fn): mod=00 (src:mem) reg=001 (dst:CL) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte0F(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDI));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte10(fn): mod=00 (src:mem) reg=010 (dst:DL) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte10(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEAX));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte11(fn): mod=00 (src:mem) reg=010 (dst:DL) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte11(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regECX));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte12(fn): mod=00 (src:mem) reg=010 (dst:DL) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte12(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDX));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte13(fn): mod=00 (src:mem) reg=010 (dst:DL) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte13(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte14(fn): mod=00 (src:mem) reg=010 (dst:DL) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte14(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.getSIBAddr(0)));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte15(fn): mod=00 (src:mem) reg=010 (dst:DL) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte15(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32RegByte16(fn): mod=00 (src:mem) reg=010 (dst:DL) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte16(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regESI));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte17(fn): mod=00 (src:mem) reg=010 (dst:DL) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte17(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDI));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte18(fn): mod=00 (src:mem) reg=011 (dst:BL) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte18(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEAX));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte19(fn): mod=00 (src:mem) reg=011 (dst:BL) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte19(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regECX));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte1A(fn): mod=00 (src:mem) reg=011 (dst:BL) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte1A(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDX));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte1B(fn): mod=00 (src:mem) reg=011 (dst:BL) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte1B(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte1C(fn): mod=00 (src:mem) reg=011 (dst:BL) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte1C(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.getSIBAddr(0)));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte1D(fn): mod=00 (src:mem) reg=011 (dst:BL) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte1D(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32RegByte1E(fn): mod=00 (src:mem) reg=011 (dst:BL) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte1E(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regESI));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte1F(fn): mod=00 (src:mem) reg=011 (dst:BL) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte1F(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDI));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte20(fn): mod=00 (src:mem) reg=100 (dst:AH) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte20(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEAX));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte21(fn): mod=00 (src:mem) reg=100 (dst:AH) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte21(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regECX));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte22(fn): mod=00 (src:mem) reg=100 (dst:AH) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte22(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEDX));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte23(fn): mod=00 (src:mem) reg=100 (dst:AH) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte23(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte24(fn): mod=00 (src:mem) reg=100 (dst:AH) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte24(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(0)));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte25(fn): mod=00 (src:mem) reg=100 (dst:AH) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte25(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32RegByte26(fn): mod=00 (src:mem) reg=100 (dst:AH) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte26(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regESI));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte27(fn): mod=00 (src:mem) reg=100 (dst:AH) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte27(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEDI));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte28(fn): mod=00 (src:mem) reg=101 (dst:CH) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte28(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEAX));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte29(fn): mod=00 (src:mem) reg=101 (dst:CH) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte29(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regECX));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte2A(fn): mod=00 (src:mem) reg=101 (dst:CH) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte2A(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEDX));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte2B(fn): mod=00 (src:mem) reg=101 (dst:CH) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte2B(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte2C(fn): mod=00 (src:mem) reg=101 (dst:CH) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte2C(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(0)));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte2D(fn): mod=00 (src:mem) reg=101 (dst:CH) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte2D(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.getIPAddr()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32RegByte2E(fn): mod=00 (src:mem) reg=101 (dst:CH) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte2E(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regESI));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte2F(fn): mod=00 (src:mem) reg=101 (dst:CH) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte2F(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEDI));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte30(fn): mod=00 (src:mem) reg=110 (dst:DH) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte30(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEAX));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte31(fn): mod=00 (src:mem) reg=110 (dst:DH) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte31(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regECX));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte32(fn): mod=00 (src:mem) reg=110 (dst:DH) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte32(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEDX));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte33(fn): mod=00 (src:mem) reg=110 (dst:DH) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte33(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte34(fn): mod=00 (src:mem) reg=110 (dst:DH) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte34(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(0)));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte35(fn): mod=00 (src:mem) reg=110 (dst:DH) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte35(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32RegByte36(fn): mod=00 (src:mem) reg=110 (dst:DH) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte36(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regESI));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte37(fn): mod=00 (src:mem) reg=110 (dst:DH) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte37(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEDI));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte38(fn): mod=00 (src:mem) reg=111 (dst:BH) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte38(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEAX));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte39(fn): mod=00 (src:mem) reg=111 (dst:BH) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte39(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regECX));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte3A(fn): mod=00 (src:mem) reg=111 (dst:BH) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte3A(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEDX));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte3B(fn): mod=00 (src:mem) reg=111 (dst:BH) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte3B(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte3C(fn): mod=00 (src:mem) reg=111 (dst:BH) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte3C(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(0)));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte3D(fn): mod=00 (src:mem) reg=111 (dst:BH) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte3D(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32RegByte3E(fn): mod=00 (src:mem) reg=111 (dst:BH) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte3E(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regESI));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte3F(fn): mod=00 (src:mem) reg=111 (dst:BH) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte3F(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEDI));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegByte40(fn): mod=01 (src:mem+d8) reg=000 (dst:AL) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte40(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEAX + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte41(fn): mod=01 (src:mem+d8) reg=000 (dst:AL) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte41(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regECX + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte42(fn): mod=01 (src:mem+d8) reg=000 (dst:AL) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte42(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDX + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte43(fn): mod=01 (src:mem+d8) reg=000 (dst:AL) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte43(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte44(fn): mod=01 (src:mem+d8) reg=000 (dst:AL) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte44(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.getSIBAddr(1) + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte45(fn): mod=01 (src:mem+d8) reg=000 (dst:AL) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte45(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte46(fn): mod=01 (src:mem+d8) reg=000 (dst:AL) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte46(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte47(fn): mod=01 (src:mem+d8) reg=000 (dst:AL) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte47(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte48(fn): mod=01 (src:mem+d8) reg=001 (dst:CL) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte48(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEAX + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte49(fn): mod=01 (src:mem+d8) reg=001 (dst:CL) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte49(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regECX + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte4A(fn): mod=01 (src:mem+d8) reg=001 (dst:CL) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte4A(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDX + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte4B(fn): mod=01 (src:mem+d8) reg=001 (dst:CL) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte4B(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte4C(fn): mod=01 (src:mem+d8) reg=001 (dst:CL) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte4C(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.getSIBAddr(1) + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte4D(fn): mod=01 (src:mem+d8) reg=001 (dst:CL) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte4D(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte4E(fn): mod=01 (src:mem+d8) reg=001 (dst:CL) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte4E(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte4F(fn): mod=01 (src:mem+d8) reg=001 (dst:CL) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte4F(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte50(fn): mod=01 (src:mem+d8) reg=010 (dst:DL) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte50(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEAX + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte51(fn): mod=01 (src:mem+d8) reg=010 (dst:DL) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte51(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regECX + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte52(fn): mod=01 (src:mem+d8) reg=010 (dst:DL) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte52(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDX + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte53(fn): mod=01 (src:mem+d8) reg=010 (dst:DL) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte53(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte54(fn): mod=01 (src:mem+d8) reg=010 (dst:DL) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte54(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.getSIBAddr(1) + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte55(fn): mod=01 (src:mem+d8) reg=010 (dst:DL) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte55(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte56(fn): mod=01 (src:mem+d8) reg=010 (dst:DL) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte56(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte57(fn): mod=01 (src:mem+d8) reg=010 (dst:DL) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte57(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte58(fn): mod=01 (src:mem+d8) reg=011 (dst:BL) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte58(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEAX + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte59(fn): mod=01 (src:mem+d8) reg=011 (dst:BL) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte59(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regECX + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte5A(fn): mod=01 (src:mem+d8) reg=011 (dst:BL) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte5A(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDX + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte5B(fn): mod=01 (src:mem+d8) reg=011 (dst:BL) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte5B(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte5C(fn): mod=01 (src:mem+d8) reg=011 (dst:BL) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte5C(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.getSIBAddr(1) + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte5D(fn): mod=01 (src:mem+d8) reg=011 (dst:BL) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte5D(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte5E(fn): mod=01 (src:mem+d8) reg=011 (dst:BL) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte5E(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte5F(fn): mod=01 (src:mem+d8) reg=011 (dst:BL) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte5F(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte60(fn): mod=01 (src:mem+d8) reg=100 (dst:AH) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte60(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEAX + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte61(fn): mod=01 (src:mem+d8) reg=100 (dst:AH) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte61(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regECX + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte62(fn): mod=01 (src:mem+d8) reg=100 (dst:AH) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte62(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEDX + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte63(fn): mod=01 (src:mem+d8) reg=100 (dst:AH) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte63(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte64(fn): mod=01 (src:mem+d8) reg=100 (dst:AH) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte64(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(1) + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte65(fn): mod=01 (src:mem+d8) reg=100 (dst:AH) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte65(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte66(fn): mod=01 (src:mem+d8) reg=100 (dst:AH) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte66(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte67(fn): mod=01 (src:mem+d8) reg=100 (dst:AH) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte67(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte68(fn): mod=01 (src:mem+d8) reg=101 (dst:CH) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte68(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEAX + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte69(fn): mod=01 (src:mem+d8) reg=101 (dst:CH) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte69(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regECX + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte6A(fn): mod=01 (src:mem+d8) reg=101 (dst:CH) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte6A(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEDX + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte6B(fn): mod=01 (src:mem+d8) reg=101 (dst:CH) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte6B(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte6C(fn): mod=01 (src:mem+d8) reg=101 (dst:CH) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte6C(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(1) + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte6D(fn): mod=01 (src:mem+d8) reg=101 (dst:CH) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte6D(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte6E(fn): mod=01 (src:mem+d8) reg=101 (dst:CH) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte6E(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte6F(fn): mod=01 (src:mem+d8) reg=101 (dst:CH) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte6F(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte70(fn): mod=01 (src:mem+d8) reg=110 (dst:DH) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte70(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEAX + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte71(fn): mod=01 (src:mem+d8) reg=110 (dst:DH) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte71(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regECX + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte72(fn): mod=01 (src:mem+d8) reg=110 (dst:DH) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte72(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEDX + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte73(fn): mod=01 (src:mem+d8) reg=110 (dst:DH) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte73(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte74(fn): mod=01 (src:mem+d8) reg=110 (dst:DH) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte74(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(1) + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte75(fn): mod=01 (src:mem+d8) reg=110 (dst:DH) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte75(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte76(fn): mod=01 (src:mem+d8) reg=110 (dst:DH) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte76(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte77(fn): mod=01 (src:mem+d8) reg=110 (dst:DH) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte77(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte78(fn): mod=01 (src:mem+d8) reg=111 (dst:BH) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte78(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEAX + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte79(fn): mod=01 (src:mem+d8) reg=111 (dst:BH) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte79(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regECX + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte7A(fn): mod=01 (src:mem+d8) reg=111 (dst:BH) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte7A(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEDX + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte7B(fn): mod=01 (src:mem+d8) reg=111 (dst:BH) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte7B(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte7C(fn): mod=01 (src:mem+d8) reg=111 (dst:BH) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte7C(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(1) + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte7D(fn): mod=01 (src:mem+d8) reg=111 (dst:BH) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte7D(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte7E(fn): mod=01 (src:mem+d8) reg=111 (dst:BH) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte7E(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte7F(fn): mod=01 (src:mem+d8) reg=111 (dst:BH) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte7F(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte80(fn): mod=10 (src:mem+d16) reg=000 (dst:AL) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte80(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEAX + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte81(fn): mod=10 (src:mem+d16) reg=000 (dst:AL) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte81(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regECX + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte82(fn): mod=10 (src:mem+d16) reg=000 (dst:AL) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte82(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDX + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte83(fn): mod=10 (src:mem+d16) reg=000 (dst:AL) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte83(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte84(fn): mod=10 (src:mem+d16) reg=000 (dst:AL) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte84(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.getSIBAddr(2) + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte85(fn): mod=10 (src:mem+d16) reg=000 (dst:AL) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte85(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte86(fn): mod=10 (src:mem+d16) reg=000 (dst:AL) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte86(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte87(fn): mod=10 (src:mem+d16) reg=000 (dst:AL) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte87(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte88(fn): mod=10 (src:mem+d16) reg=001 (dst:CL) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte88(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEAX + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte89(fn): mod=10 (src:mem+d16) reg=001 (dst:CL) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte89(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regECX + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte8A(fn): mod=10 (src:mem+d16) reg=001 (dst:CL) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte8A(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDX + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte8B(fn): mod=10 (src:mem+d16) reg=001 (dst:CL) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte8B(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte8C(fn): mod=10 (src:mem+d16) reg=001 (dst:CL) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte8C(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.getSIBAddr(2) + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte8D(fn): mod=10 (src:mem+d16) reg=001 (dst:CL) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte8D(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte8E(fn): mod=10 (src:mem+d16) reg=001 (dst:CL) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte8E(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte8F(fn): mod=10 (src:mem+d16) reg=001 (dst:CL) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte8F(fn) {
var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte90(fn): mod=10 (src:mem+d16) reg=010 (dst:DL) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte90(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEAX + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte91(fn): mod=10 (src:mem+d16) reg=010 (dst:DL) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte91(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regECX + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte92(fn): mod=10 (src:mem+d16) reg=010 (dst:DL) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte92(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDX + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte93(fn): mod=10 (src:mem+d16) reg=010 (dst:DL) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte93(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte94(fn): mod=10 (src:mem+d16) reg=010 (dst:DL) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte94(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.getSIBAddr(2) + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte95(fn): mod=10 (src:mem+d16) reg=010 (dst:DL) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte95(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte96(fn): mod=10 (src:mem+d16) reg=010 (dst:DL) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte96(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte97(fn): mod=10 (src:mem+d16) reg=010 (dst:DL) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte97(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte98(fn): mod=10 (src:mem+d16) reg=011 (dst:BL) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte98(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEAX + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte99(fn): mod=10 (src:mem+d16) reg=011 (dst:BL) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte99(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regECX + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte9A(fn): mod=10 (src:mem+d16) reg=011 (dst:BL) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte9A(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDX + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte9B(fn): mod=10 (src:mem+d16) reg=011 (dst:BL) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte9B(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte9C(fn): mod=10 (src:mem+d16) reg=011 (dst:BL) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte9C(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.getSIBAddr(2) + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte9D(fn): mod=10 (src:mem+d16) reg=011 (dst:BL) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte9D(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte9E(fn): mod=10 (src:mem+d16) reg=011 (dst:BL) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte9E(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByte9F(fn): mod=10 (src:mem+d16) reg=011 (dst:BL) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByte9F(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteA0(fn): mod=10 (src:mem+d16) reg=100 (dst:AH) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteA0(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEAX + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteA1(fn): mod=10 (src:mem+d16) reg=100 (dst:AH) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteA1(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regECX + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteA2(fn): mod=10 (src:mem+d16) reg=100 (dst:AH) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteA2(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEDX + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteA3(fn): mod=10 (src:mem+d16) reg=100 (dst:AH) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteA3(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteA4(fn): mod=10 (src:mem+d16) reg=100 (dst:AH) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteA4(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(2) + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteA5(fn): mod=10 (src:mem+d16) reg=100 (dst:AH) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteA5(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteA6(fn): mod=10 (src:mem+d16) reg=100 (dst:AH) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteA6(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteA7(fn): mod=10 (src:mem+d16) reg=100 (dst:AH) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteA7(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteA8(fn): mod=10 (src:mem+d16) reg=101 (dst:CH) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteA8(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEAX + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteA9(fn): mod=10 (src:mem+d16) reg=101 (dst:CH) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteA9(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regECX + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteAA(fn): mod=10 (src:mem+d16) reg=101 (dst:CH) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteAA(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEDX + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteAB(fn): mod=10 (src:mem+d16) reg=101 (dst:CH) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteAB(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteAC(fn): mod=10 (src:mem+d16) reg=101 (dst:CH) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteAC(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(2) + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteAD(fn): mod=10 (src:mem+d16) reg=101 (dst:CH) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteAD(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteAE(fn): mod=10 (src:mem+d16) reg=101 (dst:CH) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteAE(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteAF(fn): mod=10 (src:mem+d16) reg=101 (dst:CH) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteAF(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteB0(fn): mod=10 (src:mem+d16) reg=110 (dst:DH) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteB0(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEAX + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteB1(fn): mod=10 (src:mem+d16) reg=110 (dst:DH) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteB1(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regECX + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteB2(fn): mod=10 (src:mem+d16) reg=110 (dst:DH) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteB2(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEDX + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteB3(fn): mod=10 (src:mem+d16) reg=110 (dst:DH) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteB3(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteB4(fn): mod=10 (src:mem+d16) reg=110 (dst:DH) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteB4(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(2) + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteB5(fn): mod=10 (src:mem+d16) reg=110 (dst:DH) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteB5(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteB6(fn): mod=10 (src:mem+d16) reg=110 (dst:DH) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteB6(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteB7(fn): mod=10 (src:mem+d16) reg=110 (dst:DH) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteB7(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteB8(fn): mod=10 (src:mem+d16) reg=111 (dst:BH) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteB8(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEAX + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteB9(fn): mod=10 (src:mem+d16) reg=111 (dst:BH) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteB9(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regECX + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteBA(fn): mod=10 (src:mem+d16) reg=111 (dst:BH) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteBA(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEDX + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteBB(fn): mod=10 (src:mem+d16) reg=111 (dst:BH) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteBB(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteBC(fn): mod=10 (src:mem+d16) reg=111 (dst:BH) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteBC(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(2) + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteBD(fn): mod=10 (src:mem+d16) reg=111 (dst:BH) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteBD(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteBE(fn): mod=10 (src:mem+d16) reg=111 (dst:BH) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteBE(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteBF(fn): mod=10 (src:mem+d16) reg=111 (dst:BH) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteBF(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegByteC0(fn): mod=11 (src:reg) reg=000 (dst:AL) r/m=000 (AL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteC0(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.regEAX & 0xff);
this.regEAX = (this.regEAX & ~0xff) | b;
},
/**
* opMod32RegByteC1(fn): mod=11 (src:reg) reg=000 (dst:AL) r/m=001 (CL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteC1(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.regECX & 0xff);
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiCL;
},
/**
* opMod32RegByteC2(fn): mod=11 (src:reg) reg=000 (dst:AL) r/m=010 (DL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteC2(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.regEDX & 0xff);
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiDL;
},
/**
* opMod32RegByteC3(fn): mod=11 (src:reg) reg=000 (dst:AL) r/m=011 (BL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteC3(fn) {
var b = fn.call(this, this.regEAX & 0xff, this.regEBX & 0xff);
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiBL;
},
/**
* opMod32RegByteC4(fn): mod=11 (src:reg) reg=000 (dst:AL) r/m=100 (AH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteC4(fn) {
var b = fn.call(this, this.regEAX & 0xff, (this.regEAX >> 8) & 0xff);
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiAH;
},
/**
* opMod32RegByteC5(fn): mod=11 (src:reg) reg=000 (dst:AL) r/m=101 (CH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteC5(fn) {
var b = fn.call(this, this.regEAX & 0xff, (this.regECX >> 8) & 0xff);
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiCH;
},
/**
* opMod32RegByteC6(fn): mod=11 (src:reg) reg=000 (dst:AL) r/m=110 (DH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteC6(fn) {
var b = fn.call(this, this.regEAX & 0xff, (this.regEDX >> 8) & 0xff);
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiDH;
},
/**
* opMod32RegByteC7(fn): mod=11 (src:reg) reg=000 (dst:AL) r/m=111 (BH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteC7(fn) {
var b = fn.call(this, this.regEAX & 0xff, (this.regEBX >> 8) & 0xff);
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiBH;
},
/**
* opMod32RegByteC8(fn): mod=11 (src:reg) reg=001 (dst:CL) r/m=000 (AL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteC8(fn) {
var b = fn.call(this, this.regECX & 0xff, this.regEAX & 0xff);
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiAL;
},
/**
* opMod32RegByteC9(fn): mod=11 (src:reg) reg=001 (dst:CL) r/m=001 (CL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteC9(fn) {
var b = fn.call(this, this.regECX & 0xff, this.regECX & 0xff);
this.regECX = (this.regECX & ~0xff) | b;
},
/**
* opMod32RegByteCA(fn): mod=11 (src:reg) reg=001 (dst:CL) r/m=010 (DL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteCA(fn) {
var b = fn.call(this, this.regECX & 0xff, this.regEDX & 0xff);
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiDL;
},
/**
* opMod32RegByteCB(fn): mod=11 (src:reg) reg=001 (dst:CL) r/m=011 (BL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteCB(fn) {
var b = fn.call(this, this.regECX & 0xff, this.regEBX & 0xff);
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiBL;
},
/**
* opMod32RegByteCC(fn): mod=11 (src:reg) reg=001 (dst:CL) r/m=100 (AH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteCC(fn) {
var b = fn.call(this, this.regECX & 0xff, (this.regEAX >> 8) & 0xff);
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiAH;
},
/**
* opMod32RegByteCD(fn): mod=11 (src:reg) reg=001 (dst:CL) r/m=101 (CH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteCD(fn) {
var b = fn.call(this, this.regECX & 0xff, (this.regECX >> 8) & 0xff);
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiCH;
},
/**
* opMod32RegByteCE(fn): mod=11 (src:reg) reg=001 (dst:CL) r/m=110 (DH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteCE(fn) {
var b = fn.call(this, this.regECX & 0xff, (this.regEDX >> 8) & 0xff);
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiDH;
},
/**
* opMod32RegByteCF(fn): mod=11 (src:reg) reg=001 (dst:CL) r/m=111 (BH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteCF(fn) {
var b = fn.call(this, this.regECX & 0xff, (this.regEBX >> 8) & 0xff);
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiBH;
},
/**
* opMod32RegByteD0(fn): mod=11 (src:reg) reg=010 (dst:DL) r/m=000 (AL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteD0(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.regEAX & 0xff);
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiAL;
},
/**
* opMod32RegByteD1(fn): mod=11 (src:reg) reg=010 (dst:DL) r/m=001 (CL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteD1(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.regECX & 0xff);
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiCL;
},
/**
* opMod32RegByteD2(fn): mod=11 (src:reg) reg=010 (dst:DL) r/m=010 (DL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteD2(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.regEDX & 0xff);
this.regEDX = (this.regEDX & ~0xff) | b;
},
/**
* opMod32RegByteD3(fn): mod=11 (src:reg) reg=010 (dst:DL) r/m=011 (BL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteD3(fn) {
var b = fn.call(this, this.regEDX & 0xff, this.regEBX & 0xff);
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiBL;
},
/**
* opMod32RegByteD4(fn): mod=11 (src:reg) reg=010 (dst:DL) r/m=100 (AH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteD4(fn) {
var b = fn.call(this, this.regEDX & 0xff, (this.regEAX >> 8) & 0xff);
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiAH;
},
/**
* opMod32RegByteD5(fn): mod=11 (src:reg) reg=010 (dst:DL) r/m=101 (CH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteD5(fn) {
var b = fn.call(this, this.regEDX & 0xff, (this.regECX >> 8) & 0xff);
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiCH;
},
/**
* opMod32RegByteD6(fn): mod=11 (src:reg) reg=010 (dst:DL) r/m=110 (DH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteD6(fn) {
var b = fn.call(this, this.regEDX & 0xff, (this.regEDX >> 8) & 0xff);
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiDH;
},
/**
* opMod32RegByteD7(fn): mod=11 (src:reg) reg=010 (dst:DL) r/m=111 (BH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteD7(fn) {
var b = fn.call(this, this.regEDX & 0xff, (this.regEBX >> 8) & 0xff);
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiBH;
},
/**
* opMod32RegByteD8(fn): mod=11 (src:reg) reg=011 (dst:BL) r/m=000 (AL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteD8(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.regEAX & 0xff);
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiAL;
},
/**
* opMod32RegByteD9(fn): mod=11 (src:reg) reg=011 (dst:BL) r/m=001 (CL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteD9(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.regECX & 0xff);
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiCL;
},
/**
* opMod32RegByteDA(fn): mod=11 (src:reg) reg=011 (dst:BL) r/m=010 (DL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteDA(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.regEDX & 0xff);
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiDL;
},
/**
* opMod32RegByteDB(fn): mod=11 (src:reg) reg=011 (dst:BL) r/m=011 (BL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteDB(fn) {
var b = fn.call(this, this.regEBX & 0xff, this.regEBX & 0xff);
this.regEBX = (this.regEBX & ~0xff) | b;
},
/**
* opMod32RegByteDC(fn): mod=11 (src:reg) reg=011 (dst:BL) r/m=100 (AH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteDC(fn) {
var b = fn.call(this, this.regEBX & 0xff, (this.regEAX >> 8) & 0xff);
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiAH;
},
/**
* opMod32RegByteDD(fn): mod=11 (src:reg) reg=011 (dst:BL) r/m=101 (CH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteDD(fn) {
var b = fn.call(this, this.regEBX & 0xff, (this.regECX >> 8) & 0xff);
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiCH;
},
/**
* opMod32RegByteDE(fn): mod=11 (src:reg) reg=011 (dst:BL) r/m=110 (DH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteDE(fn) {
var b = fn.call(this, this.regEBX & 0xff, (this.regEDX >> 8) & 0xff);
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiDH;
},
/**
* opMod32RegByteDF(fn): mod=11 (src:reg) reg=011 (dst:BL) r/m=111 (BH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteDF(fn) {
var b = fn.call(this, this.regEBX & 0xff, (this.regEBX >> 8) & 0xff);
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiBH;
},
/**
* opMod32RegByteE0(fn): mod=11 (src:reg) reg=100 (dst:AH) r/m=000 (AL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteE0(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.regEAX & 0xff);
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiAL;
},
/**
* opMod32RegByteE1(fn): mod=11 (src:reg) reg=100 (dst:AH) r/m=001 (CL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteE1(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.regECX & 0xff);
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiCL;
},
/**
* opMod32RegByteE2(fn): mod=11 (src:reg) reg=100 (dst:AH) r/m=010 (DL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteE2(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.regEDX & 0xff);
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiDL;
},
/**
* opMod32RegByteE3(fn): mod=11 (src:reg) reg=100 (dst:AH) r/m=011 (BL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteE3(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.regEBX & 0xff);
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiBL;
},
/**
* opMod32RegByteE4(fn): mod=11 (src:reg) reg=100 (dst:AH) r/m=100 (AH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteE4(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, (this.regEAX >> 8) & 0xff);
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
},
/**
* opMod32RegByteE5(fn): mod=11 (src:reg) reg=100 (dst:AH) r/m=101 (CH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteE5(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, (this.regECX >> 8) & 0xff);
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiCH;
},
/**
* opMod32RegByteE6(fn): mod=11 (src:reg) reg=100 (dst:AH) r/m=110 (DH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteE6(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, (this.regEDX >> 8) & 0xff);
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiDH;
},
/**
* opMod32RegByteE7(fn): mod=11 (src:reg) reg=100 (dst:AH) r/m=111 (BH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteE7(fn) {
var b = fn.call(this, (this.regEAX >> 8) & 0xff, (this.regEBX >> 8) & 0xff);
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiBH;
},
/**
* opMod32RegByteE8(fn): mod=11 (src:reg) reg=101 (dst:CH) r/m=000 (AL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteE8(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.regEAX & 0xff);
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiAL;
},
/**
* opMod32RegByteE9(fn): mod=11 (src:reg) reg=101 (dst:CH) r/m=001 (CL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteE9(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.regECX & 0xff);
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiCL;
},
/**
* opMod32RegByteEA(fn): mod=11 (src:reg) reg=101 (dst:CH) r/m=010 (DL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteEA(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.regEDX & 0xff);
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiDL;
},
/**
* opMod32RegByteEB(fn): mod=11 (src:reg) reg=101 (dst:CH) r/m=011 (BL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteEB(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, this.regEBX & 0xff);
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiBL;
},
/**
* opMod32RegByteEC(fn): mod=11 (src:reg) reg=101 (dst:CH) r/m=100 (AH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteEC(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, (this.regEAX >> 8) & 0xff);
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiAH;
},
/**
* opMod32RegByteED(fn): mod=11 (src:reg) reg=101 (dst:CH) r/m=101 (CH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteED(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, (this.regECX >> 8) & 0xff);
this.regECX = (this.regECX & ~0xff00) | (b << 8);
},
/**
* opMod32RegByteEE(fn): mod=11 (src:reg) reg=101 (dst:CH) r/m=110 (DH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteEE(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, (this.regEDX >> 8) & 0xff);
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiDH;
},
/**
* opMod32RegByteEF(fn): mod=11 (src:reg) reg=101 (dst:CH) r/m=111 (BH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteEF(fn) {
var b = fn.call(this, (this.regECX >> 8) & 0xff, (this.regEBX >> 8) & 0xff);
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiBH;
},
/**
* opMod32RegByteF0(fn): mod=11 (src:reg) reg=110 (dst:DH) r/m=000 (AL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteF0(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.regEAX & 0xff);
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiAL;
},
/**
* opMod32RegByteF1(fn): mod=11 (src:reg) reg=110 (dst:DH) r/m=001 (CL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteF1(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.regECX & 0xff);
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiCL;
},
/**
* opMod32RegByteF2(fn): mod=11 (src:reg) reg=110 (dst:DH) r/m=010 (DL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteF2(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.regEDX & 0xff);
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiDL;
},
/**
* opMod32RegByteF3(fn): mod=11 (src:reg) reg=110 (dst:DH) r/m=011 (BL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteF3(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.regEBX & 0xff);
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiBL;
},
/**
* opMod32RegByteF4(fn): mod=11 (src:reg) reg=110 (dst:DH) r/m=100 (AH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteF4(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, (this.regEAX >> 8) & 0xff);
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiAH;
},
/**
* opMod32RegByteF5(fn): mod=11 (src:reg) reg=110 (dst:DH) r/m=101 (CH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteF5(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, (this.regECX >> 8) & 0xff);
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiCH;
},
/**
* opMod32RegByteF6(fn): mod=11 (src:reg) reg=110 (dst:DH) r/m=110 (DH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteF6(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, (this.regEDX >> 8) & 0xff);
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
},
/**
* opMod32RegByteF7(fn): mod=11 (src:reg) reg=110 (dst:DH) r/m=111 (BH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteF7(fn) {
var b = fn.call(this, (this.regEDX >> 8) & 0xff, (this.regEBX >> 8) & 0xff);
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiBH;
},
/**
* opMod32RegByteF8(fn): mod=11 (src:reg) reg=111 (dst:BH) r/m=000 (AL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteF8(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.regEAX & 0xff);
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiAL;
},
/**
* opMod32RegByteF9(fn): mod=11 (src:reg) reg=111 (dst:BH) r/m=001 (CL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteF9(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.regECX & 0xff);
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiCL;
},
/**
* opMod32RegByteFA(fn): mod=11 (src:reg) reg=111 (dst:BH) r/m=010 (DL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteFA(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.regEDX & 0xff);
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiDL;
},
/**
* opMod32RegByteFB(fn): mod=11 (src:reg) reg=111 (dst:BH) r/m=011 (BL)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteFB(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.regEBX & 0xff);
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiBL;
},
/**
* opMod32RegByteFC(fn): mod=11 (src:reg) reg=111 (dst:BH) r/m=100 (AH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteFC(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, (this.regEAX >> 8) & 0xff);
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiAH;
},
/**
* opMod32RegByteFD(fn): mod=11 (src:reg) reg=111 (dst:BH) r/m=101 (CH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteFD(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, (this.regECX >> 8) & 0xff);
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiCH;
},
/**
* opMod32RegByteFE(fn): mod=11 (src:reg) reg=111 (dst:BH) r/m=110 (DH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteFE(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, (this.regEDX >> 8) & 0xff);
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiDH;
},
/**
* opMod32RegByteFF(fn): mod=11 (src:reg) reg=111 (dst:BH) r/m=111 (BH)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegByteFF(fn) {
var b = fn.call(this, (this.regEBX >> 8) & 0xff, (this.regEBX >> 8) & 0xff);
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
}
];
X86ModB32.aOpModMem = [
/**
* opMod32MemByte00(fn): mod=00 (dst:mem) reg=000 (src:AL) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte00(fn) {
var b = fn.call(this, this.modEAByteData(this.regEAX), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte01(fn): mod=00 (dst:mem) reg=000 (src:AL) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte01(fn) {
var b = fn.call(this, this.modEAByteData(this.regECX), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte02(fn): mod=00 (dst:mem) reg=000 (src:AL) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte02(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDX), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte03(fn): mod=00 (dst:mem) reg=000 (src:AL) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte03(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte04(fn): mod=00 (dst:mem) reg=000 (src:AL) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte04(fn) {
var b = fn.call(this, this.modEAByteData(this.getSIBAddr(0)), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte05(fn): mod=00 (dst:mem) reg=000 (src:AL) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte05(fn) {
var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32MemByte06(fn): mod=00 (dst:mem) reg=000 (src:AL) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte06(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte07(fn): mod=00 (dst:mem) reg=000 (src:AL) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte07(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte08(fn): mod=00 (dst:mem) reg=001 (src:CL) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte08(fn) {
var b = fn.call(this, this.modEAByteData(this.regEAX), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte09(fn): mod=00 (dst:mem) reg=001 (src:CL) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte09(fn) {
var b = fn.call(this, this.modEAByteData(this.regECX), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte0A(fn): mod=00 (dst:mem) reg=001 (src:CL) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte0A(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDX), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte0B(fn): mod=00 (dst:mem) reg=001 (src:CL) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte0B(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte0C(fn): mod=00 (dst:mem) reg=001 (src:CL) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte0C(fn) {
var b = fn.call(this, this.modEAByteData(this.getSIBAddr(0)), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte0D(fn): mod=00 (dst:mem) reg=001 (src:CL) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte0D(fn) {
var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32MemByte0E(fn): mod=00 (dst:mem) reg=001 (src:CL) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte0E(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte0F(fn): mod=00 (dst:mem) reg=001 (src:CL) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte0F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte10(fn): mod=00 (dst:mem) reg=010 (src:DL) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte10(fn) {
var b = fn.call(this, this.modEAByteData(this.regEAX), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte11(fn): mod=00 (dst:mem) reg=010 (src:DL) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte11(fn) {
var b = fn.call(this, this.modEAByteData(this.regECX), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte12(fn): mod=00 (dst:mem) reg=010 (src:DL) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte12(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDX), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte13(fn): mod=00 (dst:mem) reg=010 (src:DL) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte13(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte14(fn): mod=00 (dst:mem) reg=010 (src:DL) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte14(fn) {
var b = fn.call(this, this.modEAByteData(this.getSIBAddr(0)), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte15(fn): mod=00 (dst:mem) reg=010 (src:DL) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte15(fn) {
var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32MemByte16(fn): mod=00 (dst:mem) reg=010 (src:DL) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte16(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte17(fn): mod=00 (dst:mem) reg=010 (src:DL) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte17(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte18(fn): mod=00 (dst:mem) reg=011 (src:BL) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte18(fn) {
var b = fn.call(this, this.modEAByteData(this.regEAX), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte19(fn): mod=00 (dst:mem) reg=011 (src:BL) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte19(fn) {
var b = fn.call(this, this.modEAByteData(this.regECX), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte1A(fn): mod=00 (dst:mem) reg=011 (src:BL) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte1A(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDX), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte1B(fn): mod=00 (dst:mem) reg=011 (src:BL) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte1B(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte1C(fn): mod=00 (dst:mem) reg=011 (src:BL) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte1C(fn) {
var b = fn.call(this, this.modEAByteData(this.getSIBAddr(0)), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte1D(fn): mod=00 (dst:mem) reg=011 (src:BL) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte1D(fn) {
var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32MemByte1E(fn): mod=00 (dst:mem) reg=011 (src:BL) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte1E(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte1F(fn): mod=00 (dst:mem) reg=011 (src:BL) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte1F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte20(fn): mod=00 (dst:mem) reg=100 (src:AH) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte20(fn) {
var b = fn.call(this, this.modEAByteData(this.regEAX), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte21(fn): mod=00 (dst:mem) reg=100 (src:AH) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte21(fn) {
var b = fn.call(this, this.modEAByteData(this.regECX), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte22(fn): mod=00 (dst:mem) reg=100 (src:AH) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte22(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDX), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte23(fn): mod=00 (dst:mem) reg=100 (src:AH) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte23(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte24(fn): mod=00 (dst:mem) reg=100 (src:AH) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte24(fn) {
var b = fn.call(this, this.modEAByteData(this.getSIBAddr(0)), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte25(fn): mod=00 (dst:mem) reg=100 (src:AH) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte25(fn) {
var b = fn.call(this, this.modEAByteData(this.getIPAddr()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32MemByte26(fn): mod=00 (dst:mem) reg=100 (src:AH) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte26(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte27(fn): mod=00 (dst:mem) reg=100 (src:AH) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte27(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte28(fn): mod=00 (dst:mem) reg=101 (src:CH) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte28(fn) {
var b = fn.call(this, this.modEAByteData(this.regEAX), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte29(fn): mod=00 (dst:mem) reg=101 (src:CH) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte29(fn) {
var b = fn.call(this, this.modEAByteData(this.regECX), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte2A(fn): mod=00 (dst:mem) reg=101 (src:CH) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte2A(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDX), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte2B(fn): mod=00 (dst:mem) reg=101 (src:CH) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte2B(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte2C(fn): mod=00 (dst:mem) reg=101 (src:CH) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte2C(fn) {
var b = fn.call(this, this.modEAByteData(this.getSIBAddr(0)), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte2D(fn): mod=00 (dst:mem) reg=101 (src:CH) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte2D(fn) {
var b = fn.call(this, this.modEAByteData(this.getIPAddr()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32MemByte2E(fn): mod=00 (dst:mem) reg=101 (src:CH) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte2E(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte2F(fn): mod=00 (dst:mem) reg=101 (src:CH) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte2F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte30(fn): mod=00 (dst:mem) reg=110 (src:DH) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte30(fn) {
var b = fn.call(this, this.modEAByteData(this.regEAX), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte31(fn): mod=00 (dst:mem) reg=110 (src:DH) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte31(fn) {
var b = fn.call(this, this.modEAByteData(this.regECX), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte32(fn): mod=00 (dst:mem) reg=110 (src:DH) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte32(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDX), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte33(fn): mod=00 (dst:mem) reg=110 (src:DH) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte33(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte34(fn): mod=00 (dst:mem) reg=110 (src:DH) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte34(fn) {
var b = fn.call(this, this.modEAByteData(this.getSIBAddr(0)), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte35(fn): mod=00 (dst:mem) reg=110 (src:DH) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte35(fn) {
var b = fn.call(this, this.modEAByteData(this.getIPAddr()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32MemByte36(fn): mod=00 (dst:mem) reg=110 (src:DH) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte36(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte37(fn): mod=00 (dst:mem) reg=110 (src:DH) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte37(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte38(fn): mod=00 (dst:mem) reg=111 (src:BH) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte38(fn) {
var b = fn.call(this, this.modEAByteData(this.regEAX), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte39(fn): mod=00 (dst:mem) reg=111 (src:BH) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte39(fn) {
var b = fn.call(this, this.modEAByteData(this.regECX), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte3A(fn): mod=00 (dst:mem) reg=111 (src:BH) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte3A(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDX), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte3B(fn): mod=00 (dst:mem) reg=111 (src:BH) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte3B(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte3C(fn): mod=00 (dst:mem) reg=111 (src:BH) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte3C(fn) {
var b = fn.call(this, this.modEAByteData(this.getSIBAddr(0)), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte3D(fn): mod=00 (dst:mem) reg=111 (src:BH) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte3D(fn) {
var b = fn.call(this, this.modEAByteData(this.getIPAddr()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32MemByte3E(fn): mod=00 (dst:mem) reg=111 (src:BH) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte3E(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte3F(fn): mod=00 (dst:mem) reg=111 (src:BH) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte3F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemByte40(fn): mod=01 (dst:mem+d8) reg=000 (src:AL) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte40(fn) {
var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte41(fn): mod=01 (dst:mem+d8) reg=000 (src:AL) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte41(fn) {
var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPDisp()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte42(fn): mod=01 (dst:mem+d8) reg=000 (src:AL) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte42(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte43(fn): mod=01 (dst:mem+d8) reg=000 (src:AL) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte43(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte44(fn): mod=01 (dst:mem+d8) reg=000 (src:AL) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte44(fn) {
var b = fn.call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte45(fn): mod=01 (dst:mem+d8) reg=000 (src:AL) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte45(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte46(fn): mod=01 (dst:mem+d8) reg=000 (src:AL) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte46(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte47(fn): mod=01 (dst:mem+d8) reg=000 (src:AL) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte47(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte48(fn): mod=01 (dst:mem+d8) reg=001 (src:CL) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte48(fn) {
var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte49(fn): mod=01 (dst:mem+d8) reg=001 (src:CL) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte49(fn) {
var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPDisp()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte4A(fn): mod=01 (dst:mem+d8) reg=001 (src:CL) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte4A(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte4B(fn): mod=01 (dst:mem+d8) reg=001 (src:CL) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte4B(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte4C(fn): mod=01 (dst:mem+d8) reg=001 (src:CL) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte4C(fn) {
var b = fn.call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte4D(fn): mod=01 (dst:mem+d8) reg=001 (src:CL) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte4D(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte4E(fn): mod=01 (dst:mem+d8) reg=001 (src:CL) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte4E(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte4F(fn): mod=01 (dst:mem+d8) reg=001 (src:CL) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte4F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte50(fn): mod=01 (dst:mem+d8) reg=010 (src:DL) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte50(fn) {
var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte51(fn): mod=01 (dst:mem+d8) reg=010 (src:DL) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte51(fn) {
var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPDisp()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte52(fn): mod=01 (dst:mem+d8) reg=010 (src:DL) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte52(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte53(fn): mod=01 (dst:mem+d8) reg=010 (src:DL) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte53(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte54(fn): mod=01 (dst:mem+d8) reg=010 (src:DL) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte54(fn) {
var b = fn.call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte55(fn): mod=01 (dst:mem+d8) reg=010 (src:DL) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte55(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte56(fn): mod=01 (dst:mem+d8) reg=010 (src:DL) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte56(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte57(fn): mod=01 (dst:mem+d8) reg=010 (src:DL) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte57(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte58(fn): mod=01 (dst:mem+d8) reg=011 (src:BL) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte58(fn) {
var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte59(fn): mod=01 (dst:mem+d8) reg=011 (src:BL) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte59(fn) {
var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPDisp()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte5A(fn): mod=01 (dst:mem+d8) reg=011 (src:BL) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte5A(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte5B(fn): mod=01 (dst:mem+d8) reg=011 (src:BL) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte5B(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte5C(fn): mod=01 (dst:mem+d8) reg=011 (src:BL) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte5C(fn) {
var b = fn.call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte5D(fn): mod=01 (dst:mem+d8) reg=011 (src:BL) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte5D(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte5E(fn): mod=01 (dst:mem+d8) reg=011 (src:BL) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte5E(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte5F(fn): mod=01 (dst:mem+d8) reg=011 (src:BL) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte5F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte60(fn): mod=01 (dst:mem+d8) reg=100 (src:AH) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte60(fn) {
var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte61(fn): mod=01 (dst:mem+d8) reg=100 (src:AH) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte61(fn) {
var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte62(fn): mod=01 (dst:mem+d8) reg=100 (src:AH) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte62(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte63(fn): mod=01 (dst:mem+d8) reg=100 (src:AH) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte63(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte64(fn): mod=01 (dst:mem+d8) reg=100 (src:AH) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte64(fn) {
var b = fn.call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte65(fn): mod=01 (dst:mem+d8) reg=100 (src:AH) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte65(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte66(fn): mod=01 (dst:mem+d8) reg=100 (src:AH) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte66(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte67(fn): mod=01 (dst:mem+d8) reg=100 (src:AH) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte67(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte68(fn): mod=01 (dst:mem+d8) reg=101 (src:CH) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte68(fn) {
var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte69(fn): mod=01 (dst:mem+d8) reg=101 (src:CH) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte69(fn) {
var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPDisp()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte6A(fn): mod=01 (dst:mem+d8) reg=101 (src:CH) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte6A(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte6B(fn): mod=01 (dst:mem+d8) reg=101 (src:CH) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte6B(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte6C(fn): mod=01 (dst:mem+d8) reg=101 (src:CH) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte6C(fn) {
var b = fn.call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte6D(fn): mod=01 (dst:mem+d8) reg=101 (src:CH) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte6D(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte6E(fn): mod=01 (dst:mem+d8) reg=101 (src:CH) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte6E(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte6F(fn): mod=01 (dst:mem+d8) reg=101 (src:CH) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte6F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte70(fn): mod=01 (dst:mem+d8) reg=110 (src:DH) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte70(fn) {
var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte71(fn): mod=01 (dst:mem+d8) reg=110 (src:DH) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte71(fn) {
var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte72(fn): mod=01 (dst:mem+d8) reg=110 (src:DH) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte72(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte73(fn): mod=01 (dst:mem+d8) reg=110 (src:DH) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte73(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte74(fn): mod=01 (dst:mem+d8) reg=110 (src:DH) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte74(fn) {
var b = fn.call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte75(fn): mod=01 (dst:mem+d8) reg=110 (src:DH) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte75(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte76(fn): mod=01 (dst:mem+d8) reg=110 (src:DH) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte76(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte77(fn): mod=01 (dst:mem+d8) reg=110 (src:DH) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte77(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte78(fn): mod=01 (dst:mem+d8) reg=111 (src:BH) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte78(fn) {
var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte79(fn): mod=01 (dst:mem+d8) reg=111 (src:BH) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte79(fn) {
var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte7A(fn): mod=01 (dst:mem+d8) reg=111 (src:BH) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte7A(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte7B(fn): mod=01 (dst:mem+d8) reg=111 (src:BH) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte7B(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte7C(fn): mod=01 (dst:mem+d8) reg=111 (src:BH) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte7C(fn) {
var b = fn.call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte7D(fn): mod=01 (dst:mem+d8) reg=111 (src:BH) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte7D(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte7E(fn): mod=01 (dst:mem+d8) reg=111 (src:BH) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte7E(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte7F(fn): mod=01 (dst:mem+d8) reg=111 (src:BH) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte7F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte80(fn): mod=10 (dst:mem+d16) reg=000 (src:AL) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte80(fn) {
var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte81(fn): mod=10 (dst:mem+d16) reg=000 (src:AL) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte81(fn) {
var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPAddr()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte82(fn): mod=10 (dst:mem+d16) reg=000 (src:AL) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte82(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte83(fn): mod=10 (dst:mem+d16) reg=000 (src:AL) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte83(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte84(fn): mod=10 (dst:mem+d16) reg=000 (src:AL) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte84(fn) {
var b = fn.call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte85(fn): mod=10 (dst:mem+d16) reg=000 (src:AL) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte85(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte86(fn): mod=10 (dst:mem+d16) reg=000 (src:AL) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte86(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte87(fn): mod=10 (dst:mem+d16) reg=000 (src:AL) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte87(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEAX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte88(fn): mod=10 (dst:mem+d16) reg=001 (src:CL) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte88(fn) {
var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte89(fn): mod=10 (dst:mem+d16) reg=001 (src:CL) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte89(fn) {
var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPAddr()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte8A(fn): mod=10 (dst:mem+d16) reg=001 (src:CL) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte8A(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte8B(fn): mod=10 (dst:mem+d16) reg=001 (src:CL) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte8B(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte8C(fn): mod=10 (dst:mem+d16) reg=001 (src:CL) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte8C(fn) {
var b = fn.call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte8D(fn): mod=10 (dst:mem+d16) reg=001 (src:CL) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte8D(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte8E(fn): mod=10 (dst:mem+d16) reg=001 (src:CL) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte8E(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte8F(fn): mod=10 (dst:mem+d16) reg=001 (src:CL) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte8F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regECX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte90(fn): mod=10 (dst:mem+d16) reg=010 (src:DL) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte90(fn) {
var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte91(fn): mod=10 (dst:mem+d16) reg=010 (src:DL) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte91(fn) {
var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPAddr()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte92(fn): mod=10 (dst:mem+d16) reg=010 (src:DL) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte92(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte93(fn): mod=10 (dst:mem+d16) reg=010 (src:DL) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte93(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte94(fn): mod=10 (dst:mem+d16) reg=010 (src:DL) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte94(fn) {
var b = fn.call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte95(fn): mod=10 (dst:mem+d16) reg=010 (src:DL) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte95(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte96(fn): mod=10 (dst:mem+d16) reg=010 (src:DL) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte96(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte97(fn): mod=10 (dst:mem+d16) reg=010 (src:DL) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte97(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEDX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte98(fn): mod=10 (dst:mem+d16) reg=011 (src:BL) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte98(fn) {
var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte99(fn): mod=10 (dst:mem+d16) reg=011 (src:BL) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte99(fn) {
var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPAddr()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte9A(fn): mod=10 (dst:mem+d16) reg=011 (src:BL) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte9A(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte9B(fn): mod=10 (dst:mem+d16) reg=011 (src:BL) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte9B(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte9C(fn): mod=10 (dst:mem+d16) reg=011 (src:BL) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte9C(fn) {
var b = fn.call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte9D(fn): mod=10 (dst:mem+d16) reg=011 (src:BL) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte9D(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte9E(fn): mod=10 (dst:mem+d16) reg=011 (src:BL) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte9E(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByte9F(fn): mod=10 (dst:mem+d16) reg=011 (src:BL) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByte9F(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEBX & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteA0(fn): mod=10 (dst:mem+d16) reg=100 (src:AH) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteA0(fn) {
var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteA1(fn): mod=10 (dst:mem+d16) reg=100 (src:AH) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteA1(fn) {
var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteA2(fn): mod=10 (dst:mem+d16) reg=100 (src:AH) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteA2(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteA3(fn): mod=10 (dst:mem+d16) reg=100 (src:AH) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteA3(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteA4(fn): mod=10 (dst:mem+d16) reg=100 (src:AH) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteA4(fn) {
var b = fn.call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteA5(fn): mod=10 (dst:mem+d16) reg=100 (src:AH) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteA5(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteA6(fn): mod=10 (dst:mem+d16) reg=100 (src:AH) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteA6(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteA7(fn): mod=10 (dst:mem+d16) reg=100 (src:AH) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteA7(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteA8(fn): mod=10 (dst:mem+d16) reg=101 (src:CH) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteA8(fn) {
var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteA9(fn): mod=10 (dst:mem+d16) reg=101 (src:CH) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteA9(fn) {
var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPAddr()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteAA(fn): mod=10 (dst:mem+d16) reg=101 (src:CH) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteAA(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteAB(fn): mod=10 (dst:mem+d16) reg=101 (src:CH) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteAB(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteAC(fn): mod=10 (dst:mem+d16) reg=101 (src:CH) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteAC(fn) {
var b = fn.call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteAD(fn): mod=10 (dst:mem+d16) reg=101 (src:CH) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteAD(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteAE(fn): mod=10 (dst:mem+d16) reg=101 (src:CH) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteAE(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteAF(fn): mod=10 (dst:mem+d16) reg=101 (src:CH) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteAF(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), (this.regECX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteB0(fn): mod=10 (dst:mem+d16) reg=110 (src:DH) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteB0(fn) {
var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteB1(fn): mod=10 (dst:mem+d16) reg=110 (src:DH) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteB1(fn) {
var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteB2(fn): mod=10 (dst:mem+d16) reg=110 (src:DH) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteB2(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteB3(fn): mod=10 (dst:mem+d16) reg=110 (src:DH) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteB3(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteB4(fn): mod=10 (dst:mem+d16) reg=110 (src:DH) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteB4(fn) {
var b = fn.call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteB5(fn): mod=10 (dst:mem+d16) reg=110 (src:DH) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteB5(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteB6(fn): mod=10 (dst:mem+d16) reg=110 (src:DH) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteB6(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteB7(fn): mod=10 (dst:mem+d16) reg=110 (src:DH) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteB7(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteB8(fn): mod=10 (dst:mem+d16) reg=111 (src:BH) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteB8(fn) {
var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteB9(fn): mod=10 (dst:mem+d16) reg=111 (src:BH) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteB9(fn) {
var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteBA(fn): mod=10 (dst:mem+d16) reg=111 (src:BH) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteBA(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteBB(fn): mod=10 (dst:mem+d16) reg=111 (src:BH) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteBB(fn) {
var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteBC(fn): mod=10 (dst:mem+d16) reg=111 (src:BH) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteBC(fn) {
var b = fn.call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteBD(fn): mod=10 (dst:mem+d16) reg=111 (src:BH) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteBD(fn) {
var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteBE(fn): mod=10 (dst:mem+d16) reg=111 (src:BH) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteBE(fn) {
var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemByteBF(fn): mod=10 (dst:mem+d16) reg=111 (src:BH) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemByteBF(fn) {
var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
X86ModB32.aOpModReg[0xC0], X86ModB32.aOpModReg[0xC8], X86ModB32.aOpModReg[0xD0], X86ModB32.aOpModReg[0xD8],
X86ModB32.aOpModReg[0xE0], X86ModB32.aOpModReg[0xE8], X86ModB32.aOpModReg[0xF0], X86ModB32.aOpModReg[0xF8],
X86ModB32.aOpModReg[0xC1], X86ModB32.aOpModReg[0xC9], X86ModB32.aOpModReg[0xD1], X86ModB32.aOpModReg[0xD9],
X86ModB32.aOpModReg[0xE1], X86ModB32.aOpModReg[0xE9], X86ModB32.aOpModReg[0xF1], X86ModB32.aOpModReg[0xF9],
X86ModB32.aOpModReg[0xC2], X86ModB32.aOpModReg[0xCA], X86ModB32.aOpModReg[0xD2], X86ModB32.aOpModReg[0xDA],
X86ModB32.aOpModReg[0xE2], X86ModB32.aOpModReg[0xEA], X86ModB32.aOpModReg[0xF2], X86ModB32.aOpModReg[0xFA],
X86ModB32.aOpModReg[0xC3], X86ModB32.aOpModReg[0xCB], X86ModB32.aOpModReg[0xD3], X86ModB32.aOpModReg[0xDB],
X86ModB32.aOpModReg[0xE3], X86ModB32.aOpModReg[0xEB], X86ModB32.aOpModReg[0xF3], X86ModB32.aOpModReg[0xFB],
X86ModB32.aOpModReg[0xC4], X86ModB32.aOpModReg[0xCC], X86ModB32.aOpModReg[0xD4], X86ModB32.aOpModReg[0xDC],
X86ModB32.aOpModReg[0xE4], X86ModB32.aOpModReg[0xEC], X86ModB32.aOpModReg[0xF4], X86ModB32.aOpModReg[0xFC],
X86ModB32.aOpModReg[0xC5], X86ModB32.aOpModReg[0xCD], X86ModB32.aOpModReg[0xD5], X86ModB32.aOpModReg[0xDD],
X86ModB32.aOpModReg[0xE5], X86ModB32.aOpModReg[0xED], X86ModB32.aOpModReg[0xF5], X86ModB32.aOpModReg[0xFD],
X86ModB32.aOpModReg[0xC6], X86ModB32.aOpModReg[0xCE], X86ModB32.aOpModReg[0xD6], X86ModB32.aOpModReg[0xDE],
X86ModB32.aOpModReg[0xE6], X86ModB32.aOpModReg[0xEE], X86ModB32.aOpModReg[0xF6], X86ModB32.aOpModReg[0xFE],
X86ModB32.aOpModReg[0xC7], X86ModB32.aOpModReg[0xCF], X86ModB32.aOpModReg[0xD7], X86ModB32.aOpModReg[0xDF],
X86ModB32.aOpModReg[0xE7], X86ModB32.aOpModReg[0xEF], X86ModB32.aOpModReg[0xF7], X86ModB32.aOpModReg[0xFF]
];
X86ModB32.aOpModGrp = [
/**
* opMod32GrpByte00(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte00(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEAX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte01(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte01(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regECX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte02(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte02(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEDX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte03(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte03(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte04(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=100 (sib)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte04(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.getSIBAddr(0)), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte05(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=101 (d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte05(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32GrpByte06(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte06(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte07(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte07(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte08(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte08(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEAX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte09(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte09(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regECX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte0A(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte0A(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEDX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte0B(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte0B(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte0C(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=100 (sib)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte0C(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.getSIBAddr(0)), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte0D(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=101 (d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte0D(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32GrpByte0E(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte0E(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte0F(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte0F(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte10(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte10(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEAX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte11(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte11(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regECX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte12(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte12(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEDX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte13(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte13(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte14(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=100 (sib)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte14(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.getSIBAddr(0)), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte15(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=101 (d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte15(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32GrpByte16(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte16(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte17(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte17(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte18(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte18(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEAX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte19(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte19(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regECX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte1A(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte1A(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEDX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte1B(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte1B(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte1C(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=100 (sib)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte1C(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.getSIBAddr(0)), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte1D(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=101 (d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte1D(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32GrpByte1E(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte1E(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte1F(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte1F(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte20(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte20(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEAX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte21(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte21(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regECX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte22(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte22(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEDX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte23(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte23(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte24(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=100 (sib)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte24(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.getSIBAddr(0)), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte25(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=101 (d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte25(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32GrpByte26(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte26(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte27(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte27(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte28(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte28(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEAX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte29(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte29(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regECX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte2A(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte2A(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEDX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte2B(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte2B(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte2C(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=100 (sib)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte2C(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.getSIBAddr(0)), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte2D(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=101 (d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte2D(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32GrpByte2E(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte2E(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte2F(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte2F(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte30(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte30(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEAX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte31(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte31(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regECX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte32(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte32(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEDX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte33(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte33(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte34(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=100 (sib)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte34(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.getSIBAddr(0)), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte35(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=101 (d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte35(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32GrpByte36(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte36(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte37(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte37(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte38(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte38(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEAX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte39(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte39(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regECX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte3A(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte3A(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEDX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte3B(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte3B(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte3C(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=100 (sib)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte3C(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.getSIBAddr(0)), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte3D(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=101 (d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte3D(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32GrpByte3E(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte3E(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte3F(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte3F(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpByte40(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte40(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte41(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte41(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regECX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte42(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte42(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte43(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte43(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte44(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte44(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte45(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte45(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte46(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte46(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte47(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte47(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte48(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte48(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte49(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte49(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regECX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte4A(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte4A(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte4B(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte4B(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte4C(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte4C(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte4D(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte4D(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte4E(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte4E(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte4F(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte4F(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte50(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte50(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte51(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte51(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regECX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte52(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte52(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte53(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte53(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte54(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte54(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte55(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte55(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte56(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte56(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte57(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte57(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte58(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte58(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte59(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte59(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regECX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte5A(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte5A(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte5B(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte5B(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte5C(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte5C(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte5D(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte5D(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte5E(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte5E(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte5F(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte5F(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte60(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte60(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte61(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte61(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regECX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte62(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte62(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte63(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte63(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte64(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte64(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte65(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte65(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte66(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte66(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte67(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte67(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte68(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte68(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte69(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte69(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regECX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte6A(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte6A(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte6B(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte6B(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte6C(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte6C(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte6D(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte6D(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte6E(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte6E(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte6F(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte6F(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte70(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte70(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte71(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte71(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regECX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte72(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte72(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte73(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte73(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte74(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte74(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte75(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte75(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte76(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte76(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte77(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte77(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte78(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte78(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte79(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte79(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regECX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte7A(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte7A(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte7B(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte7B(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte7C(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte7C(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte7D(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte7D(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte7E(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte7E(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte7F(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte7F(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte80(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte80(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte81(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte81(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regECX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte82(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte82(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte83(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte83(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte84(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte84(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte85(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte85(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte86(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte86(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte87(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte87(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte88(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte88(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte89(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte89(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regECX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte8A(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte8A(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte8B(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte8B(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte8C(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte8C(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte8D(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte8D(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte8E(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte8E(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte8F(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte8F(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte90(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte90(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte91(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte91(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regECX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte92(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte92(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte93(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte93(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte94(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte94(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte95(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte95(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte96(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte96(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte97(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte97(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte98(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte98(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte99(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte99(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regECX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte9A(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte9A(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte9B(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte9B(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte9C(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte9C(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte9D(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte9D(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte9E(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte9E(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByte9F(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByte9F(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteA0(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteA0(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteA1(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteA1(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regECX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteA2(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteA2(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteA3(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteA3(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteA4(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteA4(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteA5(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteA5(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteA6(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteA6(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteA7(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteA7(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteA8(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteA8(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteA9(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteA9(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regECX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteAA(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteAA(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteAB(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteAB(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteAC(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteAC(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteAD(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteAD(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteAE(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteAE(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteAF(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteAF(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteB0(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteB0(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteB1(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteB1(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regECX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteB2(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteB2(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteB3(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteB3(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteB4(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteB4(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteB5(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteB5(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteB6(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteB6(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteB7(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteB7(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteB8(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteB8(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteB9(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteB9(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regECX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteBA(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteBA(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteBB(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteBB(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteBC(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteBC(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteBD(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteBD(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteBE(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteBE(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteBF(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteBF(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAByte(b);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpByteC0(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=000 (AL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteC0(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.regEAX & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteC1(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=001 (CL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteC1(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.regECX & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteC2(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=010 (DL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteC2(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.regEDX & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteC3(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=011 (BL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteC3(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, this.regEBX & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteC4(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=100 (AH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteC4(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteC5(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=101 (CH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteC5(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteC6(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=110 (DH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteC6(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteC7(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=111 (BH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteC7(afnGrp, fnSrc) {
var b = afnGrp[0].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteC8(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=000 (AL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteC8(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.regEAX & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteC9(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=001 (CL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteC9(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.regECX & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteCA(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=010 (DL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteCA(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.regEDX & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteCB(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=011 (BL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteCB(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, this.regEBX & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteCC(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=100 (AH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteCC(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteCD(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=101 (CH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteCD(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteCE(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=110 (DH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteCE(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteCF(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=111 (BH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteCF(afnGrp, fnSrc) {
var b = afnGrp[1].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteD0(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=000 (AL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteD0(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.regEAX & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteD1(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=001 (CL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteD1(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.regECX & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteD2(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=010 (DL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteD2(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.regEDX & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteD3(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=011 (BL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteD3(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, this.regEBX & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteD4(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=100 (AH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteD4(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteD5(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=101 (CH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteD5(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteD6(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=110 (DH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteD6(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteD7(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=111 (BH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteD7(afnGrp, fnSrc) {
var b = afnGrp[2].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteD8(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=000 (AL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteD8(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.regEAX & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteD9(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=001 (CL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteD9(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.regECX & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteDA(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=010 (DL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteDA(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.regEDX & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteDB(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=011 (BL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteDB(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, this.regEBX & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteDC(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=100 (AH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteDC(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteDD(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=101 (CH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteDD(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteDE(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=110 (DH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteDE(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteDF(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=111 (BH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteDF(afnGrp, fnSrc) {
var b = afnGrp[3].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteE0(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=000 (AL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteE0(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.regEAX & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteE1(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=001 (CL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteE1(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.regECX & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteE2(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=010 (DL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteE2(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.regEDX & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteE3(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=011 (BL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteE3(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, this.regEBX & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteE4(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=100 (AH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteE4(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteE5(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=101 (CH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteE5(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteE6(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=110 (DH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteE6(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteE7(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=111 (BH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteE7(afnGrp, fnSrc) {
var b = afnGrp[4].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteE8(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=000 (AL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteE8(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.regEAX & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteE9(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=001 (CL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteE9(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.regECX & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteEA(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=010 (DL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteEA(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.regEDX & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteEB(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=011 (BL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteEB(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, this.regEBX & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteEC(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=100 (AH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteEC(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteED(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=101 (CH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteED(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteEE(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=110 (DH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteEE(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteEF(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=111 (BH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteEF(afnGrp, fnSrc) {
var b = afnGrp[5].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteF0(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=000 (AL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteF0(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.regEAX & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteF1(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=001 (CL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteF1(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.regECX & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteF2(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=010 (DL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteF2(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.regEDX & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteF3(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=011 (BL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteF3(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, this.regEBX & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteF4(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=100 (AH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteF4(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteF5(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=101 (CH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteF5(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteF6(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=110 (DH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteF6(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteF7(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=111 (BH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteF7(afnGrp, fnSrc) {
var b = afnGrp[6].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteF8(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=000 (AL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteF8(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.regEAX & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteF9(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=001 (CL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteF9(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.regECX & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteFA(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=010 (DL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteFA(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.regEDX & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteFB(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=011 (BL)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteFB(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, this.regEBX & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff) | b;
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteFC(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=100 (AH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteFC(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteFD(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=101 (CH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteFD(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
this.regECX = (this.regECX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteFE(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=110 (DH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteFE(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
},
/**
* opMod32GrpByteFF(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=111 (BH)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpByteFF(afnGrp, fnSrc) {
var b = afnGrp[7].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
}
];
if (typeof module !== 'undefined') module.exports = X86ModB32;
/**
* @fileoverview Implements PCjs 8086 mode-byte decoding.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2015-Jan-20
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
if (typeof module !== 'undefined') {
var X86 = require("./x86");
}
var X86ModSIB = {};
/*
* TODO: Factor out the SIB (scale=1) decoders that are functionally equivalent to one another,
* just as I've already done for all the ModRM (register-to-register) decoders. For example:
*
* opModSIB01(): this.regECX + this.regEAX
*
* is functionally equivalent to:
*
* opModSIB08(): this.regEAX + this.regECX
*
* This isn't super critical, since the SIB decoders are much smaller/simpler than the ModRM decoders,
* but still, it's wasteful.
*/
X86ModSIB.aOpModSIB = [
/**
* opModSIB00(): scale=00 (1) index=000 (EAX) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB00(mod) {
return this.regEAX + this.regEAX;
},
/**
* opModSIB01(): scale=00 (1) index=000 (EAX) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB01(mod) {
return this.regECX + this.regEAX;
},
/**
* opModSIB02(): scale=00 (1) index=000 (EAX) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB02(mod) {
return this.regEDX + this.regEAX;
},
/**
* opModSIB03(): scale=00 (1) index=000 (EAX) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB03(mod) {
return this.regEBX + this.regEAX;
},
/**
* opModSIB04(): scale=00 (1) index=000 (EAX) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB04(mod) {
this.segData = this.segStack;
return this.getSP() + this.regEAX;
},
/**
* opModSIB05(): scale=00 (1) index=000 (EAX) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB05(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + this.regEAX;
},
/**
* opModSIB06(): scale=00 (1) index=000 (EAX) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB06(mod) {
return this.regESI + this.regEAX;
},
/**
* opModSIB07(): scale=00 (1) index=000 (EAX) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB07(mod) {
return this.regEDI + this.regEAX;
},
/**
* opModSIB08(): scale=00 (1) index=001 (ECX) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB08(mod) {
return this.regEAX + this.regECX;
},
/**
* opModSIB09(): scale=00 (1) index=001 (ECX) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB09(mod) {
return this.regECX + this.regECX;
},
/**
* opModSIB0A(): scale=00 (1) index=001 (ECX) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB0A(mod) {
return this.regEDX + this.regECX;
},
/**
* opModSIB0B(): scale=00 (1) index=001 (ECX) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB0B(mod) {
return this.regEBX + this.regECX;
},
/**
* opModSIB0C(): scale=00 (1) index=001 (ECX) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB0C(mod) {
this.segData = this.segStack;
return this.getSP() + this.regECX;
},
/**
* opModSIB0D(): scale=00 (1) index=001 (ECX) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB0D(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + this.regECX;
},
/**
* opModSIB0E(): scale=00 (1) index=001 (ECX) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB0E(mod) {
return this.regESI + this.regECX;
},
/**
* opModSIB0F(): scale=00 (1) index=001 (ECX) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB0F(mod) {
return this.regEDI + this.regECX;
},
/**
* opModSIB10(): scale=00 (1) index=010 (EDX) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB10(mod) {
return this.regEAX + this.regEDX;
},
/**
* opModSIB11(): scale=00 (1) index=010 (EDX) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB11(mod) {
return this.regECX + this.regEDX;
},
/**
* opModSIB12(): scale=00 (1) index=010 (EDX) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB12(mod) {
return this.regEDX + this.regEDX;
},
/**
* opModSIB13(): scale=00 (1) index=010 (EDX) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB13(mod) {
return this.regEBX + this.regEDX;
},
/**
* opModSIB14(): scale=00 (1) index=010 (EDX) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB14(mod) {
this.segData = this.segStack;
return this.getSP() + this.regEDX;
},
/**
* opModSIB15(): scale=00 (1) index=010 (EDX) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB15(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + this.regEDX;
},
/**
* opModSIB16(): scale=00 (1) index=010 (EDX) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB16(mod) {
return this.regESI + this.regEDX;
},
/**
* opModSIB17(): scale=00 (1) index=010 (EDX) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB17(mod) {
return this.regEDI + this.regEDX;
},
/**
* opModSIB18(): scale=00 (1) index=011 (EBX) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB18(mod) {
return this.regEAX + this.regEBX;
},
/**
* opModSIB19(): scale=00 (1) index=011 (EBX) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB19(mod) {
return this.regECX + this.regEBX;
},
/**
* opModSIB1A(): scale=00 (1) index=011 (EBX) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB1A(mod) {
return this.regEDX + this.regEBX;
},
/**
* opModSIB1B(): scale=00 (1) index=011 (EBX) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB1B(mod) {
return this.regEBX + this.regEBX;
},
/**
* opModSIB1C(): scale=00 (1) index=011 (EBX) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB1C(mod) {
this.segData = this.segStack;
return this.getSP() + this.regEBX;
},
/**
* opModSIB1D(): scale=00 (1) index=011 (EBX) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB1D(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + this.regEBX;
},
/**
* opModSIB1E(): scale=00 (1) index=011 (EBX) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB1E(mod) {
return this.regESI + this.regEBX;
},
/**
* opModSIB1F(): scale=00 (1) index=011 (EBX) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB1F(mod) {
return this.regEDI + this.regEBX;
},
/**
* opModSIB20(): scale=00 (1) index=100 (none) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB20(mod) {
return this.regEAX;
},
/**
* opModSIB21(): scale=00 (1) index=100 (none) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB21(mod) {
return this.regECX;
},
/**
* opModSIB22(): scale=00 (1) index=100 (none) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB22(mod) {
return this.regEDX;
},
/**
* opModSIB23(): scale=00 (1) index=100 (none) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB23(mod) {
return this.regEBX;
},
/**
* opModSIB24(): scale=00 (1) index=100 (none) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB24(mod) {
this.segData = this.segStack;
return this.getSP();
},
/**
* opModSIB25(): scale=00 (1) index=100 (none) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB25(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord());
},
/**
* opModSIB26(): scale=00 (1) index=100 (none) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB26(mod) {
return this.regESI;
},
/**
* opModSIB27(): scale=00 (1) index=100 (none) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB27(mod) {
return this.regEDI;
},
/**
* opModSIB28(): scale=00 (1) index=101 (EBP) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB28(mod) {
return this.regEAX + this.regEBP;
},
/**
* opModSIB29(): scale=00 (1) index=101 (EBP) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB29(mod) {
return this.regECX + this.regEBP;
},
/**
* opModSIB2A(): scale=00 (1) index=101 (EBP) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB2A(mod) {
return this.regEDX + this.regEBP;
},
/**
* opModSIB2B(): scale=00 (1) index=101 (EBP) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB2B(mod) {
return this.regEBX + this.regEBP;
},
/**
* opModSIB2C(): scale=00 (1) index=101 (EBP) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB2C(mod) {
this.segData = this.segStack;
return this.getSP() + this.regEBP;
},
/**
* opModSIB2D(): scale=00 (1) index=101 (EBP) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB2D(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + this.regEBP;
},
/**
* opModSIB2E(): scale=00 (1) index=101 (EBP) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB2E(mod) {
return this.regESI + this.regEBP;
},
/**
* opModSIB2F(): scale=00 (1) index=101 (EBP) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB2F(mod) {
return this.regEDI + this.regEBP;
},
/**
* opModSIB30(): scale=00 (1) index=110 (ESI) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB30(mod) {
return this.regEAX + this.regESI;
},
/**
* opModSIB31(): scale=00 (1) index=110 (ESI) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB31(mod) {
return this.regECX + this.regESI;
},
/**
* opModSIB32(): scale=00 (1) index=110 (ESI) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB32(mod) {
return this.regEDX + this.regESI;
},
/**
* opModSIB33(): scale=00 (1) index=110 (ESI) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB33(mod) {
return this.regEBX + this.regESI;
},
/**
* opModSIB34(): scale=00 (1) index=110 (ESI) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB34(mod) {
this.segData = this.segStack;
return this.getSP() + this.regESI;
},
/**
* opModSIB35(): scale=00 (1) index=110 (ESI) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB35(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + this.regESI;
},
/**
* opModSIB36(): scale=00 (1) index=110 (ESI) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB36(mod) {
return this.regESI + this.regESI;
},
/**
* opModSIB37(): scale=00 (1) index=110 (ESI) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB37(mod) {
return this.regEDI + this.regESI;
},
/**
* opModSIB38(): scale=00 (1) index=111 (EDI) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB38(mod) {
return this.regEAX + this.regEDI;
},
/**
* opModSIB39(): scale=00 (1) index=111 (EDI) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB39(mod) {
return this.regECX + this.regEDI;
},
/**
* opModSIB3A(): scale=00 (1) index=111 (EDI) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB3A(mod) {
return this.regEDX + this.regEDI;
},
/**
* opModSIB3B(): scale=00 (1) index=111 (EDI) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB3B(mod) {
return this.regEBX + this.regEDI;
},
/**
* opModSIB3C(): scale=00 (1) index=111 (EDI) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB3C(mod) {
this.segData = this.segStack;
return this.getSP() + this.regEDI;
},
/**
* opModSIB3D(): scale=00 (1) index=111 (EDI) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB3D(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + this.regEDI;
},
/**
* opModSIB3E(): scale=00 (1) index=111 (EDI) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB3E(mod) {
return this.regESI + this.regEDI;
},
/**
* opModSIB3F(): scale=00 (1) index=111 (EDI) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB3F(mod) {
return this.regEDI + this.regEDI;
},
/**
* opModSIB40(): scale=01 (2) index=000 (EAX) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB40(mod) {
return this.regEAX + (this.regEAX << 1);
},
/**
* opModSIB41(): scale=01 (2) index=000 (EAX) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB41(mod) {
return this.regECX + (this.regEAX << 1);
},
/**
* opModSIB42(): scale=01 (2) index=000 (EAX) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB42(mod) {
return this.regEDX + (this.regEAX << 1);
},
/**
* opModSIB43(): scale=01 (2) index=000 (EAX) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB43(mod) {
return this.regEBX + (this.regEAX << 1);
},
/**
* opModSIB44(): scale=01 (2) index=000 (EAX) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB44(mod) {
this.segData = this.segStack;
return this.getSP() + (this.regEAX << 1);
},
/**
* opModSIB45(): scale=01 (2) index=000 (EAX) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB45(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEAX << 1);
},
/**
* opModSIB46(): scale=01 (2) index=000 (EAX) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB46(mod) {
return this.regESI + (this.regEAX << 1);
},
/**
* opModSIB47(): scale=01 (2) index=000 (EAX) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB47(mod) {
return this.regEDI + (this.regEAX << 1);
},
/**
* opModSIB48(): scale=01 (2) index=001 (ECX) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB48(mod) {
return this.regEAX + (this.regECX << 1);
},
/**
* opModSIB49(): scale=01 (2) index=001 (ECX) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB49(mod) {
return this.regECX + (this.regECX << 1);
},
/**
* opModSIB4A(): scale=01 (2) index=001 (ECX) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB4A(mod) {
return this.regEDX + (this.regECX << 1);
},
/**
* opModSIB4B(): scale=01 (2) index=001 (ECX) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB4B(mod) {
return this.regEBX + (this.regECX << 1);
},
/**
* opModSIB4C(): scale=01 (2) index=001 (ECX) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB4C(mod) {
this.segData = this.segStack;
return this.getSP() + (this.regECX << 1);
},
/**
* opModSIB4D(): scale=01 (2) index=001 (ECX) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB4D(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regECX << 1);
},
/**
* opModSIB4E(): scale=01 (2) index=001 (ECX) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB4E(mod) {
return this.regESI + (this.regECX << 1);
},
/**
* opModSIB4F(): scale=01 (2) index=001 (ECX) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB4F(mod) {
return this.regEDI + (this.regECX << 1);
},
/**
* opModSIB50(): scale=01 (2) index=010 (EDX) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB50(mod) {
return this.regEAX + (this.regEDX << 1);
},
/**
* opModSIB51(): scale=01 (2) index=010 (EDX) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB51(mod) {
return this.regECX + (this.regEDX << 1);
},
/**
* opModSIB52(): scale=01 (2) index=010 (EDX) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB52(mod) {
return this.regEDX + (this.regEDX << 1);
},
/**
* opModSIB53(): scale=01 (2) index=010 (EDX) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB53(mod) {
return this.regEBX + (this.regEDX << 1);
},
/**
* opModSIB54(): scale=01 (2) index=010 (EDX) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB54(mod) {
this.segData = this.segStack;
return this.getSP() + (this.regEDX << 1);
},
/**
* opModSIB55(): scale=01 (2) index=010 (EDX) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB55(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEDX << 1);
},
/**
* opModSIB56(): scale=01 (2) index=010 (EDX) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB56(mod) {
return this.regESI + (this.regEDX << 1);
},
/**
* opModSIB57(): scale=01 (2) index=010 (EDX) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB57(mod) {
return this.regEDI + (this.regEDX << 1);
},
/**
* opModSIB58(): scale=01 (2) index=011 (EBX) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB58(mod) {
return this.regEAX + (this.regEBX << 1);
},
/**
* opModSIB59(): scale=01 (2) index=011 (EBX) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB59(mod) {
return this.regECX + (this.regEBX << 1);
},
/**
* opModSIB5A(): scale=01 (2) index=011 (EBX) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB5A(mod) {
return this.regEDX + (this.regEBX << 1);
},
/**
* opModSIB5B(): scale=01 (2) index=011 (EBX) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB5B(mod) {
return this.regEBX + (this.regEBX << 1);
},
/**
* opModSIB5C(): scale=01 (2) index=011 (EBX) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB5C(mod) {
this.segData = this.segStack;
return this.getSP() + (this.regEBX << 1);
},
/**
* opModSIB5D(): scale=01 (2) index=011 (EBX) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB5D(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEBX << 1);
},
/**
* opModSIB5E(): scale=01 (2) index=011 (EBX) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB5E(mod) {
return this.regESI + (this.regEBX << 1);
},
/**
* opModSIB5F(): scale=01 (2) index=011 (EBX) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB5F(mod) {
return this.regEDI + (this.regEBX << 1);
},
/**
* opModSIB60(): scale=01 (2) index=100 (none) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB60(mod) {
return this.regEAX;
},
/**
* opModSIB61(): scale=01 (2) index=100 (none) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB61(mod) {
return this.regECX;
},
/**
* opModSIB62(): scale=01 (2) index=100 (none) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB62(mod) {
return this.regEDX;
},
/**
* opModSIB63(): scale=01 (2) index=100 (none) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB63(mod) {
return this.regEBX;
},
/**
* opModSIB64(): scale=01 (2) index=100 (none) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB64(mod) {
this.segData = this.segStack;
return this.getSP();
},
/**
* opModSIB65(): scale=01 (2) index=100 (none) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB65(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord());
},
/**
* opModSIB66(): scale=01 (2) index=100 (none) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB66(mod) {
return this.regESI;
},
/**
* opModSIB67(): scale=01 (2) index=100 (none) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB67(mod) {
return this.regEDI;
},
/**
* opModSIB68(): scale=01 (2) index=101 (EBP) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB68(mod) {
return this.regEAX + (this.regEBP << 1);
},
/**
* opModSIB69(): scale=01 (2) index=101 (EBP) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB69(mod) {
return this.regECX + (this.regEBP << 1);
},
/**
* opModSIB6A(): scale=01 (2) index=101 (EBP) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB6A(mod) {
return this.regEDX + (this.regEBP << 1);
},
/**
* opModSIB6B(): scale=01 (2) index=101 (EBP) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB6B(mod) {
return this.regEBX + (this.regEBP << 1);
},
/**
* opModSIB6C(): scale=01 (2) index=101 (EBP) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB6C(mod) {
this.segData = this.segStack;
return this.getSP() + (this.regEBP << 1);
},
/**
* opModSIB6D(): scale=01 (2) index=101 (EBP) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB6D(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEBP << 1);
},
/**
* opModSIB6E(): scale=01 (2) index=101 (EBP) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB6E(mod) {
return this.regESI + (this.regEBP << 1);
},
/**
* opModSIB6F(): scale=01 (2) index=101 (EBP) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB6F(mod) {
return this.regEDI + (this.regEBP << 1);
},
/**
* opModSIB70(): scale=01 (2) index=110 (ESI) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB70(mod) {
return this.regEAX + (this.regESI << 1);
},
/**
* opModSIB71(): scale=01 (2) index=110 (ESI) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB71(mod) {
return this.regECX + (this.regESI << 1);
},
/**
* opModSIB72(): scale=01 (2) index=110 (ESI) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB72(mod) {
return this.regEDX + (this.regESI << 1);
},
/**
* opModSIB73(): scale=01 (2) index=110 (ESI) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB73(mod) {
return this.regEBX + (this.regESI << 1);
},
/**
* opModSIB74(): scale=01 (2) index=110 (ESI) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB74(mod) {
this.segData = this.segStack;
return this.getSP() + (this.regESI << 1);
},
/**
* opModSIB75(): scale=01 (2) index=110 (ESI) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB75(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regESI << 1);
},
/**
* opModSIB76(): scale=01 (2) index=110 (ESI) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB76(mod) {
return this.regESI + (this.regESI << 1);
},
/**
* opModSIB77(): scale=01 (2) index=110 (ESI) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB77(mod) {
return this.regEDI + (this.regESI << 1);
},
/**
* opModSIB78(): scale=01 (2) index=111 (EDI) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB78(mod) {
return this.regEAX + (this.regEDI << 1);
},
/**
* opModSIB79(): scale=01 (2) index=111 (EDI) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB79(mod) {
return this.regECX + (this.regEDI << 1);
},
/**
* opModSIB7A(): scale=01 (2) index=111 (EDI) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB7A(mod) {
return this.regEDX + (this.regEDI << 1);
},
/**
* opModSIB7B(): scale=01 (2) index=111 (EDI) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB7B(mod) {
return this.regEBX + (this.regEDI << 1);
},
/**
* opModSIB7C(): scale=01 (2) index=111 (EDI) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB7C(mod) {
this.segData = this.segStack;
return this.getSP() + (this.regEDI << 1);
},
/**
* opModSIB7D(): scale=01 (2) index=111 (EDI) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB7D(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEDI << 1);
},
/**
* opModSIB7E(): scale=01 (2) index=111 (EDI) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB7E(mod) {
return this.regESI + (this.regEDI << 1);
},
/**
* opModSIB7F(): scale=01 (2) index=111 (EDI) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB7F(mod) {
return this.regEDI + (this.regEDI << 1);
},
/**
* opModSIB80(): scale=10 (4) index=000 (EAX) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB80(mod) {
return this.regEAX + (this.regEAX << 2);
},
/**
* opModSIB81(): scale=10 (4) index=000 (EAX) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB81(mod) {
return this.regECX + (this.regEAX << 2);
},
/**
* opModSIB82(): scale=10 (4) index=000 (EAX) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB82(mod) {
return this.regEDX + (this.regEAX << 2);
},
/**
* opModSIB83(): scale=10 (4) index=000 (EAX) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB83(mod) {
return this.regEBX + (this.regEAX << 2);
},
/**
* opModSIB84(): scale=10 (4) index=000 (EAX) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB84(mod) {
this.segData = this.segStack;
return this.getSP() + (this.regEAX << 2);
},
/**
* opModSIB85(): scale=10 (4) index=000 (EAX) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB85(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEAX << 2);
},
/**
* opModSIB86(): scale=10 (4) index=000 (EAX) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB86(mod) {
return this.regESI + (this.regEAX << 2);
},
/**
* opModSIB87(): scale=10 (4) index=000 (EAX) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB87(mod) {
return this.regEDI + (this.regEAX << 2);
},
/**
* opModSIB88(): scale=10 (4) index=001 (ECX) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB88(mod) {
return this.regEAX + (this.regECX << 2);
},
/**
* opModSIB89(): scale=10 (4) index=001 (ECX) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB89(mod) {
return this.regECX + (this.regECX << 2);
},
/**
* opModSIB8A(): scale=10 (4) index=001 (ECX) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB8A(mod) {
return this.regEDX + (this.regECX << 2);
},
/**
* opModSIB8B(): scale=10 (4) index=001 (ECX) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB8B(mod) {
return this.regEBX + (this.regECX << 2);
},
/**
* opModSIB8C(): scale=10 (4) index=001 (ECX) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB8C(mod) {
this.segData = this.segStack;
return this.getSP() + (this.regECX << 2);
},
/**
* opModSIB8D(): scale=10 (4) index=001 (ECX) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB8D(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regECX << 2);
},
/**
* opModSIB8E(): scale=10 (4) index=001 (ECX) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB8E(mod) {
return this.regESI + (this.regECX << 2);
},
/**
* opModSIB8F(): scale=10 (4) index=001 (ECX) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB8F(mod) {
return this.regEDI + (this.regECX << 2);
},
/**
* opModSIB90(): scale=10 (4) index=010 (EDX) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB90(mod) {
return this.regEAX + (this.regEDX << 2);
},
/**
* opModSIB91(): scale=10 (4) index=010 (EDX) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB91(mod) {
return this.regECX + (this.regEDX << 2);
},
/**
* opModSIB92(): scale=10 (4) index=010 (EDX) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB92(mod) {
return this.regEDX + (this.regEDX << 2);
},
/**
* opModSIB93(): scale=10 (4) index=010 (EDX) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB93(mod) {
return this.regEBX + (this.regEDX << 2);
},
/**
* opModSIB94(): scale=10 (4) index=010 (EDX) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB94(mod) {
this.segData = this.segStack;
return this.getSP() + (this.regEDX << 2);
},
/**
* opModSIB95(): scale=10 (4) index=010 (EDX) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB95(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEDX << 2);
},
/**
* opModSIB96(): scale=10 (4) index=010 (EDX) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB96(mod) {
return this.regESI + (this.regEDX << 2);
},
/**
* opModSIB97(): scale=10 (4) index=010 (EDX) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB97(mod) {
return this.regEDI + (this.regEDX << 2);
},
/**
* opModSIB98(): scale=10 (4) index=011 (EBX) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB98(mod) {
return this.regEAX + (this.regEBX << 2);
},
/**
* opModSIB99(): scale=10 (4) index=011 (EBX) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB99(mod) {
return this.regECX + (this.regEBX << 2);
},
/**
* opModSIB9A(): scale=10 (4) index=011 (EBX) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB9A(mod) {
return this.regEDX + (this.regEBX << 2);
},
/**
* opModSIB9B(): scale=10 (4) index=011 (EBX) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB9B(mod) {
return this.regEBX + (this.regEBX << 2);
},
/**
* opModSIB9C(): scale=10 (4) index=011 (EBX) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB9C(mod) {
this.segData = this.segStack;
return this.getSP() + (this.regEBX << 2);
},
/**
* opModSIB9D(): scale=10 (4) index=011 (EBX) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB9D(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEBX << 2);
},
/**
* opModSIB9E(): scale=10 (4) index=011 (EBX) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB9E(mod) {
return this.regESI + (this.regEBX << 2);
},
/**
* opModSIB9F(): scale=10 (4) index=011 (EBX) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIB9F(mod) {
return this.regEDI + (this.regEBX << 2);
},
/**
* opModSIBA0(): scale=10 (4) index=100 (none) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBA0(mod) {
return this.regEAX;
},
/**
* opModSIBA1(): scale=10 (4) index=100 (none) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBA1(mod) {
return this.regECX;
},
/**
* opModSIBA2(): scale=10 (4) index=100 (none) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBA2(mod) {
return this.regEDX;
},
/**
* opModSIBA3(): scale=10 (4) index=100 (none) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBA3(mod) {
return this.regEBX;
},
/**
* opModSIBA4(): scale=10 (4) index=100 (none) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBA4(mod) {
this.segData = this.segStack;
return this.getSP();
},
/**
* opModSIBA5(): scale=10 (4) index=100 (none) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBA5(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord());
},
/**
* opModSIBA6(): scale=10 (4) index=100 (none) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBA6(mod) {
return this.regESI;
},
/**
* opModSIBA7(): scale=10 (4) index=100 (none) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBA7(mod) {
return this.regEDI;
},
/**
* opModSIBA8(): scale=10 (4) index=101 (EBP) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBA8(mod) {
return this.regEAX + (this.regEBP << 2);
},
/**
* opModSIBA9(): scale=10 (4) index=101 (EBP) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBA9(mod) {
return this.regECX + (this.regEBP << 2);
},
/**
* opModSIBAA(): scale=10 (4) index=101 (EBP) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBAA(mod) {
return this.regEDX + (this.regEBP << 2);
},
/**
* opModSIBAB(): scale=10 (4) index=101 (EBP) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBAB(mod) {
return this.regEBX + (this.regEBP << 2);
},
/**
* opModSIBAC(): scale=10 (4) index=101 (EBP) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBAC(mod) {
this.segData = this.segStack;
return this.getSP() + (this.regEBP << 2);
},
/**
* opModSIBAD(): scale=10 (4) index=101 (EBP) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBAD(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEBP << 2);
},
/**
* opModSIBAE(): scale=10 (4) index=101 (EBP) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBAE(mod) {
return this.regESI + (this.regEBP << 2);
},
/**
* opModSIBAF(): scale=10 (4) index=101 (EBP) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBAF(mod) {
return this.regEDI + (this.regEBP << 2);
},
/**
* opModSIBB0(): scale=10 (4) index=110 (ESI) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBB0(mod) {
return this.regEAX + (this.regESI << 2);
},
/**
* opModSIBB1(): scale=10 (4) index=110 (ESI) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBB1(mod) {
return this.regECX + (this.regESI << 2);
},
/**
* opModSIBB2(): scale=10 (4) index=110 (ESI) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBB2(mod) {
return this.regEDX + (this.regESI << 2);
},
/**
* opModSIBB3(): scale=10 (4) index=110 (ESI) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBB3(mod) {
return this.regEBX + (this.regESI << 2);
},
/**
* opModSIBB4(): scale=10 (4) index=110 (ESI) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBB4(mod) {
this.segData = this.segStack;
return this.getSP() + (this.regESI << 2);
},
/**
* opModSIBB5(): scale=10 (4) index=110 (ESI) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBB5(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regESI << 2);
},
/**
* opModSIBB6(): scale=10 (4) index=110 (ESI) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBB6(mod) {
return this.regESI + (this.regESI << 2);
},
/**
* opModSIBB7(): scale=10 (4) index=110 (ESI) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBB7(mod) {
return this.regEDI + (this.regESI << 2);
},
/**
* opModSIBB8(): scale=10 (4) index=111 (EDI) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBB8(mod) {
return this.regEAX + (this.regEDI << 2);
},
/**
* opModSIBB9(): scale=10 (4) index=111 (EDI) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBB9(mod) {
return this.regECX + (this.regEDI << 2);
},
/**
* opModSIBBA(): scale=10 (4) index=111 (EDI) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBBA(mod) {
return this.regEDX + (this.regEDI << 2);
},
/**
* opModSIBBB(): scale=10 (4) index=111 (EDI) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBBB(mod) {
return this.regEBX + (this.regEDI << 2);
},
/**
* opModSIBBC(): scale=10 (4) index=111 (EDI) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBBC(mod) {
this.segData = this.segStack;
return this.getSP() + (this.regEDI << 2);
},
/**
* opModSIBBD(): scale=10 (4) index=111 (EDI) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBBD(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEDI << 2);
},
/**
* opModSIBBE(): scale=10 (4) index=111 (EDI) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBBE(mod) {
return this.regESI + (this.regEDI << 2);
},
/**
* opModSIBBF(): scale=10 (4) index=111 (EDI) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBBF(mod) {
return this.regEDI + (this.regEDI << 2);
},
/**
* opModSIBC0(): scale=11 (8) index=000 (EAX) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBC0(mod) {
return this.regEAX + (this.regEAX << 3);
},
/**
* opModSIBC1(): scale=11 (8) index=000 (EAX) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBC1(mod) {
return this.regECX + (this.regEAX << 3);
},
/**
* opModSIBC2(): scale=11 (8) index=000 (EAX) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBC2(mod) {
return this.regEDX + (this.regEAX << 3);
},
/**
* opModSIBC3(): scale=11 (8) index=000 (EAX) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBC3(mod) {
return this.regEBX + (this.regEAX << 3);
},
/**
* opModSIBC4(): scale=11 (8) index=000 (EAX) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBC4(mod) {
this.segData = this.segStack;
return this.getSP() + (this.regEAX << 3);
},
/**
* opModSIBC5(): scale=11 (8) index=000 (EAX) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBC5(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEAX << 3);
},
/**
* opModSIBC6(): scale=11 (8) index=000 (EAX) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBC6(mod) {
return this.regESI + (this.regEAX << 3);
},
/**
* opModSIBC7(): scale=11 (8) index=000 (EAX) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBC7(mod) {
return this.regEDI + (this.regEAX << 3);
},
/**
* opModSIBC8(): scale=11 (8) index=001 (ECX) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBC8(mod) {
return this.regEAX + (this.regECX << 3);
},
/**
* opModSIBC9(): scale=11 (8) index=001 (ECX) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBC9(mod) {
return this.regECX + (this.regECX << 3);
},
/**
* opModSIBCA(): scale=11 (8) index=001 (ECX) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBCA(mod) {
return this.regEDX + (this.regECX << 3);
},
/**
* opModSIBCB(): scale=11 (8) index=001 (ECX) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBCB(mod) {
return this.regEBX + (this.regECX << 3);
},
/**
* opModSIBCC(): scale=11 (8) index=001 (ECX) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBCC(mod) {
this.segData = this.segStack;
return this.getSP() + (this.regECX << 3);
},
/**
* opModSIBCD(): scale=11 (8) index=001 (ECX) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBCD(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regECX << 3);
},
/**
* opModSIBCE(): scale=11 (8) index=001 (ECX) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBCE(mod) {
return this.regESI + (this.regECX << 3);
},
/**
* opModSIBCF(): scale=11 (8) index=001 (ECX) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBCF(mod) {
return this.regEDI + (this.regECX << 3);
},
/**
* opModSIBD0(): scale=11 (8) index=010 (EDX) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBD0(mod) {
return this.regEAX + (this.regEDX << 3);
},
/**
* opModSIBD1(): scale=11 (8) index=010 (EDX) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBD1(mod) {
return this.regECX + (this.regEDX << 3);
},
/**
* opModSIBD2(): scale=11 (8) index=010 (EDX) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBD2(mod) {
return this.regEDX + (this.regEDX << 3);
},
/**
* opModSIBD3(): scale=11 (8) index=010 (EDX) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBD3(mod) {
return this.regEBX + (this.regEDX << 3);
},
/**
* opModSIBD4(): scale=11 (8) index=010 (EDX) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBD4(mod) {
this.segData = this.segStack;
return this.getSP() + (this.regEDX << 3);
},
/**
* opModSIBD5(): scale=11 (8) index=010 (EDX) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBD5(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEDX << 3);
},
/**
* opModSIBD6(): scale=11 (8) index=010 (EDX) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBD6(mod) {
return this.regESI + (this.regEDX << 3);
},
/**
* opModSIBD7(): scale=11 (8) index=010 (EDX) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBD7(mod) {
return this.regEDI + (this.regEDX << 3);
},
/**
* opModSIBD8(): scale=11 (8) index=011 (EBX) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBD8(mod) {
return this.regEAX + (this.regEBX << 3);
},
/**
* opModSIBD9(): scale=11 (8) index=011 (EBX) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBD9(mod) {
return this.regECX + (this.regEBX << 3);
},
/**
* opModSIBDA(): scale=11 (8) index=011 (EBX) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBDA(mod) {
return this.regEDX + (this.regEBX << 3);
},
/**
* opModSIBDB(): scale=11 (8) index=011 (EBX) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBDB(mod) {
return this.regEBX + (this.regEBX << 3);
},
/**
* opModSIBDC(): scale=11 (8) index=011 (EBX) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBDC(mod) {
this.segData = this.segStack;
return this.getSP() + (this.regEBX << 3);
},
/**
* opModSIBDD(): scale=11 (8) index=011 (EBX) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBDD(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEBX << 3);
},
/**
* opModSIBDE(): scale=11 (8) index=011 (EBX) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBDE(mod) {
return this.regESI + (this.regEBX << 3);
},
/**
* opModSIBDF(): scale=11 (8) index=011 (EBX) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBDF(mod) {
return this.regEDI + (this.regEBX << 3);
},
/**
* opModSIBE0(): scale=11 (8) index=100 (none) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBE0(mod) {
return this.regEAX;
},
/**
* opModSIBE1(): scale=11 (8) index=100 (none) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBE1(mod) {
return this.regECX;
},
/**
* opModSIBE2(): scale=11 (8) index=100 (none) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBE2(mod) {
return this.regEDX;
},
/**
* opModSIBE3(): scale=11 (8) index=100 (none) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBE3(mod) {
return this.regEBX;
},
/**
* opModSIBE4(): scale=11 (8) index=100 (none) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBE4(mod) {
this.segData = this.segStack;
return this.getSP();
},
/**
* opModSIBE5(): scale=11 (8) index=100 (none) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBE5(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord());
},
/**
* opModSIBE6(): scale=11 (8) index=100 (none) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBE6(mod) {
return this.regESI;
},
/**
* opModSIBE7(): scale=11 (8) index=100 (none) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBE7(mod) {
return this.regEDI;
},
/**
* opModSIBE8(): scale=11 (8) index=101 (EBP) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBE8(mod) {
return this.regEAX + (this.regEBP << 3);
},
/**
* opModSIBE9(): scale=11 (8) index=101 (EBP) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBE9(mod) {
return this.regECX + (this.regEBP << 3);
},
/**
* opModSIBEA(): scale=11 (8) index=101 (EBP) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBEA(mod) {
return this.regEDX + (this.regEBP << 3);
},
/**
* opModSIBEB(): scale=11 (8) index=101 (EBP) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBEB(mod) {
return this.regEBX + (this.regEBP << 3);
},
/**
* opModSIBEC(): scale=11 (8) index=101 (EBP) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBEC(mod) {
this.segData = this.segStack;
return this.getSP() + (this.regEBP << 3);
},
/**
* opModSIBED(): scale=11 (8) index=101 (EBP) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBED(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEBP << 3);
},
/**
* opModSIBEE(): scale=11 (8) index=101 (EBP) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBEE(mod) {
return this.regESI + (this.regEBP << 3);
},
/**
* opModSIBEF(): scale=11 (8) index=101 (EBP) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBEF(mod) {
return this.regEDI + (this.regEBP << 3);
},
/**
* opModSIBF0(): scale=11 (8) index=110 (ESI) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBF0(mod) {
return this.regEAX + (this.regESI << 3);
},
/**
* opModSIBF1(): scale=11 (8) index=110 (ESI) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBF1(mod) {
return this.regECX + (this.regESI << 3);
},
/**
* opModSIBF2(): scale=11 (8) index=110 (ESI) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBF2(mod) {
return this.regEDX + (this.regESI << 3);
},
/**
* opModSIBF3(): scale=11 (8) index=110 (ESI) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBF3(mod) {
return this.regEBX + (this.regESI << 3);
},
/**
* opModSIBF4(): scale=11 (8) index=110 (ESI) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBF4(mod) {
this.segData = this.segStack;
return this.getSP() + (this.regESI << 3);
},
/**
* opModSIBF5(): scale=11 (8) index=110 (ESI) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBF5(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regESI << 3);
},
/**
* opModSIBF6(): scale=11 (8) index=110 (ESI) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBF6(mod) {
return this.regESI + (this.regESI << 3);
},
/**
* opModSIBF7(): scale=11 (8) index=110 (ESI) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBF7(mod) {
return this.regEDI + (this.regESI << 3);
},
/**
* opModSIBF8(): scale=11 (8) index=111 (EDI) base=000 (EAX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBF8(mod) {
return this.regEAX + (this.regEDI << 3);
},
/**
* opModSIBF9(): scale=11 (8) index=111 (EDI) base=001 (ECX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBF9(mod) {
return this.regECX + (this.regEDI << 3);
},
/**
* opModSIBFA(): scale=11 (8) index=111 (EDI) base=010 (EDX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBFA(mod) {
return this.regEDX + (this.regEDI << 3);
},
/**
* opModSIBFB(): scale=11 (8) index=111 (EDI) base=011 (EBX)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBFB(mod) {
return this.regEBX + (this.regEDI << 3);
},
/**
* opModSIBFC(): scale=11 (8) index=111 (EDI) base=100 (ESP)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBFC(mod) {
this.segData = this.segStack;
return this.getSP() + (this.regEDI << 3);
},
/**
* opModSIBFD(): scale=11 (8) index=111 (EDI) base=101 (mod? EBP : disp32)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBFD(mod) {
return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEDI << 3);
},
/**
* opModSIBFE(): scale=11 (8) index=111 (EDI) base=110 (ESI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBFE(mod) {
return this.regESI + (this.regEDI << 3);
},
/**
* opModSIBFF(): scale=11 (8) index=111 (EDI) base=111 (EDI)
*
* @this {X86CPU}
* @param {number} mod
*/
function opModSIBFF(mod) {
return this.regEDI + (this.regEDI << 3);
}
];
if (typeof module !== 'undefined') module.exports = X86ModSIB;
/**
* @fileoverview Implements PCjs 8086 mode-byte decoding.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-Sep-05
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
if (typeof module !== 'undefined') {
var X86 = require("./x86");
}
var X86ModW = {};
X86ModW.aOpModReg = [
/**
* opModRegWord00(fn): mod=00 (src:mem) reg=000 (dst:AX) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord00(fn) {
this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEBX + this.regESI));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegWord01(fn): mod=00 (src:mem) reg=000 (dst:AX) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord01(fn) {
this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEBX + this.regEDI));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegWord02(fn): mod=00 (src:mem) reg=000 (dst:AX) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord02(fn) {
this.regEAX = fn.call(this, this.regEAX, this.getEAWordStack(this.regEBP + this.regESI));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegWord03(fn): mod=00 (src:mem) reg=000 (dst:AX) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord03(fn) {
this.regEAX = fn.call(this, this.regEAX, this.getEAWordStack(this.regEBP + this.regEDI));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegWord04(fn): mod=00 (src:mem) reg=000 (dst:AX) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord04(fn) {
this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regESI));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegWord05(fn): mod=00 (src:mem) reg=000 (dst:AX) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord05(fn) {
this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEDI));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegWord06(fn): mod=00 (src:mem) reg=000 (dst:AX) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord06(fn) {
this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModRegWord07(fn): mod=00 (src:mem) reg=000 (dst:AX) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord07(fn) {
this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEBX));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegWord08(fn): mod=00 (src:mem) reg=001 (dst:CX) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord08(fn) {
this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEBX + this.regESI));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegWord09(fn): mod=00 (src:mem) reg=001 (dst:CX) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord09(fn) {
this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEBX + this.regEDI));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegWord0A(fn): mod=00 (src:mem) reg=001 (dst:CX) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord0A(fn) {
this.regECX = fn.call(this, this.regECX, this.getEAWordStack(this.regEBP + this.regESI));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegWord0B(fn): mod=00 (src:mem) reg=001 (dst:CX) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord0B(fn) {
this.regECX = fn.call(this, this.regECX, this.getEAWordStack(this.regEBP + this.regEDI));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegWord0C(fn): mod=00 (src:mem) reg=001 (dst:CX) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord0C(fn) {
this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regESI));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegWord0D(fn): mod=00 (src:mem) reg=001 (dst:CX) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord0D(fn) {
this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEDI));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegWord0E(fn): mod=00 (src:mem) reg=001 (dst:CX) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord0E(fn) {
this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModRegWord0F(fn): mod=00 (src:mem) reg=001 (dst:CX) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord0F(fn) {
this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEBX));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegWord10(fn): mod=00 (src:mem) reg=010 (dst:DX) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord10(fn) {
this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEBX + this.regESI));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegWord11(fn): mod=00 (src:mem) reg=010 (dst:DX) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord11(fn) {
this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEBX + this.regEDI));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegWord12(fn): mod=00 (src:mem) reg=010 (dst:DX) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord12(fn) {
this.regEDX = fn.call(this, this.regEDX, this.getEAWordStack(this.regEBP + this.regESI));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegWord13(fn): mod=00 (src:mem) reg=010 (dst:DX) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord13(fn) {
this.regEDX = fn.call(this, this.regEDX, this.getEAWordStack(this.regEBP + this.regEDI));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegWord14(fn): mod=00 (src:mem) reg=010 (dst:DX) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord14(fn) {
this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regESI));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegWord15(fn): mod=00 (src:mem) reg=010 (dst:DX) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord15(fn) {
this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEDI));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegWord16(fn): mod=00 (src:mem) reg=010 (dst:DX) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord16(fn) {
this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModRegWord17(fn): mod=00 (src:mem) reg=010 (dst:DX) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord17(fn) {
this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEBX));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegWord18(fn): mod=00 (src:mem) reg=011 (dst:BX) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord18(fn) {
this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEBX + this.regESI));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegWord19(fn): mod=00 (src:mem) reg=011 (dst:BX) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord19(fn) {
this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEBX + this.regEDI));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegWord1A(fn): mod=00 (src:mem) reg=011 (dst:BX) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord1A(fn) {
this.regEBX = fn.call(this, this.regEBX, this.getEAWordStack(this.regEBP + this.regESI));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegWord1B(fn): mod=00 (src:mem) reg=011 (dst:BX) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord1B(fn) {
this.regEBX = fn.call(this, this.regEBX, this.getEAWordStack(this.regEBP + this.regEDI));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegWord1C(fn): mod=00 (src:mem) reg=011 (dst:BX) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord1C(fn) {
this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regESI));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegWord1D(fn): mod=00 (src:mem) reg=011 (dst:BX) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord1D(fn) {
this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEDI));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegWord1E(fn): mod=00 (src:mem) reg=011 (dst:BX) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord1E(fn) {
this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModRegWord1F(fn): mod=00 (src:mem) reg=011 (dst:BX) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord1F(fn) {
this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEBX));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegWord20(fn): mod=00 (src:mem) reg=100 (dst:SP) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord20(fn) {
this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEBX + this.regESI)));
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegWord21(fn): mod=00 (src:mem) reg=100 (dst:SP) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord21(fn) {
this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEBX + this.regEDI)));
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegWord22(fn): mod=00 (src:mem) reg=100 (dst:SP) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord22(fn) {
this.setSP(fn.call(this, this.getSP(), this.getEAWordStack(this.regEBP + this.regESI)));
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegWord23(fn): mod=00 (src:mem) reg=100 (dst:SP) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord23(fn) {
this.setSP(fn.call(this, this.getSP(), this.getEAWordStack(this.regEBP + this.regEDI)));
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegWord24(fn): mod=00 (src:mem) reg=100 (dst:SP) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord24(fn) {
this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regESI)));
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegWord25(fn): mod=00 (src:mem) reg=100 (dst:SP) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord25(fn) {
this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEDI)));
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegWord26(fn): mod=00 (src:mem) reg=100 (dst:SP) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord26(fn) {
this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.getIPAddr())));
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModRegWord27(fn): mod=00 (src:mem) reg=100 (dst:SP) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord27(fn) {
this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEBX)));
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegWord28(fn): mod=00 (src:mem) reg=101 (dst:BP) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord28(fn) {
this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEBX + this.regESI));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegWord29(fn): mod=00 (src:mem) reg=101 (dst:BP) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord29(fn) {
this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEBX + this.regEDI));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegWord2A(fn): mod=00 (src:mem) reg=101 (dst:BP) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord2A(fn) {
this.regEBP = fn.call(this, this.regEBP, this.getEAWordStack(this.regEBP + this.regESI));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegWord2B(fn): mod=00 (src:mem) reg=101 (dst:BP) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord2B(fn) {
this.regEBP = fn.call(this, this.regEBP, this.getEAWordStack(this.regEBP + this.regEDI));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegWord2C(fn): mod=00 (src:mem) reg=101 (dst:BP) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord2C(fn) {
this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regESI));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegWord2D(fn): mod=00 (src:mem) reg=101 (dst:BP) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord2D(fn) {
this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEDI));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegWord2E(fn): mod=00 (src:mem) reg=101 (dst:BP) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord2E(fn) {
this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModRegWord2F(fn): mod=00 (src:mem) reg=101 (dst:BP) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord2F(fn) {
this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEBX));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegWord30(fn): mod=00 (src:mem) reg=110 (dst:SI) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord30(fn) {
this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEBX + this.regESI));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegWord31(fn): mod=00 (src:mem) reg=110 (dst:SI) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord31(fn) {
this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEBX + this.regEDI));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegWord32(fn): mod=00 (src:mem) reg=110 (dst:SI) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord32(fn) {
this.regESI = fn.call(this, this.regESI, this.getEAWordStack(this.regEBP + this.regESI));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegWord33(fn): mod=00 (src:mem) reg=110 (dst:SI) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord33(fn) {
this.regESI = fn.call(this, this.regESI, this.getEAWordStack(this.regEBP + this.regEDI));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegWord34(fn): mod=00 (src:mem) reg=110 (dst:SI) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord34(fn) {
this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regESI));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegWord35(fn): mod=00 (src:mem) reg=110 (dst:SI) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord35(fn) {
this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEDI));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegWord36(fn): mod=00 (src:mem) reg=110 (dst:SI) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord36(fn) {
this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModRegWord37(fn): mod=00 (src:mem) reg=110 (dst:SI) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord37(fn) {
this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEBX));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegWord38(fn): mod=00 (src:mem) reg=111 (dst:DI) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord38(fn) {
this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEBX + this.regESI));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegWord39(fn): mod=00 (src:mem) reg=111 (dst:DI) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord39(fn) {
this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEBX + this.regEDI));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegWord3A(fn): mod=00 (src:mem) reg=111 (dst:DI) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord3A(fn) {
this.regEDI = fn.call(this, this.regEDI, this.getEAWordStack(this.regEBP + this.regESI));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModRegWord3B(fn): mod=00 (src:mem) reg=111 (dst:DI) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord3B(fn) {
this.regEDI = fn.call(this, this.regEDI, this.getEAWordStack(this.regEBP + this.regEDI));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModRegWord3C(fn): mod=00 (src:mem) reg=111 (dst:DI) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord3C(fn) {
this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regESI));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegWord3D(fn): mod=00 (src:mem) reg=111 (dst:DI) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord3D(fn) {
this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEDI));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegWord3E(fn): mod=00 (src:mem) reg=111 (dst:DI) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord3E(fn) {
this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModRegWord3F(fn): mod=00 (src:mem) reg=111 (dst:DI) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord3F(fn) {
this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEBX));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModRegWord40(fn): mod=01 (src:mem+d8) reg=000 (dst:AX) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord40(fn) {
this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWord41(fn): mod=01 (src:mem+d8) reg=000 (dst:AX) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord41(fn) {
this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWord42(fn): mod=01 (src:mem+d8) reg=000 (dst:AX) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord42(fn) {
this.regEAX = fn.call(this, this.regEAX, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWord43(fn): mod=01 (src:mem+d8) reg=000 (dst:AX) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord43(fn) {
this.regEAX = fn.call(this, this.regEAX, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWord44(fn): mod=01 (src:mem+d8) reg=000 (dst:AX) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord44(fn) {
this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regESI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord45(fn): mod=01 (src:mem+d8) reg=000 (dst:AX) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord45(fn) {
this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEDI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord46(fn): mod=01 (src:mem+d8) reg=000 (dst:AX) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord46(fn) {
this.regEAX = fn.call(this, this.regEAX, this.getEAWordStack(this.regEBP + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord47(fn): mod=01 (src:mem+d8) reg=000 (dst:AX) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord47(fn) {
this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEBX + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord48(fn): mod=01 (src:mem+d8) reg=001 (dst:CX) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord48(fn) {
this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWord49(fn): mod=01 (src:mem+d8) reg=001 (dst:CX) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord49(fn) {
this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWord4A(fn): mod=01 (src:mem+d8) reg=001 (dst:CX) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord4A(fn) {
this.regECX = fn.call(this, this.regECX, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWord4B(fn): mod=01 (src:mem+d8) reg=001 (dst:CX) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord4B(fn) {
this.regECX = fn.call(this, this.regECX, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWord4C(fn): mod=01 (src:mem+d8) reg=001 (dst:CX) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord4C(fn) {
this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regESI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord4D(fn): mod=01 (src:mem+d8) reg=001 (dst:CX) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord4D(fn) {
this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEDI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord4E(fn): mod=01 (src:mem+d8) reg=001 (dst:CX) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord4E(fn) {
this.regECX = fn.call(this, this.regECX, this.getEAWordStack(this.regEBP + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord4F(fn): mod=01 (src:mem+d8) reg=001 (dst:CX) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord4F(fn) {
this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEBX + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord50(fn): mod=01 (src:mem+d8) reg=010 (dst:DX) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord50(fn) {
this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWord51(fn): mod=01 (src:mem+d8) reg=010 (dst:DX) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord51(fn) {
this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWord52(fn): mod=01 (src:mem+d8) reg=010 (dst:DX) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord52(fn) {
this.regEDX = fn.call(this, this.regEDX, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWord53(fn): mod=01 (src:mem+d8) reg=010 (dst:DX) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord53(fn) {
this.regEDX = fn.call(this, this.regEDX, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWord54(fn): mod=01 (src:mem+d8) reg=010 (dst:DX) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord54(fn) {
this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regESI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord55(fn): mod=01 (src:mem+d8) reg=010 (dst:DX) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord55(fn) {
this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEDI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord56(fn): mod=01 (src:mem+d8) reg=010 (dst:DX) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord56(fn) {
this.regEDX = fn.call(this, this.regEDX, this.getEAWordStack(this.regEBP + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord57(fn): mod=01 (src:mem+d8) reg=010 (dst:DX) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord57(fn) {
this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEBX + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord58(fn): mod=01 (src:mem+d8) reg=011 (dst:BX) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord58(fn) {
this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWord59(fn): mod=01 (src:mem+d8) reg=011 (dst:BX) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord59(fn) {
this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWord5A(fn): mod=01 (src:mem+d8) reg=011 (dst:BX) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord5A(fn) {
this.regEBX = fn.call(this, this.regEBX, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWord5B(fn): mod=01 (src:mem+d8) reg=011 (dst:BX) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord5B(fn) {
this.regEBX = fn.call(this, this.regEBX, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWord5C(fn): mod=01 (src:mem+d8) reg=011 (dst:BX) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord5C(fn) {
this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regESI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord5D(fn): mod=01 (src:mem+d8) reg=011 (dst:BX) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord5D(fn) {
this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEDI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord5E(fn): mod=01 (src:mem+d8) reg=011 (dst:BX) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord5E(fn) {
this.regEBX = fn.call(this, this.regEBX, this.getEAWordStack(this.regEBP + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord5F(fn): mod=01 (src:mem+d8) reg=011 (dst:BX) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord5F(fn) {
this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEBX + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord60(fn): mod=01 (src:mem+d8) reg=100 (dst:SP) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord60(fn) {
this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp())));
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWord61(fn): mod=01 (src:mem+d8) reg=100 (dst:SP) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord61(fn) {
this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp())));
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWord62(fn): mod=01 (src:mem+d8) reg=100 (dst:SP) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord62(fn) {
this.setSP(fn.call(this, this.getSP(), this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp())));
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWord63(fn): mod=01 (src:mem+d8) reg=100 (dst:SP) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord63(fn) {
this.setSP(fn.call(this, this.getSP(), this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp())));
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWord64(fn): mod=01 (src:mem+d8) reg=100 (dst:SP) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord64(fn) {
this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regESI + this.getIPDisp())));
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord65(fn): mod=01 (src:mem+d8) reg=100 (dst:SP) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord65(fn) {
this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEDI + this.getIPDisp())));
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord66(fn): mod=01 (src:mem+d8) reg=100 (dst:SP) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord66(fn) {
this.setSP(fn.call(this, this.getSP(), this.getEAWordStack(this.regEBP + this.getIPDisp())));
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord67(fn): mod=01 (src:mem+d8) reg=100 (dst:SP) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord67(fn) {
this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEBX + this.getIPDisp())));
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord68(fn): mod=01 (src:mem+d8) reg=101 (dst:BP) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord68(fn) {
this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWord69(fn): mod=01 (src:mem+d8) reg=101 (dst:BP) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord69(fn) {
this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWord6A(fn): mod=01 (src:mem+d8) reg=101 (dst:BP) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord6A(fn) {
this.regEBP = fn.call(this, this.regEBP, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWord6B(fn): mod=01 (src:mem+d8) reg=101 (dst:BP) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord6B(fn) {
this.regEBP = fn.call(this, this.regEBP, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWord6C(fn): mod=01 (src:mem+d8) reg=101 (dst:BP) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord6C(fn) {
this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regESI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord6D(fn): mod=01 (src:mem+d8) reg=101 (dst:BP) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord6D(fn) {
this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEDI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord6E(fn): mod=01 (src:mem+d8) reg=101 (dst:BP) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord6E(fn) {
this.regEBP = fn.call(this, this.regEBP, this.getEAWordStack(this.regEBP + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord6F(fn): mod=01 (src:mem+d8) reg=101 (dst:BP) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord6F(fn) {
this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEBX + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord70(fn): mod=01 (src:mem+d8) reg=110 (dst:SI) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord70(fn) {
this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWord71(fn): mod=01 (src:mem+d8) reg=110 (dst:SI) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord71(fn) {
this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWord72(fn): mod=01 (src:mem+d8) reg=110 (dst:SI) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord72(fn) {
this.regESI = fn.call(this, this.regESI, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWord73(fn): mod=01 (src:mem+d8) reg=110 (dst:SI) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord73(fn) {
this.regESI = fn.call(this, this.regESI, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWord74(fn): mod=01 (src:mem+d8) reg=110 (dst:SI) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord74(fn) {
this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regESI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord75(fn): mod=01 (src:mem+d8) reg=110 (dst:SI) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord75(fn) {
this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEDI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord76(fn): mod=01 (src:mem+d8) reg=110 (dst:SI) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord76(fn) {
this.regESI = fn.call(this, this.regESI, this.getEAWordStack(this.regEBP + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord77(fn): mod=01 (src:mem+d8) reg=110 (dst:SI) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord77(fn) {
this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEBX + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord78(fn): mod=01 (src:mem+d8) reg=111 (dst:DI) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord78(fn) {
this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWord79(fn): mod=01 (src:mem+d8) reg=111 (dst:DI) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord79(fn) {
this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWord7A(fn): mod=01 (src:mem+d8) reg=111 (dst:DI) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord7A(fn) {
this.regEDI = fn.call(this, this.regEDI, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWord7B(fn): mod=01 (src:mem+d8) reg=111 (dst:DI) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord7B(fn) {
this.regEDI = fn.call(this, this.regEDI, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWord7C(fn): mod=01 (src:mem+d8) reg=111 (dst:DI) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord7C(fn) {
this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regESI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord7D(fn): mod=01 (src:mem+d8) reg=111 (dst:DI) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord7D(fn) {
this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEDI + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord7E(fn): mod=01 (src:mem+d8) reg=111 (dst:DI) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord7E(fn) {
this.regEDI = fn.call(this, this.regEDI, this.getEAWordStack(this.regEBP + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord7F(fn): mod=01 (src:mem+d8) reg=111 (dst:DI) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord7F(fn) {
this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEBX + this.getIPDisp()));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord80(fn): mod=10 (src:mem+d16) reg=000 (dst:AX) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord80(fn) {
this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWord81(fn): mod=10 (src:mem+d16) reg=000 (dst:AX) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord81(fn) {
this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWord82(fn): mod=10 (src:mem+d16) reg=000 (dst:AX) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord82(fn) {
this.regEAX = fn.call(this, this.regEAX, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWord83(fn): mod=10 (src:mem+d16) reg=000 (dst:AX) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord83(fn) {
this.regEAX = fn.call(this, this.regEAX, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWord84(fn): mod=10 (src:mem+d16) reg=000 (dst:AX) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord84(fn) {
this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regESI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord85(fn): mod=10 (src:mem+d16) reg=000 (dst:AX) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord85(fn) {
this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEDI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord86(fn): mod=10 (src:mem+d16) reg=000 (dst:AX) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord86(fn) {
this.regEAX = fn.call(this, this.regEAX, this.getEAWordStack(this.regEBP + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord87(fn): mod=10 (src:mem+d16) reg=000 (dst:AX) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord87(fn) {
this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEBX + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord88(fn): mod=10 (src:mem+d16) reg=001 (dst:CX) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord88(fn) {
this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWord89(fn): mod=10 (src:mem+d16) reg=001 (dst:CX) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord89(fn) {
this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWord8A(fn): mod=10 (src:mem+d16) reg=001 (dst:CX) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord8A(fn) {
this.regECX = fn.call(this, this.regECX, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWord8B(fn): mod=10 (src:mem+d16) reg=001 (dst:CX) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord8B(fn) {
this.regECX = fn.call(this, this.regECX, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWord8C(fn): mod=10 (src:mem+d16) reg=001 (dst:CX) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord8C(fn) {
this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regESI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord8D(fn): mod=10 (src:mem+d16) reg=001 (dst:CX) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord8D(fn) {
this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEDI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord8E(fn): mod=10 (src:mem+d16) reg=001 (dst:CX) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord8E(fn) {
this.regECX = fn.call(this, this.regECX, this.getEAWordStack(this.regEBP + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord8F(fn): mod=10 (src:mem+d16) reg=001 (dst:CX) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord8F(fn) {
this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEBX + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord90(fn): mod=10 (src:mem+d16) reg=010 (dst:DX) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord90(fn) {
this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWord91(fn): mod=10 (src:mem+d16) reg=010 (dst:DX) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord91(fn) {
this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWord92(fn): mod=10 (src:mem+d16) reg=010 (dst:DX) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord92(fn) {
this.regEDX = fn.call(this, this.regEDX, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWord93(fn): mod=10 (src:mem+d16) reg=010 (dst:DX) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord93(fn) {
this.regEDX = fn.call(this, this.regEDX, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWord94(fn): mod=10 (src:mem+d16) reg=010 (dst:DX) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord94(fn) {
this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regESI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord95(fn): mod=10 (src:mem+d16) reg=010 (dst:DX) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord95(fn) {
this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEDI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord96(fn): mod=10 (src:mem+d16) reg=010 (dst:DX) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord96(fn) {
this.regEDX = fn.call(this, this.regEDX, this.getEAWordStack(this.regEBP + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord97(fn): mod=10 (src:mem+d16) reg=010 (dst:DX) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord97(fn) {
this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEBX + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord98(fn): mod=10 (src:mem+d16) reg=011 (dst:BX) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord98(fn) {
this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWord99(fn): mod=10 (src:mem+d16) reg=011 (dst:BX) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord99(fn) {
this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWord9A(fn): mod=10 (src:mem+d16) reg=011 (dst:BX) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord9A(fn) {
this.regEBX = fn.call(this, this.regEBX, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWord9B(fn): mod=10 (src:mem+d16) reg=011 (dst:BX) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord9B(fn) {
this.regEBX = fn.call(this, this.regEBX, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWord9C(fn): mod=10 (src:mem+d16) reg=011 (dst:BX) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord9C(fn) {
this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regESI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord9D(fn): mod=10 (src:mem+d16) reg=011 (dst:BX) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord9D(fn) {
this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEDI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord9E(fn): mod=10 (src:mem+d16) reg=011 (dst:BX) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord9E(fn) {
this.regEBX = fn.call(this, this.regEBX, this.getEAWordStack(this.regEBP + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWord9F(fn): mod=10 (src:mem+d16) reg=011 (dst:BX) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWord9F(fn) {
this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEBX + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWordA0(fn): mod=10 (src:mem+d16) reg=100 (dst:SP) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordA0(fn) {
this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr())));
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWordA1(fn): mod=10 (src:mem+d16) reg=100 (dst:SP) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordA1(fn) {
this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr())));
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWordA2(fn): mod=10 (src:mem+d16) reg=100 (dst:SP) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordA2(fn) {
this.setSP(fn.call(this, this.getSP(), this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr())));
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWordA3(fn): mod=10 (src:mem+d16) reg=100 (dst:SP) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordA3(fn) {
this.setSP(fn.call(this, this.getSP(), this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr())));
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWordA4(fn): mod=10 (src:mem+d16) reg=100 (dst:SP) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordA4(fn) {
this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regESI + this.getIPAddr())));
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWordA5(fn): mod=10 (src:mem+d16) reg=100 (dst:SP) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordA5(fn) {
this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEDI + this.getIPAddr())));
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWordA6(fn): mod=10 (src:mem+d16) reg=100 (dst:SP) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordA6(fn) {
this.setSP(fn.call(this, this.getSP(), this.getEAWordStack(this.regEBP + this.getIPAddr())));
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWordA7(fn): mod=10 (src:mem+d16) reg=100 (dst:SP) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordA7(fn) {
this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEBX + this.getIPAddr())));
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWordA8(fn): mod=10 (src:mem+d16) reg=101 (dst:BP) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordA8(fn) {
this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWordA9(fn): mod=10 (src:mem+d16) reg=101 (dst:BP) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordA9(fn) {
this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWordAA(fn): mod=10 (src:mem+d16) reg=101 (dst:BP) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordAA(fn) {
this.regEBP = fn.call(this, this.regEBP, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWordAB(fn): mod=10 (src:mem+d16) reg=101 (dst:BP) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordAB(fn) {
this.regEBP = fn.call(this, this.regEBP, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWordAC(fn): mod=10 (src:mem+d16) reg=101 (dst:BP) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordAC(fn) {
this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regESI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWordAD(fn): mod=10 (src:mem+d16) reg=101 (dst:BP) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordAD(fn) {
this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEDI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWordAE(fn): mod=10 (src:mem+d16) reg=101 (dst:BP) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordAE(fn) {
this.regEBP = fn.call(this, this.regEBP, this.getEAWordStack(this.regEBP + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWordAF(fn): mod=10 (src:mem+d16) reg=101 (dst:BP) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordAF(fn) {
this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEBX + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWordB0(fn): mod=10 (src:mem+d16) reg=110 (dst:SI) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordB0(fn) {
this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWordB1(fn): mod=10 (src:mem+d16) reg=110 (dst:SI) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordB1(fn) {
this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWordB2(fn): mod=10 (src:mem+d16) reg=110 (dst:SI) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordB2(fn) {
this.regESI = fn.call(this, this.regESI, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWordB3(fn): mod=10 (src:mem+d16) reg=110 (dst:SI) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordB3(fn) {
this.regESI = fn.call(this, this.regESI, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWordB4(fn): mod=10 (src:mem+d16) reg=110 (dst:SI) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordB4(fn) {
this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regESI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWordB5(fn): mod=10 (src:mem+d16) reg=110 (dst:SI) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordB5(fn) {
this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEDI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWordB6(fn): mod=10 (src:mem+d16) reg=110 (dst:SI) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordB6(fn) {
this.regESI = fn.call(this, this.regESI, this.getEAWordStack(this.regEBP + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWordB7(fn): mod=10 (src:mem+d16) reg=110 (dst:SI) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordB7(fn) {
this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEBX + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWordB8(fn): mod=10 (src:mem+d16) reg=111 (dst:DI) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordB8(fn) {
this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWordB9(fn): mod=10 (src:mem+d16) reg=111 (dst:DI) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordB9(fn) {
this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWordBA(fn): mod=10 (src:mem+d16) reg=111 (dst:DI) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordBA(fn) {
this.regEDI = fn.call(this, this.regEDI, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModRegWordBB(fn): mod=10 (src:mem+d16) reg=111 (dst:DI) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordBB(fn) {
this.regEDI = fn.call(this, this.regEDI, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModRegWordBC(fn): mod=10 (src:mem+d16) reg=111 (dst:DI) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordBC(fn) {
this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regESI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWordBD(fn): mod=10 (src:mem+d16) reg=111 (dst:DI) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordBD(fn) {
this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEDI + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWordBE(fn): mod=10 (src:mem+d16) reg=111 (dst:DI) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordBE(fn) {
this.regEDI = fn.call(this, this.regEDI, this.getEAWordStack(this.regEBP + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWordBF(fn): mod=10 (src:mem+d16) reg=111 (dst:DI) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordBF(fn) {
this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEBX + this.getIPAddr()));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModRegWordC0(fn): mod=11 (src:reg) reg=000 (dst:AX) r/m=000 (AX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordC0(fn) {
this.regEAX = fn.call(this, this.regEAX, this.regEAX);
},
/**
* opModRegWordC1(fn): mod=11 (src:reg) reg=000 (dst:AX) r/m=001 (CX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordC1(fn) {
this.regEAX = fn.call(this, this.regEAX, this.regECX);
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiCL; this.backTrack.btiAH = this.backTrack.btiCH;
}
},
/**
* opModRegWordC2(fn): mod=11 (src:reg) reg=000 (dst:AX) r/m=010 (DX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordC2(fn) {
this.regEAX = fn.call(this, this.regEAX, this.regEDX);
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiDL; this.backTrack.btiAH = this.backTrack.btiDH;
}
},
/**
* opModRegWordC3(fn): mod=11 (src:reg) reg=000 (dst:AX) r/m=011 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordC3(fn) {
this.regEAX = fn.call(this, this.regEAX, this.regEBX);
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiBL; this.backTrack.btiAH = this.backTrack.btiBH;
}
},
/**
* opModRegWordC4(fn): mod=11 (src:reg) reg=000 (dst:AX) r/m=100 (SP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordC4(fn) {
this.regEAX = fn.call(this, this.regEAX, this.getSP());
if (BACKTRACK) {
this.backTrack.btiAL = X86.BACKTRACK.SP_LO; this.backTrack.btiAH = X86.BACKTRACK.SP_HI;
}
},
/**
* opModRegWordC5(fn): mod=11 (src:reg) reg=000 (dst:AX) r/m=101 (BP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordC5(fn) {
this.regEAX = fn.call(this, this.regEAX, this.regEBP);
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiBPLo; this.backTrack.btiAH = this.backTrack.btiBPHi;
}
},
/**
* opModRegWordC6(fn): mod=11 (src:reg) reg=000 (dst:AX) r/m=110 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordC6(fn) {
this.regEAX = fn.call(this, this.regEAX, this.regESI);
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiSILo; this.backTrack.btiAH = this.backTrack.btiSIHi;
}
},
/**
* opModRegWordC7(fn): mod=11 (src:reg) reg=000 (dst:AX) r/m=111 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordC7(fn) {
this.regEAX = fn.call(this, this.regEAX, this.regEDI);
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiDILo; this.backTrack.btiAH = this.backTrack.btiDIHi;
}
},
/**
* opModRegWordC8(fn): mod=11 (src:reg) reg=001 (dst:CX) r/m=000 (AX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordC8(fn) {
this.regECX = fn.call(this, this.regECX, this.regEAX);
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiAL; this.backTrack.btiCH = this.backTrack.btiAH;
}
},
/**
* opModRegWordC9(fn): mod=11 (src:reg) reg=001 (dst:CX) r/m=001 (CX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordC9(fn) {
this.regECX = fn.call(this, this.regECX, this.regECX);
},
/**
* opModRegWordCA(fn): mod=11 (src:reg) reg=001 (dst:CX) r/m=010 (DX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordCA(fn) {
this.regECX = fn.call(this, this.regECX, this.regEDX);
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiDL; this.backTrack.btiCH = this.backTrack.btiDH;
}
},
/**
* opModRegWordCB(fn): mod=11 (src:reg) reg=001 (dst:CX) r/m=011 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordCB(fn) {
this.regECX = fn.call(this, this.regECX, this.regEBX);
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiBL; this.backTrack.btiCH = this.backTrack.btiBH;
}
},
/**
* opModRegWordCC(fn): mod=11 (src:reg) reg=001 (dst:CX) r/m=100 (SP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordCC(fn) {
this.regECX = fn.call(this, this.regECX, this.getSP());
if (BACKTRACK) {
this.backTrack.btiCL = X86.BACKTRACK.SP_LO; this.backTrack.btiCH = X86.BACKTRACK.SP_HI;
}
},
/**
* opModRegWordCD(fn): mod=11 (src:reg) reg=001 (dst:CX) r/m=101 (BP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordCD(fn) {
this.regECX = fn.call(this, this.regECX, this.regEBP);
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiBPLo; this.backTrack.btiCH = this.backTrack.btiBPHi;
}
},
/**
* opModRegWordCE(fn): mod=11 (src:reg) reg=001 (dst:CX) r/m=110 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordCE(fn) {
this.regECX = fn.call(this, this.regECX, this.regESI);
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiSILo; this.backTrack.btiCH = this.backTrack.btiSIHi;
}
},
/**
* opModRegWordCF(fn): mod=11 (src:reg) reg=001 (dst:CX) r/m=111 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordCF(fn) {
this.regECX = fn.call(this, this.regECX, this.regEDI);
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiDILo; this.backTrack.btiCH = this.backTrack.btiDIHi;
}
},
/**
* opModRegWordD0(fn): mod=11 (src:reg) reg=010 (dst:DX) r/m=000 (AX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordD0(fn) {
this.regEDX = fn.call(this, this.regEDX, this.regEAX);
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiAL; this.backTrack.btiDH = this.backTrack.btiAH;
}
},
/**
* opModRegWordD1(fn): mod=11 (src:reg) reg=010 (dst:DX) r/m=001 (CX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordD1(fn) {
this.regEDX = fn.call(this, this.regEDX, this.regECX);
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiCL; this.backTrack.btiDH = this.backTrack.btiCH;
}
},
/**
* opModRegWordD2(fn): mod=11 (src:reg) reg=010 (dst:DX) r/m=010 (DX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordD2(fn) {
this.regEDX = fn.call(this, this.regEDX, this.regEDX);
},
/**
* opModRegWordD3(fn): mod=11 (src:reg) reg=010 (dst:DX) r/m=011 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordD3(fn) {
this.regEDX = fn.call(this, this.regEDX, this.regEBX);
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiBL; this.backTrack.btiDH = this.backTrack.btiBH;
}
},
/**
* opModRegWordD4(fn): mod=11 (src:reg) reg=010 (dst:DX) r/m=100 (SP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordD4(fn) {
this.regEDX = fn.call(this, this.regEDX, this.getSP());
if (BACKTRACK) {
this.backTrack.btiDL = X86.BACKTRACK.SP_LO; this.backTrack.btiDH = X86.BACKTRACK.SP_HI;
}
},
/**
* opModRegWordD5(fn): mod=11 (src:reg) reg=010 (dst:DX) r/m=101 (BP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordD5(fn) {
this.regEDX = fn.call(this, this.regEDX, this.regEBP);
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiBPLo; this.backTrack.btiDH = this.backTrack.btiBPHi;
}
},
/**
* opModRegWordD6(fn): mod=11 (src:reg) reg=010 (dst:DX) r/m=110 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordD6(fn) {
this.regEDX = fn.call(this, this.regEDX, this.regESI);
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiSILo; this.backTrack.btiDH = this.backTrack.btiSIHi;
}
},
/**
* opModRegWordD7(fn): mod=11 (src:reg) reg=010 (dst:DX) r/m=111 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordD7(fn) {
this.regEDX = fn.call(this, this.regEDX, this.regEDI);
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiDILo; this.backTrack.btiDH = this.backTrack.btiDIHi;
}
},
/**
* opModRegWordD8(fn): mod=11 (src:reg) reg=011 (dst:BX) r/m=000 (AX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordD8(fn) {
this.regEBX = fn.call(this, this.regEBX, this.regEAX);
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiAL; this.backTrack.btiBH = this.backTrack.btiAH;
}
},
/**
* opModRegWordD9(fn): mod=11 (src:reg) reg=011 (dst:BX) r/m=001 (CX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordD9(fn) {
this.regEBX = fn.call(this, this.regEBX, this.regECX);
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiCL; this.backTrack.btiBH = this.backTrack.btiCH;
}
},
/**
* opModRegWordDA(fn): mod=11 (src:reg) reg=011 (dst:BX) r/m=010 (DX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordDA(fn) {
this.regEBX = fn.call(this, this.regEBX, this.regEDX);
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiDL; this.backTrack.btiBH = this.backTrack.btiDH;
}
},
/**
* opModRegWordDB(fn): mod=11 (src:reg) reg=011 (dst:BX) r/m=011 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordDB(fn) {
this.regEBX = fn.call(this, this.regEBX, this.regEBX);
},
/**
* opModRegWordDC(fn): mod=11 (src:reg) reg=011 (dst:BX) r/m=100 (SP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordDC(fn) {
this.regEBX = fn.call(this, this.regEBX, this.getSP());
if (BACKTRACK) {
this.backTrack.btiBL = X86.BACKTRACK.SP_LO; this.backTrack.btiBH = X86.BACKTRACK.SP_HI;
}
},
/**
* opModRegWordDD(fn): mod=11 (src:reg) reg=011 (dst:BX) r/m=101 (BP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordDD(fn) {
this.regEBX = fn.call(this, this.regEBX, this.regEBP);
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiBPLo; this.backTrack.btiBH = this.backTrack.btiBPHi;
}
},
/**
* opModRegWordDE(fn): mod=11 (src:reg) reg=011 (dst:BX) r/m=110 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordDE(fn) {
this.regEBX = fn.call(this, this.regEBX, this.regESI);
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiSILo; this.backTrack.btiBH = this.backTrack.btiSIHi;
}
},
/**
* opModRegWordDF(fn): mod=11 (src:reg) reg=011 (dst:BX) r/m=111 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordDF(fn) {
this.regEBX = fn.call(this, this.regEBX, this.regEDI);
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiDILo; this.backTrack.btiBH = this.backTrack.btiDIHi;
}
},
/**
* opModRegWordE0(fn): mod=11 (src:reg) reg=100 (dst:SP) r/m=000 (AX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordE0(fn) {
this.setSP(fn.call(this, this.getSP(), this.regEAX));
},
/**
* opModRegWordE1(fn): mod=11 (src:reg) reg=100 (dst:SP) r/m=001 (CX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordE1(fn) {
this.setSP(fn.call(this, this.getSP(), this.regECX));
},
/**
* opModRegWordE2(fn): mod=11 (src:reg) reg=100 (dst:SP) r/m=010 (DX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordE2(fn) {
this.setSP(fn.call(this, this.getSP(), this.regEDX));
},
/**
* opModRegWordE3(fn): mod=11 (src:reg) reg=100 (dst:SP) r/m=011 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordE3(fn) {
this.setSP(fn.call(this, this.getSP(), this.regEBX));
},
/**
* opModRegWordE4(fn): mod=11 (src:reg) reg=100 (dst:SP) r/m=100 (SP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordE4(fn) {
this.setSP(fn.call(this, this.getSP(), this.getSP()));
},
/**
* opModRegWordE5(fn): mod=11 (src:reg) reg=100 (dst:SP) r/m=101 (BP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordE5(fn) {
this.setSP(fn.call(this, this.getSP(), this.regEBP));
},
/**
* opModRegWordE6(fn): mod=11 (src:reg) reg=100 (dst:SP) r/m=110 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordE6(fn) {
this.setSP(fn.call(this, this.getSP(), this.regESI));
},
/**
* opModRegWordE7(fn): mod=11 (src:reg) reg=100 (dst:SP) r/m=111 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordE7(fn) {
this.setSP(fn.call(this, this.getSP(), this.regEDI));
},
/**
* opModRegWordE8(fn): mod=11 (src:reg) reg=101 (dst:BP) r/m=000 (AX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordE8(fn) {
this.regEBP = fn.call(this, this.regEBP, this.regEAX);
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiAL; this.backTrack.btiBPHi = this.backTrack.btiAH;
}
},
/**
* opModRegWordE9(fn): mod=11 (src:reg) reg=101 (dst:BP) r/m=001 (CX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordE9(fn) {
this.regEBP = fn.call(this, this.regEBP, this.regECX);
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiCL; this.backTrack.btiBPHi = this.backTrack.btiCH;
}
},
/**
* opModRegWordEA(fn): mod=11 (src:reg) reg=101 (dst:BP) r/m=010 (DX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordEA(fn) {
this.regEBP = fn.call(this, this.regEBP, this.regEDX);
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiDL; this.backTrack.btiBPHi = this.backTrack.btiDH;
}
},
/**
* opModRegWordEB(fn): mod=11 (src:reg) reg=101 (dst:BP) r/m=011 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordEB(fn) {
this.regEBP = fn.call(this, this.regEBP, this.regEBX);
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiBL; this.backTrack.btiBPHi = this.backTrack.btiBH;
}
},
/**
* opModRegWordEC(fn): mod=11 (src:reg) reg=101 (dst:BP) r/m=100 (SP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordEC(fn) {
this.regEBP = fn.call(this, this.regEBP, this.getSP());
if (BACKTRACK) {
this.backTrack.btiBPLo = X86.BACKTRACK.SP_LO; this.backTrack.btiBPHi = X86.BACKTRACK.SP_HI;
}
},
/**
* opModRegWordED(fn): mod=11 (src:reg) reg=101 (dst:BP) r/m=101 (BP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordED(fn) {
this.regEBP = fn.call(this, this.regEBP, this.regEBP);
},
/**
* opModRegWordEE(fn): mod=11 (src:reg) reg=101 (dst:BP) r/m=110 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordEE(fn) {
this.regEBP = fn.call(this, this.regEBP, this.regESI);
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiSILo; this.backTrack.btiBPHi = this.backTrack.btiSIHi;
}
},
/**
* opModRegWordEF(fn): mod=11 (src:reg) reg=101 (dst:BP) r/m=111 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordEF(fn) {
this.regEBP = fn.call(this, this.regEBP, this.regEDI);
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiDILo; this.backTrack.btiBPHi = this.backTrack.btiDIHi;
}
},
/**
* opModRegWordF0(fn): mod=11 (src:reg) reg=110 (dst:SI) r/m=000 (AX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordF0(fn) {
this.regESI = fn.call(this, this.regESI, this.regEAX);
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiAL; this.backTrack.btiSIHi = this.backTrack.btiAH;
}
},
/**
* opModRegWordF1(fn): mod=11 (src:reg) reg=110 (dst:SI) r/m=001 (CX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordF1(fn) {
this.regESI = fn.call(this, this.regESI, this.regECX);
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiCL; this.backTrack.btiSIHi = this.backTrack.btiCH;
}
},
/**
* opModRegWordF2(fn): mod=11 (src:reg) reg=110 (dst:SI) r/m=010 (DX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordF2(fn) {
this.regESI = fn.call(this, this.regESI, this.regEDX);
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiDL; this.backTrack.btiSIHi = this.backTrack.btiDH;
}
},
/**
* opModRegWordF3(fn): mod=11 (src:reg) reg=110 (dst:SI) r/m=011 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordF3(fn) {
this.regESI = fn.call(this, this.regESI, this.regEBX);
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiBL; this.backTrack.btiSIHi = this.backTrack.btiBH;
}
},
/**
* opModRegWordF4(fn): mod=11 (src:reg) reg=110 (dst:SI) r/m=100 (SP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordF4(fn) {
this.regESI = fn.call(this, this.regESI, this.getSP());
if (BACKTRACK) {
this.backTrack.btiSILo = X86.BACKTRACK.SP_LO; this.backTrack.btiSIHi = X86.BACKTRACK.SP_HI;
}
},
/**
* opModRegWordF5(fn): mod=11 (src:reg) reg=110 (dst:SI) r/m=101 (BP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordF5(fn) {
this.regESI = fn.call(this, this.regESI, this.regEBP);
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiBPLo; this.backTrack.btiSIHi = this.backTrack.btiBPHi;
}
},
/**
* opModRegWordF6(fn): mod=11 (src:reg) reg=110 (dst:SI) r/m=110 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordF6(fn) {
this.regESI = fn.call(this, this.regESI, this.regESI);
},
/**
* opModRegWordF7(fn): mod=11 (src:reg) reg=110 (dst:SI) r/m=111 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordF7(fn) {
this.regESI = fn.call(this, this.regESI, this.regEDI);
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiDILo; this.backTrack.btiSIHi = this.backTrack.btiDIHi;
}
},
/**
* opModRegWordF8(fn): mod=11 (src:reg) reg=111 (dst:DI) r/m=000 (AX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordF8(fn) {
this.regEDI = fn.call(this, this.regEDI, this.regEAX);
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiAL; this.backTrack.btiDIHi = this.backTrack.btiAH;
}
},
/**
* opModRegWordF9(fn): mod=11 (src:reg) reg=111 (dst:DI) r/m=001 (CX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordF9(fn) {
this.regEDI = fn.call(this, this.regEDI, this.regECX);
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiCL; this.backTrack.btiDIHi = this.backTrack.btiCH;
}
},
/**
* opModRegWordFA(fn): mod=11 (src:reg) reg=111 (dst:DI) r/m=010 (DX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordFA(fn) {
this.regEDI = fn.call(this, this.regEDI, this.regEDX);
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiDL; this.backTrack.btiDIHi = this.backTrack.btiDH;
}
},
/**
* opModRegWordFB(fn): mod=11 (src:reg) reg=111 (dst:DI) r/m=011 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordFB(fn) {
this.regEDI = fn.call(this, this.regEDI, this.regEBX);
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiBL; this.backTrack.btiDIHi = this.backTrack.btiBH;
}
},
/**
* opModRegWordFC(fn): mod=11 (src:reg) reg=111 (dst:DI) r/m=100 (SP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordFC(fn) {
this.regEDI = fn.call(this, this.regEDI, this.getSP());
if (BACKTRACK) {
this.backTrack.btiDILo = X86.BACKTRACK.SP_LO; this.backTrack.btiDIHi = X86.BACKTRACK.SP_HI;
}
},
/**
* opModRegWordFD(fn): mod=11 (src:reg) reg=111 (dst:DI) r/m=101 (BP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordFD(fn) {
this.regEDI = fn.call(this, this.regEDI, this.regEBP);
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiBPLo; this.backTrack.btiDIHi = this.backTrack.btiBPHi;
}
},
/**
* opModRegWordFE(fn): mod=11 (src:reg) reg=111 (dst:DI) r/m=110 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordFE(fn) {
this.regEDI = fn.call(this, this.regEDI, this.regESI);
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiSILo; this.backTrack.btiDIHi = this.backTrack.btiSIHi;
}
},
/**
* opModRegWordFF(fn): mod=11 (src:reg) reg=111 (dst:DI) r/m=111 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModRegWordFF(fn) {
this.regEDI = fn.call(this, this.regEDI, this.regEDI);
}
];
X86ModW.aOpModMem = [
/**
* opModMemWord00(fn): mod=00 (dst:mem) reg=000 (src:AX) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord00(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEAX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemWord01(fn): mod=00 (dst:mem) reg=000 (src:AX) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord01(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEAX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemWord02(fn): mod=00 (dst:mem) reg=000 (src:AX) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord02(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEAX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemWord03(fn): mod=00 (dst:mem) reg=000 (src:AX) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord03(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEAX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemWord04(fn): mod=00 (dst:mem) reg=000 (src:AX) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord04(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI), this.regEAX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemWord05(fn): mod=00 (dst:mem) reg=000 (src:AX) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord05(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEAX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemWord06(fn): mod=00 (dst:mem) reg=000 (src:AX) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord06(fn) {
var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEAX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModMemWord07(fn): mod=00 (dst:mem) reg=000 (src:AX) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord07(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEAX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemWord08(fn): mod=00 (dst:mem) reg=001 (src:CX) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord08(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regECX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemWord09(fn): mod=00 (dst:mem) reg=001 (src:CX) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord09(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regECX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemWord0A(fn): mod=00 (dst:mem) reg=001 (src:CX) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord0A(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regECX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemWord0B(fn): mod=00 (dst:mem) reg=001 (src:CX) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord0B(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regECX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemWord0C(fn): mod=00 (dst:mem) reg=001 (src:CX) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord0C(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI), this.regECX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemWord0D(fn): mod=00 (dst:mem) reg=001 (src:CX) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord0D(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI), this.regECX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemWord0E(fn): mod=00 (dst:mem) reg=001 (src:CX) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord0E(fn) {
var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regECX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModMemWord0F(fn): mod=00 (dst:mem) reg=001 (src:CX) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord0F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX), this.regECX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemWord10(fn): mod=00 (dst:mem) reg=010 (src:DX) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord10(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEDX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemWord11(fn): mod=00 (dst:mem) reg=010 (src:DX) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord11(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEDX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemWord12(fn): mod=00 (dst:mem) reg=010 (src:DX) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord12(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEDX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemWord13(fn): mod=00 (dst:mem) reg=010 (src:DX) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord13(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEDX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemWord14(fn): mod=00 (dst:mem) reg=010 (src:DX) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord14(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI), this.regEDX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemWord15(fn): mod=00 (dst:mem) reg=010 (src:DX) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord15(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEDX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemWord16(fn): mod=00 (dst:mem) reg=010 (src:DX) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord16(fn) {
var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEDX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModMemWord17(fn): mod=00 (dst:mem) reg=010 (src:DX) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord17(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEDX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemWord18(fn): mod=00 (dst:mem) reg=011 (src:BX) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord18(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEBX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemWord19(fn): mod=00 (dst:mem) reg=011 (src:BX) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord19(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEBX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemWord1A(fn): mod=00 (dst:mem) reg=011 (src:BX) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord1A(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEBX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemWord1B(fn): mod=00 (dst:mem) reg=011 (src:BX) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord1B(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEBX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemWord1C(fn): mod=00 (dst:mem) reg=011 (src:BX) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord1C(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI), this.regEBX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemWord1D(fn): mod=00 (dst:mem) reg=011 (src:BX) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord1D(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEBX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemWord1E(fn): mod=00 (dst:mem) reg=011 (src:BX) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord1E(fn) {
var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEBX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModMemWord1F(fn): mod=00 (dst:mem) reg=011 (src:BX) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord1F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEBX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemWord20(fn): mod=00 (dst:mem) reg=100 (src:SP) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord20(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.getSP());
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemWord21(fn): mod=00 (dst:mem) reg=100 (src:SP) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord21(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.getSP());
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemWord22(fn): mod=00 (dst:mem) reg=100 (src:SP) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord22(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.getSP());
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemWord23(fn): mod=00 (dst:mem) reg=100 (src:SP) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord23(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.getSP());
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemWord24(fn): mod=00 (dst:mem) reg=100 (src:SP) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord24(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI), this.getSP());
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemWord25(fn): mod=00 (dst:mem) reg=100 (src:SP) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord25(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI), this.getSP());
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemWord26(fn): mod=00 (dst:mem) reg=100 (src:SP) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord26(fn) {
var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.getSP());
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModMemWord27(fn): mod=00 (dst:mem) reg=100 (src:SP) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord27(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX), this.getSP());
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemWord28(fn): mod=00 (dst:mem) reg=101 (src:BP) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord28(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEBP);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemWord29(fn): mod=00 (dst:mem) reg=101 (src:BP) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord29(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEBP);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemWord2A(fn): mod=00 (dst:mem) reg=101 (src:BP) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord2A(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEBP);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemWord2B(fn): mod=00 (dst:mem) reg=101 (src:BP) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord2B(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEBP);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemWord2C(fn): mod=00 (dst:mem) reg=101 (src:BP) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord2C(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI), this.regEBP);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemWord2D(fn): mod=00 (dst:mem) reg=101 (src:BP) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord2D(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEBP);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemWord2E(fn): mod=00 (dst:mem) reg=101 (src:BP) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord2E(fn) {
var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEBP);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModMemWord2F(fn): mod=00 (dst:mem) reg=101 (src:BP) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord2F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEBP);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemWord30(fn): mod=00 (dst:mem) reg=110 (src:SI) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord30(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regESI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemWord31(fn): mod=00 (dst:mem) reg=110 (src:SI) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord31(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regESI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemWord32(fn): mod=00 (dst:mem) reg=110 (src:SI) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord32(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regESI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemWord33(fn): mod=00 (dst:mem) reg=110 (src:SI) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord33(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regESI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemWord34(fn): mod=00 (dst:mem) reg=110 (src:SI) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord34(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI), this.regESI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemWord35(fn): mod=00 (dst:mem) reg=110 (src:SI) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord35(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI), this.regESI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemWord36(fn): mod=00 (dst:mem) reg=110 (src:SI) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord36(fn) {
var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regESI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModMemWord37(fn): mod=00 (dst:mem) reg=110 (src:SI) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord37(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX), this.regESI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemWord38(fn): mod=00 (dst:mem) reg=111 (src:DI) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord38(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEDI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemWord39(fn): mod=00 (dst:mem) reg=111 (src:DI) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord39(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEDI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemWord3A(fn): mod=00 (dst:mem) reg=111 (src:DI) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord3A(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEDI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModMemWord3B(fn): mod=00 (dst:mem) reg=111 (src:DI) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord3B(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEDI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModMemWord3C(fn): mod=00 (dst:mem) reg=111 (src:DI) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord3C(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI), this.regEDI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemWord3D(fn): mod=00 (dst:mem) reg=111 (src:DI) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord3D(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEDI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemWord3E(fn): mod=00 (dst:mem) reg=111 (src:DI) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord3E(fn) {
var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEDI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModMemWord3F(fn): mod=00 (dst:mem) reg=111 (src:DI) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord3F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEDI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModMemWord40(fn): mod=01 (dst:mem+d8) reg=000 (src:AX) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord40(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEAX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWord41(fn): mod=01 (dst:mem+d8) reg=000 (src:AX) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord41(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEAX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWord42(fn): mod=01 (dst:mem+d8) reg=000 (src:AX) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord42(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEAX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWord43(fn): mod=01 (dst:mem+d8) reg=000 (src:AX) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord43(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEAX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWord44(fn): mod=01 (dst:mem+d8) reg=000 (src:AX) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord44(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEAX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord45(fn): mod=01 (dst:mem+d8) reg=000 (src:AX) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord45(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEAX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord46(fn): mod=01 (dst:mem+d8) reg=000 (src:AX) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord46(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEAX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord47(fn): mod=01 (dst:mem+d8) reg=000 (src:AX) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord47(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEAX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord48(fn): mod=01 (dst:mem+d8) reg=001 (src:CX) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord48(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regECX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWord49(fn): mod=01 (dst:mem+d8) reg=001 (src:CX) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord49(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regECX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWord4A(fn): mod=01 (dst:mem+d8) reg=001 (src:CX) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord4A(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regECX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWord4B(fn): mod=01 (dst:mem+d8) reg=001 (src:CX) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord4B(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regECX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWord4C(fn): mod=01 (dst:mem+d8) reg=001 (src:CX) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord4C(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regECX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord4D(fn): mod=01 (dst:mem+d8) reg=001 (src:CX) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord4D(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regECX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord4E(fn): mod=01 (dst:mem+d8) reg=001 (src:CX) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord4E(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regECX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord4F(fn): mod=01 (dst:mem+d8) reg=001 (src:CX) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord4F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regECX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord50(fn): mod=01 (dst:mem+d8) reg=010 (src:DX) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord50(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEDX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWord51(fn): mod=01 (dst:mem+d8) reg=010 (src:DX) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord51(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEDX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWord52(fn): mod=01 (dst:mem+d8) reg=010 (src:DX) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord52(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEDX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWord53(fn): mod=01 (dst:mem+d8) reg=010 (src:DX) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord53(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEDX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWord54(fn): mod=01 (dst:mem+d8) reg=010 (src:DX) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord54(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEDX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord55(fn): mod=01 (dst:mem+d8) reg=010 (src:DX) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord55(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEDX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord56(fn): mod=01 (dst:mem+d8) reg=010 (src:DX) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord56(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEDX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord57(fn): mod=01 (dst:mem+d8) reg=010 (src:DX) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord57(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEDX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord58(fn): mod=01 (dst:mem+d8) reg=011 (src:BX) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord58(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEBX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWord59(fn): mod=01 (dst:mem+d8) reg=011 (src:BX) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord59(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEBX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWord5A(fn): mod=01 (dst:mem+d8) reg=011 (src:BX) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord5A(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEBX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWord5B(fn): mod=01 (dst:mem+d8) reg=011 (src:BX) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord5B(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEBX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWord5C(fn): mod=01 (dst:mem+d8) reg=011 (src:BX) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord5C(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEBX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord5D(fn): mod=01 (dst:mem+d8) reg=011 (src:BX) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord5D(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEBX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord5E(fn): mod=01 (dst:mem+d8) reg=011 (src:BX) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord5E(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEBX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord5F(fn): mod=01 (dst:mem+d8) reg=011 (src:BX) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord5F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEBX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord60(fn): mod=01 (dst:mem+d8) reg=100 (src:SP) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord60(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.getSP());
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWord61(fn): mod=01 (dst:mem+d8) reg=100 (src:SP) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord61(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.getSP());
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWord62(fn): mod=01 (dst:mem+d8) reg=100 (src:SP) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord62(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.getSP());
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWord63(fn): mod=01 (dst:mem+d8) reg=100 (src:SP) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord63(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.getSP());
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWord64(fn): mod=01 (dst:mem+d8) reg=100 (src:SP) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord64(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.getSP());
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord65(fn): mod=01 (dst:mem+d8) reg=100 (src:SP) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord65(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.getSP());
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord66(fn): mod=01 (dst:mem+d8) reg=100 (src:SP) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord66(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.getSP());
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord67(fn): mod=01 (dst:mem+d8) reg=100 (src:SP) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord67(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.getSP());
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord68(fn): mod=01 (dst:mem+d8) reg=101 (src:BP) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord68(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEBP);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWord69(fn): mod=01 (dst:mem+d8) reg=101 (src:BP) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord69(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEBP);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWord6A(fn): mod=01 (dst:mem+d8) reg=101 (src:BP) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord6A(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEBP);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWord6B(fn): mod=01 (dst:mem+d8) reg=101 (src:BP) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord6B(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEBP);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWord6C(fn): mod=01 (dst:mem+d8) reg=101 (src:BP) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord6C(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEBP);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord6D(fn): mod=01 (dst:mem+d8) reg=101 (src:BP) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord6D(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEBP);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord6E(fn): mod=01 (dst:mem+d8) reg=101 (src:BP) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord6E(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEBP);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord6F(fn): mod=01 (dst:mem+d8) reg=101 (src:BP) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord6F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEBP);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord70(fn): mod=01 (dst:mem+d8) reg=110 (src:SI) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord70(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regESI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWord71(fn): mod=01 (dst:mem+d8) reg=110 (src:SI) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord71(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regESI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWord72(fn): mod=01 (dst:mem+d8) reg=110 (src:SI) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord72(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regESI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWord73(fn): mod=01 (dst:mem+d8) reg=110 (src:SI) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord73(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regESI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWord74(fn): mod=01 (dst:mem+d8) reg=110 (src:SI) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord74(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regESI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord75(fn): mod=01 (dst:mem+d8) reg=110 (src:SI) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord75(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regESI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord76(fn): mod=01 (dst:mem+d8) reg=110 (src:SI) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord76(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regESI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord77(fn): mod=01 (dst:mem+d8) reg=110 (src:SI) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord77(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regESI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord78(fn): mod=01 (dst:mem+d8) reg=111 (src:DI) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord78(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEDI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWord79(fn): mod=01 (dst:mem+d8) reg=111 (src:DI) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord79(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEDI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWord7A(fn): mod=01 (dst:mem+d8) reg=111 (src:DI) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord7A(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEDI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWord7B(fn): mod=01 (dst:mem+d8) reg=111 (src:DI) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord7B(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEDI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWord7C(fn): mod=01 (dst:mem+d8) reg=111 (src:DI) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord7C(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEDI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord7D(fn): mod=01 (dst:mem+d8) reg=111 (src:DI) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord7D(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEDI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord7E(fn): mod=01 (dst:mem+d8) reg=111 (src:DI) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord7E(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEDI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord7F(fn): mod=01 (dst:mem+d8) reg=111 (src:DI) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord7F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEDI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord80(fn): mod=10 (dst:mem+d16) reg=000 (src:AX) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord80(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEAX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWord81(fn): mod=10 (dst:mem+d16) reg=000 (src:AX) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord81(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEAX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWord82(fn): mod=10 (dst:mem+d16) reg=000 (src:AX) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord82(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEAX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWord83(fn): mod=10 (dst:mem+d16) reg=000 (src:AX) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord83(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEAX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWord84(fn): mod=10 (dst:mem+d16) reg=000 (src:AX) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord84(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEAX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord85(fn): mod=10 (dst:mem+d16) reg=000 (src:AX) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord85(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEAX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord86(fn): mod=10 (dst:mem+d16) reg=000 (src:AX) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord86(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEAX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord87(fn): mod=10 (dst:mem+d16) reg=000 (src:AX) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord87(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEAX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord88(fn): mod=10 (dst:mem+d16) reg=001 (src:CX) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord88(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regECX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWord89(fn): mod=10 (dst:mem+d16) reg=001 (src:CX) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord89(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regECX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWord8A(fn): mod=10 (dst:mem+d16) reg=001 (src:CX) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord8A(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regECX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWord8B(fn): mod=10 (dst:mem+d16) reg=001 (src:CX) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord8B(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regECX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWord8C(fn): mod=10 (dst:mem+d16) reg=001 (src:CX) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord8C(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regECX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord8D(fn): mod=10 (dst:mem+d16) reg=001 (src:CX) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord8D(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regECX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord8E(fn): mod=10 (dst:mem+d16) reg=001 (src:CX) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord8E(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regECX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord8F(fn): mod=10 (dst:mem+d16) reg=001 (src:CX) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord8F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regECX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord90(fn): mod=10 (dst:mem+d16) reg=010 (src:DX) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord90(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEDX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWord91(fn): mod=10 (dst:mem+d16) reg=010 (src:DX) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord91(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEDX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWord92(fn): mod=10 (dst:mem+d16) reg=010 (src:DX) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord92(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEDX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWord93(fn): mod=10 (dst:mem+d16) reg=010 (src:DX) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord93(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEDX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWord94(fn): mod=10 (dst:mem+d16) reg=010 (src:DX) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord94(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEDX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord95(fn): mod=10 (dst:mem+d16) reg=010 (src:DX) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord95(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEDX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord96(fn): mod=10 (dst:mem+d16) reg=010 (src:DX) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord96(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEDX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord97(fn): mod=10 (dst:mem+d16) reg=010 (src:DX) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord97(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEDX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord98(fn): mod=10 (dst:mem+d16) reg=011 (src:BX) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord98(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEBX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWord99(fn): mod=10 (dst:mem+d16) reg=011 (src:BX) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord99(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEBX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWord9A(fn): mod=10 (dst:mem+d16) reg=011 (src:BX) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord9A(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEBX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWord9B(fn): mod=10 (dst:mem+d16) reg=011 (src:BX) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord9B(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEBX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWord9C(fn): mod=10 (dst:mem+d16) reg=011 (src:BX) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord9C(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEBX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord9D(fn): mod=10 (dst:mem+d16) reg=011 (src:BX) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord9D(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEBX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord9E(fn): mod=10 (dst:mem+d16) reg=011 (src:BX) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord9E(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEBX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWord9F(fn): mod=10 (dst:mem+d16) reg=011 (src:BX) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWord9F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEBX);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWordA0(fn): mod=10 (dst:mem+d16) reg=100 (src:SP) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordA0(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.getSP());
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWordA1(fn): mod=10 (dst:mem+d16) reg=100 (src:SP) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordA1(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.getSP());
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWordA2(fn): mod=10 (dst:mem+d16) reg=100 (src:SP) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordA2(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.getSP());
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWordA3(fn): mod=10 (dst:mem+d16) reg=100 (src:SP) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordA3(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.getSP());
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWordA4(fn): mod=10 (dst:mem+d16) reg=100 (src:SP) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordA4(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.getSP());
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWordA5(fn): mod=10 (dst:mem+d16) reg=100 (src:SP) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordA5(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.getSP());
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWordA6(fn): mod=10 (dst:mem+d16) reg=100 (src:SP) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordA6(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.getSP());
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWordA7(fn): mod=10 (dst:mem+d16) reg=100 (src:SP) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordA7(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.getSP());
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWordA8(fn): mod=10 (dst:mem+d16) reg=101 (src:BP) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordA8(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEBP);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWordA9(fn): mod=10 (dst:mem+d16) reg=101 (src:BP) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordA9(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEBP);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWordAA(fn): mod=10 (dst:mem+d16) reg=101 (src:BP) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordAA(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEBP);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWordAB(fn): mod=10 (dst:mem+d16) reg=101 (src:BP) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordAB(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEBP);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWordAC(fn): mod=10 (dst:mem+d16) reg=101 (src:BP) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordAC(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEBP);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWordAD(fn): mod=10 (dst:mem+d16) reg=101 (src:BP) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordAD(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEBP);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWordAE(fn): mod=10 (dst:mem+d16) reg=101 (src:BP) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordAE(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEBP);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWordAF(fn): mod=10 (dst:mem+d16) reg=101 (src:BP) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordAF(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEBP);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWordB0(fn): mod=10 (dst:mem+d16) reg=110 (src:SI) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordB0(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regESI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWordB1(fn): mod=10 (dst:mem+d16) reg=110 (src:SI) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordB1(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regESI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWordB2(fn): mod=10 (dst:mem+d16) reg=110 (src:SI) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordB2(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regESI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWordB3(fn): mod=10 (dst:mem+d16) reg=110 (src:SI) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordB3(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regESI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWordB4(fn): mod=10 (dst:mem+d16) reg=110 (src:SI) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordB4(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regESI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWordB5(fn): mod=10 (dst:mem+d16) reg=110 (src:SI) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordB5(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regESI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWordB6(fn): mod=10 (dst:mem+d16) reg=110 (src:SI) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordB6(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regESI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWordB7(fn): mod=10 (dst:mem+d16) reg=110 (src:SI) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordB7(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regESI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWordB8(fn): mod=10 (dst:mem+d16) reg=111 (src:DI) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordB8(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEDI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWordB9(fn): mod=10 (dst:mem+d16) reg=111 (src:DI) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordB9(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEDI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWordBA(fn): mod=10 (dst:mem+d16) reg=111 (src:DI) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordBA(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEDI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModMemWordBB(fn): mod=10 (dst:mem+d16) reg=111 (src:DI) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordBB(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEDI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModMemWordBC(fn): mod=10 (dst:mem+d16) reg=111 (src:DI) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordBC(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEDI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWordBD(fn): mod=10 (dst:mem+d16) reg=111 (src:DI) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordBD(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEDI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWordBE(fn): mod=10 (dst:mem+d16) reg=111 (src:DI) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordBE(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEDI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModMemWordBF(fn): mod=10 (dst:mem+d16) reg=111 (src:DI) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opModMemWordBF(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEDI);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
X86ModW.aOpModReg[0xC0], X86ModW.aOpModReg[0xC8], X86ModW.aOpModReg[0xD0], X86ModW.aOpModReg[0xD8],
X86ModW.aOpModReg[0xE0], X86ModW.aOpModReg[0xE8], X86ModW.aOpModReg[0xF0], X86ModW.aOpModReg[0xF8],
X86ModW.aOpModReg[0xC1], X86ModW.aOpModReg[0xC9], X86ModW.aOpModReg[0xD1], X86ModW.aOpModReg[0xD9],
X86ModW.aOpModReg[0xE1], X86ModW.aOpModReg[0xE9], X86ModW.aOpModReg[0xF1], X86ModW.aOpModReg[0xF9],
X86ModW.aOpModReg[0xC2], X86ModW.aOpModReg[0xCA], X86ModW.aOpModReg[0xD2], X86ModW.aOpModReg[0xDA],
X86ModW.aOpModReg[0xE2], X86ModW.aOpModReg[0xEA], X86ModW.aOpModReg[0xF2], X86ModW.aOpModReg[0xFA],
X86ModW.aOpModReg[0xC3], X86ModW.aOpModReg[0xCB], X86ModW.aOpModReg[0xD3], X86ModW.aOpModReg[0xDB],
X86ModW.aOpModReg[0xE3], X86ModW.aOpModReg[0xEB], X86ModW.aOpModReg[0xF3], X86ModW.aOpModReg[0xFB],
X86ModW.aOpModReg[0xC4], X86ModW.aOpModReg[0xCC], X86ModW.aOpModReg[0xD4], X86ModW.aOpModReg[0xDC],
X86ModW.aOpModReg[0xE4], X86ModW.aOpModReg[0xEC], X86ModW.aOpModReg[0xF4], X86ModW.aOpModReg[0xFC],
X86ModW.aOpModReg[0xC5], X86ModW.aOpModReg[0xCD], X86ModW.aOpModReg[0xD5], X86ModW.aOpModReg[0xDD],
X86ModW.aOpModReg[0xE5], X86ModW.aOpModReg[0xED], X86ModW.aOpModReg[0xF5], X86ModW.aOpModReg[0xFD],
X86ModW.aOpModReg[0xC6], X86ModW.aOpModReg[0xCE], X86ModW.aOpModReg[0xD6], X86ModW.aOpModReg[0xDE],
X86ModW.aOpModReg[0xE6], X86ModW.aOpModReg[0xEE], X86ModW.aOpModReg[0xF6], X86ModW.aOpModReg[0xFE],
X86ModW.aOpModReg[0xC7], X86ModW.aOpModReg[0xCF], X86ModW.aOpModReg[0xD7], X86ModW.aOpModReg[0xDF],
X86ModW.aOpModReg[0xE7], X86ModW.aOpModReg[0xEF], X86ModW.aOpModReg[0xF7], X86ModW.aOpModReg[0xFF]
];
X86ModW.aOpModGrp = [
/**
* opModGrpWord00(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord00(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpWord01(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord01(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpWord02(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord02(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpWord03(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord03(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpWord04(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord04(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpWord05(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord05(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpWord06(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord06(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModGrpWord07(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord07(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpWord08(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord08(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpWord09(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord09(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpWord0A(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord0A(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpWord0B(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord0B(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpWord0C(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord0C(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpWord0D(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord0D(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpWord0E(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord0E(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModGrpWord0F(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord0F(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpWord10(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord10(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpWord11(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord11(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpWord12(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord12(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpWord13(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord13(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpWord14(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord14(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpWord15(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord15(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpWord16(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord16(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModGrpWord17(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord17(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpWord18(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord18(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpWord19(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord19(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpWord1A(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord1A(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpWord1B(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord1B(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpWord1C(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord1C(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpWord1D(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord1D(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpWord1E(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord1E(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModGrpWord1F(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord1F(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpWord20(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord20(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpWord21(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord21(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpWord22(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord22(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpWord23(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord23(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpWord24(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord24(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpWord25(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord25(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpWord26(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord26(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModGrpWord27(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord27(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpWord28(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord28(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpWord29(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord29(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpWord2A(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord2A(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpWord2B(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord2B(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpWord2C(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord2C(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpWord2D(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord2D(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpWord2E(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord2E(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModGrpWord2F(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord2F(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpWord30(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord30(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpWord31(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord31(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpWord32(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord32(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpWord33(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord33(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpWord34(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord34(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpWord35(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord35(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpWord36(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord36(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModGrpWord37(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord37(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpWord38(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord38(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpWord39(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord39(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpWord3A(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord3A(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opModGrpWord3B(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord3B(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opModGrpWord3C(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord3C(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpWord3D(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord3D(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpWord3E(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord3E(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opModGrpWord3F(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord3F(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opModGrpWord40(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord40(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWord41(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord41(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWord42(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord42(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWord43(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord43(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWord44(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord44(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord45(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord45(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord46(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord46(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord47(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord47(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord48(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord48(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWord49(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord49(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWord4A(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord4A(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWord4B(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord4B(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWord4C(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord4C(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord4D(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord4D(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord4E(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord4E(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord4F(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord4F(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord50(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord50(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWord51(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord51(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWord52(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord52(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWord53(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord53(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWord54(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord54(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord55(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord55(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord56(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord56(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord57(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord57(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord58(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord58(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWord59(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord59(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWord5A(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord5A(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWord5B(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord5B(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWord5C(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord5C(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord5D(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord5D(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord5E(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord5E(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord5F(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord5F(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord60(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord60(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWord61(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord61(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWord62(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord62(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWord63(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord63(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWord64(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord64(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord65(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord65(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord66(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord66(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord67(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord67(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord68(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord68(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWord69(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord69(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWord6A(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord6A(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWord6B(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord6B(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWord6C(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord6C(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord6D(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord6D(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord6E(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord6E(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord6F(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord6F(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord70(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord70(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWord71(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord71(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWord72(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord72(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWord73(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord73(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWord74(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord74(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord75(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord75(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord76(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord76(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord77(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord77(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord78(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord78(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWord79(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord79(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWord7A(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord7A(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWord7B(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord7B(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWord7C(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord7C(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord7D(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord7D(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord7E(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord7E(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord7F(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord7F(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord80(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord80(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWord81(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord81(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWord82(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord82(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWord83(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord83(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWord84(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord84(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord85(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord85(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord86(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord86(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord87(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord87(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord88(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord88(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWord89(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord89(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWord8A(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord8A(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWord8B(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord8B(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWord8C(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord8C(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord8D(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord8D(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord8E(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord8E(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord8F(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord8F(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord90(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord90(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWord91(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord91(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWord92(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord92(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWord93(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord93(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWord94(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord94(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord95(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord95(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord96(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord96(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord97(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord97(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord98(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord98(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWord99(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord99(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWord9A(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord9A(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWord9B(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord9B(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWord9C(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord9C(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord9D(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord9D(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord9E(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord9E(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWord9F(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWord9F(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWordA0(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordA0(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWordA1(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordA1(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWordA2(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordA2(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWordA3(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordA3(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWordA4(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordA4(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWordA5(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordA5(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWordA6(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordA6(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWordA7(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordA7(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWordA8(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordA8(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWordA9(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordA9(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWordAA(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordAA(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWordAB(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordAB(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWordAC(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordAC(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWordAD(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordAD(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWordAE(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordAE(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWordAF(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordAF(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWordB0(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordB0(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWordB1(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordB1(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWordB2(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordB2(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWordB3(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordB3(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWordB4(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordB4(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWordB5(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordB5(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWordB6(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordB6(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWordB7(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordB7(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWordB8(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordB8(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWordB9(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordB9(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWordBA(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordBA(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opModGrpWordBB(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordBB(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opModGrpWordBC(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordBC(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWordBD(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordBD(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWordBE(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordBE(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWordBF(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordBF(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opModGrpWordC0(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=000 (AX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordC0(afnGrp, fnSrc) {
this.regEAX = afnGrp[0].call(this, this.regEAX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordC1(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=001 (CX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordC1(afnGrp, fnSrc) {
this.regECX = afnGrp[0].call(this, this.regECX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordC2(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=010 (DX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordC2(afnGrp, fnSrc) {
this.regEDX = afnGrp[0].call(this, this.regEDX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordC3(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=011 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordC3(afnGrp, fnSrc) {
this.regEBX = afnGrp[0].call(this, this.regEBX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordC4(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=100 (SP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordC4(afnGrp, fnSrc) {
this.setSP(afnGrp[0].call(this, this.getSP(), fnSrc.call(this)));
},
/**
* opModGrpWordC5(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=101 (BP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordC5(afnGrp, fnSrc) {
this.regEBP = afnGrp[0].call(this, this.regEBP, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordC6(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=110 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordC6(afnGrp, fnSrc) {
this.regESI = afnGrp[0].call(this, this.regESI, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordC7(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=111 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordC7(afnGrp, fnSrc) {
this.regEDI = afnGrp[0].call(this, this.regEDI, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordC8(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=000 (AX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordC8(afnGrp, fnSrc) {
this.regEAX = afnGrp[1].call(this, this.regEAX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordC9(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=001 (CX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordC9(afnGrp, fnSrc) {
this.regECX = afnGrp[1].call(this, this.regECX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordCA(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=010 (DX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordCA(afnGrp, fnSrc) {
this.regEDX = afnGrp[1].call(this, this.regEDX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordCB(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=011 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordCB(afnGrp, fnSrc) {
this.regEBX = afnGrp[1].call(this, this.regEBX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordCC(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=100 (SP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordCC(afnGrp, fnSrc) {
this.setSP(afnGrp[1].call(this, this.getSP(), fnSrc.call(this)));
},
/**
* opModGrpWordCD(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=101 (BP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordCD(afnGrp, fnSrc) {
this.regEBP = afnGrp[1].call(this, this.regEBP, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordCE(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=110 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordCE(afnGrp, fnSrc) {
this.regESI = afnGrp[1].call(this, this.regESI, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordCF(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=111 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordCF(afnGrp, fnSrc) {
this.regEDI = afnGrp[1].call(this, this.regEDI, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordD0(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=000 (AX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordD0(afnGrp, fnSrc) {
this.regEAX = afnGrp[2].call(this, this.regEAX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordD1(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=001 (CX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordD1(afnGrp, fnSrc) {
this.regECX = afnGrp[2].call(this, this.regECX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordD2(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=010 (DX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordD2(afnGrp, fnSrc) {
this.regEDX = afnGrp[2].call(this, this.regEDX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordD3(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=011 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordD3(afnGrp, fnSrc) {
this.regEBX = afnGrp[2].call(this, this.regEBX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordD4(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=100 (SP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordD4(afnGrp, fnSrc) {
this.setSP(afnGrp[2].call(this, this.getSP(), fnSrc.call(this)));
},
/**
* opModGrpWordD5(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=101 (BP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordD5(afnGrp, fnSrc) {
this.regEBP = afnGrp[2].call(this, this.regEBP, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordD6(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=110 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordD6(afnGrp, fnSrc) {
this.regESI = afnGrp[2].call(this, this.regESI, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordD7(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=111 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordD7(afnGrp, fnSrc) {
this.regEDI = afnGrp[2].call(this, this.regEDI, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordD8(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=000 (AX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordD8(afnGrp, fnSrc) {
this.regEAX = afnGrp[3].call(this, this.regEAX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordD9(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=001 (CX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordD9(afnGrp, fnSrc) {
this.regECX = afnGrp[3].call(this, this.regECX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordDA(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=010 (DX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordDA(afnGrp, fnSrc) {
this.regEDX = afnGrp[3].call(this, this.regEDX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordDB(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=011 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordDB(afnGrp, fnSrc) {
this.regEBX = afnGrp[3].call(this, this.regEBX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordDC(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=100 (SP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordDC(afnGrp, fnSrc) {
this.setSP(afnGrp[3].call(this, this.getSP(), fnSrc.call(this)));
},
/**
* opModGrpWordDD(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=101 (BP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordDD(afnGrp, fnSrc) {
this.regEBP = afnGrp[3].call(this, this.regEBP, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordDE(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=110 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordDE(afnGrp, fnSrc) {
this.regESI = afnGrp[3].call(this, this.regESI, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordDF(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=111 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordDF(afnGrp, fnSrc) {
this.regEDI = afnGrp[3].call(this, this.regEDI, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordE0(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=000 (AX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordE0(afnGrp, fnSrc) {
this.regEAX = afnGrp[4].call(this, this.regEAX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordE1(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=001 (CX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordE1(afnGrp, fnSrc) {
this.regECX = afnGrp[4].call(this, this.regECX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordE2(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=010 (DX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordE2(afnGrp, fnSrc) {
this.regEDX = afnGrp[4].call(this, this.regEDX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordE3(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=011 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordE3(afnGrp, fnSrc) {
this.regEBX = afnGrp[4].call(this, this.regEBX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordE4(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=100 (SP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordE4(afnGrp, fnSrc) {
this.setSP(afnGrp[4].call(this, this.getSP(), fnSrc.call(this)));
},
/**
* opModGrpWordE5(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=101 (BP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordE5(afnGrp, fnSrc) {
this.regEBP = afnGrp[4].call(this, this.regEBP, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordE6(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=110 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordE6(afnGrp, fnSrc) {
this.regESI = afnGrp[4].call(this, this.regESI, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordE7(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=111 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordE7(afnGrp, fnSrc) {
this.regEDI = afnGrp[4].call(this, this.regEDI, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordE8(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=000 (AX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordE8(afnGrp, fnSrc) {
this.regEAX = afnGrp[5].call(this, this.regEAX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordE9(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=001 (CX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordE9(afnGrp, fnSrc) {
this.regECX = afnGrp[5].call(this, this.regECX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordEA(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=010 (DX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordEA(afnGrp, fnSrc) {
this.regEDX = afnGrp[5].call(this, this.regEDX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordEB(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=011 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordEB(afnGrp, fnSrc) {
this.regEBX = afnGrp[5].call(this, this.regEBX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordEC(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=100 (SP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordEC(afnGrp, fnSrc) {
this.setSP(afnGrp[5].call(this, this.getSP(), fnSrc.call(this)));
},
/**
* opModGrpWordED(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=101 (BP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordED(afnGrp, fnSrc) {
this.regEBP = afnGrp[5].call(this, this.regEBP, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordEE(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=110 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordEE(afnGrp, fnSrc) {
this.regESI = afnGrp[5].call(this, this.regESI, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordEF(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=111 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordEF(afnGrp, fnSrc) {
this.regEDI = afnGrp[5].call(this, this.regEDI, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordF0(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=000 (AX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordF0(afnGrp, fnSrc) {
this.regEAX = afnGrp[6].call(this, this.regEAX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordF1(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=001 (CX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordF1(afnGrp, fnSrc) {
this.regECX = afnGrp[6].call(this, this.regECX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordF2(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=010 (DX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordF2(afnGrp, fnSrc) {
this.regEDX = afnGrp[6].call(this, this.regEDX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordF3(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=011 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordF3(afnGrp, fnSrc) {
this.regEBX = afnGrp[6].call(this, this.regEBX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordF4(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=100 (SP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordF4(afnGrp, fnSrc) {
this.setSP(afnGrp[6].call(this, this.getSP(), fnSrc.call(this)));
},
/**
* opModGrpWordF5(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=101 (BP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordF5(afnGrp, fnSrc) {
this.regEBP = afnGrp[6].call(this, this.regEBP, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordF6(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=110 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordF6(afnGrp, fnSrc) {
this.regESI = afnGrp[6].call(this, this.regESI, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordF7(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=111 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordF7(afnGrp, fnSrc) {
this.regEDI = afnGrp[6].call(this, this.regEDI, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordF8(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=000 (AX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordF8(afnGrp, fnSrc) {
this.regEAX = afnGrp[7].call(this, this.regEAX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordF9(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=001 (CX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordF9(afnGrp, fnSrc) {
this.regECX = afnGrp[7].call(this, this.regECX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordFA(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=010 (DX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordFA(afnGrp, fnSrc) {
this.regEDX = afnGrp[7].call(this, this.regEDX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordFB(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=011 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordFB(afnGrp, fnSrc) {
this.regEBX = afnGrp[7].call(this, this.regEBX, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordFC(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=100 (SP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordFC(afnGrp, fnSrc) {
this.setSP(afnGrp[7].call(this, this.getSP(), fnSrc.call(this)));
},
/**
* opModGrpWordFD(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=101 (BP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordFD(afnGrp, fnSrc) {
this.regEBP = afnGrp[7].call(this, this.regEBP, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordFE(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=110 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordFE(afnGrp, fnSrc) {
this.regESI = afnGrp[7].call(this, this.regESI, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
},
/**
* opModGrpWordFF(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=111 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opModGrpWordFF(afnGrp, fnSrc) {
this.regEDI = afnGrp[7].call(this, this.regEDI, fnSrc.call(this));
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
}
];
if (typeof module !== 'undefined') module.exports = X86ModW;
/**
* @fileoverview Implements PCjs 8086 mode-byte decoding.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-Sep-05
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
if (typeof module !== 'undefined') {
var X86 = require("./x86");
}
var X86ModW16 = {};
X86ModW16.aOpModReg = [
/**
* opMod16RegWord00(fn): mod=00 (src:mem) reg=000 (dst:AX) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord00(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegWord01(fn): mod=00 (src:mem) reg=000 (dst:AX) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord01(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegWord02(fn): mod=00 (src:mem) reg=000 (dst:AX) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord02(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegWord03(fn): mod=00 (src:mem) reg=000 (dst:AX) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord03(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegWord04(fn): mod=00 (src:mem) reg=000 (dst:AX) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord04(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regESI));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegWord05(fn): mod=00 (src:mem) reg=000 (dst:AX) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord05(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEDI));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegWord06(fn): mod=00 (src:mem) reg=000 (dst:AX) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord06(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.getIPAddr()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16RegWord07(fn): mod=00 (src:mem) reg=000 (dst:AX) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord07(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegWord08(fn): mod=00 (src:mem) reg=001 (dst:CX) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord08(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegWord09(fn): mod=00 (src:mem) reg=001 (dst:CX) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord09(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegWord0A(fn): mod=00 (src:mem) reg=001 (dst:CX) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord0A(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegWord0B(fn): mod=00 (src:mem) reg=001 (dst:CX) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord0B(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegWord0C(fn): mod=00 (src:mem) reg=001 (dst:CX) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord0C(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regESI));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegWord0D(fn): mod=00 (src:mem) reg=001 (dst:CX) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord0D(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEDI));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegWord0E(fn): mod=00 (src:mem) reg=001 (dst:CX) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord0E(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.getIPAddr()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16RegWord0F(fn): mod=00 (src:mem) reg=001 (dst:CX) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord0F(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegWord10(fn): mod=00 (src:mem) reg=010 (dst:DX) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord10(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegWord11(fn): mod=00 (src:mem) reg=010 (dst:DX) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord11(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegWord12(fn): mod=00 (src:mem) reg=010 (dst:DX) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord12(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegWord13(fn): mod=00 (src:mem) reg=010 (dst:DX) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord13(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegWord14(fn): mod=00 (src:mem) reg=010 (dst:DX) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord14(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regESI));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegWord15(fn): mod=00 (src:mem) reg=010 (dst:DX) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord15(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEDI));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegWord16(fn): mod=00 (src:mem) reg=010 (dst:DX) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord16(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.getIPAddr()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16RegWord17(fn): mod=00 (src:mem) reg=010 (dst:DX) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord17(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegWord18(fn): mod=00 (src:mem) reg=011 (dst:BX) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord18(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegWord19(fn): mod=00 (src:mem) reg=011 (dst:BX) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord19(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegWord1A(fn): mod=00 (src:mem) reg=011 (dst:BX) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord1A(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegWord1B(fn): mod=00 (src:mem) reg=011 (dst:BX) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord1B(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegWord1C(fn): mod=00 (src:mem) reg=011 (dst:BX) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord1C(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regESI));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegWord1D(fn): mod=00 (src:mem) reg=011 (dst:BX) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord1D(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEDI));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegWord1E(fn): mod=00 (src:mem) reg=011 (dst:BX) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord1E(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.getIPAddr()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16RegWord1F(fn): mod=00 (src:mem) reg=011 (dst:BX) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord1F(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegWord20(fn): mod=00 (src:mem) reg=100 (dst:SP) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord20(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.regESI));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegWord21(fn): mod=00 (src:mem) reg=100 (dst:SP) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord21(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegWord22(fn): mod=00 (src:mem) reg=100 (dst:SP) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord22(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegWord23(fn): mod=00 (src:mem) reg=100 (dst:SP) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord23(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegWord24(fn): mod=00 (src:mem) reg=100 (dst:SP) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord24(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regESI));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegWord25(fn): mod=00 (src:mem) reg=100 (dst:SP) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord25(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEDI));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegWord26(fn): mod=00 (src:mem) reg=100 (dst:SP) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord26(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.getIPAddr()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16RegWord27(fn): mod=00 (src:mem) reg=100 (dst:SP) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord27(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegWord28(fn): mod=00 (src:mem) reg=101 (dst:BP) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord28(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.regESI));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegWord29(fn): mod=00 (src:mem) reg=101 (dst:BP) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord29(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegWord2A(fn): mod=00 (src:mem) reg=101 (dst:BP) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord2A(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegWord2B(fn): mod=00 (src:mem) reg=101 (dst:BP) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord2B(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegWord2C(fn): mod=00 (src:mem) reg=101 (dst:BP) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord2C(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regESI));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegWord2D(fn): mod=00 (src:mem) reg=101 (dst:BP) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord2D(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEDI));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegWord2E(fn): mod=00 (src:mem) reg=101 (dst:BP) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord2E(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.getIPAddr()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16RegWord2F(fn): mod=00 (src:mem) reg=101 (dst:BP) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord2F(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegWord30(fn): mod=00 (src:mem) reg=110 (dst:SI) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord30(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.regESI));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegWord31(fn): mod=00 (src:mem) reg=110 (dst:SI) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord31(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegWord32(fn): mod=00 (src:mem) reg=110 (dst:SI) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord32(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegWord33(fn): mod=00 (src:mem) reg=110 (dst:SI) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord33(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegWord34(fn): mod=00 (src:mem) reg=110 (dst:SI) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord34(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regESI));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegWord35(fn): mod=00 (src:mem) reg=110 (dst:SI) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord35(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEDI));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegWord36(fn): mod=00 (src:mem) reg=110 (dst:SI) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord36(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.getIPAddr()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16RegWord37(fn): mod=00 (src:mem) reg=110 (dst:SI) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord37(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegWord38(fn): mod=00 (src:mem) reg=111 (dst:DI) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord38(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.regESI));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegWord39(fn): mod=00 (src:mem) reg=111 (dst:DI) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord39(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegWord3A(fn): mod=00 (src:mem) reg=111 (dst:DI) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord3A(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16RegWord3B(fn): mod=00 (src:mem) reg=111 (dst:DI) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord3B(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16RegWord3C(fn): mod=00 (src:mem) reg=111 (dst:DI) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord3C(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regESI));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegWord3D(fn): mod=00 (src:mem) reg=111 (dst:DI) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord3D(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEDI));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegWord3E(fn): mod=00 (src:mem) reg=111 (dst:DI) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord3E(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.getIPAddr()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16RegWord3F(fn): mod=00 (src:mem) reg=111 (dst:DI) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord3F(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16RegWord40(fn): mod=01 (src:mem+d8) reg=000 (dst:AX) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord40(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWord41(fn): mod=01 (src:mem+d8) reg=000 (dst:AX) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord41(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWord42(fn): mod=01 (src:mem+d8) reg=000 (dst:AX) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord42(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWord43(fn): mod=01 (src:mem+d8) reg=000 (dst:AX) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord43(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWord44(fn): mod=01 (src:mem+d8) reg=000 (dst:AX) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord44(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord45(fn): mod=01 (src:mem+d8) reg=000 (dst:AX) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord45(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord46(fn): mod=01 (src:mem+d8) reg=000 (dst:AX) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord46(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord47(fn): mod=01 (src:mem+d8) reg=000 (dst:AX) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord47(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord48(fn): mod=01 (src:mem+d8) reg=001 (dst:CX) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord48(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWord49(fn): mod=01 (src:mem+d8) reg=001 (dst:CX) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord49(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWord4A(fn): mod=01 (src:mem+d8) reg=001 (dst:CX) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord4A(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWord4B(fn): mod=01 (src:mem+d8) reg=001 (dst:CX) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord4B(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWord4C(fn): mod=01 (src:mem+d8) reg=001 (dst:CX) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord4C(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord4D(fn): mod=01 (src:mem+d8) reg=001 (dst:CX) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord4D(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord4E(fn): mod=01 (src:mem+d8) reg=001 (dst:CX) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord4E(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord4F(fn): mod=01 (src:mem+d8) reg=001 (dst:CX) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord4F(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord50(fn): mod=01 (src:mem+d8) reg=010 (dst:DX) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord50(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWord51(fn): mod=01 (src:mem+d8) reg=010 (dst:DX) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord51(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWord52(fn): mod=01 (src:mem+d8) reg=010 (dst:DX) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord52(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWord53(fn): mod=01 (src:mem+d8) reg=010 (dst:DX) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord53(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWord54(fn): mod=01 (src:mem+d8) reg=010 (dst:DX) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord54(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord55(fn): mod=01 (src:mem+d8) reg=010 (dst:DX) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord55(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord56(fn): mod=01 (src:mem+d8) reg=010 (dst:DX) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord56(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord57(fn): mod=01 (src:mem+d8) reg=010 (dst:DX) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord57(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord58(fn): mod=01 (src:mem+d8) reg=011 (dst:BX) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord58(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWord59(fn): mod=01 (src:mem+d8) reg=011 (dst:BX) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord59(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWord5A(fn): mod=01 (src:mem+d8) reg=011 (dst:BX) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord5A(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWord5B(fn): mod=01 (src:mem+d8) reg=011 (dst:BX) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord5B(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWord5C(fn): mod=01 (src:mem+d8) reg=011 (dst:BX) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord5C(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord5D(fn): mod=01 (src:mem+d8) reg=011 (dst:BX) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord5D(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord5E(fn): mod=01 (src:mem+d8) reg=011 (dst:BX) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord5E(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord5F(fn): mod=01 (src:mem+d8) reg=011 (dst:BX) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord5F(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord60(fn): mod=01 (src:mem+d8) reg=100 (dst:SP) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord60(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWord61(fn): mod=01 (src:mem+d8) reg=100 (dst:SP) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord61(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWord62(fn): mod=01 (src:mem+d8) reg=100 (dst:SP) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord62(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWord63(fn): mod=01 (src:mem+d8) reg=100 (dst:SP) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord63(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWord64(fn): mod=01 (src:mem+d8) reg=100 (dst:SP) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord64(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord65(fn): mod=01 (src:mem+d8) reg=100 (dst:SP) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord65(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord66(fn): mod=01 (src:mem+d8) reg=100 (dst:SP) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord66(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord67(fn): mod=01 (src:mem+d8) reg=100 (dst:SP) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord67(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord68(fn): mod=01 (src:mem+d8) reg=101 (dst:BP) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord68(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWord69(fn): mod=01 (src:mem+d8) reg=101 (dst:BP) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord69(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWord6A(fn): mod=01 (src:mem+d8) reg=101 (dst:BP) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord6A(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWord6B(fn): mod=01 (src:mem+d8) reg=101 (dst:BP) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord6B(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWord6C(fn): mod=01 (src:mem+d8) reg=101 (dst:BP) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord6C(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord6D(fn): mod=01 (src:mem+d8) reg=101 (dst:BP) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord6D(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord6E(fn): mod=01 (src:mem+d8) reg=101 (dst:BP) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord6E(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord6F(fn): mod=01 (src:mem+d8) reg=101 (dst:BP) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord6F(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord70(fn): mod=01 (src:mem+d8) reg=110 (dst:SI) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord70(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWord71(fn): mod=01 (src:mem+d8) reg=110 (dst:SI) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord71(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWord72(fn): mod=01 (src:mem+d8) reg=110 (dst:SI) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord72(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWord73(fn): mod=01 (src:mem+d8) reg=110 (dst:SI) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord73(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWord74(fn): mod=01 (src:mem+d8) reg=110 (dst:SI) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord74(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord75(fn): mod=01 (src:mem+d8) reg=110 (dst:SI) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord75(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord76(fn): mod=01 (src:mem+d8) reg=110 (dst:SI) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord76(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord77(fn): mod=01 (src:mem+d8) reg=110 (dst:SI) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord77(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord78(fn): mod=01 (src:mem+d8) reg=111 (dst:DI) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord78(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWord79(fn): mod=01 (src:mem+d8) reg=111 (dst:DI) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord79(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWord7A(fn): mod=01 (src:mem+d8) reg=111 (dst:DI) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord7A(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWord7B(fn): mod=01 (src:mem+d8) reg=111 (dst:DI) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord7B(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWord7C(fn): mod=01 (src:mem+d8) reg=111 (dst:DI) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord7C(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord7D(fn): mod=01 (src:mem+d8) reg=111 (dst:DI) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord7D(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord7E(fn): mod=01 (src:mem+d8) reg=111 (dst:DI) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord7E(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord7F(fn): mod=01 (src:mem+d8) reg=111 (dst:DI) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord7F(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord80(fn): mod=10 (src:mem+d16) reg=000 (dst:AX) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord80(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWord81(fn): mod=10 (src:mem+d16) reg=000 (dst:AX) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord81(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWord82(fn): mod=10 (src:mem+d16) reg=000 (dst:AX) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord82(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWord83(fn): mod=10 (src:mem+d16) reg=000 (dst:AX) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord83(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWord84(fn): mod=10 (src:mem+d16) reg=000 (dst:AX) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord84(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord85(fn): mod=10 (src:mem+d16) reg=000 (dst:AX) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord85(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord86(fn): mod=10 (src:mem+d16) reg=000 (dst:AX) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord86(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord87(fn): mod=10 (src:mem+d16) reg=000 (dst:AX) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord87(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord88(fn): mod=10 (src:mem+d16) reg=001 (dst:CX) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord88(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWord89(fn): mod=10 (src:mem+d16) reg=001 (dst:CX) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord89(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWord8A(fn): mod=10 (src:mem+d16) reg=001 (dst:CX) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord8A(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWord8B(fn): mod=10 (src:mem+d16) reg=001 (dst:CX) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord8B(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWord8C(fn): mod=10 (src:mem+d16) reg=001 (dst:CX) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord8C(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord8D(fn): mod=10 (src:mem+d16) reg=001 (dst:CX) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord8D(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord8E(fn): mod=10 (src:mem+d16) reg=001 (dst:CX) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord8E(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord8F(fn): mod=10 (src:mem+d16) reg=001 (dst:CX) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord8F(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord90(fn): mod=10 (src:mem+d16) reg=010 (dst:DX) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord90(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWord91(fn): mod=10 (src:mem+d16) reg=010 (dst:DX) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord91(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWord92(fn): mod=10 (src:mem+d16) reg=010 (dst:DX) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord92(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWord93(fn): mod=10 (src:mem+d16) reg=010 (dst:DX) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord93(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWord94(fn): mod=10 (src:mem+d16) reg=010 (dst:DX) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord94(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord95(fn): mod=10 (src:mem+d16) reg=010 (dst:DX) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord95(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord96(fn): mod=10 (src:mem+d16) reg=010 (dst:DX) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord96(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord97(fn): mod=10 (src:mem+d16) reg=010 (dst:DX) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord97(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord98(fn): mod=10 (src:mem+d16) reg=011 (dst:BX) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord98(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWord99(fn): mod=10 (src:mem+d16) reg=011 (dst:BX) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord99(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWord9A(fn): mod=10 (src:mem+d16) reg=011 (dst:BX) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord9A(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWord9B(fn): mod=10 (src:mem+d16) reg=011 (dst:BX) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord9B(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWord9C(fn): mod=10 (src:mem+d16) reg=011 (dst:BX) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord9C(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord9D(fn): mod=10 (src:mem+d16) reg=011 (dst:BX) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord9D(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord9E(fn): mod=10 (src:mem+d16) reg=011 (dst:BX) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord9E(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWord9F(fn): mod=10 (src:mem+d16) reg=011 (dst:BX) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWord9F(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWordA0(fn): mod=10 (src:mem+d16) reg=100 (dst:SP) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordA0(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWordA1(fn): mod=10 (src:mem+d16) reg=100 (dst:SP) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordA1(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWordA2(fn): mod=10 (src:mem+d16) reg=100 (dst:SP) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordA2(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWordA3(fn): mod=10 (src:mem+d16) reg=100 (dst:SP) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordA3(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWordA4(fn): mod=10 (src:mem+d16) reg=100 (dst:SP) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordA4(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWordA5(fn): mod=10 (src:mem+d16) reg=100 (dst:SP) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordA5(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWordA6(fn): mod=10 (src:mem+d16) reg=100 (dst:SP) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordA6(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWordA7(fn): mod=10 (src:mem+d16) reg=100 (dst:SP) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordA7(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWordA8(fn): mod=10 (src:mem+d16) reg=101 (dst:BP) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordA8(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWordA9(fn): mod=10 (src:mem+d16) reg=101 (dst:BP) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordA9(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWordAA(fn): mod=10 (src:mem+d16) reg=101 (dst:BP) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordAA(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWordAB(fn): mod=10 (src:mem+d16) reg=101 (dst:BP) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordAB(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWordAC(fn): mod=10 (src:mem+d16) reg=101 (dst:BP) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordAC(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWordAD(fn): mod=10 (src:mem+d16) reg=101 (dst:BP) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordAD(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWordAE(fn): mod=10 (src:mem+d16) reg=101 (dst:BP) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordAE(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWordAF(fn): mod=10 (src:mem+d16) reg=101 (dst:BP) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordAF(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWordB0(fn): mod=10 (src:mem+d16) reg=110 (dst:SI) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordB0(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWordB1(fn): mod=10 (src:mem+d16) reg=110 (dst:SI) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordB1(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWordB2(fn): mod=10 (src:mem+d16) reg=110 (dst:SI) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordB2(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWordB3(fn): mod=10 (src:mem+d16) reg=110 (dst:SI) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordB3(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWordB4(fn): mod=10 (src:mem+d16) reg=110 (dst:SI) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordB4(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWordB5(fn): mod=10 (src:mem+d16) reg=110 (dst:SI) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordB5(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWordB6(fn): mod=10 (src:mem+d16) reg=110 (dst:SI) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordB6(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWordB7(fn): mod=10 (src:mem+d16) reg=110 (dst:SI) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordB7(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWordB8(fn): mod=10 (src:mem+d16) reg=111 (dst:DI) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordB8(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWordB9(fn): mod=10 (src:mem+d16) reg=111 (dst:DI) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordB9(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWordBA(fn): mod=10 (src:mem+d16) reg=111 (dst:DI) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordBA(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16RegWordBB(fn): mod=10 (src:mem+d16) reg=111 (dst:DI) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordBB(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16RegWordBC(fn): mod=10 (src:mem+d16) reg=111 (dst:DI) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordBC(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWordBD(fn): mod=10 (src:mem+d16) reg=111 (dst:DI) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordBD(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWordBE(fn): mod=10 (src:mem+d16) reg=111 (dst:DI) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordBE(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWordBF(fn): mod=10 (src:mem+d16) reg=111 (dst:DI) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordBF(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16RegWordC0(fn): mod=11 (src:reg) reg=000 (dst:AX) r/m=000 (AX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordC0(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.regEAX & this.dataMask);
this.regEAX = (this.regEAX & ~this.dataMask) | w;
},
/**
* opMod16RegWordC1(fn): mod=11 (src:reg) reg=000 (dst:AX) r/m=001 (CX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordC1(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.regECX & this.dataMask);
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiCL; this.backTrack.btiAH = this.backTrack.btiCH;
}
},
/**
* opMod16RegWordC2(fn): mod=11 (src:reg) reg=000 (dst:AX) r/m=010 (DX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordC2(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.regEDX & this.dataMask);
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiDL; this.backTrack.btiAH = this.backTrack.btiDH;
}
},
/**
* opMod16RegWordC3(fn): mod=11 (src:reg) reg=000 (dst:AX) r/m=011 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordC3(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.regEBX & this.dataMask);
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiBL; this.backTrack.btiAH = this.backTrack.btiBH;
}
},
/**
* opMod16RegWordC4(fn): mod=11 (src:reg) reg=000 (dst:AX) r/m=100 (SP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordC4(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getSP() & this.dataMask);
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = X86.BACKTRACK.SP_LO; this.backTrack.btiAH = X86.BACKTRACK.SP_HI;
}
},
/**
* opMod16RegWordC5(fn): mod=11 (src:reg) reg=000 (dst:AX) r/m=101 (BP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordC5(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.regEBP & this.dataMask);
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiBPLo; this.backTrack.btiAH = this.backTrack.btiBPHi;
}
},
/**
* opMod16RegWordC6(fn): mod=11 (src:reg) reg=000 (dst:AX) r/m=110 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordC6(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.regESI & this.dataMask);
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiSILo; this.backTrack.btiAH = this.backTrack.btiSIHi;
}
},
/**
* opMod16RegWordC7(fn): mod=11 (src:reg) reg=000 (dst:AX) r/m=111 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordC7(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.regEDI & this.dataMask);
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiDILo; this.backTrack.btiAH = this.backTrack.btiDIHi;
}
},
/**
* opMod16RegWordC8(fn): mod=11 (src:reg) reg=001 (dst:CX) r/m=000 (AX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordC8(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.regEAX & this.dataMask);
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiAL; this.backTrack.btiCH = this.backTrack.btiAH;
}
},
/**
* opMod16RegWordC9(fn): mod=11 (src:reg) reg=001 (dst:CX) r/m=001 (CX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordC9(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.regECX & this.dataMask);
this.regECX = (this.regECX & ~this.dataMask) | w;
},
/**
* opMod16RegWordCA(fn): mod=11 (src:reg) reg=001 (dst:CX) r/m=010 (DX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordCA(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.regEDX & this.dataMask);
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiDL; this.backTrack.btiCH = this.backTrack.btiDH;
}
},
/**
* opMod16RegWordCB(fn): mod=11 (src:reg) reg=001 (dst:CX) r/m=011 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordCB(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.regEBX & this.dataMask);
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiBL; this.backTrack.btiCH = this.backTrack.btiBH;
}
},
/**
* opMod16RegWordCC(fn): mod=11 (src:reg) reg=001 (dst:CX) r/m=100 (SP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordCC(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getSP() & this.dataMask);
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = X86.BACKTRACK.SP_LO; this.backTrack.btiCH = X86.BACKTRACK.SP_HI;
}
},
/**
* opMod16RegWordCD(fn): mod=11 (src:reg) reg=001 (dst:CX) r/m=101 (BP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordCD(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.regEBP & this.dataMask);
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiBPLo; this.backTrack.btiCH = this.backTrack.btiBPHi;
}
},
/**
* opMod16RegWordCE(fn): mod=11 (src:reg) reg=001 (dst:CX) r/m=110 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordCE(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.regESI & this.dataMask);
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiSILo; this.backTrack.btiCH = this.backTrack.btiSIHi;
}
},
/**
* opMod16RegWordCF(fn): mod=11 (src:reg) reg=001 (dst:CX) r/m=111 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordCF(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.regEDI & this.dataMask);
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiDILo; this.backTrack.btiCH = this.backTrack.btiDIHi;
}
},
/**
* opMod16RegWordD0(fn): mod=11 (src:reg) reg=010 (dst:DX) r/m=000 (AX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordD0(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.regEAX & this.dataMask);
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiAL; this.backTrack.btiDH = this.backTrack.btiAH;
}
},
/**
* opMod16RegWordD1(fn): mod=11 (src:reg) reg=010 (dst:DX) r/m=001 (CX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordD1(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.regECX & this.dataMask);
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiCL; this.backTrack.btiDH = this.backTrack.btiCH;
}
},
/**
* opMod16RegWordD2(fn): mod=11 (src:reg) reg=010 (dst:DX) r/m=010 (DX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordD2(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.regEDX & this.dataMask);
this.regEDX = (this.regEDX & ~this.dataMask) | w;
},
/**
* opMod16RegWordD3(fn): mod=11 (src:reg) reg=010 (dst:DX) r/m=011 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordD3(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.regEBX & this.dataMask);
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiBL; this.backTrack.btiDH = this.backTrack.btiBH;
}
},
/**
* opMod16RegWordD4(fn): mod=11 (src:reg) reg=010 (dst:DX) r/m=100 (SP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordD4(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getSP() & this.dataMask);
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = X86.BACKTRACK.SP_LO; this.backTrack.btiDH = X86.BACKTRACK.SP_HI;
}
},
/**
* opMod16RegWordD5(fn): mod=11 (src:reg) reg=010 (dst:DX) r/m=101 (BP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordD5(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.regEBP & this.dataMask);
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiBPLo; this.backTrack.btiDH = this.backTrack.btiBPHi;
}
},
/**
* opMod16RegWordD6(fn): mod=11 (src:reg) reg=010 (dst:DX) r/m=110 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordD6(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.regESI & this.dataMask);
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiSILo; this.backTrack.btiDH = this.backTrack.btiSIHi;
}
},
/**
* opMod16RegWordD7(fn): mod=11 (src:reg) reg=010 (dst:DX) r/m=111 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordD7(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.regEDI & this.dataMask);
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiDILo; this.backTrack.btiDH = this.backTrack.btiDIHi;
}
},
/**
* opMod16RegWordD8(fn): mod=11 (src:reg) reg=011 (dst:BX) r/m=000 (AX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordD8(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.regEAX & this.dataMask);
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiAL; this.backTrack.btiBH = this.backTrack.btiAH;
}
},
/**
* opMod16RegWordD9(fn): mod=11 (src:reg) reg=011 (dst:BX) r/m=001 (CX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordD9(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.regECX & this.dataMask);
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiCL; this.backTrack.btiBH = this.backTrack.btiCH;
}
},
/**
* opMod16RegWordDA(fn): mod=11 (src:reg) reg=011 (dst:BX) r/m=010 (DX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordDA(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.regEDX & this.dataMask);
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiDL; this.backTrack.btiBH = this.backTrack.btiDH;
}
},
/**
* opMod16RegWordDB(fn): mod=11 (src:reg) reg=011 (dst:BX) r/m=011 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordDB(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.regEBX & this.dataMask);
this.regEBX = (this.regEBX & ~this.dataMask) | w;
},
/**
* opMod16RegWordDC(fn): mod=11 (src:reg) reg=011 (dst:BX) r/m=100 (SP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordDC(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getSP() & this.dataMask);
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = X86.BACKTRACK.SP_LO; this.backTrack.btiBH = X86.BACKTRACK.SP_HI;
}
},
/**
* opMod16RegWordDD(fn): mod=11 (src:reg) reg=011 (dst:BX) r/m=101 (BP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordDD(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.regEBP & this.dataMask);
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiBPLo; this.backTrack.btiBH = this.backTrack.btiBPHi;
}
},
/**
* opMod16RegWordDE(fn): mod=11 (src:reg) reg=011 (dst:BX) r/m=110 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordDE(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.regESI & this.dataMask);
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiSILo; this.backTrack.btiBH = this.backTrack.btiSIHi;
}
},
/**
* opMod16RegWordDF(fn): mod=11 (src:reg) reg=011 (dst:BX) r/m=111 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordDF(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.regEDI & this.dataMask);
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiDILo; this.backTrack.btiBH = this.backTrack.btiDIHi;
}
},
/**
* opMod16RegWordE0(fn): mod=11 (src:reg) reg=100 (dst:SP) r/m=000 (AX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordE0(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.regEAX & this.dataMask);
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod16RegWordE1(fn): mod=11 (src:reg) reg=100 (dst:SP) r/m=001 (CX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordE1(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.regECX & this.dataMask);
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod16RegWordE2(fn): mod=11 (src:reg) reg=100 (dst:SP) r/m=010 (DX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordE2(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.regEDX & this.dataMask);
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod16RegWordE3(fn): mod=11 (src:reg) reg=100 (dst:SP) r/m=011 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordE3(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.regEBX & this.dataMask);
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod16RegWordE4(fn): mod=11 (src:reg) reg=100 (dst:SP) r/m=100 (SP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordE4(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getSP() & this.dataMask);
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod16RegWordE5(fn): mod=11 (src:reg) reg=100 (dst:SP) r/m=101 (BP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordE5(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.regEBP & this.dataMask);
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod16RegWordE6(fn): mod=11 (src:reg) reg=100 (dst:SP) r/m=110 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordE6(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.regESI & this.dataMask);
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod16RegWordE7(fn): mod=11 (src:reg) reg=100 (dst:SP) r/m=111 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordE7(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.regEDI & this.dataMask);
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod16RegWordE8(fn): mod=11 (src:reg) reg=101 (dst:BP) r/m=000 (AX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordE8(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.regEAX & this.dataMask);
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiAL; this.backTrack.btiBPHi = this.backTrack.btiAH;
}
},
/**
* opMod16RegWordE9(fn): mod=11 (src:reg) reg=101 (dst:BP) r/m=001 (CX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordE9(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.regECX & this.dataMask);
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiCL; this.backTrack.btiBPHi = this.backTrack.btiCH;
}
},
/**
* opMod16RegWordEA(fn): mod=11 (src:reg) reg=101 (dst:BP) r/m=010 (DX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordEA(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.regEDX & this.dataMask);
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiDL; this.backTrack.btiBPHi = this.backTrack.btiDH;
}
},
/**
* opMod16RegWordEB(fn): mod=11 (src:reg) reg=101 (dst:BP) r/m=011 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordEB(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.regEBX & this.dataMask);
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiBL; this.backTrack.btiBPHi = this.backTrack.btiBH;
}
},
/**
* opMod16RegWordEC(fn): mod=11 (src:reg) reg=101 (dst:BP) r/m=100 (SP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordEC(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getSP() & this.dataMask);
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = X86.BACKTRACK.SP_LO; this.backTrack.btiBPHi = X86.BACKTRACK.SP_HI;
}
},
/**
* opMod16RegWordED(fn): mod=11 (src:reg) reg=101 (dst:BP) r/m=101 (BP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordED(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.regEBP & this.dataMask);
this.regEBP = (this.regEBP & ~this.dataMask) | w;
},
/**
* opMod16RegWordEE(fn): mod=11 (src:reg) reg=101 (dst:BP) r/m=110 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordEE(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.regESI & this.dataMask);
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiSILo; this.backTrack.btiBPHi = this.backTrack.btiSIHi;
}
},
/**
* opMod16RegWordEF(fn): mod=11 (src:reg) reg=101 (dst:BP) r/m=111 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordEF(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.regEDI & this.dataMask);
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiDILo; this.backTrack.btiBPHi = this.backTrack.btiDIHi;
}
},
/**
* opMod16RegWordF0(fn): mod=11 (src:reg) reg=110 (dst:SI) r/m=000 (AX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordF0(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.regEAX & this.dataMask);
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiAL; this.backTrack.btiSIHi = this.backTrack.btiAH;
}
},
/**
* opMod16RegWordF1(fn): mod=11 (src:reg) reg=110 (dst:SI) r/m=001 (CX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordF1(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.regECX & this.dataMask);
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiCL; this.backTrack.btiSIHi = this.backTrack.btiCH;
}
},
/**
* opMod16RegWordF2(fn): mod=11 (src:reg) reg=110 (dst:SI) r/m=010 (DX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordF2(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.regEDX & this.dataMask);
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiDL; this.backTrack.btiSIHi = this.backTrack.btiDH;
}
},
/**
* opMod16RegWordF3(fn): mod=11 (src:reg) reg=110 (dst:SI) r/m=011 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordF3(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.regEBX & this.dataMask);
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiBL; this.backTrack.btiSIHi = this.backTrack.btiBH;
}
},
/**
* opMod16RegWordF4(fn): mod=11 (src:reg) reg=110 (dst:SI) r/m=100 (SP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordF4(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getSP() & this.dataMask);
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = X86.BACKTRACK.SP_LO; this.backTrack.btiSIHi = X86.BACKTRACK.SP_HI;
}
},
/**
* opMod16RegWordF5(fn): mod=11 (src:reg) reg=110 (dst:SI) r/m=101 (BP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordF5(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.regEBP & this.dataMask);
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiBPLo; this.backTrack.btiSIHi = this.backTrack.btiBPHi;
}
},
/**
* opMod16RegWordF6(fn): mod=11 (src:reg) reg=110 (dst:SI) r/m=110 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordF6(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.regESI & this.dataMask);
this.regESI = (this.regESI & ~this.dataMask) | w;
},
/**
* opMod16RegWordF7(fn): mod=11 (src:reg) reg=110 (dst:SI) r/m=111 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordF7(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.regEDI & this.dataMask);
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiDILo; this.backTrack.btiSIHi = this.backTrack.btiDIHi;
}
},
/**
* opMod16RegWordF8(fn): mod=11 (src:reg) reg=111 (dst:DI) r/m=000 (AX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordF8(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.regEAX & this.dataMask);
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiAL; this.backTrack.btiDIHi = this.backTrack.btiAH;
}
},
/**
* opMod16RegWordF9(fn): mod=11 (src:reg) reg=111 (dst:DI) r/m=001 (CX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordF9(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.regECX & this.dataMask);
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiCL; this.backTrack.btiDIHi = this.backTrack.btiCH;
}
},
/**
* opMod16RegWordFA(fn): mod=11 (src:reg) reg=111 (dst:DI) r/m=010 (DX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordFA(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.regEDX & this.dataMask);
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiDL; this.backTrack.btiDIHi = this.backTrack.btiDH;
}
},
/**
* opMod16RegWordFB(fn): mod=11 (src:reg) reg=111 (dst:DI) r/m=011 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordFB(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.regEBX & this.dataMask);
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiBL; this.backTrack.btiDIHi = this.backTrack.btiBH;
}
},
/**
* opMod16RegWordFC(fn): mod=11 (src:reg) reg=111 (dst:DI) r/m=100 (SP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordFC(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getSP() & this.dataMask);
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = X86.BACKTRACK.SP_LO; this.backTrack.btiDIHi = X86.BACKTRACK.SP_HI;
}
},
/**
* opMod16RegWordFD(fn): mod=11 (src:reg) reg=111 (dst:DI) r/m=101 (BP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordFD(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.regEBP & this.dataMask);
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiBPLo; this.backTrack.btiDIHi = this.backTrack.btiBPHi;
}
},
/**
* opMod16RegWordFE(fn): mod=11 (src:reg) reg=111 (dst:DI) r/m=110 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordFE(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.regESI & this.dataMask);
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiSILo; this.backTrack.btiDIHi = this.backTrack.btiSIHi;
}
},
/**
* opMod16RegWordFF(fn): mod=11 (src:reg) reg=111 (dst:DI) r/m=111 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16RegWordFF(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.regEDI & this.dataMask);
this.regEDI = (this.regEDI & ~this.dataMask) | w;
}
];
X86ModW16.aOpModMem = [
/**
* opMod16MemWord00(fn): mod=00 (dst:mem) reg=000 (src:AX) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord00(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemWord01(fn): mod=00 (dst:mem) reg=000 (src:AX) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord01(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemWord02(fn): mod=00 (dst:mem) reg=000 (src:AX) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord02(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemWord03(fn): mod=00 (dst:mem) reg=000 (src:AX) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord03(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemWord04(fn): mod=00 (dst:mem) reg=000 (src:AX) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord04(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemWord05(fn): mod=00 (dst:mem) reg=000 (src:AX) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord05(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemWord06(fn): mod=00 (dst:mem) reg=000 (src:AX) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord06(fn) {
var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16MemWord07(fn): mod=00 (dst:mem) reg=000 (src:AX) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord07(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemWord08(fn): mod=00 (dst:mem) reg=001 (src:CX) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord08(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemWord09(fn): mod=00 (dst:mem) reg=001 (src:CX) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord09(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemWord0A(fn): mod=00 (dst:mem) reg=001 (src:CX) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord0A(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemWord0B(fn): mod=00 (dst:mem) reg=001 (src:CX) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord0B(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemWord0C(fn): mod=00 (dst:mem) reg=001 (src:CX) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord0C(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemWord0D(fn): mod=00 (dst:mem) reg=001 (src:CX) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord0D(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemWord0E(fn): mod=00 (dst:mem) reg=001 (src:CX) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord0E(fn) {
var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16MemWord0F(fn): mod=00 (dst:mem) reg=001 (src:CX) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord0F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemWord10(fn): mod=00 (dst:mem) reg=010 (src:DX) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord10(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemWord11(fn): mod=00 (dst:mem) reg=010 (src:DX) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord11(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemWord12(fn): mod=00 (dst:mem) reg=010 (src:DX) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord12(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemWord13(fn): mod=00 (dst:mem) reg=010 (src:DX) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord13(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemWord14(fn): mod=00 (dst:mem) reg=010 (src:DX) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord14(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemWord15(fn): mod=00 (dst:mem) reg=010 (src:DX) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord15(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemWord16(fn): mod=00 (dst:mem) reg=010 (src:DX) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord16(fn) {
var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16MemWord17(fn): mod=00 (dst:mem) reg=010 (src:DX) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord17(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemWord18(fn): mod=00 (dst:mem) reg=011 (src:BX) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord18(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemWord19(fn): mod=00 (dst:mem) reg=011 (src:BX) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord19(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemWord1A(fn): mod=00 (dst:mem) reg=011 (src:BX) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord1A(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemWord1B(fn): mod=00 (dst:mem) reg=011 (src:BX) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord1B(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemWord1C(fn): mod=00 (dst:mem) reg=011 (src:BX) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord1C(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemWord1D(fn): mod=00 (dst:mem) reg=011 (src:BX) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord1D(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemWord1E(fn): mod=00 (dst:mem) reg=011 (src:BX) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord1E(fn) {
var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16MemWord1F(fn): mod=00 (dst:mem) reg=011 (src:BX) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord1F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemWord20(fn): mod=00 (dst:mem) reg=100 (src:SP) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord20(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemWord21(fn): mod=00 (dst:mem) reg=100 (src:SP) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord21(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemWord22(fn): mod=00 (dst:mem) reg=100 (src:SP) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord22(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemWord23(fn): mod=00 (dst:mem) reg=100 (src:SP) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord23(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemWord24(fn): mod=00 (dst:mem) reg=100 (src:SP) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord24(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemWord25(fn): mod=00 (dst:mem) reg=100 (src:SP) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord25(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemWord26(fn): mod=00 (dst:mem) reg=100 (src:SP) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord26(fn) {
var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16MemWord27(fn): mod=00 (dst:mem) reg=100 (src:SP) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord27(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemWord28(fn): mod=00 (dst:mem) reg=101 (src:BP) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord28(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemWord29(fn): mod=00 (dst:mem) reg=101 (src:BP) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord29(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemWord2A(fn): mod=00 (dst:mem) reg=101 (src:BP) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord2A(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemWord2B(fn): mod=00 (dst:mem) reg=101 (src:BP) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord2B(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemWord2C(fn): mod=00 (dst:mem) reg=101 (src:BP) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord2C(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemWord2D(fn): mod=00 (dst:mem) reg=101 (src:BP) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord2D(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemWord2E(fn): mod=00 (dst:mem) reg=101 (src:BP) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord2E(fn) {
var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16MemWord2F(fn): mod=00 (dst:mem) reg=101 (src:BP) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord2F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemWord30(fn): mod=00 (dst:mem) reg=110 (src:SI) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord30(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemWord31(fn): mod=00 (dst:mem) reg=110 (src:SI) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord31(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemWord32(fn): mod=00 (dst:mem) reg=110 (src:SI) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord32(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemWord33(fn): mod=00 (dst:mem) reg=110 (src:SI) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord33(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemWord34(fn): mod=00 (dst:mem) reg=110 (src:SI) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord34(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemWord35(fn): mod=00 (dst:mem) reg=110 (src:SI) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord35(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemWord36(fn): mod=00 (dst:mem) reg=110 (src:SI) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord36(fn) {
var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16MemWord37(fn): mod=00 (dst:mem) reg=110 (src:SI) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord37(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemWord38(fn): mod=00 (dst:mem) reg=111 (src:DI) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord38(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemWord39(fn): mod=00 (dst:mem) reg=111 (src:DI) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord39(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemWord3A(fn): mod=00 (dst:mem) reg=111 (src:DI) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord3A(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16MemWord3B(fn): mod=00 (dst:mem) reg=111 (src:DI) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord3B(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16MemWord3C(fn): mod=00 (dst:mem) reg=111 (src:DI) r/m=100 (SI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord3C(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemWord3D(fn): mod=00 (dst:mem) reg=111 (src:DI) r/m=101 (DI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord3D(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemWord3E(fn): mod=00 (dst:mem) reg=111 (src:DI) r/m=110 (d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord3E(fn) {
var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16MemWord3F(fn): mod=00 (dst:mem) reg=111 (src:DI) r/m=111 (BX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord3F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16MemWord40(fn): mod=01 (dst:mem+d8) reg=000 (src:AX) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord40(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWord41(fn): mod=01 (dst:mem+d8) reg=000 (src:AX) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord41(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWord42(fn): mod=01 (dst:mem+d8) reg=000 (src:AX) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord42(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWord43(fn): mod=01 (dst:mem+d8) reg=000 (src:AX) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord43(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWord44(fn): mod=01 (dst:mem+d8) reg=000 (src:AX) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord44(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord45(fn): mod=01 (dst:mem+d8) reg=000 (src:AX) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord45(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord46(fn): mod=01 (dst:mem+d8) reg=000 (src:AX) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord46(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord47(fn): mod=01 (dst:mem+d8) reg=000 (src:AX) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord47(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord48(fn): mod=01 (dst:mem+d8) reg=001 (src:CX) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord48(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWord49(fn): mod=01 (dst:mem+d8) reg=001 (src:CX) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord49(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWord4A(fn): mod=01 (dst:mem+d8) reg=001 (src:CX) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord4A(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWord4B(fn): mod=01 (dst:mem+d8) reg=001 (src:CX) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord4B(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWord4C(fn): mod=01 (dst:mem+d8) reg=001 (src:CX) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord4C(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord4D(fn): mod=01 (dst:mem+d8) reg=001 (src:CX) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord4D(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord4E(fn): mod=01 (dst:mem+d8) reg=001 (src:CX) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord4E(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord4F(fn): mod=01 (dst:mem+d8) reg=001 (src:CX) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord4F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord50(fn): mod=01 (dst:mem+d8) reg=010 (src:DX) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord50(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWord51(fn): mod=01 (dst:mem+d8) reg=010 (src:DX) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord51(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWord52(fn): mod=01 (dst:mem+d8) reg=010 (src:DX) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord52(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWord53(fn): mod=01 (dst:mem+d8) reg=010 (src:DX) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord53(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWord54(fn): mod=01 (dst:mem+d8) reg=010 (src:DX) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord54(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord55(fn): mod=01 (dst:mem+d8) reg=010 (src:DX) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord55(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord56(fn): mod=01 (dst:mem+d8) reg=010 (src:DX) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord56(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord57(fn): mod=01 (dst:mem+d8) reg=010 (src:DX) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord57(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord58(fn): mod=01 (dst:mem+d8) reg=011 (src:BX) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord58(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWord59(fn): mod=01 (dst:mem+d8) reg=011 (src:BX) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord59(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWord5A(fn): mod=01 (dst:mem+d8) reg=011 (src:BX) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord5A(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWord5B(fn): mod=01 (dst:mem+d8) reg=011 (src:BX) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord5B(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWord5C(fn): mod=01 (dst:mem+d8) reg=011 (src:BX) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord5C(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord5D(fn): mod=01 (dst:mem+d8) reg=011 (src:BX) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord5D(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord5E(fn): mod=01 (dst:mem+d8) reg=011 (src:BX) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord5E(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord5F(fn): mod=01 (dst:mem+d8) reg=011 (src:BX) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord5F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord60(fn): mod=01 (dst:mem+d8) reg=100 (src:SP) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord60(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWord61(fn): mod=01 (dst:mem+d8) reg=100 (src:SP) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord61(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWord62(fn): mod=01 (dst:mem+d8) reg=100 (src:SP) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord62(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWord63(fn): mod=01 (dst:mem+d8) reg=100 (src:SP) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord63(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWord64(fn): mod=01 (dst:mem+d8) reg=100 (src:SP) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord64(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord65(fn): mod=01 (dst:mem+d8) reg=100 (src:SP) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord65(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord66(fn): mod=01 (dst:mem+d8) reg=100 (src:SP) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord66(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord67(fn): mod=01 (dst:mem+d8) reg=100 (src:SP) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord67(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord68(fn): mod=01 (dst:mem+d8) reg=101 (src:BP) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord68(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWord69(fn): mod=01 (dst:mem+d8) reg=101 (src:BP) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord69(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWord6A(fn): mod=01 (dst:mem+d8) reg=101 (src:BP) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord6A(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWord6B(fn): mod=01 (dst:mem+d8) reg=101 (src:BP) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord6B(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWord6C(fn): mod=01 (dst:mem+d8) reg=101 (src:BP) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord6C(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord6D(fn): mod=01 (dst:mem+d8) reg=101 (src:BP) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord6D(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord6E(fn): mod=01 (dst:mem+d8) reg=101 (src:BP) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord6E(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord6F(fn): mod=01 (dst:mem+d8) reg=101 (src:BP) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord6F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord70(fn): mod=01 (dst:mem+d8) reg=110 (src:SI) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord70(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWord71(fn): mod=01 (dst:mem+d8) reg=110 (src:SI) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord71(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWord72(fn): mod=01 (dst:mem+d8) reg=110 (src:SI) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord72(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWord73(fn): mod=01 (dst:mem+d8) reg=110 (src:SI) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord73(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWord74(fn): mod=01 (dst:mem+d8) reg=110 (src:SI) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord74(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord75(fn): mod=01 (dst:mem+d8) reg=110 (src:SI) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord75(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord76(fn): mod=01 (dst:mem+d8) reg=110 (src:SI) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord76(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord77(fn): mod=01 (dst:mem+d8) reg=110 (src:SI) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord77(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord78(fn): mod=01 (dst:mem+d8) reg=111 (src:DI) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord78(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWord79(fn): mod=01 (dst:mem+d8) reg=111 (src:DI) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord79(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWord7A(fn): mod=01 (dst:mem+d8) reg=111 (src:DI) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord7A(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWord7B(fn): mod=01 (dst:mem+d8) reg=111 (src:DI) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord7B(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWord7C(fn): mod=01 (dst:mem+d8) reg=111 (src:DI) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord7C(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord7D(fn): mod=01 (dst:mem+d8) reg=111 (src:DI) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord7D(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord7E(fn): mod=01 (dst:mem+d8) reg=111 (src:DI) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord7E(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord7F(fn): mod=01 (dst:mem+d8) reg=111 (src:DI) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord7F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord80(fn): mod=10 (dst:mem+d16) reg=000 (src:AX) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord80(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWord81(fn): mod=10 (dst:mem+d16) reg=000 (src:AX) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord81(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWord82(fn): mod=10 (dst:mem+d16) reg=000 (src:AX) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord82(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWord83(fn): mod=10 (dst:mem+d16) reg=000 (src:AX) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord83(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWord84(fn): mod=10 (dst:mem+d16) reg=000 (src:AX) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord84(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord85(fn): mod=10 (dst:mem+d16) reg=000 (src:AX) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord85(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord86(fn): mod=10 (dst:mem+d16) reg=000 (src:AX) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord86(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord87(fn): mod=10 (dst:mem+d16) reg=000 (src:AX) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord87(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord88(fn): mod=10 (dst:mem+d16) reg=001 (src:CX) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord88(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWord89(fn): mod=10 (dst:mem+d16) reg=001 (src:CX) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord89(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWord8A(fn): mod=10 (dst:mem+d16) reg=001 (src:CX) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord8A(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWord8B(fn): mod=10 (dst:mem+d16) reg=001 (src:CX) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord8B(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWord8C(fn): mod=10 (dst:mem+d16) reg=001 (src:CX) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord8C(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord8D(fn): mod=10 (dst:mem+d16) reg=001 (src:CX) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord8D(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord8E(fn): mod=10 (dst:mem+d16) reg=001 (src:CX) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord8E(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord8F(fn): mod=10 (dst:mem+d16) reg=001 (src:CX) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord8F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord90(fn): mod=10 (dst:mem+d16) reg=010 (src:DX) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord90(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWord91(fn): mod=10 (dst:mem+d16) reg=010 (src:DX) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord91(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWord92(fn): mod=10 (dst:mem+d16) reg=010 (src:DX) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord92(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWord93(fn): mod=10 (dst:mem+d16) reg=010 (src:DX) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord93(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWord94(fn): mod=10 (dst:mem+d16) reg=010 (src:DX) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord94(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord95(fn): mod=10 (dst:mem+d16) reg=010 (src:DX) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord95(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord96(fn): mod=10 (dst:mem+d16) reg=010 (src:DX) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord96(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord97(fn): mod=10 (dst:mem+d16) reg=010 (src:DX) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord97(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord98(fn): mod=10 (dst:mem+d16) reg=011 (src:BX) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord98(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWord99(fn): mod=10 (dst:mem+d16) reg=011 (src:BX) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord99(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWord9A(fn): mod=10 (dst:mem+d16) reg=011 (src:BX) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord9A(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWord9B(fn): mod=10 (dst:mem+d16) reg=011 (src:BX) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord9B(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWord9C(fn): mod=10 (dst:mem+d16) reg=011 (src:BX) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord9C(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord9D(fn): mod=10 (dst:mem+d16) reg=011 (src:BX) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord9D(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord9E(fn): mod=10 (dst:mem+d16) reg=011 (src:BX) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord9E(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWord9F(fn): mod=10 (dst:mem+d16) reg=011 (src:BX) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWord9F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWordA0(fn): mod=10 (dst:mem+d16) reg=100 (src:SP) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordA0(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWordA1(fn): mod=10 (dst:mem+d16) reg=100 (src:SP) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordA1(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWordA2(fn): mod=10 (dst:mem+d16) reg=100 (src:SP) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordA2(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWordA3(fn): mod=10 (dst:mem+d16) reg=100 (src:SP) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordA3(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWordA4(fn): mod=10 (dst:mem+d16) reg=100 (src:SP) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordA4(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWordA5(fn): mod=10 (dst:mem+d16) reg=100 (src:SP) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordA5(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWordA6(fn): mod=10 (dst:mem+d16) reg=100 (src:SP) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordA6(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWordA7(fn): mod=10 (dst:mem+d16) reg=100 (src:SP) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordA7(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWordA8(fn): mod=10 (dst:mem+d16) reg=101 (src:BP) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordA8(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWordA9(fn): mod=10 (dst:mem+d16) reg=101 (src:BP) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordA9(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWordAA(fn): mod=10 (dst:mem+d16) reg=101 (src:BP) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordAA(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWordAB(fn): mod=10 (dst:mem+d16) reg=101 (src:BP) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordAB(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWordAC(fn): mod=10 (dst:mem+d16) reg=101 (src:BP) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordAC(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWordAD(fn): mod=10 (dst:mem+d16) reg=101 (src:BP) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordAD(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWordAE(fn): mod=10 (dst:mem+d16) reg=101 (src:BP) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordAE(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWordAF(fn): mod=10 (dst:mem+d16) reg=101 (src:BP) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordAF(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWordB0(fn): mod=10 (dst:mem+d16) reg=110 (src:SI) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordB0(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWordB1(fn): mod=10 (dst:mem+d16) reg=110 (src:SI) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordB1(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWordB2(fn): mod=10 (dst:mem+d16) reg=110 (src:SI) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordB2(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWordB3(fn): mod=10 (dst:mem+d16) reg=110 (src:SI) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordB3(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWordB4(fn): mod=10 (dst:mem+d16) reg=110 (src:SI) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordB4(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWordB5(fn): mod=10 (dst:mem+d16) reg=110 (src:SI) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordB5(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWordB6(fn): mod=10 (dst:mem+d16) reg=110 (src:SI) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordB6(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWordB7(fn): mod=10 (dst:mem+d16) reg=110 (src:SI) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordB7(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWordB8(fn): mod=10 (dst:mem+d16) reg=111 (src:DI) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordB8(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWordB9(fn): mod=10 (dst:mem+d16) reg=111 (src:DI) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordB9(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWordBA(fn): mod=10 (dst:mem+d16) reg=111 (src:DI) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordBA(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16MemWordBB(fn): mod=10 (dst:mem+d16) reg=111 (src:DI) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordBB(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16MemWordBC(fn): mod=10 (dst:mem+d16) reg=111 (src:DI) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordBC(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWordBD(fn): mod=10 (dst:mem+d16) reg=111 (src:DI) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordBD(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWordBE(fn): mod=10 (dst:mem+d16) reg=111 (src:DI) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordBE(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16MemWordBF(fn): mod=10 (dst:mem+d16) reg=111 (src:DI) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod16MemWordBF(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
X86ModW16.aOpModReg[0xC0], X86ModW16.aOpModReg[0xC8], X86ModW16.aOpModReg[0xD0], X86ModW16.aOpModReg[0xD8],
X86ModW16.aOpModReg[0xE0], X86ModW16.aOpModReg[0xE8], X86ModW16.aOpModReg[0xF0], X86ModW16.aOpModReg[0xF8],
X86ModW16.aOpModReg[0xC1], X86ModW16.aOpModReg[0xC9], X86ModW16.aOpModReg[0xD1], X86ModW16.aOpModReg[0xD9],
X86ModW16.aOpModReg[0xE1], X86ModW16.aOpModReg[0xE9], X86ModW16.aOpModReg[0xF1], X86ModW16.aOpModReg[0xF9],
X86ModW16.aOpModReg[0xC2], X86ModW16.aOpModReg[0xCA], X86ModW16.aOpModReg[0xD2], X86ModW16.aOpModReg[0xDA],
X86ModW16.aOpModReg[0xE2], X86ModW16.aOpModReg[0xEA], X86ModW16.aOpModReg[0xF2], X86ModW16.aOpModReg[0xFA],
X86ModW16.aOpModReg[0xC3], X86ModW16.aOpModReg[0xCB], X86ModW16.aOpModReg[0xD3], X86ModW16.aOpModReg[0xDB],
X86ModW16.aOpModReg[0xE3], X86ModW16.aOpModReg[0xEB], X86ModW16.aOpModReg[0xF3], X86ModW16.aOpModReg[0xFB],
X86ModW16.aOpModReg[0xC4], X86ModW16.aOpModReg[0xCC], X86ModW16.aOpModReg[0xD4], X86ModW16.aOpModReg[0xDC],
X86ModW16.aOpModReg[0xE4], X86ModW16.aOpModReg[0xEC], X86ModW16.aOpModReg[0xF4], X86ModW16.aOpModReg[0xFC],
X86ModW16.aOpModReg[0xC5], X86ModW16.aOpModReg[0xCD], X86ModW16.aOpModReg[0xD5], X86ModW16.aOpModReg[0xDD],
X86ModW16.aOpModReg[0xE5], X86ModW16.aOpModReg[0xED], X86ModW16.aOpModReg[0xF5], X86ModW16.aOpModReg[0xFD],
X86ModW16.aOpModReg[0xC6], X86ModW16.aOpModReg[0xCE], X86ModW16.aOpModReg[0xD6], X86ModW16.aOpModReg[0xDE],
X86ModW16.aOpModReg[0xE6], X86ModW16.aOpModReg[0xEE], X86ModW16.aOpModReg[0xF6], X86ModW16.aOpModReg[0xFE],
X86ModW16.aOpModReg[0xC7], X86ModW16.aOpModReg[0xCF], X86ModW16.aOpModReg[0xD7], X86ModW16.aOpModReg[0xDF],
X86ModW16.aOpModReg[0xE7], X86ModW16.aOpModReg[0xEF], X86ModW16.aOpModReg[0xF7], X86ModW16.aOpModReg[0xFF]
];
X86ModW16.aOpModGrp = [
/**
* opMod16GrpWord00(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord00(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpWord01(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord01(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpWord02(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord02(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpWord03(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord03(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpWord04(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord04(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpWord05(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord05(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpWord06(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord06(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16GrpWord07(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord07(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpWord08(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord08(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpWord09(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord09(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpWord0A(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord0A(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpWord0B(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord0B(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpWord0C(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord0C(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpWord0D(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord0D(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpWord0E(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord0E(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16GrpWord0F(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord0F(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpWord10(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord10(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpWord11(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord11(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpWord12(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord12(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpWord13(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord13(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpWord14(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord14(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpWord15(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord15(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpWord16(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord16(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16GrpWord17(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord17(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpWord18(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord18(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpWord19(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord19(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpWord1A(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord1A(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpWord1B(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord1B(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpWord1C(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord1C(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpWord1D(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord1D(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpWord1E(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord1E(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16GrpWord1F(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord1F(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpWord20(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord20(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpWord21(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord21(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpWord22(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord22(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpWord23(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord23(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpWord24(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord24(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpWord25(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord25(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpWord26(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord26(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16GrpWord27(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord27(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpWord28(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord28(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpWord29(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord29(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpWord2A(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord2A(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpWord2B(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord2B(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpWord2C(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord2C(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpWord2D(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord2D(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpWord2E(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord2E(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16GrpWord2F(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord2F(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpWord30(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord30(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpWord31(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord31(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpWord32(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord32(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpWord33(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord33(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpWord34(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord34(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpWord35(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord35(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpWord36(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord36(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16GrpWord37(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord37(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpWord38(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=000 (BX+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord38(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpWord39(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=001 (BX+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord39(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpWord3A(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=010 (BP+SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord3A(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
},
/**
* opMod16GrpWord3B(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=011 (BP+DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord3B(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
},
/**
* opMod16GrpWord3C(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=100 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord3C(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpWord3D(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=101 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord3D(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpWord3E(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=110 (d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord3E(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod16GrpWord3F(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=111 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord3F(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod16GrpWord40(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord40(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWord41(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord41(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWord42(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord42(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWord43(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord43(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWord44(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord44(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord45(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord45(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord46(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord46(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord47(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord47(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord48(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord48(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWord49(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord49(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWord4A(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord4A(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWord4B(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord4B(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWord4C(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord4C(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord4D(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord4D(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord4E(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord4E(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord4F(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord4F(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord50(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord50(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWord51(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord51(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWord52(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord52(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWord53(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord53(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWord54(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord54(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord55(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord55(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord56(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord56(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord57(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord57(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord58(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord58(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWord59(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord59(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWord5A(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord5A(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWord5B(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord5B(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWord5C(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord5C(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord5D(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord5D(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord5E(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord5E(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord5F(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord5F(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord60(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord60(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWord61(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord61(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWord62(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord62(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWord63(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord63(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWord64(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord64(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord65(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord65(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord66(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord66(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord67(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord67(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord68(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord68(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWord69(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord69(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWord6A(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord6A(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWord6B(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord6B(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWord6C(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord6C(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord6D(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord6D(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord6E(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord6E(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord6F(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord6F(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord70(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord70(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWord71(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord71(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWord72(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord72(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWord73(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord73(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWord74(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord74(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord75(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord75(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord76(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord76(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord77(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord77(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord78(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=000 (BX+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord78(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWord79(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=001 (BX+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord79(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWord7A(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=010 (BP+SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord7A(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWord7B(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=011 (BP+DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord7B(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWord7C(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=100 (SI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord7C(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord7D(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=101 (DI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord7D(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord7E(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=110 (BP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord7E(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord7F(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=111 (BX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord7F(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord80(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord80(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWord81(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord81(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWord82(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord82(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWord83(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord83(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWord84(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord84(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord85(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord85(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord86(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord86(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord87(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord87(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord88(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord88(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWord89(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord89(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWord8A(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord8A(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWord8B(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord8B(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWord8C(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord8C(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord8D(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord8D(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord8E(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord8E(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord8F(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord8F(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord90(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord90(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWord91(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord91(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWord92(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord92(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWord93(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord93(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWord94(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord94(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord95(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord95(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord96(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord96(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord97(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord97(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord98(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord98(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWord99(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord99(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWord9A(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord9A(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWord9B(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord9B(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWord9C(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord9C(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord9D(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord9D(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord9E(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord9E(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWord9F(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWord9F(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWordA0(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordA0(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWordA1(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordA1(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWordA2(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordA2(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWordA3(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordA3(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWordA4(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordA4(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWordA5(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordA5(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWordA6(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordA6(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWordA7(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordA7(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWordA8(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordA8(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWordA9(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordA9(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWordAA(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordAA(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWordAB(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordAB(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWordAC(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordAC(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWordAD(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordAD(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWordAE(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordAE(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWordAF(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordAF(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWordB0(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordB0(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWordB1(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordB1(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWordB2(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordB2(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWordB3(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordB3(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWordB4(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordB4(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWordB5(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordB5(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWordB6(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordB6(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWordB7(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordB7(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWordB8(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=000 (BX+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordB8(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWordB9(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=001 (BX+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordB9(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWordBA(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=010 (BP+SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordBA(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
},
/**
* opMod16GrpWordBB(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=011 (BP+DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordBB(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
},
/**
* opMod16GrpWordBC(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=100 (SI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordBC(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWordBD(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=101 (DI+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordBD(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWordBE(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=110 (BP+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordBE(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWordBF(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=111 (BX+d16)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordBF(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod16GrpWordC0(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=000 (AX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordC0(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordC1(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=001 (CX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordC1(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.regECX & this.dataMask, fnSrc.call(this));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordC2(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=010 (DX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordC2(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordC3(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=011 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordC3(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordC4(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=100 (SP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordC4(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod16GrpWordC5(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=101 (BP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordC5(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordC6(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=110 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordC6(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.regESI & this.dataMask, fnSrc.call(this));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordC7(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=111 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordC7(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordC8(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=000 (AX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordC8(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordC9(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=001 (CX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordC9(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.regECX & this.dataMask, fnSrc.call(this));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordCA(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=010 (DX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordCA(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordCB(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=011 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordCB(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordCC(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=100 (SP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordCC(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod16GrpWordCD(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=101 (BP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordCD(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordCE(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=110 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordCE(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.regESI & this.dataMask, fnSrc.call(this));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordCF(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=111 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordCF(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordD0(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=000 (AX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordD0(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordD1(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=001 (CX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordD1(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.regECX & this.dataMask, fnSrc.call(this));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordD2(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=010 (DX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordD2(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordD3(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=011 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordD3(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordD4(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=100 (SP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordD4(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod16GrpWordD5(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=101 (BP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordD5(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordD6(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=110 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordD6(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.regESI & this.dataMask, fnSrc.call(this));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordD7(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=111 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordD7(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordD8(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=000 (AX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordD8(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordD9(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=001 (CX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordD9(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.regECX & this.dataMask, fnSrc.call(this));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordDA(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=010 (DX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordDA(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordDB(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=011 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordDB(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordDC(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=100 (SP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordDC(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod16GrpWordDD(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=101 (BP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordDD(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordDE(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=110 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordDE(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.regESI & this.dataMask, fnSrc.call(this));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordDF(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=111 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordDF(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordE0(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=000 (AX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordE0(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordE1(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=001 (CX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordE1(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.regECX & this.dataMask, fnSrc.call(this));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordE2(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=010 (DX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordE2(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordE3(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=011 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordE3(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordE4(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=100 (SP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordE4(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod16GrpWordE5(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=101 (BP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordE5(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordE6(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=110 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordE6(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.regESI & this.dataMask, fnSrc.call(this));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordE7(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=111 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordE7(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordE8(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=000 (AX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordE8(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordE9(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=001 (CX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordE9(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.regECX & this.dataMask, fnSrc.call(this));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordEA(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=010 (DX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordEA(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordEB(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=011 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordEB(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordEC(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=100 (SP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordEC(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod16GrpWordED(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=101 (BP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordED(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordEE(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=110 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordEE(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.regESI & this.dataMask, fnSrc.call(this));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordEF(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=111 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordEF(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordF0(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=000 (AX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordF0(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordF1(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=001 (CX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordF1(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.regECX & this.dataMask, fnSrc.call(this));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordF2(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=010 (DX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordF2(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordF3(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=011 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordF3(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordF4(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=100 (SP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordF4(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod16GrpWordF5(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=101 (BP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordF5(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordF6(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=110 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordF6(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.regESI & this.dataMask, fnSrc.call(this));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordF7(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=111 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordF7(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordF8(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=000 (AX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordF8(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordF9(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=001 (CX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordF9(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.regECX & this.dataMask, fnSrc.call(this));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordFA(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=010 (DX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordFA(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordFB(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=011 (BX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordFB(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordFC(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=100 (SP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordFC(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod16GrpWordFD(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=101 (BP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordFD(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordFE(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=110 (SI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordFE(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.regESI & this.dataMask, fnSrc.call(this));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod16GrpWordFF(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=111 (DI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod16GrpWordFF(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
}
];
if (typeof module !== 'undefined') module.exports = X86ModW16;
/**
* @fileoverview Implements PCjs 8086 mode-byte decoding.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2015-Jan-20
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
if (typeof module !== 'undefined') {
var X86 = require("./x86");
}
var X86ModW32 = {};
X86ModW32.aOpModReg = [
/**
* opMod32RegWord00(fn): mod=00 (src:mem) reg=000 (dst:AX) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord00(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEAX));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord01(fn): mod=00 (src:mem) reg=000 (dst:AX) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord01(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regECX));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord02(fn): mod=00 (src:mem) reg=000 (dst:AX) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord02(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEDX));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord03(fn): mod=00 (src:mem) reg=000 (dst:AX) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord03(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord04(fn): mod=00 (src:mem) reg=000 (dst:AX) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord04(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.getSIBAddr(0)));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord05(fn): mod=00 (src:mem) reg=000 (dst:AX) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord05(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.getIPAddr()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32RegWord06(fn): mod=00 (src:mem) reg=000 (dst:AX) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord06(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regESI));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord07(fn): mod=00 (src:mem) reg=000 (dst:AX) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord07(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEDI));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord08(fn): mod=00 (src:mem) reg=001 (dst:CX) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord08(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEAX));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord09(fn): mod=00 (src:mem) reg=001 (dst:CX) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord09(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regECX));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord0A(fn): mod=00 (src:mem) reg=001 (dst:CX) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord0A(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEDX));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord0B(fn): mod=00 (src:mem) reg=001 (dst:CX) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord0B(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord0C(fn): mod=00 (src:mem) reg=001 (dst:CX) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord0C(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.getSIBAddr(0)));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord0D(fn): mod=00 (src:mem) reg=001 (dst:CX) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord0D(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.getIPAddr()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32RegWord0E(fn): mod=00 (src:mem) reg=001 (dst:CX) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord0E(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regESI));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord0F(fn): mod=00 (src:mem) reg=001 (dst:CX) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord0F(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEDI));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord10(fn): mod=00 (src:mem) reg=010 (dst:DX) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord10(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEAX));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord11(fn): mod=00 (src:mem) reg=010 (dst:DX) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord11(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regECX));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord12(fn): mod=00 (src:mem) reg=010 (dst:DX) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord12(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEDX));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord13(fn): mod=00 (src:mem) reg=010 (dst:DX) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord13(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord14(fn): mod=00 (src:mem) reg=010 (dst:DX) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord14(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.getSIBAddr(0)));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord15(fn): mod=00 (src:mem) reg=010 (dst:DX) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord15(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.getIPAddr()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32RegWord16(fn): mod=00 (src:mem) reg=010 (dst:DX) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord16(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regESI));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord17(fn): mod=00 (src:mem) reg=010 (dst:DX) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord17(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEDI));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord18(fn): mod=00 (src:mem) reg=011 (dst:BX) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord18(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEAX));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord19(fn): mod=00 (src:mem) reg=011 (dst:BX) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord19(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regECX));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord1A(fn): mod=00 (src:mem) reg=011 (dst:BX) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord1A(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEDX));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord1B(fn): mod=00 (src:mem) reg=011 (dst:BX) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord1B(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord1C(fn): mod=00 (src:mem) reg=011 (dst:BX) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord1C(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.getSIBAddr(0)));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord1D(fn): mod=00 (src:mem) reg=011 (dst:BX) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord1D(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.getIPAddr()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32RegWord1E(fn): mod=00 (src:mem) reg=011 (dst:BX) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord1E(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regESI));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord1F(fn): mod=00 (src:mem) reg=011 (dst:BX) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord1F(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEDI));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord20(fn): mod=00 (src:mem) reg=100 (dst:SP) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord20(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEAX));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord21(fn): mod=00 (src:mem) reg=100 (dst:SP) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord21(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regECX));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord22(fn): mod=00 (src:mem) reg=100 (dst:SP) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord22(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEDX));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord23(fn): mod=00 (src:mem) reg=100 (dst:SP) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord23(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord24(fn): mod=00 (src:mem) reg=100 (dst:SP) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord24(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.getSIBAddr(0)));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord25(fn): mod=00 (src:mem) reg=100 (dst:SP) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord25(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.getIPAddr()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32RegWord26(fn): mod=00 (src:mem) reg=100 (dst:SP) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord26(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regESI));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord27(fn): mod=00 (src:mem) reg=100 (dst:SP) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord27(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEDI));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord28(fn): mod=00 (src:mem) reg=101 (dst:BP) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord28(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEAX));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord29(fn): mod=00 (src:mem) reg=101 (dst:BP) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord29(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regECX));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord2A(fn): mod=00 (src:mem) reg=101 (dst:BP) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord2A(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEDX));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord2B(fn): mod=00 (src:mem) reg=101 (dst:BP) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord2B(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord2C(fn): mod=00 (src:mem) reg=101 (dst:BP) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord2C(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.getSIBAddr(0)));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord2D(fn): mod=00 (src:mem) reg=101 (dst:BP) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord2D(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.getIPAddr()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32RegWord2E(fn): mod=00 (src:mem) reg=101 (dst:BP) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord2E(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regESI));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord2F(fn): mod=00 (src:mem) reg=101 (dst:BP) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord2F(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEDI));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord30(fn): mod=00 (src:mem) reg=110 (dst:SI) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord30(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEAX));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord31(fn): mod=00 (src:mem) reg=110 (dst:SI) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord31(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regECX));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord32(fn): mod=00 (src:mem) reg=110 (dst:SI) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord32(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEDX));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord33(fn): mod=00 (src:mem) reg=110 (dst:SI) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord33(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord34(fn): mod=00 (src:mem) reg=110 (dst:SI) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord34(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.getSIBAddr(0)));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord35(fn): mod=00 (src:mem) reg=110 (dst:SI) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord35(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.getIPAddr()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32RegWord36(fn): mod=00 (src:mem) reg=110 (dst:SI) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord36(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regESI));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord37(fn): mod=00 (src:mem) reg=110 (dst:SI) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord37(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEDI));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord38(fn): mod=00 (src:mem) reg=111 (dst:DI) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord38(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEAX));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord39(fn): mod=00 (src:mem) reg=111 (dst:DI) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord39(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regECX));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord3A(fn): mod=00 (src:mem) reg=111 (dst:DI) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord3A(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEDX));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord3B(fn): mod=00 (src:mem) reg=111 (dst:DI) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord3B(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord3C(fn): mod=00 (src:mem) reg=111 (dst:DI) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord3C(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.getSIBAddr(0)));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord3D(fn): mod=00 (src:mem) reg=111 (dst:DI) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord3D(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.getIPAddr()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32RegWord3E(fn): mod=00 (src:mem) reg=111 (dst:DI) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord3E(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regESI));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord3F(fn): mod=00 (src:mem) reg=111 (dst:DI) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord3F(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEDI));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32RegWord40(fn): mod=01 (src:mem+d8) reg=000 (dst:AX) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord40(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEAX + this.getIPDisp()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord41(fn): mod=01 (src:mem+d8) reg=000 (dst:AX) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord41(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regECX + this.getIPDisp()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord42(fn): mod=01 (src:mem+d8) reg=000 (dst:AX) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord42(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEDX + this.getIPDisp()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord43(fn): mod=01 (src:mem+d8) reg=000 (dst:AX) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord43(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord44(fn): mod=01 (src:mem+d8) reg=000 (dst:AX) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord44(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.getSIBAddr(1) + this.getIPDisp()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord45(fn): mod=01 (src:mem+d8) reg=000 (dst:AX) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord45(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord46(fn): mod=01 (src:mem+d8) reg=000 (dst:AX) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord46(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord47(fn): mod=01 (src:mem+d8) reg=000 (dst:AX) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord47(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord48(fn): mod=01 (src:mem+d8) reg=001 (dst:CX) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord48(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEAX + this.getIPDisp()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord49(fn): mod=01 (src:mem+d8) reg=001 (dst:CX) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord49(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regECX + this.getIPDisp()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord4A(fn): mod=01 (src:mem+d8) reg=001 (dst:CX) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord4A(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEDX + this.getIPDisp()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord4B(fn): mod=01 (src:mem+d8) reg=001 (dst:CX) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord4B(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord4C(fn): mod=01 (src:mem+d8) reg=001 (dst:CX) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord4C(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.getSIBAddr(1) + this.getIPDisp()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord4D(fn): mod=01 (src:mem+d8) reg=001 (dst:CX) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord4D(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord4E(fn): mod=01 (src:mem+d8) reg=001 (dst:CX) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord4E(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord4F(fn): mod=01 (src:mem+d8) reg=001 (dst:CX) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord4F(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord50(fn): mod=01 (src:mem+d8) reg=010 (dst:DX) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord50(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEAX + this.getIPDisp()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord51(fn): mod=01 (src:mem+d8) reg=010 (dst:DX) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord51(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regECX + this.getIPDisp()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord52(fn): mod=01 (src:mem+d8) reg=010 (dst:DX) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord52(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEDX + this.getIPDisp()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord53(fn): mod=01 (src:mem+d8) reg=010 (dst:DX) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord53(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord54(fn): mod=01 (src:mem+d8) reg=010 (dst:DX) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord54(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.getSIBAddr(1) + this.getIPDisp()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord55(fn): mod=01 (src:mem+d8) reg=010 (dst:DX) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord55(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord56(fn): mod=01 (src:mem+d8) reg=010 (dst:DX) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord56(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord57(fn): mod=01 (src:mem+d8) reg=010 (dst:DX) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord57(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord58(fn): mod=01 (src:mem+d8) reg=011 (dst:BX) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord58(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEAX + this.getIPDisp()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord59(fn): mod=01 (src:mem+d8) reg=011 (dst:BX) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord59(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regECX + this.getIPDisp()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord5A(fn): mod=01 (src:mem+d8) reg=011 (dst:BX) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord5A(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEDX + this.getIPDisp()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord5B(fn): mod=01 (src:mem+d8) reg=011 (dst:BX) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord5B(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord5C(fn): mod=01 (src:mem+d8) reg=011 (dst:BX) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord5C(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.getSIBAddr(1) + this.getIPDisp()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord5D(fn): mod=01 (src:mem+d8) reg=011 (dst:BX) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord5D(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord5E(fn): mod=01 (src:mem+d8) reg=011 (dst:BX) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord5E(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord5F(fn): mod=01 (src:mem+d8) reg=011 (dst:BX) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord5F(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord60(fn): mod=01 (src:mem+d8) reg=100 (dst:SP) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord60(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEAX + this.getIPDisp()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord61(fn): mod=01 (src:mem+d8) reg=100 (dst:SP) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord61(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regECX + this.getIPDisp()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord62(fn): mod=01 (src:mem+d8) reg=100 (dst:SP) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord62(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEDX + this.getIPDisp()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord63(fn): mod=01 (src:mem+d8) reg=100 (dst:SP) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord63(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord64(fn): mod=01 (src:mem+d8) reg=100 (dst:SP) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord64(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.getSIBAddr(1) + this.getIPDisp()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord65(fn): mod=01 (src:mem+d8) reg=100 (dst:SP) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord65(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord66(fn): mod=01 (src:mem+d8) reg=100 (dst:SP) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord66(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord67(fn): mod=01 (src:mem+d8) reg=100 (dst:SP) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord67(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord68(fn): mod=01 (src:mem+d8) reg=101 (dst:BP) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord68(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEAX + this.getIPDisp()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord69(fn): mod=01 (src:mem+d8) reg=101 (dst:BP) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord69(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regECX + this.getIPDisp()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord6A(fn): mod=01 (src:mem+d8) reg=101 (dst:BP) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord6A(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEDX + this.getIPDisp()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord6B(fn): mod=01 (src:mem+d8) reg=101 (dst:BP) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord6B(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord6C(fn): mod=01 (src:mem+d8) reg=101 (dst:BP) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord6C(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.getSIBAddr(1) + this.getIPDisp()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord6D(fn): mod=01 (src:mem+d8) reg=101 (dst:BP) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord6D(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord6E(fn): mod=01 (src:mem+d8) reg=101 (dst:BP) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord6E(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord6F(fn): mod=01 (src:mem+d8) reg=101 (dst:BP) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord6F(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord70(fn): mod=01 (src:mem+d8) reg=110 (dst:SI) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord70(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEAX + this.getIPDisp()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord71(fn): mod=01 (src:mem+d8) reg=110 (dst:SI) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord71(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regECX + this.getIPDisp()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord72(fn): mod=01 (src:mem+d8) reg=110 (dst:SI) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord72(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEDX + this.getIPDisp()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord73(fn): mod=01 (src:mem+d8) reg=110 (dst:SI) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord73(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord74(fn): mod=01 (src:mem+d8) reg=110 (dst:SI) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord74(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.getSIBAddr(1) + this.getIPDisp()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord75(fn): mod=01 (src:mem+d8) reg=110 (dst:SI) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord75(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord76(fn): mod=01 (src:mem+d8) reg=110 (dst:SI) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord76(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord77(fn): mod=01 (src:mem+d8) reg=110 (dst:SI) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord77(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord78(fn): mod=01 (src:mem+d8) reg=111 (dst:DI) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord78(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEAX + this.getIPDisp()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord79(fn): mod=01 (src:mem+d8) reg=111 (dst:DI) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord79(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regECX + this.getIPDisp()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord7A(fn): mod=01 (src:mem+d8) reg=111 (dst:DI) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord7A(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEDX + this.getIPDisp()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord7B(fn): mod=01 (src:mem+d8) reg=111 (dst:DI) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord7B(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord7C(fn): mod=01 (src:mem+d8) reg=111 (dst:DI) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord7C(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.getSIBAddr(1) + this.getIPDisp()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord7D(fn): mod=01 (src:mem+d8) reg=111 (dst:DI) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord7D(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord7E(fn): mod=01 (src:mem+d8) reg=111 (dst:DI) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord7E(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord7F(fn): mod=01 (src:mem+d8) reg=111 (dst:DI) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord7F(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord80(fn): mod=10 (src:mem+d16) reg=000 (dst:AX) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord80(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEAX + this.getIPAddr()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord81(fn): mod=10 (src:mem+d16) reg=000 (dst:AX) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord81(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regECX + this.getIPAddr()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord82(fn): mod=10 (src:mem+d16) reg=000 (dst:AX) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord82(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEDX + this.getIPAddr()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord83(fn): mod=10 (src:mem+d16) reg=000 (dst:AX) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord83(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord84(fn): mod=10 (src:mem+d16) reg=000 (dst:AX) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord84(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.getSIBAddr(2) + this.getIPAddr()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord85(fn): mod=10 (src:mem+d16) reg=000 (dst:AX) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord85(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord86(fn): mod=10 (src:mem+d16) reg=000 (dst:AX) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord86(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord87(fn): mod=10 (src:mem+d16) reg=000 (dst:AX) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord87(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord88(fn): mod=10 (src:mem+d16) reg=001 (dst:CX) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord88(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEAX + this.getIPAddr()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord89(fn): mod=10 (src:mem+d16) reg=001 (dst:CX) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord89(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regECX + this.getIPAddr()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord8A(fn): mod=10 (src:mem+d16) reg=001 (dst:CX) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord8A(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEDX + this.getIPAddr()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord8B(fn): mod=10 (src:mem+d16) reg=001 (dst:CX) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord8B(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord8C(fn): mod=10 (src:mem+d16) reg=001 (dst:CX) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord8C(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.getSIBAddr(2) + this.getIPAddr()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord8D(fn): mod=10 (src:mem+d16) reg=001 (dst:CX) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord8D(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord8E(fn): mod=10 (src:mem+d16) reg=001 (dst:CX) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord8E(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord8F(fn): mod=10 (src:mem+d16) reg=001 (dst:CX) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord8F(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord90(fn): mod=10 (src:mem+d16) reg=010 (dst:DX) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord90(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEAX + this.getIPAddr()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord91(fn): mod=10 (src:mem+d16) reg=010 (dst:DX) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord91(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regECX + this.getIPAddr()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord92(fn): mod=10 (src:mem+d16) reg=010 (dst:DX) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord92(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEDX + this.getIPAddr()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord93(fn): mod=10 (src:mem+d16) reg=010 (dst:DX) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord93(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord94(fn): mod=10 (src:mem+d16) reg=010 (dst:DX) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord94(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.getSIBAddr(2) + this.getIPAddr()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord95(fn): mod=10 (src:mem+d16) reg=010 (dst:DX) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord95(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord96(fn): mod=10 (src:mem+d16) reg=010 (dst:DX) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord96(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord97(fn): mod=10 (src:mem+d16) reg=010 (dst:DX) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord97(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord98(fn): mod=10 (src:mem+d16) reg=011 (dst:BX) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord98(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEAX + this.getIPAddr()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord99(fn): mod=10 (src:mem+d16) reg=011 (dst:BX) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord99(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regECX + this.getIPAddr()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord9A(fn): mod=10 (src:mem+d16) reg=011 (dst:BX) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord9A(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEDX + this.getIPAddr()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord9B(fn): mod=10 (src:mem+d16) reg=011 (dst:BX) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord9B(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord9C(fn): mod=10 (src:mem+d16) reg=011 (dst:BX) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord9C(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.getSIBAddr(2) + this.getIPAddr()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord9D(fn): mod=10 (src:mem+d16) reg=011 (dst:BX) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord9D(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord9E(fn): mod=10 (src:mem+d16) reg=011 (dst:BX) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord9E(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWord9F(fn): mod=10 (src:mem+d16) reg=011 (dst:BX) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWord9F(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordA0(fn): mod=10 (src:mem+d16) reg=100 (dst:SP) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordA0(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEAX + this.getIPAddr()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordA1(fn): mod=10 (src:mem+d16) reg=100 (dst:SP) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordA1(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regECX + this.getIPAddr()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordA2(fn): mod=10 (src:mem+d16) reg=100 (dst:SP) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordA2(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEDX + this.getIPAddr()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordA3(fn): mod=10 (src:mem+d16) reg=100 (dst:SP) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordA3(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordA4(fn): mod=10 (src:mem+d16) reg=100 (dst:SP) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordA4(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.getSIBAddr(2) + this.getIPAddr()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordA5(fn): mod=10 (src:mem+d16) reg=100 (dst:SP) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordA5(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordA6(fn): mod=10 (src:mem+d16) reg=100 (dst:SP) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordA6(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordA7(fn): mod=10 (src:mem+d16) reg=100 (dst:SP) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordA7(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
this.setSP((this.getSP() & ~this.dataMask) | w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordA8(fn): mod=10 (src:mem+d16) reg=101 (dst:BP) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordA8(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEAX + this.getIPAddr()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordA9(fn): mod=10 (src:mem+d16) reg=101 (dst:BP) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordA9(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regECX + this.getIPAddr()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordAA(fn): mod=10 (src:mem+d16) reg=101 (dst:BP) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordAA(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEDX + this.getIPAddr()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordAB(fn): mod=10 (src:mem+d16) reg=101 (dst:BP) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordAB(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordAC(fn): mod=10 (src:mem+d16) reg=101 (dst:BP) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordAC(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.getSIBAddr(2) + this.getIPAddr()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordAD(fn): mod=10 (src:mem+d16) reg=101 (dst:BP) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordAD(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordAE(fn): mod=10 (src:mem+d16) reg=101 (dst:BP) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordAE(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordAF(fn): mod=10 (src:mem+d16) reg=101 (dst:BP) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordAF(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordB0(fn): mod=10 (src:mem+d16) reg=110 (dst:SI) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordB0(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEAX + this.getIPAddr()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordB1(fn): mod=10 (src:mem+d16) reg=110 (dst:SI) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordB1(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regECX + this.getIPAddr()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordB2(fn): mod=10 (src:mem+d16) reg=110 (dst:SI) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordB2(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEDX + this.getIPAddr()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordB3(fn): mod=10 (src:mem+d16) reg=110 (dst:SI) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordB3(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordB4(fn): mod=10 (src:mem+d16) reg=110 (dst:SI) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordB4(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.getSIBAddr(2) + this.getIPAddr()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordB5(fn): mod=10 (src:mem+d16) reg=110 (dst:SI) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordB5(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordB6(fn): mod=10 (src:mem+d16) reg=110 (dst:SI) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordB6(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordB7(fn): mod=10 (src:mem+d16) reg=110 (dst:SI) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordB7(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordB8(fn): mod=10 (src:mem+d16) reg=111 (dst:DI) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordB8(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEAX + this.getIPAddr()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordB9(fn): mod=10 (src:mem+d16) reg=111 (dst:DI) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordB9(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regECX + this.getIPAddr()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordBA(fn): mod=10 (src:mem+d16) reg=111 (dst:DI) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordBA(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEDX + this.getIPAddr()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordBB(fn): mod=10 (src:mem+d16) reg=111 (dst:DI) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordBB(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordBC(fn): mod=10 (src:mem+d16) reg=111 (dst:DI) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordBC(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.getSIBAddr(2) + this.getIPAddr()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordBD(fn): mod=10 (src:mem+d16) reg=111 (dst:DI) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordBD(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordBE(fn): mod=10 (src:mem+d16) reg=111 (dst:DI) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordBE(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordBF(fn): mod=10 (src:mem+d16) reg=111 (dst:DI) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordBF(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32RegWordC0(fn): mod=11 (src:reg) reg=000 (dst:AX) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordC0(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.regEAX & this.dataMask);
this.regEAX = (this.regEAX & ~this.dataMask) | w;
},
/**
* opMod32RegWordC1(fn): mod=11 (src:reg) reg=000 (dst:AX) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordC1(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.regECX & this.dataMask);
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiCL; this.backTrack.btiAH = this.backTrack.btiCH;
}
},
/**
* opMod32RegWordC2(fn): mod=11 (src:reg) reg=000 (dst:AX) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordC2(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.regEDX & this.dataMask);
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiDL; this.backTrack.btiAH = this.backTrack.btiDH;
}
},
/**
* opMod32RegWordC3(fn): mod=11 (src:reg) reg=000 (dst:AX) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordC3(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.regEBX & this.dataMask);
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiBL; this.backTrack.btiAH = this.backTrack.btiBH;
}
},
/**
* opMod32RegWordC4(fn): mod=11 (src:reg) reg=000 (dst:AX) r/m=100 (ESP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordC4(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.getSP() & this.dataMask);
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = X86.BACKTRACK.SP_LO; this.backTrack.btiAH = X86.BACKTRACK.SP_HI;
}
},
/**
* opMod32RegWordC5(fn): mod=11 (src:reg) reg=000 (dst:AX) r/m=101 (EBP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordC5(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.regEBP & this.dataMask);
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiBPLo; this.backTrack.btiAH = this.backTrack.btiBPHi;
}
},
/**
* opMod32RegWordC6(fn): mod=11 (src:reg) reg=000 (dst:AX) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordC6(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.regESI & this.dataMask);
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiSILo; this.backTrack.btiAH = this.backTrack.btiSIHi;
}
},
/**
* opMod32RegWordC7(fn): mod=11 (src:reg) reg=000 (dst:AX) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordC7(fn) {
var w = fn.call(this, this.regEAX & this.dataMask, this.regEDI & this.dataMask);
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiDILo; this.backTrack.btiAH = this.backTrack.btiDIHi;
}
},
/**
* opMod32RegWordC8(fn): mod=11 (src:reg) reg=001 (dst:CX) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordC8(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.regEAX & this.dataMask);
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiAL; this.backTrack.btiCH = this.backTrack.btiAH;
}
},
/**
* opMod32RegWordC9(fn): mod=11 (src:reg) reg=001 (dst:CX) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordC9(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.regECX & this.dataMask);
this.regECX = (this.regECX & ~this.dataMask) | w;
},
/**
* opMod32RegWordCA(fn): mod=11 (src:reg) reg=001 (dst:CX) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordCA(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.regEDX & this.dataMask);
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiDL; this.backTrack.btiCH = this.backTrack.btiDH;
}
},
/**
* opMod32RegWordCB(fn): mod=11 (src:reg) reg=001 (dst:CX) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordCB(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.regEBX & this.dataMask);
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiBL; this.backTrack.btiCH = this.backTrack.btiBH;
}
},
/**
* opMod32RegWordCC(fn): mod=11 (src:reg) reg=001 (dst:CX) r/m=100 (ESP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordCC(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.getSP() & this.dataMask);
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = X86.BACKTRACK.SP_LO; this.backTrack.btiCH = X86.BACKTRACK.SP_HI;
}
},
/**
* opMod32RegWordCD(fn): mod=11 (src:reg) reg=001 (dst:CX) r/m=101 (EBP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordCD(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.regEBP & this.dataMask);
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiBPLo; this.backTrack.btiCH = this.backTrack.btiBPHi;
}
},
/**
* opMod32RegWordCE(fn): mod=11 (src:reg) reg=001 (dst:CX) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordCE(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.regESI & this.dataMask);
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiSILo; this.backTrack.btiCH = this.backTrack.btiSIHi;
}
},
/**
* opMod32RegWordCF(fn): mod=11 (src:reg) reg=001 (dst:CX) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordCF(fn) {
var w = fn.call(this, this.regECX & this.dataMask, this.regEDI & this.dataMask);
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiDILo; this.backTrack.btiCH = this.backTrack.btiDIHi;
}
},
/**
* opMod32RegWordD0(fn): mod=11 (src:reg) reg=010 (dst:DX) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordD0(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.regEAX & this.dataMask);
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiAL; this.backTrack.btiDH = this.backTrack.btiAH;
}
},
/**
* opMod32RegWordD1(fn): mod=11 (src:reg) reg=010 (dst:DX) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordD1(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.regECX & this.dataMask);
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiCL; this.backTrack.btiDH = this.backTrack.btiCH;
}
},
/**
* opMod32RegWordD2(fn): mod=11 (src:reg) reg=010 (dst:DX) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordD2(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.regEDX & this.dataMask);
this.regEDX = (this.regEDX & ~this.dataMask) | w;
},
/**
* opMod32RegWordD3(fn): mod=11 (src:reg) reg=010 (dst:DX) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordD3(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.regEBX & this.dataMask);
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiBL; this.backTrack.btiDH = this.backTrack.btiBH;
}
},
/**
* opMod32RegWordD4(fn): mod=11 (src:reg) reg=010 (dst:DX) r/m=100 (ESP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordD4(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.getSP() & this.dataMask);
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = X86.BACKTRACK.SP_LO; this.backTrack.btiDH = X86.BACKTRACK.SP_HI;
}
},
/**
* opMod32RegWordD5(fn): mod=11 (src:reg) reg=010 (dst:DX) r/m=101 (EBP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordD5(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.regEBP & this.dataMask);
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiBPLo; this.backTrack.btiDH = this.backTrack.btiBPHi;
}
},
/**
* opMod32RegWordD6(fn): mod=11 (src:reg) reg=010 (dst:DX) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordD6(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.regESI & this.dataMask);
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiSILo; this.backTrack.btiDH = this.backTrack.btiSIHi;
}
},
/**
* opMod32RegWordD7(fn): mod=11 (src:reg) reg=010 (dst:DX) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordD7(fn) {
var w = fn.call(this, this.regEDX & this.dataMask, this.regEDI & this.dataMask);
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiDILo; this.backTrack.btiDH = this.backTrack.btiDIHi;
}
},
/**
* opMod32RegWordD8(fn): mod=11 (src:reg) reg=011 (dst:BX) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordD8(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.regEAX & this.dataMask);
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiAL; this.backTrack.btiBH = this.backTrack.btiAH;
}
},
/**
* opMod32RegWordD9(fn): mod=11 (src:reg) reg=011 (dst:BX) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordD9(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.regECX & this.dataMask);
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiCL; this.backTrack.btiBH = this.backTrack.btiCH;
}
},
/**
* opMod32RegWordDA(fn): mod=11 (src:reg) reg=011 (dst:BX) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordDA(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.regEDX & this.dataMask);
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiDL; this.backTrack.btiBH = this.backTrack.btiDH;
}
},
/**
* opMod32RegWordDB(fn): mod=11 (src:reg) reg=011 (dst:BX) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordDB(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.regEBX & this.dataMask);
this.regEBX = (this.regEBX & ~this.dataMask) | w;
},
/**
* opMod32RegWordDC(fn): mod=11 (src:reg) reg=011 (dst:BX) r/m=100 (ESP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordDC(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.getSP() & this.dataMask);
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = X86.BACKTRACK.SP_LO; this.backTrack.btiBH = X86.BACKTRACK.SP_HI;
}
},
/**
* opMod32RegWordDD(fn): mod=11 (src:reg) reg=011 (dst:BX) r/m=101 (EBP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordDD(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.regEBP & this.dataMask);
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiBPLo; this.backTrack.btiBH = this.backTrack.btiBPHi;
}
},
/**
* opMod32RegWordDE(fn): mod=11 (src:reg) reg=011 (dst:BX) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordDE(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.regESI & this.dataMask);
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiSILo; this.backTrack.btiBH = this.backTrack.btiSIHi;
}
},
/**
* opMod32RegWordDF(fn): mod=11 (src:reg) reg=011 (dst:BX) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordDF(fn) {
var w = fn.call(this, this.regEBX & this.dataMask, this.regEDI & this.dataMask);
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiDILo; this.backTrack.btiBH = this.backTrack.btiDIHi;
}
},
/**
* opMod32RegWordE0(fn): mod=11 (src:reg) reg=100 (dst:SP) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordE0(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.regEAX & this.dataMask);
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod32RegWordE1(fn): mod=11 (src:reg) reg=100 (dst:SP) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordE1(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.regECX & this.dataMask);
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod32RegWordE2(fn): mod=11 (src:reg) reg=100 (dst:SP) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordE2(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.regEDX & this.dataMask);
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod32RegWordE3(fn): mod=11 (src:reg) reg=100 (dst:SP) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordE3(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.regEBX & this.dataMask);
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod32RegWordE4(fn): mod=11 (src:reg) reg=100 (dst:SP) r/m=100 (ESP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordE4(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.getSP() & this.dataMask);
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod32RegWordE5(fn): mod=11 (src:reg) reg=100 (dst:SP) r/m=101 (EBP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordE5(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.regEBP & this.dataMask);
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod32RegWordE6(fn): mod=11 (src:reg) reg=100 (dst:SP) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordE6(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.regESI & this.dataMask);
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod32RegWordE7(fn): mod=11 (src:reg) reg=100 (dst:SP) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordE7(fn) {
var w = fn.call(this, this.getSP() & this.dataMask, this.regEDI & this.dataMask);
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod32RegWordE8(fn): mod=11 (src:reg) reg=101 (dst:BP) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordE8(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.regEAX & this.dataMask);
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiAL; this.backTrack.btiBPHi = this.backTrack.btiAH;
}
},
/**
* opMod32RegWordE9(fn): mod=11 (src:reg) reg=101 (dst:BP) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordE9(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.regECX & this.dataMask);
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiCL; this.backTrack.btiBPHi = this.backTrack.btiCH;
}
},
/**
* opMod32RegWordEA(fn): mod=11 (src:reg) reg=101 (dst:BP) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordEA(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.regEDX & this.dataMask);
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiDL; this.backTrack.btiBPHi = this.backTrack.btiDH;
}
},
/**
* opMod32RegWordEB(fn): mod=11 (src:reg) reg=101 (dst:BP) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordEB(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.regEBX & this.dataMask);
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiBL; this.backTrack.btiBPHi = this.backTrack.btiBH;
}
},
/**
* opMod32RegWordEC(fn): mod=11 (src:reg) reg=101 (dst:BP) r/m=100 (ESP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordEC(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.getSP() & this.dataMask);
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = X86.BACKTRACK.SP_LO; this.backTrack.btiBPHi = X86.BACKTRACK.SP_HI;
}
},
/**
* opMod32RegWordED(fn): mod=11 (src:reg) reg=101 (dst:BP) r/m=101 (EBP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordED(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.regEBP & this.dataMask);
this.regEBP = (this.regEBP & ~this.dataMask) | w;
},
/**
* opMod32RegWordEE(fn): mod=11 (src:reg) reg=101 (dst:BP) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordEE(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.regESI & this.dataMask);
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiSILo; this.backTrack.btiBPHi = this.backTrack.btiSIHi;
}
},
/**
* opMod32RegWordEF(fn): mod=11 (src:reg) reg=101 (dst:BP) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordEF(fn) {
var w = fn.call(this, this.regEBP & this.dataMask, this.regEDI & this.dataMask);
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiDILo; this.backTrack.btiBPHi = this.backTrack.btiDIHi;
}
},
/**
* opMod32RegWordF0(fn): mod=11 (src:reg) reg=110 (dst:SI) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordF0(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.regEAX & this.dataMask);
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiAL; this.backTrack.btiSIHi = this.backTrack.btiAH;
}
},
/**
* opMod32RegWordF1(fn): mod=11 (src:reg) reg=110 (dst:SI) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordF1(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.regECX & this.dataMask);
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiCL; this.backTrack.btiSIHi = this.backTrack.btiCH;
}
},
/**
* opMod32RegWordF2(fn): mod=11 (src:reg) reg=110 (dst:SI) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordF2(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.regEDX & this.dataMask);
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiDL; this.backTrack.btiSIHi = this.backTrack.btiDH;
}
},
/**
* opMod32RegWordF3(fn): mod=11 (src:reg) reg=110 (dst:SI) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordF3(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.regEBX & this.dataMask);
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiBL; this.backTrack.btiSIHi = this.backTrack.btiBH;
}
},
/**
* opMod32RegWordF4(fn): mod=11 (src:reg) reg=110 (dst:SI) r/m=100 (ESP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordF4(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.getSP() & this.dataMask);
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = X86.BACKTRACK.SP_LO; this.backTrack.btiSIHi = X86.BACKTRACK.SP_HI;
}
},
/**
* opMod32RegWordF5(fn): mod=11 (src:reg) reg=110 (dst:SI) r/m=101 (EBP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordF5(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.regEBP & this.dataMask);
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiBPLo; this.backTrack.btiSIHi = this.backTrack.btiBPHi;
}
},
/**
* opMod32RegWordF6(fn): mod=11 (src:reg) reg=110 (dst:SI) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordF6(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.regESI & this.dataMask);
this.regESI = (this.regESI & ~this.dataMask) | w;
},
/**
* opMod32RegWordF7(fn): mod=11 (src:reg) reg=110 (dst:SI) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordF7(fn) {
var w = fn.call(this, this.regESI & this.dataMask, this.regEDI & this.dataMask);
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiDILo; this.backTrack.btiSIHi = this.backTrack.btiDIHi;
}
},
/**
* opMod32RegWordF8(fn): mod=11 (src:reg) reg=111 (dst:DI) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordF8(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.regEAX & this.dataMask);
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiAL; this.backTrack.btiDIHi = this.backTrack.btiAH;
}
},
/**
* opMod32RegWordF9(fn): mod=11 (src:reg) reg=111 (dst:DI) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordF9(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.regECX & this.dataMask);
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiCL; this.backTrack.btiDIHi = this.backTrack.btiCH;
}
},
/**
* opMod32RegWordFA(fn): mod=11 (src:reg) reg=111 (dst:DI) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordFA(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.regEDX & this.dataMask);
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiDL; this.backTrack.btiDIHi = this.backTrack.btiDH;
}
},
/**
* opMod32RegWordFB(fn): mod=11 (src:reg) reg=111 (dst:DI) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordFB(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.regEBX & this.dataMask);
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiBL; this.backTrack.btiDIHi = this.backTrack.btiBH;
}
},
/**
* opMod32RegWordFC(fn): mod=11 (src:reg) reg=111 (dst:DI) r/m=100 (ESP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordFC(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.getSP() & this.dataMask);
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = X86.BACKTRACK.SP_LO; this.backTrack.btiDIHi = X86.BACKTRACK.SP_HI;
}
},
/**
* opMod32RegWordFD(fn): mod=11 (src:reg) reg=111 (dst:DI) r/m=101 (EBP)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordFD(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.regEBP & this.dataMask);
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiBPLo; this.backTrack.btiDIHi = this.backTrack.btiBPHi;
}
},
/**
* opMod32RegWordFE(fn): mod=11 (src:reg) reg=111 (dst:DI) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordFE(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.regESI & this.dataMask);
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiSILo; this.backTrack.btiDIHi = this.backTrack.btiSIHi;
}
},
/**
* opMod32RegWordFF(fn): mod=11 (src:reg) reg=111 (dst:DI) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32RegWordFF(fn) {
var w = fn.call(this, this.regEDI & this.dataMask, this.regEDI & this.dataMask);
this.regEDI = (this.regEDI & ~this.dataMask) | w;
}
];
X86ModW32.aOpModMem = [
/**
* opMod32MemWord00(fn): mod=00 (dst:mem) reg=000 (src:AX) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord00(fn) {
var w = fn.call(this, this.modEAWordData(this.regEAX), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord01(fn): mod=00 (dst:mem) reg=000 (src:AX) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord01(fn) {
var w = fn.call(this, this.modEAWordData(this.regECX), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord02(fn): mod=00 (dst:mem) reg=000 (src:AX) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord02(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDX), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord03(fn): mod=00 (dst:mem) reg=000 (src:AX) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord03(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord04(fn): mod=00 (dst:mem) reg=000 (src:AX) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord04(fn) {
var w = fn.call(this, this.modEAWordData(this.getSIBAddr(0)), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord05(fn): mod=00 (dst:mem) reg=000 (src:AX) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord05(fn) {
var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32MemWord06(fn): mod=00 (dst:mem) reg=000 (src:AX) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord06(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord07(fn): mod=00 (dst:mem) reg=000 (src:AX) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord07(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord08(fn): mod=00 (dst:mem) reg=001 (src:CX) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord08(fn) {
var w = fn.call(this, this.modEAWordData(this.regEAX), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord09(fn): mod=00 (dst:mem) reg=001 (src:CX) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord09(fn) {
var w = fn.call(this, this.modEAWordData(this.regECX), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord0A(fn): mod=00 (dst:mem) reg=001 (src:CX) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord0A(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDX), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord0B(fn): mod=00 (dst:mem) reg=001 (src:CX) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord0B(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord0C(fn): mod=00 (dst:mem) reg=001 (src:CX) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord0C(fn) {
var w = fn.call(this, this.modEAWordData(this.getSIBAddr(0)), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord0D(fn): mod=00 (dst:mem) reg=001 (src:CX) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord0D(fn) {
var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32MemWord0E(fn): mod=00 (dst:mem) reg=001 (src:CX) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord0E(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord0F(fn): mod=00 (dst:mem) reg=001 (src:CX) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord0F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord10(fn): mod=00 (dst:mem) reg=010 (src:DX) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord10(fn) {
var w = fn.call(this, this.modEAWordData(this.regEAX), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord11(fn): mod=00 (dst:mem) reg=010 (src:DX) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord11(fn) {
var w = fn.call(this, this.modEAWordData(this.regECX), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord12(fn): mod=00 (dst:mem) reg=010 (src:DX) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord12(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDX), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord13(fn): mod=00 (dst:mem) reg=010 (src:DX) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord13(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord14(fn): mod=00 (dst:mem) reg=010 (src:DX) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord14(fn) {
var w = fn.call(this, this.modEAWordData(this.getSIBAddr(0)), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord15(fn): mod=00 (dst:mem) reg=010 (src:DX) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord15(fn) {
var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32MemWord16(fn): mod=00 (dst:mem) reg=010 (src:DX) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord16(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord17(fn): mod=00 (dst:mem) reg=010 (src:DX) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord17(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord18(fn): mod=00 (dst:mem) reg=011 (src:BX) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord18(fn) {
var w = fn.call(this, this.modEAWordData(this.regEAX), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord19(fn): mod=00 (dst:mem) reg=011 (src:BX) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord19(fn) {
var w = fn.call(this, this.modEAWordData(this.regECX), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord1A(fn): mod=00 (dst:mem) reg=011 (src:BX) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord1A(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDX), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord1B(fn): mod=00 (dst:mem) reg=011 (src:BX) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord1B(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord1C(fn): mod=00 (dst:mem) reg=011 (src:BX) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord1C(fn) {
var w = fn.call(this, this.modEAWordData(this.getSIBAddr(0)), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord1D(fn): mod=00 (dst:mem) reg=011 (src:BX) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord1D(fn) {
var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32MemWord1E(fn): mod=00 (dst:mem) reg=011 (src:BX) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord1E(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord1F(fn): mod=00 (dst:mem) reg=011 (src:BX) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord1F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord20(fn): mod=00 (dst:mem) reg=100 (src:SP) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord20(fn) {
var w = fn.call(this, this.modEAWordData(this.regEAX), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord21(fn): mod=00 (dst:mem) reg=100 (src:SP) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord21(fn) {
var w = fn.call(this, this.modEAWordData(this.regECX), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord22(fn): mod=00 (dst:mem) reg=100 (src:SP) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord22(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDX), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord23(fn): mod=00 (dst:mem) reg=100 (src:SP) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord23(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord24(fn): mod=00 (dst:mem) reg=100 (src:SP) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord24(fn) {
var w = fn.call(this, this.modEAWordData(this.getSIBAddr(0)), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord25(fn): mod=00 (dst:mem) reg=100 (src:SP) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord25(fn) {
var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32MemWord26(fn): mod=00 (dst:mem) reg=100 (src:SP) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord26(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord27(fn): mod=00 (dst:mem) reg=100 (src:SP) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord27(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord28(fn): mod=00 (dst:mem) reg=101 (src:BP) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord28(fn) {
var w = fn.call(this, this.modEAWordData(this.regEAX), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord29(fn): mod=00 (dst:mem) reg=101 (src:BP) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord29(fn) {
var w = fn.call(this, this.modEAWordData(this.regECX), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord2A(fn): mod=00 (dst:mem) reg=101 (src:BP) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord2A(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDX), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord2B(fn): mod=00 (dst:mem) reg=101 (src:BP) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord2B(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord2C(fn): mod=00 (dst:mem) reg=101 (src:BP) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord2C(fn) {
var w = fn.call(this, this.modEAWordData(this.getSIBAddr(0)), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord2D(fn): mod=00 (dst:mem) reg=101 (src:BP) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord2D(fn) {
var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32MemWord2E(fn): mod=00 (dst:mem) reg=101 (src:BP) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord2E(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord2F(fn): mod=00 (dst:mem) reg=101 (src:BP) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord2F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord30(fn): mod=00 (dst:mem) reg=110 (src:SI) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord30(fn) {
var w = fn.call(this, this.modEAWordData(this.regEAX), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord31(fn): mod=00 (dst:mem) reg=110 (src:SI) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord31(fn) {
var w = fn.call(this, this.modEAWordData(this.regECX), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord32(fn): mod=00 (dst:mem) reg=110 (src:SI) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord32(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDX), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord33(fn): mod=00 (dst:mem) reg=110 (src:SI) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord33(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord34(fn): mod=00 (dst:mem) reg=110 (src:SI) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord34(fn) {
var w = fn.call(this, this.modEAWordData(this.getSIBAddr(0)), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord35(fn): mod=00 (dst:mem) reg=110 (src:SI) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord35(fn) {
var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32MemWord36(fn): mod=00 (dst:mem) reg=110 (src:SI) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord36(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord37(fn): mod=00 (dst:mem) reg=110 (src:SI) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord37(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord38(fn): mod=00 (dst:mem) reg=111 (src:DI) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord38(fn) {
var w = fn.call(this, this.modEAWordData(this.regEAX), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord39(fn): mod=00 (dst:mem) reg=111 (src:DI) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord39(fn) {
var w = fn.call(this, this.modEAWordData(this.regECX), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord3A(fn): mod=00 (dst:mem) reg=111 (src:DI) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord3A(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDX), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord3B(fn): mod=00 (dst:mem) reg=111 (src:DI) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord3B(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord3C(fn): mod=00 (dst:mem) reg=111 (src:DI) r/m=100 (sib)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord3C(fn) {
var w = fn.call(this, this.modEAWordData(this.getSIBAddr(0)), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord3D(fn): mod=00 (dst:mem) reg=111 (src:DI) r/m=101 (d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord3D(fn) {
var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32MemWord3E(fn): mod=00 (dst:mem) reg=111 (src:DI) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord3E(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord3F(fn): mod=00 (dst:mem) reg=111 (src:DI) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord3F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32MemWord40(fn): mod=01 (dst:mem+d8) reg=000 (src:AX) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord40(fn) {
var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord41(fn): mod=01 (dst:mem+d8) reg=000 (src:AX) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord41(fn) {
var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPDisp()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord42(fn): mod=01 (dst:mem+d8) reg=000 (src:AX) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord42(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord43(fn): mod=01 (dst:mem+d8) reg=000 (src:AX) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord43(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord44(fn): mod=01 (dst:mem+d8) reg=000 (src:AX) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord44(fn) {
var w = fn.call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord45(fn): mod=01 (dst:mem+d8) reg=000 (src:AX) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord45(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord46(fn): mod=01 (dst:mem+d8) reg=000 (src:AX) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord46(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord47(fn): mod=01 (dst:mem+d8) reg=000 (src:AX) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord47(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord48(fn): mod=01 (dst:mem+d8) reg=001 (src:CX) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord48(fn) {
var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord49(fn): mod=01 (dst:mem+d8) reg=001 (src:CX) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord49(fn) {
var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPDisp()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord4A(fn): mod=01 (dst:mem+d8) reg=001 (src:CX) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord4A(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord4B(fn): mod=01 (dst:mem+d8) reg=001 (src:CX) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord4B(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord4C(fn): mod=01 (dst:mem+d8) reg=001 (src:CX) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord4C(fn) {
var w = fn.call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord4D(fn): mod=01 (dst:mem+d8) reg=001 (src:CX) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord4D(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord4E(fn): mod=01 (dst:mem+d8) reg=001 (src:CX) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord4E(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord4F(fn): mod=01 (dst:mem+d8) reg=001 (src:CX) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord4F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord50(fn): mod=01 (dst:mem+d8) reg=010 (src:DX) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord50(fn) {
var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord51(fn): mod=01 (dst:mem+d8) reg=010 (src:DX) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord51(fn) {
var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPDisp()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord52(fn): mod=01 (dst:mem+d8) reg=010 (src:DX) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord52(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord53(fn): mod=01 (dst:mem+d8) reg=010 (src:DX) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord53(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord54(fn): mod=01 (dst:mem+d8) reg=010 (src:DX) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord54(fn) {
var w = fn.call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord55(fn): mod=01 (dst:mem+d8) reg=010 (src:DX) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord55(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord56(fn): mod=01 (dst:mem+d8) reg=010 (src:DX) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord56(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord57(fn): mod=01 (dst:mem+d8) reg=010 (src:DX) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord57(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord58(fn): mod=01 (dst:mem+d8) reg=011 (src:BX) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord58(fn) {
var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord59(fn): mod=01 (dst:mem+d8) reg=011 (src:BX) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord59(fn) {
var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPDisp()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord5A(fn): mod=01 (dst:mem+d8) reg=011 (src:BX) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord5A(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord5B(fn): mod=01 (dst:mem+d8) reg=011 (src:BX) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord5B(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord5C(fn): mod=01 (dst:mem+d8) reg=011 (src:BX) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord5C(fn) {
var w = fn.call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord5D(fn): mod=01 (dst:mem+d8) reg=011 (src:BX) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord5D(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord5E(fn): mod=01 (dst:mem+d8) reg=011 (src:BX) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord5E(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord5F(fn): mod=01 (dst:mem+d8) reg=011 (src:BX) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord5F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord60(fn): mod=01 (dst:mem+d8) reg=100 (src:SP) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord60(fn) {
var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord61(fn): mod=01 (dst:mem+d8) reg=100 (src:SP) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord61(fn) {
var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPDisp()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord62(fn): mod=01 (dst:mem+d8) reg=100 (src:SP) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord62(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord63(fn): mod=01 (dst:mem+d8) reg=100 (src:SP) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord63(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord64(fn): mod=01 (dst:mem+d8) reg=100 (src:SP) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord64(fn) {
var w = fn.call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord65(fn): mod=01 (dst:mem+d8) reg=100 (src:SP) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord65(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord66(fn): mod=01 (dst:mem+d8) reg=100 (src:SP) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord66(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord67(fn): mod=01 (dst:mem+d8) reg=100 (src:SP) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord67(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord68(fn): mod=01 (dst:mem+d8) reg=101 (src:BP) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord68(fn) {
var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord69(fn): mod=01 (dst:mem+d8) reg=101 (src:BP) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord69(fn) {
var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPDisp()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord6A(fn): mod=01 (dst:mem+d8) reg=101 (src:BP) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord6A(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord6B(fn): mod=01 (dst:mem+d8) reg=101 (src:BP) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord6B(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord6C(fn): mod=01 (dst:mem+d8) reg=101 (src:BP) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord6C(fn) {
var w = fn.call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord6D(fn): mod=01 (dst:mem+d8) reg=101 (src:BP) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord6D(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord6E(fn): mod=01 (dst:mem+d8) reg=101 (src:BP) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord6E(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord6F(fn): mod=01 (dst:mem+d8) reg=101 (src:BP) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord6F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord70(fn): mod=01 (dst:mem+d8) reg=110 (src:SI) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord70(fn) {
var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord71(fn): mod=01 (dst:mem+d8) reg=110 (src:SI) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord71(fn) {
var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPDisp()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord72(fn): mod=01 (dst:mem+d8) reg=110 (src:SI) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord72(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord73(fn): mod=01 (dst:mem+d8) reg=110 (src:SI) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord73(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord74(fn): mod=01 (dst:mem+d8) reg=110 (src:SI) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord74(fn) {
var w = fn.call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord75(fn): mod=01 (dst:mem+d8) reg=110 (src:SI) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord75(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord76(fn): mod=01 (dst:mem+d8) reg=110 (src:SI) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord76(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord77(fn): mod=01 (dst:mem+d8) reg=110 (src:SI) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord77(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord78(fn): mod=01 (dst:mem+d8) reg=111 (src:DI) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord78(fn) {
var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord79(fn): mod=01 (dst:mem+d8) reg=111 (src:DI) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord79(fn) {
var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPDisp()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord7A(fn): mod=01 (dst:mem+d8) reg=111 (src:DI) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord7A(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord7B(fn): mod=01 (dst:mem+d8) reg=111 (src:DI) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord7B(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord7C(fn): mod=01 (dst:mem+d8) reg=111 (src:DI) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord7C(fn) {
var w = fn.call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord7D(fn): mod=01 (dst:mem+d8) reg=111 (src:DI) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord7D(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord7E(fn): mod=01 (dst:mem+d8) reg=111 (src:DI) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord7E(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord7F(fn): mod=01 (dst:mem+d8) reg=111 (src:DI) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord7F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord80(fn): mod=10 (dst:mem+d16) reg=000 (src:AX) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord80(fn) {
var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord81(fn): mod=10 (dst:mem+d16) reg=000 (src:AX) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord81(fn) {
var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPAddr()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord82(fn): mod=10 (dst:mem+d16) reg=000 (src:AX) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord82(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord83(fn): mod=10 (dst:mem+d16) reg=000 (src:AX) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord83(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord84(fn): mod=10 (dst:mem+d16) reg=000 (src:AX) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord84(fn) {
var w = fn.call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord85(fn): mod=10 (dst:mem+d16) reg=000 (src:AX) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord85(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord86(fn): mod=10 (dst:mem+d16) reg=000 (src:AX) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord86(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord87(fn): mod=10 (dst:mem+d16) reg=000 (src:AX) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord87(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord88(fn): mod=10 (dst:mem+d16) reg=001 (src:CX) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord88(fn) {
var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord89(fn): mod=10 (dst:mem+d16) reg=001 (src:CX) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord89(fn) {
var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPAddr()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord8A(fn): mod=10 (dst:mem+d16) reg=001 (src:CX) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord8A(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord8B(fn): mod=10 (dst:mem+d16) reg=001 (src:CX) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord8B(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord8C(fn): mod=10 (dst:mem+d16) reg=001 (src:CX) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord8C(fn) {
var w = fn.call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord8D(fn): mod=10 (dst:mem+d16) reg=001 (src:CX) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord8D(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord8E(fn): mod=10 (dst:mem+d16) reg=001 (src:CX) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord8E(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord8F(fn): mod=10 (dst:mem+d16) reg=001 (src:CX) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord8F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord90(fn): mod=10 (dst:mem+d16) reg=010 (src:DX) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord90(fn) {
var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord91(fn): mod=10 (dst:mem+d16) reg=010 (src:DX) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord91(fn) {
var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPAddr()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord92(fn): mod=10 (dst:mem+d16) reg=010 (src:DX) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord92(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord93(fn): mod=10 (dst:mem+d16) reg=010 (src:DX) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord93(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord94(fn): mod=10 (dst:mem+d16) reg=010 (src:DX) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord94(fn) {
var w = fn.call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord95(fn): mod=10 (dst:mem+d16) reg=010 (src:DX) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord95(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord96(fn): mod=10 (dst:mem+d16) reg=010 (src:DX) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord96(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord97(fn): mod=10 (dst:mem+d16) reg=010 (src:DX) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord97(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord98(fn): mod=10 (dst:mem+d16) reg=011 (src:BX) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord98(fn) {
var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord99(fn): mod=10 (dst:mem+d16) reg=011 (src:BX) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord99(fn) {
var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPAddr()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord9A(fn): mod=10 (dst:mem+d16) reg=011 (src:BX) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord9A(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord9B(fn): mod=10 (dst:mem+d16) reg=011 (src:BX) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord9B(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord9C(fn): mod=10 (dst:mem+d16) reg=011 (src:BX) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord9C(fn) {
var w = fn.call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord9D(fn): mod=10 (dst:mem+d16) reg=011 (src:BX) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord9D(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord9E(fn): mod=10 (dst:mem+d16) reg=011 (src:BX) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord9E(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWord9F(fn): mod=10 (dst:mem+d16) reg=011 (src:BX) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWord9F(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEBX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordA0(fn): mod=10 (dst:mem+d16) reg=100 (src:SP) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordA0(fn) {
var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordA1(fn): mod=10 (dst:mem+d16) reg=100 (src:SP) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordA1(fn) {
var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPAddr()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordA2(fn): mod=10 (dst:mem+d16) reg=100 (src:SP) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordA2(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordA3(fn): mod=10 (dst:mem+d16) reg=100 (src:SP) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordA3(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordA4(fn): mod=10 (dst:mem+d16) reg=100 (src:SP) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordA4(fn) {
var w = fn.call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordA5(fn): mod=10 (dst:mem+d16) reg=100 (src:SP) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordA5(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordA6(fn): mod=10 (dst:mem+d16) reg=100 (src:SP) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordA6(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordA7(fn): mod=10 (dst:mem+d16) reg=100 (src:SP) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordA7(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.getSP() & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordA8(fn): mod=10 (dst:mem+d16) reg=101 (src:BP) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordA8(fn) {
var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordA9(fn): mod=10 (dst:mem+d16) reg=101 (src:BP) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordA9(fn) {
var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPAddr()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordAA(fn): mod=10 (dst:mem+d16) reg=101 (src:BP) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordAA(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordAB(fn): mod=10 (dst:mem+d16) reg=101 (src:BP) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordAB(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordAC(fn): mod=10 (dst:mem+d16) reg=101 (src:BP) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordAC(fn) {
var w = fn.call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordAD(fn): mod=10 (dst:mem+d16) reg=101 (src:BP) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordAD(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordAE(fn): mod=10 (dst:mem+d16) reg=101 (src:BP) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordAE(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordAF(fn): mod=10 (dst:mem+d16) reg=101 (src:BP) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordAF(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordB0(fn): mod=10 (dst:mem+d16) reg=110 (src:SI) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordB0(fn) {
var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordB1(fn): mod=10 (dst:mem+d16) reg=110 (src:SI) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordB1(fn) {
var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPAddr()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordB2(fn): mod=10 (dst:mem+d16) reg=110 (src:SI) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordB2(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordB3(fn): mod=10 (dst:mem+d16) reg=110 (src:SI) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordB3(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordB4(fn): mod=10 (dst:mem+d16) reg=110 (src:SI) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordB4(fn) {
var w = fn.call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordB5(fn): mod=10 (dst:mem+d16) reg=110 (src:SI) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordB5(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordB6(fn): mod=10 (dst:mem+d16) reg=110 (src:SI) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordB6(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordB7(fn): mod=10 (dst:mem+d16) reg=110 (src:SI) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordB7(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordB8(fn): mod=10 (dst:mem+d16) reg=111 (src:DI) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordB8(fn) {
var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordB9(fn): mod=10 (dst:mem+d16) reg=111 (src:DI) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordB9(fn) {
var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPAddr()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordBA(fn): mod=10 (dst:mem+d16) reg=111 (src:DI) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordBA(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordBB(fn): mod=10 (dst:mem+d16) reg=111 (src:DI) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordBB(fn) {
var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordBC(fn): mod=10 (dst:mem+d16) reg=111 (src:DI) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordBC(fn) {
var w = fn.call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordBD(fn): mod=10 (dst:mem+d16) reg=111 (src:DI) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordBD(fn) {
var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordBE(fn): mod=10 (dst:mem+d16) reg=111 (src:DI) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordBE(fn) {
var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32MemWordBF(fn): mod=10 (dst:mem+d16) reg=111 (src:DI) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {function(number,number)} fn (dst,src)
*/
function opMod32MemWordBF(fn) {
var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEDI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
}
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
X86ModW32.aOpModReg[0xC0], X86ModW32.aOpModReg[0xC8], X86ModW32.aOpModReg[0xD0], X86ModW32.aOpModReg[0xD8],
X86ModW32.aOpModReg[0xE0], X86ModW32.aOpModReg[0xE8], X86ModW32.aOpModReg[0xF0], X86ModW32.aOpModReg[0xF8],
X86ModW32.aOpModReg[0xC1], X86ModW32.aOpModReg[0xC9], X86ModW32.aOpModReg[0xD1], X86ModW32.aOpModReg[0xD9],
X86ModW32.aOpModReg[0xE1], X86ModW32.aOpModReg[0xE9], X86ModW32.aOpModReg[0xF1], X86ModW32.aOpModReg[0xF9],
X86ModW32.aOpModReg[0xC2], X86ModW32.aOpModReg[0xCA], X86ModW32.aOpModReg[0xD2], X86ModW32.aOpModReg[0xDA],
X86ModW32.aOpModReg[0xE2], X86ModW32.aOpModReg[0xEA], X86ModW32.aOpModReg[0xF2], X86ModW32.aOpModReg[0xFA],
X86ModW32.aOpModReg[0xC3], X86ModW32.aOpModReg[0xCB], X86ModW32.aOpModReg[0xD3], X86ModW32.aOpModReg[0xDB],
X86ModW32.aOpModReg[0xE3], X86ModW32.aOpModReg[0xEB], X86ModW32.aOpModReg[0xF3], X86ModW32.aOpModReg[0xFB],
X86ModW32.aOpModReg[0xC4], X86ModW32.aOpModReg[0xCC], X86ModW32.aOpModReg[0xD4], X86ModW32.aOpModReg[0xDC],
X86ModW32.aOpModReg[0xE4], X86ModW32.aOpModReg[0xEC], X86ModW32.aOpModReg[0xF4], X86ModW32.aOpModReg[0xFC],
X86ModW32.aOpModReg[0xC5], X86ModW32.aOpModReg[0xCD], X86ModW32.aOpModReg[0xD5], X86ModW32.aOpModReg[0xDD],
X86ModW32.aOpModReg[0xE5], X86ModW32.aOpModReg[0xED], X86ModW32.aOpModReg[0xF5], X86ModW32.aOpModReg[0xFD],
X86ModW32.aOpModReg[0xC6], X86ModW32.aOpModReg[0xCE], X86ModW32.aOpModReg[0xD6], X86ModW32.aOpModReg[0xDE],
X86ModW32.aOpModReg[0xE6], X86ModW32.aOpModReg[0xEE], X86ModW32.aOpModReg[0xF6], X86ModW32.aOpModReg[0xFE],
X86ModW32.aOpModReg[0xC7], X86ModW32.aOpModReg[0xCF], X86ModW32.aOpModReg[0xD7], X86ModW32.aOpModReg[0xDF],
X86ModW32.aOpModReg[0xE7], X86ModW32.aOpModReg[0xEF], X86ModW32.aOpModReg[0xF7], X86ModW32.aOpModReg[0xFF]
];
X86ModW32.aOpModGrp = [
/**
* opMod32GrpWord00(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord00(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEAX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord01(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord01(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regECX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord02(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord02(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEDX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord03(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord03(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord04(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=100 (sib)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord04(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.getSIBAddr(0)), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord05(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=101 (d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord05(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32GrpWord06(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord06(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord07(afnGrp, fnSrc): mod=00 (dst:mem) reg=000 (afnGrp[0]) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord07(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord08(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord08(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEAX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord09(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord09(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regECX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord0A(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord0A(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEDX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord0B(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord0B(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord0C(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=100 (sib)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord0C(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.getSIBAddr(0)), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord0D(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=101 (d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord0D(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32GrpWord0E(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord0E(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord0F(afnGrp, fnSrc): mod=00 (dst:mem) reg=001 (afnGrp[1]) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord0F(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord10(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord10(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEAX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord11(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord11(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regECX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord12(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord12(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEDX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord13(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord13(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord14(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=100 (sib)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord14(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.getSIBAddr(0)), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord15(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=101 (d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord15(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32GrpWord16(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord16(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord17(afnGrp, fnSrc): mod=00 (dst:mem) reg=010 (afnGrp[2]) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord17(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord18(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord18(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEAX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord19(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord19(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regECX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord1A(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord1A(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEDX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord1B(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord1B(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord1C(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=100 (sib)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord1C(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.getSIBAddr(0)), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord1D(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=101 (d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord1D(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32GrpWord1E(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord1E(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord1F(afnGrp, fnSrc): mod=00 (dst:mem) reg=011 (afnGrp[3]) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord1F(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord20(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord20(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEAX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord21(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord21(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regECX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord22(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord22(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEDX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord23(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord23(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord24(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=100 (sib)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord24(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.getSIBAddr(0)), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord25(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=101 (d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord25(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32GrpWord26(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord26(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord27(afnGrp, fnSrc): mod=00 (dst:mem) reg=100 (afnGrp[4]) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord27(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord28(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord28(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEAX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord29(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord29(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regECX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord2A(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord2A(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEDX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord2B(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord2B(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord2C(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=100 (sib)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord2C(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.getSIBAddr(0)), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord2D(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=101 (d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord2D(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32GrpWord2E(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord2E(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord2F(afnGrp, fnSrc): mod=00 (dst:mem) reg=101 (afnGrp[5]) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord2F(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord30(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord30(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEAX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord31(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord31(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regECX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord32(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord32(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEDX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord33(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord33(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord34(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=100 (sib)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord34(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.getSIBAddr(0)), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord35(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=101 (d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord35(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32GrpWord36(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord36(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord37(afnGrp, fnSrc): mod=00 (dst:mem) reg=110 (afnGrp[6]) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord37(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord38(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord38(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEAX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord39(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord39(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regECX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord3A(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord3A(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEDX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord3B(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord3B(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord3C(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=100 (sib)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord3C(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.getSIBAddr(0)), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord3D(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=101 (d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord3D(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
},
/**
* opMod32GrpWord3E(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord3E(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord3F(afnGrp, fnSrc): mod=00 (dst:mem) reg=111 (afnGrp[7]) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord3F(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBase;
},
/**
* opMod32GrpWord40(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord40(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord41(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord41(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regECX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord42(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord42(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord43(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord43(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord44(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord44(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord45(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord45(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord46(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord46(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord47(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=000 (afnGrp[0]) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord47(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord48(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord48(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord49(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord49(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regECX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord4A(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord4A(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord4B(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord4B(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord4C(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord4C(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord4D(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord4D(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord4E(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord4E(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord4F(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=001 (afnGrp[1]) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord4F(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord50(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord50(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord51(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord51(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regECX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord52(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord52(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord53(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord53(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord54(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord54(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord55(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord55(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord56(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord56(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord57(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=010 (afnGrp[2]) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord57(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord58(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord58(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord59(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord59(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regECX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord5A(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord5A(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord5B(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord5B(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord5C(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord5C(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord5D(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord5D(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord5E(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord5E(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord5F(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=011 (afnGrp[3]) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord5F(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord60(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord60(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord61(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord61(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regECX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord62(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord62(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord63(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord63(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord64(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord64(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord65(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord65(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord66(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord66(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord67(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=100 (afnGrp[4]) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord67(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord68(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord68(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord69(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord69(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regECX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord6A(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord6A(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord6B(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord6B(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord6C(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord6C(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord6D(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord6D(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord6E(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord6E(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord6F(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=101 (afnGrp[5]) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord6F(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord70(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord70(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord71(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord71(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regECX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord72(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord72(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord73(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord73(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord74(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord74(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord75(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord75(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord76(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord76(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord77(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=110 (afnGrp[6]) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord77(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord78(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=000 (EAX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord78(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord79(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=001 (ECX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord79(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regECX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord7A(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=010 (EDX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord7A(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord7B(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=011 (EBX+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord7B(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord7C(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=100 (sib+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord7C(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord7D(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=101 (EBP+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord7D(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord7E(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=110 (ESI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord7E(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord7F(afnGrp, fnSrc): mod=01 (dst:mem+d8) reg=111 (afnGrp[7]) r/m=111 (EDI+d8)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord7F(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord80(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord80(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord81(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord81(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regECX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord82(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord82(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord83(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord83(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord84(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord84(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord85(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord85(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord86(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord86(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord87(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=000 (afnGrp[0]) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord87(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord88(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord88(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord89(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord89(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regECX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord8A(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord8A(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord8B(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord8B(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord8C(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord8C(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord8D(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord8D(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord8E(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord8E(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord8F(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=001 (afnGrp[1]) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord8F(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord90(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord90(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord91(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord91(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regECX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord92(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord92(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord93(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord93(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord94(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord94(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord95(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord95(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord96(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord96(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord97(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=010 (afnGrp[2]) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord97(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord98(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord98(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord99(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord99(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regECX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord9A(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord9A(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord9B(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord9B(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord9C(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord9C(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord9D(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord9D(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord9E(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord9E(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWord9F(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=011 (afnGrp[3]) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWord9F(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordA0(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordA0(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordA1(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordA1(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regECX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordA2(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordA2(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordA3(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordA3(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordA4(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordA4(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordA5(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordA5(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordA6(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordA6(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordA7(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=100 (afnGrp[4]) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordA7(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordA8(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordA8(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordA9(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordA9(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regECX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordAA(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordAA(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordAB(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordAB(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordAC(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordAC(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordAD(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordAD(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordAE(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordAE(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordAF(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=101 (afnGrp[5]) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordAF(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordB0(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordB0(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordB1(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordB1(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regECX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordB2(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordB2(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordB3(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordB3(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordB4(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordB4(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordB5(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordB5(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordB6(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordB6(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordB7(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=110 (afnGrp[6]) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordB7(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordB8(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=000 (EAX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordB8(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordB9(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=001 (ECX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordB9(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regECX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordBA(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=010 (EDX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordBA(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordBB(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=011 (EBX+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordBB(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordBC(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=100 (sib+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordBC(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordBD(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=101 (EBP+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordBD(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordBE(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=110 (ESI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordBE(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordBF(afnGrp, fnSrc): mod=10 (dst:mem+d16) reg=111 (afnGrp[7]) r/m=111 (EDI+d32)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordBF(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
this.setEAWord(w);
this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
},
/**
* opMod32GrpWordC0(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordC0(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordC1(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordC1(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.regECX & this.dataMask, fnSrc.call(this));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordC2(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordC2(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordC3(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordC3(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordC4(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=100 (ESP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordC4(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod32GrpWordC5(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=101 (EBP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordC5(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordC6(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordC6(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.regESI & this.dataMask, fnSrc.call(this));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordC7(afnGrp, fnSrc): mod=11 (dst:reg) reg=000 (afnGrp[0]) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordC7(afnGrp, fnSrc) {
var w = afnGrp[0].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordC8(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordC8(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordC9(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordC9(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.regECX & this.dataMask, fnSrc.call(this));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordCA(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordCA(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordCB(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordCB(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordCC(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=100 (ESP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordCC(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod32GrpWordCD(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=101 (EBP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordCD(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordCE(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordCE(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.regESI & this.dataMask, fnSrc.call(this));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordCF(afnGrp, fnSrc): mod=11 (dst:reg) reg=001 (afnGrp[1]) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordCF(afnGrp, fnSrc) {
var w = afnGrp[1].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordD0(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordD0(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordD1(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordD1(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.regECX & this.dataMask, fnSrc.call(this));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordD2(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordD2(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordD3(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordD3(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordD4(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=100 (ESP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordD4(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod32GrpWordD5(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=101 (EBP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordD5(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordD6(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordD6(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.regESI & this.dataMask, fnSrc.call(this));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordD7(afnGrp, fnSrc): mod=11 (dst:reg) reg=010 (afnGrp[2]) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordD7(afnGrp, fnSrc) {
var w = afnGrp[2].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordD8(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordD8(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordD9(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordD9(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.regECX & this.dataMask, fnSrc.call(this));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordDA(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordDA(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordDB(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordDB(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordDC(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=100 (ESP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordDC(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod32GrpWordDD(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=101 (EBP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordDD(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordDE(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordDE(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.regESI & this.dataMask, fnSrc.call(this));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordDF(afnGrp, fnSrc): mod=11 (dst:reg) reg=011 (afnGrp[3]) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordDF(afnGrp, fnSrc) {
var w = afnGrp[3].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordE0(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordE0(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordE1(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordE1(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.regECX & this.dataMask, fnSrc.call(this));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordE2(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordE2(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordE3(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordE3(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordE4(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=100 (ESP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordE4(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod32GrpWordE5(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=101 (EBP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordE5(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordE6(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordE6(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.regESI & this.dataMask, fnSrc.call(this));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordE7(afnGrp, fnSrc): mod=11 (dst:reg) reg=100 (afnGrp[4]) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordE7(afnGrp, fnSrc) {
var w = afnGrp[4].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordE8(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordE8(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordE9(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordE9(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.regECX & this.dataMask, fnSrc.call(this));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordEA(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordEA(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordEB(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordEB(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordEC(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=100 (ESP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordEC(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod32GrpWordED(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=101 (EBP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordED(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordEE(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordEE(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.regESI & this.dataMask, fnSrc.call(this));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordEF(afnGrp, fnSrc): mod=11 (dst:reg) reg=101 (afnGrp[5]) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordEF(afnGrp, fnSrc) {
var w = afnGrp[5].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordF0(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordF0(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordF1(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordF1(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.regECX & this.dataMask, fnSrc.call(this));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordF2(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordF2(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordF3(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordF3(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordF4(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=100 (ESP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordF4(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod32GrpWordF5(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=101 (EBP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordF5(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordF6(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordF6(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.regESI & this.dataMask, fnSrc.call(this));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordF7(afnGrp, fnSrc): mod=11 (dst:reg) reg=110 (afnGrp[6]) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordF7(afnGrp, fnSrc) {
var w = afnGrp[6].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordF8(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=000 (EAX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordF8(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
this.regEAX = (this.regEAX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordF9(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=001 (ECX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordF9(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.regECX & this.dataMask, fnSrc.call(this));
this.regECX = (this.regECX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordFA(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=010 (EDX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordFA(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
this.regEDX = (this.regEDX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordFB(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=011 (EBX)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordFB(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
this.regEBX = (this.regEBX & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordFC(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=100 (ESP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordFC(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
this.setSP((this.getSP() & ~this.dataMask) | w);
},
/**
* opMod32GrpWordFD(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=101 (EBP)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordFD(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
this.regEBP = (this.regEBP & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordFE(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=110 (ESI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordFE(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.regESI & this.dataMask, fnSrc.call(this));
this.regESI = (this.regESI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
}
},
/**
* opMod32GrpWordFF(afnGrp, fnSrc): mod=11 (dst:reg) reg=111 (afnGrp[7]) r/m=111 (EDI)
*
* @this {X86CPU}
* @param {Array.<function(number,number)>} afnGrp
* @param {function()} fnSrc
*/
function opMod32GrpWordFF(afnGrp, fnSrc) {
var w = afnGrp[7].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
this.regEDI = (this.regEDI & ~this.dataMask) | w;
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
}
}
];
if (typeof module !== 'undefined') module.exports = X86ModW32;
/**
* @fileoverview Implements PCjs 0x0F two-byte opcodes
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-Sep-05
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
if (typeof module !== 'undefined') {
var X86 = require("./x86");
}
/**
* op=0x0F,0x00 (GRP6 mem/reg)
*
* @this {X86CPU}
*/
X86.opGRP6 = function GRP6()
{
var bModRM = this.getIPByte();
if ((bModRM & 0x38) < 0x10) { // possible reg values: 0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38
this.opFlags |= X86.OPFLAG.NOREAD;
}
this.aOpModGrpWord[bModRM].call(this, this.aOpGrp6, X86.fnSrcNone);
};
/**
* op=0x0F,0x01 (GRP7 mem/reg)
*
* @this {X86CPU}
*/
X86.opGRP7 = function GRP7()
{
var bModRM = this.getIPByte();
if (!(bModRM & 0x10)) {
this.opFlags |= X86.OPFLAG.NOREAD;
}
this.aOpModGrpWord[bModRM].call(this, X86.aOpGrp7, X86.fnSrcNone);
};
/**
* opLAR()
*
* op=0x0F,0x02 (LAR reg,mem/reg)
*
* @this {X86CPU}
*/
X86.opLAR = function LAR()
{
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnLAR);
};
/**
* opLSL()
*
* op=0x0F,0x03 (LSL reg,mem/reg)
*
* @this {X86CPU}
*/
X86.opLSL = function LSL()
{
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnLSL);
};
/**
* opLOADALL()
*
* op=0x0F,0x05 (LOADALL)
*
* From the "Undocumented iAPX 286 Test Instruction" document at http://www.pcjs.org/pubs/pc/reference/intel/80286/loadall/:
*
* Physical Address (Hex) Associated CPU Register
* 800-805 None
* 806-807 MSW
* 808-815 None
* 816-817 TR
* 818-819 Flag word
* 81A-81B IP
* 81C-81D LDT
* 81E-81F DS
* 820-821 SS
* 822-823 CS
* 824-825 ES
* 826-827 DI
* 828-829 SI
* 82A-82B BP
* 82C-82D SP
* 82E-82F BX
* 830-831 DX
* 832-833 CX
* 834-835 AX
* 836-83B ES descriptor cache
* 83C-841 CS descriptor cache
* 842-847 SS descriptor cache
* 848-84D DS descriptor cache
* 84E-853 GDTR
* 854-859 LDT descriptor cache
* 85A-85F IDTR
* 860-865 TSS descriptor cache
*
* Oddly, the above document gives two contradictory cycle counts for LOADALL: 190 and 195. I'll go with 195, for
* no particular reason.
*
* @this {X86CPU}
*/
X86.opLOADALL = function LOADALL()
{
if (this.segCS.cpl) {
/*
* You're not allowed to use LOADALL if the current privilege level is something other than zero.
*/
X86.fnFault.call(this, X86.EXCEPTION.GP_FAULT, 0, true);
return;
}
this.setMSW(this.getShort(0x806));
this.regEDI = this.getShort(0x826);
this.regESI = this.getShort(0x828);
this.regEBP = this.getShort(0x82A);
this.regEBX = this.getShort(0x82E);
this.regEDX = this.getShort(0x830);
this.regECX = this.getShort(0x832);
this.regEAX = this.getShort(0x834);
this.segES.loadDesc6(0x836, this.getShort(0x824));
this.segCS.loadDesc6(0x83C, this.getShort(0x822));
this.segSS.loadDesc6(0x842, this.getShort(0x820));
this.segDS.loadDesc6(0x848, this.getShort(0x81E));
this.setPS(this.getShort(0x818));
/*
* It's important to call setIP() and setSP() *after* the segCS and segSS loads, so that the CPU's
* linear IP and SP registers (regLIP and regLSP) will be updated properly. Ordinarily that would be
* taken care of by simply using the CPU's setCS() and setSS() functions, but those functions call the
* default descriptor load() functions, and obviously here we must use loadDesc6() instead.
*/
this.setIP(this.getShort(0x81A));
this.setSP(this.getShort(0x82C));
/*
* The bytes at 0x851 and 0x85D "should be zeroes", as per the "Undocumented iAPX 286 Test Instruction"
* document, but the LOADALL issued by RAMDRIVE in PC-DOS 7.0 contains 0xFF in both of those bytes, resulting
* in very large addrGDT and addrIDT values. Obviously, we can't have that, so we load only the low byte
* of the second word for both of those registers.
*/
this.addrGDT = this.getShort(0x84E) | (this.getByte(0x850) << 16);
this.addrGDTLimit = this.addrGDT + this.getShort(0x852);
this.segLDT.loadDesc6(0x854, this.getShort(0x81C));
this.addrIDT = this.getShort(0x85A) | (this.getByte(0x85C) << 16);
this.addrIDTLimit = this.addrIDT + this.getShort(0x85E);
this.segTSS.loadDesc6(0x860, this.getShort(0x816));
this.nStepCycles -= 195;
/*
* TODO: LOADALL operation still needs to be verified in protected mode....
*/
if (DEBUG && DEBUGGER && (this.regCR0 & X86.CR0.MSW.PE)) this.stopCPU();
};
/**
* opCLTS()
*
* op=0x0F,0x06 (CLTS)
*
* @this {X86CPU}
*/
X86.opCLTS = function CLTS()
{
if (this.segCS.cpl) {
X86.fnFault.call(this, X86.EXCEPTION.GP_FAULT, 0);
return;
}
this.regCR0 &= ~X86.CR0.MSW.TS;
this.nStepCycles -= 2;
};
/**
* opMOVrc()
*
* op=0x0F,0x20 (MOV reg,creg)
*
* NOTE: Since the ModRM decoders deal only with general-purpose registers, we must move
* the appropriate control register into a special variable (regXX), which our helper function
* (fnMOVxx) will use to replace the decoder's src operand.
*
* From PCMag_Prog_TechRef, p.476: "The 80386 executes the MOV to/from control registers (CRn)
* regardless of the setting of the MOD field. The MOD field should be set to 0b11, but an early
* 80386 documentation error indicated that the MOD field value was a don't care. Early versions
* of the 80486 detect a MOD != 0b11 as an illegal opcode. This was changed in later versions to
* ignore the value of MOD. Assemblers that generate MOD != 0b11 for these instructions will fail
* on some 80486s."
*
* @this {X86CPU}
*/
X86.opMOVrc = function MOVrc()
{
/*
* We address the MOD field problem (see above) by coercing it to 0b11 (0xc0), regardless.
*
* TODO: One issue not clearly addressed is if, when an assembler/compiler generated a bogus MOD value,
* it also generated the additional displacement bytes, if any, that would typically accompany such a MOD
* value. I assume not.
*/
var bModRM = this.getIPByte() | 0xc0;
if (this.segCS.cpl) {
/*
* You're not allowed to read control registers if the current privilege level is not zero
* (TODO: I'm issuing this AFTER fetching the ModRM byte, but I assume it makes no difference).
*/
X86.fnFault.call(this, X86.EXCEPTION.GP_FAULT, 0);
return;
}
var reg = (bModRM & 0x38) >> 3;
switch(reg) {
case 0x0:
this.regXX = this.regCR0;
break;
case 0x1:
this.regXX = this.regCR1;
break;
case 0x2:
this.regXX = this.regCR2;
break;
case 0x3:
this.regXX = this.regCR3;
break;
default:
X86.opUndefined.call(this);
return;
}
/*
* Like other MOV operations, the destination does not need to be read, just written;
* however, it's moot, because we've already restricted this opcode to registers only.
*
* this.opFlags |= X86.OPFLAG.NOREAD;
*
* Another issue, however, is that this instruction always assumes a 32-bit OPERAND size,
* so we must call setDataSize(4) first.
*/
this.setDataSize(4);
this.aOpModRegWord[bModRM].call(this, X86.fnMOVxx);
};
/**
* opMOVcr()
*
* op=0x0F,0x22 (MOV creg,reg)
*
* NOTE: Since the ModRM decoders deal only with general-purpose registers, we have to make a note
* of which general-purpose register will be overwritten, so that we can restore it after moving the
* modified value to the correct control register.
*
* From PCMag_Prog_TechRef, p.476: "The 80386 executes the MOV to/from control registers (CRn)
* regardless of the setting of the MOD field. The MOD field should be set to 0b11, but an early
* 80386 documentation error indicated that the MOD field value was a don't care. Early versions
* of the 80486 detect a MOD != 0b11 as an illegal opcode. This was changed in later versions to
* ignore the value of MOD. Assemblers that generate MOD != 0b11 for these instructions will fail
* on some 80486s."
*
* @this {X86CPU}
*/
X86.opMOVcr = function MOVcr()
{
var temp;
/*
* We address the MOD field problem (see above) by coercing it to 0b11 (0xc0), regardless.
*
* TODO: One issue not clearly addressed is if, when an assembler/compiler generated a bogus MOD value,
* it also generated the additional displacement bytes, if any, that would typically accompany such a MOD
* value. I assume not.
*/
var bModRM = this.getIPByte() | 0xc0;
if (this.segCS.cpl) {
/*
* You're not allowed to write control registers if the current privilege level is not zero
* (TODO: I'm issuing this AFTER fetching the ModRM byte, but I assume it makes no difference).
*/
X86.fnFault.call(this, X86.EXCEPTION.GP_FAULT, 0);
return;
}
var reg = (bModRM & 0x38) >> 3;
switch(reg) {
case 0x0:
temp = this.regEAX;
break;
case 0x1:
temp = this.regECX; // TODO: Is setting CR1 actually allowed on an 80386?
break;
case 0x2:
temp = this.regEDX;
break;
case 0x3:
temp = this.regEBX;
break;
default:
X86.opInvalid.call(this);
return;
}
/*
* This instruction always assumes a 32-bit OPERAND size, so we must call setDataSize(4) first.
*/
this.setDataSize(4);
this.aOpModRegWord[bModRM].call(this, X86.fnMOV);
switch(reg) {
case 0x0:
reg = this.regEAX;
this.regEAX = temp;
X86.fnLCR0.call(this, reg);
break;
case 0x1:
this.regCR1 = this.regECX;
this.regECX = temp;
break;
case 0x2:
this.regCR2 = this.regEDX;
this.regEDX = temp;
break;
case 0x3:
reg = this.regEBX;
this.regEBX = temp;
X86.fnLCR3.call(this, reg);
break;
}
};
/*
* NOTE: The following 16 new conditional jumps actually rely on the OPERAND override setting
* for determining whether a signed 16-bit or 32-bit displacement will be fetched, even though
* the ADDRESS override might seem more intuitive. Think of them as instructions that are loading
* a new operand into IP/EIP.
*
* Also, in 16-bit code, even though a signed rel16 value would seem to imply a range of -32768
* to +32767, any location within a 64Kb code segment outside that range can be reached by choosing
* a displacement in the opposite direction, causing the 16-bit value in EIP to underflow or overflow;
* any underflow or overflow doesn't matter, because only the low 16 bits of EIP are updated when a
* 16-bit OPERAND size is in effect.
*
* In fact, for 16-bit jumps, it's simpler to always think of rel16 as an UNSIGNED value added to
* the current EIP, where the result is then truncated to a 16-bit value. This is why we don't have
* to sign-extend rel16 before adding it to the current EIP.
*/
/**
* opJOw()
*
* op=0x0F,0x80 (JO rel16/rel32)
*
* @this {X86CPU}
*/
X86.opJOw = function JOw()
{
var disp = this.getIPWord();
if (this.getOF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* opJNOw()
*
* op=0x0F,0x81 (JNO rel16/rel32)
*
* @this {X86CPU}
*/
X86.opJNOw = function JNOw()
{
var disp = this.getIPWord();
if (!this.getOF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* opJCw()
*
* op=0x0F,0x82 (JC rel16/rel32)
*
* @this {X86CPU}
*/
X86.opJCw = function JCw()
{
var disp = this.getIPWord();
if (this.getCF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* opJNCw()
*
* op=0x0F,0x83 (JNC rel16/rel32)
*
* @this {X86CPU}
*/
X86.opJNCw = function JNCw()
{
var disp = this.getIPWord();
if (!this.getCF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* opJZw()
*
* op=0x0F,0x84 (JZ rel16/rel32)
*
* @this {X86CPU}
*/
X86.opJZw = function JZw()
{
var disp = this.getIPWord();
if (this.getZF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* opJNZw()
*
* op=0x0F,0x85 (JNZ rel16/rel32)
*
* @this {X86CPU}
*/
X86.opJNZw = function JNZw()
{
var disp = this.getIPWord();
if (!this.getZF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* opJBEw()
*
* op=0x0F,0x86 (JBE rel16/rel32)
*
* @this {X86CPU}
*/
X86.opJBEw = function JBEw()
{
var disp = this.getIPWord();
if (this.getCF() || this.getZF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* opJNBEw()
*
* op=0x0F,0x87 (JNBE rel16/rel32)
*
* @this {X86CPU}
*/
X86.opJNBEw = function JNBEw()
{
var disp = this.getIPWord();
if (!this.getCF() && !this.getZF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* opJSw()
*
* op=0x0F,0x88 (JS rel16/rel32)
*
* @this {X86CPU}
*/
X86.opJSw = function JSw()
{
var disp = this.getIPWord();
if (this.getSF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* opJNSw()
*
* op=0x0F,0x89 (JNS rel16/rel32)
*
* @this {X86CPU}
*/
X86.opJNSw = function JNSw()
{
var disp = this.getIPWord();
if (!this.getSF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* opJPw()
*
* op=0x0F,0x8A (JP rel16/rel32)
*
* @this {X86CPU}
*/
X86.opJPw = function JPw()
{
var disp = this.getIPWord();
if (this.getPF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* opJNPw()
*
* op=0x0F,0x8B (JNP rel16/rel32)
*
* @this {X86CPU}
*/
X86.opJNPw = function JNPw()
{
var disp = this.getIPWord();
if (!this.getPF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* opJLw()
*
* op=0x0F,0x8C (JL rel16/rel32)
*
* @this {X86CPU}
*/
X86.opJLw = function JLw()
{
var disp = this.getIPWord();
if (!this.getSF() != !this.getOF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* opJNLw()
*
* op=0x0F,0x8D (JNL rel16/rel32)
*
* @this {X86CPU}
*/
X86.opJNLw = function JNLw()
{
var disp = this.getIPWord();
if (!this.getSF() == !this.getOF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* opJLEw()
*
* op=0x0F,0x8E (JLE rel16/rel32)
*
* @this {X86CPU}
*/
X86.opJLEw = function JLEw()
{
var disp = this.getIPWord();
if (this.getZF() || !this.getSF() != !this.getOF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* opJNLEw()
*
* op=0x0F,0x8F (JNLE rel16/rel32)
*
* @this {X86CPU}
*/
X86.opJNLEw = function JNLEw()
{
var disp = this.getIPWord();
if (!this.getZF() && !this.getSF() == !this.getOF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* opSETO()
*
* op=0x0F,0x90 (SETO b)
*
* @this {X86CPU}
*/
X86.opSETO = function SETO()
{
X86.fnSETcc.call(this, X86.fnSETO);
};
/**
* opSETNO()
*
* op=0x0F,0x91 (SETNO b)
*
* @this {X86CPU}
*/
X86.opSETNO = function SETNO()
{
X86.fnSETcc.call(this, X86.fnSETO);
};
/**
* opSETC()
*
* op=0x0F,0x92 (SETC b)
*
* @this {X86CPU}
*/
X86.opSETC = function SETC()
{
X86.fnSETcc.call(this, X86.fnSETC);
};
/**
* opSETNC()
*
* op=0x0F,0x93 (SETNC b)
*
* @this {X86CPU}
*/
X86.opSETNC = function SETNC()
{
X86.fnSETcc.call(this, X86.fnSETNC);
};
/**
* opSETZ()
*
* op=0x0F,0x94 (SETZ b)
*
* @this {X86CPU}
*/
X86.opSETZ = function SETZ()
{
X86.fnSETcc.call(this, X86.fnSETZ);
};
/**
* opSETNZ()
*
* op=0x0F,0x95 (SETNZ b)
*
* @this {X86CPU}
*/
X86.opSETNZ = function SETNZ()
{
X86.fnSETcc.call(this, X86.fnSETNZ);
};
/**
* opSETBE()
*
* op=0x0F,0x96 (SETBE b)
*
* @this {X86CPU}
*/
X86.opSETBE = function SETBE()
{
X86.fnSETcc.call(this, X86.fnSETBE);
};
/**
* opSETNBE()
*
* op=0x0F,0x97 (SETNBE b)
*
* @this {X86CPU}
*/
X86.opSETNBE = function SETNBE()
{
X86.fnSETcc.call(this, X86.fnSETNBE);
};
/**
* opSETS()
*
* op=0x0F,0x98 (SETS b)
*
* @this {X86CPU}
*/
X86.opSETS = function SETS()
{
X86.fnSETcc.call(this, X86.fnSETS);
};
/**
* opSETNS()
*
* op=0x0F,0x99 (SETNS b)
*
* @this {X86CPU}
*/
X86.opSETNS = function SETNS()
{
X86.fnSETcc.call(this, X86.fnSETNS);
};
/**
* opSETP()
*
* op=0x0F,0x9A (SETP b)
*
* @this {X86CPU}
*/
X86.opSETP = function SETP()
{
X86.fnSETcc.call(this, X86.fnSETP);
};
/**
* opSETNP()
*
* op=0x0F,0x9B (SETNP b)
*
* @this {X86CPU}
*/
X86.opSETNP = function SETNP()
{
X86.fnSETcc.call(this, X86.fnSETNP);
};
/**
* opSETL()
*
* op=0x0F,0x9C (SETL b)
*
* @this {X86CPU}
*/
X86.opSETL = function SETL()
{
X86.fnSETcc.call(this, X86.fnSETL);
};
/**
* opSETNL()
*
* op=0x0F,0x9D (SETNL b)
*
* @this {X86CPU}
*/
X86.opSETNL = function SETNL()
{
X86.fnSETcc.call(this, X86.fnSETNL);
};
/**
* opSETLE()
*
* op=0x0F,0x9E (SETLE b)
*
* @this {X86CPU}
*/
X86.opSETLE = function SETLE()
{
X86.fnSETcc.call(this, X86.fnSETLE);
};
/**
* opSETNLE()
*
* op=0x0F,0x9F (SETNLE b)
*
* @this {X86CPU}
*/
X86.opSETNLE = function SETNLE()
{
X86.fnSETcc.call(this, X86.fnSETNLE);
};
/**
* opPUSHFS()
*
* op=0x0F,0xA0 (PUSH FS)
*
* @this {X86CPU}
*/
X86.opPUSHFS = function PUSHFS()
{
this.pushWord(this.segFS.sel);
this.nStepCycles -= this.cycleCounts.nOpCyclesPushSeg;
};
/**
* opPOPFS()
*
* op=0x0F,0xA1 (POP FS)
*
* @this {X86CPU}
*/
X86.opPOPFS = function POPFS()
{
this.setFS(this.popWord());
this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
};
/**
* opBT()
*
* op=0x0F,0xA3 (BT mem/reg,reg)
*
* @this {X86CPU}
*/
X86.opBT = function BT()
{
this.aOpModMemWord[this.getIPByte()].call(this, X86.fnBT);
if (this.regEA !== X86.ADDR_INVALID) this.nStepCycles -= this.cycleCounts.nOpCyclesBitTestMExtra;
};
/**
* opSHLDn()
*
* op=0x0F,0xA4 (SHLD mem/reg,reg,imm8)
*
* @this {X86CPU}
*/
X86.opSHLDn = function SHLDn()
{
this.aOpModMemWord[this.getIPByte()].call(this, this.dataSize == 2? X86.fnSHLDwi : X86.fnSHLDdi);
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesShiftDR : this.cycleCounts.nOpCyclesShiftDM);
};
/**
* opSHLDcl()
*
* op=0x0F,0xA5 (SHLD mem/reg,reg,CL)
*
* @this {X86CPU}
*/
X86.opSHLDcl = function SHLDcl()
{
this.aOpModMemWord[this.getIPByte()].call(this, this.dataSize == 2? X86.fnSHLDwCL : X86.fnSHLDdCL);
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesShiftDR : this.cycleCounts.nOpCyclesShiftDM);
};
/**
* opPUSHGS()
*
* op=0x0F,0xA8 (PUSH GS)
*
* @this {X86CPU}
*/
X86.opPUSHGS = function PUSHGS()
{
this.pushWord(this.segGS.sel);
this.nStepCycles -= this.cycleCounts.nOpCyclesPushSeg;
};
/**
* opPOPGS()
*
* op=0x0F,0xA9 (POP GS)
*
* @this {X86CPU}
*/
X86.opPOPGS = function POPGS()
{
this.setGS(this.popWord());
this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
};
/**
* opBTS()
*
* op=0x0F,0xAB (BTC mem/reg,reg)
*
* @this {X86CPU}
*/
X86.opBTS = function BTS()
{
this.aOpModMemWord[this.getIPByte()].call(this, X86.fnBTS);
if (this.regEA !== X86.ADDR_INVALID) this.nStepCycles -= this.cycleCounts.nOpCyclesBitSetMExtra;
};
/**
* opSHRDn()
*
* op=0x0F,0xAC (SHRD mem/reg,reg,imm8)
*
* @this {X86CPU}
*/
X86.opSHRDn = function SHRDn()
{
this.aOpModMemWord[this.getIPByte()].call(this, this.dataSize == 2? X86.fnSHRDwi : X86.fnSHRDdi);
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesShiftDR : this.cycleCounts.nOpCyclesShiftDM);
};
/**
* opSHRDcl()
*
* op=0x0F,0xAD (SHRD mem/reg,reg,CL)
*
* @this {X86CPU}
*/
X86.opSHRDcl = function SHRDcl()
{
this.aOpModMemWord[this.getIPByte()].call(this, this.dataSize == 2? X86.fnSHRDwCL : X86.fnSHRDdCL);
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesShiftDR : this.cycleCounts.nOpCyclesShiftDM);
};
/**
* opIMUL()
*
* op=0x0F,0xAF (IMUL reg,mem/reg) (80386 and up)
*
* @this {X86CPU}
*/
X86.opIMUL = function IMUL()
{
this.aOpModRegWord[this.getIPByte()].call(this, this.dataSize == 2? X86.fnIMULrw : X86.fnIMULrd);
};
/**
* opLSS()
*
* op=0x0F,0xB2 (LSS reg,word)
*
* This is like a "MOV reg,rm" operation, but it also loads SS from the next word.
*
* @this {X86CPU}
*/
X86.opLSS = function LSS()
{
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnLSS);
};
/**
* opBTR()
*
* op=0x0F,0xB3 (BTC mem/reg,reg) (80386 and up)
*
* @this {X86CPU}
*/
X86.opBTR = function BTR()
{
this.aOpModMemWord[this.getIPByte()].call(this, X86.fnBTR);
if (this.regEA !== X86.ADDR_INVALID) this.nStepCycles -= this.cycleCounts.nOpCyclesBitSetMExtra;
};
/**
* opLFS()
*
* op=0x0F,0xB4 (LFS reg,word)
*
* This is like a "MOV reg,rm" operation, but it also loads FS from the next word.
*
* @this {X86CPU}
*/
X86.opLFS = function LFS()
{
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnLFS);
};
/**
* opLGS()
*
* op=0x0F,0xB5 (LGS reg,word)
*
* This is like a "MOV reg,rm" operation, but it also loads GS from the next word.
*
* @this {X86CPU}
*/
X86.opLGS = function LGS()
{
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnLGS);
};
/**
* opMOVZXb()
*
* op=0x0F,0xB6 (MOVZX reg,byte)
*
* @this {X86CPU}
*/
X86.opMOVZXb = function MOVZXb()
{
/*
* The ModRegByte handlers update the registers in the 1st column, but we need to update those in the 2nd column.
*
* 000: AL -> 000: AX
* 001: CL -> 001: CX
* 010: DL -> 010: DX
* 011: BL -> 011: BX
* 100: AH -> 100: SP
* 101: CH -> 101: BP
* 110: DH -> 110: SI
* 111: BH -> 111: DI
*/
var temp;
var bModRM = this.getIPByte();
var reg = (bModRM & 0x38) >> 3;
switch(reg) {
case 0x4:
temp = this.regEAX;
break;
case 0x5:
temp = this.regECX;
break;
case 0x6:
temp = this.regEDX;
break;
case 0x7:
temp = this.regEBX;
break;
}
this.aOpModRegByte[bModRM].call(this, X86.fnMOVX);
switch(reg) {
case 0x0:
this.regEAX = (this.regEAX & ~this.dataMask) | (this.regEAX & 0xff);
break;
case 0x1:
this.regECX = (this.regECX & ~this.dataMask) | (this.regECX & 0xff);
break;
case 0x2:
this.regEDX = (this.regEDX & ~this.dataMask) | (this.regEDX & 0xff);
break;
case 0x3:
this.regEBX = (this.regEBX & ~this.dataMask) | (this.regEBX & 0xff);
break;
case 0x4:
this.regESP = (this.regESP & ~this.dataMask) | ((this.regEAX >> 8) & 0xff);
this.regEAX = temp;
break;
case 0x5:
this.regEBP = (this.regEBP & ~this.dataMask) | ((this.regECX >> 8) & 0xff);
this.regECX = temp;
break;
case 0x6:
this.regESI = (this.regESI & ~this.dataMask) | ((this.regEDX >> 8) & 0xff);
this.regEDX = temp;
break;
case 0x7:
this.regEDI = (this.regEDI & ~this.dataMask) | ((this.regEBX >> 8) & 0xff);
this.regEBX = temp;
break;
}
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesMovXR : this.cycleCounts.nOpCyclesMovXM);
};
/**
* opMOVZXw()
*
* op=0x0F,0xB7 (MOVZX reg,word)
*
* @this {X86CPU}
*/
X86.opMOVZXw = function MOVZXw()
{
var bModRM = this.getIPByte();
this.setDataSize(2);
this.aOpModRegWord[bModRM].call(this, X86.fnMOVX);
switch((bModRM & 0x38) >> 3) {
case 0x0:
this.regEAX = (this.regEAX & 0xffff);
break;
case 0x1:
this.regECX = (this.regECX & 0xffff);
break;
case 0x2:
this.regEDX = (this.regEDX & 0xffff);
break;
case 0x3:
this.regEBX = (this.regEBX & 0xffff);
break;
case 0x4:
this.regESP = (this.regESP & 0xffff);
break;
case 0x5:
this.regEBP = (this.regEBP & 0xffff);
break;
case 0x6:
this.regESI = (this.regESI & 0xffff);
break;
case 0x7:
this.regEDI = (this.regEDI & 0xffff);
break;
}
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesMovXR : this.cycleCounts.nOpCyclesMovXM);
};
/**
* op=0x0F,0xBA (GRP8 mem/reg) (80386 and up)
*
* @this {X86CPU}
*/
X86.opGRP8 = function GRP8()
{
this.aOpModGrpWord[this.getIPByte()].call(this, X86.aOpGrp8, this.getIPByte);
};
/**
* opBTC()
*
* op=0x0F,0xBB (BTC mem/reg,reg)
*
* @this {X86CPU}
*/
X86.opBTC = function BTC()
{
this.aOpModMemWord[this.getIPByte()].call(this, X86.fnBTC);
if (this.regEA !== X86.ADDR_INVALID) this.nStepCycles -= this.cycleCounts.nOpCyclesBitSetMExtra;
};
/**
* opBSF()
*
* op=0x0F,0xBC (BSF reg,mem/reg)
*
* @this {X86CPU}
*/
X86.opBSF = function BSF()
{
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnBSF);
};
/**
* opBSR()
*
* op=0x0F,0xBD (BSR reg,mem/reg)
*
* @this {X86CPU}
*/
X86.opBSR = function BSR()
{
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnBSR);
};
/**
* opMOVSXb()
*
* op=0x0F,0xBE (MOVSX reg,byte)
*
* @this {X86CPU}
*/
X86.opMOVSXb = function MOVSXb()
{
/*
* The ModRegByte handlers update the registers in the 1st column, but we need to update those in the 2nd column.
*
* 000: AL -> 000: AX
* 001: CL -> 001: CX
* 010: DL -> 010: DX
* 011: BL -> 011: BX
* 100: AH -> 100: SP
* 101: CH -> 101: BP
* 110: DH -> 110: SI
* 111: BH -> 111: DI
*/
var temp;
var bModRM = this.getIPByte();
var reg = (bModRM & 0x38) >> 3;
switch(reg) {
case 0x4:
temp = this.regEAX;
break;
case 0x5:
temp = this.regECX;
break;
case 0x6:
temp = this.regEDX;
break;
case 0x7:
temp = this.regEBX;
break;
}
this.aOpModRegByte[bModRM].call(this, X86.fnMOVX);
switch(reg) {
case 0x0:
this.regEAX = (this.regEAX & ~this.dataMask) | ((((this.regEAX & 0xff) << 24) >> 24) & this.dataMask);
break;
case 0x1:
this.regECX = (this.regECX & ~this.dataMask) | ((((this.regECX & 0xff) << 24) >> 24) & this.dataMask);
break;
case 0x2:
this.regEDX = (this.regEDX & ~this.dataMask) | ((((this.regEDX & 0xff) << 24) >> 24) & this.dataMask);
break;
case 0x3:
this.regEBX = (this.regEBX & ~this.dataMask) | ((((this.regEBX & 0xff) << 24) >> 24) & this.dataMask);
break;
case 0x4:
this.regESP = (this.regESP & ~this.dataMask) | (((this.regEAX << 16) >> 24) & this.dataMask);
this.regEAX = temp;
break;
case 0x5:
this.regEBP = (this.regEBP & ~this.dataMask) | (((this.regECX << 16) >> 24) & this.dataMask);
this.regECX = temp;
break;
case 0x6:
this.regESI = (this.regESI & ~this.dataMask) | (((this.regEDX << 16) >> 24) & this.dataMask);
this.regEDX = temp;
break;
case 0x7:
this.regEDI = (this.regEDI & ~this.dataMask) | (((this.regEBX << 16) >> 24) & this.dataMask);
this.regEBX = temp;
break;
}
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesMovXR : this.cycleCounts.nOpCyclesMovXM);
};
/**
* opMOVSXw()
*
* op=0x0F,0xBF (MOVSX reg,word)
*
* @this {X86CPU}
*/
X86.opMOVSXw = function MOVSXw()
{
var bModRM = this.getIPByte();
this.setDataSize(2);
this.aOpModRegWord[bModRM].call(this, X86.fnMOVX);
switch((bModRM & 0x38) >> 3) {
case 0x0:
this.regEAX = ((this.regEAX << 16) >> 16);
break;
case 0x1:
this.regECX = ((this.regECX << 16) >> 16);
break;
case 0x2:
this.regEDX = ((this.regEDX << 16) >> 16);
break;
case 0x3:
this.regEBX = ((this.regEBX << 16) >> 16);
break;
case 0x4:
this.regESP = ((this.regESP << 16) >> 16);
break;
case 0x5:
this.regEBP = ((this.regEBP << 16) >> 16);
break;
case 0x6:
this.regESI = ((this.regESI << 16) >> 16);
break;
case 0x7:
this.regEDI = ((this.regEDI << 16) >> 16);
break;
}
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesMovXR : this.cycleCounts.nOpCyclesMovXM);
};
X86.aOps0F = new Array(256);
X86.aOps0F[0x00] = X86.opGRP6;
X86.aOps0F[0x01] = X86.opGRP7;
X86.aOps0F[0x02] = X86.opLAR;
X86.aOps0F[0x03] = X86.opLSL;
X86.aOps0F[0x05] = X86.opLOADALL;
X86.aOps0F[0x06] = X86.opCLTS;
/*
* On all processors (except the 8086/8088, of course), X86.OPCODE.UD2 (0x0F,0x0B), aka "UD2", is an
* instruction guaranteed to raise a #UD (Invalid Opcode) exception (INT 0x06) on all post-8086 processors.
*/
X86.aOps0F[0x0B] = X86.opInvalid;
if (I386) {
X86.aOps0F386 = [];
X86.aOps0F386[0x20] = X86.opMOVrc;
X86.aOps0F386[0x22] = X86.opMOVcr;
X86.aOps0F386[0x80] = X86.opJOw;
X86.aOps0F386[0x81] = X86.opJNOw;
X86.aOps0F386[0x82] = X86.opJCw;
X86.aOps0F386[0x83] = X86.opJNCw;
X86.aOps0F386[0x84] = X86.opJZw;
X86.aOps0F386[0x85] = X86.opJNZw;
X86.aOps0F386[0x86] = X86.opJBEw;
X86.aOps0F386[0x87] = X86.opJNBEw;
X86.aOps0F386[0x88] = X86.opJSw;
X86.aOps0F386[0x89] = X86.opJNSw;
X86.aOps0F386[0x8A] = X86.opJPw;
X86.aOps0F386[0x8B] = X86.opJNPw;
X86.aOps0F386[0x8C] = X86.opJLw;
X86.aOps0F386[0x8D] = X86.opJNLw;
X86.aOps0F386[0x8E] = X86.opJLEw;
X86.aOps0F386[0x8F] = X86.opJNLEw;
X86.aOps0F386[0x90] = X86.opSETO;
X86.aOps0F386[0x91] = X86.opSETNO;
X86.aOps0F386[0x92] = X86.opSETC;
X86.aOps0F386[0x93] = X86.opSETNC;
X86.aOps0F386[0x94] = X86.opSETZ;
X86.aOps0F386[0x95] = X86.opSETNZ;
X86.aOps0F386[0x96] = X86.opSETBE;
X86.aOps0F386[0x97] = X86.opSETNBE;
X86.aOps0F386[0x98] = X86.opSETS;
X86.aOps0F386[0x99] = X86.opSETNS;
X86.aOps0F386[0x9A] = X86.opSETP;
X86.aOps0F386[0x9B] = X86.opSETNP;
X86.aOps0F386[0x9C] = X86.opSETL;
X86.aOps0F386[0x9D] = X86.opSETNL;
X86.aOps0F386[0x9E] = X86.opSETLE;
X86.aOps0F386[0x9F] = X86.opSETNLE;
X86.aOps0F386[0xA0] = X86.opPUSHFS;
X86.aOps0F386[0xA1] = X86.opPOPFS;
X86.aOps0F386[0xA3] = X86.opBT;
X86.aOps0F386[0xA4] = X86.opSHLDn;
X86.aOps0F386[0xA5] = X86.opSHLDcl;
X86.aOps0F386[0xA8] = X86.opPUSHGS;
X86.aOps0F386[0xA9] = X86.opPOPGS;
X86.aOps0F386[0xAB] = X86.opBTS;
X86.aOps0F386[0xAC] = X86.opSHRDn;
X86.aOps0F386[0xAD] = X86.opSHRDcl;
X86.aOps0F386[0xAF] = X86.opIMUL;
X86.aOps0F386[0xB2] = X86.opLSS;
X86.aOps0F386[0xB3] = X86.opBTR;
X86.aOps0F386[0xB4] = X86.opLFS;
X86.aOps0F386[0xB5] = X86.opLGS;
X86.aOps0F386[0xB6] = X86.opMOVZXb;
X86.aOps0F386[0xB7] = X86.opMOVZXw;
X86.aOps0F386[0xBA] = X86.opGRP8;
X86.aOps0F386[0xBB] = X86.opBTC;
X86.aOps0F386[0xBC] = X86.opBSF;
X86.aOps0F386[0xBD] = X86.opBSR;
X86.aOps0F386[0xBE] = X86.opMOVSXb;
X86.aOps0F386[0xBF] = X86.opMOVSXw;
}
/*
* These instruction groups are not as orthogonal as the original 8086/8088 groups (Grp1 through Grp4); some of
* the instructions in Grp6 and Grp7 only read their dst operand (eg, LLDT), which means the ModRM helper function
* must insure that setEAWord() is disabled, while others only write their dst operand (eg, SLDT), which means that
* getEAWord() should be disabled *prior* to calling the ModRM helper function. This latter case requires that
* we decode the reg field of the ModRM byte before dispatching.
*/
X86.aOpGrp6Prot = [
X86.fnSLDT, X86.fnSTR, X86.fnLLDT, X86.fnLTR, // 0x0F,0x00(reg=0x0-0x3)
X86.fnVERR, X86.fnVERW, X86.fnGRPUndefined, X86.fnGRPUndefined // 0x0F,0x00(reg=0x4-0x7)
];
X86.aOpGrp6Real = [
X86.fnGRPInvalid, X86.fnGRPInvalid, X86.fnGRPInvalid, X86.fnGRPInvalid, // 0x0F,0x00(reg=0x0-0x3)
X86.fnGRPInvalid, X86.fnGRPInvalid, X86.fnGRPUndefined, X86.fnGRPUndefined // 0x0F,0x00(reg=0x4-0x7)
];
/*
* Unlike Grp6, Grp7 and Grp8 do not require separate real-mode and protected-mode dispatch tables, because
* all Grp7 and Grp8 instructions are valid in both modes.
*/
X86.aOpGrp7 = [
X86.fnSGDT, X86.fnSIDT, X86.fnLGDT, X86.fnLIDT, // 0x0F,0x01(reg=0x0-0x3)
X86.fnSMSW, X86.fnGRPUndefined, X86.fnLMSW, X86.fnGRPUndefined // 0x0F,0x01(reg=0x4-0x7)
];
X86.aOpGrp8 = [
X86.fnGRPUndefined, X86.fnGRPUndefined, X86.fnGRPUndefined, X86.fnGRPUndefined, // 0x0F,0xBA(reg=0x0-0x3)
X86.fnBT, X86.fnBTS, X86.fnBTR, X86.fnBTC // 0x0F,0xBA(reg=0x4-0x7)
];
/**
* @fileoverview Implements PCjs 8086 opcode decoding.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-Sep-05
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
if (typeof module !== 'undefined') {
var str = require("../../shared/lib/strlib");
var Component = require("../../shared/lib/component");
var Messages = require("./messages");
var X86 = require("./x86");
}
/**
* op=0x00 (ADD byte,reg)
*
* @this {X86CPU}
*/
X86.opADDmb = function ADDmb()
{
var b = this.getIPByte();
/*
* Opcode bytes 0x00 0x00 are sufficiently uncommon that it's more likely we've started
* executing in the weeds, so we'll print a warning if you're in DEBUG mode, and optionally
* stop the CPU if a Debugger is available.
*/
if (DEBUG && !b) {
this.printMessage("suspicious opcode: 0x00 0x00", DEBUGGER || this.bitsMessage);
if (DEBUGGER && this.dbg) this.stopCPU();
}
this.aOpModMemByte[b].call(this, X86.fnADDb);
};
/**
* op=0x01 (ADD word,reg)
*
* @this {X86CPU}
*/
X86.opADDmw = function ADDmw()
{
this.aOpModMemWord[this.getIPByte()].call(this, X86.fnADDw);
};
/**
* op=0x02 (ADD reg,byte)
*
* @this {X86CPU}
*/
X86.opADDrb = function ADDrb()
{
this.aOpModRegByte[this.getIPByte()].call(this, X86.fnADDb);
};
/**
* op=0x03 (ADD reg,word)
*
* @this {X86CPU}
*/
X86.opADDrw = function ADDrw()
{
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnADDw);
};
/**
* op=0x04 (ADD AL,imm8)
*
* @this {X86CPU}
*/
X86.opADDALb = function ADDALb()
{
this.regEAX = (this.regEAX & ~0xff) | X86.fnADDb.call(this, this.regEAX & 0xff, this.getIPByte());
/*
* NOTE: Whenever the result is "blended" value (eg, of btiAL and btiMemLo), a new bti should be
* allocated to reflect that fact; however, I'm leaving "perfect" BACKTRACK support for another day.
*/
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
this.nStepCycles--; // in the absence of any EA calculations, we need deduct only one more cycle
};
/**
* op=0x05 (ADD AX,imm16 or ADD EAX,imm32)
*
* @this {X86CPU}
*/
X86.opADDAX = function ADDAX()
{
this.regEAX = (this.regEAX & ~this.dataMask) | X86.fnADDw.call(this, this.regEAX & this.dataMask, this.getIPWord());
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
}
this.nStepCycles--; // in the absence of any EA calculations, we need deduct only one more cycle
};
/**
* op=0x06 (PUSH ES)
*
* @this {X86CPU}
*/
X86.opPUSHES = function PUSHES()
{
this.pushWord(this.segES.sel);
this.nStepCycles -= this.cycleCounts.nOpCyclesPushSeg;
};
/**
* op=0x07 (POP ES)
*
* @this {X86CPU}
*/
X86.opPOPES = function POPES()
{
this.setES(this.popWord());
this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
};
/**
* op=0x08 (OR byte,reg)
*
* @this {X86CPU}
*/
X86.opORmb = function ORmb()
{
this.aOpModMemByte[this.getIPByte()].call(this, X86.fnORb);
};
/**
* op=0x09 (OR word,reg)
*
* @this {X86CPU}
*/
X86.opORmw = function ORmw()
{
this.aOpModMemWord[this.getIPByte()].call(this, X86.fnORw);
};
/**
* op=0x0A (OR reg,byte)
*
* @this {X86CPU}
*/
X86.opORrb = function ORrb()
{
this.aOpModRegByte[this.getIPByte()].call(this, X86.fnORb);
};
/**
* op=0x0B (OR reg,word)
*
* @this {X86CPU}
*/
X86.opORrw = function ORrw()
{
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnORw);
};
/**
* op=0x0C (OR AL,imm8)
*
* @this {X86CPU}
*/
X86.opORALb = function ORALb()
{
this.regEAX = (this.regEAX & ~0xff) | X86.fnORb.call(this, this.regEAX & 0xff, this.getIPByte());
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
this.nStepCycles--; // in the absence of any EA calculations, we need deduct only one more cycle
};
/**
* op=0x0D (OR AX,imm16 or OR EAX,imm32)
*
* @this {X86CPU}
*/
X86.opORAX = function ORAX()
{
this.regEAX = (this.regEAX & ~this.dataMask) | X86.fnORw.call(this, this.regEAX & this.dataMask, this.getIPWord());
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
}
this.nStepCycles--; // in the absence of any EA calculations, we need deduct only one more cycle
};
/**
* op=0x0E (PUSH CS)
*
* @this {X86CPU}
*/
X86.opPUSHCS = function PUSHCS()
{
this.pushWord(this.segCS.sel);
this.nStepCycles -= this.cycleCounts.nOpCyclesPushSeg;
};
/**
* op=0x0F (POP CS) (undocumented on 8086/8088; replaced with opInvalid on 80186/80188, and op0F on 80286 and up)
*
* @this {X86CPU}
*/
X86.opPOPCS = function POPCS()
{
this.setCS(this.popWord());
this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
};
/**
* op=0x0F (handler for two-byte opcodes; 80286 and up)
*
* @this {X86CPU}
*/
X86.op0F = function OP0F()
{
this.aOps0F[this.getIPByte()].call(this);
};
/**
* op=0x10 (ADC byte,reg)
*
* @this {X86CPU}
*/
X86.opADCmb = function ADCmb()
{
this.aOpModMemByte[this.getIPByte()].call(this, X86.fnADCb);
};
/**
* op=0x11 (ADC word,reg)
*
* @this {X86CPU}
*/
X86.opADCmw = function ADCmw()
{
this.aOpModMemWord[this.getIPByte()].call(this, X86.fnADCw);
};
/**
* op=0x12 (ADC reg,byte)
*
* @this {X86CPU}
*/
X86.opADCrb = function ADCrb()
{
this.aOpModRegByte[this.getIPByte()].call(this, X86.fnADCb);
};
/**
* op=0x13 (ADC reg,word)
*
* @this {X86CPU}
*/
X86.opADCrw = function ADCrw()
{
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnADCw);
};
/**
* op=0x14 (ADC AL,imm8)
*
* @this {X86CPU}
*/
X86.opADCALb = function ADCALb()
{
this.regEAX = (this.regEAX & ~0xff) | X86.fnADCb.call(this, this.regEAX & 0xff, this.getIPByte());
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
this.nStepCycles--; // in the absence of any EA calculations, we need deduct only one more cycle
};
/**
* op=0x15 (ADC AX,imm16 or ADC EAX,imm32)
*
* @this {X86CPU}
*/
X86.opADCAX = function ADCAX()
{
this.regEAX = (this.regEAX & ~this.dataMask) | X86.fnADCw.call(this, this.regEAX & this.dataMask, this.getIPWord());
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
}
this.nStepCycles--; // in the absence of any EA calculations, we need deduct only one more cycle
};
/**
* op=0x16 (PUSH SS)
*
* @this {X86CPU}
*/
X86.opPUSHSS = function PUSHSS()
{
this.pushWord(this.segSS.sel);
this.nStepCycles -= this.cycleCounts.nOpCyclesPushSeg;
};
/**
* op=0x17 (POP SS)
*
* @this {X86CPU}
*/
X86.opPOPSS = function POPSS()
{
this.setSS(this.popWord());
this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
};
/**
* op=0x18 (SBB byte,reg)
*
* @this {X86CPU}
*/
X86.opSBBmb = function SBBmb()
{
this.aOpModMemByte[this.getIPByte()].call(this, X86.fnSBBb);
};
/**
* op=0x19 (SBB word,reg)
*
* @this {X86CPU}
*/
X86.opSBBmw = function SBBmw()
{
this.aOpModMemWord[this.getIPByte()].call(this, X86.fnSBBw);
};
/**
* op=0x1A (SBB reg,byte)
*
* @this {X86CPU}
*/
X86.opSBBrb = function SBBrb()
{
this.aOpModRegByte[this.getIPByte()].call(this, X86.fnSBBb);
};
/**
* op=0x1B (SBB reg,word)
*
* @this {X86CPU}
*/
X86.opSBBrw = function SBBrw()
{
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnSBBw);
};
/**
* op=0x1C (SBB AL,imm8)
*
* @this {X86CPU}
*/
X86.opSBBALb = function SBBALb()
{
this.regEAX = (this.regEAX & ~0xff) | X86.fnSBBb.call(this, this.regEAX & 0xff, this.getIPByte());
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
this.nStepCycles--; // in the absence of any EA calculations, we need deduct only one more cycle
};
/**
* op=0x1D (SBB AX,imm16 or SBB EAX,imm32)
*
* @this {X86CPU}
*/
X86.opSBBAX = function SBBAX()
{
this.regEAX = (this.regEAX & ~this.dataMask) | X86.fnSBBw.call(this, this.regEAX & this.dataMask, this.getIPWord());
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
}
this.nStepCycles--; // in the absence of any EA calculations, we need deduct only one more cycle
};
/**
* op=0x1E (PUSH DS)
*
* @this {X86CPU}
*/
X86.opPUSHDS = function PUSHDS()
{
this.pushWord(this.segDS.sel);
this.nStepCycles -= this.cycleCounts.nOpCyclesPushSeg;
};
/**
* op=0x1F (POP DS)
*
* @this {X86CPU}
*/
X86.opPOPDS = function POPDS()
{
this.setDS(this.popWord());
this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
};
/**
* op=0x20 (AND byte,reg)
*
* @this {X86CPU}
*/
X86.opANDmb = function ANDmb()
{
this.aOpModMemByte[this.getIPByte()].call(this, X86.fnANDb);
};
/**
* op=0x21 (AND word,reg)
*
* @this {X86CPU}
*/
X86.opANDmw = function ANDmw()
{
this.aOpModMemWord[this.getIPByte()].call(this, X86.fnANDw);
};
/**
* op=0x22 (AND reg,byte)
*
* @this {X86CPU}
*/
X86.opANDrb = function ANDrb()
{
this.aOpModRegByte[this.getIPByte()].call(this, X86.fnANDb);
};
/**
* op=0x23 (AND reg,word)
*
* @this {X86CPU}
*/
X86.opANDrw = function ANDrw()
{
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnANDw);
};
/**
* op=0x24 (AND AL,imm8)
*
* @this {X86CPU}
*/
X86.opANDAL = function ANDAL()
{
this.regEAX = (this.regEAX & ~0xff) | X86.fnANDb.call(this, this.regEAX & 0xff, this.getIPByte());
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
this.nStepCycles--; // in the absence of any EA calculations, we need deduct only one more cycle
};
/**
* op=0x25 (AND AX,imm16 or AND EAX,imm32)
*
* @this {X86CPU}
*/
X86.opANDAX = function ANDAX()
{
this.regEAX = (this.regEAX & ~this.dataMask) | X86.fnANDw.call(this, this.regEAX & this.dataMask, this.getIPWord());
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
}
this.nStepCycles--; // in the absence of any EA calculations, we need deduct only one more cycle
};
/**
* op=0x26 (ES:)
*
* @this {X86CPU}
*/
X86.opES = function ES()
{
/*
* NOTE: The fact that we're setting NOINTR along with SEG is really just for documentation purposes;
* the way stepCPU() is written, the presence of any prefix bypasses normal interrupt processing anyway.
*/
this.opFlags |= X86.OPFLAG.SEG | X86.OPFLAG.NOINTR;
this.segData = this.segStack = this.segES;
this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
};
/**
* op=0x27 (DAA)
*
* @this {X86CPU}
*/
X86.opDAA = function DAA()
{
var AL = this.regEAX & 0xff;
var AF = this.getAF();
var CF = this.getCF();
if ((AL & 0xf) > 9 || AF) {
AL += 0x6;
AF = X86.PS.AF;
}
if (AL > 0x9f || CF) {
AL += 0x60;
CF = X86.PS.CF;
}
var b = (AL & 0xff);
this.regEAX = (this.regEAX & ~0xff) | b;
this.setLogicResult(b, X86.RESULT.BYTE);
if (CF) this.setCF(); else this.clearCF();
if (AF) this.setAF(); else this.clearAF();
this.nStepCycles -= this.cycleCounts.nOpCyclesAAA; // AAA and DAA have the same cycle times
};
/**
* op=0x28 (SUB byte,reg)
*
* @this {X86CPU}
*/
X86.opSUBmb = function SUBmb()
{
this.aOpModMemByte[this.getIPByte()].call(this, X86.fnSUBb);
};
/**
* op=0x29 (SUB word,reg)
*
* @this {X86CPU}
*/
X86.opSUBmw = function SUBmw()
{
this.aOpModMemWord[this.getIPByte()].call(this, X86.fnSUBw);
};
/**
* op=0x2A (SUB reg,byte)
*
* @this {X86CPU}
*/
X86.opSUBrb = function SUBrb()
{
this.aOpModRegByte[this.getIPByte()].call(this, X86.fnSUBb);
};
/**
* op=0x2B (SUB reg,word)
*
* @this {X86CPU}
*/
X86.opSUBrw = function SUBrw()
{
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnSUBw);
};
/**
* op=0x2C (SUB AL,imm8)
*
* @this {X86CPU}
*/
X86.opSUBALb = function SUBALb()
{
this.regEAX = (this.regEAX & ~0xff) | X86.fnSUBb.call(this, this.regEAX & 0xff, this.getIPByte());
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
this.nStepCycles--; // in the absence of any EA calculations, we need deduct only one more cycle
};
/**
* op=0x2D (SUB AX,imm16 or SUB EAX,imm32)
*
* @this {X86CPU}
*/
X86.opSUBAX = function SUBAX()
{
this.regEAX = (this.regEAX & ~this.dataMask) | X86.fnSUBw.call(this, this.regEAX & this.dataMask, this.getIPWord());
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
}
this.nStepCycles--; // in the absence of any EA calculations, we need deduct only one more cycle
};
/**
* op=0x2E (CS:)
*
* @this {X86CPU}
*/
X86.opCS = function CS()
{
/*
* NOTE: The fact that we're setting NOINTR along with SEG is really just for documentation purposes;
* the way stepCPU() is written, the presence of any prefix bypasses normal interrupt processing anyway.
*/
this.opFlags |= X86.OPFLAG.SEG | X86.OPFLAG.NOINTR;
this.segData = this.segStack = this.segCS;
this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
};
/**
* op=0x2F (DAS)
*
* @this {X86CPU}
*/
X86.opDAS = function DAS()
{
var AL = this.regEAX & 0xff;
var AF = this.getAF();
var CF = this.getCF();
if ((AL & 0xf) > 9 || AF) {
AL -= 0x6;
AF = X86.PS.AF;
}
if (AL > 0x9f || CF) {
AL -= 0x60;
CF = X86.PS.CF;
}
var b = (AL & 0xff);
this.regEAX = (this.regEAX & ~0xff) | b;
this.setLogicResult(b, X86.RESULT.BYTE);
if (CF) this.setCF(); else this.clearCF();
if (AF) this.setAF(); else this.clearAF();
this.nStepCycles -= this.cycleCounts.nOpCyclesAAA; // AAA and DAS have the same cycle times
};
/**
* op=0x30 (XOR byte,reg)
*
* @this {X86CPU}
*/
X86.opXORmb = function XORmb()
{
this.aOpModMemByte[this.getIPByte()].call(this, X86.fnXORb);
};
/**
* op=0x31 (XOR word,reg)
*
* @this {X86CPU}
*/
X86.opXORmw = function XORmw()
{
this.aOpModMemWord[this.getIPByte()].call(this, X86.fnXORw);
};
/**
* op=0x32 (XOR reg,byte)
*
* @this {X86CPU}
*/
X86.opXORrb = function XORrb()
{
this.aOpModRegByte[this.getIPByte()].call(this, X86.fnXORb);
};
/**
* op=0x33 (XOR reg,word)
*
* @this {X86CPU}
*/
X86.opXORrw = function XORrw()
{
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnXORw);
};
/**
* op=0x34 (XOR AL,imm8)
*
* @this {X86CPU}
*/
X86.opXORALb = function XORALb()
{
this.regEAX = (this.regEAX & ~0xff) | X86.fnXORb.call(this, this.regEAX & 0xff, this.getIPByte());
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
this.nStepCycles--; // in the absence of any EA calculations, we need deduct only one more cycle
};
/**
* op=0x35 (XOR AX,imm16 or XOR EAX,imm32)
*
* @this {X86CPU}
*/
X86.opXORAX = function XORAX()
{
this.regEAX = (this.regEAX & ~this.dataMask) | X86.fnXORw.call(this, this.regEAX & this.dataMask, this.getIPWord());
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
}
this.nStepCycles--; // in the absence of any EA calculations, we need deduct only one more cycle
};
/**
* op=0x36 (SS:)
*
* @this {X86CPU}
*/
X86.opSS = function SS()
{
/*
* NOTE: The fact that we're setting NOINTR along with SEG is really just for documentation purposes;
* the way stepCPU() is written, the presence of any prefix bypasses normal interrupt processing anyway.
*/
this.opFlags |= X86.OPFLAG.SEG | X86.OPFLAG.NOINTR;
this.segData = this.segStack = this.segSS; // QUESTION: Is there a case where segStack would not already be segSS? (eg, multiple segment overrides?)
this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
};
/**
* op=0x37 (AAA)
*
* @this {X86CPU}
*/
X86.opAAA = function AAA()
{
var CF, AF;
var AL = this.regEAX & 0xff;
var AH = (this.regEAX >> 8) & 0xff;
if ((AL & 0xf) > 9 || this.getAF()) {
AL = (AL + 0x6) & 0xf;
AH = (AH + 1) & 0xff;
CF = AF = 1;
} else {
CF = AF = 0;
}
this.regEAX = (this.regEAX & ~0xffff) | ((AH << 8) | AL);
if (CF) this.setCF(); else this.clearCF();
if (AF) this.setAF(); else this.clearAF();
this.nStepCycles -= this.cycleCounts.nOpCyclesAAA;
};
/**
* op=0x38 (CMP byte,reg)
*
* @this {X86CPU}
*/
X86.opCMPmb = function CMPmb()
{
this.aOpModMemByte[this.getIPByte()].call(this, X86.fnCMPb);
};
/**
* op=0x39 (CMP word,reg)
*
* @this {X86CPU}
*/
X86.opCMPmw = function CMPmw()
{
this.aOpModMemWord[this.getIPByte()].call(this, X86.fnCMPw);
};
/**
* op=0x3A (CMP reg,byte)
*
* @this {X86CPU}
*/
X86.opCMPrb = function CMPrb()
{
this.aOpModRegByte[this.getIPByte()].call(this, X86.fnCMPb);
};
/**
* op=0x3B (CMP reg,word)
*
* @this {X86CPU}
*/
X86.opCMPrw = function CMPrw()
{
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnCMPw);
};
/**
* op=0x3C (CMP AL,imm8)
*
* @this {X86CPU}
*/
X86.opCMPALb = function CMPALb()
{
X86.fnCMPb.call(this, this.regEAX & 0xff, this.getIPByte());
this.nStepCycles--; // in the absence of any EA calculations, we need deduct only one more cycle
};
/**
* op=0x3D (CMP AX,imm16 or CMP EAX,imm32)
*
* @this {X86CPU}
*/
X86.opCMPAX = function CMPAX()
{
X86.fnCMPw.call(this, this.regEAX & this.dataMask, this.getIPWord());
this.nStepCycles--; // in the absence of any EA calculations, we need deduct only one more cycle
};
/**
* op=0x3E (DS:)
*
* @this {X86CPU}
*/
X86.opDS = function DS()
{
/*
* NOTE: The fact that we're setting NOINTR along with SEG is really just for documentation purposes;
* the way stepCPU() is written, the presence of any prefix bypasses normal interrupt processing anyway.
*/
this.opFlags |= X86.OPFLAG.SEG | X86.OPFLAG.NOINTR;
this.segData = this.segStack = this.segDS; // QUESTION: Is there a case where segData would not already be segDS? (eg, multiple segment overrides?)
this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
};
/**
* op=0x3D (AAS)
*
* @this {X86CPU}
*/
X86.opAAS = function AAS()
{
var CF, AF;
var AL = this.regEAX & 0xff;
var AH = (this.regEAX >> 8) & 0xff;
if ((AL & 0xf) > 9 || this.getAF()) {
AL = (AL - 0x6) & 0xf;
AH = (AH - 1) & 0xff;
CF = AF = 1;
} else {
CF = AF = 0;
}
this.regEAX = (this.regEAX & ~0xffff) | ((AH << 8) | AL);
if (CF) this.setCF(); else this.clearCF();
if (AF) this.setAF(); else this.clearAF();
this.nStepCycles -= this.cycleCounts.nOpCyclesAAA; // AAA and AAS have the same cycle times
};
/**
* op=0x40 (INC [E]AX)
*
* @this {X86CPU}
*/
X86.opINCAX = function INCAX()
{
this.regEAX = X86.fnINCr.call(this, this.regEAX);
};
/**
* op=0x41 (INC [E]CX)
*
* @this {X86CPU}
*/
X86.opINCCX = function INCCX()
{
this.regECX = X86.fnINCr.call(this, this.regECX);
};
/**
* op=0x42 (INC [E]DX)
*
* @this {X86CPU}
*/
X86.opINCDX = function INCDX()
{
this.regEDX = X86.fnINCr.call(this, this.regEDX);
};
/**
* op=0x43 (INC [E]BX)
*
* @this {X86CPU}
*/
X86.opINCBX = function INCBX()
{
this.regEBX = X86.fnINCr.call(this, this.regEBX);
};
/**
* op=0x44 (INC [E]SP)
*
* @this {X86CPU}
*/
X86.opINCSP = function INCSP()
{
this.setSP(X86.fnINCr.call(this, this.getSP()));
};
/**
* op=0x45 (INC [E]BP)
*
* @this {X86CPU}
*/
X86.opINCBP = function INCBP()
{
this.regEBP = X86.fnINCr.call(this, this.regEBP);
};
/**
* op=0x46 (INC [E]SI)
*
* @this {X86CPU}
*/
X86.opINCSI = function INCSI()
{
this.regESI = X86.fnINCr.call(this, this.regESI);
};
/**
* op=0x47 (INC [E]DI)
*
* @this {X86CPU}
*/
X86.opINCDI = function INCDI()
{
this.regEDI = X86.fnINCr.call(this, this.regEDI);
};
/**
* op=0x48 (DEC [E]AX)
*
* @this {X86CPU}
*/
X86.opDECAX = function DECAX()
{
this.regEAX = X86.fnDECr.call(this, this.regEAX);
};
/**
* op=0x49 (DEC [E]CX)
*
* @this {X86CPU}
*/
X86.opDECCX = function DECCX()
{
this.regECX = X86.fnDECr.call(this, this.regECX);
};
/**
* op=0x4A (DEC [E]DX)
*
* @this {X86CPU}
*/
X86.opDECDX = function DECDX()
{
this.regEDX = X86.fnDECr.call(this, this.regEDX);
};
/**
* op=0x4B (DEC [E]BX)
*
* @this {X86CPU}
*/
X86.opDECBX = function DECBX()
{
this.regEBX = X86.fnDECr.call(this, this.regEBX);
};
/**
* op=0x4C (DEC [E]SP)
*
* @this {X86CPU}
*/
X86.opDECSP = function DECSP()
{
this.setSP(X86.fnDECr.call(this, this.getSP()));
};
/**
* op=0x4D (DEC [E]BP)
*
* @this {X86CPU}
*/
X86.opDECBP = function DECBP()
{
this.regEBP = X86.fnDECr.call(this, this.regEBP);
};
/**
* op=0x4E (DEC [E]SI)
*
* @this {X86CPU}
*/
X86.opDECSI = function DECSI()
{
this.regESI = X86.fnDECr.call(this, this.regESI);
};
/**`
* op=0x4F (DEC [E]DI)
*
* @this {X86CPU}
*/
X86.opDECDI = function DECDI()
{
this.regEDI = X86.fnDECr.call(this, this.regEDI);
};
/**
* op=0x50 (PUSH [E]AX)
*
* @this {X86CPU}
*/
X86.opPUSHAX = function PUSHAX()
{
if (BACKTRACK) {
this.backTrack.btiMemLo = this.backTrack.btiAL; this.backTrack.btiMemHi = this.backTrack.btiAH;
}
this.pushWord(this.regEAX & this.dataMask);
this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
};
/**
* op=0x51 (PUSH [E]CX)
*
* @this {X86CPU}
*/
X86.opPUSHCX = function PUSHCX()
{
if (BACKTRACK) {
this.backTrack.btiMemLo = this.backTrack.btiCL; this.backTrack.btiMemHi = this.backTrack.btiCH;
}
this.pushWord(this.regECX & this.dataMask);
this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
};
/**
* op=0x52 (PUSH [E]DX)
*
* @this {X86CPU}
*/
X86.opPUSHDX = function PUSHDX()
{
if (BACKTRACK) {
this.backTrack.btiMemLo = this.backTrack.btiDL; this.backTrack.btiMemHi = this.backTrack.btiDH;
}
this.pushWord(this.regEDX & this.dataMask);
this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
};
/**
* op=0x53 (PUSH [E]BX)
*
* @this {X86CPU}
*/
X86.opPUSHBX = function PUSHBX()
{
if (BACKTRACK) {
this.backTrack.btiMemLo = this.backTrack.btiBL; this.backTrack.btiMemHi = this.backTrack.btiBH;
}
this.pushWord(this.regEBX & this.dataMask);
this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
};
/**
* op=0x54 (PUSH SP)
*
* @this {X86CPU}
*/
X86.opPUSHSP_8086 = function PUSHSP_8086()
{
var w = (this.getSP() - 2) & 0xffff;
this.pushWord(w);
this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
};
/**
* op=0x54 (PUSH [E]SP)
*
* @this {X86CPU}
*/
X86.opPUSHSP = function PUSHSP()
{
this.pushWord(this.getSP() & this.dataMask);
this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
};
/**
* op=0x55 (PUSH [E]BP)
*
* @this {X86CPU}
*/
X86.opPUSHBP = function PUSHBP()
{
if (BACKTRACK) {
this.backTrack.btiMemLo = this.backTrack.btiBPLo; this.backTrack.btiMemHi = this.backTrack.btiBPHi;
}
this.pushWord(this.regEBP & this.dataMask);
this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
};
/**
* op=0x56 (PUSH [E]SI)
*
* @this {X86CPU}
*/
X86.opPUSHSI = function PUSHSI()
{
if (BACKTRACK) {
this.backTrack.btiMemLo = this.backTrack.btiSILo; this.backTrack.btiMemHi = this.backTrack.btiSIHi;
}
this.pushWord(this.regESI & this.dataMask);
this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
};
/**
* op=0x57 (PUSH [E]DI)
*
* @this {X86CPU}
*/
X86.opPUSHDI = function PUSHDI()
{
if (BACKTRACK) {
this.backTrack.btiMemLo = this.backTrack.btiDILo; this.backTrack.btiMemHi = this.backTrack.btiDIHi;
}
this.pushWord(this.regEDI & this.dataMask);
this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
};
/**
* op=0x58 (POP [E]AX)
*
* @this {X86CPU}
*/
X86.opPOPAX = function POPAX()
{
this.regEAX = (this.regEAX & ~this.dataMask) | this.popWord();
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
};
/**
* op=0x59 (POP [E]CX)
*
* @this {X86CPU}
*/
X86.opPOPCX = function POPCX()
{
this.regECX = (this.regECX & ~this.dataMask) | this.popWord();
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiMemLo; this.backTrack.btiCH = this.backTrack.btiMemHi;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
};
/**
* op=0x5A (POP [E]DX)
*
* @this {X86CPU}
*/
X86.opPOPDX = function POPDX()
{
this.regEDX = (this.regEDX & ~this.dataMask) | this.popWord();
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiMemLo; this.backTrack.btiDH = this.backTrack.btiMemHi;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
};
/**
* op=0x5B (POP [E]BX)
*
* @this {X86CPU}
*/
X86.opPOPBX = function POPBX()
{
this.regEBX = (this.regEBX & ~this.dataMask) | this.popWord();
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiMemLo; this.backTrack.btiBH = this.backTrack.btiMemHi;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
};
/**
* op=0x5C (POP [E]SP)
*
* @this {X86CPU}
*/
X86.opPOPSP = function POPSP()
{
this.setSP((this.getSP() & ~this.dataMask) | this.popWord());
this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
};
/**
* op=0x5D (POP [E]BP)
*
* @this {X86CPU}
*/
X86.opPOPBP = function POPBP()
{
this.regEBP = (this.regEBP & ~this.dataMask) | this.popWord();
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiMemLo; this.backTrack.btiBPHi = this.backTrack.btiMemHi;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
};
/**
* op=0x5E (POP [E]SI)
*
* @this {X86CPU}
*/
X86.opPOPSI = function POPSI()
{
this.regESI = (this.regESI & ~this.dataMask) | this.popWord();
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiMemLo; this.backTrack.btiSIHi = this.backTrack.btiMemHi;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
};
/**
* op=0x5F (POP [E]DI)
*
* @this {X86CPU}
*/
X86.opPOPDI = function POPDI()
{
this.regEDI = (this.regEDI & ~this.dataMask) | this.popWord();
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiMemLo; this.backTrack.btiDIHi = this.backTrack.btiMemHi;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
};
/**
* op=0x60 (PUSHA) (80186/80188 and up)
*
* @this {X86CPU}
*/
X86.opPUSHA = function PUSHA()
{
/*
* TODO: regLSP needs to be pre-bounds-checked against regLSPLimitLow
*/
var temp = this.getSP() & this.dataMask;
if (BACKTRACK) {
this.backTrack.btiMemLo = this.backTrack.btiAL; this.backTrack.btiMemHi = this.backTrack.btiAH;
}
this.pushWord(this.regEAX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiMemLo = this.backTrack.btiCL; this.backTrack.btiMemHi = this.backTrack.btiCH;
}
this.pushWord(this.regECX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiMemLo = this.backTrack.btiDL; this.backTrack.btiMemHi = this.backTrack.btiDH;
}
this.pushWord(this.regEDX & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiMemLo = this.backTrack.btiBL; this.backTrack.btiMemHi = this.backTrack.btiBH;
}
this.pushWord(this.regEBX & this.dataMask);
this.pushWord(temp);
if (BACKTRACK) {
this.backTrack.btiMemLo = this.backTrack.btiBPLo; this.backTrack.btiMemHi = this.backTrack.btiBPHi;
}
this.pushWord(this.regEBP & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiMemLo = this.backTrack.btiSILo; this.backTrack.btiMemHi = this.backTrack.btiSIHi;
}
this.pushWord(this.regESI & this.dataMask);
if (BACKTRACK) {
this.backTrack.btiMemLo = this.backTrack.btiDILo; this.backTrack.btiMemHi = this.backTrack.btiDIHi;
}
this.pushWord(this.regEDI & this.dataMask);
this.nStepCycles -= this.cycleCounts.nOpCyclesPushAll;
};
/**
* op=0x61 (POPA) (80186/80188 and up)
*
* @this {X86CPU}
*/
X86.opPOPA = function POPA()
{
this.regEDI = (this.regEDI & ~this.dataMask) | this.popWord();
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiMemLo; this.backTrack.btiDIHi = this.backTrack.btiMemHi;
}
this.regESI = (this.regESI & ~this.dataMask) | this.popWord();
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiMemLo; this.backTrack.btiSIHi = this.backTrack.btiMemHi;
}
this.regEBP = (this.regEBP & ~this.dataMask) | this.popWord();
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiMemLo; this.backTrack.btiBPHi = this.backTrack.btiMemHi;
}
/*
* TODO: regLSP needs to be pre-bounds-checked against regLSPLimit at the start
*/
this.setSP(this.getSP() + this.dataSize);
// this.regLSP += (I386? this.dataSize : 2);
this.regEBX = (this.regEBX & ~this.dataMask) | this.popWord();
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiMemLo; this.backTrack.btiBH = this.backTrack.btiMemHi;
}
this.regEDX = (this.regEDX & ~this.dataMask) | this.popWord();
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiMemLo; this.backTrack.btiDH = this.backTrack.btiMemHi;
}
this.regECX = (this.regECX & ~this.dataMask) | this.popWord();
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiMemLo; this.backTrack.btiCH = this.backTrack.btiMemHi;
}
this.regEAX = (this.regEAX & ~this.dataMask) | this.popWord();
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesPopAll;
};
/**
* op=0x62 (BOUND reg,word) (80186/80188 and up)
*
* @this {X86CPU}
*/
X86.opBOUND = function BOUND()
{
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnBOUND);
};
/**
* op=0x63 (ARPL word,reg) (80286 and up)
*
* @this {X86CPU}
*/
X86.opARPL = function ARPL()
{
this.aOpModMemWord[this.getIPByte()].call(this, X86.fnARPL);
};
/**
* op=0x64 (FS:)
*
* @this {X86CPU}
*/
X86.opFS = function FS()
{
/*
* NOTE: The fact that we're setting NOINTR along with SEG is really just for documentation purposes;
* the way stepCPU() is written, the presence of any prefix bypasses normal interrupt processing anyway.
*/
this.opFlags |= X86.OPFLAG.SEG | X86.OPFLAG.NOINTR;
this.segData = this.segStack = this.segFS;
this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
this.stopCPU();
};
/**
* op=0x65 (GS:)
*
* @this {X86CPU}
*/
X86.opGS = function GS()
{
/*
* NOTE: The fact that we're setting NOINTR along with SEG is really just for documentation purposes;
* the way stepCPU() is written, the presence of any prefix bypasses normal interrupt processing anyway.
*/
this.opFlags |= X86.OPFLAG.SEG | X86.OPFLAG.NOINTR;
this.segData = this.segStack = this.segGS;
this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
this.stopCPU();
};
/**
* op=0x66 (OS:) (80386 and up)
*
* TODO: Review other effective operand-size criteria, cycle count, etc.
*
* @this {X86CPU}
*/
X86.opOS = function OS()
{
if (I386) {
this.opFlags |= X86.OPFLAG.DATASIZE;
this.dataSize ^= 0x6; // that which is 2 shall become 4, and vice versa
this.dataMask ^= (0xffff0000|0); // that which is 0x0000ffff shall become 0xffffffff, and vice versa
this.updateDataSize();
this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
}
};
/**
* op=0x67 (AS:) (80386 and up)
*
* TODO: Review other effective address-size criteria, cycle count, etc.
*
* @this {X86CPU}
*/
X86.opAS = function AS()
{
if (I386) {
this.opFlags |= X86.OPFLAG.ADDRSIZE;
this.addrSize ^= 0x06; // that which is 2 shall become 4, and vice versa
this.addrMask ^= (0xffff0000|0); // that which is 0x0000ffff shall become 0xffffffff, and vice versa
this.updateAddrSize();
this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
}
};
/**
* op=0x68 (PUSH imm) (80186/80188 and up)
*
* @this {X86CPU}
*/
X86.opPUSHn = function PUSHn()
{
this.pushWord(this.getIPWord());
this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
};
/**
* op=0x69 (IMUL reg,word,imm) (80186/80188 and up)
*
* @this {X86CPU}
*/
X86.opIMULn = function IMULn()
{
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnIMULn);
};
/**
* op=0x6A (PUSH imm8) (80186/80188 and up)
*
* @this {X86CPU}
*/
X86.opPUSH8 = function PUSH8()
{
if (BACKTRACK) this.backTrack.btiMemHi = 0;
this.pushWord(this.getIPByte());
this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
};
/**
* op=0x6B (IMUL reg,word,imm8) (80186/80188 and up)
*
* @this {X86CPU}
*/
X86.opIMUL8 = function IMUL8()
{
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnIMUL8);
};
/**
* op=0x6C (INSB) (80186/80188 and up)
*
* NOTE: Segment overrides are ignored for this instruction, so we must use segES instead of segData.
*
* @this {X86CPU}
*/
X86.opINSb = function INSb()
{
var nReps = 1;
var nDelta = 0;
/*
* NOTE: 5 + 4n is the cycle time for the 80286; the 80186/80188 has different values: 14 cycles for
* an unrepeated INS, and 8 + 8n for a repeated INS. However, accurate cycle times for the 80186/80188 is
* low priority.
*/
var nCycles = 5;
/*
* The (normal) REP prefix, if used, is REPNZ (0xf2), but either one works....
*/
if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
nReps = this.regECX & this.addrMask;
nDelta = 1;
if (this.opPrefixes & X86.OPFLAG.REPEAT) nCycles = 4;
}
if (nReps--) {
var b = this.bus.checkPortInputNotify(this.regEDX, this.regLIP - nDelta - 1);
if (BACKTRACK) this.backTrack.btiMemLo = this.backTrack.btiIO;
this.setSOByte(this.segES, this.regEDI & this.addrMask, b);
this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + ((this.regPS & X86.PS.DF)? -1 : 1)) & this.addrMask);
this.nStepCycles -= nCycles;
this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
if (nReps) {
if (BUGS_8086) {
this.rewindIP(-2); // this instruction does not support multiple overrides
this.assert(this.regLIP == this.opLIP);
} else {
this.regLIP = this.opLIP;
}
this.opFlags |= X86.OPFLAG.REPEAT;
}
}
};
/**
* op=0x6D (INSW) (80186/80188 and up)
*
* NOTE: Segment overrides are ignored for this instruction, so we must use segDS instead of segData.
*
* @this {X86CPU}
*/
X86.opINSw = function INSw()
{
var nReps = 1;
var nDelta = 0;
/*
* NOTE: 5 + 4n is the cycle time for the 80286; the 80186/80188 has different values: 14 cycles for
* an unrepeated INS, and 8 + 8n for a repeated INS. However, accurate cycle times for the 80186/80188 is
* low priority.
*/
var nCycles = 5;
/*
* The (normal) REP prefix, if used, is REPNZ (0xf2), but either one works....
*/
if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
nReps = this.regECX & this.addrMask;
nDelta = 1;
if (this.opPrefixes & X86.OPFLAG.REPEAT) nCycles = 4;
}
if (nReps--) {
var addrFrom = this.regLIP - nDelta - 1;
var w = 0, shift = 0;
for (var n = 0; n < this.dataSize; n++) {
w |= this.bus.checkPortInputNotify(this.regEDX, addrFrom) << shift;
shift += 8;
if (BACKTRACK) {
if (!n) {
this.backTrack.btiMemLo = this.backTrack.btiIO;
} else if (n == 1) {
this.backTrack.btiMemHi = this.backTrack.btiIO;
}
}
}
this.setSOWord(this.segES, this.regEDI & this.addrMask, w);
this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + ((this.regPS & X86.PS.DF)? -this.dataSize : this.dataSize)) & this.addrMask);
this.nStepCycles -= nCycles;
this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
if (nReps) {
if (BUGS_8086) {
this.rewindIP(-2); // this instruction does not support multiple overrides
this.assert(this.regLIP == this.opLIP);
} else {
this.regLIP = this.opLIP;
}
this.opFlags |= X86.OPFLAG.REPEAT;
}
}
};
/**
* op=0x6E (OUTSB) (80186/80188 and up)
*
* NOTE: Segment overrides are ignored for this instruction, so we must use segDS instead of segData.
*
* @this {X86CPU}
*/
X86.opOUTSb = function OUTSb()
{
var nReps = 1;
var nDelta = 0;
/*
* NOTE: 5 + 4n is the cycle time for the 80286; the 80186/80188 has different values: 14 cycles for
* an unrepeated INS, and 8 + 8n for a repeated INS. TODO: Fix this someday.
*/
var nCycles = 5;
/*
* The (normal) REP prefix, if used, is REPNZ (0xf2), but either one works....
*/
if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
nReps = this.regECX & this.addrMask;
nDelta = 1;
if (this.opPrefixes & X86.OPFLAG.REPEAT) nCycles = 4;
}
if (nReps--) {
var b = this.getSOByte(this.segDS, this.regESI & this.addrMask);
this.regESI = (this.regESI & ~this.addrMask) | ((this.regESI + ((this.regPS & X86.PS.DF)? -1 : 1)) & this.addrMask);
this.nStepCycles -= nCycles;
if (BACKTRACK) this.backTrack.btiIO = this.backTrack.btiMemLo;
this.bus.checkPortOutputNotify(this.regEDX, b, this.regLIP - nDelta - 1);
this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
if (nReps) {
if (BUGS_8086) {
this.rewindIP(-2); // this instruction does not support multiple overrides
this.assert(this.regLIP == this.opLIP);
} else {
this.regLIP = this.opLIP;
}
this.opFlags |= X86.OPFLAG.REPEAT;
}
}
};
/**
* op=0x6F (OUTSW) (80186/80188 and up)
*
* NOTE: Segment overrides are ignored for this instruction, so we must use segDS instead of segData.
*
* @this {X86CPU}
*/
X86.opOUTSw = function OUTSw()
{
var nReps = 1;
var nDelta = 0;
/*
* NOTE: 5 + 4n is the cycle time for the 80286; the 80186/80188 has different values: 14 cycles for
* an unrepeated INS, and 8 + 8n for a repeated INS. TODO: Fix this someday.
*/
var nCycles = 5;
/*
* The (normal) REP prefix, if used, is REPNZ (0xf2), but either one works....
*/
if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
nReps = this.regECX & this.addrMask;
nDelta = 1;
if (this.opPrefixes & X86.OPFLAG.REPEAT) nCycles = 4;
}
if (nReps--) {
var w = this.getSOWord(this.segDS, this.regESI & this.addrMask);
this.regESI = (this.regESI & ~this.addrMask) | ((this.regESI + ((this.regPS & X86.PS.DF)? -this.dataSize : this.dataSize)) & this.addrMask);
this.nStepCycles -= nCycles;
var addrFrom = this.regLIP - nDelta - 1, shift = 0;
for (var n = 0; n < this.dataSize; n++) {
if (BACKTRACK) {
if (!n) {
this.backTrack.btiIO = this.backTrack.btiMemLo;
} else if (n == 1) {
this.backTrack.btiIO = this.backTrack.btiMemHi;
}
}
this.bus.checkPortOutputNotify(this.regEDX, (w >> shift) & 0xff, addrFrom);
shift += 8;
}
this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
if (nReps) {
if (BUGS_8086) {
this.rewindIP(-2); // this instruction does not support multiple overrides
this.assert(this.regLIP == this.opLIP);
} else {
this.regLIP = this.opLIP;
}
this.opFlags |= X86.OPFLAG.REPEAT;
}
}
};
/**
* op=0x70 (JO disp)
*
* @this {X86CPU}
*/
X86.opJO = function JO()
{
var disp = this.getIPDisp();
if (this.getOF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* op=0x71 (JNO disp)
*
* @this {X86CPU}
*/
X86.opJNO = function JNO()
{
var disp = this.getIPDisp();
if (!this.getOF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* op=0x72 (JC disp, aka JB disp)
*
* @this {X86CPU}
*/
X86.opJC = function JC()
{
var disp = this.getIPDisp();
if (this.getCF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* op=0x73 (JNC disp, aka JAE disp)
*
* @this {X86CPU}
*/
X86.opJNC = function JNC()
{
var disp = this.getIPDisp();
if (!this.getCF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* op=0x74 (JZ disp)
*
* @this {X86CPU}
*/
X86.opJZ = function JZ()
{
var disp = this.getIPDisp();
if (this.getZF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* op=0x75 (JNZ disp)
*
* @this {X86CPU}
*/
X86.opJNZ = function JNZ()
{
var disp = this.getIPDisp();
if (!this.getZF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* op=0x76 (JBE disp)
*
* @this {X86CPU}
*/
X86.opJBE = function JBE()
{
var disp = this.getIPDisp();
if (this.getCF() || this.getZF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* op=0x77 (JNBE disp, JA disp)
*
* @this {X86CPU}
*/
X86.opJNBE = function JNBE()
{
var disp = this.getIPDisp();
if (!this.getCF() && !this.getZF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* op=0x78 (JS disp)
*
* @this {X86CPU}
*/
X86.opJS = function JS()
{
var disp = this.getIPDisp();
if (this.getSF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* op=0x79 (JNS disp)
*
* @this {X86CPU}
*/
X86.opJNS = function JNS()
{
var disp = this.getIPDisp();
if (!this.getSF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* op=0x7A (JP disp)
*
* @this {X86CPU}
*/
X86.opJP = function JP()
{
var disp = this.getIPDisp();
if (this.getPF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* op=0x7B (JNP disp)
*
* @this {X86CPU}
*/
X86.opJNP = function JNP()
{
var disp = this.getIPDisp();
if (!this.getPF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* op=0x7C (JL disp)
*
* @this {X86CPU}
*/
X86.opJL = function JL()
{
var disp = this.getIPDisp();
if (!this.getSF() != !this.getOF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* op=0x7D (JNL disp, aka JGE disp)
*
* @this {X86CPU}
*/
X86.opJNL = function JNL()
{
var disp = this.getIPDisp();
if (!this.getSF() == !this.getOF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* op=0x7E (JLE disp)
*
* @this {X86CPU}
*/
X86.opJLE = function JLE()
{
var disp = this.getIPDisp();
if (this.getZF() || !this.getSF() != !this.getOF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* op=0x7F (JNLE disp, aka JG disp)
*
* @this {X86CPU}
*/
X86.opJNLE = function JNLE()
{
var disp = this.getIPDisp();
if (!this.getZF() && !this.getSF() == !this.getOF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
};
/**
* op=0x80/0x82 (GRP1 byte,imm8)
*
* @this {X86CPU}
*/
X86.opGRP1b = function GRP1b()
{
this.aOpModGrpByte[this.getIPByte()].call(this, X86.aOpGrp1b, this.getIPByte);
this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? 1 : this.cycleCounts.nOpCyclesArithMID);
};
/**
* op=0x81 (GRP1 word,imm)
*
* @this {X86CPU}
*/
X86.opGRP1w = function GRP1w()
{
this.aOpModGrpWord[this.getIPByte()].call(this, X86.aOpGrp1w, this.getIPWord);
this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? 1 : this.cycleCounts.nOpCyclesArithMID);
};
/**
* op=0x83 (GRP1 word,disp)
*
* @this {X86CPU}
*/
X86.opGRP1sw = function GRP1sw()
{
this.aOpModGrpWord[this.getIPByte()].call(this, X86.aOpGrp1w, this.getIPDisp);
this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? 1 : this.cycleCounts.nOpCyclesArithMID);
};
/**
* op=0x84 (TEST reg,byte)
*
* @this {X86CPU}
*/
X86.opTESTrb = function TESTrb()
{
this.aOpModMemByte[this.getIPByte()].call(this, X86.fnTESTb);
};
/**
* op=0x85 (TEST reg,word)
*
* @this {X86CPU}
*/
X86.opTESTrw = function TESTrw()
{
this.aOpModMemWord[this.getIPByte()].call(this, X86.fnTESTw);
};
/**
* op=0x86 (XCHG reg,byte)
*
* NOTE: The XCHG instruction is unique in that both src and dst are both read and written;
* see fnXCHGrb() for how we deal with this special case.
*
* @this {X86CPU}
*/
X86.opXCHGrb = function XCHGrb()
{
/*
* If the second operand is a register, then the ModRegByte decoder must use separate "get" and
* "set" assignments, otherwise instructions like "XCHG DH,DL" will end up using a stale DL instead of
* the updated DL.
*
* To be clear, a single assignment like this will fail:
*
* opModRegByteF2: function(fn)
{
* this.regEDX = (this.regEDX & 0xff) | (fn.call(this, this.regEDX >> 8, this.regEDX & 0xff) << 8);
* }
*
* which is why all affected decoders now use separate assignments; eg:
*
* opModRegByteF2: function(fn)
{
* var b = fn.call(this, this.regEDX >> 8, this.regEDX & 0xff);
* this.regEDX = (this.regEDX & 0xff) | (b << 8);
* }
*/
this.aOpModRegByte[this.bModRM = this.getIPByte()].call(this, X86.fnXCHGrb);
};
/**
* op=0x87 (XCHG reg,word)
*
* NOTE: The XCHG instruction is unique in that both src and dst are both read and written;
* see fnXCHGrw() for how we deal with this special case.
*
* @this {X86CPU}
*/
X86.opXCHGrw = function XCHGrw()
{
this.aOpModRegWord[this.bModRM = this.getIPByte()].call(this, X86.fnXCHGrw);
};
/**
* op=0x88 (MOV byte,reg)
*
* @this {X86CPU}
*/
X86.opMOVmb = function MOVmb()
{
/*
* Like other MOV operations, the destination does not need to be read, just written.
*/
this.opFlags |= X86.OPFLAG.NOREAD;
this.aOpModMemByte[this.getIPByte()].call(this, X86.fnMOV);
};
/**
* op=0x89 (MOV word,reg)
*
* @this {X86CPU}
*/
X86.opMOVmw = function MOVmw()
{
/*
* Like other MOV operations, the destination does not need to be read, just written.
*/
this.opFlags |= X86.OPFLAG.NOREAD;
this.aOpModMemWord[this.getIPByte()].call(this, X86.fnMOV);
};
/**
* op=0x8A (MOV reg,byte)
*
* @this {X86CPU}
*/
X86.opMOVrb = function MOVrb()
{
this.aOpModRegByte[this.getIPByte()].call(this, X86.fnMOV);
};
/**
* op=0x8B (MOV reg,word)
*
* @this {X86CPU}
*/
X86.opMOVrw = function MOVrw()
{
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnMOV);
};
/**
* op=0x8C (MOV word,sreg)
*
* NOTE: Since the ModRM decoders deal only with general-purpose registers, we must move
* the appropriate segment register into a special variable (regXX), which our helper function
* (fnMOVxx) will use to replace the decoder's src operand.
*
* @this {X86CPU}
*/
X86.opMOVwsr = function MOVwsr()
{
var bModRM = this.getIPByte();
var reg = (bModRM & 0x38) >> 3;
switch (reg) {
case 0x0:
this.regXX = this.segES.sel;
break;
case 0x1:
this.regXX = this.segCS.sel;
break;
case 0x2:
this.regXX = this.segSS.sel;
break;
case 0x3:
this.regXX = this.segDS.sel;
break;
case 0x4:
if (I386 && this.model >= X86.MODEL_80386) {
this.regXX = this.segFS.sel;
break;
}
X86.opInvalid.call(this);
break;
case 0x5:
if (I386 && this.model >= X86.MODEL_80386) {
this.regXX = this.segGS.sel;
break;
}
/* falls through */
default:
X86.opInvalid.call(this);
break;
}
/*
* Like other MOV operations, the destination does not need to be read, just written.
*/
this.opFlags |= X86.OPFLAG.NOREAD;
this.aOpModMemWord[bModRM].call(this, X86.fnMOVxx);
};
/**
* op=0x8D (LEA reg,word)
*
* @this {X86CPU}
*/
X86.opLEA = function LEA()
{
this.opFlags |= X86.OPFLAG.NOREAD;
this.segData = this.segStack = this.segNULL; // we can't have the EA calculation, if any, "polluted" by segment arithmetic
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnLEA);
};
/**
* op=0x8E (MOV sreg,word)
*
* NOTE: Since the ModRM decoders deal only with general-purpose registers, we have to
* make a note of which general-purpose register will be overwritten, so that we can restore it
* after moving the modified value to the correct segment register.
*
* @this {X86CPU}
*/
X86.opMOVsrw = function MOVsrw()
{
var temp;
var bModRM = this.getIPByte();
var reg = (bModRM & 0x38) >> 3;
switch(reg) {
case 0x0:
temp = this.regEAX;
break;
case 0x2:
temp = this.regEDX;
break;
case 0x3:
temp = this.regEBX;
break;
default:
if (this.model == X86.MODEL_80286 || this.model == X86.MODEL_80386 && reg != 0x4 && reg != 0x5) {
X86.opInvalid.call(this);
return;
}
switch(reg) {
case 0x1: // MOV to CS is undocumented on 8086/8088/80186/80188, and invalid on 80286 and up
temp = this.regECX;
break;
case 0x4: // this form of MOV to ES is undocumented on 8086/8088/80186/80188, invalid on 80286, and uses FS starting with 80386
temp = this.getSP();
break;
case 0x5: // this form of MOV to CS is undocumented on 8086/8088/80186/80188, invalid on 80286, and uses GS starting with 80386
temp = this.regEBP;
break;
case 0x6: // this form of MOV to SS is undocumented on 8086/8088/80186/80188, invalid on 80286 and up
temp = this.regESI;
break;
case 0x7: // this form of MOV to DS is undocumented on 8086/8088/80186/80188, invalid on 80286 and up
temp = this.regEDI;
break;
default:
break;
}
break;
}
this.aOpModRegWord[bModRM].call(this, X86.fnMOV);
switch (reg) {
case 0x0:
this.setES(this.regEAX);
this.regEAX = temp;
break;
case 0x1:
this.setCS(this.regECX);
this.regECX = temp;
break;
case 0x2:
this.setSS(this.regEDX);
this.regEDX = temp;
break;
case 0x3:
this.setDS(this.regEBX);
this.regEBX = temp;
break;
case 0x4:
if (I386 && this.model >= X86.MODEL_80386) {
this.setFS(this.getSP());
} else {
this.setES(this.getSP());
}
this.setSP(temp);
break;
case 0x5:
if (I386 && this.model >= X86.MODEL_80386) {
this.setGS(this.regEBP);
} else {
this.setCS(this.regEBP);
}
this.regEBP = temp;
break;
case 0x6:
this.setSS(this.regESI);
this.regESI = temp;
break;
case 0x7:
this.setDS(this.regEDI);
this.regEDI = temp;
break;
}
};
/**
* op=0x8F (POP word)
*
* @this {X86CPU}
*/
X86.opPOPmw = function POPmw()
{
/*
* Like other MOV operations, the destination does not need to be read, just written.
*/
this.opFlags |= X86.OPFLAG.NOREAD;
this.aOpModGrpWord[this.getIPByte()].call(this, X86.aOpGrpPOPw, this.popWord);
};
/**
* op=0x90 (NOP, aka XCHG AX,AX)
*
* @this {X86CPU}
*/
X86.opNOP = function NOP()
{
this.nStepCycles -= 3; // this form of XCHG takes 3 cycles on all CPUs
};
/**
* op=0x91 (XCHG AX,CX)
*
* @this {X86CPU}
*/
X86.opXCHGCX = function XCHGCX()
{
var temp = this.regEAX;
this.regEAX = (I386? (this.regEAX & ~this.dataMask) | (this.regECX & this.dataMask) : this.regECX);
this.regECX = (I386? (this.regECX & ~this.dataMask) | (temp & this.dataMask) : temp);
if (BACKTRACK) {
temp = this.backTrack.btiAL; this.backTrack.btiAL = this.backTrack.btiCL; this.backTrack.btiCL = temp;
temp = this.backTrack.btiAH; this.backTrack.btiAH = this.backTrack.btiCH; this.backTrack.btiCH = temp;
}
this.nStepCycles -= 3; // this form of XCHG takes 3 cycles on all CPUs
};
/**
* op=0x92 (XCHG AX,DX)
*
* @this {X86CPU}
*/
X86.opXCHGDX = function XCHGDX()
{
var temp = this.regEAX;
this.regEAX = (I386? (this.regEAX & ~this.dataMask) | (this.regEDX & this.dataMask) : this.regEDX);
this.regEDX = (I386? (this.regEDX & ~this.dataMask) | (temp & this.dataMask) : temp);
if (BACKTRACK) {
temp = this.backTrack.btiAL; this.backTrack.btiAL = this.backTrack.btiDL; this.backTrack.btiDL = temp;
temp = this.backTrack.btiAH; this.backTrack.btiAH = this.backTrack.btiDH; this.backTrack.btiDH = temp;
}
this.nStepCycles -= 3; // this form of XCHG takes 3 cycles on all CPUs
};
/**
* op=0x93 (XCHG AX,BX)
*
* @this {X86CPU}
*/
X86.opXCHGBX = function XCHGBX()
{
var temp = this.regEAX;
this.regEAX = (I386? (this.regEAX & ~this.dataMask) | (this.regEBX & this.dataMask) : this.regEBX);
this.regEBX = (I386? (this.regEBX & ~this.dataMask) | (temp & this.dataMask) : temp);
if (BACKTRACK) {
temp = this.backTrack.btiAL; this.backTrack.btiAL = this.backTrack.btiBL; this.backTrack.btiBL = temp;
temp = this.backTrack.btiAH; this.backTrack.btiAH = this.backTrack.btiBH; this.backTrack.btiBH = temp;
}
this.nStepCycles -= 3; // this form of XCHG takes 3 cycles on all CPUs
};
/**
* op=0x94 (XCHG AX,SP)
*
* @this {X86CPU}
*/
X86.opXCHGSP = function XCHGSP()
{
var temp = this.regEAX;
var regESP = this.getSP();
this.regEAX = (I386? (this.regEAX & ~this.dataMask) | (regESP & this.dataMask) : regESP);
this.setSP((I386? (regESP & ~this.dataMask) | (temp & this.dataMask) : temp));
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiAH = 0;
this.nStepCycles -= 3; // this form of XCHG takes 3 cycles on all CPUs
};
/**
* op=0x95 (XCHG AX,BP)
*
* @this {X86CPU}
*/
X86.opXCHGBP = function XCHGBP()
{
var temp = this.regEAX;
this.regEAX = (I386? (this.regEAX & ~this.dataMask) | (this.regEBP & this.dataMask) : this.regEBP);
this.regEBP = (I386? (this.regEBP & ~this.dataMask) | (temp & this.dataMask) : temp);
if (BACKTRACK) {
temp = this.backTrack.btiAL; this.backTrack.btiAL = this.backTrack.btiBPLo; this.backTrack.btiBPLo = temp;
temp = this.backTrack.btiAH; this.backTrack.btiAH = this.backTrack.btiBPHi; this.backTrack.btiBPHi = temp;
}
this.nStepCycles -= 3; // this form of XCHG takes 3 cycles on all CPUs
};
/**
* op=0x96 (XCHG AX,SI)
*
* @this {X86CPU}
*/
X86.opXCHGSI = function XCHGSI()
{
var temp = this.regEAX;
this.regEAX = (I386? (this.regEAX & ~this.dataMask) | (this.regESI & this.dataMask) : this.regESI);
this.regESI = (I386? (this.regESI & ~this.dataMask) | (temp & this.dataMask) : temp);
if (BACKTRACK) {
temp = this.backTrack.btiAL; this.backTrack.btiAL = this.backTrack.btiSILo; this.backTrack.btiSILo = temp;
temp = this.backTrack.btiAH; this.backTrack.btiAH = this.backTrack.btiSIHi; this.backTrack.btiSIHi = temp;
}
this.nStepCycles -= 3; // this form of XCHG takes 3 cycles on all CPUs
};
/**
* op=0x97 (XCHG AX,DI)
*
* @this {X86CPU}
*/
X86.opXCHGDI = function XCHGDI()
{
var temp = this.regEAX;
this.regEAX = (I386? (this.regEAX & ~this.dataMask) | (this.regEDI & this.dataMask) : this.regEDI);
this.regEDI = (I386? (this.regEDI & ~this.dataMask) | (temp & this.dataMask) : temp);
if (BACKTRACK) {
temp = this.backTrack.btiAL; this.backTrack.btiAL = this.backTrack.btiDILo; this.backTrack.btiDILo = temp;
temp = this.backTrack.btiAH; this.backTrack.btiAH = this.backTrack.btiDIHi; this.backTrack.btiDIHi = temp;
}
this.nStepCycles -= 3; // this form of XCHG takes 3 cycles on all CPUs
};
/**
* op=0x98 (CBW/CWDE)
*
* NOTE: The 16-bit form (CBW) sign-extends AL into AX, whereas the 32-bit form (CWDE) sign-extends AX into EAX;
* CWDE is similar to CWD, except that the destination is EAX rather than DX:AX.
*
* @this {X86CPU}
*/
X86.opCBW = function CBW()
{
if (this.dataSize == 2) { // CBW
this.regEAX = (this.regEAX & ~0xffff) | (((this.regEAX << 24) >> 24) & 0xffff);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiAL;
}
else { // CWDE
this.regEAX = ((this.regEAX << 16) >> 16);
}
this.nStepCycles -= 2; // CBW takes 2 cycles on all CPUs through 80286
};
/**
* op=0x99 (CWD/CDQ)
*
* NOTE: The 16-bit form (CWD) sign-extends AX, producing a 32-bit result in DX:AX, while the 32-bit form (CDQ)
* sign-extends EAX, producing a 64-bit result in EDX:EAX.
*
* @this {X86CPU}
*/
X86.opCWD = function CWD()
{
if (this.dataSize == 2) { // CWD
this.regEDX = (this.regEDX & ~0xffff) | ((this.regEAX & 0x8000)? 0xffff : 0);
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiDH = this.backTrack.btiAH;
}
else { // CDQ
this.regEDX = (this.regEAX & (0x80000000|0))? -1 : 0;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesCWD;
};
/**
* op=0x9A (CALL seg:off)
*
* @this {X86CPU}
*/
X86.opCALLF = function CALLF()
{
X86.fnCALLF.call(this, this.getIPWord(), this.getIPShort());
this.nStepCycles -= this.cycleCounts.nOpCyclesCallF;
};
/**
* op=0x9B (WAIT)
*
* @this {X86CPU}
*/
X86.opWAIT = function WAIT()
{
this.printMessage("WAIT not implemented");
this.nStepCycles--;
};
/**
* op=0x9C (PUSHF)
*
* @this {X86CPU}
*/
X86.opPUSHF = function PUSHF()
{
this.pushWord(this.getPS());
this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
};
/**
* op=0x9D (POPF)
*
* @this {X86CPU}
*/
X86.opPOPF = function POPF()
{
this.setPS(this.popWord());
/*
* NOTE: I'm assuming that neither POPF nor IRET are required to set NOINTR like STI does.
*/
this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
};
/**
* op=0x9E (SAHF)
*
* @this {X86CPU}
*/
X86.opSAHF = function SAHF()
{
/*
* NOTE: While it make seem more efficient to do this:
*
* this.setPS((this.getPS() & ~X86.PS_SAHF) | ((this.regEAX >> 8) & X86.PS_SAHF));
*
* getPS() forces any "cached" flags to be resolved first, and setPS() must do extra work above
* and beyond setting the arithmetic and logical flags, so on balance, the code below may be more
* efficient, and may also avoid unexpected side-effects of updating the entire PS register.
*/
var ah = (this.regEAX >> 8) & 0xff;
if (ah & X86.PS.CF) this.setCF(); else this.clearCF();
if (ah & X86.PS.PF) this.setPF(); else this.clearPF();
if (ah & X86.PS.AF) this.setAF(); else this.clearAF();
if (ah & X86.PS.ZF) this.setZF(); else this.clearZF();
if (ah & X86.PS.SF) this.setSF(); else this.clearSF();
this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
this.assert((this.getPS() & X86.PS_SAHF) == (ah & X86.PS_SAHF));
};
/**
* op=0x9F (LAHF)
*
* @this {X86CPU}
*/
X86.opLAHF = function LAHF()
{
this.regEAX = (this.regEAX & ~0xff00) | (this.getPS() & X86.PS_SAHF) << 8;
this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
};
/**
* op=0xA0 (MOV AL,mem)
*
* @this {X86CPU}
*/
X86.opMOVALm = function MOVALm()
{
this.regEAX = (this.regEAX & ~0xff) | this.getSOByte(this.segData, this.getIPAddr());
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
this.nStepCycles -= this.cycleCounts.nOpCyclesMovAM;
};
/**
* op=0xA1 (MOV [E]AX,mem)
*
* @this {X86CPU}
*/
X86.opMOVAXm = function MOVAXm()
{
this.regEAX = (this.regEAX & ~this.dataMask) | this.getSOWord(this.segData, this.getIPAddr());
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesMovAM;
};
/**
* op=0xA2 (MOV mem,AL)
*
* @this {X86CPU}
*/
X86.opMOVmAL = function MOVmAL()
{
if (BACKTRACK) this.backTrack.btiMemLo = this.backTrack.btiAL;
/*
* setSOByte() truncates the value as appropriate
*/
this.setSOByte(this.segData, this.getIPAddr(), this.regEAX);
this.nStepCycles -= this.cycleCounts.nOpCyclesMovMA;
};
/**
* op=0xA3 (MOV mem,AX)
*
* @this {X86CPU}
*/
X86.opMOVmAX = function MOVmAX()
{
if (BACKTRACK) {
this.backTrack.btiMemLo = this.backTrack.btiAL; this.backTrack.btiMemHi = this.backTrack.btiAH;
}
/*
* setSOWord() truncates the value as appropriate
*/
this.setSOWord(this.segData, this.getIPAddr(), this.regEAX);
this.nStepCycles -= this.cycleCounts.nOpCyclesMovMA;
};
/**
* op=0xA4 (MOVSB)
*
* @this {X86CPU}
*/
X86.opMOVSb = function MOVSb()
{
var nReps = 1;
var nDelta = 0;
var nCycles = this.cycleCounts.nOpCyclesMovS;
if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
nReps = this.regECX & this.addrMask;
nDelta = 1;
nCycles = this.cycleCounts.nOpCyclesMovSrn;
if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesMovSr0;
}
if (nReps--) {
var nInc = ((this.regPS & X86.PS.DF)? -1 : 1);
this.setSOByte(this.segES, this.regEDI & this.addrMask, this.getSOByte(this.segData, this.regESI));
this.regESI = (this.regESI & ~this.addrMask) | ((this.regESI + nInc) & this.addrMask);
this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + nInc) & this.addrMask);
this.nStepCycles -= nCycles;
this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
if (nReps) {
if (BUGS_8086) {
this.rewindIP(((this.opPrefixes & X86.OPFLAG.SEG)? -3 : -2));
this.assert(this.regLIP == this.opLIP);
} else {
this.regLIP = this.opLIP;
}
this.opFlags |= X86.OPFLAG.REPEAT;
}
}
};
/**
* op=0xA5 (MOVSW)
*
* @this {X86CPU}
*/
X86.opMOVSw = function MOVSw()
{
var nReps = 1;
var nDelta = 0;
var nCycles = this.cycleCounts.nOpCyclesMovS;
if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
nReps = this.regECX & this.addrMask;
nDelta = 1;
nCycles = this.cycleCounts.nOpCyclesMovSrn;
if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesMovSr0;
}
if (nReps--) {
var nInc = ((this.regPS & X86.PS.DF)? -this.dataSize : this.dataSize);
this.setSOWord(this.segES, this.regEDI & this.addrMask, this.getSOWord(this.segData, this.regESI));
this.regESI = (this.regESI & ~this.addrMask) | ((this.regESI + nInc) & this.addrMask);
this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + nInc) & this.addrMask);
this.nStepCycles -= nCycles;
this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
if (nReps) {
if (BUGS_8086) {
this.rewindIP(((this.opPrefixes & X86.OPFLAG.SEG)? -3 : -2));
this.assert(this.regLIP == this.opLIP);
} else {
this.regLIP = this.opLIP;
}
this.opFlags |= X86.OPFLAG.REPEAT;
}
}
};
/**
* op=0xA6 (CMPSB)
*
* @this {X86CPU}
*/
X86.opCMPSb = function CMPSb()
{
var nReps = 1;
var nDelta = 0;
var nCycles = this.cycleCounts.nOpCyclesCmpS;
if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
nReps = this.regECX & this.addrMask;
nDelta = 1;
nCycles = this.cycleCounts.nOpCyclesCmpSrn;
if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesCmpSr0;
}
if (nReps--) {
var nInc = ((this.regPS & X86.PS.DF)? -1 : 1);
var bDst = this.getEAByte(this.segData, this.regESI & this.addrMask);
var bSrc = this.modEAByte(this.segES, this.regEDI & this.addrMask);
X86.fnCMPb.call(this, bDst, bSrc);
this.regESI = (this.regESI & ~this.addrMask) | ((this.regESI + nInc) & this.addrMask);
this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + nInc) & this.addrMask);
/*
* NOTE: As long as we're calling fnCMPb(), all our cycle times must be reduced by nOpCyclesArithRM
*/
this.nStepCycles -= nCycles - this.cycleCounts.nOpCyclesArithRM;
this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
/*
* Repetition continues while ZF matches bit 0 of the REP prefix. getZF() returns 0x40 if ZF is
* set, and OP_REPZ (which represents the REP prefix whose bit 0 is set) is 0x40 as well, so when those
* two values are equal, we must continue.
*/
if (nReps && this.getZF() == (this.opPrefixes & X86.OPFLAG.REPZ)) {
if (BUGS_8086) {
this.rewindIP(((this.opPrefixes & X86.OPFLAG.SEG)? -3 : -2));
this.assert(this.regLIP == this.opLIP);
} else {
this.regLIP = this.opLIP;
}
this.opFlags |= X86.OPFLAG.REPEAT;
}
}
};
/**
* op=0xA7 (CMPSW)
*
* @this {X86CPU}
*/
X86.opCMPSw = function CMPSw()
{
var nReps = 1;
var nDelta = 0;
var nCycles = this.cycleCounts.nOpCyclesCmpS;
if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
nReps = this.regECX & this.addrMask;
nDelta = 1;
nCycles = this.cycleCounts.nOpCyclesCmpSrn;
if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesCmpSr0;
}
if (nReps--) {
var nInc = ((this.regPS & X86.PS.DF)? -this.dataSize : this.dataSize);
var wDst = this.getEAWord(this.segData, this.regESI & this.addrMask);
var wSrc = this.modEAWord(this.segES, this.regEDI & this.addrMask);
X86.fnCMPw.call(this, wDst, wSrc);
this.regESI = (this.regESI & ~this.addrMask) | ((this.regESI + nInc) & this.addrMask);
this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + nInc) & this.addrMask);
/*
* NOTE: As long as we're calling fnCMPw(), all our cycle times must be reduced by nOpCyclesArithRM
*/
this.nStepCycles -= nCycles - this.cycleCounts.nOpCyclesArithRM;
this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
/*
* Repetition continues while ZF matches bit 0 of the REP prefix. getZF() returns 0x40 if ZF is
* set, and OP_REPZ (which represents the REP prefix whose bit 0 is set) is 0x40 as well, so when those
* two values are equal, we must continue.
*/
if (nReps && this.getZF() == (this.opPrefixes & X86.OPFLAG.REPZ)) {
if (BUGS_8086) {
this.rewindIP(((this.opPrefixes & X86.OPFLAG.SEG)? -3 : -2));
this.assert(this.regLIP == this.opLIP);
} else {
this.regLIP = this.opLIP;
}
this.opFlags |= X86.OPFLAG.REPEAT;
}
}
};
/**
* op=0xA8 (TEST AL,imm8)
*
* @this {X86CPU}
*/
X86.opTESTALb = function TESTALb()
{
this.setLogicResult(this.regEAX & this.getIPByte(), X86.RESULT.BYTE);
this.nStepCycles -= this.cycleCounts.nOpCyclesAAA;
};
/**
* op=0xA9 (TEST [E]AX,imm)
*
* @this {X86CPU}
*/
X86.opTESTAX = function TESTAX()
{
this.setLogicResult(this.regEAX & this.getIPWord(), this.dataType);
this.nStepCycles -= this.cycleCounts.nOpCyclesAAA;
};
/**
* op=0xAA (STOSB)
*
* NOTES: Segment overrides are ignored for this instruction, so we must use segES instead of segData.
*
* @this {X86CPU}
*/
X86.opSTOSb = function STOSb()
{
var nReps = 1;
var nDelta = 0;
var nCycles = this.cycleCounts.nOpCyclesStoS;
if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
nReps = this.regECX & this.addrMask;
nDelta = 1;
nCycles = this.cycleCounts.nOpCyclesStoSrn;
if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesStoSr0;
}
if (nReps--) {
if (BACKTRACK) this.backTrack.btiMemLo = this.backTrack.btiAL;
this.setSOByte(this.segES, this.regEDI & this.addrMask, this.regEAX);
this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + ((this.regPS & X86.PS.DF)? -1 : 1)) & this.addrMask);
this.nStepCycles -= nCycles;
this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
if (nReps) {
if (BUGS_8086) {
this.rewindIP(-2); // this instruction does not support multiple overrides
this.assert(this.regLIP == this.opLIP);
} else {
this.regLIP = this.opLIP;
}
this.opFlags |= X86.OPFLAG.REPEAT;
}
}
};
/**
* op=0xAB (STOSW)
*
* NOTES: Segment overrides are ignored for this instruction, so we must use segES instead of segData.
*
* @this {X86CPU}
*/
X86.opSTOSw = function STOSw()
{
var nReps = 1;
var nDelta = 0;
var nCycles = this.cycleCounts.nOpCyclesStoS;
if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
nReps = this.regECX & this.addrMask;
nDelta = 1;
nCycles = this.cycleCounts.nOpCyclesStoSrn;
if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesStoSr0;
}
if (nReps--) {
/*
* NOTE: Storing a word imposes another 4-cycle penalty on the 8088, so consider that
* if you think the cycle times here are too high.
*/
if (BACKTRACK) {
this.backTrack.btiMemLo = this.backTrack.btiAL; this.backTrack.btiMemHi = this.backTrack.btiAH;
}
this.setSOWord(this.segES, this.regEDI & this.addrMask, this.regEAX);
this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + ((this.regPS & X86.PS.DF)? -this.dataSize : this.dataSize)) & this.addrMask);
this.nStepCycles -= nCycles;
this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
if (nReps) {
if (BUGS_8086) {
this.rewindIP(-2); // this instruction does not support multiple overrides
this.assert(this.regLIP == this.opLIP);
} else {
this.regLIP = this.opLIP;
}
this.opFlags |= X86.OPFLAG.REPEAT;
}
}
};
/**
* op=0xAC (LODSB)
*
* @this {X86CPU}
*/
X86.opLODSb = function LODSb()
{
var nReps = 1;
var nDelta = 0;
var nCycles = this.cycleCounts.nOpCyclesLodS;
if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
nReps = this.regECX & this.addrMask;
nDelta = 1;
nCycles = this.cycleCounts.nOpCyclesLodSrn;
if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesLodSr0;
}
if (nReps--) {
this.regEAX = (this.regEAX & ~0xff) | this.getSOByte(this.segData, this.regESI & this.addrMask);
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
this.regESI = (this.regESI & ~this.addrMask) | ((this.regESI + ((this.regPS & X86.PS.DF)? -1 : 1)) & this.addrMask);
this.nStepCycles -= nCycles;
this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
if (nReps) {
if (BUGS_8086) {
this.rewindIP(((this.opPrefixes & X86.OPFLAG.SEG)? -3 : -2));
this.assert(this.regLIP == this.opLIP);
} else {
this.regLIP = this.opLIP;
}
this.opFlags |= X86.OPFLAG.REPEAT;
}
}
};
/**
* op=0xAD (LODSW)
*
* @this {X86CPU}
*/
X86.opLODSw = function LODSw()
{
var nReps = 1;
var nDelta = 0;
var nCycles = this.cycleCounts.nOpCyclesLodS;
if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
nReps = this.regECX & this.addrMask;
nDelta = 1;
nCycles = this.cycleCounts.nOpCyclesLodSrn;
if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesLodSr0;
}
if (nReps--) {
this.regEAX = (this.regEAX & ~this.dataMask) | this.getSOWord(this.segData, this.regESI & this.addrMask);
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
}
this.regESI = (this.regESI & ~this.addrMask) | ((this.regESI + ((this.regPS & X86.PS.DF)? -this.dataSize : this.dataSize)) & this.addrMask);
this.nStepCycles -= nCycles;
this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
if (nReps) {
if (BUGS_8086) {
this.rewindIP(((this.opPrefixes & X86.OPFLAG.SEG)? -3 : -2));
this.assert(this.regLIP == this.opLIP);
} else {
this.regLIP = this.opLIP;
}
this.opFlags |= X86.OPFLAG.REPEAT;
}
}
};
/**
* op=0xAE (SCASB)
*
* @this {X86CPU}
*/
X86.opSCASb = function SCASb()
{
var nReps = 1;
var nDelta = 0;
var nCycles = this.cycleCounts.nOpCyclesScaS;
if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
nReps = this.regECX & this.addrMask;
nDelta = 1;
nCycles = this.cycleCounts.nOpCyclesScaSrn;
if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesScaSr0;
}
if (nReps--) {
X86.fnCMPb.call(this, this.regEAX & 0xff, this.modEAByte(this.segES, this.regEDI & this.addrMask));
this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + ((this.regPS & X86.PS.DF)? -1 : 1)) & this.addrMask);
/*
* NOTE: As long as we're calling fnCMPb(), all our cycle times must be reduced by nOpCyclesArithRM
*/
this.nStepCycles -= nCycles - this.cycleCounts.nOpCyclesArithRM;
this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
/*
* Repetition continues while ZF matches bit 0 of the REP prefix. getZF() returns 0x40 if ZF is
* set, and OP_REPZ (which represents the REP prefix whose bit 0 is set) is 0x40 as well, so when those
* two values are equal, we must continue.
*/
if (nReps && this.getZF() == (this.opPrefixes & X86.OPFLAG.REPZ)) {
if (BUGS_8086) {
this.rewindIP(-2); // this instruction does not support multiple overrides
this.assert(this.regLIP == this.opLIP);
} else {
this.regLIP = this.opLIP;
}
this.opFlags |= X86.OPFLAG.REPEAT;
}
}
};
/**
* op=0xAF (SCASW)
*
* @this {X86CPU}
*/
X86.opSCASw = function SCASw()
{
var nReps = 1;
var nDelta = 0;
var nCycles = this.cycleCounts.nOpCyclesScaS;
if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
nReps = this.regECX & this.addrMask;
nDelta = 1;
nCycles = this.cycleCounts.nOpCyclesScaSrn;
if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesScaSr0;
}
if (nReps--) {
X86.fnCMPw.call(this, this.regEAX & this.dataMask, this.modEAWord(this.segES, this.regEDI & this.addrMask));
this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + ((this.regPS & X86.PS.DF)? -this.dataSize : this.dataSize)) & this.addrMask);
/*
* NOTE: As long as we're calling fnCMPw(), all our cycle times must be reduced by nOpCyclesArithRM
*/
this.nStepCycles -= nCycles - this.cycleCounts.nOpCyclesArithRM;
this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
/*
* Repetition continues while ZF matches bit 0 of the REP prefix. getZF() returns 0x40 if ZF is
* set, and OP_REPZ (which represents the REP prefix whose bit 0 is set) is 0x40 as well, so when those
* two values are equal, we must continue.
*/
if (nReps && this.getZF() == (this.opPrefixes & X86.OPFLAG.REPZ)) {
if (BUGS_8086) {
this.rewindIP(-2); // this instruction does not support multiple overrides
this.assert(this.regLIP == this.opLIP);
} else {
this.regLIP = this.opLIP;
}
this.opFlags |= X86.OPFLAG.REPEAT;
}
}
};
/**
* op=0xB0 (MOV AL,imm8)
*
* @this {X86CPU}
*/
X86.opMOVALb = function MOVALb()
{
this.regEAX = (this.regEAX & ~0xff) | this.getIPByte();
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
};
/**
* op=0xB1 (MOV CL,imm8)
*
* @this {X86CPU}
*/
X86.opMOVCLb = function MOVCLb()
{
this.regECX = (this.regECX & ~0xff) | this.getIPByte();
if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiMemLo;
this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
};
/**
* op=0xB2 (MOV DL,imm8)
*
* @this {X86CPU}
*/
X86.opMOVDLb = function MOVDLb()
{
this.regEDX = (this.regEDX & ~0xff) | this.getIPByte();
if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiMemLo;
this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
};
/**
* op=0xB3 (MOV BL,imm8)
*
* @this {X86CPU}
*/
X86.opMOVBLb = function MOVBLb()
{
this.regEBX = (this.regEBX & ~0xff) | this.getIPByte();
if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiMemLo;
this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
};
/**
* op=0xB4 (MOV AH,imm8)
*
* @this {X86CPU}
*/
X86.opMOVAHb = function MOVAHb()
{
this.regEAX = (this.regEAX & 0xff) | (this.getIPByte() << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiMemLo;
this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
};
/**
* op=0xB5 (MOV CH,imm8)
*
* @this {X86CPU}
*/
X86.opMOVCHb = function MOVCHb()
{
this.regECX = (this.regECX & 0xff) | (this.getIPByte() << 8);
if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiMemLo;
this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
};
/**
* op=0xB6 (MOV DH,imm8)
*
* @this {X86CPU}
*/
X86.opMOVDHb = function MOVDHb()
{
this.regEDX = (this.regEDX & 0xff) | (this.getIPByte() << 8);
if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiMemLo;
this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
};
/**
* op=0xB7 (MOV BH,imm8)
*
* @this {X86CPU}
*/
X86.opMOVBHb = function MOVBHb()
{
this.regEBX = (this.regEBX & 0xff) | (this.getIPByte() << 8);
if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiMemLo;
this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
};
/**
* op=0xB8 (MOV [E]AX,imm)
*
* @this {X86CPU}
*/
X86.opMOVAX = function MOVAX()
{
this.regEAX = (this.regEAX & ~this.dataMask) | this.getIPWord();
if (BACKTRACK) {
this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
};
/**
* op=0xB9 (MOV [E]CX,imm)
*
* @this {X86CPU}
*/
X86.opMOVCX = function MOVCX()
{
this.regECX = (this.regECX & ~this.dataMask) | this.getIPWord();
if (BACKTRACK) {
this.backTrack.btiCL = this.backTrack.btiMemLo; this.backTrack.btiCH = this.backTrack.btiMemHi;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
};
/**
* op=0xBA (MOV [E]DX,imm)
*
* @this {X86CPU}
*/
X86.opMOVDX = function MOVDX()
{
this.regEDX = (this.regEDX & ~this.dataMask) | this.getIPWord();
if (BACKTRACK) {
this.backTrack.btiDL = this.backTrack.btiMemLo; this.backTrack.btiDH = this.backTrack.btiMemHi;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
};
/**
* op=0xBB (MOV [E]BX,imm)
*
* @this {X86CPU}
*/
X86.opMOVBX = function MOVBX()
{
this.regEBX = (this.regEBX & ~this.dataMask) | this.getIPWord();
if (BACKTRACK) {
this.backTrack.btiBL = this.backTrack.btiMemLo; this.backTrack.btiBH = this.backTrack.btiMemHi;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
};
/**
* op=0xBC (MOV [E]SP,imm)
*
* @this {X86CPU}
*/
X86.opMOVSP = function MOVSP()
{
this.setSP((this.getSP() & ~this.dataMask) | this.getIPWord());
this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
};
/**
* op=0xBD (MOV [E]BP,imm)
*
* @this {X86CPU}
*/
X86.opMOVBP = function MOVBP()
{
this.regEBP = (this.regEBP & ~this.dataMask) | this.getIPWord();
if (BACKTRACK) {
this.backTrack.btiBPLo = this.backTrack.btiMemLo; this.backTrack.btiBPHi = this.backTrack.btiMemHi;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
};
/**
* op=0xBE (MOV [E]SI,imm)
*
* @this {X86CPU}
*/
X86.opMOVSI = function MOVSI()
{
this.regESI = (this.regESI & ~this.dataMask) | this.getIPWord();
if (BACKTRACK) {
this.backTrack.btiSILo = this.backTrack.btiMemLo; this.backTrack.btiSIHi = this.backTrack.btiMemHi;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
};
/**
* op=0xBF (MOV [E]DI,imm)
*
* @this {X86CPU}
*/
X86.opMOVDI = function MOVDI()
{
this.regEDI = (this.regEDI & ~this.dataMask) | this.getIPWord();
if (BACKTRACK) {
this.backTrack.btiDILo = this.backTrack.btiMemLo; this.backTrack.btiDIHi = this.backTrack.btiMemHi;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
};
/**
* op=0xC0 (GRP2 byte,imm8) (80186/80188 and up)
*
* @this {X86CPU}
*/
X86.opGRP2bn = function GRP2bn()
{
this.aOpModGrpByte[this.getIPByte()].call(this, X86.aOpGrp2b, X86.fnSrcCountN);
};
/**
* op=0xC1 (GRP2 word,imm) (80186/80188 and up)
*
* @this {X86CPU}
*/
X86.opGRP2wn = function GRP2wn()
{
this.aOpModGrpWord[this.getIPByte()].call(this, this.dataSize == 2? X86.aOpGrp2w : X86.aOpGrp2d, X86.fnSrcCountN);
};
/**
* op=0xC2 (RET n)
*
* @this {X86CPU}
*/
X86.opRETn = function RETn()
{
var n = this.getIPShort() << (this.dataSize >> 2);
var newIP = this.popWord();
if (DEBUG) this.printMessage(" returning to " + str.toHex(this.segCS.sel, 4) + ':' + str.toHex(newIP, this.dataSize << 1), this.bitsMessage, true);
this.setIP(newIP);
if (n) this.setSP(this.getSP() + n); // TODO: optimize
this.nStepCycles -= this.cycleCounts.nOpCyclesRetn;
};
/**
* op=0xC3 (RET)
*
* @this {X86CPU}
*/
X86.opRET = function RET()
{
var newIP = this.popWord();
if (DEBUG) this.printMessage(" returning to " + str.toHex(this.segCS.sel, 4) + ':' + str.toHex(newIP, this.dataSize << 1), this.bitsMessage, true);
this.setIP(newIP);
this.nStepCycles -= this.cycleCounts.nOpCyclesRet;
};
/**
* op=0xC4 (LES reg,word)
*
* This is like a "MOV reg,rm" operation, but it also loads ES from the next word.
*
* @this {X86CPU}
*/
X86.opLES = function LES()
{
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnLES);
};
/**
* op=0xC5 (LDS reg,word)
*
* This is like a "MOV reg,rm" operation, but it also loads DS from the next word.
*
* @this {X86CPU}
*/
X86.opLDS = function LDS()
{
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnLDS);
};
/**
* op=0xC6 (MOV byte,imm8)
*
* @this {X86CPU}
*/
X86.opMOVb = function MOVb()
{
/*
* Like other MOV operations, the destination does not need to be read, just written.
*/
this.opFlags |= X86.OPFLAG.NOREAD;
this.aOpModGrpByte[this.getIPByte()].call(this, X86.aOpGrpMOVn, this.getIPByte);
};
/**
* op=0xC7 (MOV word,imm)
*
* @this {X86CPU}
*/
X86.opMOVw = function MOVw()
{
/*
* Like other MOV operations, the destination does not need to be read, just written.
*/
this.opFlags |= X86.OPFLAG.NOREAD;
this.aOpModGrpWord[this.getIPByte()].call(this, X86.aOpGrpMOVn, this.getIPWord);
};
/**
* op=0xC8 (ENTER imm16,imm8) (80186/80188 and up)
*
* @this {X86CPU}
*/
X86.opENTER = function ENTER()
{
var wLocal = this.getIPShort();
var bLevel = this.getIPByte() & 0x1f;
/*
* NOTE: 11 is the minimum cycle time for the 80286; the 80186/80188 has different cycle times: 15, 25 and
* 22 + 16 * (bLevel - 1) for bLevel 0, 1 and > 1, respectively. TODO: Fix this someday.
*/
this.nStepCycles -= 11;
this.pushWord(this.regEBP);
var wFrame = this.getSP() & this.dataMask;
if (bLevel > 0) {
this.nStepCycles -= (bLevel << 2) + (bLevel > 1? 1 : 0);
while (--bLevel) {
this.regEBP = (this.regEBP & ~this.dataMask) | ((this.regEBP - this.dataSize) & this.dataMask);
this.pushWord(this.getSOWord(this.segSS, this.regEBP & this.dataMask));
}
this.pushWord(wFrame);
}
this.regEBP = (this.regEBP & ~this.dataMask) | wFrame;
this.setSP((this.getSP() & ~this.segSS.addrMask) | ((this.getSP() - wLocal) & this.segSS.addrMask));
};
/**
* op=0xC9 (LEAVE) (80186/80188 and up)
*
* @this {X86CPU}
*/
X86.opLEAVE = function LEAVE()
{
this.setSP((this.getSP() & ~this.segSS.addrMask) | (this.regEBP & this.segSS.addrMask));
this.regEBP = (this.regEBP & ~this.dataMask) | (this.popWord() & this.dataMask);
/*
* NOTE: 5 is the cycle time for the 80286; the 80186/80188 has a cycle time of 8. TODO: Fix this someday.
*/
this.nStepCycles -= 5;
};
/**
* op=0xCA (RETF n)
*
* @this {X86CPU}
*/
X86.opRETFn = function RETFn()
{
X86.fnRETF.call(this, this.getIPShort());
this.nStepCycles -= this.cycleCounts.nOpCyclesRetFn;
};
/**
* op=0xCB (RETF)
*
* @this {X86CPU}
*/
X86.opRETF = function RETF()
{
X86.fnRETF.call(this, 0);
this.nStepCycles -= this.cycleCounts.nOpCyclesRetF;
};
/**
* op=0xCC (INT 3)
*
* @this {X86CPU}
*/
X86.opINT3 = function INT3()
{
X86.fnINT.call(this, X86.EXCEPTION.BREAKPOINT, null, this.cycleCounts.nOpCyclesInt3D);
};
/**
* op=0xCD (INT n)
*
* @this {X86CPU}
*/
X86.opINTn = function INTn()
{
var nInt = this.getIPByte();
if (this.checkIntNotify(nInt)) {
X86.fnINT.call(this, nInt, null, 0);
return;
}
this.nStepCycles--; // we don't need to assess the full cost of nOpCyclesInt, but we need to assess something...
};
/**
* op=0xCE (INTO: INT 4 if OF set)
*
* @this {X86CPU}
*/
X86.opINTO = function INTO()
{
if (this.getOF()) {
X86.fnINT.call(this, X86.EXCEPTION.OVERFLOW, null, this.cycleCounts.nOpCyclesIntOD);
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesIntOFall;
};
/**
* op=0xCF (IRET)
*
* @this {X86CPU}
*/
X86.opIRET = function IRET()
{
X86.fnIRET.call(this);
};
/**
* op=0xD0 (GRP2 byte,1)
*
* @this {X86CPU}
*/
X86.opGRP2b1 = function GRP2b1()
{
this.aOpModGrpByte[this.getIPByte()].call(this, X86.aOpGrp2b, X86.fnSrcCount1);
};
/**
* op=0xD1 (GRP2 word,1)
*
* @this {X86CPU}
*/
X86.opGRP2w1 = function GRP2w1()
{
this.aOpModGrpWord[this.getIPByte()].call(this, this.dataSize == 2? X86.aOpGrp2w : X86.aOpGrp2d, X86.fnSrcCount1);
};
/**
* op=0xD2 (GRP2 byte,CL)
*
* @this {X86CPU}
*/
X86.opGRP2bCL = function GRP2bCL()
{
this.aOpModGrpByte[this.getIPByte()].call(this, X86.aOpGrp2b, X86.fnSrcCountCL);
};
/**
* op=0xD3 (GRP2 word,CL)
*
* @this {X86CPU}
*/
X86.opGRP2wCL = function GRP2wCL()
{
this.aOpModGrpWord[this.getIPByte()].call(this, this.dataSize == 2? X86.aOpGrp2w : X86.aOpGrp2d, X86.fnSrcCountCL);
};
/**
* op=0xD4 0x0A (AAM)
*
* From "The 8086 Book":
*
* 1. Divide AL by 0x0A; store the quotient in AH and the remainder in AL
* 2. Set PF, SF, and ZF based on the AL register (CF, OF, and AF are undefined)
*
* @this {X86CPU}
*/
X86.opAAM = function AAM()
{
var bDivisor = this.getIPByte();
if (!bDivisor) {
/*
* TODO: Generate a divide-by-zero exception, if appropriate for the current CPU
*/
return;
}
var AL = this.regEAX & 0xff;
this.regEAX = (this.regEAX & ~0xffff) | ((AL / bDivisor) << 8) | (AL % bDivisor);
/*
* setLogicResult() is slightly overkill, because technically, we don't need to clear CF and OF....
*/
this.setLogicResult(this.regEAX, X86.RESULT.BYTE);
this.nStepCycles -= this.cycleCounts.nOpCyclesAAM;
};
/**
* op=0xD5 (AAD)
*
* From "The 8086 Book":
*
* 1. Multiply AH by 0x0A, add AH to AL, and store 0x00 in AH
* 2. Set PF, SF, and ZF based on the AL register (CF, OF, and AF are undefined)
*
* @this {X86CPU}
*/
X86.opAAD = function AAD()
{
var bMultiplier = this.getIPByte();
this.regEAX = (this.regEAX & ~0xffff) | (((((this.regEAX >> 8) & 0xff) * bMultiplier) + this.regEAX) & 0xff);
/*
* setLogicResult() is slightly overkill, because technically, we don't need to clear CF and OF....
*/
this.setLogicResult(this.regEAX, X86.RESULT.BYTE);
this.nStepCycles -= this.cycleCounts.nOpCyclesAAD;
};
/**
* op=0xD6 (SALC aka SETALC) (undocumented until Pentium Pro)
*
* Sets AL to 0xFF if CF=1, 0x00 otherwise; no flags are affected (similar to SBB AL,AL, but without side-effects)
*
* WARNING: I have no idea how many clocks this instruction originally required, so for now, I'm going with a minimum of 2.
*
* @this {X86CPU}
*/
X86.opSALC = function SALC()
{
this.regEAX = (this.regEAX & ~0xff) | (this.getCF()? 0xFF : 0);
this.nStepCycles -= 2;
};
/**
* op=0xD7 (XLAT)
*
* @this {X86CPU}
*/
X86.opXLAT = function XLAT()
{
/*
* NOTE: I have no idea whether XLAT actually wraps the 16-bit address calculation;
* I'm masking it as if it does, but I need to run a test on real hardware to be sure.
*/
this.regEAX = (this.regEAX & ~0xff) | this.getEAByte(this.segData, ((this.regEBX + (this.regEAX & 0xff)) & 0xffff));
this.nStepCycles -= this.cycleCounts.nOpCyclesXLAT;
};
/**
* op=0xD8-0xDF (ESC)
*
* @this {X86CPU}
*/
X86.opESC = function ESC()
{
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnESC);
this.nStepCycles -= 8; // TODO: Fix
};
/**
* op=0xE0 (LOOPNZ disp)
*
* NOTE: All the instructions in this group (LOOPNZ, LOOPZ, LOOP, and JCXZ) actually
* rely on the ADDRESS override setting for determining whether CX or ECX will be used,
* even though it seems counter-intuitive; ditto for the REP prefix.
*
* @this {X86CPU}
*/
X86.opLOOPNZ = function LOOPNZ()
{
var disp = this.getIPDisp();
if ((this.regECX = (this.regECX - 1) & this.addrMask) && !this.getZF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesLoopNZ;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesLoopFall;
};
/**
* op=0xE1 (LOOPZ disp)
*
* NOTE: All the instructions in this group (LOOPNZ, LOOPZ, LOOP, and JCXZ) actually
* rely on the ADDRESS override setting for determining whether CX or ECX will be used,
* even though it seems counter-intuitive; ditto for the REP prefix.
*
* @this {X86CPU}
*/
X86.opLOOPZ = function LOOPZ()
{
var disp = this.getIPDisp();
if ((this.regECX = (this.regECX - 1) & this.addrMask) && this.getZF()) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesLoopZ;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesLoopZFall;
};
/**
* op=0xE2 (LOOP disp)
*
* NOTE: All the instructions in this group (LOOPNZ, LOOPZ, LOOP, and JCXZ) actually
* rely on the ADDRESS override setting for determining whether CX or ECX will be used,
* even though it seems counter-intuitive; ditto for the REP prefix.
*
* @this {X86CPU}
*/
X86.opLOOP = function LOOP()
{
var disp = this.getIPDisp();
if ((this.regECX = (this.regECX - 1) & this.addrMask)) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesLoop;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesLoopFall;
};
/**
* op=0xE3 (JCXZ/JECXZ disp)
*
* NOTE: All the instructions in this group (LOOPNZ, LOOPZ, LOOP, and JCXZ) actually
* rely on the ADDRESS override setting for determining whether CX or ECX will be used,
* even though it seems counter-intuitive; ditto for the REP prefix.
*
* @this {X86CPU}
*/
X86.opJCXZ = function JCXZ()
{
var disp = this.getIPDisp();
if (!(this.regECX & this.addrMask)) {
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesLoopZ;
return;
}
this.nStepCycles -= this.cycleCounts.nOpCyclesLoopZFall;
};
/**
* op=0xE4 (IN AL,port)
*
* @this {X86CPU}
*/
X86.opINb = function INb()
{
var port = this.getIPByte();
this.regEAX = (this.regEAX & ~0xff) | this.bus.checkPortInputNotify(port, this.regLIP - 2);
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiIO;
this.nStepCycles -= this.cycleCounts.nOpCyclesInP;
};
/**
* op=0xE5 (IN AX,port)
*
* @this {X86CPU}
*/
X86.opINw = function INw()
{
var port = this.getIPByte();
this.regEAX = this.bus.checkPortInputNotify(port, this.regLIP - 2);
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiIO;
this.regEAX |= (this.bus.checkPortInputNotify((port + 1) & 0xffff, this.regLIP - 2) << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiIO;
this.nStepCycles -= this.cycleCounts.nOpCyclesInP;
};
/**
* op=0xE6 (OUT port,AL)
*
* @this {X86CPU}
*/
X86.opOUTb = function OUTb()
{
var port = this.getIPByte();
this.bus.checkPortOutputNotify(port, this.regEAX & 0xff, this.regLIP - 2);
this.nStepCycles -= this.cycleCounts.nOpCyclesOutP;
};
/**
* op=0xE7 (OUT port,AX)
*
* @this {X86CPU}
*/
X86.opOUTw = function OUTw()
{
var port = this.getIPByte();
this.bus.checkPortOutputNotify(port, this.regEAX & 0xff, this.regLIP - 2);
this.bus.checkPortOutputNotify((port + 1) & 0xffff, this.regEAX >> 8, this.regLIP - 2);
this.nStepCycles -= this.cycleCounts.nOpCyclesOutP;
};
/**
* op=0xE8 (CALL disp16)
*
* @this {X86CPU}
*/
X86.opCALL = function CALL()
{
var disp = this.getIPWord();
var oldIP = this.getIP();
var newIP = oldIP + disp;
if (DEBUG) this.printMessage("calling " + str.toHex(newIP, this.dataSize << 1), this.bitsMessage, true);
this.pushWord(oldIP);
this.setIP(newIP);
this.nStepCycles -= this.cycleCounts.nOpCyclesCall;
};
/**
* op=0xE9 (JMP disp16)
*
* @this {X86CPU}
*/
X86.opJMP = function JMP()
{
var disp = this.getIPWord();
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmp;
};
/**
* op=0xEA (JMP seg:off)
*
* @this {X86CPU}
*/
X86.opJMPF = function JMPF()
{
this.setCSIP(this.getIPWord(), this.getIPShort());
this.nStepCycles -= this.cycleCounts.nOpCyclesJmpF;
};
/**
* op=0xEB (JMP short disp8)
*
* @this {X86CPU}
*/
X86.opJMPs = function JMPs()
{
var disp = this.getIPDisp();
this.setIP(this.getIP() + disp);
this.nStepCycles -= this.cycleCounts.nOpCyclesJmp;
};
/**
* op=0xEC (IN AL,dx)
*
* @this {X86CPU}
*/
X86.opINDXb = function INDXb()
{
this.regEAX = (this.regEAX & ~0xff) | this.bus.checkPortInputNotify(this.regEDX, this.regLIP - 1);
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiIO;
this.nStepCycles -= this.cycleCounts.nOpCyclesInDX;
};
/**
* op=0xED (IN AX,dx)
*
* @this {X86CPU}
*/
X86.opINDXw = function INDXw()
{
this.regEAX = this.bus.checkPortInputNotify(this.regEDX, this.regLIP - 1);
if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiIO;
this.regEAX |= (this.bus.checkPortInputNotify((this.regEDX + 1) & 0xffff, this.regLIP - 1) << 8);
if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiIO;
this.nStepCycles -= this.cycleCounts.nOpCyclesInDX;
};
/**
* op=0xEE (OUT dx,AL)
*
* @this {X86CPU}
*/
X86.opOUTDXb = function OUTDXb()
{
if (BACKTRACK) this.backTrack.btiIO = this.backTrack.btiAL;
this.bus.checkPortOutputNotify(this.regEDX, this.regEAX & 0xff, this.regLIP - 1);
this.nStepCycles -= this.cycleCounts.nOpCyclesOutDX;
};
/**
* op=0xEF (OUT dx,AX)
*
* @this {X86CPU}
*/
X86.opOUTDXw = function OUTDXw()
{
if (BACKTRACK) this.backTrack.btiIO = this.backTrack.btiAL;
this.bus.checkPortOutputNotify(this.regEDX, this.regEAX & 0xff, this.regLIP - 1);
if (BACKTRACK) this.backTrack.btiIO = this.backTrack.btiAH;
this.bus.checkPortOutputNotify((this.regEDX + 1) & 0xffff, this.regEAX >> 8, this.regLIP - 1);
this.nStepCycles -= this.cycleCounts.nOpCyclesOutDX;
};
/**
* op=0xF0 (LOCK:)
*
* @this {X86CPU}
*/
X86.opLOCK = function LOCK()
{
/*
* NOTE: The fact that we're setting NOINTR along with LOCK is really just for documentation purposes;
* the way stepCPU() is written, the presence of any prefix bypasses normal interrupt processing anyway.
*/
this.opFlags |= X86.OPFLAG.LOCK | X86.OPFLAG.NOINTR;
this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
};
/**
* op=0xF1 (INT1; undocumented; 80186/80188 and up; TODO: Verify)
*
* I still treat this as undefined, until I can verify the behavior on real hardware.
*
* @this {X86CPU}
*/
X86.opINT1 = function INT1()
{
X86.opUndefined.call(this);
};
/**
* op=0xF2 (REPNZ:) (repeat CMPS or SCAS until NZ; repeat MOVS, LODS, or STOS unconditionally)
*
* @this {X86CPU}
*/
X86.opREPNZ = function REPNZ()
{
/*
* NOTE: The fact that we're setting NOINTR along with REPNZ is really just for documentation purposes;
* the way stepCPU() is written, the presence of any prefix bypasses normal interrupt processing anyway.
*/
this.opFlags |= X86.OPFLAG.REPNZ | X86.OPFLAG.NOINTR;
this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
};
/**
* op=0xF3 (REPZ:) (repeat CMPS or SCAS until Z; repeat MOVS, LODS, or STOS unconditionally)
*
* @this {X86CPU}
*/
X86.opREPZ = function REPZ()
{
/*
* NOTE: The fact that we're setting NOINTR along with REPZ is really just for documentation purposes;
* the way stepCPU() is written, the presence of any prefix bypasses normal interrupt processing anyway.
*/
this.opFlags |= X86.OPFLAG.REPZ | X86.OPFLAG.NOINTR;
this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
};
/**
* op=0xF4 (HLT)
*
* @this {X86CPU}
*/
X86.opHLT = function HLT()
{
/*
* The CPU is never REALLY halted by a HLT instruction; instead, by setting X86.INTFLAG.HALT,
* we are signalling to stepCPU() that it's free to end the current burst AND that it should not
* execute any more instructions until checkINTR() indicates a hardware interrupt is requested.
*/
this.intFlags |= X86.INTFLAG.HALT;
this.nStepCycles -= 2;
/*
* If a Debugger is present and the HALT message category is enabled, then we REALLY halt the CPU,
* on the theory that whoever's using the Debugger would like to see HLTs.
*/
if (DEBUGGER && this.dbg && this.messageEnabled(Messages.HALT)) {
this.rewindIP(-1); // this is purely for the Debugger's benefit, to show the HLT
this.stopCPU();
return;
}
/*
* We also REALLY halt the machine if interrupts have been disabled, since that means it's dead
* in the water (we have no NMI generation mechanism at the moment).
*/
if (!this.getIF()) {
if (DEBUGGER && this.dbg) this.rewindIP(-1);
this.stopCPU();
}
};
/**
* op=0xF5 (CMC)
*
* @this {X86CPU}
*/
X86.opCMC = function CMC()
{
if (this.getCF()) this.clearCF(); else this.setCF();
this.nStepCycles -= 2; // CMC takes 2 cycles on all CPUs
};
/**
* op=0xF6 (GRP3 byte)
*
* The MUL byte instruction is problematic in two cases:
*
* 0xF6 0xE0: MUL AL
* 0xF6 0xE4: MUL AH
*
* because the OpModGrpByte decoder function will attempt to put the fnMULb() function's
* return value back into AL or AH, undoing fnMULb's update of AX. And since fnMULb doesn't
* know what the target is (only the target's value), it cannot easily work around the problem.
*
* A simple, albeit kludgy, solution is for fnMULb to always save its result in a special
* "register" (eg, regMDLo), which we will then put back into regEAX if it's been updated.
* This also relieves us from having to decode any part of the ModRM byte, so maybe it's not
* such a bad work-around after all.
*
* Similar issues with IMUL (and DIV and IDIV) are resolved using the same special variable(s).
*
* @this {X86CPU}
*/
X86.opGRP3b = function GRP3b()
{
this.fMDSet = false;
this.aOpModGrpByte[this.getIPByte()].call(this, X86.aOpGrp3b, X86.fnSrcNone);
if (this.fMDSet) this.regEAX = (this.regEAX & ~this.dataMask) | (this.regMDLo & this.dataMask);
};
/**
* op=0xF7 (GRP3 word)
*
* The MUL word instruction is problematic in two cases:
*
* 0xF7 0xE0: MUL AX
* 0xF7 0xE2: MUL DX
*
* because the OpModGrpWord decoder function will attempt to put the fnMULw() function's
* return value back into AX or DX, undoing fnMULw's update of DX:AX. And since fnMULw doesn't
* know what the target is (only the target's value), it cannot easily work around the problem.
*
* A simple, albeit kludgey, solution is for fnMULw to always save its result in a special
* "register" (eg, regMDLo/regMDHi), which we will then put back into regEAX/regEDX if it's been
* updated. This also relieves us from having to decode any part of the ModRM byte, so maybe
* it's not such a bad work-around after all.
*
* @this {X86CPU}
*/
X86.opGRP3w = function GRP3w()
{
this.fMDSet = false;
this.aOpModGrpWord[this.getIPByte()].call(this, X86.aOpGrp3w, X86.fnSrcNone);
if (this.fMDSet) {
this.regEAX = (this.regEAX & ~this.dataMask) | (this.regMDLo & this.dataMask);
this.regEDX = (this.regEDX & ~this.dataMask) | (this.regMDHi & this.dataMask);
}
};
/**
* op=0xF8 (CLC)
*
* @this {X86CPU}
*/
X86.opCLC = function CLC()
{
this.clearCF();
this.nStepCycles -= 2; // CLC takes 2 cycles on all CPUs
};
/**
* op=0xF9 (STC)
*
* @this {X86CPU}
*/
X86.opSTC = function STC()
{
this.setCF();
this.nStepCycles -= 2; // STC takes 2 cycles on all CPUs
};
/**
* op=0xFA (CLI)
*
* @this {X86CPU}
*/
X86.opCLI = function CLI()
{
this.clearIF();
this.nStepCycles -= this.cycleCounts.nOpCyclesCLI; // CLI takes LONGER on an 80286
};
/**
* op=0xFB (STI)
*
* @this {X86CPU}
*/
X86.opSTI = function STI()
{
this.setIF();
this.opFlags |= X86.OPFLAG.NOINTR;
this.nStepCycles -= 2; // STI takes 2 cycles on all CPUs
};
/**
* op=0xFC (CLD)
*
* @this {X86CPU}
*/
X86.opCLD = function CLD()
{
this.clearDF();
this.nStepCycles -= 2; // CLD takes 2 cycles on all CPUs
};
/**
* op=0xFD (STD)
*
* @this {X86CPU}
*/
X86.opSTD = function STD()
{
this.setDF();
this.nStepCycles -= 2; // STD takes 2 cycles on all CPUs
};
/**
* op=0xFE (GRP4 byte)
*
* @this {X86CPU}
*/
X86.opGRP4b = function GRP4b()
{
this.aOpModGrpByte[this.getIPByte()].call(this, X86.aOpGrp4b, X86.fnSrcNone);
};
/**
* op=0xFF (GRP4 word)
*
* @this {X86CPU}
*/
X86.opGRP4w = function GRP4w()
{
this.aOpModGrpWord[this.getIPByte()].call(this, X86.aOpGrp4w, X86.fnSrcNone);
};
/**
* opInvalid()
*
* @this {X86CPU}
*/
X86.opInvalid = function opInvalid()
{
X86.fnFault.call(this, X86.EXCEPTION.UD_FAULT);
this.stopCPU();
};
/**
* opUndefined()
*
* @this {X86CPU}
*/
X86.opUndefined = function opUndefined()
{
this.setIP(this.opLIP - this.segCS.base);
this.setError("Undefined opcode " + str.toHexByte(this.bus.getByteDirect(this.regLIP)) + " at " + str.toHexLong(this.regLIP));
this.stopCPU();
};
/**
* opTBD()
*
* @this {X86CPU}
*/
X86.opTBD = function opTBD()
{
this.setIP(this.opLIP - this.segCS.base);
this.printMessage("unimplemented 80386 opcode", true);
this.stopCPU();
};
/*
* This 256-entry array of opcode functions is at the heart of the CPU engine: stepCPU(n).
*
* It might be worth trying a switch() statement instead, to see how the performance compares,
* but I suspect that would vary quite a bit across JavaScript engines; for now, I'm putting my
* money on array lookup.
*/
X86.aOps = [
X86.opADDmb, X86.opADDmw, X86.opADDrb, X86.opADDrw, // 0x00-0x03
X86.opADDALb, X86.opADDAX, X86.opPUSHES, X86.opPOPES, // 0x04-0x07
X86.opORmb, X86.opORmw, X86.opORrb, X86.opORrw, // 0x08-0x0B
X86.opORALb, X86.opORAX, X86.opPUSHCS, X86.opPOPCS, // 0x0C-0x0F
X86.opADCmb, X86.opADCmw, X86.opADCrb, X86.opADCrw, // 0x10-0x13
X86.opADCALb, X86.opADCAX, X86.opPUSHSS, X86.opPOPSS, // 0x14-0x17
X86.opSBBmb, X86.opSBBmw, X86.opSBBrb, X86.opSBBrw, // 0x18-0x1B
X86.opSBBALb, X86.opSBBAX, X86.opPUSHDS, X86.opPOPDS, // 0x1C-0x1F
X86.opANDmb, X86.opANDmw, X86.opANDrb, X86.opANDrw, // 0x20-0x23
X86.opANDAL, X86.opANDAX, X86.opES, X86.opDAA, // 0x24-0x27
X86.opSUBmb, X86.opSUBmw, X86.opSUBrb, X86.opSUBrw, // 0x28-0x2B
X86.opSUBALb, X86.opSUBAX, X86.opCS, X86.opDAS, // 0x2C-0x2F
X86.opXORmb, X86.opXORmw, X86.opXORrb, X86.opXORrw, // 0x30-0x33
X86.opXORALb, X86.opXORAX, X86.opSS, X86.opAAA, // 0x34-0x37
X86.opCMPmb, X86.opCMPmw, X86.opCMPrb, X86.opCMPrw, // 0x38-0x3B
X86.opCMPALb, X86.opCMPAX, X86.opDS, X86.opAAS, // 0x3C-0x3F
X86.opINCAX, X86.opINCCX, X86.opINCDX, X86.opINCBX, // 0x40-0x43
X86.opINCSP, X86.opINCBP, X86.opINCSI, X86.opINCDI, // 0x44-0x47
X86.opDECAX, X86.opDECCX, X86.opDECDX, X86.opDECBX, // 0x48-0x4B
X86.opDECSP, X86.opDECBP, X86.opDECSI, X86.opDECDI, // 0x4C-0x4F
X86.opPUSHAX, X86.opPUSHCX, X86.opPUSHDX, X86.opPUSHBX, // 0x50-0x53
X86.opPUSHSP_8086, X86.opPUSHBP, X86.opPUSHSI, X86.opPUSHDI, // 0x54-0x57
X86.opPOPAX, X86.opPOPCX, X86.opPOPDX, X86.opPOPBX, // 0x58-0x5B
X86.opPOPSP, X86.opPOPBP, X86.opPOPSI, X86.opPOPDI, // 0x5C-0x5F
/*
* On an 8086/8088, opcodes 0x60-0x6F are aliases for the conditional jumps 0x70-0x7F. Sometimes you'll see
* references to these opcodes (like 0x60) being a "two-byte NOP" and using them differentiate an 8088 from newer
* CPUs, but they're only a "two-byte NOP" if the second byte is zero, resulting in zero displacement.
*/
X86.opJO, X86.opJNO, X86.opJC, X86.opJNC, // 0x60-0x63
X86.opJZ, X86.opJNZ, X86.opJBE, X86.opJNBE, // 0x64-0x67
X86.opJS, X86.opJNS, X86.opJP, X86.opJNP, // 0x68-0x6B
X86.opJL, X86.opJNL, X86.opJLE, X86.opJNLE, // 0x6C-0x6F
X86.opJO, X86.opJNO, X86.opJC, X86.opJNC, // 0x70-0x73
X86.opJZ, X86.opJNZ, X86.opJBE, X86.opJNBE, // 0x74-0x77
X86.opJS, X86.opJNS, X86.opJP, X86.opJNP, // 0x78-0x7B
X86.opJL, X86.opJNL, X86.opJLE, X86.opJNLE, // 0x7C-0x7F
/*
* On all processors, opcode groups 0x80 and 0x82 perform identically (0x82 opcodes sign-extend their
* immediate data, but since both 0x80 and 0x82 are byte operations, the sign extension has no effect).
*
* WARNING: Intel's "Pentium Processor User's Manual (Volume 3: Architecture and Programming Manual)" refers
* to opcode 0x82 as a "reserved" instruction, but also cryptically refers to it as "MOVB AL,imm". This is
* assumed to be an error in the manual, because as far as I know, 0x82 has always mirrored 0x80.
*/
X86.opGRP1b, X86.opGRP1w, X86.opGRP1b, X86.opGRP1sw, // 0x80-0x83
X86.opTESTrb, X86.opTESTrw, X86.opXCHGrb, X86.opXCHGrw, // 0x84-0x87
X86.opMOVmb, X86.opMOVmw, X86.opMOVrb, X86.opMOVrw, // 0x88-0x8B
X86.opMOVwsr, X86.opLEA, X86.opMOVsrw, X86.opPOPmw, // 0x8C-0x8F
X86.opNOP, X86.opXCHGCX, X86.opXCHGDX, X86.opXCHGBX, // 0x90-0x93
X86.opXCHGSP, X86.opXCHGBP, X86.opXCHGSI, X86.opXCHGDI, // 0x94-0x97
X86.opCBW, X86.opCWD, X86.opCALLF, X86.opWAIT, // 0x98-0x9B
X86.opPUSHF, X86.opPOPF, X86.opSAHF, X86.opLAHF, // 0x9C-0x9F
X86.opMOVALm, X86.opMOVAXm, X86.opMOVmAL, X86.opMOVmAX, // 0xA0-0xA3
X86.opMOVSb, X86.opMOVSw, X86.opCMPSb, X86.opCMPSw, // 0xA4-0xA7
X86.opTESTALb, X86.opTESTAX, X86.opSTOSb, X86.opSTOSw, // 0xA8-0xAB
X86.opLODSb, X86.opLODSw, X86.opSCASb, X86.opSCASw, // 0xAC-0xAF
X86.opMOVALb, X86.opMOVCLb, X86.opMOVDLb, X86.opMOVBLb, // 0xB0-0xB3
X86.opMOVAHb, X86.opMOVCHb, X86.opMOVDHb, X86.opMOVBHb, // 0xB4-0xB7
X86.opMOVAX, X86.opMOVCX, X86.opMOVDX, X86.opMOVBX, // 0xB8-0xBB
X86.opMOVSP, X86.opMOVBP, X86.opMOVSI, X86.opMOVDI, // 0xBC-0xBF
/*
* On an 8086/8088, opcodes 0xC0 -> 0xC2, 0xC1 -> 0xC3, 0xC8 -> 0xCA and 0xC9 -> 0xCB.
*/
X86.opRETn, X86.opRET, X86.opRETn, X86.opRET, // 0xC0-0xC3
X86.opLES, X86.opLDS, X86.opMOVb, X86.opMOVw, // 0xC4-0xC7
X86.opRETFn, X86.opRETF, X86.opRETFn, X86.opRETF, // 0xC8-0xCB
X86.opINT3, X86.opINTn, X86.opINTO, X86.opIRET, // 0xCC-0xCF
X86.opGRP2b1, X86.opGRP2w1, X86.opGRP2bCL, X86.opGRP2wCL, // 0xD0-0xD3
/*
* Even as of the Pentium, opcode 0xD6 is still marked as "reserved", but it's always been SALC (aka SETALC).
*/
X86.opAAM, X86.opAAD, X86.opSALC, X86.opXLAT, // 0xD4-0xD7
X86.opESC, X86.opESC, X86.opESC, X86.opESC, // 0xD8-0xDB
X86.opESC, X86.opESC, X86.opESC, X86.opESC, // 0xDC-0xDF
X86.opLOOPNZ, X86.opLOOPZ, X86.opLOOP, X86.opJCXZ, // 0xE0-0xE3
X86.opINb, X86.opINw, X86.opOUTb, X86.opOUTw, // 0xE4-0xE7
X86.opCALL, X86.opJMP, X86.opJMPF, X86.opJMPs, // 0xE8-0xEB
X86.opINDXb, X86.opINDXw, X86.opOUTDXb, X86.opOUTDXw, // 0xEC-0xEF
/*
* On an 8086/8088, opcode 0xF1 is believed to be an alias for 0xF0; in any case, it definitely behaves like
* a prefix on those processors, so we treat it as such. On the 80186 and up, we treat as opINT1().
*
* As of the Pentium, opcode 0xF1 is still marked "reserved".
*/
X86.opLOCK, X86.opLOCK, X86.opREPNZ, X86.opREPZ, // 0xF0-0xF3
X86.opHLT, X86.opCMC, X86.opGRP3b, X86.opGRP3w, // 0xF4-0xF7
X86.opCLC, X86.opSTC, X86.opCLI, X86.opSTI, // 0xF8-0xFB
X86.opCLD, X86.opSTD, X86.opGRP4b, X86.opGRP4w // 0xFC-0xFF
];
/*
* A word (or two) on instruction groups (eg, Grp1, Grp2), which are groups of instructions that
* use a mod/reg/rm byte, where the reg field of that byte selects a function rather than a register.
*
* I start with the groupings used by Intel's "Pentium Processor User's Manual (Volume 3: Architecture
* and Programming Manual)", but I deviate slightly, mostly by subdividing their groups with letter suffixes:
*
* Opcodes Intel PCjs PC Mag TechRef
* ------- ----- ---- --------------
* 0x80-0x83 Grp1 Grp1b and Grp1w Group A
* 0xC0-0xC1 Grp2 Grp2b and Grp2w (opGRP2bn/wn) Group B
* 0xD0-0xD3 Grp2 Grp2b and Grp2w (opGRP2b1/w1 and opGRP2bCL/wCL) Group B
* 0xF6-0xF7 Grp3 Grp3b and Grp3w Group C
* 0xFE Grp4 Grp4b Group D
* 0xFF Grp5 Grp4w Group E
* 0x0F,0x00 Grp6 Grp6 (SLDT, STR, LLDT, LTR, VERR, VERW) Group F
* 0x0F,0x01 Grp7 Grp7 (SGDT, SIDT, LGDT, LIDT, SMSW, LMSW, INVLPG) Group G
* 0x0F,0xBA Grp8 Grp8 (BT, BTS, BTR, BTC) Group H
* 0x0F,0xC7 Grp9 Grp9 (CMPXCH) (N/A, 80486 and up)
*
* My only serious deviation is Grp5, which I refer to as Grp4w, because it contains word forms of
* the INC and DEC instructions found in Grp4b. Granted, Grp4w also contains versions of the CALL,
* JMP and PUSH instructions, which are not in Grp4b, but there's nothing in Grp4b that conflicts with
* Grp4w, so I think my nomenclature makes more sense. To compensate, I don't use Grp5, so that the
* remaining group numbers remain in sync with Intel's.
*
* To the above list, I've added a few "single-serving" groups: opcode 0x8F uses GrpPOPw, and opcodes 0xC6/0xC7
* use GrpMOVn. In both of these groups, the only valid (documented) instruction is where reg=0x0.
*
* TODO: Test what happens on real hardware when the reg field is non-zero for opcodes 0x8F and 0xC6/0xC7.
*/
X86.aOpGrp1b = [
X86.fnADDb, X86.fnORb, X86.fnADCb, X86.fnSBBb, // 0x80/0x82(reg=0x0-0x3)
X86.fnANDb, X86.fnSUBb, X86.fnXORb, X86.fnCMPb // 0x80/0x82(reg=0x4-0x7)
];
X86.aOpGrp1w = [
X86.fnADDw, X86.fnORw, X86.fnADCw, X86.fnSBBw, // 0x81/0x83(reg=0x0-0x3)
X86.fnANDw, X86.fnSUBw, X86.fnXORw, X86.fnCMPw // 0x81/0x83(reg=0x4-0x7)
];
X86.aOpGrpPOPw = [
X86.fnPOPw, X86.fnGRPFault, X86.fnGRPFault, X86.fnGRPFault, // 0x8F(reg=0x0-0x3)
X86.fnGRPFault, X86.fnGRPFault, X86.fnGRPFault, X86.fnGRPFault // 0x8F(reg=0x4-0x7)
];
X86.aOpGrpMOVn = [
X86.fnMOVn, X86.fnGRPUndefined, X86.fnGRPUndefined, X86.fnGRPUndefined, // 0xC6/0xC7(reg=0x0-0x3)
X86.fnGRPUndefined, X86.fnGRPUndefined, X86.fnGRPUndefined, X86.fnGRPUndefined // 0xC6/0xC7(reg=0x4-0x7)
];
X86.aOpGrp2b = [
X86.fnROLb, X86.fnRORb, X86.fnRCLb, X86.fnRCRb, // 0xC0/0xD0/0xD2(reg=0x0-0x3)
X86.fnSHLb, X86.fnSHRb, X86.fnGRPUndefined, X86.fnSARb // 0xC0/0xD0/0xD2(reg=0x4-0x7)
];
X86.aOpGrp2w = [
X86.fnROLw, X86.fnRORw, X86.fnRCLw, X86.fnRCRw, // 0xC1/0xD1/0xD3(reg=0x0-0x3)
X86.fnSHLw, X86.fnSHRw, X86.fnGRPUndefined, X86.fnSARw // 0xC1/0xD1/0xD3(reg=0x4-0x7)
];
X86.aOpGrp2d = [
X86.fnROLd, X86.fnRORd, X86.fnRCLd, X86.fnRCRd, // 0xC1/0xD1/0xD3(reg=0x0-0x3)
X86.fnSHLd, X86.fnSHRd, X86.fnGRPUndefined, X86.fnSARd // 0xC1/0xD1/0xD3(reg=0x4-0x7)
];
X86.aOpGrp3b = [
X86.fnTEST8, X86.fnGRPUndefined, X86.fnNOTb, X86.fnNEGb, // 0xF6(reg=0x0-0x3)
X86.fnMULb, X86.fnIMULb, X86.fnDIVb, X86.fnIDIVb // 0xF6(reg=0x4-0x7)
];
X86.aOpGrp3w = [
X86.fnTEST16, X86.fnGRPUndefined, X86.fnNOTw, X86.fnNEGw, // 0xF7(reg=0x0-0x3)
X86.fnMULw, X86.fnIMULw, X86.fnDIVw, X86.fnIDIVw // 0xF7(reg=0x4-0x7)
];
X86.aOpGrp4b = [
X86.fnINCb, X86.fnDECb, X86.fnGRPUndefined, X86.fnGRPUndefined, // 0xFE(reg=0x0-0x3)
X86.fnGRPUndefined, X86.fnGRPUndefined, X86.fnGRPUndefined, X86.fnGRPUndefined // 0xFE(reg=0x4-0x7)
];
X86.aOpGrp4w = [
X86.fnINCw, X86.fnDECw, X86.fnCALLw, X86.fnCALLFdw, // 0xFF(reg=0x0-0x3)
X86.fnJMPw, X86.fnJMPFdw, X86.fnPUSHw, X86.fnGRPFault // 0xFF(reg=0x4-0x7)
];
/**
* @fileoverview Implements PCjs X86 Segment Registers
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2014-Sep-10
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
* at <http://jsmachines.net/> and <http://pcjs.org/>.
*
* PCjs is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCjs. If not,
* see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some PCjs files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* PCjs program for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
if (typeof module !== 'undefined') {
var str = require("../../shared/lib/strlib");
var Messages = require("./messages");
var Memory = require("./memory");
var X86 = require("./x86");
}
/**
* @class X86Seg
* @property {number} sel
* @property {number} limit (in protected-mode, this comes from descriptor word 0x0)
* @property {number} base (in protected-mode, this comes from descriptor word 0x2)
* @property {number} acc (in protected-mode, this comes from descriptor word 0x4; bits 0-7 supplement base bits 16-23)
* @property {number} ext (in protected-mode, this is descriptor word 0x6, 80386 only; supplements limit bits 16-19 and base bits 24-31)
*
* TODO: Determine what good, if any, these class annotations are for either an IDE like WebStorm or a tool like
* the Closure Compiler. More importantly, what good do they do at runtime? Is it better to simply ensure that all
* object properties are explicitly initialized in the constructor, and document them there instead?
*/
/**
* X86Seg(cpu, sName)
*
* @constructor
* @param {X86CPU} cpu
* @param {number} id
* @param {string} [sName] segment register name
* @param {boolean} [fProt] true if segment register used exclusively in protected-mode (eg, segLDT)
*/
function X86Seg(cpu, id, sName, fProt)
{
this.cpu = cpu;
this.dbg = cpu.dbg;
this.id = id;
this.sName = sName || "";
this.sel = 0;
this.limit = 0xffff;
this.offMax = this.limit + 1;
this.base = 0;
this.acc = this.type = 0;
this.ext = 0;
this.cpl = this.dpl = 0;
this.addrDesc = X86.ADDR_INVALID;
this.dataSize = this.addrSize = 2;
this.dataMask = this.addrMask = 0xffff;
/*
* The following properties are used for CODE segments only (ie, segCS); if the process of loading
* CS also requires a stack switch, then fStackSwitch will be set to true; additionally, if the stack
* switch was the result of a CALL (ie, fCall is true) and one or more (up to 32) parameters are on
* the old stack, they will be copied to awParms, and then once the stack is switched, the parameters
* will be pushed from awParms onto the new stack.
*
* The typical ways of loading a new segment into CS are JMPF, CALLF (or INT), and RETF (or IRET);
* prior to calling segCS.load(), each of those operations must first set segCS.fCall to one of null,
* true, or false, respectively.
*
* It's critical that fCall be properly set prior to calling segCS.load(); fCall === null means NO
* privilege level transition may occur, fCall === true allows a stack switch and a privilege transition
* to a numerically lower privilege, and fCall === false allows a stack restore and a privilege transition
* to a numerically greater privilege.
*
* As long as setCSIP() or fnINT() are used for all CS changes, fCall is set automatically.
*
* TODO: Consider making fCall a parameter to load(), instead of a property that must be set prior to
* calling load(); the downside is that such a parameter is meaningless for segments other than segCS.
*/
this.awParms = (this.id == X86Seg.ID.CODE? new Array(32) : []);
this.fCall = null;
this.fStackSwitch = false;
this.updateMode(true, fProt);
}
X86Seg.ID = {
NULL: 0, // "NULL"
CODE: 1, // "CS"
DATA: 2, // "DS", "ES", "FS", "GS"
STACK: 3, // "SS"
TSS: 4, // "TSS"
LDT: 5, // "LDT"
OTHER: 6, // "VER"
DEBUG: 7 // "DBG"
};
/**
* loadReal(sel, fSuppress)
*
* The default segment load() function for real-mode.
*
* @this {X86Seg}
* @param {number} sel
* @param {boolean} [fSuppress] is true to suppress any errors
* @return {number} base address of selected segment, or ADDR_INVALID if error (TODO: No error conditions yet)
*/
X86Seg.prototype.loadReal = function loadReal(sel, fSuppress)
{
this.sel = sel & 0xffff;
/*
* Loading a new value into a segment register in real-mode alters ONLY the selector and the base;
* all other attributes (eg, limit, operand size, address size, etc) are unchanged. If you run any
* code that switches to protected-mode, loads a 32-bit code segment, and then switches back to
* real-mode, it is THAT code's responsibility to load a 16-bit segment into CS before returning to
* real-mode; otherwise, your machine will probably be toast.
*/
return this.base = this.sel << 4;
};
/**
* loadProt(sel, fSuppress)
*
* This replaces the segment's default load() function whenever the segment is notified via updateMode() by the
* CPU's setProtMode() that the processor is now in protected-mode.
*
* Segments in protected-mode are referenced by selectors, which are indexes into descriptor tables (GDT or LDT)
* whose descriptors are 4-word (8-byte) entries:
*
* word 0: segment limit (0-15)
* word 1: base address low
* word 2: base address high (0-7), segment type (8-11), descriptor type (12), DPL (13-14), present bit (15)
* word 3: used only on 80386 and up (should be set to zero for upward compatibility)
*
* See X86.DESC for offset and bit definitions.
*
* IDT descriptor entries are handled separately by loadIDT(), which is mapped to loadIDTReal() or loadIDTProt().
*
* @this {X86Seg}
* @param {number} sel
* @param {boolean} [fSuppress] is true to suppress any errors, cycle assessment, etc
* @return {number} base address of selected segment, or ADDR_INVALID if error
*/
X86Seg.prototype.loadProt = function loadProt(sel, fSuppress)
{
var addrDT;
var addrDTLimit;
var cpu = this.cpu;
/*
* Some instructions (eg, CALLF) load a 32-bit value for the selector, while others (eg, LDS) do not;
* however, in ALL cases, only the low 16 bits are significant.
*/
sel &= 0xffff;
if (!(sel & X86.SEL.LDT)) {
addrDT = cpu.addrGDT;
addrDTLimit = cpu.addrGDTLimit;
} else {
addrDT = cpu.segLDT.base;
addrDTLimit = (addrDT + cpu.segLDT.limit)|0;
}
/*
* The ROM BIOS POST executes some test code in protected-mode without properly initializing the LDT,
* which has no bearing on the ROM's own code, because it never loads any LDT selectors, but if at the same
* time our Debugger attempts to validate a selector in one of its breakpoints, that could cause some
* grief here. We avoid that grief by 1) relying on the Debugger setting fSuppress to true, and 2) skipping
* segment lookup if the descriptor table being referenced is zero. Both tests are required, because
* there's nothing in the design of the CPU that prevents the GDT or LDT being at linear address zero.
*/
if (!fSuppress || addrDT) {
var addrDesc = (addrDT + (sel & X86.SEL.MASK))|0;
if ((addrDTLimit - addrDesc)|0 >= 7) {
/*
* TODO: This is the first of many steps toward accurately counting cycles in protected mode;
* I simply noted that "POP segreg" takes 5 cycles in real mode and 20 in protected mode, so I'm
* starting with a 15-cycle difference. Obviously the difference will vary with the instruction,
* and will be much greater whenever the load fails.
*/
if (!fSuppress) cpu.nStepCycles -= 15;
return this.loadDesc8(addrDesc, sel, fSuppress);
}
if (!fSuppress) {
X86.fnFault.call(cpu, X86.EXCEPTION.GP_FAULT, sel);
}
}
return X86.ADDR_INVALID;
};
/**
* loadIDTReal(nIDT)
*
* @this {X86Seg}
* @param {number} nIDT
* @return {number} address from selected vector, or ADDR_INVALID if error (TODO: No error conditions yet)
*/
X86Seg.prototype.loadIDTReal = function loadIDTReal(nIDT)
{
var cpu = this.cpu;
/*
* NOTE: The Compaq DeskPro 386 ROM loads the IDTR for the real-mode IDT with a limit of 0xffff instead
* of the normal 0x3ff. A limit higher than 0x3ff is OK, since all real-mode IDT entries are 4 bytes, and
* there's no way to issue an interrupt with a vector > 0xff. Just something to be aware of.
*/
cpu.assert(nIDT >= 0 && nIDT < 256 && !cpu.addrIDT && cpu.addrIDTLimit >= 0x3ff);
/*
* Intel documentation for INT/INTO under "REAL ADDRESS MODE EXCEPTIONS" says:
*
* "[T]he 80286 will shut down if the SP = 1, 3, or 5 before executing the INT or INTO instruction--due to lack of stack space"
*
* TODO: Verify that 80286 real-mode actually enforces the above. See http://localhost:8088/pubs/pc/reference/intel/80286/progref/#page-260
*/
var addrIDT = cpu.addrIDT + (nIDT << 2);
var off = cpu.getShort(addrIDT);
cpu.regPS &= ~(X86.PS.TF | X86.PS.IF);
return (this.load(cpu.getShort(addrIDT + 2)) + off)|0;
};
/**
* loadIDTProt(nIDT)
*
* @this {X86Seg}
* @param {number} nIDT
* @return {number} address from selected vector, or ADDR_INVALID if error (TODO: No error conditions yet)
*/
X86Seg.prototype.loadIDTProt = function loadIDTProt(nIDT)
{
var cpu = this.cpu;
cpu.assert(nIDT >= 0 && nIDT < 256);
nIDT <<= 3;
var addrDesc = (cpu.addrIDT + nIDT)|0;
if (((cpu.addrIDTLimit - addrDesc)|0) >= 7) {
return this.loadDesc8(addrDesc, nIDT) + cpu.regEIP;
}
X86.fnFault.call(cpu, X86.EXCEPTION.GP_FAULT, nIDT | X86.ERRCODE.IDT | X86.ERRCODE.EXT, true);
return X86.ADDR_INVALID;
};
/**
* checkReadReal(off, cb, fSuppress)
*
* TODO: Invoke X86.fnFault.call(this.cpu, X86.EXCEPTION.GP_FAULT) if off+cb is beyond offMax on 80186 and up;
* also, determine whether fnFault() call should include an error code, since this is happening in real-mode.
*
* @this {X86Seg}
* @param {number} off is a segment-relative offset
* @param {number} cb is number of bytes to check (1, 2 or 4)
* @param {boolean} [fSuppress] is true to suppress any errors
* @return {number} corresponding linear address if valid, or ADDR_INVALID if error (TODO: No error conditions yet)
*/
X86Seg.prototype.checkReadReal = function checkReadReal(off, cb, fSuppress)
{
return (this.base + off)|0;
};
/**
* checkWriteReal(off, cb, fSuppress)
*
* TODO: Invoke X86.fnFault.call(this.cpu, X86.EXCEPTION.GP_FAULT) if off+cb is beyond offMax on 80186 and up;
* also, determine whether fnFault() call should include an error code, since this is happening in real-mode.
*
* @this {X86Seg}
* @param {number} off is a segment-relative offset
* @param {number} cb is number of bytes to check (1, 2 or 4)
* @param {boolean} [fSuppress] is true to suppress any errors
* @return {number} corresponding linear address if valid, or ADDR_INVALID if error (TODO: No error conditions yet)
*/
X86Seg.prototype.checkWriteReal = function checkWriteReal(off, cb, fSuppress)
{
return (this.base + off)|0;
};
/**
* checkReadProt(off, cb, fSuppress)
*
* @this {X86Seg}
* @param {number} off is a segment-relative offset
* @param {number} cb is number of bytes to check (1, 2 or 4)
* @param {boolean} [fSuppress] is true to suppress any errors
* @return {number} corresponding linear address if valid, or ADDR_INVALID if not
*/
X86Seg.prototype.checkReadProt = function checkReadProt(off, cb, fSuppress)
{
/*
* Since off could be a 32-bit value with the sign bit (bit 31) set, we must convert
* it to an unsigned value using ">>>"; offMax was already converted at segment load time.
*/
if ((off >>> 0) + cb <= this.offMax) {
return (this.base + off)|0;
}
return this.checkReadProtDisallowed(off, cb, fSuppress);
};
/**
* checkReadProtDown(off, cb, fSuppress)
*
* @this {X86Seg}
* @param {number} off is a segment-relative offset
* @param {number} cb is number of bytes to check (1, 2 or 4)
* @param {boolean} [fSuppress] is true to suppress any errors
* @return {number} corresponding linear address if valid, ADDR_INVALID if not
*/
X86Seg.prototype.checkReadProtDown = function checkReadProtDown(off, cb, fSuppress)
{
/*
* Since off could be a 32-bit value with the sign bit (bit 31) set, we must convert
* it to an unsigned value using ">>>"; offMax was already converted at segment load time.
*/
if ((off >>> 0) + cb > this.offMax) {
return (this.base + off)|0;
}
return this.checkReadProtDisallowed(off, cb, fSuppress);
};
/**
* checkReadProtDisallowed(off, cb, fSuppress)
*
* @this {X86Seg}
* @param {number} off is a segment-relative offset
* @param {number} cb is number of bytes to check (1, 2 or 4)
* @param {boolean} [fSuppress] is true to suppress any errors
* @return {number} corresponding linear address if valid, ADDR_INVALID if not
*/
X86Seg.prototype.checkReadProtDisallowed = function checkReadProtDisallowed(off, cb, fSuppress)
{
if (!fSuppress) {
X86.fnFault.call(this.cpu, X86.EXCEPTION.GP_FAULT, 0);
}
return X86.ADDR_INVALID;
};
/**
* checkWriteProt(off, cb, fSuppress)
*
* @this {X86Seg}
* @param {number} off is a segment-relative offset
* @param {number} cb is number of bytes to check (1, 2 or 4)
* @param {boolean} [fSuppress] is true to suppress any errors
* @return {number} corresponding linear address if valid, ADDR_INVALID if not
*/
X86Seg.prototype.checkWriteProt = function checkWriteProt(off, cb, fSuppress)
{
/*
* Since off could be a 32-bit value with the sign bit (bit 31) set, we must convert
* it to an unsigned value using ">>>"; offMax was already converted at segment load time.
*/
if ((off >>> 0) + cb <= this.offMax) {
return (this.base + off)|0;
}
return this.checkWriteProtDisallowed(off, cb, fSuppress);
};
/**
* checkWriteProtDown(off, cb, fSuppress)
*
* @this {X86Seg}
* @param {number} off is a segment-relative offset
* @param {number} cb is number of bytes to check (1, 2 or 4)
* @param {boolean} [fSuppress] is true to suppress any errors
* @return {number} corresponding linear address if valid, ADDR_INVALID if not
*/
X86Seg.prototype.checkWriteProtDown = function checkWriteProtDown(off, cb, fSuppress)
{
/*
* Since off could be a 32-bit value with the sign bit (bit 31) set, we must convert
* it to an unsigned value using ">>>"; offMax was already converted at segment load time.
*/
if ((off >>> 0) + cb > this.offMax) {
return (this.base + off)|0;
}
return this.checkWriteProtDisallowed(off, cb, fSuppress);
};
/**
* checkWriteProtDisallowed(off, cb, fSuppress)
*
* @this {X86Seg}
* @param {number} off is a segment-relative offset
* @param {number} cb is number of bytes to check (1, 2 or 4)
* @param {boolean} [fSuppress] is true to suppress any errors
* @return {number} corresponding linear address if valid, ADDR_INVALID if not
*/
X86Seg.prototype.checkWriteProtDisallowed = function checkWriteProtDisallowed(off, cb, fSuppress)
{
if (!fSuppress) {
X86.fnFault.call(this.cpu, X86.EXCEPTION.GP_FAULT, 0);
}
return X86.ADDR_INVALID;
};
/**
* loadAcc(sel, fGDT)
*
* @this {X86Seg}
* @param {number} sel (protected-mode only)
* @param {boolean} [fGDT] is true if sel must be in the GDT
* @return {number} acc field from descriptor, or X86.DESC.ACC.INVALID if error
*/
X86Seg.prototype.loadAcc = function(sel, fGDT)
{
var addrDT;
var addrDTLimit;
var cpu = this.cpu;
if (!(sel & X86.SEL.LDT)) {
addrDT = cpu.addrGDT;
addrDTLimit = cpu.addrGDTLimit;
} else if (!fGDT) {
addrDT = cpu.segLDT.base;
addrDTLimit = (addrDT + cpu.segLDT.limit)|0;
}
if (addrDT !== undefined) {
var addrDesc = (addrDT + (sel & X86.SEL.MASK))|0;
if (((addrDTLimit - addrDesc)|0) >= 7) {
return cpu.getShort(addrDesc + X86.DESC.ACC.OFFSET);
}
}
X86.fnFault.call(cpu, X86.EXCEPTION.GP_FAULT, sel);
return X86.DESC.ACC.INVALID;
};
/**
* loadDesc6(addrDesc, sel)
*
* Used to load a protected-mode selector that refers to a 6-byte "descriptor cache" (aka LOADALL) entry:
*
* word 0: base address low
* word 1: base address high (0-7), segment type (8-11), descriptor type (12), DPL (13-14), present bit (15)
* word 2: segment limit (0-15)
*
* @this {X86Seg}
* @param {number} addrDesc is the descriptor address
* @param {number} sel is the associated selector
* @return {number} base address of selected segment
*/
X86Seg.prototype.loadDesc6 = function(addrDesc, sel)
{
var cpu = this.cpu;
var acc = cpu.getShort(addrDesc + 2);
var base = cpu.getShort(addrDesc) | ((acc & 0xff) << 16);
var limit = cpu.getShort(addrDesc + 4);
this.sel = sel;
this.base = base;
this.limit = limit;
this.offMax = (limit >>> 0) + 1;
this.acc = acc;
this.type = (acc & X86.DESC.ACC.TYPE.MASK);
this.ext = 0;
this.addrDesc = addrDesc;
this.updateMode(true);
this.messageSeg(sel, base, limit, this.type);
return base;
};
/**
* loadDesc8(addrDesc, sel, fSuppress)
*
* Used to load a protected-mode selector that refers to an 8-byte "descriptor table" (GDT, LDT, IDT) entry:
*
* word 0: segment limit (0-15)
* word 1: base address low
* word 2: base address high (0-7), segment type (8-11), descriptor type (12), DPL (13-14), present bit (15)
* word 3: used only on 80386 and up (should be set to zero for upward compatibility)
*
* See X86.DESC for offset and bit definitions.
*
* @this {X86Seg}
* @param {number} addrDesc is the descriptor address
* @param {number} sel is the associated selector, or nIDT*8 if IDT descriptor
* @param {boolean} [fSuppress] is true to suppress any errors, cycle assessment, etc
* @return {number} base address of selected segment, or ADDR_INVALID if error
*/
X86Seg.prototype.loadDesc8 = function(addrDesc, sel, fSuppress)
{
var cpu = this.cpu;
var limit = cpu.getShort(addrDesc + X86.DESC.LIMIT.OFFSET);
var acc = cpu.getShort(addrDesc + X86.DESC.ACC.OFFSET);
var type = (acc & X86.DESC.ACC.TYPE.MASK);
var base = cpu.getShort(addrDesc + X86.DESC.BASE.OFFSET) | ((acc & X86.DESC.ACC.BASE1623) << 16);
var ext = cpu.getShort(addrDesc + X86.DESC.EXT.OFFSET);
var selMasked = sel & X86.SEL.MASK;
if (I386 && cpu.model >= X86.MODEL_80386) {
base |= (ext & X86.DESC.EXT.BASE2431) << 16;
limit |= (ext & X86.DESC.EXT.LIMIT1619) << 16;
if (ext & X86.DESC.EXT.LIMITPAGES) limit = (limit << 12) | 0xfff;
}
while (true) {
var selCode, cplPrev, addrTSS, offSP, offSS, regSPPrev, regSSPrev;
/*
* TODO: Consider moving the following chunks of code into worker functions for each X86Seg.ID;
* however, it's not clear that these tests are more costly than making additional function calls.
*/
if (this.id == X86Seg.ID.CODE) {
this.fStackSwitch = false;
var fCall = this.fCall;
var fGate, regPSMask, nFaultError, regSP;
var rpl = sel & X86.SEL.RPL;
var dpl = (acc & X86.DESC.ACC.DPL.MASK) >> X86.DESC.ACC.DPL.SHIFT;
if (selMasked && !(acc & X86.DESC.ACC.PRESENT)) {
if (!fSuppress) X86.fnFault.call(cpu, X86.EXCEPTION.NP_FAULT, sel);
base = addrDesc = X86.ADDR_INVALID;
break;
}
/*
* Since we are X86Seg.ID.CODE, we can use this.cpl instead of the more generic cpu.segCS.cpl
*/
if (type >= X86.DESC.ACC.TYPE.CODE_EXECONLY) {
rpl = sel & X86.SEL.RPL;
if (rpl > this.cpl) {
/*
* If fCall is false, then we must have a RETF to a less privileged segment, which is OK.
*
* Otherwise, we must be dealing with a CALLF or JMPF to a less privileged segment, in which
* case either DPL == CPL *or* the new segment is conforming and DPL <= CPL.
*/
if (fCall !== false && !(dpl == this.cpl || (type & X86.DESC.ACC.TYPE.CONFORMING) && dpl <= this.cpl)) {
base = addrDesc = X86.ADDR_INVALID;
break;
}
regSP = cpu.popWord();
cpu.setSS(cpu.popWord(), true);
cpu.setSP(regSP);
this.fStackSwitch = true;
}
fGate = false;
}
else if (type == X86.DESC.ACC.TYPE.TSS) {
if (!this.switchTSS(sel, fCall)) {
base = addrDesc = X86.ADDR_INVALID;
break;
}
return this.base;
}
else if (type == X86.DESC.ACC.TYPE.GATE_CALL) {
fGate = true;
regPSMask = ~0;
nFaultError = sel;
if (rpl < this.cpl) rpl = this.cpl; // set RPL to max(RPL,CPL) for call gates
}
else if (type == X86.DESC.ACC.TYPE.GATE_INT) {
fGate = true;
regPSMask = ~(X86.PS.NT | X86.PS.TF | X86.PS.IF);
nFaultError = sel | X86.ERRCODE.EXT;
cpu.assert(!(acc & 0x1f));
}
else if (type == X86.DESC.ACC.TYPE.GATE_TRAP) {
fGate = true;
regPSMask = ~(X86.PS.NT | X86.PS.TF);
nFaultError = sel | X86.ERRCODE.EXT;
cpu.assert(!(acc & 0x1f));
}
else if (type == X86.DESC.ACC.TYPE.GATE_TASK) {
if (!this.switchTSS(base & 0xffff, fCall)) {
base = addrDesc = X86.ADDR_INVALID;
break;
}
return this.base;
}
if (fGate) {
/*
* Note that since GATE_INT/GATE_TRAP descriptors should appear in the IDT only, that means sel
* will actually be nIDT * 8, which means the rpl will always be zero; additionally, the nWords
* portion of acc should always be zero, but that's really dependent on the descriptor being properly
* set (which we assert above).
*/
selCode = base & 0xffff;
if (rpl <= dpl) {
/*
* TODO: Verify the PRESENT bit of the gate descriptor, and issue NP_FAULT as appropriate.
*/
cplPrev = this.cpl;
if (this.load(selCode, true) === X86.ADDR_INVALID) {
cpu.assert(false);
base = addrDesc = X86.ADDR_INVALID;
break;
}
cpu.regEIP = limit;
if (this.cpl < cplPrev) {
if (fCall !== true) {
cpu.assert(false);
base = addrDesc = X86.ADDR_INVALID;
break;
}
regSP = cpu.getSP();
var i = 0, nWords = (acc & 0x1f);
while (nWords--) {
this.awParms[i++] = cpu.getSOWord(cpu.segSS, regSP);
regSP += 2;
}
addrTSS = cpu.segTSS.base;
offSP = (this.cpl << 2) + X86.TSS.CPL0_SP;
offSS = offSP + 2;
regSSPrev = cpu.getSS();
regSPPrev = cpu.getSP();
cpu.setSS(cpu.getShort(addrTSS + offSS), true);
cpu.setSP(cpu.getShort(addrTSS + offSP));
cpu.pushWord(regSSPrev);
cpu.pushWord(regSPPrev);
while (i) cpu.pushWord(this.awParms[--i]);
this.fStackSwitch = true;
}
cpu.regPS &= regPSMask;
return this.base;
}
cpu.assert(false);
if (!fSuppress) X86.fnFault.call(cpu, X86.EXCEPTION.GP_FAULT, nFaultError, true);
base = addrDesc = X86.ADDR_INVALID;
break;
}
else if (fGate !== false) {
cpu.assert(false);
if (!fSuppress) X86.fnFault.call(cpu, X86.EXCEPTION.GP_FAULT, sel, true);
base = addrDesc = X86.ADDR_INVALID;
break;
}
}
else if (this.id == X86Seg.ID.DATA) {
if (selMasked) {
if (!(acc & X86.DESC.ACC.PRESENT)) {
if (!fSuppress) X86.fnFault.call(cpu, X86.EXCEPTION.NP_FAULT, sel);
base = addrDesc = X86.ADDR_INVALID;
break;
}
if (type < X86.DESC.ACC.TYPE.SEG || (type & (X86.DESC.ACC.TYPE.CODE | X86.DESC.ACC.TYPE.READABLE)) == X86.DESC.ACC.TYPE.CODE) {
/*
* OS/2 1.0 triggers this "Empty Descriptor" GP_FAULT multiple times during boot; eg:
*
* Fault 0D (002F) on opcode 0x8E at 3190:3A05 (%112625)
* stopped (11315208 ops, 41813627 cycles, 498270 ms, 83918 hz)
* AX=0000 BX=0970 CX=0300 DX=0300 SP=0ABE BP=0ABA SI=0000 DI=001A
* DS=19C0[177300,2C5F] ES=001F[1743A0,07FF] SS=0038[175CE0,0B5F]
* CS=3190[10EC20,B89F] IP=3A05 V0 D0 I1 T0 S0 Z1 A0 P1 C0 PS=3246 MS=FFF3
* LD=0028[174BC0,003F] GD=[11A4E0,490F] ID=[11F61A,03FF] TR=0010 A20=ON
* 3190:3A05 8E4604 MOV ES,[BP+04]
* 0038:0ABE 002F 19C0 0000 067C - 07FC 0AD2 0010 C420 /.....|....... .
* dumpDesc(002F): %174BE8
* base=000000 limit=0000 dpl=00 type=00 (undefined)
*
* If we allow the GP fault to be dispatched, it recovers, so until I'm able to investigate this
* further, I'm going to assume this is normal behavior. If the segment (0x002F in the example)
* simply needed to be "faulted" into memory, I would have expected OS/2 to build a descriptor
* with the PRESENT bit clear, and rely on NP_FAULT rather than GP_FAULT, but maybe this was simpler.
*
* Anyway, because of this, if acc is zero, we won't set fHalt on this GP_FAULT.
*/
if (!fSuppress) X86.fnFault.call(cpu, X86.EXCEPTION.GP_FAULT, sel, !!acc);
base = addrDesc = X86.ADDR_INVALID;
break;
}
}
}
else if (this.id == X86Seg.ID.STACK) {
if (!(acc & X86.DESC.ACC.PRESENT)) {
if (!fSuppress) X86.fnFault.call(cpu, X86.EXCEPTION.SS_FAULT, sel);
base = addrDesc = X86.ADDR_INVALID;
break;
}
if (!selMasked || type < X86.DESC.ACC.TYPE.SEG || (type & (X86.DESC.ACC.TYPE.CODE | X86.DESC.ACC.TYPE.WRITABLE)) != X86.DESC.ACC.TYPE.WRITABLE) {
if (!fSuppress) X86.fnFault.call(cpu, X86.EXCEPTION.GP_FAULT, sel, true);
base = addrDesc = X86.ADDR_INVALID;
break;
}
}
else if (this.id == X86Seg.ID.TSS) {
if (!selMasked || type != X86.DESC.ACC.TYPE.TSS && type != X86.DESC.ACC.TYPE.TSS_BUSY) {
if (!fSuppress) X86.fnFault.call(cpu, X86.EXCEPTION.TS_FAULT, sel, true);
base = addrDesc = X86.ADDR_INVALID;
break;
}
}
else if (this.id == X86Seg.ID.OTHER) {
/*
* For LSL, we must support any descriptor marked X86.DESC.ACC.TYPE.SEG, as well as TSS and LDT descriptors.
*/
if (!(type & X86.DESC.ACC.TYPE.SEG) && type > X86.DESC.ACC.TYPE.TSS_BUSY) {
base = addrDesc = X86.ADDR_INVALID;
break;
}
}
this.sel = sel;
this.base = base;
this.limit = limit;
this.offMax = (limit >>> 0) + 1;
this.acc = acc;
this.type = type;
this.ext = ext;
this.addrDesc = addrDesc;
this.updateMode(true);
break;
}
if (!fSuppress) this.messageSeg(sel, base, limit, type, ext);
return base;
};
/**
* switchTSS(selNew, fNest)
*
* Implements TSS (Task State Segment) task switching.
*
* NOTES: This typically occurs during double-fault processing, because the IDT entry for DF_FAULT normally
* contains a task gate. Interestingly, if we force a GP_FAULT to occur at a sufficiently early point in the
* OS/2 1.0 initialization code, OS/2 does a nice job of displaying the GP fault and then shutting down:
*
* 0090:067B FB STI
* 0090:067C EBFD JMP 067B
*
* but it may not have yet reprogrammed the master PIC to re-vector hardware interrupts to IDT entries 0x50-0x57,
* so when the next timer interrupt (IRQ 0) occurs, it vectors through IDT entry 0x08, which is the DF_FAULT
* vector. A spurious double-fault is generated, and a clean shutdown turns into a messy crash.
*
* Of course, that all could have been avoided if IBM had heeded Intel's advice and not used Intel-reserved IDT
* entries for PC interrupts.
*
* TODO: Add 80386 TSS support (including CR3 support).
*
* @this {X86Seg}
* @param {number} selNew
* @param {boolean|null} [fNest] is true if nesting, false if un-nesting, null if neither
* @return {boolean} true if successful, false if error
*/
X86Seg.prototype.switchTSS = function switchTSS(selNew, fNest)
{
var cpu = this.cpu;
cpu.assert(this === cpu.segCS);
var addrOld = cpu.segTSS.base;
var cplOld = this.cpl;
var selOld = cpu.segTSS.sel;
if (!fNest) {
/*
* TODO: Verify that it is (always) correct to require that the BUSY bit be currently set.
*/
if (cpu.segTSS.type != X86.DESC.ACC.TYPE.TSS_BUSY) {
X86.fnFault.call(cpu, X86.EXCEPTION.TS_FAULT, selNew, true);
return false;
}
cpu.setShort(cpu.segTSS.addrDesc + X86.DESC.ACC.OFFSET, (cpu.segTSS.acc & ~X86.DESC.ACC.TYPE.TSS_BUSY) | X86.DESC.ACC.TYPE.TSS);
}
if (cpu.segTSS.load(selNew) === X86.ADDR_INVALID) {
return false;
}
var addrNew = cpu.segTSS.base;
if (DEBUG && DEBUGGER && this.dbg && this.dbg.messageEnabled(Messages.TSS)) {
this.dbg.message((fNest? "Task switch" : "Task return") + ": TR " + str.toHexWord(selOld) + " (%" + str.toHex(addrOld, 6) + "), new TR " + str.toHexWord(selNew) + " (%" + str.toHex(addrNew, 6) + ")");
}
if (fNest === false) {
if (cpu.segTSS.type != X86.DESC.ACC.TYPE.TSS_BUSY) {
X86.fnFault.call(cpu, X86.EXCEPTION.GP_FAULT, selNew, true);
return false;
}
} else {
if (cpu.segTSS.type == X86.DESC.ACC.TYPE.TSS_BUSY) {
X86.fnFault.call(cpu, X86.EXCEPTION.GP_FAULT, selNew, true);
return false;
}
cpu.setShort(cpu.segTSS.addrDesc + X86.DESC.ACC.OFFSET, cpu.segTSS.acc |= X86.DESC.ACC.TYPE.TSS_BUSY);
cpu.segTSS.type = X86.DESC.ACC.TYPE.TSS_BUSY;
}
/*
* Update the old TSS
*/
cpu.setShort(addrOld + X86.TSS.TASK_IP, cpu.getIP());
cpu.setShort(addrOld + X86.TSS.TASK_PS, cpu.getPS());
cpu.setShort(addrOld + X86.TSS.TASK_AX, cpu.regEAX);
cpu.setShort(addrOld + X86.TSS.TASK_CX, cpu.regECX);
cpu.setShort(addrOld + X86.TSS.TASK_DX, cpu.regEDX);
cpu.setShort(addrOld + X86.TSS.TASK_BX, cpu.regEBX);
cpu.setShort(addrOld + X86.TSS.TASK_SP, cpu.getSP());
cpu.setShort(addrOld + X86.TSS.TASK_BP, cpu.regEBP);
cpu.setShort(addrOld + X86.TSS.TASK_SI, cpu.regESI);
cpu.setShort(addrOld + X86.TSS.TASK_DI, cpu.regEDI);
cpu.setShort(addrOld + X86.TSS.TASK_ES, cpu.segES.sel);
cpu.setShort(addrOld + X86.TSS.TASK_CS, cpu.segCS.sel);
cpu.setShort(addrOld + X86.TSS.TASK_SS, cpu.segSS.sel);
cpu.setShort(addrOld + X86.TSS.TASK_DS, cpu.segDS.sel);
/*
* Reload all registers from the new TSS; it's important to reload the LDTR sooner
* rather than later, so that as segment registers are reloaded, any LDT selectors will
* will be located in the correct table.
*/
cpu.segLDT.load(cpu.getShort(addrNew + X86.TSS.TASK_LDT));
cpu.setPS(cpu.getShort(addrNew + X86.TSS.TASK_PS) | (fNest? X86.PS.NT : 0));
cpu.assert(!fNest || !!(cpu.regPS & X86.PS.NT));
cpu.regEAX = cpu.getShort(addrNew + X86.TSS.TASK_AX);
cpu.regECX = cpu.getShort(addrNew + X86.TSS.TASK_CX);
cpu.regEDX = cpu.getShort(addrNew + X86.TSS.TASK_DX);
cpu.regEBX = cpu.getShort(addrNew + X86.TSS.TASK_BX);
cpu.regEBP = cpu.getShort(addrNew + X86.TSS.TASK_BP);
cpu.regESI = cpu.getShort(addrNew + X86.TSS.TASK_SI);
cpu.regEDI = cpu.getShort(addrNew + X86.TSS.TASK_DI);
cpu.segES.load(cpu.getShort(addrNew + X86.TSS.TASK_ES));
cpu.segDS.load(cpu.getShort(addrNew + X86.TSS.TASK_DS));
cpu.setCSIP(cpu.getShort(addrNew + X86.TSS.TASK_IP), cpu.getShort(addrNew + X86.TSS.TASK_CS));
var offSS = X86.TSS.TASK_SS;
var offSP = X86.TSS.TASK_SP;
if (this.cpl < cplOld) {
offSP = (this.cpl << 2) + X86.TSS.CPL0_SP;
offSS = offSP + 2;
}
cpu.setSS(cpu.getShort(addrNew + offSS), true);
cpu.setSP(cpu.getShort(addrNew + offSP));
if (fNest) cpu.setShort(addrNew + X86.TSS.PREV_TSS, selOld);
cpu.regCR0 |= X86.CR0.MSW.TS;
return true;
};
/**
* setBase(addr)
*
* This is used in unusual situations where the base must be set independently; normally, the base
* is set according to the selector provided to load(), but there are a few cases where setBase()
* is required.
*
* For example, in resetRegs(), the real-mode CS selector must be reset to 0xF000 for an 80286 or 80386,
* but the CS base must be set to 0x00FF0000 or 0xFFFF0000, respectively. To simplify life for setBase()
* callers, we allow them to specify 32-bit bases, which we then truncate to 24 bits as needed.
*
* WARNING: Since the CPU must maintain regLIP as the sum of the CS base and the current IP, all calls
* to segCS.setBase() need to go through setCSBase().
*
* @this {X86Seg}
* @param {number} addr
* @return {number} addr, truncated as needed
*/
X86Seg.prototype.setBase = function(addr)
{
if (this.cpu.model < X86.MODEL_80386) addr &= 0xffffff;
return this.base = addr;
};
/**
* save()
*
* Early versions of PCjs saved only segment selectors, since that's all that mattered in real-mode;
* newer versions need to save/restore all the "defining" properties of the X86Seg object.
*
* @this {X86Seg}
* @return {Array}
*/
X86Seg.prototype.save = function()
{
return [
this.sel,
this.base,
this.limit,
this.acc,
this.id,
this.sName,
this.cpl,
this.dpl,
this.addrDesc,
this.addrSize,
this.addrMask,
this.dataSize,
this.dataMask,
this.type,
this.offMax
];
};
/**
* restore(a)
*
* Early versions of PCjs saved only segment selectors, since that's all that mattered in real-mode;
* newer versions need to save/restore all the "defining" properties of the X86Seg object.
*
* @this {X86Seg}
* @param {Array|number} a
*/
X86Seg.prototype.restore = function(a)
{
if (typeof a == "number") {
this.load(a);
} else {
this.sel = a[0];
this.base = a[1];
this.limit = a[2];
this.acc = a[3];
this.id = a[4];
this.sName = a[5];
this.cpl = a[6];
this.dpl = a[7];
this.addrDesc = a[8];
this.addrSize = a[9] || 2;
this.addrMask = a[10] || 0xffff;
this.dataSize = a[11] || 2;
this.dataMask = a[12] || 0xffff;
this.type = a[13] || (this.acc & X86.DESC.ACC.TYPE.MASK);
this.offMax = a[14] || (this.limit >>> 0) + 1;
}
};
/**
* updateMode(fLoad, fProt)
*
* Ensures that the segment register's access (ie, load and check methods) matches the specified (or current)
* operating mode (real or protected).
*
* @this {X86Seg}
* @param {boolean} [fLoad] true if the segment was just (re)loaded, false if not
* @param {boolean} [fProt] true for protected-mode access, false for real-mode access, undefined for current mode
* @return {boolean}
*/
X86Seg.prototype.updateMode = function(fLoad, fProt)
{
if (fProt === undefined) {
fProt = !!(this.cpu.regCR0 & X86.CR0.MSW.PE);
}
/*
* The following properties are used for STACK segments only (ie, segSS); we want to make it easier
* for setSS() to set stack lower and upper limits, which requires knowing whether or not the segment is
* marked as EXPDOWN.
*/
this.fExpDown = false;
if (fProt) {
this.load = this.loadProt;
this.loadIDT = this.loadIDTProt;
this.checkRead = this.checkReadProt;
this.checkWrite = this.checkWriteProt;
/*
* TODO: For null GDT selectors, should we rely on the descriptor being invalid, or should we assume that
* the null descriptor might contain uninitialized (or other) data? I'm assuming the latter, hence the
* following null selector test. However, if we're not going to consult the descriptor, is there anything
* else we should (or should not) be doing for null GDT selectors?
*/
if (!(this.sel & ~X86.SEL.RPL)) {
this.checkRead = this.checkReadProtDisallowed;
this.checkWrite = this.checkWriteProtDisallowed;
}
else if (this.type & X86.DESC.ACC.TYPE.SEG) {
/*
* If the READABLE bit of CODE_READABLE is not set, then disallow reads.
*/
if ((this.type & X86.DESC.ACC.TYPE.CODE_READABLE) == X86.DESC.ACC.TYPE.CODE_EXECONLY) {
this.checkRead = this.checkReadProtDisallowed;
}
/*
* If the CODE bit is set, or the the WRITABLE bit is not set, then disallow writes.
*/
if ((this.type & X86.DESC.ACC.TYPE.CODE) || !(this.type & X86.DESC.ACC.TYPE.WRITABLE)) {
this.checkWrite = this.checkWriteProtDisallowed;
}
/*
* If the CODE bit is not set *and* the EXPDOWN bit is set, then invert the limit check.
*/
if ((this.type & (X86.DESC.ACC.TYPE.CODE | X86.DESC.ACC.TYPE.EXPDOWN)) == X86.DESC.ACC.TYPE.EXPDOWN) {
if (this.checkRead == this.checkReadProt) this.checkRead = this.checkReadProtDown;
if (this.checkWrite == this.checkWriteProt) this.checkWrite = this.checkWriteProtDown;
this.fExpDown = true;
}
}
/*
* TODO: For non-SEG descriptors, are there other checks or functions we should establish?
*/
/*
* Any update to the following properties must occur only on segment loads, not simply when
* we're updating segment registers as part of a mode change.
*/
if (fLoad) {
/*
* We must update the descriptor's ACCESSED bit whenever the segment is "accessed" (ie,
* loaded); unlike the ACCESSED and DIRTY bits in PTEs, a descriptor ACCESSED bit is only
* updated on loads, not on every memory access.
*
* We compute address of the descriptor byte containing the ACCESSED bit (offset 0x5);
* note that it's perfectly normal for addrDesc to occasionally be invalid (eg, when the CPU
* is creating protected-mode-only segment registers like LDT and TSS, or when the CPU has
* transitioned from real-mode to protected-mode and new selector(s) have not been loaded yet).
*
* TODO: Note I do NOT update the ACCESSED bit for null GDT selectors, because I assume the
* hardware does not update it either. In fact, I've seen code that uses the null GDT descriptor
* for other purposes, on the assumption that that descriptor is completely unused.
*/
if ((this.sel & ~X86.SEL.RPL) && this.addrDesc !== X86.ADDR_INVALID) {
var addrType = this.addrDesc + X86.DESC.ACC.TYPE.OFFSET;
this.cpu.setByte(addrType, this.cpu.getByte(addrType) | (X86.DESC.ACC.TYPE.ACCESSED >> 8));
}
this.cpl = this.sel & X86.SEL.RPL;
this.dpl = (this.acc & X86.DESC.ACC.DPL.MASK) >> X86.DESC.ACC.DPL.SHIFT;
if (this.cpu.model < X86.MODEL_80386 || !(this.ext & X86.DESC.EXT.BIG)) {
this.dataSize = 2;
this.dataMask = 0xffff;
} else {
this.dataSize = 4;
this.dataMask = (0xffffffff|0);
}
this.addrSize = this.dataSize;
this.addrMask = this.dataMask;
}
} else {
this.load = this.loadReal;
this.loadIDT = this.loadIDTReal;
this.checkRead = this.checkReadReal;
this.checkWrite = this.checkWriteReal;
this.cpl = this.dpl = 0;
this.addrDesc = X86.ADDR_INVALID;
}
return fProt;
};
/**
* messageSeg(sel, base, limit, type, ext)
*
* @this {X86Seg}
* @param {number} sel
* @param {number} base
* @param {number} limit
* @param {number} type
* @param {number} [ext]
*/
X86Seg.prototype.messageSeg = function(sel, base, limit, type, ext)
{
if (DEBUG) {
if (DEBUGGER && this.dbg && this.dbg.messageEnabled(Messages.SEG)) {
var ch = (this.sName.length < 3? " " : "");
var sDPL = " dpl=" + this.dpl;
if (this.id == X86Seg.ID.CODE) sDPL += " cpl=" + this.cpl;
this.dbg.message("loadSeg(" + this.sName + "):" + ch + "sel=" + str.toHexWord(sel) + " base=" + str.toHex(base) + " limit=" + str.toHexWord(limit) + " type=" + str.toHexWord(type) + sDPL, true);
}
this.cpu.assert(/* base !== X86.ADDR_INVALID && */ (this.cpu.model >= X86.MODEL_80386 || !ext || ext == X86.DESC.EXT.AVAIL));
}
};
if (typeof module !== 'undefined') module.exports = X86Seg;
PCjs Templates === Template folders contain a variety of XML and HTML templates and supporting files, including: - DTD files (Document Type Definitions) - XSD files (XML schemas -- eventually) - XSL files (XML stylesheets) - CSS files (stylesheets that the XSL files rely upon) - HTML files (HTML fragments used to generate part or all of a web page) [*components.xsl*](components.xsl) transforms all the elements of a machine XML file into an HTML fragment that includes a series of **DIV** tags with corresponding *id* and *data-value* attributes that allow our JavaScript components to bind themselves to visual elements (eg, virtual screen, virtual keyboard, control panel) on a web page.
@CHARSET "UTF-8";
/* @author Jeff Parsons (@jeffpar)
@website http://www.pcjs.org/
@created 2013-05-05
@modified 2014-03-12
@license http://www.gnu.org/licenses/gpl.html
*/
*:not(input,textarea) {
-webkit-user-select: none;
}
.pcjs-embed {
}
.pcjs-embed:after {
clear:both;
}
.pcjs-name, .pcjs-menu {
clear: both;
font-weight: bold;
padding-bottom: 4px;
}
.pcjs-menu {
float: left;
}
.pcjs-canvas {
width: 100%;
height: auto;
}
.pcjs-container {
color: #000000;
position: relative;
}
.pcjs-label {
font-size: small;
line-height: 19px;
vertical-align: middle;
float: left;
font-family: "Lucida Console", monospace;
}
.pcjs-control textarea {
font-family: Monaco, monospace;
font-size: x-small;
}
.pcjs-fieldset {
border: none;
margin: 0;
padding: 0;
}
.pcjs-flag {
font-family: "Lucida Console", monospace;
font-size: small;
text-align: center;
line-height: 19px;
vertical-align: middle;
}
.pcjs-register {
font-family: "Lucida Console", monospace;
font-size: small;
text-align: center;
line-height: 19px;
vertical-align: middle;
border: 1px solid black;
}
.pcjs-switches {
float: left;
}
.pcjs-bitBucket {
float: left;
width: 19px;
height: 38px;
}
.pcjs-bitCell {
float: left;
width: 19px;
height: 19px;
margin-right: -1px;
margin-bottom: -1px;
border: 1px solid black;
text-align: center;
line-height: 19px; /* the equivalent of "vertical-align: middle" for single-line elements */
}
.pcjs-bitCellLeft {
border-left: 1px solid black;
}
.pcjs-bitLabel {
font-size: xx-small;
text-align: center;
}
.pcjs-description, .pcjs-status {
font-size: x-small;
line-height: 2em;
}
.pcjs-key {
border: 1px solid black;
font-size: x-small;
text-align: center;
position: absolute;
height: 34px;
line-height: 34px; /* the equivalent of "vertical-align: middle" for single-line elements */
background-color: #ffffff;
}
.pcjs-led {
float: left;
width: 8px;
height: 8px;
margin: 4px;
border: 1px solid black;
text-align: center;
line-height: 19px; /* the equivalent of "vertical-align: middle" for single-line elements */
background-color: #000000;
}
.pcjs-video-object {
clear: both;
height: auto;
position: relative;
line-height: 0; /* this is just an attempt to eliminate the side-effects of any whitespace between inner DIVs */
}
.pcjs-video-object textarea {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
opacity: 0;
border: 0;
padding: 0;
line-height: 0; /* try to prevent Safari on iOS from always displaying a blinking cursor */
}
.pcjs-reference {
float: left;
font-size: x-small;
}
.pcjs-reference a {
text-decoration: none;
}
.pcjs-copyright {
float: right;
font-size: x-small;
}
.pcjs-copyright a {
text-decoration: none;
}
@media screen and (max-width: 900px) {
.pcjs-textarea {
width: 100% !important;
}
.pcjs-registers {
width: 100% !important;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2012-05-05" modified="2014-02-23" license="http://www.gnu.org/licenses/gpl.html" -->
<!DOCTYPE xsl:stylesheet [
<!-- XSLT understands these entities only: lt, gt, apos, quot, and amp. Other required entities may be defined below (see http://www.pcjs.org/modules/shared/templates/entities.dtd). -->
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="rootDir" select="''"/>
<xsl:param name="generator" select="'client'"/>
<xsl:variable name="MACHINECLASS">pc</xsl:variable>
<xsl:variable name="APPCLASS">pcjs</xsl:variable>
<xsl:variable name="APPVERSION">1.x.x</xsl:variable>
<xsl:variable name="SITEHOST">www.pcjs.org</xsl:variable>
<xsl:template name="componentStyles">
<link rel="stylesheet" type="text/css" href="/versions/{$APPCLASS}/{$APPVERSION}/components.css"/>
</xsl:template>
<xsl:template name="componentScripts">
<xsl:param name="component"/>
<script type="text/javascript" src="/versions/{$APPCLASS}/{$APPVERSION}/{$component}.js"> </script>
</xsl:template>
<xsl:template name="componentIncludes">
<xsl:param name="component"/>
<xsl:call-template name="componentScripts"><xsl:with-param name="component" select="$component"/></xsl:call-template>
</xsl:template>
<xsl:template name="machine">
<xsl:param name="href">/devices/pc/machine/5150/mda/64kb/machine.xml</xsl:param>
<xsl:param name="state" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="$href"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/machine">
<xsl:with-param name="machineState" select="$state"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="machine[@ref]">
<xsl:param name="machineState" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/machine">
<xsl:with-param name="machine" select="@id"/>
<xsl:with-param name="machineState">
<xsl:choose>
<xsl:when test="$machineState != ''"><xsl:value-of select="$machineState"/></xsl:when>
<xsl:otherwise><xsl:value-of select="@state"/></xsl:otherwise>
</xsl:choose>
</xsl:with-param>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="machine[not(@ref)]">
<xsl:param name="machine"><xsl:value-of select="@id"/></xsl:param>
<xsl:param name="machineState" select="''"/>
<xsl:variable name="machineStyle">
<xsl:if test="@float">float:<xsl:value-of select="@float"/></xsl:if>
</xsl:variable>
<div id="{$machine}" class="machine {@class}js" style="{$machineStyle}">
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="machineState">
<xsl:choose>
<xsl:when test="$machineState != ''"><xsl:value-of select="$machineState"/></xsl:when>
<xsl:otherwise><xsl:value-of select="@state"/></xsl:otherwise>
</xsl:choose>
</xsl:with-param>
<xsl:with-param name="component" select="'machine'"/>
<xsl:with-param name="class"><xsl:value-of select="@class"/>js</xsl:with-param>
<xsl:with-param name="parms"><xsl:if test="@parms">,<xsl:value-of select="@parms"/></xsl:if></xsl:with-param>
<xsl:with-param name="url"><xsl:value-of select="@url"/></xsl:with-param>
</xsl:call-template>
</div>
</xsl:template>
<xsl:template match="component[@ref]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/component">
<xsl:with-param name="machine" select="$machine"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="component[not(@ref)]">
<xsl:param name="machine" select="''"/>
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="class" select="@class"/>
<xsl:with-param name="parms"><xsl:if test="@parms">,<xsl:value-of select="@parms"/></xsl:if></xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template name="component">
<xsl:param name="machine" select="''"/>
<xsl:param name="machineState" select="''"/>
<xsl:param name="component" select="name(.)"/>
<xsl:param name="class" select="''"/>
<xsl:param name="parms" select="''"/>
<xsl:param name="url" select="''"/>
<xsl:variable name="id">
<xsl:choose>
<xsl:when test="$component = 'machine'"><xsl:value-of select="$machine"/>.machine</xsl:when>
<xsl:when test="$machine != '' and @id"><xsl:value-of select="$machine"/>.<xsl:value-of select="@id"/></xsl:when>
<xsl:when test="$machine != ''"><xsl:value-of select="$machine"/>.<xsl:value-of select="$component"/></xsl:when>
<xsl:when test="@id"><xsl:value-of select="@id"/></xsl:when>
<xsl:otherwise><xsl:value-of select="$component"/></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="componentURL">
<xsl:choose>
<xsl:when test="$component = 'machine'">url:'<xsl:value-of select="$url"/>'</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="name">
<xsl:choose>
<xsl:when test="name"><xsl:value-of select="name"/></xsl:when>
<xsl:when test="@name"><xsl:value-of select="@name"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="comment">
<xsl:choose>
<xsl:when test="@comment">,comment:'<xsl:value-of select="@comment"/>'</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="border">
<xsl:choose>
<xsl:when test="@border = '1'">border:1px solid black;border-radius:15px;</xsl:when>
<xsl:when test="@border">border:<xsl:value-of select="@border"/>;</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="left">
<xsl:choose>
<xsl:when test="@left">left:<xsl:value-of select="@left"/>;</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="top">
<xsl:choose>
<xsl:when test="@top">top:<xsl:value-of select="@top"/>;</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="width">
<xsl:choose>
<xsl:when test="@width">
<xsl:choose>
<xsl:when test="$left != '' or $top != ''">width:<xsl:value-of select="@width"/>;</xsl:when>
<xsl:otherwise>width:auto;max-width:<xsl:value-of select="@width"/>;</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="height">
<xsl:choose>
<xsl:when test="@height">height:<xsl:value-of select="@height"/>;</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="padding">
<xsl:choose>
<xsl:when test="@padding">padding:<xsl:value-of select="@padding"/>;</xsl:when>
<xsl:otherwise>
<xsl:if test="@padtop">padding-top:<xsl:value-of select="@padtop"/>;</xsl:if>
<xsl:if test="@padright">padding-right:<xsl:value-of select="@padright"/>;</xsl:if>
<xsl:if test="@padbottom">padding-bottom:<xsl:value-of select="@padbottom"/>;</xsl:if>
<xsl:if test="@padleft">padding-left:<xsl:value-of select="@padleft"/>;</xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="pos">
<xsl:choose>
<xsl:when test="@pos = 'left'">float:left;</xsl:when>
<xsl:when test="@pos = 'right'">float:right;</xsl:when>
<xsl:when test="@pos = 'center'">margin:0 auto;</xsl:when>
<xsl:when test="@pos">position:<xsl:value-of select="@pos"/>;</xsl:when>
<xsl:when test="$left != '' or $top != ''">position:relative;</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="style">
<xsl:if test="$component = 'machine'">overflow:auto;width:100%;</xsl:if>
<xsl:if test="@style"><xsl:value-of select="@style"/></xsl:if>
</xsl:variable>
<xsl:variable name="componentClass">
<xsl:value-of select="$APPCLASS"/><xsl:text>-</xsl:text><xsl:value-of select="$component"/><xsl:text> </xsl:text><xsl:value-of select="$APPCLASS"/><xsl:text>-component</xsl:text>
</xsl:variable>
<div id="{$id}" class="{$componentClass}" style="{$width}{$height}{$pos}{$left}{$top}{$padding}" data-value="{$componentURL}">
<xsl:if test="$component = 'machine'">
<xsl:apply-templates select="name" mode="machine"/>
</xsl:if>
<xsl:if test="$component != 'machine'">
<xsl:apply-templates select="name" mode="component"/>
</xsl:if>
<div class="{$APPCLASS}-container" style="{$border}{$style}">
<xsl:if test="$component = 'machine'">
<xsl:apply-templates select="menu" mode="machine"/>
</xsl:if>
<xsl:if test="$component != 'machine'">
<xsl:apply-templates select="menu" mode="component"/>
</xsl:if>
<xsl:if test="$class != '' and $component != 'machine'">
<div class="{$APPCLASS}-{$class}-object" data-value="id:'{$id}',name:'{$name}'{$comment}{$parms}"> </div>
</xsl:if>
<xsl:if test="control">
<div class="{$APPCLASS}-controls">
<xsl:apply-templates select="control" mode="component"/>
</div>
</xsl:if>
<xsl:apply-templates>
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="machineState" select="$machineState"/>
</xsl:apply-templates>
</div>
<xsl:if test="$component = 'machine'">
<xsl:choose>
<xsl:when test="$url != ''"><div class="{$APPCLASS}-reference">[<a href="{$url}">XML</a>]</div></xsl:when>
<xsl:otherwise/>
</xsl:choose>
<div class="{$APPCLASS}-copyright">
<a href="http://{$SITEHOST}" target="_blank">PCjs</a> v<xsl:value-of select="$APPVERSION"/> © 2012-2015 by <a href="http://twitter.com/jeffpar" target="_blank">@jeffpar</a>
</div>
<div style="clear:both"> </div>
</xsl:if>
</div>
</xsl:template>
<xsl:template match="name" mode="machine">
<xsl:variable name="pos">
<xsl:choose>
<xsl:when test="@pos = 'center'">text-align:center;</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<h2 style="{$pos}"><xsl:apply-templates/></h2>
</xsl:template>
<xsl:template match="name" mode="component">
<div class="{$APPCLASS}-name"><xsl:apply-templates/></div>
</xsl:template>
<xsl:template match="menu" mode="component">
<xsl:apply-templates mode="component"/>
</xsl:template>
<xsl:template match="title" mode="component">
<div class="{$APPCLASS}-menu"><xsl:apply-templates/></div>
</xsl:template>
<xsl:template match="control" mode="component">
<xsl:variable name="type">
<xsl:text>type:'</xsl:text><xsl:value-of select="@type"/><xsl:text>'</xsl:text>
</xsl:variable>
<xsl:variable name="binding">
<xsl:text>binding:'</xsl:text><xsl:value-of select="@binding"/><xsl:text>'</xsl:text>
</xsl:variable>
<xsl:variable name="border">
<xsl:choose>
<xsl:when test="@border = '1'">border:1px solid black;</xsl:when>
<xsl:when test="@border">border:<xsl:value-of select="@border"/>;</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="width">
<xsl:choose>
<xsl:when test="@width">width:<xsl:value-of select="@width"/>;</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="height">
<xsl:choose>
<xsl:when test="@height">height:<xsl:value-of select="@height"/>;</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="left">
<xsl:choose>
<xsl:when test="@left">left:<xsl:value-of select="@left"/>;</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="top">
<xsl:choose>
<xsl:when test="@top">top:<xsl:value-of select="@top"/>;</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="padding">
<xsl:choose>
<xsl:when test="@padding">padding:<xsl:value-of select="@padding"/>;</xsl:when>
<xsl:otherwise>
<xsl:if test="@padtop">padding-top:<xsl:value-of select="@padtop"/>;</xsl:if>
<xsl:if test="@padright">padding-right:<xsl:value-of select="@padright"/>;</xsl:if>
<xsl:if test="@padbottom">padding-bottom:<xsl:value-of select="@padbottom"/>;</xsl:if>
<xsl:if test="@padleft">padding-left:<xsl:value-of select="@padleft"/>;</xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="pos">
<xsl:choose>
<xsl:when test="@pos = 'left'">float:left;</xsl:when>
<xsl:when test="@pos = 'right'">float:right;</xsl:when>
<xsl:when test="@pos = 'center'">margin:0 auto;</xsl:when>
<xsl:when test="@pos">position:<xsl:value-of select="@pos"/>;</xsl:when>
<xsl:when test="$left != '' or $top != ''">position:relative;</xsl:when>
<xsl:otherwise><xsl:if test="$left = ''">float:left;</xsl:if></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="style">
<xsl:choose>
<xsl:when test="@style"><xsl:value-of select="@style"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="containerClass">
<xsl:if test="@type = 'container' and @class"><xsl:text> </xsl:text><xsl:value-of select="@class"/></xsl:if>
</xsl:variable>
<xsl:variable name="containerStyle">
<xsl:value-of select="$pos"/><xsl:value-of select="$left"/><xsl:value-of select="$top"/><xsl:value-of select="$padding"/>
<xsl:choose>
<xsl:when test="@type = 'container'"><xsl:value-of select="$border"/><xsl:value-of select="$width"/><xsl:value-of select="$height"/><xsl:value-of select="$style"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<div class="{$APPCLASS}-control{$containerClass}" style="{$containerStyle}">
<xsl:variable name="fontsize">
<xsl:choose>
<xsl:when test="@size = 'large' or @size = 'small'">font-size:<xsl:value-of select="@size"/>;</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="subClass">
<xsl:if test="@label"><xsl:text> </xsl:text><xsl:value-of select="$APPCLASS"/><xsl:text>-label</xsl:text></xsl:if>
</xsl:variable>
<xsl:variable name="labelWidth">
<xsl:if test="@labelwidth">width:<xsl:value-of select="@labelwidth"/>;</xsl:if>
</xsl:variable>
<xsl:variable name="labelStyle">
<xsl:choose>
<xsl:when test="@labelstyle"><xsl:value-of select="@labelstyle"/></xsl:when>
<xsl:otherwise>text-align:right;</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:if test="@label">
<xsl:if test="not(@labelpos) or @labelpos = 'left'">
<div class="{$APPCLASS}-label" style="{$labelWidth}{$labelStyle}"><xsl:value-of select="@label"/></div>
</xsl:if>
</xsl:if>
<xsl:choose>
<xsl:when test="@type = 'canvas'">
<canvas class="{$APPCLASS}-binding {$APPCLASS}-canvas" width="{@width}" height="{@height}" style="-webkit-user-select:none;{$border}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></canvas>
</xsl:when>
<xsl:when test="@type = 'button'">
<button class="{$APPCLASS}-binding" style="-webkit-user-select:none;{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></button>
</xsl:when>
<xsl:when test="@type = 'list'">
<select class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}">
<xsl:apply-templates select="disk|app|manifest" mode="component"/>
</select>
</xsl:when>
<xsl:when test="@type = 'text'">
<input class="{$APPCLASS}-binding" type="text" style="{$border}{$width}{$height}{$style}" data-value="{$type},{$binding}" value="{.}" autocapitalize="off" autocorrect="off"/>
</xsl:when>
<xsl:when test="@type = 'submit'">
<input class="{$APPCLASS}-binding" type="submit" style="{$border}{$fontsize}{$style}" data-value="{$type},{$binding}" value="{.}"/>
</xsl:when>
<xsl:when test="@type = 'textarea'">
<textarea class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$style}" data-value="{$type},{$binding}" readonly="readonly"> </textarea>
</xsl:when>
<xsl:when test="@type = 'heading'">
<div><xsl:value-of select="."/></div>
</xsl:when>
<xsl:when test="@type = 'file'">
<form class="{$APPCLASS}-binding" data-value="{$type},{$binding}">
<fieldset class="{$APPCLASS}-fieldset">
<input type="file"/>
<input type="submit" value="Mount" disabled="true"/>
</fieldset>
</form>
</xsl:when>
<xsl:when test="@type = 'led'">
<div class="{$APPCLASS}-binding {$APPCLASS}-{@type}" data-value="{$type},{$binding}"><xsl:value-of select="."/></div>
</xsl:when>
<xsl:when test="@type = 'separator'">
<hr/>
</xsl:when>
<xsl:when test="@type = 'container'">
<xsl:apply-templates mode="component"/>
</xsl:when>
<xsl:when test="not(@type)">
<div style="clear:both"> </div>
</xsl:when>
<xsl:otherwise>
<div class="{$APPCLASS}-binding{$subClass} {$APPCLASS}-{@type}" style="-webkit-user-select:none;{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></div>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="@label">
<xsl:if test="@labelpos = 'right'">
<div class="{$APPCLASS}-label" style="{$labelWidth}{$labelStyle}"><xsl:value-of select="@label"/></div>
</xsl:if>
<div style="clear:both"> </div>
</xsl:if>
</div>
</xsl:template>
<xsl:template match="disk[@ref]" mode="component">
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/disk" mode="component"/>
</xsl:template>
<xsl:template match="disk[not(@ref)]" mode="component">
<xsl:variable name="desc">
<xsl:if test="@desc">
<xsl:text>desc:'</xsl:text><xsl:value-of select="@desc"/><xsl:text>'</xsl:text>
<xsl:if test="@href">
<xsl:text>,href:'</xsl:text><xsl:value-of select="@href"/><xsl:text>'</xsl:text>
</xsl:if>
</xsl:if>
</xsl:variable>
<option value="{@path}" data-value="{$desc}"><xsl:if test="name"><xsl:value-of select="name"/></xsl:if><xsl:if test="not(name)"><xsl:value-of select="."/></xsl:if></option>
</xsl:template>
<xsl:template match="app[@ref]" mode="component">
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/app" mode="component"/>
</xsl:template>
<xsl:template match="app[not(@ref)]" mode="component">
<xsl:variable name="desc">
<xsl:if test="@desc">
<xsl:text>desc:'</xsl:text><xsl:value-of select="@desc"/><xsl:text>'</xsl:text>
<xsl:if test="@href">
<xsl:text>,href:'</xsl:text><xsl:value-of select="@href"/><xsl:text>'</xsl:text>
</xsl:if>
</xsl:if>
</xsl:variable>
<xsl:variable name="path">
<xsl:if test="@path"><xsl:value-of select="@path"/></xsl:if>
</xsl:variable>
<xsl:variable name="files">
<xsl:for-each select="file"><xsl:if test="position() = 1"><xsl:value-of select="$path"/></xsl:if><xsl:value-of select="@name"/><xsl:if test="position() != last()">;</xsl:if></xsl:for-each>
</xsl:variable>
<option value="{$files}" data-value="{$desc}"><xsl:value-of select="@name"/></option>
</xsl:template>
<xsl:template match="manifest[@ref]" mode="component">
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/manifest" mode="component">
<xsl:with-param name="disk"><xsl:value-of select="@disk"/></xsl:with-param>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="manifest[not(@ref)]" mode="component">
<xsl:param name="disk"><xsl:value-of select="@disk"/></xsl:param>
<xsl:if test="$disk != ''">
<xsl:variable name="prefix">
<xsl:if test="title/@prefix"><xsl:value-of select="title/@prefix"/><xsl:text>: </xsl:text></xsl:if>
</xsl:variable>
<xsl:for-each select="disk">
<xsl:if test="$disk = @id or $disk = '*'">
<xsl:variable name="name">
<xsl:choose>
<xsl:when test="name"><xsl:value-of select="$prefix"/><xsl:value-of select="name"/></xsl:when>
<xsl:when test="normalize-space(./text()) != ''">
<xsl:value-of select="$prefix"/><xsl:value-of select="normalize-space(./text())"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="../title"/><xsl:if test="../version != ''"><xsl:text> </xsl:text><xsl:value-of select="../version"/></xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="link">
<xsl:if test="link">
<xsl:text>desc:'</xsl:text><xsl:value-of select="link"/><xsl:text>'</xsl:text>
<xsl:if test="link/@href">
<xsl:text>,href:'</xsl:text><xsl:value-of select="link/@href"/><xsl:text>'</xsl:text>
</xsl:if>
</xsl:if>
</xsl:variable>
<!-- TODO: Think about incorporating the optional "desc" tag into the disk description (see /disks/pc/tools/microsoft/MSC-048014.400/manifest.xml) -->
<xsl:if test="@href">
<option value="{@href}" data-value="{$link}"><xsl:value-of select="$name"/></option>
</xsl:if>
<xsl:if test="not(@href)">
<xsl:variable name="dir">
<xsl:if test="@dir"><xsl:value-of select="@dir"/></xsl:if>
</xsl:variable>
<xsl:variable name="files">
<xsl:for-each select="file"><xsl:if test="position() = 1"><xsl:value-of select="$dir"/></xsl:if><xsl:value-of select="@dir"/><xsl:value-of select="."/><xsl:if test="position() != last()">;</xsl:if></xsl:for-each>
</xsl:variable>
<option value="{$files}" data-value="{$link}"><xsl:value-of select="$name"/></option>
</xsl:if>
</xsl:if>
</xsl:for-each>
</xsl:if>
</xsl:template>
<xsl:template match="name">
</xsl:template>
<xsl:template match="title">
</xsl:template>
<xsl:template match="control">
</xsl:template>
<xsl:template match="cpu[@ref]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/cpu"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
</xsl:template>
<xsl:template match="cpu[not(@ref)]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="model">
<xsl:choose>
<xsl:when test="@model"><xsl:value-of select="@model"/></xsl:when>
<xsl:otherwise>8088</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="cycles">
<xsl:choose>
<xsl:when test="@cycles"><xsl:value-of select="@cycles"/></xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="multiplier">
<xsl:choose>
<xsl:when test="@multiplier"><xsl:value-of select="@multiplier"/></xsl:when>
<xsl:otherwise>1</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="autoStart">
<xsl:choose>
<xsl:when test="@autostart"><xsl:value-of select="@autostart"/></xsl:when>
<xsl:otherwise>null</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="csStart">
<xsl:choose>
<xsl:when test="@csstart"><xsl:value-of select="@csstart"/></xsl:when>
<xsl:otherwise>-1</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="csInterval">
<xsl:choose>
<xsl:when test="@csinterval"><xsl:value-of select="@csinterval"/></xsl:when>
<xsl:otherwise>-1</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="csStop">
<xsl:choose>
<xsl:when test="@csstop"><xsl:value-of select="@csstop"/></xsl:when>
<xsl:otherwise>-1</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="class" select="'cpu'"/>
<xsl:with-param name="parms">,model:<xsl:value-of select="$model"/>,cycles:<xsl:value-of select="$cycles"/>,multiplier:<xsl:value-of select="$multiplier"/>,autoStart:<xsl:value-of select="$autoStart"/>,csStart:<xsl:value-of select="$csStart"/>,csInterval:<xsl:value-of select="$csInterval"/>,csStop:<xsl:value-of select="$csStop"/></xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="chipset[@ref]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/chipset"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
</xsl:template>
<xsl:template match="chipset[not(@ref)]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="model">
<xsl:choose>
<xsl:when test="@model"><xsl:value-of select="@model"/></xsl:when>
<xsl:otherwise>5150</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="sw1">
<xsl:choose>
<xsl:when test="@sw1"><xsl:value-of select="@sw1"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="sw2">
<xsl:choose>
<xsl:when test="@sw2"><xsl:value-of select="@sw2"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="sound">
<xsl:choose>
<xsl:when test="@sound"><xsl:value-of select="@sound"/></xsl:when>
<xsl:otherwise>true</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="scaletimers">
<xsl:choose>
<xsl:when test="@scaletimers"><xsl:value-of select="@scaletimers"/></xsl:when>
<xsl:otherwise>false</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="floppies">
<xsl:choose>
<xsl:when test="@floppies"><xsl:value-of select="@floppies"/></xsl:when>
<xsl:otherwise>{}</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="monitor">
<xsl:choose>
<xsl:when test="@monitor"><xsl:value-of select="@monitor"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="rtcdate">
<xsl:choose>
<xsl:when test="@rtcdate"><xsl:value-of select="@rtcdate"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="class">chipset</xsl:with-param>
<xsl:with-param name="parms">,model:'<xsl:value-of select="$model"/>',scaleTimers:<xsl:value-of select="$scaletimers"/>,sw1:'<xsl:value-of select="$sw1"/>',sw2:'<xsl:value-of select="$sw2"/>',sound:<xsl:value-of select="$sound"/>,floppies:<xsl:value-of select="$floppies"/>,monitor:'<xsl:value-of select="$monitor"/>',rtcDate:'<xsl:value-of select="$rtcdate"/>'</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="keyboard[@ref]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/keyboard"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
</xsl:template>
<xsl:template match="keyboard[not(@ref)]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="model">
<xsl:choose>
<xsl:when test="@model"><xsl:value-of select="@model"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="class">keyboard</xsl:with-param>
<xsl:with-param name="parms">,model:'<xsl:value-of select="$model"/>'</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="serial[@ref]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/serial"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
</xsl:template>
<xsl:template match="serial[not(@ref)]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="adapter">
<xsl:choose>
<xsl:when test="@adapter"><xsl:value-of select="@adapter"/></xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="binding">
<xsl:choose>
<xsl:when test="@binding"><xsl:value-of select="@binding"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="class">serial</xsl:with-param>
<xsl:with-param name="parms">,adapter:<xsl:value-of select="$adapter"/>,binding:'<xsl:value-of select="$binding"/>'</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="mouse[@ref]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/mouse"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
</xsl:template>
<xsl:template match="mouse[not(@ref)]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="serial">
<xsl:choose>
<xsl:when test="@serial"><xsl:value-of select="@serial"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="class">mouse</xsl:with-param>
<xsl:with-param name="parms">,serial:'<xsl:value-of select="$serial"/>'</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="fdc[@ref]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/fdc">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="mount" select="@automount"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="fdc[not(@ref)]">
<xsl:param name="machine" select="''"/>
<xsl:param name="mount" select="''"/>
<xsl:variable name="automount">
<xsl:choose>
<xsl:when test="$mount != ''"><xsl:value-of select="$mount"/></xsl:when>
<xsl:otherwise><xsl:value-of select="@automount"/></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="class">fdc</xsl:with-param>
<xsl:with-param name="parms">,autoMount:'<xsl:value-of select="$automount"/>'</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="hdc[@ref]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/hdc"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
</xsl:template>
<xsl:template match="hdc[not(@ref)]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="drives">
<xsl:choose>
<xsl:when test="@drives"><xsl:value-of select="@drives"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="type">
<xsl:choose>
<xsl:when test="@type"><xsl:value-of select="@type"/></xsl:when>
<xsl:otherwise>xt</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="class">hdc</xsl:with-param>
<xsl:with-param name="parms">,drives:'<xsl:value-of select="$drives"/>',type:'<xsl:value-of select="$type"/>'</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="rom[@ref]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/rom"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
</xsl:template>
<xsl:template match="rom[not(@ref)]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="addr">
<xsl:choose>
<xsl:when test="@addr"><xsl:value-of select="@addr"/></xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="size">
<xsl:choose>
<xsl:when test="@size"><xsl:value-of select="@size"/></xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="alias">
<xsl:choose>
<xsl:when test="@alias"><xsl:value-of select="@alias"/></xsl:when>
<xsl:otherwise>null</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="file">
<xsl:choose>
<xsl:when test="@file"><xsl:value-of select="@file"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="notify">
<xsl:choose>
<xsl:when test="@notify"><xsl:value-of select="@notify"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="class">rom</xsl:with-param>
<xsl:with-param name="parms">,addr:<xsl:value-of select="$addr"/>,size:<xsl:value-of select="$size"/>,alias:<xsl:value-of select="$alias"/>,file:'<xsl:value-of select="$file"/>',notify:'<xsl:value-of select="$notify"/>'</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="ram[@ref]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/ram"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
</xsl:template>
<xsl:template match="ram[not(@ref)]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="addr">
<xsl:choose>
<xsl:when test="@addr"><xsl:value-of select="@addr"/></xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="size">
<xsl:choose>
<xsl:when test="@size"><xsl:value-of select="@size"/></xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="test">
<xsl:choose>
<xsl:when test="@test"><xsl:value-of select="@test"/></xsl:when>
<xsl:otherwise>true</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="class">ram</xsl:with-param>
<xsl:with-param name="parms">,addr:<xsl:value-of select="$addr"/>,size:<xsl:value-of select="$size"/>,test:<xsl:value-of select="$test"/></xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="video[@ref]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/video"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
</xsl:template>
<xsl:template match="video[not(@ref)]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="model">
<xsl:choose>
<xsl:when test="@model"><xsl:value-of select="@model"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="mode">
<xsl:choose>
<xsl:when test="@mode"><xsl:value-of select="@mode"/></xsl:when>
<xsl:otherwise>7</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="screenWidth">
<xsl:choose>
<xsl:when test="@screenwidth"><xsl:value-of select="@screenwidth"/></xsl:when>
<xsl:otherwise>256</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="screenHeight">
<xsl:choose>
<xsl:when test="@screenheight"><xsl:value-of select="@screenheight"/></xsl:when>
<xsl:otherwise>224</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="memory">
<xsl:choose>
<xsl:when test="@memory"><xsl:value-of select="@memory"/></xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="switches">
<xsl:choose>
<xsl:when test="@switches"><xsl:value-of select="@switches"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="scale">
<xsl:choose>
<xsl:when test="@scale"><xsl:value-of select="@scale"/></xsl:when>
<xsl:otherwise>false</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="charCols">
<xsl:choose>
<xsl:when test="@cols"><xsl:value-of select="@cols"/></xsl:when>
<xsl:otherwise>80</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="charRows">
<xsl:choose>
<xsl:when test="@rows"><xsl:value-of select="@rows"/></xsl:when>
<xsl:otherwise>25</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="fontROM">
<xsl:choose>
<xsl:when test="@charset"><xsl:value-of select="@charset"/></xsl:when>
<xsl:when test="@fontrom"><xsl:value-of select="@fontrom"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="screenColor">
<xsl:choose>
<xsl:when test="@screencolor"><xsl:value-of select="@screencolor"/></xsl:when>
<xsl:otherwise>black</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="touchScreen">
<xsl:choose>
<xsl:when test="@touchscreen"><xsl:value-of select="@touchscreen"/></xsl:when>
<xsl:otherwise>false</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="autoLock">
<xsl:choose>
<xsl:when test="@autolock"><xsl:value-of select="@autolock"/></xsl:when>
<xsl:otherwise>false</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="class">video</xsl:with-param>
<xsl:with-param name="parms">,model:'<xsl:value-of select="$model"/>',mode:<xsl:value-of select="$mode"/>,screenWidth:<xsl:value-of select="$screenWidth"/>,screenHeight:<xsl:value-of select="$screenHeight"/>,memory:<xsl:value-of select="$memory"/>,switches:'<xsl:value-of select="$switches"/>',scale:<xsl:value-of select="$scale"/>,charCols:<xsl:value-of select="$charCols"/>,charRows:<xsl:value-of select="$charRows"/>,fontROM:'<xsl:value-of select="$fontROM"/>',screenColor:'<xsl:value-of select="$screenColor"/>',touchScreen:<xsl:value-of select="$touchScreen"/>,autoLock:<xsl:value-of select="$autoLock"/></xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="debugger[@ref]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/debugger"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
</xsl:template>
<xsl:template match="debugger[not(@ref)]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="commands">
<xsl:choose>
<xsl:when test="@commands"><xsl:value-of select="@commands"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="messages">
<xsl:choose>
<xsl:when test="@messages"><xsl:value-of select="@messages"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="class">debugger</xsl:with-param>
<xsl:with-param name="parms">,commands:'<xsl:value-of select="$commands"/>',messages:'<xsl:value-of select="$messages"/>'</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="panel[@ref]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/panel"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
</xsl:template>
<xsl:template match="panel[not(@ref)]">
<xsl:param name="machine" select="''"/>
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="class">panel</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="computer[@ref]">
<xsl:param name="machine" select="''"/>
<xsl:param name="machineState" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/computer">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="machineState" select="$machineState"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="computer[not(@ref)]">
<xsl:param name="machine" select="''"/>
<xsl:param name="machineState" select="''"/>
<xsl:variable name="busWidth">
<xsl:choose>
<xsl:when test="@buswidth"><xsl:value-of select="@buswidth"/></xsl:when>
<xsl:otherwise>20</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="resume">
<xsl:choose>
<xsl:when test="@resume and $machineState = ''"><xsl:value-of select="@resume"/></xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="state">
<xsl:choose>
<xsl:when test="$machineState != ''"><xsl:value-of select="$machineState"/></xsl:when>
<xsl:when test="@state"><xsl:value-of select="@state"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="class">computer</xsl:with-param>
<xsl:with-param name="parms">,busWidth:<xsl:value-of select="$busWidth"/>,resume:<xsl:value-of select="$resume"/>,state:'<xsl:value-of select="$state"/>'</xsl:with-param>
</xsl:call-template>
</xsl:template>
</xsl:stylesheet>
{
"name": "PCjs",
"version": "1.17.5",
"description": "IBM PC Emulator",
"author": "Jeff Parsons <Jeff@pcjs.org>",
"licenses": [
{
"type": "GPLv3",
"url": "http://www.gnu.org/licenses/gpl.html"
}
],
"bin": {
"example": "./bin/pcjs"
}
}
Shared Sources
===
This folder contains a mix of shared code, with some files used only by Node (server) modules,
some used only by Browser (client) modules, and others used by both.
At the moment, only a few files are completely agnostic; eg: [strlib.js](strlib.js) and [usrlib.js](usrlib.js).
One give-away is that neither contain references to any globals (although references to each other
would be fine).
[netlib.js](netlib.js) is appropriate only for Node modules, because it contains code that relies on Node's
global *Buffer* object, as indicated by:
/* global Buffer: false */
And [weblib.js](weblib.js) is appropriate only for client modules, because it contains code that relies on the
browser's global *window* object, as indicated by:
/* global window: true */
We declare *window* modifiable (true) so that [defines.js](defines.js) can set *global.window* to *false*
when running within Node, allowing any other code to test the existence of *window* with a simple:
if (window) {...}
instead of:
if (typeof window !== "undefined") {...}
/**
* @fileoverview The Component class used by C1Pjs and PCjs.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-May-14
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
* and <http://pcjs.org/>.
*
* JSMachines is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with JSMachines.
* If not, see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some JSMachines files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* JSMachines Project for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
/*
* All the C1Pjs and PCjs components now use JSDoc types, primarily so that Google's Closure Compiler
* will compile everything with ZERO warnings. For more information about the JSDoc types supported by
* the Closure Compiler:
*
* https://developers.google.com/closure/compiler/docs/js-for-compiler#types
*
* I also attempted to use JSLint, but it's excessively strict for my taste, so this is the only file
* I tried massaging for JSLint's sake. I gave up when it complained about my use of "while (true)";
* replacing "true" with an assignment expression didn't make it any happier.
*
* I wasn't thrilled about replacing all "++" and "--" operators with "+= 1" and "-= 1", nor about using
* "(s || '')" instead of "(s? s : '')", because while the former may seem simpler, it is NOT more portable.
* It's not that I'm trying to write "portable JavaScript", but some of this code was ported from C code I'd
* written about 14 years earlier, and portability is good, so I'm not going to rewrite if there's no need.
*
* UPDATE: I've since switched to JSHint, which seems to have more reasonable defaults.
*/
"use strict";
/* global window: true, DEBUG: true */
if (typeof module !== 'undefined') {
require("./defines");
var usr = require("./usrlib");
var web = require("./weblib");
}
/**
* Component(type, parms, constructor, bitsMessage)
*
* A Component object requires:
*
* type: a user-defined type name (eg, "CPU")
*
* and accepts any or all of the following (parms) properties:
*
* id: component ID (default is "")
* name: component name (default is ""; if blank, toString() will use the type name only)
* comment: component comment string (default is undefined)
*
* Subclasses that use Component.subclass() to extend Component will likely have additional (parms) properties.
*
* @constructor
* @param {string} type
* @param {Object} [parms]
* @param {Object} [constructor]
* @param {number} [bitsMessage]
*/
function Component(type, parms, constructor, bitsMessage)
{
this.type = type;
if (!parms) parms = {'id': "", 'name': ""};
this.id = parms['id'];
this.name = parms['name'];
this.comment = parms['comment'];
this.parms = parms;
if (this.id === undefined) this.id = "";
var i = this.id.indexOf('.');
if (i > 0) {
this.idMachine = this.id.substr(0, i);
this.idComponent = this.id.substr(i + 1);
} else {
this.idComponent = this.id;
}
/*
* Recording the constructor is really just a debugging aid, because many of our constructors
* have class constants, but they're hard to find when the constructors are buried among all the
* other globals.
*/
this[type] = constructor;
/*
* Gather all the various component flags (booleans) into a single "flags" object, and encourage
* subclasses to do the same, to reduce the property clutter we have to wade through while debugging.
*/
this.aFlags = {
fReady: false,
fBusy: false,
fBusyCancel: false,
fPowered: false,
fError: false
};
this.fnReady = null;
this.clearError();
this.bindings = {};
this.dbg = null; // by default, no connection to a Debugger
this.bitsMessage = bitsMessage || -1;
Component.add(this);
}
/**
* Component.parmsURL
*
* Initialized to the set of URL parameters, if any, for the current web page.
*
* @type {Object|null}
*/
Component.parmsURL = web.getURLParameters();
/**
* Component.inherit(p)
*
* Returns a newly created object that inherits properties from the prototype object p.
* It uses the ECMAScript 5 function Object.create() if it is defined, and otherwise falls back to an older technique.
*
* See: Flanagan, David (2011-04-18). JavaScript: The Definitive Guide: The Definitive Guide (Kindle Locations 9854-9903). OReilly Media - A. Kindle Edition (Example 6-1)
*
* @param {Object} p
*/
Component.inherit = function(p)
{
if (window) {
if (!p) throw new TypeError();
if (Object.create) {
return Object.create(p);
}
var t = typeof p;
if (t !== "object" && t !== "function") throw new TypeError();
}
/**
* @constructor
*/
function F() {}
F.prototype = p;
return new F();
};
/**
* Component.extend(o, p)
*
* Copies the enumerable properties of p to o and returns o.
* If o and p have a property by the same name, o's property is overwritten.
*
* See: Flanagan, David (2011-04-18). JavaScript: The Definitive Guide: The Definitive Guide (Kindle Locations 9854-9903). OReilly Media - A. Kindle Edition (Example 6-2)
*
* @param {Object} o
* @param {Object} p
*/
Component.extend = function(o, p)
{
for (var prop in p) {
o[prop] = p[prop];
}
return o;
};
/**
* Component.subclass(subclass, superclass, methods, statics)
*
* See: Flanagan, David (2011-04-18). JavaScript: The Definitive Guide: The Definitive Guide (Kindle Locations 9854-9903). OReilly Media - A. Kindle Edition (Example 9-11)
*
* @param {Object} subclass is the constructor for the new subclass
* @param {Object} [superclass] is the constructor of the superclass (default is Component)
* @param {Object} [methods] contains all instance methods
* @param {Object} [statics] contains all class properties and methods
*/
Component.subclass = function(subclass, superclass, methods, statics)
{
if (!superclass) superclass = Component;
subclass.prototype = Component.inherit(superclass.prototype);
subclass.prototype.constructor = subclass;
subclass.prototype.parent = superclass.prototype;
if (methods) {
Component.extend(subclass.prototype, methods);
}
if (statics) {
Component.extend(subclass, statics);
}
return subclass;
};
/*
* Every component created on the current page is recorded in this array (see Component.add()).
*
* This enables any component to locate another component by ID (see Component.getComponentByID())
* or by type (see Component.getComponentByType()).
*/
Component.all = [];
/**
* Component.add(component)
*
* @param {Component} component
*/
Component.add = function(component)
{
/*
* This just generates a lot of useless noise, handy in the early days, not so much these days...
*
* if (DEBUG) Component.log("Component.add(" + component.type + "," + component.id + ")");
*/
Component.all[Component.all.length] = component;
};
/**
* Component.log(s, type)
*
* For diagnostic output only.
*
* @param {string} [s] is the message text
* @param {string} [type] is the message type
*/
Component.log = function(s, type)
{
if (DEBUG) {
if (s) {
var msElapsed, sMsg = (type? (type + ": ") : "") + s;
if (Component.msStart === undefined) {
Component.msStart = usr.getTime();
}
msElapsed = usr.getTime() - Component.msStart;
if (window && window.console) console.log(msElapsed + "ms: " + sMsg.replace(/\n/g, " "));
}
}
};
/**
* Component.assert(f, s)
*
* Verifies conditions that must be true (for DEBUG builds only).
*
* The Closure Compiler should automatically remove all references to Component.assert() in non-DEBUG builds.
*
* TODO: Add a task to the build process that "asserts" there are no instances of "assertion failure" in RELEASE builds.
*
* @param {boolean} f is the expression we are asserting to be true
* @param {string} [s] is description of the assertion on failure
*/
Component.assert = function(f, s)
{
if (DEBUG) {
if (!f) {
if (!s) s = "assertion failure";
Component.log(s);
throw new Error(s);
}
}
};
/**
* Component.println(s, type, id)
*
* For non-diagnostic messages, which components may override to control the destination/appearance of their output.
*
* Components that inherit from this class should use the instance method, this.println(), rather than Component.println(),
* because if a Control Panel is loaded, it will override only the instance method, not the class method (overriding the class
* method would improperly affect any other machines loaded on the same page).
*
* @param {string} [s] is the message text
* @param {string} [type] is the message type
* @param {string} [id] is the caller's ID, if any
*/
Component.println = function(s, type, id)
{
if (DEBUG) {
Component.log((id? (id + ": ") : "") + (s? ("\"" + s + "\"") : ""), type);
}
};
/**
* Component.notice(s, fPrintOnly, id)
*
* notice() is like println() but implies a need for user notification, so we alert() as well.
*
* @param {string} s is the message text
* @param {boolean} [fPrintOnly]
* @param {string} [id] is the caller's ID, if any
*/
Component.notice = function(s, fPrintOnly, id)
{
if (DEBUG) {
Component.println(s, "notice", id);
}
if (!fPrintOnly) web.alertUser(s);
};
/**
* Component.warning(s)
*
* @param {string} s describes the warning
*/
Component.warning = function(s)
{
if (DEBUG) {
Component.println(s, "warning");
}
web.alertUser(s);
};
/**
* Component.error(s)
*
* @param {string} s describes the error; an alert() is displayed as well
*/
Component.error = function(s)
{
if (DEBUG) {
Component.println(s, "error");
}
web.alertUser(s);
};
/**
* Component.getComponents(idRelated)
*
* We could store components as properties of an 'all' object, using the component's ID,
* and change this linear lookup into a property lookup, but some components may have no ID.
*
* @param {string} [idRelated] of related component
* @return {Array} of components
*/
Component.getComponents = function(idRelated)
{
var i;
var aComponents = [];
/*
* getComponentByID(id, idRelated)
*
* If idRelated is provided, we check it for a machine prefix, and use any
* existing prefix to constrain matches to IDs with the same prefix, in order to
* avoid matching components belonging to other machines.
*/
if (idRelated) {
if ((i = idRelated.indexOf('.')) > 0)
idRelated = idRelated.substr(0, i + 1);
else
idRelated = "";
}
for (i = 0; i < Component.all.length; i++) {
var component = Component.all[i];
if (!idRelated || !component.id.indexOf(idRelated)) {
aComponents.push(component);
}
}
return aComponents;
};
/**
* Component.getComponentByID(id, idRelated)
*
* We could store components as properties of an 'all' object, using the component's ID,
* and change this linear lookup into a property lookup, but some components may have no ID.
*
* @param {string} id of the desired component
* @param {string} [idRelated] of related component
* @return {Component|null}
*/
Component.getComponentByID = function(id, idRelated)
{
if (id !== undefined) {
var i;
/*
* If idRelated is provided, we check it for a machine prefix, and use any
* existing prefix to constrain matches to IDs with the same prefix, in order to
* avoid matching components belonging to other machines.
*/
if (idRelated && (i = idRelated.indexOf('.')) > 0) {
id = idRelated.substr(0, i + 1) + id;
}
for (i = 0; i < Component.all.length; i++) {
if (Component.all[i].id === id) {
return Component.all[i];
}
}
Component.log("Component ID '" + id + "' not found", "warning");
}
return null;
};
/**
* Component.getComponentByType(sType, idRelated, componentPrev)
*
* @param {string} sType of the desired component
* @param {string} [idRelated] of related component
* @param {Component|null} [componentPrev] of previously returned component, if any
* @return {Component|null}
*/
Component.getComponentByType = function(sType, idRelated, componentPrev)
{
if (sType !== undefined) {
var i;
/*
* If idRelated is provided, we check it for a machine prefix, and use any
* existing prefix to constrain matches to IDs with the same prefix, in order to
* avoid matching components belonging to other machines.
*/
if (idRelated) {
if ((i = idRelated.indexOf('.')) > 0) {
idRelated = idRelated.substr(0, i + 1);
} else {
idRelated = "";
}
}
for (i = 0; i < Component.all.length; i++) {
if (componentPrev) {
if (componentPrev == Component.all[i]) componentPrev = null;
continue;
}
if (sType == Component.all[i].type && (!idRelated || !Component.all[i].id.indexOf(idRelated))) {
return Component.all[i];
}
}
Component.log("Component type '" + sType + "' not found", "warning");
}
return null;
};
/**
* Component.getComponentParms(element)
*
* @param {Object} element from the DOM
*/
Component.getComponentParms = function(element)
{
var parms = null,
sParms = element.getAttribute("data-value");
if (sParms) {
try {
parms = eval("({" + sParms + "})"); // jshint ignore:line
/*
* We can no longer invoke removeAttribute() because some components (eg, Panel) need
* to run their initXXX() code more than once, to avoid initialization-order dependencies.
*
* if (!DEBUG) {
* element.removeAttribute("data-value");
* }
*/
} catch(e) {
Component.error(e.message + " (" + sParms + ")");
}
}
return parms;
};
/**
* Component.bindExternalControl(component, sControl, sBinding, sType)
*
* @param {Component} component
* @param {string} sControl
* @param {string} sBinding
* @param {string} [sType] is the external component type
*/
Component.bindExternalControl = function(component, sControl, sBinding, sType)
{
if (sControl) {
if (sType === undefined) sType = "Panel";
var target = Component.getComponentByType(sType, component.id);
if (target) {
var eBinding = target.bindings[sControl];
if (eBinding) {
component.setBinding(null, sBinding, eBinding);
}
}
}
};
if (window && !window.document.ELEMENT_NODE) window.document.ELEMENT_NODE = 1;
/**
* Component.bindComponentControls(component, element, sAppClass)
*
* @param {Component} component
* @param {Object} element from the DOM
* @param {string} sAppClass
*/
Component.bindComponentControls = function(component, element, sAppClass)
{
var aeControls = Component.getElementsByClass(element.parentNode, sAppClass + "-control");
for (var iControl = 0; iControl < aeControls.length; iControl++) {
var aeChildNodes = aeControls[iControl].childNodes;
for (var iNode = 0; iNode < aeChildNodes.length; iNode++) {
var control = aeChildNodes[iNode];
if (control.nodeType !== window.document.ELEMENT_NODE) {
continue;
}
var sClass = control.getAttribute("class");
if (!sClass) continue;
var aClasses = sClass.split(" ");
for (var iClass = 0; iClass < aClasses.length; iClass++) {
var parms;
sClass = aClasses[iClass];
switch (sClass) {
case sAppClass + "-binding":
parms = Component.getComponentParms(control);
if (parms && parms['binding']) {
component.setBinding(parms['type'], parms['binding'], control);
} else {
Component.log("Component '" + component.toString() + "' missing binding" + (parms? " for " + parms['type'] : ""), "warning");
}
iClass = aClasses.length;
break;
default:
// if (DEBUG) Component.log("Component.bindComponentControls(" + component.toString() + "): unrecognized control class \"" + sClass + "\"", "warning");
break;
}
}
}
}
};
/**
* Component.getElementsByClass(element, sClass, sObjClass)
*
* This is a cross-browser helper function, since not all browser's support getElementsByClassName()
*
* TODO: This should probably be moved into weblib.js at some point, along with the control binding functions above,
* to keep all the browser-related code together.
*
* @param {Object} element from the DOM
* @param {string} sClass
* @param {string} [sObjClass]
* @return {Array|NodeList}
*/
Component.getElementsByClass = function(element, sClass, sObjClass)
{
if (sObjClass) sClass += '-' + sObjClass + "-object";
/*
* Use the browser's built-in getElementsByClassName() if it appears to be available
* (for example, it's not available in IE8, but it should be available in IE9 and up)
*/
if (element.getElementsByClassName) {
return element.getElementsByClassName(sClass);
}
var i, j, ae = [];
var aeAll = element.getElementsByTagName("*");
var re = new RegExp('(^| )' + sClass + '( |$)');
for (i = 0, j = aeAll.length; i < j; i++) {
if (re.test(aeAll[i].className)) {
ae.push(aeAll[i]);
}
}
if (!ae.length) {
Component.log('No elements of class "' + sClass + '" found');
}
return ae;
};
Component.prototype = {
constructor: Component,
parent: null,
/**
* toString()
*
* @this {Component}
* @return {string}
*/
toString: function() {
return (this.name? this.name : (this.id || this.type));
},
/**
* getMachineNum()
*
* @this {Component}
* @return {number} unique machine number
*/
getMachineNum: function() {
var nMachine = 1;
if (this.idMachine) {
var aDigits = this.idMachine.match(/\d+/);
if (aDigits !== null)
nMachine = parseInt(aDigits[0], 10);
}
return nMachine;
},
/**
* setBinding(sHTMLType, sBinding, control)
*
* Component's setBinding() method is intended to be overridden by subclasses.
*
* @this {Component}
* @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
* @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "reset")
* @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
* @return {boolean} true if binding was successful, false if unrecognized binding request
*/
setBinding: function(sHTMLType, sBinding, control) {
switch (sBinding) {
case "clear":
if (!this.bindings[sBinding]) {
this.bindings[sBinding] = control;
control.onclick = (function(component) {
return function clearPanel() {
if (component.bindings['print']) {
component.bindings['print'].value = "";
}
};
}(this));
}
return true;
case "print":
if (!this.bindings[sBinding]) {
this.bindings[sBinding] = control;
/*
* HACK: Save this particular HTML element so that the Debugger can access it, too
*/
this.controlPrint = control;
/*
* This was added for Firefox (Safari automatically clears the <textarea> on a page reload,
* but Firefox does not).
*/
control.value = "";
this.println = (function(control) {
return function printPanel(s, type) {
s = (type !== undefined? (type + ": ") : "") + (s || "");
/*
* Prevent the <textarea> from getting too large; otherwise, printing becomes slower and slower.
*/
if (COMPILED) {
if (control.value.length > 8192) {
control.value = control.value.substr(control.value.length - 4096);
}
}
control.value += s + "\n";
control.scrollTop = control.scrollHeight;
if (DEBUG && window && window.console) console.log(s);
};
}(control));
/**
* Override this.notice() with a replacement function that eliminates the web.alertUser() call
*
* @this {Component}
* @param {string} s
* @param {boolean} [fPrintOnly]
* @param {string} [id]
*/
this.notice = function noticePanel(s, fPrintOnly, id) {
this.println(s, "notice", id);
};
}
return true;
default:
return false;
}
},
/**
* log(s, type)
*
* For diagnostic output only.
*
* WARNING: Even though this function's body is completely wrapped in DEBUG, that won't prevent the Closure Compiler
* from including it, so all calls must still be prefixed with "if (DEBUG) ....". For this reason, the class method,
* Component.log(), is preferred, because the compiler IS smart enough to remove those calls.
*
* @this {Component}
* @param {string} [s] is the message text
* @param {string} [type] is the message type
*/
log: function(s, type) {
if (DEBUG) {
Component.log(s, type || this.id || this.type);
}
},
/**
* assert(f, s)
*
* Verifies conditions that must be true (for DEBUG builds only).
*
* WARNING: Make sure you preface all calls to this.assert() with "if (DEBUG)", because unlike Component.assert(),
* the Closure Compiler can't be sure that this instance method hasn't been overridden, so it refuses to treat it as
* dead code in non-DEBUG builds.
*
* TODO: Add a task to the build process that "asserts" there are no instances of "assertion failure" in RELEASE builds.
*
* @param {boolean} f is the expression we are asserting to be true
* @param {string} [s] is description of the assertion on failure
*/
assert: function(f, s) {
if (DEBUG) {
if (!f) {
s = "assertion failure in " + (this.id || this.type) + (s? ": " + s : "");
if (DEBUGGER && this.dbg) {
this.dbg.stopCPU();
/*
* Why do we throw an Error only to immediately catch and ignore it? Simply to give
* any IDE the opportunity to inspect the application's state. Even when the IDE has
* control, you should still be able to invoke Debugger commands from the IDE's REPL,
* using the '$' global function that the Debugger constructor defines; eg:
*
* $('r')
* $('dw 0:0')
* $('h')
* ...
*
* If you have no desire to stop on assertions, consider this a no-op. However, another
* potential benefit of creating an Error object is that, for browsers like Chrome, we get
* a stack trace, too.
*/
try {
throw new Error(s);
} catch(e) {
this.println(e.stack || e.message);
}
return;
}
this.log(s);
throw new Error(s);
}
}
},
/**
* println(s, type)
*
* For non-diagnostic messages, which components may override to control the destination/appearance of their output.
*
* Components using this.println() should wait until after their constructor has run to display any messages, because
* if a Control Panel has been loaded, its override will not take effect until its own constructor has run.
*
* @this {Component}
* @param {string} [s] is the message text
* @param {string} [type] is the message type
* @param {string} [id] is the caller's ID, if any
*/
println: function(s, type, id) {
Component.println(s, type, id || this.id);
},
/**
* status(s)
*
* status() is like println() but it also includes information about the component (ie, the component ID),
* which is why there is no corresponding Component.status() function.
*
* @param {string} s is the message text
*/
status: function(s) {
this.println(this.idComponent + ": " + s);
},
/**
* notice(s, fPrintOnly)
*
* notice() is like println() but implies a need for user notification, so we alert() as well; however, if this.println()
* is overridden, this.notice will be replaced with a similar override, on the assumption that the override is taking care
* of alerting the user.
*
* @this {Component}
* @param {string} s is the message text
* @param {boolean} [fPrintOnly]
* @param {string} [id] is the caller's ID, if any
*/
notice: function(s, fPrintOnly, id) {
Component.notice(s, fPrintOnly, id || this.id);
},
/**
* setError(s)
*
* Set a fatal error condition
*
* @this {Component}
* @param {string} s describes a fatal error condition
*/
setError: function(s) {
this.aFlags.fError = true;
this.notice(s); // TODO: Any cases where we should still prefix this string with "Fatal error: "?
},
/**
* clearError()
*
* Clear any fatal error condition
*
* @this {Component}
*/
clearError: function() {
this.aFlags.fError = false;
},
/**
* isError()
*
* Report any fatal error condition
*
* @this {Component}
* @return {boolean} true if a fatal error condition exists, false if not
*/
isError: function() {
if (this.aFlags.fError) {
this.println(this.toString() + " error");
return true;
}
return false;
},
/**
* isReady(fnReady)
*
* Return the "ready" state of the component; if the component is not ready, it will queue the optional
* notification function, otherwise it will immediately call the notification function, if any, without queuing it.
*
* NOTE: Since only the Computer component actually cares about the "readiness" of other components, the so-called
* "queue" of notification functions supports exactly one function. This keeps things nice and simple.
*
* @this {Component}
* @param {function()} [fnReady]
* @return {boolean} true if the component is in a "ready" state, false if not
*/
isReady: function(fnReady) {
if (fnReady) {
if (this.aFlags.fReady) {
fnReady();
} else {
if (MAXDEBUG) this.log("NOT ready");
this.fnReady = fnReady;
}
}
return this.aFlags.fReady;
},
/**
* setReady(fReady)
*
* Set the "ready" state of the component to true, and call any queued notification functions.
*
* @this {Component}
* @param {boolean} [fReady] is assumed to indicate "ready" unless EXPLICITLY set to false
*/
setReady: function(fReady) {
if (!this.aFlags.fError) {
this.aFlags.fReady = (fReady !== false);
if (this.aFlags.fReady) {
if (MAXDEBUG /* || this.name */) this.log("ready");
var fnReady = this.fnReady;
this.fnReady = null;
if (fnReady) fnReady();
}
}
},
/**
* isBusy(fCancel)
*
* Return the "busy" state of the component
*
* @this {Component}
* @param {boolean} [fCancel] is set to true to cancel a "busy" state
* @return {boolean} true if "busy", false if not
*/
isBusy: function(fCancel) {
if (this.aFlags.fBusy) {
if (fCancel) {
this.aFlags.fBusyCancel = true;
} else if (fCancel === undefined) {
this.println(this.toString() + " busy");
}
}
return this.aFlags.fBusy;
},
/**
* setBusy(fBusy)
*
* Update the current busy state; if an fCancel request is pending, it will be honored now.
*
* @this {Component}
* @param {boolean} fBusy
* @return {boolean}
*/
setBusy: function(fBusy) {
if (this.aFlags.fBusyCancel) {
if (this.aFlags.fBusy) {
this.aFlags.fBusy = false;
}
this.aFlags.fBusyCancel = false;
return false;
}
if (this.aFlags.fError) {
this.println(this.toString() + " error");
return false;
}
this.aFlags.fBusy = fBusy;
return this.aFlags.fBusy;
},
/**
* powerUp(fSave)
*
* @this {Component}
* @param {Object|null} data
* @param {boolean} [fRepower] is true if this is "repower" notification
* @return {boolean} true if successful, false if failure
*/
powerUp: function(data, fRepower) {
this.aFlags.fPowered = true;
return true;
},
/**
* powerDown(fSave, fShutdown)
*
* @this {Component}
* @param {boolean} fSave
* @param {boolean} [fShutdown]
* @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
*/
powerDown: function(fSave, fShutdown) {
if (fShutdown) this.aFlags.fPowered = false;
return true;
},
/**
* messageEnabled(bitsMessage)
*
* If bitsMessage is not specified, the component's MESSAGE category is used.
*
* @this {Component}
* @param {number} [bitsMessage] is zero or more MESSAGE_* category flag(s)
* @return {boolean} true if all specified message enabled, false if not
*/
messageEnabled: function(bitsMessage) {
if (DEBUGGER && this.dbg) {
if (this === this.dbg) {
bitsMessage |= 0;
} else {
bitsMessage = bitsMessage || this.bitsMessage;
}
var bitsEnabled = this.dbg.bitsMessage & bitsMessage;
return (bitsEnabled === bitsMessage || !!(bitsEnabled & this.dbg.bitsWarning));
}
return false;
},
/**
* printMessage(sMessage, bitsMessage, fAddress)
*
* If bitsMessage is not specified, the component's MESSAGE category is used.
* If bitsMessage is true, the message is displayed regardless.
*
* @this {Component}
* @param {string} sMessage is any caller-defined message string
* @param {number|boolean} [bitsMessage] is zero or more MESSAGE_* category flag(s)
* @param {boolean} [fAddress] is true to display the current address
* @return {boolean} true if Debugger available, false if not
*/
printMessage: function(sMessage, bitsMessage, fAddress) {
if (DEBUGGER && this.dbg) {
if (bitsMessage === true || this.messageEnabled(bitsMessage | 0)) {
this.dbg.message(sMessage, fAddress);
}
return true;
}
return false;
},
/**
* printMessageIO(port, bOut, addrFrom, name, bIn, bitsMessage)
*
* If bitsMessage is not specified, the component's MESSAGE category is used.
* If bitsMessage is true, the message is displayed as long as MESSAGE.PORT is enabled.
*
* @this {Component}
* @param {number} port
* @param {number|null} bOut if an output operation
* @param {number|null} [addrFrom]
* @param {string|null} [name] of the port, if any
* @param {number|null} [bIn] is the input value, if known, on an input operation
* @param {number|boolean} [bitsMessage] is zero or more MESSAGE_* category flag(s)
*/
printMessageIO: function(port, bOut, addrFrom, name, bIn, bitsMessage) {
if (DEBUGGER && this.dbg) {
if (bitsMessage === true) {
bitsMessage = 0;
} else if (bitsMessage == null) {
bitsMessage = this.bitsMessage;
}
this.dbg.messageIO(this, port, bOut, addrFrom, name, bIn, bitsMessage);
}
}
};
if (typeof module !== 'undefined') module.exports = Component;
/**
* @fileoverview Compile-time definitions used by C1Pjs and PCjs.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2014-May-08
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
* and <http://pcjs.org/>.
*
* JSMachines is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with JSMachines.
* If not, see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some JSMachines files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* JSMachines Project for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
/**
* @define {string}
*/
var APPNAME = ""; // this @define is overridden by the Closure Compiler with either "PCjs" or "C1Pjs"
/**
* @define {string}
*/
var APPVERSION = "1.x.x"; // this @define is overridden by the Closure Compiler with the version in package.json
/**
* @define {string}
*/
var SITEHOST = "localhost:8088";// this @define is overridden by the Closure Compiler with "www.pcjs.org"
/**
* @define {boolean}
*/
var COMPILED = false; // this @define is overridden by the Closure Compiler (to true)
/**
* @define {boolean}
*/
var DEBUG = true; // this @define is overridden by the Closure Compiler (to false) to remove DEBUG-only code
/**
* @define {boolean}
*/
var MAXDEBUG = false; // this @define is overridden by the Closure Compiler (to false) to remove MAXDEBUG-only code
if (typeof module !== 'undefined') {
global.window = false; // provides an alternative "if (typeof window === 'undefined')" (ie, "if (window) ...")
global.APPNAME = APPNAME;
global.APPVERSION = APPVERSION;
global.SITEHOST = SITEHOST;
global.COMPILED = COMPILED;
global.DEBUG = DEBUG;
global.MAXDEBUG = MAXDEBUG;
/*
* TODO: When we're "required" by Node, should we return anything via module.exports?
*/
}
/**
* @fileoverview Disk APIs, as defined by httpapi.js and consumed by disk.js
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2014-May-08
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
* and <http://pcjs.org/>.
*
* JSMachines is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with JSMachines.
* If not, see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some JSMachines files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* JSMachines Project for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
/*
* Our "DiskIO API" looks like:
*
* http://www.pcjs.org/api/v1/disk?action=open&volume=*10mb.img&mode=demandrw&chs=c:h:s&machine=xxx&user=yyy
*/
var DiskAPI = {
ENDPOINT: "/api/v1/disk",
QUERY: {
ACTION: "action", // value is one of DiskAPI.ACTION.*
VOLUME: "volume", // value is path of a disk image
MODE: "mode", // value is one of DiskAPI.MODE.*
CHS: "chs", // value is cylinders:heads:sectors:bytes
ADDR: "addr", // value is cylinder:head:sector:count
MACHINE: "machine", // value is machine token
USER: "user", // value is user ID
DATA: "data" // value is data to be written
},
ACTION: {
OPEN: "open",
READ: "read",
WRITE: "write",
CLOSE: "close"
},
MODE: {
LOCAL: "local", // this mode implies no API (at best, localStorage backing only)
PRELOAD: "preload", // this mode implies use of the DumpAPI
DEMANDRW: "demandrw",
DEMANDRO: "demandro"
},
FAIL: {
BADACTION: "invalid action",
BADUSER: "invalid user",
BADVOL: "invalid volume",
OPENVOL: "unable to open volume",
CREATEVOL: "unable to create volume",
WRITEVOL: "unable to write volume",
REVOKED: "access revoked"
}
};
/*
* Common (supported) diskette formats
*/
DiskAPI.DISKETTE_FORMATS = {
163840: [40,1,8], // media type 0xFE: 40 cylinders, 1 head (single-sided), 8 sectors/track, ( 320 total sectors x 512 bytes/sector == 163840)
184320: [40,1,9], // media type 0xFC: 40 cylinders, 1 head (single-sided), 9 sectors/track, ( 360 total sectors x 512 bytes/sector == 184320)
327680: [40,2,8], // media type 0xFF: 40 cylinders, 2 heads (double-sided), 8 sectors/track, ( 640 total sectors x 512 bytes/sector == 327680)
368640: [40,2,9], // media type 0xFD: 40 cylinders, 2 heads (double-sided), 9 sectors/track, ( 720 total sectors x 512 bytes/sector == 368640)
737280: [80,2,9], // media type 0xF9: 80 cylinders, 2 heads (double-sided), 9 sectors/track, (1440 total sectors x 512 bytes/sector == 737280)
1228800: [80,2,15], // media type 0xF9: 80 cylinders, 2 heads (double-sided), 15 sectors/track, (2400 total sectors x 512 bytes/sector == 1228800)
1474560: [80,2,18], // media type 0xF0: 80 cylinders, 2 heads (double-sided), 18 sectors/track, (2880 total sectors x 512 bytes/sector == 1474560)
2949120: [80,2,36] // media type 0xF0: 80 cylinders, 2 heads (double-sided), 36 sectors/track, (5760 total sectors x 512 bytes/sector == 2949120)
};
DiskAPI.MBR = {
PARTITIONS: {
OFFSET: 0x1BE,
ENTRY: {
STATUS: 0x00, // 0x80 if active
CHS_FIRST: 0x01, // 3-byte CHS specifier
TYPE: 0x04, // see TYPE.*
CHS_LAST: 0x05, // 3-byte CHS specifier
LBA_FIRST: 0x08,
LBA_TOTAL: 0x0C,
LENGTH: 0x10
},
STATUS: {
ACTIVE: 0x80
},
TYPE: {
EMPTY: 0x00,
FAT12_PRIMARY: 0x01, // DOS 2.0 and up (12-bit FAT)
FAT16_PRIMARY: 0x04 // DOS 3.0 and up (16-bit FAT)
}
},
SIG_OFFSET: 0x1FE,
SIGNATURE: 0xAA55 // to be clear, the low byte (at offset 0x1FE) is 0x55 and the high byte (at offset 0x1FF) is 0xAA
};
/*
* Boot sector offsets (and assorted constants) in DOS-compatible boot sectors (DOS 2.0 and up)
*
* WARNING: I've heard apocryphal stories about SIGNATURE being improperly reversed on some systems
* (ie, 0x55AA instead 0xAA55) -- perhaps by a dyslexic programmer -- so be careful out there.
*/
DiskAPI.BOOT = {
JMP_OPCODE: 0x000, // 1 byte for a JMP opcode, followed by a 1 or 2-byte offset
OEM_STRING: 0x003, // 8 bytes
SIG_OFFSET: 0x1FE,
SIGNATURE: 0xAA55 // to be clear, the low byte (at offset 0x1FE) is 0x55 and the high byte (at offset 0x1FF) is 0xAA
};
/*
* BIOS Parameter Block (BPB) offsets in DOS-compatible boot sectors (DOS 2.0 and up)
*/
DiskAPI.BPB = {
SECTOR_BYTES: 0x00B, // 2 bytes: bytes per sector (eg, 0x200 or 512)
CLUSTER_SECS: 0x00D, // 1 byte: sectors per cluster (eg, 1)
RESERVED_SECS: 0x00E, // 2 bytes: reserved sectors; ie, # sectors preceding the first FAT--usually just the boot sector (eg, 1)
TOTAL_FATS: 0x010, // 1 byte: FAT copies (eg, 2)
ROOT_DIRENTS: 0x011, // 2 bytes: root directory entries (eg, 0x40 or 64) 0x40 * 0x20 = 0x800 (1 sector is 0x200 bytes, total of 4 sectors)
TOTAL_SECS: 0x013, // 2 bytes: number of sectors (eg, 0x140 or 320); if zero, refer to LARGE_SECS
MEDIA_TYPE: 0x015, // 1 byte: media type (see DiskAPI.FAT.MEDIA_*)
FAT_SECS: 0x016, // 2 bytes: sectors per FAT (eg, 1)
TRACK_SECS: 0x018, // 2 bytes: sectors per track (eg, 8)
TOTAL_HEADS: 0x01A, // 2 bytes: number of heads (eg, 1)
HIDDEN_SECS: 0x01C, // 4 bytes: number of hidden sectors (always 0 for non-partitioned media)
LARGE_SECS: 0x020 // 4 bytes: number of sectors if TOTAL_SECS is zero
};
/*
* Media descriptor bytes for DOS-compatible FAT-formatted disks (stored in the first byte of the FAT)
*/
DiskAPI.FAT = {
MEDIA_160KB: 0xFE, // 5.25-inch, 1-sided, 8-sector, 40-track
MEDIA_180KB: 0xFC, // 5.25-inch, 1-sided, 9-sector, 40-track
MEDIA_320KB: 0xFF, // 5.25-inch, 2-sided, 8-sector, 40-track
MEDIA_360KB: 0xFD, // 5.25-inch, 2-sided, 9-sector, 40-track
MEDIA_720KB: 0xF9, // 3.5-inch, 2-sided, 9-sector, 80-track
MEDIA_1200KB: 0xF9, // 3.5-inch, 2-sided, 15-sector, 80-track
MEDIA_1440KB: 0xF0, // 3.5-inch, 2-sided, 18-sector, 80-track
MEDIA_2880KB: 0xF0 // 3.5-inch, 2-sided, 36-sector, 80-track
};
/*
* Cluster constants for 12-bit FATs (CLUSNUM_FREE, CLUSNUM_RES and CLUSNUM_MIN are the same for all FATs)
*/
DiskAPI.FAT12 = {
MAX_CLUSTERS: 4084,
CLUSNUM_FREE: 0, // this should NEVER appear in cluster chain (except at the start of an empty chain)
CLUSNUM_RES: 1, // reserved; this should NEVER appear in cluster chain
CLUSNUM_MIN: 2, // smallest valid cluster number
CLUSNUM_MAX: 0xFF6, // largest valid cluster number
CLUSNUM_BAD: 0xFF7, // bad cluster; this should NEVER appear in cluster chain
CLUSNUM_EOC: 0xFF8 // end of chain (actually, anything from 0xFF8-0xFFF indicates EOC)
};
/*
* Cluster constants for 16-bit FATs (CLUSNUM_FREE, CLUSNUM_RES and CLUSNUM_MIN are the same for all FATs)
*/
DiskAPI.FAT16 = {
MAX_CLUSTERS: 65524,
CLUSNUM_FREE: 0, // this should NEVER appear in cluster chain (except at the start of an empty chain)
CLUSNUM_RES: 1, // reserved; this should NEVER appear in cluster chain
CLUSNUM_MIN: 2, // smallest valid cluster number
CLUSNUM_MAX: 0xFFF6, // largest valid cluster number
CLUSNUM_BAD: 0xFFF7, // bad cluster; this should NEVER appear in cluster chain
CLUSNUM_EOC: 0xFFF8 // end of chain (actually, anything from 0xFFF8-0xFFFF indicates EOC)
};
/*
* Directory Entry offsets (and assorted constants) in FAT disk images
*
* NOTE: Versions of DOS prior to 2.0 use INVALID exclusively to mark available directory entries; any entry marked
* UNUSED will actually be considered USED. In DOS 2.0 and up, UNUSED was added to indicate that all remaining entries
* are unused, relieving it from having to initialize the rest of the sectors in the directory cluster(s). And in fact,
* you WILL encounter garbage in subsequent directory sectors if you attempt to read past an UNUSED entry.
*/
DiskAPI.DIRENT = {
NAME: 0x000, // 8 bytes
EXT: 0x008, // 3 bytes
ATTR: 0x00B, // 1 byte
MODTIME: 0x016, // 2 bytes
MODDATE: 0x018, // 2 bytes
CLUSTER: 0x01A, // 2 bytes
SIZE: 0x01C, // 4 bytes (typically zero for subdirectories)
LENGTH: 0x20, // 32 bytes total
UNUSED: 0x00, // indicates this and all subsequent directory entries are unused
INVALID: 0xE5 // indicates this directory entry is unused
};
/*
* Possible values for DIRENT.ATTR
*/
DiskAPI.ATTR = {
READONLY: 0x01, // PC-DOS 2.0 and up
HIDDEN: 0x02,
SYSTEM: 0x04,
LABEL: 0x08, // PC-DOS 2.0 and up
SUBDIR: 0x10, // PC-DOS 2.0 and up
ARCHIVE: 0x20 // PC-DOS 2.0 and up
};
if (typeof module !== 'undefined') module.exports = DiskAPI;
/**
* @fileoverview Disk APIs, as defined by diskdump.js and consumed by disk.js
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2014-May-08
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
* and <http://pcjs.org/>.
*
* JSMachines is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with JSMachines.
* If not, see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some JSMachines files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* JSMachines Project for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
/*
* Our "DiskDump API", such as it was, used to look like:
*
* http://jsmachines.net/bin/convdisk.php?disk=/disks/pc/dos/ibm/2.00/PCDOS200-DISK1.json&format=img
*
* To make it (a bit) more "REST-like", the above request now looks like:
*
* http://www.pcjs.org/api/v1/dump?disk=/disks/pc/dos/ibm/2.00/PCDOS200-DISK1.json&format=img
*
* Similarly, our "FileDump API" used to look like:
*
* http://jsmachines.net/bin/convrom.php?rom=/devices/pc/bios/5150/1981-04-24.rom&format=json
*
* and that request now looks like:
*
* http://www.pcjs.org/api/v1/dump?file=/devices/pc/bios/5150/1981-04-24.rom&format=json
*
* I don't think it makes sense to avoid "query" parameters, because blending the path of a disk image with the
* the rest of the URL would be (a) confusing, and (b) more work to parse.
*/
var DumpAPI = {
ENDPOINT: "/api/v1/dump",
QUERY: {
DIR: "dir", // value is path of a directory (DiskDump only)
DISK: "disk", // value is path of a disk image (DiskDump only)
FILE: "file", // value is path of a ROM image file (FileDump only)
IMG: "img", // alias for DISK
PATH: "path", // value is path of a one or more files (DiskDump only)
FORMAT: "format", // value is one of FORMAT values below
COMMENTS: "comments", // value is either "true" or "false"
DECIMAL: "decimal", // value is either "true" to force all numbers to decimal, "false" or undefined otherwise
MBHD: "mbhd" // value is hard disk size in Mb (formerly "mbsize") (DiskDump only)
},
FORMAT: {
JSON: "json", // default
DATA: "data", // same as "json", but built without JSON.stringify() (DiskDump only)
HEX: "hex", // deprecated
BYTES: "bytes", // displays data as hex bytes; normally used only when comments are enabled
IMG: "img", // returns the raw disk data (ie, using a Buffer object) (DiskDump only)
ROM: "rom" // returns the raw file data (ie, using a Buffer object) (FileDump only)
}
};
/*
* Because we use an overloaded API endpoint (ie, one that's shared with the FileDump module), we must
* also provide a list of commands which, when combined with the endpoint, define a unique request.
*/
DumpAPI.asDiskCommands = [DumpAPI.QUERY.DIR, DumpAPI.QUERY.DISK, DumpAPI.QUERY.PATH];
DumpAPI.asFileCommands = [DumpAPI.QUERY.FILE];
if (typeof module !== 'undefined') module.exports = DumpAPI;/**
* @fileoverview C1Pjs and PCjs embedding functionality.
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2012-Aug-28
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
* and <http://pcjs.org/>.
*
* JSMachines is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with JSMachines.
* If not, see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some JSMachines files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* JSMachines Project for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
/* global window: true, XSLTProcessor: false, APPNAME: false, APPVERSION: false, DEBUG: true */
if (typeof module !== 'undefined') {
var Component;
var str = require("./strlib");
var web = require("./weblib");
}
/*
* We now support asynchronous XML and XSL file loads; simply set fAsync (below) to true.
*
* NOTE: For that support to work, we have to keep track of the number of machines on the page
* (ie, how many embedMachine() calls were issued), reduce the count as each machine XML file
* is fully transformed into HTML, and when the count finally returns to zero, notify all the
* machine component init() handlers.
*
* Also, to prevent those init() handlers from running prematurely, we must disable all page
* notification events at the start of the embedding process (web.enablePageEvents(false)) and
* re-enable them at the end (web.enablePageEvents(true)).
*/
var cMachines = 0;
var fAsync = true;
/**
* loadXML(sFile, idMachine, sStateFile, fResolve, display, done)
*
* This is the preferred way to load all XML and XSL files. It uses loadResource()
* to load them as strings, which parseXML() can massage before parsing/transforming them.
*
* For example, since I've been unable to get the XSLT document() function to work inside any
* XSL document loaded by JavaScript's XSLT processor, that has prevented me from dynamically
* loading any XML machine file that uses the "ref" attribute to refer to and incorporate
* another XML document.
*
* To solve that, I've added an fResolve parameter that tells parseXML() to fetch any
* referenced documents ITSELF and insert them into the XML string prior to parsing, instead
* of relying on the XSLT template to pull them in. That fetching is handled by resolveXML(),
* which iterates over the XML until all "refs" have been resolved (including any nested
* references).
*
* Also, XSL files with a <!DOCTYPE [...]> cause MSIE's Microsoft.XMLDOM.loadXML() function
* to choke, so I strip that out prior to parsing as well.
*
* TODO: Figure out why the XSLT document() function works great when the web browser loads an
* XML file (and the associated XSL file) itself, but does not work when loading documents via
* JavaScript XSLT support. Is it broken, is it a security issue, or am I just calling it wrong?
*
* @param {string} sXMLFile
* @param {string|null|undefined} idMachine
* @param {string|null|undefined} sStateFile
* @param {boolean} fResolve is true to resolve any "ref" attributes
* @param {function(string)} display
* @param {function(string,Object)} done (string contains the unparsed XML string data, and Object contains a parsed XML object)
*/
function loadXML(sXMLFile, idMachine, sStateFile, fResolve, display, done)
{
var doneLoadXML = function(sURLName, sXML, nErrorCode) {
if (nErrorCode) {
if (!sXML) sXML = "unable to load " + sXMLFile + " (" + nErrorCode + ")";
done(sXML, null);
return;
}
parseXML(sXML, sXMLFile, idMachine, sStateFile, fResolve, display, done);
};
display("Loading " + sXMLFile + "...");
web.loadResource(sXMLFile, fAsync, null, null, doneLoadXML);
}
/**
* parseXML(sXML, sXMLFile, idMachine, sStateFile, fResolve, display, done)
*
* Generates an XML document from an XML string. This function also provides a work-around for XSLT's
* lack of support for the document() function (at least on some browsers), by replacing every reference
* tag (ie, a tag with a "ref" attribute) with the contents of the referenced file.
*
* @param {string} sXML
* @param {string|null} sXMLFile
* @param {string|null|undefined} idMachine
* @param {string|null|undefined} sStateFile
* @param {boolean} fResolve is true to resolve any "ref" attributes; default is false
* @param {function(string)} display
* @param {function(string,Object)} done (string contains the unparsed XML string data, and Object contains a parsed XML object)
*/
function parseXML(sXML, sXMLFile, idMachine, sStateFile, fResolve, display, done)
{
var buildXML = function(sXML, sError) {
if (sError) {
done(sError, null);
return;
}
if (idMachine) {
var sURL = sXMLFile;
if (sURL && sURL.indexOf('/') < 0) sURL = window.location.pathname + sURL;
sXML = sXML.replace(/(<machine[^>]*\sid=)(['"]).*?\2/, "$1$2" + idMachine + "$2" + (sStateFile? " state=$2" + sStateFile + "$2" : "") + (sURL? " url=$2" + sURL + "$2" : ""));
}
/*
* If the resource we requested is not really an XML file (or the file didn't exist and the server simply returned
* a message like "Cannot GET /devices/pc/machine/5150/cga/64kb/donkey/machine.xml"), we'd like to display a more
* meaningful message, because the XML DOM parsers will blithely return a document that contains nothing useful; eg:
*
* This page contains the following errors:error on line 1 at column 1:
* Document is empty Below is a rendering of the page up to the first error.
*
* Supposedly, the IE XML DOM parser will throw an exception, but I haven't tested that, and unless all other
* browsers do that, that's not helpful.
*
* The best I can do at this stage (assuming web.loadResource() didn't drop any error information on the floor)
* is verify that the requested resource "looks like" valid XML (in other words, it begins with a '<').
*/
var xmlDoc = null;
if (sXML.charAt(0) == '<') {
try {
if (window.ActiveXObject || "ActiveXObject" in window) { // second test is required for IE11 on Windows 8.1
/*
* Another hack for MSIE, which fails to properly load XSL documents containing a <!DOCTYPE [...]> tag.
*/
if (!fResolve) {
sXML = sXML.replace(/<!DOCTYPE(.|[\r\n])*]>\s*/g, "");
}
xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = false;
xmlDoc['loadXML'](sXML);
} else {
xmlDoc = (new window.DOMParser()).parseFromString(sXML, "text/xml");
}
} catch(e) {
xmlDoc = null;
sXML = e.message;
}
} else {
sXML = "unrecognized XML: " + (sXML.length > 255? sXML.substr(0, 255) + "..." : sXML);
}
done(sXML, xmlDoc);
};
if (sXML) {
if (fResolve) {
resolveXML(sXML, display, buildXML);
return;
}
buildXML(sXML, null);
return;
}
done("no data" + (sXMLFile? " for file: " + sXMLFile : ""), null);
}
/**
* resolveXML(sXML, display, done)
*
* Replaces every tag with a "ref" attribute with the contents of the corresponding file.
*
* TODO: Fix some of the limitations of this code, such as: 1) requiring the "ref" attribute
* to appear as the tag's first attribute, 2) requiring the "ref" attribute to be double-quoted,
* and 3) requiring the "ref" tag to be self-closing.
*
* @param {string} sXML
* @param {function(string)} display
* @param {function(string,(string|null))} done (the first string contains the resolved XML data, the second is for any error message)
*/
function resolveXML(sXML, display, done)
{
var matchRef;
var reRef = /<([a-z]+)\s+ref="(.*?)"(.*?)\/>/g;
if ((matchRef = reRef.exec(sXML))) {
var sRefFile = matchRef[2];
var doneReadXML = function(sURLName, sXMLRef, nErrorCode) {
if (nErrorCode || !sXMLRef) {
done(sXML, "unable to resolve XML reference: " + matchRef[0] + " (" + nErrorCode + ")");
return;
}
/*
* If there are additional attributes in the "referring" XML tag, we want to insert them
* into the "referred" XML tag; attributes that don't exist in the referred tag should be
* appended, and attributes that DO exist should be overwritten.
*/
var sRefAttrs = matchRef[3];
if (sRefAttrs) {
var aXMLRefTag = sXMLRef.match(new RegExp("<" + matchRef[1] + "[^>]*>"));
if (aXMLRefTag) {
var sXMLNewTag = aXMLRefTag[0];
/*
* Iterate over all the attributes in the "referring" XML tag (sRefAttrs)
*/
var matchAttr;
var reAttr = /( [a-z]+=)(['"])(.*?)\2/g;
while ((matchAttr = reAttr.exec(sRefAttrs))) {
if (sXMLNewTag.indexOf(matchAttr[1]) < 0) {
/*
* This is the append case
*/
sXMLNewTag = sXMLNewTag.replace(">", matchAttr[0] + ">");
} else {
/*
* This is the overwrite case
*/
sXMLNewTag = sXMLNewTag.replace(new RegExp(matchAttr[1] + "(['\"])(.*?)\\1"), matchAttr[0]);
}
}
if (aXMLRefTag[0] != sXMLNewTag) {
sXMLRef = sXMLRef.replace(aXMLRefTag[0], sXMLNewTag);
}
} else {
done(sXML, "missing <" + matchRef[1] + "> in " + sRefFile);
return;
}
}
/*
* Apparently when a Windows Azure server delivers one of my XML files, it may modify the first line:
*
* <?xml version="1.0" encoding="UTF-8"?>\n
*
* I didn't determine exactly what it was doing at this point (probably just changing the \n to \r\n),
* but in any case, relaxing the following replace() solved it.
*/
sXMLRef = sXMLRef.replace(/<\?xml[^>]*>[\r\n]*/, "");
sXML = sXML.replace(matchRef[0], sXMLRef);
resolveXML(sXML, display, done);
};
display("Loading " + sRefFile + "...");
web.loadResource(sRefFile, fAsync, null, null, doneReadXML);
return;
}
done(sXML, null);
}
/**
* embedMachine(sName, sVersion, idElement, sXMLFile, sXSLFile, sStateFile)
*
* This allows to you embed a machine on a web page, by transforming the machine XML into HTML.
*
* @param {string} sName is the app name (eg, "PCjs")
* @param {string} sVersion is the app version (eg, "1.15.7")
* @param {string} idElement
* @param {string} sXMLFile
* @param {string} sXSLFile
* @param {string} [sStateFile]
* @return {boolean} true if successful, false if error
*/
function embedMachine(sName, sVersion, idElement, sXMLFile, sXSLFile, sStateFile)
{
var eMachine, eWarning, fSuccess = true;
cMachines++;
var doneMachine = function() {
Component.assert(cMachines > 0);
if (!--cMachines) {
if (fAsync) web.enablePageEvents(true);
}
};
var displayError = function(sError) {
Component.log(sError);
displayMessage("Error: " + sError);
if (fSuccess) doneMachine();
fSuccess = false;
};
var displayMessage = function(sMessage) {
if (eWarning === undefined) {
/*
* Our MarkOut module (in convertMDMachineLinks()) creates machine containers that look like:
*
* <div id="' + sMachineID + '" class="machine-placeholder"><p>Embedded PC</p><p class="machine-warning">...</p></div>
*
* with the "machine-warning" paragraph pre-populated with a warning message that the user will
* see if nothing at all happens. But hopefully, in the normal case (and especially the error case),
* *something* will have happened.
*
* Note that it is the HTMLOut module (in processMachines()) that ultimately decides which scripts to
* include and then generates the embedPC() and/or embedC1P() calls.
*/
var aeWarning = (eMachine && Component.getElementsByClass(eMachine, "machine-warning"));
eWarning = (aeWarning && aeWarning[0]) || eMachine;
}
if (eWarning) eWarning.innerHTML = str.escapeHTML(sMessage);
};
try {
eMachine = window.document.getElementById(idElement);
if (eMachine) {
var sAppClass = sName.toLowerCase(); // eg, "pcjs" or "c1pjs"
if (!sXSLFile) {
/*
* Now that PCjs is an open-source project, we can make the following test more flexible,
* and revert to the internal template if DEBUG *or* internal version (instead of *and*).
*
* Third-party sites that don't use the PCjs server will ALWAYS want to specify a fully-qualified
* path to the XSL file, unless they choose to mirror our folder structure.
*/
if (DEBUG || sVersion == "1.x.x") {
sXSLFile = "/modules/" + sAppClass + "/templates/components.xsl";
} else {
sXSLFile = "/versions/" + sAppClass + "/" + sVersion + "/components.xsl";
}
}
var loadXSL = function(sXML, xml) {
if (!xml) {
displayError(sXML);
return;
}
var transformXML = function(sXSL, xsl) {
if (!xsl) {
displayError(sXSL);
return;
}
if (xsl) {
/*
* The <machine> template in components.xsl now generates a "machine div" that makes
* the div we required the caller of embedMachine() to provide redundant, so instead
* of appending this fragment to the caller's node, we REPLACE the caller's node.
* This works only because because we ALSO inject the caller's "machine div" ID into
* the fragment's ID during parseXML().
*
* eMachine.innerHTML = sFragment;
*
* Also, if the transform function fails, make sure you're using the appropriate
* "components.xsl" and not a "machine.xsl", because the latter will not produce valid
* embeddable HTML (and is the most common cause of failure at this final stage).
*/
displayMessage("Processing " + sXMLFile + "...");
if (window.ActiveXObject || "ActiveXObject" in window) { // second test is required for IE11 on Windows 8.1
var sFragment = xml['transformNode'](xsl);
if (sFragment) {
eMachine.outerHTML = sFragment;
doneMachine();
} else {
displayError("transformNodeToObject failed");
}
}
else if (window.document.implementation && window.document.implementation.createDocument) {
var xsltProcessor = new XSLTProcessor();
xsltProcessor['importStylesheet'](xsl);
var eFragment = xsltProcessor['transformToFragment'](xml, window.document);
if (eFragment) {
if (eMachine.parentNode) {
eMachine.parentNode.replaceChild(eFragment, eMachine);
doneMachine();
} else {
displayError("invalid machine element: " + idElement);
}
} else {
displayError("transformToFragment failed");
}
} else {
/*
* Perhaps I should have performed this test at the outset; on the other hand, I'm
* not aware of any browsers don't support one or both of the above XSLT transformation
* methods, so treat this as a bug.
*/
displayError("unable to transform XML: unsupported browser");
}
} else {
displayError("failed to load XSL file: " + sXSLFile);
}
};
if (xml) {
loadXML(sXSLFile, null, null, false, displayMessage, transformXML);
} else {
displayError("failed to load XML file: " + sXMLFile);
}
};
if (sXMLFile.charAt(0) != '<') {
loadXML(sXMLFile, idElement, sStateFile, true, displayMessage, loadXSL);
} else {
parseXML(sXMLFile, null, idElement, sStateFile, false, displayMessage, loadXSL);
}
} else {
displayError("missing machine element: " + idElement);
}
} catch(e) {
displayError(e.message);
}
return fSuccess;
}
/**
* embedC1P(idElement, sXMLFile, sXSLFile)
*
* @param {string} idElement
* @param {string} sXMLFile
* @param {string} sXSLFile
* @return {boolean} true if successful, false if error
*/
function embedC1P(idElement, sXMLFile, sXSLFile)
{
if (fAsync) web.enablePageEvents(false);
return embedMachine("C1Pjs", APPVERSION, idElement, sXMLFile, sXSLFile);
}
/**
* embedPC(idElement, sXMLFile, sXSLFile, sStateFile)
*
* @param {string} idElement
* @param {string} sXMLFile
* @param {string} sXSLFile
* @param {string} [sStateFile]
* @return {boolean} true if successful, false if error
*/
function embedPC(idElement, sXMLFile, sXSLFile, sStateFile)
{
if (fAsync) web.enablePageEvents(false);
return embedMachine("PCjs", APPVERSION, idElement, sXMLFile, sXSLFile, sStateFile);
}
/**
* Prevent the Closure Compiler from renaming functions we want to export, by adding them
* as (named) properties of a global object.
*/
if (APPNAME == "PCjs") {
window['embedPC'] = embedPC;
}
if (APPNAME == "C1Pjs") {
window['embedC1P'] = embedC1P;
}
window['enableEvents'] = web.enablePageEvents;
window['sendEvent'] = web.sendPageEvent;
/** * @fileoverview Externs used by PCjs and C1Pjs (for the Closure Compiler) * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> * @version 1.0 * Created 2012-Dec-04 * * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org> * * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/> * and <http://pcjs.org/>. * * JSMachines is free software: you can redistribute it and/or modify it under the terms of the * GNU General Public License as published by the Free Software Foundation, either version 3 * of the License, or (at your option) any later version. * * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with JSMachines. * If not, see <http://www.gnu.org/licenses/gpl.html>. * * You are required to include the above copyright notice in every source code file of every * copy or modified version of this work, and to display that copyright notice on every screen * that loads or runs any version of this software (see Computer.sCopyright). * * Some JSMachines files also attempt to load external resource files, such as character-image files, * ROM files, and disk image files. Those external resource files are not considered part of the * JSMachines Project for purposes of the GNU General Public License, and the author does not claim * any copyright as to their contents. */ "use strict"; var global; // var webkitAudioContext;
/**
* @fileoverview Net-related functions
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
* @version 1.0
* Created 2014-03-16
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
* and <http://pcjs.org/>.
*
* JSMachines is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with JSMachines.
* If not, see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some JSMachines files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* JSMachines Project for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
/* global Buffer: false */
var net = {};
if (typeof module !== 'undefined') {
var sServerRoot;
var fs = require("fs");
var http = require("http");
var path = require("path");
var url = require("url");
var str = require("./strlib");
}
/*
* The following are (super-secret) commands that can be added to the URL to enable special features.
*
* Our super-secret command processor is affectionately call Gort, and while Gort doesn't understand commands
* like "Klaatu barada nikto", it does understand commands like "debug" and "rebuild"; eg:
*
* http://www.pcjs.org/?gort=debug
*
* hasParm() detects the presence of the specified command, and propagateParms() is a URL filter that ensures
* any commands listed in asPropagate are passed through to all other URLs on the same page; using any of these
* commands also forces the page to be rebuilt and not cached (since we would never want a cached "index.html" to
* contain/expose any of these commands).
*/
net.GORT_COMMAND = "gort";
net.GORT_DEBUG = "debug"; // use this to force uncompiled JavaScript even on a Release server
net.GORT_NODEBUG = "nodebug"; // use this to force uncompiled JavaScript but with DEBUG code disabled
net.GORT_RELEASE = "release"; // use this to force the use of compiled JavaScript even on a Debug server
net.GORT_REBUILD = "rebuild"; // use this to force the "index.html" in the current directory to be rebuilt
net.REVEAL_COMMAND = "reveal";
net.REVEAL_PDFS = "pdfs";
/*
* This is a list of the URL parameters that propagateParms() will propagate from the requester's URL to
* other URLs provided by the requester.
*/
var asPropagate = [net.GORT_COMMAND, "autostart"];
/**
* hasParm(sParm, sValue, req)
*
* @param {string} sParm
* @param {string|null} sValue (pass null to check for the presence of ANY sParm)
* @param {Object} [req] is the web server's (ie, Express) request object, if any
* @return {boolean} true if the request Object contains the specified parameter/value, false if not
*
* TODO: Consider whether sParm === null should check for the presence of ANY parameter in asPropagate.
*/
net.hasParm = function(sParm, sValue, req)
{
return (req && req.query && req.query[sParm] && (!sValue || req.query[sParm] == sValue));
};
/**
* propagateParms(sURL, req)
*
* Propagates any "special" query parameters (as listed in asPropagate) from the given
* request object (req) to the given URL (sURL).
*
* We do not modify an sURL that already contains a '?' OR that begins with a protocol
* (eg, http:, mailto:, etc), in order to keep this function simple, since it's only for
* debugging purposes anyway. I also considered blowing off any URLs with a '#' for the
* same reason, since any hash string must follow any query parameters, but stripping
* and re-appending the hash string is pretty trivial, so we do handle that.
*
* TODO: Make propagateParms() more general-purpose (eg, capable of detecting any URL
* to the same site, and capable of merging any of our "special" query parameters with any
* existing query parameters.
*
* @param {string|null} sURL
* @param {Object} [req] is the web server's (ie, Express) request object, if any
* @return {string} massaged sURL
*/
net.propagateParms = function(sURL, req)
{
if (sURL !== null && sURL.indexOf('?') < 0) {
var i;
var sHash = "";
if ((i = sURL.indexOf('#')) >= 0) {
sHash = sURL.substr(i);
sURL = sURL.substr(0, i);
}
var match = sURL.match(/^([a-z])+:(.*)/);
if (!match && req && req.query) {
for (i = 0; i < asPropagate.length; i++) {
var sQuery = asPropagate[i];
var sValue;
if ((sValue = req.query[sQuery])) {
var sParm = (sURL.indexOf('?') < 0? '?' : '&');
sParm += sQuery + '=';
if (sURL.indexOf(sParm) < 0) sURL += sParm + encodeURIComponent(sValue);
}
}
}
sURL += sHash;
}
return sURL;
};
/**
* encodeURL(sURL, req, fDebug)
*
* Used to encodes any URLs presented on the current page, using this 3-step (um, 4-step) process:
*
* 1) Replace any backslashes with slashes, in case the URL was derived from a file system path
* 2) Remap links that begin with "static/" to the corresponding URL at "http://static.pcjs.org/"
* 3) Transform any "htmlspecialchars" into the corresponding entities, using encodeURI()
* 4) Massage the result with net.propagateParms(), so that any special parameters are passed along
*
* @param {string} sURL
* @param {Object} req is the web server's (ie, Express) request object, if any
* @param {boolean} [fDebug]
* @return {string} encoded URL
*/
net.encodeURL = function(sURL, req, fDebug)
{
if (sURL) {
sURL = sURL.replace(/\\/g, '/');
if (!fDebug) {
if (sURL.match(/^[^:?]*static\//)) {
if (sURL.charAt(0) != '/') sURL = path.join(req.path, sURL);
sURL = "http://static.pcjs.org" + sURL.replace("/static/", "/");
}
}
return net.propagateParms(encodeURI(sURL), req);
}
return sURL;
};
/**
* isRemote(sPath)
*
* @param {string} sPath
* @return {boolean} true if sPath is a (supported) remote path, false if not
*
* TODO: Add support for FTP? HTTPS? Anything else?
*/
net.isRemote = function(sPath)
{
return (sPath.indexOf("http:") === 0);
};
/**
* getStat(sURL, done)
*
* @param {string} sURL
* @param {function(Error,Object)} done
*/
net.getStat = function(sURL, done)
{
var options = url.parse(sURL);
options.method = "HEAD";
options.path = options.pathname; // TODO: Determine the necessity of aliasing this
var req = http.request(options, function(res) {
var err = null;
var stat = null;
// console.log(JSON.stringify(res.headers));
if (res.statusCode == 200) {
/*
* Apparently Node lower-cases response headers (at least incoming headers, despite
* lots of amusing whining by certain people in the Node community), which seems like
* a good thing, because that means I can do two simple key look-ups.
*/
var sLength = res.headers['content-length'];
var sModified = res.headers['last-modified'];
stat = {
size: sLength? parseInt(sLength, 10) : -1,
mtime: sModified? new Date(sModified) : null,
remote: true // an additional property we provide to indicate this is not your normal stats object
};
} else {
err = new Error("unexpected response code: " + res.statusCode);
}
done(err, stat);
});
req.on('error', function(err) {
done(err, null);
});
req.end();
};
/**
* getFile(sURL, sEncoding, done)
*
* @param {string} sURL is the source file
* @param {string|null} sEncoding is the encoding to assume, if any
* @param {function(Error,number,(string|Buffer))} done receives an Error, an HTTP status code, and a Buffer (if any)
*
* TODO: Add support for FTP? HTTPS? Anything else?
*/
net.getFile = function(sURL, sEncoding, done)
{
/*
* Buffer objects are a fixed size, so my choices are: 1) call getStat() first, hope it returns
* the true size, and then preallocate a buffer; or 2) create a new, larger buffer every time a new
* chunk arrives. The latter seems best.
*
* However, if an encoding is given, we'll simply concatenate all the data into a String and return
* that instead. Note that the incoming data is always a Buffer, but concatenation with a String
* performs an implied "toString()" on the Buffer.
*
* WARNING: Even when an encoding is provided, we don't make any attempt to verify that the incoming
* data matches that encoding.
*/
var sFile = "";
var bufFile = null;
http.get(sURL, function(res) {
res.on('data', function(data) {
if (sEncoding) {
sFile += data;
return;
}
if (!bufFile) {
bufFile = data;
return;
}
/*
* We need to grow bufFile. I used to do this myself, using the "copy" method:
*
* buf.copy(targetBuffer, [targetStart], [sourceStart], [sourceEnd])
*
* which defaults to 0 for [targetStart] and [sourceStart], but the docs don't clearly
* define the default value for [sourceEnd]. They say "buffer.length", but there is no
* parameter here named "buffer". Let's hope that in the case of "bufFile.copy(buf)"
* they meant "bufFile.length".
*
* However, it turns out this is moot, because there's a new kid in town: Buffer.concat().
*
* buf = new Buffer(bufFile.length + data.length);
* bufFile.copy(buf);
* data.copy(buf, bufFile.length);
* bufFile = buf;
*/
bufFile = Buffer.concat([bufFile, data], bufFile.length + data.length);
}).on('end', function() {
/*
* TODO: Decide what to do when res.statusCode is actually an error code (eg, 404), because
* in such cases, the file content will likely just be an HTML error page.
*/
if (res.statusCode < 400) {
done(null, res.statusCode, sEncoding? sFile : bufFile);
} else {
done(new Error(sEncoding? sFile : bufFile), res.statusCode, null);
}
}).on('error', function(err) {
done(err, res.statusCode, null);
});
});
};
/**
* downloadFile(sURL, sFile, done)
*
* @param {string} sURL is the source file
* @param {string} sFile is a fully-qualified target file
* @param {function(Error,number)} done is a callback that receives an Error and a HTTP status code
*/
net.downloadFile = function(sURL, sFile, done)
{
var file = fs.createWriteStream(sFile);
/*
* http.get() accepts a "url" string in lieu of an "options" object; it automatically builds
* the latter from the former using url.parse(). This is good, because it relieves me from
* building my own "options" object, and also from wondering why http functions expect "options"
* to contain a "path" property, whereas url.parse() returns a "pathname" property.
*
* Either the documentation isn't quite right for url.parse() or http.request() (the big brother
* of http.get), or one of those "options" properties is aliased to the other, or...?
*/
http.get(sURL, function(res) {
res.on('data', function(data) {
file.write(data);
}).on('end', function() {
file.end();
/*
* TODO: We should try to update the file's modification time to match the 'last-modified'
* response header value, if any.
*
* TODO: Decide what to do when res.statusCode is actually an error code (eg, 404), because
* in such cases, the file content will likely just be an HTML error page.
*/
done(null, res.statusCode);
}).on('error', function(err) {
done(err, res.statusCode);
});
});
};
/**
* loadResource(sURL, fAsync, data, componentNotify, fnNotify, pNotify)
*
* Request the specified resource (sURL), and once the request is complete,
* optionally call the specified method (fnNotify) of the specified component (componentNotify).
*
* TODO: Figure out how we can strongly type the fnNotify parameter, because the Closure Compiler has issues with:
*
* {function(this:Component, string, (string|null), number, (number|string|null|Object|Array|undefined))} [fnNotify]
*
* NOTE: This function is a mirror image of the weblib version, for server-side component testing within Node;
* since it is NOT intended for production use, it may make liberal use of synchronous functions, warning messages, etc.
*
* @param {string} sURL
* @param {boolean} [fAsync] is true for an asynchronous request
* @param {Object|null} [data] for a POST request (default is a GET request)
* @param {Component} [componentNotify]
* @param {function(...)} [fnNotify]
* @param {number|string|null|Object|Array} [pNotify] optional fnNotify parameter
* @return {Array} containing errorCode and responseText (empty array if async request)
*/
net.loadResource = function(sURL, fAsync, data, componentNotify, fnNotify, pNotify) {
var nErrorCode = -1;
var sResponse = null;
if (net.isRemote(sURL)) {
console.log('net.loadResource("' + sURL + '"): unimplemented');
} else {
if (!sServerRoot) {
sServerRoot = path.join(path.dirname(fs.realpathSync(__filename)), "../../../");
}
var sBaseName = str.getBaseName(sURL);
var sFile = path.join(sServerRoot, sURL);
if (fAsync) {
fs.readFile(sFile, {encoding: "utf8"}, function(err, s) {
/*
* TODO: If err is set, is there an error code we should return (instead of -1)?
*/
if (!err) {
sResponse = s;
nErrorCode = 0;
}
if (fnNotify) {
if (!componentNotify) {
fnNotify(sBaseName, sResponse, nErrorCode, pNotify);
} else {
fnNotify.call(componentNotify, sBaseName, sResponse, nErrorCode, pNotify);
}
}
});
return [];
} else {
try {
sResponse = fs.readFileSync(sFile, {encoding: "utf8"});
nErrorCode = 0;
} catch(err) {
/*
* TODO: If err is set, is there an error code we should return (instead of -1)?
*/
console.log(err.message);
}
if (fnNotify) {
if (!componentNotify) {
fnNotify(sBaseName, sResponse, nErrorCode, pNotify);
} else {
fnNotify.call(componentNotify, sBaseName, sResponse, nErrorCode, pNotify);
}
}
}
}
return [nErrorCode, sResponse];
};
if (typeof module !== 'undefined') module.exports = net;
/** * @fileoverview Compile-time definitions for non-DEBUG configurations. * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> * @version 1.0 * Created 2014-Aug-22 * * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org> * * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines) * at <http://jsmachines.net/> and <http://pcjs.org/>. * * PCjs is free software: you can redistribute it and/or modify it under the terms of the * GNU General Public License as published by the Free Software Foundation, either version 3 * of the License, or (at your option) any later version. * * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with PCjs. If not, * see <http://www.gnu.org/licenses/gpl.html>. * * You are required to include the above copyright notice in every source code file of every * copy or modified version of this work, and to display that copyright notice on every screen * that loads or runs any version of this software (see Computer.sCopyright). * * Some PCjs files also attempt to load external resource files, such as character-image files, * ROM files, and disk image files. Those external resource files are not considered part of the * PCjs program for purposes of the GNU General Public License, and the author does not claim * any copyright as to their contents. */ "use strict"; /* global DEBUG: true */ /* * In the compiled case, we rely on the Closure Compiler to override DEBUG, setting it to false, * so that all DEBUG-only code will be removed by the compiler. * * However, when we're in "development mode" and want to run uncompiled code without any DEBUG-only * code, we must arrange for this additional file, nodebug.js, to be loaded as early as possible, * which will then set DEBUG to false at runtime. */ DEBUG = false;
/**
* @fileoverview Process-related helper functions
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
* @version 1.0
* Created 2014-05-07
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
* and <http://pcjs.org/>.
*
* JSMachines is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with JSMachines.
* If not, see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some JSMachines files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* JSMachines Project for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
var proc = {};
/**
* getArgs()
*
* Processes command-line arguments. Arguments may be introduced by either
* a double-hyphen (--) or a long dash (—), and argument values, if any, must be
* separated by an "=" without any intervening whitespace. Arguments without
* an explicit value default to true, and any argument appearing more than once
* is automatically converted to an Array.
*
* Single-hyphen (-) arguments are allowed as well; they are treated as a series
* of single-character arguments, each set to true, and any of these arguments
* appearing more than once is discarded.
*
* @return {{argc:number, argv:{}}}
*/
proc.getArgs = function() {
var argc = 0;
var argv = {};
for (var i = 2; i < process.argv.length; i++) {
var j, sSep;
var sArg = process.argv[i];
if (!sArg.indexOf(sSep = "--") || !sArg.indexOf(sSep = "—")) {
sArg = sArg.substr(sSep.length);
var sValue = true;
j = sArg.indexOf("=");
if (j > 0) {
sValue = sArg.substr(j+1);
sArg = sArg.substr(0, j);
sValue = (sValue == "true")? true : ((sValue == "false")? false : sValue);
}
if (argv[sArg] === undefined) {
argc++;
argv[sArg] = sValue;
} else {
// console.log("too many '" + sArg + "' arguments");
if (typeof argv[sArg] == "string") {
argv[sArg] = [argv[sArg]];
}
argv[sArg].push(sValue);
}
} else if (!sArg.indexOf("-")) {
for (j = 1; j < sArg.length; j++) {
var ch = sArg.charAt(j);
if (argv[ch] === undefined) {
argv[ch] = true;
argc++;
}
}
}
}
return {argc: argc, argv: argv};
};
if (typeof module !== 'undefined') module.exports = proc;
/**
* @fileoverview Report API, as defined by httpapi.js
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2014-May-13
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
* and <http://pcjs.org/>.
*
* JSMachines is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with JSMachines.
* If not, see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some JSMachines files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* JSMachines Project for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
var ReportAPI = {
ENDPOINT: "/api/v1/report",
QUERY: {
APP: "app",
VER: "ver",
URL: "url",
USER: "user",
TYPE: "type",
DATA: "data"
},
TYPE: {
BUG: "bug"
},
RES: {
OK: "Thank you"
}
};
if (typeof module !== 'undefined') module.exports = ReportAPI;/**
* @fileoverview Experimental code included by HTMLOut() only if "--sockets"
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2014-Apr-29
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
* and <http://pcjs.org/>.
*
* JSMachines is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with JSMachines.
* If not, see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some JSMachines files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* JSMachines Project for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
/* global io: false */
// connect to the socket server
var socket = io.connect();
// if we get an "info" emit from the socket server then console.log the data we receive
socket.on('info', function (data) {
console.log(data);
});/**
* @fileoverview String-related helper functions
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
* @version 1.0
* Created 2014-03-09
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
* and <http://pcjs.org/>.
*
* JSMachines is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with JSMachines.
* If not, see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some JSMachines files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* JSMachines Project for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
var str = {};
/**
* isValidInt(s, base)
*
* Since the built-in parseInt() function has the annoying feature of returning a partial value
* when it encounters an invalid character (eg, parseInt("foo", 16) returns 0xf), use this function
* to validate the entire string first.
*
* @param {string} s is the string representation of some number
* @param {number} [base] is the radix of the number represented above (only 10 and 16 are supported)
* @return {boolean} true if valid (or we're not sure because the base isn't recognized), false if invalid
*/
str.isValidInt = function(s, base)
{
if (!base || base == 10) return s.match(/^[0-9]+$/) !== null;
if (base == 16) return s.match(/^[0-9a-f]+$/i) !== null;
return true;
};
/**
* parseInt(s, base)
*
* This is a wrapper around the built-in parseInt() function, which recognizes certain prefixes (eg,
* '$' or "0x" for hex) and suffixes (eg, 'h' for hex or '.' for decimal), and then calls isValidInt()
* to ensure we don't get partial values (see isValidInt() for details).
*
* @param {string} s is the string representation of some number
* @param {number} [base] is the default radix to use (default is 16); can be overridden by prefixes/suffixes
* @return {number|undefined} corresponding value, or undefined if invalid
*/
str.parseInt = function(s, base)
{
var value;
if (s) {
if (!base) base = 16;
if (s.charAt(0) == '$') {
base = 16;
s = s.substr(1);
} else if (s.substr(0, 2) == "0x") {
base = 16;
s = s.substr(2);
} else {
var chSuffix = s.charAt(s.length-1).toLowerCase();
if (chSuffix == 'h') {
base = 16;
chSuffix = null;
}
else if (chSuffix == '.') {
base = 10;
chSuffix = null;
}
if (chSuffix === null) s = s.substr(0, s.length-1);
}
var v;
if (str.isValidInt(s, base) && !isNaN(v = parseInt(s, base))) {
value = v|0;
}
}
return value;
};
/**
* toHex(n, cch)
*
* Converts an integer to hex, with the specified number of digits (up to the default of 8).
*
* You might be tempted to use the built-in n.toString(16) instead, but it doesn't zero-pad and it
* doesn't properly convert negative values; for example, if n is -2147483647, then n.toString(16)
* will return "-7fffffff" instead of "80000001". Moreover, if n is undefined, n.toString() will throw
* an exception, whereas toHex() will simply return '?' characters.
*
* NOTE: The following work-around (adapted from code found on StackOverflow) would be another solution,
* taking care of negative values, zero-padding, and upper-casing, but not undefined/NaN values:
*
* s = (n < 0? n + 0x100000000 : n).toString(16);
* s = "00000000".substr(0, 8 - s.length) + s;
* s = s.substr(0, cch).toUpperCase();
*
* @param {number|null|undefined} n is a 32-bit value
* @param {number} [cch] is the desired number of hex digits (8 is both the default and the maximum)
* @return {string} the hex representation of n
*/
str.toHex = function(n, cch)
{
var s = "";
if (cch === undefined) {
cch = 8;
} else {
if (cch > 8) cch = 8;
}
/*
* An initial "falsey" check for null takes care of both null and undefined;
* we can't rely entirely on isNaN(), because isNaN(null) returns false, oddly enough.
*/
if (n == null || isNaN(n)) {
while (cch-- > 0) s = '?' + s;
} else {
while (cch-- > 0) {
var d = n & 0xf;
d += (d >= 0 && d <= 9? 0x30 : 0x41 - 10);
s = String.fromCharCode(d) + s;
n >>= 4;
}
}
return s;
};
/**
* toHexByte(b)
*
* Alias for "0x" + str.toHex(b, 2)
*
* @param {number|null|undefined} b is a byte value
* @return {string} the hex representation of b
*/
str.toHexByte = function(b)
{
return "0x" + str.toHex(b, 2);
};
/**
* toHexWord(w)
*
* Alias for "0x" + str.toHex(w, 4)
*
* @param {number|null|undefined} w is a word (16-bit) value
* @return {string} the hex representation of w
*/
str.toHexWord = function(w)
{
return "0x" + str.toHex(w, 4);
};
/**
* toHexLong(l)
*
* Alias for "0x" + toHex(l)
*
* @param {number|null|undefined} l is a dword (32-bit) value
* @return {string} the hex representation of w
*/
str.toHexLong = function(l)
{
return "0x" + str.toHex(l);
};
/**
* getBaseName(sFileName, fStripExt)
*
* This is a poor-man's version of Node's path.basename(), which Node-only components should use instead.
*
* Note that fStripExt can be used to strip ANY extension, whereas path.basename() will strip the extension only
* if it matches the second parameter (eg, path.basename("/foo/bar/baz/asdf/quux.html", ".html") returns "quux").
*
* @param {string} sFileName
* @param {boolean} [fStripExt]
* @return {string}
*/
str.getBaseName = function(sFileName, fStripExt)
{
var sBaseName = sFileName;
var i = sFileName.lastIndexOf('/');
if (i >= 0) sBaseName = sFileName.substr(i + 1);
/*
* This next bit is a kludge to clean up names that are part of a URL that includes unsightly query parameters.
*/
i = sBaseName.indexOf('&');
if (i > 0) sBaseName = sBaseName.substr(0, i);
if (fStripExt) {
i = sBaseName.lastIndexOf(".");
if (i > 0) {
sBaseName = sBaseName.substring(0, i);
}
}
return sBaseName;
};
/**
* getExtension(sFileName)
*
* This is a poor-man's version of Node's path.extname(), which Node-only components should use instead.
*
* Note that we EXCLUDE the period from the returned extension, whereas path.extname() includes it.
*
* @param {string} sFileName
* @return {string} the filename's extension (in lower-case and EXCLUDING the "."), or an empty string
*/
str.getExtension = function(sFileName)
{
var sExtension = "";
var i = sFileName.lastIndexOf(".");
if (i >= 0) {
sExtension = sFileName.substr(i + 1).toLowerCase();
}
return sExtension;
};
/**
* endsWith(s, sSuffix)
*
* @param {string} s
* @param {string} sSuffix
* @return {boolean} true if s ends with sSuffix, false if not
*/
str.endsWith = function(s, sSuffix)
{
return s.indexOf(sSuffix, s.length - sSuffix.length) !== -1;
};
str.aHTMLEscapeMap = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
};
/**
* escapeHTML(sHTML)
*
* @param {string} sHTML
* @return {string} with HTML entities "escaped", similar to PHP's htmlspecialchars()
*/
str.escapeHTML = function(sHTML)
{
return sHTML.replace(/[&<>"']/g, function(m) {
return str.aHTMLEscapeMap[m];
});
};
/**
* replaceAll(sFind, sReplace, s)
*
* @param {string} sFind
* @param {string} sReplace
* @param {string} s
* @return {string}
*/
str.replaceAll = function(sFind, sReplace, s)
{
var a = {};
a[sFind] = sReplace;
return str.replaceArray(a, s);
};
/**
* replaceArray(a, s)
*
* @param {Object} a
* @param {string} s
* @return {string}
*/
str.replaceArray = function(a, s)
{
var sMatch = "";
for (var k in a) {
/*
* As noted in:
*
* http://www.regexguru.com/2008/04/escape-characters-only-when-necessary/
*
* inside character classes, only backslash, caret, hyphen and the closing bracket need to be
* escaped. And in fact, if you ensure that the closing bracket is first, the caret is not first,
* and the hyphen is last, you can avoid escaping those as well.
*/
k = k.replace(/([\\[\]*{}().+?])/g, "\\$1");
sMatch += (sMatch? '|' : '') + k;
}
return s.replace(new RegExp('(' + sMatch + ')', "g"), function(m) {
return a[m];
});
};
/**
* pad(s, cch)
*
* Note that the maximum amount of padding currently supported is 40 spaces.
*
* @param {string} s is a string
* @param {number} cch is desired length
* @returns {string} the original string (s) with spaces padding it to the specified length
*/
str.pad = function(s, cch)
{
return s + " ".substr(0, cch - s.length);
};
/**
* trim(s)
*
* @param {string} s
* @returns {string}
*/
str.trim = function(s)
{
if (String.prototype.trim) {
return s.trim();
}
return s.replace(/^\s+|\s+$/g, "");
};
if (typeof module !== 'undefined') module.exports = str;
/**
* @fileoverview User API, as defined by httpapi.js
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* Created 2014-May-13
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
* and <http://pcjs.org/>.
*
* JSMachines is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with JSMachines.
* If not, see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some JSMachines files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* JSMachines Project for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
/*
* Examples of User API requests:
*
* web.getHost() + UserAPI.ENDPOINT + '?' + UserAPI.QUERY.REQ + '=' + UserAPI.REQ.VERIFY + '&' + UserAPI.QUERY.USER + '=' + sUser;
*/
var UserAPI = {
ENDPOINT: "/api/v1/user",
QUERY: {
REQ: "req", // specifies a request
USER: "user", // specifies a user ID
STATE: "state", // specifies a state ID
DATA: "data" // specifies state data
},
REQ: {
CREATE: "create", // creates a user ID
VERIFY: "verify", // requests verification of a user ID
STORE: "store", // stores a machine state on the server
LOAD: "load" // loads a machine state from the server
},
RES: {
CODE: "code",
DATA: "data"
},
CODE: {
OK: "ok",
FAIL: "error"
},
FAIL: {
DUPLICATE: "user already exists",
VERIFY: "unable to verify user",
BADSTATE: "invalid state parameter",
NOSTATE: "no machine state",
BADLOAD: "unable to load machine state",
BADSTORE: "unable to save machine state"
}
};
if (typeof module !== 'undefined') module.exports = UserAPI;/**
* @fileoverview Assorted helper functions
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
* @version 1.0
* Created 2014-03-09
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
* and <http://pcjs.org/>.
*
* JSMachines is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with JSMachines.
* If not, see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some JSMachines files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* JSMachines Project for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
var usr = {};
/**
* binarySearch(a, v, fnCompare)
*
* @param {Array} a is an array
* @param {number|string|Array|Object} v
* @param {function((number|string|Array|Object), (number|string|Array|Object))} [fnCompare]
* @return {number} the index of matching entry if non-negative, otherwise the index of the insertion point
*/
usr.binarySearch = function(a, v, fnCompare) {
var left = 0;
var right = a.length;
var found = 0;
if (fnCompare === undefined) {
fnCompare = function(a, b) {
return a > b? 1 : a < b? -1 : 0;
};
}
while (left < right) {
var middle = (left + right) >> 1;
var compareResult;
compareResult = fnCompare(v, a[middle]);
if (compareResult > 0) {
left = middle + 1;
} else {
right = middle;
found = !compareResult;
}
}
return found? left : ~left;
};
/**
* binaryInsert(a, v, fnCompare)
*
* If element v already exists in array a, the array is unchanged (we don't allow duplicates); otherwise, the
* element is inserted into the array at the appropriate index.
*
* @param {Array} a is an array
* @param {number|string|Array|Object} v is the value to insert
* @param {function((number|string|Array|Object), (number|string|Array|Object))} [fnCompare]
*/
usr.binaryInsert = function(a, v, fnCompare) {
var index = usr.binarySearch(a, v, fnCompare);
if (index < 0) {
a.splice(-(index + 1), 0, v);
}
};
/**
* getTime()
*
* @return {number} the current time, in milliseconds
*/
usr.getTime = Date.now || function() { return +new Date(); };
/**
* getTimestamp()
*
* @return {string} timestamp containing the current date and time ("yyyy-mm-dd hh:mm:ss")
*/
usr.getTimestamp = function() {
var date = new Date();
var padNum = function(n) {
return (n < 10? "0" : "") + n;
};
return date.getFullYear() + "-" + padNum(date.getMonth() + 1) + "-" + padNum(date.getDate()) + " " + padNum(date.getHours()) + ":" + padNum(date.getMinutes()) + ":" + padNum(date.getSeconds());
};
/**
* getMonthDays(nMonth, nYear)
*
* Note that if we're being called on behalf of the RTC, its year is always truncated to two digits (mod 100),
* so we have no idea what century the year 0 might refer to. When using the normal leap-year formula, 0 fails
* the mod 100 test but passes the mod 400 test, so as far as the RTC is concerned, every century year is a leap
* year. Since we're most likely dealing with the year 2000, that's fine, since 2000 was also a leap year.
*
* TODO: There IS a separate CMOS byte that's supposed to be set to CMOS_ADDR.CENTURY_DATE; it's always BCD,
* so theoretically it will contain values like 0x19 or 0x20 (for the 20th and 21st centuries, respectively), and
* we could add that as another parameter to this function, to improve the accuracy, but that would go beyond what
* a real RTC actually does.
*
* @param {number} nMonth (1-12)
* @param {number} nYear (normally a 4-digit year, but it may also be mod 100)
* @return {number} the maximum (1-based) day allowed for the specified month and year
*/
usr.getMonthDays = function(nMonth, nYear)
{
var nDays = usr.aMonthDays[nMonth - 1];
if (nDays == 28) {
if ((nYear % 4) === 0 && ((nYear % 100) || (nYear % 400) === 0)) {
nDays++;
}
}
return nDays;
};
usr.asDays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
usr.asMonths = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
usr.aMonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
/**
* formatDate(sFormat, date)
*
* @param {string} sFormat (eg, "F j, Y", "Y-m-d H:i:s")
* @param {Date} [date] (default is the current time)
* @return {string}
*
* Supported identifiers in sFormat include:
*
* a: lowercase ante meridiem and post meridiem (am or pm)
* d: day of the month, 2 digits with leading zeros (01,...,31)
* g: hour in 12-hour format, without leading zeros (1,...,12)
* i: minutes, with leading zeros (00,...,59)
* j: day of the month, without leading zeros (1,...,31)
* l: day of the week ("Sunday",...,"Saturday")
* m: month, with leading zeros (01,...,12)
* s: seconds, with leading zeros (00,...,59)
* F: month ("January",...,"December")
* H: hour in 24-hour format, with leading zeros (00,...,23)
* Y: year (eg, 2014)
*
* For more inspiration, see: http://php.net/manual/en/function.date.php
*/
usr.formatDate = function(sFormat, date) {
var sDate = "";
if (!date) date = new Date();
var iHour = date.getHours();
var iDay = date.getDate();
var iMonth = date.getMonth() + 1;
for (var i = 0; i < sFormat.length; i++) {
var ch;
switch((ch = sFormat.charAt(i))) {
case 'a':
sDate += (iHour < 12? "am" : "pm");
break;
case 'd':
sDate += ('0' + iDay).slice(-2);
break;
case 'g':
sDate += (!iHour? 12 : (iHour > 12? iHour - 12 : iHour));
break;
case 'i':
sDate += ('0' + date.getMinutes()).slice(-2);
break;
case 'j':
sDate += iDay;
break;
case 'l':
sDate += usr.asDays[date.getDay()];
break;
case 'm':
sDate += ('0' + iMonth).slice(-2);
break;
case 's':
sDate += ('0' + date.getSeconds()).slice(-2);
break;
case 'F':
sDate += usr.asMonths[iMonth - 1];
break;
case 'H':
sDate += ('0' + iHour).slice(-2);
break;
case 'Y':
sDate += date.getFullYear();
break;
default:
sDate += ch;
break;
}
}
return sDate;
};
/**
* @typedef {{
* mask: number,
* shift: number
* }}
*/
var BitField;
/**
* @typedef {Object.<BitField>}
*/
var BitFields;
/**
* defineBitFields(bfs)
*
* Prepares a bit field definition for use with getBitField() and setBitField(); eg:
*
* var bfs = usr.defineBitFields({num:20, count:8, btmod:1, type:3});
*
* The above defines a set of bit fields containg four fields: num (bits 0-19), count (bits 20-27), btmod (bit 28), and type (bits 29-31).
*
* usr.setBitField(bfs.num, n, 1);
*
* The above set bit field "bfs.num" in numeric variable "n" to the value 1.
*
* @param {Object} bfs
* @return {*} (technically, we transform the bfs object into a BitFields object, but the Closure Compiler won't let us specify that)
*/
usr.defineBitFields = function(bfs)
{
var bit = 0;
for (var f in bfs) {
var width = bfs[f];
var mask = ((1 << width) - 1) << bit;
bfs[f] = {mask: mask, shift: bit};
bit += width;
}
// Component.assert(bit <= 32);
return bfs;
};
/**
* initBitFields(bfs, ...)
*
* @param {BitFields} bfs
* @param {...number} var_args
* @return {number} a value containing all supplied bit fields
*/
usr.initBitFields = function(bfs, var_args)
{
var v = 0, i = 1;
for (var f in bfs) {
if (i >= arguments.length) break;
v = usr.setBitField(bfs[f], v, arguments[i++]);
}
return v;
};
/**
* getBitField(bf, v)
*
* @param {BitField} bf
* @param {number} v is a value containing bit fields
* @return {number} the value of the bit field in v defined by bf
*/
usr.getBitField = function(bf, v)
{
return (v & bf.mask) >> bf.shift;
};
/**
* setBitField(bf, v, n)
*
* @param {BitField} bf
* @param {number} v is a value containing bit fields
* @param {number} n is a value to store in v in the bit field defined by bf
* @return {number} updated v
*/
usr.setBitField = function(bf, v, n)
{
// Component.assert(!(n & ~(bf.mask >>> bf.shift)));
return (v & ~bf.mask) | ((n << bf.shift) & bf.mask);
};
/**
* indexOf(a, t, i)
*
* Use this instead of Array.prototype.indexOf() if you can't be sure the browser supports it.
*
* @param {Array} a
* @param {*} t
* @param {number} [i]
* @returns {number}
*/
usr.indexOf = function(a, t, i)
{
if (Array.prototype.indexOf) {
return a.indexOf(t, i);
}
i = i || 0;
if (i < 0) i += a.length;
if (i < 0) i = 0;
for (var n = a.length; i < n; i++) {
if (i in a && a[i] === t) return i;
}
return -1;
};
if (typeof module !== 'undefined') module.exports = usr;
/**
* @fileoverview Browser-related helper functions
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
* @version 1.0
* Created 2014-05-08
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
* and <http://pcjs.org/>.
*
* JSMachines is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with JSMachines.
* If not, see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some JSMachines files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* JSMachines Project for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
/*
* According to http://www.w3schools.com/jsref/jsref_obj_global.asp, these are the *global* properties
* and functions of JavaScript-in-the-Browser:
*
* Property Description
* ---
* Infinity A numeric value that represents positive/negative infinity
* NaN "Not-a-Number" value
* undefined Indicates that a variable has not been assigned a value
*
* Function Description
* ---
* decodeURI() Decodes a URI
* decodeURIComponent() Decodes a URI component
* encodeURI() Encodes a URI
* encodeURIComponent() Encodes a URI component
* escape() Deprecated in version 1.5. Use encodeURI() or encodeURIComponent() instead
* eval() Evaluates a string and executes it as if it was script code
* isFinite() Determines whether a value is a finite, legal number
* isNaN() Determines whether a value is an illegal number
* Number() Converts an object's value to a number
* parseFloat() Parses a string and returns a floating point number
* parseInt() Parses a string and returns an integer
* String() Converts an object's value to a string
* unescape() Deprecated in version 1.5. Use decodeURI() or decodeURIComponent() instead
*
* And according to http://www.w3schools.com/jsref/obj_window.asp, these are the properties and functions
* of the *window* object.
*
* Property Description
* ---
* closed Returns a Boolean value indicating whether a window has been closed or not
* defaultStatus Sets or returns the default text in the statusbar of a window
* document Returns the Document object for the window (See Document object)
* frames Returns an array of all the frames (including iframes) in the current window
* history Returns the History object for the window (See History object)
* innerHeight Returns the inner height of a window's content area
* innerWidth Returns the inner width of a window's content area
* length Returns the number of frames (including iframes) in a window
* location Returns the Location object for the window (See Location object)
* name Sets or returns the name of a window
* navigator Returns the Navigator object for the window (See Navigator object)
* opener Returns a reference to the window that created the window
* outerHeight Returns the outer height of a window, including toolbars/scrollbars
* outerWidth Returns the outer width of a window, including toolbars/scrollbars
* pageXOffset Returns the pixels the current document has been scrolled (horizontally) from the upper left corner of the window
* pageYOffset Returns the pixels the current document has been scrolled (vertically) from the upper left corner of the window
* parent Returns the parent window of the current window
* screen Returns the Screen object for the window (See Screen object)
* screenLeft Returns the x coordinate of the window relative to the screen
* screenTop Returns the y coordinate of the window relative to the screen
* screenX Returns the x coordinate of the window relative to the screen
* screenY Returns the y coordinate of the window relative to the screen
* self Returns the current window
* status Sets or returns the text in the statusbar of a window
* top Returns the topmost browser window
*
* Method Description
* ---
* alert() Displays an alert box with a message and an OK button
* atob() Decodes a base-64 encoded string
* blur() Removes focus from the current window
* btoa() Encodes a string in base-64
* clearInterval() Clears a timer set with setInterval()
* clearTimeout() Clears a timer set with setTimeout()
* close() Closes the current window
* confirm() Displays a dialog box with a message and an OK and a Cancel button
* createPopup() Creates a pop-up window
* focus() Sets focus to the current window
* moveBy() Moves a window relative to its current position
* moveTo() Moves a window to the specified position
* open() Opens a new browser window
* print() Prints the content of the current window
* prompt() Displays a dialog box that prompts the visitor for input
* resizeBy() Resizes the window by the specified pixels
* resizeTo() Resizes the window to the specified width and height
* scroll() This method has been replaced by the scrollTo() method.
* scrollBy() Scrolls the content by the specified number of pixels
* scrollTo() Scrolls the content to the specified coordinates
* setInterval() Calls a function or evaluates an expression at specified intervals (in milliseconds)
* setTimeout() Calls a function or evaluates an expression after a specified number of milliseconds
* stop() Stops the window from loading
*/
"use strict";
/* global window: true, setTimeout: false, clearTimeout: false, SITEHOST: false */
if (typeof module !== 'undefined') {
var Component;
require("./defines");
var str = require("./strlib");
var ReportAPI = require("./reportapi");
}
var web = {};
/*
* We must defer loading the Component module until the function(s) requiring it are
* called; otherwise, we create an initialization cycle in which Component requires weblib
* and weblib requires Component.
*
* In an ideal world, weblib would not be dependent on Component, but we really want to use
* its I/O functions. The simplest solution is to create wrapper functions.
*/
/**
* log(s, type)
*
* For diagnostic output only. DEBUG must be true (or "--debug" specified via the command-line)
* for Component.log() to display anything.
*
* @param {string} [s] is the message text
* @param {string} [type] is the message type
*/
web.log = function(s, type)
{
if (typeof module !== 'undefined') {
if (!Component) Component = require("./component");
}
Component.log(s, type);
};
/**
* notice(s, fPrintOnly, id)
*
* If Component.notice() calls web.alertUser(), it will fall back to web.log() if all else fails.
*
* @param {string} s is the message text
* @param {boolean} [fPrintOnly]
* @param {string} [id] is the caller's ID, if any
*/
web.notice = function(s, fPrintOnly, id)
{
if (typeof module !== 'undefined') {
if (!Component) Component = require("./component");
}
Component.notice(s, fPrintOnly, id);
};
/**
* loadResource(sURL, fAsync, data, componentNotify, fnNotify, pNotify)
*
* Request the specified resource (sURL), and once the request is complete,
* optionally call the specified method (fnNotify) of the specified component (componentNotify).
*
* TODO: Figure out how we can strongly type the fnNotify parameter, because the Closure Compiler has issues with:
*
* {function(this:Component, string, (string|null), number, (number|string|null|Object|Array|undefined))} [fnNotify]
*
* @param {string} sURL
* @param {boolean} [fAsync] is true for an asynchronous request
* @param {Object} [data] for a POST request (default is a GET request)
* @param {Component} [componentNotify]
* @param {function(...)} [fnNotify]
* @param {number|string|null|Object|Array} [pNotify] optional fnNotify info parameter
* @return {Array} containing errorCode and responseText (empty array if fAsync is true)
*/
web.loadResource = function(sURL, fAsync, data, componentNotify, fnNotify, pNotify)
{
fAsync = !!fAsync; // ensure that fAsync is a valid boolean (Internet Explorer xmlHTTP functions insist on it)
if (typeof module !== 'undefined') {
/*
* We don't even need to load Component, because we can't use any of the code below
* within Node anyway. Instead, we must hand this request off to our network library.
*
* if (!Component) Component = require("./component");
*/
var net = require("./netlib");
return net.loadResource(sURL, fAsync, data, componentNotify, fnNotify, pNotify);
}
var nErrorCode = 0;
var sURLData = null;
var sURLName = str.getBaseName(sURL);
var xmlHTTP = (window.XMLHttpRequest? new window.XMLHttpRequest() : new window.ActiveXObject("Microsoft.XMLHTTP"));
if (fAsync) {
xmlHTTP.onreadystatechange = function() {
if (xmlHTTP.readyState === 4) {
/*
* The following line was recommended for WebKit, as a work-around to prevent the handler firing multiple
* times when debugging. Unfortunately, that's not the only XMLHttpRequest problem that occurs when
* debugging, so I think the WebKit problem is deeper than that. When we have multiple XMLHttpRequests
* pending, any debugging activity means most of them simply get dropped on floor, so what may actually be
* happening are mis-notifications rather than redundant notifications.
*
* xmlHTTP.onreadystatechange = undefined;
*/
sURLData = xmlHTTP.responseText;
/*
* The normal "success" case is an HTTP status code of 200, but when testing with files loaded
* from the local file system (ie, when using the "file:" protocol), we have to be a bit more "flexible".
*/
if (xmlHTTP.status == 200 || !xmlHTTP.status && sURLData.length && web.getHostProtocol() == "file:") {
if (MAXDEBUG) web.log("xmlHTTP.onreadystatechange(" + sURL + "): returned " + sURLData.length + " bytes");
}
else {
nErrorCode = xmlHTTP.status || -1;
web.log("xmlHTTP.onreadystatechange(" + sURL + "): error code " + nErrorCode);
}
if (fnNotify) {
if (!componentNotify) {
fnNotify(sURLName, sURLData, nErrorCode, pNotify);
} else {
fnNotify.call(componentNotify, sURLName, sURLData, nErrorCode, pNotify);
}
}
}
};
}
if (data) {
var sData = "";
for (var p in data) {
if (!data.hasOwnProperty(p)) continue;
if (sData) sData += "&";
sData += p + '=' + encodeURIComponent(data[p]);
}
sData = sData.replace(/%20/g, '+');
if (MAXDEBUG) web.log("web.loadResource(POST " + sURL + "): " + sData.length + " bytes");
xmlHTTP.open("POST", sURL, fAsync);
xmlHTTP.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlHTTP.send(sData);
} else {
if (MAXDEBUG) web.log("web.loadResource(GET " + sURL + ")");
xmlHTTP.open("GET", sURL, fAsync);
xmlHTTP.send();
}
var response = [];
if (!fAsync) {
sURLData = xmlHTTP.responseText;
if (xmlHTTP.status == 200) {
if (MAXDEBUG) web.log("web.loadResource(" + sURL + "): returned " + sURLData.length + " bytes");
} else {
nErrorCode = xmlHTTP.status || -1;
web.log("web.loadResource(" + sURL + "): error code " + nErrorCode);
}
if (fnNotify) {
if (!componentNotify) {
fnNotify(sURLName, sURLData, nErrorCode, pNotify);
} else {
fnNotify.call(componentNotify, sURLName, sURLData, nErrorCode, pNotify);
}
}
response = [nErrorCode, sURLData];
}
return response;
};
/**
* sendReport(sApp, sVer, sURL, sUser, sType, sReport, sHostName)
*
* Send a report (eg, bug report) to the server.
*
* @param {string} sApp (eg, "PCjs")
* @param {string} sVer (eg, "1.02")
* @param {string} sURL (eg, "/devices/pc/machine/5150/mda/64kb/machine.xml")
* @param {string} sUser (ie, the user key, if any)
* @param {string} sType (eg, "bug"); one of ReportAPI.TYPE.*
* @param {string} sReport (eg, unparsed state data)
* @param {string} [sHostName] (default is http://SITEHOST)
*/
web.sendReport = function(sApp, sVer, sURL, sUser, sType, sReport, sHostName)
{
var data = {};
data[ReportAPI.QUERY.APP] = sApp;
data[ReportAPI.QUERY.VER] = sVer;
data[ReportAPI.QUERY.URL] = sURL;
data[ReportAPI.QUERY.USER] = sUser;
data[ReportAPI.QUERY.TYPE] = sType;
data[ReportAPI.QUERY.DATA] = sReport;
var sReportURL = (sHostName? sHostName : "http://" + SITEHOST) + ReportAPI.ENDPOINT;
web.loadResource(sReportURL, true, data);
};
/**
* getHost()
*
* @return {string}
*/
web.getHost = function()
{
return ("http://" + (window? window.location.host : SITEHOST));
};
/**
* getHostURL()
*
* @return {string|null}
*/
web.getHostURL = function()
{
return (window? window.location.href : null);
};
/**
* getHostProtocol()
*
* @return {string}
*/
web.getHostProtocol = function()
{
return (window? window.location.protocol : "file:");
};
/**
* getUserAgent()
*
* @return {string}
*/
web.getUserAgent = function()
{
return (window? window.navigator.userAgent : "");
};
/**
* alertUser(sMessage)
*
* @param {string} sMessage
*/
web.alertUser = function(sMessage)
{
if (window) window.alert(sMessage); else web.log(sMessage);
};
/**
* confirmUser(sPrompt)
*
* @param {string} sPrompt
* @returns {boolean} true if the user clicked OK, false if Cancel/Close
*/
web.confirmUser = function(sPrompt)
{
var fResponse = false;
if (window) {
fResponse = window.confirm(sPrompt);
}
return fResponse;
};
/**
* promptUser()
*
* @param {string} sPrompt
* @param {string} [sDefault]
* @returns {string|null}
*/
web.promptUser = function(sPrompt, sDefault)
{
var sResponse = null;
if (window) {
sResponse = window.prompt(sPrompt, sDefault === undefined? "" : sDefault);
}
return sResponse;
};
/**
* fLocalStorage
*
* true if localStorage support exists, is enabled, and works; "falsey" otherwise
*
* @type {boolean|null}
*/
web.fLocalStorage = null;
/**
* TODO: Is there any way to get the Closure Compiler to stop inlining this string? This
* isn't cutting it.
*
* @const {string}
*/
web.sLocalStorageTest = "PCjs.localStorage";
/**
* hasLocalStorage
*
* true if localStorage support exists, is enabled, and works; false otherwise
*
* @return {boolean}
*/
web.hasLocalStorage = function() {
if (web.fLocalStorage == null) {
var f = false;
if (window) {
try {
window.localStorage.setItem(web.sLocalStorageTest, web.sLocalStorageTest);
f = (window.localStorage.getItem(web.sLocalStorageTest) == web.sLocalStorageTest);
window.localStorage.removeItem(web.sLocalStorageTest);
} catch(e) {
web.logLocalStorageError(e);
f = false;
}
}
web.fLocalStorage = f;
}
return web.fLocalStorage;
};
/**
* logLocalStorageError(e)
*
* @param {Error} e is an exception
*/
web.logLocalStorageError = function(e)
{
web.log(e.message, "localStorage error");
};
/**
* getLocalStorageItem(sKey)
*
* Returns the requested key value, or null if the key does not exist, or undefined if localStorage is not available
*
* @param {string} sKey
* @return {string|null|undefined} sValue
*/
web.getLocalStorageItem = function(sKey)
{
var sValue;
if (window) {
try {
sValue = window.localStorage.getItem(sKey);
} catch(e) {
web.logLocalStorageError(e);
}
}
return sValue;
};
/**
* setLocalStorageItem(sKey, sValue)
*
* @param {string} sKey
* @param {string} sValue
* @return {boolean} true if localStorage is available, false if not
*/
web.setLocalStorageItem = function(sKey, sValue)
{
try {
window.localStorage.setItem(sKey, sValue);
return true;
} catch(e) {
web.logLocalStorageError(e);
}
return false;
};
/**
* removeLocalStorageItem(sKey)
*
* @param {string} sKey
*/
web.removeLocalStorageItem = function(sKey)
{
try {
window.localStorage.removeItem(sKey);
} catch(e) {
web.logLocalStorageError(e);
}
};
/**
* getLocalStorageKeys()
*
* @return {Array}
*/
web.getLocalStorageKeys = function()
{
var a = [];
try {
for (var i = 0, c = window.localStorage.length; i < c; i++) {
a.push(window.localStorage.key(i));
}
} catch(e) {
web.logLocalStorageError(e);
}
return a;
};
/**
* reloadPage()
*/
web.reloadPage = function()
{
if (window) window.location.reload();
};
/**
* isUserAgent(s)
*
* Check the browser's user-agent string for the given substring; "iOS" and "MSIE" are special values you can
* use that will match any iOS or MSIE browser, respectively (even IE11, in the case of "MSIE").
*
* 2013-11-06: In a questionable move, MSFT changed the user-agent reported by IE11 on Windows 8.1, eliminating
* the "MSIE" string (which MSDN calls a "version token"; see http://msdn.microsoft.com/library/ms537503.aspx);
* they say "public websites should rely on feature detection, rather than browser detection, in order to design
* their sites for browsers that don't support the features used by the website." So, in IE11, we get a user-agent
* that tries to fool apps into thinking the browser is more like WebKit or Gecko:
*
* Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko
*
* That's a nice idea, but in the meantime, they hosed the XSL transform code in embed.js, which contained
* some very critical browser-specific code; turning on IE's "Compatibility Mode" didn't help either, because
* that's a sledgehammer solution which restores the old user-agent string but also disables other features like
* HTML5 canvas support. As an interim solution, I'm treating any "MSIE" check as a check for either "MSIE" or
* "Trident".
*
* UPDATE: I've since found ways to make the code in embed.js more browser-agnostic, so for now, there's isn't
* any code that cares about "MSIE", but I've left the change in place, because I wouldn't be surprised if I'll
* need more IE-specific code in the future, perhaps for things like copy/paste functionality, or mouse capture.
*
* @param {string} s is a substring to search for in the user-agent; as noted above, "iOS" and "MSIE" are special values
* @return {boolean} is true if the string was found, false if not
*/
web.isUserAgent = function(s)
{
if (window) {
var userAgent = web.getUserAgent();
/*
* Here's one case where we have to be careful with Component, because when isUserAgent() is called by
* the init code below, component.js hasn't been loaded yet. The simple solution for now is to remove the call.
*
* web.log("agent: " + userAgent);
*
* And yes, it would be pointless to use the conditional (?) operator below, if not for the Google Closure
* Compiler (v20130823) failing to detect the entire expression as a boolean.
*/
return (s == "iOS" && userAgent.match(/(iPod|iPhone|iPad)/) && userAgent.match(/AppleWebKit/) || s == "MSIE" && userAgent.match(/(MSIE|Trident)/) || (userAgent.indexOf(s) >= 0))? true : false;
}
return false;
};
/**
* isMobile()
*
* Check the browser's user-agent string for the substring "Mobi", as per Mozilla recommendation:
*
* https://developer.mozilla.org/en-US/docs/Browser_detection_using_the_user_agent
*
* @return {boolean} is true if the browser appears to be a mobile (ie, non-desktop) web browser, false if not
*/
web.isMobile = function()
{
return web.isUserAgent("Mobi");
};
/**
* getURLParameters(sParms)
*
* @param {string} [sParms] containing the parameter portion of a URL (ie, after the '?')
* @return {Object} containing properties for each parameter found
*/
web.getURLParameters = function(sParms)
{
var aParms = {};
if (window) { // an alternative to "if (typeof module === 'undefined')" if require("defines") has been invoked
if (!sParms) {
/*
* Note that window.location.href returns the entire URL, whereas window.location.search
* returns only the parameters, if any (starting with the '?', which we skip over with a substr() call).
*/
sParms = window.location.search.substr(1);
}
var match;
var pl = /\+/g; // RegExp for replacing addition symbol with a space
var search = /([^&=]+)=?([^&]*)/g;
var decode = function(s) { return decodeURIComponent(s.replace(pl, " ")); };
while ((match = search.exec(sParms))) {
aParms[decode(match[1])] = decode(match[2]);
}
}
return aParms;
};
/**
* onCountRepeat(n, fn, fnComplete, msDelay)
*
* Call fn() n times with an msDelay millisecond delay between calls, then
* call fnComplete() when the count has been exhausted OR fn() returns false.
*
* @param {number} n
* @param {function()} fn
* @param {function()} fnComplete
* @param {number} [msDelay]
*/
web.onCountRepeat = function(n, fn, fnComplete, msDelay)
{
var fnRepeat = function doCountRepeat() {
n -= 1;
if (n >= 0) {
if (!fn()) n = 0;
}
if (n > 0) {
setTimeout(fnRepeat, msDelay || 0);
return;
}
fnComplete();
};
fnRepeat();
};
/**
* onClickRepeat(e, msDelay, msRepeat, fn)
*
* Repeatedly call fn() with an initial msDelay, and an msRepeat delay thereafter,
* as long as HTML control Object e has an active "down" event and fn() returns true.
*
* @param {Object} e
* @param {number} msDelay
* @param {number} msRepeat
* @param {function(boolean)} fn is passed false on the first call, true on all repeated calls
*/
web.onClickRepeat = function(e, msDelay, msRepeat, fn)
{
var ms = 0, timer = null, fIgnoreMouseEvents = false;
var fnRepeat = function doClickRepeat() {
if (fn(ms === msRepeat)) {
timer = setTimeout(fnRepeat, ms);
ms = msRepeat;
}
};
e.onmousedown = function() {
// web.log("onMouseDown()");
if (!fIgnoreMouseEvents) {
if (!timer) {
ms = msDelay;
fnRepeat();
}
}
};
e.ontouchstart = function() {
// web.log("onTouchStart()");
if (!timer) {
ms = msDelay;
fnRepeat();
}
};
e.onmouseup = e.onmouseout = function() {
// web.log("onMouseUp()/onMouseOut()");
if (timer) {
clearTimeout(timer);
timer = null;
}
};
e.ontouchend = e.ontouchcancel = function() {
// web.log("onTouchEnd()/onTouchCancel()");
if (timer) {
clearTimeout(timer);
timer = null;
}
/*
* Devices that generate ontouch* events ALSO generate onmouse* events,
* and generally do so immediately after all the touch events are complete,
* so unless we want double the action, we need to ignore mouse events.
*/
fIgnoreMouseEvents = true;
};
};
web.aPageEventHandlers = {
'init': [], // list of window 'onload' handlers
'show': [], // list of window 'onpageshow' handlers
'exit': [] // list of window 'onunload' handlers (although we prefer to use 'onbeforeunload' if possible)
};
web.fPageReady = false; // set once the browser's first page initialization has occurred
web.fPageEventsEnabled = true;
/**
* onPageEvent(sName, fn)
*
* @param {string} sFunc
* @param {function()} fn
*
* Use this instead of setting window['onunload'], window['onunload'], etc.
* Allows multiple JavaScript modules to define a handler for the same event.
*
* Moreover, it's risky to refer to obscure event handlers with "dot" names, because
* the Closure Compiler may erroneously replace them (eg, window.onpageshow is a good example).
*/
web.onPageEvent = function(sFunc, fn)
{
if (window) {
var fnPrev = window[sFunc];
if (typeof fnPrev !== 'function') {
window[sFunc] = fn;
} else {
/*
* TODO: Determine whether there's any value in receiving/sending the Event object that the
* browser provides when it generates the original event.
*/
window[sFunc] = function onWindowEvent() {
if (fnPrev) fnPrev();
fn();
};
}
}
};
/**
* onInit(fn)
*
* @param {function()} fn
*
* Use this instead of setting window.onload. Allows multiple JavaScript modules to define their own 'onload' event handler.
*/
web.onInit = function(fn)
{
web.aPageEventHandlers['init'].push(fn);
};
/**
* onShow(fn)
*
* @param {function()} fn
*
* Use this instead of setting window.onpageshow. Allows multiple JavaScript modules to define their own 'onpageshow' event handler.
*/
web.onShow = function(fn)
{
web.aPageEventHandlers['show'].push(fn);
};
/**
* onExit(fn)
*
* @param {function()} fn
*
* Use this instead of setting window.onunload. Allows multiple JavaScript modules to define their own 'onunload' event handler.
*/
web.onExit = function(fn)
{
web.aPageEventHandlers['exit'].push(fn);
};
/**
* doPageEvent(afn)
*
* @param {Array.<function()>} afn
*/
web.doPageEvent = function(afn)
{
if (web.fPageEventsEnabled) {
try {
for (var i = 0; i < afn.length; i++) {
afn[i]();
}
} catch(e) {
web.notice("An unexpected exception occurred:\n\n" + e.message + "\n\nPlease send this information to support@pcjs.org. Thanks.");
}
}
};
/**
* enablePageEvents(fEnable)
*
* @param {boolean} fEnable is true to enable page events, false to disable (they're enabled by default)
*/
web.enablePageEvents = function(fEnable)
{
if (!web.fPageEventsEnabled && fEnable) {
web.fPageEventsEnabled = true;
if (web.fPageReady) web.sendPageEvent('init');
return;
}
web.fPageEventsEnabled = fEnable;
};
/**
* sendPageEvent(sEvent)
*
* This allows us to manually trigger page events.
*
* @param {string} sEvent (one of 'init', 'show' or 'exit')
*/
web.sendPageEvent = function(sEvent)
{
if (web.aPageEventHandlers[sEvent]) {
web.doPageEvent(web.aPageEventHandlers[sEvent]);
}
};
web.onPageEvent('onload', function onPageLoad() { web.fPageReady = true; web.doPageEvent(web.aPageEventHandlers['init']); });
web.onPageEvent('onpageshow', function onPageShow() { web.doPageEvent(web.aPageEventHandlers['show']); });
web.onPageEvent(web.isUserAgent("Opera") || web.isUserAgent("iOS")? 'onunload' : 'onbeforeunload', function onPageUnload() { web.doPageEvent(web.aPageEventHandlers['exit']); });
if (typeof module !== 'undefined') module.exports = web;
adsense.html
Shared Templates
===
Template folders contain a variety of XML and HTML templates and supporting files, including:
- DTD files (Document Type Definitions)
- XSD files (XML schemas -- eventually)
- XSL files (XML stylesheets)
- CSS files (stylesheets that the XSL files rely upon)
- HTML files (HTML fragments used to generate part or all of a web page)
[*common.html*](common.html) is the HTML template file used by the [HTMLOut](/modules/htmlout/) module
to generate a default HTML file ("index.html") for any folder that only has a "README.md", or a "machine.xml",
or none of the above.
[*common.xsl*](common.xsl) is a collection of XSL templates used by *machine.xsl* (and deprecated *outline.xsl*)
files.
[*machine.xsl*](machine.xsl) is an XML stylesheet that takes things a step further and transforms a machine XML
into a stand-alone HTML document, which also includes all necessary compiled scripts (eg, c1p.js, c1p-dbg.js,
pc.js or pc-dbg.js). Most machine XML files explicitly link to this stylesheet, so that simply loading the XML
file in your web browser creates a working virtual machine.
[*manifest.xsl*](manifest.xsl) is an XML stylesheet that renders a software manifest XML file into a standalone
document; it may even contain a reference to a machine XML file.
[*document.xsl*](document.xsl) is a collection of XSL templates used exclusively by [*outline.xsl*](outline.xsl),
which is a more grandiose version of [*machine.xsl*](machine.xsl), designed to support XML-based documentation
that could also contain embedded machine XML files. However, I've since moved away from that approach, in favor
of simple README.md files that are more flexible and work nicely with GitHub. Also, by rendering them with our own
minimalistic Markdown converter, [MarkOut](/modules/markout/), it's also very easy to embed virtual machines
in a README.md document.
Since the XML document syntax that [*outline.xsl*](outline.xsl) supports was never very well documented, I'm tempted
to deprecate it and port any XML documents that still rely on it (mostly the older IAS Electronic Computer Project
documents) to Markdown files.
@CHARSET "UTF-8";
/**
@author Jeff Parsons (@jeffpar)
@website http://www.pcjs.org/
@created 2013-05-05
@modified 2014-02-23
@license http://www.gnu.org/licenses/gpl.html
*/
body {
margin: 0;
background: #202020;
}
h1, h2 {
margin-top: 0;
color: #cccccc;
}
h1, h2, h3, h4 {
word-wrap: break-word;
}
/*
h3 ~ *:not(h3) {
margin-left: 40px;
}
*/
h4 a {
color: #cccccc !important;
}
p {
line-height: 1.5em;
}
img {
max-width: 100%;
}
a img {
vertical-align: bottom;
}
pre, code {
color: #000000;
background-color: #cccccc;
font-family: Monaco, Consolas, "Lucida Console", monospace;
font-size: 12px;
}
pre {
margin: 1em 2em;
padding: 1em;
border-radius: 5px;
overflow: auto;
}
code {
padding: 1px;
}
pre a, code a {
color: #006400 !important;
}
.common {
width: 100%;
margin: 0 auto;
color: #cccccc;
}
.common a {
/*color: #80bd01;*/
color: #7fc07f;
text-decoration: none;
}
.common hr {
border-color: #808080;
}
.common a:hover {
text-decoration: underline;
}
.common, .machine {
font-family: "Helvetica Neue", Helvetica, Arial, Geneva, sans-serif;
font-size: 15px;
}
.machine {
margin: 15px;
overflow: hidden;
}
.c1pjs {
overflow: visible;
}
.machine-placeholder {
text-align: center;
font-weight: bold;
}
.common-top {
background: #202020;
font-size: small;
}
.common-top-left {
float: left;
width: 60%;
}
.common-top-left ul {
line-height: 1.5em;
list-style-type: none;
margin: 0;
padding: 1em 1em 1em 9px;
overflow: hidden;
}
.common-top-left ul li {
display: block;
float: left;
}
.common-top-left ul li a {
border-right: 1px solid #6f6f6f;
padding: 2px 6px 2px 6px;
}
.common-top-left ul li:last-child a {
border-right: none;
}
.common-top-right {
float: right;
width: 40%;
}
.common-top-right p {
float: right;
margin: 0;
padding: 1em;
}
.common-middle {
clear: both;
padding: 1px 1em 1px 1em;
background: #404040;
}
.common-sidebar {
float: left;
font-size: small;
width: 140px; /* should be <= margin-left of common-main */
padding-bottom: 20px;
overflow: hidden;
white-space: nowrap;
word-wrap: break-word;
}
.common-list {
list-style-type: none;
margin-top: 0;
margin-bottom: 0;
padding-left: 0;
}
.common-list li {
/*font-variant: small-caps;*/
padding-bottom: 7px;
}
.common-list-data {
list-style-type: none;
margin-top: 0;
margin-bottom: 0;
padding-left: 0;
}
.common-list-data li {
line-height: 1.5em;
}
.common-list-data-items, .common-list-data-subitems {
font-size: x-small;
list-style-type: none;
margin-top: 0;
margin-bottom: 0;
padding-left: 2em;
}
.common-list-data-items li, .common-list-data-subitems li {
padding-bottom: 0;
}
.common-main {
margin-left: 150px;
/* padding-left: 1em;
padding-bottom: 1em;
padding-right: 1em; */
}
.common-image-gallery {
margin: 0 auto;
text-align: center;
}
.common-image-gallery:after {
content: '';
display: block;
}
.common-image-frame {
display: inline-block;
margin: 8px;
text-align: center;
}
.common-image-link {
padding: 5px;
border: 1px solid black;
border-radius: 5px;
background-color: #FAEBD7;
}
.common-image-label {
font-size: x-small;
}
.common-bottom {
clear: both;
padding-top: 1em;
}
.common-bottom:after {
content: '';
display: block;
clear: both;
}
.common-reference {
float: left;
font-size: x-small;
}
.common-reference a {
text-decoration: none;
}
.common-copyright {
float: right;
font-size: x-small;
}
.common-copyright a {
text-decoration: none;
}
.md-list {
}
.md-list li {
line-height: 1.5em;
margin-bottom: 1em;
}
.md-list li p {
padding-left: 2em;
}
.md-list-compact {
}
.md-list-compact li {
margin-bottom: 0;
}
.md-list-none {
list-style-type: none;
padding-left: 2em;
}
.md-list-none li {
margin-bottom: 0;
}
@media screen and (max-width: 900px) {
/*
h3 ~ *:not(h3) {
margin-left: 0;
}
*/
.common-sidebar {
width: 100%;
white-space: normal;
}
.common-list {
padding-left: 0;
}
.common-list-data {
padding-left: 0;
}
.common-sidebar h4, .common-list li, .common-list-data li, .common-list-data-items li {
width: 130px;
float: left;
overflow: hidden;
vertical-align: top;
padding-right: 1em;
margin-top: 0;
}
.common-list-data-subitems {
display: none;
}
.common-main {
clear: both;
margin-left: 0;
padding-left: 0;
padding-right: 0;
}
.md-list-none {
padding-left: 1em;
}
}
<!DOCTYPE html>
<!-- Some browsers tend to display a white page before displaying one of our dark pages, which causes annoying "flashes";
setting a background color as early as possible seems to help -->
<html style="background-color: #1d1d1d">
<head>
<title>pcjs.org | <!-- pcjs:title("The Original IBM PC In Your Web Browser") --></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<!-- We could set content="width=device-width, initial-scale=1", but that apparently causes problems
when rotating to landscape mode; by setting only "initial-scale", the width is apparently inferred -->
<meta name="viewport" content="initial-scale=1">
<link rel="shortcut icon" type="image/x-icon" href="/versions/images/current/favicon.ico">
<link rel="stylesheet" type="text/css" href="/modules/shared/templates/common.css">
<!-- pcjs:sockets -->
</head>
<body>
<!-- Template revision 0038 (increment this number prior to any Git push that should trigger a rebuild of all web pages) -->
<div class="common">
<div class="common-top">
<div class="common-top-left">
<ul>
<li><a href="/">Home</a></li>
<li><a href="/apps/pc/">Apps</a></li>
<li><a href="/disks/pc/">Disks</a></li>
<li><a href="/devices/pc/machine/">Machines</a></li>
<li><a href="/docs/">Docs</a></li>
<li><a href="/pubs/">Pubs</a></li>
<li><a href="/blog/">Blog</a></li>
<li><a href="/docs/about/">About</a></li>
</ul>
</div>
<div class="common-top-right">
<p>Powered by <a href="http://nodejs.org" target="_blank">Node.js</a> and <a href="http://aws.amazon.com/about-aws/whats-new/2013/03/11/announcing-aws-elastic-beanstalk-for-node-js/" target="_blank">AWS</a></p>
</div>
</div>
<div class="common-middle">
<h4>Directory of C:\<a href="/">PCJS.ORG</a><!-- pcjs:pcpath --></h4>
<div class="common-sidebar">
<!-- pcjs:dirlist -->
<!-- pcjs:manifest -->
<!-- pcjs:htmlfileLater("adsense.html") -->
</div>
<div class="common-main">
<!-- pcjs:default("*", "common-image") -->
<div class="common-bottom">
<p class="common-reference"><!-- Bottom-left-hand stuff, if there was any, would go here --></p>
<p class="common-copyright">
<!-- When using AWS, the pcjs.org domain must redirect to www.pcjs.org, so let's avoid unnecessary redirects in any absolute URLs -->
<span class="common-copyright"><a href="http://www.pcjs.org/">pcjs.org</a> website © 2012-<!-- pcjs:year --> by <a href="http://twitter.com/jeffpar">@jeffpar</a></span><br/>
<span class="common-copyright">PCjs and C1Pjs released under <a href="http://gnu.org/licenses/gpl.html">GPL version 3 or later</a></span>
</p>
</div>
</div>
</div>
</div>
<script id="randomize" type="text/javascript">
(function() {
var p = document.getElementById('random');
if (p) {
var mags = ['BYTE-1975-11:98', 'MSJ-1986-10:34', 'MSJ-1987-05:90', 'PCTJ-1987-01:216', 'PCTJ-1987-02:222', 'PCTJ-1987-03:214', 'PCTJ-1987-04:218', 'PCTJ-1987-05:238', 'PCTJ-1987-06:236', 'PCTJ-1987-07:230', 'PCTJ-1987-08:250', 'PCTJ-1987-09:252', 'PCTJ-1987-10:231', 'PCTJ-1987-11:261', 'PCTJ-1987-12:242'];
var p2 = document.createElement('p');
p2.appendChild(document.createTextNode('In addition, you see a piece of paper lying on the floor.'));
var div1 = document.createElement('div'); div1.setAttribute('class', 'common-image-gallery');
var div2 = document.createElement('div'); div2.setAttribute('class', 'common-image-frame'); div1.appendChild(div2);
var div3 = document.createElement('div'); div3.setAttribute('class', 'common-image-link'); div2.appendChild(div3);
var mag = mags[Math.floor(Math.random() * mags.length)];
var parts = mag.split(':'), issue = parts[0], page = Math.floor(Math.random() * parseInt(parts[1])) + 1;
parts = mag.split('-');
var name = parts[0].toLowerCase();
var a = document.createElement('a'); a.setAttribute('href', '/pubs/pc/magazines/' + name + '/' + issue + '/#page-' + page); div3.appendChild(a);
var img = document.createElement('img'); img.setAttribute('src', 'http://static.pcjs.org/pubs/pc/magazines/' + name + '/' + issue + '/thumbs/' + issue + ' ' + page + '.jpeg'); img.setAttribute('width', '200'); a.appendChild(img);
p.parentNode.insertBefore(p2, p.nextSibling);
p2.parentNode.insertBefore(div1, p2.nextSibling)
}
})();
</script>
<!-- pcjs:htmlfile("analytics.html") -->
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?> <!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2012-05-05" modified="2014-02-23" license="http://www.gnu.org/licenses/gpl.html" --> <!DOCTYPE xsl:stylesheet [ <!-- XSLT understands these entities only: lt, gt, apos, quot, and amp. Other required entities may be defined below (see entities.dtd). --> <!ENTITY nbsp " "> <!ENTITY ne "≠"> <!ENTITY le "≤"> <!ENTITY ge "≥"> <!ENTITY times "×"> <!ENTITY sdot "⋅"> <!ENTITY divide "÷"> <!ENTITY copy "©"> <!ENTITY Sigma "Σ"> <!ENTITY sigma "σ"> <!ENTITY sum "∑"> <!ENTITY lbrace "{"> ]> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template name="commonStyles"> <meta charset="utf-8"/> <link rel="shortcut icon" href="/versions/images/current/favicon.ico" type="image/x-icon"/> <link rel="stylesheet" type="text/css" href="/modules/shared/templates/common.css"/> <!-- script type="text/javascript" src="/versions/jquery/1.7.2/jquery.min.js" --> </xsl:template> <xsl:template name="commonTop"> <div class="common-top"> <div class="common-top-left"> <ul> <li><a href="/">Home</a></li> <li><a href="/apps/pc/">Apps</a></li> <li><a href="/disks/pc/">Disks</a></li> <li><a href="/devices/pc/machine/">Machines</a></li> <li><a href="/docs/">Docs</a></li> <li><a href="/pubs/">Pubs</a></li> <li><a href="/blog/">Blog</a></li> <li><a href="/docs/about/">About</a></li> </ul> </div> <div class="common-top-right"> <p>Powered by <a href="http://nodejs.org" target="_blank">Node.js</a> and <a href="http://aws.amazon.com/about-aws/whats-new/2013/03/11/announcing-aws-elastic-beanstalk-for-node-js/" target="_blank">AWS</a></p> </div> </div> </xsl:template> <xsl:template name="commonBottom"> <div class="common-bottom"> <p class="common-reference"></p> <p class="common-copyright"> <span class="common-copyright"><a href="http://www.pcjs.org/">pcjs.org</a> website © 2012-2015 by <a href="http://twitter.com/jeffpar">@jeffpar</a></span><br/> <span class="common-copyright">PCjs and C1Pjs released under <a href="http://gnu.org/licenses/gpl.html">GPL version 3 or later</a></span> </p> </div> </xsl:template> </xsl:stylesheet>
addend chassis augend triodes addends rectifiers kirchoff triode ohms shiftable sensitising selectron pentode timeline seriatim operability performable deselected uncompiled repower onbeforeunload onunload onload onpageshow diskette masochistic
@CHARSET "UTF-8";
/* @author Jeff Parsons (@jeffpar)
@website http://www.pcjs.org/
@created 2013-05-05
@modified 2014-02-23
@license http://www.gnu.org/licenses/gpl.html
*/
.page {
margin: 2% 2%;
padding: 2% 2%;
min-width: 30em;
overflow: auto;
font-size: large;
font-family: Helvetica, Arial, sans-serif;
background: #303030;
color: #ccc;
/* background-color: #63b6fc; */
}
.page-header {
}
.page-header-title {
text-align: center;
/*text-transform: uppercase;*/
}
.page a {
color: #7fc07f;
text-decoration: none;
}
a.footlink, a.paralink {
text-decoration: none;
}
a.footlink:link, a.paralink:link {
color: blue;
}
a.footlink:visited, a.paralink:visited {
color: blue;
}
.galleryitem {
float: left;
width: 200px;
}
.item {
float: left;
width: 2em;
text-indent: 1em;
}
.list {
margin-left: 3em;
text-indent: 0;
text-align: justify;
}
ul {
list-style: none;
}
div.pnumber {
float: left;
width: 2em;
text-indent: 1em;
}
div.pitem {
margin-left: 10em;
}
p.indent, .justified p {
text-indent: 2em;
text-align: justify;
line-height: 1.5em;
}
p.noindent {
text-indent: 0;
text-align: justify;
}
p.center, .center {
text-align: center;
}
li.para {
margin-top: 1em;
margin-bottom: 1em;
}
.left {
text-align: left;
}
.right {
text-align: right;
}
blockquote.tag {
font-size: small;
font-family: Monaco, Fixed, monospace;
margin-top: 0;
margin-bottom: 0;
}
.blockquote {
padding-left: 1em;
text-indent: 0;
text-align: justify;
}
.italics {
font-style: italic;
}
.medium {
font-size: medium;
}
.small {
font-size: x-small;
}
.smallcaps {
font-variant: small-caps;
}
.strike {
text-decoration: line-through;
}
.summation, .bracelist {
display: inline-block;
position: relative;
vertical-align: middle;
text-align: center;
margin-bottom: 0.5ex;
text-indent: 0;
}
.bracelist-symbol {
font-size: 3em;
vertical-align: -40%;
}
.summation .summation-lower, .summation .summation-upper, .bracelist-item {
display: block;
font-size: 75%;
text-align: center;
}
.summation .summation-upper {
margin-bottom: 0;
margin-left: 0.8ex;
font-style: italic;
}
.summation .summation-lower{
margin-bottom: -0.6ex;
font-style: italic;
}
.summation .summation-symbol {
font-size: 2em;
}
p sup {
vertical-align: baseline;
position: relative;
bottom: .5em;
font-size: small;
}
p sub {
vertical-align: baseline;
position: relative;
bottom: -.5em;
font-size: small;
}
.footnote {
font-size: medium;
text-indent: 1em;
text-align: justify;
margin-top: .5em;
}
.image-right {
float: right;
margin-left: 1em;
margin-top: 1em;
margin-bottom: 1em;
}
.image-caption {
font-size: small;
text-align: center;
}<?xml version="1.0" encoding="UTF-8"?>
<!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2012-05-05" modified="2014-02-23" license="http://www.gnu.org/licenses/gpl.html" -->
<!DOCTYPE xsl:stylesheet [
<!-- XSLT understands these entities only: lt, gt, apos, quot, and amp. Other required entities may be defined below (see entities.dtd). -->
<!ENTITY nbsp " "> <!ENTITY ne "≠"> <!ENTITY le "≤"> <!ENTITY ge "≥">
<!ENTITY times "×"> <!ENTITY sdot "⋅"> <!ENTITY divide "÷">
<!ENTITY copy "©"> <!ENTITY Sigma "Σ"> <!ENTITY sigma "σ"> <!ENTITY sum "∑"> <!ENTITY lbrace "{">
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template name="documentStyles">
<link rel="stylesheet" type="text/css" href="document.css"/>
</xsl:template>
<xsl:template match="title">
<h1><xsl:apply-templates/></h1>
</xsl:template>
<xsl:template name="p">
<xsl:if test="@id">
<a name="{@id}"></a>
</xsl:if>
<xsl:choose>
<xsl:when test="not(@class)">
<p><xsl:apply-templates/></p>
</xsl:when>
<xsl:otherwise>
<p class="{@class}"><xsl:apply-templates/></p>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="p">
<xsl:call-template name="p"/>
</xsl:template>
<xsl:template match="br">
<br/>
</xsl:template>
<xsl:template match="p[@number]">
<div class="pnumber">
<xsl:choose>
<xsl:when test="not(@number) or @number = ''"> </xsl:when>
<xsl:otherwise><xsl:value-of select="@number"/></xsl:otherwise>
</xsl:choose>
</div>
<div class="pitem">
<xsl:call-template name="p"/>
</div>
</xsl:template>
<xsl:template match="span">
<xsl:choose>
<xsl:when test="not(@class)">
<span><xsl:apply-templates/></span>
</xsl:when>
<xsl:when test="@class = 'italics'">
<em><xsl:apply-templates/></em>
</xsl:when>
<xsl:otherwise>
<span class="{@class}"><xsl:apply-templates/></span>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="h2">
<h2><xsl:apply-templates/></h2>
</xsl:template>
<xsl:template match="h3">
<h3><xsl:apply-templates/></h3>
</xsl:template>
<xsl:template match="h4">
<h4><xsl:apply-templates/></h4>
</xsl:template>
<xsl:template match="h5">
<h5><xsl:apply-templates/></h5>
</xsl:template>
<xsl:template match="h6">
<h6><xsl:apply-templates/></h6>
</xsl:template>
<xsl:template match="em">
<em><xsl:apply-templates/></em>
</xsl:template>
<xsl:template match="strong">
<strong><xsl:apply-templates/></strong>
</xsl:template>
<xsl:template match="a">
<a href="{@href}" target="{@target}"><xsl:apply-templates/></a>
</xsl:template>
<xsl:template match="ol">
<blockquote><ol><xsl:apply-templates/></ol></blockquote>
</xsl:template>
<xsl:template match="ul">
<blockquote><ul><xsl:apply-templates/></ul></blockquote>
</xsl:template>
<xsl:template match="li">
<li><xsl:apply-templates/></li>
</xsl:template>
<xsl:template match="img">
<div><img src="{@src}" alt="image"/></div>
</xsl:template>
<xsl:template match="pre">
<pre><xsl:apply-templates/></pre>
</xsl:template>
<xsl:template match="figure">
<xsl:choose>
<xsl:when test="@pos">
<div class="{@pos}"><img src="{@ref}" alt="{.}"/><br/><xsl:value-of select="."/></div>
</xsl:when>
<xsl:otherwise>
<div><img src="{@ref}" alt="{.}"/><br/><xsl:value-of select="."/></div>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="sub">
<sub><xsl:apply-templates/></sub>
</xsl:template>
<xsl:template match="sup">
<sup><xsl:apply-templates/></sup>
</xsl:template>
<xsl:template match="lt"><</xsl:template>
<xsl:template match="gt">></xsl:template>
<xsl:template match="ne">≠</xsl:template>
<xsl:template match="le">≤</xsl:template>
<xsl:template match="ge">≥</xsl:template>
<xsl:template match="times">×</xsl:template>
<xsl:template match="dot">⋅</xsl:template>
<xsl:template match="divide">÷</xsl:template>
<xsl:template match="sigma">σ</xsl:template>
<xsl:template match="summation">
<!-- Refer to: http://www.periodni.com/mathematical_and_chemical_equations_on_web.html -->
<span class="summation">
<span class="summation-upper"><xsl:value-of select="@upper"/></span>
<span class="summation-symbol">∑</span>
<span class="summation-lower"><xsl:value-of select="@lower"/></span>
</span>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="bracelist">
<span class="bracelist-symbol">{</span>
<span class="bracelist">
<xsl:for-each select="item">
<span class="bracelist-item"><xsl:apply-templates/></span>
</xsl:for-each>
</span>
</xsl:template>
<xsl:template match="footlink">
<xsl:variable name="docID" select="/document/@id"/>
<a class="footlink" id="fn{$docID}_ref{@n}" href="#fn{$docID}_{@n}"><sup><xsl:if test="@quoted"><xsl:text>[</xsl:text></xsl:if><xsl:value-of select="@n"/><xsl:if test="@quoted"><xsl:text>]</xsl:text></xsl:if></sup></a>
</xsl:template>
<xsl:template match="footnote">
<xsl:variable name="docID" select="/document/@id"/>
<div class="footnote"><a id="fn{$docID}_{@n}" href="#fn{$docID}_ref{@n}"><sup><xsl:value-of select="@n"/></sup></a><xsl:text> </xsl:text>
<xsl:apply-templates/>
</div>
</xsl:template>
<xsl:template name="authors">
<xsl:for-each select="author"><xsl:if test="position() != 1"><xsl:text>, </xsl:text></xsl:if><xsl:if test="position() != 1 and position() = last()"><xsl:text>and </xsl:text></xsl:if><xsl:value-of select="."/></xsl:for-each>
</xsl:template>
<xsl:template name="formatDate">
<xsl:param name="date"/>
<xsl:param name="format">MDY</xsl:param>
<!-- date format: YYYY-MM-DD (MM and/or DD can be 00 if unknown) -->
<xsl:variable name="year">
<xsl:value-of select="substring-before($date,'-')"/>
</xsl:variable>
<xsl:variable name="mon-day">
<xsl:value-of select="substring-after($date,'-')"/>
</xsl:variable>
<xsl:variable name="mon">
<xsl:value-of select="substring-before($mon-day,'-')"/>
</xsl:variable>
<xsl:variable name="full-day">
<xsl:value-of select="substring-after($mon-day,'-')"/>
</xsl:variable>
<xsl:variable name="day">
<xsl:choose>
<xsl:when test="substring($full-day,1,1) = '0'"><xsl:value-of select="substring($full-day,2)"/></xsl:when>
<xsl:otherwise><xsl:value-of select="$full-day"/></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:choose>
<xsl:when test="$mon = '01'">January </xsl:when>
<xsl:when test="$mon = '02'">February </xsl:when>
<xsl:when test="$mon = '03'">March </xsl:when>
<xsl:when test="$mon = '04'">April </xsl:when>
<xsl:when test="$mon = '05'">May </xsl:when>
<xsl:when test="$mon = '06'">June </xsl:when>
<xsl:when test="$mon = '07'">July </xsl:when>
<xsl:when test="$mon = '08'">August </xsl:when>
<xsl:when test="$mon = '09'">September </xsl:when>
<xsl:when test="$mon = '10'">October </xsl:when>
<xsl:when test="$mon = '11'">November </xsl:when>
<xsl:when test="$mon = '12'">December </xsl:when>
<xsl:when test="$mon = '00'"/><!-- do nothing -->
</xsl:choose>
<xsl:if test="$day != '0' and $format = 'MDY'">
<xsl:value-of select="$day"/><xsl:text>, </xsl:text>
</xsl:if>
<xsl:value-of select="$year"/>
</xsl:template>
<xsl:template match="gallery">
<h2><xsl:value-of select="description"/></h2>
<div class="gallery">
<xsl:apply-templates select="item" mode="gallery"/>
</div>
<div style="clear:both;"></div>
</xsl:template>
<xsl:template match="item" mode="gallery">
<div class="galleryitem">
<a href="{@ref}"><img src="/versions/images/current/pdf-192.jpg" alt="{.}"/></a><br/>
<div style="font-size:small; text-align:center;"><xsl:value-of select="."/></div>
</div>
</xsl:template>
<xsl:template match="list[@type = 'timeline']">
<xsl:if test="not(description)">
<h2>Timeline</h2>
</xsl:if>
<xsl:if test="description">
<h2><xsl:value-of select="description"/></h2>
</xsl:if>
<blockquote>
<xsl:apply-templates select="item" mode="timeline"/>
</blockquote>
</xsl:template>
<xsl:template match="item" mode="timeline">
<xsl:if test="@ref">
<xsl:variable name="documentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($documentFile)/document" mode="withDate">
<xsl:with-param name="itemRef" select="@ref"/>
</xsl:apply-templates>
</xsl:if>
<xsl:if test="not(@ref)">
<h3><xsl:call-template name="formatDate"><xsl:with-param name="date" select="@date"/></xsl:call-template></h3>
<blockquote>
<xsl:value-of select="."/>
</blockquote>
</xsl:if>
</xsl:template>
<xsl:template match="list[@type = 'people']">
<xsl:if test="not(description)">
<h2>People</h2>
</xsl:if>
<xsl:if test="description">
<h2><xsl:value-of select="description"/></h2>
</xsl:if>
<blockquote>
<xsl:apply-templates select="item" mode="people"/>
</blockquote>
</xsl:template>
<xsl:template match="item" mode="people">
<h3><xsl:value-of select="name"/></h3>
<xsl:apply-templates select="list"/>
</xsl:template>
<xsl:template match="list[@type = 'documents']">
<xsl:if test="description"><h2><xsl:value-of select="description"/></h2></xsl:if>
<ul>
<xsl:apply-templates select="item" mode="document"/>
</ul>
</xsl:template>
<xsl:template match="item" mode="document">
<xsl:variable name="documentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($documentFile)/document">
<xsl:with-param name="itemRef" select="@ref"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="document">
<xsl:param name="itemRef"/>
<li>
<xsl:call-template name="documentSummary"><xsl:with-param name="itemRef" select="$itemRef"/></xsl:call-template>
</li>
</xsl:template>
<xsl:template match="document" mode="withDate">
<xsl:param name="itemRef"/>
<h3><xsl:call-template name="formatDate"><xsl:with-param name="date" select="date"/><xsl:with-param name="format" select="MY"/></xsl:call-template></h3>
<blockquote>
<p>
<xsl:call-template name="documentSummary"><xsl:with-param name="itemRef" select="$itemRef"/><xsl:with-param name="multiLine" select="'true'"/></xsl:call-template>
</p>
</blockquote>
</xsl:template>
<xsl:template name="documentSummary">
<xsl:param name="itemRef"/>
<xsl:param name="multiLine">false</xsl:param>
<xsl:choose>
<xsl:when test="content|include">
<a href="{$itemRef}"><xsl:value-of select="title"/></a>
<xsl:if test="@ref">
<span class="small">
<xsl:text> [</xsl:text><a href="{@ref}">Original</a><xsl:text>]</xsl:text>
</span>
</xsl:if>
</xsl:when>
<xsl:otherwise>
<a href="{$itemRef}"><xsl:value-of select="title"/></a>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="copy">
<span class="small">
<xsl:text> [</xsl:text><a href="{copy/@ref}"><xsl:value-of select="copy"/></a><xsl:text>]</xsl:text>
</span>
</xsl:if>
<xsl:if test="author"><xsl:if test="$multiLine = 'true'"><br/></xsl:if><span class="medium"><xsl:text> by </xsl:text><xsl:call-template name="authors"/></span></xsl:if>
<xsl:if test="source">
<span class="small">
<br/>
<xsl:text>[Source: </xsl:text>
<xsl:if test="site">
<a href="{site/@url}"><xsl:value-of select="site"/></a>
</xsl:if>
<xsl:if test="not(site)">
<a href="{source/@url}"><xsl:value-of select="source"/></a>
</xsl:if>
<xsl:text>]</xsl:text>
</span>
</xsl:if>
</xsl:template>
<xsl:template match="list[@type = 'resources']">
<xsl:if test="not(description)">
<h2>Resources</h2>
</xsl:if>
<xsl:if test="description">
<h2><xsl:value-of select="description"/></h2>
</xsl:if>
<blockquote>
<xsl:apply-templates select="item" mode="resources"/>
</blockquote>
</xsl:template>
<xsl:template match="item" mode="resources">
<h3><xsl:value-of select="description"/></h3>
<xsl:apply-templates select="list"/>
</xsl:template>
<xsl:template match="list[@type = 'links']">
<xsl:if test="description">
<h4><xsl:value-of select="description"/></h4>
</xsl:if>
<ul>
<xsl:apply-templates select="item" mode="links"/>
</ul>
</xsl:template>
<xsl:template match="item" mode="links">
<li><a href="{@ref}"><xsl:value-of select="."/></a></li>
</xsl:template>
<xsl:template match="list[not(@type)]">
<xsl:if test="description">
<h2><xsl:value-of select="description"/></h2>
</xsl:if>
<blockquote>
<xsl:apply-templates select="item|tag" mode="outer"/>
</blockquote>
</xsl:template>
<xsl:template match="item" mode="outer">
<xsl:if test="description">
<h3><xsl:value-of select="description"/></h3>
</xsl:if>
<xsl:apply-templates select="list|item|tag" mode="inner"/>
</xsl:template>
<xsl:template match="list" mode="inner">
<xsl:if test="description">
<h4><xsl:value-of select="description"/></h4>
</xsl:if>
<ul>
<xsl:apply-templates select="list|item|para|tag" mode="inner"/>
</ul>
</xsl:template>
<xsl:template name="innerlist">
<xsl:if test="description">
<xsl:value-of select="description"/>
</xsl:if>
<ul>
<xsl:apply-templates select="list|item|para|tag" mode="inner"/>
</ul>
</xsl:template>
<xsl:template match="item" mode="inner">
<xsl:choose>
<xsl:when test="@ref">
<li><a href="{@ref}"><xsl:apply-templates/></a></li>
</xsl:when>
<xsl:when test="description">
<li><xsl:call-template name="innerlist"/></li>
</xsl:when>
<xsl:otherwise>
<li><xsl:apply-templates/></li>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="para" mode="inner">
<li class="para"><xsl:apply-templates/></li>
</xsl:template>
<xsl:template match="tag" mode="outer">
<xsl:call-template name="tag"/>
</xsl:template>
<xsl:template match="tag" mode="inner">
<xsl:call-template name="tag"/>
</xsl:template>
<xsl:template name="tag">
<blockquote class="tag">
<xsl:text><</xsl:text><xsl:if test="@href"><a href="{@href}"><xsl:value-of select="@name"/></a></xsl:if><xsl:if test="not(@href)"><xsl:value-of select="@name"/></xsl:if><xsl:for-each select="attr"><xsl:text> </xsl:text><xsl:value-of select="@name"/><xsl:text>="</xsl:text><xsl:value-of select="@value"/><xsl:text>"</xsl:text></xsl:for-each>
<xsl:choose>
<xsl:when test="tag"><xsl:text>></xsl:text><xsl:apply-templates mode="inner"/><xsl:text></</xsl:text><xsl:value-of select="@name"/><xsl:text>></xsl:text></xsl:when>
<xsl:when test="normalize-space(.) != ''"><xsl:text>></xsl:text><xsl:value-of select="."/><xsl:text></</xsl:text><xsl:value-of select="@name"/><xsl:text>></xsl:text></xsl:when>
<xsl:otherwise><xsl:text>/></xsl:text></xsl:otherwise>
</xsl:choose>
</blockquote>
</xsl:template>
</xsl:stylesheet>
<!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2012-05-05" modified="2014-02-23" license="http://www.gnu.org/licenses/gpl.html" --> <!-- XSLT understands these entities only: lt, gt, apos, quot, and amp. Other useful entities are defined below. --> <!-- Alas, Firefox doesn't support loading external entities, so the contents of this file must be pasted into every primary XSL file. --> <!ENTITY nbsp " "> <!ENTITY sect "§"> <!-- OSX: option 6 --> <!ENTITY copy "©"> <!-- OSX: option g --> <!ENTITY para "¶"> <!-- OSX: option 7 --> <!ENTITY ndash "–"> <!-- – UTF-8: 0xE2 0x80 0x93; OSX: option - --> <!ENTITY mdash "—"> <!-- — UTF-8: 0xE2 0x80 0x94; OSX: shift option - --> <!ENTITY lsquo "‘"> <!-- OSX: option ] --> <!ENTITY rsquo "’"> <!-- OSX: shift option ] --> <!ENTITY ldquo "“"> <!-- “ UTF-8: 0xE2 0x80 0x9C; OSX: option [ --> <!ENTITY rdquo "”"> <!-- ” UTF-8: 0xE2 0x80 0x9D; OSX: shift option [ --> <!ENTITY dagger "†"> <!-- OSX: option t --> <!ENTITY Dagger "‡"> <!-- OSX: shift option 7 -->
<?xml version="1.0" encoding="UTF-8"?>
<!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2012-05-05" modified="2014-02-23" license="http://www.gnu.org/licenses/gpl.html" -->
<!DOCTYPE xsl:stylesheet [
<!-- XSLT understands these entities only: lt, gt, apos, quot, and amp. Other useful entities are defined below (see entities.dtd). -->
<!ENTITY nbsp " "> <!ENTITY sect "§"> <!ENTITY copy "©"> <!ENTITY para "¶"> <!ENTITY ndash "–"> <!ENTITY mdash "—">
<!ENTITY lsquo "‘"> <!ENTITY rsquo "’"> <!ENTITY ldquo "“"> <!ENTITY rdquo "”"> <!ENTITY dagger "†"> <!ENTITY Dagger "‡">
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output doctype-system="about:legacy-compat"/>
<xsl:include href="common.xsl"/>
<!-- There is no "shared" components.xsl, so we just pick one to eliminate IDE inspection warnings -->
<xsl:include href="../../pcjs/templates/components.xsl"/>
<xsl:template match="/machine">
<html lang="en">
<head>
<title><xsl:value-of select="$SITEHOST"/></title>
<xsl:call-template name="commonStyles"/>
<xsl:call-template name="componentStyles"/>
</head>
<body>
<div class="common">
<xsl:call-template name="commonTop"/>
<div class="common-middle">
<p></p>
<div id="{@id}" class="machine {@class}js">
<xsl:call-template name="component">
<xsl:with-param name="machine" select="@id"/>
<xsl:with-param name="component" select="'machine'"/>
<xsl:with-param name="class"><xsl:value-of select="@class"/>js</xsl:with-param>
<xsl:with-param name="parms"><xsl:if test="@parms">,<xsl:value-of select="@parms"/></xsl:if></xsl:with-param>
</xsl:call-template>
</div>
</div>
<xsl:call-template name="commonBottom"/>
</div>
<xsl:call-template name="componentScripts">
<xsl:with-param name="component">
<xsl:choose>
<xsl:when test="debugger"><xsl:value-of select="@class"/>-dbg</xsl:when>
<xsl:otherwise><xsl:value-of select="@class"/></xsl:otherwise>
</xsl:choose>
</xsl:with-param>
</xsl:call-template>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2014-04-10" modified="2014-04-10" license="http://www.gnu.org/licenses/gpl.html" -->
<!DOCTYPE xsl:stylesheet [
<!-- XSLT understands these entities only: lt, gt, apos, quot, and amp. Other useful entities are defined below (see entities.dtd). -->
<!ENTITY nbsp " "> <!ENTITY sect "§"> <!ENTITY copy "©"> <!ENTITY para "¶"> <!ENTITY ndash "–"> <!ENTITY mdash "—">
<!ENTITY lsquo "‘"> <!ENTITY rsquo "’"> <!ENTITY ldquo "“"> <!ENTITY rdquo "”"> <!ENTITY dagger "†"> <!ENTITY Dagger "‡">
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output doctype-system="about:legacy-compat"/>
<xsl:include href="common.xsl"/>
<!-- There is no "shared" components.xsl, so we just pick one to eliminate IDE inspection warnings -->
<xsl:include href="../../pcjs/templates/components.xsl"/>
<xsl:template match="/manifest[@type = 'document']">
<html lang="en">
<head>
<title><xsl:value-of select="$SITEHOST"/></title>
<xsl:call-template name="commonStyles"/>
<xsl:call-template name="componentStyles"/>
</head>
<body>
<div class="common">
<xsl:call-template name="commonTop"/>
<div class="common-middle">
<h4>Document Manifest</h4>
<div class="common-sidebar">
<ul class="common-list-data">
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Title'"/>
<xsl:with-param name="node" select="title"/>
<xsl:with-param name="default">None</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Version'"/>
<xsl:with-param name="node" select="version"/>
<xsl:with-param name="default" select="''"/>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Source'"/>
<xsl:with-param name="node" select="source"/>
<xsl:with-param name="default" select="''"/>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Documents'"/>
<xsl:with-param name="node" select="document"/>
<xsl:with-param name="default"><xsl:value-of select="title"/> <xsl:if test="version != ''"><xsl:text> </xsl:text><xsl:value-of select="version"/></xsl:if></xsl:with-param>
</xsl:call-template>
</ul>
</div>
<div class="common-main">
<!-- TODO: Enumerate cover elements within document elements -->
<p><xsl:value-of select="desc"/></p>
<xsl:call-template name="commonBottom"/>
</div>
</div>
</div>
</body>
</html>
</xsl:template>
<xsl:template match="/manifest[@type = 'software' or not(@type)]">
<xsl:variable name="machineClass">
<xsl:choose>
<xsl:when test="machine/@class"><xsl:value-of select="machine/@class"/></xsl:when>
<xsl:otherwise><xsl:value-of select="$MACHINECLASS"/></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<html lang="en">
<head>
<title><xsl:value-of select="$SITEHOST"/></title>
<xsl:call-template name="commonStyles"/>
<xsl:call-template name="componentStyles"/>
</head>
<body>
<div class="common">
<xsl:call-template name="commonTop"/>
<div class="common-middle">
<h4>Software Manifest</h4>
<div class="common-sidebar">
<ul class="common-list-data">
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Title'"/>
<xsl:with-param name="node" select="title"/>
<xsl:with-param name="default">None</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Version'"/>
<xsl:with-param name="node" select="version"/>
<xsl:with-param name="default">Unknown</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Type'"/>
<xsl:with-param name="node" select="type"/>
<xsl:with-param name="default">None</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Category'"/>
<xsl:with-param name="node" select="category"/>
<xsl:with-param name="default">None</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Created'"/>
<xsl:with-param name="node" select="creationDate"/>
<xsl:with-param name="default" select="''"/>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Creators'"/>
<xsl:with-param name="node" select="creator"/>
<xsl:with-param name="default" select="''"/>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label"><xsl:if test="creationDate">Updated</xsl:if><xsl:if test="not(creationDate)">Released</xsl:if></xsl:with-param>
<xsl:with-param name="node" select="releaseDate"/>
<xsl:with-param name="default">Unknown</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Company'"/>
<xsl:with-param name="node" select="company"/>
<xsl:with-param name="default" select="''"/>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Authors'"/>
<xsl:with-param name="node" select="author"/>
<xsl:with-param name="default" select="''"/>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Contributors'"/>
<xsl:with-param name="node" select="contributor"/>
<xsl:with-param name="default" select="''"/>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Publisher'"/>
<xsl:with-param name="node" select="publisher"/>
<xsl:with-param name="default" select="''"/>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'License'"/>
<xsl:with-param name="node" select="license"/>
<xsl:with-param name="default" select="''"/>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Source'"/>
<xsl:with-param name="node" select="source"/>
<xsl:with-param name="default" select="''"/>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Disks'"/>
<xsl:with-param name="node" select="disk"/>
<xsl:with-param name="default"><xsl:value-of select="title"/> <xsl:if test="version != ''"><xsl:text> </xsl:text><xsl:value-of select="version"/></xsl:if></xsl:with-param>
</xsl:call-template>
</ul>
</div>
<div class="common-main">
<xsl:for-each select="machine[not(@type) or @type = 'default']">
<xsl:call-template name="machine">
<xsl:with-param name="href" select="@href"/>
<xsl:with-param name="state" select="@state"/>
</xsl:call-template>
</xsl:for-each>
<xsl:if test="not(machine[not(@type) or @type = 'default'])">
<p>No default machine specified for '<xsl:value-of select="title"/>' in manifest.xml</p>
</xsl:if>
<xsl:call-template name="commonBottom"/>
</div>
</div>
</div>
<xsl:call-template name="componentScripts">
<xsl:with-param name="component">
<xsl:choose>
<xsl:when test="machine/@debugger"><xsl:value-of select="$machineClass"/>-dbg</xsl:when>
<xsl:otherwise><xsl:value-of select="$machineClass"/></xsl:otherwise>
</xsl:choose>
</xsl:with-param>
</xsl:call-template>
</body>
</html>
</xsl:template>
<xsl:template name="listItem">
<xsl:param name="label"/>
<xsl:param name="node"/>
<xsl:param name="default">Unknown</xsl:param>
<xsl:if test="$node != '' or $default != ''">
<li><xsl:value-of select="$label"/>
<ul class="common-list-data-items">
<xsl:for-each select="$node">
<xsl:variable name="desc">
<xsl:choose>
<xsl:when test="desc"><xsl:value-of select="desc"/></xsl:when>
<xsl:when test="org"><xsl:value-of select="org"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<li title="{$desc}">
<xsl:variable name="value">
<xsl:choose>
<xsl:when test="name">
<xsl:value-of select="name"/>
</xsl:when>
<xsl:when test="normalize-space(./text()) != ''">
<xsl:value-of select="normalize-space(./text())"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$default"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="href">
<xsl:if test="@href"><xsl:value-of select="@href"/></xsl:if>
</xsl:variable>
<xsl:choose>
<xsl:when test="$href != ''">
<a href="{$href}"><xsl:value-of select="$value"/></a>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$value"/>
</xsl:otherwise>
</xsl:choose>
<!-- Page elements are to document manifests what file elements are to software manifests, except that we don't enumerate file elements -->
<xsl:if test="page">
<ul class="common-list-data-subitems">
<xsl:for-each select="page">
<li>
<xsl:if test="@href">
<a href="{$href}{@href}"><xsl:value-of select="."/></a>
</xsl:if>
<xsl:if test="not(@href)">
<xsl:value-of select="."/>
</xsl:if>
</li>
</xsl:for-each>
</ul>
</xsl:if>
</li>
</xsl:for-each>
<xsl:if test="not($node)">
<xsl:if test="@href">
<a href="{@href}"><xsl:value-of select="$default"/></a>
</xsl:if>
<xsl:if test="not(@href)">
<xsl:value-of select="$default"/>
</xsl:if>
</xsl:if>
</ul>
</li>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?> <!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2012-05-05" modified="2014-02-23" license="http://www.gnu.org/licenses/gpl.html" --> <!DOCTYPE xsl:stylesheet [ <!-- XSLT understands these entities only: lt, gt, apos, quot, and amp. Other useful entities are defined below (see entities.dtd). --> <!ENTITY nbsp " "> <!ENTITY sect "§"> <!ENTITY copy "©"> <!ENTITY para "¶"> <!ENTITY ndash "–"> <!ENTITY mdash "—"> <!ENTITY lsquo "‘"> <!ENTITY rsquo "’"> <!ENTITY ldquo "“"> <!ENTITY rdquo "”"> <!ENTITY dagger "†"> <!ENTITY Dagger "‡"> ]> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output doctype-system="about:legacy-compat"/> <xsl:include href="common.xsl"/> <xsl:include href="document.xsl"/> <!-- There is no "shared" components.xsl, so we just pick one to eliminate IDE inspection warnings --> <xsl:include href="../../pcjs/templates/components.xsl"/> <xsl:template match="/outline"> <xsl:variable name="machineClass"> <xsl:choose> <xsl:when test="machine/@class"><xsl:value-of select="machine/@class"/></xsl:when> <xsl:otherwise><xsl:value-of select="$MACHINECLASS"/></xsl:otherwise> </xsl:choose> </xsl:variable> <html lang="en"> <head> <title><xsl:value-of select="title"/><xsl:text> | </xsl:text><xsl:value-of select="$SITEHOST"/></title> <xsl:call-template name="commonStyles"/> <xsl:call-template name="documentStyles"/> <xsl:call-template name="componentStyles"/> </head> <body> <div class="common"> <div class="page justified"> <xsl:apply-templates/> </div> </div> <xsl:call-template name="componentScripts"> <xsl:with-param name="component"> <xsl:choose> <xsl:when test="debugger"><xsl:value-of select="$machineClass"/>-dbg</xsl:when> <xsl:otherwise><xsl:value-of select="$machineClass"/></xsl:otherwise> </xsl:choose> </xsl:with-param> </xsl:call-template> </body> </html> </xsl:template> </xsl:stylesheet>
<!DOCTYPE html>
<html style="background-color: #1d1d1d">
<head>
<title>pcjs.org | PDF Viewer</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1">
<link rel="shortcut icon" type="image/x-icon" href="/versions/images/current/favicon.ico">
<link rel="stylesheet" type="text/css" href="/modules/shared/templates/common.css">
</head>
<body>
<div class="common">
<div class="common-top">
<div class="common-top-left">
<ul>
<li><a href="/">Home</a></li>
<li><a href="/apps/pc/">Apps</a></li>
<li><a href="/disks/pc/">Disks</a></li>
<li><a href="/devices/">Machines</a></li>
<li><a href="/docs/">Docs</a></li>
<li><a href="/pubs/">Pubs</a></li>
<li><a href="/blog/">Blog</a></li>
<li><a href="/docs/about/">About</a></li>
</ul>
</div>
<div class="common-top-right">
<p>Powered by <a href="http://nodejs.org" target="_blank">Node.js</a> and <a href="http://aws.amazon.com/about-aws/whats-new/2013/03/11/announcing-aws-elastic-beanstalk-for-node-js/" target="_blank">AWS</a></p>
</div>
</div>
<div class="common-middle">
<h4>Return to C:\<a href="/">PCJS.ORG</a><a id="returnLink"><span id="returnPath"></span></a></h4>
<div class="common-sidebar">
<ul class="common-list">
</ul>
</div>
<div class="common-main">
<div style="width:680px;margin-left:auto;margin-right:auto;">
<div style="float:left;margin-top:350px;margin-right:8px;">
<button id="prevPDF" style="font-size:large;"><</button>
</div>
<div style="float:left;">
<iframe id="framePDF" src="" width="550" height="800"></iframe>
</div>
<div style="float:left;margin-top:350px;margin-left:8px;">
<button id="nextPDF" style="font-size:large;">></button>
</div>
</div>
<div class="common-bottom">
<p class="common-reference"></p>
<p class="common-copyright">
<span class="common-copyright"><a href="http://www.pcjs.org/">pcjs.org</a> website © 2012-2015 by <a href="http://twitter.com/jeffpar">@jeffpar</a></span><br/>
<span class="common-copyright">PCjs and C1Pjs released under <a href="http://gnu.org/licenses/gpl.html">GPL version 3 or later</a></span>
</p>
</div>
</div>
</div>
</div>
<script id="initFrame" type="text/javascript">
(function() {
var aParms = {};
var sParms = window.location.search.substr(1);
var match, pl = /\+/g, search = /([^&=]+)=?([^&]*)/g;
var decode = function(s) { return decodeURIComponent(s.replace(pl, " ")); };
while ((match = search.exec(sParms))) aParms[decode(match[1])] = decode(match[2]);
var pdf = aParms['url'];
var curPage = parseInt(aParms['page'], 10) || 1;
var totalPages = parseInt(aParms['total'], 10) || 999;
var frame = document.getElementById('framePDF');
if (pdf && frame) {
pdf = pdf.replace('/static/', '/');
var i = pdf.indexOf("/pages/");
if (i > 0) {
var sReturnLink = pdf.substr(0, i+1);
var sReturnPath = sReturnLink.slice(0, -1).toUpperCase().replace(/\//g, '\\');
var e = document.getElementById('returnLink');
if (e) e.setAttribute('href', sReturnLink);
e = document.getElementById('returnPath');
if (e) e.textContent = sReturnPath;
}
i = pdf.indexOf('%20');
if (i < 0) i = pdf.indexOf(' ');
if (i > 0) pdf = pdf.substr(0, i);
var setPage = function(page) {
frame.setAttribute('src', 'http://static.pcjs.org' + pdf + ' ' + curPage + '.pdf');
};
setPage(curPage);
var buttonPrev = document.getElementById('prevPDF');
if (buttonPrev) {
buttonPrev.onclick = function() {
if (curPage > 1) setPage(--curPage);
};
}
var buttonNext = document.getElementById('nextPDF');
if (buttonNext) {
buttonNext.onclick = function() {
if (curPage < totalPages) setPage(++curPage);
};
}
}
})();
</script>
</body>
</html>
#!/usr/bin/env node
/**
* @fileoverview Provides miscellaneous text-munging services
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
* @version 1.0
* @suppress {missingProperties}
* Created 2015-Apr-04
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
* and <http://pcjs.org/>.
*
* JSMachines is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with JSMachines.
* If not, see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some JSMachines files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* JSMachines Project for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
var path = require("path");
var fs = require("fs");
var lib = path.join(path.dirname(fs.realpathSync(__filename)), "../lib/");
require(lib + "textout.js").CLI();
/**
* @fileoverview Provides miscellaneous text-munging services
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
* @version 1.0
* Created 2015-Apr-04
*
* Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
*
* This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
* and <http://pcjs.org/>.
*
* JSMachines is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with JSMachines.
* If not, see <http://www.gnu.org/licenses/gpl.html>.
*
* You are required to include the above copyright notice in every source code file of every
* copy or modified version of this work, and to display that copyright notice on every screen
* that loads or runs any version of this software (see Computer.sCopyright).
*
* Some JSMachines files also attempt to load external resource files, such as character-image files,
* ROM files, and disk image files. Those external resource files are not considered part of the
* JSMachines Project for purposes of the GNU General Public License, and the author does not claim
* any copyright as to their contents.
*/
"use strict";
var fs = require("fs");
var path = require("path");
var mkdirp = require("mkdirp");
var net = require("../../shared/lib/netlib");
var proc = require("../../shared/lib/proclib");
var str = require("../../shared/lib/strlib");
/**
* TextOut()
*
* @constructor
*/
function TextOut()
{
this.fDebug = false;
this.fASCII = true;
this.sServerRoot = process.cwd();
this.asLines = [];
this.nTabWidth = 8;
this.sTarget = "; ";
}
TextOut.asTargetRefs = ["call", "jmp", "jz", "jnz", "jc", "jnc", "ja", "jna", "js", "jns", "jo", "jno", "jl", "jnl", "jg", "jng", "jpo", "jpe", "loop", "loope", "loopne", "jcxz", "jecxz"];
/*
* Class methods
*/
/**
* CLI()
*
* Provides the command-line interface for the TextOut module.
*
* Usage
* ---
* textout --file=({path}|{URL}) [--nasm]
*
* Arguments
* ---
* --nasm performs a variety of NASM-related processing, including:
*
* massageLines(): reorders basic elements of every line to make them "assemble-able"
*
* collapseLines(): looks for series of lines containing nothing more than a "db",
* "dw", or something equivalent, and collapses them into a single repetition
*
* labelTargets(): looks for all JMP and CALL targets and labels them
*
* alignVertical(): looks for a predefined target string (eg, '; ') in the first line,
* and ensures that the same sequence in all subsequent lines starts at the same column
*
* For now, all output is written to stdout only.
*
* Examples
* ---
* node modules/textout/bin/textout --file=devices/pc/bios/compaq/deskpro386/1988-01-28.nasm --nasm
*/
TextOut.CLI = function()
{
var args = proc.getArgs();
if (!args.argc) {
console.log("usage: textout --file=({path}|{URL}) [--nasm]");
return;
}
var argv = args.argv;
var sFile = argv['file'];
if (!sFile) {
TextOut.logError(new Error("bad or missing input filename"));
return;
}
var text = new TextOut();
text.loadFile(sFile, function(err) {
if (!err) {
if (argv['nasm']) {
text.massageLines();
text.collapseLines();
text.labelTargets();
text.alignVertical();
}
text.outputText();
}
});
};
/**
* logError(err)
*
* Conditionally logs an error to the console.
*
* @param {Error} err
* @return {string} the error message that was logged (or that would have been logged had logging been enabled)
*/
TextOut.logError = function(err)
{
var sError = "";
if (err) {
sError = "textout error: " + err.message;
console.log(sError);
}
return sError;
};
/*
* Object methods
*/
/**
* loadFile(sFile, done)
*
* @this {TextOut}
* @param {string} sFile
* @param {function(Error)} done
*/
TextOut.prototype.loadFile = function(sFile, done)
{
var obj = this;
var options = {encoding: "utf8"};
var sFilePath = net.isRemote(sFile)? sFile : path.join(this.sServerRoot, sFile);
if (!this.sFilePath) this.sFilePath = sFilePath;
if (this.fDebug) console.log("loadFile(" + sFilePath + ")");
if (net.isRemote(sFilePath)) {
net.getFile(sFilePath, options.encoding, function(err, status, buf) {
if (err) {
TextOut.logError(err);
done(err);
return;
}
obj.setText(buf);
done(null);
});
} else {
fs.readFile(sFilePath, options, function(err, buf) {
if (err) {
TextOut.logError(err);
done(err);
return;
}
obj.setText(buf);
done(null);
});
}
};
/**
* setText(buf)
*
* Records the given file data in the TextOut's buffer
*
* @this {TextOut}
* @param {Buffer|string} buf
* @return {boolean}
*/
TextOut.prototype.setText = function(buf)
{
var b, i, j, s;
if (typeof buf == "string") {
this.asLines = buf.split('\n');
return true;
}
TextOut.logError(new Error("setText(): invalid data"));
return false;
};
/**
* massageLines()
*
* @this {TextOut}
*/
TextOut.prototype.massageLines = function()
{
var iLineASCII = -1, sASCII = "";
for (var iLine = 0; iLine < this.asLines.length; iLine++) {
/*
* NDISASM sometimes inserts spurious lines containing a hyphen immediately followed by one or more hex bytes;
* this seems to happen whenever an instruction longer than 8 bytes is encountered, and it appears that these
* extra lines can be completely removed.
*/
var sLine = this.asLines[iLine];
if (sLine.match(/^\s*-[0-9A-F]+$/)) {
this.asLines.splice(iLine--, 1);
continue;
}
sLine = sLine.replace(/^([0-9A-F]+)\s+([0-9A-F]+)\s+(o32 |a32 |)([^\s]*) *(.*)$/, "\t$3$4\t$5\t\t\t; $1 $2");
var fASCII = false;
var match = sLine.match(/([0-9A-F]+)$/);
if (match) {
fASCII = this.fASCII;
var cBytes = 0, c;
var sBytes = match[1], sASCIILine = "";
for (var i = 0; i < sBytes.length; i += 2) {
c = str.parseInt(sBytes.substr(i, 2));
if (c != 0x0D && c != 0x0A && (c < 0x20 || c >= 0x7F)) {
c = 0x2E;
fASCII = false;
}
sASCIILine += String.fromCharCode(c);
cBytes++;
}
/*
* Don't interpret single-byte opcodes within the ASCII range as potential ASCII?
*
* if (cBytes == 1 && (c >= 0x40 && c <= 0x5F)) fASCII = false;
*/
sLine += " " + this.encodeASCII(sASCIILine);
}
this.asLines[iLine] = sLine;
if (fASCII) {
if (iLineASCII < 0) iLineASCII = iLine;
sASCII += sASCIILine;
continue;
}
if (iLineASCII >= 0) {
if (iLine - iLineASCII >= 4) {
/*
* This seems a better way of discriminating between single-byte opcodes and ASCII:
* output ASCII only when the number of ASCII bytes exceeds the number of opcode bytes.
*/
if (sASCII.length > iLine - iLineASCII + 1) {
this.asLines[iLineASCII] = "\tdb\t" + this.encodeASCII(sASCII);
this.asLines.splice(iLineASCII+1, iLine - iLineASCII - 1);
iLine = iLineASCII;
}
}
iLineASCII = -1; sASCII = "";
}
}
};
/**
* encodeASCII(s)
*
* @param s
* @return {string}
*/
TextOut.prototype.encodeASCII = function(s)
{
var sNew = "", fInQuotes = false;
for (var i = 0; i < s.length; i++) {
var c = s.charCodeAt(i);
if (c < 0x20 || c == 0x27) {
if (fInQuotes) {
sNew += "'";
fInQuotes = false;
}
if (sNew) sNew += ',';
sNew += str.toHexByte(c);
continue;
}
if (!fInQuotes) {
if (sNew) sNew += ',';
sNew += "'";
fInQuotes = true;
}
var ch = String.fromCharCode(c);
if (ch == "'") ch = "\\'";
sNew += ch;
}
if (fInQuotes) sNew += "'";
return sNew;
};
/**
* collapseLines()
*
* @this {TextOut}
*/
TextOut.prototype.collapseLines = function()
{
for (var i = 0; i < this.asLines.length; i++) {
var as = this.getLineParts(i, true);
if (!as) continue;
if (as[2] != "db" && as[2] != "dw") continue;
var cCombine = 0, asLast;
for (var j = i + 1; j < this.asLines.length; j++) {
var asNext = this.getLineParts(j, true);
if (!asNext) break;
if (as[2] != asNext[2] || as[2] != asNext[2]) break;
asLast = asNext;
cCombine++;
}
if (cCombine > 2) {
this.asLines[i] = "\n\ttimes\t" + (cCombine + 1) + ' ' + as[2] + ' ' + as[3] + "\t\t; " + as[4] + " - " + asLast[4];
this.asLines.splice(i + 1, cCombine);
}
}
};
/**
* labelTargets()
*
* @this {TextOut}
*/
TextOut.prototype.labelTargets = function()
{
/*
* First pass: find all target references (eg, JMP and CALL instructions)
*/
var chPrefix = 'x';
var i, j, as, target, aTargets = [], aHardTargets = [];
for (i = 0; i < this.asLines.length; i++) {
as = this.getLineParts(i);
if (!as) continue;
var iTarget = TextOut.asTargetRefs.indexOf(as[2]);
if (iTarget < 0) continue;
var sTarget = as[3];
var sShort = "short ";
if (sTarget.indexOf(sShort) !== 0) {
sShort = "";
} else {
sTarget = sTarget.substr(sShort.length);
}
target = str.parseInt(sTarget);
if (target == undefined) continue;
if (aTargets.indexOf(target) < 0) {
aTargets.push(target);
/*
* For now, we're classifying only "call" targets as "hard" targets, and thus worthy of extra whitespace
*/
if (iTarget < 1) aHardTargets.push(target);
}
this.asLines[i] = this.asLines[i].replace(as[3], sShort + chPrefix + target.toString(16));
}
/*
* Second pass: label all targets
*/
var addr, fPrevHard = false;
for (i = 0; i < this.asLines.length; i++) {
as = this.getLineParts(i);
if (!as) continue;
addr = str.parseInt(as[4]);
if (addr == undefined) continue;
j = aTargets.indexOf(addr);
if (j >= 0) {
var fHard = (aHardTargets.indexOf(addr) >= 0);
this.asLines[i] = (fHard || fPrevHard? '\n' : '') + chPrefix + addr.toString(16) + ':' + this.asLines[i];
aTargets.splice(j, 1);
} else {
if (fPrevHard) this.asLines[i] = '\n' + this.asLines[i];
}
fPrevHard = (as[2] == "jmp" || as[2] == "ret" || as[2] == "retf" || as[2] == "iret");
}
/*
* Third pass: for all targets that turned out to NOT be targets, fix all references
*/
var aRepairs = [];
if (aTargets.length) {
for (i = 0; i < this.asLines.length; i++) {
as = this.getLineParts(i);
if (!as) continue;
if (as[3].charAt(0) == chPrefix) {
addr = str.parseInt(as[3].substr(1));
if (aTargets.indexOf(addr) >= 0) {
/*
* Instead of putting back the original target address, let's just convert the line to a "db"
*/
this.asLines[i] = as[1] + "\tdb\t";
for (j = 0; j < as[5].length; j += 2) {
this.asLines[i] += (j > 0? ',' : '') + "0x" + as[5].substr(j, 2);
}
// this.asLines[i] = this.asLines[i].replace(as[3], str.toHexWord(addr));
if (aRepairs.indexOf(addr) < 0) aRepairs.push(addr);
}
}
}
if (aTargets.length != aRepairs.length) {
console.log("; warning: " + aTargets.length + " unprocessed targets (" + aRepairs.length + " repaired):");
for (j = 0; j < aTargets.length; j++) {
if (aRepairs.indexOf(aTargets[j]) < 0) console.log(';\t' + str.toHexWord(aTargets[j]));
}
}
}
};
/**
* alignVertical()
*
* @this {TextOut}
*/
TextOut.prototype.alignVertical = function()
{
var iTarget = this.asLines.length? this.findTarget(this.asLines[0]) : -1;
if (iTarget < 0) return;
if (this.fDebug) console.log("target vertical alignment: " + (iTarget + 1));
for (var iLine = 1; iLine < this.asLines.length; iLine++) {
var iVictim;
var sLine = this.asLines[iLine];
while ((iVictim = this.findTarget(sLine)) != iTarget) {
if (iVictim < 0) break;
if (this.fDebug) console.log("line " + (iLine + 1) + ": current vertical alignment: " + (iVictim + 1));
if (iVictim > iTarget) {
if (!this.iTargetIndex) break;
var ch = sLine.charAt(this.iTargetIndex-1);
if (ch != ' ' && ch != '\t') break;
sLine = sLine.substr(0, this.iTargetIndex-1) + sLine.substr(this.iTargetIndex);
} else {
sLine = sLine.substr(0, this.iTargetIndex) + ' ' + sLine.substr(this.iTargetIndex);
}
}
this.asLines[iLine] = sLine;
}
};
/**
* findTarget(sSrc, fDebug)
*
* This does not return the physical 0-based index of sTarget within sSrc, but rather the logical
* 0-based position, taking into account tab stops, based on the current nTabWidth setting.
*
* @this {TextOut}
* @param {string} sSrc
* @param {boolean} [fDebug]
* @return {number} logical position of sTarget within sSrc, -1 if not found
*/
TextOut.prototype.findTarget = function(sSrc, fDebug)
{
var i = 0, iPos = 0, iTarget;
if (fDebug) console.log('findTarget("' + sSrc + '")');
if ((iTarget = sSrc.indexOf(this.sTarget, i)) >= 0) {
/*
* i is a physical position, whereas iPos is the logical position (ie, taking into account tab stops),
* so we have to walk i up to iTarget, advancing iPos as we go.
*/
while (i < iTarget) {
var ch = sSrc.charAt(i++);
if (ch != '\t') {
iPos++;
} else {
iPos = iPos + (this.nTabWidth - (iPos % this.nTabWidth));
}
if (fDebug) console.log('\t"' + ch + '": index=' + (i - 1) + ', pos=' + iPos);
}
this.iTargetIndex = iTarget;
iTarget = iPos;
}
return iTarget;
};
/**
* getLineParts(iLine, fBogus)
*
* Returns the following array:
*
* asParts[1]: label
* asParts[2]: operation
* asParts[3]: operand(s)
* asParts[4]: offset
* asParts[5]: byte sequence
* asParts[6]: ASCII sequence, if any
*
* or null if the line does not contain all of the above.
*
* @this {TextOut}
* @param {number} iLine
* @param {boolean} [fBogus]
* @return {Array.<string>}
*/
TextOut.prototype.getLineParts = function(iLine, fBogus)
{
var as = this.asLines[iLine].match(/^\n?([^\s:]+:|)\s*([^\s;]+)\s*([^;]*?)\s*;\s*([0-9A-F]+)\s*([0-9A-F]+)\s*([^\s]+|)$/);
if (as && fBogus) {
/*
* In most (but not all) cases, an "add [bx+si],al" instruction is bogus (TODO: Come up with an actual bogosity test)
*/
if (as[2] == "add" && as[3] == "[bx+si],al") {
as[2] = "dw";
as[3] = "0x0000";
}
}
return as;
};
/**
* outputText(sOutputFile, fOverwrite)
*
* @this {TextOut}
* @param {string} [sOutputFile]
* @param {boolean} [fOverwrite]
*/
TextOut.prototype.outputText = function(sOutputFile, fOverwrite)
{
if (this.asLines.length) {
var sText = "";
for (var iLine = 0; iLine < this.asLines.length; iLine++) {
if (sText) sText += '\n';
sText += this.asLines[iLine];
}
if (sOutputFile) {
try {
if (fs.existsSync(sOutputFile) && !fOverwrite) {
console.log(sOutputFile + " exists, use --overwrite to rewrite");
} else {
var sDirName = path.dirname(sOutputFile);
if (!fs.existsSync(sDirName)) mkdirp.sync(sDirName);
fs.writeFileSync(sOutputFile, sText);
console.log(sText.length + "-byte file saved as " + sOutputFile);
}
} catch(err) {
TextOut.logError(err);
}
} else {
console.log(sText);
}
}
};
module.exports = TextOut;
[233,143,126,232,167,107,203,232,2,101,203,193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,46,148,13,104,115,91,17, 89,21,102,55,62,22,143,17,237,16,182,16,248,18,12,46,206,16,53,17,95,17,45,46,72,19,80,47,53,31,27,45,254,17,88,30,240,27, 145,34,133,46,190,7,190,7,83,30,67,19,46,31,0,0,138,30,95,17,156,46,157,46,163,46,243,46,223,54,169,18,88,18,57,34,184,18, 216,34,251,15,254,15,1,16,4,16,217,20,4,61,48,61,160,93,0,0,0,0,0,0,169,61,63,36,158,36,4,64,82,67,108,65,109,65,206,65,47, 83,231,82,38,93,19,70,51,70,41,88,13,88,209,71,205,71,147,81,42,80,23,84,104,41,165,41,177,41,28,101,128,126,150,125,241, 112,135,120,14,122,12,115,132,98,244,121,173,122,205,122,140,43,61,30,122,27,232,40,23,38,233,41,248,40,11,41,128,34,71,41, 13,38,18,38,117,27,173,107,81,107,130,107,156,101,250,85,152,86,18,87,192,68,152,68,172,68,55,1,72,1,87,1,139,1,180,1,217, 1,229,1,244,1,249,1,21,2,22,2,26,2,80,2,98,2,109,2,134,2,169,2,170,2,223,2,35,3,58,3,67,3,77,3,101,3,105,3,106,3,85,84,207, 170,78,196,238,66,211,6,84,206,14,83,195,21,0,83,65,86,197,194,76,79,65,196,195,69,69,208,197,0,79,76,79,210,191,76,79,83, 197,187,79,78,212,153,76,69,65,210,146,83,82,76,73,206,219,73,78,212,28,83,78,199,29,68,66,204,30,79,211,12,72,82,164,22, 65,76,204,179,76,211,192,0,69,76,69,84,197,169,65,84,193,132,73,205,134,69,70,83,84,210,172,69,70,73,78,212,173,69,70,83, 78,199,174,69,70,68,66,204,175,69,198,151,0,76,83,197,161,78,196,129,82,65,83,197,165,68,73,212,166,82,82,79,210,167,82,204, 212,82,210,213,88,208,11,79,198,35,81,214,241,0,79,210,130,206,209,82,197,15,73,216,31,0,79,84,207,137,79,32,84,207,137,79, 83,85,194,141,0,69,88,164,26,0,78,80,85,212,133,198,139,78,83,84,210,216,78,212,5,78,208,16,77,208,242,78,75,69,89,164,222, 0,0,69,217,201,0,79,67,65,84,197,202,80,82,73,78,212,157,76,73,83,212,158,80,79,211,27,69,212,136,73,78,197,176,79,65,196, 188,73,83,212,147,79,199,10,79,195,36,69,206,18,69,70,84,164,1,79,198,37,0,79,84,79,210,193,69,82,71,197,189,79,196,243,73, 68,164,3,0,69,88,212,131,69,215,148,79,212,211,0,80,69,206,186,85,212,156,206,149,210,239,67,84,164,25,80,84,73,79,206,184, 70,198,221,0,82,73,78,212,145,79,75,197,152,79,211,17,69,69,203,23,83,69,212,198,82,69,83,69,212,199,79,73,78,212,220,69, 206,32,0,0,85,206,138,69,84,85,82,206,142,69,65,196,135,69,83,84,79,82,197,140,69,205,143,69,83,85,77,197,168,73,71,72,84, 164,2,78,196,8,69,78,85,205,171,65,78,68,79,77,73,90,197,185,0,67,82,69,69,206,200,84,79,208,144,87,65,208,164,65,86,197, 190,80,67,168,210,84,69,208,207,71,206,4,81,210,7,73,206,9,84,82,164,19,84,82,73,78,71,164,214,80,65,67,69,164,24,79,85,78, 196,196,84,73,67,203,33,84,82,73,199,34,0,72,69,206,205,82,79,206,162,82,79,70,198,163,65,66,168,206,207,204,65,206,13,0, 83,73,78,199,215,83,210,208,0,65,204,20,65,82,80,84,210,218,0,73,68,84,200,160,65,73,212,150,72,73,76,197,177,69,78,196,178, 82,73,84,197,183,0,79,210,240,0,0,0,171,233,173,234,170,235,175,236,222,237,220,244,167,217,190,230,189,231,188,232,0,121, 121,124,124,127,80,70,60,50,40,122,123,130,107,0,0,173,107,59,100,81,107,168,102,3,99,83,108,32,99,116,101,18,99,25,99,65, 99,40,99,49,100,106,99,79,99,137,99,215,24,180,101,0,78,69,88,84,32,119,105,116,104,111,117,116,32,70,79,82,0,83,121,110, 116,97,120,32,101,114,114,111,114,0,82,69,84,85,82,78,32,119,105,116,104,111,117,116,32,71,79,83,85,66,0,79,117,116,32,111, 102,32,68,65,84,65,0,73,108,108,101,103,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,0,79,118,101,114,102,108, 111,119,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,85,110,100,101,102,105,110,101,100,32,108,105,110,101,32,110, 117,109,98,101,114,0,83,117,98,115,99,114,105,112,116,32,111,117,116,32,111,102,32,114,97,110,103,101,0,68,117,112,108,105, 99,97,116,101,32,68,101,102,105,110,105,116,105,111,110,0,68,105,118,105,115,105,111,110,32,98,121,32,122,101,114,111,0,73, 108,108,101,103,97,108,32,100,105,114,101,99,116,0,84,121,112,101,32,109,105,115,109,97,116,99,104,0,79,117,116,32,111,102, 32,115,116,114,105,110,103,32,115,112,97,99,101,0,83,116,114,105,110,103,32,116,111,111,32,108,111,110,103,0,83,116,114,105, 110,103,32,102,111,114,109,117,108,97,32,116,111,111,32,99,111,109,112,108,101,120,0,67,97,110,39,116,32,99,111,110,116,105, 110,117,101,0,85,110,100,101,102,105,110,101,100,32,117,115,101,114,32,102,117,110,99,116,105,111,110,0,78,111,32,82,69,83, 85,77,69,0,82,69,83,85,77,69,32,119,105,116,104,111,117,116,32,101,114,114,111,114,0,85,110,112,114,105,110,116,97,98,108, 101,32,101,114,114,111,114,0,77,105,115,115,105,110,103,32,111,112,101,114,97,110,100,0,76,105,110,101,32,98,117,102,102, 101,114,32,111,118,101,114,102,108,111,119,0,68,101,118,105,99,101,32,84,105,109,101,111,117,116,0,68,101,118,105,99,101, 32,70,97,117,108,116,0,70,79,82,32,87,105,116,104,111,117,116,32,78,69,88,84,0,79,117,116,32,111,102,32,80,97,112,101,114, 0,63,0,87,72,73,76,69,32,119,105,116,104,111,117,116,32,87,69,78,68,0,87,69,78,68,32,119,105,116,104,111,117,116,32,87,72, 73,76,69,0,70,73,69,76,68,32,111,118,101,114,102,108,111,119,0,73,110,116,101,114,110,97,108,32,101,114,114,111,114,0,66, 97,100,32,102,105,108,101,32,110,117,109,98,101,114,0,70,105,108,101,32,110,111,116,32,102,111,117,110,100,0,66,97,100,32, 102,105,108,101,32,109,111,100,101,0,70,105,108,101,32,97,108,114,101,97,100,121,32,111,112,101,110,0,63,0,68,101,118,105, 99,101,32,73,47,79,32,69,114,114,111,114,0,70,105,108,101,32,97,108,114,101,97,100,121,32,101,120,105,115,116,115,0,63,0, 63,0,68,105,115,107,32,102,117,108,108,0,73,110,112,117,116,32,112,97,115,116,32,101,110,100,0,66,97,100,32,114,101,99,111, 114,100,32,110,117,109,98,101,114,0,66,97,100,32,102,105,108,101,32,110,97,109,101,0,63,0,68,105,114,101,99,116,32,115,116, 97,116,101,109,101,110,116,32,105,110,32,102,105,108,101,0,84,111,111,32,109,97,110,121,32,102,105,108,101,115,0,0,0,0,195, 30,16,0,82,199,79,128,82,199,79,128,228,0,203,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,1,0,0,80,56,0,114,7,254,255,15,7,10,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,7,7,32,0,0,0,0,0,0,0,0,0,0, 1,24,24,0,0,0,0,80,0,1,0,0,0,7,7,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,32,105,110,32,0, 79,107,255,13,0,66,114,101,97,107,0,187,4,0,3,220,67,138,7,67,60,177,117,7,185,6,0,3,217,235,241,60,130,116,1,195,138,15, 67,138,47,67,83,139,217,11,210,135,218,116,4,135,218,59,218,185,16,0,91,116,230,3,217,235,207,185,181,8,233,145,0,205,134, 139,30,46,0,138,199,34,195,254,192,116,9,160,79,3,10,192,178,19,117,77,233,189,38,178,61,185,178,57,185,178,54,185,178,53, 185,178,52,185,178,51,185,178,62,185,178,55,185,178,64,185,178,63,185,178,50,185,178,67,185,178,58,235,34,139,30,55,3,137, 30,46,0,178,2,185,178,11,185,178,1,185,178,10,185,178,18,185,178,20,185,178,6,185,178,22,185,178,13,50,192,162,54,5,162,95, 0,162,98,4,162,96,0,139,30,46,0,137,30,71,3,50,192,162,101,4,162,107,4,138,199,34,195,254,192,116,4,137,30,73,3,185,12,8, 139,30,69,3,233,177,37,89,138,194,138,202,162,40,0,139,30,67,3,137,30,75,3,135,218,139,30,71,3,138,199,34,195,254,192,116, 10,137,30,84,3,135,218,137,30,86,3,139,30,77,3,11,219,135,218,187,79,3,116,11,34,7,117,7,254,15,135,218,233,115,6,50,192, 136,7,138,209,232,8,36,187,180,3,205,135,138,194,60,68,115,8,60,50,115,6,60,31,114,6,176,40,44,19,138,208,46,138,7,67,10, 192,117,248,75,67,254,202,117,242,83,139,30,71,3,94,135,222,86,205,136,46,138,7,60,63,117,6,91,187,180,3,235,212,232,190, 114,91,186,254,255,59,218,205,137,117,3,233,238,117,138,199,34,195,254,192,116,3,232,153,92,176,255,232,241,34,176,89,205, 138,50,192,162,111,0,232,59,60,232,154,35,187,45,7,232,140,114,160,40,0,44,2,117,3,232,238,45,205,139,187,255,255,137,30, 46,0,160,62,3,10,192,116,73,139,30,63,3,83,232,101,92,90,82,232,119,1,176,42,114,2,176,32,232,172,34,232,132,40,90,115,14, 50,192,162,62,3,235,176,50,192,162,62,3,235,21,139,30,65,3,3,218,114,241,82,186,249,255,59,218,90,115,232,137,30,63,3,160, 247,1,10,192,116,170,233,168,45,232,81,40,114,162,232,233,5,254,192,254,200,116,153,156,232,45,7,115,8,232,147,38,117,3,233, 118,254,232,56,4,138,7,60,32,117,3,232,240,91,82,232,49,1,90,157,137,30,67,3,205,140,114,3,233,111,59,82,81,232,238,61,232, 176,5,10,192,156,137,22,73,3,232,240,0,114,9,157,156,117,3,233,176,7,10,192,81,156,83,232,173,26,91,157,89,81,115,3,232,214, 24,90,157,82,116,71,90,160,107,4,10,192,117,8,139,30,10,3,137,30,47,3,139,30,88,3,94,135,222,86,89,83,3,217,83,232,21,91, 91,137,30,88,3,135,218,136,63,89,90,83,67,67,137,23,67,67,186,184,0,73,73,73,73,139,242,172,136,7,67,66,73,138,193,10,197, 117,242,205,141,90,232,30,0,139,30,233,4,137,30,82,3,232,73,35,205,142,139,30,82,3,137,30,233,4,233,216,254,139,30,48,0,135, 218,138,254,138,218,138,7,67,10,7,117,1,195,67,67,67,138,7,10,192,116,16,60,32,115,245,60,11,114,241,232,253,4,232,249,4, 235,236,67,135,218,137,23,235,212,186,0,0,82,116,23,60,44,116,19,90,232,35,6,82,116,29,60,44,116,25,232,175,35,234,116,2, 60,44,186,250,255,116,3,232,12,6,116,7,60,44,116,3,233,99,253,137,30,59,3,135,218,90,94,135,222,86,83,139,30,48,0,139,203, 138,7,67,10,7,159,75,158,116,149,67,67,139,31,59,218,139,217,139,31,245,116,136,245,115,133,235,226,50,192,162,253,2,162, 252,2,205,143,185,59,1,186,184,0,138,7,10,192,117,32,187,64,1,138,195,42,193,138,200,138,199,26,197,138,232,187,183,0,50, 192,139,250,170,66,139,250,170,66,139,250,170,195,60,34,117,3,233,51,0,60,32,116,9,160,252,2,10,192,138,7,116,47,67,80,232, 84,2,88,44,58,116,6,60,74,117,8,176,1,162,252,2,162,253,2,44,85,117,172,80,138,7,10,192,88,116,170,58,7,116,218,80,138,7, 67,232,44,2,235,236,67,10,192,120,146,75,60,63,176,145,82,81,117,3,233,226,0,186,107,3,232,210,14,232,41,36,115,3,233,46, 1,83,186,94,11,232,32,0,117,62,232,240,3,186,98,11,232,21,0,176,137,117,3,233,8,0,186,101,11,232,8,0,117,38,176,141,89,233, 173,0,139,242,46,172,10,192,117,1,195,138,200,232,149,14,58,193,117,246,67,66,235,234,71,79,32,0,84,79,0,85,66,0,91,232,127, 14,83,205,144,187,3,1,44,65,2,192,138,200,181,0,3,217,46,139,23,91,67,83,232,102,14,138,200,139,242,46,172,36,127,117,3,233, 171,1,67,58,193,117,80,139,242,46,172,66,10,192,121,226,138,193,60,40,116,29,139,242,46,172,60,209,116,21,60,208,116,17,232, 54,14,60,46,116,3,232,199,21,176,0,114,3,233,122,1,88,139,242,46,172,205,145,10,192,121,3,233,35,0,89,90,12,128,80,176,255, 232,81,1,50,192,162,253,2,88,232,72,1,233,178,254,91,139,242,46,172,66,10,192,121,247,66,235,141,75,80,205,146,186,12,12, 138,200,139,242,46,172,10,192,116,23,66,58,193,117,243,235,20,140,170,171,169,166,168,212,161,138,147,158,137,142,205,141, 0,50,192,235,2,176,1,162,253,2,88,89,90,60,161,80,117,3,232,250,0,88,60,177,117,5,232,244,0,176,233,60,217,116,3,233,198, 0,80,232,229,0,176,143,232,226,0,88,80,233,173,254,138,7,60,46,116,14,60,58,114,3,233,144,0,60,48,115,3,233,137,0,160,253, 2,10,192,138,7,89,90,121,3,233,98,254,116,39,60,46,117,3,233,89,254,176,14,232,173,0,82,232,232,3,232,253,0,94,135,222,86, 135,218,138,195,232,155,0,138,199,91,232,149,0,233,255,253,82,81,138,7,232,31,93,232,223,0,89,90,83,160,251,2,60,2,117,26, 139,30,163,4,138,199,10,192,176,2,117,14,138,195,138,251,179,15,60,10,115,200,4,17,235,203,80,208,200,4,27,232,92,0,187,163, 4,232,79,14,114,3,187,159,4,88,80,138,7,232,74,0,88,67,254,200,117,244,91,233,173,253,186,106,3,66,139,242,46,172,36,127, 117,3,233,107,0,66,58,7,139,242,46,172,117,235,233,111,0,60,38,116,3,233,197,253,83,232,11,2,91,232,215,12,60,72,176,11,117, 2,176,12,232,11,0,82,81,232,217,12,89,233,92,255,176,58,139,250,170,66,73,138,193,10,197,116,1,195,178,23,233,155,250,205, 147,91,75,254,200,162,253,2,89,90,232,160,12,232,222,255,67,232,153,12,232,240,33,115,244,60,58,115,8,60,48,115,236,60,46, 116,232,233,51,253,138,7,60,32,115,10,60,9,116,6,60,10,116,2,176,32,80,160,253,2,254,192,116,2,254,200,233,159,254,75,138, 7,60,32,116,249,60,9,116,245,60,10,116,241,67,195,176,100,162,57,3,232,210,41,232,85,32,231,82,137,22,59,3,160,251,2,80,232, 123,9,88,83,232,41,16,187,86,4,232,69,86,91,90,89,83,232,157,3,137,30,53,3,187,2,0,3,220,232,115,249,117,30,3,217,82,75,138, 55,75,138,23,67,67,83,139,30,53,3,59,218,91,90,117,229,90,139,227,137,30,69,3,177,90,135,218,177,8,232,227,30,83,139,30,53, 3,94,135,222,86,83,139,30,46,0,94,135,222,86,232,237,31,204,232,26,13,117,3,233,198,249,114,3,233,193,249,156,232,14,9,157, 83,120,3,233,28,0,232,138,93,94,135,222,86,186,1,0,138,7,60,207,117,3,232,212,16,82,83,135,218,232,198,86,235,39,232,18,93, 232,177,85,91,81,82,185,0,129,138,241,138,214,205,148,138,7,60,207,176,1,117,14,232,207,8,83,232,244,92,232,147,85,232,18, 109,91,81,82,138,200,232,186,12,138,232,81,75,232,171,0,116,3,233,71,249,232,129,22,232,160,0,83,83,139,30,90,4,137,30,46, 0,139,30,59,3,94,135,222,86,181,130,81,159,134,196,80,134,196,159,134,196,80,134,196,233,207,100,181,130,81,235,66,233,203, 248,233,18,249,195,232,117,0,235,80,205,149,233,99,15,233,213,2,10,192,117,235,67,138,7,67,10,7,116,224,67,139,23,67,137, 22,46,0,246,6,118,4,255,116,38,83,176,91,232,202,28,135,218,232,112,86,176,93,232,192,28,91,235,19,205,150,232,155,29,137, 38,69,3,137,30,67,3,138,7,60,58,117,191,67,138,7,60,58,114,171,186,232,14,82,116,164,44,129,114,171,60,74,115,162,50,228, 2,192,139,240,205,151,46,255,180,37,0,67,138,7,60,58,114,1,195,60,32,116,244,114,8,60,48,245,254,192,254,200,195,10,192,116, 251,60,11,114,114,60,30,117,6,160,0,3,10,192,195,60,16,116,60,80,67,162,0,3,44,28,115,57,44,245,115,7,60,254,117,27,138,7, 67,137,30,254,2,183,0,138,216,137,30,2,3,176,2,162,1,3,187,4,0,88,10,192,195,138,7,67,67,137,30,254,2,75,138,63,235,225,232, 55,0,139,30,254,2,235,147,254,192,208,192,162,1,3,82,81,186,2,3,135,218,138,232,232,19,85,135,218,89,90,137,30,254,2,88,187, 4,0,10,192,195,60,9,114,3,233,105,255,60,48,245,254,192,254,200,195,160,0,3,60,15,115,23,60,13,114,19,139,30,2,3,117,10,67, 67,67,138,23,67,138,55,135,218,233,106,84,160,1,3,162,251,2,60,8,116,17,139,30,2,3,137,30,163,4,139,30,4,3,137,30,165,4,195, 187,2,3,233,157,84,178,3,185,178,2,185,178,4,185,178,8,232,58,31,185,190,7,81,114,229,44,65,138,200,138,232,232,5,255,60, 234,117,15,232,254,254,232,33,31,114,208,44,65,138,232,232,242,254,138,197,42,193,114,195,254,192,94,135,222,86,187,96,3, 181,0,3,217,136,23,67,254,200,117,249,91,138,7,60,44,117,168,232,206,254,235,181,232,201,254,232,179,14,121,155,178,5,233, 122,247,138,7,60,46,139,22,73,3,117,3,233,178,254,75,232,174,254,60,14,116,2,60,13,139,22,2,3,117,3,233,159,254,50,192,162, 0,3,75,186,0,0,232,147,254,114,1,195,83,159,80,187,152,25,59,218,114,27,138,254,138,218,3,218,3,219,3,218,3,219,88,158,44, 48,138,208,182,0,3,218,135,218,91,235,213,88,158,91,195,117,3,233,124,28,60,14,116,7,60,13,116,3,233,163,48,232,117,28,185, 232,14,235,30,177,3,232,2,28,232,149,255,89,83,83,139,30,46,0,94,135,222,86,176,141,159,134,196,80,134,196,81,235,4,81,232, 123,255,160,0,3,60,13,135,218,116,188,60,14,116,3,233,190,246,135,218,83,139,30,254,2,94,135,222,86,232,81,0,67,83,139,30, 46,0,59,218,91,115,3,232,79,249,114,3,232,70,249,115,13,73,176,13,162,61,3,91,232,252,18,139,217,195,178,8,233,163,246,205, 152,117,246,182,255,232,250,245,139,227,137,30,69,3,60,141,178,3,116,3,233,139,246,91,137,30,46,0,187,232,14,94,135,222,86, 176,91,177,58,235,2,177,0,181,0,138,193,138,205,138,232,75,232,176,253,10,192,116,190,58,197,116,186,67,60,34,116,233,254, 192,116,236,44,140,117,231,58,197,18,198,138,240,235,223,88,4,3,235,20,232,220,37,232,95,28,231,137,22,59,3,82,160,251,2, 80,232,133,5,88,94,135,222,86,138,232,160,251,2,58,197,138,197,116,6,232,37,12,160,251,2,186,163,4,60,5,114,3,186,159,4,83, 60,3,117,49,139,30,163,4,83,67,139,23,139,30,48,0,59,218,115,17,139,30,92,3,59,218,90,115,17,187,44,3,59,218,115,10,176,90, 232,230,22,135,218,232,51,20,232,222,22,94,135,222,86,232,190,82,90,91,195,60,167,117,50,232,24,253,232,236,27,137,232,95, 254,11,210,116,13,232,79,248,138,245,138,209,91,114,3,233,19,255,137,22,77,3,114,218,160,79,3,10,192,138,194,116,209,160, 40,0,138,208,233,206,245,232,229,12,138,7,138,232,60,141,116,5,232,178,27,137,75,138,202,254,201,138,197,117,3,233,185,252, 232,26,254,60,44,117,167,235,238,186,79,3,139,242,172,10,192,117,3,233,104,245,254,192,162,40,0,139,250,170,138,7,60,131, 116,16,232,245,253,117,133,11,210,116,3,233,113,254,254,192,235,6,232,151,252,116,1,195,139,30,75,3,135,218,139,30,71,3,137, 30,46,0,135,218,117,237,138,7,10,192,117,4,67,67,67,67,67,233,178,254,232,112,12,117,218,10,192,117,3,233,164,253,233,32, 245,186,10,0,82,116,31,232,157,253,135,218,94,135,222,86,116,22,135,218,232,38,27,44,139,22,65,3,116,8,232,147,253,116,3, 233,225,244,135,218,138,199,10,195,117,3,233,113,253,137,30,65,3,162,62,3,91,137,30,63,3,89,233,219,245,232,44,4,138,7,60, 44,117,3,232,25,252,60,137,116,5,232,233,26,205,75,83,232,210,81,91,116,25,232,6,252,117,1,195,60,14,117,3,233,204,253,60, 13,116,3,233,224,251,139,30,2,3,195,182,1,232,41,254,10,192,116,246,232,228,251,60,161,117,242,254,206,117,238,235,209,232, 106,1,235,3,232,155,49,75,232,206,251,117,3,232,29,25,117,3,233,63,1,60,215,117,3,233,107,39,60,206,117,3,233,171,0,60,210, 117,3,233,164,0,83,60,44,116,109,60,59,117,3,233,23,1,89,232,169,3,83,232,163,7,116,15,232,65,93,232,194,18,198,7,32,139, 30,163,4,254,7,205,153,139,30,163,4,83,232,57,28,116,13,232,49,1,120,3,233,49,0,232,129,69,235,3,160,41,0,138,232,254,192, 116,35,232,30,28,116,7,232,102,69,138,7,235,3,232,104,59,91,83,10,192,116,14,2,7,245,115,4,254,200,58,197,114,3,232,153,24, 91,232,222,18,91,233,107,255,205,154,185,50,0,139,30,233,4,3,217,232,232,27,138,7,117,24,160,42,0,138,232,232,50,59,60,255, 116,12,58,197,114,3,232,108,24,114,3,233,135,0,44,14,115,252,246,208,235,114,80,232,7,251,232,241,10,88,80,60,210,116,1,74, 138,198,10,192,120,3,233,3,0,186,0,0,83,232,166,27,116,13,232,158,0,120,3,233,21,0,232,238,68,235,3,160,41,0,138,216,254, 192,116,7,183,0,232,124,81,135,218,91,232,161,25,41,75,88,44,210,83,116,19,185,50,0,139,30,233,4,3,217,232,111,27,138,7,117, 3,232,190,58,246,208,2,194,114,16,254,192,116,25,232,246,23,138,194,254,200,121,3,233,13,0,254,192,138,232,176,32,232,24, 23,254,205,117,249,91,232,136,250,233,188,254,205,155,50,192,83,82,81,232,134,44,89,90,50,192,138,248,138,216,137,30,233, 4,91,195,83,50,192,159,134,196,80,134,196,232,233,42,116,3,233,226,242,83,185,46,0,178,2,182,253,3,217,136,55,176,0,91,233, 230,41,232,51,46,10,192,195,60,133,116,3,233,162,51,232,17,25,133,60,35,117,3,233,40,48,232,48,29,232,115,0,232,122,34,232, 68,79,82,83,232,167,28,90,89,115,3,233,69,25,81,82,181,0,232,69,17,91,176,3,233,147,252,63,82,101,100,111,32,102,114,111, 109,32,115,116,97,114,116,13,0,67,138,7,10,192,117,3,233,146,242,60,34,117,242,233,155,0,91,91,235,12,205,156,160,58,3,10, 192,116,3,233,115,242,89,187,16,21,232,11,102,139,30,67,3,195,232,148,47,83,187,246,1,233,224,0,60,35,116,242,232,190,28, 185,140,21,81,60,34,176,0,176,255,162,95,4,117,223,232,219,16,138,7,60,44,117,10,50,192,162,95,4,232,157,249,235,4,232,111, 24,59,83,232,48,17,91,195,83,160,95,4,10,192,116,10,176,63,232,12,22,176,32,232,7,22,232,2,28,89,115,3,233,161,24,81,50,192, 162,58,3,198,7,44,135,218,91,83,82,82,75,176,128,162,57,3,232,94,249,232,165,34,138,7,75,60,40,117,32,67,181,0,254,197,232, 76,249,117,3,233,232,241,60,34,117,3,233,69,255,60,40,116,235,60,41,117,233,254,205,117,229,232,49,249,116,7,60,44,116,3, 233,201,241,94,135,222,86,138,7,60,44,116,3,233,49,255,176,1,162,169,4,232,98,0,160,169,4,254,200,116,3,233,31,255,83,232, 13,5,117,3,232,140,18,91,75,232,251,248,94,135,222,86,138,7,60,44,116,139,91,75,232,236,248,10,192,91,116,3,233,10,255,198, 7,44,235,6,83,139,30,94,3,13,50,192,162,58,3,94,135,222,86,235,4,232,162,23,44,232,24,33,94,135,222,86,82,138,7,60,44,116, 10,160,58,3,10,192,116,3,233,139,0,13,50,192,162,82,4,232,98,25,116,3,233,139,46,232,169,4,80,117,56,232,155,248,138,240, 138,232,60,34,116,14,160,58,3,10,192,138,240,116,2,182,58,181,44,75,232,182,15,88,4,3,138,200,160,82,4,10,192,117,1,195,138, 193,135,218,187,202,22,94,135,222,86,82,233,240,250,232,99,248,88,80,60,5,185,155,22,81,115,3,233,249,82,233,253,82,75,232, 79,248,116,7,60,44,116,3,233,96,254,94,135,222,86,75,232,62,248,116,3,233,107,255,90,160,58,3,10,192,135,218,116,3,233,53, 23,82,91,233,162,253,232,98,250,10,192,117,21,67,138,7,67,10,7,178,4,117,3,233,206,240,67,139,23,67,137,22,55,3,232,8,248, 60,132,117,221,233,79,255,232,213,22,231,233,4,0,232,206,22,40,75,182,0,82,177,1,232,165,21,205,157,232,178,1,50,192,162, 168,4,137,30,82,3,139,30,82,3,89,138,7,137,30,49,3,60,230,115,1,195,60,233,114,117,44,233,138,208,117,12,160,251,2,60,3,138, 194,117,3,233,214,16,60,12,115,229,187,128,3,182,0,3,218,138,197,46,138,55,58,198,115,213,81,185,62,23,81,138,198,205,158, 60,127,116,100,60,81,114,109,36,254,60,122,116,103,160,251,2,44,3,117,3,233,61,240,10,192,255,54,163,4,121,3,233,17,0,255, 54,165,4,122,3,233,8,0,255,54,159,4,255,54,161,4,4,3,138,202,138,232,81,185,35,24,81,139,30,49,3,233,99,255,182,0,44,230, 114,52,60,3,115,48,60,1,208,208,50,198,58,198,138,240,115,3,233,222,239,137,30,49,3,232,54,247,235,224,232,101,83,232,55, 76,185,41,101,182,127,235,201,82,232,179,83,90,83,185,49,27,235,190,138,197,60,100,114,1,195,81,82,186,4,100,187,3,27,83, 232,17,3,116,3,233,118,255,139,30,163,4,83,185,200,37,235,156,89,138,193,162,252,2,160,251,2,58,197,117,13,60,2,116,40,60, 4,117,3,233,127,0,115,57,138,240,138,197,60,8,116,46,138,198,60,8,116,87,138,197,60,4,116,102,138,198,60,3,117,3,233,124, 239,115,101,187,170,3,181,0,3,217,3,217,46,138,15,67,46,138,47,90,139,30,163,4,81,195,232,12,83,232,37,76,91,137,30,161,4, 91,137,30,159,4,89,90,232,90,75,232,247,82,187,150,3,160,252,2,208,192,2,195,138,216,18,199,42,195,138,248,46,139,31,255, 227,138,197,80,232,246,75,88,162,251,2,60,4,116,211,91,137,30,163,4,235,209,232,151,82,89,90,187,160,3,235,205,91,232,97, 75,232,101,74,232,40,75,91,137,30,165,4,91,137,30,163,4,235,229,83,135,218,232,80,74,91,232,69,75,232,73,74,233,59,76,232, 51,246,117,3,233,228,238,115,3,233,204,80,232,78,22,114,3,233,219,0,60,32,115,3,233,127,246,205,159,254,192,117,3,233,106, 1,254,200,60,233,116,213,60,234,117,3,233,175,0,60,34,117,3,233,45,13,60,211,117,3,233,236,1,60,38,117,3,233,209,0,60,213, 117,12,232,232,245,160,40,0,83,232,67,2,91,195,60,212,117,13,232,216,245,83,139,30,71,3,232,247,74,91,195,60,218,117,46,232, 199,245,232,155,20,40,60,35,117,13,232,184,5,83,232,64,38,135,218,91,233,3,0,232,249,30,232,131,20,41,83,135,218,11,219,117, 3,233,221,246,232,141,75,91,195,60,208,117,3,233,0,2,60,216,117,3,233,139,16,60,200,117,3,233,208,59,60,220,117,3,233,76, 46,60,222,117,3,233,249,18,60,214,117,3,233,112,15,60,133,117,3,233,56,42,60,219,117,3,233,164,59,60,209,117,3,233,126,2, 232,96,253,232,46,20,41,195,182,125,232,93,253,139,30,82,3,83,232,214,99,91,195,232,148,29,83,135,218,137,30,163,4,232,65, 1,116,3,232,175,74,91,195,138,7,60,97,114,249,60,123,115,245,36,95,195,60,38,116,3,233,108,246,186,0,0,232,24,245,232,229, 255,60,79,116,57,60,72,117,52,181,5,67,138,7,232,213,255,232,42,21,135,218,115,10,60,58,115,77,44,48,114,73,235,6,60,71,115, 67,44,55,3,219,3,219,3,219,3,219,10,195,138,216,135,218,254,205,117,209,233,140,237,75,232,213,244,135,218,115,36,60,56,114, 3,233,107,237,185,208,7,81,3,219,114,156,3,219,114,152,3,219,114,148,89,181,0,44,48,138,200,3,217,135,218,235,213,232,153, 74,135,218,195,67,138,7,44,129,60,7,117,14,83,232,154,244,60,40,91,116,3,233,224,73,176,7,181,0,208,192,138,200,81,232,134, 244,138,193,60,5,115,34,232,131,252,232,81,19,44,232,148,73,135,218,139,30,163,4,94,135,222,86,83,135,218,232,101,4,135,218, 94,135,222,86,235,33,232,254,254,94,135,222,86,138,195,60,12,114,11,60,27,205,161,83,115,3,232,123,80,91,186,213,25,82,176, 1,162,168,4,185,185,0,205,160,3,217,46,255,39,254,206,60,234,116,133,60,45,116,129,254,198,60,43,117,1,195,60,233,116,251, 159,75,158,195,254,192,18,192,89,34,197,4,255,26,192,232,248,73,235,15,182,90,232,18,252,232,146,80,247,211,137,30,163,4, 89,233,25,252,160,251,2,60,8,254,200,254,200,254,200,195,138,197,80,232,118,80,88,90,60,122,117,3,233,137,74,60,123,117,3, 233,102,72,185,12,101,81,60,70,117,3,11,218,195,60,80,117,3,35,218,195,60,60,117,3,51,218,195,60,50,117,5,51,218,247,211, 195,247,211,35,218,247,211,195,43,218,233,207,72,160,99,0,235,3,232,175,51,254,192,138,216,50,192,138,248,233,132,73,232, 46,0,82,232,49,254,94,135,222,86,139,23,128,250,255,117,3,233,188,244,14,187,7,101,83,255,54,80,3,82,160,251,2,80,60,3,117, 3,232,247,12,88,135,218,187,163,4,203,232,97,243,185,0,0,60,27,115,16,60,17,114,12,232,83,243,160,2,3,10,192,208,208,138, 200,135,218,187,18,0,3,217,135,218,195,232,217,255,82,232,16,18,231,232,194,6,94,135,222,86,137,23,91,195,60,208,116,233, 60,209,116,28,232,249,17,83,232,245,17,69,232,241,17,71,140,218,116,7,232,233,17,231,232,155,6,137,22,80,3,195,232,243,1, 232,224,1,135,218,137,23,135,218,138,7,60,40,116,3,233,50,245,232,241,242,232,63,27,138,7,60,41,117,3,233,35,245,232,185, 17,44,235,238,232,201,1,160,251,2,10,192,80,137,30,82,3,135,218,139,31,11,219,117,3,233,116,235,138,7,60,40,116,3,233,206, 0,232,187,242,137,30,49,3,135,218,139,30,82,3,232,133,17,40,50,192,80,83,135,218,176,128,162,57,3,232,240,26,135,218,94,135, 222,86,160,251,2,80,82,232,155,250,137,30,82,3,91,137,30,49,3,88,232,65,1,177,4,232,55,16,187,248,255,3,220,139,227,232,249, 71,160,251,2,80,139,30,82,3,138,7,60,41,116,19,232,59,17,44,83,139,30,49,3,232,50,17,44,235,177,88,162,228,3,88,10,192,116, 78,162,251,2,187,0,0,3,220,232,191,71,187,8,0,3,220,139,227,90,179,3,254,195,74,139,242,172,10,192,120,246,74,74,74,160,251, 2,2,195,138,232,160,228,3,138,200,2,197,60,100,114,3,233,84,243,80,138,195,181,0,187,230,3,3,217,138,200,232,223,0,185,197, 28,81,81,233,153,244,139,30,82,3,232,250,241,83,139,30,49,3,232,201,16,41,176,82,137,30,49,3,160,124,3,4,4,80,208,200,138, 200,232,150,15,88,138,200,246,208,254,192,138,216,183,255,3,220,139,227,83,186,122,3,232,158,0,91,137,30,122,3,139,30,228, 3,137,30,124,3,139,203,187,126,3,186,230,3,232,134,0,138,248,138,216,137,30,228,3,139,30,80,4,67,137,30,80,4,138,199,10,195, 162,77,4,139,30,49,3,232,144,249,75,232,141,241,116,3,233,41,234,232,141,253,117,17,186,44,3,139,30,163,4,59,218,114,6,232, 124,8,232,230,8,139,30,122,3,138,247,138,211,67,67,138,15,67,138,47,65,65,65,65,187,122,3,232,47,0,135,218,139,227,139,30, 80,4,75,137,30,80,4,138,199,10,195,162,77,4,91,88,83,36,7,187,140,3,138,200,181,0,3,217,232,252,252,91,195,139,242,172,136, 7,67,66,73,138,197,10,193,117,242,195,83,139,30,46,0,67,11,219,91,117,244,178,12,233,206,233,232,231,15,209,176,128,162,57, 3,10,7,138,200,233,91,25,60,126,116,3,233,157,233,67,138,7,67,60,131,117,3,233,164,12,60,160,117,3,233,175,55,60,162,117, 3,233,192,56,233,129,233,232,117,4,135,218,236,233,57,253,232,97,4,82,232,167,15,44,232,203,0,90,195,232,240,255,238,195, 232,235,255,82,80,178,0,75,232,186,240,116,7,232,140,15,44,232,176,0,88,138,240,94,135,222,86,160,94,0,10,192,117,11,135, 218,236,135,218,50,194,34,198,116,238,91,195,233,52,233,60,35,116,60,232,150,248,232,145,252,117,88,232,125,32,138,198,182, 0,246,208,10,192,121,3,233,179,241,138,208,82,232,72,15,44,232,108,0,90,159,134,196,80,134,196,83,82,138,194,2,192,138,208, 176,20,159,134,196,80,134,196,233,8,32,232,80,240,232,76,0,80,232,32,15,44,232,68,0,88,83,82,232,199,32,232,50,58,10,192, 121,3,233,113,241,67,90,136,23,91,195,232,46,0,232,184,51,162,41,0,44,14,115,252,4,28,246,208,254,192,2,194,162,42,0,195, 232,19,240,232,26,248,83,232,156,76,135,218,91,138,198,10,192,195,232,1,240,232,8,248,232,235,255,116,3,233,50,241,75,232, 242,239,138,194,195,232,127,245,75,232,232,239,205,162,89,232,242,234,81,232,25,40,139,30,59,3,75,232,214,239,116,14,232, 168,14,44,232,195,31,178,2,50,192,232,150,33,187,255,255,137,30,46,0,232,117,16,117,5,176,1,162,111,0,91,90,138,15,67,138, 47,67,138,197,10,193,117,3,233,61,233,232,90,16,117,3,232,7,13,81,138,15,67,138,47,67,81,94,135,222,86,135,218,59,218,89, 115,3,233,30,233,94,135,222,86,83,81,135,218,137,30,73,3,232,170,69,91,138,7,60,9,116,5,176,32,232,243,11,232,24,0,187,247, 1,232,5,0,232,179,12,235,151,138,7,10,192,117,1,195,232,105,23,67,235,243,185,247,1,182,255,50,192,162,252,2,50,192,162,94, 4,232,121,39,235,6,65,67,254,206,116,223,138,7,10,192,139,249,170,116,214,60,11,114,40,60,32,138,208,114,56,60,34,117,10, 160,252,2,52,1,162,252,2,176,34,60,58,117,16,160,252,2,208,216,114,7,208,208,36,253,162,252,2,176,58,10,192,121,3,233,60, 0,138,208,60,46,116,9,232,87,1,115,4,50,192,235,24,160,94,4,10,192,116,15,254,192,117,11,176,32,139,249,170,65,254,206,117, 1,195,176,1,162,94,4,138,194,60,11,114,7,60,32,115,3,233,55,1,139,249,170,235,130,160,252,2,208,216,114,67,208,216,208,216, 115,82,138,7,60,217,83,81,187,165,32,83,117,207,73,139,241,172,60,77,117,199,73,139,241,172,60,69,117,191,73,139,241,172, 60,82,117,183,73,139,241,172,60,58,117,175,88,88,91,254,198,254,198,254,198,254,198,235,45,89,91,138,7,233,53,255,160,252, 2,12,2,162,252,2,50,192,195,160,252,2,12,4,235,243,208,208,114,231,138,7,60,132,117,3,232,225,255,60,143,117,3,232,229,255, 138,7,254,192,138,7,117,5,67,138,7,36,127,67,60,161,117,3,232,248,67,60,177,117,10,138,7,67,60,233,176,177,116,1,75,83,81, 82,205,163,187,54,1,138,232,177,64,254,193,67,138,247,138,211,46,138,7,10,192,116,242,159,67,158,121,244,46,138,7,58,197, 117,232,135,218,60,208,116,2,60,209,138,193,90,89,138,208,117,12,160,94,4,10,192,176,0,162,94,4,235,21,60,91,117,7,50,192, 162,94,4,235,29,160,94,4,10,192,176,255,162,94,4,116,13,176,32,139,249,170,65,254,206,117,3,233,164,5,138,194,235,6,46,138, 7,67,138,208,36,127,139,249,170,65,254,206,117,3,233,141,5,10,194,121,233,60,168,117,5,50,192,162,94,4,91,233,100,254,232, 191,13,114,1,195,60,48,114,251,60,58,245,195,75,232,136,237,82,81,80,232,33,238,88,185,181,33,81,60,11,117,3,233,96,66,60, 12,117,3,233,99,66,139,30,2,3,233,19,79,89,90,160,0,3,178,79,60,11,116,6,60,12,178,72,117,20,176,38,139,249,170,65,254,206, 116,192,138,194,139,249,170,65,254,206,116,182,160,1,3,60,4,178,0,114,6,178,33,116,2,178,35,138,7,60,32,117,3,232,82,67,138, 7,67,10,192,116,42,139,249,170,65,254,206,116,143,160,1,3,60,4,114,234,159,73,158,139,241,172,159,65,158,117,4,60,46,116, 8,60,68,116,4,60,69,117,211,178,0,235,207,138,194,10,192,116,9,139,249,170,65,254,206,117,1,195,139,30,254,2,233,174,253, 232,241,231,81,232,245,1,89,90,81,81,232,32,232,115,11,138,247,138,211,94,135,222,86,83,59,218,114,3,233,0,238,187,45,7,232, 246,88,89,187,221,9,94,135,222,86,135,218,139,30,88,3,139,242,172,139,249,170,65,66,59,218,117,244,139,217,137,30,88,3,195, 232,50,0,232,195,36,30,142,30,80,3,138,7,31,233,238,248,232,22,0,82,232,177,36,232,89,11,44,232,125,252,90,6,142,6,80,3,139, 250,170,7,195,232,122,244,83,232,4,0,135,218,91,195,185,173,107,81,232,105,248,120,246,205,164,160,166,4,60,144,117,237,232, 171,88,120,232,232,130,72,185,128,145,186,0,0,233,58,64,185,10,0,81,138,245,138,213,116,53,60,44,116,11,82,232,116,237,138, 238,138,202,90,116,38,232,0,11,44,232,102,237,116,29,88,232,246,10,44,82,232,104,237,116,3,233,182,228,11,210,117,3,233,74, 237,135,218,94,135,222,86,135,218,81,232,76,231,90,82,81,232,70,231,139,217,90,59,218,135,218,115,3,233,44,237,90,89,88,83, 82,235,21,3,217,115,3,233,30,237,135,218,83,187,249,255,59,218,91,115,3,233,16,237,82,139,23,11,210,135,218,90,116,12,138, 7,67,10,7,159,75,158,135,218,117,213,81,232,36,0,89,90,91,82,139,23,67,11,210,116,20,135,218,94,135,222,86,135,218,67,137, 23,135,218,3,217,135,218,91,235,228,185,181,8,81,60,13,50,192,162,61,3,139,30,48,0,75,67,138,7,67,10,7,117,1,195,67,139,23, 67,232,123,235,10,192,116,236,138,200,160,61,3,10,192,138,193,116,91,205,165,60,167,117,24,232,99,235,60,137,117,228,232, 92,235,60,14,117,221,82,232,172,236,11,210,117,10,235,41,60,14,117,204,82,232,158,236,83,232,140,230,159,73,158,176,13,114, 63,232,120,8,187,252,35,82,232,105,87,91,232,96,65,89,91,83,81,232,81,65,91,90,75,235,163,85,110,100,101,102,105,110,101, 100,32,108,105,110,101,32,0,60,13,117,234,82,232,97,236,83,135,218,67,67,67,138,15,67,138,47,176,14,187,247,35,83,139,30, 254,2,83,75,136,47,75,136,15,75,136,7,91,195,160,61,3,10,192,116,248,233,73,255,232,178,9,66,232,174,9,65,232,170,9,83,232, 166,9,69,160,93,4,10,192,116,3,233,110,227,83,139,30,90,3,135,218,139,30,92,3,59,218,116,3,233,92,227,91,138,7,44,48,115, 3,233,73,227,60,2,114,3,233,66,227,162,92,4,254,192,162,93,4,232,150,234,195,46,138,7,10,192,116,248,232,3,0,67,235,243,159, 134,196,80,134,196,233,25,7,116,9,232,132,242,83,232,6,71,235,32,83,187,210,36,232,165,86,232,225,12,90,115,3,233,143,9,82, 67,138,7,232,0,69,138,7,10,192,117,228,232,228,70,137,30,12,0,232,158,63,91,195,82,97,110,100,111,109,32,110,117,109,98,101, 114,32,115,101,101,100,32,40,45,51,50,55,54,56,32,116,111,32,51,50,55,54,55,41,0,177,29,235,2,177,26,181,0,135,218,139,30, 46,0,137,30,90,4,135,218,254,197,75,232,12,234,116,23,60,34,117,11,232,3,234,10,192,116,12,60,34,117,245,60,161,116,29,60, 205,117,228,10,192,117,21,67,138,7,67,10,7,138,209,117,3,233,157,226,67,139,23,67,137,22,90,4,232,215,233,60,143,117,7,81, 232,17,236,89,235,217,60,132,117,7,81,232,2,236,89,235,206,138,193,60,26,138,7,116,13,60,177,116,163,60,178,117,161,254,205, 117,157,195,60,130,116,150,60,131,117,148,254,205,116,243,232,157,233,116,168,135,218,139,30,46,0,83,139,30,90,4,137,30,46, 0,135,218,81,232,215,17,89,75,232,129,233,186,42,37,116,8,232,80,8,44,75,186,121,37,94,135,222,86,137,30,46,0,91,82,195,159, 80,160,168,4,162,169,4,88,158,159,80,50,192,162,168,4,88,158,195,232,219,2,138,7,67,138,15,67,138,47,90,81,80,232,214,2,88, 138,240,138,23,67,138,15,67,138,47,91,138,194,10,198,117,1,195,138,198,44,1,114,249,50,192,58,194,254,192,115,241,254,206, 254,202,139,241,172,65,58,7,159,67,158,116,220,245,233,114,63,232,247,61,235,8,232,252,61,235,3,232,174,74,232,47,0,232,137, 2,185,23,41,81,138,7,67,83,232,171,0,91,138,15,67,138,47,232,13,0,83,138,216,232,91,2,90,195,176,1,232,149,0,187,44,3,83, 136,7,67,137,23,91,195,75,181,34,138,245,83,177,255,67,138,7,254,193,10,192,116,8,58,198,116,4,58,197,117,239,60,34,117,3, 232,177,232,83,138,197,60,44,117,13,254,193,254,201,116,7,75,138,7,60,32,116,245,91,94,135,222,86,67,135,218,138,193,232, 180,255,186,44,3,176,82,139,30,12,3,137,30,163,4,176,3,162,251,2,232,23,62,186,47,3,59,218,137,30,12,3,91,138,7,117,155,186, 16,0,233,34,225,67,232,146,255,232,236,1,232,124,62,254,198,254,206,116,133,139,241,172,232,217,4,60,13,117,3,232,165,5,65, 235,236,10,192,235,2,88,158,159,80,139,30,92,3,135,218,139,30,47,3,246,208,138,200,181,255,3,217,67,59,218,114,15,137,30, 47,3,67,135,218,88,158,195,88,134,196,158,195,88,158,186,14,0,117,3,233,202,224,58,192,159,80,185,218,38,81,139,30,10,3,137, 30,47,3,187,0,0,83,139,30,92,3,83,187,14,3,139,22,12,3,59,218,185,42,39,116,3,233,156,0,187,226,3,137,30,78,4,139,30,90,3, 137,30,75,4,139,30,88,3,139,22,75,4,59,218,116,27,138,7,67,67,67,80,232,69,19,88,60,3,117,5,232,113,0,50,192,138,208,182, 0,3,218,235,221,139,30,78,4,139,23,11,210,139,30,90,3,116,25,135,218,137,30,78,4,67,67,139,23,67,67,135,218,3,218,137,30, 75,4,135,218,235,183,89,139,22,92,3,59,218,117,3,233,108,0,138,7,67,80,67,67,232,248,18,138,15,67,138,47,67,88,83,3,217,60, 3,117,221,137,30,51,3,91,138,15,181,0,3,217,3,217,67,135,218,139,30,51,3,135,218,59,218,116,196,185,197,39,81,50,192,10,7, 159,67,158,138,23,159,67,158,138,55,159,67,158,117,1,195,139,203,139,30,47,3,59,218,139,217,114,243,91,94,135,222,86,59,218, 94,135,222,86,83,139,217,115,227,89,88,88,83,82,81,195,90,91,11,219,116,249,75,138,47,75,138,15,83,75,138,31,183,0,3,217, 138,245,138,209,75,139,203,139,30,47,3,232,160,60,91,136,15,67,136,47,139,217,75,233,224,254,81,83,139,30,163,4,94,135,222, 86,232,160,240,94,135,222,86,232,237,59,138,7,83,139,30,163,4,83,2,7,186,15,0,115,3,233,120,223,232,219,253,90,232,72,0,94, 135,222,86,232,63,0,83,139,30,45,3,135,218,232,14,0,232,11,0,187,58,23,94,135,222,86,83,233,7,254,91,94,135,222,86,138,7, 67,138,15,67,138,47,138,216,254,195,254,203,117,1,195,139,241,172,139,250,170,65,66,235,241,232,146,59,139,30,163,4,135,218, 232,32,0,135,218,117,229,82,138,245,138,209,74,138,15,139,30,47,3,59,218,117,10,50,192,138,232,3,217,137,30,47,3,91,195,205, 238,139,30,12,3,75,138,47,75,138,15,75,59,218,117,238,137,30,12,3,195,185,127,27,81,232,183,255,50,192,138,240,138,7,10,192, 195,185,127,27,81,232,237,255,117,3,233,85,231,67,139,23,139,242,172,195,232,46,253,232,14,246,139,30,45,3,136,23,89,233, 114,253,232,255,229,232,211,4,40,232,247,245,82,232,203,4,44,232,250,237,232,196,4,41,94,135,222,86,83,232,236,241,116,5, 232,225,245,235,3,232,185,255,90,232,5,0,232,213,245,176,32,80,138,194,232,236,252,138,232,88,254,197,254,205,116,188,139, 30,45,3,136,7,67,254,205,117,249,235,175,232,163,0,50,192,94,135,222,86,138,200,176,83,83,138,7,58,197,114,3,138,197,186, 177,0,81,232,81,253,89,91,83,67,138,47,67,138,63,138,221,181,0,3,217,139,203,232,168,252,138,216,232,247,254,90,232,13,255, 233,232,252,232,102,0,90,82,139,242,172,42,197,235,188,135,218,138,7,232,92,0,254,197,254,205,117,3,233,152,230,81,232,181, 1,88,134,196,158,94,135,222,86,185,117,41,81,254,200,58,7,181,0,114,1,195,138,200,138,7,42,193,58,194,138,232,114,243,138, 234,195,232,0,255,117,3,233,142,241,138,208,67,139,31,83,3,218,138,47,136,55,94,135,222,86,81,75,232,23,229,232,190,63,89, 91,136,47,195,135,218,232,225,3,41,89,90,81,138,234,195,232,0,229,232,3,237,232,2,241,176,1,80,116,22,88,232,243,244,10,192, 117,3,233,38,230,80,232,189,3,44,232,236,236,232,253,57,232,179,3,44,83,139,30,163,4,94,135,222,86,232,217,236,232,163,3, 41,83,232,80,254,135,218,89,91,88,81,185,7,101,81,185,127,27,81,80,82,232,68,254,90,88,138,232,254,200,138,200,58,7,176,0, 115,162,139,242,172,10,192,138,197,116,153,138,7,67,138,47,67,138,63,138,221,181,0,3,217,42,193,138,232,81,82,94,135,222, 86,138,15,67,139,23,91,83,82,81,139,242,172,58,7,117,30,66,254,201,116,12,67,254,205,117,239,90,90,89,90,50,192,195,91,90, 90,89,138,197,42,199,2,193,254,192,195,89,90,91,67,254,205,117,208,235,229,232,33,3,40,232,151,12,232,97,57,83,82,135,218, 67,139,23,139,30,92,3,59,218,114,18,139,30,48,0,59,218,115,10,91,83,232,46,251,91,83,232,190,57,91,94,135,222,86,232,241, 2,44,232,21,244,10,192,117,3,233,75,229,80,138,7,232,102,0,82,232,4,236,83,232,138,253,135,218,91,89,88,138,232,94,135,222, 86,83,187,7,101,94,135,222,86,138,193,10,192,116,144,138,7,42,197,115,3,233,27,229,254,192,58,193,114,2,138,193,138,205,254, 201,181,0,82,67,138,23,67,138,63,138,218,3,217,138,232,90,135,218,138,15,67,139,31,135,218,138,193,10,192,117,1,195,139,242, 172,136,7,66,67,254,201,116,244,254,205,117,241,195,178,255,60,41,116,7,232,113,2,44,232,149,243,232,106,2,41,195,232,150, 239,116,3,233,6,0,232,18,253,232,124,251,139,22,92,3,139,30,47,3,233,203,239,205,180,159,134,196,80,134,196,83,232,37,4,116, 3,233,221,23,91,88,134,196,158,81,159,80,60,8,117,16,232,103,35,10,192,116,25,254,200,232,99,35,176,8,235,56,60,9,117,16, 176,32,232,202,255,232,78,35,36,7,117,244,88,158,89,195,60,32,114,32,160,41,0,138,232,232,58,35,254,197,116,11,254,205,58, 197,117,3,232,114,0,116,9,60,255,116,5,254,192,232,39,35,88,158,89,159,80,88,158,232,124,34,195,205,181,232,188,3,116,61, 232,182,23,115,243,81,82,83,160,54,5,36,200,162,54,5,232,204,24,91,90,89,160,107,4,10,192,116,3,233,10,49,160,239,4,10,192, 116,7,187,232,14,83,233,237,0,83,81,82,187,45,7,232,2,79,90,89,176,13,91,195,232,18,33,195,232,204,34,10,192,116,248,235, 11,198,7,0,232,106,3,187,246,1,117,7,205,182,176,13,232,45,255,232,91,3,116,3,50,192,195,50,192,232,172,34,50,192,195,205, 183,160,94,0,10,192,117,1,195,232,196,255,117,3,232,220,1,233,144,1,232,125,226,83,232,175,32,116,33,232,176,255,10,192,117, 16,80,176,2,232,139,249,139,30,45,3,90,137,23,233,208,249,80,232,123,249,88,138,208,232,74,252,187,6,0,137,30,163,4,176,3, 162,251,2,91,195,83,139,30,10,3,181,0,3,217,3,217,176,38,42,195,138,216,176,255,26,199,138,248,114,6,3,220,91,115,1,195,139, 30,44,0,75,75,137,30,69,3,186,7,0,233,212,218,57,30,47,3,115,233,81,82,83,232,6,250,91,90,89,57,30,47,3,115,218,235,227,117, 214,139,30,48,0,232,121,1,162,100,4,162,62,3,162,61,3,136,7,67,136,7,67,137,30,88,3,205,174,139,30,48,0,75,205,175,137,30, 59,3,160,101,4,10,192,117,23,50,192,162,93,4,162,92,4,181,26,187,96,3,205,176,198,7,4,67,254,205,117,248,186,7,0,187,11,0, 232,198,55,50,192,162,79,3,138,216,138,248,137,30,77,3,137,30,86,3,139,30,10,3,160,107,4,10,192,117,4,137,30,47,3,50,192, 232,124,0,139,30,88,3,137,30,90,3,137,30,92,3,160,101,4,10,192,117,3,232,180,21,160,54,5,36,1,117,3,162,54,5,89,139,30,44, 0,75,75,137,30,69,3,67,67,205,177,139,227,187,14,3,137,30,12,3,232,243,247,232,202,230,50,192,138,248,138,216,137,30,124, 3,162,77,4,137,30,228,3,137,30,80,4,137,30,122,3,162,57,3,83,81,139,30,59,3,195,59,218,195,94,139,251,252,46,166,86,139,223, 117,10,138,7,60,58,114,1,195,233,28,225,233,178,217,135,218,139,30,48,0,116,17,135,218,232,82,226,83,232,74,220,139,217,90, 114,3,233,11,227,75,137,30,94,3,135,218,195,117,253,254,192,235,9,117,247,156,117,3,232,31,21,157,137,30,67,3,187,14,3,137, 30,12,3,187,12,255,89,139,30,46,0,83,156,138,195,34,199,254,192,116,12,137,30,84,3,139,30,67,3,137,30,86,3,232,245,253,157, 187,50,7,116,3,233,20,218,233,65,218,176,15,80,176,94,232,41,253,88,4,64,232,35,253,233,236,253,139,30,86,3,11,219,186,17, 0,117,3,233,69,217,139,22,84,3,137,22,46,0,195,184,50,192,162,118,4,195,232,200,8,82,83,187,110,4,232,11,54,139,30,90,3,94, 135,222,86,232,108,236,80,232,55,255,44,232,173,8,88,138,232,232,94,236,58,197,116,3,233,8,217,94,135,222,86,135,218,83,139, 30,90,3,59,218,117,19,90,91,94,135,222,86,82,232,210,53,91,186,110,4,232,203,53,91,195,233,102,225,176,1,162,57,3,232,115, 8,117,243,83,162,57,3,138,253,138,217,73,73,73,139,241,172,73,10,192,120,248,73,73,3,218,135,218,139,30,92,3,59,218,139,242, 172,139,249,170,159,66,158,159,65,158,117,240,73,139,217,137,30,92,3,91,138,7,60,44,117,183,232,226,223,235,182,88,134,196, 158,91,195,138,7,60,65,114,249,60,91,245,195,233,238,253,116,251,60,44,116,9,232,251,224,75,232,192,223,116,238,232,146,254, 44,116,232,139,22,44,0,60,44,116,3,232,71,0,75,232,169,223,82,116,78,232,122,254,44,116,72,232,55,0,75,232,153,223,116,3, 233,53,216,94,135,222,86,83,187,238,0,59,218,115,45,91,232,54,0,114,39,83,139,30,88,3,185,20,0,3,217,59,218,115,25,135,218, 137,30,10,3,91,137,30,44,0,91,235,150,232,240,242,11,210,117,3,233,152,224,195,233,47,253,139,22,44,0,43,22,10,3,235,186, 139,195,43,194,139,208,195,205,178,83,139,30,233,4,11,219,91,195,1,48,78,48,225,48,253,47,241,47,91,48,48,48,27,48,139,30, 86,0,232,74,0,116,1,195,235,4,176,1,235,2,176,255,162,112,0,254,192,232,101,1,183,1,232,11,0,117,232,232,11,31,232,94,0,50, 192,195,160,92,0,58,195,116,248,115,7,138,216,50,192,233,245,30,254,195,233,240,30,160,91,0,58,195,116,227,176,1,58,195,116, 221,254,203,233,222,30,160,41,0,58,199,116,209,254,199,233,210,30,139,30,91,0,183,1,137,30,88,0,233,197,30,139,30,86,0,232, 9,0,117,182,160,41,0,138,248,235,197,176,1,58,199,116,169,254,207,233,170,30,160,91,0,138,248,160,92,0,138,216,42,199,114, 150,254,192,80,232,153,0,160,88,0,254,195,58,195,254,203,115,13,58,199,114,9,117,2,176,1,254,200,162,88,0,88,254,200,117, 3,233,3,0,232,222,30,195,160,91,0,138,216,160,92,0,138,248,42,195,114,241,254,192,80,232,127,0,160,88,0,58,195,114,16,58, 199,120,3,233,9,0,117,2,176,255,254,192,162,88,0,88,254,200,116,207,233,187,30,139,30,91,0,160,93,0,138,232,138,197,58,195, 115,2,138,216,58,199,115,2,138,248,138,199,183,0,42,195,254,192,186,114,0,80,135,218,3,218,136,7,67,136,7,67,254,200,117, 249,135,218,88,50,192,162,88,0,162,89,0,162,90,0,233,43,255,80,232,55,0,181,1,138,200,138,197,139,250,170,74,139,242,172, 138,233,138,200,88,254,200,117,1,195,80,235,234,80,181,1,232,23,0,138,200,138,197,139,250,170,66,139,242,172,138,233,138, 200,88,254,200,116,226,80,235,235,83,186,116,0,183,0,254,203,3,218,138,7,135,218,91,34,192,195,83,186,116,0,183,0,254,203, 3,218,136,7,135,218,91,195,205,166,232,65,1,139,30,86,0,137,30,88,0,160,41,0,254,192,235,30,176,63,232,12,250,176,32,232, 7,250,50,192,162,39,0,205,167,232,30,1,139,30,86,0,137,30,88,0,138,199,162,90,0,232,225,4,254,203,116,5,176,1,232,175,255, 232,12,35,232,65,35,232,164,27,232,8,35,232,56,35,60,27,117,2,176,21,10,192,117,3,232,113,28,80,139,30,88,0,135,218,139,30, 86,0,138,195,58,194,117,22,138,199,58,198,115,4,137,30,88,0,160,90,0,58,199,115,5,138,199,162,90,0,88,232,41,0,114,10,116, 181,232,253,1,232,147,249,235,173,60,3,249,116,1,245,187,246,1,195,60,59,117,251,233,248,220,75,67,254,201,120,242,46,58, 7,117,246,195,187,148,50,177,14,232,236,255,121,3,233,7,0,80,50,192,162,114,0,88,187,162,50,177,12,232,216,255,121,3,233, 32,0,80,138,193,10,192,208,192,138,200,50,192,138,232,187,174,50,3,217,46,138,23,67,46,138,55,88,82,139,30,86,0,195,60,32, 114,3,34,192,195,60,7,116,249,60,9,116,245,60,11,116,241,60,12,116,237,60,28,114,4,60,32,114,229,50,192,195,13,2,6,5,3,11, 12,28,29,30,31,14,127,21,9,10,8,18,2,6,5,3,13,14,127,21,255,52,86,52,202,52,57,51,175,51,7,53,37,53,77,53,1,52,119,52,243, 50,193,51,232,13,253,116,200,88,181,254,187,247,1,232,65,249,136,7,60,13,116,17,60,10,117,6,138,197,60,254,116,237,67,254, 205,117,232,254,205,50,192,136,7,187,246,1,195,160,114,0,10,192,116,58,232,97,254,80,135,218,198,7,0,135,218,254,195,232, 41,3,160,41,0,42,199,116,11,254,192,80,232,245,0,88,254,200,117,247,139,30,86,0,232,59,254,88,138,200,50,192,139,250,170, 66,138,193,139,250,170,50,192,195,176,10,10,192,195,232,90,2,186,247,1,181,254,160,88,0,58,195,183,1,160,41,0,117,19,139, 30,88,0,82,232,9,254,90,160,41,0,116,5,160,90,0,254,200,162,90,0,232,60,2,138,197,34,192,116,16,82,232,238,253,90,117,9,183, 1,254,195,160,41,0,235,228,135,218,176,254,42,198,138,240,75,138,7,60,32,116,8,10,192,117,7,254,206,116,3,75,235,239,67,198, 7,0,135,218,176,13,80,183,1,232,124,27,176,13,232,252,247,187,246,1,88,249,195,50,192,162,247,1,232,167,253,117,4,254,195, 235,247,176,3,235,221,138,199,254,200,36,248,4,8,254,192,138,232,160,41,0,58,197,115,2,138,232,138,197,160,114,0,10,192,138, 197,117,12,58,199,116,5,138,248,232,54,27,50,192,195,42,199,116,251,80,160,80,0,232,20,0,232,170,247,88,254,200,117,241,195, 160,114,0,246,208,162,114,0,50,192,195,83,139,30,86,0,80,160,114,0,10,192,116,3,232,3,0,88,91,195,160,88,0,58,195,117,16, 83,187,90,0,254,7,160,41,0,58,7,115,2,136,7,91,160,80,0,138,200,232,143,1,114,16,116,220,80,50,192,232,40,253,254,195,232, 230,1,88,254,203,254,195,183,1,235,227,83,160,41,0,58,199,117,11,183,0,160,93,0,58,195,117,0,254,195,254,199,232,9,0,91,83, 232,173,26,50,192,91,195,176,1,58,199,116,4,254,207,235,20,83,254,203,116,14,160,41,0,138,248,232,208,252,117,4,94,135,222, 86,91,232,136,26,160,88,0,58,195,117,10,160,90,0,254,200,116,3,162,90,0,232,66,1,83,232,174,252,117,17,254,195,183,1,232, 5,2,94,135,222,86,232,251,1,91,235,230,91,232,85,26,50,192,195,232,145,252,117,11,160,91,0,58,195,116,4,254,195,235,240,160, 41,0,138,248,160,80,0,138,200,81,232,34,26,89,254,207,116,10,10,192,116,243,58,193,116,239,254,199,254,199,232,36,26,50,192, 195,232,148,0,183,1,232,25,26,83,160,80,0,232,173,1,91,254,199,160,41,0,254,192,58,199,117,237,232,65,252,117,165,183,1,254, 195,235,226,50,192,162,112,0,235,8,232,229,25,232,74,1,114,15,232,64,0,116,197,235,241,232,214,25,232,59,1,115,7,232,49,0, 116,182,235,241,50,192,195,50,192,162,112,0,235,8,232,189,25,232,34,1,115,15,232,38,0,116,235,235,241,232,174,25,232,19,1, 114,7,232,23,0,116,220,235,241,232,2,0,235,211,139,30,86,0,232,196,250,117,204,183,1,233,150,250,139,30,86,0,232,223,250, 117,190,160,41,0,138,248,233,154,250,254,203,116,5,232,193,251,116,247,254,195,195,81,160,90,0,58,199,114,26,232,103,25,232, 22,0,139,250,170,66,94,135,222,86,254,207,94,135,222,86,116,4,254,199,235,223,89,195,10,192,117,2,176,32,195,232,69,0,80, 232,138,251,116,21,88,34,192,116,241,60,32,116,237,160,80,0,58,193,116,230,138,193,34,192,195,88,249,195,160,41,0,58,199, 116,25,254,199,232,196,0,83,254,207,232,187,0,91,254,199,160,41,0,254,192,58,199,117,235,254,207,160,80,0,232,167,0,195,83, 81,232,164,0,89,80,138,193,232,154,0,88,138,200,160,41,0,254,192,254,199,58,199,117,231,138,193,91,195,83,160,92,0,42,195, 114,47,116,34,139,30,91,0,94,135,222,86,83,138,195,162,91,0,160,93,0,162,92,0,232,90,250,91,94,135,222,86,137,30,91,0,91, 83,183,1,232,249,24,91,176,1,233,6,251,139,30,86,0,254,203,116,3,232,171,24,232,254,249,91,254,203,195,60,48,114,251,60,58, 114,18,60,65,114,243,60,91,114,10,60,97,114,235,60,123,114,2,249,195,34,192,195,83,183,1,160,41,0,138,232,81,232,101,24,89, 60,255,116,8,254,199,254,205,117,241,91,195,91,83,183,1,232,164,24,91,195,233,67,24,233,73,24,162,40,0,139,30,71,3,10,199, 34,195,254,192,135,218,116,232,235,19,187,246,1,116,225,249,156,67,233,117,210,232,124,217,116,3,233,114,217,91,137,22,73, 3,232,120,211,114,3,233,60,218,139,217,67,67,139,23,67,67,83,135,218,232,78,46,91,138,7,60,9,116,5,176,32,232,151,244,232, 188,232,187,247,1,232,169,232,232,87,245,139,30,86,0,254,203,116,9,254,203,116,5,232,53,250,116,247,254,195,232,240,23,233, 160,209,60,10,116,3,233,107,244,83,139,30,233,4,138,199,10,195,91,176,10,117,8,80,176,13,232,87,244,88,195,232,82,244,176, 13,232,77,244,176,10,195,75,232,190,215,117,1,195,232,143,246,44,185,91,55,81,176,200,235,2,50,192,162,250,2,138,15,205,179, 232,201,247,115,3,233,63,208,50,192,138,232,162,142,0,67,138,7,60,46,114,66,116,13,60,58,115,4,60,48,115,5,232,171,247,114, 51,138,232,81,181,255,186,142,0,12,128,254,197,139,250,170,66,67,138,7,60,58,115,4,60,48,115,237,232,139,247,115,232,60,46, 116,228,138,197,60,39,114,3,233,245,207,89,162,142,0,138,7,60,38,115,30,186,3,56,82,182,2,60,37,116,132,254,198,60,36,117, 1,195,254,198,60,33,116,249,182,8,60,35,116,243,88,138,193,36,127,138,208,182,0,83,187,31,3,3,218,138,55,91,75,138,198,162, 251,2,232,18,215,160,57,3,254,200,117,3,233,122,1,120,3,233,16,0,138,7,44,40,117,3,233,205,0,44,51,117,3,233,198,0,50,192, 162,57,3,83,160,77,4,10,192,162,74,4,116,30,139,30,124,3,186,126,3,3,218,137,30,75,4,135,218,233,247,45,160,74,4,10,192,116, 36,50,192,162,74,4,139,30,90,3,137,30,75,4,139,30,88,3,233,220,45,232,4,255,195,50,192,138,240,138,208,89,94,135,222,86,195, 91,94,135,222,86,82,186,106,56,59,218,116,231,186,218,25,59,218,90,116,73,94,135,222,86,83,81,160,251,2,138,232,160,142,0, 2,197,254,192,138,200,81,181,0,65,65,65,139,30,92,3,83,3,217,89,83,232,25,44,91,137,30,92,3,139,217,137,30,90,3,75,198,7, 0,59,218,117,248,90,136,55,67,90,137,23,67,232,221,1,135,218,66,91,195,50,192,162,166,4,138,248,138,216,137,30,163,4,232, 64,226,117,7,187,6,0,137,30,163,4,91,195,83,139,30,250,2,94,135,222,86,138,240,82,81,186,142,0,139,242,172,10,192,116,61, 135,218,4,2,208,216,138,200,232,195,243,138,193,138,15,67,138,47,67,81,254,200,117,245,83,160,142,0,80,135,218,232,40,215, 88,137,30,181,0,91,4,2,208,216,89,75,136,47,75,136,15,254,200,117,245,139,30,181,0,235,8,232,10,215,50,192,162,142,0,160, 92,4,10,192,116,8,11,210,117,3,233,95,0,74,89,88,134,196,158,135,218,94,135,222,86,83,135,218,254,192,138,240,138,7,60,44, 116,136,60,41,116,7,60,93,116,3,233,64,206,232,156,213,137,30,82,3,91,137,30,250,2,178,0,82,235,7,83,159,134,196,80,134,196, 139,30,90,3,233,175,44,160,250,2,10,192,116,3,233,32,206,88,134,196,158,139,203,117,3,233,85,43,42,7,117,3,233,152,0,186, 9,0,233,25,206,160,251,2,136,7,67,138,208,182,0,88,134,196,158,117,3,233,202,0,136,15,67,136,47,232,211,0,67,138,200,232, 245,242,67,67,137,30,49,3,136,15,67,160,250,2,208,208,138,193,114,15,159,80,160,92,4,52,11,138,200,181,0,88,158,115,4,89, 159,65,158,136,15,159,80,67,136,47,67,232,122,42,88,158,254,200,117,218,159,80,138,238,138,202,135,218,3,218,115,3,233,207, 242,232,220,242,137,30,92,3,75,198,7,0,59,218,117,248,50,192,65,138,240,139,30,49,3,138,23,135,218,3,219,3,217,135,218,75, 75,137,23,67,67,88,158,114,70,138,232,138,200,138,7,67,182,91,139,23,67,67,94,135,222,86,80,59,218,114,3,233,79,255,232,29, 42,3,218,88,254,200,139,203,117,227,160,251,2,139,203,3,219,44,4,114,8,3,219,10,192,116,11,3,219,10,192,122,3,233,2,0,3,217, 89,3,217,135,218,139,30,82,3,195,249,26,192,91,195,138,7,67,81,181,0,138,200,3,217,89,195,81,82,159,80,186,142,0,139,242, 172,138,232,254,197,139,242,172,66,67,136,7,254,205,117,245,88,158,90,89,195,232,90,220,232,106,41,232,32,243,59,135,218, 139,30,163,4,235,10,160,58,3,10,192,116,17,90,135,218,83,50,192,162,58,3,254,192,156,82,138,47,10,197,117,3,233,95,213,67, 139,31,235,36,138,213,83,177,2,138,7,67,60,92,117,3,233,157,1,60,32,117,6,254,193,254,205,117,236,91,138,234,176,92,232,214, 1,232,130,240,50,192,138,208,138,240,232,202,1,138,240,138,7,67,60,33,117,3,233,111,1,60,35,116,82,60,38,117,3,233,96,1,254, 205,117,3,233,46,1,60,43,176,8,116,217,75,138,7,67,60,46,116,85,60,95,117,3,233,55,1,60,92,116,156,58,7,117,182,60,36,116, 24,60,42,117,174,138,197,67,60,2,114,4,138,7,60,36,176,32,117,10,254,205,254,194,190,50,192,4,16,67,254,194,2,198,138,240, 254,194,177,0,254,205,116,97,138,7,67,60,46,116,30,60,35,116,237,60,44,117,35,138,198,12,64,138,240,235,225,138,7,60,35,176, 46,116,3,233,101,255,177,1,67,254,193,254,205,116,54,138,7,67,60,35,116,243,82,186,244,59,82,138,247,138,211,60,94,116,1, 195,58,7,117,251,67,58,7,117,246,67,58,7,117,241,67,138,197,44,4,114,234,90,90,138,232,254,198,67,235,3,135,218,90,138,198, 75,254,194,36,8,117,28,254,202,138,197,10,192,116,20,138,7,44,45,116,6,60,254,117,10,176,8,4,4,2,198,138,240,254,205,91,157, 116,101,81,82,232,2,219,90,89,81,83,138,234,138,197,2,193,60,25,114,3,233,35,212,138,198,12,128,232,92,59,232,119,234,91, 75,232,216,210,249,116,17,162,58,3,60,59,116,7,60,44,116,3,233,104,203,232,196,210,89,135,218,91,83,156,82,138,7,42,197,67, 182,0,138,208,139,31,3,218,138,197,10,192,116,3,233,173,254,235,6,232,123,0,232,39,239,91,157,116,3,233,88,254,115,3,232, 231,239,94,135,222,86,232,28,236,91,233,3,216,195,232,93,0,254,205,138,7,67,232,4,239,235,202,177,0,235,5,177,1,235,1,88, 254,205,232,69,0,91,157,116,208,81,232,110,218,232,127,39,89,81,83,139,30,163,4,138,233,177,0,138,197,80,138,197,10,192,116, 3,232,161,236,232,228,233,139,30,163,4,88,10,192,117,3,233,94,255,42,7,138,232,176,32,254,197,254,205,117,3,233,79,255,232, 177,238,235,244,80,138,198,10,192,176,43,116,3,232,163,238,88,195,137,30,53,3,232,236,231,232,15,210,135,218,232,102,0,159, 68,158,159,68,158,117,8,3,217,139,227,137,30,69,3,139,30,46,0,83,139,30,53,3,83,82,235,40,116,3,233,137,202,135,218,232,63, 0,117,103,139,227,137,30,69,3,139,22,46,0,137,22,90,4,67,67,139,23,67,67,139,31,137,30,46,0,135,218,232,204,217,83,232,132, 39,91,116,9,185,177,0,138,233,81,233,125,209,139,30,90,4,137,30,46,0,91,89,89,233,111,209,187,4,0,3,220,67,138,7,67,185,130, 0,58,193,117,7,185,16,0,3,217,235,238,185,177,0,58,193,116,1,195,57,23,185,6,0,116,248,3,217,235,219,186,30,0,233,47,202, 232,58,7,75,232,109,209,116,85,232,114,217,83,232,108,221,116,61,232,10,51,232,139,232,139,30,163,4,67,138,23,67,138,55,139, 242,172,60,32,117,9,66,136,55,75,136,23,75,254,15,232,220,232,91,75,232,58,209,116,34,60,59,116,5,232,8,240,44,75,232,44, 209,176,44,232,175,237,235,186,176,34,232,168,237,232,186,232,176,34,232,160,237,235,215,232,103,238,233,139,214,205,168, 83,138,242,232,135,1,116,9,60,58,116,15,232,126,1,121,247,138,214,91,50,192,176,252,205,171,195,138,198,42,194,254,200,60, 2,115,5,205,172,233,97,201,60,5,114,3,233,90,201,89,82,81,138,200,138,232,186,156,62,94,135,222,86,83,138,7,60,97,114,6,60, 123,115,2,44,32,81,138,232,139,242,46,172,67,66,58,197,89,117,21,254,201,117,226,139,242,46,172,10,192,120,3,233,6,0,91,91, 90,10,192,195,10,192,120,235,139,242,46,172,10,192,159,66,158,121,245,138,205,91,83,139,242,46,172,10,192,117,182,233,254, 200,75,89,66,68,255,83,67,82,78,254,76,80,84,49,253,67,65,83,49,252,0,123,88,145,88,167,88,189,88,205,169,83,82,159,134,196, 80,134,196,186,46,0,3,218,176,255,42,7,2,192,138,208,205,170,182,0,187,177,62,3,218,46,138,23,67,46,138,55,88,134,196,158, 138,216,183,0,3,218,46,138,23,67,46,138,55,135,218,90,94,135,222,86,195,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,232,17,216,83,232,140,233,138,7,10,192,116,79,67,138,23,67,138,63,138,218,138,208,50,192,162,255,6,232,219,254,159,134, 196,80,134,196,185,240,4,182,11,254,194,254,202,116,77,138,7,60,32,114,38,60,46,116,40,139,249,170,65,67,254,206,117,233, 88,134,196,158,159,134,196,80,134,196,138,240,160,240,4,254,192,116,6,88,134,196,158,91,195,233,40,200,67,235,202,176,1,162, 255,6,138,198,60,11,116,239,60,3,114,235,116,236,176,32,139,249,170,65,254,206,235,234,176,32,139,249,170,65,254,206,117, 246,235,186,138,7,67,254,202,195,232,122,223,138,216,160,223,4,58,195,115,3,233,233,199,183,0,3,219,135,218,139,30,224,4, 3,218,139,31,160,54,5,254,192,116,219,138,7,10,192,116,213,83,186,46,0,3,218,138,7,60,9,115,5,205,220,233,192,199,91,138, 7,10,192,249,195,75,232,53,207,60,35,117,3,232,46,207,232,42,223,94,135,222,86,83,232,171,255,117,3,233,155,199,137,30,233, 4,195,185,152,20,81,232,28,215,138,7,60,44,117,89,83,232,145,232,138,7,10,192,117,3,233,124,199,67,139,31,138,7,36,223,178, 1,60,73,116,21,178,2,60,79,116,15,178,4,60,82,116,9,178,8,60,65,116,3,233,84,199,91,82,232,175,237,44,60,35,117,3,232,208, 206,232,204,222,232,161,237,44,138,194,10,192,117,3,233,61,199,80,232,178,254,88,89,138,209,205,221,233,131,0,232,169,254, 138,7,60,130,178,4,117,89,232,165,206,60,133,178,1,116,77,60,79,116,32,60,73,116,55,232,107,237,65,232,103,237,80,232,99, 237,80,232,95,237,69,232,91,237,78,232,87,237,68,178,8,235,44,232,120,206,232,76,237,85,232,72,237,84,232,68,237,80,232,64, 237,85,232,60,237,84,178,2,235,17,232,93,206,232,49,237,66,232,45,237,77,178,32,75,232,79,206,232,35,237,65,232,31,237,83, 82,138,7,60,35,117,3,232,61,206,232,57,222,10,192,117,3,233,176,198,205,222,180,82,75,138,208,232,41,206,116,3,233,197,198, 94,135,222,86,138,194,159,134,196,80,134,196,83,232,156,254,116,3,233,149,198,90,138,198,60,9,205,223,115,3,233,131,198,83, 185,46,0,3,217,136,55,176,0,91,233,145,253,83,10,192,117,10,160,54,5,36,1,116,3,233,70,3,232,107,254,116,21,137,30,233,4, 83,176,2,115,3,233,113,253,205,224,233,80,198,232,36,3,91,83,186,49,0,3,218,136,7,138,248,138,216,137,30,233,4,91,2,7,198, 7,0,91,195,249,235,3,13,50,192,159,80,232,159,253,205,233,88,158,159,80,116,20,138,7,44,44,10,192,117,12,232,150,205,232, 106,236,82,88,158,249,159,80,159,80,50,192,178,1,232,84,255,139,30,233,4,185,49,0,3,217,88,158,26,192,36,128,12,1,162,54, 5,88,158,159,80,26,192,162,239,4,138,7,10,192,121,3,233,216,0,88,158,116,3,232,87,235,50,192,232,44,254,233,5,199,232,66, 253,205,234,75,232,70,205,178,128,249,117,3,232,121,5,116,24,232,16,236,44,60,80,178,146,117,6,232,47,205,249,235,8,232,0, 236,65,10,192,178,2,159,80,138,194,36,16,162,98,4,88,158,159,80,254,192,162,95,0,50,192,232,221,254,88,158,83,139,30,233, 4,138,7,91,36,128,117,3,233,20,221,83,232,99,225,160,98,4,10,192,116,3,232,121,4,139,30,88,3,137,30,4,7,139,30,48,0,83,139, 30,233,4,232,198,0,10,192,121,3,233,22,0,233,77,197,160,98,4,10,192,116,3,232,162,4,91,50,192,162,98,4,233,200,254,91,232, 2,0,235,231,232,160,0,60,252,117,3,233,13,26,205,235,233,31,197,139,30,48,0,10,192,232,3,0,233,70,0,159,80,232,131,0,60,252, 117,3,233,54,26,88,158,205,236,233,0,197,88,158,195,36,32,162,99,4,88,158,117,3,233,241,196,232,119,234,160,99,4,162,100, 4,232,171,0,50,192,232,241,252,198,7,128,137,30,233,4,232,75,0,10,192,120,179,205,237,233,211,196,160,100,4,10,192,116,3, 232,40,4,232,39,199,67,67,137,30,88,3,232,90,234,50,192,162,54,5,232,67,254,160,239,4,10,192,116,3,233,249,203,233,196,197, 135,218,139,30,47,3,135,218,59,218,114,152,232,28,234,50,192,162,54,5,233,235,233,83,82,139,30,233,4,186,46,0,3,218,138,7, 90,91,195,117,30,83,81,80,186,38,67,82,81,10,192,195,88,89,254,200,121,240,91,195,89,91,138,7,60,44,117,247,232,228,203,81, 138,7,60,35,117,3,232,218,203,232,214,219,94,135,222,86,83,186,46,67,82,249,255,227,185,40,65,160,223,4,235,191,160,54,5, 10,192,120,204,185,40,65,50,192,160,223,4,235,174,50,192,138,232,138,197,232,49,252,198,7,0,160,223,4,254,197,42,197,115, 239,50,192,162,54,5,232,149,233,139,30,48,0,75,198,7,0,233,219,195,91,88,134,196,158,83,82,81,159,134,196,80,134,196,139, 30,233,4,176,6,232,5,0,205,227,233,235,195,159,134,196,80,134,196,82,135,218,187,46,0,3,218,138,7,135,218,90,60,9,115,3,233, 202,0,88,134,196,158,94,135,222,86,91,233,228,250,81,83,82,139,30,233,4,176,8,232,206,255,205,228,233,180,195,90,91,89,195, 232,48,203,232,4,234,36,232,0,234,40,83,139,30,233,4,83,187,0,0,137,30,233,4,91,94,135,222,86,232,18,219,82,138,7,60,44,117, 11,232,9,203,232,205,251,91,50,192,138,7,159,80,232,211,233,41,88,158,94,135,222,86,159,80,138,195,10,192,117,3,233,38,204, 83,232,7,226,135,218,89,88,158,159,80,116,40,232,22,232,60,3,116,19,136,7,67,254,201,117,236,88,158,89,91,137,30,233,4,81, 233,51,226,88,158,139,30,46,0,137,30,71,3,91,233,6,195,232,106,255,115,3,233,48,195,235,213,205,229,232,18,0,83,181,1,232, 2,0,91,195,50,192,136,7,67,254,205,117,249,195,139,30,233,4,186,51,0,3,218,195,88,134,196,158,195,232,7,251,117,3,233,250, 194,176,10,115,3,233,18,250,205,230,233,238,194,232,243,250,117,3,233,230,194,176,12,115,3,233,254,249,205,231,233,218,194, 232,223,250,117,3,233,210,194,176,14,115,3,233,234,249,205,232,233,198,194,232,255,234,117,3,233,31,202,50,192,232,71,252, 178,66,233,242,194,60,35,117,173,232,44,218,232,4,233,44,138,194,83,232,0,251,91,138,7,195,185,236,45,81,50,192,233,36,252, 232,30,214,185,155,22,186,32,44,117,27,138,214,235,23,185,152,20,81,232,204,255,232,81,242,232,27,31,82,185,138,17,50,192, 138,240,138,208,80,81,83,232,165,254,115,3,233,107,194,60,32,117,6,254,198,254,206,117,238,60,34,117,19,138,232,138,194,60, 44,138,197,117,9,138,245,138,213,232,129,254,114,83,187,247,1,181,255,138,200,138,198,60,34,138,193,116,46,60,13,83,116,89, 91,60,10,117,36,138,200,138,194,60,44,138,193,116,3,232,137,0,83,232,85,254,91,114,38,60,13,117,12,138,194,60,32,116,21,60, 44,176,13,116,15,10,192,116,11,58,198,116,14,58,194,116,10,232,99,0,83,232,47,254,91,115,178,83,60,34,116,4,60,32,117,37, 232,32,254,114,32,60,32,116,247,60,44,116,24,60,13,117,4,205,225,116,16,139,30,233,4,138,200,176,18,232,221,253,205,226,233, 195,193,91,198,7,0,187,246,1,138,194,44,32,116,7,181,0,232,102,224,91,195,232,55,213,159,80,232,42,201,88,158,159,80,115, 3,232,196,35,88,158,114,3,232,196,35,91,195,10,192,116,251,136,7,67,254,205,117,244,89,235,197,232,70,0,162,96,0,254,192, 116,3,233,158,193,83,81,178,2,232,198,250,91,232,59,252,50,192,162,96,0,233,26,252,232,38,0,10,192,116,7,254,192,117,3,233, 125,193,254,200,162,96,0,83,81,50,192,178,1,232,158,250,91,232,46,252,50,192,162,96,0,91,233,204,250,232,180,248,82,75,232, 185,200,90,117,3,176,1,195,82,232,134,231,44,232,43,0,82,75,232,166,200,117,5,89,90,50,192,195,232,115,231,44,232,24,0,89, 135,218,3,217,137,30,4,7,135,218,75,232,137,200,116,3,233,37,193,90,176,255,195,232,135,208,83,232,17,220,90,135,218,195, 185,11,13,139,30,48,0,135,218,139,30,88,3,59,218,117,1,195,187,23,98,138,195,2,193,138,216,138,199,20,0,138,248,139,242,172, 42,197,46,50,7,80,187,118,97,138,195,2,197,138,216,138,199,20,0,138,248,88,46,50,7,2,193,139,250,170,66,254,201,117,2,177, 11,254,205,117,188,181,13,235,184,185,11,13,139,30,48,0,135,218,139,30,88,3,59,218,116,175,187,118,97,138,195,2,197,138,216, 138,199,20,0,138,248,139,242,172,42,193,46,50,7,80,187,23,98,138,195,2,193,138,216,138,199,20,0,138,248,88,46,50,7,2,197, 139,250,170,66,254,201,117,2,177,11,254,205,117,189,181,13,235,185,83,139,30,46,0,138,199,34,195,91,254,192,116,1,195,159, 80,160,100,4,10,192,116,3,233,245,200,88,158,195,138,7,60,64,117,3,232,173,199,185,0,0,138,245,138,209,60,234,116,31,138, 7,60,207,156,117,3,232,152,199,232,108,230,40,232,126,215,82,232,100,230,44,232,118,215,232,93,230,41,89,157,83,139,30,61, 5,116,3,187,0,0,159,3,217,209,222,158,209,214,137,30,61,5,137,30,55,5,139,203,139,30,59,5,116,3,187,0,0,3,218,137,30,59,5, 137,30,57,5,135,218,91,195,50,192,235,2,176,3,80,232,164,255,88,232,46,0,83,232,40,3,115,6,232,127,2,232,85,2,91,195,232, 49,199,232,140,255,83,232,20,3,187,255,255,115,10,232,104,2,232,27,2,138,216,183,0,232,7,29,91,195,176,3,81,82,138,208,75, 232,12,199,116,11,232,222,229,44,60,44,116,3,232,254,214,138,194,83,232,193,2,115,3,233,48,200,91,90,89,233,239,198,139,30, 55,5,138,195,42,193,138,216,138,199,26,197,138,248,115,197,50,192,42,195,138,216,26,199,42,195,138,248,249,195,139,30,57, 5,138,195,42,194,138,216,138,199,26,198,138,248,235,222,83,139,30,57,5,135,218,137,30,57,5,91,195,232,240,255,83,81,139,30, 55,5,94,135,222,86,137,30,55,5,89,91,195,232,226,254,81,82,232,106,229,234,232,237,254,232,118,255,90,89,116,83,232,92,229, 44,232,88,229,66,117,3,233,96,0,232,79,229,70,83,232,93,2,232,193,255,232,87,2,232,156,255,115,3,232,169,255,67,83,232,114, 255,115,3,232,175,255,67,83,232,156,1,90,89,82,81,232,219,0,80,83,135,218,232,105,2,91,88,232,215,0,232,248,0,89,90,73,138, 197,10,193,117,227,91,195,81,82,83,232,69,0,139,30,61,5,137,30,55,5,139,30,59,5,137,30,57,5,91,90,89,195,83,139,30,57,5,83, 82,135,218,232,218,255,91,137,30,57,5,135,218,232,208,255,91,137,30,57,5,139,30,55,5,81,139,203,232,193,255,91,137,30,55, 5,139,203,232,183,255,91,195,205,184,232,207,1,232,51,255,232,201,1,232,14,255,115,3,232,40,255,82,83,232,228,254,135,218, 187,241,73,115,3,187,5,74,94,135,222,86,59,218,115,20,137,30,253,6,91,137,30,247,6,187,213,73,137,30,249,6,135,218,235,22, 94,135,222,86,137,30,249,6,187,213,73,137,30,247,6,135,218,137,30,253,6,91,90,83,137,30,251,6,232,211,0,90,82,232,5,0,89, 65,233,32,2,138,198,10,192,208,216,138,240,138,194,208,216,138,208,195,139,30,243,6,160,245,6,195,137,30,243,6,162,245,6, 195,139,30,243,6,129,251,0,32,114,9,129,235,0,32,137,30,243,6,195,129,195,80,32,137,30,243,6,195,139,30,243,6,129,251,0,32, 114,9,129,235,176,31,137,30,243,6,195,129,195,0,32,137,30,243,6,195,138,193,138,14,85,0,210,14,245,6,138,200,114,1,195,255, 6,243,6,195,138,193,138,14,85,0,210,6,245,6,138,200,114,1,195,255,14,243,6,195,140,198,191,0,184,142,199,139,30,243,6,38, 138,7,138,22,245,6,34,194,138,14,85,0,210,234,114,4,210,232,235,248,142,198,195,140,198,191,0,184,142,199,139,30,243,6,139, 233,160,245,6,246,208,38,34,7,138,14,246,6,34,14,245,6,10,193,38,136,7,139,205,142,198,195,139,233,209,234,159,139,218,177, 2,211,226,3,211,177,4,211,226,158,115,4,129,194,0,32,137,22,243,6,139,213,138,202,246,6,85,0,1,116,20,176,7,34,200,176,128, 210,232,162,245,6,177,3,211,234,1,22,243,6,195,176,3,34,200,2,201,176,192,210,232,162,245,6,177,2,211,234,1,22,243,6,195, 160,72,0,199,6,59,5,100,0,60,6,116,18,115,28,60,4,114,24,198,6,85,0,2,199,6,61,5,160,0,195,198,6,85,0,1,199,6,61,5,64,1,195, 198,6,85,0,0,195,60,4,115,15,246,6,85,0,1,116,12,36,1,246,216,162,246,6,248,195,233,93,197,36,3,177,85,246,225,162,246,6, 248,195,160,85,0,10,192,116,235,10,237,120,39,187,128,2,132,6,1,0,116,3,187,64,1,59,203,159,114,3,75,139,203,10,246,120,12, 129,250,200,0,114,4,186,199,0,195,158,195,51,210,195,51,201,159,235,232,140,198,191,0,184,142,199,139,211,11,210,116,108, 139,30,243,6,38,138,47,160,245,6,138,224,246,208,138,14,85,0,138,30,246,6,34,232,138,252,34,251,10,239,74,116,64,210,200, 210,204,115,239,139,30,243,6,38,136,47,255,6,243,6,136,38,245,6,139,202,209,233,209,233,246,6,85,0,1,117,6,129,226,3,0,235, 6,129,226,7,0,209,233,227,171,252,160,246,6,139,62,243,6,243,170,137,62,243,6,235,155,139,30,243,6,38,136,47,136,38,245,6, 142,198,195,232,127,254,3,22,253,6,59,22,251,6,114,9,43,22,251,6,62,255,22,249,6,62,255,22,247,6,226,227,195,83,232,163,207, 91,195,83,232,39,25,91,195,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,180,15,205,16,162,72,0,180,40,60,2,114,13, 180,80,60,7,117,7,185,12,11,137,14,104,0,136,38,41,0,250,140,219,137,30,80,3,30,186,0,0,142,218,137,30,16,5,187,52,77,137, 30,108,0,187,68,87,137,30,112,0,140,14,110,0,140,14,114,0,31,232,50,0,187,24,2,185,0,0,142,193,185,122,0,38,140,143,2,0,38, 199,7,148,76,131,195,4,224,241,140,219,142,195,232,72,225,251,180,1,205,23,232,119,6,187,155,76,232,223,46,233,99,50,190, 237,76,187,83,6,185,10,0,83,252,46,172,136,7,67,10,192,117,246,91,131,195,16,224,239,195,207,62,255,46,0,7,203,84,104,101, 32,73,66,77,32,80,101,114,115,111,110,97,108,32,67,111,109,112,117,116,101,114,32,66,97,115,105,99,255,13,86,101,114,115, 105,111,110,32,67,49,46,48,48,32,67,111,112,121,114,105,103,104,116,32,73,66,77,32,67,111,114,112,32,49,57,56,49,255,13,0, 50,53,45,65,112,114,45,56,49,76,73,83,84,32,0,82,85,78,13,0,76,79,65,68,34,0,83,65,86,69,34,0,67,79,78,84,13,0,44,34,76,80, 84,49,58,34,13,0,84,82,79,78,13,0,84,82,79,70,70,13,0,75,69,89,32,0,83,67,82,69,69,78,32,48,44,48,44,48,13,0,156,80,30,82, 186,0,0,142,218,142,30,16,5,232,58,10,136,22,106,0,254,202,136,22,94,0,90,31,88,157,207,86,160,94,0,10,192,117,17,160,106, 0,10,192,117,10,180,1,205,22,176,0,116,2,254,200,94,195,160,94,0,10,192,116,8,50,192,162,94,0,176,3,195,86,87,160,106,0,10, 192,117,116,180,0,205,22,10,192,116,3,95,94,195,83,128,252,59,114,5,128,252,69,114,60,139,30,46,0,67,11,219,117,19,187,52, 78,177,26,46,58,39,116,12,67,254,192,254,201,117,244,50,192,91,235,211,50,228,208,224,139,216,46,139,159,3,1,137,30,107,0, 254,14,106,0,208,232,4,65,140,14,109,0,235,224,80,134,196,44,59,179,16,246,227,187,83,6,3,216,246,7,255,88,116,204,137,30, 107,0,140,30,109,0,254,14,106,0,235,12,83,254,200,117,7,162,106,0,176,32,235,178,30,197,30,107,0,138,7,31,255,6,107,0,10, 192,116,2,121,160,180,1,140,203,138,30,110,0,58,223,115,2,254,204,136,38,106,0,36,127,117,138,91,95,94,233,58,255,30,48,46, 32,18,33,34,35,23,36,37,38,50,49,24,25,16,19,31,20,22,47,17,45,21,44,83,81,86,190,108,78,177,14,252,46,172,58,224,116,9,70, 254,201,117,244,50,192,235,2,46,172,94,89,91,195,71,11,72,30,75,29,77,28,80,31,28,10,116,6,115,2,118,1,82,18,83,127,79,14, 117,5,119,12,31,30,29,28,13,12,11,10,156,83,81,82,80,60,7,116,77,60,13,117,10,246,6,111,0,255,116,3,232,139,0,232,44,2,116, 4,60,255,116,57,60,12,116,34,187,135,78,185,8,0,67,254,201,120,28,46,58,7,117,246,208,225,139,217,185,233,78,81,46,255,183, 225,47,139,30,86,0,195,232,14,4,235,14,232,62,0,232,14,0,232,13,225,235,3,232,36,9,88,90,89,91,157,195,80,138,62,73,0,138, 30,78,0,185,1,0,180,9,205,16,88,195,83,232,113,0,232,231,255,91,195,83,232,104,0,180,8,205,16,91,195,232,243,255,138,232, 138,204,195,139,30,86,0,137,30,86,0,156,83,232,77,0,91,157,195,160,87,0,254,200,195,80,138,14,41,0,42,14,87,0,254,193,181, 0,138,62,73,0,138,30,79,0,176,32,180,9,205,16,139,22,86,0,134,242,254,206,254,202,180,2,205,16,88,195,83,232,21,0,138,62, 73,0,138,30,79,0,138,14,41,0,181,0,176,32,180,9,205,16,91,80,82,139,211,134,242,254,206,254,202,138,62,73,0,180,2,205,16, 90,88,195,83,82,177,0,138,239,138,243,232,27,0,180,6,205,16,235,15,83,82,177,0,138,235,138,247,232,10,0,180,7,205,16,232, 28,0,90,91,195,232,17,0,138,22,41,0,254,202,254,206,254,205,176,1,138,62,79,0,195,160,73,0,235,3,160,74,0,232,6,1,117,32, 138,38,72,0,128,252,7,116,23,82,186,0,8,128,252,2,114,2,208,230,50,228,247,226,30,142,218,163,78,4,31,90,195,156,83,82,80, 186,0,0,180,0,205,23,246,196,32,117,14,246,196,4,117,13,246,196,1,116,13,178,24,235,6,178,27,235,2,178,25,233,190,183,88, 80,60,13,117,5,176,10,232,206,255,88,90,91,157,195,60,147,116,96,60,149,116,70,60,221,116,70,232,227,206,10,192,116,56,254, 200,60,10,115,50,186,16,0,246,226,138,208,129,194,83,6,82,232,162,221,44,232,209,198,83,232,76,216,138,15,128,249,15,114, 2,177,15,67,139,55,91,95,83,181,0,252,243,164,136,45,232,117,0,91,195,233,225,191,176,255,235,2,176,0,58,6,113,0,162,113, 0,116,3,232,94,0,232,144,190,195,83,190,83,6,185,10,0,254,197,86,176,70,232,8,219,81,138,221,183,0,232,171,20,176,32,232, 251,218,89,94,86,81,252,172,10,192,116,5,232,19,0,235,245,176,13,232,231,218,89,94,131,198,16,254,201,117,206,91,235,192, 86,60,13,117,2,176,27,232,209,218,94,195,80,160,72,0,60,7,116,4,60,4,115,2,50,192,10,192,88,195,83,205,173,182,24,178,0,138, 62,73,0,180,2,205,16,160,113,0,10,192,117,19,138,30,79,0,138,14,41,0,181,0,180,9,205,16,232,13,254,91,195,179,7,232,192,255, 117,9,160,76,0,10,192,117,2,179,112,190,83,6,181,5,160,41,0,60,40,176,49,116,2,181,10,80,83,138,30,78,0,232,55,0,91,86,177, 6,81,252,172,10,192,156,86,117,2,50,192,232,37,0,94,157,117,1,78,89,254,201,117,232,232,22,0,94,131,198,16,88,254,192,60, 58,114,2,176,48,254,205,117,199,232,175,253,91,195,50,192,83,10,192,117,6,176,32,138,30,79,0,60,13,117,2,176,27,81,185,1, 0,180,9,205,16,254,194,180,2,205,16,89,91,195,138,14,73,0,181,0,138,38,72,0,246,196,1,116,3,128,205,128,128,252,4,114,9,254, 197,128,252,6,114,2,254,197,81,60,44,116,12,232,97,205,89,138,232,81,232,92,189,116,64,232,45,220,44,60,44,116,21,232,77, 205,10,192,116,2,176,128,89,128,229,3,10,232,81,232,63,189,116,35,232,16,220,44,60,44,116,12,232,48,205,89,138,200,81,232, 43,189,116,15,232,252,219,44,232,32,205,138,240,89,235,6,233,85,190,89,138,241,138,38,41,0,138,197,36,127,10,192,116,10,50, 210,10,214,10,209,117,230,235,27,128,252,40,116,12,128,254,4,115,218,128,249,4,114,12,235,211,128,254,8,115,206,128,249,8, 115,201,138,209,10,192,116,32,128,62,72,0,7,116,92,177,6,60,2,180,80,116,42,180,40,254,201,254,200,117,172,246,197,128,117, 29,254,201,235,25,177,2,128,252,40,116,9,246,197,128,116,13,254,193,235,9,254,201,246,197,128,117,2,254,201,136,38,41,0,161, 72,0,136,14,72,0,137,22,73,0,58,193,116,26,184,7,0,163,75,0,134,196,163,77,0,136,38,79,0,232,58,254,116,3,162,79,0,232,110, 0,160,74,0,180,5,205,16,195,58,6,41,0,116,52,138,38,72,0,60,80,116,7,60,40,116,3,233,152,189,128,252,7,117,4,176,80,235,28, 128,244,2,128,252,7,117,2,254,204,80,162,41,0,136,38,72,0,199,6,73,0,0,0,232,45,0,88,195,83,232,218,252,178,39,128,62,41, 0,40,116,2,178,79,182,24,138,62,79,0,185,0,0,138,193,180,6,205,16,186,0,0,138,62,73,0,180,2,205,16,235,15,83,185,0,0,137, 14,73,0,160,72,0,180,0,205,16,232,189,221,232,193,253,232,138,247,232,157,252,91,195,232,164,253,116,91,177,0,190,81,0,128, 62,72,0,6,117,3,233,22,189,138,44,86,81,232,212,187,116,64,60,44,116,7,232,201,203,89,138,232,81,89,81,83,138,249,138,221, 128,255,0,117,8,128,251,8,114,3,128,203,16,180,11,205,16,91,232,171,187,116,3,232,165,187,89,94,136,44,116,8,70,254,193,128, 249,4,114,189,198,6,79,0,0,195,89,94,195,255,54,77,0,255,54,75,0,60,44,116,16,232,126,203,60,32,115,24,89,138,200,81,232, 117,187,116,44,232,70,218,44,60,44,116,19,232,102,203,60,16,114,3,233,156,188,89,138,232,81,232,90,187,116,17,232,43,218, 44,232,79,203,60,16,115,233,89,90,138,208,82,81,89,90,138,241,128,230,15,137,14,75,0,138,197,208,224,36,16,10,194,128,229, 7,208,229,208,229,208,229,208,229,246,193,16,116,3,128,205,128,10,238,83,138,216,183,0,36,15,162,77,0,136,46,78,0,136,46, 79,0,180,11,205,16,91,195,255,54,86,0,60,44,116,32,232,250,202,10,192,116,91,60,26,115,87,138,38,113,0,10,228,116,4,60,25, 115,75,90,138,208,82,232,225,186,116,123,232,178,217,44,60,44,116,24,232,210,202,10,192,116,51,138,38,41,0,58,224,114,43, 90,138,240,82,232,193,186,116,91,255,54,104,0,232,142,217,44,60,44,116,25,232,174,202,10,192,176,0,117,2,176,32,89,10,232, 81,232,161,186,116,45,235,3,233,213,187,232,109,217,44,232,145,202,60,32,115,242,89,128,229,32,10,232,138,200,81,232,131, 186,116,15,232,84,217,44,232,120,202,60,32,115,217,89,138,200,81,89,81,128,229,15,137,14,104,0,89,180,1,205,16,90,137,22, 86,0,134,242,254,206,254,202,83,138,62,73,0,180,2,205,16,91,195,80,176,0,235,3,80,176,32,156,81,83,80,232,61,250,88,91,139, 14,104,0,246,6,114,0,255,116,2,181,4,10,232,180,1,205,16,89,157,88,195,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255, 255,80,156,232,201,251,116,75,83,81,82,140,198,191,0,0,142,199,38,255,54,124,0,38,255,54,126,0,38,199,6,124,0,248,84,38,140, 14,126,0,142,198,176,129,2,6,114,0,179,131,138,62,73,0,185,1,0,180,9,205,16,140,198,191,0,0,142,199,38,143,6,126,0,38,143, 6,124,0,142,198,90,89,91,157,88,195,232,189,185,160,86,0,233,114,246,232,180,185,232,101,0,10,238,117,86,10,234,10,233,116, 80,138,38,41,0,58,226,114,72,128,249,26,115,67,160,113,0,10,192,116,5,128,249,25,115,55,83,138,241,254,206,254,202,138,62, 73,0,180,2,205,16,180,8,205,16,91,80,232,119,185,60,44,116,4,176,0,235,7,232,66,216,44,232,102,201,80,232,58,216,41,88,10, 192,88,116,2,138,196,233,18,246,233,144,186,232,5,0,232,37,216,41,195,232,32,216,40,232,50,201,82,232,24,216,44,232,42,201, 89,195,232,56,185,60,149,116,8,232,8,216,221,50,192,235,5,232,41,185,176,255,162,52,0,195,160,52,0,10,192,116,48,232,27,201, 60,10,115,41,83,86,186,26,86,82,50,228,209,224,139,240,46,255,180,29,86,195,94,91,195,52,86,63,86,70,86,76,86,107,86,114, 86,120,86,128,86,136,86,144,86,233,37,186,187,53,0,138,7,198,7,0,233,159,245,139,30,55,0,233,198,14,160,57,0,233,140,245, 180,4,205,16,80,10,228,116,12,137,30,58,0,136,46,60,0,137,22,63,0,88,138,196,254,200,246,208,233,115,245,139,30,58,0,233, 154,14,160,60,0,233,96,245,160,62,0,254,192,233,88,245,160,61,0,254,192,233,80,245,160,64,0,254,192,233,72,245,160,63,0,254, 192,233,64,245,232,132,200,10,192,116,18,60,4,115,84,180,0,83,187,65,0,3,216,138,7,91,233,39,245,83,186,1,2,185,1,1,187,15, 0,250,238,236,36,15,58,195,225,249,227,11,50,195,138,225,80,254,199,50,216,235,236,10,255,116,26,138,215,187,65,0,185,4,0, 88,246,212,2,226,208,232,115,2,136,39,67,226,247,254,202,117,232,251,91,160,65,0,233,225,244,233,95,185,232,32,184,60,149, 116,8,232,240,214,221,50,192,235,5,232,17,184,176,255,162,69,0,195,160,69,0,10,192,116,222,232,3,200,60,4,115,215,168,1,116, 14,180,16,254,200,116,2,180,64,232,208,0,233,172,244,83,187,70,0,10,192,116,1,67,138,7,198,7,0,91,233,154,244,156,80,85,86, 87,30,186,0,0,142,218,142,30,16,5,161,102,0,10,196,116,9,255,14,102,0,117,3,232,39,0,160,52,0,10,192,116,3,232,54,0,160,69, 0,10,192,116,3,232,105,0,31,95,94,93,88,157,207,198,6,101,0,0,161,102,0,11,192,116,24,82,250,246,6,101,0,255,117,7,186,97, 0,236,36,252,238,199,6,102,0,0,0,251,90,195,83,81,82,180,4,205,16,80,10,228,116,12,137,30,58,0,136,46,60,0,137,22,63,0,88, 160,54,0,50,196,116,25,10,228,136,38,54,0,116,17,137,30,55,0,136,46,57,0,137,22,61,0,176,255,162,53,0,90,89,91,195,83,187, 70,0,128,63,0,117,7,180,16,232,17,0,136,7,67,128,63,0,117,7,180,64,232,4,0,136,7,91,195,82,186,1,2,236,34,196,254,200,152, 138,196,90,195,232,9,0,184,211,5,186,4,0,82,235,56,139,22,102,0,10,242,116,7,198,6,101,0,255,235,241,195,232,222,198,131, 250,37,114,18,82,232,191,213,44,232,113,202,89,82,11,210,117,7,90,233,59,255,233,19,184,232,208,255,186,18,0,184,220,52,247, 241,246,6,101,0,255,117,8,80,186,67,0,176,182,238,88,186,66,0,238,138,196,238,117,7,186,97,0,236,12,3,238,90,137,22,102,0, 198,6,101,0,0,195,10,90,77,65,89,16,89,16,25,90,89,16,89,16,89,16,89,16,45,90,89,16,52,90,77,65,89,16,69,90,89,16,89,16,89, 16,89,16,89,16,89,16,93,90,99,90,77,65,89,16,124,90,89,16,89,16,89,16,89,16,89,16,89,16,170,90,177,90,110,91,89,16,171,91, 240,91,89,16,89,16,108,92,89,16,118,92,89,16,34,194,117,34,156,80,83,137,30,233,4,136,23,131,195,45,198,7,0,67,67,136,47, 67,198,7,0,67,136,15,67,198,7,0,91,88,157,195,233,152,174,88,91,195,128,250,128,117,2,178,2,195,88,134,196,158,89,90,91,195, 90,91,89,195,131,195,46,138,7,246,208,195,139,30,233,4,131,195,43,195,139,30,233,4,131,195,50,195,139,30,233,4,138,135,47, 0,195,86,87,81,198,6,63,5,165,190,240,4,191,64,5,185,8,0,252,164,226,253,89,95,94,195,83,81,187,64,5,177,8,128,63,32,117, 13,67,254,201,117,246,190,92,5,191,72,5,235,16,190,84,5,191,64,5,177,8,252,166,117,39,254,201,117,249,138,5,58,4,116,9,10, 192,117,25,246,4,1,117,20,138,4,139,30,233,4,136,135,49,0,187,244,89,232,14,0,50,192,235,7,187,254,89,232,4,0,249,89,91,195, 83,139,30,46,0,67,11,219,116,2,91,195,187,83,5,83,67,177,8,138,7,232,213,244,67,254,201,117,246,176,46,232,203,244,91,131, 195,9,176,68,246,7,225,116,23,176,80,246,7,32,117,16,176,66,246,7,128,117,9,176,65,246,7,64,117,2,176,77,91,232,165,244,46, 138,7,67,10,192,117,245,195,32,70,111,117,110,100,46,255,13,0,32,83,107,105,112,112,101,100,46,255,13,0,185,0,0,136,14,82, 5,176,234,232,189,254,233,227,254,187,82,5,138,7,198,7,0,10,192,117,5,232,70,243,10,192,233,226,254,136,14,82,5,233,163,235, 232,200,254,138,46,41,0,177,0,176,237,232,145,254,233,183,254,88,80,134,196,232,68,244,138,14,87,0,254,201,139,30,233,4,136, 143,50,0,233,170,254,88,134,196,233,73,248,138,46,98,0,177,0,232,147,254,176,109,232,98,254,232,175,254,160,99,0,136,7,233, 128,254,88,80,134,196,232,3,0,233,129,254,232,106,245,187,99,0,60,13,116,15,254,7,83,232,149,254,91,56,7,114,7,176,13,235, 231,198,7,0,138,7,232,124,254,136,7,195,88,134,196,162,98,0,195,160,97,0,10,192,116,3,233,232,172,128,226,251,117,2,178,1, 162,81,5,254,192,162,80,5,138,202,128,225,128,128,233,1,245,26,201,128,225,128,246,194,16,116,3,128,201,32,160,96,0,10,192, 116,2,177,1,10,201,117,9,246,6,95,0,255,116,2,177,64,136,14,72,5,181,255,176,104,232,210,253,138,39,232,46,254,246,196,1, 117,12,246,193,129,117,3,232,47,0,176,255,235,31,232,51,0,232,48,254,114,248,139,30,233,4,246,135,49,0,129,117,10,232,17, 1,115,5,198,6,80,5,0,176,1,162,97,0,232,231,253,198,7,1,233,186,253,187,63,5,185,17,0,180,3,205,21,195,187,83,5,185,17,0, 83,180,2,205,21,115,3,233,2,1,91,160,94,0,10,192,117,6,128,63,165,117,230,195,233,41,172,160,97,0,254,192,116,11,50,192,162, 97,0,162,96,0,233,205,229,139,30,233,4,246,135,49,0,129,117,234,232,59,0,232,31,1,235,226,83,187,97,0,56,39,117,13,139,30, 233,4,246,135,49,0,129,91,117,1,195,233,233,171,180,255,232,227,255,88,80,134,196,232,3,0,233,77,253,232,38,0,136,7,254,193, 116,11,232,93,253,136,15,195,232,87,253,138,15,187,83,5,181,0,254,201,65,136,15,180,3,205,21,232,68,253,198,7,1,195,232,61, 253,138,15,181,0,187,83,5,3,217,195,180,1,232,158,255,232,3,0,233,20,253,160,80,5,44,1,115,1,195,187,81,5,138,7,198,7,0,10, 192,116,1,195,232,10,0,115,7,198,6,80,5,0,10,192,195,232,195,255,138,7,254,193,232,252,252,136,15,232,239,252,58,15,116,3, 10,192,195,128,63,0,117,221,80,232,2,0,88,195,187,83,5,185,0,1,180,2,205,21,114,21,160,83,5,232,203,252,136,7,232,206,252, 198,7,1,254,200,249,116,1,248,195,128,252,4,117,5,178,24,233,111,171,233,37,171,160,80,5,44,1,26,192,233,147,8,136,14,81, 5,233,90,233,198,6,95,0,0,83,137,30,77,5,139,22,80,3,137,22,75,5,139,14,4,7,43,203,137,14,73,5,81,82,232,164,254,90,89,91, 160,96,0,10,192,6,116,2,142,194,180,3,205,21,7,232,137,0,186,5,0,185,0,0,73,117,253,74,117,250,232,118,0,195,190,83,5,139, 140,10,0,160,96,0,10,192,156,81,117,13,80,83,81,86,3,217,232,22,230,94,89,91,88,60,1,117,4,139,156,14,0,6,10,192,116,14,139, 148,12,0,254,200,116,4,139,22,80,3,142,194,180,2,205,21,7,114,18,89,157,117,11,139,30,48,0,3,217,67,137,30,88,3,233,128,229, 80,232,5,208,88,128,252,4,117,5,178,24,233,181,170,233,107,170,75,232,243,177,117,5,160,100,0,235,3,232,232,193,10,192,117, 4,176,1,235,2,176,0,162,100,0,138,224,205,21,195,205,219,249,235,1,248,139,243,156,139,14,165,4,138,195,50,193,162,167,4, 138,199,50,228,138,221,50,255,157,115,7,3,195,45,1,1,235,2,43,195,10,228,120,13,61,128,0,114,21,139,222,131,196,2,233,93, 23,5,128,0,121,11,139,222,131,196,2,233,223,29,5,128,0,162,166,4,187,165,4,128,15,128,139,222,50,255,128,203,128,195,198, 6,57,3,128,232,198,217,83,139,218,232,234,6,232,4,197,137,30,94,4,177,32,232,27,207,91,232,96,177,116,23,232,49,208,40,232, 167,217,82,138,7,60,44,117,5,232,76,177,235,241,232,30,208,41,137,30,59,3,14,184,233,93,80,255,54,80,3,255,54,94,4,203,139, 30,59,3,195,83,232,14,5,60,108,116,10,60,76,116,6,60,113,116,2,60,81,91,195,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38, 38,38,38,38,38,38,38,38,38,38,37,37,37,36,36,36,35,35,35,34,34,34,34,33,33,33,32,32,32,31,31,31,31,30,30,30,29,29,29,29,28, 28,28,27,27,27,26,26,26,25,25,25,25,24,24,24,23,23,23,23,22,22,22,22,21,21,21,20,20,20,19,19,19,19,18,18,18,17,17,17,16,16, 16,16,15,15,15,14,14,14,13,13,13,13,12,12,12,11,11,11,10,10,10,10,9,9,9,8,8,8,7,7,7,6,6,6,6,5,5,5,4,4,4,3,3,3,3,2,2,2,1,1, 1,0,0,0,0,255,255,255,254,254,254,253,253,253,253,252,252,252,251,251,251,250,250,250,250,249,249,249,248,248,248,247,247, 247,247,246,246,246,245,245,245,244,244,244,244,243,243,243,242,242,242,241,241,241,241,240,240,240,239,239,239,238,238,238, 238,237,237,237,236,236,236,235,235,235,235,234,234,234,233,233,233,232,232,232,231,231,231,231,230,230,230,229,229,229,228, 228,228,228,227,227,227,226,226,226,225,225,225,225,224,35,199,83,237,220,199,89,2,118,92,84,20,234,28,8,6,147,115,105,153, 36,36,42,9,120,208,195,191,45,173,84,12,75,98,218,151,60,236,4,16,222,250,208,189,75,39,38,19,149,57,69,173,30,177,79,22, 253,67,75,44,179,206,1,26,253,20,94,247,95,66,34,29,60,154,53,245,247,210,74,32,203,0,131,242,181,135,125,35,127,224,145, 183,209,116,30,39,158,88,118,37,6,18,70,42,198,238,211,174,135,150,119,45,60,117,68,205,20,190,26,49,139,146,149,0,154,109, 65,52,45,247,186,128,0,201,113,55,124,218,116,80,160,29,23,59,27,17,146,100,8,229,60,62,98,149,182,125,74,30,108,65,94,29, 146,142,238,146,19,69,181,164,54,50,170,119,56,72,226,77,196,190,148,149,102,75,173,176,58,247,124,29,16,79,217,92,9,53,220, 36,52,82,15,180,75,66,19,46,97,85,137,80,111,9,204,188,12,89,172,36,203,11,255,235,47,92,214,237,189,206,254,230,91,95,166, 180,54,65,95,112,9,99,207,97,132,17,119,204,43,102,67,122,229,213,148,191,86,105,106,108,175,5,189,55,6,109,133,71,27,71, 172,197,39,112,102,25,226,88,23,183,81,115,224,79,141,151,110,18,3,119,216,163,112,61,10,215,35,122,205,204,204,204,204,204, 76,125,0,0,0,0,0,0,0,129,0,0,0,0,0,0,32,132,0,0,0,0,0,0,72,135,0,0,0,0,0,0,122,138,0,0,0,0,0,64,28,142,0,0,0,0,0,80,67,145, 0,0,0,0,0,36,116,148,0,0,0,0,128,150,24,152,0,0,0,0,32,188,62,155,0,0,0,0,40,107,110,158,0,0,0,0,249,2,21,162,0,0,0,64,183, 67,58,165,0,0,0,16,165,212,104,168,0,0,0,42,231,132,17,172,0,0,128,244,32,230,53,175,0,0,160,49,169,95,99,178,0,0,4,191,201, 27,14,182,0,0,197,46,188,162,49,185,0,64,118,58,107,11,94,188,0,232,137,4,35,199,10,192,0,98,172,197,235,120,45,195,128,122, 23,183,38,215,88,198,144,172,110,50,120,134,7,202,181,87,10,63,22,104,41,205,162,237,204,206,27,194,83,208,133,20,64,97,81, 89,4,212,166,25,144,185,165,111,37,215,16,32,244,39,143,203,78,218,10,148,248,120,57,63,1,222,12,185,54,215,7,143,33,225, 79,103,4,205,201,242,73,228,35,129,69,64,124,111,124,231,182,112,43,168,173,197,29,235,228,76,54,18,25,55,69,238,28,224,195, 86,223,132,118,241,18,108,58,150,11,19,26,245,22,7,201,123,206,151,64,248,220,72,187,26,194,189,112,251,137,13,181,80,153, 118,22,255,0,0,0,0,0,0,0,128,241,4,53,128,4,154,247,25,131,36,99,67,131,117,205,141,132,169,127,131,130,4,0,0,0,129,226,176, 77,131,10,114,17,131,244,4,53,127,24,114,49,128,46,101,69,37,35,33,68,100,44,48,0,128,198,164,126,141,3,0,64,122,16,243,90, 0,0,160,114,78,24,9,0,0,16,165,212,232,0,0,0,232,118,72,23,0,0,0,228,11,84,2,0,0,0,202,154,59,0,0,0,0,225,245,5,0,0,0,128, 150,152,0,0,0,0,64,66,15,0,0,0,0,64,66,15,160,134,1,16,39,0,16,39,232,3,100,0,10,0,1,0,0,0,128,144,255,255,255,255,255,255, 127,255,255,255,255,255,255,255,255,255,59,170,56,129,7,124,136,89,116,224,151,38,119,196,29,30,122,94,80,99,124,26,254,117, 126,24,114,49,128,0,0,0,129,5,251,215,30,134,101,38,153,135,88,52,35,135,225,93,165,134,219,15,73,131,2,215,179,93,129,0, 0,128,129,4,98,53,131,126,80,36,76,126,121,169,170,127,0,0,0,129,11,68,78,110,131,249,34,126,253,67,3,195,158,38,1,0,0,48, 49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,186,59,170,187,56,129,232,114,10,160,166,4,60,136,114,10,128,38,165,4,128,116, 71,233,205,24,60,104,114,82,160,165,4,10,192,121,9,36,127,162,165,4,187,235,98,83,255,54,163,4,255,54,165,4,232,70,16,138, 226,128,196,129,116,27,80,50,228,232,212,17,88,91,90,80,232,150,4,187,23,98,232,123,18,91,51,210,138,218,233,32,10,131,196, 4,50,228,136,38,167,4,233,241,17,186,0,0,187,0,129,233,234,5,191,163,4,51,192,252,171,199,5,0,129,195,233,26,172,205,185, 128,54,165,4,128,128,54,177,4,128,233,138,3,205,186,135,217,233,90,4,205,187,135,217,233,71,4,205,188,232,51,25,233,27,5, 135,217,233,177,5,205,189,137,30,163,4,233,107,8,205,190,82,152,139,208,232,238,8,90,195,205,191,135,217,233,183,9,205,192, 135,217,233,237,13,129,251,0,128,117,19,205,193,232,211,8,51,210,187,128,144,232,5,4,232,75,26,233,69,8,247,219,83,3,218, 112,4,88,233,153,1,205,194,232,181,8,90,255,54,163,4,255,54,165,4,232,169,8,91,90,233,234,3,139,195,82,247,234,90,114,5,139, 216,233,118,1,205,195,83,232,145,8,90,255,54,163,4,255,54,165,4,232,133,8,91,90,233,82,9,11,219,117,12,136,54,167,4,198,6, 251,2,4,233,45,17,137,30,163,4,184,0,0,163,165,4,146,11,192,121,3,186,255,255,11,219,121,6,199,6,165,4,255,255,247,62,163, 4,139,216,233,42,1,135,217,232,215,24,135,217,195,83,232,69,26,91,131,195,4,195,139,22,163,4,139,14,165,4,195,156,83,232, 25,26,91,131,195,4,157,195,232,171,190,137,30,163,4,233,103,10,232,161,190,137,30,163,4,233,101,10,205,196,139,23,139,159, 2,0,233,77,3,94,255,54,163,4,255,54,165,4,255,230,205,197,135,217,232,160,24,135,217,195,232,100,23,116,3,233,147,163,195, 135,218,232,205,0,50,192,181,152,205,198,187,166,4,138,200,136,47,181,0,67,136,47,208,208,205,199,115,3,232,32,1,138,229, 138,217,233,51,16,232,146,254,83,51,219,137,30,163,4,183,129,137,30,165,4,198,6,251,2,4,232,4,20,91,198,6,251,2,4,195,139, 193,247,226,146,115,3,233,37,213,195,187,171,4,186,183,100,233,6,0,187,171,4,186,185,100,82,186,163,4,232,247,22,114,3,186, 159,4,195,138,205,50,237,235,8,135,218,160,251,2,152,139,200,252,139,242,139,251,243,164,139,214,139,223,195,232,54,200,139, 241,139,251,253,43,202,65,243,164,139,218,139,207,65,252,195,156,73,157,195,232,188,22,117,3,233,235,162,205,200,120,3,233, 131,22,161,163,4,11,192,116,6,176,1,121,2,176,255,195,51,192,11,219,117,243,195,91,195,152,139,216,198,6,251,2,2,137,30,163, 4,195,198,6,251,2,4,195,232,196,255,233,231,255,205,201,91,90,233,181,3,232,37,6,91,90,233,11,12,185,4,0,233,136,255,156, 138,23,67,157,156,138,55,67,139,15,67,157,156,67,157,195,83,187,40,7,232,6,22,91,185,182,38,81,232,181,255,50,192,205,202, 162,49,3,187,180,4,198,7,32,10,7,67,198,7,48,233,106,11,205,203,160,165,4,235,9,205,204,232,229,23,116,8,246,208,208,224, 26,192,116,61,195,205,205,128,54,167,4,128,51,219,246,221,139,195,27,194,139,208,138,195,26,193,138,200,195,232,3,22,120, 250,205,206,232,207,21,120,3,233,213,24,232,2,24,232,207,24,233,252,23,139,195,43,194,116,14,112,7,120,7,50,192,254,192,195, 120,249,249,26,192,195,59,218,117,5,51,219,233,38,0,139,194,137,30,163,4,11,219,199,6,165,4,0,0,121,6,199,6,165,4,255,255, 11,192,186,0,0,121,3,186,255,255,247,62,163,4,139,218,137,30,163,4,195,173,58,225,116,17,70,2,4,254,192,152,3,240,59,245, 117,239,139,214,233,57,210,58,6,251,2,117,233,58,44,117,229,70,138,208,172,58,6,142,0,116,4,2,194,235,220,10,192,116,16,152, 145,191,143,0,243,166,145,116,6,3,240,138,194,235,200,139,214,91,195,139,243,139,46,75,4,252,235,190,139,243,139,46,92,3, 252,233,13,0,173,58,225,116,17,70,172,152,3,240,173,3,240,59,238,117,239,139,222,233,83,211,58,6,251,2,117,233,58,44,117, 229,70,172,58,6,142,0,117,223,10,192,116,14,152,145,191,143,0,243,166,145,116,4,3,240,235,208,173,139,208,139,222,233,5,211, 232,24,22,195,161,165,4,10,228,116,245,128,54,165,4,128,205,215,176,0,162,158,4,162,170,4,160,178,4,10,192,116,226,161,165, 4,10,228,116,216,139,30,177,4,128,14,165,4,128,128,14,177,4,128,138,204,42,207,162,167,4,116,34,115,18,134,195,246,217,162, 167,4,136,62,166,4,80,81,232,111,21,89,88,128,249,56,115,95,83,248,232,33,21,160,167,4,91,50,195,187,158,4,190,170,4,185, 4,0,248,252,120,30,173,17,7,67,67,226,249,115,18,187,166,4,254,7,116,52,75,75,185,4,0,209,31,75,75,226,250,233,233,17,173, 25,7,67,67,226,249,115,26,246,151,1,0,185,4,0,75,75,247,23,226,250,185,4,0,255,7,117,6,67,67,226,248,116,200,233,244,12,233, 141,13,160,167,4,36,128,128,38,165,4,127,8,6,165,4,195,137,30,165,4,137,22,163,4,195,161,165,4,10,228,116,240,128,54,165, 4,128,10,255,116,239,161,165,4,10,228,116,224,51,201,139,54,163,4,162,167,4,138,204,42,207,115,13,246,217,134,223,137,30, 166,4,134,223,147,135,214,138,224,50,227,156,180,128,10,196,10,220,50,228,138,252,11,201,116,70,131,249,25,114,18,157,137, 54,163,4,138,38,167,4,37,127,128,10,196,162,165,4,195,128,249,8,114,28,138,226,138,214,138,243,50,219,128,233,8,246,196,31, 116,208,128,204,32,235,203,128,204,32,226,3,235,14,248,208,219,209,218,208,220,246,196,16,117,237,226,243,157,121,37,42,204, 138,225,27,242,139,214,26,195,138,216,115,47,246,22,167,4,246,212,247,210,246,211,254,196,117,33,66,117,30,254,195,117,26, 235,6,3,214,18,216,115,12,254,6,166,4,116,9,208,219,209,218,208,220,233,36,17,233,169,12,233,104,12,232,37,19,195,160,177, 4,162,167,4,233,167,12,246,6,166,4,255,116,240,246,6,178,4,255,116,229,139,30,177,4,232,243,244,137,30,177,4,187,164,4,248, 232,161,19,187,176,4,248,232,154,19,255,54,166,4,232,94,21,143,6,166,4,185,64,0,81,235,8,81,248,187,170,4,232,119,19,139, 252,131,236,8,131,239,2,190,176,4,185,4,0,253,243,165,190,120,4,185,4,0,187,170,4,248,252,173,25,7,67,67,226,249,115,16,185, 4,0,139,244,191,170,4,252,243,165,139,230,248,235,4,131,196,8,249,187,158,4,232,56,19,89,226,182,246,6,165,4,128,116,9,255, 6,166,4,117,9,233,7,12,187,158,4,232,31,19,233,49,16,232,148,18,117,7,136,30,167,4,233,0,12,10,255,117,3,233,122,18,232,87, 244,139,250,51,210,138,254,139,243,138,223,185,32,0,85,139,46,163,4,160,165,4,138,231,235,5,248,209,215,209,214,86,87,43, 253,27,240,115,4,95,94,235,4,131,196,4,248,245,209,210,209,211,226,228,11,219,121,10,254,6,166,4,117,8,93,233,165,11,209, 210,209,211,138,226,138,214,138,243,138,223,93,233,13,16,19,249,83,87,81,44,48,80,232,80,18,88,152,121,30,139,30,163,4,129, 251,205,12,115,25,139,203,209,227,209,227,3,217,209,227,3,216,120,11,137,30,163,4,235,72,80,114,8,235,51,80,232,36,2,235, 20,199,6,124,4,0,36,199,6,126,4,116,148,187,126,4,232,131,19,121,22,232,60,18,90,255,54,163,4,255,54,165,4,232,139,2,91,90, 232,204,253,235,19,232,231,1,232,35,18,232,238,18,90,232,119,2,232,218,1,232,238,252,89,95,91,195,205,217,50,192,233,9,0, 205,218,176,1,198,6,251,2,8,198,6,168,4,1,190,180,37,86,51,255,139,207,139,247,247,209,80,232,134,17,88,10,192,117,5,198, 6,251,2,2,138,7,60,38,117,3,233,7,176,60,45,156,116,5,60,43,116,1,75,232,251,248,115,6,232,61,255,233,245,255,189,163,97, 51,210,139,242,46,58,134,0,0,116,10,129,253,156,97,116,36,77,233,239,255,129,237,156,97,209,229,46,255,166,48,106,75,106, 95,106,95,106,103,106,109,106,115,106,64,106,64,106,50,192,232,156,0,232,65,0,233,45,0,65,117,247,232,81,17,121,175,81,83, 87,232,72,1,95,91,89,233,163,255,232,140,243,116,225,233,219,255,232,221,0,233,11,0,232,188,0,233,5,0,50,192,232,182,0,157, 117,13,232,45,19,232,33,17,122,5,83,232,237,18,91,195,11,246,121,2,247,218,43,215,112,75,116,72,120,8,131,250,39,114,29,233, 61,10,82,131,194,38,90,121,19,82,186,176,106,82,186,2,95,235,18,90,131,194,38,131,250,218,120,37,185,3,0,211,226,129,194, 50,96,135,218,82,232,218,16,114,8,232,187,17,232,133,1,235,10,121,5,83,232,201,0,91,232,5,17,91,195,233,138,16,159,128,62, 251,2,8,117,4,158,233,8,0,158,83,87,232,92,0,95,91,51,246,139,214,232,4,248,114,19,60,45,117,4,247,214,235,5,60,43,116,1, 195,232,242,247,114,1,195,129,250,204,12,114,5,186,255,127,235,239,80,184,10,0,247,226,90,128,234,48,50,246,3,208,235,223, 12,1,156,83,87,232,78,0,95,91,51,246,139,214,232,76,255,157,117,5,83,232,13,0,91,67,195,232,88,16,120,249,233,111,156,116, 49,232,78,16,123,86,117,3,233,123,156,205,207,121,5,232,63,0,235,72,176,4,162,251,2,138,30,165,4,136,30,167,4,139,22,163, 4,138,38,162,4,128,204,64,128,203,128,233,213,13,232,29,16,115,37,117,3,233,74,156,205,208,121,3,232,14,0,176,8,162,251,2, 51,192,163,159,4,163,161,4,195,82,86,139,22,163,4,232,131,0,94,90,195,232,242,15,121,5,139,30,163,4,195,205,209,117,3,233, 24,156,160,166,4,60,144,114,49,116,3,233,6,156,160,165,4,10,192,120,3,233,252,155,186,0,0,187,0,128,232,138,251,232,203,6, 232,205,17,186,0,0,187,128,144,232,236,16,116,3,233,223,155,187,0,128,235,45,160,165,4,10,192,156,121,5,36,127,162,165,4, 186,0,0,187,0,128,232,103,251,160,166,4,60,144,117,6,157,120,219,233,183,155,232,231,6,139,218,157,121,2,247,219,137,30,163, 4,198,6,251,2,2,195,51,219,50,228,190,167,4,198,132,255,255,144,198,4,0,11,210,121,5,247,218,198,4,128,138,222,138,242,138, 215,198,6,251,2,4,233,75,8,205,214,160,166,4,10,192,116,10,160,178,4,10,192,117,4,233,248,14,195,139,30,177,4,232,218,240, 255,54,166,4,137,30,177,4,232,86,17,139,240,163,166,4,187,120,4,163,178,4,189,171,4,139,0,11,192,116,44,191,0,0,139,207,139, 0,247,35,83,139,222,3,223,129,195,151,4,3,7,115,1,66,3,193,115,1,66,137,7,139,202,91,131,255,6,116,4,71,71,235,219,139,193, 83,187,159,4,137,0,91,131,254,6,116,4,70,70,235,190,190,157,4,253,185,7,0,172,10,192,225,251,116,5,128,14,158,4,32,160,165, 4,10,192,143,6,166,4,120,15,187,158,4,185,4,0,209,23,67,67,226,250,233,25,12,254,6,166,4,117,247,233,221,7,232,115,14,116, 4,10,255,117,3,233,96,14,232,58,240,139,14,165,4,50,237,161,163,4,138,253,83,81,82,81,80,247,226,139,202,88,247,227,3,200, 115,1,66,139,218,90,88,247,226,3,200,115,1,66,3,218,90,88,246,226,3,216,115,13,209,219,209,217,254,6,166,4,117,3,233,144, 7,10,255,121,9,254,6,166,4,117,7,233,131,7,209,209,209,211,138,213,138,243,138,223,138,225,233,236,11,195,83,176,8,114,2, 176,17,138,232,138,200,81,156,232,72,2,10,192,116,2,121,12,157,89,80,123,11,4,16,88,121,26,235,9,157,89,235,38,4,7,88,121, 15,80,232,246,11,88,138,224,2,225,126,22,2,232,235,12,2,197,254,197,58,232,181,3,114,12,138,232,254,197,176,2,235,4,2,197, 181,3,254,200,254,200,91,80,156,50,201,232,77,0,198,7,48,117,1,67,232,232,0,75,128,63,48,116,250,128,63,46,116,1,67,157,88, 116,43,156,80,232,191,13,180,69,123,2,180,68,136,39,67,88,157,198,7,43,121,5,198,7,45,246,216,180,47,254,196,44,10,115,250, 4,58,67,134,196,137,7,67,67,198,7,0,135,217,187,180,4,195,254,205,121,22,137,30,82,3,198,7,46,67,198,7,48,254,197,117,248, 67,51,201,235,26,254,205,117,12,198,7,46,137,30,82,3,67,51,201,235,10,254,201,117,6,198,7,44,67,177,3,137,14,129,4,195,180, 5,189,245,97,232,217,255,46,139,150,0,0,69,69,139,54,163,4,176,47,254,192,43,242,115,250,3,242,136,7,67,137,54,163,4,254, 204,117,221,232,182,255,198,7,0,195,185,1,3,190,6,0,235,6,185,4,4,190,4,0,191,179,4,252,187,116,98,139,22,163,4,86,138,198, 50,228,211,224,134,224,46,215,170,211,226,138,205,78,117,238,198,5,0,187,179,4,89,254,201,128,63,48,117,3,67,226,248,195, 232,233,12,123,119,81,83,190,159,4,191,171,4,185,4,0,252,243,165,232,117,3,83,187,177,4,232,253,13,91,190,171,4,191,159,4, 185,4,0,252,243,165,116,3,232,206,12,138,14,166,4,128,233,184,246,217,248,232,90,3,91,89,190,166,97,176,9,232,46,255,80,176, 47,80,88,254,192,80,232,148,0,115,247,232,163,0,88,60,58,117,9,198,7,49,67,198,7,48,235,2,136,7,67,88,254,200,117,215,81, 190,159,4,191,163,4,185,2,0,252,243,165,89,235,41,83,81,232,24,15,232,113,3,90,91,232,153,13,116,11,137,30,165,4,137,22,163, 4,232,115,12,176,1,232,178,3,137,30,165,4,137,22,163,4,89,91,176,3,186,236,97,232,199,254,80,83,82,232,94,13,93,176,47,80, 88,254,192,80,232,23,14,115,247,46,3,150,0,0,46,18,158,2,0,69,69,69,232,56,13,88,135,213,91,136,7,67,88,254,200,117,206,66, 66,139,234,180,4,233,179,254,81,86,185,7,0,191,159,4,248,252,46,172,24,5,71,226,249,94,89,195,81,185,7,0,191,159,4,248,252, 46,172,16,5,71,226,249,89,195,83,81,51,255,87,187,2,94,160,166,4,46,215,10,192,116,35,95,152,43,248,87,139,216,209,227,209, 227,209,227,129,195,50,96,232,188,11,115,5,232,246,11,235,217,232,152,12,232,98,252,235,209,187,102,96,232,113,12,232,22, 13,115,6,232,207,11,95,79,87,232,153,11,114,14,187,122,96,232,119,12,232,65,252,88,44,9,235,1,88,89,91,10,192,195,187,180, 4,138,47,177,32,138,38,131,4,246,196,32,116,13,58,233,177,42,117,7,246,196,4,117,2,138,233,136,15,232,191,242,116,50,189, 165,97,46,58,134,0,0,116,9,129,253,156,97,116,38,77,235,240,129,237,156,97,209,229,46,255,166,97,112,117,112,117,112,121, 112,121,112,121,112,121,112,117,112,121,112,60,112,60,112,75,198,7,48,138,38,131,4,246,196,16,116,4,75,198,7,36,246,196,4, 117,5,75,136,47,50,237,195,10,192,235,6,198,7,48,67,254,200,117,248,195,232,137,253,198,7,48,67,254,200,117,245,195,187,180, 4,198,7,32,83,232,193,10,91,156,121,10,198,7,45,83,232,236,12,91,12,1,67,198,7,48,157,195,205,216,232,221,255,117,8,67,198, 7,0,187,180,4,195,232,200,10,121,18,185,0,7,51,192,163,131,4,137,14,129,4,232,94,253,233,49,255,233,120,252,232,129,10,121, 3,233,96,159,117,1,195,160,166,4,208,232,80,198,6,166,4,64,208,22,166,4,187,171,4,232,9,13,185,4,0,81,232,55,13,139,22,171, 4,139,30,173,4,232,187,247,90,91,232,75,246,254,14,166,4,89,116,10,226,227,88,4,192,0,6,166,4,195,233,47,10,191,190,37,87, 191,168,4,198,5,1,232,44,10,117,3,233,54,241,121,7,10,255,117,10,233,147,3,10,255,117,3,233,13,10,10,219,121,36,128,255,153, 114,3,233,239,158,82,83,255,54,163,4,255,54,165,4,232,52,1,91,90,232,92,11,232,63,11,91,90,116,3,233,211,158,160,165,4,10, 192,121,9,191,195,113,87,36,127,162,165,4,83,82,128,203,127,156,255,54,165,4,255,54,163,4,232,4,1,90,91,232,44,11,117,30, 82,83,186,0,0,187,0,144,232,31,11,91,90,121,15,157,90,91,233,60,0,186,0,0,187,0,129,233,18,247,157,121,14,83,82,232,47,1, 138,194,232,197,2,90,91,208,216,143,6,163,4,143,6,165,4,159,128,38,165,4,127,158,115,4,191,176,125,87,83,82,232,21,1,90,91, 232,3,251,233,133,240,83,82,232,255,0,137,22,178,4,199,6,163,4,0,0,199,6,165,4,0,129,209,46,178,4,115,7,90,91,83,82,232,222, 250,247,6,178,4,255,255,116,21,90,91,232,33,12,232,141,10,232,203,250,90,91,232,22,12,232,130,10,235,214,90,91,195,138,14, 166,4,128,233,184,115,57,246,217,156,187,164,4,138,135,1,0,136,135,3,0,10,192,156,12,128,136,135,1,0,198,135,2,0,184,157, 156,121,3,232,34,0,50,237,232,18,0,157,121,3,232,38,0,198,6,158,4,0,157,115,3,233,189,1,195,81,83,248,232,122,9,91,89,226, 246,195,83,187,159,4,131,47,1,115,4,67,67,235,247,91,195,83,187,159,4,254,7,117,3,67,235,249,91,195,138,14,166,4,128,233, 152,115,65,246,217,156,139,22,163,4,139,30,165,4,10,219,156,136,30,167,4,198,6,166,4,152,128,203,128,157,156,121,6,131,234, 1,128,219,0,50,237,10,201,116,6,208,235,209,218,226,250,157,159,121,5,66,117,2,254,195,157,115,5,50,228,233,169,1,158,121, 10,247,210,246,211,131,194,1,128,211,0,195,177,152,42,14,166,4,248,235,170,232,102,8,126,81,186,0,0,187,0,129,232,190,9,117, 9,137,22,163,4,137,22,165,4,195,160,166,4,44,128,152,80,198,6,166,4,128,232,27,11,187,118,97,232,24,2,90,91,232,16,11,232, 124,9,187,135,97,232,10,2,90,91,232,145,245,90,232,254,10,232,217,248,90,91,232,26,244,187,49,128,186,24,114,233,157,249, 233,244,156,233,92,148,159,134,224,80,176,1,235,2,50,192,162,85,4,88,134,196,158,186,0,0,137,30,83,4,116,3,232,233,195,137, 30,59,3,232,172,147,117,215,139,227,139,54,83,4,57,55,117,205,82,138,167,2,0,80,82,131,195,4,246,135,255,255,128,120,65,185, 2,0,252,139,243,191,163,4,243,165,91,86,83,246,6,85,4,255,117,15,190,86,4,131,239,4,185,2,0,243,165,50,192,116,3,232,75,240, 95,190,163,4,185,2,0,252,243,165,94,139,20,139,140,2,0,131,198,4,86,232,73,240,235,39,131,195,4,139,15,67,67,94,139,20,246, 6,85,4,255,117,6,139,22,86,4,235,4,3,209,112,53,137,20,82,139,23,67,67,88,83,232,165,241,91,89,42,197,232,31,241,116,11,137, 22,46,0,139,209,135,211,233,124,154,139,227,137,30,69,3,139,30,59,3,128,63,44,117,9,232,230,154,232,66,255,233,147,147,233, 168,154,81,83,86,87,82,178,56,187,158,4,191,165,4,190,166,4,235,25,83,185,4,0,248,209,23,67,67,226,250,91,246,7,64,117,41, 254,12,116,42,254,202,116,38,246,5,255,120,33,117,224,128,44,8,118,26,128,234,8,118,21,190,164,4,185,7,0,253,243,164,128, 38,158,4,32,235,190,128,15,32,235,210,90,95,94,91,89,118,3,233,116,4,233,192,6,138,62,166,4,185,3,0,10,219,120,44,117,18, 128,239,8,114,29,138,222,138,242,138,212,128,228,32,226,234,116,16,248,208,212,209,210,208,211,246,196,64,117,7,254,207,117, 216,233,155,6,128,204,32,235,244,136,62,166,4,233,120,4,83,232,2,0,91,195,232,45,0,187,10,4,235,12,83,232,2,0,91,195,232, 31,0,187,99,4,128,62,168,4,1,120,7,117,18,198,6,168,4,2,232,129,175,176,13,232,137,175,176,10,232,132,175,195,252,10,255, 190,3,98,116,10,246,6,167,4,128,121,3,190,11,98,232,123,6,114,8,191,159,4,185,4,0,235,9,131,198,4,191,163,4,185,2,0,46,165, 226,252,195,232,13,9,83,232,129,7,232,182,247,91,232,5,0,90,91,233,173,247,46,138,7,152,232,246,8,80,67,46,139,7,163,163, 4,131,195,2,46,139,7,163,165,4,131,195,2,88,90,89,72,116,28,81,82,80,83,135,217,232,131,247,91,83,46,139,23,46,139,159,2, 0,232,234,241,91,131,195,4,235,222,195,83,208,232,115,3,233,9,1,187,178,96,232,214,6,232,47,7,114,9,91,232,35,251,75,198, 7,37,195,232,243,5,181,16,115,2,181,7,232,189,5,116,3,232,4,250,91,120,63,138,208,2,197,42,6,130,4,121,5,246,216,232,194, 250,50,201,232,177,0,255,54,129,4,82,232,218,248,90,143,6,129,4,255,54,129,4,50,192,10,194,116,6,232,179,250,232,57,248,143, 6,129,4,255,54,129,4,160,129,4,233,114,2,138,208,160,129,4,10,192,116,2,254,200,138,240,2,194,138,200,120,4,50,192,138,200, 121,17,80,81,82,83,232,169,5,91,90,89,88,254,192,120,241,138,225,138,194,42,193,2,197,121,23,160,130,4,232,90,250,198,7,46, 67,50,201,50,192,42,194,42,197,232,75,250,235,22,160,130,4,82,255,54,129,4,42,197,42,194,2,193,120,3,232,54,250,232,39,0, 255,54,129,4,232,81,248,160,130,4,143,6,129,4,10,192,88,90,117,7,139,30,82,3,233,103,1,2,194,254,200,120,3,232,15,250,233, 91,1,138,197,2,194,42,193,254,192,138,232,44,3,127,252,4,3,138,200,160,131,4,36,64,117,2,138,200,195,232,254,4,180,7,114, 2,180,16,232,200,4,91,249,116,9,83,80,232,11,249,90,91,138,230,156,80,139,22,129,4,10,246,156,10,210,116,2,254,202,2,242, 157,116,9,246,6,131,4,4,117,2,254,206,42,244,138,230,80,120,3,233,78,0,83,80,80,232,225,4,88,254,196,117,247,232,191,4,232, 142,7,88,80,185,3,0,210,228,232,166,4,114,16,138,196,152,187,178,96,3,216,232,107,5,232,85,6,235,14,187,110,96,138,196,152, 3,216,232,83,5,232,248,5,88,91,120,17,88,89,254,193,81,80,83,80,232,157,4,88,91,235,2,50,228,246,220,160,130,4,2,224,254, 196,10,192,116,9,246,6,131,4,4,117,2,254,204,138,236,50,201,88,255,54,129,4,80,136,46,130,4,232,94,247,88,10,228,126,5,138, 196,232,63,249,88,163,129,4,10,192,117,12,75,138,7,60,46,116,1,67,137,30,82,3,88,157,114,21,2,196,138,38,130,4,42,196,10, 228,116,9,246,6,131,4,4,117,2,254,192,10,192,232,74,246,139,217,233,71,0,138,224,246,196,64,180,3,117,2,50,228,163,131,4, 137,14,129,4,138,224,187,180,4,198,7,32,246,196,8,116,3,198,7,43,83,232,182,3,91,121,8,198,7,45,83,232,226,5,91,67,198,7, 48,232,209,3,161,131,4,139,14,129,4,120,3,233,179,253,233,104,0,83,232,59,248,91,116,3,136,47,67,198,7,0,187,179,4,67,139, 62,82,3,139,22,129,4,160,130,4,50,228,43,251,43,248,116,67,138,7,60,32,116,230,60,42,116,226,180,1,75,83,80,232,234,234,50, 228,60,45,116,246,60,43,116,242,60,36,116,238,60,48,117,22,67,232,212,234,115,16,75,235,3,75,136,7,88,10,228,116,248,131, 196,2,235,179,88,10,228,116,251,91,198,7,37,195,161,131,4,138,204,181,6,208,232,139,22,129,4,115,11,83,82,232,69,243,50,192, 90,233,63,254,138,198,44,5,120,3,232,38,248,82,232,218,245,88,80,10,192,117,1,75,254,200,120,6,232,20,248,198,7,0,143,6,129, 4,233,89,255,232,235,2,116,109,121,12,161,163,4,163,11,0,160,165,4,162,13,0,161,11,0,46,247,38,107,98,139,248,138,202,160, 109,98,50,228,247,38,11,0,2,200,50,228,160,13,0,46,247,38,107,98,2,200,50,228,46,139,22,110,98,3,215,46,138,30,111,98,18, 217,136,38,167,4,176,128,162,166,4,137,22,11,0,136,30,13,0,176,4,162,251,2,233,184,251,187,179,4,185,32,0,3,7,67,67,226,250, 36,254,163,11,0,235,161,139,22,11,0,138,30,13,0,51,192,176,128,162,166,4,136,38,167,4,233,143,251,83,81,187,158,4,129,7,128, 0,185,3,0,115,14,67,67,255,7,117,8,226,248,254,6,166,4,209,31,89,116,32,246,6,158,4,255,117,5,128,38,159,4,254,187,165,4, 138,7,138,167,2,0,36,127,128,228,128,10,224,136,39,91,195,131,196,4,233,136,251,128,228,224,128,196,128,115,28,156,66,117, 18,157,254,195,117,19,249,208,219,254,6,166,4,117,10,88,233,106,251,157,117,3,128,226,254,86,190,163,4,137,20,70,70,138,62, 167,4,129,227,127,128,10,223,136,28,94,195,139,241,232,180,4,139,206,81,232,9,2,114,9,128,62,166,4,184,121,15,235,7,128,62, 166,4,152,121,6,232,0,2,232,207,4,187,134,4,232,81,4,89,81,191,142,4,187,134,4,232,53,4,187,134,4,232,93,4,232,253,1,232, 178,4,187,134,4,232,52,4,232,251,1,187,148,4,232,197,1,115,3,131,235,4,232,87,4,89,117,4,254,193,235,204,139,233,232,117, 4,139,205,195,128,38,165,4,127,232,143,0,186,219,15,187,73,131,232,250,242,186,219,15,187,73,129,232,101,237,161,165,4,128, 252,119,115,1,195,10,192,121,9,36,127,162,165,4,184,176,125,80,232,100,0,160,166,4,60,116,115,9,186,219,15,187,73,131,233, 200,242,51,210,187,128,127,128,227,127,232,150,2,120,42,128,203,128,232,41,237,232,40,1,156,120,16,51,210,187,128,128,232, 27,237,232,26,1,120,3,232,80,3,51,210,187,0,127,232,11,237,157,120,3,232,66,3,187,165,4,50,192,10,7,156,121,3,128,55,128, 187,52,98,232,190,250,157,121,6,187,165,4,128,55,128,195,187,99,98,232,247,1,232,255,240,232,190,241,232,173,3,232,164,247, 232,0,2,232,195,3,232,246,235,232,7,3,232,184,240,195,255,54,165,4,255,54,163,4,232,86,255,90,91,255,54,163,4,255,54,165, 4,232,249,1,232,44,255,91,90,233,17,238,161,165,4,10,192,121,9,191,176,125,87,36,127,162,165,4,128,252,129,114,12,191,57, 123,87,51,210,187,0,129,232,240,237,186,162,48,187,9,127,232,225,1,120,58,191,66,123,87,255,54,163,4,255,54,165,4,186,215, 179,187,93,129,232,101,236,91,90,255,54,163,4,255,54,165,4,232,163,1,187,73,98,232,49,250,91,90,255,54,163,4,255,54,165,4, 232,144,1,91,90,232,171,237,187,82,98,233,6,250,186,219,15,187,73,129,233,37,236,186,146,10,187,6,128,233,40,236,232,87,176, 60,13,117,3,232,35,177,46,138,7,67,10,192,117,238,195,191,159,4,185,4,0,184,0,0,252,243,171,195,184,0,0,163,163,4,163,165, 4,195,232,42,0,121,14,161,163,4,11,192,116,32,176,1,121,28,246,216,195,205,212,160,166,4,10,192,116,16,160,165,4,10,192,116, 7,176,1,121,5,246,216,195,12,1,195,160,251,2,60,8,254,200,254,200,254,200,195,232,241,255,114,12,83,187,106,97,232,206,0, 232,237,234,91,195,51,210,187,0,128,232,172,235,195,232,215,255,187,42,96,114,17,235,8,232,205,255,187,58,96,114,7,232,171, 0,232,117,240,195,255,54,165,4,255,54,163,4,198,6,251,2,8,232,156,0,232,112,239,90,91,232,6,241,195,185,4,0,209,23,67,67, 226,250,195,185,4,0,209,31,75,75,226,250,195,128,143,2,0,32,226,1,195,187,176,4,128,249,8,114,38,81,185,7,0,187,170,4,138, 39,138,135,1,0,136,7,67,226,247,50,192,136,7,89,128,233,8,128,228,32,116,217,8,38,170,4,233,210,255,10,201,116,15,81,248, 232,183,255,89,246,135,2,0,16,117,185,226,191,195,190,159,4,191,171,4,252,185,4,0,139,5,165,137,132,254,255,226,247,195,191, 124,4,185,2,0,235,6,191,120,4,185,4,0,252,46,139,7,171,67,67,226,248,139,223,75,75,195,191,171,4,235,234,191,159,4,235,229, 191,171,4,185,4,0,135,222,252,243,165,135,222,195,81,83,87,187,159,4,191,171,4,185,4,0,232,233,255,95,91,89,195,81,83,87, 187,171,4,191,159,4,235,235,137,22,163,4,137,30,165,4,195,139,22,163,4,139,30,165,4,195,232,207,254,114,63,233,137,0,83,87, 138,195,50,6,165,4,120,63,10,219,120,22,161,165,4,43,195,114,66,117,58,161,163,4,43,194,114,57,117,49,50,192,235,95,139,195, 43,6,165,4,114,43,117,35,139,194,43,6,163,4,114,33,117,25,50,192,235,71,83,87,191,165,4,139,7,50,6,165,4,121,19,138,38,165, 4,10,228,120,6,176,1,10,192,235,44,176,255,249,235,39,81,185,2,0,135,222,160,165,4,10,192,121,2,135,247,253,167,117,6,226, 251,176,0,235,13,115,6,176,1,10,192,235,5,176,255,10,192,249,89,95,91,195,187,177,4,83,87,191,165,4,138,5,50,7,121,2,235, 179,81,185,4,0,235,196,187,255,97,232,242,254,232,151,255,117,11,198,6,251,2,2,199,6,163,4,0,128,195,46,43,150,0,0,46,26, 158,2,0,195,232,9,254,120,8,160,165,4,10,192,120,14,195,161,163,4,11,192,120,17,195,232,244,253,120,8,205,210,128,54,165, 4,128,195,161,163,4,61,0,128,117,10,205,211,83,232,219,237,91,233,230,255,247,30,163,4,195,187,121,4,232,51,0,191,151,4,185, 8,0,184,0,0,252,243,171,162,120,4,162,170,4,195,232,183,253,114,3,233,162,254,139,23,139,159,2,0,195,185,4,0,232,165,253, 114,3,233,150,254,185,2,0,233,144,254,185,4,0,135,251,187,159,4,232,143,253,114,3,233,128,254,135,223,185,2,0,191,163,4,135, 251,233,115,254,185,4,0,191,159,4,232,116,253,114,3,233,101,254,185,2,0,191,163,4,233,92,254,232,99,253,114,3,233,29,255, 233,205,254,232,88,253,185,4,0,115,3,185,2,0,93,191,165,4,255,53,79,79,226,250,85,195,191,171,4,185,4,0,235,17,232,57,253, 191,159,4,185,4,0,115,6,191,163,4,185,2,0,88,143,5,71,71,226,250,80,195,232,31,253,121,1,195,205,213,114,3,233,180,243,233, 27,244,0,0,250,186,96,0,142,218,142,194,142,210,50,192,162,100,4,181,145,187,0,0,186,154,6,139,242,46,172,136,7,67,66,254, 205,117,244,188,14,7,205,18,250,187,64,0,247,227,140,219,43,195,187,0,0,246,196,240,117,6,177,4,211,224,139,216,75,137,30, 44,0,139,227,233,34,205,176,44,162,246,1,187,183,0,198,7,58,50,192,162,249,2,162,6,0,162,107,4,162,101,4,162,40,0,187,14, 3,137,30,12,3,187,122,3,137,30,226,3,139,30,44,0,75,137,30,10,3,75,83,187,14,7,176,4,162,223,4,83,137,30,224,4,160,223,4, 254,192,2,192,138,208,182,0,3,218,90,135,218,139,30,224,4,136,23,67,136,55,67,160,223,4,185,52,0,10,192,116,14,135,218,3, 217,135,218,137,23,67,67,254,200,117,242,135,218,3,217,67,83,254,200,162,54,5,139,30,224,4,139,23,187,51,0,3,218,137,30,228, 4,91,67,137,30,48,0,137,30,69,3,90,138,194,36,254,138,208,138,194,42,195,138,216,138,198,26,199,138,248,115,3,233,104,173, 177,3,211,235,138,199,60,2,114,3,187,0,2,138,194,42,195,138,216,138,198,26,199,138,248,115,3,233,74,173,137,30,10,3,135,218, 137,30,44,0,137,30,47,3,139,227,137,30,69,3,139,30,48,0,135,218,232,61,173,43,218,75,75,83,91,232,128,229,187,220,127,232, 127,251,232,152,172,233,143,195,32,66,121,116,101,115,32,102,114,101,101,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0]
[233,143,126,232,167,107,203,232,2,101,203,93,232,199,47,116,13,139,54,233,4,138,68,46,60,254,116,2,60,253,195,0,0,0,0,0,0, 51,46,148,13,104,115,91,17,89,21,102,55,62,22,143,17,237,16,182,16,248,18,12,46,206,16,53,17,95,17,45,46,72,19,80,47,53,31, 27,45,254,17,88,30,240,27,145,34,133,46,190,7,190,7,83,30,67,19,46,31,0,0,138,30,95,17,156,46,157,46,163,46,243,46,223,54, 169,18,88,18,57,34,184,18,216,34,251,15,254,15,1,16,4,16,217,20,4,61,48,61,160,93,0,0,0,0,0,0,169,61,63,36,158,36,4,64,82, 67,108,65,109,65,206,65,47,83,231,82,38,93,19,70,51,70,41,88,13,88,209,71,205,71,147,81,42,80,23,84,104,41,165,41,177,41, 28,101,128,126,150,125,241,112,135,120,14,122,12,115,132,98,244,121,173,122,205,122,140,43,61,30,122,27,232,40,23,38,233, 41,248,40,11,41,128,34,71,41,13,38,18,38,117,27,173,107,81,107,130,107,156,101,250,85,152,86,18,87,192,68,152,68,172,68,55, 1,72,1,87,1,139,1,180,1,217,1,229,1,244,1,249,1,21,2,22,2,26,2,80,2,98,2,109,2,134,2,169,2,170,2,223,2,35,3,58,3,67,3,77, 3,101,3,105,3,106,3,85,84,207,170,78,196,238,66,211,6,84,206,14,83,195,21,0,83,65,86,197,194,76,79,65,196,195,69,69,208,197, 0,79,76,79,210,191,76,79,83,197,187,79,78,212,153,76,69,65,210,146,83,82,76,73,206,219,73,78,212,28,83,78,199,29,68,66,204, 30,79,211,12,72,82,164,22,65,76,204,179,76,211,192,0,69,76,69,84,197,169,65,84,193,132,73,205,134,69,70,83,84,210,172,69, 70,73,78,212,173,69,70,83,78,199,174,69,70,68,66,204,175,69,198,151,0,76,83,197,161,78,196,129,82,65,83,197,165,68,73,212, 166,82,82,79,210,167,82,204,212,82,210,213,88,208,11,79,198,35,81,214,241,0,79,210,130,206,209,82,197,15,73,216,31,0,79,84, 207,137,79,32,84,207,137,79,83,85,194,141,0,69,88,164,26,0,78,80,85,212,133,198,139,78,83,84,210,216,78,212,5,78,208,16,77, 208,242,78,75,69,89,164,222,0,0,69,217,201,0,79,67,65,84,197,202,80,82,73,78,212,157,76,73,83,212,158,80,79,211,27,69,212, 136,73,78,197,176,79,65,196,188,73,83,212,147,79,199,10,79,195,36,69,206,18,69,70,84,164,1,79,198,37,0,79,84,79,210,193,69, 82,71,197,189,79,196,243,73,68,164,3,0,69,88,212,131,69,215,148,79,212,211,0,80,69,206,186,85,212,156,206,149,210,239,67, 84,164,25,80,84,73,79,206,184,70,198,221,0,82,73,78,212,145,79,75,197,152,79,211,17,69,69,203,23,83,69,212,198,82,69,83,69, 212,199,79,73,78,212,220,69,206,32,0,0,85,206,138,69,84,85,82,206,142,69,65,196,135,69,83,84,79,82,197,140,69,205,143,69, 83,85,77,197,168,73,71,72,84,164,2,78,196,8,69,78,85,205,171,65,78,68,79,77,73,90,197,185,0,67,82,69,69,206,200,84,79,208, 144,87,65,208,164,65,86,197,190,80,67,168,210,84,69,208,207,71,206,4,81,210,7,73,206,9,84,82,164,19,84,82,73,78,71,164,214, 80,65,67,69,164,24,79,85,78,196,196,84,73,67,203,33,84,82,73,199,34,0,72,69,206,205,82,79,206,162,82,79,70,198,163,65,66, 168,206,207,204,65,206,13,0,83,73,78,199,215,83,210,208,0,65,204,20,65,82,80,84,210,218,0,73,68,84,200,160,65,73,212,150, 72,73,76,197,177,69,78,196,178,82,73,84,197,183,0,79,210,240,0,0,0,171,233,173,234,170,235,175,236,222,237,220,244,167,217, 190,230,189,231,188,232,0,121,121,124,124,127,80,70,60,50,40,122,123,130,107,0,0,173,107,59,100,81,107,168,102,3,99,83,108, 32,99,116,101,18,99,25,99,65,99,40,99,49,100,106,99,79,99,137,99,215,24,180,101,0,78,69,88,84,32,119,105,116,104,111,117, 116,32,70,79,82,0,83,121,110,116,97,120,32,101,114,114,111,114,0,82,69,84,85,82,78,32,119,105,116,104,111,117,116,32,71,79, 83,85,66,0,79,117,116,32,111,102,32,68,65,84,65,0,73,108,108,101,103,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108, 108,0,79,118,101,114,102,108,111,119,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,85,110,100,101,102,105,110,101, 100,32,108,105,110,101,32,110,117,109,98,101,114,0,83,117,98,115,99,114,105,112,116,32,111,117,116,32,111,102,32,114,97,110, 103,101,0,68,117,112,108,105,99,97,116,101,32,68,101,102,105,110,105,116,105,111,110,0,68,105,118,105,115,105,111,110,32, 98,121,32,122,101,114,111,0,73,108,108,101,103,97,108,32,100,105,114,101,99,116,0,84,121,112,101,32,109,105,115,109,97,116, 99,104,0,79,117,116,32,111,102,32,115,116,114,105,110,103,32,115,112,97,99,101,0,83,116,114,105,110,103,32,116,111,111,32, 108,111,110,103,0,83,116,114,105,110,103,32,102,111,114,109,117,108,97,32,116,111,111,32,99,111,109,112,108,101,120,0,67, 97,110,39,116,32,99,111,110,116,105,110,117,101,0,85,110,100,101,102,105,110,101,100,32,117,115,101,114,32,102,117,110,99, 116,105,111,110,0,78,111,32,82,69,83,85,77,69,0,82,69,83,85,77,69,32,119,105,116,104,111,117,116,32,101,114,114,111,114,0, 85,110,112,114,105,110,116,97,98,108,101,32,101,114,114,111,114,0,77,105,115,115,105,110,103,32,111,112,101,114,97,110,100, 0,76,105,110,101,32,98,117,102,102,101,114,32,111,118,101,114,102,108,111,119,0,68,101,118,105,99,101,32,84,105,109,101,111, 117,116,0,68,101,118,105,99,101,32,70,97,117,108,116,0,70,79,82,32,87,105,116,104,111,117,116,32,78,69,88,84,0,79,117,116, 32,111,102,32,80,97,112,101,114,0,63,0,87,72,73,76,69,32,119,105,116,104,111,117,116,32,87,69,78,68,0,87,69,78,68,32,119, 105,116,104,111,117,116,32,87,72,73,76,69,0,70,73,69,76,68,32,111,118,101,114,102,108,111,119,0,73,110,116,101,114,110,97, 108,32,101,114,114,111,114,0,66,97,100,32,102,105,108,101,32,110,117,109,98,101,114,0,70,105,108,101,32,110,111,116,32,102, 111,117,110,100,0,66,97,100,32,102,105,108,101,32,109,111,100,101,0,70,105,108,101,32,97,108,114,101,97,100,121,32,111,112, 101,110,0,63,0,68,101,118,105,99,101,32,73,47,79,32,69,114,114,111,114,0,70,105,108,101,32,97,108,114,101,97,100,121,32,101, 120,105,115,116,115,0,63,0,63,0,68,105,115,107,32,102,117,108,108,0,73,110,112,117,116,32,112,97,115,116,32,101,110,100,0, 66,97,100,32,114,101,99,111,114,100,32,110,117,109,98,101,114,0,66,97,100,32,102,105,108,101,32,110,97,109,101,0,63,0,68, 105,114,101,99,116,32,115,116,97,116,101,109,101,110,116,32,105,110,32,102,105,108,101,0,84,111,111,32,109,97,110,121,32, 102,105,108,101,115,0,0,0,0,195,30,16,0,82,199,79,128,82,199,79,128,228,0,203,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,1,0,0,80,56,0,114,7,254,255,15,7,10,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, 0,0,7,7,32,0,0,0,0,0,0,0,0,0,0,1,24,24,0,0,0,0,80,0,1,0,0,0,7,7,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,32,105,110,32,0,79,107,255,13,0,66,114,101,97,107,0,187,4,0,3,220,67,138,7,67,60,177,117,7,185,6,0,3,217,235, 241,60,130,116,1,195,138,15,67,138,47,67,83,139,217,11,210,135,218,116,4,135,218,59,218,185,16,0,91,116,230,3,217,235,207, 185,181,8,233,145,0,205,134,139,30,46,0,138,199,34,195,254,192,116,9,160,79,3,10,192,178,19,117,77,233,189,38,178,61,185, 178,57,185,178,54,185,178,53,185,178,52,185,178,51,185,178,62,185,178,55,185,178,64,185,178,63,185,178,50,185,178,67,185, 178,58,235,34,139,30,55,3,137,30,46,0,178,2,185,178,11,185,178,1,185,178,10,185,178,18,185,178,20,185,178,6,185,178,22,185, 178,13,50,192,162,54,5,162,95,0,162,98,4,162,96,0,139,30,46,0,137,30,71,3,50,192,162,101,4,162,107,4,138,199,34,195,254,192, 116,4,137,30,73,3,185,12,8,139,30,69,3,233,177,37,89,138,194,138,202,162,40,0,139,30,67,3,137,30,75,3,135,218,139,30,71,3, 138,199,34,195,254,192,116,10,137,30,84,3,135,218,137,30,86,3,139,30,77,3,11,219,135,218,187,79,3,116,11,34,7,117,7,254,15, 135,218,233,115,6,50,192,136,7,138,209,232,8,36,187,180,3,205,135,138,194,60,68,115,8,60,50,115,6,60,31,114,6,176,40,44,19, 138,208,46,138,7,67,10,192,117,248,75,67,254,202,117,242,83,139,30,71,3,94,135,222,86,205,136,46,138,7,60,63,117,6,91,187, 180,3,235,212,232,190,114,91,186,254,255,59,218,205,137,117,3,233,238,117,138,199,34,195,254,192,116,3,232,153,92,176,255, 232,241,34,176,89,205,138,50,192,162,111,0,232,59,60,232,154,35,187,45,7,232,140,114,160,40,0,44,2,117,3,232,238,45,205,139, 187,255,255,137,30,46,0,160,62,3,10,192,116,73,139,30,63,3,83,232,101,92,90,82,232,119,1,176,42,114,2,176,32,232,172,34,232, 132,40,90,115,14,50,192,162,62,3,235,176,50,192,162,62,3,235,21,139,30,65,3,3,218,114,241,82,186,249,255,59,218,90,115,232, 137,30,63,3,160,247,1,10,192,116,170,233,168,45,232,81,40,114,162,232,233,5,254,192,254,200,116,153,156,232,45,7,115,8,232, 147,38,117,3,233,118,254,232,56,4,138,7,60,32,117,3,232,240,91,82,232,49,1,90,157,137,30,67,3,205,140,114,3,233,111,59,82, 81,232,238,61,232,176,5,10,192,156,137,22,73,3,232,240,0,114,9,157,156,117,3,233,176,7,10,192,81,156,83,232,173,26,91,157, 89,81,115,3,232,214,24,90,157,82,116,71,90,160,107,4,10,192,117,8,139,30,10,3,137,30,47,3,139,30,88,3,94,135,222,86,89,83, 3,217,83,232,21,91,91,137,30,88,3,135,218,136,63,89,90,83,67,67,137,23,67,67,186,184,0,73,73,73,73,139,242,172,136,7,67,66, 73,138,193,10,197,117,242,205,141,90,232,30,0,139,30,233,4,137,30,82,3,232,73,35,205,142,139,30,82,3,137,30,233,4,233,216, 254,139,30,48,0,135,218,138,254,138,218,138,7,67,10,7,117,1,195,67,67,67,138,7,10,192,116,16,60,32,115,245,60,11,114,241, 232,253,4,232,249,4,235,236,67,135,218,137,23,235,212,186,0,0,82,116,23,60,44,116,19,90,232,35,6,82,116,29,60,44,116,25,232, 175,35,234,116,2,60,44,186,250,255,116,3,232,12,6,116,7,60,44,116,3,233,99,253,137,30,59,3,135,218,90,94,135,222,86,83,139, 30,48,0,139,203,138,7,67,10,7,159,75,158,116,149,67,67,139,31,59,218,139,217,139,31,245,116,136,245,115,133,235,226,50,192, 162,253,2,162,252,2,205,143,185,59,1,186,184,0,138,7,10,192,117,32,187,64,1,138,195,42,193,138,200,138,199,26,197,138,232, 187,183,0,50,192,139,250,170,66,139,250,170,66,139,250,170,195,60,34,117,3,233,51,0,60,32,116,9,160,252,2,10,192,138,7,116, 47,67,80,232,84,2,88,44,58,116,6,60,74,117,8,176,1,162,252,2,162,253,2,44,85,117,172,80,138,7,10,192,88,116,170,58,7,116, 218,80,138,7,67,232,44,2,235,236,67,10,192,120,146,75,60,63,176,145,82,81,117,3,233,226,0,186,107,3,232,210,14,232,41,36, 115,3,233,46,1,83,186,94,11,232,32,0,117,62,232,240,3,186,98,11,232,21,0,176,137,117,3,235,11,144,186,101,11,232,8,0,117, 38,176,141,89,233,173,0,139,242,46,172,10,192,117,1,195,138,200,232,149,14,58,193,117,246,67,66,235,234,71,79,32,0,84,79, 0,85,66,0,91,232,127,14,83,205,144,187,3,1,44,65,2,192,138,200,181,0,3,217,46,139,23,91,67,83,232,102,14,138,200,139,242, 46,172,36,127,117,3,233,171,1,67,58,193,117,80,139,242,46,172,66,10,192,121,226,138,193,60,40,116,29,139,242,46,172,60,209, 116,21,60,208,116,17,232,54,14,60,46,116,3,232,199,21,176,0,114,3,233,122,1,88,139,242,46,172,205,145,10,192,121,3,233,35, 0,89,90,12,128,80,176,255,232,81,1,50,192,162,253,2,88,232,72,1,233,178,254,91,139,242,46,172,66,10,192,121,247,66,235,141, 75,80,205,146,186,12,12,138,200,139,242,46,172,10,192,116,23,66,58,193,117,243,235,20,140,170,171,169,166,168,212,161,138, 147,158,137,142,205,141,0,50,192,235,2,176,1,162,253,2,88,89,90,60,161,80,117,3,232,250,0,88,60,177,117,5,232,244,0,176,233, 60,217,116,3,233,198,0,80,232,229,0,176,143,232,226,0,88,80,233,173,254,138,7,60,46,116,14,60,58,114,3,233,144,0,60,48,115, 3,233,137,0,160,253,2,10,192,138,7,89,90,121,3,233,98,254,116,39,60,46,117,3,233,89,254,176,14,232,173,0,82,232,232,3,232, 253,0,94,135,222,86,135,218,138,195,232,155,0,138,199,91,232,149,0,233,255,253,82,81,138,7,232,31,93,232,223,0,89,90,83,160, 251,2,60,2,117,26,139,30,163,4,138,199,10,192,176,2,117,14,138,195,138,251,179,15,60,10,115,200,4,17,235,203,80,208,200,4, 27,232,92,0,187,163,4,232,79,14,114,3,187,159,4,88,80,138,7,232,74,0,88,67,254,200,117,244,91,233,173,253,186,106,3,66,139, 242,46,172,36,127,117,3,233,107,0,66,58,7,139,242,46,172,117,235,233,111,0,60,38,116,3,233,197,253,83,232,11,2,91,232,215, 12,60,72,176,11,117,2,176,12,232,11,0,82,81,232,217,12,89,233,92,255,176,58,139,250,170,66,73,138,193,10,197,116,1,195,178, 23,233,155,250,205,147,91,75,254,200,162,253,2,89,90,232,160,12,232,222,255,67,232,153,12,232,240,33,115,244,60,58,115,8, 60,48,115,236,60,46,116,232,233,51,253,138,7,60,32,115,10,60,9,116,6,60,10,116,2,176,32,80,160,253,2,254,192,116,2,254,200, 233,159,254,75,138,7,60,32,116,249,60,9,116,245,60,10,116,241,67,195,176,100,162,57,3,232,210,41,232,85,32,231,82,137,22, 59,3,160,251,2,80,232,123,9,88,83,232,41,16,187,86,4,232,69,86,91,90,89,83,232,157,3,137,30,53,3,187,2,0,3,220,232,115,249, 117,30,3,217,82,75,138,55,75,138,23,67,67,83,139,30,53,3,59,218,91,90,117,229,90,139,227,137,30,69,3,177,90,135,218,177,8, 232,227,30,83,139,30,53,3,94,135,222,86,83,139,30,46,0,94,135,222,86,232,237,31,204,232,26,13,117,3,233,198,249,114,3,233, 193,249,156,232,14,9,157,83,120,3,233,28,0,232,138,93,94,135,222,86,186,1,0,138,7,60,207,117,3,232,212,16,82,83,135,218,232, 198,86,235,39,232,18,93,232,177,85,91,81,82,185,0,129,138,241,138,214,205,148,138,7,60,207,176,1,117,14,232,207,8,83,232, 244,92,232,147,85,232,18,109,91,81,82,138,200,232,186,12,138,232,81,75,232,171,0,116,3,233,71,249,232,129,22,232,160,0,83, 83,139,30,90,4,137,30,46,0,139,30,59,3,94,135,222,86,181,130,81,159,134,196,80,134,196,159,134,196,80,134,196,233,207,100, 181,130,81,235,66,233,203,248,233,18,249,195,232,117,0,235,80,205,149,233,99,15,233,213,2,10,192,117,235,67,138,7,67,10,7, 116,224,67,139,23,67,137,22,46,0,246,6,118,4,255,116,38,83,176,91,232,202,28,135,218,232,112,86,176,93,232,192,28,91,235, 19,205,150,232,155,29,137,38,69,3,137,30,67,3,138,7,60,58,117,191,67,138,7,60,58,114,171,186,232,14,82,116,164,44,129,114, 171,60,74,115,162,50,228,2,192,139,240,205,151,46,255,180,37,0,67,138,7,60,58,114,1,195,60,32,116,244,114,8,60,48,245,254, 192,254,200,195,10,192,116,251,60,11,114,114,60,30,117,6,160,0,3,10,192,195,60,16,116,60,80,67,162,0,3,44,28,115,57,44,245, 115,7,60,254,117,27,138,7,67,137,30,254,2,183,0,138,216,137,30,2,3,176,2,162,1,3,187,4,0,88,10,192,195,138,7,67,67,137,30, 254,2,75,138,63,235,225,232,55,0,139,30,254,2,235,147,254,192,208,192,162,1,3,82,81,186,2,3,135,218,138,232,232,19,85,135, 218,89,90,137,30,254,2,88,187,4,0,10,192,195,60,9,114,3,233,105,255,60,48,245,254,192,254,200,195,160,0,3,60,15,115,23,60, 13,114,19,139,30,2,3,117,10,67,67,67,138,23,67,138,55,135,218,233,106,84,160,1,3,162,251,2,60,8,116,17,139,30,2,3,137,30, 163,4,139,30,4,3,137,30,165,4,195,187,2,3,233,157,84,178,3,185,178,2,185,178,4,185,178,8,232,58,31,185,190,7,81,114,229,44, 65,138,200,138,232,232,5,255,60,234,117,15,232,254,254,232,33,31,114,208,44,65,138,232,232,242,254,138,197,42,193,114,195, 254,192,94,135,222,86,187,96,3,181,0,3,217,136,23,67,254,200,117,249,91,138,7,60,44,117,168,232,206,254,235,181,232,201,254, 232,179,14,121,155,178,5,233,122,247,138,7,60,46,139,22,73,3,117,3,233,178,254,75,232,174,254,60,14,116,2,60,13,139,22,2, 3,117,3,233,159,254,50,192,162,0,3,75,186,0,0,232,147,254,114,1,195,83,159,80,187,152,25,59,218,114,27,138,254,138,218,3, 218,3,219,3,218,3,219,88,158,44,48,138,208,182,0,3,218,135,218,91,235,213,88,158,91,195,117,3,233,124,28,60,14,116,7,60,13, 116,3,233,163,48,232,117,28,185,232,14,235,30,177,3,232,2,28,232,149,255,89,83,83,139,30,46,0,94,135,222,86,176,141,159,134, 196,80,134,196,81,235,4,81,232,123,255,160,0,3,60,13,135,218,116,188,60,14,116,3,233,190,246,135,218,83,139,30,254,2,94,135, 222,86,232,81,0,67,83,139,30,46,0,59,218,91,115,3,232,79,249,114,3,232,70,249,115,13,73,176,13,162,61,3,91,232,252,18,139, 217,195,178,8,233,163,246,205,152,117,246,182,255,232,250,245,139,227,137,30,69,3,60,141,178,3,116,3,233,139,246,91,137,30, 46,0,187,232,14,94,135,222,86,176,91,177,58,235,2,177,0,181,0,138,193,138,205,138,232,75,232,176,253,10,192,116,190,58,197, 116,186,67,60,34,116,233,254,192,116,236,44,140,117,231,58,197,18,198,138,240,235,223,88,4,3,235,20,232,220,37,232,95,28, 231,137,22,59,3,82,160,251,2,80,232,133,5,88,94,135,222,86,138,232,160,251,2,58,197,138,197,116,6,232,37,12,160,251,2,186, 163,4,60,5,114,3,186,159,4,83,60,3,117,49,139,30,163,4,83,67,139,23,139,30,48,0,59,218,115,17,139,30,92,3,59,218,90,115,17, 187,44,3,59,218,115,10,176,90,232,230,22,135,218,232,51,20,232,222,22,94,135,222,86,232,190,82,90,91,195,60,167,117,50,232, 24,253,232,236,27,137,232,95,254,11,210,116,13,232,79,248,138,245,138,209,91,114,3,233,19,255,137,22,77,3,114,218,160,79, 3,10,192,138,194,116,209,160,40,0,138,208,233,206,245,232,229,12,138,7,138,232,60,141,116,5,232,178,27,137,75,138,202,254, 201,138,197,117,3,233,185,252,232,26,254,60,44,117,167,235,238,160,79,3,10,192,117,8,51,192,163,77,3,233,102,245,254,192, 162,40,0,128,63,131,116,18,232,247,253,117,12,11,210,116,16,232,115,254,50,192,162,79,3,195,232,151,252,117,250,235,7,50, 192,162,79,3,254,192,161,71,3,163,46,0,139,30,75,3,117,229,128,63,0,117,3,131,195,4,67,233,23,25,232,112,12,117,218,10,192, 117,3,233,164,253,233,32,245,186,10,0,82,116,31,232,157,253,135,218,94,135,222,86,116,22,135,218,232,38,27,44,139,22,65,3, 116,8,232,147,253,116,3,233,225,244,135,218,138,199,10,195,117,3,233,113,253,137,30,65,3,162,62,3,91,137,30,63,3,89,233,219, 245,232,44,4,138,7,60,44,117,3,232,25,252,60,137,116,5,232,233,26,205,75,83,232,210,81,91,116,25,232,6,252,117,1,195,60,14, 117,3,233,204,253,60,13,116,3,233,224,251,139,30,2,3,195,182,1,232,41,254,10,192,116,246,232,228,251,60,161,117,242,254,206, 117,238,235,209,232,106,1,235,3,232,155,49,75,232,206,251,117,3,232,29,25,117,3,233,63,1,60,215,117,3,233,107,39,60,206,117, 3,233,171,0,60,210,117,3,233,164,0,83,60,44,116,109,60,59,117,3,233,23,1,89,232,169,3,83,232,163,7,116,15,232,65,93,232,194, 18,198,7,32,139,30,163,4,254,7,205,153,139,30,163,4,83,232,57,28,116,13,232,49,1,120,3,233,49,0,232,129,69,235,3,160,41,0, 138,232,254,192,116,35,232,30,28,116,7,232,102,69,138,7,235,3,232,104,59,91,83,10,192,116,14,2,7,245,115,4,254,200,58,197, 114,3,232,153,24,91,232,222,18,91,233,107,255,205,154,185,50,0,139,30,233,4,3,217,232,232,27,138,7,117,24,160,42,0,138,232, 232,50,59,60,255,116,12,58,197,114,3,232,108,24,114,3,233,135,0,44,14,115,252,246,208,235,114,80,232,7,251,232,241,10,88, 80,60,210,116,1,74,138,198,10,192,120,3,233,3,0,186,0,0,83,232,166,27,116,13,232,158,0,120,3,233,21,0,232,238,68,235,3,160, 41,0,138,216,254,192,116,7,183,0,232,124,81,135,218,91,232,161,25,41,75,88,44,210,83,116,19,185,50,0,139,30,233,4,3,217,232, 111,27,138,7,117,3,232,190,58,246,208,2,194,114,16,254,192,116,25,232,246,23,138,194,254,200,121,3,233,13,0,254,192,138,232, 176,32,232,24,23,254,205,117,249,91,232,136,250,233,188,254,205,155,50,192,83,82,81,232,134,44,89,90,50,192,138,248,138,216, 137,30,233,4,91,195,83,50,192,159,134,196,80,134,196,232,233,42,116,3,233,226,242,83,185,46,0,178,2,182,253,3,217,136,55, 176,0,91,233,230,41,232,51,46,10,192,195,60,133,116,3,233,162,51,232,17,25,133,60,35,117,3,233,40,48,232,48,29,232,115,0, 232,122,34,232,68,79,82,83,232,167,28,90,89,115,3,233,69,25,81,82,181,0,232,69,17,91,176,3,233,147,252,63,82,101,100,111, 32,102,114,111,109,32,115,116,97,114,116,13,0,67,138,7,10,192,117,3,233,146,242,60,34,117,242,233,155,0,91,91,235,12,205, 156,160,58,3,10,192,116,3,233,115,242,89,187,16,21,232,11,102,139,30,67,3,195,232,148,47,83,187,246,1,233,224,0,60,35,116, 242,232,190,28,185,140,21,81,60,34,176,0,176,255,162,95,4,117,223,232,219,16,138,7,60,44,117,10,50,192,162,95,4,232,157,249, 235,4,232,111,24,59,83,232,48,17,91,195,83,160,95,4,10,192,116,10,176,63,232,12,22,176,32,232,7,22,232,2,28,89,115,3,233, 161,24,81,50,192,162,58,3,198,7,44,135,218,91,83,82,82,75,176,128,162,57,3,232,94,249,232,165,34,138,7,75,60,40,117,32,67, 181,0,254,197,232,76,249,117,3,233,232,241,60,34,117,3,233,69,255,60,40,116,235,60,41,117,233,254,205,117,229,232,49,249, 116,7,60,44,116,3,233,201,241,94,135,222,86,138,7,60,44,116,3,233,49,255,176,1,162,169,4,232,98,0,160,169,4,254,200,116,3, 233,31,255,83,232,13,5,117,3,232,140,18,91,75,232,251,248,94,135,222,86,138,7,60,44,116,139,91,75,232,236,248,10,192,91,116, 3,233,10,255,198,7,44,235,6,83,139,30,94,3,13,50,192,162,58,3,94,135,222,86,235,4,232,162,23,44,232,24,33,94,135,222,86,82, 138,7,60,44,116,10,160,58,3,10,192,116,3,233,139,0,13,50,192,162,82,4,232,98,25,116,3,233,139,46,232,169,4,80,117,56,232, 155,248,138,240,138,232,60,34,116,14,160,58,3,10,192,138,240,116,2,182,58,181,44,75,232,182,15,88,4,3,138,200,160,82,4,10, 192,117,1,195,138,193,135,218,187,202,22,94,135,222,86,82,233,240,250,232,99,248,88,80,60,5,185,155,22,81,115,3,233,249,82, 233,253,82,75,232,79,248,116,7,60,44,116,3,233,96,254,94,135,222,86,75,232,62,248,116,3,233,107,255,90,160,58,3,10,192,135, 218,116,3,233,53,23,82,91,233,162,253,232,98,250,10,192,117,21,67,138,7,67,10,7,178,4,117,3,233,206,240,67,139,23,67,137, 22,55,3,232,8,248,60,132,117,221,233,79,255,232,213,22,231,233,4,0,232,206,22,40,75,182,0,82,177,1,232,165,21,205,157,232, 178,1,50,192,162,168,4,137,30,82,3,139,30,82,3,89,138,7,137,30,49,3,60,230,115,1,195,60,233,114,117,44,233,138,208,117,12, 160,251,2,60,3,138,194,117,3,233,214,16,60,12,115,229,187,128,3,182,0,3,218,138,197,46,138,55,58,198,115,213,81,185,62,23, 81,138,198,205,158,60,127,116,100,60,81,114,109,36,254,60,122,116,103,160,251,2,44,3,117,3,233,61,240,10,192,255,54,163,4, 121,3,233,17,0,255,54,165,4,122,3,233,8,0,255,54,159,4,255,54,161,4,4,3,138,202,138,232,81,185,35,24,81,139,30,49,3,233,99, 255,182,0,44,230,114,52,60,3,115,48,60,1,208,208,50,198,58,198,138,240,115,3,233,222,239,137,30,49,3,232,54,247,235,224,232, 101,83,232,55,76,185,41,101,182,127,235,201,82,232,179,83,90,83,185,49,27,235,190,138,197,60,100,114,1,195,81,82,186,4,100, 187,3,27,83,232,17,3,116,3,233,118,255,139,30,163,4,83,185,200,37,235,156,89,138,193,162,252,2,160,251,2,58,197,117,13,60, 2,116,40,60,4,117,3,233,127,0,115,57,138,240,138,197,60,8,116,46,138,198,60,8,116,87,138,197,60,4,116,102,138,198,60,3,117, 3,233,124,239,115,101,187,170,3,181,0,3,217,3,217,46,138,15,67,46,138,47,90,139,30,163,4,81,195,232,12,83,232,37,76,91,137, 30,161,4,91,137,30,159,4,89,90,232,90,75,232,247,82,187,150,3,160,252,2,208,192,2,195,138,216,18,199,42,195,138,248,46,139, 31,255,227,138,197,80,232,246,75,88,162,251,2,60,4,116,211,91,137,30,163,4,235,209,232,151,82,89,90,187,160,3,235,205,91, 232,97,75,232,101,74,232,40,75,91,137,30,165,4,91,137,30,163,4,235,229,83,135,218,232,80,74,91,232,69,75,232,73,74,233,59, 76,232,51,246,117,3,233,228,238,115,3,233,204,80,232,78,22,114,3,233,219,0,60,32,115,3,233,127,246,205,159,254,192,117,3, 233,106,1,254,200,60,233,116,213,60,234,117,3,233,175,0,60,34,117,3,233,45,13,60,211,117,3,233,236,1,60,38,117,3,233,209, 0,60,213,117,12,232,232,245,160,40,0,83,232,67,2,91,195,60,212,117,13,232,216,245,83,139,30,71,3,232,247,74,91,195,60,218, 117,46,232,199,245,232,155,20,40,60,35,117,13,232,184,5,83,232,64,38,135,218,91,233,3,0,232,249,30,232,131,20,41,83,135,218, 11,219,117,3,233,221,246,232,141,75,91,195,60,208,117,3,233,0,2,60,216,117,3,233,139,16,60,200,117,3,233,208,59,60,220,117, 3,233,76,46,60,222,117,3,233,249,18,60,214,117,3,233,112,15,60,133,117,3,233,56,42,60,219,117,3,233,164,59,60,209,117,3,233, 126,2,232,96,253,232,46,20,41,195,182,125,232,93,253,139,30,82,3,83,232,214,99,91,195,232,148,29,83,135,218,137,30,163,4, 232,65,1,116,3,232,175,74,91,195,138,7,60,97,114,249,60,123,115,245,36,95,195,60,38,116,3,233,108,246,186,0,0,232,24,245, 232,229,255,60,79,116,57,60,72,117,52,181,5,67,138,7,232,213,255,232,42,21,135,218,115,10,60,58,115,77,44,48,114,73,235,6, 60,71,115,67,44,55,3,219,3,219,3,219,3,219,10,195,138,216,135,218,254,205,117,209,233,140,237,75,232,213,244,135,218,115, 36,60,56,114,3,233,107,237,185,208,7,81,3,219,114,156,3,219,114,152,3,219,114,148,89,181,0,44,48,138,200,3,217,135,218,235, 213,232,153,74,135,218,195,67,138,7,44,129,60,7,117,14,83,232,154,244,60,40,91,116,3,233,224,73,176,7,181,0,208,192,138,200, 81,232,134,244,138,193,60,5,115,34,232,131,252,232,81,19,44,232,148,73,135,218,139,30,163,4,94,135,222,86,83,135,218,232, 101,4,135,218,94,135,222,86,235,33,232,254,254,94,135,222,86,138,195,60,12,114,11,60,27,205,161,83,115,3,232,123,80,91,186, 213,25,82,176,1,162,168,4,185,185,0,205,160,3,217,46,255,39,254,206,60,234,116,133,60,45,116,129,254,198,60,43,117,1,195, 60,233,116,251,159,75,158,195,254,192,18,192,89,34,197,4,255,26,192,232,248,73,235,15,182,90,232,18,252,232,146,80,247,211, 137,30,163,4,89,233,25,252,160,251,2,60,8,254,200,254,200,254,200,195,138,197,80,232,118,80,88,90,60,122,117,3,233,137,74, 60,123,117,3,233,102,72,185,12,101,81,60,70,117,3,11,218,195,60,80,117,3,35,218,195,60,60,117,3,51,218,195,60,50,117,5,51, 218,247,211,195,247,211,35,218,247,211,195,43,218,233,207,72,160,99,0,235,3,232,175,51,254,192,138,216,50,192,138,248,233, 132,73,232,46,0,82,232,49,254,94,135,222,86,139,23,128,250,255,117,3,233,188,244,14,187,7,101,83,255,54,80,3,82,160,251,2, 80,60,3,117,3,232,247,12,88,135,218,187,163,4,203,232,97,243,185,0,0,60,27,115,16,60,17,114,12,232,83,243,160,2,3,10,192, 208,208,138,200,135,218,187,18,0,3,217,135,218,195,232,217,255,82,232,16,18,231,232,194,6,94,135,222,86,137,23,91,195,60, 208,116,233,60,209,116,28,232,249,17,83,232,245,17,69,232,241,17,71,140,218,116,7,232,233,17,231,232,155,6,137,22,80,3,195, 232,243,1,232,224,1,135,218,137,23,135,218,138,7,60,40,116,3,233,50,245,232,241,242,232,63,27,138,7,60,41,117,3,233,35,245, 232,185,17,44,235,238,232,201,1,160,251,2,10,192,80,137,30,82,3,135,218,139,31,11,219,117,3,233,116,235,138,7,60,40,116,3, 233,206,0,232,187,242,137,30,49,3,135,218,139,30,82,3,232,133,17,40,50,192,80,83,135,218,176,128,162,57,3,232,240,26,135, 218,94,135,222,86,160,251,2,80,82,232,155,250,137,30,82,3,91,137,30,49,3,88,232,65,1,177,4,232,55,16,187,248,255,3,220,139, 227,232,249,71,160,251,2,80,139,30,82,3,138,7,60,41,116,19,232,59,17,44,83,139,30,49,3,232,50,17,44,235,177,88,162,228,3, 88,10,192,116,78,162,251,2,187,0,0,3,220,232,191,71,187,8,0,3,220,139,227,90,179,3,254,195,74,139,242,172,10,192,120,246, 74,74,74,160,251,2,2,195,138,232,160,228,3,138,200,2,197,60,100,114,3,233,84,243,80,138,195,181,0,187,230,3,3,217,138,200, 232,223,0,185,197,28,81,81,233,153,244,139,30,82,3,232,250,241,83,139,30,49,3,232,201,16,41,176,82,137,30,49,3,160,124,3, 4,4,80,208,200,138,200,232,150,15,88,138,200,246,208,254,192,138,216,183,255,3,220,139,227,83,186,122,3,232,158,0,91,137, 30,122,3,139,30,228,3,137,30,124,3,139,203,187,126,3,186,230,3,232,134,0,138,248,138,216,137,30,228,3,139,30,80,4,67,137, 30,80,4,138,199,10,195,162,77,4,139,30,49,3,232,144,249,75,232,141,241,116,3,233,41,234,232,141,253,117,17,186,44,3,139,30, 163,4,59,218,114,6,232,124,8,232,230,8,139,30,122,3,138,247,138,211,67,67,138,15,67,138,47,65,65,65,65,187,122,3,232,47,0, 135,218,139,227,139,30,80,4,75,137,30,80,4,138,199,10,195,162,77,4,91,88,83,36,7,187,140,3,138,200,181,0,3,217,232,252,252, 91,195,139,242,172,136,7,67,66,73,138,197,10,193,117,242,195,83,139,30,46,0,67,11,219,91,117,244,178,12,233,206,233,232,231, 15,209,176,128,162,57,3,10,7,138,200,233,91,25,60,126,116,3,233,157,233,67,138,7,67,60,131,117,3,233,164,12,60,160,117,3, 233,175,55,60,162,117,3,233,192,56,233,129,233,232,117,4,135,218,236,233,57,253,232,97,4,82,232,167,15,44,232,203,0,90,195, 232,240,255,238,195,232,235,255,82,80,178,0,75,232,186,240,116,7,232,140,15,44,232,176,0,88,138,240,94,135,222,86,160,94, 0,10,192,117,11,135,218,236,135,218,50,194,34,198,116,238,91,195,233,52,233,60,35,116,60,232,150,248,232,145,252,117,88,232, 125,32,138,198,182,0,246,208,10,192,121,3,233,179,241,138,208,82,232,72,15,44,232,108,0,90,159,134,196,80,134,196,83,82,138, 194,2,192,138,208,176,20,159,134,196,80,134,196,233,8,32,232,80,240,232,76,0,80,232,32,15,44,232,68,0,88,83,82,232,199,32, 232,50,58,10,192,121,3,233,113,241,67,90,136,23,91,195,232,46,0,232,184,51,162,41,0,44,14,115,252,4,28,246,208,254,192,2, 194,162,42,0,195,232,19,240,232,26,248,83,232,156,76,135,218,91,138,198,10,192,195,232,1,240,232,8,248,232,235,255,116,3, 233,50,241,75,232,242,239,138,194,195,232,127,245,75,232,232,239,205,162,89,232,242,234,81,232,25,40,139,30,59,3,75,232,214, 239,116,14,232,168,14,44,232,195,31,178,2,50,192,232,150,33,187,255,255,137,30,46,0,232,117,16,117,5,176,1,162,111,0,91,90, 138,15,67,138,47,67,138,197,10,193,117,3,233,61,233,232,144,224,117,3,232,7,13,81,138,15,67,138,47,67,81,94,135,222,86,135, 218,59,218,89,115,3,233,30,233,94,135,222,86,83,81,135,218,137,30,73,3,232,170,69,91,138,7,60,9,116,5,176,32,232,243,11,232, 24,0,187,247,1,232,5,0,232,179,12,235,151,138,7,10,192,117,1,195,232,105,23,67,235,243,185,247,1,182,255,50,192,162,252,2, 50,192,162,94,4,232,121,39,235,6,65,67,254,206,116,223,138,7,10,192,139,249,170,116,214,60,11,114,40,60,32,138,208,114,56, 60,34,117,10,160,252,2,52,1,162,252,2,176,34,60,58,117,16,160,252,2,208,216,114,7,208,208,36,253,162,252,2,176,58,10,192, 121,3,233,60,0,138,208,60,46,116,9,232,87,1,115,4,50,192,235,24,160,94,4,10,192,116,15,254,192,117,11,176,32,139,249,170, 65,254,206,117,1,195,176,1,162,94,4,138,194,60,11,114,7,60,32,115,3,233,55,1,139,249,170,235,130,160,252,2,208,216,114,67, 208,216,208,216,115,82,138,7,60,217,83,81,187,165,32,83,117,207,73,139,241,172,60,77,117,199,73,139,241,172,60,69,117,191, 73,139,241,172,60,82,117,183,73,139,241,172,60,58,117,175,88,88,91,254,198,254,198,254,198,254,198,235,45,89,91,138,7,233, 53,255,160,252,2,12,2,162,252,2,50,192,195,160,252,2,12,4,235,243,208,208,114,231,138,7,60,132,117,3,232,225,255,60,143,117, 3,232,229,255,138,7,254,192,138,7,117,5,67,138,7,36,127,67,60,161,117,3,232,248,67,60,177,117,10,138,7,67,60,233,176,177, 116,1,75,83,81,82,205,163,187,54,1,138,232,177,64,254,193,67,138,247,138,211,46,138,7,10,192,116,242,159,67,158,121,244,46, 138,7,58,197,117,232,135,218,60,208,116,2,60,209,138,193,90,89,138,208,117,12,160,94,4,10,192,176,0,162,94,4,235,21,60,91, 117,7,50,192,162,94,4,235,29,160,94,4,10,192,176,255,162,94,4,116,13,176,32,139,249,170,65,254,206,117,3,233,164,5,138,194, 235,6,46,138,7,67,138,208,36,127,139,249,170,65,254,206,117,3,233,141,5,10,194,121,233,60,168,117,5,50,192,162,94,4,91,233, 100,254,232,191,13,114,1,195,60,48,114,251,60,58,245,195,75,232,136,237,82,81,80,232,33,238,88,185,181,33,81,60,11,117,3, 233,96,66,60,12,117,3,233,99,66,139,30,2,3,233,19,79,89,90,160,0,3,178,79,60,11,116,6,60,12,178,72,117,20,176,38,139,249, 170,65,254,206,116,192,138,194,139,249,170,65,254,206,116,182,160,1,3,60,4,178,0,114,6,178,33,116,2,178,35,138,7,60,32,117, 3,232,82,67,138,7,67,10,192,116,42,139,249,170,65,254,206,116,143,160,1,3,60,4,114,234,159,73,158,139,241,172,159,65,158, 117,4,60,46,116,8,60,68,116,4,60,69,117,211,178,0,235,207,138,194,10,192,116,9,139,249,170,65,254,206,117,1,195,139,30,254, 2,233,174,253,232,241,231,81,232,245,1,89,90,81,81,232,32,232,115,11,138,247,138,211,94,135,222,86,83,59,218,114,3,233,0, 238,187,45,7,232,246,88,89,187,221,9,94,135,222,86,135,218,139,30,88,3,139,242,172,139,249,170,65,66,59,218,117,244,139,217, 137,30,88,3,195,232,50,0,232,195,36,30,142,30,80,3,138,7,31,233,238,248,232,22,0,82,232,177,36,232,89,11,44,232,125,252,90, 6,142,6,80,3,139,250,170,7,195,232,122,244,83,232,4,0,135,218,91,195,185,173,107,81,232,105,248,120,246,205,164,160,166,4, 60,144,117,237,232,171,88,120,232,232,130,72,185,128,145,186,0,0,233,58,64,185,10,0,81,138,245,138,213,116,53,60,44,116,11, 82,232,116,237,138,238,138,202,90,116,38,232,0,11,44,232,102,237,116,29,88,232,246,10,44,82,232,104,237,116,3,233,182,228, 11,210,117,3,233,74,237,135,218,94,135,222,86,135,218,81,232,76,231,90,82,81,232,70,231,139,217,90,59,218,135,218,115,3,233, 44,237,90,89,88,83,82,235,21,3,217,115,3,233,30,237,135,218,83,187,249,255,59,218,91,115,3,233,16,237,82,139,23,11,210,135, 218,90,116,12,138,7,67,10,7,159,75,158,135,218,117,213,81,232,36,0,89,90,91,82,139,23,67,11,210,116,20,135,218,94,135,222, 86,135,218,67,137,23,135,218,3,217,135,218,91,235,228,185,181,8,81,60,13,50,192,162,61,3,139,30,48,0,75,67,138,7,67,10,7, 117,1,195,67,139,23,67,232,123,235,10,192,116,236,138,200,160,61,3,10,192,138,193,116,91,205,165,60,167,117,24,232,99,235, 60,137,117,228,232,92,235,60,14,117,221,82,232,172,236,11,210,117,10,235,41,60,14,117,204,82,232,158,236,83,232,140,230,159, 73,158,176,13,114,63,232,120,8,187,252,35,82,232,105,87,91,232,96,65,89,91,83,81,232,81,65,91,90,75,235,163,85,110,100,101, 102,105,110,101,100,32,108,105,110,101,32,0,60,13,117,234,82,232,97,236,83,135,218,67,67,67,138,15,67,138,47,176,14,187,247, 35,83,139,30,254,2,83,75,136,47,75,136,15,75,136,7,91,195,160,61,3,10,192,116,248,233,73,255,232,178,9,66,232,174,9,65,232, 170,9,83,232,166,9,69,160,93,4,10,192,116,3,233,110,227,83,139,30,90,3,135,218,139,30,92,3,59,218,116,3,233,92,227,91,138, 7,44,48,115,3,233,73,227,60,2,114,3,233,66,227,162,92,4,254,192,162,93,4,232,150,234,195,46,138,7,10,192,116,248,232,3,0, 67,235,243,159,134,196,80,134,196,233,25,7,116,9,232,132,242,83,232,6,71,235,32,83,187,210,36,232,165,86,232,225,12,90,115, 3,233,143,9,82,67,138,7,232,0,69,138,7,10,192,117,228,232,228,70,137,30,12,0,232,158,63,91,195,82,97,110,100,111,109,32,110, 117,109,98,101,114,32,115,101,101,100,32,40,45,51,50,55,54,56,32,116,111,32,51,50,55,54,55,41,0,177,29,235,2,177,26,181,0, 135,218,139,30,46,0,137,30,90,4,135,218,254,197,75,232,12,234,116,23,60,34,117,11,232,3,234,10,192,116,12,60,34,117,245,60, 161,116,29,60,205,117,228,10,192,117,21,67,138,7,67,10,7,138,209,117,3,233,157,226,67,139,23,67,137,22,90,4,232,215,233,60, 143,117,7,81,232,17,236,89,235,217,60,132,117,7,81,232,2,236,89,235,206,138,193,60,26,138,7,116,13,60,177,116,163,60,178, 117,161,254,205,117,157,195,60,130,116,150,60,131,117,148,254,205,116,243,232,157,233,116,168,135,218,139,30,46,0,83,139, 30,90,4,137,30,46,0,135,218,81,232,215,17,89,75,232,129,233,186,42,37,116,8,232,80,8,44,75,186,121,37,94,135,222,86,137,30, 46,0,91,82,195,159,80,160,168,4,162,169,4,88,158,159,80,50,192,162,168,4,88,158,195,232,219,2,138,7,67,138,15,67,138,47,90, 81,80,232,214,2,88,138,240,138,23,67,138,15,67,138,47,91,138,194,10,198,117,1,195,138,198,44,1,114,249,50,192,58,194,254, 192,115,241,254,206,254,202,139,241,172,65,58,7,159,67,158,116,220,245,233,114,63,232,247,61,235,8,232,252,61,235,3,232,174, 74,232,47,0,232,137,2,185,23,41,81,138,7,67,83,232,171,0,91,138,15,67,138,47,232,13,0,83,138,216,232,91,2,90,195,176,1,232, 149,0,187,44,3,83,136,7,67,137,23,91,195,75,181,34,138,245,83,177,255,67,138,7,254,193,10,192,116,8,58,198,116,4,58,197,117, 239,60,34,117,3,232,177,232,83,138,197,60,44,117,13,254,193,254,201,116,7,75,138,7,60,32,116,245,91,94,135,222,86,67,135, 218,138,193,232,180,255,186,44,3,176,82,139,30,12,3,137,30,163,4,176,3,162,251,2,232,23,62,186,47,3,59,218,137,30,12,3,91, 138,7,117,155,186,16,0,233,34,225,67,232,146,255,232,236,1,232,124,62,254,198,254,206,116,133,139,241,172,232,217,4,60,13, 117,3,232,165,5,65,235,236,10,192,235,2,88,158,159,80,139,30,92,3,135,218,139,30,47,3,246,208,138,200,181,255,3,217,67,59, 218,114,15,137,30,47,3,67,135,218,88,158,195,88,134,196,158,195,88,158,186,14,0,117,3,233,202,224,58,192,159,80,185,218,38, 81,139,30,10,3,137,30,47,3,187,0,0,83,139,30,92,3,83,187,14,3,139,22,12,3,59,218,185,42,39,116,3,233,156,0,187,226,3,137, 30,78,4,139,30,90,3,137,30,75,4,139,30,88,3,139,22,75,4,59,218,116,27,138,7,67,67,67,80,232,69,19,88,60,3,117,5,232,113,0, 50,192,138,208,182,0,3,218,235,221,139,30,78,4,139,23,11,210,139,30,90,3,116,25,135,218,137,30,78,4,67,67,139,23,67,67,135, 218,3,218,137,30,75,4,135,218,235,183,89,139,22,92,3,59,218,117,3,233,108,0,138,7,67,80,67,67,232,248,18,138,15,67,138,47, 67,88,83,3,217,60,3,117,221,137,30,51,3,91,138,15,181,0,3,217,3,217,67,135,218,139,30,51,3,135,218,59,218,116,196,185,197, 39,81,50,192,10,7,159,67,158,138,23,159,67,158,138,55,159,67,158,117,1,195,139,203,139,30,47,3,59,218,139,217,114,243,91, 94,135,222,86,59,218,94,135,222,86,83,139,217,115,227,89,88,88,83,82,81,195,90,91,11,219,116,249,75,138,47,75,138,15,83,75, 138,31,183,0,3,217,138,245,138,209,75,139,203,139,30,47,3,232,160,60,91,136,15,67,136,47,139,217,75,233,224,254,81,83,139, 30,163,4,94,135,222,86,232,160,240,94,135,222,86,232,237,59,138,7,83,139,30,163,4,83,2,7,186,15,0,115,3,233,120,223,232,219, 253,90,232,72,0,94,135,222,86,232,63,0,83,139,30,45,3,135,218,232,14,0,232,11,0,187,58,23,94,135,222,86,83,233,7,254,91,94, 135,222,86,138,7,67,138,15,67,138,47,138,216,254,195,254,203,117,1,195,139,241,172,139,250,170,65,66,235,241,232,146,59,139, 30,163,4,135,218,232,32,0,135,218,117,229,82,138,245,138,209,74,138,15,139,30,47,3,59,218,117,10,50,192,138,232,3,217,137, 30,47,3,91,195,205,238,139,30,12,3,75,138,47,75,138,15,75,59,218,117,238,137,30,12,3,195,185,127,27,81,232,183,255,50,192, 138,240,138,7,10,192,195,185,127,27,81,232,237,255,117,3,233,85,231,67,139,23,139,242,172,195,232,46,253,232,14,246,139,30, 45,3,136,23,89,233,114,253,232,255,229,232,211,4,40,232,247,245,82,232,203,4,44,232,250,237,232,196,4,41,94,135,222,86,83, 232,236,241,116,5,232,225,245,235,3,232,185,255,90,232,5,0,232,213,245,176,32,80,138,194,232,236,252,138,232,88,254,197,254, 205,116,188,139,30,45,3,136,7,67,254,205,117,249,235,175,232,163,0,50,192,94,135,222,86,138,200,176,83,83,138,7,58,197,114, 3,138,197,186,177,0,81,232,81,253,89,91,83,67,138,47,67,138,63,138,221,181,0,3,217,139,203,232,168,252,138,216,232,247,254, 90,232,13,255,233,232,252,232,102,0,90,82,139,242,172,42,197,235,188,135,218,138,7,232,92,0,254,197,254,205,117,3,233,152, 230,81,232,181,1,88,134,196,158,94,135,222,86,185,117,41,81,254,200,58,7,181,0,114,1,195,138,200,138,7,42,193,58,194,138, 232,114,243,138,234,195,232,0,255,117,3,233,142,241,138,208,67,139,31,83,3,218,138,47,136,55,94,135,222,86,81,75,232,23,229, 232,190,63,89,91,136,47,195,135,218,232,225,3,41,89,90,81,138,234,195,232,0,229,232,3,237,232,2,241,176,1,80,116,22,88,232, 243,244,10,192,117,3,233,38,230,80,232,189,3,44,232,236,236,232,253,57,232,179,3,44,83,139,30,163,4,94,135,222,86,232,217, 236,232,163,3,41,83,232,80,254,135,218,89,91,88,81,185,7,101,81,185,127,27,81,80,82,232,68,254,90,88,138,232,254,200,138, 200,58,7,176,0,115,162,139,242,172,10,192,138,197,116,153,138,7,67,138,47,67,138,63,138,221,181,0,3,217,42,193,138,232,81, 82,94,135,222,86,138,15,67,139,23,91,83,82,81,139,242,172,58,7,117,30,66,254,201,116,12,67,254,205,117,239,90,90,89,90,50, 192,195,91,90,90,89,138,197,42,199,2,193,254,192,195,89,90,91,67,254,205,117,208,235,229,232,33,3,40,232,151,12,232,97,57, 83,82,135,218,67,139,23,139,30,92,3,59,218,114,18,139,30,48,0,59,218,115,10,91,83,232,46,251,91,83,232,190,57,91,94,135,222, 86,232,241,2,44,232,21,244,10,192,117,3,233,75,229,80,138,7,232,102,0,82,232,4,236,83,232,138,253,135,218,91,89,88,138,232, 94,135,222,86,83,187,7,101,94,135,222,86,138,193,10,192,116,144,138,7,42,197,115,3,233,27,229,254,192,58,193,114,2,138,193, 138,205,254,201,181,0,82,67,138,23,67,138,63,138,218,3,217,138,232,90,135,218,138,15,67,139,31,135,218,138,193,10,192,117, 1,195,139,242,172,136,7,66,67,254,201,116,244,254,205,117,241,195,178,255,60,41,116,7,232,113,2,44,232,149,243,232,106,2, 41,195,232,150,239,116,3,233,6,0,232,18,253,232,124,251,139,22,92,3,139,30,47,3,233,203,239,205,180,159,134,196,80,134,196, 83,232,37,4,116,3,233,221,23,91,88,134,196,158,81,159,80,235,18,50,192,162,79,3,233,147,229,25,254,200,232,99,35,176,8,235, 56,60,9,117,16,176,32,232,202,255,232,78,35,36,7,117,244,88,158,89,195,60,32,114,32,160,41,0,138,232,232,58,35,254,197,116, 11,254,205,58,197,117,3,232,114,0,116,9,60,255,116,5,254,192,232,39,35,88,158,89,159,80,88,158,232,124,34,195,205,181,232, 188,3,116,61,232,182,23,115,243,81,82,83,160,54,5,36,200,162,54,5,232,204,24,91,90,89,160,107,4,10,192,116,3,233,10,49,160, 239,4,10,192,116,7,187,232,14,83,233,237,0,83,81,82,187,45,7,232,2,79,90,89,176,13,91,195,232,18,33,195,232,204,34,10,192, 116,248,235,11,198,7,0,232,106,3,187,246,1,117,7,205,182,176,13,232,45,255,232,91,3,116,3,50,192,195,50,192,232,172,34,50, 192,195,205,183,160,94,0,10,192,117,1,195,232,196,255,117,3,232,220,1,233,144,1,232,239,50,83,232,175,32,116,33,232,176,255, 10,192,117,16,80,176,2,232,139,249,139,30,45,3,90,137,23,233,208,249,80,232,123,249,88,138,208,232,74,252,187,6,0,137,30, 163,4,176,3,162,251,2,91,195,83,139,30,10,3,181,0,3,217,3,217,176,38,42,195,138,216,176,255,26,199,138,248,114,6,3,220,91, 115,1,195,139,30,44,0,75,75,137,30,69,3,186,7,0,233,212,218,57,30,47,3,115,233,81,82,83,232,6,250,91,90,89,57,30,47,3,115, 218,235,227,117,214,139,30,48,0,232,121,1,162,100,4,162,62,3,162,61,3,136,7,67,136,7,67,137,30,88,3,205,174,139,30,48,0,75, 205,175,137,30,59,3,160,101,4,10,192,117,23,50,192,162,93,4,162,92,4,181,26,187,96,3,205,176,198,7,4,67,254,205,117,248,186, 7,0,187,11,0,232,198,55,50,192,162,79,3,138,216,138,248,137,30,77,3,137,30,86,3,139,30,10,3,160,107,4,10,192,117,4,137,30, 47,3,50,192,232,124,0,139,30,88,3,137,30,90,3,137,30,92,3,160,101,4,10,192,117,3,232,180,21,160,54,5,36,1,117,3,162,54,5, 89,139,30,44,0,75,75,137,30,69,3,67,67,205,177,139,227,187,14,3,137,30,12,3,232,243,247,232,202,230,50,192,138,248,138,216, 137,30,124,3,162,77,4,137,30,228,3,137,30,80,4,137,30,122,3,162,57,3,83,81,139,30,59,3,195,59,218,195,94,139,251,252,46,166, 86,139,223,117,10,138,7,60,58,114,1,195,233,28,225,233,178,217,135,218,139,30,48,0,116,17,135,218,232,82,226,83,232,74,220, 139,217,90,114,3,233,11,227,75,137,30,94,3,135,218,195,117,253,254,192,235,9,117,247,156,117,3,232,159,10,157,137,30,67,3, 187,14,3,137,30,12,3,187,12,255,89,139,30,46,0,83,156,138,195,34,199,254,192,116,12,137,30,84,3,139,30,67,3,137,30,86,3,232, 245,253,157,187,50,7,116,3,233,20,218,233,65,218,176,15,80,176,94,232,41,253,88,4,64,232,35,253,233,236,253,139,30,86,3,11, 219,186,17,0,117,3,233,69,217,139,22,84,3,137,22,46,0,195,184,50,192,162,118,4,195,232,200,8,82,83,187,110,4,232,11,54,139, 30,90,3,94,135,222,86,232,108,236,80,232,55,255,44,232,173,8,88,138,232,232,94,236,58,197,116,3,233,8,217,94,135,222,86,135, 218,83,139,30,90,3,59,218,117,19,90,91,94,135,222,86,82,232,210,53,91,186,110,4,232,203,53,91,195,233,102,225,176,1,162,57, 3,232,115,8,117,243,83,162,57,3,138,253,138,217,73,73,73,139,241,172,73,10,192,120,248,73,73,3,218,135,218,139,30,92,3,59, 218,139,242,172,139,249,170,159,66,158,159,65,158,117,240,73,139,217,137,30,92,3,91,138,7,60,44,117,183,232,226,223,235,182, 88,134,196,158,91,195,138,7,60,65,114,249,60,91,245,195,233,238,253,116,251,60,44,116,9,232,251,224,75,232,192,223,116,238, 232,146,254,44,116,232,139,22,44,0,60,44,116,3,232,71,0,75,232,169,223,82,116,78,232,122,254,44,116,72,232,55,0,75,232,153, 223,116,3,233,53,216,94,135,222,86,83,187,238,0,59,218,115,45,91,232,54,0,114,39,83,139,30,88,3,185,20,0,3,217,59,218,115, 25,135,218,137,30,10,3,91,137,30,44,0,91,235,150,232,240,242,11,210,117,3,233,152,224,195,233,47,253,139,22,44,0,43,22,10, 3,235,186,139,195,43,194,139,208,195,205,178,83,139,30,233,4,11,219,91,195,1,48,78,48,225,48,253,47,241,47,91,48,48,48,27, 48,139,30,86,0,232,74,0,116,1,195,235,4,176,1,235,2,176,255,162,112,0,254,192,232,101,1,183,1,232,11,0,117,232,232,11,31, 232,94,0,50,192,195,160,92,0,58,195,116,248,115,7,138,216,50,192,233,245,30,254,195,233,240,30,160,91,0,58,195,116,227,176, 1,58,195,116,221,254,203,233,222,30,160,41,0,58,199,116,209,254,199,233,210,30,139,30,91,0,183,1,137,30,88,0,233,197,30,139, 30,86,0,232,9,0,117,182,160,41,0,138,248,235,197,176,1,58,199,116,169,254,207,233,170,30,160,91,0,138,248,160,92,0,138,216, 42,199,114,150,254,192,80,232,153,0,160,88,0,254,195,58,195,254,203,115,13,58,199,114,9,117,2,176,1,254,200,162,88,0,88,254, 200,117,3,233,3,0,232,222,30,195,160,91,0,138,216,160,92,0,138,248,42,195,114,241,254,192,80,232,127,0,160,88,0,58,195,114, 16,58,199,120,3,233,9,0,117,2,176,255,254,192,162,88,0,88,254,200,116,207,233,187,30,139,30,91,0,160,93,0,138,232,138,197, 58,195,115,2,138,216,58,199,115,2,138,248,138,199,183,0,42,195,254,192,186,114,0,80,135,218,3,218,136,7,67,136,7,67,254,200, 117,249,135,218,88,50,192,162,88,0,162,89,0,162,90,0,233,43,255,80,232,55,0,181,1,138,200,138,197,139,250,170,74,139,242, 172,138,233,138,200,88,254,200,117,1,195,80,235,234,80,181,1,232,23,0,138,200,138,197,139,250,170,66,139,242,172,138,233, 138,200,88,254,200,116,226,80,235,235,83,186,116,0,183,0,254,203,3,218,138,7,135,218,91,34,192,195,83,186,116,0,183,0,254, 203,3,218,136,7,135,218,91,195,205,166,232,65,1,139,30,86,0,137,30,88,0,160,41,0,254,192,235,30,176,63,232,12,250,176,32, 232,7,250,50,192,162,39,0,205,167,232,30,1,139,30,86,0,137,30,88,0,138,199,162,90,0,232,225,4,254,203,116,5,176,1,232,175, 255,232,12,35,232,65,35,232,164,27,232,8,35,232,56,35,10,192,117,3,232,119,28,80,139,30,86,0,138,38,41,0,254,196,58,30,88, 0,117,18,58,62,89,0,115,4,136,62,89,0,58,62,90,0,118,6,138,231,136,38,90,0,88,232,47,0,114,16,116,187,232,3,2,232,153,249, 235,179,1,232,147,249,235,173,60,3,249,116,1,245,187,246,1,195,60,59,117,251,233,248,220,75,67,254,201,120,242,46,58,7,117, 246,195,187,148,50,177,14,232,236,255,121,3,233,7,0,80,50,192,162,114,0,88,187,162,50,177,12,232,216,255,121,3,233,32,0,80, 138,193,10,192,208,192,138,200,50,192,138,232,187,174,50,3,217,46,138,23,67,46,138,55,88,82,139,30,86,0,195,10,192,195,3, 34,192,195,139,30,86,0,128,255,1,117,11,254,203,232,215,254,117,7,138,62,41,0,232,144,28,233,222,249,195,13,2,6,5,3,11,12, 28,29,30,31,14,127,27,9,10,8,18,2,6,5,3,13,14,127,27,255,52,86,52,202,52,57,51,175,51,7,53,37,53,77,53,1,52,119,52,243,50, 193,51,232,13,253,116,200,88,181,254,187,247,1,232,65,249,136,7,60,13,116,17,60,10,117,6,138,197,60,254,116,237,67,254,205, 117,232,254,205,50,192,136,7,187,246,1,195,160,114,0,10,192,116,58,232,97,254,80,135,218,198,7,0,135,218,254,195,232,41,3, 160,41,0,42,199,116,11,254,192,80,232,245,0,88,254,200,117,247,139,30,86,0,232,59,254,88,138,200,50,192,139,250,170,66,138, 193,139,250,170,50,192,195,176,10,10,192,195,232,90,2,186,247,1,181,254,160,88,0,58,195,183,1,160,41,0,117,19,139,30,88,0, 82,232,9,254,90,160,41,0,116,5,160,90,0,254,200,162,90,0,232,60,2,138,197,34,192,116,16,82,232,238,253,90,117,9,183,1,254, 195,160,41,0,235,228,135,218,176,254,42,198,138,240,75,138,7,60,32,116,8,10,192,117,7,254,206,116,3,75,235,239,67,198,7,0, 135,218,176,13,80,183,1,232,124,27,176,13,232,252,247,187,246,1,88,249,195,50,192,162,247,1,232,167,253,117,4,254,195,235, 247,176,3,235,221,138,199,254,200,36,248,4,8,254,192,138,232,160,41,0,58,197,115,2,138,232,138,197,160,114,0,10,192,138,197, 117,12,58,199,116,5,138,248,232,54,27,50,192,195,42,199,116,251,80,160,80,0,232,20,0,232,170,247,88,254,200,117,241,195,160, 114,0,246,208,162,114,0,50,192,195,83,139,30,86,0,80,160,114,0,10,192,116,3,232,3,0,88,91,195,160,88,0,58,195,117,16,83,187, 90,0,254,7,160,41,0,58,7,115,2,136,7,91,160,80,0,138,200,232,143,1,114,16,116,220,80,50,192,232,40,253,254,195,232,230,1, 88,254,203,254,195,183,1,235,227,83,160,41,0,58,199,117,11,183,0,160,93,0,58,195,117,0,254,195,254,199,232,9,0,91,83,232, 173,26,50,192,91,195,176,1,58,199,116,4,254,207,235,20,83,254,203,116,14,160,41,0,138,248,232,208,252,117,4,94,135,222,86, 91,232,136,26,160,88,0,58,195,117,10,160,90,0,254,200,116,3,162,90,0,232,66,1,83,232,174,252,117,17,254,195,183,1,232,5,2, 94,135,222,86,232,251,1,91,235,230,91,232,85,26,50,192,195,232,145,252,117,11,160,91,0,58,195,116,4,254,195,235,240,160,41, 0,138,248,160,80,0,138,200,81,232,34,26,89,10,192,116,12,58,193,116,8,254,199,232,42,26,50,192,195,254,207,116,244,235,229, 232,148,0,183,1,232,25,26,83,160,80,0,232,173,1,91,254,199,160,41,0,254,192,58,199,117,237,232,65,252,117,165,183,1,254,195, 235,226,198,6,112,0,0,235,8,232,229,25,232,74,1,114,15,232,64,0,116,19,235,241,232,214,25,232,59,1,115,7,232,49,0,116,4,235, 241,50,192,195,50,192,162,112,0,235,8,232,189,25,232,34,1,115,15,232,38,0,116,235,235,241,232,174,25,232,19,1,114,7,232,23, 0,116,220,235,241,232,2,0,235,211,139,30,86,0,232,196,250,117,204,183,1,233,150,250,139,30,86,0,232,223,250,117,190,160,41, 0,138,248,233,154,250,254,203,116,5,232,193,251,116,247,254,195,195,81,160,90,0,58,199,114,26,232,103,25,232,22,0,139,250, 170,66,94,135,222,86,254,207,94,135,222,86,116,4,254,199,235,223,89,195,10,192,117,2,176,32,195,232,69,0,80,232,138,251,116, 21,88,34,192,116,241,60,32,116,237,160,80,0,58,193,116,230,138,193,34,192,195,88,249,195,160,41,0,58,199,116,25,254,199,232, 196,0,83,254,207,232,187,0,91,254,199,160,41,0,254,192,58,199,117,235,254,207,160,80,0,232,167,0,195,83,81,232,164,0,89,80, 138,193,232,154,0,88,138,200,160,41,0,254,192,254,199,58,199,117,231,138,193,91,195,83,160,92,0,42,195,114,47,116,34,139, 30,91,0,94,135,222,86,83,138,195,162,91,0,160,93,0,162,92,0,232,90,250,91,94,135,222,86,137,30,91,0,91,83,183,1,232,249,24, 91,176,1,233,6,251,139,30,86,0,254,203,116,3,232,171,24,232,254,249,91,254,203,195,60,48,114,251,60,58,114,18,60,65,114,243, 60,91,114,10,60,97,114,235,60,123,114,2,249,195,34,192,195,83,183,1,160,41,0,138,232,81,232,101,24,89,60,255,116,8,254,199, 254,205,117,241,91,195,91,83,183,1,232,164,24,91,195,233,67,24,233,73,24,162,40,0,139,30,71,3,10,199,34,195,254,192,135,218, 116,232,235,19,187,246,1,116,225,249,156,67,233,117,210,232,124,217,116,3,233,114,217,91,137,22,73,3,232,120,211,114,3,233, 60,218,139,217,67,67,139,23,67,67,83,135,218,232,78,46,91,138,7,60,9,116,5,176,32,232,151,244,232,188,232,187,247,1,232,169, 232,232,95,251,139,30,86,0,254,203,116,9,254,203,116,5,232,53,250,116,247,254,195,232,240,23,233,160,209,60,10,116,3,233, 107,244,83,139,30,233,4,138,199,10,195,91,176,10,117,8,80,176,13,232,87,244,88,195,232,82,244,176,13,232,77,244,176,10,195, 75,232,190,215,117,1,195,232,143,246,44,185,91,55,81,176,200,235,2,50,192,162,250,2,138,15,205,179,232,201,247,115,3,233, 63,208,50,192,138,232,162,142,0,67,138,7,60,46,114,66,116,13,60,58,115,4,60,48,115,5,232,171,247,114,51,138,232,81,181,255, 186,142,0,12,128,254,197,139,250,170,66,67,138,7,60,58,115,4,60,48,115,237,232,139,247,115,232,60,46,116,228,138,197,60,39, 114,3,233,245,207,89,162,142,0,138,7,60,38,115,30,186,3,56,82,182,2,60,37,116,132,254,198,60,36,117,1,195,254,198,60,33,116, 249,182,8,60,35,116,243,88,138,193,36,127,138,208,182,0,83,187,31,3,3,218,138,55,91,75,138,198,162,251,2,232,18,215,160,57, 3,254,200,117,3,233,122,1,120,3,233,16,0,138,7,44,40,117,3,233,205,0,44,51,117,3,233,198,0,50,192,162,57,3,83,160,77,4,10, 192,162,74,4,116,30,139,30,124,3,186,126,3,3,218,137,30,75,4,135,218,233,247,45,160,74,4,10,192,116,36,50,192,162,74,4,139, 30,90,3,137,30,75,4,139,30,88,3,233,220,45,232,4,255,195,50,192,138,240,138,208,89,94,135,222,86,195,91,94,135,222,86,82, 186,106,56,59,218,116,231,186,218,25,59,218,90,116,73,94,135,222,86,83,81,160,251,2,138,232,160,142,0,2,197,254,192,138,200, 81,181,0,65,65,65,139,30,92,3,83,3,217,89,83,232,25,44,91,137,30,92,3,139,217,137,30,90,3,75,198,7,0,59,218,117,248,90,136, 55,67,90,137,23,67,232,221,1,135,218,66,91,195,232,134,66,235,8,198,6,79,3,0,233,120,10,232,64,226,117,7,187,6,0,137,30,163, 4,91,195,83,139,30,250,2,94,135,222,86,138,240,82,81,186,142,0,139,242,172,10,192,116,61,135,218,4,2,208,216,138,200,232, 195,243,138,193,138,15,67,138,47,67,81,254,200,117,245,83,160,142,0,80,135,218,232,40,215,88,137,30,181,0,91,4,2,208,216, 89,75,136,47,75,136,15,254,200,117,245,139,30,181,0,235,8,232,10,215,50,192,162,142,0,160,92,4,10,192,116,8,11,210,117,3, 233,95,0,74,89,88,134,196,158,135,218,94,135,222,86,83,135,218,254,192,138,240,138,7,60,44,116,136,60,41,116,7,60,93,116, 3,233,64,206,232,156,213,137,30,82,3,91,137,30,250,2,178,0,82,235,7,83,159,134,196,80,134,196,139,30,90,3,233,175,44,160, 250,2,10,192,116,3,233,32,206,88,134,196,158,139,203,117,3,233,85,43,42,7,117,3,233,152,0,186,9,0,233,25,206,160,251,2,136, 7,67,138,208,182,0,88,134,196,158,117,3,233,202,0,136,15,67,136,47,232,211,0,67,138,200,232,245,242,67,67,137,30,49,3,136, 15,67,160,250,2,208,208,138,193,114,15,159,80,160,92,4,52,11,138,200,181,0,88,158,115,4,89,159,65,158,136,15,159,80,67,136, 47,67,232,122,42,88,158,254,200,117,218,159,80,138,238,138,202,135,218,3,218,115,3,233,207,242,232,220,242,137,30,92,3,75, 198,7,0,59,218,117,248,50,192,65,138,240,139,30,49,3,138,23,135,218,3,219,3,217,135,218,75,75,137,23,67,67,88,158,114,70, 138,232,138,200,138,7,67,182,91,139,23,67,67,94,135,222,86,80,59,218,114,3,233,79,255,232,29,42,3,218,88,254,200,139,203, 117,227,160,251,2,139,203,3,219,44,4,114,8,3,219,10,192,116,11,3,219,10,192,122,3,233,2,0,3,217,89,3,217,135,218,139,30,82, 3,195,249,26,192,91,195,138,7,67,81,181,0,138,200,3,217,89,195,81,82,159,80,186,142,0,139,242,172,138,232,254,197,139,242, 172,66,67,136,7,254,205,117,245,88,158,90,89,195,232,90,220,232,106,41,232,32,243,59,135,218,139,30,163,4,235,10,160,58,3, 10,192,116,17,90,135,218,83,50,192,162,58,3,254,192,156,82,138,47,10,237,117,3,233,95,213,67,139,31,235,36,138,213,83,177, 2,138,7,67,60,92,117,3,233,157,1,60,32,117,6,254,193,254,205,117,236,91,138,234,176,92,232,214,1,232,130,240,50,192,138,208, 138,240,232,202,1,138,240,138,7,67,60,33,117,3,233,111,1,60,35,116,82,60,38,117,3,233,96,1,254,205,117,3,233,46,1,60,43,176, 8,116,217,75,138,7,67,60,46,116,85,60,95,117,3,233,55,1,60,92,116,156,58,7,117,182,60,36,116,24,60,42,117,174,138,197,67, 60,2,114,4,138,7,60,36,176,32,117,10,254,205,254,194,190,50,192,4,16,67,254,194,2,198,138,240,254,194,177,0,254,205,116,97, 138,7,67,60,46,116,30,60,35,116,237,60,44,117,35,138,198,12,64,138,240,235,225,138,7,60,35,176,46,116,3,233,101,255,177,1, 67,254,193,254,205,116,54,138,7,67,60,35,116,243,82,186,244,59,82,138,247,138,211,60,94,116,1,195,58,7,117,251,67,58,7,117, 246,67,58,7,117,241,67,138,197,44,4,114,234,90,90,138,232,254,198,67,235,3,135,218,90,138,198,75,254,194,36,8,117,28,254, 202,138,197,10,192,116,20,138,7,44,45,116,6,60,254,117,10,176,8,4,4,2,198,138,240,254,205,91,157,116,101,81,82,232,2,219, 90,89,81,83,138,234,138,197,2,193,60,25,114,3,233,35,212,138,198,12,128,232,92,59,232,119,234,91,75,232,216,210,249,116,17, 162,58,3,60,59,116,7,60,44,116,3,233,104,203,232,196,210,89,135,218,91,83,156,82,138,7,42,197,67,182,0,138,208,139,31,3,218, 138,197,10,192,116,3,233,173,254,235,6,232,123,0,232,39,239,91,157,116,3,233,88,254,115,3,232,231,239,94,135,222,86,232,28, 236,91,233,3,216,195,232,93,0,254,205,138,7,67,232,4,239,235,202,177,0,235,5,177,1,235,1,88,254,205,232,69,0,91,157,116,208, 81,232,110,218,232,127,39,89,81,83,139,30,163,4,138,233,177,0,138,197,80,138,197,10,192,116,3,232,161,236,232,228,233,139, 30,163,4,88,10,192,117,3,233,94,255,42,7,138,232,176,32,254,197,254,205,117,3,233,79,255,232,177,238,235,244,80,138,198,10, 192,176,43,116,3,232,163,238,88,195,137,30,53,3,232,236,231,232,15,210,135,218,232,102,0,159,68,158,159,68,158,117,8,3,217, 139,227,137,30,69,3,139,30,46,0,83,139,30,53,3,83,82,235,40,116,3,233,137,202,135,218,232,63,0,117,103,139,227,137,30,69, 3,139,22,46,0,137,22,90,4,67,67,139,23,67,67,139,31,137,30,46,0,135,218,232,204,217,83,232,132,39,91,116,9,185,177,0,138, 233,81,233,125,209,139,30,90,4,137,30,46,0,91,89,89,233,111,209,187,4,0,3,220,67,138,7,67,185,130,0,58,193,117,7,185,18,0, 3,217,235,238,185,177,0,58,193,116,1,195,57,23,185,6,0,116,248,3,217,235,219,186,30,0,233,47,202,232,58,7,75,232,109,209, 116,85,232,114,217,83,232,108,221,116,61,232,10,51,232,139,232,139,30,163,4,67,138,23,67,138,55,139,242,172,60,32,117,9,66, 136,55,75,136,23,75,254,15,232,220,232,91,75,232,58,209,116,34,60,59,116,5,232,8,240,44,75,232,44,209,176,44,232,175,237, 235,186,176,34,232,168,237,232,186,232,176,34,232,160,237,235,215,232,103,238,233,139,214,205,168,83,138,242,232,135,1,116, 9,60,58,116,15,232,126,1,121,247,138,214,91,50,192,176,252,205,171,195,138,198,42,194,254,200,60,2,115,5,205,172,233,97,201, 60,5,114,3,233,90,201,89,82,81,138,200,138,232,186,156,62,94,135,222,86,83,138,7,60,97,114,6,60,123,115,2,44,32,81,138,232, 139,242,46,172,67,66,58,197,89,117,21,254,201,117,226,139,242,46,172,10,192,120,3,233,6,0,91,91,90,10,192,195,10,192,120, 235,139,242,46,172,10,192,159,66,158,121,245,138,205,91,83,139,242,46,172,10,192,117,182,233,254,200,75,89,66,68,255,83,67, 82,78,254,76,80,84,49,253,67,65,83,49,252,0,123,88,145,88,167,88,189,88,205,169,83,82,159,134,196,80,134,196,186,46,0,3,218, 176,255,42,7,2,192,138,208,205,170,182,0,187,177,62,3,218,46,138,23,67,46,138,55,88,134,196,158,138,216,183,0,3,218,46,138, 23,67,46,138,55,135,218,90,94,135,222,86,195,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,17,216,83,232,140,233, 138,7,10,192,116,79,67,138,23,67,138,63,138,218,138,208,50,192,162,255,6,232,219,254,159,134,196,80,134,196,185,240,4,182, 11,254,194,254,202,116,77,138,7,60,32,114,38,60,46,116,40,139,249,170,65,67,254,206,117,233,88,134,196,158,159,134,196,80, 134,196,138,240,160,240,4,254,192,116,6,88,134,196,158,91,195,233,40,200,67,235,202,176,1,162,255,6,138,198,60,11,116,239, 60,3,114,235,116,236,176,32,139,249,170,65,254,206,235,234,176,32,139,249,170,65,254,206,117,246,235,186,138,7,67,254,202, 195,232,122,223,138,216,160,223,4,58,195,115,3,233,233,199,183,0,3,219,135,218,139,30,224,4,3,218,139,31,160,54,5,254,192, 116,219,138,7,10,192,116,213,83,186,46,0,3,218,138,7,60,9,115,5,205,220,233,192,199,91,138,7,10,192,249,195,75,232,53,207, 60,35,117,3,232,46,207,232,42,223,94,135,222,86,83,232,171,255,117,3,233,155,199,137,30,233,4,195,185,152,20,81,232,28,215, 138,7,60,44,117,89,83,232,145,232,138,7,10,192,117,3,233,124,199,67,139,31,138,7,36,223,178,1,60,73,116,21,178,2,60,79,116, 15,178,4,60,82,116,9,178,8,60,65,116,3,233,84,199,91,82,232,175,237,44,60,35,117,3,232,208,206,232,204,222,232,161,237,44, 138,194,10,192,117,3,233,61,199,80,232,178,254,88,89,138,209,205,221,233,131,0,232,169,254,138,7,60,130,178,4,117,89,232, 165,206,60,133,178,1,116,77,60,79,116,32,60,73,116,55,232,107,237,65,232,103,237,80,232,99,237,80,232,95,237,69,232,91,237, 78,232,87,237,68,178,8,235,44,232,120,206,232,76,237,85,232,72,237,84,232,68,237,80,232,64,237,85,232,60,237,84,178,2,235, 17,232,93,206,232,49,237,66,232,45,237,77,178,32,75,232,79,206,232,35,237,65,232,31,237,83,82,138,7,60,35,117,3,232,61,206, 232,57,222,10,192,117,3,233,176,198,205,222,180,82,75,138,208,232,41,206,116,3,233,197,198,94,135,222,86,138,194,159,134, 196,80,134,196,83,232,156,254,116,3,233,149,198,90,138,198,60,9,205,223,115,3,233,131,198,83,185,46,0,3,217,136,55,176,0, 91,233,145,253,83,10,192,117,10,160,54,5,36,1,116,3,233,70,3,232,107,254,116,21,137,30,233,4,83,176,2,115,3,233,113,253,205, 224,233,80,198,232,36,3,91,83,186,49,0,3,218,136,7,138,248,138,216,137,30,233,4,91,2,7,198,7,0,91,195,249,235,3,13,50,192, 159,80,232,159,253,205,233,88,158,159,80,116,20,138,7,44,44,10,192,117,12,232,150,205,232,106,236,82,88,158,249,159,80,159, 80,50,192,178,1,232,84,255,139,30,233,4,185,49,0,3,217,88,158,26,192,36,128,12,1,162,54,5,88,158,159,80,26,192,162,239,4, 138,7,10,192,121,3,233,216,0,88,158,116,3,232,87,235,50,192,232,44,254,233,5,199,232,66,253,205,234,75,232,70,205,178,128, 249,117,3,232,121,5,116,24,232,16,236,44,60,80,178,146,117,6,232,47,205,249,235,8,232,0,236,65,10,192,178,2,159,80,138,194, 36,16,162,98,4,88,158,159,80,254,192,162,95,0,50,192,232,221,254,88,158,83,139,30,233,4,138,7,91,36,128,117,3,233,20,221, 83,232,99,225,160,98,4,10,192,116,3,232,121,4,139,30,88,3,137,30,4,7,139,30,48,0,83,139,30,233,4,232,198,0,10,192,121,3,233, 22,0,233,77,197,160,98,4,10,192,116,3,232,162,4,91,50,192,162,98,4,233,200,254,91,232,2,0,235,231,232,160,0,60,252,117,3, 233,13,26,205,235,233,31,197,139,30,48,0,10,192,232,3,0,233,70,0,159,80,232,131,0,60,252,117,3,233,54,26,88,158,205,236,233, 0,197,88,158,195,36,32,162,99,4,88,158,117,3,233,241,196,232,119,234,160,99,4,162,100,4,232,171,0,50,192,232,241,252,198, 7,128,137,30,233,4,232,75,0,10,192,120,179,205,237,233,211,196,160,100,4,10,192,116,3,232,40,4,232,39,199,67,67,137,30,88, 3,232,90,234,50,192,162,54,5,232,67,254,160,239,4,10,192,116,3,233,249,203,233,196,197,135,218,139,30,47,3,135,218,59,218, 114,152,232,28,234,50,192,162,54,5,233,235,233,83,82,139,30,233,4,186,46,0,3,218,138,7,90,91,195,117,30,83,81,80,186,38,67, 82,81,10,192,195,88,89,254,200,121,240,91,195,89,91,138,7,60,44,117,247,232,228,203,81,138,7,60,35,117,3,232,218,203,232, 214,219,94,135,222,86,83,186,46,67,82,249,255,227,185,40,65,160,223,4,235,191,160,54,5,10,192,120,204,185,40,65,50,192,160, 223,4,235,174,50,192,138,232,138,197,232,49,252,198,7,0,160,223,4,254,197,42,197,115,239,50,192,162,54,5,232,149,233,139, 30,48,0,75,198,7,0,233,219,195,91,88,134,196,158,83,82,81,159,134,196,80,134,196,139,30,233,4,176,6,232,5,0,205,227,233,235, 195,159,134,196,80,134,196,82,135,218,187,46,0,3,218,138,7,135,218,90,60,9,115,3,233,202,0,88,134,196,158,94,135,222,86,91, 233,228,250,81,83,82,139,30,233,4,176,8,232,206,255,205,228,233,180,195,90,91,89,195,232,48,203,232,4,234,36,232,0,234,40, 83,139,30,233,4,83,187,0,0,137,30,233,4,91,94,135,222,86,232,18,219,82,138,7,60,44,117,11,232,9,203,232,205,251,91,50,192, 138,7,159,80,232,211,233,41,88,158,94,135,222,86,159,80,138,195,10,192,117,3,233,38,204,83,232,7,226,135,218,89,88,158,159, 80,116,40,232,22,232,60,3,116,19,136,7,67,254,201,117,236,88,158,89,91,137,30,233,4,81,233,51,226,88,158,139,30,46,0,137, 30,71,3,91,233,6,195,232,106,255,115,3,233,48,195,235,213,205,229,232,18,0,83,181,1,232,2,0,91,195,50,192,136,7,67,254,205, 117,249,195,139,30,233,4,186,51,0,3,218,195,88,134,196,158,195,232,7,251,117,3,233,250,194,176,10,115,3,233,18,250,205,230, 233,238,194,232,243,250,117,3,233,230,194,176,12,115,3,233,254,249,205,231,233,218,194,232,223,250,117,3,233,210,194,176, 14,115,3,233,234,249,205,232,233,198,194,232,255,234,117,3,233,31,202,50,192,232,71,252,178,66,233,242,194,60,35,117,173, 232,44,218,232,4,233,44,138,194,83,232,0,251,91,138,7,195,185,236,45,81,50,192,233,36,252,232,30,214,185,155,22,186,32,44, 117,27,138,214,235,23,185,152,20,81,232,204,255,232,81,242,232,27,31,82,185,138,17,50,192,138,240,138,208,80,81,83,232,165, 254,115,3,233,107,194,60,32,117,6,254,198,254,206,117,238,60,34,117,19,138,232,138,194,60,44,138,197,117,9,138,245,138,213, 232,129,254,114,83,187,247,1,181,255,138,200,138,198,60,34,138,193,116,46,60,13,83,116,89,91,60,10,117,36,138,200,138,194, 60,44,138,193,116,3,232,137,0,83,232,85,254,91,114,38,60,13,117,12,138,194,60,32,116,21,60,44,176,13,116,15,10,192,116,11, 58,198,116,14,58,194,116,10,232,99,0,83,232,47,254,91,115,178,83,60,34,116,4,60,32,117,37,232,32,254,114,32,60,32,116,247, 60,44,116,24,60,13,117,4,205,225,116,16,139,30,233,4,138,200,176,18,232,221,253,205,226,233,195,193,91,198,7,0,187,246,1, 138,194,44,32,116,7,181,0,232,102,224,91,195,232,55,213,159,80,232,42,201,88,158,159,80,115,3,232,196,35,88,158,114,3,232, 196,35,91,195,10,192,116,251,136,7,67,254,205,117,244,89,235,197,232,70,0,162,96,0,254,192,116,3,233,158,193,83,81,178,2, 232,198,250,91,232,59,252,50,192,162,96,0,233,26,252,232,38,0,10,192,116,7,254,192,117,3,233,125,193,254,200,162,96,0,83, 81,50,192,178,1,232,158,250,91,232,46,252,50,192,162,96,0,91,233,204,250,232,180,248,82,75,232,185,200,90,117,3,176,1,195, 82,232,134,231,44,232,43,0,82,75,232,166,200,117,5,89,90,50,192,195,232,115,231,44,232,24,0,89,135,218,3,217,137,30,4,7,135, 218,75,232,137,200,116,3,233,37,193,90,176,255,195,232,135,208,83,232,17,220,90,135,218,195,185,11,13,139,30,48,0,135,218, 139,30,88,3,59,218,117,1,195,187,23,98,138,195,2,193,138,216,138,199,20,0,138,248,139,242,172,42,197,46,50,7,80,187,118,97, 138,195,2,197,138,216,138,199,20,0,138,248,88,46,50,7,2,193,139,250,170,66,254,201,117,2,177,11,254,205,117,188,181,13,235, 184,185,11,13,139,30,48,0,135,218,139,30,88,3,59,218,116,175,187,118,97,138,195,2,197,138,216,138,199,20,0,138,248,139,242, 172,42,193,46,50,7,80,187,23,98,138,195,2,193,138,216,138,199,20,0,138,248,88,46,50,7,2,197,139,250,170,66,254,201,117,2, 177,11,254,205,117,189,181,13,235,185,83,139,30,46,0,138,199,34,195,91,254,192,116,1,195,159,80,160,100,4,10,192,116,3,233, 245,200,88,158,195,138,7,60,64,117,3,232,173,199,185,0,0,138,245,138,209,60,234,116,31,138,7,60,207,156,117,3,232,152,199, 232,108,230,40,232,126,215,82,232,100,230,44,232,118,215,232,93,230,41,89,157,83,139,30,61,5,116,3,187,0,0,159,3,217,209, 222,158,209,214,137,30,61,5,137,30,55,5,139,203,139,30,59,5,116,3,187,0,0,3,218,137,30,59,5,137,30,57,5,135,218,91,195,50, 192,235,2,176,3,80,232,164,255,88,232,46,0,83,232,40,3,115,6,232,127,2,232,85,2,91,195,232,49,199,232,140,255,83,232,20,3, 187,255,255,115,10,232,104,2,232,27,2,138,216,183,0,232,7,29,91,195,176,3,81,82,138,208,75,232,12,199,116,11,232,222,229, 44,60,44,116,3,232,254,214,138,194,83,232,193,2,115,3,233,48,200,91,90,89,233,239,198,139,30,55,5,138,195,42,193,138,216, 138,199,26,197,138,248,115,197,50,192,42,195,138,216,26,199,42,195,138,248,249,195,139,30,57,5,138,195,42,194,138,216,138, 199,26,198,138,248,235,222,83,139,30,57,5,135,218,137,30,57,5,91,195,232,240,255,83,81,139,30,55,5,94,135,222,86,137,30,55, 5,89,91,195,232,226,254,81,82,232,106,229,234,232,237,254,232,118,255,90,89,116,83,232,92,229,44,232,88,229,66,117,3,233, 96,0,232,79,229,70,83,232,93,2,232,193,255,232,87,2,232,156,255,115,3,232,169,255,67,83,232,114,255,115,3,232,175,255,67, 83,232,156,1,90,89,82,81,232,219,0,80,83,135,218,232,105,2,91,88,232,215,0,232,248,0,89,90,73,138,197,10,193,117,227,91,195, 81,82,83,232,69,0,139,30,61,5,137,30,55,5,139,30,59,5,137,30,57,5,91,90,89,195,83,139,30,57,5,83,82,135,218,232,218,255,91, 137,30,57,5,135,218,232,208,255,91,137,30,57,5,139,30,55,5,81,139,203,232,193,255,91,137,30,55,5,139,203,232,183,255,91,195, 205,184,232,207,1,232,51,255,232,201,1,232,14,255,115,3,232,40,255,82,83,232,228,254,135,218,187,241,73,115,3,187,5,74,94, 135,222,86,59,218,115,20,137,30,253,6,91,137,30,247,6,187,213,73,137,30,249,6,135,218,235,22,94,135,222,86,137,30,249,6,187, 213,73,137,30,247,6,135,218,137,30,253,6,91,90,83,137,30,251,6,232,211,0,90,82,232,5,0,89,65,233,32,2,138,198,10,192,208, 216,138,240,138,194,208,216,138,208,195,139,30,243,6,160,245,6,195,137,30,243,6,162,245,6,195,139,30,243,6,129,251,0,32,114, 9,129,235,0,32,137,30,243,6,195,129,195,80,32,137,30,243,6,195,139,30,243,6,129,251,0,32,114,9,129,235,176,31,137,30,243, 6,195,129,195,0,32,137,30,243,6,195,138,193,138,14,85,0,210,14,245,6,138,200,114,1,195,255,6,243,6,195,138,193,138,14,85, 0,210,6,245,6,138,200,114,1,195,255,14,243,6,195,140,198,191,0,184,142,199,139,30,243,6,38,138,7,138,22,245,6,34,194,138, 14,85,0,210,234,114,4,210,232,235,248,142,198,195,140,198,191,0,184,142,199,139,30,243,6,139,233,160,245,6,246,208,38,34, 7,138,14,246,6,34,14,245,6,10,193,38,136,7,139,205,142,198,195,139,233,209,234,159,139,218,177,2,211,226,3,211,177,4,211, 226,158,115,4,129,194,0,32,137,22,243,6,139,213,138,202,246,6,85,0,1,116,20,176,7,34,200,176,128,210,232,162,245,6,177,3, 211,234,1,22,243,6,195,176,3,34,200,2,201,176,192,210,232,162,245,6,177,2,211,234,1,22,243,6,195,160,72,0,199,6,59,5,100, 0,60,6,116,18,115,28,60,4,114,24,198,6,85,0,2,199,6,61,5,160,0,195,198,6,85,0,1,199,6,61,5,64,1,195,198,6,85,0,0,195,60,4, 115,15,246,6,85,0,1,116,12,36,1,246,216,162,246,6,248,195,233,93,197,36,3,177,85,246,225,162,246,6,248,195,160,85,0,10,192, 116,235,10,237,120,39,187,128,2,132,6,1,0,116,3,187,64,1,59,203,159,114,3,75,139,203,10,246,120,12,129,250,200,0,114,4,186, 199,0,195,158,195,51,210,195,51,201,159,235,232,140,198,191,0,184,142,199,139,211,11,210,116,108,139,30,243,6,38,138,47,160, 245,6,138,224,246,208,138,14,85,0,138,30,246,6,34,232,138,252,34,251,10,239,74,116,64,210,200,210,204,115,239,139,30,243, 6,38,136,47,255,6,243,6,136,38,245,6,139,202,209,233,209,233,246,6,85,0,1,117,6,129,226,3,0,235,6,129,226,7,0,209,233,227, 171,252,160,246,6,139,62,243,6,243,170,137,62,243,6,235,155,139,30,243,6,38,136,47,136,38,245,6,142,198,195,232,127,254,3, 22,253,6,59,22,251,6,114,9,43,22,251,6,62,255,22,249,6,62,255,22,247,6,226,227,195,83,232,163,207,91,195,83,232,39,25,91, 195,246,128,62,113,0,0,116,3,233,249,4,195,160,41,0,138,208,232,255,210,233,237,4,0,0,0,180,15,205,16,162,72,0,180,40,60, 2,114,13,180,80,60,7,117,7,185,12,11,137,14,104,0,136,38,41,0,250,140,219,137,30,80,3,30,186,0,0,142,218,137,30,16,5,187, 52,77,137,30,108,0,187,68,87,137,30,112,0,140,14,110,0,140,14,114,0,31,232,50,0,187,24,2,185,0,0,142,193,185,122,0,38,140, 143,2,0,38,199,7,148,76,131,195,4,224,241,140,219,142,195,232,72,225,251,180,1,205,23,232,119,6,187,155,76,232,223,46,233, 99,50,190,237,76,187,83,6,185,10,0,83,252,46,172,136,7,67,10,192,117,246,91,131,195,16,224,239,195,207,62,255,46,0,7,203, 84,104,101,32,73,66,77,32,80,101,114,115,111,110,97,108,32,67,111,109,112,117,116,101,114,32,66,97,115,105,99,255,13,86,101, 114,115,105,111,110,32,67,49,46,49,48,32,67,111,112,121,114,105,103,104,116,32,73,66,77,32,67,111,114,112,32,49,57,56,49, 255,13,0,50,53,45,65,112,114,45,56,49,76,73,83,84,32,0,82,85,78,13,0,76,79,65,68,34,0,83,65,86,69,34,0,67,79,78,84,13,0,44, 34,76,80,84,49,58,34,13,0,84,82,79,78,13,0,84,82,79,70,70,13,0,75,69,89,32,0,83,67,82,69,69,78,32,48,44,48,44,48,13,0,156, 80,30,82,186,0,0,142,218,142,30,16,5,232,58,10,136,22,106,0,254,202,136,22,94,0,90,31,88,157,207,86,160,94,0,10,192,117,17, 160,106,0,10,192,117,10,180,1,205,22,176,0,116,2,254,200,94,195,160,94,0,10,192,116,8,50,192,162,94,0,176,3,195,86,87,160, 106,0,10,192,117,116,180,0,205,22,10,192,116,3,95,94,195,83,128,252,59,114,5,128,252,69,114,60,139,30,46,0,67,11,219,117, 19,187,52,78,177,26,46,58,39,116,12,67,254,192,254,201,117,244,50,192,91,235,211,50,228,208,224,139,216,46,139,159,3,1,137, 30,107,0,254,14,106,0,208,232,4,65,140,14,109,0,235,224,80,134,196,44,59,179,16,246,227,187,83,6,3,216,246,7,255,88,116,204, 137,30,107,0,140,30,109,0,254,14,106,0,235,12,83,254,200,117,7,162,106,0,176,32,235,178,30,197,30,107,0,138,7,31,255,6,107, 0,10,192,116,2,121,160,50,228,140,203,138,30,110,0,58,223,114,4,254,196,36,127,136,38,106,0,10,192,117,136,91,233,119,17, 30,48,46,32,18,33,34,35,23,36,37,38,50,49,24,25,16,19,31,20,22,47,17,45,21,44,83,81,86,190,108,78,177,14,252,46,172,58,224, 116,9,70,254,201,117,244,50,192,235,2,46,172,94,89,91,195,71,11,72,30,75,29,77,28,80,31,28,10,116,6,115,2,118,1,82,18,83, 127,79,14,117,5,119,12,31,30,29,28,13,12,11,10,156,83,81,82,80,60,7,116,77,60,13,117,10,246,6,111,0,255,116,3,232,139,0,232, 44,2,116,4,60,255,116,57,60,12,116,34,187,135,78,185,8,0,67,254,201,120,28,46,58,7,117,246,208,225,139,217,185,233,78,81, 46,255,183,225,47,139,30,86,0,195,232,14,4,235,14,232,62,0,232,14,0,232,13,225,235,3,232,36,9,88,90,89,91,157,195,80,138, 62,73,0,138,30,78,0,185,1,0,180,9,205,16,88,195,83,232,113,0,232,231,255,91,195,83,232,104,0,180,8,205,16,91,195,232,243, 255,138,232,138,204,195,139,30,86,0,137,30,86,0,156,83,232,77,0,91,157,195,160,87,0,254,200,195,80,138,14,41,0,42,14,87,0, 254,193,181,0,138,62,73,0,138,30,79,0,176,32,180,9,205,16,139,22,86,0,134,242,254,206,254,202,180,2,205,16,88,195,83,232, 21,0,138,62,73,0,138,30,79,0,138,14,41,0,181,0,176,32,180,9,205,16,91,80,82,139,211,134,242,254,206,254,202,138,62,73,0,180, 2,205,16,90,88,195,83,82,177,0,138,239,138,243,232,27,0,180,6,205,16,235,15,83,82,177,0,138,235,138,247,232,10,0,180,7,205, 16,232,28,0,90,91,195,232,17,0,138,22,41,0,254,202,254,206,254,205,176,1,138,62,79,0,195,160,73,0,235,3,160,74,0,232,6,1, 117,32,138,38,72,0,128,252,7,116,23,82,186,0,8,128,252,2,114,2,208,230,50,228,247,226,30,142,218,163,78,4,31,90,195,156,83, 82,80,186,0,0,180,0,205,23,138,196,128,228,40,128,252,40,116,13,246,196,8,117,12,168,1,116,13,178,24,235,6,178,27,235,2,178, 25,233,186,183,88,80,60,13,233,93,15,88,90,91,157,195,60,147,116,96,60,149,116,70,60,221,116,70,232,227,206,10,192,116,56, 254,200,60,10,115,50,186,16,0,246,226,138,208,129,194,83,6,82,232,162,221,44,232,209,198,83,232,76,216,138,15,128,249,15, 114,2,177,15,67,139,55,91,95,83,181,0,252,243,164,136,45,232,114,251,91,195,233,225,191,176,255,235,2,176,0,58,6,113,0,162, 113,0,116,3,232,94,0,232,144,190,195,83,190,83,6,185,10,0,254,197,86,176,70,232,8,219,81,138,221,183,0,232,171,20,176,32, 232,251,218,89,94,86,81,252,172,10,192,116,5,232,19,0,235,245,176,13,232,231,218,89,94,131,198,16,254,201,117,206,91,235, 192,86,60,13,117,2,176,27,232,209,218,94,195,80,160,72,0,60,7,116,4,60,4,115,2,50,192,10,192,88,195,83,205,173,182,24,178, 0,138,62,73,0,180,2,205,16,160,113,0,10,192,117,19,138,30,79,0,138,14,41,0,181,0,180,9,205,16,232,13,254,91,195,179,7,232, 192,255,117,9,160,76,0,10,192,117,2,179,112,190,83,6,181,5,160,41,0,60,40,176,49,116,2,181,10,80,83,138,30,78,0,232,55,0, 91,86,177,6,81,252,172,10,192,156,86,117,2,50,192,232,37,0,94,157,117,1,78,89,254,201,117,232,232,22,0,94,131,198,16,88,254, 192,60,58,114,2,176,48,254,205,117,199,232,175,253,91,195,50,192,83,10,192,117,6,176,32,138,30,79,0,60,13,117,2,176,27,81, 185,1,0,180,9,205,16,254,194,180,2,205,16,89,91,195,138,14,73,0,181,0,138,38,72,0,246,196,1,116,3,128,205,128,128,252,4,114, 9,254,197,128,252,6,114,2,254,197,81,60,44,116,12,232,97,205,89,138,232,81,232,92,189,116,64,232,45,220,44,60,44,116,21,232, 77,205,10,192,116,2,176,128,89,128,229,3,10,232,81,232,63,189,116,35,232,16,220,44,60,44,116,12,232,48,205,89,138,200,81, 232,43,189,116,15,232,252,219,44,232,32,205,138,240,89,235,6,233,85,190,89,138,241,138,38,41,0,138,197,36,127,10,192,116, 10,50,210,10,214,10,209,117,230,235,27,128,252,40,116,12,128,254,4,115,218,128,249,4,114,12,235,211,128,254,8,115,206,128, 249,8,115,201,138,209,10,192,116,32,128,62,72,0,7,116,92,177,6,60,2,180,80,116,42,180,40,254,201,254,200,117,172,246,197, 128,117,29,254,201,235,25,177,2,128,252,40,116,9,246,197,128,116,13,254,193,235,9,254,201,246,197,128,117,2,254,201,136,38, 41,0,161,72,0,136,14,72,0,137,22,73,0,58,193,116,26,184,7,0,163,75,0,134,196,163,77,0,136,38,79,0,232,58,254,116,3,162,79, 0,232,110,0,160,74,0,180,5,205,16,195,58,6,41,0,116,52,138,38,72,0,60,80,116,7,60,40,116,3,233,152,189,128,252,7,117,4,176, 80,235,28,128,244,2,128,252,7,117,2,254,204,80,162,41,0,136,38,72,0,199,6,73,0,0,0,232,45,0,88,195,83,232,218,252,178,39, 128,62,41,0,40,116,2,178,79,182,24,138,62,79,0,185,0,0,138,193,180,6,205,16,186,0,0,138,62,73,0,180,2,205,16,235,15,83,185, 0,0,137,14,73,0,160,72,0,180,0,205,16,232,189,221,232,201,248,232,138,247,232,157,252,91,195,232,164,253,116,91,177,0,190, 81,0,128,62,72,0,6,117,3,233,22,189,138,44,86,81,232,212,187,116,64,60,44,116,7,232,201,203,89,138,232,81,89,81,83,138,249, 138,221,128,255,0,117,8,128,251,8,114,3,128,203,16,180,11,205,16,91,232,171,187,116,3,232,165,187,89,94,136,44,116,8,70,254, 193,128,249,4,114,189,198,6,79,0,0,195,89,94,195,255,54,77,0,255,54,75,0,60,44,116,16,232,126,203,60,32,115,24,89,138,200, 81,232,117,187,116,44,232,70,218,44,60,44,116,19,232,102,203,60,16,114,3,233,156,188,89,138,232,81,232,90,187,116,17,232, 43,218,44,232,79,203,60,16,115,233,89,90,138,208,82,81,89,90,138,241,128,230,15,137,14,75,0,138,197,208,224,36,16,10,194, 128,229,7,208,229,208,229,208,229,208,229,246,193,16,116,3,128,205,128,10,238,83,138,216,183,0,36,15,162,77,0,136,46,78,0, 136,46,79,0,180,11,205,16,91,195,255,54,86,0,60,44,116,32,232,250,202,10,192,116,91,60,26,115,87,138,38,113,0,10,228,116, 4,60,25,115,75,90,138,208,82,232,225,186,116,123,232,178,217,44,60,44,116,24,232,210,202,10,192,116,51,138,38,41,0,58,224, 114,43,90,138,240,82,232,193,186,116,91,255,54,104,0,232,142,217,44,60,44,116,25,232,174,202,10,192,176,0,117,2,176,32,89, 10,232,81,232,161,186,116,45,235,3,233,213,187,232,109,217,44,232,145,202,60,32,115,242,89,128,229,32,10,232,138,200,81,232, 131,186,116,15,232,84,217,44,232,120,202,60,32,115,217,89,138,200,81,89,81,128,229,15,137,14,104,0,89,180,1,205,16,90,137, 22,86,0,134,242,254,206,254,202,83,138,62,73,0,180,2,205,16,91,195,80,176,0,235,3,80,176,32,156,81,83,80,232,61,250,88,91, 139,14,104,0,246,6,114,0,255,116,2,181,4,10,232,180,1,205,16,89,157,88,195,0,0,0,0,255,255,255,255,255,255,255,255,255,255, 255,255,80,156,232,201,251,116,75,83,81,82,140,198,191,0,0,142,199,38,255,54,124,0,38,255,54,126,0,38,199,6,124,0,248,84, 38,140,14,126,0,142,198,176,129,2,6,114,0,179,131,138,62,73,0,185,1,0,180,9,205,16,140,198,191,0,0,142,199,38,143,6,126,0, 38,143,6,124,0,142,198,90,89,91,157,88,195,232,189,185,160,86,0,233,114,246,232,180,185,232,101,0,10,238,117,86,10,234,10, 233,116,80,138,38,41,0,58,226,114,72,128,249,26,115,67,160,113,0,10,192,116,5,128,249,25,115,55,83,138,241,254,206,254,202, 138,62,73,0,180,2,205,16,180,8,205,16,91,80,232,119,185,60,44,116,4,176,0,235,7,232,66,216,44,232,102,201,80,232,58,216,41, 88,10,192,88,116,2,138,196,233,18,246,233,144,186,232,5,0,232,37,216,41,195,232,32,216,40,232,50,201,82,232,24,216,44,232, 42,201,89,195,232,56,185,60,149,116,8,232,8,216,221,50,192,235,5,232,41,185,176,255,162,52,0,195,160,52,0,10,192,116,48,232, 27,201,60,10,115,41,83,86,186,26,86,82,50,228,209,224,139,240,46,255,180,29,86,195,94,91,195,52,86,63,86,70,86,76,86,107, 86,114,86,120,86,128,86,136,86,144,86,233,37,186,187,53,0,138,7,198,7,0,233,159,245,139,30,55,0,233,198,14,160,57,0,233,140, 245,180,4,205,16,80,10,228,116,12,137,30,58,0,136,46,60,0,137,22,63,0,88,138,196,254,200,246,208,233,115,245,139,30,58,0, 233,154,14,160,60,0,233,96,245,160,62,0,254,192,233,88,245,160,61,0,254,192,233,80,245,160,64,0,254,192,233,72,245,160,63, 0,254,192,233,64,245,232,132,200,10,192,116,18,60,4,115,84,180,0,83,187,65,0,3,216,138,7,91,233,39,245,83,186,1,2,185,1,1, 187,15,0,250,238,236,36,15,58,195,225,249,227,11,50,195,138,225,80,254,199,50,216,235,236,10,255,116,26,138,215,187,65,0, 185,4,0,88,246,212,2,226,208,232,115,2,136,39,67,226,247,254,202,117,232,251,91,160,65,0,233,225,244,233,95,185,232,32,184, 60,149,116,8,232,240,214,221,50,192,235,5,232,17,184,176,255,162,69,0,195,160,69,0,10,192,116,222,232,3,200,60,4,115,215, 168,1,116,14,180,16,254,200,116,2,180,64,232,208,0,233,172,244,83,187,70,0,10,192,116,1,67,138,7,198,7,0,91,233,154,244,156, 80,85,86,87,30,186,0,0,142,218,142,30,16,5,161,102,0,10,196,116,9,255,14,102,0,117,3,232,39,0,160,52,0,10,192,116,3,232,54, 0,160,69,0,10,192,116,3,232,105,0,31,95,94,93,88,157,207,198,6,101,0,0,161,102,0,11,192,116,24,82,250,246,6,101,0,255,117, 7,186,97,0,236,36,252,238,199,6,102,0,0,0,251,90,195,83,81,82,180,4,205,16,80,10,228,116,12,137,30,58,0,136,46,60,0,137,22, 63,0,88,160,54,0,50,196,116,25,10,228,136,38,54,0,116,17,137,30,55,0,136,46,57,0,137,22,61,0,176,255,162,53,0,90,89,91,195, 83,187,70,0,128,63,0,117,7,180,16,232,17,0,136,7,67,128,63,0,117,7,180,64,232,4,0,136,7,91,195,82,186,1,2,236,34,196,254, 200,152,138,196,90,195,232,9,0,184,211,5,186,4,0,82,235,56,139,22,102,0,10,242,116,7,198,6,101,0,255,235,241,195,232,222, 198,131,250,37,114,18,82,232,191,213,44,232,113,202,89,82,11,210,117,7,90,233,59,255,233,19,184,232,208,255,186,18,0,184, 220,52,247,241,246,6,101,0,255,117,8,80,186,67,0,176,182,238,88,186,66,0,238,138,196,238,117,7,186,97,0,236,12,3,238,90,137, 22,102,0,198,6,101,0,0,195,10,90,77,65,89,16,89,16,25,90,89,16,89,16,89,16,89,16,45,90,89,16,52,90,77,65,89,16,69,90,89,16, 89,16,89,16,89,16,89,16,89,16,93,90,99,90,77,65,89,16,124,90,89,16,89,16,89,16,89,16,89,16,89,16,170,90,177,90,110,91,89, 16,171,91,240,91,89,16,89,16,108,92,89,16,118,92,89,16,34,194,117,34,156,80,83,137,30,233,4,136,23,131,195,45,198,7,0,67, 67,136,47,67,198,7,0,67,136,15,67,198,7,0,91,88,157,195,233,152,174,88,91,195,128,250,128,117,2,178,2,195,88,134,196,158, 89,90,91,195,90,91,89,195,131,195,46,138,7,246,208,195,139,30,233,4,131,195,43,195,139,30,233,4,131,195,50,195,139,30,233, 4,138,135,47,0,195,86,87,81,198,6,63,5,165,190,240,4,191,64,5,185,8,0,252,164,226,253,89,95,94,195,83,81,187,64,5,177,8,128, 63,32,117,13,67,254,201,117,246,190,92,5,191,72,5,235,16,190,84,5,191,64,5,177,8,252,166,117,39,254,201,117,249,138,5,58, 4,116,9,10,192,117,25,246,4,1,117,20,138,4,139,30,233,4,136,135,49,0,187,244,89,232,14,0,50,192,235,7,187,254,89,232,4,0, 249,89,91,195,83,139,30,46,0,67,11,219,116,2,91,195,187,83,5,83,67,177,8,138,7,232,213,244,67,254,201,117,246,176,46,232, 203,244,91,131,195,9,176,68,246,7,225,116,23,176,80,246,7,32,117,16,176,66,246,7,128,117,9,176,65,246,7,64,117,2,176,77,91, 232,165,244,46,138,7,67,10,192,117,245,195,32,70,111,117,110,100,46,255,13,0,32,83,107,105,112,112,101,100,46,255,13,0,185, 0,0,136,14,82,5,176,234,232,189,254,233,227,254,187,82,5,138,7,198,7,0,10,192,117,5,232,70,243,10,192,233,226,254,136,14, 82,5,233,163,235,232,200,254,138,46,41,0,177,0,176,237,232,145,254,233,183,254,88,80,134,196,232,68,244,138,14,87,0,254,201, 139,30,233,4,136,143,50,0,233,170,254,88,134,196,233,73,248,138,46,98,0,177,0,232,147,254,176,109,232,98,254,232,175,254, 160,99,0,136,7,233,128,254,88,80,134,196,232,3,0,233,129,254,232,106,245,187,99,0,60,13,117,3,233,228,4,60,32,115,1,195,254, 7,83,232,141,254,91,254,192,116,244,254,200,56,7,233,197,4,88,134,196,162,98,0,195,160,97,0,10,192,116,3,233,232,172,128, 226,251,117,2,178,1,162,81,5,254,192,162,80,5,138,202,128,225,128,128,233,1,245,26,201,128,225,128,246,194,16,116,3,128,201, 32,160,96,0,10,192,116,2,177,1,10,201,117,9,246,6,95,0,255,116,2,177,64,136,14,72,5,181,255,176,104,232,210,253,138,39,232, 46,254,246,196,1,117,12,246,193,129,117,3,232,47,0,176,255,235,31,232,51,0,232,48,254,114,248,139,30,233,4,246,135,49,0,129, 117,10,232,17,1,115,5,198,6,80,5,0,176,1,162,97,0,232,231,253,198,7,1,233,186,253,187,63,5,185,17,0,180,3,205,21,195,187, 83,5,185,17,0,83,180,2,205,21,115,3,233,2,1,91,160,94,0,10,192,117,6,128,63,165,117,230,195,233,41,172,160,97,0,254,192,116, 11,50,192,162,97,0,162,96,0,233,205,229,139,30,233,4,246,135,49,0,129,117,234,232,59,0,232,31,1,235,226,83,187,97,0,56,39, 117,13,139,30,233,4,246,135,49,0,129,91,117,1,195,233,233,171,180,255,232,227,255,88,80,134,196,232,3,0,233,77,253,232,38, 0,136,7,254,193,116,11,232,93,253,136,15,195,232,87,253,138,15,187,83,5,181,0,254,201,65,136,15,180,3,205,21,232,68,253,198, 7,1,195,232,61,253,138,15,181,0,187,83,5,3,217,195,180,1,232,158,255,232,3,0,233,20,253,160,80,5,44,1,115,1,195,187,81,5, 138,7,198,7,0,10,192,116,1,195,232,10,0,115,7,198,6,80,5,0,10,192,195,232,195,255,138,7,254,193,232,252,252,136,15,232,239, 252,58,15,116,3,10,192,195,128,63,0,117,221,80,232,2,0,88,195,187,83,5,185,0,1,180,2,205,21,114,21,160,83,5,232,203,252,136, 7,232,206,252,198,7,1,254,200,249,116,1,248,195,128,252,4,117,5,178,24,233,111,171,233,37,171,160,80,5,44,1,26,192,233,147, 8,136,14,81,5,233,90,233,198,6,95,0,0,83,137,30,77,5,139,22,80,3,137,22,75,5,139,14,4,7,43,203,137,14,73,5,81,82,232,164, 254,90,89,91,160,96,0,10,192,6,116,2,142,194,180,3,205,21,7,232,137,0,186,5,0,185,0,0,73,117,253,74,117,250,232,118,0,195, 190,83,5,139,140,10,0,160,96,0,10,192,156,81,117,13,80,83,81,86,3,217,232,22,230,94,89,91,88,60,1,117,4,139,156,14,0,6,10, 192,116,14,139,148,12,0,254,200,116,4,139,22,80,3,142,194,180,2,205,21,7,114,18,89,157,117,11,139,30,48,0,3,217,67,137,30, 88,3,233,128,229,80,232,5,208,88,128,252,4,117,5,178,24,233,181,170,233,107,170,75,232,243,177,117,5,160,100,0,235,3,232, 232,193,10,192,117,4,176,1,235,2,176,0,162,100,0,138,224,205,21,195,205,219,249,235,1,248,139,243,156,139,14,165,4,138,195, 50,193,162,167,4,138,199,50,228,138,221,50,255,157,115,7,3,195,45,1,1,235,2,43,195,10,228,120,13,61,128,0,114,21,139,222, 131,196,2,233,93,23,5,128,0,121,11,139,222,131,196,2,233,223,29,5,128,0,162,166,4,187,165,4,128,15,128,139,222,50,255,128, 203,128,195,198,6,57,3,128,232,198,217,83,139,218,232,234,6,232,4,197,137,30,94,4,177,32,232,27,207,91,232,96,177,116,23, 232,49,208,40,232,167,217,82,138,7,60,44,117,5,232,76,177,235,241,232,30,208,41,137,30,59,3,14,184,233,93,80,255,54,80,3, 255,54,94,4,203,139,30,59,3,195,83,232,14,5,60,108,116,10,60,76,116,6,60,113,116,2,60,81,91,195,38,38,38,38,38,38,38,38,38, 38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,37,37,36,36,36,35,35,35,34,34,34,34,33,33,33,32,32,32,31,31,31,31,30,30, 30,29,29,29,29,28,28,28,27,27,27,26,26,26,25,25,25,25,24,24,24,23,23,23,23,22,22,22,22,21,21,21,20,20,20,19,19,19,19,18,18, 18,17,17,17,16,16,16,16,15,15,15,14,14,14,13,13,13,13,12,12,12,11,11,11,10,10,10,10,9,9,9,8,8,8,7,7,7,6,6,6,6,5,5,5,4,4,4, 3,3,3,3,2,2,2,1,1,1,0,0,0,0,255,255,255,254,254,254,253,253,253,253,252,252,252,251,251,251,250,250,250,250,249,249,249,248, 248,248,247,247,247,247,246,246,246,245,245,245,244,244,244,244,243,243,243,242,242,242,241,241,241,241,240,240,240,239,239, 239,238,238,238,238,237,237,237,236,236,236,235,235,235,235,234,234,234,233,233,233,232,232,232,231,231,231,231,230,230,230, 229,229,229,228,228,228,228,227,227,227,226,226,226,225,225,225,225,224,11,246,121,2,247,218,43,215,112,61,116,58,83,232, 144,28,156,115,3,232,106,12,11,210,120,15,131,250,39,114,29,157,115,3,232,61,12,91,233,177,21,131,250,218,125,14,131,194, 38,131,250,218,124,17,232,19,0,186,218,255,232,13,0,157,115,3,232,29,12,91,195,232,31,28,235,243,11,210,156,121,2,247,218, 185,3,0,211,226,129,194,50,96,135,218,232,37,29,157,120,3,233,236,12,232,236,28,233,212,8,114,9,176,13,144,233,15,251,198, 7,0,138,7,232,164,249,136,7,195,117,6,176,10,144,232,105,240,88,90,91,157,195,128,62,106,0,0,116,18,30,83,197,30,107,0,128, 63,0,91,31,117,5,198,6,106,0,0,233,114,175,95,94,233,190,237,117,16,91,136,54,167,4,187,0,16,198,6,251,2,4,233,40,21,199, 6,165,4,0,0,195,16,91,136,54,167,4,187,0,16,198,6,251,2,4,233,16,21,199,6,165,4,0,0,195,92,214,237,189,206,254,230,91,95, 166,180,54,65,95,112,9,99,207,97,132,17,119,204,43,102,67,122,229,213,148,191,86,105,106,108,175,5,189,55,6,109,133,71,27, 71,172,197,39,112,102,25,226,88,23,183,81,115,224,79,141,151,110,18,3,119,216,163,112,61,10,215,35,122,205,204,204,204,204, 204,76,125,0,0,0,0,0,0,0,129,0,0,0,0,0,0,32,132,0,0,0,0,0,0,72,135,0,0,0,0,0,0,122,138,0,0,0,0,0,64,28,142,0,0,0,0,0,80,67, 145,0,0,0,0,0,36,116,148,0,0,0,0,128,150,24,152,0,0,0,0,32,188,62,155,0,0,0,0,40,107,110,158,0,0,0,0,249,2,21,162,0,0,0,64, 183,67,58,165,0,0,0,16,165,212,104,168,0,0,0,42,231,132,17,172,0,0,128,244,32,230,53,175,0,0,160,49,169,95,99,178,0,0,4,191, 201,27,14,182,0,0,197,46,188,162,49,185,0,64,118,58,107,11,94,188,0,232,137,4,35,199,10,192,0,98,172,197,235,120,45,195,128, 122,23,183,38,215,88,198,144,172,110,50,120,134,7,202,181,87,10,63,22,104,41,205,162,237,204,206,27,194,83,208,133,20,64, 97,81,89,4,212,166,25,144,185,165,111,37,215,16,32,244,39,143,203,78,218,10,148,248,120,57,63,1,222,12,185,54,215,7,143,33, 225,79,103,4,205,201,242,73,228,35,129,69,64,124,111,124,231,182,112,43,168,173,197,29,235,228,76,54,18,25,55,69,238,28,224, 195,86,223,132,118,241,18,108,58,150,11,19,26,245,22,7,201,123,206,151,64,248,220,72,187,26,194,189,112,251,137,13,181,80, 153,118,22,255,0,0,0,0,0,0,0,128,241,4,53,128,4,154,247,25,131,36,99,67,131,117,205,141,132,169,127,131,130,4,0,0,0,129,226, 176,77,131,10,114,17,131,244,4,53,127,24,114,49,128,46,101,69,37,35,33,68,100,44,48,0,128,198,164,126,141,3,0,64,122,16,243, 90,0,0,160,114,78,24,9,0,0,16,165,212,232,0,0,0,232,118,72,23,0,0,0,228,11,84,2,0,0,0,202,154,59,0,0,0,0,225,245,5,0,0,0, 128,150,152,0,0,0,0,64,66,15,0,0,0,0,64,66,15,160,134,1,16,39,0,16,39,232,3,100,0,10,0,1,0,0,0,128,144,255,255,255,255,255, 255,127,255,255,255,255,255,255,255,255,255,59,170,56,129,7,124,136,89,116,224,151,38,119,196,29,30,122,94,80,99,124,26,254, 117,126,24,114,49,128,0,0,0,129,5,251,215,30,134,101,38,153,135,88,52,35,135,225,93,165,134,219,15,73,131,2,215,179,93,129, 0,0,128,129,4,98,53,131,126,80,36,76,126,121,169,170,127,0,0,0,129,11,68,78,110,131,249,34,126,253,67,3,195,158,38,1,0,0, 48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,186,59,170,187,56,129,232,114,10,160,166,4,60,136,115,60,60,104,114,75,255, 54,163,4,255,54,165,4,232,96,16,138,226,128,196,129,116,35,80,246,6,167,4,128,232,67,16,50,228,232,230,17,88,91,90,80,232, 168,4,187,23,98,232,141,18,91,51,210,138,218,233,50,10,131,196,4,128,38,165,4,128,116,3,233,145,24,50,228,136,38,167,4,233, 249,17,191,163,4,144,51,192,252,171,199,5,0,129,195,232,175,24,117,3,233,222,164,195,252,171,199,5,0,129,195,233,26,172,205, 185,128,54,165,4,128,128,54,177,4,128,233,138,3,205,186,135,217,233,90,4,205,187,135,217,233,71,4,205,188,232,51,25,233,27, 5,135,217,233,177,5,205,189,137,30,163,4,233,107,8,205,190,82,152,139,208,232,238,8,90,195,205,191,135,217,233,183,9,205, 192,135,217,233,237,13,129,251,0,128,117,19,205,193,232,211,8,51,210,187,128,144,232,5,4,232,75,26,233,69,8,247,219,83,3, 218,112,4,88,233,153,1,205,194,232,181,8,90,255,54,163,4,255,54,165,4,232,169,8,91,90,233,234,3,139,195,82,247,234,90,114, 5,139,216,233,118,1,205,195,83,232,145,8,90,255,54,163,4,255,54,165,4,232,133,8,91,90,233,82,9,11,219,117,12,136,54,167,4, 198,6,251,2,4,233,45,17,137,30,163,4,184,0,0,163,165,4,146,11,192,121,3,186,255,255,11,219,121,6,199,6,165,4,255,255,247, 62,163,4,139,216,233,42,1,135,217,232,215,24,135,217,195,83,232,69,26,91,131,195,4,195,139,22,163,4,139,14,165,4,195,156, 83,232,25,26,91,131,195,4,157,195,232,171,190,137,30,163,4,233,103,10,232,161,190,137,30,163,4,233,101,10,205,196,139,23, 139,159,2,0,233,77,3,94,255,54,163,4,255,54,165,4,255,230,205,197,135,217,232,160,24,135,217,195,232,100,23,116,3,233,147, 163,195,135,218,232,205,0,50,192,181,152,205,198,187,166,4,138,200,136,47,181,0,67,136,47,208,208,205,199,115,3,232,32,1, 138,229,138,217,233,51,16,232,146,254,83,51,219,137,30,163,4,183,129,137,30,165,4,198,6,251,2,4,232,4,20,91,198,6,251,2,4, 195,139,193,247,226,146,115,3,233,37,213,195,187,171,4,186,183,100,233,6,0,187,171,4,186,185,100,82,186,163,4,232,247,22, 114,3,186,159,4,195,138,205,50,237,235,8,135,218,160,251,2,152,139,200,252,139,242,139,251,243,164,139,214,139,223,195,232, 54,200,139,241,139,251,253,43,202,65,243,164,139,218,139,207,65,252,195,156,73,157,195,232,188,22,117,3,233,235,162,205,200, 120,3,233,131,22,161,163,4,11,192,116,6,176,1,121,2,176,255,195,51,192,11,219,117,243,195,91,195,152,139,216,198,6,251,2, 2,137,30,163,4,195,198,6,251,2,4,195,232,196,255,233,231,255,205,201,91,90,233,181,3,232,37,6,91,90,233,11,12,185,4,0,233, 136,255,156,138,23,67,157,156,138,55,67,139,15,67,157,156,67,157,195,83,187,40,7,232,6,22,91,185,182,38,81,232,181,255,50, 192,205,202,162,49,3,187,180,4,198,7,32,10,7,67,198,7,48,233,106,11,205,203,160,165,4,235,9,205,204,232,229,23,116,8,246, 208,208,224,26,192,116,61,195,205,205,128,54,167,4,128,51,219,246,221,139,195,27,194,139,208,138,195,26,193,138,200,195,232, 3,22,120,250,205,206,232,207,21,120,3,233,213,24,232,2,24,232,207,24,233,252,23,139,195,43,194,116,14,112,7,120,7,50,192, 254,192,195,120,249,249,26,192,195,59,218,117,5,51,219,233,38,0,139,194,137,30,163,4,11,219,232,211,249,144,144,144,121,6, 199,6,165,4,255,255,11,192,186,0,0,121,3,186,255,255,247,62,163,4,139,218,137,30,163,4,195,173,58,225,116,17,70,2,4,254,192, 152,3,240,59,245,117,239,139,214,233,57,210,58,6,251,2,117,233,58,44,117,229,70,138,208,172,58,6,142,0,116,4,2,194,235,220, 10,192,116,16,152,145,191,143,0,243,166,145,116,6,3,240,138,194,235,200,139,214,91,195,139,243,139,46,75,4,252,235,190,139, 243,139,46,92,3,252,233,13,0,173,58,225,116,17,70,172,152,3,240,173,3,240,59,238,117,239,139,222,233,83,211,58,6,251,2,117, 233,58,44,117,229,70,172,58,6,142,0,117,223,10,192,116,14,152,145,191,143,0,243,166,145,116,4,3,240,235,208,173,139,208,139, 222,233,5,211,232,24,22,195,161,165,4,10,228,116,245,128,54,165,4,128,205,215,176,0,162,158,4,162,170,4,160,178,4,10,192, 116,226,161,165,4,10,228,116,216,139,30,177,4,128,14,165,4,128,128,14,177,4,128,138,204,42,207,162,167,4,116,34,115,18,134, 195,246,217,162,167,4,136,62,166,4,80,81,232,111,21,89,88,128,249,57,115,95,83,248,232,33,21,160,167,4,91,50,195,187,158, 4,190,170,4,185,4,0,248,252,120,30,173,17,7,67,67,226,249,115,18,187,166,4,254,7,116,52,75,75,185,4,0,209,31,75,75,226,250, 233,233,17,173,25,7,67,67,226,249,115,26,246,151,1,0,185,4,0,75,75,247,23,226,250,185,4,0,255,7,117,6,67,67,226,248,116,200, 233,244,12,233,141,13,160,167,4,36,128,128,38,165,4,127,8,6,165,4,195,137,30,165,4,137,22,163,4,195,161,165,4,10,228,116, 240,128,54,165,4,128,10,255,116,239,161,165,4,10,228,116,224,51,201,139,54,163,4,162,167,4,138,204,42,207,115,13,246,217, 134,223,137,30,166,4,134,223,147,135,214,138,224,50,227,156,180,128,10,196,10,220,50,228,138,252,11,201,116,70,131,249,25, 114,18,157,137,54,163,4,138,38,167,4,37,127,128,10,196,162,165,4,195,128,249,8,114,28,233,5,3,144,138,243,50,219,128,233, 8,246,196,31,116,208,128,204,32,235,203,128,204,32,226,3,235,14,248,208,219,209,218,208,220,246,196,16,117,237,226,243,157, 121,37,42,204,138,225,27,242,139,214,26,195,138,216,115,47,246,22,167,4,246,212,247,210,246,211,254,196,117,33,66,117,30, 254,195,117,26,235,6,3,214,18,216,115,12,254,6,166,4,116,9,208,219,209,218,208,220,233,36,17,233,169,12,233,104,12,232,37, 19,195,160,177,4,162,167,4,233,167,12,246,6,166,4,255,116,240,246,6,178,4,255,116,229,139,30,177,4,232,243,244,137,30,177, 4,187,164,4,248,232,161,19,187,176,4,248,232,154,19,255,54,166,4,232,94,21,143,6,166,4,185,64,0,81,235,8,81,248,187,170,4, 232,119,19,139,252,131,236,8,131,239,2,190,176,4,185,4,0,253,243,165,190,120,4,185,4,0,187,170,4,248,252,173,25,7,67,67,226, 249,115,16,185,4,0,139,244,191,170,4,252,243,165,139,230,248,235,4,131,196,8,249,187,158,4,232,56,19,89,226,182,246,6,165, 4,128,116,9,255,6,166,4,117,9,233,7,12,187,158,4,232,31,19,233,49,16,232,148,18,117,7,136,30,167,4,233,0,12,10,255,117,3, 233,122,18,232,87,244,139,250,51,210,138,254,139,243,138,223,185,32,0,85,139,46,163,4,160,165,4,138,231,235,5,248,209,215, 209,214,86,87,43,253,27,240,115,4,95,94,235,4,131,196,4,248,245,209,210,209,211,226,228,11,219,121,10,254,6,166,4,117,8,93, 233,165,11,209,210,209,211,138,226,138,214,138,243,138,223,93,233,13,16,19,249,83,87,81,44,48,80,232,80,18,88,152,121,30, 139,30,163,4,129,251,205,12,115,25,139,203,209,227,209,227,3,217,209,227,3,216,120,11,137,30,163,4,235,72,80,114,8,235,51, 80,232,36,2,235,20,199,6,124,4,0,36,199,6,126,4,116,148,187,126,4,232,131,19,121,22,232,60,18,90,255,54,163,4,255,54,165, 4,232,139,2,91,90,232,204,253,235,19,232,231,1,232,35,18,232,238,18,90,232,119,2,232,218,1,232,238,252,89,95,91,195,205,217, 50,192,233,9,0,205,218,176,1,198,6,251,2,8,198,6,168,4,1,190,180,37,86,51,255,139,207,139,247,247,209,80,232,134,17,88,10, 192,117,5,198,6,251,2,2,138,7,60,38,117,3,233,7,176,60,45,156,116,5,60,43,116,1,75,232,251,248,115,6,232,61,255,233,245,255, 189,163,97,51,210,139,242,46,58,134,0,0,116,10,129,253,156,97,116,36,77,233,239,255,129,237,156,97,209,229,46,255,166,48, 106,75,106,95,106,95,106,103,106,109,106,115,106,64,106,64,106,50,192,232,156,0,232,65,0,233,45,0,65,117,247,232,81,17,121, 175,81,83,87,232,72,1,95,91,89,233,163,255,232,140,243,116,225,233,219,255,67,235,219,233,11,0,232,188,0,233,5,0,50,192,232, 182,0,157,117,13,232,45,19,232,33,17,122,5,83,232,237,18,91,195,233,118,244,198,6,85,4,255,232,137,164,139,212,233,227,8, 10,255,117,5,232,232,16,249,195,160,166,4,10,192,117,8,138,195,246,208,232,228,16,249,195,232,228,255,93,114,20,235,16,83, 139,31,232,217,255,91,93,114,8,83,87,191,165,4,144,85,195,254,192,44,1,195,246,196,255,138,226,116,3,128,204,32,138,214,233, 237,252,16,159,128,62,251,2,8,117,4,158,233,8,0,158,83,87,232,92,0,95,91,51,246,139,214,232,4,248,114,19,60,45,117,4,247, 214,235,5,60,43,116,1,195,232,242,247,114,1,195,129,250,204,12,114,5,186,255,127,235,239,80,184,10,0,247,226,90,128,234,48, 50,246,3,208,235,223,12,1,83,87,117,7,232,28,0,235,5,144,144,232,70,0,95,91,51,246,139,214,232,189,243,67,195,232,88,16,120, 249,233,111,156,116,49,232,78,16,123,86,117,3,233,123,156,205,207,121,5,232,63,0,235,72,176,4,162,251,2,138,30,165,4,136, 30,167,4,139,22,163,4,138,38,162,4,128,204,64,128,203,128,233,213,13,232,29,16,115,37,117,3,233,74,156,205,208,121,3,232, 14,0,176,8,162,251,2,51,192,163,159,4,163,161,4,195,82,86,139,22,163,4,232,131,0,94,90,195,232,242,15,121,5,139,30,163,4, 195,205,209,117,3,233,24,156,160,166,4,60,144,114,49,116,3,233,6,156,160,165,4,10,192,120,3,233,252,155,186,0,0,187,0,128, 232,138,251,232,203,6,232,205,17,186,0,0,187,128,144,232,236,16,116,3,233,223,155,187,0,128,235,45,160,165,4,10,192,156,121, 5,36,127,162,165,4,186,0,0,187,0,128,232,103,251,160,166,4,60,144,117,6,157,120,219,233,183,155,232,231,6,139,218,157,121, 2,247,219,137,30,163,4,198,6,251,2,2,195,51,219,50,228,190,167,4,198,132,255,255,144,198,4,0,11,210,121,5,247,218,198,4,128, 138,222,138,242,138,215,198,6,251,2,4,233,75,8,205,214,160,166,4,10,192,116,10,160,178,4,10,192,117,4,233,248,14,195,139, 30,177,4,232,218,240,255,54,166,4,137,30,177,4,232,86,17,139,240,163,166,4,187,120,4,163,178,4,189,171,4,139,0,11,192,116, 44,191,0,0,139,207,139,0,247,35,83,139,222,3,223,129,195,151,4,3,7,115,1,66,3,193,115,1,66,137,7,139,202,91,131,255,6,116, 4,71,71,235,219,139,193,83,187,159,4,137,0,91,131,254,6,116,4,70,70,235,190,190,157,4,253,185,7,0,172,10,192,225,251,116, 5,128,14,158,4,32,160,165,4,10,192,143,6,166,4,120,15,187,158,4,185,4,0,209,23,67,67,226,250,233,25,12,254,6,166,4,117,247, 233,221,7,232,115,14,116,4,10,255,117,3,233,96,14,232,58,240,139,14,165,4,50,237,161,163,4,138,253,83,81,82,81,80,247,226, 139,202,88,247,227,3,200,115,1,66,139,218,90,88,247,226,3,200,115,1,66,3,218,90,88,246,226,3,216,115,13,209,219,209,217,254, 6,166,4,117,3,233,144,7,10,255,121,9,254,6,166,4,117,7,233,131,7,209,209,209,211,138,213,138,243,138,223,138,225,233,236, 11,195,83,176,8,114,2,176,17,138,232,138,200,81,156,232,72,2,10,192,116,2,121,12,157,89,80,123,11,4,16,88,121,26,235,9,157, 89,235,38,4,7,88,121,15,80,232,246,11,88,138,224,2,225,126,22,2,232,235,12,2,197,254,197,58,232,181,3,114,12,138,232,254, 197,176,2,235,4,2,197,181,3,254,200,254,200,91,80,156,50,201,232,77,0,198,7,48,117,1,67,232,232,0,75,128,63,48,116,250,128, 63,46,116,1,67,157,88,116,43,156,80,232,191,13,180,69,123,2,180,68,136,39,67,88,157,198,7,43,121,5,198,7,45,246,216,180,47, 254,196,44,10,115,250,4,58,67,134,196,137,7,67,67,198,7,0,135,217,187,180,4,195,254,205,121,22,137,30,82,3,198,7,46,67,198, 7,48,254,197,117,248,67,51,201,235,26,254,205,117,12,198,7,46,137,30,82,3,67,51,201,235,10,254,201,117,6,198,7,44,67,177, 3,137,14,129,4,195,180,5,189,245,97,232,217,255,46,139,150,0,0,69,69,139,54,163,4,176,47,254,192,43,242,115,250,3,242,136, 7,67,137,54,163,4,254,204,117,221,232,182,255,198,7,0,195,185,1,3,190,6,0,235,6,185,4,4,190,4,0,191,179,4,252,187,116,98, 139,22,163,4,86,138,198,50,228,211,224,134,224,46,215,170,211,226,138,205,78,117,238,198,5,0,187,179,4,89,254,201,128,63, 48,117,3,67,226,248,195,232,233,12,123,119,81,83,190,159,4,191,171,4,185,4,0,252,243,165,232,117,3,83,187,177,4,232,253,13, 91,190,171,4,191,159,4,185,4,0,252,243,165,116,3,232,206,12,138,14,166,4,128,233,184,246,217,248,232,90,3,91,89,190,166,97, 176,9,232,46,255,80,176,47,80,88,254,192,80,232,148,0,115,247,232,163,0,88,235,11,117,9,198,7,49,67,198,7,48,235,2,136,7, 67,88,254,200,117,215,81,190,159,4,191,163,4,185,2,0,252,243,165,89,235,41,83,81,232,24,15,232,113,3,90,91,232,153,13,116, 11,137,30,165,4,137,22,163,4,232,115,12,176,1,232,178,3,137,30,165,4,137,22,163,4,89,91,176,3,186,236,97,232,199,254,80,83, 82,232,94,13,93,176,47,80,88,254,192,80,232,23,14,115,247,46,3,150,0,0,46,18,158,2,0,69,69,69,232,56,13,88,135,213,91,136, 7,67,88,254,200,117,206,66,66,139,234,180,4,233,179,254,81,86,185,7,0,191,159,4,248,252,46,172,24,5,71,226,249,94,89,195, 81,185,7,0,191,159,4,248,252,46,172,16,5,71,226,249,89,195,83,81,51,255,87,187,2,94,160,166,4,46,215,10,192,116,12,95,152, 43,248,87,139,208,232,50,239,235,232,187,102,96,232,136,12,232,45,13,115,6,232,230,11,95,79,87,232,176,11,114,31,187,122, 96,232,142,12,232,88,252,88,44,9,80,187,246,127,232,109,12,232,87,13,118,7,232,185,11,88,254,192,80,88,89,91,10,192,195,88, 89,91,10,192,195,187,180,4,138,47,177,32,138,38,131,4,246,196,32,116,13,58,233,177,42,117,7,246,196,4,117,2,138,233,136,15, 232,191,242,116,50,189,165,97,46,58,134,0,0,116,9,129,253,156,97,116,38,77,235,240,129,237,156,97,209,229,46,255,166,97,112, 117,112,117,112,121,112,121,112,121,112,121,112,117,112,121,112,60,112,60,112,75,198,7,48,138,38,131,4,246,196,16,116,4,75, 198,7,36,246,196,4,117,5,75,136,47,50,237,195,10,192,235,6,198,7,48,67,254,200,117,248,195,232,137,253,198,7,48,67,254,200, 117,245,195,187,180,4,198,7,32,83,232,193,10,91,156,121,10,198,7,45,83,232,236,12,91,12,1,67,198,7,48,157,195,205,216,232, 221,255,117,8,67,198,7,0,187,180,4,195,232,200,10,121,18,185,0,7,51,192,163,131,4,137,14,129,4,232,94,253,233,49,255,233, 120,252,232,129,10,121,3,233,96,159,117,1,195,160,166,4,208,232,80,198,6,166,4,64,208,22,166,4,187,171,4,232,9,13,185,4,0, 81,232,55,13,139,22,171,4,139,30,173,4,232,187,247,90,91,232,75,246,254,14,166,4,89,116,10,226,227,88,4,192,0,6,166,4,195, 233,47,10,191,190,37,87,191,168,4,198,5,1,232,44,10,117,3,233,54,241,121,7,10,255,117,10,233,147,3,10,255,117,3,233,13,10, 10,219,121,38,128,62,166,4,153,114,3,233,237,158,82,83,255,54,163,4,255,54,165,4,232,50,1,91,90,232,90,11,232,61,11,91,90, 116,3,233,209,158,160,165,4,10,192,121,9,191,196,113,87,36,127,162,165,4,83,82,128,203,127,156,255,54,165,4,255,54,163,4, 232,2,1,90,91,232,42,11,117,28,82,83,51,210,187,0,144,232,30,11,91,90,121,14,157,90,91,235,60,144,51,210,187,0,129,233,18, 247,157,121,14,83,82,232,47,1,138,194,232,197,2,90,91,208,216,143,6,163,4,143,6,165,4,159,128,38,165,4,127,158,115,4,191, 176,125,87,83,82,232,21,1,90,91,232,3,251,233,133,240,83,82,232,255,0,137,22,178,4,199,6,163,4,0,0,199,6,165,4,0,129,209, 46,178,4,115,7,90,91,83,82,232,222,250,247,6,178,4,255,255,116,21,90,91,232,33,12,232,141,10,232,203,250,90,91,232,22,12, 232,130,10,235,214,90,91,195,138,14,166,4,128,233,184,115,57,246,217,156,187,164,4,138,135,1,0,136,135,3,0,10,192,156,12, 128,136,135,1,0,198,135,2,0,184,157,156,121,3,232,34,0,50,237,232,18,0,157,121,3,232,38,0,198,6,158,4,0,157,115,3,233,189, 1,195,81,83,248,232,122,9,91,89,226,246,195,83,187,159,4,131,47,1,115,4,67,67,235,247,91,195,83,187,159,4,254,7,117,3,67, 235,249,91,195,138,14,166,4,128,233,152,115,65,246,217,156,139,22,163,4,139,30,165,4,10,219,156,136,30,167,4,198,6,166,4, 152,128,203,128,157,156,121,6,131,234,1,128,219,0,50,237,10,201,116,6,208,235,209,218,226,250,157,159,121,5,66,117,2,254, 195,157,115,5,50,228,233,169,1,158,121,10,247,210,246,211,131,194,1,128,211,0,195,177,152,42,14,166,4,248,235,170,232,102, 8,126,81,186,0,0,187,0,129,232,190,9,117,9,137,22,163,4,137,22,165,4,195,160,166,4,44,128,152,80,198,6,166,4,128,232,27,11, 187,118,97,232,24,2,90,91,232,16,11,232,124,9,187,135,97,232,10,2,90,91,232,145,245,90,232,254,10,232,217,248,90,91,232,26, 244,187,49,128,186,24,114,233,157,249,233,244,156,233,92,148,159,134,224,80,176,1,235,2,50,192,162,85,4,88,134,196,158,186, 0,0,137,30,83,4,116,3,232,233,195,137,30,59,3,232,172,147,117,215,139,227,139,54,83,4,57,55,117,205,82,138,167,2,0,80,82, 131,195,4,246,135,255,255,128,120,65,185,2,0,252,139,243,191,163,4,243,165,91,86,83,246,6,85,4,255,117,15,190,86,4,131,239, 4,185,2,0,243,165,50,192,116,3,232,75,240,95,190,163,4,185,2,0,252,243,165,94,139,20,139,140,2,0,131,198,4,86,232,73,240, 235,39,131,195,4,139,15,67,67,94,139,20,246,6,85,4,255,117,6,139,22,86,4,235,4,3,209,112,53,137,20,82,139,23,67,67,88,83, 232,165,241,91,89,42,197,232,31,241,116,11,137,22,46,0,139,209,135,211,233,124,154,139,227,137,30,69,3,139,30,59,3,128,63, 44,117,9,232,85,246,232,66,255,233,147,147,233,168,154,81,83,86,87,82,178,57,187,158,4,191,165,4,190,166,4,235,25,83,185, 4,0,248,209,23,67,67,226,250,91,246,7,64,117,41,254,12,116,42,254,202,116,38,246,5,255,120,33,117,224,128,44,8,118,26,128, 234,8,118,21,190,164,4,185,7,0,253,243,164,128,38,158,4,32,235,190,128,15,32,235,210,90,95,94,91,89,118,3,233,116,4,233,192, 6,138,62,166,4,185,4,0,10,219,120,33,117,17,128,239,8,114,23,138,222,138,242,138,212,50,228,226,235,116,11,248,208,212,209, 210,208,211,254,207,117,222,233,161,6,136,62,166,4,233,131,4,204,32,235,244,136,62,166,4,233,120,4,83,232,2,0,91,195,232, 45,0,187,10,4,235,12,83,232,2,0,91,195,232,31,0,187,99,4,128,62,168,4,1,120,7,117,18,198,6,168,4,2,232,129,175,176,13,232, 137,175,176,10,232,132,175,195,252,10,255,190,3,98,116,10,246,6,167,4,128,121,3,190,11,98,232,123,6,114,8,191,159,4,185,4, 0,235,9,131,198,4,191,163,4,185,2,0,46,165,226,252,195,232,13,9,83,232,129,7,232,182,247,91,232,5,0,90,91,233,173,247,46, 138,7,152,232,246,8,80,67,46,139,7,163,163,4,131,195,2,46,139,7,163,165,4,131,195,2,88,90,89,72,116,28,81,82,80,83,135,217, 232,131,247,91,83,46,139,23,46,139,159,2,0,232,234,241,91,131,195,4,235,222,195,83,208,232,115,3,233,9,1,187,178,96,232,214, 6,232,47,7,114,9,91,232,35,251,75,198,7,37,195,232,243,5,181,16,115,2,181,7,232,189,5,116,3,232,4,250,91,120,63,138,208,2, 197,42,6,130,4,121,5,246,216,232,194,250,50,201,232,177,0,255,54,129,4,82,232,218,248,90,143,6,129,4,255,54,129,4,50,192, 10,194,116,6,232,179,250,232,57,248,143,6,129,4,255,54,129,4,160,129,4,233,114,2,138,208,160,129,4,10,192,116,2,254,200,138, 240,2,194,138,200,120,4,50,192,138,200,121,17,80,81,82,83,232,169,5,91,90,89,88,254,192,120,241,138,225,138,194,42,193,2, 197,121,23,160,130,4,232,90,250,198,7,46,137,30,82,3,67,50,201,138,198,42,197,233,161,9,160,130,4,82,255,54,129,4,42,197, 42,194,2,193,120,3,232,54,250,232,39,0,255,54,129,4,232,81,248,160,130,4,143,6,129,4,10,192,88,90,117,7,139,30,82,3,233,103, 1,2,194,254,200,120,3,232,15,250,233,91,1,138,197,2,194,42,193,254,192,138,232,44,3,127,252,4,3,138,200,160,131,4,36,64,117, 2,138,200,195,232,254,4,180,7,114,2,180,16,232,200,4,91,249,116,9,83,80,232,11,249,90,91,138,230,156,80,139,22,129,4,10,246, 156,10,210,116,2,254,202,2,242,157,116,9,246,6,131,4,4,117,2,254,206,42,244,138,230,80,120,3,233,78,0,83,80,80,232,225,4, 88,254,196,117,247,232,191,4,232,142,7,88,80,185,3,0,210,228,232,166,4,114,16,138,196,152,187,178,96,3,216,232,107,5,232, 85,6,235,14,187,110,96,138,196,152,3,216,232,83,5,232,248,5,88,91,120,17,88,89,254,193,81,80,83,80,232,157,4,88,91,235,2, 50,228,246,220,160,130,4,2,224,254,196,10,192,116,9,246,6,131,4,4,117,2,254,204,138,236,50,201,88,255,54,129,4,80,136,46, 130,4,232,94,247,88,10,228,126,5,138,196,232,63,249,88,163,129,4,10,192,117,12,75,138,7,60,46,116,1,67,137,30,82,3,88,157, 114,21,2,196,138,38,130,4,42,196,10,228,116,9,246,6,131,4,4,117,2,254,192,10,192,232,74,246,139,217,233,71,0,138,224,246, 196,64,180,3,117,2,50,228,163,131,4,137,14,129,4,138,224,187,180,4,198,7,32,246,196,8,116,3,198,7,43,83,232,182,3,91,121, 8,198,7,45,83,232,226,5,91,67,198,7,48,232,209,3,161,131,4,139,14,129,4,120,3,233,179,253,233,104,0,83,232,59,248,91,116, 3,136,47,67,198,7,0,187,179,4,67,139,62,82,3,139,22,129,4,160,130,4,50,228,43,251,43,248,116,67,138,7,60,32,116,230,60,42, 116,226,180,1,75,83,80,232,234,234,50,228,60,45,116,246,60,43,116,242,60,36,116,238,60,48,117,22,67,232,212,234,115,16,75, 235,3,75,136,7,88,10,228,116,248,131,196,2,235,179,88,10,228,116,251,91,198,7,37,195,161,131,4,138,204,181,6,208,232,139, 22,129,4,115,11,83,82,232,69,243,50,192,90,233,63,254,138,198,44,5,120,3,232,38,248,82,232,218,245,88,80,10,192,117,1,75, 254,200,120,6,232,20,248,198,7,0,143,6,129,4,233,89,255,232,235,2,116,109,121,12,161,163,4,163,11,0,160,165,4,162,13,0,161, 11,0,46,247,38,107,98,139,248,138,202,46,160,109,98,246,38,11,0,2,200,46,160,13,0,46,246,38,107,98,2,200,50,192,46,139,22, 110,98,3,215,46,138,30,112,98,18,217,162,167,4,176,128,162,166,4,137,22,11,0,136,30,13,0,176,4,162,251,2,233,187,251,0,0, 0,187,179,4,185,32,0,3,7,67,67,226,250,36,254,163,11,0,235,161,139,22,11,0,138,30,13,0,51,192,176,128,162,166,4,136,38,167, 4,233,143,251,83,81,187,158,4,129,7,128,0,185,3,0,115,14,67,67,255,7,117,8,226,248,254,6,166,4,209,31,89,116,32,246,6,158, 4,255,117,5,128,38,159,4,254,187,165,4,138,7,138,167,2,0,36,127,128,228,128,10,224,136,39,91,195,144,144,144,233,136,251, 128,228,224,128,196,128,115,28,156,66,117,18,157,254,195,117,19,249,208,219,254,6,166,4,117,10,144,233,106,251,157,117,3, 128,226,254,86,190,163,4,137,20,70,70,138,62,167,4,129,227,127,128,10,223,136,28,94,195,139,241,232,180,4,139,206,81,232, 9,2,114,9,128,62,166,4,184,121,15,235,7,128,62,166,4,152,121,6,232,0,2,232,207,4,187,134,4,232,81,4,89,81,191,142,4,187,134, 4,232,53,4,187,134,4,232,93,4,232,253,1,232,178,4,187,134,4,232,52,4,232,251,1,187,148,4,232,197,1,115,3,131,235,4,232,87, 4,89,117,4,254,193,235,204,139,233,232,117,4,139,205,195,128,38,165,4,127,232,134,0,232,165,0,198,6,178,4,127,232,163,236, 232,132,0,235,27,101,237,161,165,4,128,252,119,115,1,195,10,192,121,9,36,127,162,165,4,184,176,125,80,232,91,0,160,166,4, 10,192,116,5,128,6,166,4,2,232,97,0,161,177,4,128,252,130,156,246,196,1,117,2,168,64,156,232,73,0,157,116,9,187,50,96,232, 55,2,232,72,236,128,46,166,4,2,115,3,232,0,1,232,3,241,160,166,4,60,116,115,11,186,219,15,187,73,131,232,142,242,235,6,187, 52,98,232,198,250,157,117,5,128,54,165,4,128,195,187,99,98,232,0,2,232,8,241,232,199,241,232,6,0,232,8,236,233,25,3,232,173, 3,232,164,247,232,0,2,232,195,3,195,187,50,96,233,222,1,184,240,195,255,54,165,4,255,54,163,4,232,86,255,90,91,255,54,163, 4,255,54,165,4,232,249,1,232,44,255,91,90,233,17,238,161,165,4,10,192,121,9,191,176,125,87,36,127,162,165,4,128,252,129,114, 12,191,57,123,87,51,210,187,0,129,232,240,237,186,162,48,187,9,127,232,225,1,120,58,191,66,123,87,255,54,163,4,255,54,165, 4,186,215,179,187,93,129,232,101,236,91,90,255,54,163,4,255,54,165,4,232,163,1,187,73,98,232,49,250,91,90,255,54,163,4,255, 54,165,4,232,144,1,91,90,232,171,237,187,82,98,233,6,250,186,219,15,187,73,129,233,37,236,186,146,10,187,6,128,233,40,236, 232,87,176,60,13,117,3,232,35,177,46,138,7,67,10,192,117,238,195,191,159,4,185,4,0,184,0,0,252,243,171,195,184,0,0,163,163, 4,163,165,4,195,232,120,231,121,14,161,163,4,11,192,116,32,176,1,121,28,246,216,195,205,212,160,166,4,10,192,116,16,160,165, 4,10,192,116,7,176,1,121,5,246,216,195,12,1,195,160,251,2,60,8,254,200,254,200,254,200,195,232,241,255,114,12,83,187,106, 97,232,206,0,232,237,234,91,195,51,210,187,0,128,232,172,235,195,232,215,255,187,42,96,114,17,235,8,232,205,255,187,58,96, 114,7,232,171,0,232,117,240,195,255,54,165,4,255,54,163,4,198,6,251,2,8,232,156,0,232,112,239,90,91,232,6,241,195,185,4,0, 209,23,67,67,226,250,195,185,4,0,209,31,75,75,226,250,195,128,143,2,0,32,226,1,195,187,176,4,128,249,8,114,38,81,185,7,0, 187,170,4,138,39,138,135,1,0,136,7,67,226,247,50,192,136,7,89,128,233,8,128,228,32,116,217,8,38,170,4,233,210,255,10,201, 116,15,81,248,232,183,255,89,246,135,2,0,16,117,185,226,191,195,190,159,4,191,171,4,252,185,4,0,139,5,165,137,132,254,255, 226,247,195,191,124,4,185,2,0,235,6,191,120,4,185,4,0,252,46,139,7,171,67,67,226,248,139,223,75,75,195,191,171,4,235,234, 191,159,4,235,229,191,171,4,185,4,0,135,222,252,243,165,135,222,195,81,83,87,187,159,4,191,171,4,185,4,0,232,233,255,95,91, 89,195,81,83,87,187,171,4,191,159,4,235,235,137,22,163,4,137,30,165,4,195,139,22,163,4,139,30,165,4,195,232,207,254,114,63, 233,137,0,232,215,237,83,87,138,195,50,6,165,4,120,60,10,219,120,16,161,165,4,43,195,114,63,117,55,161,163,4,43,194,235,16, 139,195,43,6,165,4,114,46,117,38,139,194,43,6,163,4,114,36,117,28,50,192,235,74,192,235,71,232,163,237,144,144,139,7,50,6, 165,4,121,19,138,38,165,4,10,228,120,6,176,1,10,192,235,44,176,255,249,235,39,81,185,2,0,135,222,160,165,4,10,192,121,2,135, 247,253,167,117,6,226,251,176,0,235,13,115,6,176,1,10,192,235,5,176,255,10,192,249,89,95,91,195,187,177,4,232,86,237,144, 144,138,5,50,7,121,2,235,179,81,185,4,0,235,196,187,255,97,232,242,254,232,151,255,117,11,198,6,251,2,2,199,6,163,4,0,128, 195,46,43,150,0,0,46,26,158,2,0,195,232,9,254,120,8,160,165,4,10,192,120,14,195,161,163,4,11,192,120,17,195,232,244,253,120, 8,205,210,128,54,165,4,128,195,161,163,4,61,0,128,117,10,205,211,83,232,219,237,91,233,230,255,247,30,163,4,195,187,121,4, 232,51,0,191,151,4,185,8,0,184,0,0,252,243,171,162,120,4,162,170,4,195,232,183,253,114,3,233,162,254,139,23,139,159,2,0,195, 185,4,0,232,165,253,114,3,233,150,254,185,2,0,233,144,254,185,4,0,135,251,187,159,4,232,143,253,114,3,233,128,254,135,223, 185,2,0,191,163,4,135,251,233,115,254,185,4,0,191,159,4,232,116,253,114,3,233,101,254,185,2,0,191,163,4,233,92,254,232,99, 253,114,3,233,29,255,233,205,254,232,88,253,185,4,0,115,3,185,2,0,93,191,165,4,255,53,79,79,226,250,85,195,191,171,4,185, 4,0,235,17,232,57,253,191,159,4,185,4,0,115,6,191,163,4,185,2,0,88,143,5,71,71,226,250,80,195,232,31,253,121,1,195,205,213, 114,3,233,180,243,233,27,244,0,0,250,186,96,0,142,218,142,194,142,210,50,192,162,100,4,181,145,187,0,0,186,154,6,139,242, 46,172,136,7,67,66,254,205,117,244,188,14,7,205,18,250,187,64,0,247,227,140,219,43,195,187,0,0,246,196,240,117,6,177,4,211, 224,139,216,75,137,30,44,0,139,227,233,34,205,176,44,162,246,1,187,183,0,198,7,58,50,192,162,249,2,162,6,0,162,107,4,162, 101,4,162,40,0,187,14,3,137,30,12,3,187,122,3,137,30,226,3,139,30,44,0,75,137,30,10,3,75,83,187,14,7,176,4,162,223,4,83,137, 30,224,4,160,223,4,254,192,2,192,138,208,182,0,3,218,90,135,218,139,30,224,4,136,23,67,136,55,67,160,223,4,185,52,0,10,192, 116,14,135,218,3,217,135,218,137,23,67,67,254,200,117,242,135,218,3,217,67,83,254,200,162,54,5,139,30,224,4,139,23,187,51, 0,3,218,137,30,228,4,91,67,137,30,48,0,137,30,69,3,90,138,194,36,254,138,208,138,194,42,195,138,216,138,198,26,199,138,248, 115,3,233,104,173,177,3,211,235,138,199,60,2,114,3,187,0,2,138,194,42,195,138,216,138,198,26,199,138,248,115,3,233,74,173, 137,30,10,3,135,218,137,30,44,0,137,30,47,3,139,227,137,30,69,3,139,30,48,0,135,218,232,61,173,43,218,75,75,83,91,232,128, 229,187,220,127,232,127,251,232,152,172,233,143,195,32,66,121,116,101,115,32,102,114,101,101,0,20,232,165,240,51,201,82,255, 54,129,4,233,104,246,253,255,3,191,201,27,14,182,0,0]
[53,55,48,48,48,53,49,32,67,79,80,82,46,32,73,66,77,32,49,57,56,49,216,224,237,225,185,0,64,252,139,217,184,255,255,186,85, 170,43,255,243,170,79,253,139,247,139,203,172,50,196,117,37,228,98,36,192,176,0,117,29,128,252,0,116,3,138,194,170,226,233, 128,252,0,116,14,138,224,134,242,252,71,116,216,79,186,1,0,235,208,195,250,180,213,158,115,78,117,76,123,74,121,72,159,177, 5,210,236,115,65,176,64,208,224,113,59,50,228,158,114,54,116,52,120,50,122,48,159,177,5,210,236,114,41,208,228,112,37,184, 255,255,249,142,216,140,219,142,195,140,193,142,209,140,210,139,226,139,236,139,245,139,254,115,7,51,199,117,7,248,115,227, 11,199,116,1,244,176,0,230,160,230,131,176,153,230,99,176,252,230,97,42,192,186,216,3,238,254,192,186,184,3,238,184,0,240, 142,208,187,0,224,188,22,224,233,51,1,117,213,176,4,230,8,176,84,230,67,43,201,138,217,138,193,230,65,176,64,230,67,228,65, 10,216,128,251,255,116,4,226,241,235,180,138,195,43,201,230,65,176,64,230,67,228,65,34,216,116,4,226,244,235,160,176,84,230, 67,176,18,230,65,230,13,176,255,138,216,138,248,185,8,0,186,0,0,238,238,184,1,1,236,138,224,236,59,216,116,3,233,122,255, 66,226,237,246,208,116,223,176,255,230,1,230,1,176,88,230,11,176,0,230,8,230,10,176,65,230,11,176,66,230,11,176,67,230,11, 184,64,0,142,216,139,30,114,0,43,192,142,192,142,216,43,255,228,96,36,12,4,4,177,12,211,224,139,200,138,224,252,170,226,253, 228,98,36,15,116,24,186,0,16,138,224,176,0,142,194,185,0,128,43,255,243,170,129,194,0,8,254,204,117,239,176,19,230,32,176, 8,230,33,176,9,230,33,43,192,142,192,190,64,0,142,222,137,30,114,0,129,62,114,0,52,18,116,56,142,216,188,240,63,142,208,139, 248,187,36,0,199,7,182,226,67,67,140,15,232,183,4,128,251,101,117,14,178,255,232,186,4,138,195,170,254,202,117,246,205,62, 14,23,250,188,24,224,233,45,254,116,3,233,189,254,184,48,0,142,208,188,0,1,38,199,6,8,0,195,226,38,199,6,10,0,0,240,233,42, 0,185,0,32,50,192,46,2,7,67,226,250,10,192,195,80,65,82,73,84,89,32,67,72,69,67,75,32,50,80,65,82,73,84,89,32,67,72,69,67, 75,32,49,43,192,142,192,38,199,6,20,0,84,255,38,199,6,22,0,0,240,250,176,0,230,33,228,33,10,192,117,43,176,255,230,33,228, 33,4,1,117,33,252,185,8,0,191,32,0,184,182,226,171,184,0,240,171,131,195,4,226,243,50,228,251,43,201,226,254,226,254,10,228, 116,8,186,1,1,232,173,3,250,244,180,0,50,237,176,254,230,33,176,16,230,67,177,22,138,193,230,64,246,196,255,117,4,226,249, 235,221,177,18,176,255,230,64,180,0,176,254,230,33,246,196,255,117,204,226,249,233,54,0,180,1,80,176,255,230,33,176,32,230, 32,88,207,80,228,98,168,64,116,8,190,25,226,185,14,0,235,10,168,128,116,16,190,39,226,185,14,0,184,0,0,205,16,232,230,3,250, 244,88,207,32,50,48,49,252,191,64,0,14,31,190,19,255,185,32,0,243,165,176,255,230,33,176,54,230,67,176,0,230,64,230,64,184, 64,0,142,216,232,120,3,128,251,170,116,38,176,60,230,97,144,144,228,96,36,255,117,22,254,6,18,0,38,199,6,32,0,178,230,38, 199,6,34,0,0,240,176,254,230,33,176,204,230,97,178,4,187,0,96,232,200,254,117,7,254,202,117,247,235,7,144,186,1,1,232,222, 2,228,96,180,0,163,16,0,36,48,117,3,233,152,0,134,224,128,252,48,116,9,254,192,128,252,32,117,2,176,3,80,42,228,205,16,88, 80,187,0,176,186,184,3,185,0,16,176,1,128,252,48,116,11,187,0,184,186,216,3,185,0,64,254,200,238,142,195,184,64,0,142,216, 129,62,114,0,52,18,116,13,142,219,232,118,252,116,6,186,2,1,232,129,2,88,80,180,0,205,16,184,32,112,43,255,185,40,0,252,243, 171,88,80,128,252,48,186,186,3,116,3,186,218,3,180,8,43,201,236,34,196,117,4,226,249,235,19,43,201,236,34,196,116,4,226,249, 235,8,177,3,210,236,117,228,235,6,186,2,1,232,61,2,88,180,0,205,16,184,64,0,142,216,138,38,16,0,128,228,12,176,4,246,228, 4,16,139,208,139,216,228,98,36,15,180,32,246,228,163,21,0,131,251,64,116,2,43,192,3,195,163,19,0,129,62,114,0,52,18,116,77, 187,0,4,185,16,0,59,209,118,70,142,219,142,195,131,193,16,129,195,0,4,81,83,82,232,210,251,90,91,89,116,230,140,218,138,232, 138,198,177,4,210,232,232,62,0,138,198,36,15,232,55,0,138,197,177,4,210,232,232,46,0,138,197,36,15,232,39,0,190,232,226,185, 4,0,232,80,2,233,74,0,184,64,0,142,216,139,22,21,0,11,210,116,240,185,0,0,129,251,0,16,119,231,187,0,16,235,155,30,14,31, 187,183,228,215,180,14,183,0,205,16,31,195,32,51,48,49,49,51,49,54,48,49,188,3,120,3,120,2,48,49,50,51,52,53,54,55,56,57, 65,66,67,68,69,70,184,64,0,142,216,128,62,18,0,1,116,57,232,178,1,227,43,176,77,230,97,128,251,170,117,34,176,204,230,97, 176,76,230,97,43,201,226,254,228,96,60,0,116,25,138,232,177,4,210,232,232,156,255,138,197,36,15,232,149,255,190,167,228,185, 4,0,232,190,1,43,192,142,192,185,48,0,14,31,190,243,254,191,32,0,252,243,165,184,64,0,142,216,176,77,230,97,176,255,230,33, 176,182,230,67,184,211,4,230,66,138,196,230,66,228,98,36,16,162,107,0,232,62,20,232,59,20,227,12,129,251,64,5,115,6,129,251, 16,4,115,9,190,171,228,185,3,0,232,110,1,176,252,230,33,160,16,0,168,1,117,3,233,185,0,176,188,230,33,180,0,205,19,246,196, 255,117,32,186,242,3,176,28,238,43,201,226,254,226,254,51,210,181,1,136,22,62,0,232,243,8,114,7,181,34,232,236,8,115,9,190, 174,228,185,3,0,232,42,1,176,12,186,242,3,238,199,6,26,0,30,0,199,6,28,0,30,0,189,177,228,190,0,0,46,139,86,0,176,170,238, 42,192,236,60,170,117,6,137,148,8,0,70,70,69,69,129,253,183,228,117,228,187,0,0,186,250,3,236,168,248,117,8,199,135,0,0,248, 3,67,67,186,250,2,236,168,248,117,8,199,135,0,0,248,2,67,67,139,198,177,3,210,200,10,195,162,17,0,186,1,2,236,168,15,117, 5,128,14,17,0,16,176,128,230,160,128,62,18,0,1,116,6,186,1,0,232,16,0,233,207,0,128,62,18,0,1,117,3,233,46,250,233,118,255, 156,250,30,184,64,0,142,216,10,246,116,24,179,6,232,37,0,226,254,254,206,117,245,128,62,18,0,1,117,6,176,205,230,97,235,232, 179,1,232,13,0,226,254,254,202,117,245,226,254,226,254,31,157,195,176,182,230,67,184,51,5,230,66,138,196,230,66,228,97,138, 224,12,3,230,97,43,201,226,254,254,203,117,250,138,196,230,97,195,176,12,230,97,185,86,41,226,254,176,204,230,97,176,76,230, 97,176,253,230,33,251,180,0,43,201,246,196,255,117,2,226,249,228,96,138,216,176,204,230,97,195,251,81,80,228,97,36,191,230, 97,43,201,226,254,12,64,230,97,176,32,230,32,88,89,207,184,64,0,142,216,128,62,18,0,1,117,5,182,1,233,85,255,46,138,4,70, 183,0,180,14,205,16,226,244,184,13,14,205,16,184,10,14,205,16,195,251,184,64,0,142,216,161,16,0,168,1,116,35,185,4,0,81,180, 0,205,19,114,20,180,2,187,0,0,142,195,187,0,124,186,0,0,185,1,0,176,1,205,19,89,115,4,226,224,205,24,234,0,124,0,0,23,4,0, 3,128,1,192,0,96,0,48,0,24,0,12,0,251,30,82,86,87,81,139,242,209,230,186,64,0,142,218,139,148,0,0,11,210,116,22,10,228,116, 24,254,204,116,78,254,204,117,3,233,137,0,254,204,117,3,233,185,0,89,95,94,90,31,207,138,224,131,194,3,176,128,238,138,212, 208,194,208,194,208,194,208,194,129,226,14,0,191,41,231,3,250,139,148,0,0,66,46,138,69,1,238,74,46,138,5,238,131,194,3,138, 196,36,31,238,131,234,2,176,0,238,235,121,80,131,194,4,176,3,238,51,201,131,194,2,236,168,32,117,8,226,249,88,128,204,80, 235,167,43,201,236,168,16,117,8,226,249,88,128,204,128,235,152,74,43,201,236,168,32,117,8,226,249,88,128,204,128,235,136, 131,234,5,89,138,193,238,233,126,255,128,38,113,0,127,131,194,4,176,1,238,131,194,2,43,201,236,168,32,117,7,226,249,180,128, 233,98,255,74,236,168,1,117,9,246,6,113,0,128,116,244,235,236,36,30,138,224,139,148,0,0,236,233,71,255,139,148,0,0,131,194, 5,236,138,224,66,236,233,56,255,251,30,83,187,64,0,142,219,10,228,116,11,254,204,116,32,254,204,116,45,91,31,207,251,144, 250,139,30,26,0,59,30,28,0,116,243,139,7,232,30,0,137,30,26,0,91,31,207,250,139,30,26,0,59,30,28,0,139,7,251,91,31,202,2, 0,160,23,0,91,31,207,131,195,2,129,251,62,0,117,3,187,30,0,195,82,58,69,70,56,29,42,54,128,64,32,16,8,4,2,1,27,255,0,255, 255,255,30,255,255,255,255,31,255,127,255,17,23,5,18,20,25,21,9,15,16,27,29,10,255,1,19,4,6,7,8,10,11,12,255,255,255,255, 28,26,24,3,22,2,14,13,255,255,255,255,255,255,32,255,94,95,96,97,98,99,100,101,102,103,255,255,119,255,132,255,115,255,116, 255,117,255,118,255,255,27,49,50,51,52,53,54,55,56,57,48,45,61,8,9,113,119,101,114,116,121,117,105,111,112,91,93,13,255,97, 115,100,102,103,104,106,107,108,59,39,96,255,92,122,120,99,118,98,110,109,44,46,47,255,42,255,32,255,27,33,64,35,36,37,94, 38,42,40,41,95,43,8,0,81,87,69,82,84,89,85,73,79,80,123,125,13,255,65,83,68,70,71,72,74,75,76,58,34,126,255,124,90,88,67, 86,66,78,77,60,62,63,255,0,255,32,255,84,85,86,87,88,89,90,91,92,93,104,105,106,107,108,109,110,111,112,113,55,56,57,45,52, 53,54,43,49,50,51,48,46,71,72,73,255,75,255,77,255,79,80,81,82,83,251,80,83,81,82,86,87,30,6,252,184,64,0,142,216,228,96, 80,228,97,138,224,12,128,230,97,134,224,230,97,88,138,224,60,255,117,3,233,117,2,36,127,14,7,191,130,232,185,8,0,242,174, 138,196,116,3,233,136,0,129,239,131,232,46,138,165,138,232,168,128,117,84,128,252,16,115,7,8,38,23,0,233,131,0,246,6,23,0, 4,117,104,60,82,117,37,246,6,23,0,8,116,3,235,91,144,246,6,23,0,32,117,13,246,6,23,0,3,116,13,184,48,82,233,216,1,246,6,23, 0,3,116,243,132,38,24,0,117,77,8,38,24,0,48,38,23,0,60,82,117,65,184,0,82,233,185,1,128,252,16,115,26,246,212,32,38,23,0, 60,184,117,44,160,25,0,180,0,136,38,25,0,60,0,116,31,233,163,1,246,212,32,38,24,0,235,20,60,128,115,16,246,6,24,0,8,116,23, 60,69,116,5,128,38,24,0,247,250,176,32,230,32,7,31,95,94,90,89,91,88,207,246,6,23,0,8,117,3,233,143,0,246,6,23,0,4,116,49, 60,83,117,45,199,6,114,0,52,18,233,209,245,82,79,80,81,75,76,77,71,72,73,16,17,18,19,20,21,22,23,24,25,30,31,32,33,34,35, 36,37,38,44,45,46,47,48,49,50,60,57,117,5,176,32,233,37,1,191,138,234,185,10,0,242,174,117,18,129,239,139,234,160,25,0,180, 10,246,228,3,199,162,25,0,235,139,198,6,25,0,0,185,26,0,242,174,117,5,176,0,233,248,0,60,2,114,12,60,14,115,8,128,196,118, 176,0,233,232,0,60,59,115,3,233,99,255,60,71,115,249,187,99,233,233,37,1,246,6,23,0,4,116,91,60,70,117,24,187,30,0,137,30, 26,0,137,30,28,0,198,6,113,0,128,205,27,184,0,0,233,180,0,60,69,117,33,128,14,24,0,8,176,32,230,32,128,62,73,0,7,116,7,186, 216,3,160,101,0,238,246,6,24,0,8,117,249,233,22,255,60,55,117,6,184,0,114,233,133,0,187,146,232,60,59,115,3,235,120,144,187, 204,232,233,195,0,60,71,115,45,246,6,23,0,3,116,91,60,15,117,6,184,0,15,235,97,144,60,55,117,9,176,32,230,32,205,5,233,218, 254,60,59,114,6,187,89,233,233,151,0,187,31,233,235,64,246,6,23,0,32,117,32,246,6,23,0,3,117,32,60,74,116,11,60,78,116,12, 44,71,187,122,233,235,119,184,45,74,235,34,184,43,78,235,29,246,6,23,0,3,117,224,44,70,187,109,233,235,11,60,59,114,4,176, 0,235,7,187,229,232,254,200,46,215,60,255,116,31,128,252,255,116,26,246,6,23,0,64,116,32,246,6,23,0,3,116,15,60,65,114,21, 60,90,119,17,4,32,235,13,233,92,254,60,97,114,6,60,122,119,2,44,32,139,30,28,0,139,243,232,96,252,59,30,26,0,116,9,137,4, 137,30,28,0,233,58,254,232,13,0,233,52,254,44,59,46,215,138,224,176,0,235,168,80,83,81,187,192,0,228,97,80,36,252,230,97, 185,72,0,226,254,12,2,230,97,185,72,0,226,254,75,117,235,88,230,97,89,91,88,195,251,83,81,30,86,87,85,82,139,236,190,64,0, 142,222,232,28,0,187,4,0,232,255,1,136,38,64,0,138,38,65,0,128,252,1,245,90,93,95,94,31,89,91,202,2,0,138,240,128,38,63,0, 127,10,228,116,39,254,204,116,116,198,6,65,0,0,128,250,4,115,19,254,204,116,106,254,204,117,3,233,150,0,254,204,116,104,254, 204,116,104,198,6,65,0,1,195,186,242,3,250,160,63,0,177,4,210,224,168,32,117,12,168,64,117,6,168,128,116,6,254,192,254,192, 254,192,12,8,238,198,6,62,0,0,198,6,65,0,0,12,4,238,251,232,40,2,160,66,0,60,192,116,7,128,14,65,0,32,235,17,180,3,232,71, 1,187,1,0,232,109,1,187,3,0,232,103,1,195,160,65,0,195,176,70,232,185,1,180,102,235,54,176,66,235,245,128,14,63,0,128,176, 74,232,167,1,180,77,235,36,187,7,0,232,65,1,187,9,0,232,59,1,187,15,0,232,53,1,187,17,0,233,171,0,128,14,63,0,128,176,74, 232,129,1,180,69,115,8,198,6,65,0,9,176,0,195,80,81,138,202,176,1,210,224,250,198,6,64,0,255,132,6,63,0,117,49,128,38,63, 0,240,8,6,63,0,251,176,16,210,224,10,194,12,12,82,186,242,3,238,90,246,6,63,0,128,116,18,187,20,0,232,224,0,10,228,116,8, 43,201,226,254,254,204,235,246,251,89,232,224,0,88,138,252,182,0,114,75,190,243,237,144,86,232,148,0,138,102,1,208,228,208, 228,128,228,4,10,226,232,133,0,128,255,77,117,3,233,98,255,138,229,232,120,0,138,102,1,232,114,0,138,225,232,109,0,187,7, 0,232,147,0,187,9,0,232,141,0,187,11,0,232,135,0,187,13,0,232,129,0,94,232,64,1,114,69,232,115,1,114,63,252,190,66,0,172, 36,192,116,59,60,64,117,41,172,208,224,180,4,114,36,208,224,208,224,180,16,114,28,208,224,180,8,114,22,208,224,208,224,180, 4,114,14,208,224,180,3,114,8,208,224,180,2,114,2,180,32,8,38,65,0,232,119,1,195,232,46,1,195,232,111,1,50,228,195,82,81,186, 244,3,51,201,236,168,64,116,12,226,249,128,14,65,0,128,89,90,88,249,195,51,201,236,168,128,117,4,226,249,235,235,138,196, 186,245,3,238,89,90,195,30,43,192,142,216,197,54,120,0,209,235,138,32,31,114,196,195,176,1,81,138,202,210,192,89,132,6,62, 0,117,19,8,6,62,0,180,7,232,172,255,138,226,232,167,255,232,114,0,114,41,180,15,232,157,255,138,226,232,152,255,138,229,232, 147,255,232,94,0,156,187,18,0,232,181,255,81,185,38,2,10,228,116,6,226,254,254,204,235,243,89,157,195,81,230,12,230,11,140, 192,177,4,211,192,138,232,36,240,3,195,115,2,254,197,80,230,4,138,196,230,4,138,197,36,15,230,129,138,230,42,192,209,232, 80,187,6,0,232,117,255,138,204,88,211,224,72,80,230,5,138,196,230,5,89,88,3,193,89,176,2,230,10,195,232,30,0,114,20,180,8, 232,40,255,232,76,0,114,10,160,66,0,36,96,60,96,116,2,248,195,128,14,65,0,64,249,195,251,83,81,179,2,51,201,246,6,62,0,128, 117,12,226,247,254,203,117,243,128,14,65,0,128,249,156,128,38,62,0,127,157,89,91,195,251,30,80,184,64,0,142,216,128,14,62, 0,128,176,32,230,32,88,31,207,252,191,66,0,81,82,83,179,7,51,201,186,244,3,236,168,128,117,12,226,249,128,14,65,0,128,249, 91,90,89,195,236,168,64,117,7,128,14,65,0,32,235,239,66,236,136,5,71,185,10,0,226,254,74,236,168,16,116,6,254,203,117,202, 235,227,91,90,89,195,160,69,0,58,197,160,71,0,116,10,187,8,0,232,176,254,138,196,254,192,42,193,195,207,2,37,2,8,42,255,80, 246,25,4,251,30,82,86,81,83,190,64,0,142,222,139,242,209,230,139,148,8,0,11,210,116,12,10,228,116,14,254,204,116,66,254,204, 116,42,91,89,94,90,31,207,80,179,10,51,201,238,66,236,138,224,168,128,117,14,226,247,254,203,117,243,128,204,1,128,228,249, 235,20,176,13,66,238,176,12,238,88,80,139,148,8,0,66,236,138,224,128,228,248,90,138,194,128,244,72,235,194,80,131,194,2,176, 8,238,184,232,3,72,117,253,176,12,238,235,219,252,240,207,241,240,241,26,242,169,247,48,242,156,242,65,243,125,243,195,243, 246,243,84,242,56,244,39,244,34,247,122,242,251,252,6,30,82,81,83,86,87,80,138,196,50,228,209,224,139,240,61,32,0,114,4,88, 233,71,1,184,64,0,142,216,184,0,184,139,62,16,0,129,231,48,0,131,255,48,117,3,184,0,176,142,192,88,138,38,73,0,46,255,164, 69,240,56,40,45,10,31,6,25,28,2,7,6,7,0,0,0,0,113,80,90,10,31,6,25,28,2,7,6,7,0,0,0,0,56,40,45,10,127,6,100,112,2,1,6,7,0, 0,0,0,97,80,82,15,25,6,25,25,2,13,11,12,0,0,0,0,0,8,0,16,0,64,0,64,40,40,80,80,40,40,80,80,44,40,45,41,42,46,30,41,186,212, 3,179,0,131,255,48,117,7,176,7,186,180,3,254,195,138,224,162,73,0,137,22,99,0,30,80,82,131,194,4,138,195,238,90,43,192,142, 216,197,30,116,0,88,185,16,0,128,252,2,114,16,3,217,128,252,4,114,9,3,217,128,252,7,114,2,3,217,80,50,228,138,196,238,66, 254,196,138,7,238,67,74,226,243,88,31,51,255,137,62,78,0,198,6,98,0,0,185,0,32,128,252,4,114,12,128,252,7,116,4,51,192,235, 6,185,0,8,184,32,7,243,171,199,6,96,0,103,0,160,73,0,50,228,139,240,139,22,99,0,131,194,4,46,138,132,244,240,238,162,101, 0,46,138,132,236,240,50,228,163,74,0,129,230,14,0,46,139,140,228,240,137,14,76,0,185,8,0,191,80,0,30,7,51,192,243,171,66, 176,48,128,62,73,0,6,117,2,176,63,238,162,102,0,95,94,91,89,90,31,7,207,180,10,137,14,96,0,232,2,0,235,237,139,22,99,0,138, 196,238,66,138,197,238,74,138,196,254,192,238,66,138,193,238,195,138,207,50,237,209,225,139,241,137,148,80,0,56,62,98,0,117, 5,139,194,232,2,0,235,190,232,127,0,139,200,3,14,78,0,209,249,180,14,232,193,255,195,138,223,50,255,209,227,139,151,80,0, 139,14,96,0,95,94,91,88,88,31,7,207,162,98,0,139,14,76,0,152,80,247,225,163,78,0,139,200,209,249,180,12,232,147,255,91,209, 227,139,135,80,0,232,184,255,233,115,255,139,22,99,0,131,194,5,160,102,0,10,255,117,14,36,224,128,227,31,10,195,238,162,102, 0,233,87,255,36,223,208,235,115,243,12,32,235,239,138,38,74,0,160,73,0,138,62,98,0,95,94,89,233,63,255,83,139,216,138,196, 246,38,74,0,50,255,3,195,209,224,91,195,138,216,128,252,4,114,8,128,252,7,116,3,233,243,1,83,139,193,232,57,0,116,51,3,240, 138,230,42,227,232,117,0,3,245,3,253,254,204,117,245,88,176,32,232,112,0,3,253,254,203,117,247,184,64,0,142,216,128,62,73, 0,7,116,7,160,101,0,186,216,3,238,233,225,254,138,222,235,218,128,62,73,0,2,114,25,128,62,73,0,3,119,18,82,186,218,3,80,236, 168,8,116,251,176,37,186,216,3,238,88,90,232,126,255,3,6,78,0,139,248,139,240,43,209,254,198,254,194,50,237,139,46,74,0,3, 237,138,195,246,38,74,0,3,192,6,31,128,251,0,195,138,202,86,87,243,165,95,94,195,138,202,87,243,171,95,195,253,138,216,128, 252,4,114,8,128,252,7,116,3,233,166,1,83,139,194,232,147,255,116,32,43,240,138,230,42,227,232,207,255,43,245,43,253,254,204, 117,245,88,176,32,232,202,255,43,253,254,203,117,247,233,87,255,138,222,235,237,128,252,4,114,8,128,252,7,116,3,233,169,2, 232,26,0,139,243,139,22,99,0,131,194,6,6,31,236,168,1,117,251,250,236,168,1,116,251,173,233,32,254,138,207,50,237,139,241, 209,230,139,132,80,0,51,219,227,6,3,30,76,0,226,250,232,203,254,3,216,195,128,252,4,114,8,128,252,7,116,3,233,177,1,138,227, 80,81,232,208,255,139,251,89,91,139,22,99,0,131,194,6,236,168,1,117,251,250,236,168,1,116,251,139,195,171,251,226,232,233, 209,253,128,252,4,114,8,128,252,7,116,3,233,126,1,80,81,232,159,255,139,251,89,91,139,22,99,0,131,194,6,236,168,1,117,251, 250,236,168,1,116,251,138,195,170,71,226,232,233,160,253,232,49,0,38,138,4,34,196,210,224,138,206,210,192,233,143,253,80, 80,232,30,0,210,232,34,196,38,138,12,91,246,195,128,117,13,246,212,34,204,10,193,38,136,4,88,233,112,253,50,193,235,245,83, 80,176,40,82,128,226,254,246,226,90,246,194,1,116,3,5,0,32,139,240,88,139,209,187,192,2,185,2,3,128,62,73,0,6,114,6,187,128, 1,185,3,7,34,234,211,234,3,242,138,247,42,201,208,200,2,205,254,207,117,248,138,227,210,236,91,195,138,216,139,193,232,106, 2,139,248,43,209,129,194,1,1,208,230,208,230,128,62,73,0,6,115,4,208,226,209,231,6,31,42,237,208,227,208,227,116,45,138,195, 180,80,246,228,139,247,3,240,138,230,42,227,232,128,0,129,238,176,31,129,239,176,31,254,204,117,241,138,199,232,136,0,129, 239,176,31,254,203,117,245,233,212,252,138,222,235,236,253,138,216,139,194,232,16,2,139,248,43,209,129,194,1,1,208,230,208, 230,128,62,73,0,6,115,5,208,226,209,231,71,6,31,42,237,129,199,240,0,208,227,208,227,116,46,138,195,180,80,246,228,139,247, 43,240,138,230,42,227,232,33,0,129,238,80,32,129,239,80,32,254,204,117,241,138,199,232,41,0,129,239,80,32,254,203,117,245, 252,233,116,252,138,222,235,235,138,202,86,87,243,164,95,94,129,198,0,32,129,199,0,32,86,87,138,202,243,164,95,94,195,138, 202,87,243,170,95,129,199,0,32,87,138,202,243,170,95,195,180,0,80,232,133,1,139,248,88,60,128,115,6,190,110,250,14,235,15, 44,128,30,43,246,142,222,197,54,124,0,140,218,31,82,209,224,209,224,209,224,3,240,128,62,73,0,6,31,114,44,87,86,182,4,172, 246,195,128,117,22,170,172,38,136,133,255,31,131,199,79,254,206,117,236,94,95,71,226,227,233,244,251,38,50,5,170,172,38,50, 133,255,31,235,224,138,211,209,231,232,209,0,87,86,182,4,172,232,222,0,35,195,246,194,128,116,7,38,50,37,38,50,69,1,38,136, 37,38,136,69,1,172,232,197,0,35,195,246,194,128,116,10,38,50,165,0,32,38,50,133,1,32,38,136,165,0,32,38,136,133,1,32,131, 199,80,254,206,117,193,94,95,131,199,2,226,182,233,148,251,232,214,0,139,240,131,236,8,139,236,128,62,73,0,6,6,31,114,26, 182,4,138,4,136,70,0,69,138,132,0,32,136,70,0,69,131,198,80,254,206,117,235,235,23,144,209,230,182,4,232,136,0,129,198,0, 32,232,129,0,129,238,176,31,254,206,117,238,191,110,250,14,7,131,237,8,139,245,252,176,0,22,31,186,128,0,86,87,185,8,0,243, 166,95,94,116,30,254,192,131,199,8,74,117,237,60,0,116,18,43,192,142,216,196,62,124,0,140,192,11,199,116,4,176,128,235,210, 131,196,8,233,16,251,128,227,3,138,195,81,185,3,0,208,224,208,224,10,216,226,248,138,251,89,195,82,81,83,186,0,0,185,1,0, 139,216,35,217,11,211,209,224,209,225,139,216,35,217,11,211,209,225,115,236,139,194,91,89,90,195,138,36,138,68,1,185,0,192, 178,0,133,193,248,116,1,249,208,210,209,233,209,233,115,242,136,86,0,69,195,161,80,0,83,139,216,138,196,246,38,74,0,209,224, 209,224,42,255,3,195,91,195,80,80,180,3,205,16,88,60,8,116,89,60,13,116,94,60,10,116,94,60,7,116,97,138,62,98,0,180,10,185, 1,0,205,16,254,194,58,22,74,0,117,54,178,0,128,254,24,117,45,180,2,183,0,205,16,160,73,0,60,4,114,6,60,7,183,0,117,6,180, 8,205,16,138,252,184,1,6,185,0,0,182,24,138,22,74,0,254,202,205,16,88,233,71,250,254,198,180,2,235,244,128,250,0,116,247, 254,202,235,243,178,0,235,239,128,254,24,117,232,235,185,179,2,232,199,238,235,219,3,3,5,5,3,3,3,4,180,0,139,22,99,0,131, 194,6,236,168,4,117,120,168,2,116,126,180,16,139,22,99,0,138,196,238,66,236,138,232,74,254,196,138,196,238,66,236,138,229, 138,30,73,0,42,255,46,138,159,161,247,43,195,43,6,78,0,121,3,184,0,0,177,3,128,62,73,0,4,114,42,128,62,73,0,7,116,35,178, 40,246,242,138,232,2,237,138,220,42,255,128,62,73,0,6,117,4,177,4,208,228,211,227,138,212,138,240,208,238,208,238,235,18, 246,54,74,0,138,240,138,212,210,224,138,232,138,220,50,255,211,227,180,1,82,139,22,99,0,131,194,7,238,90,95,94,31,31,31,31, 7,207,251,30,184,64,0,142,216,161,19,0,31,207,251,30,184,64,0,142,216,161,16,0,31,207,251,30,80,184,64,0,142,216,128,38,113, 0,127,88,232,4,0,31,202,2,0,10,228,116,19,254,204,116,24,254,204,116,26,254,204,117,3,233,39,1,180,128,249,195,228,97,36, 247,230,97,42,228,195,228,97,12,8,235,245,83,81,86,190,7,0,232,194,1,228,98,36,16,162,107,0,186,122,63,246,6,113,0,128,116, 3,233,138,0,74,117,3,233,132,0,232,198,0,227,235,186,120,3,185,0,2,228,33,12,1,230,33,246,6,113,0,128,117,108,81,232,173, 0,11,201,89,116,197,59,211,227,4,115,191,226,232,114,230,232,155,0,232,106,0,60,22,117,73,94,89,91,81,199,6,105,0,255,255, 186,0,1,246,6,113,0,128,117,35,232,79,0,114,30,227,5,38,136,7,67,73,74,127,234,232,64,0,232,61,0,42,228,129,62,105,0,15,29, 117,6,227,6,235,205,180,1,254,196,90,43,209,80,246,196,3,117,19,232,31,0,235,14,78,116,3,233,98,255,94,89,91,43,210,180,4, 80,228,33,36,254,230,33,232,66,255,88,128,252,1,245,195,83,81,177,8,81,232,38,0,227,32,83,232,32,0,88,227,25,3,216,129,251, 240,6,245,159,89,208,213,158,232,217,0,254,201,117,224,138,197,248,89,91,195,89,249,235,249,185,100,0,138,38,107,0,228,98, 36,16,58,196,225,248,162,107,0,176,0,230,67,228,64,138,224,228,64,134,196,139,30,103,0,43,216,163,103,0,195,83,81,228,97, 36,253,12,1,230,97,176,182,230,67,232,166,0,184,160,4,232,133,0,185,0,8,249,232,104,0,226,250,248,232,98,0,89,91,176,22,232, 68,0,199,6,105,0,255,255,186,0,1,38,138,7,232,53,0,227,2,67,73,74,127,243,161,105,0,247,208,80,134,224,232,35,0,88,232,31, 0,11,201,117,215,81,185,32,0,249,232,42,0,226,250,89,176,176,230,67,184,1,0,232,51,0,232,122,254,43,192,195,81,80,138,232, 177,8,208,213,156,232,11,0,157,232,36,0,254,201,117,242,88,89,195,184,160,4,114,3,184,80,2,80,228,98,36,32,116,250,228,98, 36,32,117,250,88,230,66,138,196,230,66,195,161,105,0,209,216,209,208,248,113,4,53,16,8,249,209,208,163,105,0,195,232,35,254, 179,66,185,0,7,226,254,254,203,117,247,195,0,0,0,0,0,0,0,0,126,129,165,129,189,153,129,126,126,255,219,255,195,231,255,126, 108,254,254,254,124,56,16,0,16,56,124,254,124,56,16,8,56,124,56,254,254,124,56,124,16,16,56,124,254,124,56,124,0,0,24,60, 60,24,0,0,255,255,231,195,195,231,255,255,0,60,102,66,66,102,60,0,255,195,153,189,189,153,195,255,15,7,15,125,204,204,204, 120,60,102,102,102,60,24,126,24,63,51,63,48,48,112,240,224,127,99,127,99,99,103,230,192,153,90,60,231,231,60,90,153,128,224, 248,254,248,224,128,0,2,14,62,254,62,14,2,0,24,60,126,24,24,126,60,24,102,102,102,102,102,0,102,0,127,219,219,123,27,27,27, 0,62,99,56,108,108,56,204,120,0,0,0,0,126,126,126,0,24,60,126,24,126,60,24,255,24,60,126,24,24,24,24,0,24,24,24,24,126,60, 24,0,0,24,12,254,12,24,0,0,0,48,96,254,96,48,0,0,0,0,192,192,192,254,0,0,0,36,102,255,102,36,0,0,0,24,60,126,255,255,0,0, 0,255,255,126,60,24,0,0,0,0,0,0,0,0,0,0,48,120,120,48,48,0,48,0,108,108,108,0,0,0,0,0,108,108,254,108,254,108,108,0,48,124, 192,120,12,248,48,0,0,198,204,24,48,102,198,0,56,108,56,118,220,204,118,0,96,96,192,0,0,0,0,0,24,48,96,96,96,48,24,0,96,48, 24,24,24,48,96,0,0,102,60,255,60,102,0,0,0,48,48,252,48,48,0,0,0,0,0,0,0,48,48,96,0,0,0,252,0,0,0,0,0,0,0,0,0,48,48,0,6,12, 24,48,96,192,128,0,124,198,206,222,246,230,124,0,48,112,48,48,48,48,252,0,120,204,12,56,96,204,252,0,120,204,12,56,12,204, 120,0,28,60,108,204,254,12,30,0,252,192,248,12,12,204,120,0,56,96,192,248,204,204,120,0,252,204,12,24,48,48,48,0,120,204, 204,120,204,204,120,0,120,204,204,124,12,24,112,0,0,48,48,0,0,48,48,0,0,48,48,0,0,48,48,96,24,48,96,192,96,48,24,0,0,0,252, 0,0,252,0,0,96,48,24,12,24,48,96,0,120,204,12,24,48,0,48,0,124,198,222,222,222,192,120,0,48,120,204,204,252,204,204,0,252, 102,102,124,102,102,252,0,60,102,192,192,192,102,60,0,248,108,102,102,102,108,248,0,254,98,104,120,104,98,254,0,254,98,104, 120,104,96,240,0,60,102,192,192,206,102,62,0,204,204,204,252,204,204,204,0,120,48,48,48,48,48,120,0,30,12,12,12,204,204,120, 0,230,102,108,120,108,102,230,0,240,96,96,96,98,102,254,0,198,238,254,254,214,198,198,0,198,230,246,222,206,198,198,0,56, 108,198,198,198,108,56,0,252,102,102,124,96,96,240,0,120,204,204,204,220,120,28,0,252,102,102,124,108,102,230,0,120,204,224, 112,28,204,120,0,252,180,48,48,48,48,120,0,204,204,204,204,204,204,252,0,204,204,204,204,204,120,48,0,198,198,198,214,254, 238,198,0,198,198,108,56,56,108,198,0,204,204,204,120,48,48,120,0,254,198,140,24,50,102,254,0,120,96,96,96,96,96,120,0,192, 96,48,24,12,6,2,0,120,24,24,24,24,24,120,0,16,56,108,198,0,0,0,0,0,0,0,0,0,0,0,255,48,48,24,0,0,0,0,0,0,0,120,12,124,204, 118,0,224,96,96,124,102,102,220,0,0,0,120,204,192,204,120,0,28,12,12,124,204,204,118,0,0,0,120,204,252,192,120,0,56,108,96, 240,96,96,240,0,0,0,118,204,204,124,12,248,224,96,108,118,102,102,230,0,48,0,112,48,48,48,120,0,12,0,12,12,12,204,204,120, 224,96,102,108,120,108,230,0,112,48,48,48,48,48,120,0,0,0,204,254,254,214,198,0,0,0,248,204,204,204,204,0,0,0,120,204,204, 204,120,0,0,0,220,102,102,124,96,240,0,0,118,204,204,124,12,30,0,0,220,118,102,96,240,0,0,0,124,192,120,12,248,0,16,48,124, 48,48,52,24,0,0,0,204,204,204,204,118,0,0,0,204,204,204,120,48,0,0,0,198,214,254,254,108,0,0,0,198,108,56,108,198,0,0,0,204, 204,204,124,12,248,0,0,252,152,48,100,252,0,28,48,48,224,48,48,28,0,24,24,24,0,24,24,24,0,224,48,48,28,48,48,224,0,118,220, 0,0,0,0,0,0,0,16,56,108,198,198,254,0,251,30,80,184,64,0,142,216,88,10,228,116,7,254,204,116,22,251,31,207,250,160,112,0, 198,6,112,0,0,139,14,110,0,139,22,108,0,235,234,250,137,22,108,0,137,14,110,0,198,6,112,0,0,235,218,251,30,80,82,184,64,0, 142,216,255,6,108,0,117,4,255,6,110,0,131,62,110,0,24,117,25,129,62,108,0,176,0,117,17,199,6,110,0,0,0,199,6,108,0,0,0,198, 6,112,0,1,254,14,64,0,117,11,128,38,63,0,240,176,12,186,242,3,238,205,28,176,32,230,32,90,88,31,207,165,254,0,240,135,233, 0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,87,239,0,240,0,0,0,0,101,240,0,240,77,248,0,240,65,248,0,240,89,236,0,240,57,231,0, 240,89,248,0,240,46,232,0,240,210,239,0,240,0,0,0,246,242,230,0,240,110,254,0,240,83,255,0,240,83,255,0,240,164,240,0,240, 199,239,0,240,0,0,0,0,207,251,30,80,83,81,82,184,80,0,142,216,128,62,0,0,1,116,95,198,6,0,0,1,180,15,205,16,138,204,181,25, 232,85,0,81,180,3,205,16,89,82,51,210,180,2,205,16,180,8,205,16,10,192,117,2,176,32,82,51,210,50,228,205,23,90,246,196,37, 117,33,254,194,58,202,117,223,50,210,138,226,82,232,35,0,90,254,198,58,238,117,208,90,180,2,205,16,198,6,0,0,0,235,10,90, 180,2,205,16,198,6,0,0,255,90,89,91,88,31,207,51,210,50,228,176,10,205,23,50,228,176,13,205,23,195,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,234,91,224,0,240,48,52,47,50,52,47,56,49,255,255,235]
[53,55,48,48,54,55,49,32,67,79,80,82,46,32,73,66,77,32,49,57,56,49,216,224,237,225,185,0,64,252,139,217,184,255,255,186,85, 170,43,255,243,170,79,253,139,247,139,203,172,50,196,117,37,228,98,36,192,176,0,117,29,128,252,0,116,3,138,194,170,226,233, 128,252,0,116,14,138,224,134,242,252,71,116,216,79,186,1,0,235,208,195,250,180,213,158,115,78,117,76,123,74,121,72,159,177, 5,210,236,115,65,176,64,208,224,113,59,50,228,158,114,54,116,52,120,50,122,48,159,177,5,210,236,114,41,208,228,112,37,184, 255,255,249,142,216,140,219,142,195,140,193,142,209,140,210,139,226,139,236,139,245,139,254,115,7,51,199,117,7,248,115,227, 11,199,116,1,244,176,0,230,160,230,131,176,153,230,99,176,252,230,97,42,192,186,216,3,238,254,192,186,184,3,238,184,0,240, 142,208,187,0,224,188,22,224,233,51,1,117,213,176,4,230,8,176,84,230,67,43,201,138,217,138,193,230,65,176,64,230,67,128,251, 255,116,8,228,65,10,216,226,241,235,180,138,195,43,201,230,65,176,64,230,67,144,144,228,65,34,216,116,6,226,242,235,158,144, 144,176,18,230,65,230,13,176,255,138,216,138,248,185,8,0,186,0,0,238,238,184,1,1,236,138,224,236,59,216,116,3,233,122,255, 66,226,237,246,208,116,223,176,255,230,1,230,1,176,88,230,11,176,0,230,8,230,10,176,65,230,11,176,66,230,11,176,67,230,11, 184,64,0,142,216,139,30,114,0,43,192,142,192,142,216,43,255,228,96,36,12,4,4,177,12,211,224,139,200,138,224,252,170,226,253, 228,98,36,15,116,24,186,0,16,138,224,176,0,142,194,185,0,128,43,255,243,170,129,194,0,8,254,204,117,239,176,19,230,32,176, 8,230,33,176,9,230,33,43,192,142,192,190,64,0,142,222,137,30,114,0,129,62,114,0,52,18,116,56,142,216,188,240,63,142,208,139, 248,187,36,0,199,7,182,226,67,67,140,15,232,183,4,128,251,101,117,14,178,255,232,186,4,138,195,170,254,202,117,246,205,62, 14,23,250,188,24,224,233,45,254,116,3,233,189,254,184,48,0,142,208,188,0,1,38,199,6,8,0,195,226,38,199,6,10,0,0,240,233,42, 0,185,0,32,50,192,46,2,7,67,226,250,10,192,195,80,65,82,73,84,89,32,67,72,69,67,75,32,50,80,65,82,73,84,89,32,67,72,69,67, 75,32,49,43,192,142,192,38,199,6,20,0,84,255,38,199,6,22,0,0,240,250,176,0,230,33,228,33,10,192,117,43,176,255,230,33,228, 33,4,1,117,33,252,185,8,0,191,32,0,184,182,226,171,184,0,240,171,131,195,4,226,243,50,228,251,43,201,226,254,226,254,10,228, 116,8,186,1,1,232,173,3,250,244,180,0,50,237,176,254,230,33,176,16,230,67,177,22,138,193,230,64,246,196,255,117,4,226,249, 235,221,177,18,176,255,230,64,180,0,176,254,230,33,246,196,255,117,204,226,249,233,54,0,180,1,80,176,255,230,33,176,32,230, 32,88,207,80,228,98,168,64,116,8,190,25,226,185,14,0,235,10,168,128,116,16,190,39,226,185,14,0,184,0,0,205,16,232,230,3,250, 244,88,207,32,50,48,49,252,191,64,0,14,31,190,19,255,185,32,0,176,255,230,33,176,54,230,67,176,0,230,64,243,165,230,64,184, 64,0,142,216,232,120,3,128,251,170,116,38,176,60,230,97,144,144,228,96,36,255,117,22,254,6,18,0,38,199,6,32,0,178,230,38, 199,6,34,0,0,240,176,254,230,33,176,204,230,97,178,4,187,0,96,232,200,254,117,7,254,202,117,247,235,7,144,186,1,1,232,222, 2,228,96,180,0,163,16,0,36,48,117,3,233,152,0,134,224,128,252,48,116,9,254,192,128,252,32,117,2,176,3,80,42,228,205,16,88, 80,187,0,176,186,184,3,185,0,16,176,1,128,252,48,116,11,187,0,184,186,216,3,185,0,64,254,200,238,142,195,184,64,0,142,216, 129,62,114,0,52,18,116,13,142,219,232,118,252,116,6,186,2,1,232,129,2,88,80,180,0,205,16,184,32,112,43,255,185,40,0,252,243, 171,88,80,128,252,48,186,186,3,116,3,186,218,3,180,8,43,201,236,34,196,117,4,226,249,235,19,43,201,236,34,196,116,4,226,249, 235,8,177,3,210,236,117,228,235,6,186,2,1,232,61,2,88,180,0,205,16,184,64,0,142,216,138,38,16,0,128,228,12,176,4,246,228, 4,16,139,208,139,216,228,98,36,15,180,32,246,228,163,21,0,131,251,64,116,2,43,192,3,195,163,19,0,129,62,114,0,52,18,116,77, 187,0,4,185,16,0,59,209,118,70,142,219,142,195,131,193,16,129,195,0,4,81,83,82,232,210,251,90,91,89,116,230,140,218,138,232, 138,198,177,4,210,232,232,62,0,138,198,36,15,232,55,0,138,197,177,4,210,232,232,46,0,138,197,36,15,232,39,0,190,232,226,185, 4,0,232,80,2,233,74,0,184,64,0,142,216,139,22,21,0,11,210,116,240,185,0,0,129,251,0,16,119,231,187,0,16,235,155,30,14,31, 187,183,228,215,180,14,183,0,205,16,31,195,32,51,48,49,49,51,49,54,48,49,188,3,120,3,120,2,48,49,50,51,52,53,54,55,56,57, 65,66,67,68,69,70,184,64,0,142,216,128,62,18,0,1,116,57,232,178,1,227,43,176,77,230,97,128,251,170,117,34,176,204,230,97, 176,76,230,97,43,201,226,254,228,96,60,0,116,25,138,232,177,4,210,232,232,156,255,138,197,36,15,232,149,255,190,167,228,185, 4,0,232,190,1,43,192,142,192,185,48,0,14,31,190,243,254,191,32,0,252,243,165,184,64,0,142,216,176,77,230,97,176,255,230,33, 176,182,230,67,184,211,4,230,66,138,196,230,66,228,98,36,16,162,107,0,232,62,20,232,59,20,227,12,129,251,64,5,115,6,129,251, 16,4,115,9,190,171,228,185,3,0,232,110,1,176,252,230,33,160,16,0,168,1,117,3,233,185,0,176,188,230,33,180,0,205,19,246,196, 255,117,32,186,242,3,176,28,238,43,201,226,254,226,254,51,210,181,1,136,22,62,0,232,243,8,114,7,181,34,232,236,8,115,9,190, 174,228,185,3,0,232,42,1,176,12,186,242,3,238,199,6,26,0,30,0,199,6,28,0,30,0,189,177,228,190,0,0,46,139,86,0,176,170,238, 42,192,236,60,170,117,6,137,148,8,0,70,70,69,69,129,253,183,228,117,228,187,0,0,186,250,3,236,168,248,117,8,199,135,0,0,248, 3,67,67,186,250,2,236,168,248,117,8,199,135,0,0,248,2,67,67,139,198,177,3,210,200,10,195,162,17,0,186,1,2,236,168,15,117, 5,128,14,17,0,16,176,128,230,160,128,62,18,0,1,116,6,186,1,0,232,16,0,233,207,0,128,62,18,0,1,117,3,233,46,250,233,118,255, 156,250,30,184,64,0,142,216,10,246,116,24,179,6,232,37,0,226,254,254,206,117,245,128,62,18,0,1,117,6,176,205,230,97,235,232, 179,1,232,13,0,226,254,254,202,117,245,226,254,226,254,31,157,195,176,182,230,67,184,51,5,230,66,138,196,230,66,228,97,138, 224,12,3,230,97,43,201,226,254,254,203,117,250,138,196,230,97,195,176,12,230,97,185,86,41,226,254,176,204,230,97,176,76,230, 97,176,253,230,33,251,180,0,43,201,246,196,255,117,2,226,249,228,96,138,216,176,204,230,97,195,251,81,80,228,97,36,191,230, 97,43,201,226,254,12,64,230,97,176,32,230,32,88,89,207,184,64,0,142,216,128,62,18,0,1,117,5,182,1,233,85,255,46,138,4,70, 183,0,180,14,205,16,226,244,184,13,14,205,16,184,10,14,205,16,195,251,184,64,0,142,216,161,16,0,168,1,116,35,185,4,0,81,180, 0,205,19,114,20,180,2,187,0,0,142,195,187,0,124,186,0,0,185,1,0,176,1,205,19,89,115,4,226,224,205,24,234,0,124,0,0,23,4,0, 3,128,1,192,0,96,0,48,0,24,0,12,0,251,30,82,86,87,81,139,242,209,230,186,64,0,142,218,139,148,0,0,11,210,116,22,10,228,116, 24,254,204,116,78,254,204,117,3,233,137,0,254,204,117,3,233,185,0,89,95,94,90,31,207,138,224,131,194,3,176,128,238,138,212, 208,194,208,194,208,194,208,194,129,226,14,0,191,41,231,3,250,139,148,0,0,66,46,138,69,1,238,74,46,138,5,238,131,194,3,138, 196,36,31,238,131,234,2,176,0,238,235,121,80,131,194,4,176,3,238,51,201,131,194,2,236,168,32,117,8,226,249,88,128,204,128, 235,167,43,201,236,168,16,117,8,226,249,88,128,204,128,235,152,74,43,201,236,168,32,117,8,226,249,88,128,204,128,235,136, 131,234,5,89,138,193,238,233,126,255,128,38,113,0,127,131,194,4,176,1,238,131,194,2,43,201,236,168,32,117,7,226,249,180,128, 233,98,255,74,236,168,1,117,9,246,6,113,0,128,116,244,235,236,36,30,138,224,139,148,0,0,236,233,71,255,139,148,0,0,131,194, 5,236,138,224,66,236,233,56,255,251,30,83,187,64,0,142,219,10,228,116,11,254,204,116,32,254,204,116,45,91,31,207,251,144, 250,139,30,26,0,59,30,28,0,116,243,139,7,232,30,0,137,30,26,0,91,31,207,250,139,30,26,0,59,30,28,0,139,7,251,91,31,202,2, 0,160,23,0,91,31,207,131,195,2,129,251,62,0,117,3,187,30,0,195,82,58,69,70,56,29,42,54,128,64,32,16,8,4,2,1,27,255,0,255, 255,255,30,255,255,255,255,31,255,127,255,17,23,5,18,20,25,21,9,15,16,27,29,10,255,1,19,4,6,7,8,10,11,12,255,255,255,255, 28,26,24,3,22,2,14,13,255,255,255,255,255,255,32,255,94,95,96,97,98,99,100,101,102,103,255,255,119,255,132,255,115,255,116, 255,117,255,118,255,255,27,49,50,51,52,53,54,55,56,57,48,45,61,8,9,113,119,101,114,116,121,117,105,111,112,91,93,13,255,97, 115,100,102,103,104,106,107,108,59,39,96,255,92,122,120,99,118,98,110,109,44,46,47,255,42,255,32,255,27,33,64,35,36,37,94, 38,42,40,41,95,43,8,0,81,87,69,82,84,89,85,73,79,80,123,125,13,255,65,83,68,70,71,72,74,75,76,58,34,126,255,124,90,88,67, 86,66,78,77,60,62,63,255,0,255,32,255,84,85,86,87,88,89,90,91,92,93,104,105,106,107,108,109,110,111,112,113,55,56,57,45,52, 53,54,43,49,50,51,48,46,71,72,73,255,75,255,77,255,79,80,81,82,83,251,80,83,81,82,86,87,30,6,252,184,64,0,142,216,228,96, 80,228,97,138,224,12,128,230,97,134,224,230,97,88,138,224,60,255,117,3,233,117,2,36,127,14,7,191,130,232,185,8,0,242,174, 138,196,116,3,233,136,0,129,239,131,232,46,138,165,138,232,168,128,117,84,128,252,16,115,7,8,38,23,0,233,131,0,246,6,23,0, 4,117,104,60,82,117,37,246,6,23,0,8,116,3,235,91,144,246,6,23,0,32,117,13,246,6,23,0,3,116,13,184,48,82,233,216,1,246,6,23, 0,3,116,243,132,38,24,0,117,77,8,38,24,0,48,38,23,0,60,82,117,65,184,0,82,233,185,1,128,252,16,115,26,246,212,32,38,23,0, 60,184,117,44,160,25,0,180,0,136,38,25,0,60,0,116,31,233,163,1,246,212,32,38,24,0,235,20,60,128,115,16,246,6,24,0,8,116,23, 60,69,116,5,128,38,24,0,247,250,176,32,230,32,7,31,95,94,90,89,91,88,207,246,6,23,0,8,117,3,233,143,0,246,6,23,0,4,116,49, 60,83,117,45,199,6,114,0,52,18,233,209,245,82,79,80,81,75,76,77,71,72,73,16,17,18,19,20,21,22,23,24,25,30,31,32,33,34,35, 36,37,38,44,45,46,47,48,49,50,60,57,117,5,176,32,233,37,1,191,138,234,185,10,0,242,174,117,18,129,239,139,234,160,25,0,180, 10,246,228,3,199,162,25,0,235,139,198,6,25,0,0,185,26,0,242,174,117,5,176,0,233,248,0,60,2,114,12,60,14,115,8,128,196,118, 176,0,233,232,0,60,59,115,3,233,99,255,60,71,115,249,187,99,233,233,37,1,246,6,23,0,4,116,91,60,70,117,24,187,30,0,137,30, 26,0,137,30,28,0,198,6,113,0,128,205,27,184,0,0,233,180,0,60,69,117,33,128,14,24,0,8,176,32,230,32,128,62,73,0,7,116,7,186, 216,3,160,101,0,238,246,6,24,0,8,117,249,233,22,255,60,55,117,6,184,0,114,233,133,0,187,146,232,60,59,115,3,235,120,144,187, 204,232,233,195,0,60,71,115,45,246,6,23,0,3,116,91,60,15,117,6,184,0,15,235,97,144,60,55,117,9,176,32,230,32,205,5,233,218, 254,60,59,114,6,187,89,233,233,151,0,187,31,233,235,64,246,6,23,0,32,117,32,246,6,23,0,3,117,32,60,74,116,11,60,78,116,12, 44,71,187,122,233,235,119,184,45,74,235,34,184,43,78,235,29,246,6,23,0,3,117,224,44,70,187,109,233,235,11,60,59,114,4,176, 0,235,7,187,229,232,254,200,46,215,60,255,116,31,128,252,255,116,26,246,6,23,0,64,116,32,246,6,23,0,3,116,15,60,65,114,21, 60,90,119,17,4,32,235,13,233,92,254,60,97,114,6,60,122,119,2,44,32,139,30,28,0,139,243,232,96,252,59,30,26,0,116,9,137,4, 137,30,28,0,233,58,254,232,13,0,233,52,254,44,59,46,215,138,224,176,0,235,168,80,83,81,187,192,0,228,97,80,36,252,230,97, 185,72,0,226,254,12,2,230,97,185,72,0,226,254,75,117,235,88,230,97,89,91,88,195,251,83,81,30,86,87,85,82,139,236,190,64,0, 142,222,232,28,0,187,4,0,232,255,1,136,38,64,0,138,38,65,0,128,252,1,245,90,93,95,94,31,89,91,202,2,0,138,240,128,38,63,0, 127,10,228,116,39,254,204,116,116,198,6,65,0,0,128,250,4,115,19,254,204,116,106,254,204,117,3,233,150,0,254,204,116,104,254, 204,116,104,198,6,65,0,1,195,186,242,3,250,160,63,0,177,4,210,224,168,32,117,12,168,64,117,6,168,128,116,6,254,192,254,192, 254,192,12,8,238,198,6,62,0,0,198,6,65,0,0,12,4,238,251,232,40,2,160,66,0,60,192,116,7,128,14,65,0,32,235,17,180,3,232,71, 1,187,1,0,232,109,1,187,3,0,232,103,1,195,160,65,0,195,176,70,232,185,1,180,102,235,54,176,66,235,245,128,14,63,0,128,176, 74,232,167,1,180,77,235,36,187,7,0,232,65,1,187,9,0,232,59,1,187,15,0,232,53,1,187,17,0,233,171,0,128,14,63,0,128,176,74, 232,129,1,180,69,115,8,198,6,65,0,9,176,0,195,80,81,138,202,176,1,210,224,250,198,6,64,0,255,132,6,63,0,117,49,128,38,63, 0,240,8,6,63,0,251,176,16,210,224,10,194,12,12,82,186,242,3,238,90,246,6,63,0,128,116,18,187,20,0,232,224,0,10,228,116,8, 43,201,226,254,254,204,235,246,251,89,232,224,0,88,138,252,182,0,114,75,190,243,237,144,86,232,148,0,138,102,1,208,228,208, 228,128,228,4,10,226,232,133,0,128,255,77,117,3,233,98,255,138,229,232,120,0,138,102,1,232,114,0,138,225,232,109,0,187,7, 0,232,147,0,187,9,0,232,141,0,187,11,0,232,135,0,187,13,0,232,129,0,94,232,64,1,114,69,232,115,1,114,63,252,190,66,0,172, 36,192,116,59,60,64,117,41,172,208,224,180,4,114,36,208,224,208,224,180,16,114,28,208,224,180,8,114,22,208,224,208,224,180, 4,114,14,208,224,180,3,114,8,208,224,180,2,114,2,180,32,8,38,65,0,232,119,1,195,232,46,1,195,232,111,1,50,228,195,82,81,186, 244,3,51,201,236,168,64,116,12,226,249,128,14,65,0,128,89,90,88,249,195,51,201,236,168,128,117,4,226,249,235,235,138,196, 186,245,3,238,89,90,195,30,43,192,142,216,197,54,120,0,209,235,138,32,31,114,196,195,176,1,81,138,202,210,192,89,132,6,62, 0,117,19,8,6,62,0,180,7,232,172,255,138,226,232,167,255,232,114,0,114,41,180,15,232,157,255,138,226,232,152,255,138,229,232, 147,255,232,94,0,156,187,18,0,232,181,255,81,185,38,2,10,228,116,6,226,254,254,204,235,243,89,157,195,81,230,12,230,11,140, 192,177,4,211,192,138,232,36,240,3,195,115,2,254,197,80,230,4,138,196,230,4,138,197,36,15,230,129,138,230,42,192,209,232, 80,187,6,0,232,117,255,138,204,88,211,224,72,80,230,5,138,196,230,5,89,88,3,193,89,176,2,230,10,195,232,30,0,114,20,180,8, 232,40,255,232,76,0,114,10,160,66,0,36,96,60,96,116,2,248,195,128,14,65,0,64,249,195,251,83,81,179,2,51,201,246,6,62,0,128, 117,12,226,247,254,203,117,243,128,14,65,0,128,249,156,128,38,62,0,127,157,89,91,195,251,30,80,184,64,0,142,216,128,14,62, 0,128,176,32,230,32,88,31,207,252,191,66,0,81,82,83,179,7,51,201,186,244,3,236,168,128,117,12,226,249,128,14,65,0,128,249, 91,90,89,195,236,168,64,117,7,128,14,65,0,32,235,239,66,236,136,5,71,185,10,0,226,254,74,236,168,16,116,6,254,203,117,202, 235,227,91,90,89,195,160,69,0,58,197,160,71,0,116,10,187,8,0,232,176,254,138,196,254,192,42,193,195,207,2,37,2,8,42,255,80, 246,25,4,251,30,82,86,81,83,190,64,0,142,222,139,242,209,230,139,148,8,0,11,210,116,12,10,228,116,14,254,204,116,66,254,204, 116,42,91,89,94,90,31,207,80,179,20,51,201,238,66,236,138,224,168,128,117,14,226,247,254,203,117,243,128,204,1,128,228,249, 235,20,176,13,66,238,176,12,238,88,80,139,148,8,0,66,236,138,224,128,228,248,90,138,194,128,244,72,235,194,80,131,194,2,176, 8,238,184,232,3,72,117,253,176,12,238,235,219,252,240,207,241,240,241,26,242,169,247,48,242,156,242,65,243,125,243,195,243, 246,243,84,242,56,244,39,244,34,247,122,242,251,252,6,30,82,81,83,86,87,80,138,196,50,228,209,224,139,240,61,32,0,114,4,88, 233,71,1,184,64,0,142,216,184,0,184,139,62,16,0,129,231,48,0,131,255,48,117,3,184,0,176,142,192,88,138,38,73,0,46,255,164, 69,240,56,40,45,10,31,6,25,28,2,7,6,7,0,0,0,0,113,80,90,10,31,6,25,28,2,7,6,7,0,0,0,0,56,40,45,10,127,6,100,112,2,1,6,7,0, 0,0,0,97,80,82,15,25,6,25,25,2,13,11,12,0,0,0,0,0,8,0,16,0,64,0,64,40,40,80,80,40,40,80,80,44,40,45,41,42,46,30,41,186,212, 3,179,0,131,255,48,117,7,176,7,186,180,3,254,195,138,224,162,73,0,137,22,99,0,30,80,82,131,194,4,138,195,238,90,43,192,142, 216,197,30,116,0,88,185,16,0,128,252,2,114,16,3,217,128,252,4,114,9,3,217,128,252,7,114,2,3,217,80,50,228,138,196,238,66, 254,196,138,7,238,67,74,226,243,88,31,51,255,137,62,78,0,198,6,98,0,0,185,0,32,128,252,4,114,12,128,252,7,116,4,51,192,235, 6,185,0,8,184,32,7,243,171,199,6,96,0,103,0,160,73,0,50,228,139,240,139,22,99,0,131,194,4,46,138,132,244,240,238,162,101, 0,46,138,132,236,240,50,228,163,74,0,129,230,14,0,46,139,140,228,240,137,14,76,0,185,8,0,191,80,0,30,7,51,192,243,171,66, 176,48,128,62,73,0,6,117,2,176,63,238,162,102,0,95,94,91,89,90,31,7,207,180,10,137,14,96,0,232,2,0,235,237,139,22,99,0,138, 196,238,66,138,197,238,74,138,196,254,192,238,66,138,193,238,195,138,207,50,237,209,225,139,241,137,148,80,0,56,62,98,0,117, 5,139,194,232,2,0,235,190,232,127,0,139,200,3,14,78,0,209,249,180,14,232,193,255,195,138,223,50,255,209,227,139,151,80,0, 139,14,96,0,95,94,91,88,88,31,7,207,162,98,0,139,14,76,0,152,80,247,225,163,78,0,139,200,209,249,180,12,232,147,255,91,209, 227,139,135,80,0,232,184,255,233,115,255,139,22,99,0,131,194,5,160,102,0,10,255,117,14,36,224,128,227,31,10,195,238,162,102, 0,233,87,255,36,223,208,235,115,243,12,32,235,239,138,38,74,0,160,73,0,138,62,98,0,95,94,89,233,63,255,83,139,216,138,196, 246,38,74,0,50,255,3,195,209,224,91,195,138,216,128,252,4,114,8,128,252,7,116,3,233,243,1,83,139,193,232,57,0,116,51,3,240, 138,230,42,227,232,117,0,3,245,3,253,254,204,117,245,88,176,32,232,112,0,3,253,254,203,117,247,184,64,0,142,216,128,62,73, 0,7,116,7,160,101,0,186,216,3,238,233,225,254,138,222,235,218,128,62,73,0,2,114,25,128,62,73,0,3,119,18,82,186,218,3,80,236, 168,8,116,251,176,37,186,216,3,238,88,90,232,126,255,3,6,78,0,139,248,139,240,43,209,254,198,254,194,50,237,139,46,74,0,3, 237,138,195,246,38,74,0,3,192,6,31,128,251,0,195,138,202,86,87,243,165,95,94,195,138,202,87,243,171,95,195,253,138,216,128, 252,4,114,8,128,252,7,116,3,233,166,1,83,139,194,232,147,255,116,32,43,240,138,230,42,227,232,207,255,43,245,43,253,254,204, 117,245,88,176,32,232,202,255,43,253,254,203,117,247,233,87,255,138,222,235,237,128,252,4,114,8,128,252,7,116,3,233,169,2, 232,26,0,139,243,139,22,99,0,131,194,6,6,31,236,168,1,117,251,250,236,168,1,116,251,173,233,32,254,138,207,50,237,139,241, 209,230,139,132,80,0,51,219,227,6,3,30,76,0,226,250,232,203,254,3,216,195,128,252,4,114,8,128,252,7,116,3,233,177,1,138,227, 80,81,232,208,255,139,251,89,91,139,22,99,0,131,194,6,236,168,1,117,251,250,236,168,1,116,251,139,195,171,251,226,232,233, 209,253,128,252,4,114,8,128,252,7,116,3,233,126,1,80,81,232,159,255,139,251,89,91,139,22,99,0,131,194,6,236,168,1,117,251, 250,236,168,1,116,251,138,195,170,71,226,232,233,160,253,232,49,0,38,138,4,34,196,210,224,138,206,210,192,233,143,253,80, 80,232,30,0,210,232,34,196,38,138,12,91,246,195,128,117,13,246,212,34,204,10,193,38,136,4,88,233,112,253,50,193,235,245,83, 80,176,40,82,128,226,254,246,226,90,246,194,1,116,3,5,0,32,139,240,88,139,209,187,192,2,185,2,3,128,62,73,0,6,114,6,187,128, 1,185,3,7,34,234,211,234,3,242,138,247,42,201,208,200,2,205,254,207,117,248,138,227,210,236,91,195,138,216,139,193,232,106, 2,139,248,43,209,129,194,1,1,208,230,208,230,128,62,73,0,6,115,4,208,226,209,231,6,31,42,237,208,227,208,227,116,45,138,195, 180,80,246,228,139,247,3,240,138,230,42,227,232,128,0,129,238,176,31,129,239,176,31,254,204,117,241,138,199,232,136,0,129, 239,176,31,254,203,117,245,233,212,252,138,222,235,236,253,138,216,139,194,232,16,2,139,248,43,209,129,194,1,1,208,230,208, 230,128,62,73,0,6,115,5,208,226,209,231,71,6,31,42,237,129,199,240,0,208,227,208,227,116,46,138,195,180,80,246,228,139,247, 43,240,138,230,42,227,232,33,0,129,238,80,32,129,239,80,32,254,204,117,241,138,199,232,41,0,129,239,80,32,254,203,117,245, 252,233,116,252,138,222,235,235,138,202,86,87,243,164,95,94,129,198,0,32,129,199,0,32,86,87,138,202,243,164,95,94,195,138, 202,87,243,170,95,129,199,0,32,87,138,202,243,170,95,195,180,0,80,232,133,1,139,248,88,60,128,115,6,190,110,250,14,235,15, 44,128,30,43,246,142,222,197,54,124,0,140,218,31,82,209,224,209,224,209,224,3,240,128,62,73,0,6,31,114,44,87,86,182,4,172, 246,195,128,117,22,170,172,38,136,133,255,31,131,199,79,254,206,117,236,94,95,71,226,227,233,244,251,38,50,5,170,172,38,50, 133,255,31,235,224,138,211,209,231,232,209,0,87,86,182,4,172,232,222,0,35,195,246,194,128,116,7,38,50,37,38,50,69,1,38,136, 37,38,136,69,1,172,232,197,0,35,195,246,194,128,116,10,38,50,165,0,32,38,50,133,1,32,38,136,165,0,32,38,136,133,1,32,131, 199,80,254,206,117,193,94,95,131,199,2,226,182,233,148,251,232,214,0,139,240,131,236,8,139,236,128,62,73,0,6,6,31,114,26, 182,4,138,4,136,70,0,69,138,132,0,32,136,70,0,69,131,198,80,254,206,117,235,235,23,144,209,230,182,4,232,136,0,129,198,0, 32,232,129,0,129,238,176,31,254,206,117,238,191,110,250,14,7,131,237,8,139,245,252,176,0,22,31,186,128,0,86,87,185,8,0,243, 166,95,94,116,30,254,192,131,199,8,74,117,237,60,0,116,18,43,192,142,216,196,62,124,0,140,192,11,199,116,4,176,128,235,210, 131,196,8,233,16,251,128,227,3,138,195,81,185,3,0,208,224,208,224,10,216,226,248,138,251,89,195,82,81,83,186,0,0,185,1,0, 139,216,35,217,11,211,209,224,209,225,139,216,35,217,11,211,209,225,115,236,139,194,91,89,90,195,138,36,138,68,1,185,0,192, 178,0,133,193,248,116,1,249,208,210,209,233,209,233,115,242,136,86,0,69,195,161,80,0,83,139,216,138,196,246,38,74,0,209,224, 209,224,42,255,3,195,91,195,80,80,180,3,205,16,88,60,8,116,89,60,13,116,94,60,10,116,94,60,7,116,97,138,62,98,0,180,10,185, 1,0,205,16,254,194,58,22,74,0,117,54,178,0,128,254,24,117,45,180,2,183,0,205,16,160,73,0,60,4,114,6,60,7,183,0,117,6,180, 8,205,16,138,252,184,1,6,185,0,0,182,24,138,22,74,0,254,202,205,16,88,233,71,250,254,198,180,2,235,244,128,250,0,116,247, 254,202,235,243,178,0,235,239,128,254,24,117,232,235,185,179,2,232,199,238,235,219,3,3,5,5,3,3,3,4,180,0,139,22,99,0,131, 194,6,236,168,4,117,120,168,2,116,126,180,16,139,22,99,0,138,196,238,66,236,138,232,74,254,196,138,196,238,66,236,138,229, 138,30,73,0,42,255,46,138,159,161,247,43,195,43,6,78,0,121,3,184,0,0,177,3,128,62,73,0,4,114,42,128,62,73,0,7,116,35,178, 40,246,242,138,232,2,237,138,220,42,255,128,62,73,0,6,117,4,177,4,208,228,211,227,138,212,138,240,208,238,208,238,235,18, 246,54,74,0,138,240,138,212,210,224,138,232,138,220,50,255,211,227,180,1,82,139,22,99,0,131,194,7,238,90,95,94,31,31,31,31, 7,207,251,30,184,64,0,142,216,161,19,0,31,207,251,30,184,64,0,142,216,161,16,0,31,207,251,30,80,184,64,0,142,216,128,38,113, 0,127,88,232,4,0,31,202,2,0,10,228,116,19,254,204,116,24,254,204,116,26,254,204,117,3,233,39,1,180,128,249,195,228,97,36, 247,230,97,42,228,195,228,97,12,8,235,245,83,81,86,190,7,0,232,194,1,228,98,36,16,162,107,0,186,122,63,246,6,113,0,128,116, 3,233,138,0,74,117,3,233,132,0,232,198,0,227,235,186,120,3,185,0,2,228,33,12,1,230,33,246,6,113,0,128,117,108,81,232,173, 0,11,201,89,116,197,59,211,227,4,115,191,226,232,114,230,232,155,0,232,106,0,60,22,117,73,94,89,91,81,199,6,105,0,255,255, 186,0,1,246,6,113,0,128,117,35,232,79,0,114,30,227,5,38,136,7,67,73,74,127,234,232,64,0,232,61,0,42,228,129,62,105,0,15,29, 117,6,227,6,235,205,180,1,254,196,90,43,209,80,246,196,3,117,19,232,31,0,235,14,78,116,3,233,98,255,94,89,91,43,210,180,4, 80,228,33,36,254,230,33,232,66,255,88,128,252,1,245,195,83,81,177,8,81,232,38,0,227,32,83,232,32,0,88,227,25,3,216,129,251, 240,6,245,159,89,208,213,158,232,217,0,254,201,117,224,138,197,248,89,91,195,89,249,235,249,185,100,0,138,38,107,0,228,98, 36,16,58,196,225,248,162,107,0,176,0,230,67,139,30,103,0,228,64,138,224,228,64,134,196,43,216,163,103,0,195,83,81,228,97, 36,253,12,1,230,97,176,182,230,67,232,166,0,184,160,4,232,133,0,185,0,8,249,232,104,0,226,250,248,232,98,0,89,91,176,22,232, 68,0,199,6,105,0,255,255,186,0,1,38,138,7,232,53,0,227,2,67,73,74,127,243,161,105,0,247,208,80,134,224,232,35,0,88,232,31, 0,11,201,117,215,81,185,32,0,249,232,42,0,226,250,89,176,176,230,67,184,1,0,232,51,0,232,122,254,43,192,195,81,80,138,232, 177,8,208,213,156,232,11,0,157,232,36,0,254,201,117,242,88,89,195,184,160,4,114,3,184,80,2,80,228,98,36,32,116,250,228,98, 36,32,117,250,88,230,66,138,196,230,66,195,161,105,0,209,216,209,208,248,113,4,53,16,8,249,209,208,163,105,0,195,232,35,254, 179,66,185,0,7,226,254,254,203,117,247,195,0,0,0,0,0,0,0,0,126,129,165,129,189,153,129,126,126,255,219,255,195,231,255,126, 108,254,254,254,124,56,16,0,16,56,124,254,124,56,16,0,56,124,56,254,254,124,56,124,16,16,56,124,254,124,56,124,0,0,24,60, 60,24,0,0,255,255,231,195,195,231,255,255,0,60,102,66,66,102,60,0,255,195,153,189,189,153,195,255,15,7,15,125,204,204,204, 120,60,102,102,102,60,24,126,24,63,51,63,48,48,112,240,224,127,99,127,99,99,103,230,192,153,90,60,231,231,60,90,153,128,224, 248,254,248,224,128,0,2,14,62,254,62,14,2,0,24,60,126,24,24,126,60,24,102,102,102,102,102,0,102,0,127,219,219,123,27,27,27, 0,62,99,56,108,108,56,204,120,0,0,0,0,126,126,126,0,24,60,126,24,126,60,24,255,24,60,126,24,24,24,24,0,24,24,24,24,126,60, 24,0,0,24,12,254,12,24,0,0,0,48,96,254,96,48,0,0,0,0,192,192,192,254,0,0,0,36,102,255,102,36,0,0,0,24,60,126,255,255,0,0, 0,255,255,126,60,24,0,0,0,0,0,0,0,0,0,0,48,120,120,48,48,0,48,0,108,108,108,0,0,0,0,0,108,108,254,108,254,108,108,0,48,124, 192,120,12,248,48,0,0,198,204,24,48,102,198,0,56,108,56,118,220,204,118,0,96,96,192,0,0,0,0,0,24,48,96,96,96,48,24,0,96,48, 24,24,24,48,96,0,0,102,60,255,60,102,0,0,0,48,48,252,48,48,0,0,0,0,0,0,0,48,48,96,0,0,0,252,0,0,0,0,0,0,0,0,0,48,48,0,6,12, 24,48,96,192,128,0,124,198,206,222,246,230,124,0,48,112,48,48,48,48,252,0,120,204,12,56,96,204,252,0,120,204,12,56,12,204, 120,0,28,60,108,204,254,12,30,0,252,192,248,12,12,204,120,0,56,96,192,248,204,204,120,0,252,204,12,24,48,48,48,0,120,204, 204,120,204,204,120,0,120,204,204,124,12,24,112,0,0,48,48,0,0,48,48,0,0,48,48,0,0,48,48,96,24,48,96,192,96,48,24,0,0,0,252, 0,0,252,0,0,96,48,24,12,24,48,96,0,120,204,12,24,48,0,48,0,124,198,222,222,222,192,120,0,48,120,204,204,252,204,204,0,252, 102,102,124,102,102,252,0,60,102,192,192,192,102,60,0,248,108,102,102,102,108,248,0,254,98,104,120,104,98,254,0,254,98,104, 120,104,96,240,0,60,102,192,192,206,102,62,0,204,204,204,252,204,204,204,0,120,48,48,48,48,48,120,0,30,12,12,12,204,204,120, 0,230,102,108,120,108,102,230,0,240,96,96,96,98,102,254,0,198,238,254,254,214,198,198,0,198,230,246,222,206,198,198,0,56, 108,198,198,198,108,56,0,252,102,102,124,96,96,240,0,120,204,204,204,220,120,28,0,252,102,102,124,108,102,230,0,120,204,224, 112,28,204,120,0,252,180,48,48,48,48,120,0,204,204,204,204,204,204,252,0,204,204,204,204,204,120,48,0,198,198,198,214,254, 238,198,0,198,198,108,56,56,108,198,0,204,204,204,120,48,48,120,0,254,198,140,24,50,102,254,0,120,96,96,96,96,96,120,0,192, 96,48,24,12,6,2,0,120,24,24,24,24,24,120,0,16,56,108,198,0,0,0,0,0,0,0,0,0,0,0,255,48,48,24,0,0,0,0,0,0,0,120,12,124,204, 118,0,224,96,96,124,102,102,220,0,0,0,120,204,192,204,120,0,28,12,12,124,204,204,118,0,0,0,120,204,252,192,120,0,56,108,96, 240,96,96,240,0,0,0,118,204,204,124,12,248,224,96,108,118,102,102,230,0,48,0,112,48,48,48,120,0,12,0,12,12,12,204,204,120, 224,96,102,108,120,108,230,0,112,48,48,48,48,48,120,0,0,0,204,254,254,214,198,0,0,0,248,204,204,204,204,0,0,0,120,204,204, 204,120,0,0,0,220,102,102,124,96,240,0,0,118,204,204,124,12,30,0,0,220,118,102,96,240,0,0,0,124,192,120,12,248,0,16,48,124, 48,48,52,24,0,0,0,204,204,204,204,118,0,0,0,204,204,204,120,48,0,0,0,198,214,254,254,108,0,0,0,198,108,56,108,198,0,0,0,204, 204,204,124,12,248,0,0,252,152,48,100,252,0,28,48,48,224,48,48,28,0,24,24,24,0,24,24,24,0,224,48,48,28,48,48,224,0,118,220, 0,0,0,0,0,0,0,16,56,108,198,198,254,0,251,30,80,184,64,0,142,216,88,10,228,116,7,254,204,116,22,251,31,207,250,160,112,0, 198,6,112,0,0,139,14,110,0,139,22,108,0,235,234,250,137,22,108,0,137,14,110,0,198,6,112,0,0,235,218,251,30,80,82,184,64,0, 142,216,255,6,108,0,117,4,255,6,110,0,131,62,110,0,24,117,25,129,62,108,0,176,0,117,17,199,6,110,0,0,0,199,6,108,0,0,0,198, 6,112,0,1,254,14,64,0,117,11,128,38,63,0,240,176,12,186,242,3,238,205,28,176,32,230,32,90,88,31,207,165,254,0,240,135,233, 0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,87,239,0,240,0,0,0,0,101,240,0,240,77,248,0,240,65,248,0,240,89,236,0,240,57,231,0, 240,89,248,0,240,46,232,0,240,210,239,0,240,0,0,0,246,242,230,0,240,110,254,0,240,83,255,0,240,83,255,0,240,164,240,0,240, 199,239,0,240,0,0,0,0,207,251,30,80,83,81,82,184,80,0,142,216,128,62,0,0,1,116,95,198,6,0,0,1,180,15,205,16,138,204,181,25, 232,85,0,81,180,3,205,16,89,82,51,210,180,2,205,16,180,8,205,16,10,192,117,2,176,32,82,51,210,50,228,205,23,90,246,196,37, 117,33,254,194,58,202,117,223,50,210,138,226,82,232,35,0,90,254,198,58,238,117,208,90,180,2,205,16,198,6,0,0,0,235,10,90, 180,2,205,16,198,6,0,0,255,90,89,91,88,31,207,51,210,50,228,176,10,205,23,50,228,176,13,205,23,195,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,234,91,224,0,240,49,48,47,49,57,47,56,49,255,255,155]
[49,53,48,49,52,55,54,32,67,79,80,82,46,32,73,66,77,32,49,57,56,49,209,224,185,0,64,252,139,217,184,170,170,186,85,255,43, 255,243,170,79,253,139,247,139,203,172,50,196,117,37,138,194,170,226,246,34,228,116,22,138,224,134,242,34,228,117,4,138,212, 235,224,252,71,116,222,79,186,1,0,235,214,228,98,36,192,176,0,252,195,255,250,180,213,158,115,76,117,74,123,72,121,70,159, 177,5,210,236,115,63,176,64,208,224,113,57,50,228,158,118,52,120,50,122,48,159,177,5,210,236,114,41,208,228,112,37,184,255, 255,249,142,216,140,219,142,195,140,193,142,209,140,210,139,226,139,236,139,245,139,254,115,7,51,199,117,7,248,235,227,11, 199,116,1,244,230,160,230,131,186,216,3,238,254,192,178,184,238,176,153,230,99,176,252,230,97,140,200,142,208,142,216,183, 224,188,22,224,233,123,11,117,218,176,4,230,8,176,84,230,67,138,193,230,65,176,64,230,67,128,251,255,116,7,228,65,10,216, 226,241,244,138,195,43,201,230,65,176,64,230,67,144,144,228,65,34,216,116,3,226,242,244,176,18,230,65,230,13,176,255,138, 216,138,248,185,8,0,43,210,238,80,238,184,1,1,236,138,224,236,59,216,116,1,244,66,226,238,254,192,116,225,142,219,142,195, 176,255,230,1,80,230,1,178,11,176,88,238,176,0,230,8,80,230,10,177,3,176,65,238,254,192,226,251,186,19,2,176,1,238,139,46, 114,4,129,253,52,18,116,10,188,65,240,144,233,182,254,116,1,244,43,255,228,96,36,12,4,4,177,12,211,224,139,200,252,170,226, 253,137,46,114,4,176,248,230,97,228,98,36,1,177,12,211,192,176,252,230,97,228,98,36,15,10,196,138,216,180,32,246,228,163, 21,4,116,24,186,0,16,138,224,176,0,142,194,185,0,128,43,255,243,170,129,194,0,8,254,203,117,239,176,19,230,32,176,8,230,33, 176,9,230,33,43,192,142,192,184,48,0,142,208,188,0,1,129,253,52,18,116,37,43,255,142,223,187,36,0,199,7,71,255,67,67,140, 15,232,95,4,128,251,101,117,14,178,255,232,98,4,138,195,170,254,202,117,246,205,62,185,32,0,43,255,184,71,255,171,140,200, 171,226,247,199,6,8,0,195,226,199,6,20,0,84,255,199,6,98,0,0,246,186,33,0,176,0,238,236,10,192,117,21,176,255,238,236,4,1, 117,13,50,228,251,43,201,226,254,226,254,10,228,116,8,186,1,1,232,146,3,250,244,176,254,238,176,16,230,67,185,22,0,138,193, 230,64,246,196,255,117,4,226,249,235,225,177,18,176,255,230,64,184,254,0,238,246,196,255,117,210,226,249,30,191,64,0,14,31, 190,3,255,144,185,16,0,176,255,238,176,54,230,67,176,0,230,64,165,71,71,226,251,230,64,31,232,185,3,128,251,170,116,30,176, 60,230,97,144,144,228,96,36,255,117,14,254,6,18,4,199,6,32,0,109,230,176,254,230,33,176,204,230,97,228,96,180,0,163,16,4, 36,48,117,41,199,6,64,0,83,255,233,162,0,255,255,80,228,98,168,192,116,21,190,218,255,144,168,64,117,4,190,35,255,144,43, 192,205,16,232,221,3,250,244,88,207,60,48,116,8,254,196,60,32,117,2,180,3,134,224,80,42,228,205,16,88,80,187,0,176,186,184, 3,185,0,16,176,1,128,252,48,116,8,183,184,178,216,181,64,254,200,238,129,253,52,18,142,195,116,7,142,219,232,255,252,117, 50,88,80,180,0,205,16,184,32,112,43,255,185,40,0,243,171,88,80,128,252,48,186,186,3,116,2,178,218,180,8,43,201,236,34,196, 117,4,226,249,235,9,43,201,236,34,196,116,10,226,249,186,2,1,232,121,2,235,6,177,3,210,236,117,222,88,180,0,205,16,186,0, 192,142,218,43,219,139,7,83,91,61,85,170,117,5,232,14,3,235,4,129,194,128,0,129,250,0,200,124,228,186,16,2,184,85,85,238, 176,1,236,58,196,117,52,247,208,238,176,1,236,58,196,117,42,139,216,186,20,2,46,136,7,238,144,236,58,199,117,20,66,236,58, 196,117,14,66,236,58,196,117,8,247,208,60,170,116,9,235,221,190,237,254,144,232,246,2,232,119,27,160,16,0,36,12,180,4,246, 228,4,16,139,208,139,216,161,21,0,131,251,64,116,2,43,192,3,195,163,19,0,129,253,52,18,30,116,79,187,0,4,185,16,0,59,209, 118,45,142,219,142,195,131,193,16,129,195,0,4,81,83,82,232,17,252,90,91,89,116,230,140,218,138,232,138,198,232,16,2,138,197, 232,11,2,190,103,250,144,232,153,2,235,24,31,30,139,22,21,0,11,210,116,14,185,0,0,129,251,0,16,119,5,187,0,16,235,183,31, 128,62,18,0,1,116,42,232,253,1,227,30,176,77,230,97,128,251,170,117,21,176,204,230,97,176,76,230,97,43,201,226,254,228,96, 60,0,116,10,232,191,1,190,51,255,144,232,77,2,43,192,142,192,185,8,0,30,14,31,190,243,254,144,191,32,0,165,71,71,226,251, 31,30,176,77,230,97,176,255,230,33,176,182,230,67,184,211,4,230,66,138,196,230,66,228,98,36,16,162,107,0,232,213,20,232,210, 20,227,12,129,251,64,5,115,6,129,251,16,4,115,7,190,57,255,144,232,254,1,186,0,200,142,218,43,219,139,7,61,85,170,117,5,232, 183,1,235,4,129,194,128,0,129,250,0,246,124,230,235,1,144,43,219,142,218,232,105,7,116,3,232,33,3,128,198,2,128,254,254,117, 236,31,160,16,0,168,1,117,10,128,62,18,0,1,117,61,233,89,251,228,33,36,191,230,33,180,0,138,212,205,19,114,33,186,242,3,82, 176,28,238,43,201,226,254,226,254,51,210,181,1,136,22,62,0,232,85,9,114,7,181,34,232,78,9,115,7,190,234,255,144,232,130,1, 176,12,90,238,190,30,0,137,54,26,0,137,54,28,0,137,54,128,0,131,198,32,137,54,130,0,228,33,36,252,230,33,189,61,230,144,43, 246,46,139,86,0,176,170,238,82,236,90,60,170,117,5,137,84,8,70,70,69,69,129,253,67,230,117,229,43,219,186,250,3,236,168,248, 117,6,199,7,248,3,67,67,182,2,236,168,248,117,6,199,7,248,2,67,67,139,198,177,3,210,200,10,195,162,17,0,178,1,236,168,15, 117,5,128,14,17,0,16,30,7,191,120,0,184,20,20,171,171,184,1,1,171,171,176,128,230,160,128,62,18,0,1,116,6,186,1,0,232,2,0, 205,25,156,250,30,232,105,25,10,246,116,24,179,6,232,37,0,226,254,254,206,117,245,128,62,18,0,1,117,6,176,205,230,97,235, 232,179,1,232,13,0,226,254,254,202,117,245,226,254,226,254,31,157,195,176,182,230,67,184,51,5,230,66,138,196,230,66,228,97, 138,224,12,3,230,97,43,201,226,254,254,203,117,250,138,196,230,97,195,80,177,4,210,232,232,3,0,88,36,15,4,144,39,20,64,39, 180,14,183,0,205,16,195,188,3,120,3,120,2,176,12,230,97,185,86,41,226,254,176,204,230,97,176,76,230,97,176,253,230,33,251, 180,0,43,201,246,196,255,117,2,226,249,228,96,138,216,176,204,230,97,195,251,80,228,97,138,224,246,208,36,64,128,228,191, 10,196,230,97,176,32,230,32,88,207,184,64,0,142,192,42,228,138,71,2,177,9,211,224,139,200,81,177,4,211,232,3,208,89,232,176, 5,116,5,232,101,1,235,19,82,38,199,6,0,1,3,0,38,140,30,2,1,38,255,30,0,1,90,195,232,129,24,128,62,18,0,1,117,5,182,1,233, 6,255,46,138,4,70,80,232,101,255,88,60,10,117,243,195,32,82,79,77,13,10,80,176,32,230,32,88,207,234,0,124,0,0,255,255,255, 255,255,255,255,255,255,251,43,192,142,216,199,6,120,0,199,239,140,14,122,0,161,16,4,168,1,116,30,185,4,0,81,180,0,205,19, 114,15,184,1,2,43,210,142,194,187,0,124,185,1,0,205,19,89,115,192,226,229,205,24,255,23,4,0,3,128,1,192,0,96,0,48,0,24,0, 12,0,251,30,82,86,87,81,83,139,242,139,250,209,230,232,245,23,139,20,11,210,116,19,10,228,116,22,254,204,116,69,254,204,116, 106,254,204,117,3,233,131,0,91,89,95,94,90,31,207,138,224,131,194,3,176,128,238,138,212,177,4,210,194,129,226,14,0,191,41, 231,3,250,139,20,66,46,138,69,1,238,74,46,138,5,238,131,194,3,138,196,36,31,238,74,74,176,0,238,235,73,80,131,194,4,176,3, 238,66,66,183,48,232,72,0,116,8,89,138,193,128,204,128,235,174,74,183,32,232,56,0,117,240,131,234,5,89,138,193,238,235,157, 131,194,4,176,1,238,66,66,183,32,232,32,0,117,219,74,183,1,232,24,0,117,211,128,228,30,139,20,236,233,125,255,139,20,131, 194,5,236,138,224,66,236,233,112,255,138,93,124,43,201,236,138,224,34,199,58,199,116,8,226,245,254,203,117,239,10,255,195, 82,80,140,218,129,250,0,200,126,19,138,198,232,13,254,138,194,232,8,254,190,215,230,232,151,254,88,90,195,186,2,1,232,163, 253,235,245,251,30,83,232,10,23,10,228,116,10,254,204,116,30,254,204,116,43,235,44,251,144,250,139,30,26,0,59,30,28,0,116, 243,139,7,232,29,0,137,30,26,0,235,20,250,139,30,26,0,59,30,28,0,139,7,251,91,31,202,2,0,160,23,0,91,31,207,67,67,59,30,130, 0,117,4,139,30,128,0,195,82,58,69,70,56,29,42,54,128,64,32,16,8,4,2,1,27,255,0,255,255,255,30,255,255,255,255,31,255,127, 255,17,23,5,18,20,25,21,9,15,16,27,29,10,255,1,19,4,6,7,8,10,11,12,255,255,255,255,28,26,24,3,22,2,14,13,255,255,255,255, 255,255,32,255,94,95,96,97,98,99,100,101,102,103,255,255,119,255,132,255,115,255,116,255,117,255,118,255,255,27,49,50,51, 52,53,54,55,56,57,48,45,61,8,9,113,119,101,114,116,121,117,105,111,112,91,93,13,255,97,115,100,102,103,104,106,107,108,59, 39,96,255,92,122,120,99,118,98,110,109,44,46,47,255,42,255,32,255,27,33,64,35,36,37,94,38,42,40,41,95,43,8,0,81,87,69,82, 84,89,85,73,79,80,123,125,13,255,65,83,68,70,71,72,74,75,76,58,34,126,255,124,90,88,67,86,66,78,77,60,62,63,255,0,255,32, 255,84,85,86,87,88,89,90,91,92,93,104,105,106,107,108,109,110,111,112,113,55,56,57,45,52,53,54,43,49,50,51,48,46,71,72,73, 255,75,255,77,255,79,80,81,82,83,255,255,255,255,251,80,83,81,82,86,87,30,6,252,232,170,21,228,96,80,228,97,138,224,12,128, 230,97,134,224,230,97,88,138,224,60,255,117,3,233,122,2,36,127,14,7,191,126,232,185,8,0,242,174,138,196,116,3,233,133,0,129, 239,127,232,46,138,165,134,232,168,128,117,81,128,252,16,115,7,8,38,23,0,233,128,0,246,6,23,0,4,117,101,60,82,117,34,246, 6,23,0,8,117,90,246,6,23,0,32,117,13,246,6,23,0,3,116,13,184,48,82,233,214,1,246,6,23,0,3,116,243,132,38,24,0,117,77,8,38, 24,0,48,38,23,0,60,82,117,65,184,0,82,233,183,1,128,252,16,115,26,246,212,32,38,23,0,60,184,117,44,160,25,0,180,0,136,38, 25,0,60,0,116,31,233,161,1,246,212,32,38,24,0,235,20,60,128,115,16,246,6,24,0,8,116,23,60,69,116,5,128,38,24,0,247,250,176, 32,230,32,7,31,95,94,90,89,91,88,207,246,6,23,0,8,117,3,233,145,0,246,6,23,0,4,116,51,60,83,117,47,199,6,114,0,52,18,234, 91,224,0,240,82,79,80,81,75,76,77,71,72,73,16,17,18,19,20,21,22,23,24,25,30,31,32,33,34,35,36,37,38,44,45,46,47,48,49,50, 60,57,117,5,176,32,233,33,1,191,135,234,185,10,0,242,174,117,18,129,239,136,234,160,25,0,180,10,246,228,3,199,162,25,0,235, 137,198,6,25,0,0,185,26,0,242,174,117,5,176,0,233,244,0,60,2,114,12,60,14,115,8,128,196,118,176,0,233,228,0,60,59,115,3,233, 97,255,60,71,115,249,187,95,233,233,27,1,246,6,23,0,4,116,88,60,70,117,24,139,30,128,0,137,30,26,0,137,30,28,0,198,6,113, 0,128,205,27,43,192,233,176,0,60,69,117,33,128,14,24,0,8,176,32,230,32,128,62,73,0,7,116,7,186,216,3,160,101,0,238,246,6, 24,0,8,117,249,233,20,255,60,55,117,6,184,0,114,233,129,0,187,142,232,60,59,114,118,187,200,232,233,188,0,60,71,115,44,246, 6,23,0,3,116,90,60,15,117,5,184,0,15,235,96,60,55,117,9,176,32,230,32,205,5,233,220,254,60,59,114,6,187,85,233,233,145,0, 187,27,233,235,64,246,6,23,0,32,117,32,246,6,23,0,3,117,32,60,74,116,11,60,78,116,12,44,71,187,118,233,235,113,184,45,74, 235,34,184,43,78,235,29,246,6,23,0,3,117,224,44,70,187,105,233,235,11,60,59,114,4,176,0,235,7,187,225,232,254,200,46,215, 60,255,116,31,128,252,255,116,26,246,6,23,0,64,116,32,246,6,23,0,3,116,15,60,65,114,21,60,90,119,17,4,32,235,13,233,94,254, 60,97,114,6,60,122,119,2,44,32,139,30,28,0,139,243,232,99,252,59,30,26,0,116,19,137,4,137,30,28,0,233,60,254,44,59,46,215, 138,224,176,0,235,174,176,32,230,32,187,128,0,228,97,80,36,252,230,97,185,72,0,226,254,12,2,230,97,185,72,0,226,254,75,117, 235,88,230,97,233,18,254,185,0,32,50,192,2,7,67,226,251,10,192,195,251,83,81,30,86,87,85,82,139,236,232,216,18,232,28,0,187, 4,0,232,253,1,136,38,64,0,138,38,65,0,128,252,1,245,90,93,95,94,31,89,91,202,2,0,138,240,128,38,63,0,127,10,228,116,39,254, 204,116,115,198,6,65,0,0,128,250,4,115,19,254,204,116,105,254,204,117,3,233,149,0,254,204,116,103,254,204,116,103,198,6,65, 0,1,195,186,242,3,250,160,63,0,177,4,210,224,168,32,117,12,168,64,117,6,168,128,116,6,254,192,254,192,254,192,12,8,238,198, 6,62,0,0,198,6,65,0,0,12,4,238,251,232,42,2,160,66,0,60,192,116,6,128,14,65,0,32,195,180,3,232,71,1,187,1,0,232,108,1,187, 3,0,232,102,1,195,160,65,0,195,176,70,232,184,1,180,230,235,54,176,66,235,245,128,14,63,0,128,176,74,232,166,1,180,77,235, 36,187,7,0,232,64,1,187,9,0,232,58,1,187,15,0,232,52,1,187,17,0,233,171,0,128,14,63,0,128,176,74,232,128,1,180,197,115,8, 198,6,65,0,9,176,0,195,80,81,138,202,176,1,210,224,250,198,6,64,0,255,132,6,63,0,117,49,128,38,63,0,240,8,6,63,0,251,176, 16,210,224,10,194,12,12,82,186,242,3,238,90,246,6,63,0,128,116,18,187,20,0,232,223,0,10,228,116,8,43,201,226,254,254,204, 235,246,251,89,232,223,0,88,138,252,182,0,114,75,190,240,237,144,86,232,148,0,138,102,1,208,228,208,228,128,228,4,10,226, 232,133,0,128,255,77,117,3,233,98,255,138,229,232,120,0,138,102,1,232,114,0,138,225,232,109,0,187,7,0,232,146,0,187,9,0,232, 140,0,187,11,0,232,134,0,187,13,0,232,128,0,94,232,67,1,114,69,232,116,1,114,63,252,190,66,0,172,36,192,116,59,60,64,117, 41,172,208,224,180,4,114,36,208,224,208,224,180,16,114,28,208,224,180,8,114,22,208,224,208,224,180,4,114,14,208,224,180,3, 114,8,208,224,180,2,114,2,180,32,8,38,65,0,232,120,1,195,232,47,1,195,232,112,1,50,228,195,82,81,186,244,3,51,201,236,168, 64,116,12,226,249,128,14,65,0,128,89,90,88,249,195,51,201,236,168,128,117,4,226,249,235,235,138,196,178,245,238,89,90,195, 30,43,192,142,216,197,54,120,0,209,235,138,32,31,114,197,195,176,1,81,138,202,210,192,89,132,6,62,0,117,19,8,6,62,0,180,7, 232,173,255,138,226,232,168,255,232,118,0,114,41,180,15,232,158,255,138,226,232,153,255,138,229,232,148,255,232,98,0,156, 187,18,0,232,181,255,81,185,38,2,10,228,116,6,226,254,254,204,235,243,89,157,195,81,250,230,12,80,88,230,11,140,192,177,4, 211,192,138,232,36,240,3,195,115,2,254,197,80,230,4,138,196,230,4,138,197,36,15,230,129,138,230,42,192,209,232,80,187,6,0, 232,114,255,138,204,88,211,224,72,80,230,5,138,196,230,5,251,89,88,3,193,89,176,2,230,10,195,232,30,0,114,20,180,8,232,37, 255,232,74,0,114,10,160,66,0,36,96,60,96,116,2,248,195,128,14,65,0,64,249,195,251,83,81,179,2,51,201,246,6,62,0,128,117,12, 226,247,254,203,117,243,128,14,65,0,128,249,156,128,38,62,0,127,157,89,91,195,251,30,80,232,225,15,128,14,62,0,128,176,32, 230,32,88,31,207,252,191,66,0,81,82,83,179,7,51,201,186,244,3,236,168,128,117,12,226,249,128,14,65,0,128,249,91,90,89,195, 236,168,64,117,7,128,14,65,0,32,235,239,66,236,136,5,71,185,10,0,226,254,74,236,168,16,116,6,254,203,117,202,235,227,91,90, 89,195,160,69,0,58,197,160,71,0,116,10,187,8,0,232,174,254,138,196,254,192,42,193,195,255,255,207,2,37,2,8,42,255,80,246, 25,4,251,30,82,86,81,83,232,99,15,139,242,138,92,120,209,230,139,84,8,11,210,116,12,10,228,116,14,254,204,116,63,254,204, 116,40,91,89,94,90,31,207,80,238,66,43,201,236,138,224,168,128,117,14,226,247,254,203,117,241,128,204,1,128,228,249,235,19, 176,13,66,238,176,12,238,88,80,139,84,8,66,236,138,224,128,228,248,90,138,194,128,244,72,235,197,80,66,66,176,8,238,184,232, 3,72,117,253,176,12,238,235,221,98,225,255,255,252,240,205,241,238,241,57,242,156,247,23,242,150,242,56,243,116,243,185,243, 236,243,78,242,47,244,30,244,24,247,116,242,251,252,6,30,82,81,83,86,87,80,138,196,50,228,209,224,139,240,61,32,0,114,4,88, 233,69,1,232,187,14,184,0,184,139,62,16,0,129,231,48,0,131,255,48,117,2,180,176,142,192,88,138,38,73,0,46,255,164,69,240, 255,255,255,56,40,45,10,31,6,25,28,2,7,6,7,0,0,0,0,113,80,90,10,31,6,25,28,2,7,6,7,0,0,0,0,56,40,45,10,127,6,100,112,2,1, 6,7,0,0,0,0,97,80,82,15,25,6,25,25,2,13,11,12,0,0,0,0,0,8,0,16,0,64,0,64,40,40,80,80,40,40,80,80,44,40,45,41,42,46,30,41, 186,212,3,179,0,131,255,48,117,6,176,7,178,180,254,195,138,224,162,73,0,137,22,99,0,30,80,82,131,194,4,138,195,238,90,43, 192,142,216,197,30,116,0,88,185,16,0,128,252,2,114,16,3,217,128,252,4,114,9,3,217,128,252,7,114,2,3,217,80,50,228,138,196, 238,66,254,196,138,7,238,67,74,226,243,88,31,51,255,137,62,78,0,198,6,98,0,0,185,0,32,128,252,4,114,11,128,252,7,116,4,51, 192,235,5,181,8,184,32,7,243,171,199,6,96,0,7,6,160,73,0,50,228,139,240,139,22,99,0,131,194,4,46,138,132,244,240,238,162, 101,0,46,138,132,236,240,50,228,163,74,0,129,230,14,0,46,139,140,228,240,137,14,76,0,185,8,0,191,80,0,30,7,51,192,243,171, 66,176,48,128,62,73,0,6,117,2,176,63,238,162,102,0,95,94,91,89,90,31,7,207,180,10,137,14,96,0,232,2,0,235,237,139,22,99,0, 138,196,238,66,138,197,238,74,138,196,254,192,238,66,138,193,238,195,138,207,50,237,209,225,139,241,137,84,80,56,62,98,0, 117,5,139,194,232,2,0,235,191,232,124,0,139,200,3,14,78,0,209,249,180,14,232,194,255,195,162,98,0,139,14,76,0,152,80,247, 225,163,78,0,139,200,209,249,180,12,232,170,255,91,209,227,139,71,80,232,207,255,235,140,138,223,50,255,209,227,139,87,80, 139,14,96,0,95,94,91,88,88,31,7,207,139,22,99,0,131,194,5,160,102,0,10,255,117,14,36,224,128,227,31,10,195,238,162,102,0, 233,91,255,36,223,208,235,115,243,12,32,235,239,138,38,74,0,160,73,0,138,62,98,0,95,94,89,233,67,255,83,139,216,138,196,246, 38,74,0,50,255,3,195,209,224,91,195,138,216,128,252,4,114,8,128,252,7,116,3,233,240,1,83,139,193,232,55,0,116,49,3,240,138, 230,42,227,232,114,0,3,245,3,253,254,204,117,245,88,176,32,232,109,0,3,253,254,203,117,247,232,113,12,128,62,73,0,7,116,7, 160,101,0,186,216,3,238,233,231,254,138,222,235,220,128,62,73,0,2,114,24,128,62,73,0,3,119,17,82,186,218,3,80,236,168,8,116, 251,176,37,178,216,238,88,90,232,129,255,3,6,78,0,139,248,139,240,43,209,254,198,254,194,50,237,139,46,74,0,3,237,138,195, 246,38,74,0,3,192,6,31,128,251,0,195,138,202,86,87,243,165,95,94,195,138,202,87,243,171,95,195,253,138,216,128,252,4,114, 8,128,252,7,116,3,233,166,1,83,139,194,232,148,255,116,32,43,240,138,230,42,227,232,207,255,43,245,43,253,254,204,117,245, 88,176,32,232,202,255,43,253,254,203,117,247,233,90,255,138,222,235,237,128,252,4,114,8,128,252,7,116,3,233,168,2,232,26, 0,139,243,139,22,99,0,131,194,6,6,31,236,168,1,117,251,250,236,168,1,116,251,173,233,39,254,138,207,50,237,139,241,209,230, 139,68,80,51,219,227,6,3,30,76,0,226,250,232,207,254,3,216,195,128,252,4,114,8,128,252,7,116,3,233,178,1,138,227,80,81,232, 209,255,139,251,89,91,139,22,99,0,131,194,6,236,168,1,117,251,250,236,168,1,116,251,139,195,171,251,226,232,233,217,253,128, 252,4,114,8,128,252,7,116,3,233,127,1,80,81,232,160,255,139,251,89,91,139,22,99,0,131,194,6,236,168,1,117,251,250,236,168, 1,116,251,138,195,170,251,71,226,231,233,167,253,232,49,0,38,138,4,34,196,210,224,138,206,210,192,233,150,253,80,80,232,30, 0,210,232,34,196,38,138,12,91,246,195,128,117,13,246,212,34,204,10,193,38,136,4,88,233,119,253,50,193,235,245,83,80,176,40, 82,128,226,254,246,226,90,246,194,1,116,3,5,0,32,139,240,88,139,209,187,192,2,185,2,3,128,62,73,0,6,114,6,187,128,1,185,3, 7,34,234,211,234,3,242,138,247,42,201,208,200,2,205,254,207,117,248,138,227,210,236,91,195,138,216,139,193,232,105,2,139, 248,43,209,129,194,1,1,208,230,208,230,128,62,73,0,6,115,4,208,226,209,231,6,31,42,237,208,227,208,227,116,45,138,195,180, 80,246,228,139,247,3,240,138,230,42,227,232,128,0,129,238,176,31,129,239,176,31,254,204,117,241,138,199,232,136,0,129,239, 176,31,254,203,117,245,233,219,252,138,222,235,236,253,138,216,139,194,232,15,2,139,248,43,209,129,194,1,1,208,230,208,230, 128,62,73,0,6,115,5,208,226,209,231,71,6,31,42,237,129,199,240,0,208,227,208,227,116,46,138,195,180,80,246,228,139,247,43, 240,138,230,42,227,232,33,0,129,238,80,32,129,239,80,32,254,204,117,241,138,199,232,41,0,129,239,80,32,254,203,117,245,252, 233,123,252,138,222,235,235,138,202,86,87,243,164,95,94,129,198,0,32,129,199,0,32,86,87,138,202,243,164,95,94,195,138,202, 87,243,170,95,129,199,0,32,87,138,202,243,170,95,195,180,0,80,232,132,1,139,248,88,60,128,115,6,190,110,250,14,235,15,44, 128,30,43,246,142,222,197,54,124,0,140,218,31,82,209,224,209,224,209,224,3,240,128,62,73,0,6,31,114,44,87,86,182,4,172,246, 195,128,117,22,170,172,38,136,133,255,31,131,199,79,254,206,117,236,94,95,71,226,227,233,251,251,38,50,5,170,172,38,50,133, 255,31,235,224,138,211,209,231,232,209,0,87,86,182,4,172,232,222,0,35,195,246,194,128,116,7,38,50,37,38,50,69,1,38,136,37, 38,136,69,1,172,232,197,0,35,195,246,194,128,116,10,38,50,165,0,32,38,50,133,1,32,38,136,165,0,32,38,136,133,1,32,131,199, 80,254,206,117,193,94,95,71,71,226,183,233,156,251,232,214,0,139,240,131,236,8,139,236,128,62,73,0,6,6,31,114,26,182,4,138, 4,136,70,0,69,138,132,0,32,136,70,0,69,131,198,80,254,206,117,235,235,23,144,209,230,182,4,232,136,0,129,198,0,32,232,129, 0,129,238,176,31,254,206,117,238,191,110,250,144,14,7,131,237,8,139,245,252,176,0,22,31,186,128,0,86,87,185,8,0,243,166,95, 94,116,30,254,192,131,199,8,74,117,237,60,0,116,18,43,192,142,216,196,62,124,0,140,192,11,199,116,4,176,128,235,210,131,196, 8,233,23,251,128,227,3,138,195,81,185,3,0,208,224,208,224,10,216,226,248,138,251,89,195,82,81,83,43,210,185,1,0,139,216,35, 217,11,211,209,224,209,225,139,216,35,217,11,211,209,225,115,236,139,194,91,89,90,195,138,36,138,68,1,185,0,192,178,0,133, 193,248,116,1,249,208,210,209,233,209,233,115,242,136,86,0,69,195,161,80,0,83,139,216,138,196,246,38,74,0,209,224,209,224, 42,255,3,195,91,195,80,80,180,3,138,62,98,0,205,16,88,60,8,116,82,60,13,116,87,60,10,116,87,60,7,116,90,180,10,185,1,0,205, 16,254,194,58,22,74,0,117,51,178,0,128,254,24,117,42,180,2,205,16,160,73,0,60,4,114,6,60,7,183,0,117,6,180,8,205,16,138,252, 184,1,6,43,201,182,24,138,22,74,0,254,202,205,16,88,233,82,250,254,198,180,2,235,244,128,250,0,116,247,254,202,235,243,178, 0,235,239,128,254,24,117,232,235,188,179,2,232,113,238,235,219,3,3,5,5,3,3,3,4,180,0,139,22,99,0,131,194,6,236,168,4,117, 126,168,2,117,3,233,129,0,180,16,139,22,99,0,138,196,238,66,236,138,232,74,254,196,138,196,238,66,236,138,229,138,30,73,0, 42,255,46,138,159,148,247,43,195,139,30,78,0,209,235,43,195,121,2,43,192,177,3,128,62,73,0,4,114,42,128,62,73,0,7,116,35, 178,40,246,242,138,232,2,237,138,220,42,255,128,62,73,0,6,117,4,177,4,208,228,211,227,138,212,138,240,208,238,208,238,235, 18,246,54,74,0,138,240,138,212,210,224,138,232,138,220,50,255,211,227,180,1,82,139,22,99,0,131,194,7,238,90,95,94,31,31,31, 31,7,207,255,255,255,255,255,255,255,251,30,232,248,6,161,19,0,31,207,255,255,251,30,232,236,6,161,16,0,31,207,255,255,251, 30,232,224,6,128,38,113,0,127,232,4,0,31,202,2,0,10,228,116,19,254,204,116,24,254,204,116,26,254,204,117,3,233,36,1,180,128, 249,195,228,97,36,247,230,97,42,228,195,228,97,12,8,235,245,83,81,86,190,7,0,232,191,1,228,98,36,16,162,107,0,186,122,63, 246,6,113,0,128,117,3,74,117,3,233,132,0,232,198,0,227,238,186,120,3,185,0,2,228,33,12,1,230,33,246,6,113,0,128,117,108,81, 232,173,0,11,201,89,116,200,59,211,227,4,115,194,226,232,114,230,232,155,0,232,106,0,60,22,117,73,94,89,91,81,199,6,105,0, 255,255,186,0,1,246,6,113,0,128,117,35,232,79,0,114,30,227,5,38,136,7,67,73,74,127,234,232,64,0,232,61,0,42,228,129,62,105, 0,15,29,117,6,227,6,235,205,180,1,254,196,90,43,209,80,246,196,144,117,19,232,31,0,235,14,78,116,3,233,101,255,94,89,91,43, 210,180,4,80,228,33,36,254,230,33,232,69,255,88,128,252,1,245,195,83,81,177,8,81,232,38,0,227,32,83,232,32,0,88,227,25,3, 216,129,251,240,6,245,159,89,208,213,158,232,217,0,254,201,117,224,138,197,248,89,91,195,89,249,235,249,185,100,0,138,38, 107,0,228,98,36,16,58,196,225,248,162,107,0,176,0,230,67,139,30,103,0,228,64,138,224,228,64,134,196,43,216,163,103,0,195, 83,81,228,97,36,253,12,1,230,97,176,182,230,67,232,166,0,184,160,4,232,133,0,185,0,8,249,232,104,0,226,250,248,232,98,0,89, 91,176,22,232,68,0,199,6,105,0,255,255,186,0,1,38,138,7,232,53,0,227,2,67,73,74,127,243,161,105,0,247,208,80,134,224,232, 35,0,88,232,31,0,11,201,117,215,81,185,32,0,249,232,42,0,226,250,89,176,176,230,67,184,1,0,232,51,0,232,125,254,43,192,195, 81,80,138,232,177,8,208,213,156,232,11,0,157,232,36,0,254,201,117,242,88,89,195,184,160,4,114,3,184,80,2,80,228,98,36,32, 116,250,228,98,36,32,117,250,88,230,66,138,196,230,66,195,161,105,0,209,216,209,208,248,113,4,53,16,8,249,209,208,163,105, 0,195,232,38,254,179,66,185,0,7,226,254,254,203,117,247,195,32,50,48,49,13,10,255,0,0,0,0,0,0,0,0,126,129,165,129,189,153, 129,126,126,255,219,255,195,231,255,126,108,254,254,254,124,56,16,0,16,56,124,254,124,56,16,0,56,124,56,254,254,124,56,124, 16,16,56,124,254,124,56,124,0,0,24,60,60,24,0,0,255,255,231,195,195,231,255,255,0,60,102,66,66,102,60,0,255,195,153,189,189, 153,195,255,15,7,15,125,204,204,204,120,60,102,102,102,60,24,126,24,63,51,63,48,48,112,240,224,127,99,127,99,99,103,230,192, 153,90,60,231,231,60,90,153,128,224,248,254,248,224,128,0,2,14,62,254,62,14,2,0,24,60,126,24,24,126,60,24,102,102,102,102, 102,0,102,0,127,219,219,123,27,27,27,0,62,99,56,108,108,56,204,120,0,0,0,0,126,126,126,0,24,60,126,24,126,60,24,255,24,60, 126,24,24,24,24,0,24,24,24,24,126,60,24,0,0,24,12,254,12,24,0,0,0,48,96,254,96,48,0,0,0,0,192,192,192,254,0,0,0,36,102,255, 102,36,0,0,0,24,60,126,255,255,0,0,0,255,255,126,60,24,0,0,0,0,0,0,0,0,0,0,48,120,120,48,48,0,48,0,108,108,108,0,0,0,0,0, 108,108,254,108,254,108,108,0,48,124,192,120,12,248,48,0,0,198,204,24,48,102,198,0,56,108,56,118,220,204,118,0,96,96,192, 0,0,0,0,0,24,48,96,96,96,48,24,0,96,48,24,24,24,48,96,0,0,102,60,255,60,102,0,0,0,48,48,252,48,48,0,0,0,0,0,0,0,48,48,96, 0,0,0,252,0,0,0,0,0,0,0,0,0,48,48,0,6,12,24,48,96,192,128,0,124,198,206,222,246,230,124,0,48,112,48,48,48,48,252,0,120,204, 12,56,96,204,252,0,120,204,12,56,12,204,120,0,28,60,108,204,254,12,30,0,252,192,248,12,12,204,120,0,56,96,192,248,204,204, 120,0,252,204,12,24,48,48,48,0,120,204,204,120,204,204,120,0,120,204,204,124,12,24,112,0,0,48,48,0,0,48,48,0,0,48,48,0,0, 48,48,96,24,48,96,192,96,48,24,0,0,0,252,0,0,252,0,0,96,48,24,12,24,48,96,0,120,204,12,24,48,0,48,0,124,198,222,222,222,192, 120,0,48,120,204,204,252,204,204,0,252,102,102,124,102,102,252,0,60,102,192,192,192,102,60,0,248,108,102,102,102,108,248, 0,254,98,104,120,104,98,254,0,254,98,104,120,104,96,240,0,60,102,192,192,206,102,62,0,204,204,204,252,204,204,204,0,120,48, 48,48,48,48,120,0,30,12,12,12,204,204,120,0,230,102,108,120,108,102,230,0,240,96,96,96,98,102,254,0,198,238,254,254,214,198, 198,0,198,230,246,222,206,198,198,0,56,108,198,198,198,108,56,0,252,102,102,124,96,96,240,0,120,204,204,204,220,120,28,0, 252,102,102,124,108,102,230,0,120,204,224,112,28,204,120,0,252,180,48,48,48,48,120,0,204,204,204,204,204,204,252,0,204,204, 204,204,204,120,48,0,198,198,198,214,254,238,198,0,198,198,108,56,56,108,198,0,204,204,204,120,48,48,120,0,254,198,140,24, 50,102,254,0,120,96,96,96,96,96,120,0,192,96,48,24,12,6,2,0,120,24,24,24,24,24,120,0,16,56,108,198,0,0,0,0,0,0,0,0,0,0,0, 255,48,48,24,0,0,0,0,0,0,0,120,12,124,204,118,0,224,96,96,124,102,102,220,0,0,0,120,204,192,204,120,0,28,12,12,124,204,204, 118,0,0,0,120,204,252,192,120,0,56,108,96,240,96,96,240,0,0,0,118,204,204,124,12,248,224,96,108,118,102,102,230,0,48,0,112, 48,48,48,120,0,12,0,12,12,12,204,204,120,224,96,102,108,120,108,230,0,112,48,48,48,48,48,120,0,0,0,204,254,254,214,198,0, 0,0,248,204,204,204,204,0,0,0,120,204,204,204,120,0,0,0,220,102,102,124,96,240,0,0,118,204,204,124,12,30,0,0,220,118,102, 96,240,0,0,0,124,192,120,12,248,0,16,48,124,48,48,52,24,0,0,0,204,204,204,204,118,0,0,0,204,204,204,120,48,0,0,0,198,214, 254,254,108,0,0,0,198,108,56,108,198,0,0,0,204,204,204,124,12,248,0,0,252,152,48,100,252,0,28,48,48,224,48,48,28,0,24,24, 24,0,24,24,24,0,224,48,48,28,48,48,224,0,118,220,0,0,0,0,0,0,0,16,56,108,198,198,254,0,251,30,232,203,0,10,228,116,7,254, 204,116,22,251,31,207,250,160,112,0,198,6,112,0,0,139,14,110,0,139,22,108,0,235,234,250,137,22,108,0,137,14,110,0,198,6,112, 0,0,235,218,255,255,255,255,251,30,80,82,232,146,0,255,6,108,0,117,4,255,6,110,0,131,62,110,0,24,117,21,129,62,108,0,176, 0,117,13,43,192,163,110,0,163,108,0,198,6,112,0,1,254,14,64,0,117,11,128,38,63,0,240,176,12,186,242,3,238,205,28,176,32,230, 32,90,88,31,207,49,56,48,49,13,10,165,254,135,233,221,230,221,230,221,230,221,230,87,239,221,230,101,240,77,248,65,248,89, 236,57,231,89,248,46,232,210,239,0,0,242,230,110,254,83,255,83,255,164,240,199,239,0,0,80,65,82,73,84,89,32,67,72,69,67,75, 32,49,13,10,32,51,48,49,13,10,49,51,49,13,10,80,184,64,0,142,216,88,195,255,180,1,80,176,255,230,33,176,32,230,32,88,207, 251,30,80,83,81,82,184,80,0,142,216,128,62,0,0,1,116,95,198,6,0,0,1,180,15,205,16,138,204,181,25,232,85,0,81,180,3,205,16, 89,82,51,210,180,2,205,16,180,8,205,16,10,192,117,2,176,32,82,51,210,50,228,205,23,90,246,196,37,117,33,254,194,58,202,117, 223,50,210,138,226,82,232,35,0,90,254,198,58,238,117,208,90,180,2,205,16,198,6,0,0,0,235,10,90,180,2,205,16,198,6,0,0,255, 90,89,91,88,31,207,51,210,50,228,176,10,205,23,50,228,176,13,205,23,195,80,65,82,73,84,89,32,67,72,69,67,75,32,50,13,10,54, 48,49,13,10,255,234,91,224,0,240,49,48,47,50,55,47,56,50,255,255,120]
[49,53,48,49,53,49,50,32,67,79,80,82,46,32,73,66,77,32,49,57,56,49,215,224,126,225,32,75,66,32,79,75,13,232,19,26,138,251, 232,14,26,138,235,138,207,252,250,191,0,5,176,253,230,33,176,10,230,32,186,97,0,187,204,76,180,2,138,195,238,138,199,238, 74,228,32,34,196,116,250,236,170,66,226,238,234,0,5,0,0,255,255,250,180,213,158,115,76,117,74,123,72,121,70,159,177,5,210, 236,115,63,176,64,208,224,113,57,50,228,158,118,52,120,50,122,48,159,177,5,210,236,114,41,208,228,112,37,184,255,255,249, 142,216,140,219,142,195,140,193,142,209,140,210,139,226,139,236,139,245,139,254,115,7,51,199,117,7,248,235,227,11,199,116, 1,244,230,160,230,131,186,216,3,238,254,192,178,184,238,176,137,230,99,176,165,230,97,176,1,230,96,140,200,142,208,142,216, 252,187,0,224,188,22,224,233,27,24,117,212,176,2,230,96,176,4,230,8,176,84,230,67,138,193,230,65,176,64,230,67,128,251,255, 116,7,228,65,10,216,226,241,244,138,195,43,201,230,65,176,64,230,67,144,144,228,65,34,216,116,3,226,242,244,176,3,230,96, 230,13,176,255,138,216,138,248,185,8,0,186,0,0,238,80,238,176,1,236,138,224,236,59,216,116,1,244,66,226,239,254,192,116,225, 142,219,142,195,176,255,230,1,80,230,1,176,88,230,11,176,0,138,232,230,8,80,230,10,176,18,230,65,176,65,230,11,80,228,8,36, 16,116,1,244,176,66,230,11,176,67,230,11,186,19,2,176,1,238,139,30,114,4,185,0,32,129,251,52,18,116,22,188,24,224,233,241, 4,116,18,138,216,176,4,230,96,43,201,226,254,134,216,235,246,43,192,243,171,137,30,114,4,186,0,4,187,16,0,142,194,43,255, 184,85,170,139,200,38,137,5,176,15,38,139,5,51,193,117,17,185,0,32,243,171,129,194,0,4,131,195,16,128,254,160,117,218,137, 30,19,4,184,48,0,142,208,188,0,1,176,19,230,32,176,8,230,33,176,9,230,33,176,255,230,33,30,185,32,0,43,255,142,199,184,35, 255,171,140,200,171,226,247,191,64,0,14,31,140,216,190,3,255,144,185,16,0,165,71,71,226,251,31,30,228,98,36,15,138,224,176, 173,230,97,144,228,98,177,4,210,192,36,240,10,196,42,228,163,16,4,176,153,230,99,232,5,24,128,251,170,116,24,128,251,101, 117,3,233,239,253,176,56,230,97,144,144,228,96,36,255,117,4,254,6,18,4,161,16,4,80,176,48,163,16,4,42,228,205,16,176,32,163, 16,4,42,228,205,16,88,163,16,4,36,48,117,10,191,64,0,199,5,75,255,233,160,0,60,48,116,8,254,196,60,32,117,2,180,3,134,224, 80,42,228,205,16,88,80,187,0,176,186,184,3,185,0,8,176,1,128,252,48,116,9,183,184,186,216,3,181,32,254,200,238,129,62,114, 4,52,18,142,195,116,7,142,219,232,199,3,117,70,88,80,180,0,205,16,184,32,112,235,17,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,233,153,21,43,255,185,40,0,243,171,88,80,128,252,48,186,186,3,116,3,186,218,3,180,8,43,201,236,34,196,117, 4,226,249,235,9,43,201,236,34,196,116,17,226,249,31,30,198,6,21,0,6,186,2,1,232,219,22,235,6,177,3,210,236,117,215,88,180, 0,205,16,186,0,192,142,218,43,219,139,7,83,91,61,85,170,117,5,232,54,22,235,4,129,194,128,0,129,250,0,200,124,228,31,198, 6,21,4,5,176,0,230,33,228,33,10,192,117,27,176,255,230,33,228,33,4,1,117,17,162,107,4,251,43,201,226,254,226,254,128,62,107, 4,0,116,9,190,255,248,144,232,78,22,250,244,198,6,21,4,2,176,254,230,33,176,16,230,67,185,22,0,138,193,230,64,246,6,107,4, 1,117,4,226,247,235,216,177,12,176,255,230,64,198,6,107,4,0,176,254,230,33,246,6,107,4,1,117,194,226,247,176,255,230,33,176, 54,230,67,176,0,230,64,230,64,176,153,230,99,160,16,4,36,1,116,49,128,62,18,4,1,116,42,232,115,22,227,30,176,73,230,97,128, 251,170,117,21,176,200,230,97,176,72,230,97,43,201,226,254,228,96,60,0,116,10,232,180,21,190,76,236,144,232,203,21,30,43, 192,142,192,185,8,0,14,31,190,243,254,144,191,32,0,165,71,71,226,251,31,199,6,8,0,95,248,199,6,20,0,84,255,199,6,98,0,0,246, 128,62,18,4,1,117,10,199,6,112,0,60,249,176,254,230,33,186,16,2,184,85,85,238,176,1,236,58,196,117,68,247,208,238,176,1,236, 58,196,117,58,187,1,0,186,21,2,185,16,0,46,136,7,144,236,58,199,117,33,66,236,58,195,117,27,74,209,227,226,236,185,8,0,176, 1,74,138,224,238,176,1,236,58,196,117,6,208,224,226,242,235,7,190,15,249,144,232,63,21,232,236,21,30,129,62,114,0,52,18,117, 3,233,159,0,184,16,0,235,40,139,30,19,0,131,235,16,177,4,211,235,139,203,187,0,4,142,219,142,195,129,195,0,4,82,81,83,80, 185,0,32,232,207,1,117,76,88,5,16,0,80,187,10,0,185,3,0,51,210,247,243,128,202,48,82,226,246,185,3,0,88,232,222,20,226,250, 185,7,0,190,26,224,46,138,4,70,232,207,20,226,247,88,61,16,0,116,169,91,89,90,226,180,176,10,232,189,20,228,8,36,1,117,51, 31,198,6,21,0,3,233,102,254,138,232,176,13,232,167,20,176,10,232,162,20,88,131,196,6,140,218,31,30,163,19,0,136,54,21,0,232, 206,26,138,197,232,122,20,190,4,249,144,232,145,20,186,0,200,142,218,43,219,139,7,83,91,61,85,170,117,6,232,40,20,235,5,144, 129,194,128,0,129,250,0,246,124,227,235,1,144,180,4,43,219,142,218,232,174,19,116,3,232,130,1,129,194,0,2,254,204,117,236, 31,160,16,0,36,1,116,62,228,33,36,191,230,33,180,0,138,212,205,19,246,196,255,117,32,186,242,3,176,28,238,43,201,226,254, 226,254,51,210,181,1,136,22,62,0,232,252,8,114,7,181,34,232,245,8,115,7,190,82,236,144,232,24,20,176,12,186,242,3,238,198, 6,107,0,0,190,30,0,137,54,26,0,137,54,28,0,137,54,128,0,131,198,32,137,54,130,0,191,120,0,30,7,184,20,20,171,171,184,1,1, 171,171,228,33,36,252,230,33,131,253,0,116,25,186,2,0,232,6,20,190,9,232,144,232,241,19,180,0,205,22,128,252,59,117,247,235, 14,144,128,62,18,0,1,116,6,186,1,0,232,230,19,160,16,0,36,1,117,3,233,95,250,42,228,160,73,0,205,16,189,163,249,144,190,0, 0,46,139,86,0,176,170,238,30,236,31,60,170,117,5,137,84,8,70,70,69,69,129,253,169,249,117,229,187,0,0,186,250,3,236,168,248, 117,6,199,7,248,3,67,67,186,250,2,236,168,248,117,6,199,7,248,2,67,67,139,198,177,3,210,200,10,195,162,17,0,186,1,2,236,144, 144,144,168,15,117,5,128,14,17,0,16,228,97,12,48,230,97,36,207,230,97,176,128,230,160,205,25,252,43,255,43,192,136,5,138, 5,50,196,117,77,254,196,138,196,117,242,139,217,209,227,184,170,170,186,85,255,243,171,228,97,12,48,230,97,144,36,207,230, 97,79,253,139,247,139,203,172,50,196,117,37,138,194,170,226,246,34,228,116,22,138,224,134,242,34,228,117,4,138,212,235,224, 252,71,116,222,79,186,1,0,235,214,228,98,36,192,176,0,252,195,82,80,140,218,38,136,54,21,0,129,250,0,200,124,13,232,253,24, 190,10,249,144,232,197,18,88,90,195,186,2,1,232,235,18,235,245,255,255,255,251,43,192,142,216,199,6,120,0,199,239,140,14, 122,0,185,4,0,81,180,0,205,19,114,15,184,1,2,43,210,142,194,187,0,124,185,1,0,205,19,89,115,4,226,229,205,24,234,0,124,0, 0,255,255,255,23,4,0,3,128,1,192,0,96,0,48,0,24,0,12,0,251,30,82,86,87,81,83,139,242,139,250,209,230,232,16,19,139,20,11, 210,116,19,10,228,116,22,254,204,116,69,254,204,116,106,254,204,117,3,233,131,0,91,89,95,94,90,31,207,138,224,131,194,3,176, 128,238,138,212,177,4,210,194,129,226,14,0,191,41,231,3,250,139,20,66,46,138,69,1,238,74,46,138,5,238,131,194,3,138,196,36, 31,238,74,74,176,0,238,235,73,80,131,194,4,176,3,238,66,66,183,48,232,72,0,116,8,89,138,193,128,204,128,235,174,74,183,32, 232,56,0,117,240,131,234,5,89,138,193,238,235,157,131,194,4,176,1,238,66,66,183,32,232,32,0,117,219,74,183,1,232,24,0,117, 211,128,228,30,139,20,236,233,125,255,139,20,131,194,5,236,138,224,66,236,233,112,255,138,93,124,43,201,236,138,224,34,199, 58,199,116,8,226,245,254,203,117,239,10,255,195,69,82,82,79,82,46,32,40,82,69,83,85,77,69,32,61,32,34,70,49,34,32,75,69,89, 41,13,10,255,255,255,255,255,255,255,255,255,251,30,83,232,37,18,10,228,116,10,254,204,116,30,254,204,116,43,235,44,251,144, 250,139,30,26,0,59,30,28,0,116,243,139,7,232,29,0,137,30,26,0,235,20,250,139,30,26,0,59,30,28,0,139,7,251,91,31,202,2,0,160, 23,0,91,31,207,67,67,59,30,130,0,117,4,139,30,128,0,195,82,58,69,70,56,29,42,54,128,64,32,16,8,4,2,1,27,255,0,255,255,255, 30,255,255,255,255,31,255,127,255,17,23,5,18,20,25,21,9,15,16,27,29,10,255,1,19,4,6,7,8,10,11,12,255,255,255,255,28,26,24, 3,22,2,14,13,255,255,255,255,255,255,32,255,94,95,96,97,98,99,100,101,102,103,255,255,119,255,132,255,115,255,116,255,117, 255,118,255,255,27,49,50,51,52,53,54,55,56,57,48,45,61,8,9,113,119,101,114,116,121,117,105,111,112,91,93,13,255,97,115,100, 102,103,104,106,107,108,59,39,96,255,92,122,120,99,118,98,110,109,44,46,47,255,42,255,32,255,27,33,64,35,36,37,94,38,42,40, 41,95,43,8,0,81,87,69,82,84,89,85,73,79,80,123,125,13,255,65,83,68,70,71,72,74,75,76,58,34,126,255,124,90,88,67,86,66,78, 77,60,62,63,255,0,255,32,255,84,85,86,87,88,89,90,91,92,93,104,105,106,107,108,109,110,111,112,113,55,56,57,45,52,53,54,43, 49,50,51,48,46,71,72,73,255,75,255,77,255,79,80,81,82,83,255,255,255,255,251,80,83,81,82,86,87,30,6,252,232,197,16,228,96, 80,228,97,138,224,12,128,230,97,134,224,230,97,88,138,224,60,255,117,3,233,122,2,36,127,14,7,191,126,232,185,8,0,242,174, 138,196,116,3,233,133,0,129,239,127,232,46,138,165,134,232,168,128,117,81,128,252,16,115,7,8,38,23,0,233,128,0,246,6,23,0, 4,117,101,60,82,117,34,246,6,23,0,8,117,90,246,6,23,0,32,117,13,246,6,23,0,3,116,13,184,48,82,233,214,1,246,6,23,0,3,116, 243,132,38,24,0,117,77,8,38,24,0,48,38,23,0,60,82,117,65,184,0,82,233,183,1,128,252,16,115,26,246,212,32,38,23,0,60,184,117, 44,160,25,0,180,0,136,38,25,0,60,0,116,31,233,161,1,246,212,32,38,24,0,235,20,60,128,115,16,246,6,24,0,8,116,23,60,69,116, 5,128,38,24,0,247,250,176,32,230,32,7,31,95,94,90,89,91,88,207,246,6,23,0,8,117,3,233,145,0,246,6,23,0,4,116,51,60,83,117, 47,199,6,114,0,52,18,234,91,224,0,240,82,79,80,81,75,76,77,71,72,73,16,17,18,19,20,21,22,23,24,25,30,31,32,33,34,35,36,37, 38,44,45,46,47,48,49,50,60,57,117,5,176,32,233,33,1,191,135,234,185,10,0,242,174,117,18,129,239,136,234,160,25,0,180,10,246, 228,3,199,162,25,0,235,137,198,6,25,0,0,185,26,0,242,174,117,5,176,0,233,244,0,60,2,114,12,60,14,115,8,128,196,118,176,0, 233,228,0,60,59,115,3,233,97,255,60,71,115,249,187,95,233,233,27,1,246,6,23,0,4,116,88,60,70,117,24,139,30,128,0,137,30,26, 0,137,30,28,0,198,6,113,0,128,205,27,43,192,233,176,0,60,69,117,33,128,14,24,0,8,176,32,230,32,128,62,73,0,7,116,7,186,216, 3,160,101,0,238,246,6,24,0,8,117,249,233,20,255,60,55,117,6,184,0,114,233,129,0,187,142,232,60,59,114,118,187,200,232,233, 188,0,60,71,115,44,246,6,23,0,3,116,90,60,15,117,5,184,0,15,235,96,60,55,117,9,176,32,230,32,205,5,233,220,254,60,59,114, 6,187,85,233,233,145,0,187,27,233,235,64,246,6,23,0,32,117,32,246,6,23,0,3,117,32,60,74,116,11,60,78,116,12,44,71,187,118, 233,235,113,184,45,74,235,34,184,43,78,235,29,246,6,23,0,3,117,224,44,70,187,105,233,235,11,60,59,114,4,176,0,235,7,187,225, 232,254,200,46,215,60,255,116,31,128,252,255,116,26,246,6,23,0,64,116,32,246,6,23,0,3,116,15,60,65,114,21,60,90,119,17,4, 32,235,13,233,94,254,60,97,114,6,60,122,119,2,44,32,139,30,28,0,139,243,232,99,252,59,30,26,0,116,19,137,4,137,30,28,0,233, 60,254,44,59,46,215,138,224,176,0,235,174,176,32,230,32,187,128,0,228,97,80,36,252,230,97,185,72,0,226,254,12,2,230,97,185, 72,0,226,254,75,117,235,88,230,97,233,18,254,32,51,48,49,13,10,54,48,49,13,10,255,255,251,83,81,30,86,87,85,82,139,236,232, 243,13,232,28,0,187,4,0,232,253,1,136,38,64,0,138,38,65,0,128,252,1,245,90,93,95,94,31,89,91,202,2,0,138,240,128,38,63,0, 127,10,228,116,39,254,204,116,115,198,6,65,0,0,128,250,4,115,19,254,204,116,105,254,204,117,3,233,149,0,254,204,116,103,254, 204,116,103,198,6,65,0,1,195,186,242,3,250,160,63,0,177,4,210,224,168,32,117,12,168,64,117,6,168,128,116,6,254,192,254,192, 254,192,12,8,238,198,6,62,0,0,198,6,65,0,0,12,4,238,251,232,42,2,160,66,0,60,192,116,6,128,14,65,0,32,195,180,3,232,71,1, 187,1,0,232,108,1,187,3,0,232,102,1,195,160,65,0,195,176,70,232,184,1,180,230,235,54,176,66,235,245,128,14,63,0,128,176,74, 232,166,1,180,77,235,36,187,7,0,232,64,1,187,9,0,232,58,1,187,15,0,232,52,1,187,17,0,233,171,0,128,14,63,0,128,176,74,232, 128,1,180,197,115,8,198,6,65,0,9,176,0,195,80,81,138,202,176,1,210,224,250,198,6,64,0,255,132,6,63,0,117,49,128,38,63,0,240, 8,6,63,0,251,176,16,210,224,10,194,12,12,82,186,242,3,238,90,246,6,63,0,128,116,18,187,20,0,232,223,0,10,228,116,8,43,201, 226,254,254,204,235,246,251,89,232,223,0,88,138,252,182,0,114,75,190,240,237,144,86,232,148,0,138,102,1,208,228,208,228,128, 228,4,10,226,232,133,0,128,255,77,117,3,233,98,255,138,229,232,120,0,138,102,1,232,114,0,138,225,232,109,0,187,7,0,232,146, 0,187,9,0,232,140,0,187,11,0,232,134,0,187,13,0,232,128,0,94,232,67,1,114,69,232,116,1,114,63,252,190,66,0,172,36,192,116, 59,60,64,117,41,172,208,224,180,4,114,36,208,224,208,224,180,16,114,28,208,224,180,8,114,22,208,224,208,224,180,4,114,14, 208,224,180,3,114,8,208,224,180,2,114,2,180,32,8,38,65,0,232,120,1,195,232,47,1,195,232,112,1,50,228,195,82,81,186,244,3, 51,201,236,168,64,116,12,226,249,128,14,65,0,128,89,90,88,249,195,51,201,236,168,128,117,4,226,249,235,235,138,196,178,245, 238,89,90,195,30,43,192,142,216,197,54,120,0,209,235,138,32,31,114,197,195,176,1,81,138,202,210,192,89,132,6,62,0,117,19, 8,6,62,0,180,7,232,173,255,138,226,232,168,255,232,118,0,114,41,180,15,232,158,255,138,226,232,153,255,138,229,232,148,255, 232,98,0,156,187,18,0,232,181,255,81,185,38,2,10,228,116,6,226,254,254,204,235,243,89,157,195,81,250,230,12,80,88,230,11, 140,192,177,4,211,192,138,232,36,240,3,195,115,2,254,197,80,230,4,138,196,230,4,138,197,36,15,230,129,138,230,42,192,209, 232,80,187,6,0,232,114,255,138,204,88,211,224,72,80,230,5,138,196,230,5,251,89,88,3,193,89,176,2,230,10,195,232,30,0,114, 20,180,8,232,37,255,232,74,0,114,10,160,66,0,36,96,60,96,116,2,248,195,128,14,65,0,64,249,195,251,83,81,179,2,51,201,246, 6,62,0,128,117,12,226,247,254,203,117,243,128,14,65,0,128,249,156,128,38,62,0,127,157,89,91,195,251,30,80,232,252,10,128, 14,62,0,128,176,32,230,32,88,31,207,252,191,66,0,81,82,83,179,7,51,201,186,244,3,236,168,128,117,12,226,249,128,14,65,0,128, 249,91,90,89,195,236,168,64,117,7,128,14,65,0,32,235,239,66,236,136,5,71,185,10,0,226,254,74,236,168,16,116,6,254,203,117, 202,235,227,91,90,89,195,160,69,0,58,197,160,71,0,116,10,187,8,0,232,174,254,138,196,254,192,42,193,195,255,255,207,2,37, 2,8,42,255,80,246,25,4,251,30,82,86,81,83,232,126,10,139,242,138,92,120,209,230,139,84,8,11,210,116,12,10,228,116,14,254, 204,116,63,254,204,116,40,91,89,94,90,31,207,80,238,66,43,201,236,138,224,168,128,117,14,226,247,254,203,117,241,128,204, 1,128,228,249,235,19,176,13,66,238,176,12,238,88,80,139,84,8,66,236,138,224,128,228,248,90,138,194,128,244,72,235,197,80, 66,66,176,8,238,184,232,3,72,117,253,176,12,238,235,221,255,255,255,255,252,240,205,241,238,241,57,242,156,247,23,242,150, 242,56,243,116,243,185,243,236,243,78,242,47,244,30,244,24,247,116,242,251,252,6,30,82,81,83,86,87,80,138,196,50,228,209, 224,139,240,61,32,0,114,4,88,233,69,1,232,214,9,184,0,184,139,62,16,0,129,231,48,0,131,255,48,117,2,180,176,142,192,88,138, 38,73,0,46,255,164,69,240,255,255,255,56,40,45,10,31,6,25,28,2,7,6,7,0,0,0,0,113,80,90,10,31,6,25,28,2,7,6,7,0,0,0,0,56,40, 45,10,127,6,100,112,2,1,6,7,0,0,0,0,97,80,82,15,25,6,25,25,2,13,11,12,0,0,0,0,0,8,0,16,0,64,0,64,40,40,80,80,40,40,80,80, 44,40,45,41,42,46,30,41,186,212,3,179,0,131,255,48,117,6,176,7,178,180,254,195,138,224,162,73,0,137,22,99,0,30,80,82,131, 194,4,138,195,238,90,43,192,142,216,197,30,116,0,88,185,16,0,128,252,2,114,16,3,217,128,252,4,114,9,3,217,128,252,7,114,2, 3,217,80,50,228,138,196,238,66,254,196,138,7,238,67,74,226,243,88,31,51,255,137,62,78,0,198,6,98,0,0,185,0,32,128,252,4,114, 11,128,252,7,116,4,51,192,235,5,181,8,184,32,7,243,171,199,6,96,0,7,6,160,73,0,50,228,139,240,139,22,99,0,131,194,4,46,138, 132,244,240,238,162,101,0,46,138,132,236,240,50,228,163,74,0,129,230,14,0,46,139,140,228,240,137,14,76,0,185,8,0,191,80,0, 30,7,51,192,243,171,66,176,48,128,62,73,0,6,117,2,176,63,238,162,102,0,95,94,91,89,90,31,7,207,180,10,137,14,96,0,232,2,0, 235,237,139,22,99,0,138,196,238,66,138,197,238,74,138,196,254,192,238,66,138,193,238,195,138,207,50,237,209,225,139,241,137, 84,80,56,62,98,0,117,5,139,194,232,2,0,235,191,232,124,0,139,200,3,14,78,0,209,249,180,14,232,194,255,195,162,98,0,139,14, 76,0,152,80,247,225,163,78,0,139,200,209,249,180,12,232,170,255,91,209,227,139,71,80,232,207,255,235,140,138,223,50,255,209, 227,139,87,80,139,14,96,0,95,94,91,88,88,31,7,207,139,22,99,0,131,194,5,160,102,0,10,255,117,14,36,224,128,227,31,10,195, 238,162,102,0,233,91,255,36,223,208,235,115,243,12,32,235,239,138,38,74,0,160,73,0,138,62,98,0,95,94,89,233,67,255,83,139, 216,138,196,246,38,74,0,50,255,3,195,209,224,91,195,138,216,128,252,4,114,8,128,252,7,116,3,233,240,1,83,139,193,232,55,0, 116,49,3,240,138,230,42,227,232,114,0,3,245,3,253,254,204,117,245,88,176,32,232,109,0,3,253,254,203,117,247,232,140,7,128, 62,73,0,7,116,7,160,101,0,186,216,3,238,233,231,254,138,222,235,220,128,62,73,0,2,114,24,128,62,73,0,3,119,17,82,186,218, 3,80,236,168,8,116,251,176,37,178,216,238,88,90,232,129,255,3,6,78,0,139,248,139,240,43,209,254,198,254,194,50,237,139,46, 74,0,3,237,138,195,246,38,74,0,3,192,6,31,128,251,0,195,138,202,86,87,243,165,95,94,195,138,202,87,243,171,95,195,253,138, 216,128,252,4,114,8,128,252,7,116,3,233,166,1,83,139,194,232,148,255,116,32,43,240,138,230,42,227,232,207,255,43,245,43,253, 254,204,117,245,88,176,32,232,202,255,43,253,254,203,117,247,233,90,255,138,222,235,237,128,252,4,114,8,128,252,7,116,3,233, 168,2,232,26,0,139,243,139,22,99,0,131,194,6,6,31,236,168,1,117,251,250,236,168,1,116,251,173,233,39,254,138,207,50,237,139, 241,209,230,139,68,80,51,219,227,6,3,30,76,0,226,250,232,207,254,3,216,195,128,252,4,114,8,128,252,7,116,3,233,178,1,138, 227,80,81,232,209,255,139,251,89,91,139,22,99,0,131,194,6,236,168,1,117,251,250,236,168,1,116,251,139,195,171,251,226,232, 233,217,253,128,252,4,114,8,128,252,7,116,3,233,127,1,80,81,232,160,255,139,251,89,91,139,22,99,0,131,194,6,236,168,1,117, 251,250,236,168,1,116,251,138,195,170,251,71,226,231,233,167,253,232,49,0,38,138,4,34,196,210,224,138,206,210,192,233,150, 253,80,80,232,30,0,210,232,34,196,38,138,12,91,246,195,128,117,13,246,212,34,204,10,193,38,136,4,88,233,119,253,50,193,235, 245,83,80,176,40,82,128,226,254,246,226,90,246,194,1,116,3,5,0,32,139,240,88,139,209,187,192,2,185,2,3,128,62,73,0,6,114, 6,187,128,1,185,3,7,34,234,211,234,3,242,138,247,42,201,208,200,2,205,254,207,117,248,138,227,210,236,91,195,138,216,139, 193,232,105,2,139,248,43,209,129,194,1,1,208,230,208,230,128,62,73,0,6,115,4,208,226,209,231,6,31,42,237,208,227,208,227, 116,45,138,195,180,80,246,228,139,247,3,240,138,230,42,227,232,128,0,129,238,176,31,129,239,176,31,254,204,117,241,138,199, 232,136,0,129,239,176,31,254,203,117,245,233,219,252,138,222,235,236,253,138,216,139,194,232,15,2,139,248,43,209,129,194, 1,1,208,230,208,230,128,62,73,0,6,115,5,208,226,209,231,71,6,31,42,237,129,199,240,0,208,227,208,227,116,46,138,195,180,80, 246,228,139,247,43,240,138,230,42,227,232,33,0,129,238,80,32,129,239,80,32,254,204,117,241,138,199,232,41,0,129,239,80,32, 254,203,117,245,252,233,123,252,138,222,235,235,138,202,86,87,243,164,95,94,129,198,0,32,129,199,0,32,86,87,138,202,243,164, 95,94,195,138,202,87,243,170,95,129,199,0,32,87,138,202,243,170,95,195,180,0,80,232,132,1,139,248,88,60,128,115,6,190,110, 250,14,235,15,44,128,30,43,246,142,222,197,54,124,0,140,218,31,82,209,224,209,224,209,224,3,240,128,62,73,0,6,31,114,44,87, 86,182,4,172,246,195,128,117,22,170,172,38,136,133,255,31,131,199,79,254,206,117,236,94,95,71,226,227,233,251,251,38,50,5, 170,172,38,50,133,255,31,235,224,138,211,209,231,232,209,0,87,86,182,4,172,232,222,0,35,195,246,194,128,116,7,38,50,37,38, 50,69,1,38,136,37,38,136,69,1,172,232,197,0,35,195,246,194,128,116,10,38,50,165,0,32,38,50,133,1,32,38,136,165,0,32,38,136, 133,1,32,131,199,80,254,206,117,193,94,95,71,71,226,183,233,156,251,232,214,0,139,240,131,236,8,139,236,128,62,73,0,6,6,31, 114,26,182,4,138,4,136,70,0,69,138,132,0,32,136,70,0,69,131,198,80,254,206,117,235,235,23,144,209,230,182,4,232,136,0,129, 198,0,32,232,129,0,129,238,176,31,254,206,117,238,191,110,250,144,14,7,131,237,8,139,245,252,176,0,22,31,186,128,0,86,87, 185,8,0,243,166,95,94,116,30,254,192,131,199,8,74,117,237,60,0,116,18,43,192,142,216,196,62,124,0,140,192,11,199,116,4,176, 128,235,210,131,196,8,233,23,251,128,227,3,138,195,81,185,3,0,208,224,208,224,10,216,226,248,138,251,89,195,82,81,83,43,210, 185,1,0,139,216,35,217,11,211,209,224,209,225,139,216,35,217,11,211,209,225,115,236,139,194,91,89,90,195,138,36,138,68,1, 185,0,192,178,0,133,193,248,116,1,249,208,210,209,233,209,233,115,242,136,86,0,69,195,161,80,0,83,139,216,138,196,246,38, 74,0,209,224,209,224,42,255,3,195,91,195,80,80,180,3,138,62,98,0,205,16,88,60,8,116,82,60,13,116,87,60,10,116,87,60,7,116, 90,180,10,185,1,0,205,16,254,194,58,22,74,0,117,51,178,0,128,254,24,117,42,180,2,205,16,160,73,0,60,4,114,6,60,7,183,0,117, 6,180,8,205,16,138,252,184,1,6,43,201,182,24,138,22,74,0,254,202,205,16,88,233,82,250,254,198,180,2,235,244,128,250,0,116, 247,254,202,235,243,178,0,235,239,128,254,24,117,232,235,188,179,2,232,118,2,235,219,3,3,5,5,3,3,3,4,180,0,139,22,99,0,131, 194,6,236,168,4,117,126,168,2,117,3,233,129,0,180,16,139,22,99,0,138,196,238,66,236,138,232,74,254,196,138,196,238,66,236, 138,229,138,30,73,0,42,255,46,138,159,148,247,43,195,139,30,78,0,209,235,43,195,121,2,43,192,177,3,128,62,73,0,4,114,42,128, 62,73,0,7,116,35,178,40,246,242,138,232,2,237,138,220,42,255,128,62,73,0,6,117,4,177,4,208,228,211,227,138,212,138,240,208, 238,208,238,235,18,246,54,74,0,138,240,138,212,210,224,138,232,138,220,50,255,211,227,180,1,82,139,22,99,0,131,194,7,238, 90,95,94,31,31,31,31,7,207,255,255,255,255,255,255,255,251,30,232,19,2,161,19,0,31,207,255,255,251,30,232,7,2,161,16,0,31, 207,255,255,249,180,134,202,2,0,80,228,98,168,192,117,3,233,135,0,186,64,0,142,218,190,21,249,144,168,64,117,4,190,37,249, 144,180,0,160,73,0,205,16,232,70,1,176,0,230,160,228,97,12,48,230,97,36,207,230,97,139,30,19,0,252,43,210,142,218,142,194, 185,0,64,43,246,243,172,228,98,36,192,117,18,129,194,0,4,131,235,16,117,230,190,53,249,144,232,16,1,250,244,140,218,232,25, 7,186,19,2,176,0,238,176,40,232,208,0,184,90,165,139,200,43,219,137,7,144,144,139,7,59,193,116,7,176,69,232,186,0,235,5,176, 83,232,179,0,176,41,232,174,0,250,244,88,207,185,0,32,50,192,2,7,67,226,251,10,192,195,49,48,49,13,10,32,50,48,49,13,10,82, 79,77,13,10,49,56,48,49,13,10,80,65,82,73,84,89,32,67,72,69,67,75,32,50,13,10,80,65,82,73,84,89,32,67,72,69,67,75,32,49,13, 10,63,63,63,63,63,13,10,251,80,228,97,138,224,246,208,36,64,128,228,191,10,196,230,97,176,32,230,32,88,207,184,64,0,142,192, 42,228,138,71,2,177,9,211,224,139,200,81,185,4,0,211,232,3,208,89,232,134,255,116,6,232,87,237,235,20,144,82,38,199,6,103, 0,3,0,38,140,30,105,0,38,255,30,103,0,90,195,80,177,4,210,232,232,3,0,88,36,15,4,144,39,20,64,39,180,14,183,0,205,16,195, 188,3,120,3,120,2,139,238,232,28,0,30,232,167,0,160,16,0,36,1,117,15,250,176,137,230,99,176,133,230,97,160,21,0,230,96,244, 31,195,46,138,4,70,80,232,202,255,88,60,10,117,243,195,156,250,30,232,123,0,10,246,116,20,179,6,232,33,0,226,254,254,206, 117,245,128,62,18,0,1,117,2,235,195,179,1,232,13,0,226,254,254,202,117,245,226,254,226,254,31,157,195,176,182,230,67,184, 51,5,230,66,138,196,230,66,228,97,138,224,12,3,230,97,43,201,226,254,254,203,117,250,138,196,230,97,195,176,8,230,97,185, 86,41,226,254,176,200,230,97,176,72,230,97,176,253,230,33,198,6,107,4,0,251,43,201,246,6,107,4,2,117,2,226,247,228,96,138, 216,176,200,230,97,195,80,184,64,0,142,216,88,195,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,126, 129,165,129,189,153,129,126,126,255,219,255,195,231,255,126,108,254,254,254,124,56,16,0,16,56,124,254,124,56,16,0,56,124, 56,254,254,124,56,124,16,16,56,124,254,124,56,124,0,0,24,60,60,24,0,0,255,255,231,195,195,231,255,255,0,60,102,66,66,102, 60,0,255,195,153,189,189,153,195,255,15,7,15,125,204,204,204,120,60,102,102,102,60,24,126,24,63,51,63,48,48,112,240,224,127, 99,127,99,99,103,230,192,153,90,60,231,231,60,90,153,128,224,248,254,248,224,128,0,2,14,62,254,62,14,2,0,24,60,126,24,24, 126,60,24,102,102,102,102,102,0,102,0,127,219,219,123,27,27,27,0,62,99,56,108,108,56,204,120,0,0,0,0,126,126,126,0,24,60, 126,24,126,60,24,255,24,60,126,24,24,24,24,0,24,24,24,24,126,60,24,0,0,24,12,254,12,24,0,0,0,48,96,254,96,48,0,0,0,0,192, 192,192,254,0,0,0,36,102,255,102,36,0,0,0,24,60,126,255,255,0,0,0,255,255,126,60,24,0,0,0,0,0,0,0,0,0,0,48,120,120,48,48, 0,48,0,108,108,108,0,0,0,0,0,108,108,254,108,254,108,108,0,48,124,192,120,12,248,48,0,0,198,204,24,48,102,198,0,56,108,56, 118,220,204,118,0,96,96,192,0,0,0,0,0,24,48,96,96,96,48,24,0,96,48,24,24,24,48,96,0,0,102,60,255,60,102,0,0,0,48,48,252,48, 48,0,0,0,0,0,0,0,48,48,96,0,0,0,252,0,0,0,0,0,0,0,0,0,48,48,0,6,12,24,48,96,192,128,0,124,198,206,222,246,230,124,0,48,112, 48,48,48,48,252,0,120,204,12,56,96,204,252,0,120,204,12,56,12,204,120,0,28,60,108,204,254,12,30,0,252,192,248,12,12,204,120, 0,56,96,192,248,204,204,120,0,252,204,12,24,48,48,48,0,120,204,204,120,204,204,120,0,120,204,204,124,12,24,112,0,0,48,48, 0,0,48,48,0,0,48,48,0,0,48,48,96,24,48,96,192,96,48,24,0,0,0,252,0,0,252,0,0,96,48,24,12,24,48,96,0,120,204,12,24,48,0,48, 0,124,198,222,222,222,192,120,0,48,120,204,204,252,204,204,0,252,102,102,124,102,102,252,0,60,102,192,192,192,102,60,0,248, 108,102,102,102,108,248,0,254,98,104,120,104,98,254,0,254,98,104,120,104,96,240,0,60,102,192,192,206,102,62,0,204,204,204, 252,204,204,204,0,120,48,48,48,48,48,120,0,30,12,12,12,204,204,120,0,230,102,108,120,108,102,230,0,240,96,96,96,98,102,254, 0,198,238,254,254,214,198,198,0,198,230,246,222,206,198,198,0,56,108,198,198,198,108,56,0,252,102,102,124,96,96,240,0,120, 204,204,204,220,120,28,0,252,102,102,124,108,102,230,0,120,204,224,112,28,204,120,0,252,180,48,48,48,48,120,0,204,204,204, 204,204,204,252,0,204,204,204,204,204,120,48,0,198,198,198,214,254,238,198,0,198,198,108,56,56,108,198,0,204,204,204,120, 48,48,120,0,254,198,140,24,50,102,254,0,120,96,96,96,96,96,120,0,192,96,48,24,12,6,2,0,120,24,24,24,24,24,120,0,16,56,108, 198,0,0,0,0,0,0,0,0,0,0,0,255,48,48,24,0,0,0,0,0,0,0,120,12,124,204,118,0,224,96,96,124,102,102,220,0,0,0,120,204,192,204, 120,0,28,12,12,124,204,204,118,0,0,0,120,204,252,192,120,0,56,108,96,240,96,96,240,0,0,0,118,204,204,124,12,248,224,96,108, 118,102,102,230,0,48,0,112,48,48,48,120,0,12,0,12,12,12,204,204,120,224,96,102,108,120,108,230,0,112,48,48,48,48,48,120,0, 0,0,204,254,254,214,198,0,0,0,248,204,204,204,204,0,0,0,120,204,204,204,120,0,0,0,220,102,102,124,96,240,0,0,118,204,204, 124,12,30,0,0,220,118,102,96,240,0,0,0,124,192,120,12,248,0,16,48,124,48,48,52,24,0,0,0,204,204,204,204,118,0,0,0,204,204, 204,120,48,0,0,0,198,214,254,254,108,0,0,0,198,108,56,108,198,0,0,0,204,204,204,124,12,248,0,0,252,152,48,100,252,0,28,48, 48,224,48,48,28,0,24,24,24,0,24,24,24,0,224,48,48,28,48,48,224,0,118,220,0,0,0,0,0,0,0,16,56,108,198,198,254,0,251,30,232, 230,251,10,228,116,7,254,204,116,22,251,31,207,250,160,112,0,198,6,112,0,0,139,14,110,0,139,22,108,0,235,234,250,137,22,108, 0,137,14,110,0,198,6,112,0,0,235,218,255,255,255,255,251,30,80,82,232,173,251,255,6,108,0,117,4,255,6,110,0,131,62,110,0, 24,117,21,129,62,108,0,176,0,117,13,43,192,163,110,0,163,108,0,198,6,112,0,1,254,14,64,0,117,11,128,38,63,0,240,176,12,186, 242,3,238,205,28,176,32,230,32,90,88,31,207,255,255,255,255,255,255,165,254,135,233,35,255,35,255,35,255,35,255,87,239,35, 255,101,240,77,248,65,248,89,236,57,231,89,248,46,232,210,239,0,0,242,230,110,254,75,255,75,255,164,240,199,239,0,0,30,82, 80,232,48,251,176,11,230,32,144,228,32,138,224,10,196,117,4,180,255,235,10,228,33,10,196,230,33,176,32,230,32,136,38,107, 0,88,90,31,207,255,255,255,255,255,255,255,207,251,30,80,83,81,82,184,80,0,142,216,128,62,0,0,1,116,95,198,6,0,0,1,180,15, 205,16,138,204,181,25,232,85,0,81,180,3,205,16,89,82,51,210,180,2,205,16,180,8,205,16,10,192,117,2,176,32,82,51,210,50,228, 205,23,90,246,196,37,117,33,254,194,58,202,117,223,50,210,138,226,82,232,35,0,90,254,198,58,238,117,208,90,180,2,205,16,198, 6,0,0,0,235,10,90,180,2,205,16,198,6,0,0,255,90,89,91,88,31,207,51,210,50,228,176,10,205,23,50,228,176,13,205,23,195,138, 198,232,172,249,138,194,232,167,249,176,48,232,179,249,176,32,232,174,249,195,255,234,91,224,0,240,49,49,47,48,56,47,56,50, 255,254,40]
[54,56,88,52,51,55,48,67,79,80,82,46,32,73,66,77,32,67,79,82,80,46,32,49,57,56,49,44,49,57,56,54,32,32,32,32,32,32,32,32,32, 32,32,32,32,32,32,32,32,54,50,88,48,56,49,57,61,54,56,88,52,51,55,48,32,53,57,88,55,50,54,56,61,54,50,88,48,56,57,48,1,121, 239,130,134,239,2,147,239,3,160,239,132,173,239,4,186,239,251,85,87,82,83,81,139,236,30,86,232,162,249,128,252,25,114,2,180, 20,128,252,1,118,12,128,252,8,116,7,128,250,3,118,2,180,20,138,204,50,237,208,225,187,176,0,3,217,138,230,50,246,139,240, 139,250,138,38,65,0,198,6,65,0,0,46,255,23,94,31,89,91,90,95,93,202,2,0,226,0,58,1,70,1,82,1,94,1,106,1,205,1,205,1,215,1, 205,1,205,1,205,1,205,1,205,1,205,1,205,1,205,1,205,1,205,1,205,1,205,1,204,2,10,3,63,3,167,3,186,242,3,250,160,63,0,36,63, 208,192,208,192,208,192,208,192,12,8,238,198,6,62,0,0,235,0,12,4,238,251,232,16,10,114,45,185,192,0,81,184,50,1,80,180,8, 232,55,9,88,232,37,10,89,114,25,58,14,66,0,117,19,254,193,128,249,195,118,226,232,1,3,232,95,7,139,222,138,195,195,89,128, 14,65,0,32,235,240,136,38,65,0,232,75,7,139,222,138,196,195,128,38,63,0,127,184,70,230,232,188,3,195,184,74,197,128,14,63, 0,128,232,176,3,195,128,38,63,0,127,184,66,230,232,164,3,195,232,241,2,232,138,4,128,14,63,0,128,246,6,143,0,1,116,5,232, 208,4,114,65,232,46,5,116,6,232,162,2,232,5,5,176,74,232,49,5,114,47,180,77,232,141,5,114,40,184,194,1,80,178,3,232,181,7, 232,164,8,178,4,232,173,7,232,156,8,178,7,232,165,7,232,148,8,178,8,232,157,7,232,140,8,88,232,191,5,232,199,2,232,196,6, 139,222,138,195,195,139,198,180,1,136,38,65,0,249,195,129,255,128,0,114,6,139,198,180,1,249,195,232,120,2,199,70,2,0,0,161, 16,0,36,193,208,232,115,124,208,192,208,192,208,192,254,192,136,70,4,246,6,143,0,1,117,3,233,157,0,131,255,1,119,102,198, 70,5,1,232,20,7,114,22,10,192,116,18,232,237,1,114,13,136,70,2,46,138,79,4,46,138,111,11,235,50,138,165,144,0,246,196,16, 116,62,128,228,192,128,252,128,117,84,176,1,232,200,1,46,138,79,4,46,138,111,11,246,133,144,0,1,116,13,176,4,232,180,1,46, 138,79,4,46,138,111,11,137,78,0,137,94,6,140,200,142,192,232,32,2,51,192,248,195,198,70,4,0,129,255,128,0,114,9,232,15,2, 139,198,180,1,249,195,51,192,137,70,0,136,102,5,137,70,6,142,192,235,215,176,2,232,116,1,46,138,79,4,46,138,111,11,128,252, 64,116,187,235,172,131,255,3,119,216,177,9,246,133,144,0,1,176,1,181,39,116,4,176,3,181,79,136,70,2,198,70,3,0,198,70,5,1, 232,65,1,235,147,246,6,143,0,1,116,32,232,136,1,138,133,144,0,180,0,10,192,116,8,180,1,168,1,116,2,180,2,80,232,160,1,88, 248,139,222,138,195,195,161,16,0,180,0,168,1,116,241,208,192,208,192,36,3,59,199,114,231,180,1,235,227,246,6,143,0,1,117, 3,233,185,254,232,71,1,138,133,144,0,10,192,116,25,168,1,116,5,232,85,8,116,5,198,6,65,0,6,232,92,1,232,89,5,139,222,138, 195,195,128,14,65,0,128,235,238,232,28,1,86,139,198,50,228,139,240,128,165,144,0,15,78,117,7,128,141,144,0,144,235,62,246, 6,143,0,1,116,10,232,237,2,128,62,65,0,128,116,45,78,117,7,128,141,144,0,112,235,35,78,117,7,128,141,144,0,16,235,25,78,117, 32,246,133,144,0,4,116,9,176,80,246,133,144,0,2,117,2,176,144,8,133,144,0,232,243,0,232,240,4,91,138,195,195,198,6,65,0,1, 235,239,232,180,0,51,219,128,126,1,39,117,11,246,133,144,0,1,116,22,179,3,235,18,179,6,128,126,0,15,116,10,179,18,128,126, 0,18,116,2,179,12,46,139,159,81,0,46,138,71,4,46,138,103,11,57,70,0,117,35,46,138,71,12,60,64,117,2,12,32,137,94,6,12,16, 128,165,144,0,15,8,133,144,0,140,200,142,192,232,140,0,232,137,4,195,198,6,65,0,12,235,242,80,81,51,219,185,6,0,46,138,167, 80,0,58,196,116,8,131,195,3,226,242,249,235,5,46,139,159,81,0,89,88,195,184,69,4,80,180,3,232,22,6,42,210,232,31,5,232,14, 6,178,1,232,23,5,232,6,6,88,195,184,93,4,80,180,3,232,251,5,46,138,39,232,245,5,46,138,103,1,232,238,5,88,195,246,6,143,0, 1,116,34,131,255,1,119,29,128,189,144,0,0,116,23,139,207,208,225,208,225,160,143,0,210,200,36,7,128,165,144,0,248,8,133,144, 0,195,232,250,6,195,246,6,143,0,1,116,121,131,255,1,119,116,128,189,144,0,0,116,109,139,207,208,225,208,225,180,2,210,204, 132,38,143,0,117,22,180,7,210,204,246,212,32,38,143,0,138,133,144,0,36,7,210,200,8,6,143,0,138,165,144,0,138,252,128,228, 192,128,252,0,116,16,176,1,128,252,64,117,22,246,199,32,117,29,176,7,235,32,232,67,4,114,247,60,2,117,243,176,2,235,12,176, 0,128,252,128,117,232,246,199,1,117,227,246,199,16,116,2,4,3,128,165,144,0,248,8,133,144,0,195,80,232,77,255,232,167,0,88, 246,6,143,0,1,116,10,80,232,47,1,88,115,3,233,134,0,80,138,181,144,0,128,230,192,232,248,3,10,192,116,47,232,211,254,114, 42,87,51,219,185,6,0,46,138,167,80,0,128,228,127,58,196,117,11,46,139,191,81,0,46,58,117,12,116,29,131,195,3,226,228,198, 6,65,0,255,95,235,63,187,121,239,246,133,144,0,1,116,9,187,147,239,235,4,144,139,223,95,232,204,254,232,53,1,116,3,232,15, 1,83,232,32,3,91,114,26,88,80,83,232,51,1,91,88,114,31,80,83,232,141,1,91,114,8,232,173,1,114,3,232,222,1,232,114,2,88,115, 3,233,105,255,232,38,2,232,173,2,80,232,214,254,88,232,210,2,195,246,6,143,0,1,116,55,246,133,144,0,16,117,48,184,128,64, 246,133,144,0,4,116,12,176,0,246,133,144,0,2,117,3,184,128,128,128,165,144,0,31,8,165,144,0,128,38,139,0,243,208,200,208, 200,208,200,208,200,8,6,139,0,195,246,6,143,0,1,116,73,246,133,144,0,16,117,66,232,30,3,114,62,254,200,120,58,138,165,144, 0,128,228,15,10,192,117,5,128,204,144,235,37,254,200,117,5,128,204,16,235,28,254,200,117,15,246,196,4,116,16,246,196,2,116, 11,128,204,80,235,9,254,200,117,10,235,226,128,204,144,136,165,144,0,195,50,228,235,247,246,6,143,0,1,116,55,232,34,5,116, 52,128,165,144,0,239,139,207,176,1,210,224,246,208,250,32,6,63,0,251,232,252,2,232,110,250,181,1,232,245,3,50,237,232,240, 3,198,6,65,0,6,232,245,4,116,5,198,6,65,0,128,249,195,248,195,246,6,143,0,1,116,25,80,128,38,139,0,63,138,133,144,0,36,192, 8,6,139,0,208,192,208,192,186,247,3,238,88,195,80,138,38,139,0,138,133,144,0,37,192,192,58,196,88,195,250,230,12,235,0,230, 11,60,66,117,4,51,192,235,21,140,192,209,192,209,192,209,192,209,192,138,232,36,240,3,70,2,115,2,254,197,80,230,4,235,0,138, 196,230,4,138,197,235,0,36,15,230,129,139,198,134,196,42,192,209,232,80,178,3,232,83,2,138,204,88,211,224,72,80,230,5,235, 0,138,196,230,5,251,89,88,3,193,176,2,230,10,115,5,198,6,65,0,9,195,80,232,68,2,138,110,1,232,63,3,88,114,24,187,74,7,83, 232,17,3,139,198,139,223,208,228,208,228,128,228,4,10,227,232,1,3,91,195,184,128,7,80,138,102,1,232,245,2,139,198,232,240, 2,138,102,0,232,234,2,178,3,232,243,1,232,226,2,178,4,232,235,1,232,218,2,46,138,103,5,232,211,2,178,6,232,220,1,232,203, 2,88,195,86,232,143,3,156,232,179,3,114,71,157,114,60,252,190,66,0,172,36,192,116,51,60,64,117,41,172,208,224,180,4,114,36, 208,224,208,224,180,16,114,28,208,224,180,8,114,22,208,224,208,224,180,4,114,14,208,224,180,3,114,8,208,224,180,2,114,2,180, 32,8,38,65,0,128,62,65,0,1,245,94,195,157,235,245,246,6,143,0,1,116,59,128,62,65,0,0,117,52,128,141,144,0,16,246,133,144, 0,4,117,40,138,133,144,0,36,192,60,128,117,25,232,45,1,114,20,60,2,116,16,60,4,116,12,128,165,144,0,253,128,141,144,0,4,235, 5,128,141,144,0,6,195,128,62,65,0,0,116,62,128,62,65,0,128,116,55,138,165,144,0,246,196,16,117,46,128,228,192,138,46,139, 0,208,197,208,197,208,197,208,197,128,229,192,58,236,116,24,128,252,1,208,220,128,228,192,128,165,144,0,31,8,165,144,0,198, 6,65,0,0,249,195,248,195,50,192,128,62,65,0,0,117,35,178,4,232,235,0,138,30,71,0,139,206,58,46,70,0,117,11,138,46,69,0,58, 110,1,116,4,2,220,2,220,42,94,0,138,195,195,178,2,80,232,198,0,136,38,64,0,88,138,38,65,0,10,228,116,2,50,192,128,252,1,245, 195,246,6,143,0,1,116,101,138,165,144,0,246,196,16,117,92,198,6,62,0,0,232,175,0,181,0,232,171,1,232,78,0,114,53,185,80,4, 246,133,144,0,1,116,2,177,160,81,198,6,65,0,0,51,192,208,237,208,208,208,208,208,208,80,232,134,1,88,11,248,232,38,0,156, 129,231,251,0,157,89,115,8,254,197,58,233,117,215,249,195,138,14,69,0,136,141,148,0,208,237,58,233,116,5,128,141,144,0,32, 248,195,184,40,9,80,180,74,232,45,1,139,199,138,224,232,38,1,232,90,254,88,195,160,16,0,36,193,208,232,115,32,208,192,208, 192,208,192,50,228,59,199,114,20,246,6,143,0,1,117,16,246,133,144,0,1,176,1,116,6,176,3,235,2,50,192,195,249,235,252,30,86, 43,192,142,216,135,211,42,255,197,54,120,0,138,32,135,211,94,31,195,83,232,71,0,114,67,232,22,251,184,253,144,205,21,156, 232,223,250,157,115,5,232,51,0,114,47,178,10,232,204,255,138,196,50,228,60,8,115,2,176,8,80,186,36,244,247,226,139,202,139, 208,248,209,210,209,209,180,134,205,21,88,115,10,185,94,32,232,238,226,254,200,117,246,91,195,139,223,138,203,208,195,208, 195,208,195,208,195,250,198,6,64,0,255,160,63,0,36,48,180,1,210,228,58,195,117,6,132,38,63,0,117,49,10,227,138,62,63,0,128, 231,15,128,38,63,0,192,8,38,63,0,160,63,0,138,216,128,227,15,251,36,63,208,192,208,192,208,192,208,192,12,12,186,242,3,238, 58,223,116,2,248,195,249,251,195,178,9,232,66,255,246,6,63,0,128,116,9,128,252,15,115,8,180,15,235,4,10,228,116,31,138,196, 50,228,80,186,232,3,247,226,139,202,139,208,180,134,205,21,88,115,10,185,66,0,232,91,226,254,200,117,246,195,83,186,244,3, 179,2,51,201,236,36,192,60,128,116,15,226,247,254,203,117,243,128,14,65,0,128,91,88,249,195,138,196,66,238,91,195,139,223, 186,213,10,82,176,1,134,203,210,192,134,203,132,6,62,0,117,33,8,6,62,0,232,77,0,115,10,198,6,65,0,0,232,67,0,114,63,131,255, 1,119,33,198,133,148,0,0,10,237,116,44,131,255,1,119,19,246,133,144,0,32,116,2,208,229,58,173,148,0,116,29,136,173,148,0, 81,180,15,232,137,255,139,223,138,227,232,130,255,88,232,126,255,232,30,0,156,232,62,255,157,88,195,81,184,235,10,80,180, 7,232,106,255,139,223,138,227,232,99,255,232,3,0,88,89,195,184,11,11,80,232,32,0,114,20,180,8,232,79,255,232,62,0,114,10, 160,66,0,36,96,60,96,116,3,248,88,195,128,14,65,0,64,249,235,246,251,248,184,1,144,205,21,114,17,179,4,51,201,246,6,62,0, 128,117,12,226,247,254,203,117,243,128,14,65,0,128,249,156,128,38,62,0,127,157,195,87,191,66,0,179,7,186,244,3,183,2,51,201, 236,36,192,60,192,116,14,226,247,254,207,117,243,128,14,65,0,128,249,235,27,66,236,136,5,71,185,2,0,232,55,225,74,236,168, 16,116,10,254,203,117,210,128,14,65,0,32,249,95,195,232,239,253,186,247,3,236,168,128,195,232,229,253,232,75,255,114,62,181, 48,232,220,254,114,55,181,11,254,205,120,38,81,232,208,254,114,44,184,203,11,80,180,4,232,161,254,139,199,138,224,232,154, 254,232,137,255,88,89,246,6,66,0,16,116,218,10,237,116,6,128,141,144,0,148,195,128,141,144,0,1,195,89,195,251,80,30,232,61, 238,128,14,62,0,128,31,176,32,230,32,184,1,145,205,21,88,207,80,83,81,82,87,86,30,232,34,238,128,14,160,0,1,199,6,144,0,0, 0,128,38,139,0,51,128,14,139,0,192,198,6,62,0,0,198,6,64,0,0,198,6,63,0,0,198,6,65,0,0,160,16,0,208,192,208,192,36,3,50,228, 51,255,190,16,0,246,6,143,0,1,117,5,198,133,144,0,148,80,232,77,255,232,81,248,35,54,66,0,88,71,59,248,118,227,198,6,62,0, 0,128,38,160,0,254,232,58,252,114,5,11,246,117,1,249,31,94,95,90,89,91,88,195,251,30,83,81,232,169,237,10,228,116,38,254, 204,116,55,254,204,116,100,128,236,3,116,100,128,236,11,116,12,254,204,116,26,254,204,116,57,89,91,31,207,232,114,0,232,162, 0,235,244,232,106,0,232,165,0,114,248,235,234,232,134,0,116,24,156,232,141,0,235,17,232,123,0,116,13,156,232,141,0,115,6, 157,232,73,0,235,239,157,89,91,31,202,2,0,138,38,24,0,128,228,4,177,5,210,228,160,24,0,36,115,10,224,160,150,0,36,12,10,224, 160,23,0,235,169,86,250,139,30,28,0,139,243,232,141,0,59,30,26,0,116,11,137,12,137,30,28,0,42,192,235,3,144,176,1,251,94, 235,135,139,30,26,0,59,30,28,0,117,5,184,2,144,205,21,251,144,250,139,30,26,0,59,30,28,0,116,243,139,7,232,85,0,137,30,26, 0,195,250,139,30,26,0,59,30,28,0,139,7,251,195,60,240,117,6,10,228,116,2,50,192,195,128,252,224,117,18,60,13,116,9,60,10, 116,5,180,53,235,35,144,180,28,235,30,144,128,252,132,119,26,60,240,117,7,10,228,116,16,235,16,144,60,224,117,9,10,228,116, 5,50,192,235,1,144,248,195,249,195,67,67,59,30,130,0,114,4,139,30,128,0,195,80,83,81,82,86,87,30,6,252,232,131,236,228,96, 147,228,97,138,224,12,128,230,97,134,224,230,97,251,147,180,79,249,205,21,114,3,233,137,1,138,224,60,255,117,3,233,246,3, 14,7,138,62,150,0,60,224,117,7,128,14,150,0,18,235,9,60,225,117,8,128,14,150,0,17,233,104,1,36,127,246,199,2,116,12,185,2, 0,191,204,17,242,174,117,91,235,68,246,199,1,116,29,185,4,0,191,202,17,242,174,116,219,60,69,117,49,246,196,128,117,44,246, 6,24,0,8,117,37,233,99,2,60,84,117,51,246,196,128,117,28,246,6,24,0,4,117,18,128,14,24,0,4,176,32,230,32,184,0,133,251,205, 21,233,22,1,233,9,1,128,38,24,0,251,176,32,230,32,184,1,133,251,205,21,233,1,1,138,30,23,0,191,198,17,185,8,0,144,242,174, 138,196,116,3,233,207,0,129,239,199,17,46,138,165,206,17,177,2,168,128,116,3,235,110,144,128,252,16,115,33,8,38,23,0,246, 196,12,117,3,233,192,0,246,199,2,116,7,8,38,150,0,233,180,0,210,236,8,38,24,0,233,171,0,246,195,4,116,3,233,143,0,60,82,117, 33,246,195,8,116,3,233,131,0,246,199,2,117,20,246,195,32,117,10,246,195,3,116,10,138,224,235,112,144,246,195,3,116,246,132, 38,24,0,116,3,235,118,144,8,38,24,0,48,38,23,0,60,82,117,105,138,224,235,120,144,128,252,16,246,212,115,67,32,38,23,0,128, 252,251,119,38,246,199,2,116,6,32,38,150,0,235,6,210,252,32,38,24,0,138,224,160,150,0,210,232,10,6,24,0,210,224,36,12,8,6, 23,0,138,196,60,184,117,42,160,25,0,180,0,136,38,25,0,60,0,116,29,233,105,2,32,38,24,0,235,20,60,128,115,16,246,6,24,0,8, 116,28,60,69,116,5,128,38,24,0,247,128,38,150,0,252,250,176,32,230,32,7,31,95,94,90,89,91,88,207,60,88,119,233,246,195,8, 116,12,246,199,16,116,10,246,6,24,0,4,116,3,233,215,0,246,195,4,116,55,60,83,117,51,199,6,114,0,52,18,129,38,150,0,16,0,233, 230,208,82,79,80,81,75,76,77,71,72,73,16,17,18,19,20,21,22,23,24,25,30,31,32,33,34,35,36,37,38,44,45,46,47,48,49,50,60,57, 117,5,176,32,233,211,1,60,15,117,6,184,0,165,233,201,1,60,74,116,121,60,78,116,117,191,117,15,185,10,0,242,174,117,24,246, 199,2,117,107,129,239,118,15,160,25,0,180,10,246,228,3,199,162,25,0,233,92,255,198,6,25,0,0,185,26,0,242,174,116,66,60,2, 114,67,60,13,119,5,128,196,118,235,53,60,87,114,9,60,88,119,5,128,196,52,235,40,246,199,2,116,24,60,28,117,6,184,0,166,233, 106,1,60,83,116,31,60,53,117,192,184,0,164,233,92,1,60,59,114,12,60,68,119,178,128,196,45,176,0,233,76,1,176,240,233,71,1, 4,80,138,224,235,240,246,195,4,117,3,233,128,0,60,70,117,30,246,199,16,116,5,246,199,2,116,20,139,30,26,0,137,30,28,0,198, 6,113,0,128,205,27,43,192,233,23,1,246,199,16,117,37,60,69,117,33,128,14,24,0,8,176,32,230,32,128,62,73,0,7,116,7,186,216, 3,160,101,0,238,246,6,24,0,8,117,249,233,180,254,60,55,117,16,246,199,16,116,5,246,199,2,116,32,184,0,114,233,217,0,60,15, 116,22,60,53,117,11,246,199,2,116,6,184,0,149,233,198,0,187,214,17,60,59,114,87,187,214,17,233,168,0,60,55,117,31,246,199, 16,116,7,246,199,2,117,7,235,52,246,195,3,116,47,176,32,230,32,205,5,128,38,150,0,252,233,93,254,60,58,119,44,60,53,117,5, 246,199,2,117,20,185,26,0,191,127,15,242,174,117,5,246,195,64,117,10,246,195,3,117,10,187,46,18,235,80,246,195,3,117,246, 187,134,18,235,70,60,68,119,2,235,54,60,83,119,44,60,74,116,237,60,78,116,233,246,199,2,117,10,246,195,32,117,19,246,195, 3,117,19,60,76,117,5,176,240,235,61,144,187,46,18,235,38,246,195,3,117,237,235,197,60,86,117,2,235,176,246,195,3,116,224, 187,134,18,235,15,254,200,46,215,246,6,150,0,2,116,21,180,224,235,17,254,200,46,215,138,224,176,0,246,6,150,0,2,116,2,176, 224,60,255,116,5,128,252,255,117,3,233,177,253,250,139,30,28,0,139,243,232,234,251,59,30,26,0,116,23,137,4,137,30,28,0,176, 32,230,32,184,2,145,205,21,128,38,150,0,252,233,148,253,250,228,33,12,2,230,33,176,32,230,32,251,185,166,2,179,3,232,160, 218,250,228,33,36,253,230,33,233,118,253,82,58,69,70,56,29,42,54,128,64,32,16,8,4,2,1,27,255,0,255,255,255,30,255,255,255, 255,31,255,127,148,17,23,5,18,20,25,21,9,15,16,27,29,10,255,1,19,4,6,7,8,10,11,12,255,255,255,255,28,26,24,3,22,2,14,13,255, 255,255,255,150,255,32,255,94,95,96,97,98,99,100,101,102,103,255,255,119,141,132,142,115,143,116,144,117,145,118,146,147, 255,255,255,137,138,27,49,50,51,52,53,54,55,56,57,48,45,61,8,9,113,119,101,114,116,121,117,105,111,112,91,93,13,255,97,115, 100,102,103,104,106,107,108,59,39,96,255,92,122,120,99,118,98,110,109,44,46,47,255,42,255,32,255,59,60,61,62,63,64,65,66, 67,68,255,255,71,72,73,255,75,255,77,255,79,80,81,82,83,255,255,92,133,134,27,33,64,35,36,37,94,38,42,40,41,95,43,8,0,81, 87,69,82,84,89,85,73,79,80,123,125,13,255,65,83,68,70,71,72,74,75,76,58,34,126,255,124,90,88,67,86,66,78,77,60,62,63,255, 42,255,32,255,84,85,86,87,88,89,90,91,92,93,255,255,55,56,57,45,52,53,54,43,49,50,51,48,46,255,255,124,135,136,251,82,83, 131,250,3,119,37,138,248,30,232,37,231,86,139,242,138,156,120,0,209,230,139,148,8,0,94,31,11,210,116,12,10,228,116,13,254, 204,116,75,254,204,116,57,180,41,91,90,207,238,66,236,236,168,128,117,5,184,254,144,205,21,81,43,201,236,138,224,168,128, 117,15,226,247,254,203,117,243,89,128,204,1,128,228,249,235,21,89,176,13,66,250,238,235,0,176,12,238,251,74,74,66,236,236, 36,248,138,224,138,199,128,244,72,235,187,66,66,176,8,238,184,232,3,72,117,253,176,12,238,74,74,235,224,251,30,82,86,87,81, 83,131,250,3,119,36,139,242,139,250,209,230,232,152,230,139,148,0,0,11,210,116,19,10,228,116,24,254,204,116,75,254,204,116, 112,254,204,117,3,233,139,0,180,128,91,89,95,94,90,31,207,138,224,131,194,3,176,128,238,138,212,177,4,210,194,129,226,14, 0,191,41,231,3,250,139,148,0,0,66,46,138,69,1,238,74,144,46,138,5,238,131,194,3,138,196,36,31,238,74,74,144,176,0,238,235, 75,80,131,194,4,176,3,238,66,66,183,48,232,76,0,116,8,89,138,193,128,204,128,235,170,74,183,32,232,60,0,117,240,131,234,5, 89,138,193,238,235,153,131,194,4,176,1,238,66,66,183,32,232,36,0,117,219,74,183,1,232,28,0,117,211,128,228,30,139,148,0,0, 236,233,119,255,139,148,0,0,131,194,5,236,138,224,66,236,233,104,255,138,157,124,0,43,201,236,138,224,34,199,58,199,116,8, 226,245,254,203,117,239,10,255,195,165,20,140,21,173,21,213,21,203,27,236,21,85,22,243,22,69,23,162,23,212,23,14,22,150,24, 133,24,68,27,52,22,131,21,131,21,131,21,1,24,251,252,128,252,20,115,47,6,30,82,81,83,86,87,85,190,64,0,142,222,139,240,160, 16,0,36,48,60,48,191,0,184,117,3,191,0,176,142,199,138,196,152,209,224,150,138,38,73,0,46,255,164,70,20,207,186,212,3,139, 62,16,0,129,231,48,0,131,255,48,117,6,176,7,178,180,235,13,60,7,114,9,176,0,131,255,16,116,2,176,2,162,73,0,137,22,99,0,198, 6,132,0,24,30,80,152,139,240,46,138,132,244,240,162,101,0,36,55,82,131,194,4,238,90,43,219,142,219,197,30,116,0,88,185,16, 0,60,2,114,14,3,217,60,4,114,8,3,217,60,7,114,2,3,217,80,139,71,10,134,224,30,232,0,229,163,96,0,31,50,228,138,196,238,66, 254,196,138,7,238,67,74,226,243,88,31,51,255,137,62,78,0,198,6,98,0,0,185,0,32,60,4,114,10,60,7,116,4,51,192,235,5,181,8, 184,32,7,243,171,139,22,99,0,131,194,4,160,101,0,238,46,138,132,236,240,152,163,74,0,129,230,14,0,46,139,132,228,240,163, 76,0,185,8,0,191,80,0,30,7,51,192,243,171,66,176,48,128,62,73,0,6,117,2,176,63,238,162,102,0,93,95,94,91,89,90,31,7,207,180, 10,137,14,96,0,232,2,0,235,236,139,22,99,0,138,196,238,66,138,197,238,74,138,196,254,192,238,66,138,193,238,195,138,199,152, 209,224,150,137,148,80,0,56,62,98,0,117,5,139,194,232,2,0,235,191,232,127,0,139,200,3,14,78,0,209,249,180,14,232,195,255, 195,138,223,50,255,209,227,139,151,80,0,139,14,96,0,93,95,94,91,88,88,31,7,207,162,98,0,152,80,247,38,76,0,163,78,0,139,200, 209,249,180,12,232,150,255,91,209,227,139,135,80,0,232,185,255,233,117,255,139,22,99,0,131,194,5,160,102,0,10,255,117,14, 36,224,128,227,31,10,195,238,162,102,0,233,89,255,36,223,208,235,115,243,12,32,235,239,138,38,74,0,160,73,0,138,62,98,0,93, 95,94,89,233,65,255,83,147,160,74,0,246,231,50,255,3,195,209,224,91,195,232,216,0,128,252,4,114,8,128,252,7,116,3,233,141, 2,83,139,193,232,55,0,116,49,3,240,138,230,42,227,232,109,0,3,245,3,253,254,204,117,245,88,176,32,232,104,0,3,253,254,203, 117,247,232,132,227,128,62,73,0,7,116,7,160,101,0,186,216,3,238,233,229,254,138,222,235,220,232,161,255,3,6,78,0,139,248, 139,240,43,209,254,198,254,194,50,237,139,46,74,0,3,237,160,74,0,246,227,3,192,80,160,73,0,6,31,60,2,114,19,60,3,119,15,82, 186,218,3,236,168,8,116,251,176,37,178,216,238,90,88,10,219,195,138,202,86,87,243,165,95,94,195,138,202,87,243,171,95,195, 253,232,57,0,128,252,4,114,8,128,252,7,116,3,233,69,2,83,139,194,232,152,255,116,32,43,240,138,230,42,227,232,206,255,43, 245,43,253,254,204,117,245,88,176,32,232,201,255,43,253,254,203,117,247,233,94,255,138,222,235,237,138,216,10,192,116,14, 80,138,198,42,197,254,192,58,195,88,117,2,42,219,195,128,252,4,114,8,128,252,7,116,3,233,50,3,232,25,0,139,247,6,31,10,219, 117,13,251,144,250,236,168,1,117,248,236,168,9,116,251,173,233,21,254,134,227,139,232,128,235,2,208,235,138,199,152,139,248, 209,231,139,149,80,0,116,9,51,255,3,62,76,0,72,117,249,160,74,0,246,230,50,246,3,194,209,224,3,248,139,22,99,0,131,194,6, 195,128,252,4,114,8,128,252,7,116,3,233,33,2,232,188,255,10,219,116,6,149,243,171,235,22,149,251,144,250,236,168,8,117,9, 168,1,117,244,236,168,9,116,251,149,171,226,234,233,175,253,128,252,4,114,8,128,252,7,116,3,233,239,1,232,138,255,251,10, 219,117,15,250,236,168,8,117,9,168,1,117,241,236,168,9,116,251,139,197,170,71,226,230,233,130,253,85,139,236,142,70,16,93, 152,139,248,60,4,115,115,227,113,139,243,138,223,50,255,135,243,209,230,255,180,80,0,184,0,2,205,16,38,138,70,0,69,60,8,116, 12,60,13,116,8,60,10,116,4,60,7,117,10,180,14,205,16,139,148,80,0,235,45,81,83,185,1,0,131,255,2,114,5,38,138,94,0,69,180, 9,205,16,91,89,254,194,58,22,74,0,114,16,254,198,42,210,128,254,25,114,7,184,10,14,205,16,254,206,184,0,2,205,16,226,173, 90,151,168,1,117,5,184,0,2,205,16,233,254,252,232,49,0,38,138,4,34,196,210,224,138,206,210,192,233,237,252,80,80,232,30,0, 210,232,34,196,38,138,12,91,246,195,128,117,13,246,212,34,204,10,193,38,136,4,88,233,206,252,50,193,235,245,150,176,40,246, 226,168,8,116,3,5,216,31,150,139,209,187,192,2,185,2,3,128,62,73,0,6,114,6,187,128,1,185,3,7,34,234,211,234,3,242,138,247, 42,201,208,200,2,205,254,207,117,248,138,227,210,236,195,138,216,139,193,232,57,2,139,248,43,209,129,194,1,1,208,230,208, 230,128,62,73,0,6,115,4,208,226,209,231,6,31,42,237,208,227,208,227,116,43,176,80,246,227,139,247,3,240,138,230,42,227,232, 125,0,129,238,176,31,129,239,176,31,254,204,117,241,138,199,232,133,0,129,239,176,31,254,203,117,245,233,62,252,138,222,235, 236,253,138,216,139,194,232,225,1,139,248,43,209,129,194,1,1,208,230,208,230,128,62,73,0,6,115,5,208,226,209,231,71,6,31, 42,237,129,199,240,0,208,227,208,227,116,43,176,80,246,227,139,247,43,240,138,230,42,227,232,32,0,129,238,80,32,129,239,80, 32,254,204,117,241,138,199,232,40,0,129,239,80,32,254,203,117,245,233,225,251,138,222,235,236,138,202,86,87,243,164,95,94, 129,198,0,32,129,199,0,32,86,87,138,202,243,164,95,94,195,138,202,87,243,170,95,129,199,0,32,87,138,202,243,170,95,195,180, 0,80,232,89,1,139,248,88,60,128,115,6,190,110,250,14,235,24,44,128,30,43,246,142,222,197,54,124,0,140,218,31,82,11,214,117, 5,88,190,110,250,14,209,224,209,224,209,224,3,240,128,62,73,0,6,31,114,44,87,86,182,4,172,246,195,128,117,22,170,172,38,136, 133,255,31,131,199,79,254,206,117,236,94,95,71,226,227,233,88,251,38,50,5,170,172,38,50,133,255,31,235,224,138,211,209,231, 128,227,3,176,85,246,227,138,216,138,248,87,86,182,4,172,232,184,0,35,195,134,224,246,194,128,116,3,38,51,5,38,137,5,172, 232,165,0,35,195,134,224,246,194,128,116,5,38,51,133,0,32,38,137,133,0,32,131,199,80,254,206,117,207,94,95,71,71,226,197, 233,255,250,232,168,0,139,240,131,236,8,139,236,128,62,73,0,6,6,31,114,25,182,4,138,4,136,70,0,69,138,132,0,32,136,70,0,69, 131,198,80,254,206,117,235,235,22,209,230,182,4,232,94,0,129,198,254,31,232,87,0,129,238,178,31,254,206,117,238,191,110,250, 14,7,131,237,8,139,245,176,0,22,31,186,128,0,86,87,185,4,0,243,167,95,94,116,30,254,192,131,199,8,74,117,237,60,0,116,18, 43,192,142,216,196,62,124,0,140,192,11,199,116,4,176,128,235,210,131,196,8,233,125,250,81,185,8,0,208,200,209,221,209,253, 226,248,149,89,195,173,134,196,185,0,192,178,0,133,193,116,1,249,208,210,209,233,209,233,115,243,136,86,0,69,195,161,80,0, 83,139,216,160,74,0,246,228,209,224,209,224,42,255,3,195,91,195,151,180,3,138,62,98,0,205,16,139,199,60,13,118,70,180,10, 185,1,0,205,16,254,194,58,22,74,0,117,51,178,0,128,254,24,117,42,180,2,205,16,160,73,0,60,4,114,6,60,7,183,0,117,6,180,8, 205,16,138,252,184,1,6,43,201,182,24,138,22,74,0,254,202,205,16,151,233,240,249,254,198,180,2,235,244,116,19,60,10,116,19, 60,7,116,22,60,8,117,172,10,210,116,234,74,235,231,178,0,235,227,128,254,24,117,220,235,176,185,51,5,179,31,232,155,208,235, 204,3,3,5,5,3,3,3,4,180,0,139,22,99,0,131,194,6,236,168,4,116,3,233,128,0,168,2,117,3,233,131,0,180,16,139,22,99,0,138,196, 238,144,66,236,138,232,74,254,196,138,196,238,66,144,236,138,229,138,30,73,0,42,255,46,138,159,195,27,43,195,139,30,78,0, 209,235,43,195,121,2,43,192,177,3,128,62,73,0,4,114,42,128,62,73,0,7,116,35,178,40,246,242,138,232,2,237,138,220,42,255,128, 62,73,0,6,117,4,177,4,208,228,211,227,138,212,138,240,208,238,208,238,235,18,246,54,74,0,138,240,138,212,210,224,138,232, 138,220,50,255,211,227,180,1,82,139,22,99,0,131,194,7,238,90,93,95,94,31,31,31,31,7,207,251,128,252,128,115,6,180,134,249, 202,2,0,128,252,192,116,46,128,236,128,116,37,254,204,116,33,254,204,116,29,254,204,254,204,116,39,254,204,116,19,254,204, 254,204,254,204,116,24,128,236,8,116,6,254,204,116,5,235,203,248,235,203,207,14,7,187,60,231,50,228,235,193,51,192,207,251, 139,194,186,1,2,10,192,116,9,254,200,116,10,235,171,251,235,171,236,36,240,235,248,179,1,232,25,0,81,179,2,232,19,0,81,179, 4,232,13,0,81,179,8,232,7,0,139,209,89,91,88,235,218,82,250,176,0,230,67,235,0,228,64,235,0,138,224,228,64,134,224,80,185, 255,4,238,235,0,236,132,195,224,251,131,249,0,89,117,4,43,201,235,45,176,0,230,67,235,0,228,64,138,224,235,0,228,64,134,224, 59,200,115,11,82,186,255,255,43,208,3,202,90,235,2,43,200,129,225,240,31,209,233,209,233,209,233,209,233,251,186,1,2,81,80, 185,255,4,236,168,15,224,251,88,89,90,195,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,233,143,126,232,167, 107,203,232,2,101,203,93,232,199,47,116,13,139,54,233,4,138,68,46,60,254,116,2,60,253,195,0,0,0,0,0,0,51,46,148,13,104,115, 91,17,89,21,102,55,62,22,143,17,237,16,182,16,248,18,12,46,206,16,53,17,95,17,45,46,72,19,80,47,53,31,27,45,254,17,88,30, 240,27,145,34,133,46,190,7,190,7,83,30,67,19,46,31,0,0,138,30,95,17,156,46,157,46,163,46,243,46,223,54,169,18,88,18,57,34, 184,18,216,34,251,15,254,15,1,16,4,16,217,20,4,61,48,61,160,93,0,0,0,0,0,0,169,61,63,36,158,36,4,64,82,67,108,65,109,65,206, 65,47,83,231,82,38,93,19,70,51,70,41,88,13,88,209,71,205,71,147,81,42,80,23,84,104,41,165,41,177,41,28,101,128,126,150,125, 241,112,135,120,14,122,12,115,132,98,244,121,173,122,205,122,140,43,61,30,122,27,232,40,23,38,233,41,248,40,11,41,128,34, 71,41,13,38,18,38,117,27,173,107,81,107,130,107,156,101,250,85,152,86,18,87,192,68,152,68,172,68,55,1,72,1,87,1,139,1,180, 1,217,1,229,1,244,1,249,1,21,2,22,2,26,2,80,2,98,2,109,2,134,2,169,2,170,2,223,2,35,3,58,3,67,3,77,3,101,3,105,3,106,3,85, 84,207,170,78,196,238,66,211,6,84,206,14,83,195,21,0,83,65,86,197,194,76,79,65,196,195,69,69,208,197,0,79,76,79,210,191,76, 79,83,197,187,79,78,212,153,76,69,65,210,146,83,82,76,73,206,219,73,78,212,28,83,78,199,29,68,66,204,30,79,211,12,72,82,164, 22,65,76,204,179,76,211,192,0,69,76,69,84,197,169,65,84,193,132,73,205,134,69,70,83,84,210,172,69,70,73,78,212,173,69,70, 83,78,199,174,69,70,68,66,204,175,69,198,151,0,76,83,197,161,78,196,129,82,65,83,197,165,68,73,212,166,82,82,79,210,167,82, 204,212,82,210,213,88,208,11,79,198,35,81,214,241,0,79,210,130,206,209,82,197,15,73,216,31,0,79,84,207,137,79,32,84,207,137, 79,83,85,194,141,0,69,88,164,26,0,78,80,85,212,133,198,139,78,83,84,210,216,78,212,5,78,208,16,77,208,242,78,75,69,89,164, 222,0,0,69,217,201,0,79,67,65,84,197,202,80,82,73,78,212,157,76,73,83,212,158,80,79,211,27,69,212,136,73,78,197,176,79,65, 196,188,73,83,212,147,79,199,10,79,195,36,69,206,18,69,70,84,164,1,79,198,37,0,79,84,79,210,193,69,82,71,197,189,79,196,243, 73,68,164,3,0,69,88,212,131,69,215,148,79,212,211,0,80,69,206,186,85,212,156,206,149,210,239,67,84,164,25,80,84,73,79,206, 184,70,198,221,0,82,73,78,212,145,79,75,197,152,79,211,17,69,69,203,23,83,69,212,198,82,69,83,69,212,199,79,73,78,212,220, 69,206,32,0,0,85,206,138,69,84,85,82,206,142,69,65,196,135,69,83,84,79,82,197,140,69,205,143,69,83,85,77,197,168,73,71,72, 84,164,2,78,196,8,69,78,85,205,171,65,78,68,79,77,73,90,197,185,0,67,82,69,69,206,200,84,79,208,144,87,65,208,164,65,86,197, 190,80,67,168,210,84,69,208,207,71,206,4,81,210,7,73,206,9,84,82,164,19,84,82,73,78,71,164,214,80,65,67,69,164,24,79,85,78, 196,196,84,73,67,203,33,84,82,73,199,34,0,72,69,206,205,82,79,206,162,82,79,70,198,163,65,66,168,206,207,204,65,206,13,0, 83,73,78,199,215,83,210,208,0,65,204,20,65,82,80,84,210,218,0,73,68,84,200,160,65,73,212,150,72,73,76,197,177,69,78,196,178, 82,73,84,197,183,0,79,210,240,0,0,0,171,233,173,234,170,235,175,236,222,237,220,244,167,217,190,230,189,231,188,232,0,121, 121,124,124,127,80,70,60,50,40,122,123,130,107,0,0,173,107,59,100,81,107,168,102,3,99,83,108,32,99,116,101,18,99,25,99,65, 99,40,99,49,100,106,99,79,99,137,99,215,24,180,101,0,78,69,88,84,32,119,105,116,104,111,117,116,32,70,79,82,0,83,121,110, 116,97,120,32,101,114,114,111,114,0,82,69,84,85,82,78,32,119,105,116,104,111,117,116,32,71,79,83,85,66,0,79,117,116,32,111, 102,32,68,65,84,65,0,73,108,108,101,103,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,0,79,118,101,114,102,108, 111,119,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,85,110,100,101,102,105,110,101,100,32,108,105,110,101,32,110, 117,109,98,101,114,0,83,117,98,115,99,114,105,112,116,32,111,117,116,32,111,102,32,114,97,110,103,101,0,68,117,112,108,105, 99,97,116,101,32,68,101,102,105,110,105,116,105,111,110,0,68,105,118,105,115,105,111,110,32,98,121,32,122,101,114,111,0,73, 108,108,101,103,97,108,32,100,105,114,101,99,116,0,84,121,112,101,32,109,105,115,109,97,116,99,104,0,79,117,116,32,111,102, 32,115,116,114,105,110,103,32,115,112,97,99,101,0,83,116,114,105,110,103,32,116,111,111,32,108,111,110,103,0,83,116,114,105, 110,103,32,102,111,114,109,117,108,97,32,116,111,111,32,99,111,109,112,108,101,120,0,67,97,110,39,116,32,99,111,110,116,105, 110,117,101,0,85,110,100,101,102,105,110,101,100,32,117,115,101,114,32,102,117,110,99,116,105,111,110,0,78,111,32,82,69,83, 85,77,69,0,82,69,83,85,77,69,32,119,105,116,104,111,117,116,32,101,114,114,111,114,0,85,110,112,114,105,110,116,97,98,108, 101,32,101,114,114,111,114,0,77,105,115,115,105,110,103,32,111,112,101,114,97,110,100,0,76,105,110,101,32,98,117,102,102, 101,114,32,111,118,101,114,102,108,111,119,0,68,101,118,105,99,101,32,84,105,109,101,111,117,116,0,68,101,118,105,99,101, 32,70,97,117,108,116,0,70,79,82,32,87,105,116,104,111,117,116,32,78,69,88,84,0,79,117,116,32,111,102,32,80,97,112,101,114, 0,63,0,87,72,73,76,69,32,119,105,116,104,111,117,116,32,87,69,78,68,0,87,69,78,68,32,119,105,116,104,111,117,116,32,87,72, 73,76,69,0,70,73,69,76,68,32,111,118,101,114,102,108,111,119,0,73,110,116,101,114,110,97,108,32,101,114,114,111,114,0,66, 97,100,32,102,105,108,101,32,110,117,109,98,101,114,0,70,105,108,101,32,110,111,116,32,102,111,117,110,100,0,66,97,100,32, 102,105,108,101,32,109,111,100,101,0,70,105,108,101,32,97,108,114,101,97,100,121,32,111,112,101,110,0,63,0,68,101,118,105, 99,101,32,73,47,79,32,69,114,114,111,114,0,70,105,108,101,32,97,108,114,101,97,100,121,32,101,120,105,115,116,115,0,63,0, 63,0,68,105,115,107,32,102,117,108,108,0,73,110,112,117,116,32,112,97,115,116,32,101,110,100,0,66,97,100,32,114,101,99,111, 114,100,32,110,117,109,98,101,114,0,66,97,100,32,102,105,108,101,32,110,97,109,101,0,63,0,68,105,114,101,99,116,32,115,116, 97,116,101,109,101,110,116,32,105,110,32,102,105,108,101,0,84,111,111,32,109,97,110,121,32,102,105,108,101,115,0,0,0,0,195, 30,16,0,82,199,79,128,82,199,79,128,228,0,203,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,1,0,0,80,56,0,114,7,254,255,15,7,10,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,7,7,32,0,0,0,0,0,0,0,0,0,0, 1,24,24,0,0,0,0,80,0,1,0,0,0,7,7,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,32,105,110,32,0, 79,107,255,13,0,66,114,101,97,107,0,187,4,0,3,220,67,138,7,67,60,177,117,7,185,6,0,3,217,235,241,60,130,116,1,195,138,15, 67,138,47,67,83,139,217,11,210,135,218,116,4,135,218,59,218,185,16,0,91,116,230,3,217,235,207,185,181,8,233,145,0,205,134, 139,30,46,0,138,199,34,195,254,192,116,9,160,79,3,10,192,178,19,117,77,233,189,38,178,61,185,178,57,185,178,54,185,178,53, 185,178,52,185,178,51,185,178,62,185,178,55,185,178,64,185,178,63,185,178,50,185,178,67,185,178,58,235,34,139,30,55,3,137, 30,46,0,178,2,185,178,11,185,178,1,185,178,10,185,178,18,185,178,20,185,178,6,185,178,22,185,178,13,50,192,162,54,5,162,95, 0,162,98,4,162,96,0,139,30,46,0,137,30,71,3,50,192,162,101,4,162,107,4,138,199,34,195,254,192,116,4,137,30,73,3,185,12,8, 139,30,69,3,233,177,37,89,138,194,138,202,162,40,0,139,30,67,3,137,30,75,3,135,218,139,30,71,3,138,199,34,195,254,192,116, 10,137,30,84,3,135,218,137,30,86,3,139,30,77,3,11,219,135,218,187,79,3,116,11,34,7,117,7,254,15,135,218,233,115,6,50,192, 136,7,138,209,232,8,36,187,180,3,205,135,138,194,60,68,115,8,60,50,115,6,60,31,114,6,176,40,44,19,138,208,46,138,7,67,10, 192,117,248,75,67,254,202,117,242,83,139,30,71,3,94,135,222,86,205,136,46,138,7,60,63,117,6,91,187,180,3,235,212,232,190, 114,91,186,254,255,59,218,205,137,117,3,233,238,117,138,199,34,195,254,192,116,3,232,153,92,176,255,232,241,34,176,89,205, 138,50,192,162,111,0,232,59,60,232,154,35,187,45,7,232,140,114,160,40,0,44,2,117,3,232,238,45,205,139,187,255,255,137,30, 46,0,160,62,3,10,192,116,73,139,30,63,3,83,232,101,92,90,82,232,119,1,176,42,114,2,176,32,232,172,34,232,132,40,90,115,14, 50,192,162,62,3,235,176,50,192,162,62,3,235,21,139,30,65,3,3,218,114,241,82,186,249,255,59,218,90,115,232,137,30,63,3,160, 247,1,10,192,116,170,233,168,45,232,81,40,114,162,232,233,5,254,192,254,200,116,153,156,232,45,7,115,8,232,147,38,117,3,233, 118,254,232,56,4,138,7,60,32,117,3,232,240,91,82,232,49,1,90,157,137,30,67,3,205,140,114,3,233,111,59,82,81,232,238,61,232, 176,5,10,192,156,137,22,73,3,232,240,0,114,9,157,156,117,3,233,176,7,10,192,81,156,83,232,173,26,91,157,89,81,115,3,232,214, 24,90,157,82,116,71,90,160,107,4,10,192,117,8,139,30,10,3,137,30,47,3,139,30,88,3,94,135,222,86,89,83,3,217,83,232,21,91, 91,137,30,88,3,135,218,136,63,89,90,83,67,67,137,23,67,67,186,184,0,73,73,73,73,139,242,172,136,7,67,66,73,138,193,10,197, 117,242,205,141,90,232,30,0,139,30,233,4,137,30,82,3,232,73,35,205,142,139,30,82,3,137,30,233,4,233,216,254,139,30,48,0,135, 218,138,254,138,218,138,7,67,10,7,117,1,195,67,67,67,138,7,10,192,116,16,60,32,115,245,60,11,114,241,232,253,4,232,249,4, 235,236,67,135,218,137,23,235,212,186,0,0,82,116,23,60,44,116,19,90,232,35,6,82,116,29,60,44,116,25,232,175,35,234,116,2, 60,44,186,250,255,116,3,232,12,6,116,7,60,44,116,3,233,99,253,137,30,59,3,135,218,90,94,135,222,86,83,139,30,48,0,139,203, 138,7,67,10,7,159,75,158,116,149,67,67,139,31,59,218,139,217,139,31,245,116,136,245,115,133,235,226,50,192,162,253,2,162, 252,2,205,143,185,59,1,186,184,0,138,7,10,192,117,32,187,64,1,138,195,42,193,138,200,138,199,26,197,138,232,187,183,0,50, 192,139,250,170,66,139,250,170,66,139,250,170,195,60,34,117,3,233,51,0,60,32,116,9,160,252,2,10,192,138,7,116,47,67,80,232, 84,2,88,44,58,116,6,60,74,117,8,176,1,162,252,2,162,253,2,44,85,117,172,80,138,7,10,192,88,116,170,58,7,116,218,80,138,7, 67,232,44,2,235,236,67,10,192,120,146,75,60,63,176,145,82,81,117,3,233,226,0,186,107,3,232,210,14,232,41,36,115,3,233,46, 1,83,186,94,11,232,32,0,117,62,232,240,3,186,98,11,232,21,0,176,137,117,3,235,11,144,186,101,11,232,8,0,117,38,176,141,89, 233,173,0,139,242,46,172,10,192,117,1,195,138,200,232,149,14,58,193,117,246,67,66,235,234,71,79,32,0,84,79,0,85,66,0,91,232, 127,14,83,205,144,187,3,1,44,65,2,192,138,200,181,0,3,217,46,139,23,91,67,83,232,102,14,138,200,139,242,46,172,36,127,117, 3,233,171,1,67,58,193,117,80,139,242,46,172,66,10,192,121,226,138,193,60,40,116,29,139,242,46,172,60,209,116,21,60,208,116, 17,232,54,14,60,46,116,3,232,199,21,176,0,114,3,233,122,1,88,139,242,46,172,205,145,10,192,121,3,233,35,0,89,90,12,128,80, 176,255,232,81,1,50,192,162,253,2,88,232,72,1,233,178,254,91,139,242,46,172,66,10,192,121,247,66,235,141,75,80,205,146,186, 12,12,138,200,139,242,46,172,10,192,116,23,66,58,193,117,243,235,20,140,170,171,169,166,168,212,161,138,147,158,137,142,205, 141,0,50,192,235,2,176,1,162,253,2,88,89,90,60,161,80,117,3,232,250,0,88,60,177,117,5,232,244,0,176,233,60,217,116,3,233, 198,0,80,232,229,0,176,143,232,226,0,88,80,233,173,254,138,7,60,46,116,14,60,58,114,3,233,144,0,60,48,115,3,233,137,0,160, 253,2,10,192,138,7,89,90,121,3,233,98,254,116,39,60,46,117,3,233,89,254,176,14,232,173,0,82,232,232,3,232,253,0,94,135,222, 86,135,218,138,195,232,155,0,138,199,91,232,149,0,233,255,253,82,81,138,7,232,31,93,232,223,0,89,90,83,160,251,2,60,2,117, 26,139,30,163,4,138,199,10,192,176,2,117,14,138,195,138,251,179,15,60,10,115,200,4,17,235,203,80,208,200,4,27,232,92,0,187, 163,4,232,79,14,114,3,187,159,4,88,80,138,7,232,74,0,88,67,254,200,117,244,91,233,173,253,186,106,3,66,139,242,46,172,36, 127,117,3,233,107,0,66,58,7,139,242,46,172,117,235,233,111,0,60,38,116,3,233,197,253,83,232,11,2,91,232,215,12,60,72,176, 11,117,2,176,12,232,11,0,82,81,232,217,12,89,233,92,255,176,58,139,250,170,66,73,138,193,10,197,116,1,195,178,23,233,155, 250,205,147,91,75,254,200,162,253,2,89,90,232,160,12,232,222,255,67,232,153,12,232,240,33,115,244,60,58,115,8,60,48,115,236, 60,46,116,232,233,51,253,138,7,60,32,115,10,60,9,116,6,60,10,116,2,176,32,80,160,253,2,254,192,116,2,254,200,233,159,254, 75,138,7,60,32,116,249,60,9,116,245,60,10,116,241,67,195,176,100,162,57,3,232,210,41,232,85,32,231,82,137,22,59,3,160,251, 2,80,232,123,9,88,83,232,41,16,187,86,4,232,69,86,91,90,89,83,232,157,3,137,30,53,3,187,2,0,3,220,232,115,249,117,30,3,217, 82,75,138,55,75,138,23,67,67,83,139,30,53,3,59,218,91,90,117,229,90,139,227,137,30,69,3,177,90,135,218,177,8,232,227,30,83, 139,30,53,3,94,135,222,86,83,139,30,46,0,94,135,222,86,232,237,31,204,232,26,13,117,3,233,198,249,114,3,233,193,249,156,232, 14,9,157,83,120,3,233,28,0,232,138,93,94,135,222,86,186,1,0,138,7,60,207,117,3,232,212,16,82,83,135,218,232,198,86,235,39, 232,18,93,232,177,85,91,81,82,185,0,129,138,241,138,214,205,148,138,7,60,207,176,1,117,14,232,207,8,83,232,244,92,232,147, 85,232,18,109,91,81,82,138,200,232,186,12,138,232,81,75,232,171,0,116,3,233,71,249,232,129,22,232,160,0,83,83,139,30,90,4, 137,30,46,0,139,30,59,3,94,135,222,86,181,130,81,159,134,196,80,134,196,159,134,196,80,134,196,233,207,100,181,130,81,235, 66,233,203,248,233,18,249,195,232,117,0,235,80,205,149,233,99,15,233,213,2,10,192,117,235,67,138,7,67,10,7,116,224,67,139, 23,67,137,22,46,0,246,6,118,4,255,116,38,83,176,91,232,202,28,135,218,232,112,86,176,93,232,192,28,91,235,19,205,150,232, 155,29,137,38,69,3,137,30,67,3,138,7,60,58,117,191,67,138,7,60,58,114,171,186,232,14,82,116,164,44,129,114,171,60,74,115, 162,50,228,2,192,139,240,205,151,46,255,180,37,0,67,138,7,60,58,114,1,195,60,32,116,244,114,8,60,48,245,254,192,254,200,195, 10,192,116,251,60,11,114,114,60,30,117,6,160,0,3,10,192,195,60,16,116,60,80,67,162,0,3,44,28,115,57,44,245,115,7,60,254,117, 27,138,7,67,137,30,254,2,183,0,138,216,137,30,2,3,176,2,162,1,3,187,4,0,88,10,192,195,138,7,67,67,137,30,254,2,75,138,63, 235,225,232,55,0,139,30,254,2,235,147,254,192,208,192,162,1,3,82,81,186,2,3,135,218,138,232,232,19,85,135,218,89,90,137,30, 254,2,88,187,4,0,10,192,195,60,9,114,3,233,105,255,60,48,245,254,192,254,200,195,160,0,3,60,15,115,23,60,13,114,19,139,30, 2,3,117,10,67,67,67,138,23,67,138,55,135,218,233,106,84,160,1,3,162,251,2,60,8,116,17,139,30,2,3,137,30,163,4,139,30,4,3, 137,30,165,4,195,187,2,3,233,157,84,178,3,185,178,2,185,178,4,185,178,8,232,58,31,185,190,7,81,114,229,44,65,138,200,138, 232,232,5,255,60,234,117,15,232,254,254,232,33,31,114,208,44,65,138,232,232,242,254,138,197,42,193,114,195,254,192,94,135, 222,86,187,96,3,181,0,3,217,136,23,67,254,200,117,249,91,138,7,60,44,117,168,232,206,254,235,181,232,201,254,232,179,14,121, 155,178,5,233,122,247,138,7,60,46,139,22,73,3,117,3,233,178,254,75,232,174,254,60,14,116,2,60,13,139,22,2,3,117,3,233,159, 254,50,192,162,0,3,75,186,0,0,232,147,254,114,1,195,83,159,80,187,152,25,59,218,114,27,138,254,138,218,3,218,3,219,3,218, 3,219,88,158,44,48,138,208,182,0,3,218,135,218,91,235,213,88,158,91,195,117,3,233,124,28,60,14,116,7,60,13,116,3,233,163, 48,232,117,28,185,232,14,235,30,177,3,232,2,28,232,149,255,89,83,83,139,30,46,0,94,135,222,86,176,141,159,134,196,80,134, 196,81,235,4,81,232,123,255,160,0,3,60,13,135,218,116,188,60,14,116,3,233,190,246,135,218,83,139,30,254,2,94,135,222,86,232, 81,0,67,83,139,30,46,0,59,218,91,115,3,232,79,249,114,3,232,70,249,115,13,73,176,13,162,61,3,91,232,252,18,139,217,195,178, 8,233,163,246,205,152,117,246,182,255,232,250,245,139,227,137,30,69,3,60,141,178,3,116,3,233,139,246,91,137,30,46,0,187,232, 14,94,135,222,86,176,91,177,58,235,2,177,0,181,0,138,193,138,205,138,232,75,232,176,253,10,192,116,190,58,197,116,186,67, 60,34,116,233,254,192,116,236,44,140,117,231,58,197,18,198,138,240,235,223,88,4,3,235,20,232,220,37,232,95,28,231,137,22, 59,3,82,160,251,2,80,232,133,5,88,94,135,222,86,138,232,160,251,2,58,197,138,197,116,6,232,37,12,160,251,2,186,163,4,60,5, 114,3,186,159,4,83,60,3,117,49,139,30,163,4,83,67,139,23,139,30,48,0,59,218,115,17,139,30,92,3,59,218,90,115,17,187,44,3, 59,218,115,10,176,90,232,230,22,135,218,232,51,20,232,222,22,94,135,222,86,232,190,82,90,91,195,60,167,117,50,232,24,253, 232,236,27,137,232,95,254,11,210,116,13,232,79,248,138,245,138,209,91,114,3,233,19,255,137,22,77,3,114,218,160,79,3,10,192, 138,194,116,209,160,40,0,138,208,233,206,245,232,229,12,138,7,138,232,60,141,116,5,232,178,27,137,75,138,202,254,201,138, 197,117,3,233,185,252,232,26,254,60,44,117,167,235,238,160,79,3,10,192,117,8,51,192,163,77,3,233,102,245,254,192,162,40,0, 128,63,131,116,18,232,247,253,117,12,11,210,116,16,232,115,254,50,192,162,79,3,195,232,151,252,117,250,235,7,50,192,162,79, 3,254,192,161,71,3,163,46,0,139,30,75,3,117,229,128,63,0,117,3,131,195,4,67,233,23,25,232,112,12,117,218,10,192,117,3,233, 164,253,233,32,245,186,10,0,82,116,31,232,157,253,135,218,94,135,222,86,116,22,135,218,232,38,27,44,139,22,65,3,116,8,232, 147,253,116,3,233,225,244,135,218,138,199,10,195,117,3,233,113,253,137,30,65,3,162,62,3,91,137,30,63,3,89,233,219,245,232, 44,4,138,7,60,44,117,3,232,25,252,60,137,116,5,232,233,26,205,75,83,232,210,81,91,116,25,232,6,252,117,1,195,60,14,117,3, 233,204,253,60,13,116,3,233,224,251,139,30,2,3,195,182,1,232,41,254,10,192,116,246,232,228,251,60,161,117,242,254,206,117, 238,235,209,232,106,1,235,3,232,155,49,75,232,206,251,117,3,232,29,25,117,3,233,63,1,60,215,117,3,233,107,39,60,206,117,3, 233,171,0,60,210,117,3,233,164,0,83,60,44,116,109,60,59,117,3,233,23,1,89,232,169,3,83,232,163,7,116,15,232,65,93,232,194, 18,198,7,32,139,30,163,4,254,7,205,153,139,30,163,4,83,232,57,28,116,13,232,49,1,120,3,233,49,0,232,129,69,235,3,160,41,0, 138,232,254,192,116,35,232,30,28,116,7,232,102,69,138,7,235,3,232,104,59,91,83,10,192,116,14,2,7,245,115,4,254,200,58,197, 114,3,232,153,24,91,232,222,18,91,233,107,255,205,154,185,50,0,139,30,233,4,3,217,232,232,27,138,7,117,24,160,42,0,138,232, 232,50,59,60,255,116,12,58,197,114,3,232,108,24,114,3,233,135,0,44,14,115,252,246,208,235,114,80,232,7,251,232,241,10,88, 80,60,210,116,1,74,138,198,10,192,120,3,233,3,0,186,0,0,83,232,166,27,116,13,232,158,0,120,3,233,21,0,232,238,68,235,3,160, 41,0,138,216,254,192,116,7,183,0,232,124,81,135,218,91,232,161,25,41,75,88,44,210,83,116,19,185,50,0,139,30,233,4,3,217,232, 111,27,138,7,117,3,232,190,58,246,208,2,194,114,16,254,192,116,25,232,246,23,138,194,254,200,121,3,233,13,0,254,192,138,232, 176,32,232,24,23,254,205,117,249,91,232,136,250,233,188,254,205,155,50,192,83,82,81,232,134,44,89,90,50,192,138,248,138,216, 137,30,233,4,91,195,83,50,192,159,134,196,80,134,196,232,233,42,116,3,233,226,242,83,185,46,0,178,2,182,253,3,217,136,55, 176,0,91,233,230,41,232,51,46,10,192,195,60,133,116,3,233,162,51,232,17,25,133,60,35,117,3,233,40,48,232,48,29,232,115,0, 232,122,34,232,68,79,82,83,232,167,28,90,89,115,3,233,69,25,81,82,181,0,232,69,17,91,176,3,233,147,252,63,82,101,100,111, 32,102,114,111,109,32,115,116,97,114,116,13,0,67,138,7,10,192,117,3,233,146,242,60,34,117,242,233,155,0,91,91,235,12,205, 156,160,58,3,10,192,116,3,233,115,242,89,187,16,21,232,11,102,139,30,67,3,195,232,148,47,83,187,246,1,233,224,0,60,35,116, 242,232,190,28,185,140,21,81,60,34,176,0,176,255,162,95,4,117,223,232,219,16,138,7,60,44,117,10,50,192,162,95,4,232,157,249, 235,4,232,111,24,59,83,232,48,17,91,195,83,160,95,4,10,192,116,10,176,63,232,12,22,176,32,232,7,22,232,2,28,89,115,3,233, 161,24,81,50,192,162,58,3,198,7,44,135,218,91,83,82,82,75,176,128,162,57,3,232,94,249,232,165,34,138,7,75,60,40,117,32,67, 181,0,254,197,232,76,249,117,3,233,232,241,60,34,117,3,233,69,255,60,40,116,235,60,41,117,233,254,205,117,229,232,49,249, 116,7,60,44,116,3,233,201,241,94,135,222,86,138,7,60,44,116,3,233,49,255,176,1,162,169,4,232,98,0,160,169,4,254,200,116,3, 233,31,255,83,232,13,5,117,3,232,140,18,91,75,232,251,248,94,135,222,86,138,7,60,44,116,139,91,75,232,236,248,10,192,91,116, 3,233,10,255,198,7,44,235,6,83,139,30,94,3,13,50,192,162,58,3,94,135,222,86,235,4,232,162,23,44,232,24,33,94,135,222,86,82, 138,7,60,44,116,10,160,58,3,10,192,116,3,233,139,0,13,50,192,162,82,4,232,98,25,116,3,233,139,46,232,169,4,80,117,56,232, 155,248,138,240,138,232,60,34,116,14,160,58,3,10,192,138,240,116,2,182,58,181,44,75,232,182,15,88,4,3,138,200,160,82,4,10, 192,117,1,195,138,193,135,218,187,202,22,94,135,222,86,82,233,240,250,232,99,248,88,80,60,5,185,155,22,81,115,3,233,249,82, 233,253,82,75,232,79,248,116,7,60,44,116,3,233,96,254,94,135,222,86,75,232,62,248,116,3,233,107,255,90,160,58,3,10,192,135, 218,116,3,233,53,23,82,91,233,162,253,232,98,250,10,192,117,21,67,138,7,67,10,7,178,4,117,3,233,206,240,67,139,23,67,137, 22,55,3,232,8,248,60,132,117,221,233,79,255,232,213,22,231,233,4,0,232,206,22,40,75,182,0,82,177,1,232,165,21,205,157,232, 178,1,50,192,162,168,4,137,30,82,3,139,30,82,3,89,138,7,137,30,49,3,60,230,115,1,195,60,233,114,117,44,233,138,208,117,12, 160,251,2,60,3,138,194,117,3,233,214,16,60,12,115,229,187,128,3,182,0,3,218,138,197,46,138,55,58,198,115,213,81,185,62,23, 81,138,198,205,158,60,127,116,100,60,81,114,109,36,254,60,122,116,103,160,251,2,44,3,117,3,233,61,240,10,192,255,54,163,4, 121,3,233,17,0,255,54,165,4,122,3,233,8,0,255,54,159,4,255,54,161,4,4,3,138,202,138,232,81,185,35,24,81,139,30,49,3,233,99, 255,182,0,44,230,114,52,60,3,115,48,60,1,208,208,50,198,58,198,138,240,115,3,233,222,239,137,30,49,3,232,54,247,235,224,232, 101,83,232,55,76,185,41,101,182,127,235,201,82,232,179,83,90,83,185,49,27,235,190,138,197,60,100,114,1,195,81,82,186,4,100, 187,3,27,83,232,17,3,116,3,233,118,255,139,30,163,4,83,185,200,37,235,156,89,138,193,162,252,2,160,251,2,58,197,117,13,60, 2,116,40,60,4,117,3,233,127,0,115,57,138,240,138,197,60,8,116,46,138,198,60,8,116,87,138,197,60,4,116,102,138,198,60,3,117, 3,233,124,239,115,101,187,170,3,181,0,3,217,3,217,46,138,15,67,46,138,47,90,139,30,163,4,81,195,232,12,83,232,37,76,91,137, 30,161,4,91,137,30,159,4,89,90,232,90,75,232,247,82,187,150,3,160,252,2,208,192,2,195,138,216,18,199,42,195,138,248,46,139, 31,255,227,138,197,80,232,246,75,88,162,251,2,60,4,116,211,91,137,30,163,4,235,209,232,151,82,89,90,187,160,3,235,205,91, 232,97,75,232,101,74,232,40,75,91,137,30,165,4,91,137,30,163,4,235,229,83,135,218,232,80,74,91,232,69,75,232,73,74,233,59, 76,232,51,246,117,3,233,228,238,115,3,233,204,80,232,78,22,114,3,233,219,0,60,32,115,3,233,127,246,205,159,254,192,117,3, 233,106,1,254,200,60,233,116,213,60,234,117,3,233,175,0,60,34,117,3,233,45,13,60,211,117,3,233,236,1,60,38,117,3,233,209, 0,60,213,117,12,232,232,245,160,40,0,83,232,67,2,91,195,60,212,117,13,232,216,245,83,139,30,71,3,232,247,74,91,195,60,218, 117,46,232,199,245,232,155,20,40,60,35,117,13,232,184,5,83,232,64,38,135,218,91,233,3,0,232,249,30,232,131,20,41,83,135,218, 11,219,117,3,233,221,246,232,141,75,91,195,60,208,117,3,233,0,2,60,216,117,3,233,139,16,60,200,117,3,233,208,59,60,220,117, 3,233,76,46,60,222,117,3,233,249,18,60,214,117,3,233,112,15,60,133,117,3,233,56,42,60,219,117,3,233,164,59,60,209,117,3,233, 126,2,232,96,253,232,46,20,41,195,182,125,232,93,253,139,30,82,3,83,232,214,99,91,195,232,148,29,83,135,218,137,30,163,4, 232,65,1,116,3,232,175,74,91,195,138,7,60,97,114,249,60,123,115,245,36,95,195,60,38,116,3,233,108,246,186,0,0,232,24,245, 232,229,255,60,79,116,57,60,72,117,52,181,5,67,138,7,232,213,255,232,42,21,135,218,115,10,60,58,115,77,44,48,114,73,235,6, 60,71,115,67,44,55,3,219,3,219,3,219,3,219,10,195,138,216,135,218,254,205,117,209,233,140,237,75,232,213,244,135,218,115, 36,60,56,114,3,233,107,237,185,208,7,81,3,219,114,156,3,219,114,152,3,219,114,148,89,181,0,44,48,138,200,3,217,135,218,235, 213,232,153,74,135,218,195,67,138,7,44,129,60,7,117,14,83,232,154,244,60,40,91,116,3,233,224,73,176,7,181,0,208,192,138,200, 81,232,134,244,138,193,60,5,115,34,232,131,252,232,81,19,44,232,148,73,135,218,139,30,163,4,94,135,222,86,83,135,218,232, 101,4,135,218,94,135,222,86,235,33,232,254,254,94,135,222,86,138,195,60,12,114,11,60,27,205,161,83,115,3,232,123,80,91,186, 213,25,82,176,1,162,168,4,185,185,0,205,160,3,217,46,255,39,254,206,60,234,116,133,60,45,116,129,254,198,60,43,117,1,195, 60,233,116,251,159,75,158,195,254,192,18,192,89,34,197,4,255,26,192,232,248,73,235,15,182,90,232,18,252,232,146,80,247,211, 137,30,163,4,89,233,25,252,160,251,2,60,8,254,200,254,200,254,200,195,138,197,80,232,118,80,88,90,60,122,117,3,233,137,74, 60,123,117,3,233,102,72,185,12,101,81,60,70,117,3,11,218,195,60,80,117,3,35,218,195,60,60,117,3,51,218,195,60,50,117,5,51, 218,247,211,195,247,211,35,218,247,211,195,43,218,233,207,72,160,99,0,235,3,232,175,51,254,192,138,216,50,192,138,248,233, 132,73,232,46,0,82,232,49,254,94,135,222,86,139,23,128,250,255,117,3,233,188,244,14,187,7,101,83,255,54,80,3,82,160,251,2, 80,60,3,117,3,232,247,12,88,135,218,187,163,4,203,232,97,243,185,0,0,60,27,115,16,60,17,114,12,232,83,243,160,2,3,10,192, 208,208,138,200,135,218,187,18,0,3,217,135,218,195,232,217,255,82,232,16,18,231,232,194,6,94,135,222,86,137,23,91,195,60, 208,116,233,60,209,116,28,232,249,17,83,232,245,17,69,232,241,17,71,140,218,116,7,232,233,17,231,232,155,6,137,22,80,3,195, 232,243,1,232,224,1,135,218,137,23,135,218,138,7,60,40,116,3,233,50,245,232,241,242,232,63,27,138,7,60,41,117,3,233,35,245, 232,185,17,44,235,238,232,201,1,160,251,2,10,192,80,137,30,82,3,135,218,139,31,11,219,117,3,233,116,235,138,7,60,40,116,3, 233,206,0,232,187,242,137,30,49,3,135,218,139,30,82,3,232,133,17,40,50,192,80,83,135,218,176,128,162,57,3,232,240,26,135, 218,94,135,222,86,160,251,2,80,82,232,155,250,137,30,82,3,91,137,30,49,3,88,232,65,1,177,4,232,55,16,187,248,255,3,220,139, 227,232,249,71,160,251,2,80,139,30,82,3,138,7,60,41,116,19,232,59,17,44,83,139,30,49,3,232,50,17,44,235,177,88,162,228,3, 88,10,192,116,78,162,251,2,187,0,0,3,220,232,191,71,187,8,0,3,220,139,227,90,179,3,254,195,74,139,242,172,10,192,120,246, 74,74,74,160,251,2,2,195,138,232,160,228,3,138,200,2,197,60,100,114,3,233,84,243,80,138,195,181,0,187,230,3,3,217,138,200, 232,223,0,185,197,28,81,81,233,153,244,139,30,82,3,232,250,241,83,139,30,49,3,232,201,16,41,176,82,137,30,49,3,160,124,3, 4,4,80,208,200,138,200,232,150,15,88,138,200,246,208,254,192,138,216,183,255,3,220,139,227,83,186,122,3,232,158,0,91,137, 30,122,3,139,30,228,3,137,30,124,3,139,203,187,126,3,186,230,3,232,134,0,138,248,138,216,137,30,228,3,139,30,80,4,67,137, 30,80,4,138,199,10,195,162,77,4,139,30,49,3,232,144,249,75,232,141,241,116,3,233,41,234,232,141,253,117,17,186,44,3,139,30, 163,4,59,218,114,6,232,124,8,232,230,8,139,30,122,3,138,247,138,211,67,67,138,15,67,138,47,65,65,65,65,187,122,3,232,47,0, 135,218,139,227,139,30,80,4,75,137,30,80,4,138,199,10,195,162,77,4,91,88,83,36,7,187,140,3,138,200,181,0,3,217,232,252,252, 91,195,139,242,172,136,7,67,66,73,138,197,10,193,117,242,195,83,139,30,46,0,67,11,219,91,117,244,178,12,233,206,233,232,231, 15,209,176,128,162,57,3,10,7,138,200,233,91,25,60,126,116,3,233,157,233,67,138,7,67,60,131,117,3,233,164,12,60,160,117,3, 233,175,55,60,162,117,3,233,192,56,233,129,233,232,117,4,135,218,236,233,57,253,232,97,4,82,232,167,15,44,232,203,0,90,195, 232,240,255,238,195,232,235,255,82,80,178,0,75,232,186,240,116,7,232,140,15,44,232,176,0,88,138,240,94,135,222,86,160,94, 0,10,192,117,11,135,218,236,135,218,50,194,34,198,116,238,91,195,233,52,233,60,35,116,60,232,150,248,232,145,252,117,88,232, 125,32,138,198,182,0,246,208,10,192,121,3,233,179,241,138,208,82,232,72,15,44,232,108,0,90,159,134,196,80,134,196,83,82,138, 194,2,192,138,208,176,20,159,134,196,80,134,196,233,8,32,232,80,240,232,76,0,80,232,32,15,44,232,68,0,88,83,82,232,199,32, 232,50,58,10,192,121,3,233,113,241,67,90,136,23,91,195,232,46,0,232,184,51,162,41,0,44,14,115,252,4,28,246,208,254,192,2, 194,162,42,0,195,232,19,240,232,26,248,83,232,156,76,135,218,91,138,198,10,192,195,232,1,240,232,8,248,232,235,255,116,3, 233,50,241,75,232,242,239,138,194,195,232,127,245,75,232,232,239,205,162,89,232,242,234,81,232,25,40,139,30,59,3,75,232,214, 239,116,14,232,168,14,44,232,195,31,178,2,50,192,232,150,33,187,255,255,137,30,46,0,232,117,16,117,5,176,1,162,111,0,91,90, 138,15,67,138,47,67,138,197,10,193,117,3,233,61,233,232,144,224,117,3,232,7,13,81,138,15,67,138,47,67,81,94,135,222,86,135, 218,59,218,89,115,3,233,30,233,94,135,222,86,83,81,135,218,137,30,73,3,232,170,69,91,138,7,60,9,116,5,176,32,232,243,11,232, 24,0,187,247,1,232,5,0,232,179,12,235,151,138,7,10,192,117,1,195,232,105,23,67,235,243,185,247,1,182,255,50,192,162,252,2, 50,192,162,94,4,232,121,39,235,6,65,67,254,206,116,223,138,7,10,192,139,249,170,116,214,60,11,114,40,60,32,138,208,114,56, 60,34,117,10,160,252,2,52,1,162,252,2,176,34,60,58,117,16,160,252,2,208,216,114,7,208,208,36,253,162,252,2,176,58,10,192, 121,3,233,60,0,138,208,60,46,116,9,232,87,1,115,4,50,192,235,24,160,94,4,10,192,116,15,254,192,117,11,176,32,139,249,170, 65,254,206,117,1,195,176,1,162,94,4,138,194,60,11,114,7,60,32,115,3,233,55,1,139,249,170,235,130,160,252,2,208,216,114,67, 208,216,208,216,115,82,138,7,60,217,83,81,187,165,32,83,117,207,73,139,241,172,60,77,117,199,73,139,241,172,60,69,117,191, 73,139,241,172,60,82,117,183,73,139,241,172,60,58,117,175,88,88,91,254,198,254,198,254,198,254,198,235,45,89,91,138,7,233, 53,255,160,252,2,12,2,162,252,2,50,192,195,160,252,2,12,4,235,243,208,208,114,231,138,7,60,132,117,3,232,225,255,60,143,117, 3,232,229,255,138,7,254,192,138,7,117,5,67,138,7,36,127,67,60,161,117,3,232,248,67,60,177,117,10,138,7,67,60,233,176,177, 116,1,75,83,81,82,205,163,187,54,1,138,232,177,64,254,193,67,138,247,138,211,46,138,7,10,192,116,242,159,67,158,121,244,46, 138,7,58,197,117,232,135,218,60,208,116,2,60,209,138,193,90,89,138,208,117,12,160,94,4,10,192,176,0,162,94,4,235,21,60,91, 117,7,50,192,162,94,4,235,29,160,94,4,10,192,176,255,162,94,4,116,13,176,32,139,249,170,65,254,206,117,3,233,164,5,138,194, 235,6,46,138,7,67,138,208,36,127,139,249,170,65,254,206,117,3,233,141,5,10,194,121,233,60,168,117,5,50,192,162,94,4,91,233, 100,254,232,191,13,114,1,195,60,48,114,251,60,58,245,195,75,232,136,237,82,81,80,232,33,238,88,185,181,33,81,60,11,117,3, 233,96,66,60,12,117,3,233,99,66,139,30,2,3,233,19,79,89,90,160,0,3,178,79,60,11,116,6,60,12,178,72,117,20,176,38,139,249, 170,65,254,206,116,192,138,194,139,249,170,65,254,206,116,182,160,1,3,60,4,178,0,114,6,178,33,116,2,178,35,138,7,60,32,117, 3,232,82,67,138,7,67,10,192,116,42,139,249,170,65,254,206,116,143,160,1,3,60,4,114,234,159,73,158,139,241,172,159,65,158, 117,4,60,46,116,8,60,68,116,4,60,69,117,211,178,0,235,207,138,194,10,192,116,9,139,249,170,65,254,206,117,1,195,139,30,254, 2,233,174,253,232,241,231,81,232,245,1,89,90,81,81,232,32,232,115,11,138,247,138,211,94,135,222,86,83,59,218,114,3,233,0, 238,187,45,7,232,246,88,89,187,221,9,94,135,222,86,135,218,139,30,88,3,139,242,172,139,249,170,65,66,59,218,117,244,139,217, 137,30,88,3,195,232,50,0,232,195,36,30,142,30,80,3,138,7,31,233,238,248,232,22,0,82,232,177,36,232,89,11,44,232,125,252,90, 6,142,6,80,3,139,250,170,7,195,232,122,244,83,232,4,0,135,218,91,195,185,173,107,81,232,105,248,120,246,205,164,160,166,4, 60,144,117,237,232,171,88,120,232,232,130,72,185,128,145,186,0,0,233,58,64,185,10,0,81,138,245,138,213,116,53,60,44,116,11, 82,232,116,237,138,238,138,202,90,116,38,232,0,11,44,232,102,237,116,29,88,232,246,10,44,82,232,104,237,116,3,233,182,228, 11,210,117,3,233,74,237,135,218,94,135,222,86,135,218,81,232,76,231,90,82,81,232,70,231,139,217,90,59,218,135,218,115,3,233, 44,237,90,89,88,83,82,235,21,3,217,115,3,233,30,237,135,218,83,187,249,255,59,218,91,115,3,233,16,237,82,139,23,11,210,135, 218,90,116,12,138,7,67,10,7,159,75,158,135,218,117,213,81,232,36,0,89,90,91,82,139,23,67,11,210,116,20,135,218,94,135,222, 86,135,218,67,137,23,135,218,3,217,135,218,91,235,228,185,181,8,81,60,13,50,192,162,61,3,139,30,48,0,75,67,138,7,67,10,7, 117,1,195,67,139,23,67,232,123,235,10,192,116,236,138,200,160,61,3,10,192,138,193,116,91,205,165,60,167,117,24,232,99,235, 60,137,117,228,232,92,235,60,14,117,221,82,232,172,236,11,210,117,10,235,41,60,14,117,204,82,232,158,236,83,232,140,230,159, 73,158,176,13,114,63,232,120,8,187,252,35,82,232,105,87,91,232,96,65,89,91,83,81,232,81,65,91,90,75,235,163,85,110,100,101, 102,105,110,101,100,32,108,105,110,101,32,0,60,13,117,234,82,232,97,236,83,135,218,67,67,67,138,15,67,138,47,176,14,187,247, 35,83,139,30,254,2,83,75,136,47,75,136,15,75,136,7,91,195,160,61,3,10,192,116,248,233,73,255,232,178,9,66,232,174,9,65,232, 170,9,83,232,166,9,69,160,93,4,10,192,116,3,233,110,227,83,139,30,90,3,135,218,139,30,92,3,59,218,116,3,233,92,227,91,138, 7,44,48,115,3,233,73,227,60,2,114,3,233,66,227,162,92,4,254,192,162,93,4,232,150,234,195,46,138,7,10,192,116,248,232,3,0, 67,235,243,159,134,196,80,134,196,233,25,7,116,9,232,132,242,83,232,6,71,235,32,83,187,210,36,232,165,86,232,225,12,90,115, 3,233,143,9,82,67,138,7,232,0,69,138,7,10,192,117,228,232,228,70,137,30,12,0,232,158,63,91,195,82,97,110,100,111,109,32,110, 117,109,98,101,114,32,115,101,101,100,32,40,45,51,50,55,54,56,32,116,111,32,51,50,55,54,55,41,0,177,29,235,2,177,26,181,0, 135,218,139,30,46,0,137,30,90,4,135,218,254,197,75,232,12,234,116,23,60,34,117,11,232,3,234,10,192,116,12,60,34,117,245,60, 161,116,29,60,205,117,228,10,192,117,21,67,138,7,67,10,7,138,209,117,3,233,157,226,67,139,23,67,137,22,90,4,232,215,233,60, 143,117,7,81,232,17,236,89,235,217,60,132,117,7,81,232,2,236,89,235,206,138,193,60,26,138,7,116,13,60,177,116,163,60,178, 117,161,254,205,117,157,195,60,130,116,150,60,131,117,148,254,205,116,243,232,157,233,116,168,135,218,139,30,46,0,83,139, 30,90,4,137,30,46,0,135,218,81,232,215,17,89,75,232,129,233,186,42,37,116,8,232,80,8,44,75,186,121,37,94,135,222,86,137,30, 46,0,91,82,195,159,80,160,168,4,162,169,4,88,158,159,80,50,192,162,168,4,88,158,195,232,219,2,138,7,67,138,15,67,138,47,90, 81,80,232,214,2,88,138,240,138,23,67,138,15,67,138,47,91,138,194,10,198,117,1,195,138,198,44,1,114,249,50,192,58,194,254, 192,115,241,254,206,254,202,139,241,172,65,58,7,159,67,158,116,220,245,233,114,63,232,247,61,235,8,232,252,61,235,3,232,174, 74,232,47,0,232,137,2,185,23,41,81,138,7,67,83,232,171,0,91,138,15,67,138,47,232,13,0,83,138,216,232,91,2,90,195,176,1,232, 149,0,187,44,3,83,136,7,67,137,23,91,195,75,181,34,138,245,83,177,255,67,138,7,254,193,10,192,116,8,58,198,116,4,58,197,117, 239,60,34,117,3,232,177,232,83,138,197,60,44,117,13,254,193,254,201,116,7,75,138,7,60,32,116,245,91,94,135,222,86,67,135, 218,138,193,232,180,255,186,44,3,176,82,139,30,12,3,137,30,163,4,176,3,162,251,2,232,23,62,186,47,3,59,218,137,30,12,3,91, 138,7,117,155,186,16,0,233,34,225,67,232,146,255,232,236,1,232,124,62,254,198,254,206,116,133,139,241,172,232,217,4,60,13, 117,3,232,165,5,65,235,236,10,192,235,2,88,158,159,80,139,30,92,3,135,218,139,30,47,3,246,208,138,200,181,255,3,217,67,59, 218,114,15,137,30,47,3,67,135,218,88,158,195,88,134,196,158,195,88,158,186,14,0,117,3,233,202,224,58,192,159,80,185,218,38, 81,139,30,10,3,137,30,47,3,187,0,0,83,139,30,92,3,83,187,14,3,139,22,12,3,59,218,185,42,39,116,3,233,156,0,187,226,3,137, 30,78,4,139,30,90,3,137,30,75,4,139,30,88,3,139,22,75,4,59,218,116,27,138,7,67,67,67,80,232,69,19,88,60,3,117,5,232,113,0, 50,192,138,208,182,0,3,218,235,221,139,30,78,4,139,23,11,210,139,30,90,3,116,25,135,218,137,30,78,4,67,67,139,23,67,67,135, 218,3,218,137,30,75,4,135,218,235,183,89,139,22,92,3,59,218,117,3,233,108,0,138,7,67,80,67,67,232,248,18,138,15,67,138,47, 67,88,83,3,217,60,3,117,221,137,30,51,3,91,138,15,181,0,3,217,3,217,67,135,218,139,30,51,3,135,218,59,218,116,196,185,197, 39,81,50,192,10,7,159,67,158,138,23,159,67,158,138,55,159,67,158,117,1,195,139,203,139,30,47,3,59,218,139,217,114,243,91, 94,135,222,86,59,218,94,135,222,86,83,139,217,115,227,89,88,88,83,82,81,195,90,91,11,219,116,249,75,138,47,75,138,15,83,75, 138,31,183,0,3,217,138,245,138,209,75,139,203,139,30,47,3,232,160,60,91,136,15,67,136,47,139,217,75,233,224,254,81,83,139, 30,163,4,94,135,222,86,232,160,240,94,135,222,86,232,237,59,138,7,83,139,30,163,4,83,2,7,186,15,0,115,3,233,120,223,232,219, 253,90,232,72,0,94,135,222,86,232,63,0,83,139,30,45,3,135,218,232,14,0,232,11,0,187,58,23,94,135,222,86,83,233,7,254,91,94, 135,222,86,138,7,67,138,15,67,138,47,138,216,254,195,254,203,117,1,195,139,241,172,139,250,170,65,66,235,241,232,146,59,139, 30,163,4,135,218,232,32,0,135,218,117,229,82,138,245,138,209,74,138,15,139,30,47,3,59,218,117,10,50,192,138,232,3,217,137, 30,47,3,91,195,205,238,139,30,12,3,75,138,47,75,138,15,75,59,218,117,238,137,30,12,3,195,185,127,27,81,232,183,255,50,192, 138,240,138,7,10,192,195,185,127,27,81,232,237,255,117,3,233,85,231,67,139,23,139,242,172,195,232,46,253,232,14,246,139,30, 45,3,136,23,89,233,114,253,232,255,229,232,211,4,40,232,247,245,82,232,203,4,44,232,250,237,232,196,4,41,94,135,222,86,83, 232,236,241,116,5,232,225,245,235,3,232,185,255,90,232,5,0,232,213,245,176,32,80,138,194,232,236,252,138,232,88,254,197,254, 205,116,188,139,30,45,3,136,7,67,254,205,117,249,235,175,232,163,0,50,192,94,135,222,86,138,200,176,83,83,138,7,58,197,114, 3,138,197,186,177,0,81,232,81,253,89,91,83,67,138,47,67,138,63,138,221,181,0,3,217,139,203,232,168,252,138,216,232,247,254, 90,232,13,255,233,232,252,232,102,0,90,82,139,242,172,42,197,235,188,135,218,138,7,232,92,0,254,197,254,205,117,3,233,152, 230,81,232,181,1,88,134,196,158,94,135,222,86,185,117,41,81,254,200,58,7,181,0,114,1,195,138,200,138,7,42,193,58,194,138, 232,114,243,138,234,195,232,0,255,117,3,233,142,241,138,208,67,139,31,83,3,218,138,47,136,55,94,135,222,86,81,75,232,23,229, 232,190,63,89,91,136,47,195,135,218,232,225,3,41,89,90,81,138,234,195,232,0,229,232,3,237,232,2,241,176,1,80,116,22,88,232, 243,244,10,192,117,3,233,38,230,80,232,189,3,44,232,236,236,232,253,57,232,179,3,44,83,139,30,163,4,94,135,222,86,232,217, 236,232,163,3,41,83,232,80,254,135,218,89,91,88,81,185,7,101,81,185,127,27,81,80,82,232,68,254,90,88,138,232,254,200,138, 200,58,7,176,0,115,162,139,242,172,10,192,138,197,116,153,138,7,67,138,47,67,138,63,138,221,181,0,3,217,42,193,138,232,81, 82,94,135,222,86,138,15,67,139,23,91,83,82,81,139,242,172,58,7,117,30,66,254,201,116,12,67,254,205,117,239,90,90,89,90,50, 192,195,91,90,90,89,138,197,42,199,2,193,254,192,195,89,90,91,67,254,205,117,208,235,229,232,33,3,40,232,151,12,232,97,57, 83,82,135,218,67,139,23,139,30,92,3,59,218,114,18,139,30,48,0,59,218,115,10,91,83,232,46,251,91,83,232,190,57,91,94,135,222, 86,232,241,2,44,232,21,244,10,192,117,3,233,75,229,80,138,7,232,102,0,82,232,4,236,83,232,138,253,135,218,91,89,88,138,232, 94,135,222,86,83,187,7,101,94,135,222,86,138,193,10,192,116,144,138,7,42,197,115,3,233,27,229,254,192,58,193,114,2,138,193, 138,205,254,201,181,0,82,67,138,23,67,138,63,138,218,3,217,138,232,90,135,218,138,15,67,139,31,135,218,138,193,10,192,117, 1,195,139,242,172,136,7,66,67,254,201,116,244,254,205,117,241,195,178,255,60,41,116,7,232,113,2,44,232,149,243,232,106,2, 41,195,232,150,239,116,3,233,6,0,232,18,253,232,124,251,139,22,92,3,139,30,47,3,233,203,239,205,180,159,134,196,80,134,196, 83,232,37,4,116,3,233,221,23,91,88,134,196,158,81,159,80,235,18,50,192,162,79,3,233,147,229,25,254,200,232,99,35,176,8,235, 56,60,9,117,16,176,32,232,202,255,232,78,35,36,7,117,244,88,158,89,195,60,32,114,32,160,41,0,138,232,232,58,35,254,197,116, 11,254,205,58,197,117,3,232,114,0,116,9,60,255,116,5,254,192,232,39,35,88,158,89,159,80,88,158,232,124,34,195,205,181,232, 188,3,116,61,232,182,23,115,243,81,82,83,160,54,5,36,200,162,54,5,232,204,24,91,90,89,160,107,4,10,192,116,3,233,10,49,160, 239,4,10,192,116,7,187,232,14,83,233,237,0,83,81,82,187,45,7,232,2,79,90,89,176,13,91,195,232,18,33,195,232,204,34,10,192, 116,248,235,11,198,7,0,232,106,3,187,246,1,117,7,205,182,176,13,232,45,255,232,91,3,116,3,50,192,195,50,192,232,172,34,50, 192,195,205,183,160,94,0,10,192,117,1,195,232,196,255,117,3,232,220,1,233,144,1,232,239,50,83,232,175,32,116,33,232,176,255, 10,192,117,16,80,176,2,232,139,249,139,30,45,3,90,137,23,233,208,249,80,232,123,249,88,138,208,232,74,252,187,6,0,137,30, 163,4,176,3,162,251,2,91,195,83,139,30,10,3,181,0,3,217,3,217,176,38,42,195,138,216,176,255,26,199,138,248,114,6,3,220,91, 115,1,195,139,30,44,0,75,75,137,30,69,3,186,7,0,233,212,218,57,30,47,3,115,233,81,82,83,232,6,250,91,90,89,57,30,47,3,115, 218,235,227,117,214,139,30,48,0,232,121,1,162,100,4,162,62,3,162,61,3,136,7,67,136,7,67,137,30,88,3,205,174,139,30,48,0,75, 205,175,137,30,59,3,160,101,4,10,192,117,23,50,192,162,93,4,162,92,4,181,26,187,96,3,205,176,198,7,4,67,254,205,117,248,186, 7,0,187,11,0,232,198,55,50,192,162,79,3,138,216,138,248,137,30,77,3,137,30,86,3,139,30,10,3,160,107,4,10,192,117,4,137,30, 47,3,50,192,232,124,0,139,30,88,3,137,30,90,3,137,30,92,3,160,101,4,10,192,117,3,232,180,21,160,54,5,36,1,117,3,162,54,5, 89,139,30,44,0,75,75,137,30,69,3,67,67,205,177,139,227,187,14,3,137,30,12,3,232,243,247,232,202,230,50,192,138,248,138,216, 137,30,124,3,162,77,4,137,30,228,3,137,30,80,4,137,30,122,3,162,57,3,83,81,139,30,59,3,195,59,218,195,94,139,251,252,46,166, 86,139,223,117,10,138,7,60,58,114,1,195,233,28,225,233,178,217,135,218,139,30,48,0,116,17,135,218,232,82,226,83,232,74,220, 139,217,90,114,3,233,11,227,75,137,30,94,3,135,218,195,117,253,254,192,235,9,117,247,156,117,3,232,159,10,157,137,30,67,3, 187,14,3,137,30,12,3,187,12,255,89,139,30,46,0,83,156,138,195,34,199,254,192,116,12,137,30,84,3,139,30,67,3,137,30,86,3,232, 245,253,157,187,50,7,116,3,233,20,218,233,65,218,176,15,80,176,94,232,41,253,88,4,64,232,35,253,233,236,253,139,30,86,3,11, 219,186,17,0,117,3,233,69,217,139,22,84,3,137,22,46,0,195,184,50,192,162,118,4,195,232,200,8,82,83,187,110,4,232,11,54,139, 30,90,3,94,135,222,86,232,108,236,80,232,55,255,44,232,173,8,88,138,232,232,94,236,58,197,116,3,233,8,217,94,135,222,86,135, 218,83,139,30,90,3,59,218,117,19,90,91,94,135,222,86,82,232,210,53,91,186,110,4,232,203,53,91,195,233,102,225,176,1,162,57, 3,232,115,8,117,243,83,162,57,3,138,253,138,217,73,73,73,139,241,172,73,10,192,120,248,73,73,3,218,135,218,139,30,92,3,59, 218,139,242,172,139,249,170,159,66,158,159,65,158,117,240,73,139,217,137,30,92,3,91,138,7,60,44,117,183,232,226,223,235,182, 88,134,196,158,91,195,138,7,60,65,114,249,60,91,245,195,233,238,253,116,251,60,44,116,9,232,251,224,75,232,192,223,116,238, 232,146,254,44,116,232,139,22,44,0,60,44,116,3,232,71,0,75,232,169,223,82,116,78,232,122,254,44,116,72,232,55,0,75,232,153, 223,116,3,233,53,216,94,135,222,86,83,187,238,0,59,218,115,45,91,232,54,0,114,39,83,139,30,88,3,185,20,0,3,217,59,218,115, 25,135,218,137,30,10,3,91,137,30,44,0,91,235,150,232,240,242,11,210,117,3,233,152,224,195,233,47,253,139,22,44,0,43,22,10, 3,235,186,139,195,43,194,139,208,195,205,178,83,139,30,233,4,11,219,91,195,1,48,78,48,225,48,253,47,241,47,91,48,48,48,27, 48,139,30,86,0,232,74,0,116,1,195,235,4,176,1,235,2,176,255,162,112,0,254,192,232,101,1,183,1,232,11,0,117,232,232,11,31, 232,94,0,50,192,195,160,92,0,58,195,116,248,115,7,138,216,50,192,233,245,30,254,195,233,240,30,160,91,0,58,195,116,227,176, 1,58,195,116,221,254,203,233,222,30,160,41,0,58,199,116,209,254,199,233,210,30,139,30,91,0,183,1,137,30,88,0,233,197,30,139, 30,86,0,232,9,0,117,182,160,41,0,138,248,235,197,176,1,58,199,116,169,254,207,233,170,30,160,91,0,138,248,160,92,0,138,216, 42,199,114,150,254,192,80,232,153,0,160,88,0,254,195,58,195,254,203,115,13,58,199,114,9,117,2,176,1,254,200,162,88,0,88,254, 200,117,3,233,3,0,232,222,30,195,160,91,0,138,216,160,92,0,138,248,42,195,114,241,254,192,80,232,127,0,160,88,0,58,195,114, 16,58,199,120,3,233,9,0,117,2,176,255,254,192,162,88,0,88,254,200,116,207,233,187,30,139,30,91,0,160,93,0,138,232,138,197, 58,195,115,2,138,216,58,199,115,2,138,248,138,199,183,0,42,195,254,192,186,114,0,80,135,218,3,218,136,7,67,136,7,67,254,200, 117,249,135,218,88,50,192,162,88,0,162,89,0,162,90,0,233,43,255,80,232,55,0,181,1,138,200,138,197,139,250,170,74,139,242, 172,138,233,138,200,88,254,200,117,1,195,80,235,234,80,181,1,232,23,0,138,200,138,197,139,250,170,66,139,242,172,138,233, 138,200,88,254,200,116,226,80,235,235,83,186,116,0,183,0,254,203,3,218,138,7,135,218,91,34,192,195,83,186,116,0,183,0,254, 203,3,218,136,7,135,218,91,195,205,166,232,65,1,139,30,86,0,137,30,88,0,160,41,0,254,192,235,30,176,63,232,12,250,176,32, 232,7,250,50,192,162,39,0,205,167,232,30,1,139,30,86,0,137,30,88,0,138,199,162,90,0,232,225,4,254,203,116,5,176,1,232,175, 255,232,12,35,232,65,35,232,164,27,232,8,35,232,56,35,10,192,117,3,232,119,28,80,139,30,86,0,138,38,41,0,254,196,58,30,88, 0,117,18,58,62,89,0,115,4,136,62,89,0,58,62,90,0,118,6,138,231,136,38,90,0,88,232,47,0,114,16,116,187,232,3,2,232,153,249, 235,179,1,232,147,249,235,173,60,3,249,116,1,245,187,246,1,195,60,59,117,251,233,248,220,75,67,254,201,120,242,46,58,7,117, 246,195,187,148,50,177,14,232,236,255,121,3,233,7,0,80,50,192,162,114,0,88,187,162,50,177,12,232,216,255,121,3,233,32,0,80, 138,193,10,192,208,192,138,200,50,192,138,232,187,174,50,3,217,46,138,23,67,46,138,55,88,82,139,30,86,0,195,10,192,195,3, 34,192,195,139,30,86,0,128,255,1,117,11,254,203,232,215,254,117,7,138,62,41,0,232,144,28,233,222,249,195,13,2,6,5,3,11,12, 28,29,30,31,14,127,27,9,10,8,18,2,6,5,3,13,14,127,27,255,52,86,52,202,52,57,51,175,51,7,53,37,53,77,53,1,52,119,52,243,50, 193,51,232,13,253,116,200,88,181,254,187,247,1,232,65,249,136,7,60,13,116,17,60,10,117,6,138,197,60,254,116,237,67,254,205, 117,232,254,205,50,192,136,7,187,246,1,195,160,114,0,10,192,116,58,232,97,254,80,135,218,198,7,0,135,218,254,195,232,41,3, 160,41,0,42,199,116,11,254,192,80,232,245,0,88,254,200,117,247,139,30,86,0,232,59,254,88,138,200,50,192,139,250,170,66,138, 193,139,250,170,50,192,195,176,10,10,192,195,232,90,2,186,247,1,181,254,160,88,0,58,195,183,1,160,41,0,117,19,139,30,88,0, 82,232,9,254,90,160,41,0,116,5,160,90,0,254,200,162,90,0,232,60,2,138,197,34,192,116,16,82,232,238,253,90,117,9,183,1,254, 195,160,41,0,235,228,135,218,176,254,42,198,138,240,75,138,7,60,32,116,8,10,192,117,7,254,206,116,3,75,235,239,67,198,7,0, 135,218,176,13,80,183,1,232,124,27,176,13,232,252,247,187,246,1,88,249,195,50,192,162,247,1,232,167,253,117,4,254,195,235, 247,176,3,235,221,138,199,254,200,36,248,4,8,254,192,138,232,160,41,0,58,197,115,2,138,232,138,197,160,114,0,10,192,138,197, 117,12,58,199,116,5,138,248,232,54,27,50,192,195,42,199,116,251,80,160,80,0,232,20,0,232,170,247,88,254,200,117,241,195,160, 114,0,246,208,162,114,0,50,192,195,83,139,30,86,0,80,160,114,0,10,192,116,3,232,3,0,88,91,195,160,88,0,58,195,117,16,83,187, 90,0,254,7,160,41,0,58,7,115,2,136,7,91,160,80,0,138,200,232,143,1,114,16,116,220,80,50,192,232,40,253,254,195,232,230,1, 88,254,203,254,195,183,1,235,227,83,160,41,0,58,199,117,11,183,0,160,93,0,58,195,117,0,254,195,254,199,232,9,0,91,83,232, 173,26,50,192,91,195,176,1,58,199,116,4,254,207,235,20,83,254,203,116,14,160,41,0,138,248,232,208,252,117,4,94,135,222,86, 91,232,136,26,160,88,0,58,195,117,10,160,90,0,254,200,116,3,162,90,0,232,66,1,83,232,174,252,117,17,254,195,183,1,232,5,2, 94,135,222,86,232,251,1,91,235,230,91,232,85,26,50,192,195,232,145,252,117,11,160,91,0,58,195,116,4,254,195,235,240,160,41, 0,138,248,160,80,0,138,200,81,232,34,26,89,10,192,116,12,58,193,116,8,254,199,232,42,26,50,192,195,254,207,116,244,235,229, 232,148,0,183,1,232,25,26,83,160,80,0,232,173,1,91,254,199,160,41,0,254,192,58,199,117,237,232,65,252,117,165,183,1,254,195, 235,226,198,6,112,0,0,235,8,232,229,25,232,74,1,114,15,232,64,0,116,19,235,241,232,214,25,232,59,1,115,7,232,49,0,116,4,235, 241,50,192,195,50,192,162,112,0,235,8,232,189,25,232,34,1,115,15,232,38,0,116,235,235,241,232,174,25,232,19,1,114,7,232,23, 0,116,220,235,241,232,2,0,235,211,139,30,86,0,232,196,250,117,204,183,1,233,150,250,139,30,86,0,232,223,250,117,190,160,41, 0,138,248,233,154,250,254,203,116,5,232,193,251,116,247,254,195,195,81,160,90,0,58,199,114,26,232,103,25,232,22,0,139,250, 170,66,94,135,222,86,254,207,94,135,222,86,116,4,254,199,235,223,89,195,10,192,117,2,176,32,195,232,69,0,80,232,138,251,116, 21,88,34,192,116,241,60,32,116,237,160,80,0,58,193,116,230,138,193,34,192,195,88,249,195,160,41,0,58,199,116,25,254,199,232, 196,0,83,254,207,232,187,0,91,254,199,160,41,0,254,192,58,199,117,235,254,207,160,80,0,232,167,0,195,83,81,232,164,0,89,80, 138,193,232,154,0,88,138,200,160,41,0,254,192,254,199,58,199,117,231,138,193,91,195,83,160,92,0,42,195,114,47,116,34,139, 30,91,0,94,135,222,86,83,138,195,162,91,0,160,93,0,162,92,0,232,90,250,91,94,135,222,86,137,30,91,0,91,83,183,1,232,249,24, 91,176,1,233,6,251,139,30,86,0,254,203,116,3,232,171,24,232,254,249,91,254,203,195,60,48,114,251,60,58,114,18,60,65,114,243, 60,91,114,10,60,97,114,235,60,123,114,2,249,195,34,192,195,83,183,1,160,41,0,138,232,81,232,101,24,89,60,255,116,8,254,199, 254,205,117,241,91,195,91,83,183,1,232,164,24,91,195,233,67,24,233,73,24,162,40,0,139,30,71,3,10,199,34,195,254,192,135,218, 116,232,235,19,187,246,1,116,225,249,156,67,233,117,210,232,124,217,116,3,233,114,217,91,137,22,73,3,232,120,211,114,3,233, 60,218,139,217,67,67,139,23,67,67,83,135,218,232,78,46,91,138,7,60,9,116,5,176,32,232,151,244,232,188,232,187,247,1,232,169, 232,232,95,251,139,30,86,0,254,203,116,9,254,203,116,5,232,53,250,116,247,254,195,232,240,23,233,160,209,60,10,116,3,233, 107,244,83,139,30,233,4,138,199,10,195,91,176,10,117,8,80,176,13,232,87,244,88,195,232,82,244,176,13,232,77,244,176,10,195, 75,232,190,215,117,1,195,232,143,246,44,185,91,55,81,176,200,235,2,50,192,162,250,2,138,15,205,179,232,201,247,115,3,233, 63,208,50,192,138,232,162,142,0,67,138,7,60,46,114,66,116,13,60,58,115,4,60,48,115,5,232,171,247,114,51,138,232,81,181,255, 186,142,0,12,128,254,197,139,250,170,66,67,138,7,60,58,115,4,60,48,115,237,232,139,247,115,232,60,46,116,228,138,197,60,39, 114,3,233,245,207,89,162,142,0,138,7,60,38,115,30,186,3,56,82,182,2,60,37,116,132,254,198,60,36,117,1,195,254,198,60,33,116, 249,182,8,60,35,116,243,88,138,193,36,127,138,208,182,0,83,187,31,3,3,218,138,55,91,75,138,198,162,251,2,232,18,215,160,57, 3,254,200,117,3,233,122,1,120,3,233,16,0,138,7,44,40,117,3,233,205,0,44,51,117,3,233,198,0,50,192,162,57,3,83,160,77,4,10, 192,162,74,4,116,30,139,30,124,3,186,126,3,3,218,137,30,75,4,135,218,233,247,45,160,74,4,10,192,116,36,50,192,162,74,4,139, 30,90,3,137,30,75,4,139,30,88,3,233,220,45,232,4,255,195,50,192,138,240,138,208,89,94,135,222,86,195,91,94,135,222,86,82, 186,106,56,59,218,116,231,186,218,25,59,218,90,116,73,94,135,222,86,83,81,160,251,2,138,232,160,142,0,2,197,254,192,138,200, 81,181,0,65,65,65,139,30,92,3,83,3,217,89,83,232,25,44,91,137,30,92,3,139,217,137,30,90,3,75,198,7,0,59,218,117,248,90,136, 55,67,90,137,23,67,232,221,1,135,218,66,91,195,232,134,66,235,8,198,6,79,3,0,233,120,10,232,64,226,117,7,187,6,0,137,30,163, 4,91,195,83,139,30,250,2,94,135,222,86,138,240,82,81,186,142,0,139,242,172,10,192,116,61,135,218,4,2,208,216,138,200,232, 195,243,138,193,138,15,67,138,47,67,81,254,200,117,245,83,160,142,0,80,135,218,232,40,215,88,137,30,181,0,91,4,2,208,216, 89,75,136,47,75,136,15,254,200,117,245,139,30,181,0,235,8,232,10,215,50,192,162,142,0,160,92,4,10,192,116,8,11,210,117,3, 233,95,0,74,89,88,134,196,158,135,218,94,135,222,86,83,135,218,254,192,138,240,138,7,60,44,116,136,60,41,116,7,60,93,116, 3,233,64,206,232,156,213,137,30,82,3,91,137,30,250,2,178,0,82,235,7,83,159,134,196,80,134,196,139,30,90,3,233,175,44,160, 250,2,10,192,116,3,233,32,206,88,134,196,158,139,203,117,3,233,85,43,42,7,117,3,233,152,0,186,9,0,233,25,206,160,251,2,136, 7,67,138,208,182,0,88,134,196,158,117,3,233,202,0,136,15,67,136,47,232,211,0,67,138,200,232,245,242,67,67,137,30,49,3,136, 15,67,160,250,2,208,208,138,193,114,15,159,80,160,92,4,52,11,138,200,181,0,88,158,115,4,89,159,65,158,136,15,159,80,67,136, 47,67,232,122,42,88,158,254,200,117,218,159,80,138,238,138,202,135,218,3,218,115,3,233,207,242,232,220,242,137,30,92,3,75, 198,7,0,59,218,117,248,50,192,65,138,240,139,30,49,3,138,23,135,218,3,219,3,217,135,218,75,75,137,23,67,67,88,158,114,70, 138,232,138,200,138,7,67,182,91,139,23,67,67,94,135,222,86,80,59,218,114,3,233,79,255,232,29,42,3,218,88,254,200,139,203, 117,227,160,251,2,139,203,3,219,44,4,114,8,3,219,10,192,116,11,3,219,10,192,122,3,233,2,0,3,217,89,3,217,135,218,139,30,82, 3,195,249,26,192,91,195,138,7,67,81,181,0,138,200,3,217,89,195,81,82,159,80,186,142,0,139,242,172,138,232,254,197,139,242, 172,66,67,136,7,254,205,117,245,88,158,90,89,195,232,90,220,232,106,41,232,32,243,59,135,218,139,30,163,4,235,10,160,58,3, 10,192,116,17,90,135,218,83,50,192,162,58,3,254,192,156,82,138,47,10,237,117,3,233,95,213,67,139,31,235,36,138,213,83,177, 2,138,7,67,60,92,117,3,233,157,1,60,32,117,6,254,193,254,205,117,236,91,138,234,176,92,232,214,1,232,130,240,50,192,138,208, 138,240,232,202,1,138,240,138,7,67,60,33,117,3,233,111,1,60,35,116,82,60,38,117,3,233,96,1,254,205,117,3,233,46,1,60,43,176, 8,116,217,75,138,7,67,60,46,116,85,60,95,117,3,233,55,1,60,92,116,156,58,7,117,182,60,36,116,24,60,42,117,174,138,197,67, 60,2,114,4,138,7,60,36,176,32,117,10,254,205,254,194,190,50,192,4,16,67,254,194,2,198,138,240,254,194,177,0,254,205,116,97, 138,7,67,60,46,116,30,60,35,116,237,60,44,117,35,138,198,12,64,138,240,235,225,138,7,60,35,176,46,116,3,233,101,255,177,1, 67,254,193,254,205,116,54,138,7,67,60,35,116,243,82,186,244,59,82,138,247,138,211,60,94,116,1,195,58,7,117,251,67,58,7,117, 246,67,58,7,117,241,67,138,197,44,4,114,234,90,90,138,232,254,198,67,235,3,135,218,90,138,198,75,254,194,36,8,117,28,254, 202,138,197,10,192,116,20,138,7,44,45,116,6,60,254,117,10,176,8,4,4,2,198,138,240,254,205,91,157,116,101,81,82,232,2,219, 90,89,81,83,138,234,138,197,2,193,60,25,114,3,233,35,212,138,198,12,128,232,92,59,232,119,234,91,75,232,216,210,249,116,17, 162,58,3,60,59,116,7,60,44,116,3,233,104,203,232,196,210,89,135,218,91,83,156,82,138,7,42,197,67,182,0,138,208,139,31,3,218, 138,197,10,192,116,3,233,173,254,235,6,232,123,0,232,39,239,91,157,116,3,233,88,254,115,3,232,231,239,94,135,222,86,232,28, 236,91,233,3,216,195,232,93,0,254,205,138,7,67,232,4,239,235,202,177,0,235,5,177,1,235,1,88,254,205,232,69,0,91,157,116,208, 81,232,110,218,232,127,39,89,81,83,139,30,163,4,138,233,177,0,138,197,80,138,197,10,192,116,3,232,161,236,232,228,233,139, 30,163,4,88,10,192,117,3,233,94,255,42,7,138,232,176,32,254,197,254,205,117,3,233,79,255,232,177,238,235,244,80,138,198,10, 192,176,43,116,3,232,163,238,88,195,137,30,53,3,232,236,231,232,15,210,135,218,232,102,0,159,68,158,159,68,158,117,8,3,217, 139,227,137,30,69,3,139,30,46,0,83,139,30,53,3,83,82,235,40,116,3,233,137,202,135,218,232,63,0,117,103,139,227,137,30,69, 3,139,22,46,0,137,22,90,4,67,67,139,23,67,67,139,31,137,30,46,0,135,218,232,204,217,83,232,132,39,91,116,9,185,177,0,138, 233,81,233,125,209,139,30,90,4,137,30,46,0,91,89,89,233,111,209,187,4,0,3,220,67,138,7,67,185,130,0,58,193,117,7,185,18,0, 3,217,235,238,185,177,0,58,193,116,1,195,57,23,185,6,0,116,248,3,217,235,219,186,30,0,233,47,202,232,58,7,75,232,109,209, 116,85,232,114,217,83,232,108,221,116,61,232,10,51,232,139,232,139,30,163,4,67,138,23,67,138,55,139,242,172,60,32,117,9,66, 136,55,75,136,23,75,254,15,232,220,232,91,75,232,58,209,116,34,60,59,116,5,232,8,240,44,75,232,44,209,176,44,232,175,237, 235,186,176,34,232,168,237,232,186,232,176,34,232,160,237,235,215,232,103,238,233,139,214,205,168,83,138,242,232,135,1,116, 9,60,58,116,15,232,126,1,121,247,138,214,91,50,192,176,252,205,171,195,138,198,42,194,254,200,60,2,115,5,205,172,233,97,201, 60,5,114,3,233,90,201,89,82,81,138,200,138,232,186,156,62,94,135,222,86,83,138,7,60,97,114,6,60,123,115,2,44,32,81,138,232, 139,242,46,172,67,66,58,197,89,117,21,254,201,117,226,139,242,46,172,10,192,120,3,233,6,0,91,91,90,10,192,195,10,192,120, 235,139,242,46,172,10,192,159,66,158,121,245,138,205,91,83,139,242,46,172,10,192,117,182,233,254,200,75,89,66,68,255,83,67, 82,78,254,76,80,84,49,253,67,65,83,49,252,0,123,88,145,88,167,88,189,88,205,169,83,82,159,134,196,80,134,196,186,46,0,3,218, 176,255,42,7,2,192,138,208,205,170,182,0,187,177,62,3,218,46,138,23,67,46,138,55,88,134,196,158,138,216,183,0,3,218,46,138, 23,67,46,138,55,135,218,90,94,135,222,86,195,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,17,216,83,232,140,233, 138,7,10,192,116,79,67,138,23,67,138,63,138,218,138,208,50,192,162,255,6,232,219,254,159,134,196,80,134,196,185,240,4,182, 11,254,194,254,202,116,77,138,7,60,32,114,38,60,46,116,40,139,249,170,65,67,254,206,117,233,88,134,196,158,159,134,196,80, 134,196,138,240,160,240,4,254,192,116,6,88,134,196,158,91,195,233,40,200,67,235,202,176,1,162,255,6,138,198,60,11,116,239, 60,3,114,235,116,236,176,32,139,249,170,65,254,206,235,234,176,32,139,249,170,65,254,206,117,246,235,186,138,7,67,254,202, 195,232,122,223,138,216,160,223,4,58,195,115,3,233,233,199,183,0,3,219,135,218,139,30,224,4,3,218,139,31,160,54,5,254,192, 116,219,138,7,10,192,116,213,83,186,46,0,3,218,138,7,60,9,115,5,205,220,233,192,199,91,138,7,10,192,249,195,75,232,53,207, 60,35,117,3,232,46,207,232,42,223,94,135,222,86,83,232,171,255,117,3,233,155,199,137,30,233,4,195,185,152,20,81,232,28,215, 138,7,60,44,117,89,83,232,145,232,138,7,10,192,117,3,233,124,199,67,139,31,138,7,36,223,178,1,60,73,116,21,178,2,60,79,116, 15,178,4,60,82,116,9,178,8,60,65,116,3,233,84,199,91,82,232,175,237,44,60,35,117,3,232,208,206,232,204,222,232,161,237,44, 138,194,10,192,117,3,233,61,199,80,232,178,254,88,89,138,209,205,221,233,131,0,232,169,254,138,7,60,130,178,4,117,89,232, 165,206,60,133,178,1,116,77,60,79,116,32,60,73,116,55,232,107,237,65,232,103,237,80,232,99,237,80,232,95,237,69,232,91,237, 78,232,87,237,68,178,8,235,44,232,120,206,232,76,237,85,232,72,237,84,232,68,237,80,232,64,237,85,232,60,237,84,178,2,235, 17,232,93,206,232,49,237,66,232,45,237,77,178,32,75,232,79,206,232,35,237,65,232,31,237,83,82,138,7,60,35,117,3,232,61,206, 232,57,222,10,192,117,3,233,176,198,205,222,180,82,75,138,208,232,41,206,116,3,233,197,198,94,135,222,86,138,194,159,134, 196,80,134,196,83,232,156,254,116,3,233,149,198,90,138,198,60,9,205,223,115,3,233,131,198,83,185,46,0,3,217,136,55,176,0, 91,233,145,253,83,10,192,117,10,160,54,5,36,1,116,3,233,70,3,232,107,254,116,21,137,30,233,4,83,176,2,115,3,233,113,253,205, 224,233,80,198,232,36,3,91,83,186,49,0,3,218,136,7,138,248,138,216,137,30,233,4,91,2,7,198,7,0,91,195,249,235,3,13,50,192, 159,80,232,159,253,205,233,88,158,159,80,116,20,138,7,44,44,10,192,117,12,232,150,205,232,106,236,82,88,158,249,159,80,159, 80,50,192,178,1,232,84,255,139,30,233,4,185,49,0,3,217,88,158,26,192,36,128,12,1,162,54,5,88,158,159,80,26,192,162,239,4, 138,7,10,192,121,3,233,216,0,88,158,116,3,232,87,235,50,192,232,44,254,233,5,199,232,66,253,205,234,75,232,70,205,178,128, 249,117,3,232,121,5,116,24,232,16,236,44,60,80,178,146,117,6,232,47,205,249,235,8,232,0,236,65,10,192,178,2,159,80,138,194, 36,16,162,98,4,88,158,159,80,254,192,162,95,0,50,192,232,221,254,88,158,83,139,30,233,4,138,7,91,36,128,117,3,233,20,221, 83,232,99,225,160,98,4,10,192,116,3,232,121,4,139,30,88,3,137,30,4,7,139,30,48,0,83,139,30,233,4,232,198,0,10,192,121,3,233, 22,0,233,77,197,160,98,4,10,192,116,3,232,162,4,91,50,192,162,98,4,233,200,254,91,232,2,0,235,231,232,160,0,60,252,117,3, 233,13,26,205,235,233,31,197,139,30,48,0,10,192,232,3,0,233,70,0,159,80,232,131,0,60,252,117,3,233,54,26,88,158,205,236,233, 0,197,88,158,195,36,32,162,99,4,88,158,117,3,233,241,196,232,119,234,160,99,4,162,100,4,232,171,0,50,192,232,241,252,198, 7,128,137,30,233,4,232,75,0,10,192,120,179,205,237,233,211,196,160,100,4,10,192,116,3,232,40,4,232,39,199,67,67,137,30,88, 3,232,90,234,50,192,162,54,5,232,67,254,160,239,4,10,192,116,3,233,249,203,233,196,197,135,218,139,30,47,3,135,218,59,218, 114,152,232,28,234,50,192,162,54,5,233,235,233,83,82,139,30,233,4,186,46,0,3,218,138,7,90,91,195,117,30,83,81,80,186,38,67, 82,81,10,192,195,88,89,254,200,121,240,91,195,89,91,138,7,60,44,117,247,232,228,203,81,138,7,60,35,117,3,232,218,203,232, 214,219,94,135,222,86,83,186,46,67,82,249,255,227,185,40,65,160,223,4,235,191,160,54,5,10,192,120,204,185,40,65,50,192,160, 223,4,235,174,50,192,138,232,138,197,232,49,252,198,7,0,160,223,4,254,197,42,197,115,239,50,192,162,54,5,232,149,233,139, 30,48,0,75,198,7,0,233,219,195,91,88,134,196,158,83,82,81,159,134,196,80,134,196,139,30,233,4,176,6,232,5,0,205,227,233,235, 195,159,134,196,80,134,196,82,135,218,187,46,0,3,218,138,7,135,218,90,60,9,115,3,233,202,0,88,134,196,158,94,135,222,86,91, 233,228,250,81,83,82,139,30,233,4,176,8,232,206,255,205,228,233,180,195,90,91,89,195,232,48,203,232,4,234,36,232,0,234,40, 83,139,30,233,4,83,187,0,0,137,30,233,4,91,94,135,222,86,232,18,219,82,138,7,60,44,117,11,232,9,203,232,205,251,91,50,192, 138,7,159,80,232,211,233,41,88,158,94,135,222,86,159,80,138,195,10,192,117,3,233,38,204,83,232,7,226,135,218,89,88,158,159, 80,116,40,232,22,232,60,3,116,19,136,7,67,254,201,117,236,88,158,89,91,137,30,233,4,81,233,51,226,88,158,139,30,46,0,137, 30,71,3,91,233,6,195,232,106,255,115,3,233,48,195,235,213,205,229,232,18,0,83,181,1,232,2,0,91,195,50,192,136,7,67,254,205, 117,249,195,139,30,233,4,186,51,0,3,218,195,88,134,196,158,195,232,7,251,117,3,233,250,194,176,10,115,3,233,18,250,205,230, 233,238,194,232,243,250,117,3,233,230,194,176,12,115,3,233,254,249,205,231,233,218,194,232,223,250,117,3,233,210,194,176, 14,115,3,233,234,249,205,232,233,198,194,232,255,234,117,3,233,31,202,50,192,232,71,252,178,66,233,242,194,60,35,117,173, 232,44,218,232,4,233,44,138,194,83,232,0,251,91,138,7,195,185,236,45,81,50,192,233,36,252,232,30,214,185,155,22,186,32,44, 117,27,138,214,235,23,185,152,20,81,232,204,255,232,81,242,232,27,31,82,185,138,17,50,192,138,240,138,208,80,81,83,232,165, 254,115,3,233,107,194,60,32,117,6,254,198,254,206,117,238,60,34,117,19,138,232,138,194,60,44,138,197,117,9,138,245,138,213, 232,129,254,114,83,187,247,1,181,255,138,200,138,198,60,34,138,193,116,46,60,13,83,116,89,91,60,10,117,36,138,200,138,194, 60,44,138,193,116,3,232,137,0,83,232,85,254,91,114,38,60,13,117,12,138,194,60,32,116,21,60,44,176,13,116,15,10,192,116,11, 58,198,116,14,58,194,116,10,232,99,0,83,232,47,254,91,115,178,83,60,34,116,4,60,32,117,37,232,32,254,114,32,60,32,116,247, 60,44,116,24,60,13,117,4,205,225,116,16,139,30,233,4,138,200,176,18,232,221,253,205,226,233,195,193,91,198,7,0,187,246,1, 138,194,44,32,116,7,181,0,232,102,224,91,195,232,55,213,159,80,232,42,201,88,158,159,80,115,3,232,196,35,88,158,114,3,232, 196,35,91,195,10,192,116,251,136,7,67,254,205,117,244,89,235,197,232,70,0,162,96,0,254,192,116,3,233,158,193,83,81,178,2, 232,198,250,91,232,59,252,50,192,162,96,0,233,26,252,232,38,0,10,192,116,7,254,192,117,3,233,125,193,254,200,162,96,0,83, 81,50,192,178,1,232,158,250,91,232,46,252,50,192,162,96,0,91,233,204,250,232,180,248,82,75,232,185,200,90,117,3,176,1,195, 82,232,134,231,44,232,43,0,82,75,232,166,200,117,5,89,90,50,192,195,232,115,231,44,232,24,0,89,135,218,3,217,137,30,4,7,135, 218,75,232,137,200,116,3,233,37,193,90,176,255,195,232,135,208,83,232,17,220,90,135,218,195,185,11,13,139,30,48,0,135,218, 139,30,88,3,59,218,117,1,195,187,23,98,138,195,2,193,138,216,138,199,20,0,138,248,139,242,172,42,197,46,50,7,80,187,118,97, 138,195,2,197,138,216,138,199,20,0,138,248,88,46,50,7,2,193,139,250,170,66,254,201,117,2,177,11,254,205,117,188,181,13,235, 184,185,11,13,139,30,48,0,135,218,139,30,88,3,59,218,116,175,187,118,97,138,195,2,197,138,216,138,199,20,0,138,248,139,242, 172,42,193,46,50,7,80,187,23,98,138,195,2,193,138,216,138,199,20,0,138,248,88,46,50,7,2,197,139,250,170,66,254,201,117,2, 177,11,254,205,117,189,181,13,235,185,83,139,30,46,0,138,199,34,195,91,254,192,116,1,195,159,80,160,100,4,10,192,116,3,233, 245,200,88,158,195,138,7,60,64,117,3,232,173,199,185,0,0,138,245,138,209,60,234,116,31,138,7,60,207,156,117,3,232,152,199, 232,108,230,40,232,126,215,82,232,100,230,44,232,118,215,232,93,230,41,89,157,83,139,30,61,5,116,3,187,0,0,159,3,217,209, 222,158,209,214,137,30,61,5,137,30,55,5,139,203,139,30,59,5,116,3,187,0,0,3,218,137,30,59,5,137,30,57,5,135,218,91,195,50, 192,235,2,176,3,80,232,164,255,88,232,46,0,83,232,40,3,115,6,232,127,2,232,85,2,91,195,232,49,199,232,140,255,83,232,20,3, 187,255,255,115,10,232,104,2,232,27,2,138,216,183,0,232,7,29,91,195,176,3,81,82,138,208,75,232,12,199,116,11,232,222,229, 44,60,44,116,3,232,254,214,138,194,83,232,193,2,115,3,233,48,200,91,90,89,233,239,198,139,30,55,5,138,195,42,193,138,216, 138,199,26,197,138,248,115,197,50,192,42,195,138,216,26,199,42,195,138,248,249,195,139,30,57,5,138,195,42,194,138,216,138, 199,26,198,138,248,235,222,83,139,30,57,5,135,218,137,30,57,5,91,195,232,240,255,83,81,139,30,55,5,94,135,222,86,137,30,55, 5,89,91,195,232,226,254,81,82,232,106,229,234,232,237,254,232,118,255,90,89,116,83,232,92,229,44,232,88,229,66,117,3,233, 96,0,232,79,229,70,83,232,93,2,232,193,255,232,87,2,232,156,255,115,3,232,169,255,67,83,232,114,255,115,3,232,175,255,67, 83,232,156,1,90,89,82,81,232,219,0,80,83,135,218,232,105,2,91,88,232,215,0,232,248,0,89,90,73,138,197,10,193,117,227,91,195, 81,82,83,232,69,0,139,30,61,5,137,30,55,5,139,30,59,5,137,30,57,5,91,90,89,195,83,139,30,57,5,83,82,135,218,232,218,255,91, 137,30,57,5,135,218,232,208,255,91,137,30,57,5,139,30,55,5,81,139,203,232,193,255,91,137,30,55,5,139,203,232,183,255,91,195, 205,184,232,207,1,232,51,255,232,201,1,232,14,255,115,3,232,40,255,82,83,232,228,254,135,218,187,241,73,115,3,187,5,74,94, 135,222,86,59,218,115,20,137,30,253,6,91,137,30,247,6,187,213,73,137,30,249,6,135,218,235,22,94,135,222,86,137,30,249,6,187, 213,73,137,30,247,6,135,218,137,30,253,6,91,90,83,137,30,251,6,232,211,0,90,82,232,5,0,89,65,233,32,2,138,198,10,192,208, 216,138,240,138,194,208,216,138,208,195,139,30,243,6,160,245,6,195,137,30,243,6,162,245,6,195,139,30,243,6,129,251,0,32,114, 9,129,235,0,32,137,30,243,6,195,129,195,80,32,137,30,243,6,195,139,30,243,6,129,251,0,32,114,9,129,235,176,31,137,30,243, 6,195,129,195,0,32,137,30,243,6,195,138,193,138,14,85,0,210,14,245,6,138,200,114,1,195,255,6,243,6,195,138,193,138,14,85, 0,210,6,245,6,138,200,114,1,195,255,14,243,6,195,140,198,191,0,184,142,199,139,30,243,6,38,138,7,138,22,245,6,34,194,138, 14,85,0,210,234,114,4,210,232,235,248,142,198,195,140,198,191,0,184,142,199,139,30,243,6,139,233,160,245,6,246,208,38,34, 7,138,14,246,6,34,14,245,6,10,193,38,136,7,139,205,142,198,195,139,233,209,234,159,139,218,177,2,211,226,3,211,177,4,211, 226,158,115,4,129,194,0,32,137,22,243,6,139,213,138,202,246,6,85,0,1,116,20,176,7,34,200,176,128,210,232,162,245,6,177,3, 211,234,1,22,243,6,195,176,3,34,200,2,201,176,192,210,232,162,245,6,177,2,211,234,1,22,243,6,195,160,72,0,199,6,59,5,100, 0,60,6,116,18,115,28,60,4,114,24,198,6,85,0,2,199,6,61,5,160,0,195,198,6,85,0,1,199,6,61,5,64,1,195,198,6,85,0,0,195,60,4, 115,15,246,6,85,0,1,116,12,36,1,246,216,162,246,6,248,195,233,93,197,36,3,177,85,246,225,162,246,6,248,195,160,85,0,10,192, 116,235,10,237,120,39,187,128,2,132,6,1,0,116,3,187,64,1,59,203,159,114,3,75,139,203,10,246,120,12,129,250,200,0,114,4,186, 199,0,195,158,195,51,210,195,51,201,159,235,232,140,198,191,0,184,142,199,139,211,11,210,116,108,139,30,243,6,38,138,47,160, 245,6,138,224,246,208,138,14,85,0,138,30,246,6,34,232,138,252,34,251,10,239,74,116,64,210,200,210,204,115,239,139,30,243, 6,38,136,47,255,6,243,6,136,38,245,6,139,202,209,233,209,233,246,6,85,0,1,117,6,129,226,3,0,235,6,129,226,7,0,209,233,227, 171,252,160,246,6,139,62,243,6,243,170,137,62,243,6,235,155,139,30,243,6,38,136,47,136,38,245,6,142,198,195,232,127,254,3, 22,253,6,59,22,251,6,114,9,43,22,251,6,62,255,22,249,6,62,255,22,247,6,226,227,195,83,232,163,207,91,195,83,232,39,25,91, 195,246,128,62,113,0,0,116,3,233,249,4,195,160,41,0,138,208,232,255,210,233,237,4,0,0,0,180,15,205,16,162,72,0,180,40,60, 2,114,13,180,80,60,7,117,7,185,12,11,137,14,104,0,136,38,41,0,250,140,219,137,30,80,3,30,186,0,0,142,218,137,30,16,5,187, 52,77,137,30,108,0,187,68,87,137,30,112,0,140,14,110,0,140,14,114,0,31,232,50,0,187,24,2,185,0,0,142,193,185,122,0,38,140, 143,2,0,38,199,7,148,76,131,195,4,224,241,140,219,142,195,232,72,225,251,180,1,205,23,232,119,6,187,155,76,232,223,46,233, 99,50,190,237,76,187,83,6,185,10,0,83,252,46,172,136,7,67,10,192,117,246,91,131,195,16,224,239,195,207,62,255,46,0,7,203, 84,104,101,32,73,66,77,32,80,101,114,115,111,110,97,108,32,67,111,109,112,117,116,101,114,32,66,97,115,105,99,255,13,86,101, 114,115,105,111,110,32,67,49,46,49,48,32,67,111,112,121,114,105,103,104,116,32,73,66,77,32,67,111,114,112,32,49,57,56,49, 255,13,0,50,53,45,65,112,114,45,56,49,76,73,83,84,32,0,82,85,78,13,0,76,79,65,68,34,0,83,65,86,69,34,0,67,79,78,84,13,0,44, 34,76,80,84,49,58,34,13,0,84,82,79,78,13,0,84,82,79,70,70,13,0,75,69,89,32,0,83,67,82,69,69,78,32,48,44,48,44,48,13,0,156, 80,30,82,186,0,0,142,218,142,30,16,5,232,58,10,136,22,106,0,254,202,136,22,94,0,90,31,88,157,207,86,160,94,0,10,192,117,17, 160,106,0,10,192,117,10,180,1,205,22,176,0,116,2,254,200,94,195,160,94,0,10,192,116,8,50,192,162,94,0,176,3,195,86,87,160, 106,0,10,192,117,116,180,0,205,22,10,192,116,3,95,94,195,83,128,252,59,114,5,128,252,69,114,60,139,30,46,0,67,11,219,117, 19,187,52,78,177,26,46,58,39,116,12,67,254,192,254,201,117,244,50,192,91,235,211,50,228,208,224,139,216,46,139,159,3,1,137, 30,107,0,254,14,106,0,208,232,4,65,140,14,109,0,235,224,80,134,196,44,59,179,16,246,227,187,83,6,3,216,246,7,255,88,116,204, 137,30,107,0,140,30,109,0,254,14,106,0,235,12,83,254,200,117,7,162,106,0,176,32,235,178,30,197,30,107,0,138,7,31,255,6,107, 0,10,192,116,2,121,160,50,228,140,203,138,30,110,0,58,223,114,4,254,196,36,127,136,38,106,0,10,192,117,136,91,233,119,17, 30,48,46,32,18,33,34,35,23,36,37,38,50,49,24,25,16,19,31,20,22,47,17,45,21,44,83,81,86,190,108,78,177,14,252,46,172,58,224, 116,9,70,254,201,117,244,50,192,235,2,46,172,94,89,91,195,71,11,72,30,75,29,77,28,80,31,28,10,116,6,115,2,118,1,82,18,83, 127,79,14,117,5,119,12,31,30,29,28,13,12,11,10,156,83,81,82,80,60,7,116,77,60,13,117,10,246,6,111,0,255,116,3,232,139,0,232, 44,2,116,4,60,255,116,57,60,12,116,34,187,135,78,185,8,0,67,254,201,120,28,46,58,7,117,246,208,225,139,217,185,233,78,81, 46,255,183,225,47,139,30,86,0,195,232,14,4,235,14,232,62,0,232,14,0,232,13,225,235,3,232,36,9,88,90,89,91,157,195,80,138, 62,73,0,138,30,78,0,185,1,0,180,9,205,16,88,195,83,232,113,0,232,231,255,91,195,83,232,104,0,180,8,205,16,91,195,232,243, 255,138,232,138,204,195,139,30,86,0,137,30,86,0,156,83,232,77,0,91,157,195,160,87,0,254,200,195,80,138,14,41,0,42,14,87,0, 254,193,181,0,138,62,73,0,138,30,79,0,176,32,180,9,205,16,139,22,86,0,134,242,254,206,254,202,180,2,205,16,88,195,83,232, 21,0,138,62,73,0,138,30,79,0,138,14,41,0,181,0,176,32,180,9,205,16,91,80,82,139,211,134,242,254,206,254,202,138,62,73,0,180, 2,205,16,90,88,195,83,82,177,0,138,239,138,243,232,27,0,180,6,205,16,235,15,83,82,177,0,138,235,138,247,232,10,0,180,7,205, 16,232,28,0,90,91,195,232,17,0,138,22,41,0,254,202,254,206,254,205,176,1,138,62,79,0,195,160,73,0,235,3,160,74,0,232,6,1, 117,32,138,38,72,0,128,252,7,116,23,82,186,0,8,128,252,2,114,2,208,230,50,228,247,226,30,142,218,163,78,4,31,90,195,156,83, 82,80,186,0,0,180,0,205,23,138,196,128,228,40,128,252,40,116,13,246,196,8,117,12,168,1,116,13,178,24,235,6,178,27,235,2,178, 25,233,186,183,88,80,60,13,233,93,15,88,90,91,157,195,60,147,116,96,60,149,116,70,60,221,116,70,232,227,206,10,192,116,56, 254,200,60,10,115,50,186,16,0,246,226,138,208,129,194,83,6,82,232,162,221,44,232,209,198,83,232,76,216,138,15,128,249,15, 114,2,177,15,67,139,55,91,95,83,181,0,252,243,164,136,45,232,114,251,91,195,233,225,191,176,255,235,2,176,0,58,6,113,0,162, 113,0,116,3,232,94,0,232,144,190,195,83,190,83,6,185,10,0,254,197,86,176,70,232,8,219,81,138,221,183,0,232,171,20,176,32, 232,251,218,89,94,86,81,252,172,10,192,116,5,232,19,0,235,245,176,13,232,231,218,89,94,131,198,16,254,201,117,206,91,235, 192,86,60,13,117,2,176,27,232,209,218,94,195,80,160,72,0,60,7,116,4,60,4,115,2,50,192,10,192,88,195,83,205,173,182,24,178, 0,138,62,73,0,180,2,205,16,160,113,0,10,192,117,19,138,30,79,0,138,14,41,0,181,0,180,9,205,16,232,13,254,91,195,179,7,232, 192,255,117,9,160,76,0,10,192,117,2,179,112,190,83,6,181,5,160,41,0,60,40,176,49,116,2,181,10,80,83,138,30,78,0,232,55,0, 91,86,177,6,81,252,172,10,192,156,86,117,2,50,192,232,37,0,94,157,117,1,78,89,254,201,117,232,232,22,0,94,131,198,16,88,254, 192,60,58,114,2,176,48,254,205,117,199,232,175,253,91,195,50,192,83,10,192,117,6,176,32,138,30,79,0,60,13,117,2,176,27,81, 185,1,0,180,9,205,16,254,194,180,2,205,16,89,91,195,138,14,73,0,181,0,138,38,72,0,246,196,1,116,3,128,205,128,128,252,4,114, 9,254,197,128,252,6,114,2,254,197,81,60,44,116,12,232,97,205,89,138,232,81,232,92,189,116,64,232,45,220,44,60,44,116,21,232, 77,205,10,192,116,2,176,128,89,128,229,3,10,232,81,232,63,189,116,35,232,16,220,44,60,44,116,12,232,48,205,89,138,200,81, 232,43,189,116,15,232,252,219,44,232,32,205,138,240,89,235,6,233,85,190,89,138,241,138,38,41,0,138,197,36,127,10,192,116, 10,50,210,10,214,10,209,117,230,235,27,128,252,40,116,12,128,254,4,115,218,128,249,4,114,12,235,211,128,254,8,115,206,128, 249,8,115,201,138,209,10,192,116,32,128,62,72,0,7,116,92,177,6,60,2,180,80,116,42,180,40,254,201,254,200,117,172,246,197, 128,117,29,254,201,235,25,177,2,128,252,40,116,9,246,197,128,116,13,254,193,235,9,254,201,246,197,128,117,2,254,201,136,38, 41,0,161,72,0,136,14,72,0,137,22,73,0,58,193,116,26,184,7,0,163,75,0,134,196,163,77,0,136,38,79,0,232,58,254,116,3,162,79, 0,232,110,0,160,74,0,180,5,205,16,195,58,6,41,0,116,52,138,38,72,0,60,80,116,7,60,40,116,3,233,152,189,128,252,7,117,4,176, 80,235,28,128,244,2,128,252,7,117,2,254,204,80,162,41,0,136,38,72,0,199,6,73,0,0,0,232,45,0,88,195,83,232,218,252,178,39, 128,62,41,0,40,116,2,178,79,182,24,138,62,79,0,185,0,0,138,193,180,6,205,16,186,0,0,138,62,73,0,180,2,205,16,235,15,83,185, 0,0,137,14,73,0,160,72,0,180,0,205,16,232,189,221,232,201,248,232,138,247,232,157,252,91,195,232,164,253,116,91,177,0,190, 81,0,128,62,72,0,6,117,3,233,22,189,138,44,86,81,232,212,187,116,64,60,44,116,7,232,201,203,89,138,232,81,89,81,83,138,249, 138,221,128,255,0,117,8,128,251,8,114,3,128,203,16,180,11,205,16,91,232,171,187,116,3,232,165,187,89,94,136,44,116,8,70,254, 193,128,249,4,114,189,198,6,79,0,0,195,89,94,195,255,54,77,0,255,54,75,0,60,44,116,16,232,126,203,60,32,115,24,89,138,200, 81,232,117,187,116,44,232,70,218,44,60,44,116,19,232,102,203,60,16,114,3,233,156,188,89,138,232,81,232,90,187,116,17,232, 43,218,44,232,79,203,60,16,115,233,89,90,138,208,82,81,89,90,138,241,128,230,15,137,14,75,0,138,197,208,224,36,16,10,194, 128,229,7,208,229,208,229,208,229,208,229,246,193,16,116,3,128,205,128,10,238,83,138,216,183,0,36,15,162,77,0,136,46,78,0, 136,46,79,0,180,11,205,16,91,195,255,54,86,0,60,44,116,32,232,250,202,10,192,116,91,60,26,115,87,138,38,113,0,10,228,116, 4,60,25,115,75,90,138,208,82,232,225,186,116,123,232,178,217,44,60,44,116,24,232,210,202,10,192,116,51,138,38,41,0,58,224, 114,43,90,138,240,82,232,193,186,116,91,255,54,104,0,232,142,217,44,60,44,116,25,232,174,202,10,192,176,0,117,2,176,32,89, 10,232,81,232,161,186,116,45,235,3,233,213,187,232,109,217,44,232,145,202,60,32,115,242,89,128,229,32,10,232,138,200,81,232, 131,186,116,15,232,84,217,44,232,120,202,60,32,115,217,89,138,200,81,89,81,128,229,15,137,14,104,0,89,180,1,205,16,90,137, 22,86,0,134,242,254,206,254,202,83,138,62,73,0,180,2,205,16,91,195,80,176,0,235,3,80,176,32,156,81,83,80,232,61,250,88,91, 139,14,104,0,246,6,114,0,255,116,2,181,4,10,232,180,1,205,16,89,157,88,195,0,0,0,0,255,255,255,255,255,255,255,255,255,255, 255,255,80,156,232,201,251,116,75,83,81,82,140,198,191,0,0,142,199,38,255,54,124,0,38,255,54,126,0,38,199,6,124,0,248,84, 38,140,14,126,0,142,198,176,129,2,6,114,0,179,131,138,62,73,0,185,1,0,180,9,205,16,140,198,191,0,0,142,199,38,143,6,126,0, 38,143,6,124,0,142,198,90,89,91,157,88,195,232,189,185,160,86,0,233,114,246,232,180,185,232,101,0,10,238,117,86,10,234,10, 233,116,80,138,38,41,0,58,226,114,72,128,249,26,115,67,160,113,0,10,192,116,5,128,249,25,115,55,83,138,241,254,206,254,202, 138,62,73,0,180,2,205,16,180,8,205,16,91,80,232,119,185,60,44,116,4,176,0,235,7,232,66,216,44,232,102,201,80,232,58,216,41, 88,10,192,88,116,2,138,196,233,18,246,233,144,186,232,5,0,232,37,216,41,195,232,32,216,40,232,50,201,82,232,24,216,44,232, 42,201,89,195,232,56,185,60,149,116,8,232,8,216,221,50,192,235,5,232,41,185,176,255,162,52,0,195,160,52,0,10,192,116,48,232, 27,201,60,10,115,41,83,86,186,26,86,82,50,228,209,224,139,240,46,255,180,29,86,195,94,91,195,52,86,63,86,70,86,76,86,107, 86,114,86,120,86,128,86,136,86,144,86,233,37,186,187,53,0,138,7,198,7,0,233,159,245,139,30,55,0,233,198,14,160,57,0,233,140, 245,180,4,205,16,80,10,228,116,12,137,30,58,0,136,46,60,0,137,22,63,0,88,138,196,254,200,246,208,233,115,245,139,30,58,0, 233,154,14,160,60,0,233,96,245,160,62,0,254,192,233,88,245,160,61,0,254,192,233,80,245,160,64,0,254,192,233,72,245,160,63, 0,254,192,233,64,245,232,132,200,10,192,116,18,60,4,115,84,180,0,83,187,65,0,3,216,138,7,91,233,39,245,83,186,1,2,185,1,1, 187,15,0,250,238,236,36,15,58,195,225,249,227,11,50,195,138,225,80,254,199,50,216,235,236,10,255,116,26,138,215,187,65,0, 185,4,0,88,246,212,2,226,208,232,115,2,136,39,67,226,247,254,202,117,232,251,91,160,65,0,233,225,244,233,95,185,232,32,184, 60,149,116,8,232,240,214,221,50,192,235,5,232,17,184,176,255,162,69,0,195,160,69,0,10,192,116,222,232,3,200,60,4,115,215, 168,1,116,14,180,16,254,200,116,2,180,64,232,208,0,233,172,244,83,187,70,0,10,192,116,1,67,138,7,198,7,0,91,233,154,244,156, 80,85,86,87,30,186,0,0,142,218,142,30,16,5,161,102,0,10,196,116,9,255,14,102,0,117,3,232,39,0,160,52,0,10,192,116,3,232,54, 0,160,69,0,10,192,116,3,232,105,0,31,95,94,93,88,157,207,198,6,101,0,0,161,102,0,11,192,116,24,82,250,246,6,101,0,255,117, 7,186,97,0,236,36,252,238,199,6,102,0,0,0,251,90,195,83,81,82,180,4,205,16,80,10,228,116,12,137,30,58,0,136,46,60,0,137,22, 63,0,88,160,54,0,50,196,116,25,10,228,136,38,54,0,116,17,137,30,55,0,136,46,57,0,137,22,61,0,176,255,162,53,0,90,89,91,195, 83,187,70,0,128,63,0,117,7,180,16,232,17,0,136,7,67,128,63,0,117,7,180,64,232,4,0,136,7,91,195,82,186,1,2,236,34,196,254, 200,152,138,196,90,195,232,9,0,184,211,5,186,4,0,82,235,56,139,22,102,0,10,242,116,7,198,6,101,0,255,235,241,195,232,222, 198,131,250,37,114,18,82,232,191,213,44,232,113,202,89,82,11,210,117,7,90,233,59,255,233,19,184,232,208,255,186,18,0,184, 220,52,247,241,246,6,101,0,255,117,8,80,186,67,0,176,182,238,88,186,66,0,238,138,196,238,117,7,186,97,0,236,12,3,238,90,137, 22,102,0,198,6,101,0,0,195,10,90,77,65,89,16,89,16,25,90,89,16,89,16,89,16,89,16,45,90,89,16,52,90,77,65,89,16,69,90,89,16, 89,16,89,16,89,16,89,16,89,16,93,90,99,90,77,65,89,16,124,90,89,16,89,16,89,16,89,16,89,16,89,16,170,90,177,90,110,91,89, 16,171,91,240,91,89,16,89,16,108,92,89,16,118,92,89,16,34,194,117,34,156,80,83,137,30,233,4,136,23,131,195,45,198,7,0,67, 67,136,47,67,198,7,0,67,136,15,67,198,7,0,91,88,157,195,233,152,174,88,91,195,128,250,128,117,2,178,2,195,88,134,196,158, 89,90,91,195,90,91,89,195,131,195,46,138,7,246,208,195,139,30,233,4,131,195,43,195,139,30,233,4,131,195,50,195,139,30,233, 4,138,135,47,0,195,86,87,81,198,6,63,5,165,190,240,4,191,64,5,185,8,0,252,164,226,253,89,95,94,195,83,81,187,64,5,177,8,128, 63,32,117,13,67,254,201,117,246,190,92,5,191,72,5,235,16,190,84,5,191,64,5,177,8,252,166,117,39,254,201,117,249,138,5,58, 4,116,9,10,192,117,25,246,4,1,117,20,138,4,139,30,233,4,136,135,49,0,187,244,89,232,14,0,50,192,235,7,187,254,89,232,4,0, 249,89,91,195,83,139,30,46,0,67,11,219,116,2,91,195,187,83,5,83,67,177,8,138,7,232,213,244,67,254,201,117,246,176,46,232, 203,244,91,131,195,9,176,68,246,7,225,116,23,176,80,246,7,32,117,16,176,66,246,7,128,117,9,176,65,246,7,64,117,2,176,77,91, 232,165,244,46,138,7,67,10,192,117,245,195,32,70,111,117,110,100,46,255,13,0,32,83,107,105,112,112,101,100,46,255,13,0,185, 0,0,136,14,82,5,176,234,232,189,254,233,227,254,187,82,5,138,7,198,7,0,10,192,117,5,232,70,243,10,192,233,226,254,136,14, 82,5,233,163,235,232,200,254,138,46,41,0,177,0,176,237,232,145,254,233,183,254,88,80,134,196,232,68,244,138,14,87,0,254,201, 139,30,233,4,136,143,50,0,233,170,254,88,134,196,233,73,248,138,46,98,0,177,0,232,147,254,176,109,232,98,254,232,175,254, 160,99,0,136,7,233,128,254,88,80,134,196,232,3,0,233,129,254,232,106,245,187,99,0,60,13,117,3,233,228,4,60,32,115,1,195,254, 7,83,232,141,254,91,254,192,116,244,254,200,56,7,233,197,4,88,134,196,162,98,0,195,160,97,0,10,192,116,3,233,232,172,128, 226,251,117,2,178,1,162,81,5,254,192,162,80,5,138,202,128,225,128,128,233,1,245,26,201,128,225,128,246,194,16,116,3,128,201, 32,160,96,0,10,192,116,2,177,1,10,201,117,9,246,6,95,0,255,116,2,177,64,136,14,72,5,181,255,176,104,232,210,253,138,39,232, 46,254,246,196,1,117,12,246,193,129,117,3,232,47,0,176,255,235,31,232,51,0,232,48,254,114,248,139,30,233,4,246,135,49,0,129, 117,10,232,17,1,115,5,198,6,80,5,0,176,1,162,97,0,232,231,253,198,7,1,233,186,253,187,63,5,185,17,0,180,3,205,21,195,187, 83,5,185,17,0,83,180,2,205,21,115,3,233,2,1,91,160,94,0,10,192,117,6,128,63,165,117,230,195,233,41,172,160,97,0,254,192,116, 11,50,192,162,97,0,162,96,0,233,205,229,139,30,233,4,246,135,49,0,129,117,234,232,59,0,232,31,1,235,226,83,187,97,0,56,39, 117,13,139,30,233,4,246,135,49,0,129,91,117,1,195,233,233,171,180,255,232,227,255,88,80,134,196,232,3,0,233,77,253,232,38, 0,136,7,254,193,116,11,232,93,253,136,15,195,232,87,253,138,15,187,83,5,181,0,254,201,65,136,15,180,3,205,21,232,68,253,198, 7,1,195,232,61,253,138,15,181,0,187,83,5,3,217,195,180,1,232,158,255,232,3,0,233,20,253,160,80,5,44,1,115,1,195,187,81,5, 138,7,198,7,0,10,192,116,1,195,232,10,0,115,7,198,6,80,5,0,10,192,195,232,195,255,138,7,254,193,232,252,252,136,15,232,239, 252,58,15,116,3,10,192,195,128,63,0,117,221,80,232,2,0,88,195,187,83,5,185,0,1,180,2,205,21,114,21,160,83,5,232,203,252,136, 7,232,206,252,198,7,1,254,200,249,116,1,248,195,128,252,4,117,5,178,24,233,111,171,233,37,171,160,80,5,44,1,26,192,233,147, 8,136,14,81,5,233,90,233,198,6,95,0,0,83,137,30,77,5,139,22,80,3,137,22,75,5,139,14,4,7,43,203,137,14,73,5,81,82,232,164, 254,90,89,91,160,96,0,10,192,6,116,2,142,194,180,3,205,21,7,232,137,0,186,5,0,185,0,0,73,117,253,74,117,250,232,118,0,195, 190,83,5,139,140,10,0,160,96,0,10,192,156,81,117,13,80,83,81,86,3,217,232,22,230,94,89,91,88,60,1,117,4,139,156,14,0,6,10, 192,116,14,139,148,12,0,254,200,116,4,139,22,80,3,142,194,180,2,205,21,7,114,18,89,157,117,11,139,30,48,0,3,217,67,137,30, 88,3,233,128,229,80,232,5,208,88,128,252,4,117,5,178,24,233,181,170,233,107,170,75,232,243,177,117,5,160,100,0,235,3,232, 232,193,10,192,117,4,176,1,235,2,176,0,162,100,0,138,224,205,21,195,205,219,249,235,1,248,139,243,156,139,14,165,4,138,195, 50,193,162,167,4,138,199,50,228,138,221,50,255,157,115,7,3,195,45,1,1,235,2,43,195,10,228,120,13,61,128,0,114,21,139,222, 131,196,2,233,93,23,5,128,0,121,11,139,222,131,196,2,233,223,29,5,128,0,162,166,4,187,165,4,128,15,128,139,222,50,255,128, 203,128,195,198,6,57,3,128,232,198,217,83,139,218,232,234,6,232,4,197,137,30,94,4,177,32,232,27,207,91,232,96,177,116,23, 232,49,208,40,232,167,217,82,138,7,60,44,117,5,232,76,177,235,241,232,30,208,41,137,30,59,3,14,184,233,93,80,255,54,80,3, 255,54,94,4,203,139,30,59,3,195,83,232,14,5,60,108,116,10,60,76,116,6,60,113,116,2,60,81,91,195,38,38,38,38,38,38,38,38,38, 38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,37,37,36,36,36,35,35,35,34,34,34,34,33,33,33,32,32,32,31,31,31,31,30,30, 30,29,29,29,29,28,28,28,27,27,27,26,26,26,25,25,25,25,24,24,24,23,23,23,23,22,22,22,22,21,21,21,20,20,20,19,19,19,19,18,18, 18,17,17,17,16,16,16,16,15,15,15,14,14,14,13,13,13,13,12,12,12,11,11,11,10,10,10,10,9,9,9,8,8,8,7,7,7,6,6,6,6,5,5,5,4,4,4, 3,3,3,3,2,2,2,1,1,1,0,0,0,0,255,255,255,254,254,254,253,253,253,253,252,252,252,251,251,251,250,250,250,250,249,249,249,248, 248,248,247,247,247,247,246,246,246,245,245,245,244,244,244,244,243,243,243,242,242,242,241,241,241,241,240,240,240,239,239, 239,238,238,238,238,237,237,237,236,236,236,235,235,235,235,234,234,234,233,233,233,232,232,232,231,231,231,231,230,230,230, 229,229,229,228,228,228,228,227,227,227,226,226,226,225,225,225,225,224,11,246,121,2,247,218,43,215,112,61,116,58,83,232, 144,28,156,115,3,232,106,12,11,210,120,15,131,250,39,114,29,157,115,3,232,61,12,91,233,177,21,131,250,218,125,14,131,194, 38,131,250,218,124,17,232,19,0,186,218,255,232,13,0,157,115,3,232,29,12,91,195,232,31,28,235,243,11,210,156,121,2,247,218, 185,3,0,211,226,129,194,50,96,135,218,232,37,29,157,120,3,233,236,12,232,236,28,233,212,8,114,9,176,13,144,233,15,251,198, 7,0,138,7,232,164,249,136,7,195,117,6,176,10,144,232,105,240,88,90,91,157,195,128,62,106,0,0,116,18,30,83,197,30,107,0,128, 63,0,91,31,117,5,198,6,106,0,0,233,114,175,95,94,233,190,237,117,16,91,136,54,167,4,187,0,16,198,6,251,2,4,233,40,21,199, 6,165,4,0,0,195,16,91,136,54,167,4,187,0,16,198,6,251,2,4,233,16,21,199,6,165,4,0,0,195,92,214,237,189,206,254,230,91,95, 166,180,54,65,95,112,9,99,207,97,132,17,119,204,43,102,67,122,229,213,148,191,86,105,106,108,175,5,189,55,6,109,133,71,27, 71,172,197,39,112,102,25,226,88,23,183,81,115,224,79,141,151,110,18,3,119,216,163,112,61,10,215,35,122,205,204,204,204,204, 204,76,125,0,0,0,0,0,0,0,129,0,0,0,0,0,0,32,132,0,0,0,0,0,0,72,135,0,0,0,0,0,0,122,138,0,0,0,0,0,64,28,142,0,0,0,0,0,80,67, 145,0,0,0,0,0,36,116,148,0,0,0,0,128,150,24,152,0,0,0,0,32,188,62,155,0,0,0,0,40,107,110,158,0,0,0,0,249,2,21,162,0,0,0,64, 183,67,58,165,0,0,0,16,165,212,104,168,0,0,0,42,231,132,17,172,0,0,128,244,32,230,53,175,0,0,160,49,169,95,99,178,0,0,4,191, 201,27,14,182,0,0,197,46,188,162,49,185,0,64,118,58,107,11,94,188,0,232,137,4,35,199,10,192,0,98,172,197,235,120,45,195,128, 122,23,183,38,215,88,198,144,172,110,50,120,134,7,202,181,87,10,63,22,104,41,205,162,237,204,206,27,194,83,208,133,20,64, 97,81,89,4,212,166,25,144,185,165,111,37,215,16,32,244,39,143,203,78,218,10,148,248,120,57,63,1,222,12,185,54,215,7,143,33, 225,79,103,4,205,201,242,73,228,35,129,69,64,124,111,124,231,182,112,43,168,173,197,29,235,228,76,54,18,25,55,69,238,28,224, 195,86,223,132,118,241,18,108,58,150,11,19,26,245,22,7,201,123,206,151,64,248,220,72,187,26,194,189,112,251,137,13,181,80, 153,118,22,255,0,0,0,0,0,0,0,128,241,4,53,128,4,154,247,25,131,36,99,67,131,117,205,141,132,169,127,131,130,4,0,0,0,129,226, 176,77,131,10,114,17,131,244,4,53,127,24,114,49,128,46,101,69,37,35,33,68,100,44,48,0,128,198,164,126,141,3,0,64,122,16,243, 90,0,0,160,114,78,24,9,0,0,16,165,212,232,0,0,0,232,118,72,23,0,0,0,228,11,84,2,0,0,0,202,154,59,0,0,0,0,225,245,5,0,0,0, 128,150,152,0,0,0,0,64,66,15,0,0,0,0,64,66,15,160,134,1,16,39,0,16,39,232,3,100,0,10,0,1,0,0,0,128,144,255,255,255,255,255, 255,127,255,255,255,255,255,255,255,255,255,59,170,56,129,7,124,136,89,116,224,151,38,119,196,29,30,122,94,80,99,124,26,254, 117,126,24,114,49,128,0,0,0,129,5,251,215,30,134,101,38,153,135,88,52,35,135,225,93,165,134,219,15,73,131,2,215,179,93,129, 0,0,128,129,4,98,53,131,126,80,36,76,126,121,169,170,127,0,0,0,129,11,68,78,110,131,249,34,126,253,67,3,195,158,38,1,0,0, 48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,186,59,170,187,56,129,232,114,10,160,166,4,60,136,115,60,60,104,114,75,255, 54,163,4,255,54,165,4,232,96,16,138,226,128,196,129,116,35,80,246,6,167,4,128,232,67,16,50,228,232,230,17,88,91,90,80,232, 168,4,187,23,98,232,141,18,91,51,210,138,218,233,50,10,131,196,4,128,38,165,4,128,116,3,233,145,24,50,228,136,38,167,4,233, 249,17,191,163,4,144,51,192,252,171,199,5,0,129,195,232,175,24,117,3,233,222,164,195,252,171,199,5,0,129,195,233,26,172,205, 185,128,54,165,4,128,128,54,177,4,128,233,138,3,205,186,135,217,233,90,4,205,187,135,217,233,71,4,205,188,232,51,25,233,27, 5,135,217,233,177,5,205,189,137,30,163,4,233,107,8,205,190,82,152,139,208,232,238,8,90,195,205,191,135,217,233,183,9,205, 192,135,217,233,237,13,129,251,0,128,117,19,205,193,232,211,8,51,210,187,128,144,232,5,4,232,75,26,233,69,8,247,219,83,3, 218,112,4,88,233,153,1,205,194,232,181,8,90,255,54,163,4,255,54,165,4,232,169,8,91,90,233,234,3,139,195,82,247,234,90,114, 5,139,216,233,118,1,205,195,83,232,145,8,90,255,54,163,4,255,54,165,4,232,133,8,91,90,233,82,9,11,219,117,12,136,54,167,4, 198,6,251,2,4,233,45,17,137,30,163,4,184,0,0,163,165,4,146,11,192,121,3,186,255,255,11,219,121,6,199,6,165,4,255,255,247, 62,163,4,139,216,233,42,1,135,217,232,215,24,135,217,195,83,232,69,26,91,131,195,4,195,139,22,163,4,139,14,165,4,195,156, 83,232,25,26,91,131,195,4,157,195,232,171,190,137,30,163,4,233,103,10,232,161,190,137,30,163,4,233,101,10,205,196,139,23, 139,159,2,0,233,77,3,94,255,54,163,4,255,54,165,4,255,230,205,197,135,217,232,160,24,135,217,195,232,100,23,116,3,233,147, 163,195,135,218,232,205,0,50,192,181,152,205,198,187,166,4,138,200,136,47,181,0,67,136,47,208,208,205,199,115,3,232,32,1, 138,229,138,217,233,51,16,232,146,254,83,51,219,137,30,163,4,183,129,137,30,165,4,198,6,251,2,4,232,4,20,91,198,6,251,2,4, 195,139,193,247,226,146,115,3,233,37,213,195,187,171,4,186,183,100,233,6,0,187,171,4,186,185,100,82,186,163,4,232,247,22, 114,3,186,159,4,195,138,205,50,237,235,8,135,218,160,251,2,152,139,200,252,139,242,139,251,243,164,139,214,139,223,195,232, 54,200,139,241,139,251,253,43,202,65,243,164,139,218,139,207,65,252,195,156,73,157,195,232,188,22,117,3,233,235,162,205,200, 120,3,233,131,22,161,163,4,11,192,116,6,176,1,121,2,176,255,195,51,192,11,219,117,243,195,91,195,152,139,216,198,6,251,2, 2,137,30,163,4,195,198,6,251,2,4,195,232,196,255,233,231,255,205,201,91,90,233,181,3,232,37,6,91,90,233,11,12,185,4,0,233, 136,255,156,138,23,67,157,156,138,55,67,139,15,67,157,156,67,157,195,83,187,40,7,232,6,22,91,185,182,38,81,232,181,255,50, 192,205,202,162,49,3,187,180,4,198,7,32,10,7,67,198,7,48,233,106,11,205,203,160,165,4,235,9,205,204,232,229,23,116,8,246, 208,208,224,26,192,116,61,195,205,205,128,54,167,4,128,51,219,246,221,139,195,27,194,139,208,138,195,26,193,138,200,195,232, 3,22,120,250,205,206,232,207,21,120,3,233,213,24,232,2,24,232,207,24,233,252,23,139,195,43,194,116,14,112,7,120,7,50,192, 254,192,195,120,249,249,26,192,195,59,218,117,5,51,219,233,38,0,139,194,137,30,163,4,11,219,232,211,249,144,144,144,121,6, 199,6,165,4,255,255,11,192,186,0,0,121,3,186,255,255,247,62,163,4,139,218,137,30,163,4,195,173,58,225,116,17,70,2,4,254,192, 152,3,240,59,245,117,239,139,214,233,57,210,58,6,251,2,117,233,58,44,117,229,70,138,208,172,58,6,142,0,116,4,2,194,235,220, 10,192,116,16,152,145,191,143,0,243,166,145,116,6,3,240,138,194,235,200,139,214,91,195,139,243,139,46,75,4,252,235,190,139, 243,139,46,92,3,252,233,13,0,173,58,225,116,17,70,172,152,3,240,173,3,240,59,238,117,239,139,222,233,83,211,58,6,251,2,117, 233,58,44,117,229,70,172,58,6,142,0,117,223,10,192,116,14,152,145,191,143,0,243,166,145,116,4,3,240,235,208,173,139,208,139, 222,233,5,211,232,24,22,195,161,165,4,10,228,116,245,128,54,165,4,128,205,215,176,0,162,158,4,162,170,4,160,178,4,10,192, 116,226,161,165,4,10,228,116,216,139,30,177,4,128,14,165,4,128,128,14,177,4,128,138,204,42,207,162,167,4,116,34,115,18,134, 195,246,217,162,167,4,136,62,166,4,80,81,232,111,21,89,88,128,249,57,115,95,83,248,232,33,21,160,167,4,91,50,195,187,158, 4,190,170,4,185,4,0,248,252,120,30,173,17,7,67,67,226,249,115,18,187,166,4,254,7,116,52,75,75,185,4,0,209,31,75,75,226,250, 233,233,17,173,25,7,67,67,226,249,115,26,246,151,1,0,185,4,0,75,75,247,23,226,250,185,4,0,255,7,117,6,67,67,226,248,116,200, 233,244,12,233,141,13,160,167,4,36,128,128,38,165,4,127,8,6,165,4,195,137,30,165,4,137,22,163,4,195,161,165,4,10,228,116, 240,128,54,165,4,128,10,255,116,239,161,165,4,10,228,116,224,51,201,139,54,163,4,162,167,4,138,204,42,207,115,13,246,217, 134,223,137,30,166,4,134,223,147,135,214,138,224,50,227,156,180,128,10,196,10,220,50,228,138,252,11,201,116,70,131,249,25, 114,18,157,137,54,163,4,138,38,167,4,37,127,128,10,196,162,165,4,195,128,249,8,114,28,233,5,3,144,138,243,50,219,128,233, 8,246,196,31,116,208,128,204,32,235,203,128,204,32,226,3,235,14,248,208,219,209,218,208,220,246,196,16,117,237,226,243,157, 121,37,42,204,138,225,27,242,139,214,26,195,138,216,115,47,246,22,167,4,246,212,247,210,246,211,254,196,117,33,66,117,30, 254,195,117,26,235,6,3,214,18,216,115,12,254,6,166,4,116,9,208,219,209,218,208,220,233,36,17,233,169,12,233,104,12,232,37, 19,195,160,177,4,162,167,4,233,167,12,246,6,166,4,255,116,240,246,6,178,4,255,116,229,139,30,177,4,232,243,244,137,30,177, 4,187,164,4,248,232,161,19,187,176,4,248,232,154,19,255,54,166,4,232,94,21,143,6,166,4,185,64,0,81,235,8,81,248,187,170,4, 232,119,19,139,252,131,236,8,131,239,2,190,176,4,185,4,0,253,243,165,190,120,4,185,4,0,187,170,4,248,252,173,25,7,67,67,226, 249,115,16,185,4,0,139,244,191,170,4,252,243,165,139,230,248,235,4,131,196,8,249,187,158,4,232,56,19,89,226,182,246,6,165, 4,128,116,9,255,6,166,4,117,9,233,7,12,187,158,4,232,31,19,233,49,16,232,148,18,117,7,136,30,167,4,233,0,12,10,255,117,3, 233,122,18,232,87,244,139,250,51,210,138,254,139,243,138,223,185,32,0,85,139,46,163,4,160,165,4,138,231,235,5,248,209,215, 209,214,86,87,43,253,27,240,115,4,95,94,235,4,131,196,4,248,245,209,210,209,211,226,228,11,219,121,10,254,6,166,4,117,8,93, 233,165,11,209,210,209,211,138,226,138,214,138,243,138,223,93,233,13,16,19,249,83,87,81,44,48,80,232,80,18,88,152,121,30, 139,30,163,4,129,251,205,12,115,25,139,203,209,227,209,227,3,217,209,227,3,216,120,11,137,30,163,4,235,72,80,114,8,235,51, 80,232,36,2,235,20,199,6,124,4,0,36,199,6,126,4,116,148,187,126,4,232,131,19,121,22,232,60,18,90,255,54,163,4,255,54,165, 4,232,139,2,91,90,232,204,253,235,19,232,231,1,232,35,18,232,238,18,90,232,119,2,232,218,1,232,238,252,89,95,91,195,205,217, 50,192,233,9,0,205,218,176,1,198,6,251,2,8,198,6,168,4,1,190,180,37,86,51,255,139,207,139,247,247,209,80,232,134,17,88,10, 192,117,5,198,6,251,2,2,138,7,60,38,117,3,233,7,176,60,45,156,116,5,60,43,116,1,75,232,251,248,115,6,232,61,255,233,245,255, 189,163,97,51,210,139,242,46,58,134,0,0,116,10,129,253,156,97,116,36,77,233,239,255,129,237,156,97,209,229,46,255,166,48, 106,75,106,95,106,95,106,103,106,109,106,115,106,64,106,64,106,50,192,232,156,0,232,65,0,233,45,0,65,117,247,232,81,17,121, 175,81,83,87,232,72,1,95,91,89,233,163,255,232,140,243,116,225,233,219,255,67,235,219,233,11,0,232,188,0,233,5,0,50,192,232, 182,0,157,117,13,232,45,19,232,33,17,122,5,83,232,237,18,91,195,233,118,244,198,6,85,4,255,232,137,164,139,212,233,227,8, 10,255,117,5,232,232,16,249,195,160,166,4,10,192,117,8,138,195,246,208,232,228,16,249,195,232,228,255,93,114,20,235,16,83, 139,31,232,217,255,91,93,114,8,83,87,191,165,4,144,85,195,254,192,44,1,195,246,196,255,138,226,116,3,128,204,32,138,214,233, 237,252,16,159,128,62,251,2,8,117,4,158,233,8,0,158,83,87,232,92,0,95,91,51,246,139,214,232,4,248,114,19,60,45,117,4,247, 214,235,5,60,43,116,1,195,232,242,247,114,1,195,129,250,204,12,114,5,186,255,127,235,239,80,184,10,0,247,226,90,128,234,48, 50,246,3,208,235,223,12,1,83,87,117,7,232,28,0,235,5,144,144,232,70,0,95,91,51,246,139,214,232,189,243,67,195,232,88,16,120, 249,233,111,156,116,49,232,78,16,123,86,117,3,233,123,156,205,207,121,5,232,63,0,235,72,176,4,162,251,2,138,30,165,4,136, 30,167,4,139,22,163,4,138,38,162,4,128,204,64,128,203,128,233,213,13,232,29,16,115,37,117,3,233,74,156,205,208,121,3,232, 14,0,176,8,162,251,2,51,192,163,159,4,163,161,4,195,82,86,139,22,163,4,232,131,0,94,90,195,232,242,15,121,5,139,30,163,4, 195,205,209,117,3,233,24,156,160,166,4,60,144,114,49,116,3,233,6,156,160,165,4,10,192,120,3,233,252,155,186,0,0,187,0,128, 232,138,251,232,203,6,232,205,17,186,0,0,187,128,144,232,236,16,116,3,233,223,155,187,0,128,235,45,160,165,4,10,192,156,121, 5,36,127,162,165,4,186,0,0,187,0,128,232,103,251,160,166,4,60,144,117,6,157,120,219,233,183,155,232,231,6,139,218,157,121, 2,247,219,137,30,163,4,198,6,251,2,2,195,51,219,50,228,190,167,4,198,132,255,255,144,198,4,0,11,210,121,5,247,218,198,4,128, 138,222,138,242,138,215,198,6,251,2,4,233,75,8,205,214,160,166,4,10,192,116,10,160,178,4,10,192,117,4,233,248,14,195,139, 30,177,4,232,218,240,255,54,166,4,137,30,177,4,232,86,17,139,240,163,166,4,187,120,4,163,178,4,189,171,4,139,0,11,192,116, 44,191,0,0,139,207,139,0,247,35,83,139,222,3,223,129,195,151,4,3,7,115,1,66,3,193,115,1,66,137,7,139,202,91,131,255,6,116, 4,71,71,235,219,139,193,83,187,159,4,137,0,91,131,254,6,116,4,70,70,235,190,190,157,4,253,185,7,0,172,10,192,225,251,116, 5,128,14,158,4,32,160,165,4,10,192,143,6,166,4,120,15,187,158,4,185,4,0,209,23,67,67,226,250,233,25,12,254,6,166,4,117,247, 233,221,7,232,115,14,116,4,10,255,117,3,233,96,14,232,58,240,139,14,165,4,50,237,161,163,4,138,253,83,81,82,81,80,247,226, 139,202,88,247,227,3,200,115,1,66,139,218,90,88,247,226,3,200,115,1,66,3,218,90,88,246,226,3,216,115,13,209,219,209,217,254, 6,166,4,117,3,233,144,7,10,255,121,9,254,6,166,4,117,7,233,131,7,209,209,209,211,138,213,138,243,138,223,138,225,233,236, 11,195,83,176,8,114,2,176,17,138,232,138,200,81,156,232,72,2,10,192,116,2,121,12,157,89,80,123,11,4,16,88,121,26,235,9,157, 89,235,38,4,7,88,121,15,80,232,246,11,88,138,224,2,225,126,22,2,232,235,12,2,197,254,197,58,232,181,3,114,12,138,232,254, 197,176,2,235,4,2,197,181,3,254,200,254,200,91,80,156,50,201,232,77,0,198,7,48,117,1,67,232,232,0,75,128,63,48,116,250,128, 63,46,116,1,67,157,88,116,43,156,80,232,191,13,180,69,123,2,180,68,136,39,67,88,157,198,7,43,121,5,198,7,45,246,216,180,47, 254,196,44,10,115,250,4,58,67,134,196,137,7,67,67,198,7,0,135,217,187,180,4,195,254,205,121,22,137,30,82,3,198,7,46,67,198, 7,48,254,197,117,248,67,51,201,235,26,254,205,117,12,198,7,46,137,30,82,3,67,51,201,235,10,254,201,117,6,198,7,44,67,177, 3,137,14,129,4,195,180,5,189,245,97,232,217,255,46,139,150,0,0,69,69,139,54,163,4,176,47,254,192,43,242,115,250,3,242,136, 7,67,137,54,163,4,254,204,117,221,232,182,255,198,7,0,195,185,1,3,190,6,0,235,6,185,4,4,190,4,0,191,179,4,252,187,116,98, 139,22,163,4,86,138,198,50,228,211,224,134,224,46,215,170,211,226,138,205,78,117,238,198,5,0,187,179,4,89,254,201,128,63, 48,117,3,67,226,248,195,232,233,12,123,119,81,83,190,159,4,191,171,4,185,4,0,252,243,165,232,117,3,83,187,177,4,232,253,13, 91,190,171,4,191,159,4,185,4,0,252,243,165,116,3,232,206,12,138,14,166,4,128,233,184,246,217,248,232,90,3,91,89,190,166,97, 176,9,232,46,255,80,176,47,80,88,254,192,80,232,148,0,115,247,232,163,0,88,235,11,117,9,198,7,49,67,198,7,48,235,2,136,7, 67,88,254,200,117,215,81,190,159,4,191,163,4,185,2,0,252,243,165,89,235,41,83,81,232,24,15,232,113,3,90,91,232,153,13,116, 11,137,30,165,4,137,22,163,4,232,115,12,176,1,232,178,3,137,30,165,4,137,22,163,4,89,91,176,3,186,236,97,232,199,254,80,83, 82,232,94,13,93,176,47,80,88,254,192,80,232,23,14,115,247,46,3,150,0,0,46,18,158,2,0,69,69,69,232,56,13,88,135,213,91,136, 7,67,88,254,200,117,206,66,66,139,234,180,4,233,179,254,81,86,185,7,0,191,159,4,248,252,46,172,24,5,71,226,249,94,89,195, 81,185,7,0,191,159,4,248,252,46,172,16,5,71,226,249,89,195,83,81,51,255,87,187,2,94,160,166,4,46,215,10,192,116,12,95,152, 43,248,87,139,208,232,50,239,235,232,187,102,96,232,136,12,232,45,13,115,6,232,230,11,95,79,87,232,176,11,114,31,187,122, 96,232,142,12,232,88,252,88,44,9,80,187,246,127,232,109,12,232,87,13,118,7,232,185,11,88,254,192,80,88,89,91,10,192,195,88, 89,91,10,192,195,187,180,4,138,47,177,32,138,38,131,4,246,196,32,116,13,58,233,177,42,117,7,246,196,4,117,2,138,233,136,15, 232,191,242,116,50,189,165,97,46,58,134,0,0,116,9,129,253,156,97,116,38,77,235,240,129,237,156,97,209,229,46,255,166,97,112, 117,112,117,112,121,112,121,112,121,112,121,112,117,112,121,112,60,112,60,112,75,198,7,48,138,38,131,4,246,196,16,116,4,75, 198,7,36,246,196,4,117,5,75,136,47,50,237,195,10,192,235,6,198,7,48,67,254,200,117,248,195,232,137,253,198,7,48,67,254,200, 117,245,195,187,180,4,198,7,32,83,232,193,10,91,156,121,10,198,7,45,83,232,236,12,91,12,1,67,198,7,48,157,195,205,216,232, 221,255,117,8,67,198,7,0,187,180,4,195,232,200,10,121,18,185,0,7,51,192,163,131,4,137,14,129,4,232,94,253,233,49,255,233, 120,252,232,129,10,121,3,233,96,159,117,1,195,160,166,4,208,232,80,198,6,166,4,64,208,22,166,4,187,171,4,232,9,13,185,4,0, 81,232,55,13,139,22,171,4,139,30,173,4,232,187,247,90,91,232,75,246,254,14,166,4,89,116,10,226,227,88,4,192,0,6,166,4,195, 233,47,10,191,190,37,87,191,168,4,198,5,1,232,44,10,117,3,233,54,241,121,7,10,255,117,10,233,147,3,10,255,117,3,233,13,10, 10,219,121,38,128,62,166,4,153,114,3,233,237,158,82,83,255,54,163,4,255,54,165,4,232,50,1,91,90,232,90,11,232,61,11,91,90, 116,3,233,209,158,160,165,4,10,192,121,9,191,196,113,87,36,127,162,165,4,83,82,128,203,127,156,255,54,165,4,255,54,163,4, 232,2,1,90,91,232,42,11,117,28,82,83,51,210,187,0,144,232,30,11,91,90,121,14,157,90,91,235,60,144,51,210,187,0,129,233,18, 247,157,121,14,83,82,232,47,1,138,194,232,197,2,90,91,208,216,143,6,163,4,143,6,165,4,159,128,38,165,4,127,158,115,4,191, 176,125,87,83,82,232,21,1,90,91,232,3,251,233,133,240,83,82,232,255,0,137,22,178,4,199,6,163,4,0,0,199,6,165,4,0,129,209, 46,178,4,115,7,90,91,83,82,232,222,250,247,6,178,4,255,255,116,21,90,91,232,33,12,232,141,10,232,203,250,90,91,232,22,12, 232,130,10,235,214,90,91,195,138,14,166,4,128,233,184,115,57,246,217,156,187,164,4,138,135,1,0,136,135,3,0,10,192,156,12, 128,136,135,1,0,198,135,2,0,184,157,156,121,3,232,34,0,50,237,232,18,0,157,121,3,232,38,0,198,6,158,4,0,157,115,3,233,189, 1,195,81,83,248,232,122,9,91,89,226,246,195,83,187,159,4,131,47,1,115,4,67,67,235,247,91,195,83,187,159,4,254,7,117,3,67, 235,249,91,195,138,14,166,4,128,233,152,115,65,246,217,156,139,22,163,4,139,30,165,4,10,219,156,136,30,167,4,198,6,166,4, 152,128,203,128,157,156,121,6,131,234,1,128,219,0,50,237,10,201,116,6,208,235,209,218,226,250,157,159,121,5,66,117,2,254, 195,157,115,5,50,228,233,169,1,158,121,10,247,210,246,211,131,194,1,128,211,0,195,177,152,42,14,166,4,248,235,170,232,102, 8,126,81,186,0,0,187,0,129,232,190,9,117,9,137,22,163,4,137,22,165,4,195,160,166,4,44,128,152,80,198,6,166,4,128,232,27,11, 187,118,97,232,24,2,90,91,232,16,11,232,124,9,187,135,97,232,10,2,90,91,232,145,245,90,232,254,10,232,217,248,90,91,232,26, 244,187,49,128,186,24,114,233,157,249,233,244,156,233,92,148,159,134,224,80,176,1,235,2,50,192,162,85,4,88,134,196,158,186, 0,0,137,30,83,4,116,3,232,233,195,137,30,59,3,232,172,147,117,215,139,227,139,54,83,4,57,55,117,205,82,138,167,2,0,80,82, 131,195,4,246,135,255,255,128,120,65,185,2,0,252,139,243,191,163,4,243,165,91,86,83,246,6,85,4,255,117,15,190,86,4,131,239, 4,185,2,0,243,165,50,192,116,3,232,75,240,95,190,163,4,185,2,0,252,243,165,94,139,20,139,140,2,0,131,198,4,86,232,73,240, 235,39,131,195,4,139,15,67,67,94,139,20,246,6,85,4,255,117,6,139,22,86,4,235,4,3,209,112,53,137,20,82,139,23,67,67,88,83, 232,165,241,91,89,42,197,232,31,241,116,11,137,22,46,0,139,209,135,211,233,124,154,139,227,137,30,69,3,139,30,59,3,128,63, 44,117,9,232,85,246,232,66,255,233,147,147,233,168,154,81,83,86,87,82,178,57,187,158,4,191,165,4,190,166,4,235,25,83,185, 4,0,248,209,23,67,67,226,250,91,246,7,64,117,41,254,12,116,42,254,202,116,38,246,5,255,120,33,117,224,128,44,8,118,26,128, 234,8,118,21,190,164,4,185,7,0,253,243,164,128,38,158,4,32,235,190,128,15,32,235,210,90,95,94,91,89,118,3,233,116,4,233,192, 6,138,62,166,4,185,4,0,10,219,120,33,117,17,128,239,8,114,23,138,222,138,242,138,212,50,228,226,235,116,11,248,208,212,209, 210,208,211,254,207,117,222,233,161,6,136,62,166,4,233,131,4,204,32,235,244,136,62,166,4,233,120,4,83,232,2,0,91,195,232, 45,0,187,10,4,235,12,83,232,2,0,91,195,232,31,0,187,99,4,128,62,168,4,1,120,7,117,18,198,6,168,4,2,232,129,175,176,13,232, 137,175,176,10,232,132,175,195,252,10,255,190,3,98,116,10,246,6,167,4,128,121,3,190,11,98,232,123,6,114,8,191,159,4,185,4, 0,235,9,131,198,4,191,163,4,185,2,0,46,165,226,252,195,232,13,9,83,232,129,7,232,182,247,91,232,5,0,90,91,233,173,247,46, 138,7,152,232,246,8,80,67,46,139,7,163,163,4,131,195,2,46,139,7,163,165,4,131,195,2,88,90,89,72,116,28,81,82,80,83,135,217, 232,131,247,91,83,46,139,23,46,139,159,2,0,232,234,241,91,131,195,4,235,222,195,83,208,232,115,3,233,9,1,187,178,96,232,214, 6,232,47,7,114,9,91,232,35,251,75,198,7,37,195,232,243,5,181,16,115,2,181,7,232,189,5,116,3,232,4,250,91,120,63,138,208,2, 197,42,6,130,4,121,5,246,216,232,194,250,50,201,232,177,0,255,54,129,4,82,232,218,248,90,143,6,129,4,255,54,129,4,50,192, 10,194,116,6,232,179,250,232,57,248,143,6,129,4,255,54,129,4,160,129,4,233,114,2,138,208,160,129,4,10,192,116,2,254,200,138, 240,2,194,138,200,120,4,50,192,138,200,121,17,80,81,82,83,232,169,5,91,90,89,88,254,192,120,241,138,225,138,194,42,193,2, 197,121,23,160,130,4,232,90,250,198,7,46,137,30,82,3,67,50,201,138,198,42,197,233,161,9,160,130,4,82,255,54,129,4,42,197, 42,194,2,193,120,3,232,54,250,232,39,0,255,54,129,4,232,81,248,160,130,4,143,6,129,4,10,192,88,90,117,7,139,30,82,3,233,103, 1,2,194,254,200,120,3,232,15,250,233,91,1,138,197,2,194,42,193,254,192,138,232,44,3,127,252,4,3,138,200,160,131,4,36,64,117, 2,138,200,195,232,254,4,180,7,114,2,180,16,232,200,4,91,249,116,9,83,80,232,11,249,90,91,138,230,156,80,139,22,129,4,10,246, 156,10,210,116,2,254,202,2,242,157,116,9,246,6,131,4,4,117,2,254,206,42,244,138,230,80,120,3,233,78,0,83,80,80,232,225,4, 88,254,196,117,247,232,191,4,232,142,7,88,80,185,3,0,210,228,232,166,4,114,16,138,196,152,187,178,96,3,216,232,107,5,232, 85,6,235,14,187,110,96,138,196,152,3,216,232,83,5,232,248,5,88,91,120,17,88,89,254,193,81,80,83,80,232,157,4,88,91,235,2, 50,228,246,220,160,130,4,2,224,254,196,10,192,116,9,246,6,131,4,4,117,2,254,204,138,236,50,201,88,255,54,129,4,80,136,46, 130,4,232,94,247,88,10,228,126,5,138,196,232,63,249,88,163,129,4,10,192,117,12,75,138,7,60,46,116,1,67,137,30,82,3,88,157, 114,21,2,196,138,38,130,4,42,196,10,228,116,9,246,6,131,4,4,117,2,254,192,10,192,232,74,246,139,217,233,71,0,138,224,246, 196,64,180,3,117,2,50,228,163,131,4,137,14,129,4,138,224,187,180,4,198,7,32,246,196,8,116,3,198,7,43,83,232,182,3,91,121, 8,198,7,45,83,232,226,5,91,67,198,7,48,232,209,3,161,131,4,139,14,129,4,120,3,233,179,253,233,104,0,83,232,59,248,91,116, 3,136,47,67,198,7,0,187,179,4,67,139,62,82,3,139,22,129,4,160,130,4,50,228,43,251,43,248,116,67,138,7,60,32,116,230,60,42, 116,226,180,1,75,83,80,232,234,234,50,228,60,45,116,246,60,43,116,242,60,36,116,238,60,48,117,22,67,232,212,234,115,16,75, 235,3,75,136,7,88,10,228,116,248,131,196,2,235,179,88,10,228,116,251,91,198,7,37,195,161,131,4,138,204,181,6,208,232,139, 22,129,4,115,11,83,82,232,69,243,50,192,90,233,63,254,138,198,44,5,120,3,232,38,248,82,232,218,245,88,80,10,192,117,1,75, 254,200,120,6,232,20,248,198,7,0,143,6,129,4,233,89,255,232,235,2,116,109,121,12,161,163,4,163,11,0,160,165,4,162,13,0,161, 11,0,46,247,38,107,98,139,248,138,202,46,160,109,98,246,38,11,0,2,200,46,160,13,0,46,246,38,107,98,2,200,50,192,46,139,22, 110,98,3,215,46,138,30,112,98,18,217,162,167,4,176,128,162,166,4,137,22,11,0,136,30,13,0,176,4,162,251,2,233,187,251,0,0, 0,187,179,4,185,32,0,3,7,67,67,226,250,36,254,163,11,0,235,161,139,22,11,0,138,30,13,0,51,192,176,128,162,166,4,136,38,167, 4,233,143,251,83,81,187,158,4,129,7,128,0,185,3,0,115,14,67,67,255,7,117,8,226,248,254,6,166,4,209,31,89,116,32,246,6,158, 4,255,117,5,128,38,159,4,254,187,165,4,138,7,138,167,2,0,36,127,128,228,128,10,224,136,39,91,195,144,144,144,233,136,251, 128,228,224,128,196,128,115,28,156,66,117,18,157,254,195,117,19,249,208,219,254,6,166,4,117,10,144,233,106,251,157,117,3, 128,226,254,86,190,163,4,137,20,70,70,138,62,167,4,129,227,127,128,10,223,136,28,94,195,139,241,232,180,4,139,206,81,232, 9,2,114,9,128,62,166,4,184,121,15,235,7,128,62,166,4,152,121,6,232,0,2,232,207,4,187,134,4,232,81,4,89,81,191,142,4,187,134, 4,232,53,4,187,134,4,232,93,4,232,253,1,232,178,4,187,134,4,232,52,4,232,251,1,187,148,4,232,197,1,115,3,131,235,4,232,87, 4,89,117,4,254,193,235,204,139,233,232,117,4,139,205,195,128,38,165,4,127,232,134,0,232,165,0,198,6,178,4,127,232,163,236, 232,132,0,235,27,101,237,161,165,4,128,252,119,115,1,195,10,192,121,9,36,127,162,165,4,184,176,125,80,232,91,0,160,166,4, 10,192,116,5,128,6,166,4,2,232,97,0,161,177,4,128,252,130,156,246,196,1,117,2,168,64,156,232,73,0,157,116,9,187,50,96,232, 55,2,232,72,236,128,46,166,4,2,115,3,232,0,1,232,3,241,160,166,4,60,116,115,11,186,219,15,187,73,131,232,142,242,235,6,187, 52,98,232,198,250,157,117,5,128,54,165,4,128,195,187,99,98,232,0,2,232,8,241,232,199,241,232,6,0,232,8,236,233,25,3,232,173, 3,232,164,247,232,0,2,232,195,3,195,187,50,96,233,222,1,184,240,195,255,54,165,4,255,54,163,4,232,86,255,90,91,255,54,163, 4,255,54,165,4,232,249,1,232,44,255,91,90,233,17,238,161,165,4,10,192,121,9,191,176,125,87,36,127,162,165,4,128,252,129,114, 12,191,57,123,87,51,210,187,0,129,232,240,237,186,162,48,187,9,127,232,225,1,120,58,191,66,123,87,255,54,163,4,255,54,165, 4,186,215,179,187,93,129,232,101,236,91,90,255,54,163,4,255,54,165,4,232,163,1,187,73,98,232,49,250,91,90,255,54,163,4,255, 54,165,4,232,144,1,91,90,232,171,237,187,82,98,233,6,250,186,219,15,187,73,129,233,37,236,186,146,10,187,6,128,233,40,236, 232,87,176,60,13,117,3,232,35,177,46,138,7,67,10,192,117,238,195,191,159,4,185,4,0,184,0,0,252,243,171,195,184,0,0,163,163, 4,163,165,4,195,232,120,231,121,14,161,163,4,11,192,116,32,176,1,121,28,246,216,195,205,212,160,166,4,10,192,116,16,160,165, 4,10,192,116,7,176,1,121,5,246,216,195,12,1,195,160,251,2,60,8,254,200,254,200,254,200,195,232,241,255,114,12,83,187,106, 97,232,206,0,232,237,234,91,195,51,210,187,0,128,232,172,235,195,232,215,255,187,42,96,114,17,235,8,232,205,255,187,58,96, 114,7,232,171,0,232,117,240,195,255,54,165,4,255,54,163,4,198,6,251,2,8,232,156,0,232,112,239,90,91,232,6,241,195,185,4,0, 209,23,67,67,226,250,195,185,4,0,209,31,75,75,226,250,195,128,143,2,0,32,226,1,195,187,176,4,128,249,8,114,38,81,185,7,0, 187,170,4,138,39,138,135,1,0,136,7,67,226,247,50,192,136,7,89,128,233,8,128,228,32,116,217,8,38,170,4,233,210,255,10,201, 116,15,81,248,232,183,255,89,246,135,2,0,16,117,185,226,191,195,190,159,4,191,171,4,252,185,4,0,139,5,165,137,132,254,255, 226,247,195,191,124,4,185,2,0,235,6,191,120,4,185,4,0,252,46,139,7,171,67,67,226,248,139,223,75,75,195,191,171,4,235,234, 191,159,4,235,229,191,171,4,185,4,0,135,222,252,243,165,135,222,195,81,83,87,187,159,4,191,171,4,185,4,0,232,233,255,95,91, 89,195,81,83,87,187,171,4,191,159,4,235,235,137,22,163,4,137,30,165,4,195,139,22,163,4,139,30,165,4,195,232,207,254,114,63, 233,137,0,232,215,237,83,87,138,195,50,6,165,4,120,60,10,219,120,16,161,165,4,43,195,114,63,117,55,161,163,4,43,194,235,16, 139,195,43,6,165,4,114,46,117,38,139,194,43,6,163,4,114,36,117,28,50,192,235,74,192,235,71,232,163,237,144,144,139,7,50,6, 165,4,121,19,138,38,165,4,10,228,120,6,176,1,10,192,235,44,176,255,249,235,39,81,185,2,0,135,222,160,165,4,10,192,121,2,135, 247,253,167,117,6,226,251,176,0,235,13,115,6,176,1,10,192,235,5,176,255,10,192,249,89,95,91,195,187,177,4,232,86,237,144, 144,138,5,50,7,121,2,235,179,81,185,4,0,235,196,187,255,97,232,242,254,232,151,255,117,11,198,6,251,2,2,199,6,163,4,0,128, 195,46,43,150,0,0,46,26,158,2,0,195,232,9,254,120,8,160,165,4,10,192,120,14,195,161,163,4,11,192,120,17,195,232,244,253,120, 8,205,210,128,54,165,4,128,195,161,163,4,61,0,128,117,10,205,211,83,232,219,237,91,233,230,255,247,30,163,4,195,187,121,4, 232,51,0,191,151,4,185,8,0,184,0,0,252,243,171,162,120,4,162,170,4,195,232,183,253,114,3,233,162,254,139,23,139,159,2,0,195, 185,4,0,232,165,253,114,3,233,150,254,185,2,0,233,144,254,185,4,0,135,251,187,159,4,232,143,253,114,3,233,128,254,135,223, 185,2,0,191,163,4,135,251,233,115,254,185,4,0,191,159,4,232,116,253,114,3,233,101,254,185,2,0,191,163,4,233,92,254,232,99, 253,114,3,233,29,255,233,205,254,232,88,253,185,4,0,115,3,185,2,0,93,191,165,4,255,53,79,79,226,250,85,195,191,171,4,185, 4,0,235,17,232,57,253,191,159,4,185,4,0,115,6,191,163,4,185,2,0,88,143,5,71,71,226,250,80,195,232,31,253,121,1,195,205,213, 114,3,233,180,243,233,27,244,0,0,250,186,96,0,142,218,142,194,142,210,50,192,162,100,4,181,145,187,0,0,186,154,6,139,242, 46,172,136,7,67,66,254,205,117,244,188,14,7,205,18,250,187,64,0,247,227,140,219,43,195,187,0,0,246,196,240,117,6,177,4,211, 224,139,216,75,137,30,44,0,139,227,233,34,205,176,44,162,246,1,187,183,0,198,7,58,50,192,162,249,2,162,6,0,162,107,4,162, 101,4,162,40,0,187,14,3,137,30,12,3,187,122,3,137,30,226,3,139,30,44,0,75,137,30,10,3,75,83,187,14,7,176,4,162,223,4,83,137, 30,224,4,160,223,4,254,192,2,192,138,208,182,0,3,218,90,135,218,139,30,224,4,136,23,67,136,55,67,160,223,4,185,52,0,10,192, 116,14,135,218,3,217,135,218,137,23,67,67,254,200,117,242,135,218,3,217,67,83,254,200,162,54,5,139,30,224,4,139,23,187,51, 0,3,218,137,30,228,4,91,67,137,30,48,0,137,30,69,3,90,138,194,36,254,138,208,138,194,42,195,138,216,138,198,26,199,138,248, 115,3,233,104,173,177,3,211,235,138,199,60,2,114,3,187,0,2,138,194,42,195,138,216,138,198,26,199,138,248,115,3,233,74,173, 137,30,10,3,135,218,137,30,44,0,137,30,47,3,139,227,137,30,69,3,139,30,48,0,135,218,232,61,173,43,218,75,75,83,91,232,128, 229,187,220,127,232,127,251,232,152,172,233,143,195,32,66,121,116,101,115,32,102,114,101,101,0,20,232,165,240,51,201,82,255, 54,129,4,233,104,246,253,255,3,191,201,27,14,182,0,0,54,50,88,48,56,57,48,32,67,79,80,82,46,32,73,66,77,32,49,57,56,54,213, 224,143,225,32,75,66,32,79,75,13,232,203,25,138,251,232,198,25,138,235,138,207,250,252,176,253,230,33,191,0,5,176,10,230, 32,186,97,0,176,204,238,176,76,238,74,228,32,36,2,116,250,236,170,66,226,238,234,0,5,0,0,204,204,204,204,204,204,204,250, 180,213,158,115,74,117,72,123,70,121,68,159,177,5,210,236,115,61,176,64,208,224,113,55,50,228,158,118,50,120,48,122,46,159, 210,236,114,41,208,228,112,37,184,255,255,249,142,216,140,219,142,195,140,193,142,209,140,210,139,226,139,236,139,245,139, 254,115,7,51,199,117,7,248,235,227,11,199,116,1,244,230,160,230,131,186,216,3,238,254,192,178,184,238,176,137,230,99,176, 165,230,97,176,1,230,96,140,200,142,208,142,216,252,187,0,0,188,22,224,233,243,23,117,212,176,2,230,96,176,4,230,8,176,84, 230,67,138,193,230,65,176,64,230,67,128,251,255,116,7,228,65,10,216,226,241,244,138,195,43,201,230,65,176,64,230,67,144,144, 228,65,34,216,116,3,226,242,244,176,3,230,96,230,13,176,255,138,216,138,248,185,8,0,186,0,0,238,80,238,176,1,236,138,224, 236,59,216,116,1,244,66,249,226,238,115,249,254,192,116,222,142,219,142,195,176,255,230,1,80,230,1,176,88,230,11,176,0,138, 232,230,8,80,230,10,176,18,230,65,176,65,230,11,80,228,8,36,16,116,1,244,176,66,230,11,176,67,230,11,173,173,173,173,139, 30,114,4,139,46,150,4,131,253,16,116,2,43,237,185,0,128,43,192,243,171,129,251,52,18,116,22,188,24,224,185,0,128,233,67,11, 116,11,179,4,230,96,43,201,226,254,147,235,247,137,30,114,4,137,46,150,4,43,237,186,0,16,187,64,0,142,194,43,255,184,85,170, 38,137,5,252,38,51,5,252,117,17,185,0,32,243,171,129,194,0,4,131,195,16,128,254,160,117,222,137,30,19,4,184,48,0,142,208, 188,0,1,176,19,230,32,176,8,230,33,176,9,230,33,176,255,230,33,30,185,32,0,43,255,142,199,184,35,255,171,140,200,171,226, 247,191,64,0,14,31,190,3,255,185,16,0,165,71,71,226,251,31,30,199,6,126,0,0,0,228,98,36,15,138,224,176,173,230,97,144,228, 98,177,4,210,192,36,240,10,196,42,228,163,16,4,176,153,230,99,232,174,23,128,251,234,117,7,198,6,150,4,16,235,33,128,251, 170,116,28,128,251,101,117,3,233,212,253,10,219,117,16,176,56,230,97,144,144,228,96,36,255,117,4,254,6,18,4,161,16,4,80,176, 48,163,16,4,42,228,205,16,176,32,163,16,4,42,228,205,16,88,163,16,4,36,48,117,10,191,64,0,199,5,73,255,233,180,0,60,48,116, 8,180,1,60,32,117,2,180,3,134,224,80,42,228,205,16,88,80,187,0,176,235,35,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,233,150,21,186,184,3,185,0,8,176,1,128,252, 48,116,9,183,184,186,216,3,181,32,254,200,238,129,62,114,4,52,18,142,195,116,7,142,219,232,230,9,117,51,88,80,180,0,205,16, 184,32,112,43,255,185,40,0,243,171,88,80,128,252,48,186,186,3,116,3,186,218,3,180,8,43,201,236,34,196,117,4,226,249,235,9, 43,201,236,34,196,116,19,226,249,51,210,142,218,198,6,21,4,6,186,2,1,232,116,22,235,6,177,3,210,236,117,213,88,180,0,205, 16,186,0,192,142,218,43,219,139,7,252,252,61,85,170,117,5,232,208,21,235,4,129,194,128,0,129,250,0,200,124,228,31,198,6,21, 4,5,176,0,230,33,228,33,10,192,117,27,176,255,230,33,228,33,4,1,117,17,162,107,4,251,43,201,226,254,226,254,128,62,107,4, 0,116,8,190,213,248,232,232,21,250,244,198,6,21,4,2,176,254,230,33,176,16,230,67,185,22,0,138,193,230,64,246,6,107,4,1,117, 4,226,247,235,217,177,12,176,255,230,64,198,6,107,4,0,176,254,230,33,246,6,107,4,1,117,195,226,247,176,255,230,33,176,54, 230,67,176,0,230,64,230,64,176,153,230,99,160,16,4,36,1,116,48,128,62,18,4,1,116,41,232,249,21,227,30,176,73,230,97,128,251, 170,117,21,176,200,230,97,176,72,230,97,43,201,226,254,228,96,60,0,116,9,232,78,21,190,138,233,232,102,21,30,43,192,142,192, 185,8,0,14,31,190,243,254,191,32,0,165,71,71,226,251,31,199,6,8,0,195,226,199,6,20,0,84,255,199,6,98,0,0,246,128,62,18,4, 1,117,10,199,6,112,0,18,249,176,254,230,33,186,16,2,184,85,85,238,176,15,236,58,196,117,67,247,208,238,176,15,236,58,196, 117,57,187,1,0,186,21,2,185,16,0,46,136,7,144,236,58,199,117,33,66,236,58,195,117,27,74,209,227,226,236,185,8,0,176,1,74, 138,224,238,176,1,236,58,196,117,6,208,224,226,242,235,6,190,229,248,232,220,20,232,117,21,30,129,62,114,0,52,18,117,3,233, 148,0,184,64,0,232,215,2,139,54,19,0,177,6,211,230,51,255,184,0,12,142,216,199,5,170,85,137,69,2,5,0,4,59,198,114,240,187, 0,12,184,48,0,142,219,142,195,86,83,80,51,255,50,192,129,61,170,85,117,50,57,93,2,117,45,185,0,32,232,229,7,117,37,88,5,16, 0,232,143,2,91,94,129,195,0,4,59,222,114,209,176,10,232,99,20,228,8,36,1,117,49,31,198,6,21,0,3,233,115,254,138,232,176,13, 232,77,20,176,10,232,72,20,88,91,94,140,218,31,30,163,19,0,136,54,21,0,232,140,7,138,197,232,33,20,190,218,248,232,57,20, 186,0,200,142,218,43,219,139,7,252,252,61,85,170,117,5,232,209,19,235,4,129,194,128,0,129,250,0,240,124,228,31,160,16,0,36, 1,116,94,186,241,3,236,144,187,255,255,36,248,128,38,143,0,254,60,80,117,5,128,14,143,0,1,228,33,36,191,230,33,180,0,138, 212,205,19,246,196,255,117,25,186,242,3,176,28,238,43,201,226,254,226,254,51,210,181,34,136,22,62,0,232,203,36,115,5,190, 144,233,235,2,51,246,176,12,186,242,3,238,232,48,38,114,4,11,246,116,6,190,144,233,232,180,19,198,6,107,0,0,190,30,0,137, 54,26,0,137,54,28,0,137,54,128,0,131,198,32,137,54,130,0,191,120,0,30,7,184,20,20,171,171,184,1,1,171,171,228,33,36,252,230, 33,131,253,0,116,23,186,2,0,232,168,19,190,105,231,232,148,19,180,0,205,22,128,252,59,117,247,235,13,128,62,18,0,1,116,6, 186,1,0,232,138,19,160,16,0,36,1,117,3,233,55,250,42,228,160,73,0,205,16,189,111,249,190,0,0,46,139,86,0,176,170,238,30,236, 31,60,170,117,5,137,84,8,70,70,69,69,129,253,117,249,117,229,187,0,0,186,250,3,236,168,248,117,6,199,7,248,3,67,67,186,250, 2,236,168,248,117,6,199,7,248,2,67,67,139,198,177,3,210,200,10,195,162,17,0,186,1,2,236,144,144,144,168,15,117,5,128,14,17, 0,16,228,97,12,48,230,97,36,207,230,97,176,128,230,160,205,25,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,251,43,192,142,216,199,6,120,0,199,239,140,14,122,0,185,4,0,81, 180,0,205,19,114,15,184,1,2,43,210,142,194,187,0,124,185,1,0,205,19,89,115,4,226,229,205,24,234,0,124,0,0,204,204,204,23, 4,0,3,128,1,192,0,96,0,48,0,24,0,12,0,233,40,44,8,0,251,0,2,144,0,0,0,0,82,80,140,218,38,136,54,21,0,129,250,0,200,124,12, 232,101,5,190,224,248,232,23,18,88,90,195,186,2,1,232,61,18,235,245,69,82,82,79,82,46,32,40,82,69,83,85,77,69,32,61,32,34, 70,49,34,32,75,69,89,41,13,10,80,187,10,0,185,3,0,51,210,247,243,128,202,48,82,226,246,185,3,0,88,232,203,17,226,250,185, 7,0,190,26,224,46,138,4,70,232,188,17,226,247,88,195,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,233,48,36,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,233,248,35,32,51,48,49,13,10,54,48,49,13, 10,251,128,252,12,245,114,23,30,232,113,16,86,138,196,152,3,192,139,240,250,46,255,148,182,233,251,180,0,94,31,202,2,0,206, 233,223,233,237,233,237,233,237,233,237,233,237,233,237,233,237,233,237,233,239,233,244,233,160,112,0,198,6,112,0,0,139,14, 110,0,139,22,108,0,195,137,22,108,0,137,14,110,0,198,6,112,0,0,195,249,195,139,14,206,0,195,137,14,206,0,195,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,233,6,20,156,250,176,182,230,67,144,138,193,230,66,144,138, 197,230,66,228,97,138,224,12,3,230,97,157,185,11,4,232,37,0,254,203,117,246,156,250,228,97,12,252,34,224,138,196,36,252,230, 97,157,185,11,4,232,12,0,156,250,228,97,36,3,10,196,230,97,157,195,80,209,233,131,209,0,227,19,230,12,156,250,228,0,36,254, 58,224,138,224,228,0,116,244,157,226,239,88,195,138,198,232,149,12,138,194,232,144,12,176,48,232,156,12,176,32,232,151,12, 195,139,217,252,43,255,180,255,136,37,138,5,50,196,117,127,254,204,117,244,184,170,85,139,208,243,171,228,97,12,48,230,97, 144,36,207,230,97,79,79,253,139,247,139,203,173,51,194,117,87,184,85,170,171,226,245,252,71,71,139,247,139,203,139,208,173, 51,194,117,67,72,72,171,226,246,79,79,253,139,247,139,203,139,208,173,51,194,117,48,184,1,2,171,226,245,252,71,71,139,247, 139,203,139,208,173,51,194,171,225,250,117,25,79,79,253,139,247,139,203,139,208,173,51,194,225,251,117,9,228,98,36,192,176, 0,235,7,144,60,0,117,2,10,196,252,195,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,233,116,28,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,223,2,37,2,9,42,255,80,246,15,8,39,128,223,2,37,2, 9,42,255,80,246,15,8,39,64,223,2,37,2,15,27,255,84,246,15,8,79,0,223,2,37,2,9,42,255,80,246,15,8,79,128,223,2,37,2,9,42,255, 80,246,15,8,79,128,175,2,37,2,18,27,255,108,246,15,8,79,0,207,2,37,2,8,42,255,80,246,25,4,233,9,35,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,165,20,140,21,173,21,213,21,203,27,236,21,85,22,243,22,69,23,162,23,212, 23,14,22,150,24,133,24,68,27,52,22,233,6,36,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,56,40,45,10,31,6,25,28,2,7,6,7,0,0,0,0,113,80,90,10,31,6,25,28,2,7,6,7,0,0,0,0,56,40, 45,10,127,6,100,112,2,1,6,7,0,0,0,0,97,80,82,15,25,6,25,25,2,13,11,12,0,0,0,0,0,8,0,16,0,64,0,64,40,40,80,80,40,40,80,80, 44,40,45,41,42,46,30,41,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,251,30,232,203,1,161,19,0,31,207,204,204,251,30,232,191,1,161,16,0,31,207,204,204,233,19,36,80, 228,98,168,192,117,2,88,207,80,51,192,230,160,232,164,1,160,73,0,205,16,88,190,235,248,168,128,116,5,80,232,24,1,88,190,251, 248,168,64,116,3,232,13,1,228,97,12,48,230,97,36,207,230,97,252,43,210,228,98,168,192,117,31,139,30,19,0,142,218,43,246,185, 8,0,243,173,228,98,168,192,117,20,66,247,194,255,15,117,234,131,235,64,119,229,190,11,249,232,213,0,250,244,232,247,243,250, 244,185,0,0,50,192,2,7,67,226,251,10,192,195,49,48,49,13,10,32,50,48,49,13,10,82,79,77,13,10,49,56,48,49,13,10,80,65,82,73, 84,89,32,67,72,69,67,75,32,49,13,10,80,65,82,73,84,89,32,67,72,69,67,75,32,50,13,10,63,63,63,63,63,13,10,251,80,228,97,52, 64,230,97,176,32,230,32,88,207,184,64,0,142,192,42,228,138,71,2,177,9,211,224,139,200,81,185,4,0,211,232,3,208,89,232,143, 255,116,5,232,5,238,235,19,82,38,199,6,103,0,3,0,38,140,30,105,0,38,255,30,103,0,90,195,80,177,4,210,232,232,3,0,88,36,15, 4,144,39,20,64,39,180,14,183,0,205,16,195,188,3,120,3,120,2,139,238,232,28,0,30,232,147,0,160,16,0,36,1,117,15,250,176,137, 230,99,176,133,230,97,160,21,0,230,96,244,31,195,46,138,4,70,80,232,202,255,88,60,10,117,243,195,156,250,10,246,116,30,179, 112,185,0,5,232,170,242,185,51,194,232,232,242,254,206,117,238,30,232,81,0,128,62,18,0,1,31,116,189,179,18,185,184,4,232, 140,242,185,120,129,232,202,242,254,202,117,238,185,120,129,232,192,242,157,195,176,8,230,97,185,86,41,226,254,176,200,230, 97,176,72,230,97,176,253,230,33,198,6,107,4,0,251,43,201,246,6,107,4,2,117,2,226,247,228,96,138,216,176,200,230,97,195,46, 142,30,23,250,195,64,0,251,30,80,82,184,64,0,142,216,255,6,108,0,117,4,255,6,110,0,131,62,110,0,24,117,25,129,62,108,0,176, 0,117,17,43,192,163,110,0,163,108,0,198,6,112,0,1,255,6,206,0,254,14,64,0,117,11,128,38,63,0,240,176,12,186,242,3,238,205, 28,250,176,32,230,32,90,88,31,207,204,204,204,204,204,204,0,0,0,0,0,0,0,0,126,129,165,129,189,153,129,126,126,255,219,255, 195,231,255,126,108,254,254,254,124,56,16,0,16,56,124,254,124,56,16,0,56,124,56,254,254,124,56,124,16,16,56,124,254,124,56, 124,0,0,24,60,60,24,0,0,255,255,231,195,195,231,255,255,0,60,102,66,66,102,60,0,255,195,153,189,189,153,195,255,15,7,15,125, 204,204,204,120,60,102,102,102,60,24,126,24,63,51,63,48,48,112,240,224,127,99,127,99,99,103,230,192,153,90,60,231,231,60, 90,153,128,224,248,254,248,224,128,0,2,14,62,254,62,14,2,0,24,60,126,24,24,126,60,24,102,102,102,102,102,0,102,0,127,219, 219,123,27,27,27,0,62,99,56,108,108,56,204,120,0,0,0,0,126,126,126,0,24,60,126,24,126,60,24,255,24,60,126,24,24,24,24,0,24, 24,24,24,126,60,24,0,0,24,12,254,12,24,0,0,0,48,96,254,96,48,0,0,0,0,192,192,192,254,0,0,0,36,102,255,102,36,0,0,0,24,60, 126,255,255,0,0,0,255,255,126,60,24,0,0,0,0,0,0,0,0,0,0,48,120,120,48,48,0,48,0,108,108,108,0,0,0,0,0,108,108,254,108,254, 108,108,0,48,124,192,120,12,248,48,0,0,198,204,24,48,102,198,0,56,108,56,118,220,204,118,0,96,96,192,0,0,0,0,0,24,48,96,96, 96,48,24,0,96,48,24,24,24,48,96,0,0,102,60,255,60,102,0,0,0,48,48,252,48,48,0,0,0,0,0,0,0,48,48,96,0,0,0,252,0,0,0,0,0,0, 0,0,0,48,48,0,6,12,24,48,96,192,128,0,124,198,206,222,246,230,124,0,48,112,48,48,48,48,252,0,120,204,12,56,96,204,252,0,120, 204,12,56,12,204,120,0,28,60,108,204,254,12,30,0,252,192,248,12,12,204,120,0,56,96,192,248,204,204,120,0,252,204,12,24,48, 48,48,0,120,204,204,120,204,204,120,0,120,204,204,124,12,24,112,0,0,48,48,0,0,48,48,0,0,48,48,0,0,48,48,96,24,48,96,192,96, 48,24,0,0,0,252,0,0,252,0,0,96,48,24,12,24,48,96,0,120,204,12,24,48,0,48,0,124,198,222,222,222,192,120,0,48,120,204,204,252, 204,204,0,252,102,102,124,102,102,252,0,60,102,192,192,192,102,60,0,248,108,102,102,102,108,248,0,254,98,104,120,104,98,254, 0,254,98,104,120,104,96,240,0,60,102,192,192,206,102,62,0,204,204,204,252,204,204,204,0,120,48,48,48,48,48,120,0,30,12,12, 12,204,204,120,0,230,102,108,120,108,102,230,0,240,96,96,96,98,102,254,0,198,238,254,254,214,198,198,0,198,230,246,222,206, 198,198,0,56,108,198,198,198,108,56,0,252,102,102,124,96,96,240,0,120,204,204,204,220,120,28,0,252,102,102,124,108,102,230, 0,120,204,224,112,28,204,120,0,252,180,48,48,48,48,120,0,204,204,204,204,204,204,252,0,204,204,204,204,204,120,48,0,198,198, 198,214,254,238,198,0,198,198,108,56,56,108,198,0,204,204,204,120,48,48,120,0,254,198,140,24,50,102,254,0,120,96,96,96,96, 96,120,0,192,96,48,24,12,6,2,0,120,24,24,24,24,24,120,0,16,56,108,198,0,0,0,0,0,0,0,0,0,0,0,255,48,48,24,0,0,0,0,0,0,0,120, 12,124,204,118,0,224,96,96,124,102,102,220,0,0,0,120,204,192,204,120,0,28,12,12,124,204,204,118,0,0,0,120,204,252,192,120, 0,56,108,96,240,96,96,240,0,0,0,118,204,204,124,12,248,224,96,108,118,102,102,230,0,48,0,112,48,48,48,120,0,12,0,12,12,12, 204,204,120,224,96,102,108,120,108,230,0,112,48,48,48,48,48,120,0,0,0,204,254,254,214,198,0,0,0,248,204,204,204,204,0,0,0, 120,204,204,204,120,0,0,0,220,102,102,124,96,240,0,0,118,204,204,124,12,30,0,0,220,118,102,96,240,0,0,0,124,192,120,12,248, 0,16,48,124,48,48,52,24,0,0,0,204,204,204,204,118,0,0,0,204,204,204,120,48,0,0,0,198,214,254,254,108,0,0,0,198,108,56,108, 198,0,0,0,204,204,204,124,12,248,0,0,252,152,48,100,252,0,28,48,48,224,48,48,28,0,24,24,24,0,24,24,24,0,224,48,48,28,48,48, 224,0,118,220,0,0,0,0,0,0,0,16,56,108,198,198,254,0,233,36,235,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,233,113,251,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,165,254,135,233,35,255,35,255,35, 255,35,255,87,239,35,255,101,240,77,248,65,248,89,236,57,231,89,248,46,232,210,239,0,0,242,230,110,254,73,255,73,255,164, 240,199,239,0,0,30,232,234,250,80,176,11,230,32,144,228,32,138,224,10,196,117,4,180,255,235,10,228,33,10,196,230,33,176,32, 230,32,136,38,107,0,88,31,207,204,204,204,204,204,204,204,204,204,207,30,232,185,250,128,62,0,1,1,116,124,198,6,0,1,1,251, 80,83,81,82,180,15,205,16,138,204,138,46,132,0,254,197,51,210,180,2,205,23,128,244,128,246,196,160,117,78,232,87,0,81,180, 3,205,16,89,82,51,210,180,2,205,16,180,8,205,16,10,192,117,2,176,32,82,51,210,50,228,205,23,90,246,196,41,117,34,254,194, 58,202,117,223,50,210,138,226,82,232,37,0,90,254,198,58,238,117,208,90,180,2,205,16,250,198,6,0,1,0,235,11,90,180,2,205,16, 250,198,6,0,1,255,90,89,91,88,31,207,51,210,184,13,0,205,23,184,10,0,205,23,195,204,204,204,204,204,204,234,91,224,0,240, 48,53,47,48,57,47,56,54,204,251,18]
{"data":[
825308726,825309240,842149936,538982712,1330594627,1381126224,538979886,1111640393,538987853,960049457,875837496,-388123398,-1070906528,146391182,-1105261056,549453555,
1195877632,-1070859294,146391182,-1105261056,-1061159133,1195877633,-1070859294,-1064380274,526023,113763011,-11272172,6424263,1622210048,-1341944088,-396302839,-125173729,
-1979704600,-53507352,-469434177,1946265700,-1436490502,-203259674,327914,-1469783040,-453320447,-1258634400,712220373,645605493,-1314970503,1944900101,-801066979,840397280,
309763812,242880632,-771378785,-804818196,-352096028,-739667964,4241408,1692719246,58000552,-1342137623,-344922481,-2039356416,167542980,-1070973836,296808934,15409382,
568723632,78643435,15409638,568721840,-5242645,296755686,15442150,-1578733392,15401648,15442406,-1578761808,-5242645,-1884249626,15429862,1910947882,171761798,
1488858231,66061057,478883568,3193082,12374158,-469763327,162529646,290066839,24188571,295309756,1112672247,300614013,-1469782896,-469601279,-434065312,1731133216,
-436097024,-18304,-1910410247,-1898214184,-1899918141,-1949135663,-1947431966,1946061813,1975988999,-471074809,24430347,-427052812,-469701776,-2134604175,-1951397916,-997822234,
1910898923,-1934622485,15429862,1085829604,-2116514304,872444478,705393682,64535232,-1295974674,-55513416,45113830,163152102,-1342065664,-1972312433,-436147260,-342904719,
-344922624,980542464,-794724924,-1327177004,-1937709565,-1898934584,48088,-371171652,24384651,4241652,78698638,149324006,378261734,1420820594,15418342,1105641866,
1085277623,1139146987,1962933120,172090379,-17833256,-185895473,-2132408912,-919878774,95896038,1085276395,15418342,1105461483,125098018,-805376286,-1191908747,-661782464,
-2132408656,7476873,-5239322,-125118326,-1174402887,-336723968,28372480,-336854805,-320828928,24434747,-354270476,-596328194,1951792000,-1426358263,1437599860,-1431253269,
129026795,-622427930,-661979216,146405514,12630528,-301929490,15401392,-1979651092,-667161376,-2081160844,-387841342,-629882626,1951792000,-1426358263,1437599860,-1431253781,
512477419,279117938,-434982912,-423613887,-1328486904,-1341397440,-338237760,-431902720,-338237941,-431837184,-338237941,-431771648,-1982405109,-1342148066,713090568,8501952,
-301924423,-2118058430,1962971130,-18839818,-1070970164,1975794412,1254948400,8452737,-989925259,-605895542,-1883583312,-287274496,988594218,-2146273852,74829052,-353684560,
1946221696,-339727867,162591969,-919895834,279470564,-243991839,1642383659,-85978968,179365749,-919895834,-527801116,1946273014,-161422334,-253754684,-1326186124,-1333729781,
-530400086,-1466941461,-469601279,-530269088,-460308501,-1336591264,1971381772,-1128222499,569106536,-529875824,-460314645,-1333598624,-530138016,1955598315,-435310587,1571878016,
518742246,1692859024,1692715307,-85982552,-1278661693,-1469783034,-502893311,1976303352,246465524,1085833446,-1948742144,-67079650,729809081,737553407,-1898410304,888897984,
-385649390,263192992,-2135916314,1622968294,357100000,58054795,-1979607319,-1971198265,-1182603581,-644956160,126606123,1430061291,-2129890134,-2130673471,2093482233,1976116201,
15722755,704895162,-1195708736,-301879293,-1157305725,280621268,-1964756480,-29167932,126496452,-498449426,-2132636942,-58658588,-1157073712,-725946204,870050563,-1342129921,
12173454,119584776,-13390861,-1900543813,536918467,-1195725837,-299257853,-298799038,-1341925190,-1337790936,-930288080,12308622,-1327788368,440624,92864299,-85833913,
1958281088,-1208014068,-1211920720,-337932616,-2011123486,92808709,-2115745977,-388889423,-351936836,-2115727330,-524546268,-1877677307,78742244,-490936110,-1878463739,254051044,
67495100,1075062672,637896743,1195836808,-2011123517,92808709,850413383,-2010774136,-1337506043,637896752,1195836808,92811696,-1341814746,-427759907,734604163,-1193767232,
-13915563,92997001,92926434,-85850741,92997001,92928738,-85850741,92997001,-2115699998,1438154982,-1962571350,-1980243451,-502953211,-1962571270,-453320187,-1199511934,
-13915563,92997001,92928226,-85850741,92997001,92928738,-85850741,86414827,87819568,-1410136751,-1912586056,1914603992,4241408,12376206,-1126920704,296779776,
-2098954010,312668196,-423613952,-536801406,1962938281,-434982857,-1090052480,62509216,-1431652352,-1207949080,585651541,-390059264,-315949027,-1453810435,276103680,1946419369,
1486683147,1963196585,-1874924797,-1174541324,-1410138109,651206845,6160655,651206845,5636367,651731133,5112079,651732413,4587791,-1949261633,375045,651731134,
-931855301,-136165818,-423613757,-435048207,-1342117088,-350099960,-435900416,-1342117087,-350099967,-419450880,-434917343,-435048320,-1342116960,-1331566992,-436147454,-1342116959,
-341711359,-419450880,-434851679,7911808,-946929877,-1424489032,-492058484,-434786057,4243328,-661905650,-1174469698,1201995792,-386145721,380637447,-1917812506,15429862,
-2136444444,-1901064332,15429862,-2136444444,-1930878604,-434655232,-426856320,-469701776,-2134604175,-1901035316,-997822234,1910898923,-1332711445,-344922482,-344857600,-1329297920,
-2123307378,872444478,-2046331630,-351263520,-1070952445,-617909786,-1867396821,-1047875915,15429862,-466980380,-1040263149,-294262470,376757003,1894166192,1910767851,-1347362678,
15429862,-1019514396,-1901062284,15429862,-997821980,-1337930624,-344922482,-423328256,-434589583,207742080,-436147444,-434524063,-426790784,-1342117008,-1133386239,-728891392,
-394264388,447747924,146309350,-942109184,23046,1543947776,1488846848,-1126789632,17825789,109024,-1884286859,15429862,1910900912,-200321559,113769963,-65464,
5048006,1275512467,113705216,74,-2132403280,-1207942981,-1064435640,1946163688,9693443,-29310077,-2147464186,167791678,1458103669,8382720,1438187307,650677162,
263193993,637897510,-1053620855,-1205977739,-661782504,7487105,1964970548,96937510,1642332417,202113259,15426022,1642525476,1358954424,93005400,-1071357468,378662,
721974528,-2147436096,-1664898061,-2132403024,1894167472,1910767851,-997818356,1894167472,-75381626,41353728,1910931236,-1912596296,320768472,-1195139840,-661782520,4982470,
1241958160,-1342177280,729867805,4765915,434684046,-352095232,-1014787979,1275526720,1279164416,-445252096,-352302872,-13922207,-1951771208,92874440,-1960439888,92874245,
796246323,1619998,1048696974,305397874,639137055,16844231,1358954424,93005400,1084776932,378662,721974528,-2147436096,-1329353741,-1333729762,-344922448,-423392768,
-1342117007,-344922447,-423130624,531678065,113672422,-1174405044,770244607,-959304960,134237190,-973069336,268454918,-973071384,536890374,-973073432,1073761286,-973075480,
-2147464186,-352320536,-13922272,-1912584008,361309888,4982470,4765696,-2128166770,1962934077,-29169405,-434065213,228387200,-2132401744,-1912590148,16825556,-1912586056,
-426856232,-469701776,1958783089,-1871189245,-1901010806,-997822234,1910955812,15439024,15429862,-527797788,779432104,1946160360,302446154,2054430720,-1181725461,508608512,
-617883250,1025443723,1951967829,-2134802164,16351488,602373320,-555170871,-1977125633,302446276,192167936,809250852,-997582731,613419499,-1976550352,-1475644220,-164399871,
536875526,-1901056908,15429862,-1062702620,-997847435,1894158000,-997850901,1910906892,-1325426456,-167021567,1073746438,41161136,116797872,1965031442,708715522,1090532,
7487105,745804340,2028495024,-431116039,-389469344,-4589196,-1469782913,-1661279999,1625861552,208969209,1923244260,1969568768,-176625405,1342181537,279130288,-840685056,
-1558138864,-467009520,28840141,1477496064,603984035,504526128,-1900008624,4243416,-11336249,2145984344,1949318144,1019543048,-1274907360,1356891651,281928746,12275800,
62438064,-1341652807,821854209,-1195964044,-1258039110,-288817632,-611400818,2078853585,-1334872818,1484842530,-855591856,1881192464,683278123,1487663872,821854288,1946401466,
64666115,-919926604,1975788268,-335945212,-322360511,91538466,921434594,-771509872,1491301868,281870516,-1329594182,-1904155101,-1948570662,1029395207,91597397,-351579672,
-2134736636,16417024,-1327465272,-377428444,1760034989,352765452,1048579072,1952710770,302446093,108273664,-402586950,-1591866420,807665680,829698108,1377990,62437901,
-1142029904,-611405824,732583352,-351827493,1023904512,1965009493,269386070,-1593823232,-467009520,904597709,704753808,-1173303836,11535320,-1207911442,1438178190,-1982125142,
-1962874105,-1437254393,-2128317153,-822079450,269386239,-1342173184,-840685055,279009296,1009787904,1958750768,1354825218,520041705,-661733333,-956284737,536826629,-1325454871,
181790730,-99895576,568721584,15442406,-527818268,-536174108,632302709,-5209882,-1578753562,568590571,-1578835830,1962934533,7053845,-2132400464,-490132485,-2130779394,
27454,113642868,-1106968555,-1024925588,-1326122486,-1199512025,-2098746795,-997817628,-2082209557,1951771197,-490291707,-1070931733,263225574,-4624154,-1325473280,-462362993,
1958742656,-433541111,-488653184,699449579,1642365158,15458442,1642527780,1139191984,1438122219,-347937110,-423327232,-469701822,-337607102,1027793920,91510186,-337446722,
-433409907,-21955968,279978470,750339046,-1979651328,-79632703,7014134,-502434559,352765687,-2051145216,-10294816,-2132399184,-1341345286,-968825089,27398,568786608,
1795618555,-562757376,-919865374,-2132398928,7014134,-502762239,-526467337,-83939351,568786864,1139160752,11534571,15417574,-919912218,-2132398672,44590308,-119404428,
-371142466,1961426696,-433082358,1916699008,1964127232,67102979,-2132397904,1894158256,15401648,12349926,-1126920704,1776844800,-432951279,571520,-953761650,23046,
113649152,-1107296164,-695336872,-1191182916,-661782504,-2014936912,1342193848,-1342068759,-344922482,1349641216,1894166960,1910767851,-1330585466,15429862,512455140,-670892013,
1515145,1958783064,10610947,1894160048,1910767851,-1783570298,15429862,104428004,477364243,-426856368,-469701776,-2045768591,-426856252,-339442064,1483859456,1246777,
-661951625,1912734013,-424431594,-469701776,-2038428559,-424431420,-339442064,-1334712832,-344922472,-2039356416,-426266400,-469701776,-1329034383,-344922447,-2039356416,-424628000,
-469701776,1959279473,-1901047784,15429862,269251044,-1901017978,-997822234,1910898923,2009611096,63474434,387877337,1089176320,-338491727,571475,-953761650,-16758778,
113649407,647168077,4982470,113714688,74,1611056934,654311168,6620870,113649299,637534308,6424263,-1070989312,-2031712794,-2065252098,-1912600392,1678180056,
1275526656,1681817600,309462016,1619998,312531086,279453440,1085277301,-1280276506,15429862,1048605156,1913127012,-1329297912,-2037914048,1954588868,1681817610,343214592,
-2138044181,134243390,113642101,-972029852,268454918,-436181856,1279164548,58064384,-1198496021,-661782432,-1912584008,-432951104,-2147436160,1946822120,21031171,-13936551,
4195755,-1152364208,96010250,872360704,-2131494958,-497930038,375286,125888600,-1174805945,1572732934,76164833,124840006,1492574791,1962950717,-31201021,65165401,
1351616235,-13571759,1342193848,-1912596296,387877848,1089176320,-338491727,571475,-970538866,25606,1644611366,704643072,-427432256,-436096890,-432820092,109061760,
-1342111644,-344922445,-1468931072,638284928,6569600,-350915318,-2144956407,134243390,-970585483,268461062,-2014953296,6594598,-2144959258,-33528770,2045444981,6338704,
-13903730,-796195445,-1070860405,-919927415,1482292962,-1036299952,1618330251,1074092121,1347506176,-1191179589,-13959163,-201862605,1378929280,96073442,-1545054208,-102611194,
-1107294535,-1976639139,-1813494268,-152942842,-497526440,-2037783013,-460659004,-2034228127,579331268,-2037717792,1971971268,-1878594801,1156141392,-432754433,110160256,-997555482,
-2082078485,-2031696245,15458438,-164919834,207742123,-436147444,-336386975,-1201543680,-661782504,1894158000,1910767851,-1280255862,15429862,-125144604,-930391975,1912733757,
41958713,-940174990,755398016,267059712,41954704,-158332437,511017159,-1962803155,-424562488,-339375504,-1334712832,-436147280,-339637648,-344857088,329486340,-426790912,
-352079760,-378411520,1085801986,-958886400,5638,1445504,-401756159,179307963,-469387544,94431364,-1679260188,-393812987,548406678,-469392664,93120643,-2014805276,
1015079941,-516440525,482216564,1949449441,-521552381,-385499928,1625819795,1015079942,-485376459,-1212281228,370049248,-1561853440,-1878398203,-2147115800,67114510,721829608,
1549248,-1174401351,-1070989182,-85835026,-2132396624,1181430,-385649376,1048576178,1969487986,11069699,-2132396368,1916699130,1947350016,1916698647,276081152,82357936,
-402343950,74838539,-143273986,-186077776,-1335827215,-236066592,-453904664,1946265696,370049035,1321076736,-1872565277,-486169624,-432558040,-1426358144,951066485,-1364164378,
737264360,-453057847,1946265700,-432426941,-396303232,770376882,-1414464880,-919903002,1692665271,-85917272,-805434763,-71371659,-1877283871,3956964,243272564,-1106247658,
166453755,-507330928,1445504,79947808,-2132395344,568786864,-396316422,1169224039,-575381274,724626408,-1178562880,521011208,-1073810498,1201995808,737927751,-1178562880,
521011208,-1073798210,1201996224,737927751,-942108992,-1023408122,335988706,-939568128,25094,25214966,-956297543,-2097151995,-136183097,68290294,-955615968,-1191174138,
-419516394,-186057951,1916698884,1964127232,16759054,-1341917510,-18682364,-1326530518,-1333729732,66566658,268891886,1333002496,1181430,-465013728,604039969,-1272846657,
-841709056,-3869165,-222681995,-300109821,213043499,-889258270,-768345483,378012085,1558708286,-1257803247,290842658,243272563,-1103101930,-622271969,-1173573629,-957479950,
27398,-1996480834,-1996481994,-1996481482,-2097119178,914956486,2025783426,-1207493120,-1414851564,-1425997384,606201003,-436147202,302446113,58007552,-1342120727,-344922482,
611443712,-1474923296,-499859840,-2098723212,-1872565501,-387818050,1508574073,721662864,-427118391,-469701776,1971366001,-17636827,-1091799605,1525211782,-426856445,-339442064,
208790528,-423328252,-339442064,-344857088,1488556050,-427118590,-469701776,-528439183,-1328487436,-344922482,-1468931072,-1106873328,518578986,356417539,-54653952,-2146798368,
218109246,213780085,50850017,-919924813,-335415366,225738920,-872482334,203748725,871045748,32815760,-336702032,1430055936,-1431296651,-335483922,460696124,9373382,
-432164863,328132736,-2147257624,37182,243271028,-1337982960,-1333729730,-344922482,-1468931072,-1341164096,-344922478,1014096896,-402426880,-1325722588,-394205637,179307327,
704796392,-338499904,-1160452608,-628176896,126606123,1430084435,-402229846,99287538,-2134736496,16417024,-387744544,1692664591,57937956,-2138043157,-2147478002,-387852354,
-1396768175,48866,-1340765394,15462058,1008725022,-1996065366,1174407316,-2126035130,1977791231,48099,-335283526,141949096,34759,1128465400,-335349062,141949096,
34759,1128465144,61982347,-1022703406,721424802,1549248,-47963676,568721643,1377990,16614144,1048591732,1969487986,352765448,803973632,178832,-469632024,
-1106238364,158720395,-387866178,-1950481954,30992609,-768933452,1068505037,11829478,-58714419,-151816901,536875526,-169278603,1916698858,108291072,-402652742,-467009092,
-855619168,32815376,735092927,650153664,-947714679,-386342398,817375573,-1127182848,1085276416,1738637542,-1070903296,-620730461,-641715229,1610639166,1730576737,-2128658688,
1056991038,-1692109565,6766301,116875616,-1195442073,-1578887819,15458084,568631782,15465252,243278310,1476526096,-2147457117,1677750846,1676346229,614589584,-436147203,
-431902559,-424824704,1913046640,12058624,734039776,93005567,1430084435,-1993958230,207741957,-436147444,-336386975,-1654528512,102639989,-388289761,1964965939,-433213410,
-345906064,-420273152,1728497505,-1946156288,-1342150394,-8329662,-1342150882,-462363091,604040033,-1335761165,-847190461,852044569,1124532928,-1073021982,-464454717,-153056640,
-2143279920,-1005928476,548438246,-816307994,-1912586056,-1964758336,162595399,-930357037,309585,-805050157,-3938215,149423732,-1877677308,113714770,196711,1763609638,
520037888,-1017511833,-771444400,256232,68101208,1075062672,-1223773145,-1022309120,549147422,-388264448,683343899,-388264448,817561619,-388264448,951779339,-388264448,
526057475,-942581821,-1017182840,1692860080,-1946293260,1370350,10610718,603984032,-100174591,-436202080,-1021315968,1174702638,-5904304,1963605080,-90389517,8251422,
343209482,568854195,-16850432,-2131397170,16781886,-873790859,233308595,-16850432,-487230006,536797950,-1229929571,15418342,-435866696,-1979651262,-465377596,-337606047,
-436007936,-490132639,1976303358,-423326982,-5192863,-486322456,1979333667,-419581921,1795606049,-1275396096,-154588406,33581830,-136182155,-210383874,-662019868,1085821123,
1490587136,1347559107,-923565,551947184,-460324629,182487584,-1274776124,-1339364353,-341776885,-1969167360,1962871544,178381838,-436147257,-350179167,-459217408,167832353,
-350099772,-434065408,1797687328,1515739904,844156703,-1326389568,-425662944,47011872,548425935,-849829658,-963981558,-1963025944,-23795518,-1595395920,-400510722,-1329332581,
13822352,-840330832,-376262656,-1817182008,-1342127127,12511636,4765702,-13909874,378662,1170679296,125828866,-1511418448,-376000512,-1750073184,-1342137367,9890200,
-1846961744,-375738368,-1682964340,-1342142487,8579484,2129370544,-341921648,-1615818631,-1332710165,-1871713376,1793827248,-341659504,-1565487003,-1332715285,-1873024093,1458283696,
-341462896,-1498378159,-1332720405,-1874334809,1122740400,-341200752,-1431269315,-1332725525,-1875645525,787197104,-340938608,-1364160471,-1332730645,-1876956241,451653808,-340676464,
-1297051627,-1332735765,-1878266957,116110512,-340414320,-2132373503,578268732,146296862,-942109184,-16758778,1292289791,1220055808,1489014272,1364810271,1967192451,-528068095,
-1002796060,-2132537740,24263484,-421493041,-101976960,-1947811798,-822017864,1642387851,202113259,15426022,1642525476,-1191181894,-13959152,-1031014869,-1376375893,57983539,
-788488471,736879330,737553407,-16729408,114603,738133446,856001535,-385649470,-13959041,-4538325,-13915392,738133446,856001535,-429230654,-339442039,-460659200,
-2034228127,579331268,-2037717792,1971971268,-1437222320,-164888789,-1031025781,-880038925,867038763,-499485246,-2037782791,-436147260,610395274,-456882496,-455073145,-456882550,
589198729,-2128972590,1951771386,33194255,-1173392383,-1125427798,-1192504789,-352255558,-13909069,-372126837,-1420470856,-1414878536,-164890910,-372126837,1431647661,900588405,
-579491158,-1981353246,15451270,1642367718,-997801948,-534607900,-2132397392,-997815580,-1116370460,-880017621,-1207768701,732692479,-1196690496,732692479,-2083812362,900530921,
846594047,13741,-119395211,-51795,-13949835,-82005,-2037782869,-436147260,610395274,-456882496,-455073145,-456882550,-385649271,1760165739,1342591743,-1912586056,
-1940891456,914892506,-92209131,226281472,-1090693144,988340562,1510430972,16956099,-335783960,736134900,-1469782839,-470097918,-421493196,-456578208,-1461679516,-469601279,
46462560,494268896,-919927117,27813092,141949665,-193606658,166446078,-18691797,-377265948,-1070873855,113760398,-272170888,7999116,-1157562183,126450688,-503135357,
79297529,11817216,259134413,721551800,-1144877358,28933120,1494469888,-58717581,-500992896,-1876956192,2080390787,-1082756096,179928064,2080416000,990037891,1962533125,
2080434788,1152385024,820543718,-1895368964,12058880,1960349184,613331010,-344922497,-1468931072,724858120,-841864256,243987,8436305,721551800,-1144811813,28933120,
1494469888,1048643698,-1437237762,-1169050764,-1070923648,1918440397,-1328160248,-847190459,-336862696,-479019274,-335861528,-70391554,-2132348752,1894158256,15402928,12349926,
-1126920704,-773292032,571394,-661733234,1510393638,637534208,6031046,5815808,-37955954,-536801281,1962934697,44558595,-2132348496,-1947816016,-919920435,-1071477788,
57998048,-1342009111,-1333729550,-947132771,18438,1292289536,113677056,-956235700,18950,4765696,-13909874,721783590,579593417,1962598592,39577859,-2132347984,
251689151,-1070868736,633339919,2017263864,-1088719616,983144,264252383,-131741696,6831360,-1661138827,33597784,652804980,67152130,518587253,1486683138,1946419369,
34859267,-2132347728,-1912584008,654257088,1479,38127398,-1783595009,12094438,90318352,-18691797,3967972,-420936843,654256897,1072694727,638582968,-919927454,
3967972,57998048,-1342059287,730588821,96937727,-953810944,268370501,638582968,-919927454,3967972,57998048,-1342068503,-1199511819,-661979135,1103858499,-1958555253,
-141867014,-292858554,-1070899131,-930359157,-125054837,-393482101,134054753,1025602909,477429761,1963129731,66683671,-92073355,-2096270076,141886975,1963392643,-1878725885,
-1342090007,-947853578,-16758778,1275512575,113704960,-268435382,-1912584008,999104,-958564888,-1862251258,-1912584008,999104,-1194494744,255721544,-998907904,-1947820624,
-970525141,-919928828,-1071477788,-1334445344,5048006,-419975021,4765824,218128571,-1016922109,-478111115,66813955,1622905461,4765696,1661193088,-2138737469,-75496477,
-1339067133,-964630792,-218084090,721438907,-1023275072,-58712971,-1340639757,-947853575,-1442822138,1292289706,1220055808,-670888192,-1561787532,-1426358016,1208403882,-1202367232,
51314760,-2115275304,1968526843,-419778331,571520,113760398,-65464,5048006,1275512467,113711872,74,-1912584008,654257088,-1437268537,4851399,1220050944,
650153472,-1437268537,4982470,1241958170,-1207959552,-1064435640,1426442022,2145194,93051790,-1912592197,-1189245989,-645005264,-1336930933,1484842549,1957319997,1442545946,
-2129365846,1957320185,-432754674,-426790784,-351883152,-378411520,1442510898,-2132377168,-1962879256,134265071,-794773333,47275,17770155,-41222050,-388456257,-276102990,
-1426028360,-1411866440,-1426063176,1442909990,-1409447168,1576897451,251658680,1676341249,-1342160865,-1014962555,0,0,-660602744,37632,-794818560,37632,
67109632,37632,4096,37643,-2147467264,37643,65535,37642,65535,37644,65535,39695,65535,37632,65535,37632,
65535,37632,65535,37632,-1073739776,33024,533727232,37632,-805306232,57856,534773896,37632,-1189123906,-1510801340,543145667,-661731188,
735092927,-1145008448,-2018115520,548995250,-1014258432,-1413313621,-1426063176,-524684318,547339520,-1515850357,-119362651,-1610168538,639185873,-777517369,-953804488,1037152262,
113714713,423809464,-1073297626,639190993,-775420217,-953804468,1372704774,2144322329,-1994882024,-1827107304,-1323788264,-1156008424,-988233704,-820458984,-652684264,-484909544,
-317134824,-149360104,18414616,186189337,353964057,521738777,689513497,1578708505,16416,1364458374,1431787038,-1091794094,-561119168,1979841664,33193999,113642102,
-1107230655,1240137728,15067216,-2133423266,1031143934,9373430,-2143915007,829625854,838882955,-1965389057,167788838,-1974700572,-167735129,343216324,-511652726,63012871,
184083584,281837793,9480072,9603014,310016,-397355381,646447885,-2141716416,91559422,-336011130,1093044744,33325056,1599953653,1532567390,-2147482934,100679998,
-1484106636,-461373296,66879495,-989938061,1963195520,-1979665406,-2147446097,-331741211,-1349892236,-976224112,-444545584,-2133983741,41287677,-842005835,-58667568,-2147257087,
-452321075,9480072,-1962912117,1586170446,-372864244,1452015410,84797440,1810432885,1090963199,1676247040,-1870149889,1542029312,33325311,116815478,1946222735,368869393,
1397779059,-521645487,-385059836,1397753017,-722972079,-1974342908,167809159,-1341753920,-1870165888,1969306624,172919582,1915288960,-1870150122,45089280,9615242,326497802,
9603014,-1978864799,167809687,-2012973614,-1979673977,973114126,-1576176447,-1060110197,52740304,-301729862,1482381658,645984394,176095295,-29854492,-965315380,16646,
1853148414,58051838,-33514775,-26446644,-2140375860,58003692,-33234199,-385649204,-855767927,1240007541,1090962949,-1161625344,-1594227726,1059323967,-1059978063,-957478900,
15878,4261574,201386752,-386142716,1117782829,1958755328,1091469318,-1262280704,31713283,-402652741,62587261,24635392,1185989571,-1274890008,-1338577946,-2131367102,
-2147467506,-1494725968,-347229182,506660,-1157540632,1323827209,1030913,-1157543704,-353828847,1057914880,1253081088,-1274904344,-972524603,151011590,1354956976,-1328903599,
-85929471,4130436,1048579188,-957611968,-16760826,101204594,78708799,4138624,146985679,-771735786,1067514826,-767613952,1376521408,-301731142,-38209446,1914031504,
1358615,167829736,722302180,-1174478135,-18715386,-243938050,1692948987,-58042367,1920073910,1445189310,-1979638552,-456130202,-461314864,-387839484,-8388339,-385649331,
-443875509,-1979645720,-85458586,-387872256,129695989,9431040,-402650693,1586167945,-1962987008,-167735129,108269764,-2146966400,-461372436,16547847,716440693,-58717205,
-1274776319,-1274877149,12314651,-402649669,-396492715,1165099530,1912752872,1119812671,-1071338496,1077689204,-794023563,1912911072,-790573020,1913697504,-1260335076,-803835384,
-1260334880,-804359676,1912845536,-1260335096,-1274908158,1093011488,39118848,33941699,38594755,516154418,-1900008618,2016855512,-1964257024,-1675665888,1963654019,1057420825,
158629888,1929968768,-351751110,100433974,95695219,-75289109,-165120759,-2147467514,-469098124,1397890421,838882955,-1260745985,-1870165489,609901312,-1274776313,1006955284,
-1644661757,1388511602,-189115567,855814915,1084812489,-102624908,-210383874,4263552,1515805568,-1279002280,-322358526,141918376,-872482334,-454298763,-172833654,1515805678,
1359065283,-1059927414,1040614489,137852160,-1275052538,-5249017,-1427578230,14674175,113644659,-1275068351,-6559737,-1763122550,13363455,116815986,1946222735,-1962986999,
-1803041062,-13500416,116841098,1946222735,-1870137847,41164800,-1355094576,1047789716,9744264,1592266676,-387806465,-443875495,-385919768,116785289,1946222735,-1870137847,
41164800,-1147343408,-622329838,549016062,1961101827,-16850426,1509157836,116835229,1946222735,-1870137847,41164800,1371794896,-351475974,-1945377280,-754667072,619219648,
1942160368,1355152898,15402214,82232458,15451530,-2115629276,-1070930294,-1152325423,-2098724858,1489799934,1346953427,15402470,99009674,56121851,45111745,-389870874,
343015454,-1092089676,5892350,1117784690,1012933632,-134056864,1091469507,-1007075328,1364414715,-1878935304,292689357,-919403341,4065014,-502499968,1976303351,1091469555,
-1661370368,4073088,1532599679,519816024,-236328880,4066944,-434065280,-1862158304,525866445,1119878351,1397903616,45549491,-189085389,-2136413181,-102625163,-260714498,
4263552,1515977088,-1460878503,-2146994880,536887566,-331157525,-1186527864,-18743276,279505994,-872544652,-471088011,-1017554341,973096352,4694213,146475636,-39327744,
-1057045366,-960249558,1627426951,-1946427160,28639318,-1946277144,11862102,-956423448,100679942,1482381658,-1962986813,-2147372838,-822067418,-1009646415,4136456,-880096302,
-2063933230,1962950406,1057359881,1074185728,-1157890304,1067451378,-1321262080,213963268,-138744308,-335484157,-154959704,16813830,-13489804,-2020943222,119799952,125043516,
-1528296590,-972720897,100679942,-1870165309,1975519744,1091469554,-1329364992,-344922610,-1468931072,-1326549568,-344922608,175236096,-1325107758,617140740,-338004977,-1895369014,
1232339200,-628424910,9480074,1947256054,132415499,1963191424,-1023299572,712303626,1946674304,-1023234045,1894125232,1910767851,376815784,1894125744,1910767851,74830346,
-925760335,54267684,-1070464398,-435244861,-469701776,1975560305,-435113743,-469701776,1976699505,-771444476,1007625416,839021058,116835264,1946222735,-1962986916,1976106714,
-1870150138,1354994432,1962860264,1090962990,1451951616,-402541312,1452014823,-402606848,1452014815,-20846592,-967306892,-2147467002,838885003,-1870149889,1489199360,108382462,
9471942,-922827916,-2017065355,-1022033776,4261574,1397801729,1465274961,-397074938,12316635,-1870149888,-956301312,37511,-1962490368,113639424,-973078466,16390,
4130502,28332800,4138624,-771444273,1058932931,-1966353920,-85929269,4130436,101190005,113639487,-67174336,-1610353990,1059323967,-1059978063,-1947333620,-399460909,
1381694527,954731189,856339964,1523449590,753423954,-402344708,-1998061513,-163160323,268452358,-24967051,1541566987,-2091183893,-2017064194,1935736976,-1870150139,-2092723456,
57934587,1577025257,1583286047,1482381658,-72095549,-1360469366,-1070873605,653967502,637553825,637599907,637554337,637600419,4982471,-1943655823,-1207939570,-1557778524,
-1943666216,637655566,17041095,-1943608319,637601294,18351815,-1943608319,-83813874,-1088118300,568631782,568785700,-1912586056,1946601176,113639424,-973078411,30214,
1894158000,1910767851,-1071325046,-461347723,-426856201,-339441040,-1334712832,-344922478,-965614592,30470,11851914,1114959908,652472581,-973011805,16807174,-524237942,
-1274121212,-470743808,18391846,7669446,-1266634238,1913900308,7119138,1141233803,-389510396,1048576035,1979777141,-394153467,-453378025,-419552223,-1094452447,2062083005,
-307697664,-352317507,-1269738519,1913900297,-854477818,-401247469,-277675912,-152852290,1316291010,-387738690,1189806161,-628488012,863114189,28889994,1930677508,184320059,
-58706316,-2144242671,745804028,1912620008,4497430,-730543874,4533898,4591242,168223168,-1093669944,-1024007186,-1107069695,938009563,1031661,-1329374375,-344922482,
208790528,-1327461880,-1972312434,-436147260,1498989425,1347507035,989883553,990278361,-351505704,1925397252,1925266180,-121374462,-2131066685,1087178099,-83885366,158721034,
-466992947,2005006976,150765807,-722926731,368869377,-1964440715,1381061377,1465255454,41280522,1139310770,1085820928,1490587136,7612042,-184419200,520576607,-899983014,
730660866,736766945,737815538,730147853,730147717,754527428,755576065,730147725,757607301,730148159,761473925,4241488,-2141661042,57999868,-973019415,29702,
1964935763,-494907392,1994013311,2112358006,1200301572,48808197,637551266,1376274314,-301730118,646580058,-461373322,-1998583104,1476425254,1342194594,1059373450,-2013248350,
-1979693778,115916993,-1979693406,81838274,168814208,-1566569274,1347944519,-466434934,-259268399,1929390653,1364940826,-1043625136,-1064565527,-1064386301,1041281,-13739688,
1479197348,1946601051,11534592,-1578829117,-1578713308,-1174097669,-1175583754,1967718410,7774461,-387051740,796197647,-335416902,661979452,4662912,-388879633,2129133830,
1967030273,225837312,4656768,-402542064,1793589490,1946600961,-960299008,83915782,7643331,7603910,113689344,-383778744,113639843,-382730168,113639899,-398458808,
141885980,1963096296,49080323,1208403651,1392922624,637761512,-1576122486,123404355,503429097,1085821702,-958886400,29702,7675530,981459584,-400394534,-1977220272,
-1977220537,-369750449,1225755430,-896800265,-1070870389,123405236,46856223,-1950340352,-338654264,1392910065,-661733333,1946272502,404669446,-1006310655,-1207892962,-661782464,
-2139035008,745734906,7603910,126559744,-1979710931,50341352,-388896559,239536678,-1977169782,-822214025,7673482,123453483,182815,7603910,705147911,735194048,
-353633847,4720326,46327953,38242854,646629630,-461373369,-1998583056,637552422,-1576122486,-1070923709,-402635358,141885744,1963050728,33613827,1208403651,-1796660736,
1208403456,-857132544,1208403456,233336832,-401312511,259326313,-2147361304,1073771582,113640821,-1023410060,1963036392,4694033,-301861190,1963054056,1946600965,-960299008,
268453894,1962989544,20178964,-1477963915,1950253057,91570176,7603910,1950253056,-456982528,-423680863,606200993,-400431365,443875655,-1342048326,1021898384,1971368961,
32619023,9282284,20709556,548668020,7612040,30533827,-74761614,1962967016,14411827,12136053,32553473,-160566276,33572870,703074932,-1172737535,79233520,
-2010715136,-102611195,1963011560,-1945700857,-847937536,26339523,-208930190,1962950632,16705779,102690418,16824607,-66981702,-165711885,33572870,-437775756,-1160416768,
79233520,76162560,-102611218,1962963176,15001795,116833909,1963458700,-1185692727,-397343232,1952055042,1950253067,1131708416,1156313314,113661787,-469761906,-423680863,
606200993,-1088297221,-239468478,1980167681,309641216,603998368,1914715376,2000698377,1208909829,92930304,-2126362642,1963063546,-960274443,536900614,1950253147,-71106560,
-1191655125,365793280,116795506,1971323022,-165629167,-2147447290,108394977,-210383874,113643755,-973078412,36358,7618176,113689344,-343932812,-1286341645,-1161221344,
-1460928009,1962664064,1976303110,-972231691,29702,1950253147,-960299008,-2147453946,12186347,33012225,1963501804,-956702199,-2147453946,-1007107079,1962938344,1946265607,
3860483,7618176,-138755328,-1935479807,-1476348928,-1273334400,1965074636,-1465207788,-1274121152,1947248704,-1475234808,-1274907388,1948682240,301760512,-58719372,-239418624,
-1918702591,146363136,1927335936,-1141186046,-654102688,-2010674642,1526756390,-1023345536,20972256,280691899,12079114,1208415872,57934336,981402808,1996505894,973566470,
-133991741,-956710056,151024646,-1070873768,-1024016242,638022657,18357956,-1004141077,-1023343586,1085808208,-958886400,-16740858,-1595531088,551944427,12122911,1477823889,
825176527,876097329,-397205765,-469047249,-855766156,-855751308,526083956,438209487,471743232,-1207470848,365793282,-1946513157,989862430,1392516126,72804508,9903754,
-478095310,-402361337,-1644559350,-1948421029,3401735,1711753,-87089317,1711755,1842747,1352402827,-1979439128,838899486,132350168,-605551756,-73574397,46800731,
1548288,1137647451,-2111947965,-1962642176,-1023377378,1397773819,1465274961,-386136546,-1380915301,-100402712,1692715307,-85982552,1023107300,1007514878,-99453446,9899648,
19327248,-1760657158,501817344,-1041739775,-1759606269,-2133315072,57935843,1476616936,-12787574,-169278603,243213314,1968454663,-2134575555,116793717,1963196440,403603479,
548406272,-1364188954,-1207724568,-839154432,14739733,-2147429399,-83879898,551952560,2078846640,-2063484925,-384446981,2126446790,571880,-997544206,-1712782476,2146402560,
-1517670680,-2136414074,1676345972,1930493056,388368391,9627904,1509110,-352095228,1379700853,116794741,1946681367,-1872237821,1509110,-166890208,50337542,817368436,
33155410,1509110,-2064419837,1946163238,139979522,805312550,-167766234,91517124,43903056,1968323672,1375778881,-2147365143,443748604,639685878,-1204027369,429927541,
-2013219840,1006639398,-383814656,-722075208,1582624,-2143546133,116789363,1946681368,1950694430,405176325,-1325730048,-1340021216,44886190,1595869178,1532582494,-154182312,
134223622,-1880554635,386332160,829686784,762663740,7472839,-907472332,1347375822,1296845649,273238087,336794129,404166165,538910233,606282273,757868069,825241390,
1966685234,-383733755,-574684877,702769,309702386,836693889,-1275061856,65336842,1680071,113673451,-1191182311,-1359871974,11535733,1006700265,1007448578,-2146929906,
11564740,1006696169,-385649861,1195179868,1606154611,20769257,1509110,1013085188,-1961003706,-1996455906,-1996482018,-973071330,-2147454714,-404181328,723242241,12446144,
645219644,1576576,-391204856,548405714,1048584422,1946615881,64535047,-301963872,1574646,-369527544,926744330,12060277,9038194,1021873851,-1149341125,-739645240,
1934048256,386332211,1651770112,91557692,-351338312,1966554216,-391204848,548405634,-850059034,-957784827,1916484862,-380257530,-1157586455,1105979675,1509110,-165579488,
50337542,1245454709,1312558196,1194069364,-370575685,767033472,-1205671094,501960235,1509110,752841987,-378946746,993790955,11535474,-507836437,784924392,1962884311,
-229345,116791924,1950351383,386332192,259261184,359809340,293034556,233512964,1023297513,1007055457,738359162,471763744,-386692352,507247825,578027546,512296073,
-1325793252,-1340021216,13953198,-846134600,-31397611,-684836052,11591818,548446187,-2101665562,1348592640,15465508,-826711578,218030592,-1184766462,-18743067,1491694923,
-353803802,1364414717,62126218,-1759084294,-919875840,44590308,-947193120,-1174707994,116791808,1966080151,-17309171,-2132970037,-2147444978,116787179,1947205783,1482381806,
116849347,1967128727,-1760657337,548421632,233513190,-1761151238,880099328,9899648,-387076032,-386203745,645922856,150470807,-167733498,-2147444986,-1998058635,116849407,
1954545815,-386617338,-2131034245,1057003302,-1605254149,1881407511,-1059978063,-1017575644,-919864752,44590308,-430376224,-71042204,1364611614,-477763501,-1668615541,-422510472,
562315,208982539,242541578,1416940798,1014287614,1516132699,-296693985,-1460907198,-1207601792,365793534,-741212374,-919874607,-1461679380,-502368896,-227193865,30179419,
-335944576,229661463,212921922,1491992811,143952720,-1964228096,-119242528,-2134734246,-1326757644,-1337834928,-1598493176,-42645489,-336720720,1377762268,1397839702,-91491701,
-118954287,9735138,1959922432,1961101843,1959591446,1959591499,1976368752,9169155,1583307099,-1966137510,63079392,-1964080976,-771444268,249725378,-416694528,-1802765821,
776077312,-301906550,771812170,-2081553014,-997588030,1257119524,-1342117046,1273753088,79856464,1122894768,-399460542,141819980,-2134799783,-1460961076,-400509110,-260767684,
1493559939,-336674422,79856535,1122894256,-400509118,-613089244,-402540726,-747306980,-1960909696,-335544172,-1946192407,-2097151852,-1964243518,-370392352,-1651835034,1398079612,
-1736355,-774516480,-322360363,-954015606,125093690,1968043490,1576995568,708202179,2067222839,-1841447881,-1556611273,993588536,-1237750215,993676343,-599967686,557261111,
-1606999753,117242681,1397838366,1347770198,-466434934,-259268399,1912612925,15292420,-505812991,-1950875464,-2130702274,-2097139481,41234687,-1064390476,335315032,-1957361803,
273059564,1227262557,-1526780416,-725994019,-2097106173,125120767,-1262876752,-1966866941,4825824,6493833,-2091757538,-1014364990,-1070900498,516282510,-1185415052,-58720240,
51409410,83656921,-654112398,1913126016,1356399362,-1900006650,172460992,-1557733242,839320672,-289109276,-1966801342,1245965831,525923298,1049231155,113639502,-1191182238,
-58712064,-2146733564,74713084,99336243,548931765,-1599343865,-466485175,378269835,-1031602077,-2071319036,-1561399052,-1976696731,854649988,4891620,976513,-460551378,
1276021232,571648,503337151,-205507833,816857771,4800128,-1342016250,1721953855,1583308032,526014811,179621639,6295177,-352320792,1662421996,-289109504,-1979651262,
-347410747,-20674048,-347935040,-289306112,852462275,-1948134931,1351911921,1648244736,-1962576640,190658,-2115454997,63474432,-788509170,-401689351,-1966866501,-771804449,
1352109027,1611565824,1583308032,525883483,1654836999,1276021504,-145713152,5153761,-103692149,-1930949452,-472818689,5277579,-369117208,378273643,-1031602077,6725637,
242614026,-478093276,-289207777,-385849694,-551223473,-210506800,-269803508,4859530,-1979692640,1560306238,-380019105,-1957429449,-154891560,838879782,-775748609,-389850144,
-58720034,-2146930172,57935868,1392681961,938000779,53572608,719751920,7596259,-50072317,-176829186,-400510888,-50134930,-143275010,-2132818200,117459262,1704986484,
64535040,-19273234,-588521846,4800128,-2145816062,50350398,-1169026441,-330300454,-76281688,-658889296,1515777539,67076072,-1962914298,737184760,-20513071,-1947389246,
50350638,-154957075,50350630,-2145450304,-1966931717,-212379958,-1017225307,-212350326,-37527637,-2147468824,141690108,1946680448,39315715,-389903533,544538514,-427102165,
-823598294,737487871,1976368893,548428021,738183656,1976303357,-10950153,-303309174,-1073031030,-1974464908,-20632890,1489189568,-618003851,83656899,-58718094,-385649657,
451412804,-1946973440,-2097126634,520488642,1963043052,-1460864261,-1376029695,-1963064599,-1947389233,-1947807247,855658628,50783195,-503296994,-21567238,-2134648829,141690108,
1946680448,38660355,1364255626,-1946169112,-1956947461,-2097126634,-1460926782,-84183807,1946265836,-1413248005,-370613509,-58655309,-2146930172,57935868,1342315241,-6297519,
1532623755,6493835,-335101309,-76217944,27847930,-1014301836,-498619653,-41817625,57803836,184586729,-385649207,-1974271862,-771804449,1354206179,1347836672,-855506760,
1397839888,-528087472,4622886,1946696773,1947024396,1946827784,1963408388,-854674413,-790656496,1352109031,1532495616,-1875711143,-2147483207,91357948,6195750,-855002043,
1532495632,985857625,1912621590,717684244,436109522,1342573426,-854717768,1489960464,12079111,1477496066,1012570338,1007252481,-1207602173,281870848,-386078999,-1977221071,
-758898172,-758215968,-53089856,518541392,585683456,210380484,-2134641061,-722072203,-1056256990,1476692006,855422697,1408625601,1378398288,-151068032,-1024042270,84112385,
-259317760,-1143895208,45679296,1228832771,108135936,-1191083845,-366868733,-234624301,-919930998,-855455536,-126496770,-321723510,-661994661,1827193227,737708802,29524433,
-790179839,1228832998,74647040,-405675312,-316006650,-472849456,-1014354572,-453619532,-268175477,-483727734,-2130673432,-2128629522,-31477521,-1963887156,8972487,531689345,
-176829442,-1963189527,-34804770,-1031022454,-1962798360,-2116998152,-805240382,-2132356890,100682046,-489683597,105375697,-2115163617,-805244729,1961087203,-1262253522,-1947929008,
-1963971593,-387765530,-293535711,-276750256,-855760816,-947195531,-2130695704,-31436561,-51022389,-1963214103,-1964250146,-212379958,-2124521564,-2128609082,1444937927,-204830121,
-1017225308,-212350326,-947822678,-1974001664,1605039050,1342223555,-1962833944,-2143528712,1857947251,267063034,723419180,-975270154,-1946125258,-783147046,-773795360,-2131754016,
100682046,1462530591,-1408977322,1971373046,648849942,536839560,-28326013,1592554958,-471709857,653998825,-1398143694,-8048090,-1964971233,-387460653,1448542420,-391379786,
-1021116191,1954595574,624043527,21312038,639993894,-1409202808,587253992,-2134706493,841353844,639631525,536970546,10848294,-2054674912,-947707903,1976499792,1197432513,
-373824953,-639042853,-2081387776,-326432532,4800128,1914635782,-1979402726,4622340,8686149,4622368,1355187013,-344600834,-779085845,-402344218,-964624245,-2065162240,
-1326546688,1976499743,-93405202,-310180082,-51016952,521535664,1442873530,571735,512403187,1583284247,-1057087884,1242089347,3991925,-1070919052,1053087886,-1064566660,
74761995,-823426896,-385301373,-478086573,1371769347,-805305415,182505696,-1963400488,1388534267,-768912559,-1962933831,198779864,-773795373,601394145,-774698023,-1947438111,
1515805634,-1977316669,12124484,-2063551808,24443073,-774713095,1944703465,5671154,1352778565,-661957888,653706378,-523173814,-13967151,-1017396477,62148688,6438538,
1012404429,1012036616,1012364301,1012364298,-1269140473,112906,-1023536947,4855354,11678581,1964572288,-855460822,4825104,108135484,11994940,146015861,-58060595,
721813944,-1978091831,-33535466,1477496266,-17199383,-352144186,16417012,-889260172,11727851,-25104405,-337087208,-402476100,-605300232,84214531,67306243,378208436,
-1031602077,78179334,-2098658444,1963108352,8775939,378212532,-997588893,1107356654,1256753900,-997538562,15418094,-1964668180,704661790,-1618333953,-1020576332,5119627,
-1020531759,-1070923143,1048576945,1912864841,1228832810,594806528,-218748750,-318576502,-13968246,4800128,-1325107962,-739979260,-1965782301,-789655312,-166532114,-1979692490,
-757822736,-1964471584,-738250020,1375843555,6493835,-301481341,1583308122,522133279,519819015,-1579575576,-820051949,-1930944773,1090009,-464466145,-339673472,-461314560,
-1967085471,-385649184,-1380974439,-456821016,-390025120,2028520815,-429857595,4242048,1690229390,1086650081,1958609781,-1610566431,281870409,-1327974936,-462362881,201386849,
-345905652,-420273152,320768865,-768869376,-1030825330,729809081,-458361866,-2117826975,1916797178,16417036,-468946048,1947248768,-2134575610,-158333717,292896964,268485249,
1967188867,-511394101,-86482456,-388330252,682678616,-1328020760,-671225773,-119002704,-1326122281,-344922481,-435179520,1624201328,4241438,-1070868338,-1560252254,1856176236,
-435245056,-469701776,1975788657,-1328993439,-344922614,-1468931072,-502958976,-1873810446,1894121648,1910767851,1299667260,-1291818520,-1947994606,-436031288,-469701776,2002336881,
5564472,-150715205,-1950284829,-435900216,-469701776,1998797937,3991584,129224843,-1056709642,-1996434813,-1560252906,-453377940,-419552223,1629485857,-1100931133,-1830231418,
-426856233,-339442064,208790528,-423328252,-339442064,-1015945728,-322903926,-720428028,-2130984182,1181909244,176221312,-29002524,-29264692,-29526836,-29657908,-25660212,
-30313268,-33065780,-385452596,65601879,1976368641,60614915,58051838,-2147243543,58001388,-33279767,-385649204,-2035022803,183033,-400622613,116840387,1946222752,
-335995132,-1578829076,-1578697180,10094220,9969289,10358409,10229385,10487494,-435441663,611443824,1346374783,1894124464,-76421544,-71636193,29016715,1958742530,
1959329289,-72881398,619489259,-1275532304,1697793,-402476207,-1286537197,911364,-402082991,-779419641,-346530983,-1325772070,-347871744,-348068864,-455046656,1356891712,
-301662279,-2064908053,-2080644925,1968767225,-339137788,-436162515,-469701821,-337606080,-2042567680,1942502368,-4566517,63974399,48978634,-511588309,-372170768,-372119087,
-1157895727,1347486209,-335216711,-69202008,-1017489064,-689575906,10487542,520451073,-15865351,614589690,-1935546626,-956261858,-1610573818,-1643214592,-1676244736,-1610168832,
196083968,1910796518,1074560804,-435441584,1910921328,-1610156293,-109805568,10487494,-857137408,1627192062,-1070981626,-541818650,1006772200,-1341688832,-377428477,-1884290860,
15429862,1910901168,-561266548,-427756406,82755824,-1055923072,-670890784,-956431757,208963622,173836582,138725158,-953745409,3652,776111037,6160655,1409355558,
-700848120,1772343436,-1547400448,-796131225,-427756406,82755824,-1055923072,-2010774304,-1993986956,-953800124,-55228,759481894,1153836691,-953807068,8772,541378342,
-970522625,647701828,2507975,112640,-353369841,2114072,-1912592200,1095888,414767246,734039552,-201970689,610395301,639399104,-1993997173,-1996125436,-436097019,
-345906048,-435418112,604040033,-379459853,-1070934790,-575377178,1006712808,-469076992,1962949760,-435965948,-711858048,-1912575583,6791632,119529611,-456882591,-2046804864,
13630432,256018689,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,
541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,
541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,
541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,
541296896,8847360,-436031488,-742594176,-386203925,276103187,1692848560,1962937064,-423327225,125024,-919907901,35939556,-1017513248,-432951045,-469701776,-1329297807,
-344922576,-814619648,-387992326,3997636,-4979596,254201849,638080001,274465039,551948720,-947257109,15409638,568722608,28311787,15409638,568786864,-1595534928,
-1014365973,45130214,-1578762005,28311787,15442406,-1578696784,944031526,-970522625,638532676,3818695,1153836544,-953771203,15940,251658680,1072361473,-1207945148,
-661782504,-1912594248,2668736,-2091134834,812123332,-120892672,-805579031,-1662509317,1961102035,1959591444,133988387,753599357,-819987568,46800889,1889597952,1879492096,
243990528,378208366,-437583764,1813416442,1846446336,1879492096,-706019328,125095166,645188862,-402617111,41091433,-1292187925,20637950,-259362332,-469683224,-389510543,
1910767916,11724938,1189652459,-402427135,1392116004,367591090,-423196159,17754225,1910948234,-1979643928,-1301158203,16246794,611443802,214043171,179458050,1476454632,
1827238374,17557759,1743324019,112392959,-469707544,-387413391,1910767821,-957812598,-1972247552,-399396152,1910767805,-393554550,-16826647,-20024116,-33065780,-381324084,
-823656305,-402427136,1375338668,95611530,-1342139160,-395188736,-980811635,-2031586842,-423196160,8382577,1910948234,1994918578,611443712,1500636799,1793601970,-423261696,
-17962639,1592265394,-1468931072,855995424,-18814528,1929411816,5957635,-385895686,-964034484,1172861414,-423523840,4122737,1910949258,-31153692,179479014,-469751576,
209658993,179458080,1476402408,-1595313690,179501822,-469757720,1347888241,115870386,1910921216,-16872727,-423458110,-1031748752,-423458302,-1303198864,-1316855,1910908592,
-1325407000,-395188606,1910833117,-452994840,1371757169,-1342023495,-344922614,-1468931072,-502958976,-104844302,519816025,-1302900144,-4986870,-527797788,-453006104,1355031153,
779370664,-2116962584,-805266386,-1642167549,511115264,-1897395534,611443967,179458239,1493140712,113668582,-989855584,-973039554,-1470595067,-855477216,-434065334,1595991712,
-820029350,1380982523,-3050776,1962961926,1845952260,1849590528,359995392,7093889,225771696,1856225323,7119616,7341766,1074724353,-2146732800,-268419290,-222688080,
483257859,551952560,-820029350,1397759739,1354256977,-2133291520,16777278,113663860,-1275002880,-1978610417,-400968244,-1269759915,1494273283,-1261292718,-1273967358,168873224,
-1342016064,-768388576,399369266,700773978,-1023532683,-545928646,-494218702,2353234,986119770,1523611118,281871028,1734,1510664960,281871028,1734,1532582655,
869211992,-1327222062,840420618,-854740764,-858995945,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-394358807,-389321817,1573610754,1949288424,-382301427,776243716,41221692,12844348,0,-1808911616,1534289933,1712675089,-1894367689,-1240404719,202569744,890293806,
756113169,1343440942,455030063,1477574189,-1860440034,-1104247518,1393016327,773014302,-1979711457,-1676583138,-1557226194,-550571218,1477617974,-1205716718,-81602542,17825295,
-653261808,809305108,6135869,0,1061005568,69508644,1816351296,-834572991,-413978815,324871762,692466502,-782758568,-1824010937,391129681,-1524012972,472494377,
-1770094491,-2022641283,209325688,-194870157,-847598215,1026264186,-400852450,-383379672,187234345,1193443369,304483625,-1390709466,-2106896021,-94004117,307664981,-1740324777,
927247428,1459701761,-1274967295,-452863743,-117312511,369235201,1342315010,1828872706,-1459452414,-553473534,973284098,1292059395,1761830147,1426287107,1319817044,-750588220,
248402950,1426259,-984202925,1095716034,1162200004,1325450704,-1076736180,-984395956,-733065285,1095060633,1381208786,-607237812,483675721,499600979,516702788,1208800079,
1092002898,1286851660,1157677267,-984332980,-1051442775,-2033366652,1414743621,1178971346,-1378595255,1314080325,1178971847,-1345568188,9946693,-1580903604,1384236110,-1513794751,
-1496037052,-766553518,-724807001,1490408018,-967898160,-237612765,-2100146432,-984428082,534268175,-816558336,1411403657,1397721551,9290325,446978117,1431326208,-1949923884,
-766225586,97799896,1292947534,1263465168,-559654587,-649789440,1129251017,-893037503,1313428048,1229757908,1352586323,1159451471,1313442004,1095741637,1397341380,-951086124,
616779530,1158860357,27546694,2475599,-766553009,1196574145,-1001407035,-1539028493,1480916995,-683310124,-741060716,-834318336,-1663806022,-271411762,430199875,1330205776,
-968443698,1230110941,1334957134,1335412043,1162154451,1163073483,1163052756,-942389933,-733066929,550389212,-833290240,1431586186,1166986834,1166525505,1380930643,-851079995,
1431520655,1235797325,-1537980345,147082754,-850047419,1145979307,1514753359,1124121029,-834321070,-800107320,-801024112,-984202844,-1471983426,-800762670,80627663,1225249361,
1381239246,1381241764,-1538830775,1128354006,1327014981,-993767851,-884782764,1230132257,1207968455,1389219397,1386401359,-1547286961,-827833791,-834548529,1230176269,1406650190,
1090572498,1379996876,-623750064,1413761280,1229037768,1229493972,1169278284,1387447374,-1211804599,-254652672,-1426063360,-1427460631,-554913813,-1477124883,-1108951335,15252711,
2088532345,1011241087,2071603250,27522,1681615789,1722313553,1817404163,1702126368,1662608146,1663591233,1667916849,1669948239,1706301655,1480936960,1769414740,1970235508,
1329995892,2035482706,2019652718,1920099616,1375761007,1381323845,1769414734,1970235508,1330061428,4347219,544503119,1142974063,4281409,1701604425,543973735,1668183398,
1852795252,1818321696,1984888940,1818653285,1325430639,1864397941,1701650534,2037542765,1684952320,1852401253,1814062181,543518313,1651340654,1392538213,1668506229,1953524082,
1953853216,543584032,1735287154,1967390821,1667853424,543519841,1768318276,1769236846,1140878959,1936291433,544108393,2048948578,7303781,1701604425,543973735,1701996900,
1409315939,543518841,1836280173,1751348321,1953844992,543584032,1769108595,1931503470,1701011824,1920226048,543649385,544173940,1735290732,1920226048,543649385,1836216166,
543255669,544173940,1886220131,7890284,661545283,1868767348,1852404846,1426089333,1717920878,1684369001,1702065440,1969627250,1769235310,1308651119,1163010159,1162696019,
1397051904,541412693,1752459639,544503151,1869771365,1851064434,1852404336,1818386804,1919230053,7499634,1936943437,543649385,1919250543,6581857,1701734732,1718968864,
544367974,1919252079,2003790950,1986348032,543515497,1701669204,7632239,1769366852,1176528227,1953264993,1380926976,1953060640,1953853288,1480936992,1968111700,1718558836,
1885425696,1056993893,1229477632,1998603596,1869116521,1461744757,4476485,1145980247,1953068832,1953853288,1229477664,1174422860,1145849161,1702260512,1869375090,1850278007,
1852990836,1696623713,1919906418,1684095488,1818846752,1970151525,1919246957,1818838528,1869488229,1868963956,6581877,543449410,1701603686,1685024032,1766195301,1629513068,
1634038380,1864399204,7234928,1698955327,1701013878,1328498976,1920091424,1174434415,543517801,1701997665,544826465,1936291941,1056994164,1140866816,543912809,1819047270,
1886275840,1881175157,544502625,6581861,543449410,1868785010,1847616626,1700949365,1631715442,1768300644,1847616876,6647137,1766064191,1952671090,1635021600,1701668212,
1763734638,1768300654,1409312108,1830842223,544829025,1701603686,115,270451456,1338462720,1338462848,-889133952,-1,-1,-1,-1,-1,
1342177281,124911672,118489086,1034,0,0,0,0,0,1792,2098951,0,0,404226304,0,65616,
117899264,0,16777216,16842752,16843009,16843009,16843009,16843009,16843009,16843009,544106784,-9744640,1916928013,7037285,50332859,126501852,
1974549571,440583,-236201725,24412732,1125092035,1396912010,-770975349,74766983,-633611641,1526730937,-654055820,-1246113813,9562376,512460493,-947257298,-1057045726,
1335888244,-1296037373,-380799725,1035085501,-1187401031,-1296484686,884128053,-1187794247,-1296482638,1085454647,-1187007815,-1296485710,984791363,512434923,512295735,45219886,
-1190415687,-1296498254,313702666,-1189825863,-1296496974,229816598,916635698,6267397,-1576770910,512426080,512294958,-1070464185,-1576770142,-947256213,-1057045726,512296052,
213451593,1159629576,632416515,-1966962087,2663114,54730379,55254665,512481927,-947256505,-1057045726,512297588,-628685996,55975561,55385739,-628630773,1946374075,
1963401739,-2028995065,108259802,126402610,149475722,62176036,-1031108659,141771836,108212796,108142396,321661104,-1976643446,-1073069305,1129052277,-227161346,1193184083,
-561553917,780717398,1060898698,-1151662475,-722795596,1534246632,1006632634,1971965402,1978591491,-1021130870,57983230,-1336108568,586279167,-1966253648,1872937010,1010558976,
-1155294488,-1930950867,2662514,57999916,-852627736,-17525,3022473,167984800,-1958120256,1392721694,1516004840,24635474,41036464,-1394073424,679798818,839807834,
54436544,-1070419733,-352108894,1092520725,1926890243,-105229583,1524251647,512354419,-140508353,1958742529,766044586,1915245032,99215522,-922828546,-392390284,141756205,
1965462504,-25761533,-1979434776,1965046791,1542514691,20047954,512335194,-1932721341,1877541746,-397323717,-1326957074,-1665136123,55121545,1912664296,1973198089,129034499,
-1672364022,447604819,1364827483,-689437837,1386043928,-1604696204,-1073085333,512428149,512295690,512426799,-2023881896,1398363870,-397158141,-1990501611,-2029823970,1497336026,
1128485722,1128470409,1224784058,-1958131383,126397682,-1974910397,1975847617,1519242738,-1962926360,-1996166882,-402435554,-1899158711,55713419,82386569,-1946232599,-2030030818,
-1963029798,1124567770,24446730,1128481731,-1073084534,540807284,188544371,-35065486,83486724,-2025591573,-350778918,47828,1008170066,1511224364,1376134120,742137204,
-1343743628,41216547,-88462276,-402426625,125044236,57945148,-1979882519,-2029831394,-2023859494,-1957472546,-1962921954,1124567755,1268713226,1133868190,991923011,-1948677158,
-2005600993,-343575563,-1564462366,-56491267,-1181758206,-1195769541,168266240,-1155500608,-1014365888,-930430678,-988100726,-1212422006,-1950338560,-1958565126,-1958565126,1019456250,
-385649374,540803123,-56620684,-1967126014,1127183367,39118928,1949969496,1967799302,-1576947704,-39714052,1968516098,126505132,1951973386,1946630826,126505178,36497475,
172223723,1267890368,-1850720452,58020178,-1174347031,-756546709,606726158,787022707,1589269249,2156555,-253215115,191019523,-1342171672,-352094839,1706725387,583691,
-1917835659,11397465,-1406209397,24494090,-389510461,-1053159787,1111750261,1330113259,1330905120,4347136,243263579,-1148138157,1093402883,-930430974,-654114635,1528269614,
1726501699,-1949791730,615263986,-385649281,977469867,-1957661247,1118580466,-495337462,675070346,-225763980,-784552914,-801368716,921178484,1949187086,365422595,57802928,
1476492009,-1406209397,-1073049139,602473337,207247616,-5222272,838947304,50176704,21555288,1543418601,-1406209397,2042628674,-1913961737,-1832038325,-1978921798,787647432,
1958742700,-1053146601,351007605,-1448367476,-1579898714,-1986096246,9293198,49004594,-39714384,1515804674,1968218428,16443395,1974549592,16050181,-650319440,-957807756,
-437760000,-393236480,1347944674,-1963020823,1949187079,1916419086,9496835,57880636,-1610577431,-1073085699,1515784074,1659437945,1009218814,-385649362,246480473,1375776232,
-402396952,-2023882499,-628664610,-1679244406,1539803648,-385837592,1364393471,535299978,14674013,-1605150119,37487355,512432757,-947256157,45137930,-1014362507,263453578,
-931984836,-873787132,80269392,6088731,-402349125,57806415,1476698043,-402159024,1129840714,-193607426,-38934181,1107520186,-1406209397,58031908,1107323881,-225769670,
-344609746,1006661609,-385649626,-397148731,-396688885,1211894999,41225136,199756976,-397323776,-380039975,984678236,1118501515,180456009,-1023314747,-1679222862,1536413178,
-1563886005,1515782909,-401825560,-398196770,-253227879,1022653217,1007186746,1022128944,-370641874,126549299,175317052,108267836,41159228,-1605361488,-1057094915,-922877324,
1274978281,540805002,154990964,171767156,-1018957452,966943920,701687811,-417311256,991332690,50044931,159115344,703091544,72792848,1532380648,-397190822,512295837,
45810485,-388234496,511048051,1263720707,-1974782070,1396917015,53812875,1515969083,-1956977291,1159629283,-2024099581,-402083366,-1957486877,1577268510,1398201991,3022475,
1457424222,-870322712,1963793128,-104404733,-1041693838,250125561,2018745609,1894659,1583188712,-1168712057,126484481,58052412,1376834792,-388331693,669734598,-396553496,
1364940209,-2130658990,-695537270,126522573,28364604,-806875531,-186100984,1435756636,1533874920,-930459055,-1978877208,-397717016,57933995,-386316311,-1595402623,-1957473536,
-1996203490,-1962922466,1577270046,-1252598137,-2036379262,-997830460,1355056799,-806763386,1367520612,-873905429,-116200968,7727299,-1781706517,-384867351,-1073085739,-1975260299,
118113031,-1958485900,378094359,116785198,1962869878,1538282278,-2028156184,1450240218,-1058513488,334191388,-1679255859,1160153373,1126074627,1007127043,1136620858,977012618,
-390419598,-1535880690,-1418559188,-1569502660,-1073552334,-1748111221,632618798,126501632,24263228,1948269763,1007186676,-1057032912,180603134,1023112384,1014133259,-1610189538,
-1073085696,1947221187,-1572646852,472646400,-181651085,-29620365,126491509,-31553213,-1979664638,35555800,-1576882173,79364865,-1073063936,1124567747,-31553213,1066027778,
938009067,-31552768,-23860478,-1564421952,1364329217,-2029845830,-387413286,-628665069,512318041,-1151859970,-1073086460,1913208003,-9836285,-17485764,-1010237760,1006829728,
1008169743,-1961659891,1963131422,1128481546,-1975314550,-371554505,27284586,50045443,292816956,50470539,77799049,50601611,77930121,50510787,-1303077399,45267203,
-1190874439,988285106,129939743,753234513,-1966568895,-16389912,259385916,-385941784,-797827295,-393592532,-1963003160,1925262021,1589706435,-1151934841,11862880,394844419,
1976106563,126508025,-1468715972,-335622424,-20322123,2031006696,-385502565,126547834,378220092,58000201,1274983145,1023323880,1006793742,35031821,-385649405,-1070399841,
1258487970,-402652998,24313491,1352618947,991533243,-1977912614,64654078,64685018,1490748378,-1976554338,50378448,1541048282,-1638345237,58049371,1008499945,1007121422,
-385649651,1978151075,250132764,61939435,-400817432,1398407061,773753683,-561553920,-1618104234,-2041527162,82530756,-8656815,1006829728,1960478477,1947090108,-155260669,
-1957438841,1577254430,-396960121,1396899921,3022475,1935399483,-112203773,1189610354,1225618425,1034030512,-51881213,-1009153262,-1545008974,1972948470,-385894666,-477366790,
54861449,62033212,-1947663500,512318454,-390397906,-561553906,-1319391146,-1325208774,-1979665152,-1966241087,-1326953496,1958742781,1959082686,574374842,-1057035916,-1943212940,
-985995403,-259340782,72933355,-401282301,1609049564,378136348,-1605237957,-397409541,1582826885,-1974018425,50045160,-980761286,635962996,50044940,1006937018,-1174179323,
1012073631,-1959693053,1392812830,-1961391293,989868062,-1961790502,990075934,292772570,990063803,-1341492262,384231514,870898311,383707156,1457424222,1515372264,-1489190053,
417870453,468510973,-27268983,225759755,-1963438104,1540459253,334037874,1293322751,-1596296701,-1073085617,-780877174,-1979701088,-170989104,-1978866200,1021872647,-402295667,
1267276722,-906048886,58049930,-386090519,742194714,-286546059,167989152,856192448,55419840,-17471767,2663104,1954758528,-34084846,-771027851,1944588404,-1564462338,
-389872817,-92930921,-1070462997,-33337438,55026112,-1962922333,1963150110,4161765,-1014824075,401163012,208726041,-1073030539,-1528233099,-182392323,1375734458,-1645731980,
1591379965,1951850119,-388331754,-1960043738,1946370326,-40638456,-504822924,-1965389836,1975716551,-42866429,54599305,1526939298,54468233,-170137255,-1979437848,1965833223,
-65411069,91523388,-853874200,-756526261,427055953,1979451112,238863105,-857144459,1947024637,-69146365,50470539,-402540861,-1073021399,-454494604,1973501179,1976499954,
-388895762,65732970,1261542376,1979436776,421390339,1072235381,1977039873,661383427,58052156,1006676969,-385649198,1012072612,1013806124,-385649349,-396820201,-397212759,
259262371,-396541464,130421442,-1558279392,-855114236,-1558279271,971526916,-401771492,58196273,-402640407,65750401,-1979700832,1958805224,471787555,1726482292,-351827387,
996730883,-1073065125,117575284,-33262603,1925528264,412739587,316598363,-9705125,851024589,-383874304,-388431100,126491624,715135093,-387413504,-12829902,-986051468,
1827144562,-385650152,237764743,-789119885,-397380885,-236389625,1011898378,1241609426,-1073035638,65602424,47616,463923283,-1628959372,-385648640,-286785515,-1610355900,
-662044631,125092094,2095579319,1541048145,689545704,-768845749,-1189907373,512426034,-654113559,-1977913368,-402426617,-789169474,275956226,427081982,-1978140952,2043215554,
911619,-393559810,417865904,1976434199,-1998038023,-21173766,-1070425139,-397323693,1515793542,-125124558,512350346,-1017445143,-1614794157,-2041527162,719972548,-488045708,
783897586,-1241337344,-1999043587,1526771767,-399907095,-1073074637,1954888899,866314499,-2061954584,58008380,-399496983,1944591664,578480128,1380926696,480766035,57891162,
1360610793,-402606766,-1336209083,-57415421,1684361791,1919295599,1931505007,1953653108,-1975320563,1975519751,-225253117,-227204548,1526766569,-854791333,54173852,57982986,
1509061609,-401272645,512452107,-389872829,-1152176236,-521600522,1948466176,482273522,1360366777,11543100,1604517808,-388008700,126488795,175451196,1604501554,-107091964,
1877476587,-397198568,-1017442000,73375827,175423498,216547248,-400510954,48764423,57891100,1360568809,983744562,738706947,1398528647,-1337241006,54108800,-386310424,
126493349,1965571147,11879200,1290323454,-385649159,574419432,1172898677,1948794111,1965636843,1976434409,-114169627,742131572,-907476108,-561553679,1007127126,-385649620,
28376881,-402347614,-1449131934,1959329284,-14685949,84797523,-1930951819,-397714670,-2023819013,126506718,-1955320772,-320320677,1539312376,183042932,738707199,-1957493013,
218324510,983744562,-561553917,-402330794,-399763550,-2023874280,-1974315298,1949056007,54173706,57982986,218139625,1386397746,425912324,-1947663500,78243886,-398953136,
-259327845,574417034,983567988,-1967126013,-1241352976,1261221178,1477424872,-930479356,168055456,-1023314496,-628637302,1578551995,1381424775,-386207511,1348008035,-1682373316,
57889046,-380438039,-397716739,125106255,57945148,1593729257,1263984263,1962426088,-9705213,54173786,-628637686,904463220,-379891177,1659436450,1975519994,126501653,
-1308161469,-385649404,-1958481714,378094359,149422903,1971600632,-11540003,-417933848,-402651927,1260918478,-1320025930,363194369,-1293378099,-1564462591,512296104,512426834,
-1973877934,824084743,1944468483,-381893887,-382962318,209047690,1006828448,1975683587,282519811,-445445060,-1241284421,-1965423872,931802821,-713832902,389986641,-842626479,
1954495646,1917926500,1023288429,-1603832710,53215995,1038680949,-4191504,2030347062,1173763,77936383,149488506,-1623785728,-1590231292,-1979513852,1374194378,1360536505,
53550731,-1224776727,1927687168,1929591860,-805225424,986067664,1945144006,-270604029,53550729,-336120088,1399187680,-1186187288,2142659881,-397227541,1398428595,-350539335,
1019579070,-1023315356,79319633,453229412,51505235,1994982260,-1558279169,-927378684,1503456037,-56442486,50044930,225822010,678691388,58000444,1929412585,-1963947463,
1946696901,1019644462,-1973980152,1946434757,1019644518,-385649405,1702096764,-1258050885,64553728,260714201,797584963,-1558279334,-389852924,635982604,512318284,-1990523743,
1493475102,1264248922,-1152190488,-56622186,46190594,316181187,-1966921017,529215224,-980753409,1274472528,50045528,-747371460,-1558279845,-388895996,1515803287,-352083781,
1642617805,1248192587,1531652328,77930121,-1558279845,1407576836,1357437575,1172855626,1246357579,-397657111,58062387,1945036009,1355606275,1914064616,14412035,57876540,
-839483415,1975582367,23783683,-381892354,-365111948,-1343683723,1965177856,221112579,58053436,1006759145,-385649370,-717487919,-387445643,2662645,38004819,-734215333,
-655880843,512447477,-135789753,1019435850,-399608358,-1679231545,591144980,-1192751755,1088967429,1541048102,-402652183,-2081939719,-2024593132,1977289690,-153229053,1531678184,
1976581315,33614083,58054716,1007717353,-385649208,-600032304,1290339189,1977498670,318368003,58054204,1007644905,-385649275,-616814024,-1528233099,1976646715,41871619,
-386047768,-1020718034,1575517622,1377733629,-689417469,-389850269,-2024596076,-1558279718,21096452,-1343749260,-1966908598,1918974983,1937456377,-1017174795,57943612,-1158255383,
417857536,-1709835,963923772,880101436,-1975319115,-2758649,-2028655896,1007317978,743273274,-347508176,1934048262,53947459,64685019,182125531,-2015851837,1976434394,
-309532207,-187307957,611572359,57817148,-1175622679,55642064,60584667,60322523,1502900955,808190133,-654063478,-705963385,-2025154072,-1975270438,1015098375,1393456391,
1022663400,57957160,-1337335575,-805260025,1372097216,-1963686168,1929723073,-58464222,739463656,-2025220888,-1558279206,-561553916,-628665514,-2029754904,-561553702,-400430250,
-2023817474,-1014343970,192023612,-1580393668,-402427053,-1168420741,-1336796715,78160385,-855590471,785974176,-822204417,-2055935428,-2123092676,725403390,1019412853,-1610910487,
-20734389,1505759936,-16464606,-118964198,-1240470711,-65869734,-145714456,-1558279725,434723076,50045180,-922875844,-922826498,1355123395,1481668328,1970945114,1250552067,
58030908,-1186437399,1011967244,184776006,1346159578,-635239563,1966881987,-1009110269,91566652,-738731469,601094083,-1009518630,-806757845,6529096,-1343749141,-1967063501,
-1967115560,1233447416,1375743720,1593717224,-1957241209,-360425,-1125579915,129699572,922702693,-1605237936,1011876603,-402426621,-2024272649,77839322,-211687221,1006633145,
1007711003,-401837551,44102483,-792720893,-2016900400,1227738,-628631293,-2496317,303097938,113436903,1457424222,-1017440375,-378220484,477417788,1393687016,1158804968,
1192358376,125098636,-418256408,-1996055576,-1023193066,-402525208,-628686368,-628680823,675022730,854131572,-219027211,-1977925656,1965636615,-182195965,739359208,-907481365,
50044929,-1991196662,-2029825506,186616794,-385649189,126544756,57944124,-402600215,512357051,-628686031,55713419,672237032,1397801010,-2135893369,-402441822,-628679952,
1457424222,1342372768,-90445742,55713417,824084827,1105745923,-402345727,-121958345,-1948515329,1207560419,1342372768,55713419,691799946,1005065076,-1957483503,-402444002,
-349433550,-459122511,-1073063933,-73249164,47874,-1075258365,572231,-477373437,-33311910,-225752381,2025851564,1246382838,33749920,-1595372861,-930479132,1681704194,
1424556914,-1014345485,-423952203,-1965489405,14674120,1360840121,-191239855,55713419,1408367336,53550731,688966120,512316080,2090861361,1342440451,-930428720,1477416680,
-789133174,-661995266,-603717705,-1168907381,-1628961926,512318208,512426874,512295908,-880082052,-1174176069,-2031615002,-1963423232,-467760680,1344178947,512312068,-947256240,
1302512394,824085252,-107943933,-242358197,703136628,-41031446,750391669,-1558279421,1926904580,142403590,-1962350872,-1979483618,1137937143,1125091907,1094791050,2059092289,
3139587,-477373817,72359563,1344178507,180849156,72196803,609441883,59554567,11913354,-51848957,-1950131204,126397682,-1974910397,1975585477,-1957444622,1124085278,
1968954123,-385043724,-404166194,-2135895793,167983522,-372733433,2117867867,-1645673612,126501865,1971534915,212134147,58040380,1010282473,-385649246,-2115422016,74836201,
-370353529,1642659129,-1477946876,-873976817,-389850624,-1007747088,1392503784,1258336848,1961933544,260892679,11593772,1592822360,-1604919673,-1073086370,-628683915,853182444,
1959142082,-373072914,591194420,-1763165068,-57546504,2112378997,-1228502496,181466624,-385648192,-796200525,256436306,7137324,-997810342,1405388368,46303826,-1328510272,
-997810412,-372996528,1357389832,5040368,253814864,4515884,-397257896,854073543,2042628666,-244193021,394811971,787006299,867756032,738208162,83653390,-19859940,
-1564343616,-389873622,451473427,-1662495752,1541048140,-1073035638,-268310333,-386397976,57999339,1274098409,-1963986200,2145960898,-387429387,1503841775,1374352104,-1960306200,
1258502942,1961875176,245950478,532932652,-1070464334,-1155426584,512360447,1978138670,-1341819632,7315969,260725339,1127189059,-1056258678,1038680949,-527374103,132645749,
260722957,1127189059,-561553839,1004177238,57891290,1592336105,1398201991,-1982167215,-402437858,-1973729878,1946762247,-400510971,417860595,33012480,-402651672,-1746203469,
-1073084534,-389873291,-347924631,33012211,-1070399562,839056546,73310912,-349734424,-29146874,-1965067058,-1950348793,-696997127,678562620,-796254148,574371954,-56620427,
-1576979454,581960444,276118076,-805110624,-804818216,-1560468272,984613628,58310666,-1979695895,1949187280,22538249,-1070463885,1587550443,1958742532,1975582223,-1960792053,
-29250823,-1023314482,1587675568,1019382276,1007120907,-385649888,-108330697,-1602032726,-657456388,-657439886,1383323856,-650377334,-1514450605,-814394592,-1393456311,-948613828,
-1393456311,-1082833604,-1393456311,-1217048004,-1393456311,-1351271876,-27568040,-20513082,-339280186,-1973724883,-13244153,201522336,50110978,-1597784014,67896060,-791612437,
126543730,58033212,1023402472,-402426481,126549989,126533886,-1975319179,1132405767,58040636,1011087592,-1979025999,-381926649,24424880,1381061451,918266829,-1310160383,
1136787008,-745867382,168266286,-1611500352,-193356221,973572654,-2014808635,1959804122,-1965999102,-1973855551,-1609796144,-1073085346,1587675312,1008069380,839349595,73310912,
1587551723,-1329591804,73310975,548408692,1101724043,58052350,-1979341591,772205506,-1975318646,-1954601776,-29250823,-385649202,-1039530611,-1472403079,-1070463627,1527013026,
-385981207,24251839,1915763907,-180732677,-1998042173,1347506925,1492001256,1361163705,58002236,1010983145,-385649396,512442979,334037762,-1604691633,1337066240,108268348,
1219628092,649073781,1101724043,-1066086658,-108281206,-822197846,27309684,-1308345341,-1308200448,-1308462047,1007127075,-402426592,126501714,1958742595,-1426486486,1959722561,
50438287,-361626564,-1952560737,1100983537,1006925214,1007186990,1006924868,-1294764731,-1966085376,1958742722,-1426486519,1976499777,512475905,-1360461058,-403576579,32893009,
1364286041,1944592616,-1963488757,-561553709,-633646250,15270770,120437742,1499002600,1577704891,-2024350073,1478396890,-1393390845,1101724043,1977236290,-1982231564,-1023191010,
-402640152,-1910627133,-1979494370,-286712057,1501432,615639122,738941416,1526496744,1342606854,-1426420989,2062074631,82334708,1541048064,1806547395,-127276975,-1530005896,
1006937760,-387091056,-394766165,-1186430232,12226944,1077602560,1358957241,-712313462,742143348,-397276300,-292885132,1952107146,184608806,-312022996,-396878476,1378618102,
1961715944,-457774845,58053131,-2014491927,-561553702,1373275990,1525107944,1189630290,1524206567,-628630981,753468275,1482250989,367743571,57923843,-2014503191,-105163814,
1541028863,283706227,395006701,-628633077,-1978895270,118113031,-2019669089,1372943834,1493181672,-1957536934,-771013865,-628681612,1457424222,-1992041849,64653079,1541048281,
-1246108437,222056712,1034076210,807308035,-1975301376,118113031,1136853365,-398256245,-1073026181,-930419596,167984544,1958841024,1017498971,-401050201,-1992496285,1558766709,
1963867371,-1394060579,1976699884,1009380106,1389131022,1408016104,-1612280600,229678665,2028486514,603765512,1466558546,1096869979,1364417369,1531007464,-1544860838,1701080661,
1701734758,1768693860,2123118,-361427652,-329127854,1138394963,260719427,-1339061693,603437838,-31552685,-2008329470,260590383,1527220299,54370499,-126566390,-385922583,
-398325326,-398390866,-397211222,-1606088282,-1073085347,1860764532,512447459,-628685990,56368779,57989691,1541627113,808191882,1240007539,1912749283,-482154237,-33268574,
73245376,-1008036120,168266286,-386370368,-347930621,-997810189,-372996528,158598937,1408402664,-347666712,-759475424,1453713444,1510793704,-1880554637,-1975299575,1157687303,
-1073084534,-454499211,203327814,1067378688,1632813915,1836016750,1836412448,544367970,1684366707,858597408,943077170,544175136,909586995,-1325389513,-1325208803,-2029996774,
773753818,1511950592,-19233020,216550341,1008170218,-401902302,-1073026557,574360692,-1589840523,-851698316,-1073027979,-1975315083,118113031,58053002,1138925033,-1992091765,
-402367978,-1891833385,-397342859,-346428399,1971600601,48779527,-823436820,440189322,225707914,-1552633540,-1586122180,-1653223938,1954692291,1971534998,1959657108,-375527181,
-628643724,3022475,1511951187,773753092,1373275904,1494341608,-377362357,1948592826,139520008,2042252076,-561553883,773753174,-1018012928,-1465888609,78225924,1352638040,
-1465728974,-1013032956,-1979524120,260719367,1513065027,-689418159,-259368958,-1975314550,797590287,180521563,-1023314490,19711626,-1070401166,-1057045958,-822152845,-242496770,
121258412,1956529055,1927935452,1039657023,-51902229,-402396355,803752622,42592256,1361647545,1396901770,1526770664,-1975316598,911407,-388461997,-1017511333,-1779957328,
53263104,1124567123,-1017440375,-1977436853,-5155851,-33060285,1958742721,1959148040,1975859716,1965178095,-390993917,1019578963,-32672468,1959395009,126503687,-176938948,
-561553829,-628669610,-1259814518,53263103,512447152,512295692,61867171,-402457694,800734743,-1982186749,1526926366,-1686829174,-385871686,-398204638,-320274542,1048373249,
-822163714,-242514572,81389740,58002748,1090889192,-1073025813,-1638399253,512446623,-628685988,53419659,-930426634,-654049355,1926904643,790530319,-628669693,1489215064,
-1013005178,247111256,-385649408,-1069883190,-625389409,512446758,512295690,12256047,512447232,-1152187556,378209038,-633666804,1948723897,10283267,-1996234053,-1962652130,
-1996269026,-1962652898,-1962715106,990137110,-1977912102,1128481543,323348560,1963146328,7464965,-796213198,-637337418,512482795,394986574,512479755,427033434,512350855,
1128465486,1128470411,-637281657,72031881,-1209279865,1544981337,1977236227,7137539,1346570122,-118996157,1125091858,1480798090,1020855123,-1981975293,1526936350,11865994,
-654059261,-1948612797,-2029833442,1960459226,667269572,180367953,-1639735545,1134499722,-1623749986,24485443,-1949594685,990064414,1926859738,-2023859213,-633645346,1457424222,
1943636819,1482185187,-1018080685,-620012710,-1974732428,260721455,529156947,-654114633,-779422326,-1949594805,-402444514,-2007286624,797459215,-380905077,1397882592,77799051,
1457424222,1592828136,-396960121,126499821,-1558279341,117592836,1929383866,-545724157,1526586344,1577076968,-396960121,-1957494721,-2029834978,977114,-1157624856,-2023876806,
-380414242,1583087111,-1974018425,260719367,-1976595901,-20709672,-1023314485,-1951600245,1111599866,-1830227477,-1558279365,-388331772,-628686816,-1974278795,1255246581,512429962,
-633666769,-1070462347,-654055286,53419657,-288504997,51125899,1261406795,994774922,-1980860966,-1023210466,1360756665,855619560,-1963947328,-1010824697,1360756665,1979706856,
-413800189,-1961391293,-389829390,250150190,756976630,1494714371,-386043159,-739711489,-135780348,-873966859,-85447676,80013549,-561553879,-320318634,-402295567,65795553,
1526708712,-402651672,548468181,-389903792,-393544468,-20578728,-1950583603,-2013057762,-838974713,-1343489675,838902760,-561553728,-1329034666,126505811,57853242,-1313159798,
1374179584,1398495741,1127189059,-578142326,-654114635,-1461138549,-388461828,-396689673,-387318003,6744316,-225750438,-339400020,-1965389892,6088711,-838941186,-1729559691,
-1243065882,-997828607,-561553762,695581014,986250833,1912648967,-930430207,-1054210166,-393559494,-359992462,-16717629,-1897331851,1137740529,55779211,-2010150182,-561553865,
-397717162,-1092033257,-2007279297,-628636881,688120296,-1974379943,15254506,-318510875,-1326382360,376721409,-185341864,58048522,1357260521,738442728,-387126040,-1276626435,
-1957483517,1577362206,-396960121,-1545016103,-397203197,-628621744,1364745049,1365575609,1360756665,1156076112,-1973921026,-1966539032,-1341703480,-1952288000,-1073042190,-1720400502,
-1975318646,1066025775,11918730,-1054156541,1381099658,1457424222,-1958539382,1381194519,-1393390767,510986042,1959394882,-838974708,1515908981,-1070441895,1515871171,717589081,
-20905273,1515832256,-838974629,-437530507,671293928,-401827864,1381185889,-1958487417,1545505559,1926904579,807308050,1943681792,-397190390,1398537006,1530511080,1457424222,
738390504,183768552,-385649216,-1974409909,6744071,-335222702,-41228205,1499191943,1592298072,1398201991,1583679419,-1974018425,1958742721,705137296,-385649723,-1057037029,
41075002,-846544502,11913726,394937170,-1975547325,-1965489190,-628663576,-1958539382,-1965390049,1975519937,-225721599,1107789996,1959394883,1976434420,-5061647,125053244,
738357736,-386689560,-1020722582,1961858792,452867,-386067736,378272636,512426844,-873921745,-1615540753,-2041527162,635982788,-385649660,1482364893,1369359494,317411487,
1336066098,-443291389,-389480935,145761123,154941675,548409461,-385889560,119808846,-1638337419,540853081,698359922,-387413504,-973200582,-838988940,58049850,1946186472,
1962884105,-390005243,-1638391001,1481678681,578611358,-390738493,1031013308,1930933992,1397903859,604321440,87466696,1528351976,1805670746,1958742532,822798595,168095648,
-1157139264,-380432664,1364394221,120437586,1515127528,1527623769,554887363,583854275,-126566390,130419691,57337856,1963062971,-1330197241,-13768691,1946377192,-1010814461,
-1394032590,-1010814430,1587591117,1975519744,-991378687,-402426369,-1863777828,854583297,548399187,-1326964364,1975519999,45109264,-1946579992,1510157598,-790030455,2078822649,
-796239623,-1141093656,512294918,61867171,1526922146,512447427,11862794,-654059261,-1020647760,-5187446,-125122790,-603781518,-1023315109,2891403,512314187,129631045,
-623580928,53419577,1381099891,-100210605,962157147,1929588510,1977871322,807308246,24766464,-1576770398,1034027838,1124567043,-1992095864,-855418850,807308206,-1345500416,
54206089,168060320,840398272,73245376,-1258005342,56671002,130461901,-838974716,129693813,768768,842516200,55550656,-125118326,55385737,55975561,50994827,
168061856,-1996196416,839069470,8186048,56106635,56237705,56368777,168060320,-402426432,916460980,1963009029,87466499,740199257,-1991554304,1124287774,-1951281853,
51297251,51125897,-386403352,-1070405942,-661981046,58465929,-1996206686,-1996233698,-1996206050,-1576830434,1364394809,54206091,-1009108029,-50623650,-1957255634,-1979025953,
1916419079,485081857,-642586143,512481927,292814896,1390992007,1256739810,1524206556,199820146,512314339,-628685986,-16943677,1963584448,58039543,-1660248088,54730377,
-1996288325,-1157428194,-1957036276,1392520734,583240348,1958805191,1411287308,1126075139,1444841731,-34215933,120765341,350815092,-633214502,-1336930384,-47585186,-398457768,
-320209629,1444842493,-1160049917,57999377,-1948695063,-1996270570,-1023398378,-1564462408,-389872522,1397885128,-402362693,512439819,-2023881894,1827165918,937971948,-1377293057,
-393586680,988569320,-385649467,-2023827192,-628664610,1511951187,1977236227,1583045139,1381424775,1530254056,-402362694,-1017432629,-1327405335,54108673,1963488232,966939635,
-1963095549,1229539801,1236070795,-126304246,-637318839,512481927,-633666724,-1951599989,1117760249,-1639866466,-1958088587,1545505241,126507779,-1217057732,-337648920,-997828426,
-1966908514,1916877831,-178569991,-34674237,742194036,-68679308,-1058518048,-387025697,1949105810,739675112,1949056000,4712451,-542513077,-397511598,1949105786,3663944,
-543561653,904463220,-561553704,-289713322,1943681792,921197357,1395094016,56106635,50336953,1943682009,-1982167271,1526925854,2891401,-392762533,-770968848,-1729559691,
803849184,739675133,169224960,-1950684413,-1950209085,-1295137840,-383874221,1541081860,1311769027,-47128272,1529868591,456142896,1444842288,4909056,-339541644,-352210940,
-1560301566,-1057095568,-1224645144,780289,199813237,6219807,-1597784014,-1019608996,125040756,-1070409590,-31525399,519104963,973101984,-1327270717,1958951425,-372506915,
698359518,1959213568,-372769071,512433874,28770395,5774985,-1960917527,-402631138,-1233846263,-1979700832,-1329206280,1959213569,-372244823,1537220266,-1594324480,-662044580,
-1770862806,-397360898,1486880921,985923072,1942748867,1925659149,-1342016247,-1563886079,-27787176,-385649208,-555220989,1537262366,-1596421632,-125173668,-244137174,-397360898,
1486880895,1925396992,2026322448,649475,-5242251,1487061246,-922855424,-1142304908,1528728350,6135808,-980752246,41141050,-952444790,-125173133,12044170,-1057045718,
1342206650,-637281657,-2008873080,-922860793,-628622987,-1564462504,1503789144,5939712,1358900201,-1258276888,-1966568959,-1426420795,-1393390774,-930420342,1976106584,-347028735,
28659946,-1979705368,-1949988152,-1958565126,-376787726,-27735926,1357018312,-1168905237,11993204,-637285378,-628684918,-1010818469,7649875,-872546121,126409219,-1017390457,
1105766093,1444842241,1478396160,2727936,518766846,216547248,-400510726,-1070401017,-855627870,18802855,5643915,5774985,1520617354,81913856,91540478,-1343749712,
588048639,-400342552,149429156,590932003,58048522,1344042984,5643915,2696842,507167998,309657688,5848634,1049101427,1043988569,108396634,646506378,-396885926,
275906607,65583988,-107354110,-402541589,-1377044077,1962476348,-155454207,993837825,-118883467,-29144100,787642569,-160102598,848608195,-320336207,-385648129,844103687,
7512768,849525592,-655881039,-385648129,-1974468576,-792720703,852003520,-1142388032,-654101842,1125616174,1480034862,1444842322,-1073036544,-1071512637,1444842435,33521664,
-872543371,1979635688,691964423,479258624,-1007034647,84279821,470551299,236920349,168369023,100798984,235733765,889133951,885666902,867119929,891630855,872494413,
854799479,233321409,1489532157,-138674507,-113121279,222037896,171708788,-980810123,-311099844,1976434243,852360936,-1157134144,-1597832714,-1073086350,1642609268,-628666114,
-2030041146,-389808422,698352425,1959209472,1354825227,1476457960,-143275778,5643915,1493056488,-1070413686,1118501515,-91504246,-1010814294,-1073083728,39512259,-1258162246,
5808382,28820282,1962944928,1478396691,166220288,698374910,-1610255360,-922877862,-402629982,-980811204,276086818,-34674606,-1224116902,-1597768191,-454361047,-21964153,
-259340758,1007127115,168326176,-33065536,1258517710,-968626197,-628686841,-1219490384,461170689,-51901008,32947191,851704152,33006272,1979557864,-339476988,-352079625,
-20477219,83371208,-1967063544,2728168,41141562,-980752246,167801504,1975880384,1959213580,-386364923,-1070458058,1959209667,1352683771,1370112,1492626152,-243939074,
7512259,1923272950,-1010814464,1444842323,1923108864,1958742528,256003,-1597809832,-1019609000,-1152184203,134086746,973089184,-2013105401,1352686343,-389510656,275906959,
844160116,-47650624,-420953090,-872523775,28820478,-1605114901,-952500183,11996021,973102496,-33524285,-389546301,1398472713,840609256,-1329374272,1959213569,-338690556,
-872525036,698355316,-386364928,74841296,1457424222,445179995,973101216,-1609927229,-922877862,1520567156,21161984,-55646125,-1006759563,99090871,-561553918,33286230,
1541860187,840586728,-1847016512,-1609861636,-1019608997,-1006762892,698413291,-1594324480,-930480048,438495313,1958742617,1958820364,-389546488,-1070458326,1959788227,-387585036,
28770452,1394219496,-402632544,-27590227,2728135,-952450818,1105784181,-1213893124,-339476991,1879492322,149618688,-400955928,259129674,1946173672,-386798829,1005066710,
-402164991,74711089,-1070403093,-1564462397,149618800,-400966168,259195170,1946167016,-386798613,333978030,-402165247,-596377577,48820715,-1949046016,-402631138,-864683324,
-1763114569,1444842490,-85989376,698400373,-369587712,-872482150,-1041758860,-17337093,-1605254205,-952500134,1743264370,1501209,1118501515,1457424222,-2023829506,74733278,
-538195970,-1073036455,548405877,4581571,-74782640,576198004,1022457024,-1595050976,-1053163440,-1047861644,1489223714,698401785,1959213568,-389546471,-28114748,12314831,
-1597505957,-1057095639,-344602822,1352716286,11003904,-397323325,1348010148,-1696022134,-930457600,-33543776,986185408,-1964542521,1405311937,704666784,1949266627,1528728354,
-561553920,-1014344874,-1610589278,1554120797,-94705664,-561553829,1528727894,-1219273984,419031041,-385765285,512490246,-872546218,-1410858124,-100734952,-1010041253,-76402628,
309475900,-210616004,175266620,-344825540,41057084,-1071463431,28791747,-1979700832,1709724136,-12822248,-939653004,-243937794,1398522715,-1528299081,-373073128,1240012867,
2662936,54992523,-1021130998,-628637442,334227572,1946285755,1134361057,-388860439,57989500,1540977385,55121545,1926461672,-633542397,1128520075,1128470411,-388331693,
-1973735858,1946762247,-400510971,-1125583721,33012712,-387405336,512490335,-872546218,-872543884,904398196,-17337094,401664195,1020371177,-385649654,-1957432213,-1979389666,
1539508935,141888176,-401756080,-1017580457,-1326165272,-196220915,1271073456,1977073384,-1880571135,1538862326,-927968969,-1070464277,-1979516254,-390869745,57931721,852508649,
-1561818432,-1975320434,1915632647,1007514690,1006924602,-402296016,863172523,-1252923254,9353983,-973176820,1118501515,1007127107,1006924602,-387091664,-395053173,-462148036,
658294154,-169278606,-1901962801,1007127040,-1172409562,-1236125693,1948597250,1019674244,-1023314652,557631230,146209140,-210492612,616663640,-1227847041,532370176,-1965423869,
-1974772937,50045638,-1596517656,-922877127,2062091125,-385648639,126484496,58009644,738250217,-385649357,-1070464826,1392720290,168054176,72000192,512433780,2126119804,
-1982201085,-2029761762,771221978,168053408,841249984,72000192,56237707,72031881,56106635,-399647511,851705604,-1963947328,-2023859760,1539528414,1457424222,946518610,
-411772357,991550138,1232362202,1457424222,-73379501,-1595373054,-989724530,-930430722,1090565457,512442689,55771996,-397190695,-1990513639,-1962714082,1511950809,130435843,
1977236224,931683064,394877507,31320131,1531107975,1116137667,113641707,-385875121,1088948856,-1157138974,512294918,-1017445213,-98661549,-561553918,1391495766,9353809,
179106443,-2026015552,-805174054,-389510440,-1047858237,-1975316598,-28228817,1408595400,1342213792,686348935,512317655,73072821,1507381250,1261406283,-922873976,512488821,
149618869,852953832,9347776,168058016,185103552,-385649198,1498021983,-1631287720,-2023826809,-2024581410,-1967063334,1007127280,1015575596,1007121449,-385649571,-1662464448,
1377733077,512318211,11666170,1393027922,1355056799,512476294,-1343683750,49979436,57982986,1489903849,-1952529274,-385649205,120204117,-1729559691,637440,-1597105687,
126354171,-1227847101,-997828608,-385649250,260571338,-399538109,-1975320365,-218765112,512312131,260571953,49979459,-1047867184,1352601458,872701088,-1245148661,1939757056,
1100962052,-1626371938,797459280,712697923,-922837416,1352653429,-896864630,-637281657,-806812813,-220403470,56368777,509515,-126494149,-1975402446,824085488,-2028500477,
64685018,1272612825,1125615947,1922979907,-1964471738,1124567752,395008950,-2023865533,995120862,-385649958,501808975,1490682666,-880031490,-73342091,63671042,1912876251,
182125320,51082432,2059406043,190723,56219907,-1948612647,-1023192546,1539316473,1124567747,-1979665071,1507394504,-1621995069,9353808,-1968377205,-1949958424,1128443122,
-838989944,-1638337163,-389850790,1793645658,-215947223,-1948612805,-352017634,54173706,292864010,1406830426,983744562,-1665073661,170887762,-385649171,-1958488737,-1977292001,
45175765,1011025802,-385649316,540803485,-1040316811,-327823874,-1326806437,30861404,854622952,-1966044480,30075120,126546058,1965112387,24111363,1383342908,58009148,
-33464087,-385649203,725352750,-646707024,1124567627,1433677372,58023740,1006712809,983331932,1018590471,1008235556,-1968278230,37503941,126485618,548414524,-838989195,
851362558,1125123264,-972897538,-1023479670,-838991695,126509428,1949187139,1948466206,1965833453,214338083,-336557504,1007127265,1949216803,-10098429,-29163087,1959657153,
1124567606,-210492612,1005894226,-1963488686,1952333011,121291521,977533813,1140225287,-243988678,751143491,1525314052,-18314662,65749958,-1973757305,-1023521850,477431844,
-980759810,343195658,757860234,-29620620,145754741,-972946428,-838930294,1702141275,48779857,1364810459,-1964340653,1019282117,-385650151,-963980253,1558741004,-361240517,
-655864997,292878802,1006844578,1007121467,-385649620,-991376536,-628663854,1385976667,-987101302,-1979664829,52399056,180718298,-385649472,116129453,-402621464,-1654919385,
1491665780,-402426882,-2023821337,484988638,65625068,1575535576,-1966211584,82330375,-1312101393,-1325012224,1476520705,1172884990,1956469504,1860719056,662694106,-1957473959,
-1979407586,-1979665943,-980791099,57982986,-387145240,512485860,173540515,-385649216,120258398,548464778,-838941186,1340670837,-290330369,-1974405909,-1329591610,-402426837,
-1017581917,53812873,-387453720,-628633073,-1627363608,1151311428,50886046,-1981576231,-1962719970,1392520734,53812875,686510675,-1981217932,-388331574,1735721023,512353163,
378209093,378077230,1128465498,1128470411,512302987,-628686802,1406782696,1529316584,-1313273484,1374259712,-1949205015,-1996203490,1526738462,1877563737,310225,-1975264253,
-2101787897,1975597568,1227015,-286533373,973124025,-1023314751,112793401,66614272,-1159992359,803799070,121301194,-781326261,1927828852,1827165145,-398625571,-1947716854,
-1558279192,394937092,-1959294397,540847346,-2008938123,394808119,-401605045,1264314588,1959869160,1950039074,-267851771,753421100,-399724335,-1158943313,-1461181776,-390403859,
-1595399504,-388502547,-1947603353,1403571670,-2014776694,1007252481,-401640390,-143064706,844879498,-839077696,-963984469,-922828246,91423292,1642704077,1912945865,-916788989,
-1974381991,-1159165240,-2023866724,-1974249762,1918974983,1937456134,1361062914,-225711990,1111731246,1968817466,1976172053,787647458,2025851564,452867,173693787,-1073036352,
-225711240,-1073042386,2040414879,1540197109,787647315,1975519916,-922818122,1145198923,1380144127,1347223118,1140666708,-63876287,-1856472320,-1118263464,1403637080,-997810350,
-1161525680,-637337554,120258480,-796213246,11971277,54440379,394931930,931802691,-1631287720,12048522,-1976641021,-1976679657,1524270903,1457424222,18371,0,
0,0,0,0,-402653184,-397158383,126544268,1333051402,1125616195,-628473974,-1070411638,-402194526,-2036334885,-997830460,-1241190215,-20775413,
-1974635318,1914715143,1949187110,-1426486488,-822197439,-2040993419,-2036359484,-997830460,-257888118,1958804996,-997828602,-373072994,-347879384,-1576947510,-964032769,-277607620,
-344849604,548465780,1101724043,-353644802,-108322640,-822197846,-1158941067,-29161590,2062074826,-1596421409,-1019607841,-370605197,50378695,-1948612645,50651166,-1608545318,
-1057094346,126540660,-713768950,3062355,126540291,91425084,-1058415411,126507975,-1007042550,-818550709,58008380,-389075224,-2023825622,-397191458,58064811,-1983407127,
-1023088354,1360304313,-1965613848,1965833223,-1847045287,168266472,-385649216,-1958492292,604473887,1006744287,-1307216823,1951349762,1006940687,-1308003246,1950432264,-950736637,
-1343729061,591146221,-790101131,-556996402,753770984,-1073036662,1038680949,-1293397817,-1973856002,-371339823,-1444413309,1007127294,1963242114,-827987879,28476732,1329352052,
1228677236,1810380660,1743274477,1676169453,1609060589,1541948909,1474842349,145900781,2028481771,-313726770,-313989035,-314251180,-314513328,-314775467,-352144812,-832706543,
1122841064,1307389416,-397729614,602459727,535314925,-1974316051,1965243399,-834803709,182335976,-385649216,-556939600,-1974775116,-836114224,-974584972,-561553722,-1614640554,
-2041527162,-1662495804,-385649410,-1973762411,-855032634,-385649697,-1185692029,-654114770,11548552,-40769189,1975519827,87465994,57934116,-402438423,359988843,82386569,
1929556051,-42866429,1357504717,52750534,834294619,-1998978304,-1963423225,-383874600,117594884,1526728646,65796547,-1614794227,-39851952,-1638340147,343167135,741083018,
209043466,-389179672,1481829482,1352661406,-1070444385,1424490930,-383874049,3258628,-1638344445,-2145075174,916586764,-1617012731,-1564468656,126485743,58310666,1476450537,
-402426722,-1070404777,-369218328,1122551557,1273679357,-1295169816,58063232,1946515944,-334436328,-1303364564,-402229870,-335950545,-335484920,-1296037311,-1974427902,-1576000318,
-1638398878,-1057075041,838885282,-19011392,-1957454248,-1979389666,-2145101049,350815093,1676170205,73572577,57982986,-1962640920,-1996269538,-1962474466,1392521246,82386571,
167823080,-385648192,1307115542,73572549,57982986,1527030504,1654833202,-20387580,190555,-1595349013,1979464704,437119235,535423949,807308229,-390067712,1189675011,
-397369600,-63176573,921240437,-845260774,-989795860,616799832,73638432,58039896,-389746199,1671490167,73703940,838904808,-51255104,-1988098106,-402331362,-1073086389,
-305286280,-1597713431,-1073085340,686293876,-953686012,512312131,1525154648,-1564462358,1139279158,82813182,57982986,-372508183,-628636220,53419659,-633611641,485005426,
-1564462358,-337050314,-1957538839,-1174083298,-637337554,1532626826,1394505155,649744465,173101635,1498989504,-260454146,1532609371,742131594,-454494347,126505419,58008380,
-389293336,-2023826474,-1168943394,-112049362,683271167,81764417,916504555,2025851397,1093188044,-543113166,850324228,-1964471616,-63838011,-1610610746,-973208353,-277625558,
916635698,-376051707,3153547,509515,1539562473,-1631287720,-1622060461,-2041527162,-383874108,-402214908,-473104379,-1614550039,-2041527162,-628665660,50343611,-2029548838,
154950362,-890698893,-997828608,-561553762,-454468778,1381192186,82386571,-823654224,-370881025,1532674996,820560729,-368777013,-369039324,512447272,-1152187159,512294912,
1583023337,-396960121,-1974281454,1965833223,-888543221,1543228904,126533682,-739749729,-1638389271,1457424222,-1014345569,58048522,1405888233,-2015229976,-1638376998,678711455,
1021843176,-2011991037,-906083577,-1638339467,512318297,-380566295,-1638342093,3022475,54992521,-1022957221,1946118888,-1020204797,-439495189,1392513768,48759221,851663616,
1124567232,-109720066,-383874109,3389956,1489230339,-1013005178,1979385832,-1023743741,57871024,-839249175,-1024529946,1979380712,-1025054461,57871536,-839254295,-1025840665,
1979375592,-1026365181,57872048,-839259415,-1027151384,1978335208,-903878397,1206435890,-381504772,591184626,753446261,-385554214,1405258284,1543176424,-1178400886,844180972,
-64689728,-1177149720,549066395,-1977912020,-1189614634,-397339496,1374224332,521922802,294304082,-259342286,1364250762,-22681517,1810432883,1965046978,-20513274,1022260686,
-1978436318,1019382504,1975880236,-1963619831,-25040683,-138718350,-1962953471,1019644616,1958840866,1393376302,1012619636,-1977322230,1019382472,1958840876,9037827,-27924397,
1009152603,-1978895091,1948269762,-1339278315,168784909,973829312,974025926,-401967934,-397213597,1935408687,574378930,540804212,552084853,1008759550,1022850080,1008235564,
-855345907,-1961855775,-1979389666,-401428280,-489816611,1539425257,-1157625914,-1031142922,125050924,1726480565,-389850144,1352652087,1489578728,1934663582,600107011,57843288,
1529070824,1958742723,1124567291,-193606146,-389682343,1621229638,1958804992,-1046550269,45240659,1543161576,855391208,6333120,-386131223,-1073086426,-1057093772,2112422773,
-1563885887,1364394080,28491826,1543151336,855387880,6333120,-87234213,1392030952,-927340469,-1341950630,-397229311,-399710330,1263665195,1976084200,844781829,1944634304,
417869031,-628664064,512350467,-628685052,-930486197,636027764,-5219647,-796399421,-602806189,-1009088678,-1962079303,-2030030818,1478396890,1977236227,398181121,46369378,
-1965520191,-1979706169,-1393390600,841925930,1991987207,46369377,-1965520187,-1979706169,841898232,-1950285305,-29185286,-1325238839,1976434187,-351423044,218872248,3153547,
512481927,-633666728,1992011636,46369377,-1965520187,-1979706169,-1393390600,841924906,398151687,46369378,-1965520191,-1979706169,841898232,-1950023161,-29185286,-1325238839,
1976434187,-351423043,512447417,-947257298,-27540702,-1023314752,1688227999,1958742532,-923408125,-1966891432,1967143943,-944904189,-1979711303,1020365557,-1977649942,-1664140281,
-1729625227,-429070137,-679548888,-429594542,-680073172,702963176,-1957454503,1946500382,47875,-774306913,-690905378,87891593,87498377,512478091,57935163,50331835,
991857114,958302469,1541048069,-339725629,1342418946,1493148904,1392520936,1929586920,41936902,1526879720,-953030461,1409256680,-1157425944,175374335,-402495256,-662044133,
132645047,-1329374435,-1974316797,216550352,-401902393,1009575390,-402426836,-1031088386,46262355,820577139,1499093960,-1949896727,-1979369698,-1967052093,449284824,1945668293,
717238981,450398915,-1966921017,-1950090760,-1979369186,-1966986557,449284824,-336033082,512447454,-628685511,87629449,-253181093,-1957604353,1577400094,-1990795641,1493514014,
-488062117,-397258242,-387259030,1994981101,1952013055,-446896045,-447158228,-385649342,1340604512,-397195547,-1041759651,39315711,1946131688,-5642237,1927828291,-402426881,
1396965295,1510055144,-397323687,1397752027,1776867975,-396862718,-119013161,1230657792,-1056258678,-1017388171,-397192623,512426053,512296253,512427319,512296251,1515914553,
-1957444775,1392851230,-388331694,-1990459430,-2029700834,-3086118,958302555,924748549,-880062203,1543487976,87498377,-1209480309,-842834945,30402744,-385928216,250085833,
-402426881,1397948200,-2013338392,1240579034,96142195,-561553846,1943681878,-48330476,512318214,-709163273,-115439287,-338000122,-561553898,-115439274,1238743814,116858505,
512350855,1515915005,-81884845,13887494,99111514,-381593344,-964034016,-657407990,-1031081846,-796206896,-216101949,116760582,-216102461,116761094,-216101949,16482566,
-2130087392,-1994391317,-1022954722,542163841,116596361,-216101949,16482566,-2130087392,-1994411797,-1022954722,536920961,116596361,-1967027517,-771730162,-1979255538,-1023315256,
116590335,-1967027517,-771730162,-1979255546,-1023315256,116592383,-1077506877,-946948096,116596363,-1979217370,570881302,1427016386,1927991808,-337063420,-1010397448,12568204,
-1949856072,-1962478818,116760809,572969206,-166819321,-183623162,650185222,-846526584,-1950103922,-1612000791,45210251,-754720045,-489487183,-2130414690,-1994391358,-1962478826,
-154498347,16798982,128980084,-2135898078,-173872942,-754732794,-216661526,61915910,-922564574,-388841296,-1324943966,32166658,-1022954730,-956282720,1678064390,1946565632,
1008497426,-971476476,33576198,87885511,-960298848,16798982,87885511,-960298688,21766,1929657539,1426519567,208929024,-654966492,-133761374,-983701053,1437664036,
-157097482,-1597769722,-1073086379,-318051468,-2135218312,17204226,-1157401600,-885325504,1258517151,-167064693,-92205960,74580168,-1023359046,-768359522,-1614203965,-963843861,
-1900543809,198413255,-1955826478,637989662,-174051446,-153056762,1427016400,-165770752,-1964498426,184230652,1081363183,-858601262,512487283,-2010773773,-217645265,-182024186,
-775255290,-152448535,16798982,-494860683,116064259,516737,-1411126831,116826364,116604555,1049209587,-1679096077,116596363,-2010150874,-1912146650,2145960902,-48888834,
-82429178,722039302,1040644886,116987647,-149487810,-1008475642,-811341741,-397163685,-1017439961,1899921654,57933824,-1023084055,-1979700832,-754980656,323049,263454720,
1218580685,1009300480,-1274187262,1963408464,185383175,6819465,2696840,-1982100230,503533598,-1912602438,270436826,1295301381,7085705,-1990769477,-1946128354,-1946128882,
520122894,-1157614872,12124696,-1178497536,-1943666566,637534863,1284769735,-536558717,-1898214159,-515315517,-855526149,108521495,-397632581,1676226271,1290649138,-1190767685,
-61669366,126397486,1975519811,-1014801418,-1007689712,788479695,1422591744,1226859880,1344294210,1869836901,543973742,1886220099,1919251573,1935753760,234840937,1936876886,
544108393,825110851,1866670128,1769109872,544499815,541934153,1886547779,943272224,917297,1093481778,942502512,1397312561,1375739988,872021,1145130828,1095958562,
2245974,1414418243,573308941,827609164,860730,1313821268,1381236749,222709327,1497713408,1129512992,1313162578,808202272,864300,1377718428,-1912602438,270438106,
171632645,6952584,378063614,525992030,1456446808,167796384,-1609468480,-1073086358,28576373,11540173,-922877324,1587594078,1958742528,-1564462584,61866078,-1604888893,
-1073086358,11826293,-1073080627,1583285108,-58698813,-2147126725,1014121980,3022475,1977289539,1312078611,976100017,1124889639,-906051330,-1070402443,852749147,-1948200732,
-1618268456,512295171,251527275,-389021590,244072708,-521469843,751076944,-166677701,106150883,133617667,-864790273,7020169,7151244,6950654,-28111637,-1576569400,
548405354,-987843861,-1979684066,117382919,-1073086357,-1602682252,-879958990,7216778,74637114,2133116158,6956680,-2005549046,293071195,539897886,589439250,639968279,
421015858,337580816,756100886,1364405269,1315749462,788270769,1960852140,-906082807,-1070402443,-1406270741,-1017423522,508037959,474815819,169615184,41092724,307364214,
240090963,209126773,471670303,168496141,1381061532,1946631248,1963801677,1862727178,57999104,-402617368,74711596,963968828,578030652,-1186035781,-29163512,773617865,
-160102598,-645144112,1364126137,-508035282,1444842287,250135296,-401675516,250085438,-519182336,619185131,1499093001,1354997083,4800138,5119626,-1275067975,1477496073,
1911051203,-1579008,-397163685,146014312,-1017442099,-1962937368,-1010005272,5643915,5643913,1307071388,-1013097728,-33532000,-1974418488,704653582,-33532146,-1979664959,
-1979692738,-1342157026,-855002080,1444317968,-17660416,-1261764914,1477496066,367547331,1228835328,1327401472,688818688,-1342130944,-855002080,1380997904,-226045045,-889270530,
4800138,281871028,1405311066,-1979666094,-386692369,112459803,267063501,11620947,-141890678,-1275065624,-401552121,1532624924,1173699,2692746,-822162690,28364286,
5193354,4825283,1252000747,17229824,646586485,-58720184,1377268743,-2146959174,41026300,-466426160,-1910578441,72262618,-1664919009,-1169141165,11796480,-997582899,
-2144803712,225716476,1963508982,1946265612,-350703091,-350506490,-384191998,1347991482,1575554364,1532647439,-1824734307,-1791205260,-583252364,-471316876,1958742734,1019805240,
-1171098870,-487194608,-1031679862,-397277613,-399712862,-397162799,260757580,1913649536,1125101826,1599813515,-67062445,763929843,1543205608,-1075713597,49020848,104464560,
1906442353,-402426880,-1863843746,-1101806658,179897939,1455816192,149440176,-578137637,-1410858825,-400510956,1582947067,-1392750250,91537418,-352316440,-401755915,1582947047,
-32455037,1540257225,1012318443,-1342016243,-623777765,-1605319842,121372744,71042164,-1070464397,-1017593846,-1230123693,-1979665896,-1275049666,-1609511678,-1073086351,512365429,
243925071,11862057,281872820,1543376360,-402148413,158728128,167791776,-1291684416,106151536,698353077,-1339540480,-1258130383,-1974251510,-402633186,1448804407,-61798735,
-1665135956,839021910,2484416,24485214,-906077874,384362613,-964469248,-1057073136,41040444,-838979408,-1343699083,851663869,-1073065024,548406901,5185162,41225532,
-1185866832,162791425,-1023536947,281871028,-1966908583,-1258272498,1210485248,29685248,-847248524,83656832,-973207182,1913060480,1371930114,208940092,1506632168,-397285238,
1081392476,752627176,359935036,181226984,-1342016320,-444573312,1374161411,1958559720,-602871773,1949056044,-852432884,1372097113,1958554600,-604182513,-853481428,-346427254,
-1101666042,-1963881895,-1979700954,176104645,839546048,181799634,-337218095,687636507,-25162636,-2133167356,208798969,-25111573,-2133953784,-915207943,-1073032822,1048584308,
1946615880,1007071580,1951446018,-30886870,1976106697,-2134509908,-906093195,45160939,1948843136,-2134510071,-1040315020,-906098197,1971373558,-2000028158,-1593824986,243793992,
378077256,-1053163447,129505908,4956928,1302578310,1327925248,-29693952,1336017780,7268352,-1275049312,-1022309115,2688570,646591604,1346109512,675022708,-1729559692,
133988541,1353712757,-192930581,133988354,-855768459,2728528,4728456,4785863,770179072,1405310976,-1292051736,691961895,41166848,414601138,5193354,-1979711303,
-855198527,47632,4800138,281871028,-1185738773,243859456,1218445385,-855591936,-574756848,-386348568,-1645676662,-389850116,1534393764,1371406513,1212055552,58000896,
-1967319319,-397322708,1081392084,125054012,1506527720,1498540170,-108375215,-8331894,-2146929408,57805051,-1273967744,1527827723,1958456296,-1146755069,747134553,-28964748,
83460289,113687922,-1023410097,-3973543,-16757450,1006652214,-401574868,540855166,-1973872525,1978159560,-399739717,1009572422,-401378260,272419686,-1662450830,-393586244,
-1151670191,736629108,1340615898,1930443979,-1973790231,1498501840,-2131654054,243863526,-980811701,270852304,-444546550,-790245369,-790245147,281147109,-847248524,1408109184,
12048522,1302466340,1311672320,1328449536,-854871040,-3974384,1006655030,-400526292,-1073034502,440163188,646600563,-469106575,423363700,-1973793933,-504868144,-394562374,
1009572274,-401050580,-1073034542,646591348,-533069783,-1973802126,-1041739024,-10783558,-402626506,1009572238,-400985044,-1073034578,41222320,173613232,-1578610200,-349342534,
-1143609085,752446952,1019908584,1509061408,169928064,1372097256,1958380520,-648746993,-898045908,-646766532,1372097113,-444575399,1745783055,28596480,-1990586163,-2046798314,
-19988750,1049252810,45350985,-1017442099,-352276400,548425731,1347637660,1492794856,1745783643,1913058816,41221888,-401996619,281870772,-1017602727,0,-1,
-1,-1,-907502512,1397454075,-963882415,-1912602433,922691271,-14286724,637566518,8128199,-1943644936,-1912570354,42053830,-1291816442,1228835459,112896,
281872820,12568204,650612224,8259215,2080804646,1522961920,1486707545,-1178736445,-385853792,-1259800974,6678713,1450569226,-385160694,646598772,-499515351,-109033358,
-1606192358,-1073086351,-109050508,1396142873,-822152822,1049283326,45350985,146018509,1348145357,1018787816,-1341885396,-402134272,-399714238,-397358746,1479137338,1951973386,
-372995582,-1863715310,387258,702031336,-668931901,-919410648,-669456302,-919934932,954778457,1955937465,-670504952,-339725603,-1188435963,883097520,882950912,1958742528,
-920917968,695405116,448419411,-466464170,-259268399,498401070,1532937046,1062614211,1280722518,1918266198,-2141816746,-1873377194,-1171920554,-1979697733,509447,-1946837015,
-385861858,966790854,-175314688,281871540,1961101904,975079692,1009682432,1058441472,-997566464,-789133058,-1946848279,-385861090,1017122458,-178198272,-33538400,-178722368,
-33538656,-179246656,-33537888,-179770944,-33538144,-180295232,180913384,1007842496,-1269533948,1102795520,-1965554944,669604615,28988405,16890114,-100659269,254078190,
-102644934,-1020130333,-28253814,-338152761,1962871532,-1143502310,79233089,-722053120,-388963838,663224947,-17309117,-68651574,4300891,-369827351,552122719,1955937464,
-688855032,-339725603,-1206786043,1168310192,1168163584,1958742528,-939267874,-680328132,242483624,-922873676,1085538932,-385822488,-1152125780,-1073086394,-1975320204,509447,
-191174309,1448431772,12197463,-1898279424,-1593503714,-1005977498,251595124,57999462,-1610602520,-1073086412,921174900,4562944,57982986,520120808,1482514015,113692573,
-1593835419,-1073020826,-95283084,6620918,-1173916161,619446369,113766140,102,1405311739,78926417,173019341,-1995672348,-2013251042,-1996473298,1476411158,838874784,
169440452,908495076,-1995344896,-2013251810,-1996474066,-1342161642,3515135,-1017423526,4635475,1962950528,-401558521,126353425,4161603,1085540213,-2013264664,1388534535,
-335412806,-922827742,1522829976,649411,-1174023240,-346947580,1712753464,1962019328,1694942727,-236192000,-958469949,1915091587,-1075293678,1911041237,189946314,1510438354,
-369148951,-790054893,1227519,-147530568,1694955249,141950720,4438608,1492039344,-301972806,1978582154,6404615,-301789972,1712752986,1694942720,180551680,1497451866,
420501776,1494243674,1494243600,1499082000,1297757200,1158699329,1494243674,1494243600,1494243600,1666866448,1497451866,1499102224,1494243600,1494243600,-1441769200,1851437402,
-1424991909,1499197531,1813010704,1980782940,571496796,-1675463230,512316240,394790121,-970079357,1128464391,-968675448,-2008875001,130433807,-1655153920,-1365710397,-2134680744,
41255162,1489175218,1503577222,1522752346,-2084349605,126496451,-1950101258,-2096830178,-1950143549,-2096830178,-1950141757,-1979389666,-1023398009,-967747754,-1526382842,-1090195266,
146343232,-492504064,1583307261,-1152298045,145818944,1965047680,-906083571,1556018805,88653573,1421742315,88129285,-1493432143,-906090635,92993909,158598202,427147274,
1963001078,-1962636780,-2012944098,-1157615225,250108404,-339725824,1509866247,-117439256,1405311833,3022475,1960512323,-1144825086,1129514323,126486705,1140119016,-160052738,
-873976144,-1014801420,-163270647,393535751,133583024,-1341098720,-2146961854,1102055797,1967130614,1531817986,787785192,172165002,-1007323712,1970226720,-13736850,1394606093,
1886415211,-13736859,12124173,1376684032,-387272699,-471204163,89308158,130418570,1975519744,-213456891,-487997430,1376684286,-341579515,-1963013912,-1325389522,-387076096,
-1209401711,-2041554690,-196810556,5705354,512477694,-1886911255,-1427570638,-997828354,-1963439639,-1325374930,-23861248,1659399600,-22025986,-2013240416,-25106169,-997830568,
-385874968,1793654401,6536181,58002748,1006953705,-1023315168,-397211650,-27525491,-17533760,-385402680,-2041051963,6464196,6398147,57982986,-2136151831,41286626,
1369571762,-1564410363,-896924336,-2139037312,452264425,-2132705079,1947255542,550076419,167796896,-1325239104,1976109569,1594291721,41221888,243810481,-4913848,-756520784,
-400061699,-990446034,-166955775,58032577,-1342165016,-400561153,820510771,-1946651906,-167450338,-2130693753,300419701,-972721407,348166,1638007216,-35133440,-385808442,
1069284794,1161477,365757364,89373635,1392513465,365757108,48825203,1587567361,1975519744,-1522565114,-373037451,1637919785,1958804992,-1564462581,1621229665,-439490304,
82386571,3246070,-387287679,535298107,1407380225,939549115,-1962052313,-167450338,-2130693753,-1023314597,-1263801879,-1840897,-997830568,-385874968,652803405,-33060864,
-401902399,260635997,-44570429,1404768138,-33508091,260587977,365757364,-956480280,-389873401,260767037,1404764341,-1009188091,-1628962380,256255,-1594026775,19662160,
-1144848013,126485841,167774150,-1023314752,1929382632,1342621191,-1073086459,-3938109,-1040316534,-1996686104,-51386353,57937722,-2134654966,-579534785,190544,1404814168,
16824581,365757108,1403000178,-53745659,-823654520,17286908,1962526974,-2134640639,91555068,1877547186,-1423578709,738545824,-373286399,243796115,1525220689,1594279657,
-1991049216,-1962586850,-1996271594,-1962587370,721880078,1225689547,-397258491,1499135652,6332507,1946599434,-1262318078,118869251,-1174369816,12124165,-42645248,-386239158,
-1094516618,-1937046189,1621098506,-1665136128,1343059281,55988563,-434706215,1482381662,74776892,957579,1958742534,211061518,1959329280,1343654660,-1262318077,118869250,
-1655106958,512428917,-654114768,1478396227,-444536573,-804919216,83656792,414319989,-374688279,-397694357,91599347,-352295776,-1041700861,74825738,48955824,1688338608,
-840922624,-607272171,-134091783,-1952648309,-1979407090,-1564396861,-947256153,-578100174,1939734322,767755015,48955649,-469056725,-2143482504,-1961528832,46433246,85417449,
192479360,-997990773,501213442,-1577025531,-1514470234,-2146467836,-13443445,-1014969472,54068934,-641275776,-388330669,82314986,1579059653,-400510716,-396636389,393523552,
684732904,1389996008,742131594,1290274165,-386798671,-1993748450,235092766,1348331960,55588607,73283327,991857611,-397163773,1815872782,1279003252,1899759220,1362887284,
640074587,640034342,640034342,640034342,640034342,640034342,623257126,606348581,589505316,572662306,539042081,522133536,505290527,488447262,471604253,437984027,
421075482,404232473,387389208,370546199,353703190,320082964,303239955,286331410,269488145,252645136,219024910,202181901,185273356,168430091,151587082,117966856,
101058311,84215302,67372037,50529027,16908802,257,-65536,-16843009,-33686019,-67306244,-84214789,-101057798,-117901063,-134744073,-168364298,-185272843,
-202115852,-218959117,-235802127,-269422352,-286330897,-303173906,-320017171,-336860181,-370480406,-387388951,-404232216,-421075225,-454695451,-471538460,-488447005,-505290270,
-166993695,-621346183,1030805291,-397198732,1939610768,208332803,259576331,1915222659,57908509,1527528936,-2095730199,243129082,-2094611837,293395194,-1174400024,233373658,
57908480,1527520744,471853251,-770968597,-150832740,244186,-1031675181,-628662222,-1659034136,-320273544,485287948,1913181417,-1878151159,-956624919,126484487,-1996905240,
108380935,-393213264,1515778153,-2134663845,27198,1394479732,7020229,1526742912,-972720865,27142,1605333737,-306255522,-2007297931,-1157322954,113643520,-385613061,
113710376,1189,-2007297853,-1157322954,113643520,-385613061,113710352,1189,-304718653,-419508547,-1264165029,1885290806,1640981257,-864611964,2051237419,-1080764955,
1818913110,935134639,1199926534,-978565349,426143783,-1223206686,1340109649,309237645,-1546094845,-687194768,-858949085,-858993460,32076,0,33024,0,
33824,0,34632,0,35450,1073741824,36380,1342177280,37187,603979776,38004,-1769996288,38936,-1138753536,39742,1797783552,
40558,49872896,41493,1136082944,42298,-727379968,43112,-2065225216,44049,-434047872,44853,1604923808,45667,466206468,46606,-1564725563,
1073789233,191576694,-402604962,-954006391,1644216330,2028717484,2055258925,-685328617,-1399798184,-2038943122,1471531527,1746288394,-308097751,-1038364980,344313939,1498505536,
430363652,1873131920,537974565,-879810572,-1811228082,1060731128,-1190339071,-1895311562,1733288225,-221655804,-2128354231,1870413893,1891035004,-978474965,1290070813,924389942,
-534974907,-2065738045,1813180790,319526458,118945050,-1748075575,1222441024,-1111352645,227146608,1989759157,65302,0,82935808,-1710981067,612571639,1971536739,
-1450930739,75662207,-2130706432,-2092060446,-2096008694,2134181108,-2144243176,625304878,1682186531,-2147471316,-1921080122,2051014659,5960464,1316134912,2328,-388717296,
-402653184,1525878,199491584,596,1000000000,0,390625,-1769996288,152,256000000,0,-1609612736,655360390,-400093184,167797763,256,
-7307264,-1,-32769,-1,1006632959,125909162,1952024700,1999017952,2048794052,2086883422,2121661978,-2144243176,-2130706432,517470981,-1725536890,590633095,
-1520574073,1225776006,-1277754749,33117,1644462464,1350468405,2038320164,8366761,193003520,-2089923004,-42065159,-1631386813,294,858927408,926299444,1111570744,
1178944579,-1146471494,1927840056,78028810,1014204476,1265788988,77805311,77936383,-1978638104,-2117828382,-162520204,-2147178746,839926760,300345572,1348098904,-1157322520,
-1914150377,-768386286,854186634,79987466,77932160,-385649536,-466478959,78063240,-1089340951,865076387,-945029952,-1014956027,1964552168,-1528895229,-945029949,-1014956027,
-844358935,-1523154759,914391044,-377486159,-1160969334,1525275015,-2017735420,71821785,870890701,85715225,-1310074489,-1984049915,-385572066,-1093859221,-796157870,1510534888,
-2017473085,163047897,-645414707,-2129793559,1971323131,-389952237,-768407341,-393183045,1273496581,138799386,55827447,1476686042,-855533079,146139330,-1556676774,-1523122428,
145352708,-353805733,1388546819,1918561015,-371684603,-1009974922,143779923,-1556676774,-1523122428,142993412,1391024731,1977289481,-1489598452,-83442172,770245634,-1558279919,
47108,-1845189213,58310667,201326522,-955876901,-16472826,-1556154369,-371684604,-645463766,-2028415000,-397163559,-2091181499,-1950153533,-1962630378,-1023105778,434656156,
-1014801638,-389833468,512343723,1743324323,-1096685558,77799049,-854956567,-1961391164,-385875297,-10615987,-16473290,-16472778,-2017079834,413198553,-389817977,57939812,
-1012689943,-840377721,-1245695488,-1144599144,-930478938,11874184,-802191293,1942474192,18933763,-645208694,-401591319,861142674,-1558279717,-1987987708,-972774114,67304198,
1528038632,50005702,-1047805180,1939006199,-718935805,78363587,-379275334,-1413808122,1689893380,77838930,1914107880,77576707,852331203,-2029458451,50045146,-53965928,
-74714485,-695491341,-389816437,-242497482,738065291,-1527561782,-812918133,-1664877503,-389833399,58005180,-844960791,-385648440,-1549724029,1958742788,2030153734,-1006653438,
-619986893,1539568501,-661940029,50005702,-1558279934,113689348,-1023147269,-369113880,-909246489,-1242998181,103147523,199842395,309516,-1660974871,-1656547446,1127713436,
-1656549493,-1013103716,120109907,1528170216,1361491641,855619048,-1563767360,-1262812367,537380356,-968685814,1793667079,-1597256437,166397093,-437728051,-167218153,450941136,
-1019382592,914410957,864027815,-1948387621,-1950213181,449022672,-1010267455,2014708712,-389100038,58201551,-401025559,-806873086,402450712,-1037319285,124784244,-1070463112,
2026094846,-1071973895,1977236419,-371510523,-1031077850,77799049,-739714293,-1869573895,113706617,-64347,12238859,-1174177536,1056440319,-628423517,77799049,-516248125,
38146420,-1732182524,-180621309,-695472267,986855913,1963129606,1965832937,-796244251,-1912194388,33846272,182250434,-1743752000,9420689,1955702515,-1963982074,-1949766718,
-1950131242,1261341683,-1091830780,780923787,-369360036,984416269,1175549153,-268199764,1005585325,-1947240978,-749475362,50005562,742058357,-1404639883,9307706,-1073029259,
-1852305804,-218067009,74748326,-789843965,-1949267027,-754587170,-1021962008,168076705,-2131397404,-2147179210,11589581,-1576755550,-1298135894,1958742532,77963746,-663428086,
78716555,77926016,-1324449664,-863338492,-1482502358,1931637764,-154958318,78095065,78003848,1877496144,-2141693675,1601387001,568916051,78094357,-1144835493,-1430387554,
309508,511245560,1124536749,1945756227,78035730,880019454,79252299,1260376320,-369434037,430772713,-498908409,-166038535,-1191181929,1263206404,-85846025,-16776007,
1124496647,1962467907,217377224,-1609724439,-2145123161,77932160,-1526331265,512344836,378078373,-1581054813,-469105499,914419828,176161957,-1578142465,-469105499,-919347084,
77805195,-1979406430,1942956748,-2032536051,-1507948065,-1814067708,-527772025,-1264786638,180619904,-1964756260,1959332860,435782470,-1986194830,-1979407562,621061926,-1005944705,
-1023105630,1913190784,50719004,854821520,149520603,1948239094,550273232,-863974421,-352067040,-607062002,-590292271,1964033270,-1644961043,-869653127,-233053814,-1021651317,
796121226,78059254,-755510026,-989932554,1967268213,1975778846,50785050,1943540438,-1509491188,-804686844,-790965797,287631836,-385046039,635964520,-1314864365,78094852,
-166942743,-16472570,116846708,1962869938,-1323398171,-185341948,78716553,-133913413,-1156341272,-386399056,922686362,1592263846,-1509519595,4241668,1359539025,78298104,
-1961658392,149718012,-1107103869,79234224,-1510736640,-1190889282,-1430585340,-1375930364,1128466201,276036066,-1962933063,78299124,-1952058372,82573542,-116865917,-402350405,
-497478856,-1526270282,158629892,77989631,132712821,77511436,-384622616,-1796730831,-2012777198,-385571042,-16118784,2062091125,-195565550,-768345461,-208929142,549052298,
780883200,-1516239709,-337147388,-674105339,1465308881,-266601173,1583285363,-998046485,-772409340,-489434670,2044398564,-1509491190,1560835332,-787765783,-1965829678,-1965651230,
1574931187,319819241,1364677625,-397397972,-1739058608,512433785,-75430749,426970317,-472790133,-654056495,-670833711,512297848,1223361699,-351767984,619204659,-954930430,
293894,2114373412,-1147898876,-2081946498,-401180397,-10874308,-16473290,-402348746,1515913867,-335688472,31975443,-401464344,-396750098,-622329225,-51451903,-1017421991,
-1070409267,-855635479,-972967718,134413062,78120646,632602113,-1946209450,-134771761,-2031595311,-1073063919,113640821,-1979579653,1965440007,-1341658877,1956392252,1948990469,
-68662527,-402230280,-169214147,1638120959,-225717709,8796718,-2130021376,1952554237,-269923036,-1662156289,786813281,1781573375,1784638027,1785162335,1785948781,1782606400,
-1662468046,4319232,1090530793,1374222197,1370454289,1223186259,1499160321,-385899543,-512429172,1140841449,199875563,12380160,838862313,11987136,-401771107,568857389,
1392867857,1527967208,-193533501,72681158,-1534465793,-471214965,1979648520,283699205,-1499413511,1975519748,-154957304,283437264,-454507527,343039487,-1957490453,-2496481,
141712731,-1514186925,-1017802748,19710206,-3868989,57991818,-1977561984,-51516970,1048616720,1963459323,149528068,1465097728,1593859304,-1946799269,-133895978,758911858,
-688454539,725353963,-389873292,24311794,-855998013,-1174048244,-269778945,702544,-2141527305,-164482838,-538193917,1465057548,484968309,-1878660352,4647056,-164406433,
-1108814197,-389856269,-109572008,1956409321,273606705,58021499,-845382679,-402294321,1223360575,-73268048,-1524725246,-1491171324,-1558803708,-1574532604,1087143940,-377435264,
501747157,1965388560,-1672812285,58314957,-1342173464,50045448,-1616658381,77701892,-1957276989,-402349290,1516109955,267577539,512427385,-842857309,-385649199,-1499423720,
1922055172,-385649615,-1516200954,2025851396,-1677924093,-1157627718,-1964474368,114026747,-1173238296,-2135228416,283961488,-538377356,-2147435621,-1516229141,-1665136124,2133067129,
-1174100574,12255232,-77076352,1006937760,-1660521072,-1209410696,115861659,2040388235,-1982073086,-972774626,33749766,853226435,78102244,-31546,312976,91869707,
80141047,-1965127040,-958952718,67304198,-855094295,78029014,175423498,168080032,-385583680,-1950150920,-402345698,922743002,512296102,1458046129,-1544516847,2025522342,
78816004,-1962628163,1958742784,48940,9162635,-1957485577,-2116090914,50632643,1107391239,24363267,-1962440382,-8168502,1191474182,-1948521657,-1615113279,1526761732,
1946615427,-347716092,77446846,506365,-507508052,-2147126021,537173518,168076704,-1509519424,-1156614140,79234206,1125634304,-369434045,117312537,-143326042,-402137623,
74714739,58064650,-401710871,244052026,-315489115,-1979407455,1381061629,-487108527,-145175925,1942488035,-628407807,-487106470,24365059,1524237122,65205848,-787647528,
-19279397,1963238918,126937347,158990090,77989630,-2081880203,-774778617,-1965716781,-1965061389,200075745,145773507,296747634,-930420598,1223203921,1958742530,-1660126974,
192630873,2035814404,-1660294374,69659481,259610631,200730704,48269912,35028705,34401256,986054341,1912845800,-18314740,-352145211,-1245380092,-20382205,-1672455224,
1307101490,805815808,-398261899,-2142568216,-93048769,1949187968,1486701313,1352412020,-1274167320,-1274905787,1126664260,130456920,-972719829,-654955257,-989974604,-93124052,
-2042414588,1124567492,509507,-1262757497,-838941948,512300665,130417490,130433838,1975909936,-919387144,-838984981,130419829,1377732910,-919387389,-906097941,130418293,
61948716,75566729,-1123699517,-639081995,-1769263361,1162149888,77805195,-1057083472,-93064661,126415363,-1556707005,1976368644,-4790051,-1023408186,-1107099207,116064262,
-1107032903,-1279328252,1958476804,-1558803614,-964012540,-522984398,-684793722,-1964846166,-294302003,-1157626426,-27720525,809468105,-498924683,-370621448,1366784780,77577811,
-1190876225,-201588732,58058917,78756691,1527643624,-1090212930,79234207,-1510736896,-823655564,-1508996596,-1192656892,-386344458,1499136858,-1335777602,-13703159,1345302608,
1354825304,1929417960,10742007,1963715416,822593033,805815875,126354155,-922855357,-1101932683,-1547762529,178436,1504048124,1364404715,-401663768,1532625777,1947048424,
-1524725493,-1558804220,208922628,-1293418064,-1524725501,-1558804220,-1336190716,1642904067,1358874600,1592283731,800087309,-1057073072,236447824,53409651,771752086,171538,
-398113467,-2024272584,126376917,-922855357,1111674485,78965387,1375646697,506198,-133914689,413937404,-102611195,1371756894,-1090517063,-50854753,84978734,1509548615,
860967875,45832191,78028894,-1073031378,-1738601356,-1957169109,-281876272,1723590891,210298976,1930243560,199682054,-396931233,527567792,-396330309,1491602574,153901308,
2146876240,-401838616,125177175,1477163496,1481687294,-1073063079,1532582083,-1144799222,797574324,646586545,-990509949,973960224,1965732329,80016903,-376831371,-1075310712,
-1120766734,976118181,1946157190,-1661107959,1294365793,-310251285,-439262820,1638334254,1970304368,2037414256,2037414256,2037413232,1013988464,130435952,-2094626256,281343492,
-968162188,-990501881,1258648836,-315478136,-339735869,805815814,1976106563,-1981234184,805816061,1976106563,-1262763019,537380356,180480083,175742043,1395460038,1527573736,
-968687348,-1013108729,-571942707,1124627967,-1157625914,-389872460,309922504,856096953,75736000,75566729,-369271064,2028601137,176285948,1625883513,-1023314529,-805001568,
113660136,-801110874,-1157323242,166200491,309517,221767761,78321291,78454411,1526184936,-162797477,77991678,-502631335,-1073456925,77989376,170912195,1462091455,
-972773185,753402117,-385649398,125432118,175505162,168006633,-385649153,-620099059,1048585849,1922630822,-1628575485,922702674,922682531,854066341,-396731647,1038617434,
1952078603,-1630410493,168076704,-1089898048,609710532,77963903,-880782765,922721407,922682533,48759971,-396666367,477432618,-768388270,-393215813,1515916062,1520242297,
-1875055781,12309043,-149755519,1393457565,19916882,-974601590,-799319550,-1559851048,-1526296828,645963524,-1635842907,-1329658765,1381193597,1510020584,-83629989,1408271849,
16771154,78780041,77792967,113704960,-2130705243,78786257,1532626803,-555199917,-1308166150,1962934020,-396666347,-1914172383,-87300086,384326490,176351244,1532679915,
-1508996413,-1192656892,-638174861,77904796,100234,231304,211599370,25659520,42452480,-1667385344,585630585,-387108352,2040332306,2549763,77465286,57908480,
-1023296023,-386378927,1499138426,1405351650,-2096848965,74645807,-135576765,-1152138405,134087839,-347929739,-1966908423,-2147178994,1098094825,-1952654858,-1962630378,168076574,
512269531,113640615,-2137520986,-1667399477,-360511879,14385153,-922030798,-338688396,-85796143,91856797,-33393342,91463107,-1444289486,175742465,-738798857,-2147368317,
-1312620333,-1509021032,-1427376124,2114479848,47697,-394198853,158665150,77797001,77928073,78028995,1352171564,77989574,186378368,-396265797,1532625432,-401927960,
-2017785476,34269281,-1847043238,-18326795,-119937014,451435354,-2144224268,-378398534,-185992803,-1805850212,1356891807,48955824,1436729394,-997828604,47774,72556169,
-370670732,991857091,-1817384957,-477374603,72562315,-847956167,44534354,-2091757568,-2013920061,2021720063,178497,-1074557956,-1510800221,-162310565,-16493306,1455296373,
82805508,-218103111,1958752933,-263460861,77839967,-67108167,-1956731405,42765076,80118528,-263591850,-1014814741,1125092100,344677955,72681206,-1962510849,-352037354,
1892745988,1377077557,1128470411,-1511500968,710499313,-249567035,378080116,-779419602,2095698823,-1981576294,-1962719970,-2147271906,158673983,-386509336,-1813381310,-1700206189,
1465275217,-1153846702,-1514208098,78036484,-1185736213,-772276220,-498908393,133585914,-30837440,-30772212,-165251894,561577733,746643573,-2145749496,360057066,-1190878018,
-201523193,-1641643868,-1091887100,-350220416,1583307474,58087771,-385583895,1049233088,79234214,2027620864,-2146339551,393349359,-225780086,-466430838,192211938,-774582024,
-19672878,-371296817,1049101985,-2081880922,-350172156,-1505851148,75032836,190547,770229083,67812096,-397210389,-1017446398,-1157619736,1048577123,2013332648,-971868921,
33859590,-1330675224,-1349916659,-2065167696,184337327,1644412671,116787828,2038432935,1644936707,1913027560,77577992,-352320327,80118537,-1190878273,-1523711998,-389808926,
-397211379,-1226307711,99113975,-379889152,-1976633427,-152528889,776163336,-1549596789,46367492,-1559786706,-1014823771,1499092994,1360819272,-2024583086,-142350119,-1959898277,
-1618268649,-353894398,-1014801423,-1008801020,1944637523,17426691,-396315973,803735254,1527345671,1274749928,-1020983354,-1257901080,-1258130672,96331783,82314100,1064852474,
-989671286,75630122,-654965383,855294696,11659465,75577087,-119871406,-2130276518,-2127102204,180367876,-402230078,971569843,-2130276360,-2127102204,75603972,-1979550999,
75604176,41205770,-259340034,-930430462,-1070463880,293193866,1397903696,1527097832,-27764390,-1963886400,717392609,2042954433,75669527,-956671256,512306695,843252562,
717654729,161606085,1376027296,75577087,-1037384406,58245378,-386255128,922681383,1374160001,75669752,75564687,1515765770,512427893,1743323986,-20839935,-402425656,
1542060559,46500353,-20895038,753437376,83656451,-1597470205,1076102275,-930479499,83814595,41027508,-924315468,1962498820,-397389047,1532688651,1352459914,75568779,
178058762,-33393454,-1645083958,116787572,1963197571,718208514,1357286132,1323893624,1347441408,1476714984,-143276802,-402341912,1347946382,-771750983,78047460,-997584782,
1622326168,1810421763,106293253,1857752811,-1731949984,1407768579,100198405,293100376,-1040295592,1347637329,1476697576,839052123,-1596131612,-536738686,-1073036034,116787572,
1963197571,-1966277118,1489580780,75577087,-2110879664,-144775164,2128874072,-389772795,-1554450113,-1073085311,-1974793099,1949187079,512312065,-1655176366,-1006496398,75638410,
-469056470,116787572,1963197571,180420098,-162862912,1206507915,-153056768,62144708,-466484619,-1996192861,-1979416306,78953440,-165673018,57936068,1395328966,1526970088,
130418809,-488090835,-968664315,-773312505,75735299,75566731,-1276574856,6875645,-130291629,-2013039525,130433839,78887680,1379830595,-2129229053,75669508,-81009614,
1131739179,540805002,708634228,28631668,-397388981,-466425110,-160158404,-227267780,-294378436,376778812,-355145661,-347402125,126372611,1961101912,46433272,173585387,
1543206116,-1020983354,-1979415647,-804866612,-2129228824,1393259268,-213522350,-379928526,-963969473,58197292,1391994600,1492507368,1975519824,-922858751,350750328,509688,
75564687,-385918487,1836319467,-1549726599,762628,-1576753760,195100685,653733376,-125083029,-1607546230,653681261,-939393013,892974,1797715502,851968610,378220224,
-687644050,1881049646,-1562832286,-2135948121,-1996183902,-2013263082,-1342173922,50045444,16497641,-1279590400,2144516,1128466179,-31130910,-352318557,186026913,220105216,
-1329581312,78029440,78063240,1408995305,77511505,8390529,1929380793,-12369138,-502762233,-1509490952,1495257348,116793460,1979647134,-1624866811,-1514406396,-1979217404,
603980455,-2132508545,663281674,-1869560997,-74913392,-2132745088,477331652,309674652,1975778973,-607061741,77989630,-376436107,1973287786,-18710525,77839958,1178997897,
78069386,-2139102335,478732042,-242498722,-1962625816,166220238,-2146864638,-1207654850,132845433,78003840,-402228840,-806878720,75938564,1493455336,76463953,-402356549,
-2034564043,73263108,-402522648,-2034563918,70576132,-1157497880,-974650220,-2096925951,1474823403,74799364,-856964610,1978198411,-1009939708,77932160,8841343,-973036056,
2131014150,-387144728,468385924,-1516114587,2013036548,180552051,604600768,77963903,1350414520,-1610589208,-1073085274,109053300,-402520922,-1314848671,-2097381372,29685404,
1084752501,4843676,-1157008227,937975858,-330766334,77999744,-402427134,65536256,78029041,192115772,-1156588614,-1897364663,-1157174286,-957849036,91594234,77936256,
1673249664,33613922,-386856728,115929543,-334960640,-402449943,-1528298579,33614071,-1023163416,-379571525,-256376354,-1523122237,-1556676860,-11081724,922704730,922682531,
-102234971,-13834239,300505691,77963758,158973962,1467855039,-1516077276,-2114158588,968821874,-768387205,-394198853,-1564807696,2131344176,2013389288,2067971898,-1556676777,
-1523122428,-1277707772,-394175045,1515973733,77805311,77936383,-1157520408,837313097,-10855430,-16473290,-402348746,1515913616,-1142051864,115958354,266058490,-377402949,
-1833243611,-2147042550,-387176215,222081111,602407797,126496433,1975519811,-1614822418,309508,-67108680,-1195136013,-1549598720,77964036,-411506493,-1549726087,1958742788,
2030153760,-1009191396,-1499409203,1958742532,77963280,125091850,91816368,214161654,-73350399,-33014782,-20382008,-236403768,1393324799,-396268869,-303562546,868441066,
-2147435566,-1007964952,-1140860952,292708394,-840431381,1614461951,-1410857102,-260708352,-1523122237,-1556676860,-83442172,-1662515198,-277813248,115891034,79283185,1125634304,
-1006968253,-788527943,-498382049,-1887386630,-501219326,-1329872127,150568964,-1185864078,-1430585337,-1977120252,-2013265529,-136166649,126402610,149520473,1948312704,-1440347943,
-2955004,259311882,-1209468847,-2013898241,1963982850,-1010834759,-1090216002,-1174666069,92995588,-24868443,-1007164673,-1190888257,116064258,-1190889281,788267012,1135282059,
-1946623421,-1018475553,-352015425,77578218,-1413487125,309508,-201531769,-1008826459,-1151904943,-1413544801,309508,1610607080,1371756891,-1413785773,77577988,378137579,
512296099,-1950153563,-1962630378,-1023105762,1929301992,9038143,1408096232,851675735,2013570310,2027620924,77963536,1064485675,-1549715595,-339596540,734235408,1912907014,
-1960413906,-1559876670,1965322756,-339725796,1206632522,-1863474200,839355280,2030347526,-1524200941,2028210692,167882758,-1339233344,669776383,178513,-1516183929,2042628612,
-34109694,-502893145,-352276229,-1341754611,-339736063,184528901,1599732160,-1313094821,-313071612,92967056,41486130,-1185827861,-991231996,-396230725,-1746338062,-972327425,
33749766,77792967,784564224,38443,43915822,166249216,-1610057474,-1073085275,-1581052296,-1073019741,-389869192,142147060,914412237,-1015020379,1023714209,175472640,
-397159475,-379851301,519569382,-1144847197,870843513,77053696,-1207957319,-201588736,75014827,-1023104350,1929230312,-22877949,-1618274421,-1178402814,-1511522300,-385649923,
45743766,-24057600,-2030041927,77577211,1929220072,-25106173,45735815,77840128,1944714119,309758,-402350145,57867636,-1174510103,-1547763710,-27465468,1929208808,
-14817021,-385954327,79297880,-1190956288,-1084424190,905905317,-85831857,-1413495979,309508,971510251,77578237,1929381049,77840134,1476395705,1195836815,-1018103070,
2046631912,-707935487,-1259797646,-199497229,-1158021120,-628228000,-762396018,1688387634,-1148078844,-1699086336,787647238,1124567212,1976434242,118406388,-1141239091,-470351808,
-1020535924,-167771973,108392644,-523041615,-1991518069,-1962922978,-853349917,-157143888,12040961,842663878,49914560,-1577056606,1705116779,2662916,-1996288325,-1157428194,
512295802,512426978,-1991573460,1258490398,118405971,-543030096,512316164,-543161120,46202372,-1227846976,1524237056,512481927,394790112,1127712835,-1190862944,-1073086412,
-628683148,-628631293,1128470409,-227161858,-654058873,-922856637,-1962592606,-1962614754,3390231,512350723,1130038500,3153545,54861449,616729178,-1966044418,-1966921022,
449219288,1945668295,-1385633533,-338492495,37537674,12256114,717392386,-1965520189,-1966662970,-385649672,512339274,-628686070,2891401,53419657,512353163,512426821,
-628686800,732773864,1397443546,-444536741,-394273605,-1729561729,-1013978708,1954103840,1713402725,6645106,-257562604,-11351757,-385580746,-133528,466206467,46606,
825766198,540553776,1380994883,1112088622,959520845,13368,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,-385875968,35790920,63374420,66520019,65733605,825241888,1937330989,544040308,1918988098,1917132900,
225603442,808525834,2035494194,1835365491,1634681376,1159750770,1919906418,824183309,1395471152,1702130553,1866604653,543453793,1869771333,537529714,758394929,1953724755,
1109421413,1685217647,1920091424,168653423,892350752,1937330989,544040308,1918988098,1917132900,225603442,808591370,1699556657,2037542765,1920091424,168653423,825242656,
1414677293,1920091424,168653423,825242912,1414677293,1920091424,168653423,842019360,1835355437,544830063,1919181889,544437093,1869771333,537529714,758329394,1869440333,
1092647282,1701995620,1159754611,1919906418,1330776589,1917132877,225603442,1112219658,223039264,1230127440,1126193492,1262699848,168636960,1230127440,1126193492,1262699848,
168636704,1061109567,537529663,1397051944,541412693,1176641597,1260397105,220813637,538976266,1851075872,1801678700,1937330976,544040308,1953066581,2036681504,1801678700,
857737741,1261252912,1868724581,543453793,1869771333,537529714,758263859,1953724755,1428188517,544500078,1819895115,543908719,1277195113,1701536623,537529700,758329395,
1652122955,1685217647,544362272,1953724755,1428188517,544500078,1869771333,537529714,758198326,1802725700,1702130789,1920091424,168653423,825635104,1937330989,544040308,
1769238607,544435823,544501582,762602835,1853182504,1413829408,220811349,909189130,2035494194,1835365491,1953517344,1936617321,1953451552,1952797472,1968318509,1163075694,
693130580,824183309,1412248374,543518057,1631854630,1310745972,1394635887,674067557,544109906,1431586131,168634704,58196924,632,0,0,0,
-385875968,824204208,1395471920,1702130553,1866604653,543453793,1869771333,537529714,758591537,1953724755,1109421413,1685217647,1920091424,168653423,942682400,1937330989,
544040308,1918988098,1917132900,225603442,808525834,2035494201,1835365491,1634681376,1159750770,1919906418,824183309,1294808118,1919905125,1767055481,1159751034,1919906418,
1968318509,1163075694,693130580,857737741,1261253680,1868724581,543453793,1394635343,1702130553,1851072621,1159754857,1919906418,908069389,1143812656,1701540713,543519860,
1953460034,1667584544,543453807,1869771333,822742386,758134839,1802725700,1176514592,1970039137,168650098,825767729,1936278573,540090475,1818845510,224752245,943141130,
1766075698,1126198131,1920233071,1701604463,1631985778,1920298089,822742373,758135095,1802725700,1159737376,1919906418,925960717,1143812409,543912809,1917132849,225603442,
67187210,8388608,0,285290752,67266304,19660800,0,285370112,100820736,19660800,0,285370112,134458368,33554432,0,285453312,
100903936,33554432,0,285453312,67266304,-65536,0,285370112,134336000,16777216,0,285343488,84073728,-65536,0,285400320,
251888640,-65536,2048,285443328,50541568,-65536,0,285422592,84104960,-65536,0,285431552,117659392,-65536,0,285431552,
134296064,8388608,0,285294336,117628160,-65536,0,285400320,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,1911095296,52,0,0,
0,0,0,0,0,0,0,0,0,0,268032,-1073643517,805330944,201332736,1304029440,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,-1746337792,71,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,978452480,
490227269,1082144298,67637280,-15007486,-256,-226,2147426303,85398015,353965074,454037257,33491485,117834771,202050056,-1,51911196,219021846,
-1,-14614529,1633705822,1701077858,-39066,-8061065,-9109645,-8978571,842079231,909456435,809056311,151534893,1919252337,1769306484,1566273647,1935802125,
1751606884,996961130,1560240167,1986230394,745369186,721366830,469704959,606289953,707157541,727656744,1464926216,1498698309,1347373397,-15893125,1178882881,1263159367,
2116172364,1482325247,1312970307,1061043277,553582847,1448432895,1515804759,1750948955,1818978921,1886350957,959985521,909456429,858927403,1212624432,-11796663,1347419981,
5460561,-385875968,18122,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,877259008,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,-385875968,14004,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,-553648128,251798786,-162201829,-1696004081,68,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,708201984,2067222839,-1841447881,-1556611273,993588536,-1237750215,993676343,-599967686,1167976759,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,170731576,471402015,117835522,0,173690993,471402015,117835522,
0,170731576,1885603455,117833986,0,257052769,421070361,202050818,0,268437504,1073758208,1347430440,1347430440,690825260,689843754,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1176430848,0,0,1176299776,0,0,1200023808,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,-2122448896,-1715633755,-8487295,
-406585381,-26444033,947715838,940572688,947715708,2084044816,2097086008,269515832,2097052728,31800,406600728,-65536,-406600729,1006698495,1715618406,-1006698436,
-1715618407,118489027,-859013873,1715239116,406611558,859773054,1882206271,1669325040,1734566783,1520025830,1021830972,-528443046,-520552712,235012224,239009342,1008205826,
2115508350,1717966908,6710886,-612433818,454786011,1665007643,946629688,30924,2122186752,1008205950,1014896766,1008271128,404232318,404226072,1014896664,402653208,
403504652,805306368,811662944,0,-20922176,603979776,610729830,402653184,-33220,-16777216,406617855,0,0,2016411648,3158136,1819017264,
108,1819017216,1828613374,2083520620,-133400384,-973078480,1714428108,1815609542,-857967048,1616904310,192,806879232,811622496,811597848,806885400,1711276128,
1715273532,805306368,808516656,0,805306368,24624,64512,0,805306368,201719856,-1067438056,-964951936,-420028722,1882194044,808464432,-864550660,
-866109428,-864550660,-871614452,1008468088,218025068,-1057226722,-871625480,1614282872,-858982208,-855900040,808458252,-864550864,-859014964,-864550792,403471564,805306480,
805306416,805306416,805306416,806903856,811647072,24,-67108612,811597824,806882328,-864550816,3151884,-964952016,-1059135778,2016411768,-855847732,1727791308,
1717992550,1715208444,1723908288,1828192316,1818650214,1660813560,1651013736,1660813566,1617459304,1715208432,1724825792,-859045826,-858981172,813170892,808464432,203292792,
-859042804,1726349432,1718384748,1626341606,1717723232,-289013506,-958988546,-423231290,-959521034,1815609542,1824966342,1727791160,1616936038,-864550672,2027736268,1727791132,
1718385766,-864550682,-870551328,-1258553224,808464432,-859045768,-858993460,-859045636,2026687692,-960102352,-285288762,-960102202,1815623788,-859045690,808483020,-956432264,
1714559116,1618477310,1616928864,1623195768,101455920,410517506,404232216,940572792,50796,0,0,808517376,24,0,-864285576,1625292918,
1717992544,220,-859779976,203161720,-859014132,118,-1057174408,1815609464,1616965728,240,2093796470,1625356300,1717991020,3145958,808464496,786552,
-871625716,1625323724,1819831398,812646630,808464432,120,-687931700,198,-858993416,204,-858993544,120,2087085788,61536,2093796470,7692,
1617327836,240,209240188,806355192,875573372,24,-858993460,118,2026687692,48,-16853306,108,1815637190,198,2093796556,63500,
1680906492,807141628,808509488,404226076,404226072,819986456,808459312,-596246304,0,268435456,-960074696,-337051394,69,0,0,0,
0,0,0,0,0,0,0,0,0,1205659904,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,-1526726656,99190782,85460248,1461191960,
1696073199,1106791920,971790840,788027879,15717096,1860628992,1409242110,-940530433,704643311,85483846,85460248,85479960,1574168,0,0,0,
0,0,0,0,-822083584,4683241,2112356352,-1243034839,1558760232,1089063717,49,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,14703594,791752944,942616625,-1375993804]
,"symbols":{"POST1":{"o":44,"s":61440},"POST1_TEST01":{"o":166,"s":61440,"c":"TEST.01: 286 PROCESSOR TEST (REAL MODE)"},"POST1_TEST02":{"o":494,"s":61440,"c":"TEST.02: VERIFY CMOS SHUTDOWN BYTE"},"POST1_TEST03":{"o":531,"s":61440,"c":"TEST.03: ROS CHECKSUM TEST"},"POST1_TEST04":{"o":549,"s":61440,"c":"TEST.04: 8253 CHECK TIMER 1 (ALL BITS ON)"},"POST1_TEST05":{"o":604,"s":61440,"c":"TEST.05: 8253 CHECK TIMER 1 (ALL BITS OFF)"},"POST1_TEST06":{"o":635,"s":61440,"c":"TEST.06: 8237 DMA 0 INITIALIZATION"},"POST1_TEST07":{"o":710,"s":61440,"c":"TEST.07: 8237 DMA 1 INITIALIZATION"},"POST1_TEST08":{"o":827,"s":61440,"c":"TEST.08: DMA PAGE REGISTER TEST"},"POST1_TEST09":{"o":910,"s":61440,"c":"TEST.09: STORAGE REFRESH TEST"},"POST1_TEST10":{"o":934,"s":61440,"c":"TEST.10: 8042 TESTS"},"POST1_GETSW":{"o":989,"s":61440,"c":"GET SWITCH SETTINGS"},"POST1_TEST11":{"o":1062,"s":61440,"c":"TEST.11: BASE 64K R/W STORAGE TEST"},"POST1_SETMFG":{"o":1542,"s":61440,"c":"SET MFG_TST"},"POST1_TEST11A":{"o":1549,"s":61440,"c":"TEST.11A: VERIFY GDT/IDT INSTRUCTIONS"},"POST1_TEST12":{"o":1786,"s":61440,"c":"TEST.12: VERIFY CMOS CHECKSUM"},"POST1_TEST13":{"o":2018,"s":61440,"c":"TEST.13: PROTECTED MODE TEST"},"POST1_TEST13A":{"o":2231,"s":61440,"c":"TEST.13A: MEMORY SIZE TEST (ABOVE 1024K)"},"POST1_TEST14":{"o":2740,"s":61440,"c":"TEST.14: INITIALIZE CRT CONTROLLER"},"POST1_TEST15":{"o":2855,"s":61440,"c":"TEST.15: VIDEO LINE TEST"},"POST1_TEST16":{"o":2871,"s":61440,"c":"TEST.16: CRT INTERFACE LINES TEST"},"POST2":{"o":3135,"s":61440,"c":"TEST.17: 8259 PIC TEST"},"POST2_CP27":{"o":3223,"s":61440,"c":"CHECKPOINT 0x27"},"POST2_CP29":{"o":3282,"s":61440,"c":"CHECKPOINT 0x29"},"POST2_TEST18":{"o":3333,"s":61440,"c":"TEST.18: 8253 TIMER TEST (CHECKPOINT 0x2A)"},"POST2_ERR102":{"o":3366,"s":61440,"c":"DISPLAY 102 ERROR"},"POST2_CP2B":{"o":3376,"s":61440,"c":"CHECKPOINT 0x2B"},".263":{"o":3398,"s":61440,"a":"","c":"TIMER COUNTING TOO FAST, DISPLAY 102 ERROR"},"POST2_CP2C":{"o":3408,"s":61440,"c":"CHECKPOINT 0x2C"},"POST2_CP2D":{"o":3448,"s":61440,"c":"CHECKPOINT 0x2D"},"POST2_TEST19":{"o":3469,"s":61440,"c":"TEST.19: ADDITIONAL MEMORY TESTS (CHECKPOINT 0x2F)"},"POST2_TEST20":{"o":4503,"s":61440,"c":"TEST.20: ADDITIONAL PROTECTED-MODE TESTS"},"POST2_TEST21":{"o":4564,"s":61440,"c":"TEST.21: KEYBOARD TEST (CHECKPOINT 0x35)"},"POST2_CP36":{"o":4588,"s":61440,"c":"CHECKPOINT 0x36 (BEGIN KEYBOARD TEST)"},"POST2_CP37":{"o":4661,"s":61440,"c":"CHECKPOINT 0x37 (CHECK KBD_RESET SCAN CODE)"},"POST2_CP38":{"o":4670,"s":61440,"c":"CHECKPOINT 0x38 (RE-ENABLE KEYBOARD)"},"POST2_CP39":{"o":4689,"s":61440,"c":"CHECKPOINT 0x39 (STUCK KEYS)"},"POST2_CP3A":{"o":4756,"s":61440,"c":"CHECKPOINT 0x3A"},"POST2_TEST23":{"o":4895,"s":61440,"c":"TEST.23: DISKETTE ATTACHMENT TEST"},"POST2_RTCUP":{"o":5085,"s":61440,"c":"TEST CLOCK UPDATING"},"POST2_COMBOHF":{"o":5196,"s":61440,"c":"CHECK FOR COMBO HARD/FLOPPY CARD"},"POST2_TEST22":{"o":5302,"s":61440,"c":"TEST.22: CHECK FOR OPTIONAL ROM"},"POST2_PRINTER":{"o":5378,"s":61440,"c":"SETUP PRINTER_BASE"},"POST2_PS232":{"o":5413,"s":61440,"c":"SETUP RS232"},"POST2_SETTOD":{"o":5591,"s":61440,"c":"SET TIME OF DAY"},"POST2_INT19":{"o":5803,"s":61440,"c":"GO TO BOOT LOADER"},"POST4":{"o":5971,"s":61440},"KBD_RESET":{"o":6098,"s":61440},"TEMP_ISR":{"o":6149,"s":61440},"HW_INT":{"o":6175,"s":61440},"NOT_SEC":{"o":6203,"s":61440},"SET_INTR_FLAG":{"o":6217,"s":61440},"POST5":{"o":6271,"s":61440},"EXC_13":{"o":6356,"s":61440,"c":"INT 13 (0x0D) GP FAULT HANDLER"},"SYS_32":{"o":6451,"s":61440,"c":"INT 32 (0x20) PROT-MODE TEST HANDLER"},"POST6":{"o":6556,"s":61440},"XMIT_8042":{"o":6949,"s":61440},"POST7":{"o":7213,"s":61440},"POST7_CPF1":{"o":7280,"s":61440,"c":"CHECKPOINT 0xF1"},"POST7_INT20":{"o":7288,"s":61440,"c":"TEST NORMAL SOFTWARE INTERRUPT"},"POST7_INT0D":{"o":7340,"s":61440,"c":"TEST GP FAULT (SEG LIMIT VIOLATION)"},"POST7_LLDT":{"o":7360,"s":61440,"c":"TEST LLDT"},"POST7_BOUND":{"o":7432,"s":61440,"c":"TEST BOUND"},"POST7_PUSHA":{"o":7539,"s":61440,"c":"TEST PUSHA/POPA"},"POST7_VERW":{"o":7623,"s":61440,"c":"TEST VERW/VERR"},"POST7_ARPL":{"o":7705,"s":61440,"c":"TEST ARPL"},"POST7_LAR":{"o":7751,"s":61440,"c":"TEST LAR/LSL"},"POST7_LOWMEG":{"o":7825,"s":61440,"c":"TEST WRITE TO 0x1B0000 VS. B000:0000"},"SYSINIT1":{"o":7962,"s":61440},"DISKETTE_IO_1":{"o":8357,"s":61440},"DISK_RETRY":{"o":8507,"s":61440},"DISK_RESET":{"o":8815,"s":61440},"DISK_STATUS":{"o":8881,"s":61440},"DISK_READ":{"o":8882,"s":61440},"DISK_VERF":{"o":8891,"s":61440},"DISK_FORMAT":{"o":8895,"s":61440},"DISK_WRITE":{"o":8933,"s":61440},"RW_OPN":{"o":8945,"s":61440},"GET_PARM":{"o":9255,"s":61440},"NEC_OUTPUT":{"o":9351,"s":61440},"SEEK":{"o":9409,"s":61440},"DMA_SETUP":{"o":9583,"s":61440},"CHK_STAT_2":{"o":9663,"s":61440},"WAIT_INT":{"o":9696,"s":61440},"DISK_INT_1":{"o":9742,"s":61440},"RESULTS":{"o":9765,"s":61440},"NUM_TRANS":{"o":9840,"s":61440},"READ_DSKCHNG":{"o":9897,"s":61440},"DISK_CHANGE":{"o":9963,"s":61440},"DISK_TYPE":{"o":10045,"s":61440},"FORMAT_SET":{"o":10162,"s":61440},"DSKETTE_SETUP":{"o":10262,"s":61440},"HDISK_SETUP":{"o":10458,"s":61440},"HDISK_IO":{"o":10865,"s":61440},"HDISK_IO_CONT":{"o":10988,"s":61440},"HDISK_RESET":{"o":11149,"s":61440},"RETURN_STATUS":{"o":11233,"s":61440},"HDISK_READ":{"o":11242,"s":61440},"HDISK_WRITE":{"o":11250,"s":61440},"HDISK_VERF":{"o":11258,"s":61440},"FMT_TRK":{"o":11277,"s":61440},"READ_DASD_TYPE":{"o":11299,"s":61440},"GET_HDPARM":{"o":11365,"s":61440},"INIT_DRV":{"o":11460,"s":61440},"RD_LONG":{"o":11513,"s":61440},"WR_LONG":{"o":11521,"s":61440},"HDISK_SEEK":{"o":11529,"s":61440},"TST_RDY":{"o":11560,"s":61440},"HDISK_RECAL":{"o":11583,"s":61440},"CTLR_DIAGNOSTIC":{"o":11619,"s":61440},"COMMANDI":{"o":11669,"s":61440},"COMMANDO":{"o":11733,"s":61440},"COMMAND":{"o":11806,"s":61440},"WAIT":{"o":11903,"s":61440},"NOT_BUSY":{"o":11961,"s":61440},"WAIT_DRQ":{"o":12002,"s":61440},"CHECK_STATUS":{"o":12024,"s":61440},"CHECK_ST":{"o":12042,"s":61440},"CHECK_ER":{"o":12094,"s":61440},"CHECK_DMA":{"o":12137,"s":61440},"GET_VEC":{"o":12174,"s":61440},"HD_INT":{"o":12196,"s":61440},"KEYBOARD_IO_1":{"o":12232,"s":61440},"KB_INT_1":{"o":12372,"s":61440},"K16":{"o":12457,"s":61440},"PRINTER_IO_1":{"o":13423,"s":61440},"RS232_IO_1":{"o":13557,"s":61440},"VIDEO_IO_1":{"o":13829,"s":61440},"SET_MODE":{"o":13902,"s":61440},"SET_CTYPE":{"o":14122,"s":61440},"SET_CPOS":{"o":14161,"s":61440},"READ_CURSOR":{"o":14203,"s":61440},"ACT_DISP_PAGE":{"o":14226,"s":61440},"SET_COLOR":{"o":14262,"s":61440},"VIDEO_STATE":{"o":14300,"s":61440},"SCROLL_UP":{"o":14335,"s":61440},"SCROLL_DOWN":{"o":14499,"s":61440},"READ_AC_CURRENT":{"o":14581,"s":61440},"WRITE_AC_CURRENT":{"o":14651,"s":61440},"WRITE_C_CURRENT":{"o":14702,"s":61440},"READ_DOT":{"o":14907,"s":61440},"WRITE_DOT":{"o":14924,"s":61440},"WRITE_TTY":{"o":15672,"s":61440},"READ_LPEN":{"o":15804,"s":61440},"MEMORY_SIZE_DETERMINE_1":{"o":15970,"s":61440},"EQUIPMENT_1":{"o":15980,"s":61440},"NMI_INT_1":{"o":15990,"s":61440},"SET_TOD":{"o":16175,"s":61440,"c":"CONVERT CMOS TIME TO TIMER TICKS"},"CASSETTE_IO_1":{"o":16354,"s":61440},"SHUT9":{"o":16978,"s":61440},"GATE_A20":{"o":17298,"s":61440},"TIME_OF_DAY_1":{"o":17500,"s":61440},"RTC_INT":{"o":17962,"s":61440},"TIMER_INT_1":{"o":18052,"s":61440},"PRINT_SCREEN_1":{"o":18124,"s":61440},"FILL":{"o":18258,"s":61440},"START":{"o":57435,"s":61440},"P_O_R":{"o":65520,"s":61440,"c":"POWER-ON RESET"}}} F000:002C @ POST1
F000:00A6 @ POST1_TEST01 ; TEST.01: 286 PROCESSOR TEST (REAL MODE)
F000:01EE @ POST1_TEST02 ; TEST.02: VERIFY CMOS SHUTDOWN BYTE
F000:0213 @ POST1_TEST03 ; TEST.03: ROS CHECKSUM TEST
F000:0225 @ POST1_TEST04 ; TEST.04: 8253 CHECK TIMER 1 (ALL BITS ON)
F000:025C @ POST1_TEST05 ; TEST.05: 8253 CHECK TIMER 1 (ALL BITS OFF)
F000:027B @ POST1_TEST06 ; TEST.06: 8237 DMA 0 INITIALIZATION
F000:02C6 @ POST1_TEST07 ; TEST.07: 8237 DMA 1 INITIALIZATION
F000:033B @ POST1_TEST08 ; TEST.08: DMA PAGE REGISTER TEST
F000:038E @ POST1_TEST09 ; TEST.09: STORAGE REFRESH TEST
F000:03A6 @ POST1_TEST10 ; TEST.10: 8042 TESTS
F000:03DD @ POST1_GETSW ; GET SWITCH SETTINGS
F000:0426 @ POST1_TEST11 ; TEST.11: BASE 64K R/W STORAGE TEST
F000:0606 @ POST1_SETMFG ; SET MFG_TST
F000:060D @ POST1_TEST11A ; TEST.11A: VERIFY GDT/IDT INSTRUCTIONS
F000:06FA @ POST1_TEST12 ; TEST.12: VERIFY CMOS CHECKSUM
F000:07E2 @ POST1_TEST13 ; TEST.13: PROTECTED MODE TEST
F000:08B7 @ POST1_TEST13A ; TEST.13A: MEMORY SIZE TEST (ABOVE 1024K)
F000:0AB4 @ POST1_TEST14 ; TEST.14: INITIALIZE CRT CONTROLLER
F000:0B27 @ POST1_TEST15 ; TEST.15: VIDEO LINE TEST
F000:0B37 @ POST1_TEST16 ; TEST.16: CRT INTERFACE LINES TEST
0C3F +
F000:0000 @ POST2 ; TEST.17: 8259 PIC TEST
F000:0058 @ POST2_CP27 ; CHECKPOINT 0x27
F000:0093 @ POST2_CP29 ; CHECKPOINT 0x29
F000:00C6 @ POST2_TEST18 ; TEST.18: 8253 TIMER TEST (CHECKPOINT 0x2A)
F000:00E7 @ POST2_ERR102 ; DISPLAY 102 ERROR
F000:00F1 @ POST2_CP2B ; CHECKPOINT 0x2B
F000:0107 . ; TIMER COUNTING TOO FAST, DISPLAY 102 ERROR
F000:0111 @ POST2_CP2C ; CHECKPOINT 0x2C
F000:0139 @ POST2_CP2D ; CHECKPOINT 0x2D
F000:014E @ POST2_TEST19 ; TEST.19: ADDITIONAL MEMORY TESTS (CHECKPOINT 0x2F)
F000:0558 @ POST2_TEST20 ; TEST.20: ADDITIONAL PROTECTED-MODE TESTS
F000:0595 @ POST2_TEST21 ; TEST.21: KEYBOARD TEST (CHECKPOINT 0x35)
F000:05AD @ POST2_CP36 ; CHECKPOINT 0x36 (BEGIN KEYBOARD TEST)
F000:05F6 @ POST2_CP37 ; CHECKPOINT 0x37 (CHECK KBD_RESET SCAN CODE)
F000:05FF @ POST2_CP38 ; CHECKPOINT 0x38 (RE-ENABLE KEYBOARD)
F000:0612 @ POST2_CP39 ; CHECKPOINT 0x39 (STUCK KEYS)
F000:0655 @ POST2_CP3A ; CHECKPOINT 0x3A
F000:06E0 @ POST2_TEST23 ; TEST.23: DISKETTE ATTACHMENT TEST
F000:079E @ POST2_RTCUP ; TEST CLOCK UPDATING
F000:080D @ POST2_COMBOHF ; CHECK FOR COMBO HARD/FLOPPY CARD
F000:0877 @ POST2_TEST22 ; TEST.22: CHECK FOR OPTIONAL ROM
F000:08C3 @ POST2_PRINTER ; SETUP PRINTER_BASE
F000:08E6 @ POST2_PS232 ; SETUP RS232
F000:0998 @ POST2_SETTOD ; SET TIME OF DAY
F000:0A6C @ POST2_INT19 ; GO TO BOOT LOADER
1753 +
F000:0000 @ POST4
F000:007F @ KBD_RESET
F000:00B2 @ TEMP_ISR
F000:00CC @ HW_INT
F000:00E8 @ NOT_SEC
F000:00F6 @ SET_INTR_FLAG
187F +
F000:0000 @ POST5
F000:0055 @ EXC_13 ; INT 13 (0x0D) GP FAULT HANDLER
F000:00B4 @ SYS_32 ; INT 32 (0x20) PROT-MODE TEST HANDLER
199C +
F000:0000 @ POST6
F000:0189 @ XMIT_8042
1C2D +
F000:0000 @ POST7
F000:0043 @ POST7_CPF1 ; CHECKPOINT 0xF1
F000:004B @ POST7_INT20 ; TEST NORMAL SOFTWARE INTERRUPT
F000:007F @ POST7_INT0D ; TEST GP FAULT (SEG LIMIT VIOLATION)
F000:0093 @ POST7_LLDT ; TEST LLDT
F000:00DB @ POST7_BOUND ; TEST BOUND
F000:0146 @ POST7_PUSHA ; TEST PUSHA/POPA
F000:019A @ POST7_VERW ; TEST VERW/VERR
F000:01EC @ POST7_ARPL ; TEST ARPL
F000:021A @ POST7_LAR ; TEST LAR/LSL
F000:0264 @ POST7_LOWMEG ; TEST WRITE TO 0x1B0000 VS. B000:0000
1F1A +
F000:0000 @ SYSINIT1
20A5 +
F000:0000 @ DISKETTE_IO_1
F000:0096 @ DISK_RETRY
F000:01CA @ DISK_RESET
F000:020C @ DISK_STATUS
F000:020D @ DISK_READ
F000:0216 @ DISK_VERF
F000:021A @ DISK_FORMAT
F000:0240 @ DISK_WRITE
F000:024C @ RW_OPN
F000:0382 @ GET_PARM
F000:03E2 @ NEC_OUTPUT
F000:041C @ SEEK
F000:04CA @ DMA_SETUP
F000:051A @ CHK_STAT_2
F000:053B @ WAIT_INT
F000:0569 @ DISK_INT_1
F000:0580 @ RESULTS
F000:05CB @ NUM_TRANS
F000:0604 @ READ_DSKCHNG
F000:0646 @ DISK_CHANGE
F000:0698 @ DISK_TYPE
F000:070D @ FORMAT_SET
F000:0771 @ DSKETTE_SETUP
28DA +
F000:0000 @ HDISK_SETUP
F000:0197 @ HDISK_IO
F000:0212 @ HDISK_IO_CONT
F000:02B3 @ HDISK_RESET
F000:0307 @ RETURN_STATUS
F000:0310 @ HDISK_READ
F000:0318 @ HDISK_WRITE
F000:0320 @ HDISK_VERF
F000:0333 @ FMT_TRK
F000:0349 @ READ_DASD_TYPE
F000:038B @ GET_HDPARM
F000:03EA @ INIT_DRV
F000:041F @ RD_LONG
F000:0427 @ WR_LONG
F000:042F @ HDISK_SEEK
F000:044E @ TST_RDY
F000:0465 @ HDISK_RECAL
F000:0489 @ CTLR_DIAGNOSTIC
F000:04BB @ COMMANDI
F000:04FB @ COMMANDO
F000:0544 @ COMMAND
F000:05A5 @ WAIT
F000:05DF @ NOT_BUSY
F000:0608 @ WAIT_DRQ
F000:061E @ CHECK_STATUS
F000:0630 @ CHECK_ST
F000:0664 @ CHECK_ER
F000:068F @ CHECK_DMA
F000:06B4 @ GET_VEC
F000:06CA @ HD_INT
0000 +
F000:2FC8 @ KEYBOARD_IO_1
F000:3054 @ KB_INT_1
F000:30A9 @ K16
F000:3460 @ SHIP_IT
F000:346F @ PRINTER_IO_1
F000:34F5 @ RS232_IO_1
F000:3605 @ VIDEO_IO_1
F000:364E @ SET_MODE
F000:372A @ SET_CTYPE
F000:3751 @ SET_CPOS
F000:377B @ READ_CURSOR
F000:3792 @ ACT_DISP_PAGE
F000:37B6 @ SET_COLOR
F000:37DC @ VIDEO_STATE
F000:37FF @ SCROLL_UP
F000:38A3 @ SCROLL_DOWN
F000:38F5 @ READ_AC_CURRENT
F000:393B @ WRITE_AC_CURRENT
F000:396E @ WRITE_C_CURRENT
F000:3A3B @ READ_DOT
F000:3A4C @ WRITE_DOT
F000:3D38 @ WRITE_TTY
F000:3DBC @ READ_LPEN
F000:3E62 @ MEMORY_SIZE_DETERMINE_1
F000:3E6C @ EQUIPMENT_1
F000:3E76 @ NMI_INT_1
F000:3F2F @ SET_TOD ; CONVERT CMOS TIME TO TIMER TICKS
F000:3FE2 @ CASSETTE_IO_1
F000:4252 @ SHUT9
F000:4392 @ GATE_A20
F000:445C @ TIME_OF_DAY_1
F000:462A @ RTC_INT
F000:4684 @ TIMER_INT_1
F000:46CC @ PRINT_SCREEN_1
F000:4752 @ FILL
F000:E05B @ START
F000:FFF0 @ P_O_R ; POWER-ON RESET
{"data":[
808989750,1127233840,777146447,1296189728,1380926240,824192592,741423161,892877105,909516832,943207476,808464432,825243961,1128472608,1347440463,774787666,1229529120,
1296908866,825303072,943208761,538981685,-712132358,1939763430,2066052391,-1625196253,-321780303,1085282931,343007440,1990124594,2047703055,-321741045,-456128910,57934448,
-1191318540,-661782464,78144740,-1830222987,-426790912,-469701776,-2046215055,-2143193916,1014237948,-236535766,551948720,145752299,15409638,568722608,28311787,15409638,
568786864,-1595534928,1890582763,45130214,-1578762005,28311787,15442406,-1578696784,1894158256,-423613808,1021347441,-1103857910,-268238589,-1959858173,47132,12374158,
602144516,-1240887295,319836688,-637462250,-1827620592,524533511,-1335827455,-14621152,-1342150866,-1199512063,1945763839,-1931964895,-1933340965,-1932423487,-1948087342,-1946842132,
856126462,-133728825,-955522069,-1191968396,1894157195,611443856,-423328249,-423328144,-1869827983,-460295962,-1174359951,-17955880,-289885504,-1293108558,11594970,-1326530382,
-1335761156,-1937709566,-1898934584,871773144,-1384073765,-670901246,41155042,-1326186124,-1182734845,28573705,1894158256,1910949002,-426733648,1910804592,-1837775814,-387787568,
-1912586056,-435900200,-435624320,1914080208,-430657536,-1979651261,-1220417855,-348082171,-2143033856,192217083,-670416412,-805376030,-1326126219,-1971263995,-423023677,-1341802687,
-347871680,-469701888,1960321601,-17767929,-185829937,-1912586056,-435769128,1914079616,-1341266432,-1965520129,571896,-301989702,-1326579477,-335484159,-527826709,1960328172,
-498928639,1958805226,1442545884,-75495052,-1341623126,-1328616619,-1328878678,-427760121,-1962954534,-1174893864,-1061552120,15461888,-352210706,15461376,1005379722,-201231144,
-503135613,1958805224,1442545882,-75495052,-1341623126,-1328747691,-1949766742,-1560251874,313524240,-1070972442,-790230810,199639216,-689520464,1102053611,-689566746,1118830827,
-689566746,1135608043,-689566746,7478921,-2132408144,-2118467542,16759040,-1057078546,9435777,-528025995,709545214,-1002771264,-855756683,-2131066550,-17795840,-490435900,
-1160990501,-527826801,-322950418,309707834,1976368256,-348934140,16548074,-1070987916,-1326128661,729867785,-1469979447,-470097648,-1469979407,-470097904,-435506967,-456578176,
-153056668,41157060,-990486300,1961943042,196146177,-1431273242,-352063812,1946265657,-1134500862,988480496,1430020324,-2132407120,-1062150283,-352062276,66501661,1625564395,
1622180582,-352062788,-1341819891,-192879091,1625710000,-419815957,-456578204,-536696732,-919878662,1692665523,108331432,-872482590,-1329335179,-1199512050,-661782464,7478923,
-2147436036,-164888789,-661733333,-75382642,58004020,-1342067735,-1333729777,-1131944320,-790035476,1977125658,27388175,56427493,59310952,58590073,-2115582070,-2098805878,
-1900019527,-1948570663,1023470343,6990421,-1048507276,-108986240,-411252736,58050851,-1174344471,-1070988328,62438126,-2081554000,-725941014,1096176,-997530574,-989969682,
-301495762,-220050877,-461315446,-788758288,-1531246476,64273136,-13378581,-1901068104,134265280,-217636680,-1140902997,-1014056960,-216006471,62438059,1122904496,-1158795088,
682623960,816857838,-1899459346,-1342129200,816896910,721422009,1191545087,-2131041721,208976127,-1330118869,-1195916402,-487859314,92807344,1191544870,-1316887481,-1125592572,
468387194,254050788,-351961924,-1316821998,-1125592572,132842878,254051044,67469500,1075062672,637896743,1195836808,-2011123517,92808709,850413383,-2010774136,-1337506043,
637896752,1195836808,92811696,-1341814746,-427759907,734604163,-1193767232,-13915563,92997001,92926434,-85850741,92997001,92928738,-85850741,92997001,-2115699998,
1438154982,-1962571350,-1980243451,-502953211,-1962571270,-453320187,-1199511934,-13915563,92997001,92928226,-85850741,92997001,92928738,-85850741,79992299,81265869,
-1410136851,-1912586056,1914603992,4241408,12376206,-1126920704,113672192,-1340604284,847308305,-1865862181,279470564,1642396385,-85978968,-260715522,-123209343,28968819,
334424065,-33979916,-453806087,-1560796030,-1070989294,17793766,1026528,313537653,119439590,-1177509697,-1430781949,2484394,-397060680,-1070923745,-50324760,11098268,
-1458604798,175375360,-1453810436,41223168,-336314901,244221,-1598182413,17770192,-1598226338,17770192,-1598226346,17770200,-1514340274,17770200,-1598095290,-1190818864,
-1598160891,70985432,1179043957,717486050,-1326324032,-350165487,-435638272,-1342117087,-350099964,-436097024,-1342117087,-1339955457,-1333729773,-341776879,-428822528,-352145247,
-341711360,-436097024,-1342116959,-1331566849,-1182734828,-13959048,-893859954,-930305253,-1325931861,-1082071531,521011264,62838924,1096191,-498645083,314173691,-2132404560,
2095615408,1954588690,-393302005,-2136468877,1693128052,-2132404304,-393310536,-2146692509,1994966150,-1202590958,1424526990,1916698898,1964127232,-351263740,-2034226686,308013252,
-919872725,-1363832655,887669130,65284626,985792216,200373737,-1341098789,304212142,-1347362678,991042280,-1207077693,283676302,-2042622958,304343236,-393573704,254022147,
649070453,317244550,-434589678,207742080,-1335761396,-1199512039,-18349681,48145,12375182,365095040,-2132403536,-954267542,23046,1543947776,1488846848,-1126789632,
17825789,109024,-1883763595,298575880,-199975191,113769963,-65464,5048006,1275512467,113705216,74,-2132403280,1778401467,434636616,-385649664,-1014824782,
1275526720,1279164416,-411760128,-385843480,-13959010,-1951771208,92874440,-1960439888,92874245,1702215987,521693726,7487105,1964970548,96937526,1642332417,1642466316,
1642525476,643366762,1642333579,-1993949148,641365253,-64057,1342540582,-1071357468,1476757798,-12769419,723678719,-2147436096,102673395,12132102,-201970816,-453039187,
650126433,1479,24452871,481336515,-1279754010,283764915,-75399156,41353728,-997818588,1779496168,512302872,-1013121005,-971044758,268454918,4851399,498073600,
-617905946,-402175894,57933849,-2097112087,117326019,1048576076,1979580492,7858407,721455081,-1437222657,-1993946997,638562309,-1993996917,1975595781,409607774,1916698911,
521286656,-953798795,1778450693,-1960421121,610395141,92874432,-953795211,1795161861,-1960421376,1642352645,-1993949148,662001669,1979711293,-1178588382,-1410105344,520488478,
729809081,732820470,610395391,96937664,520552448,-1329397387,-1333729762,-387741008,-1313861575,854124426,531677968,113672422,721420364,-17665,721431784,1275512530,
585631744,1275512320,451416064,1275512320,317202432,1275512320,182992896,1275512320,48791552,1780017920,-1993996472,1275512341,1214906368,1032005127,-385649409,-1329332724,
-461314528,-435418015,-420273055,312600929,-2132401744,-1912602436,67157204,-946929877,-1424241992,-1206923544,-1796698482,1958782991,8841475,-997794012,-2129682200,872444478,
-1341098990,259647638,-1069760476,113640821,-1335623566,258599060,816373898,199766389,-162761728,536875526,1324052340,1354760377,-644983010,732583359,990350299,1478451143,
-1048507276,-108986240,-478361600,-389822173,645201882,116835466,1950351378,1009787914,-1978174160,604564420,-1976550352,-1475644220,-165251839,536875526,-1900535948,251783168,
58048680,-401604888,28376994,116788084,-1337982958,-1342016495,302446129,41230336,-466993628,-2130702173,872444478,-1339263982,-115152800,1625705904,518572331,2147465721,
27813092,-1331889439,-116725587,-468945763,7512672,58025276,-1593733911,-1336934384,1090352,281919531,279126192,243712,28840141,1477496064,603984035,504460592,
-1900008624,4243416,-11336249,2146115416,141832252,540853502,62128757,709943430,1477496292,-1342129328,-1190938438,-58718208,-1224248272,64535224,1704992949,-298376192,
-611400818,-1394030127,-1334807277,1484842530,-855591856,1881192464,683278123,1487663872,821854288,1946401466,64666115,-919926604,1975788268,-335945212,-322360510,74761250,
938211810,-321780815,-1269242763,-1173304064,598786048,-628195098,-1437221033,126606123,1969211195,257288197,-1031731989,-92209024,-562247680,-2132400976,-402580503,113642999,
-2146697195,1677750846,116788596,1948254226,16955910,504241128,603984033,1949318192,352765488,-1195766528,-301879293,-1901068101,-1437222693,126475051,126550251,531256637,
243357045,3145744,704647329,-351220252,704753716,-1173303836,11535320,-1207911442,1438178190,-1982125142,-1962874105,-1437254393,-2128317153,-822079450,269386239,-1342173184,
-840685055,279009296,1009787904,1958750768,1354825218,520041449,-661733333,-956284737,536826629,-1258346263,953542877,117440616,-1946150727,-1093103928,549453555,-492067584,
571900,-1073798210,-1415249472,520551650,526023,113763011,-11272172,6424263,1622210048,-1325977624,-396302839,-125173729,-1979704600,-53507352,-469434177,1946265700,
-1436490502,-203259674,327914,-1469783040,-453320447,179356512,-401748248,-315945769,-436162310,-341711327,-1977490432,178382048,-1339263520,-1333729755,-433985793,-469701727,
-455046623,66977,1805784437,-433672192,-457573504,224323609,7028352,-972196864,83891462,-387948866,-184939373,-2132400208,-408267336,-2038242174,1032053956,91510186,
-337585218,-435310366,506224,-1341315096,-2140084595,27454,682625396,-188841754,-1329271840,-461314519,618695265,-1335761156,-347871568,-1437222912,15418086,1122419850,
1122238699,15458438,-1438825756,-1106938795,-1813257971,-2132399440,-419516166,-435113951,2931011,-1047920405,-151306010,16804614,-136180363,1377990,-529023486,-1325438743,
-92215765,-5239631,113656038,-1342177173,-81664258,7014134,-488737535,-1328993289,-159324628,16804614,-136181643,-371158850,-1325727947,-1339955457,-347871690,-436162560,
-436147392,-1328993472,-461314515,1946331236,-1090985464,250208450,194636031,-2132398160,7487105,58004020,-1341994007,-1199512016,1726481039,48139,12375182,254470272,
-2132397648,637995114,5899975,-970588160,23558,-1912579906,-148266,-1340139414,-1199053184,216531008,-1330530296,-2046094616,185460960,1253003,-670837877,15240880,
1958782987,-1201935614,-186083946,-2042682358,183363808,326422587,-1903249328,202040040,-389773808,995625717,-1959299120,-1194292264,-857172072,-387938806,-930411833,-391073352,
-528086337,990558952,1343190216,-393310536,269224623,-1024932730,-935634934,-930413961,-92153597,225575425,-390876232,-2146694509,-1494694778,387877130,116113664,116048203,
1396730450,1396730450,637995114,4720327,-953745409,18950,113649152,637534284,5048006,113714835,-65440,1644611366,637534208,6555334,113649152,714276965,
-427432256,-423559546,520645252,6555390,4982526,6569600,-1341885948,-2138577216,167797822,1532565111,1364414552,6555192,113642098,-972029852,268454918,-436181856,
1279164548,695533056,1780441194,833619784,12157158,257812608,-1595341964,727210240,1074113535,-397324288,1230571211,-347012125,-1185392488,-1108852549,117991946,1678165542,
-953810944,25094,-423613952,-1333336443,-1333467647,645981747,6555264,1048585729,1997144164,1482381587,642863952,6555192,-970586510,268461062,6594598,-29588250,
1617572980,-1946211553,737643285,-1190819392,1642601065,1347967242,-1950205103,-467765822,1975526497,89676056,1364197440,1493583592,1359209289,883989995,887718118,-1971132916,
-1954289980,-2037979450,730195680,1642376182,202148070,-215719450,1482187238,115589467,393462571,52369514,1287107,-390876232,2133068047,585680006,-1950338295,-391008056,
-511047399,317239472,59750409,-385282840,552078303,369542665,229638400,-1341519128,168159242,-253197084,-393878519,-2031875605,-1341528344,166848544,-588741660,-394075127,
-2132538921,163459900,-1106610974,842850798,-608304268,149285089,-2136438556,-397407372,549324163,150792416,1950394456,91613193,-387960642,-1192687378,146401285,893157604,
1960912574,-525746675,1445504,145614850,-1461188373,370049032,-1729625088,-1547687160,247005207,8567296,1122943018,900791010,116818150,1965031442,11593987,7487104,
-385649308,917504166,-2114289434,872444478,-2145946606,-1442811330,-1364193164,-1208846360,-226564092,-805436299,-1380911243,-453875736,-387927968,1776874080,-1470044942,-2146798591,
134223374,-337450306,161736800,934291939,-75464474,-1340050006,-1333729736,-231282514,-400956231,1692666064,1081344424,-2132395600,-454532892,-97850616,1692838832,95930667,
27813092,158726881,-193605634,-337459522,1012982808,-2146798592,268441102,-337459522,-500908536,1445504,131196960,-2132395344,568786864,-396316422,1169224156,-575381274,
724778728,-1178562880,521011208,-1073810498,1201995808,737927751,-1178562880,521011208,-1073798210,1201996224,737927751,-942108992,-1023408122,335988706,-939568128,25094,
25214966,-956297031,-2097151995,-136183097,-167288088,536875526,-953808011,436215814,-419516389,1048705825,305397874,-4649355,66501120,-487717712,-289395970,-2132394832,
-138804560,116846083,1946222608,302446165,1316233216,15409636,568770340,-729153356,-990506035,-1171950081,481297394,-389469202,-13432892,113639861,-2147483586,16818190,
1914060520,-400378617,192091703,1445504,-483475904,-2147031320,-33513434,-222688080,113700355,-1107296149,914948126,914948122,914948124,-964493184,-2110355168,7913216,
347604766,-1196709100,-1414856447,-31186460,568721643,1181430,-385649376,-1901068058,-1106878744,-2136415937,1757284213,1952491745,109701129,-2147431039,78857707,-1968125653,
-1475985688,-501516928,1976303349,-510542097,-1207538968,686296718,-2046555130,104589508,548998891,-393564157,-2136472041,-572262432,216567472,1947248646,-508051962,-2147074328,
201332030,1961037502,356417546,108334336,-387768642,-239466969,-131798013,1182027836,-335153222,-1606619100,263401332,-138753749,-2136413183,-102626188,-176829442,645139492,
-189130773,-296374271,1022099691,-1341491883,15462058,1957313772,370049037,784220160,98167011,243277547,-1342111605,-394205635,-1058531716,-1859745275,1961101824,269385735,
-4964352,2028506800,1975560197,-393170910,254018927,125092922,58049570,-1341757720,-1333729730,89778322,57933884,-82406424,-2132395088,-1341817112,107866122,-756629462,
-723123989,-1899495238,1438603226,-1948570710,1606892295,-1528298123,-2130384122,-2130673470,2095055098,88991970,270820580,199950964,1445504,-499532160,-1090174232,12457579,
361442816,-336680272,535567872,108374588,562313,1195853382,376569729,12313461,66763264,1979230444,8898312,1124333568,49986115,1979230444,8898312,1124268032,
-1312388285,180933123,1155779,-1341744664,-1082071488,-1070399385,-472185463,1037631723,629236064,1031872319,326435647,1614667163,-1090128031,-469207624,-1260444511,-1600002558,
35913744,141870138,1062528,91613186,1509063,568590336,15465508,113648102,-973078507,-1610574330,2145972912,108706081,-2147138584,520132134,7683712,-1273793534,
-25054704,-855608058,1963916819,-402427392,-318044877,1048597876,-1167851406,242548738,1377990,610591914,-1170180848,-2115502075,-401690620,547881995,-973665164,108363776,
-387880770,1692664926,108335140,-387719234,1572734034,72149218,-768933452,1068505037,11829478,-58714419,-151816901,536875526,-605486219,1916698858,108291072,-402652742,
-1545075664,-1595659771,281870409,-1090390855,-1070870368,-1993949042,46629637,12122338,-1127182848,568591360,15465252,1048584678,1969487986,-463672574,-335731551,-1331567104,
-1333729727,-965679475,29190,-1897922376,654257088,1532167563,-1666558659,-469399258,-435418015,-420273055,662019425,723453470,79554779,-1340312289,-462363123,-420273055,
1728497505,-1946156288,-1342150394,-8329662,-1342150882,-462363123,-420273055,-431771551,432929664,1030644,1021845680,-1325800956,70641709,180048067,375040,-768344277,
-897518601,-152939984,1476396473,1191458536,129628642,375700992,1174702638,1191454440,-1017579806,541215520,-1138734257,2013493251,50456578,-2132348752,-402157640,12321501,
-1126920704,-1578598400,571398,-661733234,1510393638,637534208,6031046,5815808,-37955954,-536801281,1962934697,42920195,-2132348496,-1947815760,-919920435,-1071477788,
57998048,-1342015511,-1333729550,-947132771,18438,1292289536,113677056,-956235700,18950,122186240,-1960378581,-456578299,-524279157,-385649414,-206568892,2025816294,
-687862016,1032235,16262592,1962965053,6864667,736034831,-939520064,1023473701,141885544,-1453810435,57934336,-1459482647,58000384,-66975767,11098268,-385649660,
-189791748,1214939366,654256903,1479,38127398,-1783595009,12094438,90318352,-18691797,3967972,-773258379,654256897,1072694727,638582968,-919927454,3967972,
57998048,-1342064663,730588821,96937727,-953810944,268370501,638582968,-919927454,3967972,57998048,-1342073879,-1199511819,-661979135,1103858499,-1958555253,-141867014,
-292858554,-1070899131,-930359157,-125054837,-393482101,134054753,1025406301,427098113,1963129731,66683668,-92074123,-2096466684,91555327,1946615427,21162243,-2132347216,
4720327,113704959,-956301236,18950,4765936,255770766,-579475456,5048006,4765841,255770766,-847976448,1040206008,1977614351,-425873212,653667211,721421510,
579593417,1979375808,1292289712,-139422976,1220051174,6339328,1660945165,-2137360957,-75496477,-1148029693,1220018272,63668224,-2055945373,-2147228800,796197883,-2132346704,
5048006,4766707,34586667,-2145618493,393606140,-2132346448,4720327,113683114,-1198325683,51314760,-385649448,-75431792,113748650,1431633992,251676856,-344598525,
1431698305,-89070219,141197542,1208403743,-956301568,-1828696826,4982470,1241958171,1778384896,-13957304,1426442022,1241958314,1786773504,-953809080,-961915643,436227078,
4851399,1214906368,96937479,543861333,1778748191,495656744,-1960890262,900747277,1029210342,376744533,-1437205631,-108982156,175417941,-2132396880,-402223176,-253165539,
-1060070398,-86454023,-460295962,447762545,1894176976,31985240,-1664105728,-104804272,-419768112,-423327120,-803557263,1483794136,-1644530,512634563,1086527867,-3803392,
1443394879,1073735297,-396431861,-400687082,116850659,1946222608,-87875838,-436202080,-135531392,1174702638,12445776,1963605080,-90389517,510981642,12153011,3205125,
-389925959,-822214544,-400626059,1048641447,520159250,313771380,-402343751,2025390098,5433473,-294270210,-394168135,-1013120952,-1229915492,15418342,1122419082,-980811541,
1642349286,51175562,-1180868122,635962379,1976303104,-453337866,586943585,616860384,-1654528260,-402388039,-90439668,52716004,1642513418,-464469091,974136417,-1963428668,
1492443872,-1900523325,-17438578,-528080884,1493108968,1073794433,-390049597,256004,68101208,1075062672,-1223773145,-1022309120,-454506870,-389903617,816906207,-1325405464,
-1710048,-782825789,119565031,812273578,1783605767,1336543032,1392978026,-919383726,-1828463942,-519460628,1504351227,123689818,852044739,1124532928,-1073021982,4241603,
-466960242,-1056815222,-930412064,50653377,-2103088,-588774028,1377037060,1728497446,637534976,6889100,1730084646,-1329374720,82700543,-96721949,-38789259,113648102,
-83885973,-919926093,7014134,-502893310,1976303351,-1973361421,1358676952,1077182692,548438246,-816307994,1223171680,-1564464130,1822621808,7250688,82349744,734274814,
-1335593527,-33953654,-136216408,-1968154141,-1459753240,-470294400,-394219442,1497169379,1541949559,-1043821824,313721577,-939269130,-857177424,2002337021,4515889,65589584,
1153128648,65271556,-393957176,591199667,736630903,-1278178560,65271303,13796289,7214729,520121507,1629471585,-387870274,-1900479029,-41293682,-997850100,-1006789400,
-322903926,-720428028,1397801738,551947184,551813355,-1005920118,-4979595,196095979,15442150,-125132572,276102922,-955604508,-1578762005,15409328,233545958,15409636,
184280192,-350099772,-434065408,-400663776,646511971,1478426731,548425935,-849829658,844156682,-1326389568,-425662944,47011872,-419516209,-34868124,-1377202000,-376328192,
-1833959256,-1342135319,10414483,-1712745296,1214907904,654256903,1479,38127398,-1341685761,8579477,2129368752,2062260144,1995151536,1928042928,1860934320,1793825712,
1726717104,1659608496,1592499888,1525391280,1458282672,1391174064,1324065456,1256956848,1189848240,1122739632,1055631024,988522416,921413808,854305200,787196592,720087984,
652979376,585870768,518762160,451653552,384544944,317436336,250327728,183219120,116110512,49001904,-2132363600,477605692,520645150,4720327,113704959,1788018765,
1511982920,-108834471,1375827264,-1947934586,242533434,993820900,-2033254030,-192878880,-1070925333,12094438,1442500353,-2132377168,-1962914072,134265071,-794773333,47275,
17770155,-41222050,-388456257,-276103126,-1426028360,-1411866440,-1426063176,1442909990,-1409447168,1576897451,251658680,1944776705,-1342160867,-1014962555,-1189222466,-1510801340,
510639811,-661731188,735092927,-1145008448,-2018115520,548995250,-1014258432,-1413313621,-1426063176,-524684318,514833664,-1515850357,-119362651,-1610168538,639422673,-777517369,
-953803564,-657346554,113714716,484233656,-1073297626,639426769,-775420217,-953803548,-388902906,13615900,0,-2013265920,14196736,147,13672456,147,
262147,147,184549392,147,192938048,-16777069,167772415,-16777069,184549631,-16777069,251658495,-16777061,255,-16777069,255,-16777069,
255,-16777069,255,147,12582920,129,1986312,-2013265773,13631488,-2013265694,1990400,939524243,1109146908,1276921628,1746686236,1880910876,
2015130652,-2145616868,-2011397092,-1877177316,-1742957540,-1608737764,-1474517988,-1340298212,-1206078436,-1071858660,-937638884,-434320356,16413,-455505018,-435418015,-420273055,
-1177406623,-13959152,-772147669,-1961522734,-507366651,-1167690250,92929792,-1962838648,1975661317,-2012903080,-1947040203,1975661317,-2040404916,579331268,47328,1438269301,
738143146,-1949594634,-1951665214,-1376375861,-69090765,1642342261,-2015050618,12116002,588936448,-2129234734,1951771386,33194251,-1173654527,-907323990,-352255558,-13909052,
-372126837,-1096111432,-1416211115,-85808234,-880019925,1438640593,-1431651755,1975989165,-1036800548,-713689375,-997826076,-534607900,-2132397392,1962934456,-13940540,-377238645,
-213865726,732645547,-2083812362,900530921,-1451884545,-507507795,-1381861893,1979711285,-1409340516,-1409286465,-997826076,-534607900,-352321352,1342591624,-1912586056,-1940891456,
914892506,-92209131,226281472,-1090870808,-1461132334,1510430969,16956099,-335948824,736134900,-1469782839,-470097918,-421493196,-456578208,-1461679516,-469601279,46462560,
494268896,-919927117,27813092,141949665,-193606658,166446078,-18691797,-377265948,12108545,-1898410496,2013710272,-1930443008,855669262,16824768,-209977153,79297451,
11817216,259134413,721551800,-1144877358,28933120,1494469888,-58717837,-501058432,-2145457184,108789822,12546418,571772,-2089025375,87753415,1601501665,8126698,
-431706112,-118626176,9111286,47105,1031067790,-1461186896,1963501816,734014260,-1189884462,-1169096701,28835968,-1898239230,2080422851,-855637575,141711635,2113814145,
-1200313771,8436305,332251179,-502762919,-431640363,-501691008,-1091114005,-1662459069,-67179528,1397905237,518818641,-125441962,1914240128,-2146126846,209060348,1946745984,
33193991,347341430,-315437942,834396624,-1965489375,-1946799386,-1963291664,-973061850,16646,1578630958,1515936031,46816607,-887004928,-484321503,-81662175,1294093601,
1294096162,1294093602,1294093602,1294093602,1294093602,1294093602,-48083678,1243815714,66239011,4169978,-1061142748,-301462524,4064966,201386752,-386142716,1148323809,
1359003833,1344390072,333973684,-152545273,812800263,4329018,-1040307595,1992554880,565950690,-402410416,-768997642,-402259736,28444398,-402261784,-396884250,-561314491,
1506001802,4263552,-1997477088,-402636506,-561314511,-2134654070,2130722598,-387561800,-1195179427,243320138,-394264513,-2134703535,2130722598,-387562824,-389873083,-1326972499,
1057914882,-253198336,-399019518,1253049126,1912816104,-397560787,1119355792,62017570,-402289432,78775930,-402291480,129107570,-402293528,145884778,-402295576,-396884382,
-1930951727,79423489,-1014309237,-1262056509,1093044225,-2117863168,1912635647,-1262056698,-389809919,1187447109,-1593835518,-1054605296,1094451890,-889321868,1786052924,-2096867704,
1719075327,17123014,1912933352,1958742552,1996700692,38176784,-523187970,-13444982,-141587666,-1870296542,1964025856,41844744,-348687360,784344092,586747531,292913212,
-150041810,-1870268894,91488512,-82932946,5146914,-272169331,-1945745783,-390033720,-1070399249,1187431416,-1070399484,-2013247863,1183384934,166128390,156176167,11266127,
9471370,326418442,27787700,45351540,12445776,-561252264,851690378,-386798620,-2054553463,-1073086320,27793780,-1779956364,-972721146,100679942,-402614552,-561314875,
-2134654070,-2147466994,1592323819,-963947008,-259267534,9479552,125128207,9473408,-398988400,1048576403,1954545729,125128237,9473408,1310976880,-1920989323,-351272816,
544558617,9471478,-1341557756,-1870268848,41222656,-2063036240,887619728,56879104,-1010595237,4261574,-2081428735,477561343,9485696,-1961462784,48349391,-771715168,
-2147015480,-134180699,9471240,100722883,33522627,-1115658121,1946157200,-1060140191,45351649,646237394,376766607,-858650700,639685878,-2054553457,119799952,101238994,
-1517682545,-58064752,-1329535872,16547842,28318836,1967193216,549975561,128979061,11539435,1971387520,29882101,-940117899,67269648,-1868201981,-2063009792,1354956944,
-385914648,1347944504,1476439784,-397401742,-924319518,1477603842,16312400,1343648344,-402569240,-1427635863,36235265,-388468136,1642594803,1491619842,-2031593217,-2047425790,
1963982992,1082177579,9471478,-1341361148,-1870268928,57999872,-2139062088,520130725,9479432,9119360,80265459,9111048,-1870268733,1014304768,1912789992,2026438200,
-1868199372,266633216,91602954,-342832000,1976106527,281837573,-922872085,-990505099,-167087100,91488964,-347026304,-1865646077,9479560,-337366333,80406775,-1518324620,
-1947271024,-771641137,-86968608,4130336,45148411,-1241756952,61204481,-1595347662,1090962947,-1645738496,-972721148,-2147467002,-1007107079,9119370,9471370,985710629,
-2146405180,1057000230,9111048,-1174224704,-1007811593,-351475974,-1945377280,79741376,-266016630,1929528835,1355152898,15402214,82232458,15451530,-2115629276,-997800309,
-388906966,-402410928,-863370715,1222693720,-351934896,-423327232,1482291973,45138179,91425510,4261574,-397360375,1854538262,51243009,-1156091304,-397204018,-963968286,
-457121909,82083842,-739712246,-1195156734,-1974458862,-941096602,-389641470,1720320706,45934592,-957873230,45410305,-1092090702,44886017,9471370,-1071375436,599001204,
41208062,-1746392396,-402214398,-1880620639,1455642626,-1677506328,1912827112,980589893,4374268,1958749356,1967143985,-523195353,577897652,-1274879808,-803507696,1913173216,
48283669,242353332,62185680,-523237262,41026228,638066868,1048576065,-184483775,-341982370,1094615285,661979136,9473408,-1870268912,460653568,9471370,-2143502300,
-1518334859,-2130902896,67145869,-1920989717,-1023016816,4275840,-2143718400,-2147466946,-1517669772,-990510960,-2144766704,780845284,-977272693,-1058701308,410315834,-805176192,
-1058766628,9479552,-1868232673,1090962944,-1007091712,-1070414856,4275840,-1306299136,13363204,4660874,775605899,192217158,4533898,1946250810,47972868,6171356,
-1295793270,-1494724606,1076267008,646600704,-469106623,-1070464396,-184419200,-1868199229,281343488,113662325,-402653122,11862166,-402551064,846331979,-167489351,16814213,
-1599012236,1090963025,-1070399488,-792662576,1827164163,-133474303,-1677711640,16508801,141777309,-382024194,-1007035787,4525706,9735560,-382014000,-1920989836,-132120432,
664123587,-397757360,-947191530,266920074,-25171967,246465368,-1460558104,242612672,-1662512976,1979649009,80265219,516099876,-1900008618,718505944,2016855551,-2027910656,
-1021354285,1912620776,-66721725,-846135880,-689398763,91463163,1912615656,-401952209,-997523507,138208306,145752691,-198919600,-896802057,-772222837,-1261317678,1477823878,
1589185139,-231806944,-160052994,-1965061181,79937739,1074185978,1067515648,-1271913472,988074497,-2079951421,1962950438,-1964832212,-2147467458,645926887,147783743,-1610596570,
-662044609,-82844800,-1061142748,-1173615612,988677106,-134056737,-1006896701,1323829682,1057421055,343179264,343270410,-2054549580,-1071382384,141918268,82515124,527754250,
-466434934,65583696,-896802057,-2034970485,1935152589,4372746,-17720344,-1007258168,-1291586374,-322358526,-2143502300,-136180108,-210383874,4263552,-1007069056,-297614198,
-1159754813,-1336792800,-758413823,-2067036480,1962950150,1040582684,4581376,113642099,-402653119,930218043,9733574,1961691648,-1870268887,41164800,-1388649008,527696020,
9743752,-1746399308,-1965061121,-7280413,9741706,-385906200,-392429538,1486749502,918049219,129257513,-1946192408,-387740961,65601390,-1017554944,1344886456,1912611048,
-402082796,1055457114,-1609928192,1612972098,57958460,-2134681352,1073758478,-67703815,-1878935304,292689357,-919403341,4065014,-502499968,1976303351,1091469555,-1661370368,
4073088,1472437631,-1291828545,66370055,-919403849,1019225324,-502369088,1976565495,1091469555,-335970304,-1997782501,45696773,-259856384,279505994,-872543628,243323509,
-115343295,-68631713,66566909,-1014978324,-386010648,1014169419,-454545227,-1254788354,1372454411,1929304808,706000940,-402344880,-947126610,-1477910390,-7608066,116808024,
1947205698,1961691868,-1869774842,-2134666240,16814221,-71083581,1491607120,1041137903,-1340112896,-1205803488,365793537,1397804888,509039185,-2131804440,16818190,113770291,
144,9119360,-1961983949,113688576,-973078466,16390,4130502,1090962944,1810366464,-110499585,50299719,113702005,-2147483586,-33513434,536643816,1532582495,
-1191525544,-661782528,-1560261471,1319174400,16950016,4982471,244067371,113705038,827261400,31067788,17041095,244114433,113705222,-469696232,18484876,-1088118300,
-1578762005,-81518108,568721643,-402186501,113700515,-973078412,29958,7734982,-393302016,-527765925,57983012,-2147447831,-1901004828,-1326553880,-297408366,7800518,
634948096,1920205040,276164668,820550064,1946172654,1999584357,81838433,652472581,-973011805,16807174,-524237942,-1272286204,1978678272,-392515568,3993095,792468340,
-524216457,-470743804,-2094081909,158597183,18391846,7669446,-1266634238,1913900308,7119130,1141233803,-389510396,1048576024,1979777141,-394153467,-1094516724,2112414606,
-302389248,1364456683,332204468,297010802,426972109,1929410024,-478560529,1963049718,-479936937,-352299032,-855591857,-1979141101,1913900506,1108248888,-1194096128,332203009,
-58705549,-2144046070,796135932,1947270272,3729450,243996530,-1047920574,-922861788,-511654028,-1983378752,-352304626,-473973042,1963049718,-475218429,1508737768,-1900493989,
-314709874,-528087028,-1007857432,1398495576,1822511185,1926839040,1926773510,990178060,990147267,-117280063,-2134640445,91455738,46809293,-469042432,1087179125,-92216278,
-2131789951,58001660,-2147366167,58004988,-939425047,1392508936,102650449,-469084330,-2135817611,-402636568,646638859,-58720140,1583346945,1499078407,46844251,-1758641408,
-1490182099,-1070748115,992820013,1932344109,-1406229202,1127133998,992820013,-399584979,992820014,-399568851,-58659637,-385649407,113639653,1392509044,7675530,2145550416,
1970723386,74573830,88574758,-2013075263,-1977157562,-1169029049,1525548022,1982237191,-1058766848,646504458,-2007498634,-1974404794,-2009127743,1854470726,-1061057797,1183319784,
-1060992260,-427817760,214305295,-45709152,-997568424,-523115470,708702347,1478128384,-1957670565,82428363,-1056718708,-478035826,1498939407,2107965230,-967092180,16806918,
-87883600,15442404,-1578713308,-1174097669,-1175583754,1967718410,7774461,-387051740,762643206,-335416902,628425020,-268605824,-18296278,24176640,7683712,-2146667007,
-1307509426,15460353,-972988952,29702,1946601155,-1597831936,113639540,-1023410060,553535174,-972971543,-382665146,1187381721,484983038,-402098942,57999997,-1023219992,
1358841542,1894273798,1200236035,-112818162,-1209464997,1392909825,-957637912,29702,7675530,981459584,-400394534,-1977220277,-1977220537,-369750449,1225755430,-896800265,
-1070870389,123405236,46856223,-1950340352,-338654264,1392910065,-1912602440,29554392,516163188,82510104,17047236,-2132064536,-92241686,-970165502,29702,755469094,
-393609214,-788332507,652792296,-1978775798,2005542600,-1966146046,721450262,520575936,-973077814,117470214,-1070987340,-919875029,-957682695,-393085370,-1977220417,-922877369,
-2130876790,-536153884,654141064,-2012330102,-1070859962,-386185592,141885751,1963051496,33679363,-28916029,10283298,855525062,-973024023,-395248058,343212311,1963030760,
31582223,7618176,-972720832,29702,26536131,1183453557,32946941,30927086,113640821,-1023410060,285099718,1962992360,21227545,1055393140,-401640191,1048576423,
1967128692,1946600965,1048576000,-1023410060,614589690,-436147265,606200993,-436147205,1139342113,-1172671231,-1867513353,20506862,259358900,-335416902,-1275032158,1946237952,
-2011122686,-1023380442,1912720360,-386168007,846528639,1962991848,16824621,-100536134,-76680196,50218742,585634420,-1172868607,79233520,-2010715136,-102611195,1963009768,
-112263675,-389820811,-93191796,1089008523,-386697984,-294518535,-1189149154,-256245504,-201524735,-165676177,1946353222,14673938,-256191374,309505,-301692378,-386276794,
-1032519563,1962991336,-1945700675,-931854336,12145603,-118992634,192174590,7618176,-498568064,1531571184,-1912158633,-453378048,-339794783,-459151872,-335862751,-81664512,
-239403213,1980167681,292864000,620643978,1914715376,2000698376,-28409852,-129791487,-2126362642,1963063546,-960274444,536900614,1950253147,-71106560,-1191655125,365793280,
632491890,9307894,1979310464,1976303115,1946601203,183205888,7603910,-1912158720,1048576000,-1023410060,632509435,-138753749,-2136413183,192216032,-176829442,7603910,
-972690560,29702,1950253147,-1178402816,-138804992,145288193,-102626955,7603910,-121374336,1042627,27789173,988283764,1950253056,-1161625600,-1561591305,11796620,
443908264,547933364,-1431038859,242499752,279462068,297011316,41223336,646447284,-58720140,-2147257327,-1161625348,-1561591311,-1185742707,-523239416,-85851534,53546427,
663367385,7612040,16547931,1073930435,-1157317887,-1202714096,1190559744,57934590,981402808,108525926,-1019607182,1492648818,113703363,1476984948,-1900008509,29554368,
-1004140684,-352249826,516171269,1354957060,-400431074,9307846,-434065153,-436147296,-1191502048,365793536,909168472,791687471,519779640,-402790317,192209930,1165282558,
1735707902,-1949360293,989862430,1962941470,-1878870009,-1862593075,438209530,471743232,-392408320,512361811,-667811689,1946674048,84404228,1952161274,-402158627,512294963,
526057498,512490191,507183130,126550044,619204764,-1759606267,-2133315072,57935843,1476712680,526121885,-1610612022,526057495,994264015,1962967582,-2145481980,1442562816,
1381061456,102651734,-412489476,-152523344,-919864828,44590308,1625619168,-839299148,-385650155,1023083066,1007514878,-99453446,9899648,36235536,-1760657158,535371776,
-1259843582,-1759606268,-2133315072,57935843,1476679144,-12787574,15273333,1380993028,1229802323,609175377,-167309697,-1073703418,293155700,1974205568,-1777434619,645939200,
-343998314,-1775861685,-58671360,-2143193791,16815630,9832182,-2143980512,536876814,-352057880,-1777928592,1601438208,9840256,1951546621,-2134575611,1572821877,702770,
1416998642,1574646,-2146995192,-150988762,116802539,1946681367,386332174,896795648,829772604,-167667479,67114758,1379669365,-997585291,-2136440652,82379637,21293313,
-2147302679,225904121,-2147325719,141943036,9834112,21555459,1977220224,-343559932,-620986361,-2035203211,1960311936,-654540568,116843380,1946681368,405176327,-705956096,
116842890,1946681367,113541125,116791019,1946419223,79986693,116787947,1946353687,46432259,-1008091094,1968454658,-2134575555,116793717,1963196440,403603479,548406272,
-1364188954,-1207729944,-839154432,14346517,-2147430935,-83879898,551952560,1726525104,-2063484925,-384446981,2126446784,571880,-997544206,-1813445772,2146402560,-1517670680,
-2136414074,1575682676,1930493056,388368391,9234688,1509110,1014068484,-165513902,134223622,116811381,1965031447,386332173,225706752,-380489544,116785666,1946353687,
405177587,-352160768,405145687,388378624,1891956224,-397408908,1012400782,-1203669678,-672574976,284983297,-722068877,1517088,745912380,-1275061856,421955584,1946172416,
29485343,639685878,350945304,276004924,1574646,1008628744,-2147126203,-150988762,-434065158,-391204832,133825181,1516134175,1566071641,386332367,58001408,-167733015,
67114758,1161574772,1178392180,1396494964,113716597,305397874,1389082089,1263620175,1212632396,303108169,370480147,504961047,572596255,639968291,791555372,1009922352,
-1341819591,20244768,-1187734593,-1359871990,-276753547,429929628,-167070720,-1564015644,2078867481,419874559,448331776,1974399488,-385830907,37486854,238816370,-998242189,
-385830794,993788150,1407779699,1934048511,-379601927,-167691031,67114758,1178362484,512433525,512295040,512294938,113639452,-1333788559,30402734,-1070916659,1006681577,
-2144963259,134223886,-1159156048,-434065407,1228832800,125044480,-1610360646,-152174491,134223878,32110965,1966554367,1912649734,-1157592599,993847438,-927236494,13887976,
863192892,1509110,1013085187,-1207601905,1760235264,276117308,1793633968,-434065407,97342752,-21108387,108149564,-370584133,465240225,-163451927,536876806,116793717,
1963130903,1951022113,1951284236,-1152963571,-2132153994,1244510208,733487851,-165811378,50337542,1177345909,-337024581,1916484619,-352276476,-387859705,-684799746,527761212,
1962933376,386332186,544489472,1509110,1007645699,1008038465,68253530,-384963808,1631387198,2050754162,539755127,1842827,-1125583989,438189051,-1994230784,471763204,
548469248,-1364188954,-1207911192,365793538,754849769,-1965609413,-352276256,-434065249,44480800,-2014837581,-33953309,-1974381744,-100420616,9905792,-456578097,-536696732,
-423130374,12188512,-1761151462,225783808,-872482846,243326325,-343932777,-1761151481,-294383616,-1017619623,-1761151238,1198866432,9899648,-434065344,-99751136,9897718,
-2144045760,1073780494,-1612124752,686357247,-1759084544,101251072,116785303,1971323031,-7804917,-1761151238,108298240,2078864560,645987071,-79757161,396382659,-1318050816,
616616452,1354979591,-456578054,-536696732,1692817658,519816187,1397838422,-1948100888,2023525106,-1947807488,184551572,168588498,-32607004,-27757364,1530885324,526277209,
1122914511,-2136413101,-21494411,706071952,47432191,-1964193493,1971366112,1274536462,-2141457803,-461372980,1528622073,-96334416,-352261138,-301158400,-1957668613,1107298452,
-527766292,1526260864,-192888182,1353509704,145769026,262191342,-1325566648,-605295092,1448222459,-1957473961,-772109326,-507123482,38027,326423051,376759306,1265945854,
1886702846,58051838,1526762473,1516134233,-527773921,-1341930877,-729092480,-1026423631,975489,65481151,9735162,-1976679936,1257111877,-1976696597,-1031541243,616860163,
1246424607,11534571,1347152878,-1341865341,1111682563,1290285239,1493726208,-863977078,1252584320,1021845687,-2081393408,-1973877270,-1746145599,-1341865341,1111682561,619192503,
1255896320,484966839,-2133625600,-1802821916,-370409472,-1802764427,-1031602176,-527766523,1726606402,2090699519,1565742336,16770433,-707668527,-1964193493,986129120,-502827833,
-260747787,-1017250038,968833263,973879780,975388665,992950928,1004223361,977746957,1019034830,980238194,968243638,1010448822,503774459,1448300882,-1192733353,-1207910688,
1064587,3204993,1966145411,-1342128637,1947466880,-1949921790,149864944,-24910127,-1979092184,771770662,948479231,-1174353943,-8191020,-1341885136,-1565216249,378077257,
113639523,504889476,-259286960,-192640466,6660848,-2091763932,1525548226,-611394773,7610053,1096024,242352700,71096579,-654112654,41027388,-1957635837,-528086457,
-533600226,520118435,-997530574,-989969682,1139672970,1492378186,-1979763937,-973058498,25094,1008730297,1007317508,855929863,-1257903168,119584776,378252275,-1031602077,
6660100,-2071318802,-1550257940,-427753398,-1959919602,-1544493948,146341964,5291776,-1070397666,-1337807885,1228832816,41223680,-1561444432,1599930470,1515805534,-1261500641,
1611565322,190464,378268907,-997588893,15418094,1257162122,-1057045366,15418094,-1007763062,-778516598,-1802922272,1043857488,91553890,48808587,-390337792,-930414463,
5115395,246741457,-1006649368,-13443190,-1752439855,243990608,1599930464,1482185566,-1563490529,243990626,1352138828,1319363063,-775386368,-401820423,-782499952,1351060451,
-4724736,-1946193943,-2097126634,1721763266,1979648512,-2132794354,-1022746653,6726382,620712937,1944834271,-350221069,1244039919,4825088,6438538,1499357021,1409235945,
-997533557,4859638,-1023148238,-1017388847,-2147427864,141690108,1946680448,42723587,-389969069,829685815,-427102205,1860756266,66388736,1976368893,548428021,50358760,
1976303357,-559027977,4800128,-1610124281,-658898843,-571871741,-337736962,-6297380,5113347,-259262325,-956378837,-315440386,4861579,-1014305533,4859638,-1605320701,
520486985,326238780,259457852,64666194,1946724588,-1306152709,1482354392,-1966875894,-212379958,-1017225307,-212350326,-37527637,-2147468824,141690108,1946680448,37939459,
-389903533,544538519,-427102165,-823598294,737487871,1976368893,548428021,738183656,1976303357,-10622473,-303309174,-1073031030,-1974464908,-20632890,1489189568,-618003851,
83656899,-58718094,-385649657,434635556,116886272,1977289247,-91161843,1963043052,162065656,-374473868,-477692404,-343873397,-1947480062,853510899,-772043777,1350929383,
856257536,1279132671,-109753600,67023080,1662422008,113410816,-2134647157,141690108,1946680448,35842307,184532968,-1794738981,384543731,-91161707,1963501804,1963042825,
162065652,-1416234124,-1444287774,83656957,-58718094,-385649657,-1914174992,-620037121,-319156363,158664872,-243990104,1946790124,-1429894149,-370744761,71105916,2061728883,
-289279093,-1650424,1342197940,-855506760,1397839888,652248656,1157645962,208930876,141823292,74713660,225773372,281874100,5280907,-346465448,112942,1912798336,
1586112005,162809088,1532498125,985857625,1912621590,717684242,436109522,-1202714254,281873930,1347997438,-855506760,-1562224624,1963042906,33601541,-102166323,3270908,
570722854,-1964977468,-373239090,1347484904,-771744024,650388200,-161805174,225804483,-870132490,-2010726134,-907454460,-339660036,682660853,145285878,-670760076,-1953262049,
46185425,-2147286343,100682046,-2135226766,117684481,-355210718,-141889021,-925841110,-805384958,-477431691,-1966871342,-389968936,-125107666,-1031679701,-423624447,1228832770,
74647040,-405675312,-316006650,1946346432,-1262253523,-1947929008,-1963981833,-387765530,-293535618,-276750416,-855760976,-947195531,-2130671896,-31477521,-369789493,-561316808,
-1963070229,-389903400,-125107754,-1031679701,-423624447,1228832770,91424256,-405675312,706676295,-255360531,48480256,-1014354316,-453619532,-265554037,-483727734,-2130697752,
-2128588562,-31436561,-1963887156,2746567,542175105,-176829442,-69539332,-336863606,1465305738,1583326451,536921729,536921985,-896903338,1583326451,1472891587,-2124436749,
1461715143,-1426863478,11846495,21882960,1012463755,-1106873472,-351339922,511716367,-561056213,8140485,1377819276,50585793,1228833008,1914635776,-1235855572,-1007244284,
-1441368704,-2054674772,-947707905,1976499791,1197432556,1575609314,87172859,841395370,-350224507,-774665504,65241319,-470395472,-125118326,79058519,12183724,-528039133,
1954595574,87238147,-1408923354,587245288,-153057597,91521218,8729382,-2054609376,-947707904,1976499792,1197432527,-372907449,-1461126396,-2081387776,-326432532,4800128,
1914635782,-1979402727,4622340,8686149,4622368,1355187013,-344600834,-422504725,1609041078,-20545280,5826591,531820161,-294269186,251293375,149783303,-1325599349,
-1172367872,1465254016,-218102599,1952341927,-2084504034,1967786183,1946172653,-1900008686,2084488408,197168128,-1341885241,-2083329152,-2115434300,146362874,-775368704,-486682147,
-1017539080,-1178302803,11714560,24428933,-1043148551,-193789207,1157650056,5284291,-1965520045,1244067524,48283904,-1023148246,1347470171,1049232308,281870434,1980578904,
-1190480826,281870337,372949758,863305802,-25165646,-1272285928,-1609511678,71041097,121374322,108331191,281872564,28900490,-1228330234,1242991128,-842334720,-169256944,
-1262027015,1962208002,1946827795,1946631187,1963473942,1959922348,-404010262,-471138126,1964572288,-1179587620,531825971,-338034200,84083660,50529029,-1962888188,-2097126634,
-1460926782,-385649660,44564609,-2065104011,-1961839616,-1979686122,15462084,-393548734,-1966801334,-347935036,-443880448,4791946,-1976631510,725610911,1310624707,736874752,
721582531,-2147241536,67127614,1048586610,1946615881,-165105118,48794354,719096557,1228833023,74778112,-456129359,-729095213,-289345398,-166532350,-1979692490,-757822736,
-1964471584,-738250020,1375843555,6493835,-301481341,1583308122,522133279,519819015,-1579625752,-820051949,-924311813,1090008,-464466145,1975560289,-401756153,-816260989,
-426921904,-391270288,-1461140788,-1610566440,281870409,-534725032,91521192,-658184112,-533676456,57950376,-455558680,-435418015,-420273055,-768869279,1642395179,427147432,
1253003,12180110,-458361984,1975560289,281444368,2000743299,-532627733,-86473240,-649271052,1088956592,-397168423,699455803,-86427928,-58655756,-2142342528,1366606076,
176221312,-28805916,-29068084,-29330228,-28871476,-385649204,-855768917,-855756428,-855767180,-1763113355,20179201,58051838,-33312535,-385649204,-327154763,-385649401,
-855768010,870908789,-108612604,-352320822,-1157165317,-466426123,-400624917,-1073031209,-922875788,-115391116,-151330069,16818182,536544628,-455742471,604040097,-1935546626,
-1996449274,-1996449762,-1996448242,-973038570,16818182,1760037808,209659095,-527806400,1994918832,-81831721,1352788984,185317626,618090216,-387938625,-967256223,40966,
-336060421,-1031013497,167903674,-32803648,-385059640,-369361037,619511666,-1275597840,1697793,-402476207,-1286537197,911364,-402082991,-779419641,-346530983,-1325772071,
-347871744,-348068864,-455046656,1356891712,-301662279,-2064908053,-2080644925,1968767225,-339137788,-436162520,-469701821,-337606080,-2042567680,1942502368,-4566517,63974399,
48978634,-511588309,-373219344,29031172,-1185918718,-1460927233,1492901903,516119129,-153693464,16818182,-115407500,-83960343,15442404,-1578697180,10100364,9963207,
243859616,378077342,113639580,1342242976,-401929288,2133120619,-528072692,1490451688,-2024648197,-1610156335,-102662144,-360512139,-957189375,40966,-132163238,-50426391,
-400685472,378328687,646512745,-1064566681,-192227186,-1056641344,-972880672,-956246400,-63420,-2012593015,1153895540,-956301298,-57276,2245831,608486912,625264143,
642041755,-796131328,-289344374,81838340,-14138169,709134847,-970165112,-1265423036,27125983,108265532,-2132409424,-1883745813,-706222071,-2132361174,776207293,6160655,
139723023,251658680,-1880428543,-1207951293,-796000216,-1912598344,1620184,-164904818,-1510736085,-1071357468,93000308,28312969,1642365158,1642466316,1642525476,-1193774359,
-661782464,6887054,6760075,820567476,1946172417,1015079946,-1341885184,-1199512061,1894121485,-2132539617,1183378571,1642084879,183035,-2132409680,14169833,256114945,
541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,
541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,
541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,
541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,
-386248448,276103188,1692848560,1962937320,-423327225,190560,-919878823,35939556,-1195115808,417869873,-389773612,-87043053,-857153612,1946172671,-100682748,-1340143921,
-350165487,-423130624,-1342117087,-350099964,-436097024,-1342117087,-1339955457,-341776879,-423392768,-352145247,-341711360,-436097024,-1342116959,-945690881,-51132,255608006,
3818695,1027917312,1044694939,17760256,17762388,28840028,-268366080,944087530,1619968,548984974,-1195340288,-796000216,79987547,-883740566,-70194696,-58655793,
393409800,-743577570,149471574,-259276797,-1795215622,-1258600994,-903913984,1173225474,1175275007,1181042226,1187071624,1889552130,1879492096,243990528,378208366,-1983709076,
-1996461034,-973050354,28678,18409667,11542386,-1965872408,-401886992,19190563,45142154,-1965876504,-402345784,-393555181,-202849288,-402427136,-427163433,451412144,
-1327396141,-753670142,78701962,-1194128152,-320337141,207758546,31621122,-528039414,-120391448,12642499,128982386,-1965894936,-402083632,-259337525,-991426128,-1329034542,
-759306190,-1007097718,1929420264,8513539,-402651464,-494218555,-1092089936,-1327068462,-759699448,162587018,-1965903640,-399331099,196661929,-762714101,-528056540,-120415000,
-401887037,547934843,-399280647,57868378,-1979695384,-402542362,-510995839,2062025648,-1327133998,-764155899,-31153692,196649446,-766646261,537689892,1592320134,12122322,
196657920,-767956981,-528066780,-120435480,638236867,-1194179352,1055425035,-401821486,229691935,-1009640728,52476241,-386266448,-2136419825,-486865292,-104844301,516160089,
-1934076080,-1871649141,1621651940,-528069260,-460295962,-1463541135,-399477696,780259863,63963292,10362499,1344303872,-427062344,1910804592,-997802204,-997822234,113668582,
-989855584,-973039554,-1470595067,-1341492192,-76487155,1514851666,-1331172358,-1334778355,-425662944,525885216,1397759695,-991407535,4096209,1953759489,16778950,263518977,
-863366963,8662666,-768358914,399311540,-159320960,1316331716,1358977000,281871284,-768388519,281871028,281872564,41271306,861020336,-840682798,-990488041,-31296215,
1976187586,-1965935905,635982562,-956409344,-797577670,-855460774,113703440,-352321280,45373963,-956690227,-16711674,1482381658,-768356577,-855634504,702487,-71100467,
-397258722,117428527,74776684,7210751,7224963,-2129300200,-1342149570,722302208,7250880,-973050717,16805894,4198142,645925749,-1326448577,66238988,1511837166,
-419815248,-820029408,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-394358807,-389321817,1573610754,1949288424,-382301427,776243716,41221692,12844348,0,-1808911616,1534289933,1712675089,-1894367689,-1240404719,202569744,890293806,
756113169,1343440942,455030063,1477574189,-1860440034,-1104247518,1393016327,773014302,-1979711457,-1676583138,-1557226194,-550571218,1477617974,-1205716718,-81602542,17825295,
-653261808,809305108,6135869,0,1061005568,69508644,1816351296,-834572991,-413978815,324871762,692466502,-782758568,-1824010937,391129681,-1524012972,472494377,
-1770094491,-2022641283,209325688,-194870157,-847598215,1026264186,-400852450,-383379672,187234345,1193443369,304483625,-1390709466,-2106896021,-94004117,307664981,-1740324777,
927247428,1459701761,-1274967295,-452863743,-117312511,369235201,1342315010,1828872706,-1459452414,-553473534,973284098,1292059395,1761830147,1426287107,1319817044,-750588220,
248402950,1426259,-984202925,1095716034,1162200004,1325450704,-1076736180,-984395956,-733065285,1095060633,1381208786,-607237812,483675721,499600979,516702788,1208800079,
1092002898,1286851660,1157677267,-984332980,-1051442775,-2033366652,1414743621,1178971346,-1378595255,1314080325,1178971847,-1345568188,9946693,-1580903604,1384236110,-1513794751,
-1496037052,-766553518,-724807001,1490408018,-967898160,-237612765,-2100146432,-984428082,534268175,-816558336,1411403657,1397721551,9290325,446978117,1431326208,-1949923884,
-766225586,97799896,1292947534,1263465168,-559654587,-649789440,1129251017,-893037503,1313428048,1229757908,1352586323,1159451471,1313442004,1095741637,1397341380,-951086124,
616779530,1158860357,27546694,2475599,-766553009,1196574145,-1001407035,-1539028493,1480916995,-683310124,-741060716,-834318336,-1663806022,-271411762,430199875,1330205776,
-968443698,1230110941,1334957134,1335412043,1162154451,1163073483,1163052756,-942389933,-733066929,550389212,-833290240,1431586186,1166986834,1166525505,1380930643,-851079995,
1431520655,1235797325,-1537980345,147082754,-850047419,1145979307,1514753359,1124121029,-834321070,-800107320,-801024112,-984202844,-1471983426,-800762670,80627663,1225249361,
1381239246,1381241764,-1538830775,1128354006,1327014981,-993767851,-884782764,1230132257,1207968455,1389219397,1386401359,-1547286961,-827833791,-834548529,1230176269,1406650190,
1090572498,1379996876,-623750064,1413761280,1229037768,1229493972,1169278284,1387447374,-1211804599,-254652672,-1426063360,-1427460631,-554913813,-1477124883,-1108951335,15252711,
2088532345,1011241087,2071603250,27522,1681615789,1722313553,1817404163,1702126368,1662608146,1663591233,1667916849,1669948239,1706301655,1480936960,1769414740,1970235508,
1329995892,2035482706,2019652718,1920099616,1375761007,1381323845,1769414734,1970235508,1330061428,4347219,544503119,1142974063,4281409,1701604425,543973735,1668183398,
1852795252,1818321696,1984888940,1818653285,1325430639,1864397941,1701650534,2037542765,1684952320,1852401253,1814062181,543518313,1651340654,1392538213,1668506229,1953524082,
1953853216,543584032,1735287154,1967390821,1667853424,543519841,1768318276,1769236846,1140878959,1936291433,544108393,2048948578,7303781,1701604425,543973735,1701996900,
1409315939,543518841,1836280173,1751348321,1953844992,543584032,1769108595,1931503470,1701011824,1920226048,543649385,544173940,1735290732,1920226048,543649385,1836216166,
543255669,544173940,1886220131,7890284,661545283,1868767348,1852404846,1426089333,1717920878,1684369001,1702065440,1969627250,1769235310,1308651119,1163010159,1162696019,
1397051904,541412693,1752459639,544503151,1869771365,1851064434,1852404336,1818386804,1919230053,7499634,1936943437,543649385,1919250543,6581857,1701734732,1718968864,
544367974,1919252079,2003790950,1986348032,543515497,1701669204,7632239,1769366852,1176528227,1953264993,1380926976,1953060640,1953853288,1480936992,1968111700,1718558836,
1885425696,1056993893,1229477632,1998603596,1869116521,1461744757,4476485,1145980247,1953068832,1953853288,1229477664,1174422860,1145849161,1702260512,1869375090,1850278007,
1852990836,1696623713,1919906418,1684095488,1818846752,1970151525,1919246957,1818838528,1869488229,1868963956,6581877,543449410,1701603686,1685024032,1766195301,1629513068,
1634038380,1864399204,7234928,1698955327,1701013878,1328498976,1920091424,1174434415,543517801,1701997665,544826465,1936291941,1056994164,1140866816,543912809,1819047270,
1886275840,1881175157,544502625,6581861,543449410,1868785010,1847616626,1700949365,1631715442,1768300644,1847616876,6647137,1766064191,1952671090,1635021600,1701668212,
1763734638,1768300654,1409312108,1830842223,544829025,1701603686,115,270451456,1338462720,1338462848,-889133952,-1,-1,-1,-1,-1,
1342177281,124911672,118489086,1034,0,0,0,0,0,1792,2098951,0,0,404226304,0,65616,
117899264,0,16777216,16842752,16843009,16843009,16843009,16843009,16843009,16843009,544106784,-9744640,1916928013,7037285,50332859,126501852,
1974549571,440583,-236201725,24412732,1125092035,1396912010,-770975349,74766983,-633611641,1526730937,-654055820,-1246113813,9562376,512460493,-947257298,-1057045726,
1335888244,-1296037373,-380799725,1035085501,-1187401031,-1296484686,884128053,-1187794247,-1296482638,1085454647,-1187007815,-1296485710,984791363,512434923,512295735,45219886,
-1190415687,-1296498254,313702666,-1189825863,-1296496974,229816598,916635698,6267397,-1576770910,512426080,512294958,-1070464185,-1576770142,-947256213,-1057045726,512296052,
213451593,1159629576,632416515,-1966962087,2663114,54730379,55254665,512481927,-947256505,-1057045726,512297588,-628685996,55975561,55385739,-628630773,1946374075,
1963401739,-2028995065,108259802,126402610,149475722,62176036,-1031108659,141771836,108212796,108142396,321661104,-1976643446,-1073069305,1129052277,-227161346,1193184083,
-561553917,780717398,1060898698,-1151662475,-722795596,1534246632,1006632634,1971965402,1978591491,-1021130870,57983230,-1336108568,586279167,-1966253648,1872937010,1010558976,
-1155294488,-1930950867,2662514,57999916,-852627736,-17525,3022473,167984800,-1958120256,1392721694,1516004840,24635474,41036464,-1394073424,679798818,839807834,
54436544,-1070419733,-352108894,1092520725,1926890243,-105229583,1524251647,512354419,-140508353,1958742529,766044586,1915245032,99215522,-922828546,-392390284,141756205,
1965462504,-25761533,-1979434776,1965046791,1542514691,20047954,512335194,-1932721341,1877541746,-397323717,-1326957074,-1665136123,55121545,1912664296,1973198089,129034499,
-1672364022,447604819,1364827483,-689437837,1386043928,-1604696204,-1073085333,512428149,512295690,512426799,-2023881896,1398363870,-397158141,-1990501611,-2029823970,1497336026,
1128485722,1128470409,1224784058,-1958131383,126397682,-1974910397,1975847617,1519242738,-1962926360,-1996166882,-402435554,-1899158711,55713419,82386569,-1946232599,-2030030818,
-1963029798,1124567770,24446730,1128481731,-1073084534,540807284,188544371,-35065486,83486724,-2025591573,-350778918,47828,1008170066,1511224364,1376134120,742137204,
-1343743628,41216547,-88462276,-402426625,125044236,57945148,-1979882519,-2029831394,-2023859494,-1957472546,-1962921954,1124567755,1268713226,1133868190,991923011,-1948677158,
-2005600993,-343575563,-1564462366,-56491267,-1181758206,-1195769541,168266240,-1155500608,-1014365888,-930430678,-988100726,-1212422006,-1950338560,-1958565126,-1958565126,1019456250,
-385649374,540803123,-56620684,-1967126014,1127183367,39118928,1949969496,1967799302,-1576947704,-39714052,1968516098,126505132,1951973386,1946630826,126505178,36497475,
172223723,1267890368,-1850720452,58020178,-1174347031,-756546709,606726158,787022707,1589269249,2156555,-253215115,191019523,-1342171672,-352094839,1706725387,583691,
-1917835659,11397465,-1406209397,24494090,-389510461,-1053159787,1111750261,1330113259,1330905120,4347136,243263579,-1148138157,1093402883,-930430974,-654114635,1528269614,
1726501699,-1949791730,615263986,-385649281,977469867,-1957661247,1118580466,-495337462,675070346,-225763980,-784552914,-801368716,921178484,1949187086,365422595,57802928,
1476492009,-1406209397,-1073049139,602473337,207247616,-5222272,838947304,50176704,21555288,1543418601,-1406209397,2042628674,-1913961737,-1832038325,-1978921798,787647432,
1958742700,-1053146601,351007605,-1448367476,-1579898714,-1986096246,9293198,49004594,-39714384,1515804674,1968218428,16443395,1974549592,16050181,-650319440,-957807756,
-437760000,-393236480,1347944674,-1963020823,1949187079,1916419086,9496835,57880636,-1610577431,-1073085699,1515784074,1659437945,1009218814,-385649362,246480473,1375776232,
-402396952,-2023882499,-628664610,-1679244406,1539803648,-385837592,1364393471,535299978,14674013,-1605150119,37487355,512432757,-947256157,45137930,-1014362507,263453578,
-931984836,-873787132,80269392,6088731,-402349125,57806415,1476698043,-402159024,1129840714,-193607426,-38934181,1107520186,-1406209397,58031908,1107323881,-225769670,
-344609746,1006661609,-385649626,-397148731,-396688885,1211894999,41225136,199756976,-397323776,-380039975,984678236,1118501515,180456009,-1023314747,-1679222862,1536413178,
-1563886005,1515782909,-401825560,-398196770,-253227879,1022653217,1007186746,1022128944,-370641874,126549299,175317052,108267836,41159228,-1605361488,-1057094915,-922877324,
1274978281,540805002,154990964,171767156,-1018957452,966943920,701687811,-417311256,991332690,50044931,159115344,703091544,72792848,1532380648,-397190822,512295837,
45810485,-388234496,511048051,1263720707,-1974782070,1396917015,53812875,1515969083,-1956977291,1159629283,-2024099581,-402083366,-1957486877,1577268510,1398201991,3022475,
1457424222,-870322712,1963793128,-104404733,-1041693838,250125561,2018745609,1894659,1583188712,-1168712057,126484481,58052412,1376834792,-388331693,669734598,-396553496,
1364940209,-2130658990,-695537270,126522573,28364604,-806875531,-186100984,1435756636,1533874920,-930459055,-1978877208,-397717016,57933995,-386316311,-1595402623,-1957473536,
-1996203490,-1962922466,1577270046,-1252598137,-2036379262,-997830460,1355056799,-806763386,1367520612,-873905429,-116200968,7727299,-1781706517,-384867351,-1073085739,-1975260299,
118113031,-1958485900,378094359,116785198,1962869878,1538282278,-2028156184,1450240218,-1058513488,334191388,-1679255859,1160153373,1126074627,1007127043,1136620858,977012618,
-390419598,-1535880690,-1418559188,-1569502660,-1073552334,-1748111221,632618798,126501632,24263228,1948269763,1007186676,-1057032912,180603134,1023112384,1014133259,-1610189538,
-1073085696,1947221187,-1572646852,472646400,-181651085,-29620365,126491509,-31553213,-1979664638,35555800,-1576882173,79364865,-1073063936,1124567747,-31553213,1066027778,
938009067,-31552768,-23860478,-1564421952,1364329217,-2029845830,-387413286,-628665069,512318041,-1151859970,-1073086460,1913208003,-9836285,-17485764,-1010237760,1006829728,
1008169743,-1961659891,1963131422,1128481546,-1975314550,-371554505,27284586,50045443,292816956,50470539,77799049,50601611,77930121,50510787,-1303077399,45267203,
-1190874439,988285106,129939743,753234513,-1966568895,-16389912,259385916,-385941784,-797827295,-393592532,-1963003160,1925262021,1589706435,-1151934841,11862880,394844419,
1976106563,126508025,-1468715972,-335622424,-20322123,2031006696,-385502565,126547834,378220092,58000201,1274983145,1023323880,1006793742,35031821,-385649405,-1070399841,
1258487970,-402652998,24313491,1352618947,991533243,-1977912614,64654078,64685018,1490748378,-1976554338,50378448,1541048282,-1638345237,58049371,1008499945,1007121422,
-385649651,1978151075,250132764,61939435,-400817432,1398407061,773753683,-561553920,-1618104234,-2041527162,82530756,-8656815,1006829728,1960478477,1947090108,-155260669,
-1957438841,1577254430,-396960121,1396899921,3022475,1935399483,-112203773,1189610354,1225618425,1034030512,-51881213,-1009153262,-1545008974,1972948470,-385894666,-477366790,
54861449,62033212,-1947663500,512318454,-390397906,-561553906,-1319391146,-1325208774,-1979665152,-1966241087,-1326953496,1958742781,1959082686,574374842,-1057035916,-1943212940,
-985995403,-259340782,72933355,-401282301,1609049564,378136348,-1605237957,-397409541,1582826885,-1974018425,50045160,-980761286,635962996,50044940,1006937018,-1174179323,
1012073631,-1959693053,1392812830,-1961391293,989868062,-1961790502,990075934,292772570,990063803,-1341492262,384231514,870898311,383707156,1457424222,1515372264,-1489190053,
417870453,468510973,-27268983,225759755,-1963438104,1540459253,334037874,1293322751,-1596296701,-1073085617,-780877174,-1979701088,-170989104,-1978866200,1021872647,-402295667,
1267276722,-906048886,58049930,-386090519,742194714,-286546059,167989152,856192448,55419840,-17471767,2663104,1954758528,-34084846,-771027851,1944588404,-1564462338,
-389872817,-92930921,-1070462997,-33337438,55026112,-1962922333,1963150110,4161765,-1014824075,401163012,208726041,-1073030539,-1528233099,-182392323,1375734458,-1645731980,
1591379965,1951850119,-388331754,-1960043738,1946370326,-40638456,-504822924,-1965389836,1975716551,-42866429,54599305,1526939298,54468233,-170137255,-1979437848,1965833223,
-65411069,91523388,-853874200,-756526261,427055953,1979451112,238863105,-857144459,1947024637,-69146365,50470539,-402540861,-1073021399,-454494604,1973501179,1976499954,
-388895762,65732970,1261542376,1979436776,421390339,1072235381,1977039873,661383427,58052156,1006676969,-385649198,1012072612,1013806124,-385649349,-396820201,-397212759,
259262371,-396541464,130421442,-1558279392,-855114236,-1558279271,971526916,-401771492,58196273,-402640407,65750401,-1979700832,1958805224,471787555,1726482292,-351827387,
996730883,-1073065125,117575284,-33262603,1925528264,412739587,316598363,-9705125,851024589,-383874304,-388431100,126491624,715135093,-387413504,-12829902,-986051468,
1827144562,-385650152,237764743,-789119885,-397380885,-236389625,1011898378,1241609426,-1073035638,65602424,47616,463923283,-1628959372,-385648640,-286785515,-1610355900,
-662044631,125092094,2095579319,1541048145,689545704,-768845749,-1189907373,512426034,-654113559,-1977913368,-402426617,-789169474,275956226,427081982,-1978140952,2043215554,
911619,-393559810,417865904,1976434199,-1998038023,-21173766,-1070425139,-397323693,1515793542,-125124558,512350346,-1017445143,-1614794157,-2041527162,719972548,-488045708,
783897586,-1241337344,-1999043587,1526771767,-399907095,-1073074637,1954888899,866314499,-2061954584,58008380,-399496983,1944591664,578480128,1380926696,480766035,57891162,
1360610793,-402606766,-1336209083,-57415421,1684361791,1919295599,1931505007,1953653108,-1975320563,1975519751,-225253117,-227204548,1526766569,-854791333,54173852,57982986,
1509061609,-401272645,512452107,-389872829,-1152176236,-521600522,1948466176,482273522,1360366777,11543100,1604517808,-388008700,126488795,175451196,1604501554,-107091964,
1877476587,-397198568,-1017442000,73375827,175423498,216547248,-400510954,48764423,57891100,1360568809,983744562,738706947,1398528647,-1337241006,54108800,-386310424,
126493349,1965571147,11879200,1290323454,-385649159,574419432,1172898677,1948794111,1965636843,1976434409,-114169627,742131572,-907476108,-561553679,1007127126,-385649620,
28376881,-402347614,-1449131934,1959329284,-14685949,84797523,-1930951819,-397714670,-2023819013,126506718,-1955320772,-320320677,1539312376,183042932,738707199,-1957493013,
218324510,983744562,-561553917,-402330794,-399763550,-2023874280,-1974315298,1949056007,54173706,57982986,218139625,1386397746,425912324,-1947663500,78243886,-398953136,
-259327845,574417034,983567988,-1967126013,-1241352976,1261221178,1477424872,-930479356,168055456,-1023314496,-628637302,1578551995,1381424775,-386207511,1348008035,-1682373316,
57889046,-380438039,-397716739,125106255,57945148,1593729257,1263984263,1962426088,-9705213,54173786,-628637686,904463220,-379891177,1659436450,1975519994,126501653,
-1308161469,-385649404,-1958481714,378094359,149422903,1971600632,-11540003,-417933848,-402651927,1260918478,-1320025930,363194369,-1293378099,-1564462591,512296104,512426834,
-1973877934,824084743,1944468483,-381893887,-382962318,209047690,1006828448,1975683587,282519811,-445445060,-1241284421,-1965423872,931802821,-713832902,389986641,-842626479,
1954495646,1917926500,1023288429,-1603832710,53215995,1038680949,-4191504,2030347062,1173763,77936383,149488506,-1623785728,-1590231292,-1979513852,1374194378,1360536505,
53550731,-1224776727,1927687168,1929591860,-805225424,986067664,1945144006,-270604029,53550729,-336120088,1399187680,-1186187288,2142659881,-397227541,1398428595,-350539335,
1019579070,-1023315356,79319633,453229412,51505235,1994982260,-1558279169,-927378684,1503456037,-56442486,50044930,225822010,678691388,58000444,1929412585,-1963947463,
1946696901,1019644462,-1973980152,1946434757,1019644518,-385649405,1702096764,-1258050885,64553728,260714201,797584963,-1558279334,-389852924,635982604,512318284,-1990523743,
1493475102,1264248922,-1152190488,-56622186,46190594,316181187,-1966921017,529215224,-980753409,1274472528,50045528,-747371460,-1558279845,-388895996,1515803287,-352083781,
1642617805,1248192587,1531652328,77930121,-1558279845,1407576836,1357437575,1172855626,1246357579,-397657111,58062387,1945036009,1355606275,1914064616,14412035,57876540,
-839483415,1975582367,23783683,-381892354,-365111948,-1343683723,1965177856,221112579,58053436,1006759145,-385649370,-717487919,-387445643,2662645,38004819,-734215333,
-655880843,512447477,-135789753,1019435850,-399608358,-1679231545,591144980,-1192751755,1088967429,1541048102,-402652183,-2081939719,-2024593132,1977289690,-153229053,1531678184,
1976581315,33614083,58054716,1007717353,-385649208,-600032304,1290339189,1977498670,318368003,58054204,1007644905,-385649275,-616814024,-1528233099,1976646715,41871619,
-386047768,-1020718034,1575517622,1377733629,-689417469,-389850269,-2024596076,-1558279718,21096452,-1343749260,-1966908598,1918974983,1937456377,-1017174795,57943612,-1158255383,
417857536,-1709835,963923772,880101436,-1975319115,-2758649,-2028655896,1007317978,743273274,-347508176,1934048262,53947459,64685019,182125531,-2015851837,1976434394,
-309532207,-187307957,611572359,57817148,-1175622679,55642064,60584667,60322523,1502900955,808190133,-654063478,-705963385,-2025154072,-1975270438,1015098375,1393456391,
1022663400,57957160,-1337335575,-805260025,1372097216,-1963686168,1929723073,-58464222,739463656,-2025220888,-1558279206,-561553916,-628665514,-2029754904,-561553702,-400430250,
-2023817474,-1014343970,192023612,-1580393668,-402427053,-1168420741,-1336796715,78160385,-855590471,785974176,-822204417,-2055935428,-2123092676,725403390,1019412853,-1610910487,
-20734389,1505759936,-16464606,-118964198,-1240470711,-65869734,-145714456,-1558279725,434723076,50045180,-922875844,-922826498,1355123395,1481668328,1970945114,1250552067,
58030908,-1186437399,1011967244,184776006,1346159578,-635239563,1966881987,-1009110269,91566652,-738731469,601094083,-1009518630,-806757845,6529096,-1343749141,-1967063501,
-1967115560,1233447416,1375743720,1593717224,-1957241209,-360425,-1125579915,129699572,922702693,-1605237936,1011876603,-402426621,-2024272649,77839322,-211687221,1006633145,
1007711003,-401837551,44102483,-792720893,-2016900400,1227738,-628631293,-2496317,303097938,113436903,1457424222,-1017440375,-378220484,477417788,1393687016,1158804968,
1192358376,125098636,-418256408,-1996055576,-1023193066,-402525208,-628686368,-628680823,675022730,854131572,-219027211,-1977925656,1965636615,-182195965,739359208,-907481365,
50044929,-1991196662,-2029825506,186616794,-385649189,126544756,57944124,-402600215,512357051,-628686031,55713419,672237032,1397801010,-2135893369,-402441822,-628679952,
1457424222,1342372768,-90445742,55713417,824084827,1105745923,-402345727,-121958345,-1948515329,1207560419,1342372768,55713419,691799946,1005065076,-1957483503,-402444002,
-349433550,-459122511,-1073063933,-73249164,47874,-1075258365,572231,-477373437,-33311910,-225752381,2025851564,1246382838,33749920,-1595372861,-930479132,1681704194,
1424556914,-1014345485,-423952203,-1965489405,14674120,1360840121,-191239855,55713419,1408367336,53550731,688966120,512316080,2090861361,1342440451,-930428720,1477416680,
-789133174,-661995266,-603717705,-1168907381,-1628961926,512318208,512426874,512295908,-880082052,-1174176069,-2031615002,-1963423232,-467760680,1344178947,512312068,-947256240,
1302512394,824085252,-107943933,-242358197,703136628,-41031446,750391669,-1558279421,1926904580,142403590,-1962350872,-1979483618,1137937143,1125091907,1094791050,2059092289,
3139587,-477373817,72359563,1344178507,180849156,72196803,609441883,59554567,11913354,-51848957,-1950131204,126397682,-1974910397,1975585477,-1957444622,1124085278,
1968954123,-385043724,-404166194,-2135895793,167983522,-372733433,2117867867,-1645673612,126501865,1971534915,212134147,58040380,1010282473,-385649246,-2115422016,74836201,
-370353529,1642659129,-1477946876,-873976817,-389850624,-1007747088,1392503784,1258336848,1961933544,260892679,11593772,1592822360,-1604919673,-1073086370,-628683915,853182444,
1959142082,-373072914,591194420,-1763165068,-57546504,2112378997,-1228502496,181466624,-385648192,-796200525,256436306,7137324,-997810342,1405388368,46303826,-1328510272,
-997810412,-372996528,1357389832,5040368,253814864,4515884,-397257896,854073543,2042628666,-244193021,394811971,787006299,867756032,738208162,83653390,-19859940,
-1564343616,-389873622,451473427,-1662495752,1541048140,-1073035638,-268310333,-386397976,57999339,1274098409,-1963986200,2145960898,-387429387,1503841775,1374352104,-1960306200,
1258502942,1961875176,245950478,532932652,-1070464334,-1155426584,512360447,1978138670,-1341819632,7315969,260725339,1127189059,-1056258678,1038680949,-527374103,132645749,
260722957,1127189059,-561553839,1004177238,57891290,1592336105,1398201991,-1982167215,-402437858,-1973729878,1946762247,-400510971,417860595,33012480,-402651672,-1746203469,
-1073084534,-389873291,-347924631,33012211,-1070399562,839056546,73310912,-349734424,-29146874,-1965067058,-1950348793,-696997127,678562620,-796254148,574371954,-56620427,
-1576979454,581960444,276118076,-805110624,-804818216,-1560468272,984613628,58310666,-1979695895,1949187280,22538249,-1070463885,1587550443,1958742532,1975582223,-1960792053,
-29250823,-1023314482,1587675568,1019382276,1007120907,-385649888,-108330697,-1602032726,-657456388,-657439886,1383323856,-650377334,-1514450605,-814394592,-1393456311,-948613828,
-1393456311,-1082833604,-1393456311,-1217048004,-1393456311,-1351271876,-27568040,-20513082,-339280186,-1973724883,-13244153,201522336,50110978,-1597784014,67896060,-791612437,
126543730,58033212,1023402472,-402426481,126549989,126533886,-1975319179,1132405767,58040636,1011087592,-1979025999,-381926649,24424880,1381061451,918266829,-1310160383,
1136787008,-745867382,168266286,-1611500352,-193356221,973572654,-2014808635,1959804122,-1965999102,-1973855551,-1609796144,-1073085346,1587675312,1008069380,839349595,73310912,
1587551723,-1329591804,73310975,548408692,1101724043,58052350,-1979341591,772205506,-1975318646,-1954601776,-29250823,-385649202,-1039530611,-1472403079,-1070463627,1527013026,
-385981207,24251839,1915763907,-180732677,-1998042173,1347506925,1492001256,1361163705,58002236,1010983145,-385649396,512442979,334037762,-1604691633,1337066240,108268348,
1219628092,649073781,1101724043,-1066086658,-108281206,-822197846,27309684,-1308345341,-1308200448,-1308462047,1007127075,-402426592,126501714,1958742595,-1426486486,1959722561,
50438287,-361626564,-1952560737,1100983537,1006925214,1007186990,1006924868,-1294764731,-1966085376,1958742722,-1426486519,1976499777,512475905,-1360461058,-403576579,32893009,
1364286041,1944592616,-1963488757,-561553709,-633646250,15270770,120437742,1499002600,1577704891,-2024350073,1478396890,-1393390845,1101724043,1977236290,-1982231564,-1023191010,
-402640152,-1910627133,-1979494370,-286712057,1501432,615639122,738941416,1526496744,1342606854,-1426420989,2062074631,82334708,1541048064,1806547395,-127276975,-1530005896,
1006937760,-387091056,-394766165,-1186430232,12226944,1077602560,1358957241,-712313462,742143348,-397276300,-292885132,1952107146,184608806,-312022996,-396878476,1378618102,
1961715944,-457774845,58053131,-2014491927,-561553702,1373275990,1525107944,1189630290,1524206567,-628630981,753468275,1482250989,367743571,57923843,-2014503191,-105163814,
1541028863,283706227,395006701,-628633077,-1978895270,118113031,-2019669089,1372943834,1493181672,-1957536934,-771013865,-628681612,1457424222,-1992041849,64653079,1541048281,
-1246108437,222056712,1034076210,807308035,-1975301376,118113031,1136853365,-398256245,-1073026181,-930419596,167984544,1958841024,1017498971,-401050201,-1992496285,1558766709,
1963867371,-1394060579,1976699884,1009380106,1389131022,1408016104,-1612280600,229678665,2028486514,603765512,1466558546,1096869979,1364417369,1531007464,-1544860838,1701080661,
1701734758,1768693860,2123118,-361427652,-329127854,1138394963,260719427,-1339061693,603437838,-31552685,-2008329470,260590383,1527220299,54370499,-126566390,-385922583,
-398325326,-398390866,-397211222,-1606088282,-1073085347,1860764532,512447459,-628685990,56368779,57989691,1541627113,808191882,1240007539,1912749283,-482154237,-33268574,
73245376,-1008036120,168266286,-386370368,-347930621,-997810189,-372996528,158598937,1408402664,-347666712,-759475424,1453713444,1510793704,-1880554637,-1975299575,1157687303,
-1073084534,-454499211,203327814,1067378688,1632813915,1836016750,1836412448,544367970,1684366707,858597408,943077170,544175136,909586995,-1325389513,-1325208803,-2029996774,
773753818,1511950592,-19233020,216550341,1008170218,-401902302,-1073026557,574360692,-1589840523,-851698316,-1073027979,-1975315083,118113031,58053002,1138925033,-1992091765,
-402367978,-1891833385,-397342859,-346428399,1971600601,48779527,-823436820,440189322,225707914,-1552633540,-1586122180,-1653223938,1954692291,1971534998,1959657108,-375527181,
-628643724,3022475,1511951187,773753092,1373275904,1494341608,-377362357,1948592826,139520008,2042252076,-561553883,773753174,-1018012928,-1465888609,78225924,1352638040,
-1465728974,-1013032956,-1979524120,260719367,1513065027,-689418159,-259368958,-1975314550,797590287,180521563,-1023314490,19711626,-1070401166,-1057045958,-822152845,-242496770,
121258412,1956529055,1927935452,1039657023,-51902229,-402396355,803752622,42592256,1361647545,1396901770,1526770664,-1975316598,911407,-388461997,-1017511333,-1779957328,
53263104,1124567123,-1017440375,-1977436853,-5155851,-33060285,1958742721,1959148040,1975859716,1965178095,-390993917,1019578963,-32672468,1959395009,126503687,-176938948,
-561553829,-628669610,-1259814518,53263103,512447152,512295692,61867171,-402457694,800734743,-1982186749,1526926366,-1686829174,-385871686,-398204638,-320274542,1048373249,
-822163714,-242514572,81389740,58002748,1090889192,-1073025813,-1638399253,512446623,-628685988,53419659,-930426634,-654049355,1926904643,790530319,-628669693,1489215064,
-1013005178,247111256,-385649408,-1069883190,-625389409,512446758,512295690,12256047,512447232,-1152187556,378209038,-633666804,1948723897,10283267,-1996234053,-1962652130,
-1996269026,-1962652898,-1962715106,990137110,-1977912102,1128481543,323348560,1963146328,7464965,-796213198,-637337418,512482795,394986574,512479755,427033434,512350855,
1128465486,1128470411,-637281657,72031881,-1209279865,1544981337,1977236227,7137539,1346570122,-118996157,1125091858,1480798090,1020855123,-1981975293,1526936350,11865994,
-654059261,-1948612797,-2029833442,1960459226,667269572,180367953,-1639735545,1134499722,-1623749986,24485443,-1949594685,990064414,1926859738,-2023859213,-633645346,1457424222,
1943636819,1482185187,-1018080685,-620012710,-1974732428,260721455,529156947,-654114633,-779422326,-1949594805,-402444514,-2007286624,797459215,-380905077,1397882592,77799051,
1457424222,1592828136,-396960121,126499821,-1558279341,117592836,1929383866,-545724157,1526586344,1577076968,-396960121,-1957494721,-2029834978,977114,-1157624856,-2023876806,
-380414242,1583087111,-1974018425,260719367,-1976595901,-20709672,-1023314485,-1951600245,1111599866,-1830227477,-1558279365,-388331772,-628686816,-1974278795,1255246581,512429962,
-633666769,-1070462347,-654055286,53419657,-288504997,51125899,1261406795,994774922,-1980860966,-1023210466,1360756665,855619560,-1963947328,-1010824697,1360756665,1979706856,
-413800189,-1961391293,-389829390,250150190,756976630,1494714371,-386043159,-739711489,-135780348,-873966859,-85447676,80013549,-561553879,-320318634,-402295567,65795553,
1526708712,-402651672,548468181,-389903792,-393544468,-20578728,-1950583603,-2013057762,-838974713,-1343489675,838902760,-561553728,-1329034666,126505811,57853242,-1313159798,
1374179584,1398495741,1127189059,-578142326,-654114635,-1461138549,-388461828,-396689673,-387318003,6744316,-225750438,-339400020,-1965389892,6088711,-838941186,-1729559691,
-1243065882,-997828607,-561553762,695581014,986250833,1912648967,-930430207,-1054210166,-393559494,-359992462,-16717629,-1897331851,1137740529,55779211,-2010150182,-561553865,
-397717162,-1092033257,-2007279297,-628636881,688120296,-1974379943,15254506,-318510875,-1326382360,376721409,-185341864,58048522,1357260521,738442728,-387126040,-1276626435,
-1957483517,1577362206,-396960121,-1545016103,-397203197,-628621744,1364745049,1365575609,1360756665,1156076112,-1973921026,-1966539032,-1341703480,-1952288000,-1073042190,-1720400502,
-1975318646,1066025775,11918730,-1054156541,1381099658,1457424222,-1958539382,1381194519,-1393390767,510986042,1959394882,-838974708,1515908981,-1070441895,1515871171,717589081,
-20905273,1515832256,-838974629,-437530507,671293928,-401827864,1381185889,-1958487417,1545505559,1926904579,807308050,1943681792,-397190390,1398537006,1530511080,1457424222,
738390504,183768552,-385649216,-1974409909,6744071,-335222702,-41228205,1499191943,1592298072,1398201991,1583679419,-1974018425,1958742721,705137296,-385649723,-1057037029,
41075002,-846544502,11913726,394937170,-1975547325,-1965489190,-628663576,-1958539382,-1965390049,1975519937,-225721599,1107789996,1959394883,1976434420,-5061647,125053244,
738357736,-386689560,-1020722582,1961858792,452867,-386067736,378272636,512426844,-873921745,-1615540753,-2041527162,635982788,-385649660,1482364893,1369359494,317411487,
1336066098,-443291389,-389480935,145761123,154941675,548409461,-385889560,119808846,-1638337419,540853081,698359922,-387413504,-973200582,-838988940,58049850,1946186472,
1962884105,-390005243,-1638391001,1481678681,578611358,-390738493,1031013308,1930933992,1397903859,604321440,87466696,1528351976,1805670746,1958742532,822798595,168095648,
-1157139264,-380432664,1364394221,120437586,1515127528,1527623769,554887363,583854275,-126566390,130419691,57337856,1963062971,-1330197241,-13768691,1946377192,-1010814461,
-1394032590,-1010814430,1587591117,1975519744,-991378687,-402426369,-1863777828,854583297,548399187,-1326964364,1975519999,45109264,-1946579992,1510157598,-790030455,2078822649,
-796239623,-1141093656,512294918,61867171,1526922146,512447427,11862794,-654059261,-1020647760,-5187446,-125122790,-603781518,-1023315109,2891403,512314187,129631045,
-623580928,53419577,1381099891,-100210605,962157147,1929588510,1977871322,807308246,24766464,-1576770398,1034027838,1124567043,-1992095864,-855418850,807308206,-1345500416,
54206089,168060320,840398272,73245376,-1258005342,56671002,130461901,-838974716,129693813,768768,842516200,55550656,-125118326,55385737,55975561,50994827,
168061856,-1996196416,839069470,8186048,56106635,56237705,56368777,168060320,-402426432,916460980,1963009029,87466499,740199257,-1991554304,1124287774,-1951281853,
51297251,51125897,-386403352,-1070405942,-661981046,58465929,-1996206686,-1996233698,-1996206050,-1576830434,1364394809,54206091,-1009108029,-50623650,-1957255634,-1979025953,
1916419079,485081857,-642586143,512481927,292814896,1390992007,1256739810,1524206556,199820146,512314339,-628685986,-16943677,1963584448,58039543,-1660248088,54730377,
-1996288325,-1157428194,-1957036276,1392520734,583240348,1958805191,1411287308,1126075139,1444841731,-34215933,120765341,350815092,-633214502,-1336930384,-47585186,-398457768,
-320209629,1444842493,-1160049917,57999377,-1948695063,-1996270570,-1023398378,-1564462408,-389872522,1397885128,-402362693,512439819,-2023881894,1827165918,937971948,-1377293057,
-393586680,988569320,-385649467,-2023827192,-628664610,1511951187,1977236227,1583045139,1381424775,1530254056,-402362694,-1017432629,-1327405335,54108673,1963488232,966939635,
-1963095549,1229539801,1236070795,-126304246,-637318839,512481927,-633666724,-1951599989,1117760249,-1639866466,-1958088587,1545505241,126507779,-1217057732,-337648920,-997828426,
-1966908514,1916877831,-178569991,-34674237,742194036,-68679308,-1058518048,-387025697,1949105810,739675112,1949056000,4712451,-542513077,-397511598,1949105786,3663944,
-543561653,904463220,-561553704,-289713322,1943681792,921197357,1395094016,56106635,50336953,1943682009,-1982167271,1526925854,2891401,-392762533,-770968848,-1729559691,
803849184,739675133,169224960,-1950684413,-1950209085,-1295137840,-383874221,1541081860,1311769027,-47128272,1529868591,456142896,1444842288,4909056,-339541644,-352210940,
-1560301566,-1057095568,-1224645144,780289,199813237,6219807,-1597784014,-1019608996,125040756,-1070409590,-31525399,519104963,973101984,-1327270717,1958951425,-372506915,
698359518,1959213568,-372769071,512433874,28770395,5774985,-1960917527,-402631138,-1233846263,-1979700832,-1329206280,1959213569,-372244823,1537220266,-1594324480,-662044580,
-1770862806,-397360898,1486880921,985923072,1942748867,1925659149,-1342016247,-1563886079,-27787176,-385649208,-555220989,1537262366,-1596421632,-125173668,-244137174,-397360898,
1486880895,1925396992,2026322448,649475,-5242251,1487061246,-922855424,-1142304908,1528728350,6135808,-980752246,41141050,-952444790,-125173133,12044170,-1057045718,
1342206650,-637281657,-2008873080,-922860793,-628622987,-1564462504,1503789144,5939712,1358900201,-1258276888,-1966568959,-1426420795,-1393390774,-930420342,1976106584,-347028735,
28659946,-1979705368,-1949988152,-1958565126,-376787726,-27735926,1357018312,-1168905237,11993204,-637285378,-628684918,-1010818469,7649875,-872546121,126409219,-1017390457,
1105766093,1444842241,1478396160,2727936,518766846,216547248,-400510726,-1070401017,-855627870,18802855,5643915,5774985,1520617354,81913856,91540478,-1343749712,
588048639,-400342552,149429156,590932003,58048522,1344042984,5643915,2696842,507167998,309657688,5848634,1049101427,1043988569,108396634,646506378,-396885926,
275906607,65583988,-107354110,-402541589,-1377044077,1962476348,-155454207,993837825,-118883467,-29144100,787642569,-160102598,848608195,-320336207,-385648129,844103687,
7512768,849525592,-655881039,-385648129,-1974468576,-792720703,852003520,-1142388032,-654101842,1125616174,1480034862,1444842322,-1073036544,-1071512637,1444842435,33521664,
-872543371,1979635688,691964423,479258624,-1007034647,84279821,470551299,236920349,168369023,100798984,235733765,889133951,885666902,867119929,891630855,872494413,
854799479,233321409,1489532157,-138674507,-113121279,222037896,171708788,-980810123,-311099844,1976434243,852360936,-1157134144,-1597832714,-1073086350,1642609268,-628666114,
-2030041146,-389808422,698352425,1959209472,1354825227,1476457960,-143275778,5643915,1493056488,-1070413686,1118501515,-91504246,-1010814294,-1073083728,39512259,-1258162246,
5808382,28820282,1962944928,1478396691,166220288,698374910,-1610255360,-922877862,-402629982,-980811204,276086818,-34674606,-1224116902,-1597768191,-454361047,-21964153,
-259340758,1007127115,168326176,-33065536,1258517710,-968626197,-628686841,-1219490384,461170689,-51901008,32947191,851704152,33006272,1979557864,-339476988,-352079625,
-20477219,83371208,-1967063544,2728168,41141562,-980752246,167801504,1975880384,1959213580,-386364923,-1070458058,1959209667,1352683771,1370112,1492626152,-243939074,
7512259,1923272950,-1010814464,1444842323,1923108864,1958742528,256003,-1597809832,-1019609000,-1152184203,134086746,973089184,-2013105401,1352686343,-389510656,275906959,
844160116,-47650624,-420953090,-872523775,28820478,-1605114901,-952500183,11996021,973102496,-33524285,-389546301,1398472713,840609256,-1329374272,1959213569,-338690556,
-872525036,698355316,-386364928,74841296,1457424222,445179995,973101216,-1609927229,-922877862,1520567156,21161984,-55646125,-1006759563,99090871,-561553918,33286230,
1541860187,840586728,-1847016512,-1609861636,-1019608997,-1006762892,698413291,-1594324480,-930480048,438495313,1958742617,1958820364,-389546488,-1070458326,1959788227,-387585036,
28770452,1394219496,-402632544,-27590227,2728135,-952450818,1105784181,-1213893124,-339476991,1879492322,149618688,-400955928,259129674,1946173672,-386798829,1005066710,
-402164991,74711089,-1070403093,-1564462397,149618800,-400966168,259195170,1946167016,-386798613,333978030,-402165247,-596377577,48820715,-1949046016,-402631138,-864683324,
-1763114569,1444842490,-85989376,698400373,-369587712,-872482150,-1041758860,-17337093,-1605254205,-952500134,1743264370,1501209,1118501515,1457424222,-2023829506,74733278,
-538195970,-1073036455,548405877,4581571,-74782640,576198004,1022457024,-1595050976,-1053163440,-1047861644,1489223714,698401785,1959213568,-389546471,-28114748,12314831,
-1597505957,-1057095639,-344602822,1352716286,11003904,-397323325,1348010148,-1696022134,-930457600,-33543776,986185408,-1964542521,1405311937,704666784,1949266627,1528728354,
-561553920,-1014344874,-1610589278,1554120797,-94705664,-561553829,1528727894,-1219273984,419031041,-385765285,512490246,-872546218,-1410858124,-100734952,-1010041253,-76402628,
309475900,-210616004,175266620,-344825540,41057084,-1071463431,28791747,-1979700832,1709724136,-12822248,-939653004,-243937794,1398522715,-1528299081,-373073128,1240012867,
2662936,54992523,-1021130998,-628637442,334227572,1946285755,1134361057,-388860439,57989500,1540977385,55121545,1926461672,-633542397,1128520075,1128470411,-388331693,
-1973735858,1946762247,-400510971,-1125583721,33012712,-387405336,512490335,-872546218,-872543884,904398196,-17337094,401664195,1020371177,-385649654,-1957432213,-1979389666,
1539508935,141888176,-401756080,-1017580457,-1326165272,-196220915,1271073456,1977073384,-1880571135,1538862326,-927968969,-1070464277,-1979516254,-390869745,57931721,852508649,
-1561818432,-1975320434,1915632647,1007514690,1006924602,-402296016,863172523,-1252923254,9353983,-973176820,1118501515,1007127107,1006924602,-387091664,-395053173,-462148036,
658294154,-169278606,-1901962801,1007127040,-1172409562,-1236125693,1948597250,1019674244,-1023314652,557631230,146209140,-210492612,616663640,-1227847041,532370176,-1965423869,
-1974772937,50045638,-1596517656,-922877127,2062091125,-385648639,126484496,58009644,738250217,-385649357,-1070464826,1392720290,168054176,72000192,512433780,2126119804,
-1982201085,-2029761762,771221978,168053408,841249984,72000192,56237707,72031881,56106635,-399647511,851705604,-1963947328,-2023859760,1539528414,1457424222,946518610,
-411772357,991550138,1232362202,1457424222,-73379501,-1595373054,-989724530,-930430722,1090565457,512442689,55771996,-397190695,-1990513639,-1962714082,1511950809,130435843,
1977236224,931683064,394877507,31320131,1531107975,1116137667,113641707,-385875121,1088948856,-1157138974,512294918,-1017445213,-98661549,-561553918,1391495766,9353809,
179106443,-2026015552,-805174054,-389510440,-1047858237,-1975316598,-28228817,1408595400,1342213792,686348935,512317655,73072821,1507381250,1261406283,-922873976,512488821,
149618869,852953832,9347776,168058016,185103552,-385649198,1498021983,-1631287720,-2023826809,-2024581410,-1967063334,1007127280,1015575596,1007121449,-385649571,-1662464448,
1377733077,512318211,11666170,1393027922,1355056799,512476294,-1343683750,49979436,57982986,1489903849,-1952529274,-385649205,120204117,-1729559691,637440,-1597105687,
126354171,-1227847101,-997828608,-385649250,260571338,-399538109,-1975320365,-218765112,512312131,260571953,49979459,-1047867184,1352601458,872701088,-1245148661,1939757056,
1100962052,-1626371938,797459280,712697923,-922837416,1352653429,-896864630,-637281657,-806812813,-220403470,56368777,509515,-126494149,-1975402446,824085488,-2028500477,
64685018,1272612825,1125615947,1922979907,-1964471738,1124567752,395008950,-2023865533,995120862,-385649958,501808975,1490682666,-880031490,-73342091,63671042,1912876251,
182125320,51082432,2059406043,190723,56219907,-1948612647,-1023192546,1539316473,1124567747,-1979665071,1507394504,-1621995069,9353808,-1968377205,-1949958424,1128443122,
-838989944,-1638337163,-389850790,1793645658,-215947223,-1948612805,-352017634,54173706,292864010,1406830426,983744562,-1665073661,170887762,-385649171,-1958488737,-1977292001,
45175765,1011025802,-385649316,540803485,-1040316811,-327823874,-1326806437,30861404,854622952,-1966044480,30075120,126546058,1965112387,24111363,1383342908,58009148,
-33464087,-385649203,725352750,-646707024,1124567627,1433677372,58023740,1006712809,983331932,1018590471,1008235556,-1968278230,37503941,126485618,548414524,-838989195,
851362558,1125123264,-972897538,-1023479670,-838991695,126509428,1949187139,1948466206,1965833453,214338083,-336557504,1007127265,1949216803,-10098429,-29163087,1959657153,
1124567606,-210492612,1005894226,-1963488686,1952333011,121291521,977533813,1140225287,-243988678,751143491,1525314052,-18314662,65749958,-1973757305,-1023521850,477431844,
-980759810,343195658,757860234,-29620620,145754741,-972946428,-838930294,1702141275,48779857,1364810459,-1964340653,1019282117,-385650151,-963980253,1558741004,-361240517,
-655864997,292878802,1006844578,1007121467,-385649620,-991376536,-628663854,1385976667,-987101302,-1979664829,52399056,180718298,-385649472,116129453,-402621464,-1654919385,
1491665780,-402426882,-2023821337,484988638,65625068,1575535576,-1966211584,82330375,-1312101393,-1325012224,1476520705,1172884990,1956469504,1860719056,662694106,-1957473959,
-1979407586,-1979665943,-980791099,57982986,-387145240,512485860,173540515,-385649216,120258398,548464778,-838941186,1340670837,-290330369,-1974405909,-1329591610,-402426837,
-1017581917,53812873,-387453720,-628633073,-1627363608,1151311428,50886046,-1981576231,-1962719970,1392520734,53812875,686510675,-1981217932,-388331574,1735721023,512353163,
378209093,378077230,1128465498,1128470411,512302987,-628686802,1406782696,1529316584,-1313273484,1374259712,-1949205015,-1996203490,1526738462,1877563737,310225,-1975264253,
-2101787897,1975597568,1227015,-286533373,973124025,-1023314751,112793401,66614272,-1159992359,803799070,121301194,-781326261,1927828852,1827165145,-398625571,-1947716854,
-1558279192,394937092,-1959294397,540847346,-2008938123,394808119,-401605045,1264314588,1959869160,1950039074,-267851771,753421100,-399724335,-1158943313,-1461181776,-390403859,
-1595399504,-388502547,-1947603353,1403571670,-2014776694,1007252481,-401640390,-143064706,844879498,-839077696,-963984469,-922828246,91423292,1642704077,1912945865,-916788989,
-1974381991,-1159165240,-2023866724,-1974249762,1918974983,1937456134,1361062914,-225711990,1111731246,1968817466,1976172053,787647458,2025851564,452867,173693787,-1073036352,
-225711240,-1073042386,2040414879,1540197109,787647315,1975519916,-922818122,1145198923,1380144127,1347223118,1140666708,-63876287,-1856472320,-1118263464,1403637080,-997810350,
-1161525680,-637337554,120258480,-796213246,11971277,54440379,394931930,931802691,-1631287720,12048522,-1976641021,-1976679657,1524270903,1457424222,18371,0,
0,0,0,0,-402653184,-397158383,126544268,1333051402,1125616195,-628473974,-1070411638,-402194526,-2036334885,-997830460,-1241190215,-20775413,
-1974635318,1914715143,1949187110,-1426486488,-822197439,-2040993419,-2036359484,-997830460,-257888118,1958804996,-997828602,-373072994,-347879384,-1576947510,-964032769,-277607620,
-344849604,548465780,1101724043,-353644802,-108322640,-822197846,-1158941067,-29161590,2062074826,-1596421409,-1019607841,-370605197,50378695,-1948612645,50651166,-1608545318,
-1057094346,126540660,-713768950,3062355,126540291,91425084,-1058415411,126507975,-1007042550,-818550709,58008380,-389075224,-2023825622,-397191458,58064811,-1983407127,
-1023088354,1360304313,-1965613848,1965833223,-1847045287,168266472,-385649216,-1958492292,604473887,1006744287,-1307216823,1951349762,1006940687,-1308003246,1950432264,-950736637,
-1343729061,591146221,-790101131,-556996402,753770984,-1073036662,1038680949,-1293397817,-1973856002,-371339823,-1444413309,1007127294,1963242114,-827987879,28476732,1329352052,
1228677236,1810380660,1743274477,1676169453,1609060589,1541948909,1474842349,145900781,2028481771,-313726770,-313989035,-314251180,-314513328,-314775467,-352144812,-832706543,
1122841064,1307389416,-397729614,602459727,535314925,-1974316051,1965243399,-834803709,182335976,-385649216,-556939600,-1974775116,-836114224,-974584972,-561553722,-1614640554,
-2041527162,-1662495804,-385649410,-1973762411,-855032634,-385649697,-1185692029,-654114770,11548552,-40769189,1975519827,87465994,57934116,-402438423,359988843,82386569,
1929556051,-42866429,1357504717,52750534,834294619,-1998978304,-1963423225,-383874600,117594884,1526728646,65796547,-1614794227,-39851952,-1638340147,343167135,741083018,
209043466,-389179672,1481829482,1352661406,-1070444385,1424490930,-383874049,3258628,-1638344445,-2145075174,916586764,-1617012731,-1564468656,126485743,58310666,1476450537,
-402426722,-1070404777,-369218328,1122551557,1273679357,-1295169816,58063232,1946515944,-334436328,-1303364564,-402229870,-335950545,-335484920,-1296037311,-1974427902,-1576000318,
-1638398878,-1057075041,838885282,-19011392,-1957454248,-1979389666,-2145101049,350815093,1676170205,73572577,57982986,-1962640920,-1996269538,-1962474466,1392521246,82386571,
167823080,-385648192,1307115542,73572549,57982986,1527030504,1654833202,-20387580,190555,-1595349013,1979464704,437119235,535423949,807308229,-390067712,1189675011,
-397369600,-63176573,921240437,-845260774,-989795860,616799832,73638432,58039896,-389746199,1671490167,73703940,838904808,-51255104,-1988098106,-402331362,-1073086389,
-305286280,-1597713431,-1073085340,686293876,-953686012,512312131,1525154648,-1564462358,1139279158,82813182,57982986,-372508183,-628636220,53419659,-633611641,485005426,
-1564462358,-337050314,-1957538839,-1174083298,-637337554,1532626826,1394505155,649744465,173101635,1498989504,-260454146,1532609371,742131594,-454494347,126505419,58008380,
-389293336,-2023826474,-1168943394,-112049362,683271167,81764417,916504555,2025851397,1093188044,-543113166,850324228,-1964471616,-63838011,-1610610746,-973208353,-277625558,
916635698,-376051707,3153547,509515,1539562473,-1631287720,-1622060461,-2041527162,-383874108,-402214908,-473104379,-1614550039,-2041527162,-628665660,50343611,-2029548838,
154950362,-890698893,-997828608,-561553762,-454468778,1381192186,82386571,-823654224,-370881025,1532674996,820560729,-368777013,-369039324,512447272,-1152187159,512294912,
1583023337,-396960121,-1974281454,1965833223,-888543221,1543228904,126533682,-739749729,-1638389271,1457424222,-1014345569,58048522,1405888233,-2015229976,-1638376998,678711455,
1021843176,-2011991037,-906083577,-1638339467,512318297,-380566295,-1638342093,3022475,54992521,-1022957221,1946118888,-1020204797,-439495189,1392513768,48759221,851663616,
1124567232,-109720066,-383874109,3389956,1489230339,-1013005178,1979385832,-1023743741,57871024,-839249175,-1024529946,1979380712,-1025054461,57871536,-839254295,-1025840665,
1979375592,-1026365181,57872048,-839259415,-1027151384,1978335208,-903878397,1206435890,-381504772,591184626,753446261,-385554214,1405258284,1543176424,-1178400886,844180972,
-64689728,-1177149720,549066395,-1977912020,-1189614634,-397339496,1374224332,521922802,294304082,-259342286,1364250762,-22681517,1810432883,1965046978,-20513274,1022260686,
-1978436318,1019382504,1975880236,-1963619831,-25040683,-138718350,-1962953471,1019644616,1958840866,1393376302,1012619636,-1977322230,1019382472,1958840876,9037827,-27924397,
1009152603,-1978895091,1948269762,-1339278315,168784909,973829312,974025926,-401967934,-397213597,1935408687,574378930,540804212,552084853,1008759550,1022850080,1008235564,
-855345907,-1961855775,-1979389666,-401428280,-489816611,1539425257,-1157625914,-1031142922,125050924,1726480565,-389850144,1352652087,1489578728,1934663582,600107011,57843288,
1529070824,1958742723,1124567291,-193606146,-389682343,1621229638,1958804992,-1046550269,45240659,1543161576,855391208,6333120,-386131223,-1073086426,-1057093772,2112422773,
-1563885887,1364394080,28491826,1543151336,855387880,6333120,-87234213,1392030952,-927340469,-1341950630,-397229311,-399710330,1263665195,1976084200,844781829,1944634304,
417869031,-628664064,512350467,-628685052,-930486197,636027764,-5219647,-796399421,-602806189,-1009088678,-1962079303,-2030030818,1478396890,1977236227,398181121,46369378,
-1965520191,-1979706169,-1393390600,841925930,1991987207,46369377,-1965520187,-1979706169,841898232,-1950285305,-29185286,-1325238839,1976434187,-351423044,218872248,3153547,
512481927,-633666728,1992011636,46369377,-1965520187,-1979706169,-1393390600,841924906,398151687,46369378,-1965520191,-1979706169,841898232,-1950023161,-29185286,-1325238839,
1976434187,-351423043,512447417,-947257298,-27540702,-1023314752,1688227999,1958742532,-923408125,-1966891432,1967143943,-944904189,-1979711303,1020365557,-1977649942,-1664140281,
-1729625227,-429070137,-679548888,-429594542,-680073172,702963176,-1957454503,1946500382,47875,-774306913,-690905378,87891593,87498377,512478091,57935163,50331835,
991857114,958302469,1541048069,-339725629,1342418946,1493148904,1392520936,1929586920,41936902,1526879720,-953030461,1409256680,-1157425944,175374335,-402495256,-662044133,
132645047,-1329374435,-1974316797,216550352,-401902393,1009575390,-402426836,-1031088386,46262355,820577139,1499093960,-1949896727,-1979369698,-1967052093,449284824,1945668293,
717238981,450398915,-1966921017,-1950090760,-1979369186,-1966986557,449284824,-336033082,512447454,-628685511,87629449,-253181093,-1957604353,1577400094,-1990795641,1493514014,
-488062117,-397258242,-387259030,1994981101,1952013055,-446896045,-447158228,-385649342,1340604512,-397195547,-1041759651,39315711,1946131688,-5642237,1927828291,-402426881,
1396965295,1510055144,-397323687,1397752027,1776867975,-396862718,-119013161,1230657792,-1056258678,-1017388171,-397192623,512426053,512296253,512427319,512296251,1515914553,
-1957444775,1392851230,-388331694,-1990459430,-2029700834,-3086118,958302555,924748549,-880062203,1543487976,87498377,-1209480309,-842834945,30402744,-385928216,250085833,
-402426881,1397948200,-2013338392,1240579034,96142195,-561553846,1943681878,-48330476,512318214,-709163273,-115439287,-338000122,-561553898,-115439274,1238743814,116858505,
512350855,1515915005,-81884845,13887494,99111514,-381593344,-964034016,-657407990,-1031081846,-796206896,-216101949,116760582,-216102461,116761094,-216101949,16482566,
-2130087392,-1994391317,-1022954722,542163841,116596361,-216101949,16482566,-2130087392,-1994411797,-1022954722,536920961,116596361,-1967027517,-771730162,-1979255538,-1023315256,
116590335,-1967027517,-771730162,-1979255546,-1023315256,116592383,-1077506877,-946948096,116596363,-1979217370,570881302,1427016386,1927991808,-337063420,-1010397448,12568204,
-1949856072,-1962478818,116760809,572969206,-166819321,-183623162,650185222,-846526584,-1950103922,-1612000791,45210251,-754720045,-489487183,-2130414690,-1994391358,-1962478826,
-154498347,16798982,128980084,-2135898078,-173872942,-754732794,-216661526,61915910,-922564574,-388841296,-1324943966,32166658,-1022954730,-956282720,1678064390,1946565632,
1008497426,-971476476,33576198,87885511,-960298848,16798982,87885511,-960298688,21766,1929657539,1426519567,208929024,-654966492,-133761374,-983701053,1437664036,
-157097482,-1597769722,-1073086379,-318051468,-2135218312,17204226,-1157401600,-885325504,1258517151,-167064693,-92205960,74580168,-1023359046,-768359522,-1614203965,-963843861,
-1900543809,198413255,-1955826478,637989662,-174051446,-153056762,1427016400,-165770752,-1964498426,184230652,1081363183,-858601262,512487283,-2010773773,-217645265,-182024186,
-775255290,-152448535,16798982,-494860683,116064259,516737,-1411126831,116826364,116604555,1049209587,-1679096077,116596363,-2010150874,-1912146650,2145960902,-48888834,
-82429178,722039302,1040644886,116987647,-149487810,-1008475642,-811341741,-397163685,-1017439961,1899921654,57933824,-1023084055,-1979700832,-754980656,323049,263454720,
1218580685,1009300480,-1274187262,1963408464,185383175,6819465,2696840,-1982100230,503533598,-1912602438,270436826,1295301381,7085705,-1990769477,-1946128354,-1946128882,
520122894,-1157614872,12124696,-1178497536,-1943666566,637534863,1284769735,-536558717,-1898214159,-515315517,-855526149,108521495,-397632581,1676226271,1290649138,-1190767685,
-61669366,126397486,1975519811,-1014801418,-1007689712,788479695,1422591744,1226859880,1344294210,1869836901,543973742,1886220099,1919251573,1935753760,234840937,1936876886,
544108393,825110851,1866670128,1769109872,544499815,541934153,1886547779,943272224,917297,1093481778,942502512,1397312561,1375739988,872021,1145130828,1095958562,
2245974,1414418243,573308941,827609164,860730,1313821268,1381236749,222709327,1497713408,1129512992,1313162578,808202272,864300,1377718428,-1912602438,270438106,
171632645,6952584,378063614,525992030,1456446808,167796384,-1609468480,-1073086358,28576373,11540173,-922877324,1587594078,1958742528,-1564462584,61866078,-1604888893,
-1073086358,11826293,-1073080627,1583285108,-58698813,-2147126725,1014121980,3022475,1977289539,1312078611,976100017,1124889639,-906051330,-1070402443,852749147,-1948200732,
-1618268456,512295171,251527275,-389021590,244072708,-521469843,751076944,-166677701,106150883,133617667,-864790273,7020169,7151244,6950654,-28111637,-1576569400,
548405354,-987843861,-1979684066,117382919,-1073086357,-1602682252,-879958990,7216778,74637114,2133116158,6956680,-2005549046,293071195,539897886,589439250,639968279,
421015858,337580816,756100886,1364405269,1315749462,788270769,1960852140,-906082807,-1070402443,-1406270741,-1017423522,508037959,474815819,169615184,41092724,307364214,
240090963,209126773,471670303,168496141,1381061532,1946631248,1963801677,1862727178,57999104,-402617368,74711596,963968828,578030652,-1186035781,-29163512,773617865,
-160102598,-645144112,1364126137,-508035282,1444842287,250135296,-401675516,250085438,-519182336,619185131,1499093001,1354997083,4800138,5119626,-1275067975,1477496073,
1911051203,-1579008,-397163685,146014312,-1017442099,-1962937368,-1010005272,5643915,5643913,1307071388,-1013097728,-33532000,-1974418488,704653582,-33532146,-1979664959,
-1979692738,-1342157026,-855002080,1444317968,-17660416,-1261764914,1477496066,367547331,1228835328,1327401472,688818688,-1342130944,-855002080,1380997904,-226045045,-889270530,
4800138,281871028,1405311066,-1979666094,-386692369,112459803,267063501,11620947,-141890678,-1275065624,-401552121,1532624924,1173699,2692746,-822162690,28364286,
5193354,4825283,1252000747,17229824,646586485,-58720184,1377268743,-2146959174,41026300,-466426160,-1910578441,72262618,-1664919009,-1169141165,11796480,-997582899,
-2144803712,225716476,1963508982,1946265612,-350703091,-350506490,-384191998,1347991482,1575554364,1532647439,-1824734307,-1791205260,-583252364,-471316876,1958742734,1019805240,
-1171098870,-487194608,-1031679862,-397277613,-399712862,-397162799,260757580,1913649536,1125101826,1599813515,-67062445,763929843,1543205608,-1075713597,49020848,104464560,
1906442353,-402426880,-1863843746,-1101806658,179897939,1455816192,149440176,-578137637,-1410858825,-400510956,1582947067,-1392750250,91537418,-352316440,-401755915,1582947047,
-32455037,1540257225,1012318443,-1342016243,-623777765,-1605319842,121372744,71042164,-1070464397,-1017593846,-1230123693,-1979665896,-1275049666,-1609511678,-1073086351,512365429,
243925071,11862057,281872820,1543376360,-402148413,158728128,167791776,-1291684416,106151536,698353077,-1339540480,-1258130383,-1974251510,-402633186,1448804407,-61798735,
-1665135956,839021910,2484416,24485214,-906077874,384362613,-964469248,-1057073136,41040444,-838979408,-1343699083,851663869,-1073065024,548406901,5185162,41225532,
-1185866832,162791425,-1023536947,281871028,-1966908583,-1258272498,1210485248,29685248,-847248524,83656832,-973207182,1913060480,1371930114,208940092,1506632168,-397285238,
1081392476,752627176,359935036,181226984,-1342016320,-444573312,1374161411,1958559720,-602871773,1949056044,-852432884,1372097113,1958554600,-604182513,-853481428,-346427254,
-1101666042,-1963881895,-1979700954,176104645,839546048,181799634,-337218095,687636507,-25162636,-2133167356,208798969,-25111573,-2133953784,-915207943,-1073032822,1048584308,
1946615880,1007071580,1951446018,-30886870,1976106697,-2134509908,-906093195,45160939,1948843136,-2134510071,-1040315020,-906098197,1971373558,-2000028158,-1593824986,243793992,
378077256,-1053163447,129505908,4956928,1302578310,1327925248,-29693952,1336017780,7268352,-1275049312,-1022309115,2688570,646591604,1346109512,675022708,-1729559692,
133988541,1353712757,-192930581,133988354,-855768459,2728528,4728456,4785863,770179072,1405310976,-1292051736,691961895,41166848,414601138,5193354,-1979711303,
-855198527,47632,4800138,281871028,-1185738773,243859456,1218445385,-855591936,-574756848,-386348568,-1645676662,-389850116,1534393764,1371406513,1212055552,58000896,
-1967319319,-397322708,1081392084,125054012,1506527720,1498540170,-108375215,-8331894,-2146929408,57805051,-1273967744,1527827723,1958456296,-1146755069,747134553,-28964748,
83460289,113687922,-1023410097,-3973543,-16757450,1006652214,-401574868,540855166,-1973872525,1978159560,-399739717,1009572422,-401378260,272419686,-1662450830,-393586244,
-1151670191,736629108,1340615898,1930443979,-1973790231,1498501840,-2131654054,243863526,-980811701,270852304,-444546550,-790245369,-790245147,281147109,-847248524,1408109184,
12048522,1302466340,1311672320,1328449536,-854871040,-3974384,1006655030,-400526292,-1073034502,440163188,646600563,-469106575,423363700,-1973793933,-504868144,-394562374,
1009572274,-401050580,-1073034542,646591348,-533069783,-1973802126,-1041739024,-10783558,-402626506,1009572238,-400985044,-1073034578,41222320,173613232,-1578610200,-349342534,
-1143609085,752446952,1019908584,1509061408,169928064,1372097256,1958380520,-648746993,-898045908,-646766532,1372097113,-444575399,1745783055,28596480,-1990586163,-2046798314,
-19988750,1049252810,45350985,-1017442099,-352276400,548425731,1347637660,1492794856,1745783643,1913058816,41221888,-401996619,281870772,-1017602727,0,-1,
-1,-1,-907502512,1397454075,-963882415,-1912602433,922691271,-14286724,637566518,8128199,-1943644936,-1912570354,42053830,-1291816442,1228835459,112896,
281872820,12568204,650612224,8259215,2080804646,1522961920,1486707545,-1178736445,-385853792,-1259800974,6678713,1450569226,-385160694,646598772,-499515351,-109033358,
-1606192358,-1073086351,-109050508,1396142873,-822152822,1049283326,45350985,146018509,1348145357,1018787816,-1341885396,-402134272,-399714238,-397358746,1479137338,1951973386,
-372995582,-1863715310,387258,702031336,-668931901,-919410648,-669456302,-919934932,954778457,1955937465,-670504952,-339725603,-1188435963,883097520,882950912,1958742528,
-920917968,695405116,448419411,-466464170,-259268399,498401070,1532937046,1062614211,1280722518,1918266198,-2141816746,-1873377194,-1171920554,-1979697733,509447,-1946837015,
-385861858,966790854,-175314688,281871540,1961101904,975079692,1009682432,1058441472,-997566464,-789133058,-1946848279,-385861090,1017122458,-178198272,-33538400,-178722368,
-33538656,-179246656,-33537888,-179770944,-33538144,-180295232,180913384,1007842496,-1269533948,1102795520,-1965554944,669604615,28988405,16890114,-100659269,254078190,
-102644934,-1020130333,-28253814,-338152761,1962871532,-1143502310,79233089,-722053120,-388963838,663224947,-17309117,-68651574,4300891,-369827351,552122719,1955937464,
-688855032,-339725603,-1206786043,1168310192,1168163584,1958742528,-939267874,-680328132,242483624,-922873676,1085538932,-385822488,-1152125780,-1073086394,-1975320204,509447,
-191174309,1448431772,12197463,-1898279424,-1593503714,-1005977498,251595124,57999462,-1610602520,-1073086412,921174900,4562944,57982986,520120808,1482514015,113692573,
-1593835419,-1073020826,-95283084,6620918,-1173916161,619446369,113766140,102,1405311739,78926417,173019341,-1995672348,-2013251042,-1996473298,1476411158,838874784,
169440452,908495076,-1995344896,-2013251810,-1996474066,-1342161642,3515135,-1017423526,4635475,1962950528,-401558521,126353425,4161603,1085540213,-2013264664,1388534535,
-335412806,-922827742,1522829976,649411,-1174023240,-346947580,1712753464,1962019328,1694942727,-236192000,-958469949,1915091587,-1075293678,1911041237,189946314,1510438354,
-369148951,-790054893,1227519,-147530568,1694955249,141950720,4438608,1492039344,-301972806,1978582154,6404615,-301789972,1712752986,1694942720,180551680,1497451866,
420501776,1494243674,1494243600,1499082000,1297757200,1158699329,1494243674,1494243600,1494243600,1666866448,1497451866,1499102224,1494243600,1494243600,-1441769200,1851437402,
-1424991909,1499197531,1813010704,1980782940,571496796,-1675463230,512316240,394790121,-970079357,1128464391,-968675448,-2008875001,130433807,-1655153920,-1365710397,-2134680744,
41255162,1489175218,1503577222,1522752346,-2084349605,126496451,-1950101258,-2096830178,-1950143549,-2096830178,-1950141757,-1979389666,-1023398009,-967747754,-1526382842,-1090195266,
146343232,-492504064,1583307261,-1152298045,145818944,1965047680,-906083571,1556018805,88653573,1421742315,88129285,-1493432143,-906090635,92993909,158598202,427147274,
1963001078,-1962636780,-2012944098,-1157615225,250108404,-339725824,1509866247,-117439256,1405311833,3022475,1960512323,-1144825086,1129514323,126486705,1140119016,-160052738,
-873976144,-1014801420,-163270647,393535751,133583024,-1341098720,-2146961854,1102055797,1967130614,1531817986,787785192,172165002,-1007323712,1970226720,-13736850,1394606093,
1886415211,-13736859,12124173,1376684032,-387272699,-471204163,89308158,130418570,1975519744,-213456891,-487997430,1376684286,-341579515,-1963013912,-1325389522,-387076096,
-1209401711,-2041554690,-196810556,5705354,512477694,-1886911255,-1427570638,-997828354,-1963439639,-1325374930,-23861248,1659399600,-22025986,-2013240416,-25106169,-997830568,
-385874968,1793654401,6536181,58002748,1006953705,-1023315168,-397211650,-27525491,-17533760,-385402680,-2041051963,6464196,6398147,57982986,-2136151831,41286626,
1369571762,-1564410363,-896924336,-2139037312,452264425,-2132705079,1947255542,550076419,167796896,-1325239104,1976109569,1594291721,41221888,243810481,-4913848,-756520784,
-400061699,-990446034,-166955775,58032577,-1342165016,-400561153,820510771,-1946651906,-167450338,-2130693753,300419701,-972721407,348166,1638007216,-35133440,-385808442,
1069284794,1161477,365757364,89373635,1392513465,365757108,48825203,1587567361,1975519744,-1522565114,-373037451,1637919785,1958804992,-1564462581,1621229665,-439490304,
82386571,3246070,-387287679,535298107,1407380225,939549115,-1962052313,-167450338,-2130693753,-1023314597,-1263801879,-1840897,-997830568,-385874968,652803405,-33060864,
-401902399,260635997,-44570429,1404768138,-33508091,260587977,365757364,-956480280,-389873401,260767037,1404764341,-1009188091,-1628962380,256255,-1594026775,19662160,
-1144848013,126485841,167774150,-1023314752,1929382632,1342621191,-1073086459,-3938109,-1040316534,-1996686104,-51386353,57937722,-2134654966,-579534785,190544,1404814168,
16824581,365757108,1403000178,-53745659,-823654520,17286908,1962526974,-2134640639,91555068,1877547186,-1423578709,738545824,-373286399,243796115,1525220689,1594279657,
-1991049216,-1962586850,-1996271594,-1962587370,721880078,1225689547,-397258491,1499135652,6332507,1946599434,-1262318078,118869251,-1174369816,12124165,-42645248,-386239158,
-1094516618,-1937046189,1621098506,-1665136128,1343059281,55988563,-434706215,1482381662,74776892,957579,1958742534,211061518,1959329280,1343654660,-1262318077,118869250,
-1655106958,512428917,-654114768,1478396227,-444536573,-804919216,83656792,414319989,-374688279,-397694357,91599347,-352295776,-1041700861,74825738,48955824,1688338608,
-840922624,-607272171,-134091783,-1952648309,-1979407090,-1564396861,-947256153,-578100174,1939734322,767755015,48955649,-469056725,-2143482504,-1961528832,46433246,85417449,
192479360,-997990773,501213442,-1577025531,-1514470234,-2146467836,-13443445,-1014969472,54068934,-641275776,-388330669,82314986,1579059653,-400510716,-396636389,393523552,
684732904,1389996008,742131594,1290274165,-386798671,-1993748450,235092766,1348331960,55588607,73283327,991857611,-397163773,1815872782,1279003252,1899759220,1362887284,
640074587,640034342,640034342,640034342,640034342,640034342,623257126,606348581,589505316,572662306,539042081,522133536,505290527,488447262,471604253,437984027,
421075482,404232473,387389208,370546199,353703190,320082964,303239955,286331410,269488145,252645136,219024910,202181901,185273356,168430091,151587082,117966856,
101058311,84215302,67372037,50529027,16908802,257,-65536,-16843009,-33686019,-67306244,-84214789,-101057798,-117901063,-134744073,-168364298,-185272843,
-202115852,-218959117,-235802127,-269422352,-286330897,-303173906,-320017171,-336860181,-370480406,-387388951,-404232216,-421075225,-454695451,-471538460,-488447005,-505290270,
-166993695,-621346183,1030805291,-397198732,1939610768,208332803,259576331,1915222659,57908509,1527528936,-2095730199,243129082,-2094611837,293395194,-1174400024,233373658,
57908480,1527520744,471853251,-770968597,-150832740,244186,-1031675181,-628662222,-1659034136,-320273544,485287948,1913181417,-1878151159,-956624919,126484487,-1996905240,
108380935,-393213264,1515778153,-2134663845,27198,1394479732,7020229,1526742912,-972720865,27142,1605333737,-306255522,-2007297931,-1157322954,113643520,-385613061,
113710376,1189,-2007297853,-1157322954,113643520,-385613061,113710352,1189,-304718653,-419508547,-1264165029,1885290806,1640981257,-864611964,2051237419,-1080764955,
1818913110,935134639,1199926534,-978565349,426143783,-1223206686,1340109649,309237645,-1546094845,-687194768,-858949085,-858993460,32076,0,33024,0,
33824,0,34632,0,35450,1073741824,36380,1342177280,37187,603979776,38004,-1769996288,38936,-1138753536,39742,1797783552,
40558,49872896,41493,1136082944,42298,-727379968,43112,-2065225216,44049,-434047872,44853,1604923808,45667,466206468,46606,-1564725563,
1073789233,191576694,-402604962,-954006391,1644216330,2028717484,2055258925,-685328617,-1399798184,-2038943122,1471531527,1746288394,-308097751,-1038364980,344313939,1498505536,
430363652,1873131920,537974565,-879810572,-1811228082,1060731128,-1190339071,-1895311562,1733288225,-221655804,-2128354231,1870413893,1891035004,-978474965,1290070813,924389942,
-534974907,-2065738045,1813180790,319526458,118945050,-1748075575,1222441024,-1111352645,227146608,1989759157,65302,0,82935808,-1710981067,612571639,1971536739,
-1450930739,75662207,-2130706432,-2092060446,-2096008694,2134181108,-2144243176,625304878,1682186531,-2147471316,-1921080122,2051014659,5960464,1316134912,2328,-388717296,
-402653184,1525878,199491584,596,1000000000,0,390625,-1769996288,152,256000000,0,-1609612736,655360390,-400093184,167797763,256,
-7307264,-1,-32769,-1,1006632959,125909162,1952024700,1999017952,2048794052,2086883422,2121661978,-2144243176,-2130706432,517470981,-1725536890,590633095,
-1520574073,1225776006,-1277754749,33117,1644462464,1350468405,2038320164,8366761,193003520,-2089923004,-42065159,-1631386813,294,858927408,926299444,1111570744,
1178944579,-1146471494,1927840056,78028810,1014204476,1265788988,77805311,77936383,-1978638104,-2117828382,-162520204,-2147178746,839926760,300345572,1348098904,-1157322520,
-1914150377,-768386286,854186634,79987466,77932160,-385649536,-466478959,78063240,-1089340951,865076387,-945029952,-1014956027,1964552168,-1528895229,-945029949,-1014956027,
-844358935,-1523154759,914391044,-377486159,-1160969334,1525275015,-2017735420,71821785,870890701,85715225,-1310074489,-1984049915,-385572066,-1093859221,-796157870,1510534888,
-2017473085,163047897,-645414707,-2129793559,1971323131,-389952237,-768407341,-393183045,1273496581,138799386,55827447,1476686042,-855533079,146139330,-1556676774,-1523122428,
145352708,-353805733,1388546819,1918561015,-371684603,-1009974922,143779923,-1556676774,-1523122428,142993412,1391024731,1977289481,-1489598452,-83442172,770245634,-1558279919,
47108,-1845189213,58310667,201326522,-955876901,-16472826,-1556154369,-371684604,-645463766,-2028415000,-397163559,-2091181499,-1950153533,-1962630378,-1023105778,434656156,
-1014801638,-389833468,512343723,1743324323,-1096685558,77799049,-854956567,-1961391164,-385875297,-10615987,-16473290,-16472778,-2017079834,413198553,-389817977,57939812,
-1012689943,-840377721,-1245695488,-1144599144,-930478938,11874184,-802191293,1942474192,18933763,-645208694,-401591319,861142674,-1558279717,-1987987708,-972774114,67304198,
1528038632,50005702,-1047805180,1939006199,-718935805,78363587,-379275334,-1413808122,1689893380,77838930,1914107880,77576707,852331203,-2029458451,50045146,-53965928,
-74714485,-695491341,-389816437,-242497482,738065291,-1527561782,-812918133,-1664877503,-389833399,58005180,-844960791,-385648440,-1549724029,1958742788,2030153734,-1006653438,
-619986893,1539568501,-661940029,50005702,-1558279934,113689348,-1023147269,-369113880,-909246489,-1242998181,103147523,199842395,309516,-1660974871,-1656547446,1127713436,
-1656549493,-1013103716,120109907,1528170216,1361491641,855619048,-1563767360,-1262812367,537380356,-968685814,1793667079,-1597256437,166397093,-437728051,-167218153,450941136,
-1019382592,914410957,864027815,-1948387621,-1950213181,449022672,-1010267455,2014708712,-389100038,58201551,-401025559,-806873086,402450712,-1037319285,124784244,-1070463112,
2026094846,-1071973895,1977236419,-371510523,-1031077850,77799049,-739714293,-1869573895,113706617,-64347,12238859,-1174177536,1056440319,-628423517,77799049,-516248125,
38146420,-1732182524,-180621309,-695472267,986855913,1963129606,1965832937,-796244251,-1912194388,33846272,182250434,-1743752000,9420689,1955702515,-1963982074,-1949766718,
-1950131242,1261341683,-1091830780,780923787,-369360036,984416269,1175549153,-268199764,1005585325,-1947240978,-749475362,50005562,742058357,-1404639883,9307706,-1073029259,
-1852305804,-218067009,74748326,-789843965,-1949267027,-754587170,-1021962008,168076705,-2131397404,-2147179210,11589581,-1576755550,-1298135894,1958742532,77963746,-663428086,
78716555,77926016,-1324449664,-863338492,-1482502358,1931637764,-154958318,78095065,78003848,1877496144,-2141693675,1601387001,568916051,78094357,-1144835493,-1430387554,
309508,511245560,1124536749,1945756227,78035730,880019454,79252299,1260376320,-369434037,430772713,-498908409,-166038535,-1191181929,1263206404,-85846025,-16776007,
1124496647,1962467907,217377224,-1609724439,-2145123161,77932160,-1526331265,512344836,378078373,-1581054813,-469105499,914419828,176161957,-1578142465,-469105499,-919347084,
77805195,-1979406430,1942956748,-2032536051,-1507948065,-1814067708,-527772025,-1264786638,180619904,-1964756260,1959332860,435782470,-1986194830,-1979407562,621061926,-1005944705,
-1023105630,1913190784,50719004,854821520,149520603,1948239094,550273232,-863974421,-352067040,-607062002,-590292271,1964033270,-1644961043,-869653127,-233053814,-1021651317,
796121226,78059254,-755510026,-989932554,1967268213,1975778846,50785050,1943540438,-1509491188,-804686844,-790965797,287631836,-385046039,635964520,-1314864365,78094852,
-166942743,-16472570,116846708,1962869938,-1323398171,-185341948,78716553,-133913413,-1156341272,-386399056,922686362,1592263846,-1509519595,4241668,1359539025,78298104,
-1961658392,149718012,-1107103869,79234224,-1510736640,-1190889282,-1430585340,-1375930364,1128466201,276036066,-1962933063,78299124,-1952058372,82573542,-116865917,-402350405,
-497478856,-1526270282,158629892,77989631,132712821,77511436,-384622616,-1796730831,-2012777198,-385571042,-16118784,2062091125,-195565550,-768345461,-208929142,549052298,
780883200,-1516239709,-337147388,-674105339,1465308881,-266601173,1583285363,-998046485,-772409340,-489434670,2044398564,-1509491190,1560835332,-787765783,-1965829678,-1965651230,
1574931187,319819241,1364677625,-397397972,-1739058608,512433785,-75430749,426970317,-472790133,-654056495,-670833711,512297848,1223361699,-351767984,619204659,-954930430,
293894,2114373412,-1147898876,-2081946498,-401180397,-10874308,-16473290,-402348746,1515913867,-335688472,31975443,-401464344,-396750098,-622329225,-51451903,-1017421991,
-1070409267,-855635479,-972967718,134413062,78120646,632602113,-1946209450,-134771761,-2031595311,-1073063919,113640821,-1979579653,1965440007,-1341658877,1956392252,1948990469,
-68662527,-402230280,-169214147,1638120959,-225717709,8796718,-2130021376,1952554237,-269923036,-1662156289,786813281,1781573375,1784638027,1785162335,1785948781,1782606400,
-1662468046,4319232,1090530793,1374222197,1370454289,1223186259,1499160321,-385899543,-512429172,1140841449,199875563,12380160,838862313,11987136,-401771107,568857389,
1392867857,1527967208,-193533501,72681158,-1534465793,-471214965,1979648520,283699205,-1499413511,1975519748,-154957304,283437264,-454507527,343039487,-1957490453,-2496481,
141712731,-1514186925,-1017802748,19710206,-3868989,57991818,-1977561984,-51516970,1048616720,1963459323,149528068,1465097728,1593859304,-1946799269,-133895978,758911858,
-688454539,725353963,-389873292,24311794,-855998013,-1174048244,-269778945,702544,-2141527305,-164482838,-538193917,1465057548,484968309,-1878660352,4647056,-164406433,
-1108814197,-389856269,-109572008,1956409321,273606705,58021499,-845382679,-402294321,1223360575,-73268048,-1524725246,-1491171324,-1558803708,-1574532604,1087143940,-377435264,
501747157,1965388560,-1672812285,58314957,-1342173464,50045448,-1616658381,77701892,-1957276989,-402349290,1516109955,267577539,512427385,-842857309,-385649199,-1499423720,
1922055172,-385649615,-1516200954,2025851396,-1677924093,-1157627718,-1964474368,114026747,-1173238296,-2135228416,283961488,-538377356,-2147435621,-1516229141,-1665136124,2133067129,
-1174100574,12255232,-77076352,1006937760,-1660521072,-1209410696,115861659,2040388235,-1982073086,-972774626,33749766,853226435,78102244,-31546,312976,91869707,
80141047,-1965127040,-958952718,67304198,-855094295,78029014,175423498,168080032,-385583680,-1950150920,-402345698,922743002,512296102,1458046129,-1544516847,2025522342,
78816004,-1962628163,1958742784,48940,9162635,-1957485577,-2116090914,50632643,1107391239,24363267,-1962440382,-8168502,1191474182,-1948521657,-1615113279,1526761732,
1946615427,-347716092,77446846,506365,-507508052,-2147126021,537173518,168076704,-1509519424,-1156614140,79234206,1125634304,-369434045,117312537,-143326042,-402137623,
74714739,58064650,-401710871,244052026,-315489115,-1979407455,1381061629,-487108527,-145175925,1942488035,-628407807,-487106470,24365059,1524237122,65205848,-787647528,
-19279397,1963238918,126937347,158990090,77989630,-2081880203,-774778617,-1965716781,-1965061389,200075745,145773507,296747634,-930420598,1223203921,1958742530,-1660126974,
192630873,2035814404,-1660294374,69659481,259610631,200730704,48269912,35028705,34401256,986054341,1912845800,-18314740,-352145211,-1245380092,-20382205,-1672455224,
1307101490,805815808,-398261899,-2142568216,-93048769,1949187968,1486701313,1352412020,-1274167320,-1274905787,1126664260,130456920,-972719829,-654955257,-989974604,-93124052,
-2042414588,1124567492,509507,-1262757497,-838941948,512300665,130417490,130433838,1975909936,-919387144,-838984981,130419829,1377732910,-919387389,-906097941,130418293,
61948716,75566729,-1123699517,-639081995,-1769263361,1162149888,77805195,-1057083472,-93064661,126415363,-1556707005,1976368644,-4790051,-1023408186,-1107099207,116064262,
-1107032903,-1279328252,1958476804,-1558803614,-964012540,-522984398,-684793722,-1964846166,-294302003,-1157626426,-27720525,809468105,-498924683,-370621448,1366784780,77577811,
-1190876225,-201588732,58058917,78756691,1527643624,-1090212930,79234207,-1510736896,-823655564,-1508996596,-1192656892,-386344458,1499136858,-1335777602,-13703159,1345302608,
1354825304,1929417960,10742007,1963715416,822593033,805815875,126354155,-922855357,-1101932683,-1547762529,178436,1504048124,1364404715,-401663768,1532625777,1947048424,
-1524725493,-1558804220,208922628,-1293418064,-1524725501,-1558804220,-1336190716,1642904067,1358874600,1592283731,800087309,-1057073072,236447824,53409651,771752086,171538,
-398113467,-2024272584,126376917,-922855357,1111674485,78965387,1375646697,506198,-133914689,413937404,-102611195,1371756894,-1090517063,-50854753,84978734,1509548615,
860967875,45832191,78028894,-1073031378,-1738601356,-1957169109,-281876272,1723590891,210298976,1930243560,199682054,-396931233,527567792,-396330309,1491602574,153901308,
2146876240,-401838616,125177175,1477163496,1481687294,-1073063079,1532582083,-1144799222,797574324,646586545,-990509949,973960224,1965732329,80016903,-376831371,-1075310712,
-1120766734,976118181,1946157190,-1661107959,1294365793,-310251285,-439262820,1638334254,1970304368,2037414256,2037414256,2037413232,1013988464,130435952,-2094626256,281343492,
-968162188,-990501881,1258648836,-315478136,-339735869,805815814,1976106563,-1981234184,805816061,1976106563,-1262763019,537380356,180480083,175742043,1395460038,1527573736,
-968687348,-1013108729,-571942707,1124627967,-1157625914,-389872460,309922504,856096953,75736000,75566729,-369271064,2028601137,176285948,1625883513,-1023314529,-805001568,
113660136,-801110874,-1157323242,166200491,309517,221767761,78321291,78454411,1526184936,-162797477,77991678,-502631335,-1073456925,77989376,170912195,1462091455,
-972773185,753402117,-385649398,125432118,175505162,168006633,-385649153,-620099059,1048585849,1922630822,-1628575485,922702674,922682531,854066341,-396731647,1038617434,
1952078603,-1630410493,168076704,-1089898048,609710532,77963903,-880782765,922721407,922682533,48759971,-396666367,477432618,-768388270,-393215813,1515916062,1520242297,
-1875055781,12309043,-149755519,1393457565,19916882,-974601590,-799319550,-1559851048,-1526296828,645963524,-1635842907,-1329658765,1381193597,1510020584,-83629989,1408271849,
16771154,78780041,77792967,113704960,-2130705243,78786257,1532626803,-555199917,-1308166150,1962934020,-396666347,-1914172383,-87300086,384326490,176351244,1532679915,
-1508996413,-1192656892,-638174861,77904796,100234,231304,211599370,25659520,42452480,-1667385344,585630585,-387108352,2040332306,2549763,77465286,57908480,
-1023296023,-386378927,1499138426,1405351650,-2096848965,74645807,-135576765,-1152138405,134087839,-347929739,-1966908423,-2147178994,1098094825,-1952654858,-1962630378,168076574,
512269531,113640615,-2137520986,-1667399477,-360511879,14385153,-922030798,-338688396,-85796143,91856797,-33393342,91463107,-1444289486,175742465,-738798857,-2147368317,
-1312620333,-1509021032,-1427376124,2114479848,47697,-394198853,158665150,77797001,77928073,78028995,1352171564,77989574,186378368,-396265797,1532625432,-401927960,
-2017785476,34269281,-1847043238,-18326795,-119937014,451435354,-2144224268,-378398534,-185992803,-1805850212,1356891807,48955824,1436729394,-997828604,47774,72556169,
-370670732,991857091,-1817384957,-477374603,72562315,-847956167,44534354,-2091757568,-2013920061,2021720063,178497,-1074557956,-1510800221,-162310565,-16493306,1455296373,
82805508,-218103111,1958752933,-263460861,77839967,-67108167,-1956731405,42765076,80118528,-263591850,-1014814741,1125092100,344677955,72681206,-1962510849,-352037354,
1892745988,1377077557,1128470411,-1511500968,710499313,-249567035,378080116,-779419602,2095698823,-1981576294,-1962719970,-2147271906,158673983,-386509336,-1813381310,-1700206189,
1465275217,-1153846702,-1514208098,78036484,-1185736213,-772276220,-498908393,133585914,-30837440,-30772212,-165251894,561577733,746643573,-2145749496,360057066,-1190878018,
-201523193,-1641643868,-1091887100,-350220416,1583307474,58087771,-385583895,1049233088,79234214,2027620864,-2146339551,393349359,-225780086,-466430838,192211938,-774582024,
-19672878,-371296817,1049101985,-2081880922,-350172156,-1505851148,75032836,190547,770229083,67812096,-397210389,-1017446398,-1157619736,1048577123,2013332648,-971868921,
33859590,-1330675224,-1349916659,-2065167696,184337327,1644412671,116787828,2038432935,1644936707,1913027560,77577992,-352320327,80118537,-1190878273,-1523711998,-389808926,
-397211379,-1226307711,99113975,-379889152,-1976633427,-152528889,776163336,-1549596789,46367492,-1559786706,-1014823771,1499092994,1360819272,-2024583086,-142350119,-1959898277,
-1618268649,-353894398,-1014801423,-1008801020,1944637523,17426691,-396315973,803735254,1527345671,1274749928,-1020983354,-1257901080,-1258130672,96331783,82314100,1064852474,
-989671286,75630122,-654965383,855294696,11659465,75577087,-119871406,-2130276518,-2127102204,180367876,-402230078,971569843,-2130276360,-2127102204,75603972,-1979550999,
75604176,41205770,-259340034,-930430462,-1070463880,293193866,1397903696,1527097832,-27764390,-1963886400,717392609,2042954433,75669527,-956671256,512306695,843252562,
717654729,161606085,1376027296,75577087,-1037384406,58245378,-386255128,922681383,1374160001,75669752,75564687,1515765770,512427893,1743323986,-20839935,-402425656,
1542060559,46500353,-20895038,753437376,83656451,-1597470205,1076102275,-930479499,83814595,41027508,-924315468,1962498820,-397389047,1532688651,1352459914,75568779,
178058762,-33393454,-1645083958,116787572,1963197571,718208514,1357286132,1323893624,1347441408,1476714984,-143276802,-402341912,1347946382,-771750983,78047460,-997584782,
1622326168,1810421763,106293253,1857752811,-1731949984,1407768579,100198405,293100376,-1040295592,1347637329,1476697576,839052123,-1596131612,-536738686,-1073036034,116787572,
1963197571,-1966277118,1489580780,75577087,-2110879664,-144775164,2128874072,-389772795,-1554450113,-1073085311,-1974793099,1949187079,512312065,-1655176366,-1006496398,75638410,
-469056470,116787572,1963197571,180420098,-162862912,1206507915,-153056768,62144708,-466484619,-1996192861,-1979416306,78953440,-165673018,57936068,1395328966,1526970088,
130418809,-488090835,-968664315,-773312505,75735299,75566731,-1276574856,6875645,-130291629,-2013039525,130433839,78887680,1379830595,-2129229053,75669508,-81009614,
1131739179,540805002,708634228,28631668,-397388981,-466425110,-160158404,-227267780,-294378436,376778812,-355145661,-347402125,126372611,1961101912,46433272,173585387,
1543206116,-1020983354,-1979415647,-804866612,-2129228824,1393259268,-213522350,-379928526,-963969473,58197292,1391994600,1492507368,1975519824,-922858751,350750328,509688,
75564687,-385918487,1836319467,-1549726599,762628,-1576753760,195100685,653733376,-125083029,-1607546230,653681261,-939393013,892974,1797715502,851968610,378220224,
-687644050,1881049646,-1562832286,-2135948121,-1996183902,-2013263082,-1342173922,50045444,16497641,-1279590400,2144516,1128466179,-31130910,-352318557,186026913,220105216,
-1329581312,78029440,78063240,1408995305,77511505,8390529,1929380793,-12369138,-502762233,-1509490952,1495257348,116793460,1979647134,-1624866811,-1514406396,-1979217404,
603980455,-2132508545,663281674,-1869560997,-74913392,-2132745088,477331652,309674652,1975778973,-607061741,77989630,-376436107,1973287786,-18710525,77839958,1178997897,
78069386,-2139102335,478732042,-242498722,-1962625816,166220238,-2146864638,-1207654850,132845433,78003840,-402228840,-806878720,75938564,1493455336,76463953,-402356549,
-2034564043,73263108,-402522648,-2034563918,70576132,-1157497880,-974650220,-2096925951,1474823403,74799364,-856964610,1978198411,-1009939708,77932160,8841343,-973036056,
2131014150,-387144728,468385924,-1516114587,2013036548,180552051,604600768,77963903,1350414520,-1610589208,-1073085274,109053300,-402520922,-1314848671,-2097381372,29685404,
1084752501,4843676,-1157008227,937975858,-330766334,77999744,-402427134,65536256,78029041,192115772,-1156588614,-1897364663,-1157174286,-957849036,91594234,77936256,
1673249664,33613922,-386856728,115929543,-334960640,-402449943,-1528298579,33614071,-1023163416,-379571525,-256376354,-1523122237,-1556676860,-11081724,922704730,922682531,
-102234971,-13834239,300505691,77963758,158973962,1467855039,-1516077276,-2114158588,968821874,-768387205,-394198853,-1564807696,2131344176,2013389288,2067971898,-1556676777,
-1523122428,-1277707772,-394175045,1515973733,77805311,77936383,-1157520408,837313097,-10855430,-16473290,-402348746,1515913616,-1142051864,115958354,266058490,-377402949,
-1833243611,-2147042550,-387176215,222081111,602407797,126496433,1975519811,-1614822418,309508,-67108680,-1195136013,-1549598720,77964036,-411506493,-1549726087,1958742788,
2030153760,-1009191396,-1499409203,1958742532,77963280,125091850,91816368,214161654,-73350399,-33014782,-20382008,-236403768,1393324799,-396268869,-303562546,868441066,
-2147435566,-1007964952,-1140860952,292708394,-840431381,1614461951,-1410857102,-260708352,-1523122237,-1556676860,-83442172,-1662515198,-277813248,115891034,79283185,1125634304,
-1006968253,-788527943,-498382049,-1887386630,-501219326,-1329872127,150568964,-1185864078,-1430585337,-1977120252,-2013265529,-136166649,126402610,149520473,1948312704,-1440347943,
-2955004,259311882,-1209468847,-2013898241,1963982850,-1010834759,-1090216002,-1174666069,92995588,-24868443,-1007164673,-1190888257,116064258,-1190889281,788267012,1135282059,
-1946623421,-1018475553,-352015425,77578218,-1413487125,309508,-201531769,-1008826459,-1151904943,-1413544801,309508,1610607080,1371756891,-1413785773,77577988,378137579,
512296099,-1950153563,-1962630378,-1023105762,1929301992,9038143,1408096232,851675735,2013570310,2027620924,77963536,1064485675,-1549715595,-339596540,734235408,1912907014,
-1960413906,-1559876670,1965322756,-339725796,1206632522,-1863474200,839355280,2030347526,-1524200941,2028210692,167882758,-1339233344,669776383,178513,-1516183929,2042628612,
-34109694,-502893145,-352276229,-1341754611,-339736063,184528901,1599732160,-1313094821,-313071612,92967056,41486130,-1185827861,-991231996,-396230725,-1746338062,-972327425,
33749766,77792967,784564224,38443,43915822,166249216,-1610057474,-1073085275,-1581052296,-1073019741,-389869192,142147060,914412237,-1015020379,1023714209,175472640,
-397159475,-379851301,519569382,-1144847197,870843513,77053696,-1207957319,-201588736,75014827,-1023104350,1929230312,-22877949,-1618274421,-1178402814,-1511522300,-385649923,
45743766,-24057600,-2030041927,77577211,1929220072,-25106173,45735815,77840128,1944714119,309758,-402350145,57867636,-1174510103,-1547763710,-27465468,1929208808,
-14817021,-385954327,79297880,-1190956288,-1084424190,905905317,-85831857,-1413495979,309508,971510251,77578237,1929381049,77840134,1476395705,1195836815,-1018103070,
2046631912,-707935487,-1259797646,-199497229,-1158021120,-628228000,-762396018,1688387634,-1148078844,-1699086336,787647238,1124567212,1976434242,118406388,-1141239091,-470351808,
-1020535924,-167771973,108392644,-523041615,-1991518069,-1962922978,-853349917,-157143888,12040961,842663878,49914560,-1577056606,1705116779,2662916,-1996288325,-1157428194,
512295802,512426978,-1991573460,1258490398,118405971,-543030096,512316164,-543161120,46202372,-1227846976,1524237056,512481927,394790112,1127712835,-1190862944,-1073086412,
-628683148,-628631293,1128470409,-227161858,-654058873,-922856637,-1962592606,-1962614754,3390231,512350723,1130038500,3153545,54861449,616729178,-1966044418,-1966921022,
449219288,1945668295,-1385633533,-338492495,37537674,12256114,717392386,-1965520189,-1966662970,-385649672,512339274,-628686070,2891401,53419657,512353163,512426821,
-628686800,732773864,1397443546,-444536741,-394273605,-1729561729,-1013978708,1954103840,1713402725,6645106,-257562604,-11351757,-385580746,-133528,466206467,46606,
808989750,540031280,1380994883,1112088622,959520845,539767096,892877105,538976288,1230127440,1126193492,1262699848,168636704,1230127440,1126193492,1262699848,168636960,
1061109567,658751,0,0,0,0,-385875968,824188914,1395470640,1702130553,1866604653,543453793,1869771333,537529714,758263857,1953724755,
1109421413,1685217647,1920091424,168653423,858796320,1937330989,544040308,1918988098,1917132900,225603442,808525834,2035494196,1835365491,1634681376,1159750770,1919906418,
824183309,1395471664,1702130553,1866604653,543453793,1869771333,537529714,758526001,1953724755,1109421413,1685217647,1920091424,168653423,925905184,1937330989,544040308,
1918988098,1917132900,225603442,808525834,2035494200,1835365491,1634681376,1159750770,1919906418,824183309,1395472688,1702130553,1866604653,543453793,1869771333,537529714,
758199857,1953724755,1327525221,1869182064,1310749550,1394635887,674067557,544109906,1431586131,168634704,842412320,1937330989,544040308,1769238607,544435823,544501582,
762602835,1853182504,1413829408,220811349,909189130,1767124275,639657325,1952531488,1867391077,1699946612,1378364788,1394634357,1347769413,537529641,758396465,1869440333,
1394637170,543521385,1869771333,1378364786,1394634357,1347769413,537529641,758198322,1869440333,1159756146,1919906418,840960525,1294807600,1919905125,1681989753,1936028260,
1917132915,225603442,808591370,1699556659,2037542765,1684291872,1936942450,1920091424,168653423,825242400,2036681517,1918988130,1917132900,225603442,808656906,2035494194,
1835365491,1768838432,1699422324,1668246649,1936269419,1668238368,224683371,1378361354,1297437509,540876869,573654562,1497713440,658729,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-385875968,857759212,1261253424,1868724581,543453793,1394635343,1702130553,1851072621,1159754857,1919906418,857737741,1261253680,1868724581,543453793,1394635343,1702130553,
1851072621,1159754857,1919906418,874514957,1127035184,1159746642,1919906418,891292173,1127035184,1159746642,1919906418,908069389,1143812400,1701540713,543519860,1869771333,
537529714,758263862,1802725700,1702130789,1869562400,1699881076,1685221219,1920091424,168653423,808990513,1936278573,540024939,1818845510,224752245,943141130,1766075697,
824208243,1767982624,1701999980,925960717,1143812664,543912809,1953394499,1819045746,1176531557,1970039137,168650098,809056049,1936278573,540024939,1869771333,822742386,
758200631,1802725700,1159737632,1919906418,1330776589,1159733325,1919906418,537529632,757080096,1869377109,1394633571,1702130553,1851072621,1260418153,1869379941,220228451,
67187210,8388608,0,285290752,67266304,19660800,0,285370112,100820736,19660800,0,285370112,134458368,33554432,0,285453312,
100903936,33554432,0,285453312,67266304,-65536,0,285370112,134336000,16777216,0,285343488,84073728,-65536,0,285400320,
251888640,-65536,2048,285443328,50541568,-65536,0,285422592,84104960,-65536,0,285431552,117659392,-65536,0,285431552,
134296064,8388608,0,285294336,117628160,-65536,0,285400320,0,0,0,0,67265536,0,0,285382400,
84136192,19660800,0,285462784,117690624,-65536,0,285462784,117702656,33554432,0,285474560,84073728,19660800,0,285400064,
117628160,19660800,0,285400064,84073728,19660800,0,285400320,67187200,0,0,285298688,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,770244608,-67106759,7340288,0,
0,0,0,0,0,0,0,0,0,0,268032,-1073643517,805330944,201332736,1348790528,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,1105788928,73,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,978452480,
490227269,1082144298,67637280,-15007486,-256,-226,2147426303,85398015,353965074,454037257,33491485,117834771,202050056,-1,51911196,219021846,
-1,-14614529,1633705822,1701077858,-39066,-8061065,-9109645,-8978571,842079231,909456435,809056311,151534893,1919252337,1769306484,1566273647,1935802125,
1751606884,996961130,1560240167,1986230394,745369186,721366830,469704959,606289953,707157541,727656744,1464926216,1498698309,1347373397,-15893125,1178882881,1263159367,
2116172364,1482325247,1312970307,1061043277,553582847,1448432895,1515804759,1750948955,1818978921,1886350957,959985521,909456429,858927403,1212624432,-11796663,1347419981,
5460561,-385875968,18548,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,881322240,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,-385875968,15037,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,-553648128,251798786,-162201829,1105790991,71,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,-1086787840,205120569,591395130,792367162,-616857285,1195117883,-1120088518,1832874556,1212737850,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,170731576,471402015,117835522,0,173690993,471402015,117835522,
0,170731576,1885603455,117833986,0,257052769,421070361,202050818,0,268437504,1073758208,1347430440,1347430440,690825260,689843754,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1213917440,0,0,1213786368,0,0,1222240512,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,-2122448896,-1715633755,-8487295,
-406585381,-26444033,947715838,940572688,947715708,2084044816,2097086008,269515832,2097052728,31800,406600728,-65536,-406600729,1006698495,1715618406,-1006698436,
-1715618407,118489027,-859013873,1715239116,406611558,859773054,1882206271,1669325040,1734566783,1520025830,1021830972,-528443046,-520552712,235012224,239009342,1008205826,
2115508350,1717966908,6710886,-612433818,454786011,1665007643,946629688,30924,2122186752,1008205950,1014896766,1008271128,404232318,404226072,1014896664,402653208,
403504652,805306368,811662944,0,-20922176,603979776,610729830,402653184,-33220,-16777216,406617855,0,0,2016411648,3158136,1819017264,
108,1819017216,1828613374,2083520620,-133400384,-973078480,1714428108,1815609542,-857967048,1616904310,192,806879232,811622496,811597848,806885400,1711276128,
1715273532,805306368,808516656,0,805306368,24624,64512,0,805306368,201719856,-1067438056,-964951936,-420028722,1882194044,808464432,-864550660,
-866109428,-864550660,-871614452,1008468088,218025068,-1057226722,-871625480,1614282872,-858982208,-855900040,808458252,-864550864,-859014964,-864550792,403471564,805306480,
805306416,805306416,805306416,806903856,811647072,24,-67108612,811597824,806882328,-864550816,3151884,-964952016,-1059135778,2016411768,-855847732,1727791308,
1717992550,1715208444,1723908288,1828192316,1818650214,1660813560,1651013736,1660813566,1617459304,1715208432,1724825792,-859045826,-858981172,813170892,808464432,203292792,
-859042804,1726349432,1718384748,1626341606,1717723232,-289013506,-958988546,-423231290,-959521034,1815609542,1824966342,1727791160,1616936038,-864550672,2027736268,1727791132,
1718385766,-864550682,-870551328,-1258553224,808464432,-859045768,-858993460,-859045636,2026687692,-960102352,-285288762,-960102202,1815623788,-859045690,808483020,-956432264,
1714559116,1618477310,1616928864,1623195768,101455920,410517506,404232216,940572792,50796,0,0,808517376,24,0,-864285576,1625292918,
1717992544,220,-859779976,203161720,-859014132,118,-1057174408,1815609464,1616965728,240,2093796470,1625356300,1717991020,3145958,808464496,786552,
-871625716,1625323724,1819831398,812646630,808464432,120,-687931700,198,-858993416,204,-858993544,120,2087085788,61536,2093796470,7692,
1617327836,240,209240188,806355192,875573372,24,-858993460,118,2026687692,48,-16853306,108,1815637190,198,2093796556,63500,
1680906492,807141628,808509488,404226076,404226072,819986456,808459312,-596246304,0,268435456,-960074696,1290338558,71,0,0,0,
0,0,0,0,0,0,0,0,0,1234692352,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,-1526726656,-890664962,-904148453,1461439003,
1696320239,1106791920,971790840,788027879,15717096,1860628992,1409242110,-940530433,1056964847,-904128185,-904148453,-904125925,1821211,0,0,0,
0,0,0,0,-822083584,4739817,635961344,-840381653,1558760234,-18232535,50,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,14703594,792080624,942616625,133955637]
}{"data":[
962081078,1127626290,777146447,1296189728,1380926240,824192592,741423161,892877105,909516832,1482174769,842152249,892745270,1128472608,1347440463,774787666,1229529120,
1296908866,825303072,943208761,538981685,-712132358,1939763430,2066052391,-1625196253,-321780303,1085282931,343007440,1990124594,2047703055,-321741045,-456128910,57934448,
-1191318540,-661782464,78144740,-1830222987,-426790912,-469701776,-2046215055,-2143193916,1014237948,-236535766,551948720,145752299,15409638,568722608,28311787,15409638,
568786864,-1595534928,1890582763,45130214,-1578762005,28311787,15442406,-1578696784,1894158256,-423613808,1021347441,-1103857910,-268238589,-1959858173,47132,12374158,
602144516,-1274442239,386945040,-671016682,-1861175536,524752647,-1335827455,-14621152,-1342150866,-1199512063,1945763839,-1931964895,-1933340965,-1932423487,-1948087342,-1946842132,
856126462,-133728825,-955522069,-1191968396,1894157195,611443856,-423328249,-423328144,-1869827983,-460295962,-1174359951,-17955880,-289885504,-1293108558,11594970,-1326530382,
-1335761156,-1937709566,-1898934584,871773144,-1384073765,-670901246,41155042,-1326186124,-1182734845,28573705,1894158256,1910949002,-426733648,1910804592,-1837775814,-387787568,
-1912586056,-435900200,-435624320,1914080208,-430657536,-1979651261,-1220417855,-348082171,-2143033856,192217083,-670416412,-805376030,-1326126219,-1971263995,-423023677,-1341802687,
-347871680,-469701888,1960321601,-17767929,-185829937,-1912586056,-435769128,1914079616,-1341266432,-1965520129,571896,-301989702,-1326579477,-335484159,-527826709,1960328172,
-498928639,1958805226,1442545884,-75495052,-1341623126,-1328616619,-1328878678,-427760121,-1962954534,-1174893864,-1061552120,15461888,-352210706,15461376,1005379722,-201231144,
-503135613,1958805224,1442545882,-75495052,-1341623126,-1328747691,-1949766742,-1560251874,313524240,-1070972442,-790230810,199639216,-689520464,1102053611,-689566746,1118830827,
-689566746,1135608043,-689566746,7478921,-2132408144,-2118467542,16759040,-1057078546,9435777,-528025995,709545214,-1002771264,-855756683,-2131066550,-17795840,-490435900,
-1160990501,-527826801,-322950418,309707834,1976368256,-348934140,16548074,-1070987916,-1326128661,729867785,-1469979447,-470097648,-1469979407,-470097904,-435506967,-456578176,
-153056668,41157060,-990486300,1961943042,196146177,-1431273242,-352063812,1946265657,-1134500862,988480496,1430020324,-2132407120,-1062150283,-352062276,66501661,1625564395,
1622180582,-352062788,-1341819891,-192879091,1625710000,-419815957,-456578204,-536696732,-919878662,1692665523,108331432,-872482590,-1329335179,-1199512050,-661782464,7478923,
-2147436036,-164888789,-661733333,-75382642,58004020,-1342067735,-1333729777,-1131944320,-689372180,1977125658,27388175,56427493,59310952,58590073,-2115582070,-2098805878,
-1900019527,-1948570663,1023470343,6990421,-1048507276,-108986240,-411252736,58050851,-1174344471,-1070988328,62438126,-2081554000,-725941014,1096176,-997530574,-989969682,
-301495762,-220050877,-461315446,-788758288,-1531246476,64273136,-13378581,-1901068104,134265280,-217636680,-1140902997,-1014056960,-216006471,62438059,1122904496,-1158795088,
682623960,816857838,-1899459346,-1342129200,816896910,721422009,1191545087,-2131041721,208976127,-1330118869,-1195916402,-487859314,92807344,1191544870,-1316887481,-1125592572,
468387194,254050788,-351961924,-1316821998,-1125592572,132842878,254051044,67469500,1075062672,637896743,1195836808,-2011123517,92808709,850413383,-2010774136,-1337506043,
637896752,1195836808,92811696,-1341814746,-427759907,734604163,-1193767232,-13915563,92997001,92926434,-85850741,92997001,92928738,-85850741,92997001,-2115699998,
1438154982,-1962571350,-1980243451,-502953211,-1962571270,-453320187,-1199511934,-13915563,92997001,92928226,-85850741,92997001,92928738,-85850741,79992299,81265869,
-1410136851,-1912586056,1914603992,4241408,12376206,-1126920704,113672192,-1340604284,847308305,-1865862181,279470564,1642396385,-85978968,-260715522,-167708287,28968819,
334686209,-33979916,-453806087,-1560796030,-1070989294,17793766,1026528,313537653,119439590,-1177509697,-1430781949,2484394,-397060680,-1070923745,-50324760,11098268,
-1458604798,175375360,-1453810436,41223168,-336314901,244221,-1598182413,17770192,-1598226338,17770192,-1598226346,17770200,-1514340274,17770200,-1598095290,-1190818864,
-1598160891,70985432,1179043957,717486050,-1326324032,-350165487,-435638272,-1342117087,-350099964,-436097024,-1342117087,-1339955457,-1333729773,-341776879,-428822528,-352145247,
-341711360,-436097024,-1342116959,-1331566849,-1182734828,-13959048,-793196658,-930305253,-1325931861,-1082071531,521011264,-1174469698,1201995792,-386145721,380637887,-1917812506,
-1475181848,-1341426560,309979278,359956648,397436139,-1900511002,308930702,-997818356,-351109912,-1903249327,-2129503512,872444478,604271890,704834320,-389773632,-617934239,
-1867396821,-1047875915,705837800,-19397660,1978219201,1960512497,-391204848,-527822297,552120240,1958951698,-1903249395,202512104,-389773760,-1967648215,302639242,125112100,
-997841232,-1340991256,-461314536,-435418015,-434524063,26196096,-1139669784,-728891392,-394264388,447747530,141197542,1510393631,-973078528,23558,-1912579906,-148266,
-1444937457,208994305,-402092104,-1494674991,-34868204,4720327,113704959,-963444659,16796678,4851399,464519168,1086030054,122186240,1946163688,11725059,-29310077,
-2147464186,167791678,2129192821,10414336,1438187307,650677162,263193993,637897510,-1053620855,1780376949,1048649496,305397874,641103135,16844231,202138084,-215719450,
-9805338,93005400,-1071357468,1963297062,96937530,-1960378369,1642352645,-1993949148,662001669,1979711293,-1178588382,-1410105344,520488478,729809081,732820470,610395391,
96937664,520552448,-1664941707,-2132403024,-390876232,-2146692881,33618817,2133066359,-85408634,521693712,1253001,141214621,1275512351,113709056,74,-2132402768,
1214962475,1697799,-1679228044,1086554880,4982526,4996736,-387484162,-2014773129,-1191236864,-930370987,-1341814490,93005327,856000806,509507009,-2128668566,872444478,
796204818,17155878,1493133825,-469398746,650126433,1031079305,-16398554,1476422399,1342540582,-1071357468,1476757798,-12769419,723678719,-2147436096,102673395,12132102,
-201970816,-453039187,650126433,1479,24452871,-434196285,-1968131968,272623843,-410340944,-1022347032,-2132402256,4982470,-1157682432,753467391,-959304960,134237190,
-973069592,268454918,-973071640,536890374,-973073688,1073761286,-973075736,-2147464186,-352320792,122186264,-971667162,19462,638011498,1962884483,-32708349,-434065213,
207742080,610395660,-379459853,565187241,12353766,-1126920704,-13958144,-793196658,-722949349,-1903249393,-1475372312,-385649472,-551288698,-1494694778,1916698895,1947350016,
-392777712,-1071378561,91603004,7472838,-392908700,-527822993,829763752,1946160104,302446156,1869881344,12144363,1461604544,1438636430,-1948570710,1606892295,208951327,
8438145,-939460223,-920394884,-2430781,-997579148,1181430,604664896,1966095408,-339441129,1009787912,1959037488,1963042827,302446118,527704064,-402616648,-1062727929,
82314101,-6100976,192151984,1181430,1947316288,-164515838,536875526,1042547317,279176234,1916698880,1947350016,-396316628,1303443748,-919904026,-1174855448,1692696575,
-85917272,-391270244,1956509964,-1570708468,1698431090,-1930886283,1089793,-1557090224,-1070923760,548409549,-1207955293,281870339,-855637576,279140368,1966089216,726670865,
-1076326720,96927808,525926227,809271275,-989984652,41230396,-528088140,-840684976,-1152362480,-1195724800,134265091,1949367424,-1162299641,548733912,604005792,-1014043081,
-908993650,1964225768,-433934224,-1269802880,-1206858496,-13930464,-218093383,-2142218069,-1162202884,-1174178813,146015194,585943339,-503024188,725806073,-1004344119,-102628236,
61945835,-462033710,-855591848,-1073694192,-2132401232,-1084761458,-617895339,-952432757,-402295457,82513755,8438401,-939459967,615571068,468287718,234743809,1377990,
1916698636,225731584,1181430,-1173982176,568852738,278994446,1009787904,-969903056,218109190,-1341933382,12316161,-1193570640,-617895339,15402889,1430062987,1433739178,
1052289,278986800,-840685056,-1338709232,-840685055,64535056,-1142030160,-611403776,732583352,-351827493,1023904512,1965009493,270958884,-2113941760,268439566,704753664,
1477496292,603984033,707804208,-33393472,870928576,-1070915841,1086314638,1392887552,686366719,-388123393,6831151,414779136,-1899459584,-17580328,-1526718273,-1174609237,
599654408,29409279,-52253787,113712902,-490536952,1312455,113770324,-167772062,837312688,-435572489,2091104,451475594,-1964471808,12582095,-1469783035,-453348351,
-2132366752,15397858,-469762043,-519985052,-1017060102,-722990416,215869453,-1325732565,-433986048,-469701727,-455046623,1977617057,-433737684,-419450752,-341711327,-1977490432,
94495968,359989249,-1342149726,-75438554,-400956231,1048579428,1946157163,352765453,1589511424,211413216,665908474,1438154982,-461183062,-456882558,1437220227,-608303756,
-1327305760,-1183783411,770179079,-426921971,1799258224,158597120,-2132399952,-337578818,-433475388,-1973296000,-419683104,-424628127,-1207899325,1122413141,-997588757,15418086,
-528071964,1122238699,1951771197,-519193083,716215275,-1325760282,-1339955458,-1186732528,15401004,1088864650,1795618555,225771776,113702882,-1107165163,1760157815,-433344257,
212990592,1088880560,7014086,-419516416,116849441,1962999915,737665758,-433278775,1795618432,141885696,-1866532894,-13243936,-419450630,-432623583,-1342117053,-348068352,
725673472,-433213239,-1469782912,-502762494,-524108040,-385937687,800066463,1048674534,305397874,-873921675,-433016830,42973312,-1140101912,-728891392,-394264388,833621810,
141197542,113714695,90,1543947814,1488846848,-1126789632,409665533,-427773921,4241543,-1207430424,417902769,-387938805,512428819,-745865197,-1901012989,-1475672344,
-352160576,-1785284517,604699368,-387938753,-801436941,-1202711692,-387412338,-2045768694,184281284,2010135384,-1948742857,-1751598896,-2046111000,181266656,-1313290101,180742320,
-1058479994,1959279370,-1900523505,179693710,-997847028,1477101800,41404475,-654063477,33684097,-1279783566,177858739,-997818356,-1995789080,-1056958690,-1052047637,1783760618,
1783780160,141185856,113714695,-65464,1241958182,637534208,4982470,113649152,647168077,6293191,-953745409,25094,113649152,637534308,6620870,-423613805,
-24713595,1787094720,117317384,117309540,1048576076,1912864868,-423579644,1681817735,376900096,1347967833,104354131,175243364,6555334,1275512336,1688211456,-2138774016,
-33534914,1617570164,122186271,-2132397648,-394264391,57937765,1493213417,-1409340584,1342193669,114419793,65227097,1486416721,1086044504,1779090408,-970586360,25606,
1644611366,704643072,-427432256,-436096890,-432820092,109061760,637599844,6569600,1494447882,1397774427,104343121,108134500,1678165542,-1608118272,-2065301404,880082492,
723476586,-1961522177,-1983894537,443136261,1493854184,995184728,1975684034,610395166,1494775232,4195672,1290293584,-481732346,-1645522685,-2132396880,-435405591,-423327102,
-423195773,-421493114,-1409930363,-1998167580,1642466316,1642525476,-1050978216,-1020590365,409606003,-1547500769,-1279786989,152430771,-997818588,856238312,-1329034304,153086129,
-1330585206,-1207363352,317195151,199747849,-972478744,16782854,283643312,-401952758,-2065430005,-469109016,166848645,-320305436,-400510967,-2082207241,-469114136,165537922,
859603172,1960970686,-504447478,57946684,-387851330,-1998321429,192184488,92923984,-387964738,-1470625534,-402033600,817759611,150268128,-402276631,-2132539201,649999676,
-1106414367,243327145,-402522090,149620915,-2146914584,67114510,721985256,1549248,-1174401351,-1070989182,-85835026,-2132396624,1181430,-385649376,1048576176,1969487986,
10938627,-2132396368,1916699130,1947350016,1916698647,276081152,2045292208,-402343950,74838656,-143273986,1776856496,-1335827214,-228398880,-453874712,1946265696,370049034,
-356644864,-396301342,702745001,-2132396112,1974139776,-432492512,-391204736,-457575880,148301849,27813092,967852148,1625587942,-351737112,-1414464982,-919903002,1692665271,
-85917272,-805435019,-960564107,-468128798,1946172512,370049034,-960622592,-1106711582,243327524,-400556010,984614871,-5209882,-1325784602,-237049760,1625703856,-1729569356,
-1900008650,571840,-205644018,2146302,-498645083,-1900008453,571840,599662350,29409279,-498645083,-1900008453,134662104,-941440256,1409291270,1644611583,-940179456,
32262,25214720,-956297031,-2097151995,-136183097,-167288088,536875526,-953808011,503324678,-419516389,1048705825,305397874,-4649355,66501120,-487717712,-289395970,
-2132394832,-138804560,116846083,1946222608,302446165,1316233216,15409636,568770340,-729153356,-990506035,-1171950081,481297394,-389469202,-13432892,113639861,-2147483586,
16818190,1914184424,-400378617,192092187,1445504,-483475904,-2147031320,-33513434,-222688080,113700355,-1107296149,914948126,914948122,914948124,-964493184,-2110355168,
7913216,347604766,-1196709100,-1414856447,-31186460,568721643,1181430,-385649376,-1901068058,-1106878744,-2136415937,1757284213,1952491745,109701129,-2147431039,78857707,
-1968125653,-1475985688,-501516928,1976303349,-510542097,-1207538968,686296718,-2046555130,104589508,548998891,-393564157,-2136472041,-572262432,216567472,1947248646,-508051962,
-2147074328,201332030,1961037502,356417546,108334336,-387768642,-239466969,-131798013,1182027836,-335153222,-1606619100,263401332,-138753749,-2136413183,-102626188,-176829442,
645139492,-189130773,-296374271,1022099691,-1341491883,15462058,1957313772,370049037,784220160,98167011,243277547,-1342111605,-394205635,-1058531233,-1859745275,1961101824,
269385735,-4964352,2028506800,1975560197,-393170910,254018927,125092922,58049570,-1341757720,-1333729730,89778322,57933884,-82282776,-2132395088,-1341817112,107866122,
-756629462,-723123989,-1899495238,1438603226,-1948570710,1606892295,-1528298123,-2130384122,-2130673470,2095055098,88991970,270820580,199950964,1445504,-499532160,-1090174232,
12457583,361442816,-336680272,535567872,108374588,562313,1195853382,376831873,12313461,66763264,1979230444,8898312,1124333568,49986115,1979230444,8898312,
1124268032,-1312388285,180933123,1155779,-1341744664,-1082071488,-1070399385,-472185463,1037631723,629236064,1031872319,326435647,1614667163,-1090128031,-469207624,-1260444511,
-1600002558,35913744,141870138,1062528,91613186,1509063,568590336,15465508,113648102,-973078507,-1610574330,-1175915856,108706084,-2147138584,520132134,7683712,
-1273793534,-25054704,-855608058,1963916819,-402427392,-318044877,1048597876,-1167851406,242548738,1377990,610591914,-1170180848,-2115502075,-401690620,547881995,-973665164,
108363776,-387880770,1692664926,108335140,-387719234,1572734034,72149218,-768933452,1068505037,11829478,-58714419,-151816901,536875526,-672595083,1916698858,108291072,
-402652742,-1545075664,-1595659771,281870409,-1090390855,-1070870368,-1993949042,46629637,12122338,-1127182848,568591360,15465252,1048584678,1969487986,-463672574,-335731551,
-1331567104,-1333729727,-965679475,29190,-1897922376,654257088,1532167563,-1666558659,-469399258,-435418015,-420273055,662019425,723453470,79554779,-1340312289,-462363123,
-420273055,1728497505,-1946156288,-1342150394,-8329662,-1342150882,-462363123,-420273055,-431771551,432929664,1030644,1021845680,-1325800956,70641709,180048067,375040,
-768344277,-897518601,-152939984,1476396473,1191458536,129628642,375963136,1174702638,1191454440,-1017579806,541215520,-1138734257,2013493251,50456578,-2132348752,-402157640,
12321501,-1126920704,-1545043968,571398,-661733234,1510393638,637534208,6031046,5815808,-37955954,-536801281,1962934697,42920195,-2132348496,-1947815760,-919920435,
-1071477788,57998048,-1342015511,-1333729550,-947132771,18438,1292289536,113677056,-956235700,18950,122186240,-1960378581,-456578299,-524279157,-385649414,-206568892,
2025816294,-687862016,1032235,16262592,1962965053,6864667,736034831,-939520064,1023473701,141885544,-1453810435,57934336,-1459482647,58000384,-66975767,11098268,
-385649660,-189791748,1214939366,654256903,1479,38127398,-1783595009,12094438,90318352,-18691797,3967972,-773258379,654256897,1072694727,638582968,-919927454,
3967972,57998048,-1342064663,730588821,96937727,-953810944,268370501,638582968,-919927454,3967972,57998048,-1342073879,-1199511819,-661979135,1103858499,-1958555253,
-141867014,-292858554,-1070899131,-930359157,-125054837,-393482101,134054753,1025406301,427098113,1963129731,66683668,-92074123,-2096466684,91555327,1946615427,21162243,
-2132347216,4720327,113704959,-956301236,18950,4765936,255770766,-579475456,5048006,4765841,255770766,-847976448,1040206008,1977614351,-425873212,653667211,
721421510,579593417,1979375808,1292289712,-139422976,1220051174,6339328,1660945165,-2137360957,-75496477,-1148029693,1220018272,63668224,-2055945373,-2147228800,796197883,
-2132346704,5048006,4766707,34586667,-2145618493,393606140,-2132346448,4720327,113683114,-1198325683,51314760,-385649448,-75431792,113748650,1431633992,251676856,
-344598525,1431698305,-89070219,141197542,1208403743,-956301568,-1828696826,4982470,1241958171,1778384896,-13957304,1426442022,1241958314,1786773504,-953809080,-961915643,
436227078,4851399,1214906368,96937479,543861333,1778748191,495656744,-1960890262,900747277,1029210342,376744533,-1437205631,-108982156,175417941,-2132396880,-402223176,
-219611107,-1060070398,-86454023,-460295962,447762545,1894176976,31985240,-1664105728,-104804272,-419768112,-423327120,-803557263,1483794136,-1644530,512634563,1086527871,
-3803392,1443394879,1073735297,-396431861,-400687082,116850659,1946222608,-87875838,-436202080,-135531392,1174702638,12445776,1963605080,-90389517,510981642,12153011,
3205125,-389925959,-822214544,-400626059,1048641447,520159250,313771380,-402343751,2025390098,5433473,-294270210,-394168135,-1013120952,-1229915492,15418342,1122419082,
-980811541,1642349286,51175562,-1180868122,635962379,1976303104,-453337866,586943585,616860384,-1654528260,-402388039,-90439668,52716004,1642513418,-464469091,974136417,
-1963428668,1492443872,-1900523325,-17438578,-528080884,1493108968,1073794433,-390049597,256004,68101208,1075062672,-1223773145,-1022309120,-454506870,-389903617,816906207,
-1325405464,-1710048,-782825789,119565031,812273578,1783605767,1336543032,1392978026,-919383726,-1828463942,-519460628,1504351227,123689818,852044739,1124532928,-1073021982,
4241603,-466960242,-1056815222,-930412064,50653377,-2103088,-555219596,1377037060,1728497446,637534976,6889100,1730084646,-1329374720,82831615,-96721949,-38789259,
113648102,-83885973,-919926093,7014134,-502893310,1976303351,-1973361421,1358676952,1077182692,548438246,-816307994,1223171680,-1564464130,1822621808,7250688,82349744,
1975788798,-1328993432,-33953654,-136216408,-919905309,-320304464,-528439043,-1337007113,-35526528,1215781180,-1962910744,48873928,-470412621,-2102343677,1023265512,-399411367,
-783286204,1489503208,-150715205,-1329069085,-38672252,410460988,-1962923032,-167267376,-2084502557,378077394,1822621806,-1017045248,-1849794273,-37099295,-393310536,67960199,
-1696021370,-527776771,604302528,-1022700273,196105040,15409382,-527818524,74826762,803995572,-1595536464,-1595670293,-16058230,-1578889100,15451914,548446694,-1595539221,
568593899,-461373205,-423359749,-1342117087,1528882720,-43915234,7022216,1355765791,-1595531088,-821375656,-423611824,-434065168,1478551200,-1328610611,-194713858,-1867448853,
-1342132759,11069841,-1544973648,-376197120,-1800404834,100702697,721897578,96937727,-953810944,2147418693,-376066041,-1766850430,-1750040853,-1733264661,-1716488469,-1699712277,
-1682936085,-1666159893,-1649383701,-1632607509,-1615831317,-1599055125,-1582278933,-1565502741,-1548726549,-1531950357,-1515174165,-1498397973,-1481621781,-1464845589,-1448069397,-1431293205,
-1414517013,-1397740821,-1380964629,-1364188437,-1347412245,-1330636053,-1313859861,-1297083669,-1280307477,-1263531285,-1246755093,-1229978901,-1354989338,1780358263,113712904,-65464,
5048006,122186387,1364810271,1967192451,-528068095,-1002796060,-2132537740,24263484,-421493041,-101976960,-1947811798,-822017864,-2119150086,1323860198,-1192260864,-1196750848,
-1196699488,648740864,6160655,-1598030453,2812120,-2001145973,-1598510336,12102616,254192384,-1962912255,-1951683587,28859901,-268366080,1075673578,-427446272,-306265216,
4503837,-1094474253,-930341259,-1598039922,-1900008496,4242368,11700150,-1526718279,-1951677557,12102594,-203248896,-1124015943,-175432011,-1415207515,-953747230,-690905082,
113714716,484102568,-1341733082,639426257,-776468793,-953803550,-422461434,113714716,485151176,-804862170,-1021514031,207,0,-1610577920,9634008,-1610088448,
9634000,196608,9633796,1048576,9636608,4194304,9636736,16776960,9636352,16776960,9636608,16776960,10161920,16776960,9633792,16776960,
9633792,16776960,9633792,16776960,9633792,524288,8454336,1426587648,9633822,34816,14811344,1694533632,9633822,1125924352,1293699100,1461473820,
1914465820,2048685596,-2112061924,-1977842148,-1843622372,-1709402596,-1575182820,-1440963044,-1306743268,-1172523492,-1038303716,-904083940,-769864164,1075702812,-1954152448,207742169,
610395660,862054131,1096146,-164888789,-1982672391,856001301,1979113922,-16729498,1971848585,856001281,-1990691390,-2043312123,856001522,-464751166,-456882591,-1193270649,
1064632320,732583354,-1946801153,-205354037,734759851,-1036800522,662043617,-997826076,-534607900,1962934456,1959928602,-1426423530,-2129955755,1946223098,1437252107,29018603,
-1010504959,-880017621,-1430722095,1431682730,-1416189034,-164889886,-372126837,-1168812609,867019434,-1378060857,-152976845,1642386805,-2015050618,850452514,12091622,1220834560,
-880017621,-1425872509,1219228480,-1946801237,48858059,-51795,195930485,1979441600,-13259358,731674111,-20993025,1642376191,-2015050618,12116002,1384704768,1085820934,
1489014272,651856976,1390216,-939459967,-1612182148,-472727814,1492756200,-1161602553,-773324542,-2030769159,-456578080,-536696732,-2043354118,727770848,-1973099319,1946265824,
-161422334,-236977468,112401781,1692715307,-85917272,-872544139,-1006701451,-919926293,1625620194,-1023284861,-1912602440,-943681832,-956270586,2047773935,-1178586368,12517632,
-72617092,1358955705,332202164,28839794,-1898829054,2080422850,-855637575,158554387,1954610304,-337583582,4096030,1903298172,-1183055681,10551304,46629756,-102693573,
15359860,-1342177156,-394205628,116848875,-1207893877,-661782528,246431092,-1460099352,724858120,-841864256,243987,8436305,721551800,-1144811813,28933120,1494469888,
1048643698,-1437237762,-1169049484,-1070923648,1918440397,-1328160248,-847190459,-336862696,-482099466,-336028952,553320958,35719298,570630421,556762145,-551470076,151135490,
-162463958,-2144925681,35979999,1358899721,654839798,620945216,-15003902,135263828,48169039,705233445,267800831,-545239288,151135490,-162463958,-2142304241,35979951,
1828657938,1325928438,1465252608,-1957604526,-397009172,-58656733,-1274908135,33325076,-58717066,-2146995192,41288186,-863365964,-506401486,52534971,853969625,-1947169802,
1093044986,1090962944,-13762560,1495227927,-1956685221,1486639340,1476806281,567332701,573645349,575218237,582034005,582689457,582034097,582034097,582034097,582034097,
582034097,582034097,597042036,606217153,-100404550,603996064,79740991,-957478900,15878,15401195,-68287476,1913214952,12630317,572373073,-402082736,-396883841,
1918437740,1108228633,-32279296,-1007058751,-1595350410,113698818,-1014309237,243292611,-350224319,1093044464,112388096,-1014309237,1059487939,1186496256,55568614,-984958781,
4132480,54782080,1059487939,1119387392,53995750,43313347,-2147213848,-2147467506,1912890344,38660161,1946464232,76670979,-1243067728,-1271959036,84863053,-1497880462,
62017570,-402193432,78776307,-402195480,129107947,-402197528,145885155,-402199576,-396884005,1776813375,103999490,-1014309237,-1262056509,1093044225,-389809920,1187447342,
-1593835518,-1054605296,1094451890,-889321868,1786052924,-2096867704,1719075327,17123014,1913032424,1958742550,27912210,1183321458,1334455810,1871326724,-1976374517,-167735131,
1047793860,-2134842240,1416986876,-2065170000,1334455809,1871326724,-1870268917,225706240,1894253744,1334455809,1871326724,5146891,-1945739639,-390033720,-1070399016,1187431416,
-8323068,158466176,-1962817560,-117328698,-1983892541,1720188998,105285893,-672415602,820511408,1334455809,1871326724,1090289675,-1393837196,-1979615768,167809157,-1273793344,
1946265601,1342354434,1476495336,-1965126664,-466435133,1407775211,-1870296575,1958742528,1946265625,134604805,113640820,-402259903,703070560,-1965126907,243319747,-343932863,
19458286,851872598,-2131719196,251695269,-2146994866,-1879011187,-370657301,1094615042,762609664,-2146994866,1879085197,1968055275,-1869774841,434835456,-165644978,67145861,
1353714036,9471478,-1342016254,-1870329712,16705536,1527039976,-960248950,16793862,-941035541,88729600,-1073070222,1692950644,1463185920,112843571,-1484116480,-461365015,
1975794303,-1081397737,-1976688406,1714947173,772371712,940270986,359924070,-503069821,1090963160,-346092544,440613,-346563789,1166683860,1967143948,-1994388478,269223550,
-1868201889,-2063069440,-930348912,-2115452786,72017920,860967107,440795,-374896082,1959016992,63144712,-335940894,-1618268667,1482236138,-793227069,62148644,705019624,
80144594,-1308248344,79620097,1476767464,-1202666664,-1269816086,94496771,-400061906,-1976695397,-1796734617,-1017620475,1996619651,-1866629092,376700928,-507457653,9412610,
119851218,9479552,-1870329608,-1494695168,-8142074,-2139916543,37053,-812946316,-1274879552,-2066951678,1962970918,-771247082,550827724,-1979674842,604016773,147378695,
-1979674874,-1979674459,-1058766596,1946221696,-2147373040,376783100,1965082614,-351817699,68020256,37549938,45151093,11537643,1971387520,29882088,-940121227,67269648,
-1868201981,-2063009792,1354956944,-385917464,1347944629,1476472808,-1679228045,-1249226752,-427818864,63563968,20727410,-2047472779,1946222736,-352145393,-167153141,16814213,
28312181,678739978,1929300712,-617392349,771753657,552183690,981460096,772502980,552255371,209009198,-1014819212,1608835587,-165610565,16814213,364579188,-1878725855,
-396370037,300482252,-402426879,-397213453,1918567142,1397774362,1526796264,1344238168,23521363,-402099621,57803141,-402540824,1935147581,-10753789,-402522904,-397409677,
-396820784,-154991976,268472453,-2135414411,-1870268864,175375360,9471478,-1207732990,-1518305152,136249488,-2147446619,-218068186,134531264,-1023374586,9471478,-398297840,
1047659247,980994302,9479562,168813696,-2147125824,636195020,91605246,-351220608,1976106524,80016911,-990506892,-2146733054,166416588,175491326,-863968533,-1868199792,
-466435328,-454494229,-2144046076,-285175643,28364683,-789126958,1057366266,-1092027648,-85137406,-1058537035,-387108349,113640379,-402259903,91489463,4261574,-121374336,
645943491,-1975582581,604016773,-1962538816,46186496,-301729862,-1974418600,-1979675866,620793989,-1002782528,-419773608,-436147444,1967275019,-339725564,-1044345840,-393608000,
1174663204,-33393918,82202821,-997588757,-980810522,254017771,-963935770,-1070939002,-1303320367,35842051,-749155190,-430946080,-1979651323,-83499324,-1056745383,15401648,
91425510,4261574,-397360375,1854538257,51767297,-1156091304,-397203538,-963968289,-457121909,82083842,-790043894,-1195156734,-1974458396,-991428250,-389641470,1720320703,
45737984,-1041759310,45213697,-1175976782,44689409,90671662,-1308450072,27977734,1476565736,1575507651,-2115462141,-1656393213,-1090766222,615252034,1009874112,-1406700224,
78962896,-524279182,1913697282,-1260335077,-1072336376,78906080,-523235726,141689780,45408464,548668018,4269576,4275840,-1017187071,-2131367011,16702,-1920978827,
-166723440,67145861,-2054544267,-1071382384,360022076,1912675048,1946434576,-1868201972,-1920926464,-352059248,-1869774843,-2134702592,16702,1048590708,1954545729,-1868199374,
281343488,-461362827,-1959884096,80068608,985720192,-2145880852,-590347780,-2134842240,520130725,9479432,4261574,-121374464,-2134887741,16702,78783349,-1979659288,
-1962916066,1177434830,-1978960640,973096238,74711406,-603792382,-1979687382,45269955,10938448,4204168,1093044824,1961101824,-2134887934,-1007353348,9479562,1964033270,
1040631385,-1763180544,-402606848,1273495963,-1187876352,-2047474608,1946222736,1369485570,4261574,-792710400,64012525,24766544,-386397352,-2120482778,-1660879897,-33000615,
1978219205,-1966868006,-2013248242,-805268339,1961442029,-1869774843,-1007149056,1344893112,417876660,-1966634239,17950944,1493071592,-401690429,-1062670385,-1341229575,-272242672,
58064651,604293312,1444856591,-661733333,-13970553,7878341,-746119030,1405296478,1912621032,-76879805,-846135880,1005100053,91463163,1912615912,-401952209,-997523508,
138208306,145752691,-198919600,-896802057,-772222837,-1261317678,1477823878,1589185139,-262739936,-160052994,-544488613,-1010775158,113703428,-1593900992,807665727,-455999052,
108380986,4138628,-485872523,4144778,-2146441344,-822067418,4138504,-1979695200,266567896,-1069603589,202114240,-301731142,41213754,-67517448,-402017597,116850508,
1954545727,1977879060,-1978682348,604016773,1971338432,-350964728,1961101828,851741215,-390442780,-1948059901,-1261401142,1477823878,1119423091,-272439296,-160052994,-189115453,
855814915,-1071321911,259293244,-872482846,243331957,1535115329,-1966868136,-1662106940,-402652231,1537077140,-1327526973,-758413823,-2067036480,1962950150,1040582684,4777984,
113642099,-402653119,997326910,9733574,1961691648,-1870268883,41164800,-1388649008,594804884,1378551738,9743752,-1930948684,-1965061121,-8001309,9741706,-385909016,
-392429539,-1013055693,723368017,-402148272,-544473237,1692984202,256255,-1195157160,-397399235,343015456,1357383860,4122879,1117784690,1012933632,-133991328,243319640,
-113246143,-117704981,-846200392,-1290702315,-154586364,-2147467770,-136180619,-210383874,4263552,-2137196160,2130722342,-1084767331,129171522,-1224477510,-322358526,-1069760476,
-136180108,-210382850,4263552,468449664,92859458,244039,1257152488,1947248876,1976303114,1091469522,1610162176,-34608957,-335284294,-389840728,1273560549,-1254329601,
-18487248,196425074,-397292034,745733851,1345060024,-1528298316,-1966633986,-23205664,1493142504,1107752537,-596373504,108326154,9473408,-1920941164,-1023344496,508609369,
-2131921176,-2147467762,-434065377,28900128,1477823889,1364414671,-400664750,243330395,855703712,-1878603777,-2147483648,855673638,9113216,1040631488,113639424,-973078464,
16134,4261574,-9705472,1207485416,1963130755,1040631540,645922816,-386006880,1595931772,1482381658,12122819,-1579643392,10682444,5153025,-956235101,302009350,
1309576238,-670644480,-1942797567,-956179954,16843782,101616868,403097345,-1931214591,-469689842,-339794783,-459151872,-335862751,-81664512,-1058535650,1946601196,113639424,
-973078411,30214,2028506800,618695404,-385649472,-461373301,-393301769,-1833898879,-957586712,30470,-265955190,1014133760,-1341098512,-330438503,1702101052,1635200828,
84205761,-1557732367,113639684,-1979645835,81838275,11807348,276164668,619223728,1946172652,1999584283,81838359,-1947995899,1065561816,638153728,-973006685,33584390,
347373746,443683789,-1962906463,71566808,417908875,1967030272,91619584,216564146,-1900100864,8251619,-336849176,-1269738508,1913900297,-854477818,-400985325,-277675915,
-152864322,1467285954,-387750722,1340801111,332202164,-628488012,947000269,4329097,28889994,1930677508,184320057,-58706828,-2144373743,712249596,1912617192,1108249367,
616663552,1959329343,-1058963257,243910666,-823459774,-152846402,57999810,-387732290,1532619679,-1903249213,216750824,-387938808,1489234797,1364417369,7119184,108190011,
208853051,-1019542293,-1053096846,-1007091086,-92224520,-855280768,182848,1977879291,708889865,-2114289436,-58658953,-385649400,-58719798,-385649387,147325314,1364393984,
1443241554,1977879127,-394219006,686293056,1948682987,33325056,123625461,1532582431,182985,796798762,797847431,799485845,790769442,811216674,814952588,791294106,
790769442,818884792,790769442,-387436297,33325290,-437714059,1946600960,-1974272000,1342207262,981459584,108361434,637828840,-1056618613,1183318760,1200236280,-155561464,
123399683,7743114,180413568,1982236896,1183340544,-1047899911,1183334180,-76642054,-390020726,-62486522,-524238198,266764292,-1609775606,1492993672,851741264,-1948200476,
2768368,1532500595,-880062383,-1945835071,-1899953216,266568128,777607168,778347775,113662808,-1342111628,-453328128,604040097,-73275713,-155581264,179957251,-42645248,
604010144,334032399,-1171426045,1022099953,-2145028863,720371046,16705746,-2147389208,16807230,1317014646,28446973,-402592792,113639773,-1023410060,7603910,1956692741,
1946600960,-960299008,-383713722,1187381665,-639028994,-28916223,36300864,-1964504971,-402426622,-960298253,105971270,58583123,239569446,1543063176,28829959,-397212130,
113699255,-1979711372,-2147453666,-633700382,1491608182,1200236035,1334453762,652867086,-146206837,-1949660183,-1262474288,520575747,183032,-930365397,-236203893,-1202518498,
-661782528,1946272502,404669446,-1006310655,-402586594,-360650397,49971328,113650803,637534324,36505483,635996672,-388955392,170322129,-930476473,41388582,378195710,
-1070923659,-903936165,113639426,-1274609548,734013959,-104256558,1187441387,-857173506,1200236034,-1966539262,-461308570,-1998583056,-1977156250,1183321671,-2000671751,1156119366,
-402098943,57999830,-1023275288,587089606,-973038359,-382534074,1187381460,619213054,-401312511,259326341,-2147356952,1073771582,113640821,-1023410060,1963041256,-45708783,
-301861190,1963058408,1946600965,-960299008,-401539514,427098351,1946243304,21751813,-1259860107,1950253057,91570176,7603910,1950253056,-87883776,-1088118300,-1578762005,
-81518108,568721643,22079739,-138798475,-292507647,-1274984984,-1173392000,-1561591311,11796621,41156924,646455476,-389873548,963772888,-1930888309,-399346432,762642669,
-1174339399,-50724368,-151294477,1946353222,19916818,-256239758,309505,92808940,-386276793,91554099,1979272958,-1712798770,-1946521087,5105907,115929973,518943233,
12132102,32553473,1878260986,1190535163,309592830,1912663272,32553684,637535417,1190003850,-2098660894,-389909248,-1116405525,9176822,-1161267960,-1460928014,-972720897,
-1157598202,12145603,-337096442,192174590,7618176,-498568064,1531571184,-1912158633,-453378048,-339794783,-459151872,-335862751,-81664512,-239403213,1980167681,292864000,
620643978,1914715376,2000698376,-28409852,-129791487,-2126362642,1963063546,-960274444,536900614,1950253147,-71106560,-1191655125,365793280,632491890,9307894,1979310464,
1976303115,1946601203,183205888,7603910,-1912158720,1048576000,-1023410060,-919907333,-1291716678,-2136413147,192216032,-176829442,7603910,-972690560,29702,1950253147,
-1178402816,-138804992,145288193,-102626955,7603910,-121374336,1042627,27789173,988283764,1950253056,-1161625600,-1561591305,11796620,443908264,547933364,-1431038859,
242499752,279462068,297011316,41223336,646447284,-58720140,-2147257327,-1161625348,-1561591311,-1185742707,-523239416,-85851534,53674427,663367385,7612040,16547931,
1073930435,-1157317887,-1202714096,1190559744,57934590,981402808,108525926,-1019607182,1492648818,113703363,1476984948,-1900008509,29554368,-1004140684,-352249826,516171269,
1354957060,-432936930,9307846,-434065153,-436147296,-1191502048,365793536,825347928,792015151,519779640,216551763,1961102054,1959591469,1959591486,1959591531,49053804,
-2048326795,200048640,-855765900,-855762316,1532574068,-1796681953,15722496,-1930890005,15919104,-353634190,1946205928,-622289896,-401478912,225706163,14346396,-392362381,
-269811605,526080413,-1979710774,-2147477466,95487204,413197522,175318016,9871584,-536212444,-352315488,1963277481,-524028251,-940138379,-1331988996,95348979,-771750471,
180587239,94562503,-94992149,1842827,-1175915637,438188800,-1995738112,471763212,-339727872,28348419,1709793019,438209535,471743232,-1207470848,365793282,-1946513157,
989862430,1392516126,99346588,9903754,-478095310,-402361337,-1644558945,-1948421029,7006215,1711753,512490179,507183130,126550044,-1092071268,-1759606267,-2133315072,
57935843,1476747240,1019476893,168195568,839021796,-58670144,1007842784,1007252493,-1274711030,-1876694219,518724788,-2063826800,-264496521,-469104779,283840628,1977629840,
1961101833,-339725819,-1007120383,1128514553,8527419,512427125,-71106432,1364414549,509040210,-1863779322,-391270172,737805485,-1469782839,-453320702,-112216992,57808333,
-83755799,225771068,309721660,-1760657158,-353824768,243333633,-383778665,-397409823,512361749,-667811689,1946674048,79095811,1021348440,-385649153,118359122,9846410,
1958791158,1007712564,-2147125845,1073780238,9840256,-2145391745,-1090480602,292848956,309674300,1948305398,386826248,1978146816,-1777434620,-2031546368,1977629697,-1777434617,
166400512,141943100,9834112,24439057,-940146908,-1190366206,-2067857406,1974399720,-163386530,376701383,-1090517831,-1359812478,1161616244,-990498955,-383093376,1413218940,
-990495371,-165579392,67115014,243275637,-1341915112,-1340021216,62908590,-75169608,703141325,18344193,1582720,-434065157,-391204832,28836773,365820805,-1979641879,
-1090513122,146401406,-1968246272,-385649468,-276758311,-1976637313,-1310161243,1954588674,-1871123709,1930493056,388368417,214234624,-890698891,46659072,638060404,-1092026218,
149737984,-385869786,-1007288139,-385649660,1379664025,-1007279755,-385649656,-940179315,-166431486,175448259,1946403830,-337606134,-1007251334,-2064223229,1946163238,8382723,
1582600,1517104,1953547510,1441288197,1379686403,-527799947,-2138013717,-722071300,639648627,-58720233,-165251077,108266183,9840160,-53344533,1582624,-1767841654,
183030272,-771745786,135013600,-1979705594,1975008452,1679402,646447284,3932185,2078874996,405151746,1008003840,-166694016,134223878,1161569140,645924212,-2131296232,
-67070426,-434065158,-391204832,133825165,1516134175,1566071641,2002271439,147060450,-940176268,-167087088,67115014,-773258380,79951360,1396453748,113716597,305397874,
1388908009,1263620175,1212632396,303108169,370480147,504961047,572596255,639968291,791555372,1009922352,-1341819591,31779104,108334908,-375062344,1245446618,1312586100,
1136620916,702775,410365682,1963116534,1156546923,1679415,-453637452,430098179,-10753792,1640134,1751296,1114943218,1131545148,91688252,-344537984,1918319669,
2002271241,885293061,-940168981,1008235522,-1207536356,2078909952,1951611905,1966423071,-1543456576,1006726633,1007448635,-2135787708,11546052,-1342087703,22604272,-527806460,
-1007226645,-385649404,1178337418,-940170379,-167414768,427033287,1711755,1842825,7407302,-391204736,466420081,602521643,281540097,1161570933,243279477,-1341652968,
22538414,551952560,4800128,-1173916665,1704985560,116846080,1963458584,-22418951,276117308,1947256822,46659077,12066932,14739826,376704828,192230716,1946339318,
-1795115002,-1157575191,993847438,-1900323214,11528680,645216060,1947256822,46659079,1005258613,1946403830,-391204810,548405485,-850059034,645946629,-369360746,977075787,
893135991,-940178059,-1189841662,1304363034,1974399543,1086584325,-1007285643,-1156942589,1357637862,1963181046,-376783882,1144801003,921371255,746017596,-311145924,-378253764,
1963116534,549713418,-1007283339,1007908099,-1341819572,-1874990096,-337058117,63174182,-974393995,41244220,-1007243029,-1142918141,267118986,-684799746,9832182,-1273662462,
-32379936,-1965609272,-167726880,33592838,-525335948,91553596,1979710592,-39851773,1842827,1709765515,438189051,-1994558464,471763204,548469248,-1364188954,-1207952152,
365793538,9840256,-41752068,551952560,-1291671879,-530782204,1358786281,-456578054,-536696732,1692817658,1397801979,-1275557295,645986819,734986391,-1469782839,-1963270142,
-77535545,-166068039,805345030,-136180363,-579482626,9899648,-167253120,268474118,1532620404,-151338152,1073780486,243287925,-1337982825,-350165472,116849165,1967128727,
-1760657356,-307216384,-83910680,-2147473176,-134179034,9897480,9897718,-401902208,-151322744,-2147444986,-189790604,-83919896,9905792,1371798335,603985824,-771444368,
1493640384,1444871107,-397192878,-225714389,1963125441,2023524890,-1947807488,184551572,168588498,-32607004,-27757364,1530885324,526277209,1122914511,-2136413101,-21494411,
706071952,47432191,-1964193493,1971366112,1274536462,-2141457803,-461372980,1528622073,-96334416,-352261138,-301158400,-1957668613,1107298452,-527766292,1526260864,-192888182,
1353509704,145769026,262191342,-1325566648,-605295092,1448222459,-1957473961,-772109326,-786401814,-560863002,38027,326423051,376759306,1265945854,1886702846,58051838,
1526762473,1516134233,-527773921,-1341930877,-729092480,-1026423631,975489,65481151,9735162,-1976679936,1257111877,-1976696597,-1031541243,616860163,1246424607,11534571,
1347152878,-1341865341,1111682563,1290285239,1493726208,-863977078,1252584320,1021845687,-2081393408,-1973877270,-1746145599,-1341865341,1111682561,619192503,1255896320,484966839,
-2133625600,-1802821916,-370409472,-1802764427,-1031602176,-527766523,1726606402,2090699519,1565742336,16770433,-707668527,-1964193493,986129120,-502827833,-260747787,-1017250038,
1024343079,1029389619,1030898513,1048460767,1059733200,1033256796,1074544669,1035748042,1023753477,1065958661,503774459,1448300882,-2065148585,-1207910691,1064587,3204993,
1966145411,-1342128637,1947466880,-1949921790,149864944,-24910127,-1979092184,771770662,1002480895,-1174348055,1049297876,-410976240,-8191952,-1341754064,-340479481,1913076749,
-2097106935,41165055,1235354288,1662421248,-2079930880,1344149504,787516312,-252410742,604005794,-1031581129,727379460,-975466789,1476424734,1006637241,51278338,1912880345,
1020855048,50491911,1200312537,518030858,-1545804056,840892512,-289109276,-1966801342,1245965831,525923298,1049231155,113639502,-1191182238,71049216,121375346,-1070398348,
146081259,-217636680,1662421931,79856384,-301963872,-326858194,1252235504,249987328,-2071253504,1285812452,571648,503337151,-205507833,816857771,4800128,-1342016250,
1721953855,1583308032,526014811,179621639,6295177,-352320792,1662421996,-289109504,-1979651262,-1974800699,-289341756,-1979651262,-1966870847,-523134777,1351911830,1648244736,
-1962576640,190658,-2115453973,63474432,-788509170,-401689351,-1966866497,-771804449,1352109027,1611565824,1583308032,525883483,1654836999,1276021504,-145713152,5153761,
-103692149,-1863840588,-472818689,5277579,-369117208,378273647,-1031602077,6725637,242614026,-478093276,-289207777,-385849694,-551223469,-210506800,-269803508,4859530,
-1979692640,1560306238,-380019105,-1957429445,-154891560,838879782,-775748609,-389850144,-58720039,-2146930172,57935868,1392675817,938000779,53572608,719751920,7268579,
-50072317,-176829186,-400510888,-50134935,-143275010,-2133105944,117459262,1704986484,64535040,-19011090,-588521846,67084264,-1962914298,737184760,-20513071,-1947389246,
50350638,-154957075,50350630,1235243200,1008666112,1007907330,1376745219,-335291718,-76281688,-659413584,173562606,-896875557,-1510779050,-1966907809,-1410115638,-386022561,
-58720199,-2146930172,57935868,1392657129,-1746353525,723547391,719751920,-3217181,-47450837,-176829186,-400510888,-47448119,-143275010,-1962975767,-1964119074,1958742744,
-964014066,-1057045206,1968751418,-1009047038,1912929408,133988360,770245492,1697795,520550283,225827594,-319123205,-126549592,1946790124,216641019,-1948023042,48988392,
-208933936,-13443190,-405668981,5277067,-13432460,4996611,-386304693,-133955920,6493835,-1962491261,-58670114,-2146930172,57935868,-402513175,-620036161,-208337292,
-1793659989,-319123205,158664872,-193658456,1946790124,-492071429,-39196182,1912929408,133988360,-253164684,-7477247,1977289467,-1460864497,-1475775224,-319720191,-76281432,
1202374027,2095703778,1929657597,-1954880644,149864947,-1258297647,-1202716592,281870848,1347637592,-1977163642,1011155014,1007449096,1007186957,1006924810,-1274186489,-1961833202,
1476415636,787175771,-2147483207,91357948,6195750,-855002043,1499158544,372949758,309461066,-768948482,1914306176,179851273,-32453362,-1202693938,281870848,1520624216,
91554216,-855506760,-50730736,637546984,-1004403574,-829759278,-387333934,-397389572,-388890594,-1977170910,-1007265012,-166890112,181150420,76031681,-53876392,-169098958,
-165105517,1946724578,534250755,-779381866,-1191001925,1048576770,1912995913,25213702,570885049,65721322,720866034,46715081,1976565453,-756839688,-661994516,938000779,
737708802,29524433,48676865,4800128,-805014778,115855842,-1058199009,762577635,1354023818,-141826826,-427102205,2129191722,-1326546688,-1326481121,1976368671,-389575951,
-276758394,-872538192,954856821,-337736964,-661979668,-538393973,737708801,29524433,48676865,4800128,-804949242,1206374882,-316006650,15779713,1946346432,-1262253522,
-1947929008,-1963971593,-387765530,-293535711,-276750256,-855760816,-947195531,-2130695704,-31436561,-51022389,-1963205911,-1964250146,-212379958,-2124521564,-2128609082,1444937927,
-204830121,-1017225308,-212350326,-947822678,-1974001664,1605039050,1342223555,-1962846488,-2143528712,1857947251,418057978,723419180,-975270154,-1946125258,189931482,1476752854,
251293374,50585793,1228833008,1914635776,-1235855572,-1007244284,-1441368704,-2054674772,-947707905,1976499791,1197432556,1424614370,87172859,841395370,-350224507,-774665504,
65241319,-470395472,-125118326,79058519,12183724,-528039133,1954595574,87238147,-1408923354,587245288,-153057597,91521218,8729382,-2054609376,-947707904,1976499792,
1197432527,-372907449,-1461126405,-2081387776,-326432532,4800128,1914635782,-1979402727,4622340,8686149,4622368,1355187013,-344600834,-422504725,1609041078,-20545280,
5826591,531820161,-294269186,251293375,149783303,-1325599349,-1172367872,1465254016,-218102599,1952341927,-2084504034,1967786183,1946172653,-1900008686,2084488408,197168128,
-1341885241,-2083329152,2028538052,146362874,-775368704,-486682147,-1017539080,-1178302803,11714560,24428933,-1043148551,-193789207,1157650056,5284291,-1965520045,1244067524,
48283904,-1023148246,1347470171,1049232308,281870434,1980578904,-1190480826,281870337,372949758,863305802,-25165646,-1272285928,-1609511678,71041097,121374322,108331191,
281872564,28900490,-1228330234,1242991128,-842334720,-320251888,-1262027015,1962208002,1946827795,1946631187,1963473942,1959922348,-404010262,-471138126,1964572288,-1179587620,
531825971,-338252312,84083660,50529029,-1962888188,-2097126634,-1460926782,-385649660,44564609,-2065104011,-1961839616,-1979686122,15462084,-393548734,-1966801334,-347935036,
-443880448,4791946,-1976631510,725830047,1310624707,736874752,721582531,-2147241536,67127614,1048586610,1946615881,-165105118,48794354,719096557,1228833023,74778112,
-456129359,-729095213,-289345398,-166532350,-1979692490,-757822736,-1964471584,-738250020,1375843555,6493835,-301481341,1583308122,522133279,519819015,-1579843864,-820051949,
1961369339,1090005,-464466145,1975560289,-401756153,-816261841,-426921904,-391270288,1424539508,-1610566443,281870409,-534725032,91521192,-714020784,-533676456,57950376,
-455776792,-435418015,-420273055,-768869279,1642395179,427147432,1253003,12180110,-458361984,1975560289,281444368,2000743299,-532627733,-86691352,-705107724,-320329552,
-397168427,699454951,-86646040,-58655756,-2142342528,1366606076,176221312,-28805916,-29068084,-29330228,-28871476,-385649204,-855768917,-855756428,-855767180,-1763113355,
20179201,58051838,-33312535,-385649204,-327154763,-385649401,-855768010,870908789,-108612604,-352320822,-1157165317,-466426123,-400624917,-1073032061,-922875788,-115391116,
-151330069,16818182,536544628,-455742471,604040097,-1935546626,-1996449274,-1996449762,-1996448242,-973038570,16818182,350751664,209659092,-527806400,585632688,-81831724,
1352788984,185317626,617872104,-387938625,-967257075,40966,-336060421,-1031013497,167903674,-32803648,-385059640,-369361037,619511666,-1275597840,1697793,-402476207,
-1286537197,911364,-402082991,-779419641,-346530983,-1325772071,-347871744,-348068864,-455046656,1356891712,-301662279,-2064908053,-2080644925,1968767225,-339137788,-436162520,
-469701821,-337606080,-2042567680,1942502368,-4566517,63974399,48978634,-511588309,-373219344,29031172,-1185918718,-1460927233,1492901903,516119129,-153911576,16818182,
-115407500,-83960343,15442404,-1578697180,10100364,9963207,243859616,378077342,113639580,1342242976,-401929288,2133119767,-528072692,1490233576,-2024648197,-1610156335,
-102662144,-360512139,-957189375,40966,-132163238,-50426391,-400685472,378327835,646512745,-1064566681,-192227186,-1056641344,-972880672,-956246400,-63420,-2012593015,
1153895540,-956301298,-57276,2245831,608486912,625264143,642041755,-796131328,-289344374,81838340,-14138169,709134847,-970165112,-1265423036,27125983,108265532,
-2132409424,-1883745813,-762058743,-2132361174,776426429,6160655,139723023,251658680,-404033535,-1207951290,-796000216,-1912598344,1620184,-164904818,-1510736085,-1071357468,
93000308,28312969,1642365158,1642466316,1642525476,-1193991959,-661782464,6887054,6760075,820567476,1946172417,1015079946,-1341885184,-1199512061,1894121485,-2132539617,
1183378571,1642084879,183035,-2132409680,13952233,256334081,541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,
541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,
541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,
541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,
541543424,8847360,541543424,8847360,541543424,8847360,-386248448,276103188,1692848560,1962937320,-423327225,190560,-919878823,35939556,-1195115808,-991416271,
-389773616,-87043905,-857153612,1946172671,-100682748,-1340143921,-350165487,-423130624,-1342117087,-350099964,-436097024,-1342117087,-1339955457,-341776879,-423392768,-352145247,
-341711360,-436097024,-1342116959,-945690881,-51132,255608006,3818695,1027917312,1044694939,17760256,17762388,28840028,-268366080,944306666,1619968,548984974,
-1195340288,-796000216,79987547,-883740566,-70194696,-58655793,393409800,-799414242,149471574,-259276797,-1795215622,-1258600138,-903913984,1229324290,1231374679,1237141898,
1243171296,1889552986,1879492096,243990528,378208366,-1983709076,-1996461034,-973050354,28678,18409667,11542386,-1966090520,-401886992,19189711,45142154,-1966094616,
-402345784,-393556033,-202849288,-402427136,-427163433,-957874000,-1327396145,-809506814,78701962,-1194346264,-1729623285,207758543,31621122,-528039414,-120609560,12642499,
128982386,-1966113048,-402083632,-259338377,1894255024,-1329034545,-815142862,-1007097718,1929420264,8513539,-402651464,-494219407,1793591216,-1327068465,-815536120,162587018,
-1966121752,-399331099,196661077,-818550773,-528056540,-120633112,-401887037,547933991,-399280647,57868378,-1979695384,-402542362,-510996691,652739504,-1327134001,-819992571,
-31153692,196649446,-822482933,537689892,183033990,12122319,196657920,-823793653,-528066780,-120653592,638236867,-1194397464,-353861109,-401821490,229691083,-1009858840,
52476241,-386266448,-2136420677,-486865292,-104844301,516160089,-1934076080,-1871649141,1621651940,-528069260,-460295962,-1463541135,-399477696,780259011,63963292,10362499,
1344303872,-427062344,1910804592,-997802204,-997822234,113668582,-989855584,-973039554,-1470595067,-1341492192,-76487155,1514851666,-1331172358,-1334778355,-425662944,525885216,
1397759695,1894273617,4096206,1953759489,16778950,263518977,-863366963,8662666,-768358914,399311540,-159320960,1316331716,1358977000,281871284,-768388519,281871028,
281872564,41271306,861020336,-840682798,-990488041,-31296215,1976187586,-1965935905,635982562,-956409344,-797577670,-855460774,113703440,-352321280,45373963,-956690227,
-16711674,1482381658,-768356577,-855634504,702487,-71100467,-397258722,117427675,74776684,7210751,7224963,-2129300200,-1342149570,722302208,7250880,-973050717,
16805894,4198142,645925749,-1326448577,66238988,1511837166,-419815248,-820029408,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
-394358807,-389321817,1573610754,1949288424,-382301427,776243716,41221692,12844348,0,-1808911616,1534289933,1712675089,-1894367689,-1240404719,202569744,890293806,
756113169,1343440942,455030063,1477574189,-1860440034,-1104247518,1393016327,773014302,-1979711457,-1676583138,-1557226194,-550571218,1477617974,-1205716718,-81602542,17825295,
-653261808,809305108,6135869,0,1061005568,69508644,1816351296,-834572991,-413978815,324871762,692466502,-782758568,-1824010937,391129681,-1524012972,472494377,
-1770094491,-2022641283,209325688,-194870157,-847598215,1026264186,-400852450,-383379672,187234345,1193443369,304483625,-1390709466,-2106896021,-94004117,307664981,-1740324777,
927247428,1459701761,-1274967295,-452863743,-117312511,369235201,1342315010,1828872706,-1459452414,-553473534,973284098,1292059395,1761830147,1426287107,1319817044,-750588220,
248402950,1426259,-984202925,1095716034,1162200004,1325450704,-1076736180,-984395956,-733065285,1095060633,1381208786,-607237812,483675721,499600979,516702788,1208800079,
1092002898,1286851660,1157677267,-984332980,-1051442775,-2033366652,1414743621,1178971346,-1378595255,1314080325,1178971847,-1345568188,9946693,-1580903604,1384236110,-1513794751,
-1496037052,-766553518,-724807001,1490408018,-967898160,-237612765,-2100146432,-984428082,534268175,-816558336,1411403657,1397721551,9290325,446978117,1431326208,-1949923884,
-766225586,97799896,1292947534,1263465168,-559654587,-649789440,1129251017,-893037503,1313428048,1229757908,1352586323,1159451471,1313442004,1095741637,1397341380,-951086124,
616779530,1158860357,27546694,2475599,-766553009,1196574145,-1001407035,-1539028493,1480916995,-683310124,-741060716,-834318336,-1663806022,-271411762,430199875,1330205776,
-968443698,1230110941,1334957134,1335412043,1162154451,1163073483,1163052756,-942389933,-733066929,550389212,-833290240,1431586186,1166986834,1166525505,1380930643,-851079995,
1431520655,1235797325,-1537980345,147082754,-850047419,1145979307,1514753359,1124121029,-834321070,-800107320,-801024112,-984202844,-1471983426,-800762670,80627663,1225249361,
1381239246,1381241764,-1538830775,1128354006,1327014981,-993767851,-884782764,1230132257,1207968455,1389219397,1386401359,-1547286961,-827833791,-834548529,1230176269,1406650190,
1090572498,1379996876,-623750064,1413761280,1229037768,1229493972,1169278284,1387447374,-1211804599,-254652672,-1426063360,-1427460631,-554913813,-1477124883,-1108951335,15252711,
2088532345,1011241087,2071603250,27522,1681615789,1722313553,1817404163,1702126368,1662608146,1663591233,1667916849,1669948239,1706301655,1480936960,1769414740,1970235508,
1329995892,2035482706,2019652718,1920099616,1375761007,1381323845,1769414734,1970235508,1330061428,4347219,544503119,1142974063,4281409,1701604425,543973735,1668183398,
1852795252,1818321696,1984888940,1818653285,1325430639,1864397941,1701650534,2037542765,1684952320,1852401253,1814062181,543518313,1651340654,1392538213,1668506229,1953524082,
1953853216,543584032,1735287154,1967390821,1667853424,543519841,1768318276,1769236846,1140878959,1936291433,544108393,2048948578,7303781,1701604425,543973735,1701996900,
1409315939,543518841,1836280173,1751348321,1953844992,543584032,1769108595,1931503470,1701011824,1920226048,543649385,544173940,1735290732,1920226048,543649385,1836216166,
543255669,544173940,1886220131,7890284,661545283,1868767348,1852404846,1426089333,1717920878,1684369001,1702065440,1969627250,1769235310,1308651119,1163010159,1162696019,
1397051904,541412693,1752459639,544503151,1869771365,1851064434,1852404336,1818386804,1919230053,7499634,1936943437,543649385,1919250543,6581857,1701734732,1718968864,
544367974,1919252079,2003790950,1986348032,543515497,1701669204,7632239,1769366852,1176528227,1953264993,1380926976,1953060640,1953853288,1480936992,1968111700,1718558836,
1885425696,1056993893,1229477632,1998603596,1869116521,1461744757,4476485,1145980247,1953068832,1953853288,1229477664,1174422860,1145849161,1702260512,1869375090,1850278007,
1852990836,1696623713,1919906418,1684095488,1818846752,1970151525,1919246957,1818838528,1869488229,1868963956,6581877,543449410,1701603686,1685024032,1766195301,1629513068,
1634038380,1864399204,7234928,1698955327,1701013878,1328498976,1920091424,1174434415,543517801,1701997665,544826465,1936291941,1056994164,1140866816,543912809,1819047270,
1886275840,1881175157,544502625,6581861,543449410,1868785010,1847616626,1700949365,1631715442,1768300644,1847616876,6647137,1766064191,1952671090,1635021600,1701668212,
1763734638,1768300654,1409312108,1830842223,544829025,1701603686,115,270451456,1338462720,1338462848,-889133952,-1,-1,-1,-1,-1,
1342177281,124911672,118489086,1034,0,0,0,0,0,1792,2098951,0,0,404226304,0,65616,
117899264,0,16777216,16842752,16843009,16843009,16843009,16843009,16843009,16843009,544106784,-9744640,1916928013,7037285,50332859,126501852,
1974549571,440583,-236201725,24412732,1125092035,1396912010,-770975349,74766983,-633611641,1526730937,-654055820,-1246113813,9562376,512460493,-947257298,-1057045726,
1335888244,-1296037373,-380799725,1035085501,-1187401031,-1296484686,884128053,-1187794247,-1296482638,1085454647,-1187007815,-1296485710,984791363,512434923,512295735,45219886,
-1190415687,-1296498254,313702666,-1189825863,-1296496974,229816598,916635698,6267397,-1576770910,512426080,512294958,-1070464185,-1576770142,-947256213,-1057045726,512296052,
213451593,1159629576,632416515,-1966962087,2663114,54730379,55254665,512481927,-947256505,-1057045726,512297588,-628685996,55975561,55385739,-628630773,1946374075,
1963401739,-2028995065,108259802,126402610,149475722,62176036,-1031108659,141771836,108212796,108142396,321661104,-1976643446,-1073069305,1129052277,-227161346,1193184083,
-561553917,780717398,1060898698,-1151662475,-722795596,1534246632,1006632634,1971965402,1978591491,-1021130870,57983230,-1336108568,586279167,-1966253648,1872937010,1010558976,
-1155294488,-1930950867,2662514,57999916,-852627736,-17525,3022473,167984800,-1958120256,1392721694,1516004840,24635474,41036464,-1394073424,679798818,839807834,
54436544,-1070419733,-352108894,1092520725,1926890243,-105229583,1524251647,512354419,-140508353,1958742529,766044586,1915245032,99215522,-922828546,-392390284,141756205,
1965462504,-25761533,-1979434776,1965046791,1542514691,20047954,512335194,-1932721341,1877541746,-397323717,-1326957074,-1665136123,55121545,1912664296,1973198089,129034499,
-1672364022,447604819,1364827483,-689437837,1386043928,-1604696204,-1073085333,512428149,512295690,512426799,-2023881896,1398363870,-397158141,-1990501611,-2029823970,1497336026,
1128485722,1128470409,1224784058,-1958131383,126397682,-1974910397,1975847617,1519242738,-1962926360,-1996166882,-402435554,-1899158711,55713419,82386569,-1946232599,-2030030818,
-1963029798,1124567770,24446730,1128481731,-1073084534,540807284,188544371,-35065486,83486724,-2025591573,-350778918,47828,1008170066,1511224364,1376134120,742137204,
-1343743628,41216547,-88462276,-402426625,125044236,57945148,-1979882519,-2029831394,-2023859494,-1957472546,-1962921954,1124567755,1268713226,1133868190,991923011,-1948677158,
-2005600993,-343575563,-1564462366,-56491267,-1181758206,-1195769541,168266240,-1155500608,-1014365888,-930430678,-988100726,-1212422006,-1950338560,-1958565126,-1958565126,1019456250,
-385649374,540803123,-56620684,-1967126014,1127183367,39118928,1949969496,1967799302,-1576947704,-39714052,1968516098,126505132,1951973386,1946630826,126505178,36497475,
172223723,1267890368,-1850720452,58020178,-1174347031,-756546709,606726158,787022707,1589269249,2156555,-253215115,191019523,-1342171672,-352094839,1706725387,583691,
-1917835659,11397465,-1406209397,24494090,-389510461,-1053159787,1111750261,1330113259,1330905120,4347136,243263579,-1148138157,1093402883,-930430974,-654114635,1528269614,
1726501699,-1949791730,615263986,-385649281,977469867,-1957661247,1118580466,-495337462,675070346,-225763980,-784552914,-801368716,921178484,1949187086,365422595,57802928,
1476492009,-1406209397,-1073049139,602473337,207247616,-5222272,838947304,50176704,21555288,1543418601,-1406209397,2042628674,-1913961737,-1832038325,-1978921798,787647432,
1958742700,-1053146601,351007605,-1448367476,-1579898714,-1986096246,9293198,49004594,-39714384,1515804674,1968218428,16443395,1974549592,16050181,-650319440,-957807756,
-437760000,-393236480,1347944674,-1963020823,1949187079,1916419086,9496835,57880636,-1610577431,-1073085699,1515784074,1659437945,1009218814,-385649362,246480473,1375776232,
-402396952,-2023882499,-628664610,-1679244406,1539803648,-385837592,1364393471,535299978,14674013,-1605150119,37487355,512432757,-947256157,45137930,-1014362507,263453578,
-931984836,-873787132,80269392,6088731,-402349125,57806415,1476698043,-402159024,1129840714,-193607426,-38934181,1107520186,-1406209397,58031908,1107323881,-225769670,
-344609746,1006661609,-385649626,-397148731,-396688885,1211894999,41225136,199756976,-397323776,-380039975,984678236,1118501515,180456009,-1023314747,-1679222862,1536413178,
-1563886005,1515782909,-401825560,-398196770,-253227879,1022653217,1007186746,1022128944,-370641874,126549299,175317052,108267836,41159228,-1605361488,-1057094915,-922877324,
1274978281,540805002,154990964,171767156,-1018957452,966943920,701687811,-417311256,991332690,50044931,159115344,703091544,72792848,1532380648,-397190822,512295837,
45810485,-388234496,511048051,1263720707,-1974782070,1396917015,53812875,1515969083,-1956977291,1159629283,-2024099581,-402083366,-1957486877,1577268510,1398201991,3022475,
1457424222,-870322712,1963793128,-104404733,-1041693838,250125561,2018745609,1894659,1583188712,-1168712057,126484481,58052412,1376834792,-388331693,669734598,-396553496,
1364940209,-2130658990,-695537270,126522573,28364604,-806875531,-186100984,1435756636,1533874920,-930459055,-1978877208,-397717016,57933995,-386316311,-1595402623,-1957473536,
-1996203490,-1962922466,1577270046,-1252598137,-2036379262,-997830460,1355056799,-806763386,1367520612,-873905429,-116200968,7727299,-1781706517,-384867351,-1073085739,-1975260299,
118113031,-1958485900,378094359,116785198,1962869878,1538282278,-2028156184,1450240218,-1058513488,334191388,-1679255859,1160153373,1126074627,1007127043,1136620858,977012618,
-390419598,-1535880690,-1418559188,-1569502660,-1073552334,-1748111221,632618798,126501632,24263228,1948269763,1007186676,-1057032912,180603134,1023112384,1014133259,-1610189538,
-1073085696,1947221187,-1572646852,472646400,-181651085,-29620365,126491509,-31553213,-1979664638,35555800,-1576882173,79364865,-1073063936,1124567747,-31553213,1066027778,
938009067,-31552768,-23860478,-1564421952,1364329217,-2029845830,-387413286,-628665069,512318041,-1151859970,-1073086460,1913208003,-9836285,-17485764,-1010237760,1006829728,
1008169743,-1961659891,1963131422,1128481546,-1975314550,-371554505,27284586,50045443,292816956,50470539,77799049,50601611,77930121,50510787,-1303077399,45267203,
-1190874439,988285106,129939743,753234513,-1966568895,-16389912,259385916,-385941784,-797827295,-393592532,-1963003160,1925262021,1589706435,-1151934841,11862880,394844419,
1976106563,126508025,-1468715972,-335622424,-20322123,2031006696,-385502565,126547834,378220092,58000201,1274983145,1023323880,1006793742,35031821,-385649405,-1070399841,
1258487970,-402652998,24313491,1352618947,991533243,-1977912614,64654078,64685018,1490748378,-1976554338,50378448,1541048282,-1638345237,58049371,1008499945,1007121422,
-385649651,1978151075,250132764,61939435,-400817432,1398407061,773753683,-561553920,-1618104234,-2041527162,82530756,-8656815,1006829728,1960478477,1947090108,-155260669,
-1957438841,1577254430,-396960121,1396899921,3022475,1935399483,-112203773,1189610354,1225618425,1034030512,-51881213,-1009153262,-1545008974,1972948470,-385894666,-477366790,
54861449,62033212,-1947663500,512318454,-390397906,-561553906,-1319391146,-1325208774,-1979665152,-1966241087,-1326953496,1958742781,1959082686,574374842,-1057035916,-1943212940,
-985995403,-259340782,72933355,-401282301,1609049564,378136348,-1605237957,-397409541,1582826885,-1974018425,50045160,-980761286,635962996,50044940,1006937018,-1174179323,
1012073631,-1959693053,1392812830,-1961391293,989868062,-1961790502,990075934,292772570,990063803,-1341492262,384231514,870898311,383707156,1457424222,1515372264,-1489190053,
417870453,468510973,-27268983,225759755,-1963438104,1540459253,334037874,1293322751,-1596296701,-1073085617,-780877174,-1979701088,-170989104,-1978866200,1021872647,-402295667,
1267276722,-906048886,58049930,-386090519,742194714,-286546059,167989152,856192448,55419840,-17471767,2663104,1954758528,-34084846,-771027851,1944588404,-1564462338,
-389872817,-92930921,-1070462997,-33337438,55026112,-1962922333,1963150110,4161765,-1014824075,401163012,208726041,-1073030539,-1528233099,-182392323,1375734458,-1645731980,
1591379965,1951850119,-388331754,-1960043738,1946370326,-40638456,-504822924,-1965389836,1975716551,-42866429,54599305,1526939298,54468233,-170137255,-1979437848,1965833223,
-65411069,91523388,-853874200,-756526261,427055953,1979451112,238863105,-857144459,1947024637,-69146365,50470539,-402540861,-1073021399,-454494604,1973501179,1976499954,
-388895762,65732970,1261542376,1979436776,421390339,1072235381,1977039873,661383427,58052156,1006676969,-385649198,1012072612,1013806124,-385649349,-396820201,-397212759,
259262371,-396541464,130421442,-1558279392,-855114236,-1558279271,971526916,-401771492,58196273,-402640407,65750401,-1979700832,1958805224,471787555,1726482292,-351827387,
996730883,-1073065125,117575284,-33262603,1925528264,412739587,316598363,-9705125,851024589,-383874304,-388431100,126491624,715135093,-387413504,-12829902,-986051468,
1827144562,-385650152,237764743,-789119885,-397380885,-236389625,1011898378,1241609426,-1073035638,65602424,47616,463923283,-1628959372,-385648640,-286785515,-1610355900,
-662044631,125092094,2095579319,1541048145,689545704,-768845749,-1189907373,512426034,-654113559,-1977913368,-402426617,-789169474,275956226,427081982,-1978140952,2043215554,
911619,-393559810,417865904,1976434199,-1998038023,-21173766,-1070425139,-397323693,1515793542,-125124558,512350346,-1017445143,-1614794157,-2041527162,719972548,-488045708,
783897586,-1241337344,-1999043587,1526771767,-399907095,-1073074637,1954888899,866314499,-2061954584,58008380,-399496983,1944591664,578480128,1380926696,480766035,57891162,
1360610793,-402606766,-1336209083,-57415421,1684361791,1919295599,1931505007,1953653108,-1975320563,1975519751,-225253117,-227204548,1526766569,-854791333,54173852,57982986,
1509061609,-401272645,512452107,-389872829,-1152176236,-521600522,1948466176,482273522,1360366777,11543100,1604517808,-388008700,126488795,175451196,1604501554,-107091964,
1877476587,-397198568,-1017442000,73375827,175423498,216547248,-400510954,48764423,57891100,1360568809,983744562,738706947,1398528647,-1337241006,54108800,-386310424,
126493349,1965571147,11879200,1290323454,-385649159,574419432,1172898677,1948794111,1965636843,1976434409,-114169627,742131572,-907476108,-561553679,1007127126,-385649620,
28376881,-402347614,-1449131934,1959329284,-14685949,84797523,-1930951819,-397714670,-2023819013,126506718,-1955320772,-320320677,1539312376,183042932,738707199,-1957493013,
218324510,983744562,-561553917,-402330794,-399763550,-2023874280,-1974315298,1949056007,54173706,57982986,218139625,1386397746,425912324,-1947663500,78243886,-398953136,
-259327845,574417034,983567988,-1967126013,-1241352976,1261221178,1477424872,-930479356,168055456,-1023314496,-628637302,1578551995,1381424775,-386207511,1348008035,-1682373316,
57889046,-380438039,-397716739,125106255,57945148,1593729257,1263984263,1962426088,-9705213,54173786,-628637686,904463220,-379891177,1659436450,1975519994,126501653,
-1308161469,-385649404,-1958481714,378094359,149422903,1971600632,-11540003,-417933848,-402651927,1260918478,-1320025930,363194369,-1293378099,-1564462591,512296104,512426834,
-1973877934,824084743,1944468483,-381893887,-382962318,209047690,1006828448,1975683587,282519811,-445445060,-1241284421,-1965423872,931802821,-713832902,389986641,-842626479,
1954495646,1917926500,1023288429,-1603832710,53215995,1038680949,-4191504,2030347062,1173763,77936383,149488506,-1623785728,-1590231292,-1979513852,1374194378,1360536505,
53550731,-1224776727,1927687168,1929591860,-805225424,986067664,1945144006,-270604029,53550729,-336120088,1399187680,-1186187288,2142659881,-397227541,1398428595,-350539335,
1019579070,-1023315356,79319633,453229412,51505235,1994982260,-1558279169,-927378684,1503456037,-56442486,50044930,225822010,678691388,58000444,1929412585,-1963947463,
1946696901,1019644462,-1973980152,1946434757,1019644518,-385649405,1702096764,-1258050885,64553728,260714201,797584963,-1558279334,-389852924,635982604,512318284,-1990523743,
1493475102,1264248922,-1152190488,-56622186,46190594,316181187,-1966921017,529215224,-980753409,1274472528,50045528,-747371460,-1558279845,-388895996,1515803287,-352083781,
1642617805,1248192587,1531652328,77930121,-1558279845,1407576836,1357437575,1172855626,1246357579,-397657111,58062387,1945036009,1355606275,1914064616,14412035,57876540,
-839483415,1975582367,23783683,-381892354,-365111948,-1343683723,1965177856,221112579,58053436,1006759145,-385649370,-717487919,-387445643,2662645,38004819,-734215333,
-655880843,512447477,-135789753,1019435850,-399608358,-1679231545,591144980,-1192751755,1088967429,1541048102,-402652183,-2081939719,-2024593132,1977289690,-153229053,1531678184,
1976581315,33614083,58054716,1007717353,-385649208,-600032304,1290339189,1977498670,318368003,58054204,1007644905,-385649275,-616814024,-1528233099,1976646715,41871619,
-386047768,-1020718034,1575517622,1377733629,-689417469,-389850269,-2024596076,-1558279718,21096452,-1343749260,-1966908598,1918974983,1937456377,-1017174795,57943612,-1158255383,
417857536,-1709835,963923772,880101436,-1975319115,-2758649,-2028655896,1007317978,743273274,-347508176,1934048262,53947459,64685019,182125531,-2015851837,1976434394,
-309532207,-187307957,611572359,57817148,-1175622679,55642064,60584667,60322523,1502900955,808190133,-654063478,-705963385,-2025154072,-1975270438,1015098375,1393456391,
1022663400,57957160,-1337335575,-805260025,1372097216,-1963686168,1929723073,-58464222,739463656,-2025220888,-1558279206,-561553916,-628665514,-2029754904,-561553702,-400430250,
-2023817474,-1014343970,192023612,-1580393668,-402427053,-1168420741,-1336796715,78160385,-855590471,785974176,-822204417,-2055935428,-2123092676,725403390,1019412853,-1610910487,
-20734389,1505759936,-16464606,-118964198,-1240470711,-65869734,-145714456,-1558279725,434723076,50045180,-922875844,-922826498,1355123395,1481668328,1970945114,1250552067,
58030908,-1186437399,1011967244,184776006,1346159578,-635239563,1966881987,-1009110269,91566652,-738731469,601094083,-1009518630,-806757845,6529096,-1343749141,-1967063501,
-1967115560,1233447416,1375743720,1593717224,-1957241209,-360425,-1125579915,129699572,922702693,-1605237936,1011876603,-402426621,-2024272649,77839322,-211687221,1006633145,
1007711003,-401837551,44102483,-792720893,-2016900400,1227738,-628631293,-2496317,303097938,113436903,1457424222,-1017440375,-378220484,477417788,1393687016,1158804968,
1192358376,125098636,-418256408,-1996055576,-1023193066,-402525208,-628686368,-628680823,675022730,854131572,-219027211,-1977925656,1965636615,-182195965,739359208,-907481365,
50044929,-1991196662,-2029825506,186616794,-385649189,126544756,57944124,-402600215,512357051,-628686031,55713419,672237032,1397801010,-2135893369,-402441822,-628679952,
1457424222,1342372768,-90445742,55713417,824084827,1105745923,-402345727,-121958345,-1948515329,1207560419,1342372768,55713419,691799946,1005065076,-1957483503,-402444002,
-349433550,-459122511,-1073063933,-73249164,47874,-1075258365,572231,-477373437,-33311910,-225752381,2025851564,1246382838,33749920,-1595372861,-930479132,1681704194,
1424556914,-1014345485,-423952203,-1965489405,14674120,1360840121,-191239855,55713419,1408367336,53550731,688966120,512316080,2090861361,1342440451,-930428720,1477416680,
-789133174,-661995266,-603717705,-1168907381,-1628961926,512318208,512426874,512295908,-880082052,-1174176069,-2031615002,-1963423232,-467760680,1344178947,512312068,-947256240,
1302512394,824085252,-107943933,-242358197,703136628,-41031446,750391669,-1558279421,1926904580,142403590,-1962350872,-1979483618,1137937143,1125091907,1094791050,2059092289,
3139587,-477373817,72359563,1344178507,180849156,72196803,609441883,59554567,11913354,-51848957,-1950131204,126397682,-1974910397,1975585477,-1957444622,1124085278,
1968954123,-385043724,-404166194,-2135895793,167983522,-372733433,2117867867,-1645673612,126501865,1971534915,212134147,58040380,1010282473,-385649246,-2115422016,74836201,
-370353529,1642659129,-1477946876,-873976817,-389850624,-1007747088,1392503784,1258336848,1961933544,260892679,11593772,1592822360,-1604919673,-1073086370,-628683915,853182444,
1959142082,-373072914,591194420,-1763165068,-57546504,2112378997,-1228502496,181466624,-385648192,-796200525,256436306,7137324,-997810342,1405388368,46303826,-1328510272,
-997810412,-372996528,1357389832,5040368,253814864,4515884,-397257896,854073543,2042628666,-244193021,394811971,787006299,867756032,738208162,83653390,-19859940,
-1564343616,-389873622,451473427,-1662495752,1541048140,-1073035638,-268310333,-386397976,57999339,1274098409,-1963986200,2145960898,-387429387,1503841775,1374352104,-1960306200,
1258502942,1961875176,245950478,532932652,-1070464334,-1155426584,512360447,1978138670,-1341819632,7315969,260725339,1127189059,-1056258678,1038680949,-527374103,132645749,
260722957,1127189059,-561553839,1004177238,57891290,1592336105,1398201991,-1982167215,-402437858,-1973729878,1946762247,-400510971,417860595,33012480,-402651672,-1746203469,
-1073084534,-389873291,-347924631,33012211,-1070399562,839056546,73310912,-349734424,-29146874,-1965067058,-1950348793,-696997127,678562620,-796254148,574371954,-56620427,
-1576979454,581960444,276118076,-805110624,-804818216,-1560468272,984613628,58310666,-1979695895,1949187280,22538249,-1070463885,1587550443,1958742532,1975582223,-1960792053,
-29250823,-1023314482,1587675568,1019382276,1007120907,-385649888,-108330697,-1602032726,-657456388,-657439886,1383323856,-650377334,-1514450605,-814394592,-1393456311,-948613828,
-1393456311,-1082833604,-1393456311,-1217048004,-1393456311,-1351271876,-27568040,-20513082,-339280186,-1973724883,-13244153,201522336,50110978,-1597784014,67896060,-791612437,
126543730,58033212,1023402472,-402426481,126549989,126533886,-1975319179,1132405767,58040636,1011087592,-1979025999,-381926649,24424880,1381061451,918266829,-1310160383,
1136787008,-745867382,168266286,-1611500352,-193356221,973572654,-2014808635,1959804122,-1965999102,-1973855551,-1609796144,-1073085346,1587675312,1008069380,839349595,73310912,
1587551723,-1329591804,73310975,548408692,1101724043,58052350,-1979341591,772205506,-1975318646,-1954601776,-29250823,-385649202,-1039530611,-1472403079,-1070463627,1527013026,
-385981207,24251839,1915763907,-180732677,-1998042173,1347506925,1492001256,1361163705,58002236,1010983145,-385649396,512442979,334037762,-1604691633,1337066240,108268348,
1219628092,649073781,1101724043,-1066086658,-108281206,-822197846,27309684,-1308345341,-1308200448,-1308462047,1007127075,-402426592,126501714,1958742595,-1426486486,1959722561,
50438287,-361626564,-1952560737,1100983537,1006925214,1007186990,1006924868,-1294764731,-1966085376,1958742722,-1426486519,1976499777,512475905,-1360461058,-403576579,32893009,
1364286041,1944592616,-1963488757,-561553709,-633646250,15270770,120437742,1499002600,1577704891,-2024350073,1478396890,-1393390845,1101724043,1977236290,-1982231564,-1023191010,
-402640152,-1910627133,-1979494370,-286712057,1501432,615639122,738941416,1526496744,1342606854,-1426420989,2062074631,82334708,1541048064,1806547395,-127276975,-1530005896,
1006937760,-387091056,-394766165,-1186430232,12226944,1077602560,1358957241,-712313462,742143348,-397276300,-292885132,1952107146,184608806,-312022996,-396878476,1378618102,
1961715944,-457774845,58053131,-2014491927,-561553702,1373275990,1525107944,1189630290,1524206567,-628630981,753468275,1482250989,367743571,57923843,-2014503191,-105163814,
1541028863,283706227,395006701,-628633077,-1978895270,118113031,-2019669089,1372943834,1493181672,-1957536934,-771013865,-628681612,1457424222,-1992041849,64653079,1541048281,
-1246108437,222056712,1034076210,807308035,-1975301376,118113031,1136853365,-398256245,-1073026181,-930419596,167984544,1958841024,1017498971,-401050201,-1992496285,1558766709,
1963867371,-1394060579,1976699884,1009380106,1389131022,1408016104,-1612280600,229678665,2028486514,603765512,1466558546,1096869979,1364417369,1531007464,-1544860838,1701080661,
1701734758,1768693860,2123118,-361427652,-329127854,1138394963,260719427,-1339061693,603437838,-31552685,-2008329470,260590383,1527220299,54370499,-126566390,-385922583,
-398325326,-398390866,-397211222,-1606088282,-1073085347,1860764532,512447459,-628685990,56368779,57989691,1541627113,808191882,1240007539,1912749283,-482154237,-33268574,
73245376,-1008036120,168266286,-386370368,-347930621,-997810189,-372996528,158598937,1408402664,-347666712,-759475424,1453713444,1510793704,-1880554637,-1975299575,1157687303,
-1073084534,-454499211,203327814,1067378688,1632813915,1836016750,1836412448,544367970,1684366707,858597408,943077170,544175136,909586995,-1325389513,-1325208803,-2029996774,
773753818,1511950592,-19233020,216550341,1008170218,-401902302,-1073026557,574360692,-1589840523,-851698316,-1073027979,-1975315083,118113031,58053002,1138925033,-1992091765,
-402367978,-1891833385,-397342859,-346428399,1971600601,48779527,-823436820,440189322,225707914,-1552633540,-1586122180,-1653223938,1954692291,1971534998,1959657108,-375527181,
-628643724,3022475,1511951187,773753092,1373275904,1494341608,-377362357,1948592826,139520008,2042252076,-561553883,773753174,-1018012928,-1465888609,78225924,1352638040,
-1465728974,-1013032956,-1979524120,260719367,1513065027,-689418159,-259368958,-1975314550,797590287,180521563,-1023314490,19711626,-1070401166,-1057045958,-822152845,-242496770,
121258412,1956529055,1927935452,1039657023,-51902229,-402396355,803752622,42592256,1361647545,1396901770,1526770664,-1975316598,911407,-388461997,-1017511333,-1779957328,
53263104,1124567123,-1017440375,-1977436853,-5155851,-33060285,1958742721,1959148040,1975859716,1965178095,-390993917,1019578963,-32672468,1959395009,126503687,-176938948,
-561553829,-628669610,-1259814518,53263103,512447152,512295692,61867171,-402457694,800734743,-1982186749,1526926366,-1686829174,-385871686,-398204638,-320274542,1048373249,
-822163714,-242514572,81389740,58002748,1090889192,-1073025813,-1638399253,512446623,-628685988,53419659,-930426634,-654049355,1926904643,790530319,-628669693,1489215064,
-1013005178,247111256,-385649408,-1069883190,-625389409,512446758,512295690,12256047,512447232,-1152187556,378209038,-633666804,1948723897,10283267,-1996234053,-1962652130,
-1996269026,-1962652898,-1962715106,990137110,-1977912102,1128481543,323348560,1963146328,7464965,-796213198,-637337418,512482795,394986574,512479755,427033434,512350855,
1128465486,1128470411,-637281657,72031881,-1209279865,1544981337,1977236227,7137539,1346570122,-118996157,1125091858,1480798090,1020855123,-1981975293,1526936350,11865994,
-654059261,-1948612797,-2029833442,1960459226,667269572,180367953,-1639735545,1134499722,-1623749986,24485443,-1949594685,990064414,1926859738,-2023859213,-633645346,1457424222,
1943636819,1482185187,-1018080685,-620012710,-1974732428,260721455,529156947,-654114633,-779422326,-1949594805,-402444514,-2007286624,797459215,-380905077,1397882592,77799051,
1457424222,1592828136,-396960121,126499821,-1558279341,117592836,1929383866,-545724157,1526586344,1577076968,-396960121,-1957494721,-2029834978,977114,-1157624856,-2023876806,
-380414242,1583087111,-1974018425,260719367,-1976595901,-20709672,-1023314485,-1951600245,1111599866,-1830227477,-1558279365,-388331772,-628686816,-1974278795,1255246581,512429962,
-633666769,-1070462347,-654055286,53419657,-288504997,51125899,1261406795,994774922,-1980860966,-1023210466,1360756665,855619560,-1963947328,-1010824697,1360756665,1979706856,
-413800189,-1961391293,-389829390,250150190,756976630,1494714371,-386043159,-739711489,-135780348,-873966859,-85447676,80013549,-561553879,-320318634,-402295567,65795553,
1526708712,-402651672,548468181,-389903792,-393544468,-20578728,-1950583603,-2013057762,-838974713,-1343489675,838902760,-561553728,-1329034666,126505811,57853242,-1313159798,
1374179584,1398495741,1127189059,-578142326,-654114635,-1461138549,-388461828,-396689673,-387318003,6744316,-225750438,-339400020,-1965389892,6088711,-838941186,-1729559691,
-1243065882,-997828607,-561553762,695581014,986250833,1912648967,-930430207,-1054210166,-393559494,-359992462,-16717629,-1897331851,1137740529,55779211,-2010150182,-561553865,
-397717162,-1092033257,-2007279297,-628636881,688120296,-1974379943,15254506,-318510875,-1326382360,376721409,-185341864,58048522,1357260521,738442728,-387126040,-1276626435,
-1957483517,1577362206,-396960121,-1545016103,-397203197,-628621744,1364745049,1365575609,1360756665,1156076112,-1973921026,-1966539032,-1341703480,-1952288000,-1073042190,-1720400502,
-1975318646,1066025775,11918730,-1054156541,1381099658,1457424222,-1958539382,1381194519,-1393390767,510986042,1959394882,-838974708,1515908981,-1070441895,1515871171,717589081,
-20905273,1515832256,-838974629,-437530507,671293928,-401827864,1381185889,-1958487417,1545505559,1926904579,807308050,1943681792,-397190390,1398537006,1530511080,1457424222,
738390504,183768552,-385649216,-1974409909,6744071,-335222702,-41228205,1499191943,1592298072,1398201991,1583679419,-1974018425,1958742721,705137296,-385649723,-1057037029,
41075002,-846544502,11913726,394937170,-1975547325,-1965489190,-628663576,-1958539382,-1965390049,1975519937,-225721599,1107789996,1959394883,1976434420,-5061647,125053244,
738357736,-386689560,-1020722582,1961858792,452867,-386067736,378272636,512426844,-873921745,-1615540753,-2041527162,635982788,-385649660,1482364893,1369359494,317411487,
1336066098,-443291389,-389480935,145761123,154941675,548409461,-385889560,119808846,-1638337419,540853081,698359922,-387413504,-973200582,-838988940,58049850,1946186472,
1962884105,-390005243,-1638391001,1481678681,578611358,-390738493,1031013308,1930933992,1397903859,604321440,87466696,1528351976,1805670746,1958742532,822798595,168095648,
-1157139264,-380432664,1364394221,120437586,1515127528,1527623769,554887363,583854275,-126566390,130419691,57337856,1963062971,-1330197241,-13768691,1946377192,-1010814461,
-1394032590,-1010814430,1587591117,1975519744,-991378687,-402426369,-1863777828,854583297,548399187,-1326964364,1975519999,45109264,-1946579992,1510157598,-790030455,2078822649,
-796239623,-1141093656,512294918,61867171,1526922146,512447427,11862794,-654059261,-1020647760,-5187446,-125122790,-603781518,-1023315109,2891403,512314187,129631045,
-623580928,53419577,1381099891,-100210605,962157147,1929588510,1977871322,807308246,24766464,-1576770398,1034027838,1124567043,-1992095864,-855418850,807308206,-1345500416,
54206089,168060320,840398272,73245376,-1258005342,56671002,130461901,-838974716,129693813,768768,842516200,55550656,-125118326,55385737,55975561,50994827,
168061856,-1996196416,839069470,8186048,56106635,56237705,56368777,168060320,-402426432,916460980,1963009029,87466499,740199257,-1991554304,1124287774,-1951281853,
51297251,51125897,-386403352,-1070405942,-661981046,58465929,-1996206686,-1996233698,-1996206050,-1576830434,1364394809,54206091,-1009108029,-50623650,-1957255634,-1979025953,
1916419079,485081857,-642586143,512481927,292814896,1390992007,1256739810,1524206556,199820146,512314339,-628685986,-16943677,1963584448,58039543,-1660248088,54730377,
-1996288325,-1157428194,-1957036276,1392520734,583240348,1958805191,1411287308,1126075139,1444841731,-34215933,120765341,350815092,-633214502,-1336930384,-47585186,-398457768,
-320209629,1444842493,-1160049917,57999377,-1948695063,-1996270570,-1023398378,-1564462408,-389872522,1397885128,-402362693,512439819,-2023881894,1827165918,937971948,-1377293057,
-393586680,988569320,-385649467,-2023827192,-628664610,1511951187,1977236227,1583045139,1381424775,1530254056,-402362694,-1017432629,-1327405335,54108673,1963488232,966939635,
-1963095549,1229539801,1236070795,-126304246,-637318839,512481927,-633666724,-1951599989,1117760249,-1639866466,-1958088587,1545505241,126507779,-1217057732,-337648920,-997828426,
-1966908514,1916877831,-178569991,-34674237,742194036,-68679308,-1058518048,-387025697,1949105810,739675112,1949056000,4712451,-542513077,-397511598,1949105786,3663944,
-543561653,904463220,-561553704,-289713322,1943681792,921197357,1395094016,56106635,50336953,1943682009,-1982167271,1526925854,2891401,-392762533,-770968848,-1729559691,
803849184,739675133,169224960,-1950684413,-1950209085,-1295137840,-383874221,1541081860,1311769027,-47128272,1529868591,456142896,1444842288,4909056,-339541644,-352210940,
-1560301566,-1057095568,-1224645144,780289,199813237,6219807,-1597784014,-1019608996,125040756,-1070409590,-31525399,519104963,973101984,-1327270717,1958951425,-372506915,
698359518,1959213568,-372769071,512433874,28770395,5774985,-1960917527,-402631138,-1233846263,-1979700832,-1329206280,1959213569,-372244823,1537220266,-1594324480,-662044580,
-1770862806,-397360898,1486880921,985923072,1942748867,1925659149,-1342016247,-1563886079,-27787176,-385649208,-555220989,1537262366,-1596421632,-125173668,-244137174,-397360898,
1486880895,1925396992,2026322448,649475,-5242251,1487061246,-922855424,-1142304908,1528728350,6135808,-980752246,41141050,-952444790,-125173133,12044170,-1057045718,
1342206650,-637281657,-2008873080,-922860793,-628622987,-1564462504,1503789144,5939712,1358900201,-1258276888,-1966568959,-1426420795,-1393390774,-930420342,1976106584,-347028735,
28659946,-1979705368,-1949988152,-1958565126,-376787726,-27735926,1357018312,-1168905237,11993204,-637285378,-628684918,-1010818469,7649875,-872546121,126409219,-1017390457,
1105766093,1444842241,1478396160,2727936,518766846,216547248,-400510726,-1070401017,-855627870,18802855,5643915,5774985,1520617354,81913856,91540478,-1343749712,
588048639,-400342552,149429156,590932003,58048522,1344042984,5643915,2696842,507167998,309657688,5848634,1049101427,1043988569,108396634,646506378,-396885926,
275906607,65583988,-107354110,-402541589,-1377044077,1962476348,-155454207,993837825,-118883467,-29144100,787642569,-160102598,848608195,-320336207,-385648129,844103687,
7512768,849525592,-655881039,-385648129,-1974468576,-792720703,852003520,-1142388032,-654101842,1125616174,1480034862,1444842322,-1073036544,-1071512637,1444842435,33521664,
-872543371,1979635688,691964423,479258624,-1007034647,84279821,470551299,236920349,168369023,100798984,235733765,889133951,885666902,867119929,891630855,872494413,
854799479,233321409,1489532157,-138674507,-113121279,222037896,171708788,-980810123,-311099844,1976434243,852360936,-1157134144,-1597832714,-1073086350,1642609268,-628666114,
-2030041146,-389808422,698352425,1959209472,1354825227,1476457960,-143275778,5643915,1493056488,-1070413686,1118501515,-91504246,-1010814294,-1073083728,39512259,-1258162246,
5808382,28820282,1962944928,1478396691,166220288,698374910,-1610255360,-922877862,-402629982,-980811204,276086818,-34674606,-1224116902,-1597768191,-454361047,-21964153,
-259340758,1007127115,168326176,-33065536,1258517710,-968626197,-628686841,-1219490384,461170689,-51901008,32947191,851704152,33006272,1979557864,-339476988,-352079625,
-20477219,83371208,-1967063544,2728168,41141562,-980752246,167801504,1975880384,1959213580,-386364923,-1070458058,1959209667,1352683771,1370112,1492626152,-243939074,
7512259,1923272950,-1010814464,1444842323,1923108864,1958742528,256003,-1597809832,-1019609000,-1152184203,134086746,973089184,-2013105401,1352686343,-389510656,275906959,
844160116,-47650624,-420953090,-872523775,28820478,-1605114901,-952500183,11996021,973102496,-33524285,-389546301,1398472713,840609256,-1329374272,1959213569,-338690556,
-872525036,698355316,-386364928,74841296,1457424222,445179995,973101216,-1609927229,-922877862,1520567156,21161984,-55646125,-1006759563,99090871,-561553918,33286230,
1541860187,840586728,-1847016512,-1609861636,-1019608997,-1006762892,698413291,-1594324480,-930480048,438495313,1958742617,1958820364,-389546488,-1070458326,1959788227,-387585036,
28770452,1394219496,-402632544,-27590227,2728135,-952450818,1105784181,-1213893124,-339476991,1879492322,149618688,-400955928,259129674,1946173672,-386798829,1005066710,
-402164991,74711089,-1070403093,-1564462397,149618800,-400966168,259195170,1946167016,-386798613,333978030,-402165247,-596377577,48820715,-1949046016,-402631138,-864683324,
-1763114569,1444842490,-85989376,698400373,-369587712,-872482150,-1041758860,-17337093,-1605254205,-952500134,1743264370,1501209,1118501515,1457424222,-2023829506,74733278,
-538195970,-1073036455,548405877,4581571,-74782640,576198004,1022457024,-1595050976,-1053163440,-1047861644,1489223714,698401785,1959213568,-389546471,-28114748,12314831,
-1597505957,-1057095639,-344602822,1352716286,11003904,-397323325,1348010148,-1696022134,-930457600,-33543776,986185408,-1964542521,1405311937,704666784,1949266627,1528728354,
-561553920,-1014344874,-1610589278,1554120797,-94705664,-561553829,1528727894,-1219273984,419031041,-385765285,512490246,-872546218,-1410858124,-100734952,-1010041253,-76402628,
309475900,-210616004,175266620,-344825540,41057084,-1071463431,28791747,-1979700832,1709724136,-12822248,-939653004,-243937794,1398522715,-1528299081,-373073128,1240012867,
2662936,54992523,-1021130998,-628637442,334227572,1946285755,1134361057,-388860439,57989500,1540977385,55121545,1926461672,-633542397,1128520075,1128470411,-388331693,
-1973735858,1946762247,-400510971,-1125583721,33012712,-387405336,512490335,-872546218,-872543884,904398196,-17337094,401664195,1020371177,-385649654,-1957432213,-1979389666,
1539508935,141888176,-401756080,-1017580457,-1326165272,-196220915,1271073456,1977073384,-1880571135,1538862326,-927968969,-1070464277,-1979516254,-390869745,57931721,852508649,
-1561818432,-1975320434,1915632647,1007514690,1006924602,-402296016,863172523,-1252923254,9353983,-973176820,1118501515,1007127107,1006924602,-387091664,-395053173,-462148036,
658294154,-169278606,-1901962801,1007127040,-1172409562,-1236125693,1948597250,1019674244,-1023314652,557631230,146209140,-210492612,616663640,-1227847041,532370176,-1965423869,
-1974772937,50045638,-1596517656,-922877127,2062091125,-385648639,126484496,58009644,738250217,-385649357,-1070464826,1392720290,168054176,72000192,512433780,2126119804,
-1982201085,-2029761762,771221978,168053408,841249984,72000192,56237707,72031881,56106635,-399647511,851705604,-1963947328,-2023859760,1539528414,1457424222,946518610,
-411772357,991550138,1232362202,1457424222,-73379501,-1595373054,-989724530,-930430722,1090565457,512442689,55771996,-397190695,-1990513639,-1962714082,1511950809,130435843,
1977236224,931683064,394877507,31320131,1531107975,1116137667,113641707,-385875121,1088948856,-1157138974,512294918,-1017445213,-98661549,-561553918,1391495766,9353809,
179106443,-2026015552,-805174054,-389510440,-1047858237,-1975316598,-28228817,1408595400,1342213792,686348935,512317655,73072821,1507381250,1261406283,-922873976,512488821,
149618869,852953832,9347776,168058016,185103552,-385649198,1498021983,-1631287720,-2023826809,-2024581410,-1967063334,1007127280,1015575596,1007121449,-385649571,-1662464448,
1377733077,512318211,11666170,1393027922,1355056799,512476294,-1343683750,49979436,57982986,1489903849,-1952529274,-385649205,120204117,-1729559691,637440,-1597105687,
126354171,-1227847101,-997828608,-385649250,260571338,-399538109,-1975320365,-218765112,512312131,260571953,49979459,-1047867184,1352601458,872701088,-1245148661,1939757056,
1100962052,-1626371938,797459280,712697923,-922837416,1352653429,-896864630,-637281657,-806812813,-220403470,56368777,509515,-126494149,-1975402446,824085488,-2028500477,
64685018,1272612825,1125615947,1922979907,-1964471738,1124567752,395008950,-2023865533,995120862,-385649958,501808975,1490682666,-880031490,-73342091,63671042,1912876251,
182125320,51082432,2059406043,190723,56219907,-1948612647,-1023192546,1539316473,1124567747,-1979665071,1507394504,-1621995069,9353808,-1968377205,-1949958424,1128443122,
-838989944,-1638337163,-389850790,1793645658,-215947223,-1948612805,-352017634,54173706,292864010,1406830426,983744562,-1665073661,170887762,-385649171,-1958488737,-1977292001,
45175765,1011025802,-385649316,540803485,-1040316811,-327823874,-1326806437,30861404,854622952,-1966044480,30075120,126546058,1965112387,24111363,1383342908,58009148,
-33464087,-385649203,725352750,-646707024,1124567627,1433677372,58023740,1006712809,983331932,1018590471,1008235556,-1968278230,37503941,126485618,548414524,-838989195,
851362558,1125123264,-972897538,-1023479670,-838991695,126509428,1949187139,1948466206,1965833453,214338083,-336557504,1007127265,1949216803,-10098429,-29163087,1959657153,
1124567606,-210492612,1005894226,-1963488686,1952333011,121291521,977533813,1140225287,-243988678,751143491,1525314052,-18314662,65749958,-1973757305,-1023521850,477431844,
-980759810,343195658,757860234,-29620620,145754741,-972946428,-838930294,1702141275,48779857,1364810459,-1964340653,1019282117,-385650151,-963980253,1558741004,-361240517,
-655864997,292878802,1006844578,1007121467,-385649620,-991376536,-628663854,1385976667,-987101302,-1979664829,52399056,180718298,-385649472,116129453,-402621464,-1654919385,
1491665780,-402426882,-2023821337,484988638,65625068,1575535576,-1966211584,82330375,-1312101393,-1325012224,1476520705,1172884990,1956469504,1860719056,662694106,-1957473959,
-1979407586,-1979665943,-980791099,57982986,-387145240,512485860,173540515,-385649216,120258398,548464778,-838941186,1340670837,-290330369,-1974405909,-1329591610,-402426837,
-1017581917,53812873,-387453720,-628633073,-1627363608,1151311428,50886046,-1981576231,-1962719970,1392520734,53812875,686510675,-1981217932,-388331574,1735721023,512353163,
378209093,378077230,1128465498,1128470411,512302987,-628686802,1406782696,1529316584,-1313273484,1374259712,-1949205015,-1996203490,1526738462,1877563737,310225,-1975264253,
-2101787897,1975597568,1227015,-286533373,973124025,-1023314751,112793401,66614272,-1159992359,803799070,121301194,-781326261,1927828852,1827165145,-398625571,-1947716854,
-1558279192,394937092,-1959294397,540847346,-2008938123,394808119,-401605045,1264314588,1959869160,1950039074,-267851771,753421100,-399724335,-1158943313,-1461181776,-390403859,
-1595399504,-388502547,-1947603353,1403571670,-2014776694,1007252481,-401640390,-143064706,844879498,-839077696,-963984469,-922828246,91423292,1642704077,1912945865,-916788989,
-1974381991,-1159165240,-2023866724,-1974249762,1918974983,1937456134,1361062914,-225711990,1111731246,1968817466,1976172053,787647458,2025851564,452867,173693787,-1073036352,
-225711240,-1073042386,2040414879,1540197109,787647315,1975519916,-922818122,1145198923,1380144127,1347223118,1140666708,-63876287,-1856472320,-1118263464,1403637080,-997810350,
-1161525680,-637337554,120258480,-796213246,11971277,54440379,394931930,931802691,-1631287720,12048522,-1976641021,-1976679657,1524270903,1457424222,18371,0,
0,0,0,0,-402653184,-397158383,126544268,1333051402,1125616195,-628473974,-1070411638,-402194526,-2036334885,-997830460,-1241190215,-20775413,
-1974635318,1914715143,1949187110,-1426486488,-822197439,-2040993419,-2036359484,-997830460,-257888118,1958804996,-997828602,-373072994,-347879384,-1576947510,-964032769,-277607620,
-344849604,548465780,1101724043,-353644802,-108322640,-822197846,-1158941067,-29161590,2062074826,-1596421409,-1019607841,-370605197,50378695,-1948612645,50651166,-1608545318,
-1057094346,126540660,-713768950,3062355,126540291,91425084,-1058415411,126507975,-1007042550,-818550709,58008380,-389075224,-2023825622,-397191458,58064811,-1983407127,
-1023088354,1360304313,-1965613848,1965833223,-1847045287,168266472,-385649216,-1958492292,604473887,1006744287,-1307216823,1951349762,1006940687,-1308003246,1950432264,-950736637,
-1343729061,591146221,-790101131,-556996402,753770984,-1073036662,1038680949,-1293397817,-1973856002,-371339823,-1444413309,1007127294,1963242114,-827987879,28476732,1329352052,
1228677236,1810380660,1743274477,1676169453,1609060589,1541948909,1474842349,145900781,2028481771,-313726770,-313989035,-314251180,-314513328,-314775467,-352144812,-832706543,
1122841064,1307389416,-397729614,602459727,535314925,-1974316051,1965243399,-834803709,182335976,-385649216,-556939600,-1974775116,-836114224,-974584972,-561553722,-1614640554,
-2041527162,-1662495804,-385649410,-1973762411,-855032634,-385649697,-1185692029,-654114770,11548552,-40769189,1975519827,87465994,57934116,-402438423,359988843,82386569,
1929556051,-42866429,1357504717,52750534,834294619,-1998978304,-1963423225,-383874600,117594884,1526728646,65796547,-1614794227,-39851952,-1638340147,343167135,741083018,
209043466,-389179672,1481829482,1352661406,-1070444385,1424490930,-383874049,3258628,-1638344445,-2145075174,916586764,-1617012731,-1564468656,126485743,58310666,1476450537,
-402426722,-1070404777,-369218328,1122551557,1273679357,-1295169816,58063232,1946515944,-334436328,-1303364564,-402229870,-335950545,-335484920,-1296037311,-1974427902,-1576000318,
-1638398878,-1057075041,838885282,-19011392,-1957454248,-1979389666,-2145101049,350815093,1676170205,73572577,57982986,-1962640920,-1996269538,-1962474466,1392521246,82386571,
167823080,-385648192,1307115542,73572549,57982986,1527030504,1654833202,-20387580,190555,-1595349013,1979464704,437119235,535423949,807308229,-390067712,1189675011,
-397369600,-63176573,921240437,-845260774,-989795860,616799832,73638432,58039896,-389746199,1671490167,73703940,838904808,-51255104,-1988098106,-402331362,-1073086389,
-305286280,-1597713431,-1073085340,686293876,-953686012,512312131,1525154648,-1564462358,1139279158,82813182,57982986,-372508183,-628636220,53419659,-633611641,485005426,
-1564462358,-337050314,-1957538839,-1174083298,-637337554,1532626826,1394505155,649744465,173101635,1498989504,-260454146,1532609371,742131594,-454494347,126505419,58008380,
-389293336,-2023826474,-1168943394,-112049362,683271167,81764417,916504555,2025851397,1093188044,-543113166,850324228,-1964471616,-63838011,-1610610746,-973208353,-277625558,
916635698,-376051707,3153547,509515,1539562473,-1631287720,-1622060461,-2041527162,-383874108,-402214908,-473104379,-1614550039,-2041527162,-628665660,50343611,-2029548838,
154950362,-890698893,-997828608,-561553762,-454468778,1381192186,82386571,-823654224,-370881025,1532674996,820560729,-368777013,-369039324,512447272,-1152187159,512294912,
1583023337,-396960121,-1974281454,1965833223,-888543221,1543228904,126533682,-739749729,-1638389271,1457424222,-1014345569,58048522,1405888233,-2015229976,-1638376998,678711455,
1021843176,-2011991037,-906083577,-1638339467,512318297,-380566295,-1638342093,3022475,54992521,-1022957221,1946118888,-1020204797,-439495189,1392513768,48759221,851663616,
1124567232,-109720066,-383874109,3389956,1489230339,-1013005178,1979385832,-1023743741,57871024,-839249175,-1024529946,1979380712,-1025054461,57871536,-839254295,-1025840665,
1979375592,-1026365181,57872048,-839259415,-1027151384,1978335208,-903878397,1206435890,-381504772,591184626,753446261,-385554214,1405258284,1543176424,-1178400886,844180972,
-64689728,-1177149720,549066395,-1977912020,-1189614634,-397339496,1374224332,521922802,294304082,-259342286,1364250762,-22681517,1810432883,1965046978,-20513274,1022260686,
-1978436318,1019382504,1975880236,-1963619831,-25040683,-138718350,-1962953471,1019644616,1958840866,1393376302,1012619636,-1977322230,1019382472,1958840876,9037827,-27924397,
1009152603,-1978895091,1948269762,-1339278315,168784909,973829312,974025926,-401967934,-397213597,1935408687,574378930,540804212,552084853,1008759550,1022850080,1008235564,
-855345907,-1961855775,-1979389666,-401428280,-489816611,1539425257,-1157625914,-1031142922,125050924,1726480565,-389850144,1352652087,1489578728,1934663582,600107011,57843288,
1529070824,1958742723,1124567291,-193606146,-389682343,1621229638,1958804992,-1046550269,45240659,1543161576,855391208,6333120,-386131223,-1073086426,-1057093772,2112422773,
-1563885887,1364394080,28491826,1543151336,855387880,6333120,-87234213,1392030952,-927340469,-1341950630,-397229311,-399710330,1263665195,1976084200,844781829,1944634304,
417869031,-628664064,512350467,-628685052,-930486197,636027764,-5219647,-796399421,-602806189,-1009088678,-1962079303,-2030030818,1478396890,1977236227,398181121,46369378,
-1965520191,-1979706169,-1393390600,841925930,1991987207,46369377,-1965520187,-1979706169,841898232,-1950285305,-29185286,-1325238839,1976434187,-351423044,218872248,3153547,
512481927,-633666728,1992011636,46369377,-1965520187,-1979706169,-1393390600,841924906,398151687,46369378,-1965520191,-1979706169,841898232,-1950023161,-29185286,-1325238839,
1976434187,-351423043,512447417,-947257298,-27540702,-1023314752,1688227999,1958742532,-923408125,-1966891432,1967143943,-944904189,-1979711303,1020365557,-1977649942,-1664140281,
-1729625227,-429070137,-679548888,-429594542,-680073172,702963176,-1957454503,1946500382,47875,-774306913,-690905378,87891593,87498377,512478091,57935163,50331835,
991857114,958302469,1541048069,-339725629,1342418946,1493148904,1392520936,1929586920,41936902,1526879720,-953030461,1409256680,-1157425944,175374335,-402495256,-662044133,
132645047,-1329374435,-1974316797,216550352,-401902393,1009575390,-402426836,-1031088386,46262355,820577139,1499093960,-1949896727,-1979369698,-1967052093,449284824,1945668293,
717238981,450398915,-1966921017,-1950090760,-1979369186,-1966986557,449284824,-336033082,512447454,-628685511,87629449,-253181093,-1957604353,1577400094,-1990795641,1493514014,
-488062117,-397258242,-387259030,1994981101,1952013055,-446896045,-447158228,-385649342,1340604512,-397195547,-1041759651,39315711,1946131688,-5642237,1927828291,-402426881,
1396965295,1510055144,-397323687,1397752027,1776867975,-396862718,-119013161,1230657792,-1056258678,-1017388171,-397192623,512426053,512296253,512427319,512296251,1515914553,
-1957444775,1392851230,-388331694,-1990459430,-2029700834,-3086118,958302555,924748549,-880062203,1543487976,87498377,-1209480309,-842834945,30402744,-385928216,250085833,
-402426881,1397948200,-2013338392,1240579034,96142195,-561553846,1943681878,-48330476,512318214,-709163273,-115439287,-338000122,-561553898,-115439274,1238743814,116858505,
512350855,1515915005,-81884845,13887494,99111514,-381593344,-964034016,-657407990,-1031081846,-796206896,-216101949,116760582,-216102461,116761094,-216101949,16482566,
-2130087392,-1994391317,-1022954722,542163841,116596361,-216101949,16482566,-2130087392,-1994411797,-1022954722,536920961,116596361,-1967027517,-771730162,-1979255538,-1023315256,
116590335,-1967027517,-771730162,-1979255546,-1023315256,116592383,-1077506877,-946948096,116596363,-1979217370,570881302,1427016386,1927991808,-337063420,-1010397448,12568204,
-1949856072,-1962478818,116760809,572969206,-166819321,-183623162,650185222,-846526584,-1950103922,-1612000791,45210251,-754720045,-489487183,-2130414690,-1994391358,-1962478826,
-154498347,16798982,128980084,-2135898078,-173872942,-754732794,-216661526,61915910,-922564574,-388841296,-1324943966,32166658,-1022954730,-956282720,1678064390,1946565632,
1008497426,-971476476,33576198,87885511,-960298848,16798982,87885511,-960298688,21766,1929657539,1426519567,208929024,-654966492,-133761374,-983701053,1437664036,
-157097482,-1597769722,-1073086379,-318051468,-2135218312,17204226,-1157401600,-885325504,1258517151,-167064693,-92205960,74580168,-1023359046,-768359522,-1614203965,-963843861,
-1900543809,198413255,-1955826478,637989662,-174051446,-153056762,1427016400,-165770752,-1964498426,184230652,1081363183,-858601262,512487283,-2010773773,-217645265,-182024186,
-775255290,-152448535,16798982,-494860683,116064259,516737,-1411126831,116826364,116604555,1049209587,-1679096077,116596363,-2010150874,-1912146650,2145960902,-48888834,
-82429178,722039302,1040644886,116987647,-149487810,-1008475642,-811341741,-397163685,-1017439961,1899921654,57933824,-1023084055,-1979700832,-754980656,323049,263454720,
1218580685,1009300480,-1274187262,1963408464,185383175,6819465,2696840,-1982100230,503533598,-1912602438,270436826,1295301381,7085705,-1990769477,-1946128354,-1946128882,
520122894,-1157614872,12124696,-1178497536,-1943666566,637534863,1284769735,-536558717,-1898214159,-515315517,-855526149,108521495,-397632581,1676226271,1290649138,-1190767685,
-61669366,126397486,1975519811,-1014801418,-1007689712,788479695,1422591744,1226859880,1344294210,1869836901,543973742,1886220099,1919251573,1935753760,234840937,1936876886,
544108393,825110851,1866670128,1769109872,544499815,541934153,1886547779,943272224,917297,1093481778,942502512,1397312561,1375739988,872021,1145130828,1095958562,
2245974,1414418243,573308941,827609164,860730,1313821268,1381236749,222709327,1497713408,1129512992,1313162578,808202272,864300,1377718428,-1912602438,270438106,
171632645,6952584,378063614,525992030,1456446808,167796384,-1609468480,-1073086358,28576373,11540173,-922877324,1587594078,1958742528,-1564462584,61866078,-1604888893,
-1073086358,11826293,-1073080627,1583285108,-58698813,-2147126725,1014121980,3022475,1977289539,1312078611,976100017,1124889639,-906051330,-1070402443,852749147,-1948200732,
-1618268456,512295171,251527275,-389021590,244072708,-521469843,751076944,-166677701,106150883,133617667,-864790273,7020169,7151244,6950654,-28111637,-1576569400,
548405354,-987843861,-1979684066,117382919,-1073086357,-1602682252,-879958990,7216778,74637114,2133116158,6956680,-2005549046,293071195,539897886,589439250,639968279,
421015858,337580816,756100886,1364405269,1315749462,788270769,1960852140,-906082807,-1070402443,-1406270741,-1017423522,508037959,474815819,169615184,41092724,307364214,
240090963,209126773,471670303,168496141,1381061532,1946631248,1963801677,1862727178,57999104,-402617368,74711596,963968828,578030652,-1186035781,-29163512,773617865,
-160102598,-645144112,1364126137,-508035282,1444842287,250135296,-401675516,250085438,-519182336,619185131,1499093001,1354997083,4800138,5119626,-1275067975,1477496073,
1911051203,-1579008,-397163685,146014312,-1017442099,-1962937368,-1010005272,5643915,5643913,1307071388,-1013097728,-33532000,-1974418488,704653582,-33532146,-1979664959,
-1979692738,-1342157026,-855002080,1444317968,-17660416,-1261764914,1477496066,367547331,1228835328,1327401472,688818688,-1342130944,-855002080,1380997904,-226045045,-889270530,
4800138,281871028,1405311066,-1979666094,-386692369,112459803,267063501,11620947,-141890678,-1275065624,-401552121,1532624924,1173699,2692746,-822162690,28364286,
5193354,4825283,1252000747,17229824,646586485,-58720184,1377268743,-2146959174,41026300,-466426160,-1910578441,72262618,-1664919009,-1169141165,11796480,-997582899,
-2144803712,225716476,1963508982,1946265612,-350703091,-350506490,-384191998,1347991482,1575554364,1532647439,-1824734307,-1791205260,-583252364,-471316876,1958742734,1019805240,
-1171098870,-487194608,-1031679862,-397277613,-399712862,-397162799,260757580,1913649536,1125101826,1599813515,-67062445,763929843,1543205608,-1075713597,49020848,104464560,
1906442353,-402426880,-1863843746,-1101806658,179897939,1455816192,149440176,-578137637,-1410858825,-400510956,1582947067,-1392750250,91537418,-352316440,-401755915,1582947047,
-32455037,1540257225,1012318443,-1342016243,-623777765,-1605319842,121372744,71042164,-1070464397,-1017593846,-1230123693,-1979665896,-1275049666,-1609511678,-1073086351,512365429,
243925071,11862057,281872820,1543376360,-402148413,158728128,167791776,-1291684416,106151536,698353077,-1339540480,-1258130383,-1974251510,-402633186,1448804407,-61798735,
-1665135956,839021910,2484416,24485214,-906077874,384362613,-964469248,-1057073136,41040444,-838979408,-1343699083,851663869,-1073065024,548406901,5185162,41225532,
-1185866832,162791425,-1023536947,281871028,-1966908583,-1258272498,1210485248,29685248,-847248524,83656832,-973207182,1913060480,1371930114,208940092,1506632168,-397285238,
1081392476,752627176,359935036,181226984,-1342016320,-444573312,1374161411,1958559720,-602871773,1949056044,-852432884,1372097113,1958554600,-604182513,-853481428,-346427254,
-1101666042,-1963881895,-1979700954,176104645,839546048,181799634,-337218095,687636507,-25162636,-2133167356,208798969,-25111573,-2133953784,-915207943,-1073032822,1048584308,
1946615880,1007071580,1951446018,-30886870,1976106697,-2134509908,-906093195,45160939,1948843136,-2134510071,-1040315020,-906098197,1971373558,-2000028158,-1593824986,243793992,
378077256,-1053163447,129505908,4956928,1302578310,1327925248,-29693952,1336017780,7268352,-1275049312,-1022309115,2688570,646591604,1346109512,675022708,-1729559692,
133988541,1353712757,-192930581,133988354,-855768459,2728528,4728456,4785863,770179072,1405310976,-1292051736,691961895,41166848,414601138,5193354,-1979711303,
-855198527,47632,4800138,281871028,-1185738773,243859456,1218445385,-855591936,-574756848,-386348568,-1645676662,-389850116,1534393764,1371406513,1212055552,58000896,
-1967319319,-397322708,1081392084,125054012,1506527720,1498540170,-108375215,-8331894,-2146929408,57805051,-1273967744,1527827723,1958456296,-1146755069,747134553,-28964748,
83460289,113687922,-1023410097,-3973543,-16757450,1006652214,-401574868,540855166,-1973872525,1978159560,-399739717,1009572422,-401378260,272419686,-1662450830,-393586244,
-1151670191,736629108,1340615898,1930443979,-1973790231,1498501840,-2131654054,243863526,-980811701,270852304,-444546550,-790245369,-790245147,281147109,-847248524,1408109184,
12048522,1302466340,1311672320,1328449536,-854871040,-3974384,1006655030,-400526292,-1073034502,440163188,646600563,-469106575,423363700,-1973793933,-504868144,-394562374,
1009572274,-401050580,-1073034542,646591348,-533069783,-1973802126,-1041739024,-10783558,-402626506,1009572238,-400985044,-1073034578,41222320,173613232,-1578610200,-349342534,
-1143609085,752446952,1019908584,1509061408,169928064,1372097256,1958380520,-648746993,-898045908,-646766532,1372097113,-444575399,1745783055,28596480,-1990586163,-2046798314,
-19988750,1049252810,45350985,-1017442099,-352276400,548425731,1347637660,1492794856,1745783643,1913058816,41221888,-401996619,281870772,-1017602727,0,-1,
-1,-1,-907502512,1397454075,-963882415,-1912602433,922691271,-14286724,637566518,8128199,-1943644936,-1912570354,42053830,-1291816442,1228835459,112896,
281872820,12568204,650612224,8259215,2080804646,1522961920,1486707545,-1178736445,-385853792,-1259800974,6678713,1450569226,-385160694,646598772,-499515351,-109033358,
-1606192358,-1073086351,-109050508,1396142873,-822152822,1049283326,45350985,146018509,1348145357,1018787816,-1341885396,-402134272,-399714238,-397358746,1479137338,1951973386,
-372995582,-1863715310,387258,702031336,-668931901,-919410648,-669456302,-919934932,954778457,1955937465,-670504952,-339725603,-1188435963,883097520,882950912,1958742528,
-920917968,695405116,448419411,-466464170,-259268399,498401070,1532937046,1062614211,1280722518,1918266198,-2141816746,-1873377194,-1171920554,-1979697733,509447,-1946837015,
-385861858,966790854,-175314688,281871540,1961101904,975079692,1009682432,1058441472,-997566464,-789133058,-1946848279,-385861090,1017122458,-178198272,-33538400,-178722368,
-33538656,-179246656,-33537888,-179770944,-33538144,-180295232,180913384,1007842496,-1269533948,1102795520,-1965554944,669604615,28988405,16890114,-100659269,254078190,
-102644934,-1020130333,-28253814,-338152761,1962871532,-1143502310,79233089,-722053120,-388963838,663224947,-17309117,-68651574,4300891,-369827351,552122719,1955937464,
-688855032,-339725603,-1206786043,1168310192,1168163584,1958742528,-939267874,-680328132,242483624,-922873676,1085538932,-385822488,-1152125780,-1073086394,-1975320204,509447,
-191174309,1448431772,12197463,-1898279424,-1593503714,-1005977498,251595124,57999462,-1610602520,-1073086412,921174900,4562944,57982986,520120808,1482514015,113692573,
-1593835419,-1073020826,-95283084,6620918,-1173916161,619446369,113766140,102,1405311739,78926417,173019341,-1995672348,-2013251042,-1996473298,1476411158,838874784,
169440452,908495076,-1995344896,-2013251810,-1996474066,-1342161642,3515135,-1017423526,4635475,1962950528,-401558521,126353425,4161603,1085540213,-2013264664,1388534535,
-335412806,-922827742,1522829976,649411,-1174023240,-346947580,1712753464,1962019328,1694942727,-236192000,-958469949,1915091587,-1075293678,1911041237,189946314,1510438354,
-369148951,-790054893,1227519,-147530568,1694955249,141950720,4438608,1492039344,-301972806,1978582154,6404615,-301789972,1712752986,1694942720,180551680,1497451866,
420501776,1494243674,1494243600,1499082000,1297757200,1158699329,1494243674,1494243600,1494243600,1666866448,1497451866,1499102224,1494243600,1494243600,-1441769200,1851437402,
-1424991909,1499197531,1813010704,1980782940,571496796,-1675463230,512316240,394790121,-970079357,1128464391,-968675448,-2008875001,130433807,-1655153920,-1365710397,-2134680744,
41255162,1489175218,1503577222,1522752346,-2084349605,126496451,-1950101258,-2096830178,-1950143549,-2096830178,-1950141757,-1979389666,-1023398009,-967747754,-1526382842,-1090195266,
146343232,-492504064,1583307261,-1152298045,145818944,1965047680,-906083571,1556018805,88653573,1421742315,88129285,-1493432143,-906090635,92993909,158598202,427147274,
1963001078,-1962636780,-2012944098,-1157615225,250108404,-339725824,1509866247,-117439256,1405311833,3022475,1960512323,-1144825086,1129514323,126486705,1140119016,-160052738,
-873976144,-1014801420,-163270647,393535751,133583024,-1341098720,-2146961854,1102055797,1967130614,1531817986,787785192,172165002,-1007323712,1970226720,-13736850,1394606093,
1886415211,-13736859,12124173,1376684032,-387272699,-471204163,89308158,130418570,1975519744,-213456891,-487997430,1376684286,-341579515,-1963013912,-1325389522,-387076096,
-1209401711,-2041554690,-196810556,5705354,512477694,-1886911255,-1427570638,-997828354,-1963439639,-1325374930,-23861248,1659399600,-22025986,-2013240416,-25106169,-997830568,
-385874968,1793654401,6536181,58002748,1006953705,-1023315168,-397211650,-27525491,-17533760,-385402680,-2041051963,6464196,6398147,57982986,-2136151831,41286626,
1369571762,-1564410363,-896924336,-2139037312,452264425,-2132705079,1947255542,550076419,167796896,-1325239104,1976109569,1594291721,41221888,243810481,-4913848,-756520784,
-400061699,-990446034,-166955775,58032577,-1342165016,-400561153,820510771,-1946651906,-167450338,-2130693753,300419701,-972721407,348166,1638007216,-35133440,-385808442,
1069284794,1161477,365757364,89373635,1392513465,365757108,48825203,1587567361,1975519744,-1522565114,-373037451,1637919785,1958804992,-1564462581,1621229665,-439490304,
82386571,3246070,-387287679,535298107,1407380225,939549115,-1962052313,-167450338,-2130693753,-1023314597,-1263801879,-1840897,-997830568,-385874968,652803405,-33060864,
-401902399,260635997,-44570429,1404768138,-33508091,260587977,365757364,-956480280,-389873401,260767037,1404764341,-1009188091,-1628962380,256255,-1594026775,19662160,
-1144848013,126485841,167774150,-1023314752,1929382632,1342621191,-1073086459,-3938109,-1040316534,-1996686104,-51386353,57937722,-2134654966,-579534785,190544,1404814168,
16824581,365757108,1403000178,-53745659,-823654520,17286908,1962526974,-2134640639,91555068,1877547186,-1423578709,738545824,-373286399,243796115,1525220689,1594279657,
-1991049216,-1962586850,-1996271594,-1962587370,721880078,1225689547,-397258491,1499135652,6332507,1946599434,-1262318078,118869251,-1174369816,12124165,-42645248,-386239158,
-1094516618,-1937046189,1621098506,-1665136128,1343059281,55988563,-434706215,1482381662,74776892,957579,1958742534,211061518,1959329280,1343654660,-1262318077,118869250,
-1655106958,512428917,-654114768,1478396227,-444536573,-804919216,83656792,414319989,-374688279,-397694357,91599347,-352295776,-1041700861,74825738,48955824,1688338608,
-840922624,-607272171,-134091783,-1952648309,-1979407090,-1564396861,-947256153,-578100174,1939734322,767755015,48955649,-469056725,-2143482504,-1961528832,46433246,85417449,
192479360,-997990773,501213442,-1577025531,-1514470234,-2146467836,-13443445,-1014969472,54068934,-641275776,-388330669,82314986,1579059653,-400510716,-396636389,393523552,
684732904,1389996008,742131594,1290274165,-386798671,-1993748450,235092766,1348331960,55588607,73283327,991857611,-397163773,1815872782,1279003252,1899759220,1362887284,
640074587,640034342,640034342,640034342,640034342,640034342,623257126,606348581,589505316,572662306,539042081,522133536,505290527,488447262,471604253,437984027,
421075482,404232473,387389208,370546199,353703190,320082964,303239955,286331410,269488145,252645136,219024910,202181901,185273356,168430091,151587082,117966856,
101058311,84215302,67372037,50529027,16908802,257,-65536,-16843009,-33686019,-67306244,-84214789,-101057798,-117901063,-134744073,-168364298,-185272843,
-202115852,-218959117,-235802127,-269422352,-286330897,-303173906,-320017171,-336860181,-370480406,-387388951,-404232216,-421075225,-454695451,-471538460,-488447005,-505290270,
-166993695,-621346183,1030805291,-397198732,1939610768,208332803,259576331,1915222659,57908509,1527528936,-2095730199,243129082,-2094611837,293395194,-1174400024,233373658,
57908480,1527520744,471853251,-770968597,-150832740,244186,-1031675181,-628662222,-1659034136,-320273544,485287948,1913181417,-1878151159,-956624919,126484487,-1996905240,
108380935,-393213264,1515778153,-2134663845,27198,1394479732,7020229,1526742912,-972720865,27142,1605333737,-306255522,-2007297931,-1157322954,113643520,-385613061,
113710376,1189,-2007297853,-1157322954,113643520,-385613061,113710352,1189,-304718653,-419508547,-1264165029,1885290806,1640981257,-864611964,2051237419,-1080764955,
1818913110,935134639,1199926534,-978565349,426143783,-1223206686,1340109649,309237645,-1546094845,-687194768,-858949085,-858993460,32076,0,33024,0,
33824,0,34632,0,35450,1073741824,36380,1342177280,37187,603979776,38004,-1769996288,38936,-1138753536,39742,1797783552,
40558,49872896,41493,1136082944,42298,-727379968,43112,-2065225216,44049,-434047872,44853,1604923808,45667,466206468,46606,-1564725563,
1073789233,191576694,-402604962,-954006391,1644216330,2028717484,2055258925,-685328617,-1399798184,-2038943122,1471531527,1746288394,-308097751,-1038364980,344313939,1498505536,
430363652,1873131920,537974565,-879810572,-1811228082,1060731128,-1190339071,-1895311562,1733288225,-221655804,-2128354231,1870413893,1891035004,-978474965,1290070813,924389942,
-534974907,-2065738045,1813180790,319526458,118945050,-1748075575,1222441024,-1111352645,227146608,1989759157,65302,0,82935808,-1710981067,612571639,1971536739,
-1450930739,75662207,-2130706432,-2092060446,-2096008694,2134181108,-2144243176,625304878,1682186531,-2147471316,-1921080122,2051014659,5960464,1316134912,2328,-388717296,
-402653184,1525878,199491584,596,1000000000,0,390625,-1769996288,152,256000000,0,-1609612736,655360390,-400093184,167797763,256,
-7307264,-1,-32769,-1,1006632959,125909162,1952024700,1999017952,2048794052,2086883422,2121661978,-2144243176,-2130706432,517470981,-1725536890,590633095,
-1520574073,1225776006,-1277754749,33117,1644462464,1350468405,2038320164,8366761,193003520,-2089923004,-42065159,-1631386813,294,858927408,926299444,1111570744,
1178944579,-1146471494,1927840056,78028810,1014204476,1265788988,77805311,77936383,-1978638104,-2117828382,-162520204,-2147178746,839926760,300345572,1348098904,-1157322520,
-1914150377,-768386286,854186634,79987466,77932160,-385649536,-466478959,78063240,-1089340951,865076387,-945029952,-1014956027,1964552168,-1528895229,-945029949,-1014956027,
-844358935,-1523154759,914391044,-377486159,-1160969334,1525275015,-2017735420,71821785,870890701,85715225,-1310074489,-1984049915,-385572066,-1093859221,-796157870,1510534888,
-2017473085,163047897,-645414707,-2129793559,1971323131,-389952237,-768407341,-393183045,1273496581,138799386,55827447,1476686042,-855533079,146139330,-1556676774,-1523122428,
145352708,-353805733,1388546819,1918561015,-371684603,-1009974922,143779923,-1556676774,-1523122428,142993412,1391024731,1977289481,-1489598452,-83442172,770245634,-1558279919,
47108,-1845189213,58310667,201326522,-955876901,-16472826,-1556154369,-371684604,-645463766,-2028415000,-397163559,-2091181499,-1950153533,-1962630378,-1023105778,434656156,
-1014801638,-389833468,512343723,1743324323,-1096685558,77799049,-854956567,-1961391164,-385875297,-10615987,-16473290,-16472778,-2017079834,413198553,-389817977,57939812,
-1012689943,-840377721,-1245695488,-1144599144,-930478938,11874184,-802191293,1942474192,18933763,-645208694,-401591319,861142674,-1558279717,-1987987708,-972774114,67304198,
1528038632,50005702,-1047805180,1939006199,-718935805,78363587,-379275334,-1413808122,1689893380,77838930,1914107880,77576707,852331203,-2029458451,50045146,-53965928,
-74714485,-695491341,-389816437,-242497482,738065291,-1527561782,-812918133,-1664877503,-389833399,58005180,-844960791,-385648440,-1549724029,1958742788,2030153734,-1006653438,
-619986893,1539568501,-661940029,50005702,-1558279934,113689348,-1023147269,-369113880,-909246489,-1242998181,103147523,199842395,309516,-1660974871,-1656547446,1127713436,
-1656549493,-1013103716,120109907,1528170216,1361491641,855619048,-1563767360,-1262812367,537380356,-968685814,1793667079,-1597256437,166397093,-437728051,-167218153,450941136,
-1019382592,914410957,864027815,-1948387621,-1950213181,449022672,-1010267455,2014708712,-389100038,58201551,-401025559,-806873086,402450712,-1037319285,124784244,-1070463112,
2026094846,-1071973895,1977236419,-371510523,-1031077850,77799049,-739714293,-1869573895,113706617,-64347,12238859,-1174177536,1056440319,-628423517,77799049,-516248125,
38146420,-1732182524,-180621309,-695472267,986855913,1963129606,1965832937,-796244251,-1912194388,33846272,182250434,-1743752000,9420689,1955702515,-1963982074,-1949766718,
-1950131242,1261341683,-1091830780,780923787,-369360036,984416269,1175549153,-268199764,1005585325,-1947240978,-749475362,50005562,742058357,-1404639883,9307706,-1073029259,
-1852305804,-218067009,74748326,-789843965,-1949267027,-754587170,-1021962008,168076705,-2131397404,-2147179210,11589581,-1576755550,-1298135894,1958742532,77963746,-663428086,
78716555,77926016,-1324449664,-863338492,-1482502358,1931637764,-154958318,78095065,78003848,1877496144,-2141693675,1601387001,568916051,78094357,-1144835493,-1430387554,
309508,511245560,1124536749,1945756227,78035730,880019454,79252299,1260376320,-369434037,430772713,-498908409,-166038535,-1191181929,1263206404,-85846025,-16776007,
1124496647,1962467907,217377224,-1609724439,-2145123161,77932160,-1526331265,512344836,378078373,-1581054813,-469105499,914419828,176161957,-1578142465,-469105499,-919347084,
77805195,-1979406430,1942956748,-2032536051,-1507948065,-1814067708,-527772025,-1264786638,180619904,-1964756260,1959332860,435782470,-1986194830,-1979407562,621061926,-1005944705,
-1023105630,1913190784,50719004,854821520,149520603,1948239094,550273232,-863974421,-352067040,-607062002,-590292271,1964033270,-1644961043,-869653127,-233053814,-1021651317,
796121226,78059254,-755510026,-989932554,1967268213,1975778846,50785050,1943540438,-1509491188,-804686844,-790965797,287631836,-385046039,635964520,-1314864365,78094852,
-166942743,-16472570,116846708,1962869938,-1323398171,-185341948,78716553,-133913413,-1156341272,-386399056,922686362,1592263846,-1509519595,4241668,1359539025,78298104,
-1961658392,149718012,-1107103869,79234224,-1510736640,-1190889282,-1430585340,-1375930364,1128466201,276036066,-1962933063,78299124,-1952058372,82573542,-116865917,-402350405,
-497478856,-1526270282,158629892,77989631,132712821,77511436,-384622616,-1796730831,-2012777198,-385571042,-16118784,2062091125,-195565550,-768345461,-208929142,549052298,
780883200,-1516239709,-337147388,-674105339,1465308881,-266601173,1583285363,-998046485,-772409340,-489434670,2044398564,-1509491190,1560835332,-787765783,-1965829678,-1965651230,
1574931187,319819241,1364677625,-397397972,-1739058608,512433785,-75430749,426970317,-472790133,-654056495,-670833711,512297848,1223361699,-351767984,619204659,-954930430,
293894,2114373412,-1147898876,-2081946498,-401180397,-10874308,-16473290,-402348746,1515913867,-335688472,31975443,-401464344,-396750098,-622329225,-51451903,-1017421991,
-1070409267,-855635479,-972967718,134413062,78120646,632602113,-1946209450,-134771761,-2031595311,-1073063919,113640821,-1979579653,1965440007,-1341658877,1956392252,1948990469,
-68662527,-402230280,-169214147,1638120959,-225717709,8796718,-2130021376,1952554237,-269923036,-1662156289,786813281,1781573375,1784638027,1785162335,1785948781,1782606400,
-1662468046,4319232,1090530793,1374222197,1370454289,1223186259,1499160321,-385899543,-512429172,1140841449,199875563,12380160,838862313,11987136,-401771107,568857389,
1392867857,1527967208,-193533501,72681158,-1534465793,-471214965,1979648520,283699205,-1499413511,1975519748,-154957304,283437264,-454507527,343039487,-1957490453,-2496481,
141712731,-1514186925,-1017802748,19710206,-3868989,57991818,-1977561984,-51516970,1048616720,1963459323,149528068,1465097728,1593859304,-1946799269,-133895978,758911858,
-688454539,725353963,-389873292,24311794,-855998013,-1174048244,-269778945,702544,-2141527305,-164482838,-538193917,1465057548,484968309,-1878660352,4647056,-164406433,
-1108814197,-389856269,-109572008,1956409321,273606705,58021499,-845382679,-402294321,1223360575,-73268048,-1524725246,-1491171324,-1558803708,-1574532604,1087143940,-377435264,
501747157,1965388560,-1672812285,58314957,-1342173464,50045448,-1616658381,77701892,-1957276989,-402349290,1516109955,267577539,512427385,-842857309,-385649199,-1499423720,
1922055172,-385649615,-1516200954,2025851396,-1677924093,-1157627718,-1964474368,114026747,-1173238296,-2135228416,283961488,-538377356,-2147435621,-1516229141,-1665136124,2133067129,
-1174100574,12255232,-77076352,1006937760,-1660521072,-1209410696,115861659,2040388235,-1982073086,-972774626,33749766,853226435,78102244,-31546,312976,91869707,
80141047,-1965127040,-958952718,67304198,-855094295,78029014,175423498,168080032,-385583680,-1950150920,-402345698,922743002,512296102,1458046129,-1544516847,2025522342,
78816004,-1962628163,1958742784,48940,9162635,-1957485577,-2116090914,50632643,1107391239,24363267,-1962440382,-8168502,1191474182,-1948521657,-1615113279,1526761732,
1946615427,-347716092,77446846,506365,-507508052,-2147126021,537173518,168076704,-1509519424,-1156614140,79234206,1125634304,-369434045,117312537,-143326042,-402137623,
74714739,58064650,-401710871,244052026,-315489115,-1979407455,1381061629,-487108527,-145175925,1942488035,-628407807,-487106470,24365059,1524237122,65205848,-787647528,
-19279397,1963238918,126937347,158990090,77989630,-2081880203,-774778617,-1965716781,-1965061389,200075745,145773507,296747634,-930420598,1223203921,1958742530,-1660126974,
192630873,2035814404,-1660294374,69659481,259610631,200730704,48269912,35028705,34401256,986054341,1912845800,-18314740,-352145211,-1245380092,-20382205,-1672455224,
1307101490,805815808,-398261899,-2142568216,-93048769,1949187968,1486701313,1352412020,-1274167320,-1274905787,1126664260,130456920,-972719829,-654955257,-989974604,-93124052,
-2042414588,1124567492,509507,-1262757497,-838941948,512300665,130417490,130433838,1975909936,-919387144,-838984981,130419829,1377732910,-919387389,-906097941,130418293,
61948716,75566729,-1123699517,-639081995,-1769263361,1162149888,77805195,-1057083472,-93064661,126415363,-1556707005,1976368644,-4790051,-1023408186,-1107099207,116064262,
-1107032903,-1279328252,1958476804,-1558803614,-964012540,-522984398,-684793722,-1964846166,-294302003,-1157626426,-27720525,809468105,-498924683,-370621448,1366784780,77577811,
-1190876225,-201588732,58058917,78756691,1527643624,-1090212930,79234207,-1510736896,-823655564,-1508996596,-1192656892,-386344458,1499136858,-1335777602,-13703159,1345302608,
1354825304,1929417960,10742007,1963715416,822593033,805815875,126354155,-922855357,-1101932683,-1547762529,178436,1504048124,1364404715,-401663768,1532625777,1947048424,
-1524725493,-1558804220,208922628,-1293418064,-1524725501,-1558804220,-1336190716,1642904067,1358874600,1592283731,800087309,-1057073072,236447824,53409651,771752086,171538,
-398113467,-2024272584,126376917,-922855357,1111674485,78965387,1375646697,506198,-133914689,413937404,-102611195,1371756894,-1090517063,-50854753,84978734,1509548615,
860967875,45832191,78028894,-1073031378,-1738601356,-1957169109,-281876272,1723590891,210298976,1930243560,199682054,-396931233,527567792,-396330309,1491602574,153901308,
2146876240,-401838616,125177175,1477163496,1481687294,-1073063079,1532582083,-1144799222,797574324,646586545,-990509949,973960224,1965732329,80016903,-376831371,-1075310712,
-1120766734,976118181,1946157190,-1661107959,1294365793,-310251285,-439262820,1638334254,1970304368,2037414256,2037414256,2037413232,1013988464,130435952,-2094626256,281343492,
-968162188,-990501881,1258648836,-315478136,-339735869,805815814,1976106563,-1981234184,805816061,1976106563,-1262763019,537380356,180480083,175742043,1395460038,1527573736,
-968687348,-1013108729,-571942707,1124627967,-1157625914,-389872460,309922504,856096953,75736000,75566729,-369271064,2028601137,176285948,1625883513,-1023314529,-805001568,
113660136,-801110874,-1157323242,166200491,309517,221767761,78321291,78454411,1526184936,-162797477,77991678,-502631335,-1073456925,77989376,170912195,1462091455,
-972773185,753402117,-385649398,125432118,175505162,168006633,-385649153,-620099059,1048585849,1922630822,-1628575485,922702674,922682531,854066341,-396731647,1038617434,
1952078603,-1630410493,168076704,-1089898048,609710532,77963903,-880782765,922721407,922682533,48759971,-396666367,477432618,-768388270,-393215813,1515916062,1520242297,
-1875055781,12309043,-149755519,1393457565,19916882,-974601590,-799319550,-1559851048,-1526296828,645963524,-1635842907,-1329658765,1381193597,1510020584,-83629989,1408271849,
16771154,78780041,77792967,113704960,-2130705243,78786257,1532626803,-555199917,-1308166150,1962934020,-396666347,-1914172383,-87300086,384326490,176351244,1532679915,
-1508996413,-1192656892,-638174861,77904796,100234,231304,211599370,25659520,42452480,-1667385344,585630585,-387108352,2040332306,2549763,77465286,57908480,
-1023296023,-386378927,1499138426,1405351650,-2096848965,74645807,-135576765,-1152138405,134087839,-347929739,-1966908423,-2147178994,1098094825,-1952654858,-1962630378,168076574,
512269531,113640615,-2137520986,-1667399477,-360511879,14385153,-922030798,-338688396,-85796143,91856797,-33393342,91463107,-1444289486,175742465,-738798857,-2147368317,
-1312620333,-1509021032,-1427376124,2114479848,47697,-394198853,158665150,77797001,77928073,78028995,1352171564,77989574,186378368,-396265797,1532625432,-401927960,
-2017785476,34269281,-1847043238,-18326795,-119937014,451435354,-2144224268,-378398534,-185992803,-1805850212,1356891807,48955824,1436729394,-997828604,47774,72556169,
-370670732,991857091,-1817384957,-477374603,72562315,-847956167,44534354,-2091757568,-2013920061,2021720063,178497,-1074557956,-1510800221,-162310565,-16493306,1455296373,
82805508,-218103111,1958752933,-263460861,77839967,-67108167,-1956731405,42765076,80118528,-263591850,-1014814741,1125092100,344677955,72681206,-1962510849,-352037354,
1892745988,1377077557,1128470411,-1511500968,710499313,-249567035,378080116,-779419602,2095698823,-1981576294,-1962719970,-2147271906,158673983,-386509336,-1813381310,-1700206189,
1465275217,-1153846702,-1514208098,78036484,-1185736213,-772276220,-498908393,133585914,-30837440,-30772212,-165251894,561577733,746643573,-2145749496,360057066,-1190878018,
-201523193,-1641643868,-1091887100,-350220416,1583307474,58087771,-385583895,1049233088,79234214,2027620864,-2146339551,393349359,-225780086,-466430838,192211938,-774582024,
-19672878,-371296817,1049101985,-2081880922,-350172156,-1505851148,75032836,190547,770229083,67812096,-397210389,-1017446398,-1157619736,1048577123,2013332648,-971868921,
33859590,-1330675224,-1349916659,-2065167696,184337327,1644412671,116787828,2038432935,1644936707,1913027560,77577992,-352320327,80118537,-1190878273,-1523711998,-389808926,
-397211379,-1226307711,99113975,-379889152,-1976633427,-152528889,776163336,-1549596789,46367492,-1559786706,-1014823771,1499092994,1360819272,-2024583086,-142350119,-1959898277,
-1618268649,-353894398,-1014801423,-1008801020,1944637523,17426691,-396315973,803735254,1527345671,1274749928,-1020983354,-1257901080,-1258130672,96331783,82314100,1064852474,
-989671286,75630122,-654965383,855294696,11659465,75577087,-119871406,-2130276518,-2127102204,180367876,-402230078,971569843,-2130276360,-2127102204,75603972,-1979550999,
75604176,41205770,-259340034,-930430462,-1070463880,293193866,1397903696,1527097832,-27764390,-1963886400,717392609,2042954433,75669527,-956671256,512306695,843252562,
717654729,161606085,1376027296,75577087,-1037384406,58245378,-386255128,922681383,1374160001,75669752,75564687,1515765770,512427893,1743323986,-20839935,-402425656,
1542060559,46500353,-20895038,753437376,83656451,-1597470205,1076102275,-930479499,83814595,41027508,-924315468,1962498820,-397389047,1532688651,1352459914,75568779,
178058762,-33393454,-1645083958,116787572,1963197571,718208514,1357286132,1323893624,1347441408,1476714984,-143276802,-402341912,1347946382,-771750983,78047460,-997584782,
1622326168,1810421763,106293253,1857752811,-1731949984,1407768579,100198405,293100376,-1040295592,1347637329,1476697576,839052123,-1596131612,-536738686,-1073036034,116787572,
1963197571,-1966277118,1489580780,75577087,-2110879664,-144775164,2128874072,-389772795,-1554450113,-1073085311,-1974793099,1949187079,512312065,-1655176366,-1006496398,75638410,
-469056470,116787572,1963197571,180420098,-162862912,1206507915,-153056768,62144708,-466484619,-1996192861,-1979416306,78953440,-165673018,57936068,1395328966,1526970088,
130418809,-488090835,-968664315,-773312505,75735299,75566731,-1276574856,6875645,-130291629,-2013039525,130433839,78887680,1379830595,-2129229053,75669508,-81009614,
1131739179,540805002,708634228,28631668,-397388981,-466425110,-160158404,-227267780,-294378436,376778812,-355145661,-347402125,126372611,1961101912,46433272,173585387,
1543206116,-1020983354,-1979415647,-804866612,-2129228824,1393259268,-213522350,-379928526,-963969473,58197292,1391994600,1492507368,1975519824,-922858751,350750328,509688,
75564687,-385918487,1836319467,-1549726599,762628,-1576753760,195100685,653733376,-125083029,-1607546230,653681261,-939393013,892974,1797715502,851968610,378220224,
-687644050,1881049646,-1562832286,-2135948121,-1996183902,-2013263082,-1342173922,50045444,16497641,-1279590400,2144516,1128466179,-31130910,-352318557,186026913,220105216,
-1329581312,78029440,78063240,1408995305,77511505,8390529,1929380793,-12369138,-502762233,-1509490952,1495257348,116793460,1979647134,-1624866811,-1514406396,-1979217404,
603980455,-2132508545,663281674,-1869560997,-74913392,-2132745088,477331652,309674652,1975778973,-607061741,77989630,-376436107,1973287786,-18710525,77839958,1178997897,
78069386,-2139102335,478732042,-242498722,-1962625816,166220238,-2146864638,-1207654850,132845433,78003840,-402228840,-806878720,75938564,1493455336,76463953,-402356549,
-2034564043,73263108,-402522648,-2034563918,70576132,-1157497880,-974650220,-2096925951,1474823403,74799364,-856964610,1978198411,-1009939708,77932160,8841343,-973036056,
2131014150,-387144728,468385924,-1516114587,2013036548,180552051,604600768,77963903,1350414520,-1610589208,-1073085274,109053300,-402520922,-1314848671,-2097381372,29685404,
1084752501,4843676,-1157008227,937975858,-330766334,77999744,-402427134,65536256,78029041,192115772,-1156588614,-1897364663,-1157174286,-957849036,91594234,77936256,
1673249664,33613922,-386856728,115929543,-334960640,-402449943,-1528298579,33614071,-1023163416,-379571525,-256376354,-1523122237,-1556676860,-11081724,922704730,922682531,
-102234971,-13834239,300505691,77963758,158973962,1467855039,-1516077276,-2114158588,968821874,-768387205,-394198853,-1564807696,2131344176,2013389288,2067971898,-1556676777,
-1523122428,-1277707772,-394175045,1515973733,77805311,77936383,-1157520408,837313097,-10855430,-16473290,-402348746,1515913616,-1142051864,115958354,266058490,-377402949,
-1833243611,-2147042550,-387176215,222081111,602407797,126496433,1975519811,-1614822418,309508,-67108680,-1195136013,-1549598720,77964036,-411506493,-1549726087,1958742788,
2030153760,-1009191396,-1499409203,1958742532,77963280,125091850,91816368,214161654,-73350399,-33014782,-20382008,-236403768,1393324799,-396268869,-303562546,868441066,
-2147435566,-1007964952,-1140860952,292708394,-840431381,1614461951,-1410857102,-260708352,-1523122237,-1556676860,-83442172,-1662515198,-277813248,115891034,79283185,1125634304,
-1006968253,-788527943,-498382049,-1887386630,-501219326,-1329872127,150568964,-1185864078,-1430585337,-1977120252,-2013265529,-136166649,126402610,149520473,1948312704,-1440347943,
-2955004,259311882,-1209468847,-2013898241,1963982850,-1010834759,-1090216002,-1174666069,92995588,-24868443,-1007164673,-1190888257,116064258,-1190889281,788267012,1135282059,
-1946623421,-1018475553,-352015425,77578218,-1413487125,309508,-201531769,-1008826459,-1151904943,-1413544801,309508,1610607080,1371756891,-1413785773,77577988,378137579,
512296099,-1950153563,-1962630378,-1023105762,1929301992,9038143,1408096232,851675735,2013570310,2027620924,77963536,1064485675,-1549715595,-339596540,734235408,1912907014,
-1960413906,-1559876670,1965322756,-339725796,1206632522,-1863474200,839355280,2030347526,-1524200941,2028210692,167882758,-1339233344,669776383,178513,-1516183929,2042628612,
-34109694,-502893145,-352276229,-1341754611,-339736063,184528901,1599732160,-1313094821,-313071612,92967056,41486130,-1185827861,-991231996,-396230725,-1746338062,-972327425,
33749766,77792967,784564224,38443,43915822,166249216,-1610057474,-1073085275,-1581052296,-1073019741,-389869192,142147060,914412237,-1015020379,1023714209,175472640,
-397159475,-379851301,519569382,-1144847197,870843513,77053696,-1207957319,-201588736,75014827,-1023104350,1929230312,-22877949,-1618274421,-1178402814,-1511522300,-385649923,
45743766,-24057600,-2030041927,77577211,1929220072,-25106173,45735815,77840128,1944714119,309758,-402350145,57867636,-1174510103,-1547763710,-27465468,1929208808,
-14817021,-385954327,79297880,-1190956288,-1084424190,905905317,-85831857,-1413495979,309508,971510251,77578237,1929381049,77840134,1476395705,1195836815,-1018103070,
2046631912,-707935487,-1259797646,-199497229,-1158021120,-628228000,-762396018,1688387634,-1148078844,-1699086336,787647238,1124567212,1976434242,118406388,-1141239091,-470351808,
-1020535924,-167771973,108392644,-523041615,-1991518069,-1962922978,-853349917,-157143888,12040961,842663878,49914560,-1577056606,1705116779,2662916,-1996288325,-1157428194,
512295802,512426978,-1991573460,1258490398,118405971,-543030096,512316164,-543161120,46202372,-1227846976,1524237056,512481927,394790112,1127712835,-1190862944,-1073086412,
-628683148,-628631293,1128470409,-227161858,-654058873,-922856637,-1962592606,-1962614754,3390231,512350723,1130038500,3153545,54861449,616729178,-1966044418,-1966921022,
449219288,1945668295,-1385633533,-338492495,37537674,12256114,717392386,-1965520189,-1966662970,-385649672,512339274,-628686070,2891401,53419657,512353163,512426821,
-628686800,732773864,1397443546,-444536741,-394273605,-1729561729,-1013978708,1954103840,1713402725,6645106,-257562604,-11351757,-385580746,-133528,466206467,46606,
962081078,540423730,1380994883,1112088622,959520845,539767096,892877105,538976288,1230127440,1126193492,1262699848,168636704,1230127440,1126193492,1262699848,168636960,
1061109567,658751,0,0,0,0,-385875968,824188914,1395470640,1702130553,1866604653,543453793,1869771333,537529714,758263857,1953724755,
1109421413,1685217647,1920091424,168653423,858796320,1937330989,544040308,1918988098,1917132900,225603442,808525834,2035494196,1835365491,1634681376,1159750770,1919906418,
824183309,1395471664,1702130553,1866604653,543453793,1869771333,537529714,758526001,1953724755,1109421413,1685217647,1920091424,168653423,925905184,1937330989,544040308,
1918988098,1917132900,225603442,808525834,2035494200,1835365491,1634681376,1159750770,1919906418,824183309,1395472688,1702130553,1866604653,543453793,1869771333,537529714,
758199857,1953724755,1327525221,1869182064,1310749550,1394635887,674067557,544109906,1431586131,168634704,842412320,1937330989,544040308,1769238607,544435823,544501582,
762602835,1853182504,1413829408,220811349,909189130,1767124275,639657325,1952531488,1867391077,1699946612,1378364788,1394634357,1347769413,537529641,758396465,1869440333,
1394637170,543521385,1869771333,1378364786,1394634357,1347769413,537529641,758198322,1869440333,1159756146,1919906418,840960525,1294807600,1919905125,1681989753,1936028260,
1917132915,225603442,808591370,1699556659,2037542765,1684291872,1936942450,1920091424,168653423,825242400,2036681517,1918988130,1917132900,225603442,808656906,2035494194,
1835365491,1768838432,1699422324,1668246649,1936269419,1668238368,224683371,1378361354,1297437509,540876869,573654562,1497713440,658729,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-385875968,857760068,1261253424,1868724581,543453793,1394635343,1702130553,1851072621,1159754857,1919906418,857737741,1261253680,1868724581,543453793,1394635343,1702130553,
1851072621,1159754857,1919906418,874514957,1127035184,1159746642,1919906418,891292173,1127035184,1159746642,1919906418,908069389,1143812400,1701540713,543519860,1869771333,
537529714,758263862,1802725700,1702130789,1869562400,1699881076,1685221219,1920091424,168653423,808990513,1936278573,540024939,1818845510,224752245,943141130,1766075697,
824208243,1767982624,1701999980,925960717,1143812664,543912809,1953394499,1819045746,1176531557,1970039137,168650098,809056049,1936278573,540024939,1869771333,822742386,
758200631,1802725700,1159737632,1919906418,1330776589,1159733325,1919906418,537529632,757080096,1869377109,1394633571,1702130553,1851072621,1260418153,1869379941,220228451,
67187210,8388608,0,285290752,67266304,19660800,0,285370112,100820736,19660800,0,285370112,134458368,33554432,0,285453312,
100903936,33554432,0,285453312,67266304,-65536,0,285370112,134336000,16777216,0,285343488,84073728,-65536,0,285400320,
251888640,-65536,2048,285443328,50541568,-65536,0,285422592,84104960,-65536,0,285431552,117659392,-65536,0,285431552,
134296064,8388608,0,285294336,117628160,-65536,0,285400320,0,0,0,0,67265536,0,0,285382400,
84136192,19660800,0,285462784,117690624,-65536,0,285462784,117702656,33554432,0,285474560,84073728,19660800,0,285400064,
117628160,19660800,0,285400064,84073728,19660800,0,285400320,67187200,0,0,285298688,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,870907904,-67106759,7340033,0,
0,0,0,0,0,0,0,0,0,0,268032,-1073643517,805330944,201332736,1402530048,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,904462336,75,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,978452480,
490227269,1082144298,67637280,-15007486,-256,-226,2147426303,85397908,353965074,454037257,33491485,117834771,202050056,-1,51911196,219021846,
-1,-14614634,1633705822,1701077858,-39066,-1903915657,-1871409293,-1837723275,-109,823888521,892613426,959985462,138226992,1702326537,1970893938,1534095209,
1644105053,1734763635,1818978920,-10475717,1668840028,1835950710,-13685204,-14614742,1044200507,1111572543,-48061,-11974585,-11665589,1381060687,1560280915,34437,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,-385875968,555436881,623125312,673850974,137060137,1163350272,1431917650,2068860745,1107234173,1195787347,1280002632,-8510918,1129863804,1296974422,-12632516,
-14614742,1465275732,1532647768,-41636,758724663,724972852,808661553,2097151790,34951,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,888006912,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,-385875968,15524,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,-553648128,251798786,-162201829,1894320143,74,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,238823168,1530737469,1917014333,2117984061,708759614,-1774232513,205528381,-1136473536,1266739517,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,170731576,471402015,117835522,0,173690993,471402015,117835522,
0,170731576,1885603455,117833986,0,257052769,421070361,202050818,0,268437504,1073758208,1347430440,1347430440,690825260,689843754,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1270016256,0,0,1269885184,0,0,1278339328,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,-2122448896,-1715633755,-8487295,
-406585381,-26444033,947715838,940572688,947715708,2084044816,2097086008,269515832,2097052728,31800,406600728,-65536,-406600729,1006698495,1715618406,-1006698436,
-1715618407,118489027,-859013873,1715239116,406611558,859773054,1882206271,1669325040,1734566783,1520025830,1021830972,-528443046,-520552712,235012224,239009342,1008205826,
2115508350,1717966908,6710886,-612433818,454786011,1665007643,946629688,30924,2122186752,1008205950,1014896766,1008271128,404232318,404226072,1014896664,402653208,
403504652,805306368,811662944,0,-20922176,603979776,610729830,402653184,-33220,-16777216,406617855,0,0,2016411648,3158136,1819017264,
108,1819017216,1828613374,2083520620,-133400384,-973078480,1714428108,1815609542,-857967048,1616904310,192,806879232,811622496,811597848,806885400,1711276128,
1715273532,805306368,808516656,0,805306368,24624,64512,0,805306368,201719856,-1067438056,-964951936,-420028722,1882194044,808464432,-864550660,
-866109428,-864550660,-871614452,1008468088,218025068,-1057226722,-871625480,1614282872,-858982208,-855900040,808458252,-864550864,-859014964,-864550792,403471564,805306480,
805306416,805306416,805306416,806903856,811647072,24,-67108612,811597824,806882328,-864550816,3151884,-964952016,-1059135778,2016411768,-855847732,1727791308,
1717992550,1715208444,1723908288,1828192316,1818650214,1660813560,1651013736,1660813566,1617459304,1715208432,1724825792,-859045826,-858981172,813170892,808464432,203292792,
-859042804,1726349432,1718384748,1626341606,1717723232,-289013506,-958988546,-423231290,-959521034,1815609542,1824966342,1727791160,1616936038,-864550672,2027736268,1727791132,
1718385766,-864550682,-870551328,-1258553224,808464432,-859045768,-858993460,-859045636,2026687692,-960102352,-285288762,-960102202,1815623788,-859045690,808483020,-956432264,
1714559116,1618477310,1616928864,1623195768,101455920,410517506,404232216,940572792,50796,0,0,808517376,24,0,-864285576,1625292918,
1717992544,220,-859779976,203161720,-859014132,118,-1057174408,1815609464,1616965728,240,2093796470,1625356300,1717991020,3145958,808464496,786552,
-871625716,1625323724,1819831398,812646630,808464432,120,-687931700,198,-858993416,204,-858993544,120,2087085788,61536,2093796470,7692,
1617327836,240,209240188,806355192,875573372,24,-858993460,118,2026687692,48,-16853306,108,1815637190,198,2093796556,63500,
1680906492,807141628,808509488,404226076,404226072,819986456,808459312,-596246304,0,268435456,-960074696,-1528233730,74,0,0,0,
0,0,0,0,0,0,0,0,0,1290791168,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,-1526726656,-790001666,-803483621,1461440539,
1696321775,1106791920,971790840,788027879,15717096,1860628992,1409242110,-940530433,-1761607441,-803463350,-803483621,-803461093,1822747,0,0,0,
0,0,0,0,-822083584,4958953,216530944,-1259812051,1156107052,-773207253,53,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,14703594,791753200,942617905,-1979973579]
,"symbols":{"POST1_TEST01":{"o":80,"s":61440,"c":"TEST.01: 286 PROCESSOR TEST (REAL MODE)"},"POST1_TEST02":{"o":391,"s":61440,"c":"TEST.02: ROM CHECKSUM TEST"},"POST1_TEST03":{"o":419,"s":61440,"c":"TEST.03: VERIFY CMOS SHUTDOWN BYTE"},"POST1_TEST04":{"o":457,"s":61440,"c":"TEST.04: 8254 CHECK TIMER 1 (ALL BITS ON)"},"POST1_TEST05":{"o":503,"s":61440,"c":"TEST.05: 8254 CHECK TIMER 1 (ALL BITS OFF)"},"POST1_TEST06":{"o":541,"s":61440,"c":"TEST.06: 8237 DMA 0 INITIALIZATION"},"POST1_TEST07":{"o":607,"s":61440,"c":"TEST.07: 8237 DMA 1 INITIALIZATION"},"POST1_TEST08":{"o":724,"s":61440,"c":"TEST.08: DMA PAGE REGISTER TEST"},"POST1_TEST09":{"o":807,"s":61440,"c":"TEST.09: STORAGE REFRESH TEST"},"POST1_TEST10":{"o":829,"s":61440,"c":"TEST.10: 8042 INTERFACE TEST"},"POST1_TEST11":{"o":951,"s":61440,"c":"TEST.11: BASE 64K R/W STORAGE TEST"},"POST1_TEST11A":{"o":1494,"s":61440,"c":"TEST.11A: VERIFY GDT/IDT INSTRUCTIONS"},"POST1_TEST12":{"o":1726,"s":61440,"c":"TEST.12: VERIFY CMOS CHECKSUM"},"POST1_TEST13":{"o":1920,"s":61440,"c":"TEST.13: PROTECTED MODE TEST"},"POST1_TEST13A":{"o":2158,"s":61440,"c":"TEST.13A: MEMORY SIZE TEST (ABOVE 1024K)"},"POST1_TEST14":{"o":2713,"s":61440,"c":"TEST.14: INITIALIZE CRT CONTROLLER"},"POST1_TEST15":{"o":2829,"s":61440,"c":"TEST.15: VIDEO LINE TEST"},"POST1_TEST16":{"o":2845,"s":61440,"c":"TEST.16: CRT INTERFACE LINES TEST"},"MFG_BOOT":{"o":3109,"s":61440,"c":"MANUFACTURING BOOT TEST CODE ROUTINE"},"POST2":{"o":3220,"s":61440},"POST2_CHK_HFNUM":{"o":5372,"s":61440,"c":"CHECK FOR SECOND FIXED DISK PRESENT BUT NOT DEFINED"},"POST3":{"o":5749,"s":61440},"POST4":{"o":6469,"s":61440},"CMOS_READ":{"o":6469,"s":61440},"CMOS_WRITE":{"o":6495,"s":61440},"DDS":{"o":6521,"s":61440},"E_MSG":{"o":6529,"s":61440},"ERR_BEEP":{"o":6582,"s":61440},"BEEP":{"o":6644,"s":61440},"WAITF":{"o":6714,"s":61440,"c":"FIXED TIME WAIT (CX = COUNT OF 15.085737us INTERVALS TO WAIT)"},"CONFIG_BAD":{"o":6729,"s":61440},"XPC_BYTE":{"o":6749,"s":61440},"PRT_SEG":{"o":6772,"s":61440},"PROT_PRT":{"o":6793,"s":61440},"ROM_CHECKSUM":{"o":6837,"s":61440},"ROM_CHECK":{"o":6849,"s":61440},"KBD_RESET":{"o":6899,"s":61440},"BLINK_INT":{"o":6942,"s":61440},"SET_TOD":{"o":6956,"s":61440},"POST5":{"o":7230,"s":61440},"POST6":{"o":7867,"s":61440},"XMIT_8042":{"o":8167,"s":61440},"BOOT_STRAP_1":{"o":8232,"s":61440},"DISKETTE_IO_1":{"o":8521,"s":61440},"DISK_RESET":{"o":8656,"s":61440},"DISK_STATUS":{"o":8741,"s":61440},"DISK_READ":{"o":8753,"s":61440},"DISK_WRITE":{"o":8765,"s":61440},"DISK_VERF":{"o":8777,"s":61440},"DISK_FORMAT":{"o":8789,"s":61440},"DISK_PARMS":{"o":8891,"s":61440},"DISK_CHANGE":{"o":9110,"s":61440,"c":"RETURNS THE STATE OF THE DISK CHANGE LINE"},"FORMAT_SET":{"o":9153,"s":61440},"DISK_TYPE":{"o":9076,"s":61440},"SET_MEDIA":{"o":9250,"s":61440},"DR_TYPE_CHECK":{"o":9365,"s":61440},"SEND_SPEC":{"o":9397,"s":61440},"XLAT_NEW":{"o":9452,"s":61440},"XLAT_OLD":{"o":9490,"s":61440},"SETUP_END":{"o":10462,"s":61440},"SETUP_DBL":{"o":10488,"s":61440,"c":"CHECK DOUBLE STEP"},"READ_ID":{"o":10588,"s":61440},"CMOS_TYPE":{"o":10609,"s":61440},"MOTOR_ON":{"o":10655,"s":61440},"NEC_OUTPUT":{"o":10877,"s":61440},"SEEK":{"o":10921,"s":61440},"RESULTS":{"o":11118,"s":61440},"READ_DSKCHNG":{"o":11181,"s":61440},"WAIT_INT":{"o":11078,"s":61440},"DISK_INT_1":{"o":11230,"s":61440},"DSKETTE_SETUP":{"o":11253,"s":61440},"DISK_SETUP":{"o":11337,"s":61440},"DISK_IO":{"o":11762,"s":61440},"HDISK_SETUP":{"o":11369,"s":61440},"HD_RESET_1":{"o":11629,"s":61440},"SET_FAIL":{"o":11749,"s":61440},"POD_TCHK":{"o":11763,"s":61440},"HDISK_IO":{"o":11794,"s":61440},"HDISK_IO_CONT":{"o":11918,"s":61440},"HDISK_RESET":{"o":12074,"s":61440},"HDISK_STATUS":{"o":12158,"s":61440},"HDISK_READ":{"o":12167,"s":61440},"HDISK_WRITE":{"o":12174,"s":61440},"HDISK_VERF":{"o":12181,"s":61440},"FMT_TRK":{"o":12199,"s":61440},"READ_DASD":{"o":12220,"s":61440},"GET_PARM":{"o":12284,"s":61440},"INIT_DRV":{"o":12378,"s":61440},"RD_LONG":{"o":12428,"s":61440},"WR_LONG":{"o":12435,"s":61440},"DISK_SEEK":{"o":12442,"s":61440},"TST_RDY":{"o":12472,"s":61440,"c":"TEST HARD DISK READY (AH = 0x10)"},"HDISK_RECAL":{"o":12495,"s":61440},"CTLR_DIAGNOSTIC":{"o":12535,"s":61440},"COMMANDI":{"o":12591,"s":61440},"COMMANDO":{"o":12654,"s":61440},"COMMAND":{"o":12741,"s":61440},"WAIT":{"o":12843,"s":61440},"NOT_BUSY":{"o":12892,"s":61440},"WAIT_DRQ":{"o":12931,"s":61440},"CHECK_STATUS":{"o":12953,"s":61440},"CHECK_ST":{"o":12971,"s":61440},"CHECK_ER":{"o":13023,"s":61440},"CHECK_DMA":{"o":13066,"s":61440},"GET_VEC":{"o":13101,"s":61440},"HD_INT":{"o":13123,"s":61440},"KEYBOARD_IO_1":{"o":13158,"s":61440},"K1S":{"o":13357,"s":61440,"c":"READ THE KEY TO FIGURE OUT WHAT TO DO"},"K2S":{"o":13417,"s":61440,"c":"READ THE KEY TO SEE IF ONE IS PRESENT"},"KIO_E_XLAT":{"o":13451,"s":61440,"c":"TRANSLATE SCAN CODE PAIRS FOR EXTENDED CALLS"},"KIO_S_XLAT":{"o":13462,"s":61440,"c":"TRANSLATE SCAN CODE PAIRS FOR STANDARD CALLS"},"K4":{"o":13518,"s":61440,"c":"INCREMENT BUFFER POINTER ROUTINE"},"KB_INT_1":{"o":13531,"s":61440,"c":"KEYBOARD INTERRUPT ROUTINE"},"KB_INT_01":{"o":13553,"s":61440,"c":"WAIT FOR KEYBOARD DISABLE COMMAND TO BE ACCEPTED"},"KB_INT_02":{"o":13571,"s":61440,"c":"CHECK FOR A RESEND COMMAND TO KEYBOARD"},"KB_INT_4":{"o":13589,"s":61440,"c":"RESEND THE LAST BYTE"},"KB_INT_2":{"o":13598,"s":61440,"c":"UPDATE MODE INDICATORS IF CHANGE IN STATE"},"UP0":{"o":13616,"s":61440,"c":"START OF KEY PROCESSING"},"T_SYS_KEY":{"o":13758,"s":61440,"c":"TEST FOR SYSTEM KEY"},"K16A":{"o":13823,"s":61440,"c":"TEST FOR SHIFT KEYS"},"K17":{"o":13842,"s":61440,"c":"SHIFT KEY FOUND"},"K17C":{"o":13860,"s":61440,"c":"SHIFT KEY FOUND, DETERMINE SET OR TOGGLE"},"K23":{"o":13979,"s":61440,"c":"BREAK SHIFT FOUND"},"K25":{"o":14059,"s":61440,"c":"TEST FOR HOLD STATE"},"K26A":{"o":14084,"s":61440,"c":"INTERRUPT RETURN"},"K57":{"o":14676,"s":61440,"c":"PUT CHARACTER INTO BUFFER"},"SHIP_IT":{"o":14747,"s":61440,"c":"HANDLE TRANSMISSION OF BYTES TO 8042"},"SND_DATA":{"o":14762,"s":61440,"c":"HANDLE TRANSMISSION OF COMMAND AND DATA BYTES"},"SND_LED":{"o":14822,"s":61440,"c":"TURN ON THE MODE INDICATORS"},"MAKE_LED":{"o":14903,"s":61440,"c":"FORM THE DATA BYTE FOR THE MODE INDICATORS"},"CASSETTE_IO_1":{"o":17549,"s":61440,"c":"BIOS1 (11/15/85)"},"INT15_EVENT_WAIT":{"o":17650,"s":61440},"INT15_JOY_STICK":{"o":17757,"s":61440},"INT15_WAIT":{"o":17911,"s":61440},"INT15_BLOCKMOVE":{"o":18007,"s":61440},"SHUT9":{"o":18199,"s":61440,"c":"RETURN FROM SHUTDOWN"},"GATE_A20":{"o":18521,"s":61440},"EMPTY_8042":{"o":18546,"s":61440},"EXT_MEMORY":{"o":18555,"s":61440},"X_VIRTUAL":{"o":18567,"s":61440},"TIME_OF_DAY_1":{"o":18709,"s":61440,"c":"BIOS2 (11/15/85)"},"RTC_INT":{"o":19095,"s":61440,"c":"ALARM INTERRUPT (INT 0x70, IRQ 8)"}}} F000:0050 @ POST1_TEST01 ; TEST.01: 286 PROCESSOR TEST (REAL MODE)
F000:0187 @ POST1_TEST02 ; TEST.02: ROM CHECKSUM TEST
F000:01A3 @ POST1_TEST03 ; TEST.03: VERIFY CMOS SHUTDOWN BYTE
F000:01C9 @ POST1_TEST04 ; TEST.04: 8254 CHECK TIMER 1 (ALL BITS ON)
F000:01F7 @ POST1_TEST05 ; TEST.05: 8254 CHECK TIMER 1 (ALL BITS OFF)
F000:021D @ POST1_TEST06 ; TEST.06: 8237 DMA 0 INITIALIZATION
F000:025F @ POST1_TEST07 ; TEST.07: 8237 DMA 1 INITIALIZATION
F000:02D4 @ POST1_TEST08 ; TEST.08: DMA PAGE REGISTER TEST
F000:0327 @ POST1_TEST09 ; TEST.09: STORAGE REFRESH TEST
F000:033D @ POST1_TEST10 ; TEST.10: 8042 INTERFACE TEST
F000:03B7 @ POST1_TEST11 ; TEST.11: BASE 64K R/W STORAGE TEST
F000:05D6 @ POST1_TEST11A ; TEST.11A: VERIFY GDT/IDT INSTRUCTIONS
F000:06BE @ POST1_TEST12 ; TEST.12: VERIFY CMOS CHECKSUM
F000:0780 @ POST1_TEST13 ; TEST.13: PROTECTED MODE TEST
F000:086E @ POST1_TEST13A ; TEST.13A: MEMORY SIZE TEST (ABOVE 1024K)
F000:0A99 @ POST1_TEST14 ; TEST.14: INITIALIZE CRT CONTROLLER
F000:0B0D @ POST1_TEST15 ; TEST.15: VIDEO LINE TEST
F000:0B1D @ POST1_TEST16 ; TEST.16: CRT INTERFACE LINES TEST
F000:0C25 @ MFG_BOOT ; MANUFACTURING BOOT TEST CODE ROUTINE
;
; IBM's 11/15/85 ROM BIOS listing shows POST2 located at offset 0C96; it's actual location is 0C94.
;
0C94 +
F000:0000 @ POST2
F000:0868 @ POST2_CHK_HFNUM ; CHECK FOR SECOND FIXED DISK PRESENT BUT NOT DEFINED
;
; IBM's 11/15/85 ROM BIOS listing shows POST3 located at offset 1671; it's actual location is 1675.
;
1675 +
F000:0000 @ POST3
;
; IBM's 11/15/85 ROM BIOS listing shows POST4 located at offset 1941; it's actual location is 1945.
;
1945 +
F000:0000 @ POST4
F000:0000 @ CMOS_READ
F000:001A @ CMOS_WRITE
F000:0034 @ DDS
F000:003C @ E_MSG
F000:0071 @ ERR_BEEP
F000:00AF @ BEEP
F000:00F5 @ WAITF ; FIXED TIME WAIT (CX = COUNT OF 15.085737us INTERVALS TO WAIT)
F000:0104 @ CONFIG_BAD
F000:0118 @ XPC_BYTE
F000:012F @ PRT_SEG
F000:0144 @ PROT_PRT
F000:0170 @ ROM_CHECKSUM
F000:017C @ ROM_CHECK
F000:01AE @ KBD_RESET
F000:01D9 @ BLINK_INT
F000:01E7 @ SET_TOD
;
; IBM's 11/15/85 ROM BIOS listing shows POST5 located at offset 1C38; it's actual location is 1C3E.
;
1C3E +
F000:0000 @ POST5
;
; IBM's 11/15/85 ROM BIOS listing shows POST6 located at offset 1EB5; it's actual location is 1EBB.
;
1EBB +
F000:0000 @ POST6
F000:012C @ XMIT_8042
F000:016D @ BOOT_STRAP_1
;
; IBM's 11/15/85 ROM BIOS listing shows DISKETTE_IO_1 located at offset 2143; it's actual location is 2149.
;
20E9 +
F000:0060 @ DISKETTE_IO_1
F000:00E7 @ DISK_RESET
F000:013C @ DISK_STATUS
F000:0148 @ DISK_READ
F000:0154 @ DISK_WRITE
F000:0160 @ DISK_VERF
F000:016C @ DISK_FORMAT
F000:00E7 @ DISK_RESET
F000:01D2 @ DISK_PARMS
F000:02AD @ DISK_CHANGE ; RETURNS THE STATE OF THE DISK CHANGE LINE
F000:02D8 @ FORMAT_SET
F000:028B @ DISK_TYPE
F000:0339 @ SET_MEDIA
F000:03AC @ DR_TYPE_CHECK
F000:03CC @ SEND_SPEC
F000:0403 @ XLAT_NEW
F000:0429 @ XLAT_OLD
F000:07F5 @ SETUP_END
F000:080F @ SETUP_DBL ; CHECK DOUBLE STEP
F000:0873 @ READ_ID
F000:0888 @ CMOS_TYPE
F000:08B6 @ MOTOR_ON
F000:0994 @ NEC_OUTPUT
F000:09C0 @ SEEK
F000:0A85 @ RESULTS
F000:0AC4 @ READ_DSKCHNG
F000:0A5D @ WAIT_INT
F000:0AF5 @ DISK_INT_1
F000:0B0C @ DSKETTE_SETUP
F000:0B60 @ DISK_SETUP
F000:0D09 @ DISK_IO
2C69 +
F000:0000 @ HDISK_SETUP
F000:0104 @ HD_RESET_1
F000:017C @ SET_FAIL
F000:018A @ POD_TCHK
F000:01A9 @ HDISK_IO
F000:0225 @ HDISK_IO_CONT
F000:02C1 @ HDISK_RESET
F000:0315 @ HDISK_STATUS
F000:031E @ HDISK_READ
F000:0325 @ HDISK_WRITE
F000:032C @ HDISK_VERF
F000:033E @ FMT_TRK
F000:0353 @ READ_DASD
F000:0393 @ GET_PARM
F000:03F1 @ INIT_DRV
F000:0423 @ RD_LONG
F000:042A @ WR_LONG
F000:0431 @ DISK_SEEK
F000:044F @ TST_RDY ; TEST HARD DISK READY (AH = 0x10)
F000:0466 @ HDISK_RECAL
F000:048E @ CTLR_DIAGNOSTIC
F000:04C6 @ COMMANDI
F000:0505 @ COMMANDO
F000:055C @ COMMAND
F000:05C2 @ WAIT
F000:05F3 @ NOT_BUSY
F000:061A @ WAIT_DRQ
F000:0630 @ CHECK_STATUS
F000:0642 @ CHECK_ST
F000:0676 @ CHECK_ER
F000:06A1 @ CHECK_DMA
F000:06C4 @ GET_VEC
F000:06DA @ HD_INT
3366 +
F000:0000 @ KEYBOARD_IO_1
F000:00C7 @ K1S ; READ THE KEY TO FIGURE OUT WHAT TO DO
F000:0103 @ K2S ; READ THE KEY TO SEE IF ONE IS PRESENT
F000:0125 @ KIO_E_XLAT ; TRANSLATE SCAN CODE PAIRS FOR EXTENDED CALLS
F000:0130 @ KIO_S_XLAT ; TRANSLATE SCAN CODE PAIRS FOR STANDARD CALLS
F000:0168 @ K4 ; INCREMENT BUFFER POINTER ROUTINE
F000:0175 @ KB_INT_1 ; KEYBOARD INTERRUPT ROUTINE
F000:018B @ KB_INT_01 ; WAIT FOR KEYBOARD DISABLE COMMAND TO BE ACCEPTED
F000:019D @ KB_INT_02 ; CHECK FOR A RESEND COMMAND TO KEYBOARD
F000:01AF @ KB_INT_4 ; RESEND THE LAST BYTE
F000:01B8 @ KB_INT_2 ; UPDATE MODE INDICATORS IF CHANGE IN STATE
F000:01CA @ UP0 ; START OF KEY PROCESSING
F000:0258 @ T_SYS_KEY ; TEST FOR SYSTEM KEY
F000:0299 @ K16A ; TEST FOR SHIFT KEYS
F000:02AC @ K17 ; SHIFT KEY FOUND
F000:02BE @ K17C ; SHIFT KEY FOUND, DETERMINE SET OR TOGGLE
F000:0335 @ K23 ; BREAK SHIFT FOUND
F000:0385 @ K25 ; TEST FOR HOLD STATE
F000:039E @ K26A ; INTERRUPT RETURN
F000:05EE @ K57 ; PUT CHARACTER INTO BUFFER
F000:0635 @ SHIP_IT ; HANDLE TRANSMISSION OF BYTES TO 8042
F000:0644 @ SND_DATA ; HANDLE TRANSMISSION OF COMMAND AND DATA BYTES
F000:0680 @ SND_LED ; TURN ON THE MODE INDICATORS
F000:06D1 @ MAKE_LED ; FORM THE DATA BYTE FOR THE MODE INDICATORS
448D +
F000:0000 @ CASSETTE_IO_1 ; BIOS1 (11/15/85)
F000:0065 @ INT15_EVENT_WAIT
F000:00D0 @ INT15_JOY_STICK
F000:016A @ INT15_WAIT
F000:01CA @ INT15_BLOCKMOVE
F000:028A @ SHUT9 ; RETURN FROM SHUTDOWN
F000:03CC @ GATE_A20
F000:03E5 @ EMPTY_8042
F000:03EE @ EXT_MEMORY
F000:03FA @ X_VIRTUAL
4915 +
F000:0000 @ TIME_OF_DAY_1 ; BIOS2 (11/15/85)
F000:0182 @ RTC_INT ; ALARM INTERRUPT (INT 0x70, IRQ 8)
IBM PC AT (Model 5170) BIOS
---
[1984-01-10.json]() contains the original IBM PC AT BIOS.
From [http://minuszerodegrees.net/bios/BIOS_5170_10JAN84_6MHZ.zip](http://minuszerodegrees.net/bios/):
This is the first BIOS for the IBM 5170.
It is dated 10JAN84.
It is found in type 1 motherboards running at 6 Mhz.
U27 has the IBM part number of 6181028, and is 32K in size
U47 has the IBM part number of 6181029, and is 32K in size
8 bit checksum of 6181028 = 36
8 bit checksum of 6181029 = CA
--
added = 00
There are two BIN files in this ZIP file:
1. BIOS_5170_10JAN84_U27_6181028_27256_6MHZ.BIN --> Use this to create a U27 using a 27256 EPROM (rated at 150nS or faster)
2. BIOS_5170_10JAN84_U47_6181029_27256_6MHZ.BIN --> Use this to create a U47 using a 27256 EPROM (rated at 150nS or faster)
The JSON-encoded ROM image that PCjs uses was created using the *FileDump* command-line *merge* option:
filedump --file=http://static.pcjs.org/devices/pc/bios/5170/BIOS_5170_10JAN84_U27_6181028_27256_6MHZ.BIN --merge=http://static.pcjs.org/devices/pc/bios/5170/BIOS_5170_10JAN84_U47_6181029_27256_6MHZ.BIN --output=1984-01-10.json --overwrite
Since a MAP file ([1984-01-10.map]()) exists as well, it is automatically appended to the JSON file ([1984-01-10.json]())
when using a ROM input file (or JSON output file) with a matching filename.
It is also possible to create a merged binary ROM image ([1984-01-10.rom](http://static.pcjs.org/devices/pc/bios/5170/1984-01-10.rom))
by adding *--format=rom* to the command-line (the default is *--format=json*).
These operations can only be performed using the *FileDump* command-line interface; the *FileDump* API does not support
either the *merge* option or the appending of MAP data. For the moment, the API can only dump unadorned ROM images; eg:
http://www.pcjs.org/api/v1/dump/?file=http://static.pcjs.org/devices/pc/bios/5170/1984-01-10.rom
---
IBM PC AT (Model 5170) BIOS ("Rev 2")
---
[1985-06-10.json]() contains the second IBM PC AT BIOS, dated June 10, 1985, which expanded hard disk support from 15 to 23 drive types,
fixed some bugs, and added support for 720Kb 3.5-inch floppy diskette drives.
From [http://minuszerodegrees.net/bios/BIOS_5170_10JUN85_6MHZ.zip](http://minuszerodegrees.net/bios/):
This is the second BIOS for the IBM 5170.
It is dated 10JUN85.
It is found in type 2 motherboards running at 6 Mhz.
U27 has the IBM part number of 6480090, and is 32K in size
U47 has the IBM part number of 6480091, and is 32K in size
8 bit checksum of 6480090 = 71
8 bit checksum of 6480091 = 8F
--
added = 00
There are two BIN files in this ZIP file:
1. BIOS_5170_10JUN85_U27_6480090_27256.BIN --> Use this to create a U27 using a 27256 EPROM (rated at 150nS or faster)
2. BIOS_5170_10JUN85_U47_6480091_27256.BIN --> Use this to create a U47 using a 27256 EPROM (rated at 150nS or faster)
The JSON-encoded ROM image that PCjs uses was created using the *FileDump* command-line *merge* option:
filedump --file=http://static.pcjs.org/devices/pc/bios/5170/BIOS_5170_10JUN85_U27_6480090_27256.BIN --merge=http://static.pcjs.org/devices/pc/bios/5170/BIOS_5170_10JUN85_U47_6480091_27256.BIN --output=1985-06-10.json --overwrite
---
IBM PC AT (Model 5170) BIOS ("Rev 3")
---
[1985-11-15.json]() contains the third (and last) IBM PC AT BIOS, dated November 15, 1985, which added support for 101-key keyboards and 1.44Mb floppy
diskette drives.
From [http://minuszerodegrees.net/bios/BIOS_5170_15NOV85_8MHZ_VARIATION_2.zip](http://minuszerodegrees.net/bios/):
This is the third BIOS for the IBM 5170.
It is dated 15NOV85.
It is found in type 2 motherboards running at 8 Mhz.
U27 has the IBM part number of 61X9266, and is 32K in size
U47 has the IBM part number of 61X9265, and is 32K in size
8 bit checksum of 61X9266 = 10
8 bit checksum of 61X9265 = F0
--
added = 00
There are two BIN files in this ZIP file:
1. BIOS_5170_15NOV85_U27_61X9266_27256.BIN --> Use this to create a U27 using a 27256 EPROM (rated at 150nS or faster)
2. BIOS_5170_15NOV85_U47_61X9265_27256.BIN --> Use this to create a U47 using a 27256 EPROM (rated at 150nS or faster)
The JSON-encoded ROM image that PCjs uses was created using the *FileDump* command-line *merge* option:
filedump --file=http://static.pcjs.org/devices/pc/bios/5170/BIOS_5170_15NOV85_U27_61X9266_27256.BIN --merge=http://static.pcjs.org/devices/pc/bios/5170/BIOS_5170_15NOV85_U47_61X9265_27256.BIN --output=1985-11-15.json --overwrite
FB FF E3 97 00 56 8B 60 89 04 46 00 C3 0E 42 8A 4A 0F 42 C3 53 06 48 8E B1 B5 B0 E8 00 80 A3 00 10 FD 01 08 A3 00 59 58 53 55 D0 C5 0E 00 C5 00 26 07 00 C7 02 FF FC 8B FC FC FC FB 26 06 00 74 A0 00 C1 14 38 4C 74 00 4C EB A0 00 C1 C0 E4 E0 5D 5B 53 52 57 0A B9 00 08 33 F7 80 30 07 95 00 4F EF BE 00 00 B9 00 A5 BE 00 00 B9 00 A5 5E 59 C3 51 57 E8 00 08 70 00 8E BE 00 89 15 E4 5F 59 C3 1E B8 1C D8 C0 33 BF 00 04 F3 BE 00 00 BB 00 E3 00 80 00 44 88 04 44 92 04 00 10 B8 F0 10 F7 05 F8 D2 89 02 54 C6 05 C7 07 BE 00 C8 9A 6C BE 00 00 B3 E8 00 20 B8 00 92 56 BE 00 D0 92 4C BE 00 00 B3 E8 00 48 B8 20 92 36 BE 00 00 B3 E8 00 06 00 C6 57 80 58 B8 F0 92 16 8C 8E BE F8 A9 B9 00 D1 F3 07 61 C7 FF 8A C1 04 EF 89 02 7C 88 05 44 00 C3 B0 E8 33 C0 03 EB B0 E8 33 E0 95 45 A3 00 98 3D 8A B0 E8 33 78 F8 C3 B0 E8 33 E0 CC 0A 75 80 EF 8E 1E 58 56 D3 5B 22 BA 00 A6 B9 00 04 C3 E8 44 E8 00 00 BB B6 19 E8 44 A1 00 C0 40 03 84 BE B7 FB 74 80 FF 6E DB 6A 10 C4 03 03 69 02 02 40 DF 56 13 80 10 C4 0C E8 3C 74 3C 74 80 30 DF 3A 1D 80 10 C4 30 E8 3C 74 3C 74 80 30 DF 1E 27 80 10 C4 C0 E8 3C 74 3C 74 80 30 04 DF 09 8C 8E E8 5F C3 8C 8E BE 80 E4 00 AC E0 FB 0E 00 BB B7 0F E8 44 FE C3 07 07 07 07 07 07 07 07 07 07 07 26 00 66 C3 3C 77 06 7E B4 E8 00 8B 02 02 9A 8B 04 36 76 8B 10 D8 AC 5E 80 00 76 3C 74 3C 74 3C 74 3C 74 93 93 1E B8 00 D8 E8 00 59 D3 07 7E F6 00 75 B4 E8 00 8A 49 88 01 3C 74 3C 74 3C 74 3C 74 B9 00 09 2E B4 E8 00 C2 16 00 14 D2 C6 FE 75 FE B0 B4 E8 00 D2 02 08 C3 0E 02 EB 50 06 00 8E BB 00 C8 39 07 58 03 10 9C E8 6C 0E FC A0 84 F2 B0 EE A1 84 64 E8 42 0C B0 E6 BB 00 1B BE 84 04 E8 09 54 1C F2 EE A3 84 ED 56 72 BB 01 F9 E8 09 38 64 E8 64 30 F9 2C 47 EC C0 03 EB 81 01 74 3C 75 E8 64 12 2D EC A2 BF 00 BE A5 84 04 A4 84 2F B9 00 00 E8 42 04 A6 84 21 BF 21 00 D2 D4 03 02 00 B8 00 8E C6 00 FF C7 8D 00 C6 8C FA DB FF F0 FF 88 4C B8 00 C0 C7 00 26 45 FF FC 26 05 FC FC 0B 26 05 04 C1 0B C3 3A 74 FE EB 81 80 76 89 8D 88 8C 07 B4 C7 82 80 C6 8F FF 06 00 BD 00 12 81 80 0B 74 88 66 89 67 88 69 81 64 41 C3 7F 84 06 00 FF 06 00 00 06 00 C6 55 92 06 00 C6 57 00 06 00 FF 06 00 00 06 00 C6 4D 92 06 00 00 1E 50 8E B8 00 C0 F6 FF 00 FC F3 BB FF 3F E2 8B 1F 06 00 FF 06 00 00 06 00 C6 55 92 06 00 C6 57 80 1E 00 B8 00 D8 61 0C E6 A0 00 06 00 24 26 45 58 61 C6 10 B1 70 71 E0 B0 70 71 00 B9 3F CB C1 02 DB E3 26 5D 26 5D B5 32 C1 04 89 06 FE E8 88 26 45 B9 7F 00 32 FC AC E0 FA D4 C4 88 C6 00 FC 07 E8 00 60 8B BB 02 C1 74 BB 02 C1 74 BB 01 00 F7 FE 88 90 8A 24 3C 74 BB 04 C1 75 BB 08 C1 75 BB 28 00 F7 FE 88 91 C3 FD 00 04 8A C0 02 03 02 05 C3 EB 3C 75 80 04 E7 B8 00 D8 02 24 0A A2 00 32 A3 00 DB 02 01 FF 00 F7 BB 04 E3 CA 16 00 C7 50 FF C7 52 00 C6 54 C0 06 00 C6 56 00 06 00 1E B8 00 D8 61 E0 08 61 84 1E 00 06 00 E6 FC FC FC FC FC FC FC FC 86 E6 8B 5B C3 00 00 00 00 FF 00 92 80 FF 00 92 00 FF 00 9A 00 FF 00 92 C0 FF 00 9A 00 FF 00 92 00 FF 00 92 00 FF 00 92 00 00 07 00 00 07 00 FF 00 00 87 00 87 00 88 00 0F 16 07 20 0D 00 22 2E 2E 87 08 8E B0 26 1D 84 FC FC FC FC FC FC FC FC 10 8E 0F 00 25 FF 7F 22 EA 87 F0 0F 1E 07 E5 0F 16 07 20 0D 00 22 2E 2E 87 08 8E E4 8A 0C E6 8A 26 1D C6 00 FF 61 B2 0F 16 87 20 0D 00 22 2E 2E 87 20 8E B0 E6 B9 FF E4 A8 74 E2 E9 00 FF E4 A8 75 E2 E9 00 60 08 7C C7 00 00 00 EB 66 00 EB 66 00 00 75 EB 66 06 C0 00 16 16 00 C7 00 00 00 EB 66 06 C0 00 98 00 C7 00 00 00 EB 66 06 C0 00 A0 00 C7 00 00 00 EB 66 06 C0 00 03 B3 70 71 E0 B3 70 C4 20 71 12 B3 70 71 E0 B3 70 C4 DF 71 10 8E E9 FE 53 52 1E 40 8E 81 03 8B 8A 78 D1 8B 08 0B 74 50 E4 0B CC 49 CC 5B EB EE EB EB EC F8 28 B8 90 CD 58 11 24 E8 08 24 78 E2 FE 75 EB EB EC F8 04 01 2D EC 1C 01 00 00 24 EB 42 B0 EB EE 05 E8 3C 04 00 00 4A 42 00 00 24 34 8A 58 E7 5E 59 CF 3E 64 36 AB AD AF 6F 1D 33 83 91 D6 E4 FA 51 8B 50 52 1E 0B 20 20 20 55 ED C8 D8 46 8B 04 8A 80 F2 05 F9 75 43 4E B5 EB 8B FC 86 AC 00 09 C1 F7 8B EB BE 89 DE 3C 74 3A 75 8B 08 E4 2B 4E E6 FF 95 EB 1F 5A 58 59 BB 1F 5A 58 59 8B 80 01 03 4E 80 00 04 4F 02 47 8B 3B 75 80 01 06 4E FF 02 FC 74 4F 4E 4E EB 47 46 46 EB 83 FF 0D FC 74 4E EB 46 EB 80 01 03 4E 80 00 06 4F 4E 04 47 46 8B 80 00 04 4E 02 46 8B 3B 75 80 00 08 4F 4F 4E 31 47 47 46 29 FE 75 80 00 06 4E 4F 19 46 47 13 FD 75 FF 02 FC 74 4F EB 47 C3 F2 FC 74 4F EB 47 C3 F2 FD 75 FF 02 FC 74 4F EB 47 C3 F2 FC 74 4E EB 46 C3 8A 4A 8B 02 D3 04 D3 CA C4 74 87 2A 2A F6 F6 EB 2A 2A FE FE E8 02 21 3E 00 72 80 49 03 13 52 16 00 C2 A0 00 F7 5A EB 80 49 04 07 3E 00 75 8B 2B 81 FF D1 8B 8A F6 32 03 D1 03 4E 97 C6 DE F0 E3 C6 01 04 D8 DD E0 C7 0A 74 3A 73 2A 8A F3 03 03 FE 75 8A 8A B0 8A F3 03 FE 75 B8 00 D8 E4 74 80 49 02 12 3E 00 77 8B 63 83 04 65 EE 80 49 06 04 E1 E2 50 52 F8 C5 ED BA 01 E2 C1 06 00 8B 98 40 F7 F7 00 74 F7 F7 81 F0 80 49 06 01 03 8C 8E 96 53 DF C0 30 C6 2C F0 D0 D0 8B 8B 8B 8A F3 8B 8B 81 00 81 00 8A F3 03 03 FE 75 58 F0 E6 E6 8A 8B 8A F3 8B 81 00 8A F3 03 FE 75 C3 66 ED B8 00 00 33 B9 40 FF 66 D0 AB F9 61 0C 61 F3 61 BB 00 00 33 66 C5 1F F6 00 9E D1 9F 46 46 C3 F3 23 61 C0 00 1B 09 66 D3 83 04 DA B1 66 D3 66 7A 1F C0 C6 00 E4 0C E6 24 E6 59 D6 F9 E8 00 8A F6 22 D2 88 00 E8 00 22 D2 D0 79 26 05 26 00 66 C3 22 0A AA 26 00 66 C3 FF 56 D1 73 BF 20 E2 E2 E2 E2 FA E2 E2 FA FE 3E 00 73 D1 D0 8A F6 8B D1 D1 D1 F6 80 07 C7 FA B0 E8 00 16 0A 33 84 75 B0 B4 CD F6 01 01 5A 4F CF B9 00 AD 74 E2 59 EB E8 03 EE E2 F8 F6 87 04 FF 31 00 50 1E 40 8E B8 00 F1 1F 58 8B 83 10 8E 8B 8E B9 04 CB D1 49 FC 00 BE 8E 2E A1 02 06 02 03 00 3D 01 0A 24 B8 E9 8C AB 6C B8 8D 8C AB 53 AB C8 8E 26 06 00 90 8C 92 FB DC BF 03 85 B4 CD EB 33 8E 8B 52 85 75 E9 59 C0 2E 02 B4 CD B8 0C 21 3D 75 C6 FF 0D 06 19 21 41 5F 41 DC 59 24 A2 03 B3 C9 0E 03 0E 03 C7 93 00 33 1E DB 1A 21 BA 03 27 21 8E 8B 14 8B 04 1F 49 BA 03 27 21 02 75 91 C8 8B 81 E0 8E 33 B4 CD 1F 85 B4 CD B4 CD 80 00 0C 3A B4 CD B8 0C 21 C5 DD 80 B4 CD CB 00 0A 6E 65 74 43 4D 41 20 53 44 53 64 73 65 74 0D 45 74 72 64 69 65 73 65 69 69 72 24 0A 0A 65 6E 65 74 64 73 65 74 20 6E 64 69 65 41 69 20 65 65 73 72 0D 53 72 6B 20 6E 20 65 20 68 6E 72 61 79 0A 00 41 49 41 20 58 00 FE A8 74 E8 02 27 05 E8 39 C0 F7 EC 80 0B 06 4E 01 88 41 C3 D6 A8 75 32 EB E8 FF 5B D9 F6 10 0F 27 FC 75 80 03 EC EB E8 44 87 03 08 07 04 02 61 27 AF E8 3A 46 50 46 02 AD C6 05 E8 5E 88 05 06 F7 EC 80 02 80 26 00 4E 01 C3 FF 8F 74 F6 80 44 F8 E4 46 3C 72 B4 81 16 00 30 C0 22 93 01 10 74 02 11 15 03 0B 97 07 01 19 EB B0 E8 43 37 88 E8 44 C7 E8 01 27 27 F6 10 03 01 C3 1B 8A 88 02 76 8A 05 27 35 6C 75 E8 43 7E 00 03 E8 24 3C 73 E8 39 EF B4 88 E8 43 06 46 04 46 01 E8 5C 74 E8 39 D1 B4 88 E8 43 06 46 04 46 01 E8 5C 74 E8 39 B3 B4 88 E8 43 04 46 04 46 01 E8 5B 74 E8 39 95 B4 88 E8 43 06 46 04 46 01 E8 5B 74 81 16 00 75 8A 02 27 6D 8A 41 EB EB E8 42 17 CC 80 06 75 C0 04 0F 04 05 07 EC E8 43 C4 E8 00 27 3B C6 02 8F 00 C0 76 9D 32 8A 06 FC 72 B4 81 16 00 19 00 15 0A 74 B4 A8 75 04 24 2C 74 B4 C3 DB 5E 81 90 C3 9C E4 8A E4 E4 2A 3C 77 E4 9D C3 F6 B0 EE F6 E8 F2 A8 84 BA 03 FD FD FD FC 0F C0 03 56 83 0D EC C0 D8 36 00 40 8E C6 40 FF 14 C6 06 C6 07 E8 00 46 01 92 C6 05 E8 5C AF 84 F2 B0 EE 26 00 83 0D B3 E0 23 24 86 B0 E8 23 C0 D8 C8 1E 00 02 C5 3E 00 02 C5 ED 0C CD E5 80 01 2E 00 E8 41 40 39 A0 8A C0 04 E4 0A 74 86 E8 00 08 E8 00 1D 0E B3 E0 C7 0C 86 E8 22 A5 8A 80 20 8E B8 FB FF 05 07 CD B4 E8 41 ED C6 00 46 30 EF C6 05 E8 5B 04 0B 8A 06 05 B9 A8 FA 75 E2 EB E8 FE A8 75 80 05 74 FE 05 D3 07 01 7E 00 05 6A EB B4 B0 E8 41 99 88 E8 41 01 8F 05 3C 74 3C 75 B0 EB B0 3A C3 0A 6F 2D 79 74 6D 64 73 20 72 64 73 20 72 6F 0D 72 70 61 65 61 64 73 72 6B 20 6E 20 65 20 68 6E 72 61 79 0A 0D 36 32 44 73 65 74 20 6F 74 52 63 72 20 72 6F 0D 24 02 B9 FD 80 70 71 FF 0A F4 74 B9 FD EC E5 FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 8B 66 53 FC 01 85 5E 8E 8B 02 1F FB 75 B0 E6 FF 02 A5 81 0F 74 B0 E6 1F 66 5D F9 B0 E6 E8 5D 07 A0 BB 00 DB 20 66 11 00 8B 06 66 E1 00 00 0B 66 66 C0 18 66 A1 00 AB 26 B9 00 66 E2 0F F0 AB 21 66 66 C0 16 66 BE 00 66 8C 66 8C 66 B9 00 66 E2 BE 00 33 8B 02 AB 8B 66 FF FF 66 66 C0 44 66 BE 00 33 8B 02 AB 8B 66 FF FF 66 66 C0 44 66 BE 00 33 8B 02 AB 8B 66 FF FF 66 66 C0 44 66 BE 00 33 8B 02 AB 8B 66 FF FF 66 66 C0 44 66 66 00 92 66 66 C0 E8 E0 66 B8 FF AB B8 00 00 AB 33 8C C1 04 AB FF 66 BE 00 33 8B 02 AB 8B 66 FF FF 66 66 C0 44 66 BE 00 33 8B 02 AB 8B 66 FF FF 66 66 C0 44 66 BE 00 33 8B 02 AB 8B 66 FF FF 66 66 C0 44 66 BE 00 33 8B 02 AB 8B 66 FF FF 66 66 C0 44 66 E8 5B 33 BF 13 07 5B 58 CF 9E 9E 97 97 97 97 05 0B E4 F0 E6 FF 70 C3 26 00 0A 75 80 87 10 C3 0A 74 8B 63 83 04 65 0C A2 00 EB 8B 63 83 04 65 24 A2 00 5A C3 A6 AC AC 80 D0 A7 8B 8B C2 98 98 A7 8D 8C D1 A7 83 83 83 83 97 5A 5B 5F 1F CF FF FF FF FF FF E9 03 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF D3 FF FF FF FF FF FF E9 03 42 74 80 49 04 0A 3E 00 74 EB 90 AE 8B 63 83 06 E0 A8 75 FA A8 74 8A AA FB EE 80 49 04 07 3E 00 75 E8 2A 47 FC E8 F4 2E 3E 00 72 80 49 07 36 E3 64 8B 63 83 06 D8 A8 75 FA A8 74 8B AB E2 C3 3E 00 72 80 49 07 08 E3 36 F3 C3 52 8A 06 3E 00 CA DA 6E 0A 79 33 8E C5 7C 25 00 E0 E0 E0 F0 FF 74 83 10 C4 06 D7 C7 53 F8 E3 B5 AC 08 E2 E2 E0 02 D3 C9 F2 C6 E2 FE 75 5B 07 8C 8E B9 00 F4 D0 79 26 05 81 FE AD FB 03 33 AB EF 1F E4 EF 01 75 83 10 2E E3 D1 DE 04 8B AC FC 03 32 AA C7 1F D0 79 26 05 81 B1 E2 81 3F 4A D8 B8 C8 E8 00 80 76 B8 E0 D8 DB 3F AA 39 F6 00 AD D8 DC F9 18 40 8E 80 12 FF 00 BB B7 0F E8 2D 13 40 8E 1E D8 03 50 EC 5E 58 B8 00 D8 8E 33 81 55 75 33 33 8A 02 E1 D1 02 E2 75 B1 D3 52 40 8E 1E D8 03 50 F4 33 36 1C ED 0C B8 00 D8 0E 00 1F 58 D8 5A DB DA C3 1C 80 72 EB 60 1E 00 BB B8 14 E8 2C 07 BA 00 D8 C2 1E B8 C0 27 75 3D C7 F6 C0 1F 1E B8 C0 E8 00 74 50 C2 4B 58 80 76 07 C3 8E 33 81 55 75 33 33 8A 02 E1 D1 02 E2 75 B1 D3 8C 03 C3 06 BA 50 8C B9 00 5E 1F 61 80 8C 03 33 C3 D8 40 8E 1E 03 50 EC 5E 58 C3 2E 0C 46 3A 74 E2 F8 05 2E 04 59 FF B1 B3 B5 B7 B9 2D 08 71 65 74 75 6F 5B 0D 61 64 67 6A 6C A7 FF 7A 63 62 6D AE FF FF FF 21 23 25 26 28 5F 08 0B 1A 1B 1C 27 28 29 2B 33 34 35 39 37 39 34 36 31 33 2E 00 77 84 73 74 75 76 8D 8E 8F 90 91 92 93 00 1E 1F 1B 1D 0A 1C 00 97 98 99 9B 9D 9F A0 A1 A2 A3 FF B0 E6 B0 E6 58 23 FA F7 C2 EE E0 EE EA 32 8A EE FE AC 4A F5 E5 20 8E 06 FF 00 F3 8B 8A 03 FF FF FF FF FF FF FF FF FF E9 00 FF FF FF 06 01 85 17 84 40 8E B0 E6 E6 32 E6 26 06 00 74 26 26 00 07 CD CF 55 56 1E EC 8B 26 0E 00 D9 00 8B 06 F0 E6 00 E8 8B 08 E3 F0 C3 D8 10 AC E0 F8 D8 05 F5 0D AC FF 81 08 F8 46 9B 66 83 10 59 5B 07 CF B0 E6 B0 E6 B0 E6 58 0A 1E B8 00 D8 32 FA 06 00 0E 00 16 00 1F A8 1E B8 00 D8 89 6E 89 6C C6 70 00 58 E9 61 18 B0 E8 18 F0 02 41 8A B0 E8 18 E8 72 B0 FA 2F A8 74 FB F3 E8 FF 00 E6 22 B0 8A E8 18 04 E5 14 B0 E8 18 02 FB FE D2 02 01 E0 0B FC E9 61 BC B0 E8 17 D0 08 E5 8A B0 E8 17 C8 32 D7 8A E9 61 9A B8 00 CE B0 8A E8 17 08 E6 C0 B0 8A E8 17 0B AF 0C 24 8A B0 E8 17 32 E5 A2 E9 60 B0 E8 17 20 08 5B C0 CA 00 0A 83 A8 75 B0 8A E8 17 03 E1 76 B0 8A E8 17 A1 FE A1 0B 5F 0C 8A B0 E8 17 90 FA 0B 4D 24 8A B0 E8 17 7E 8A B9 F4 84 75 E8 F3 F6 CC EF 80 B4 C3 C0 FE 26 05 F9 F9 26 05 F9 F9 C3 0E FA 0B 0E 03 EB 90 A8 75 9C B0 E8 16 E8 00 02 CF 01 33 C3 8E FA E3 0E 03 EB 90 A8 75 9C B0 E8 16 E8 00 02 CF 01 33 C3 1E 40 8E 66 10 66 FF 00 66 B0 E6 E4 A8 66 74 66 00 00 1F E8 FF 68 3E 00 74 80 49 03 02 58 FF C7 74 8A 00 00 09 01 46 E4 EB B8 F0 3B 74 FC AB C8 FB 65 8A 66 8B 63 B9 00 A0 BB 01 3D 83 04 65 EE 0F D4 B4 E8 E4 02 CA B4 E8 E4 FC AD E4 A8 58 25 EE 66 04 50 48 8E E4 8A 0C E6 8A 00 C6 00 FF C4 61 1F CB F7 7E 00 17 A0 75 B0 E6 E4 A8 74 24 75 0C EB E8 34 2E B4 74 BE A0 06 A8 74 BE A0 0F 8A 8A 80 06 FF 74 BE A0 E3 74 BE A0 31 24 B4 FE 74 FE 74 83 05 F3 46 00 C7 04 00 46 00 46 00 C7 0A 00 2C 75 EB E8 34 DC 4E 2E 54 89 0A DB 14 75 E8 34 05 8A 32 89 02 8A 02 6E 2E 4C 88 04 46 01 20 75 E8 F1 3F 75 87 E8 F2 F7 1F 88 06 C0 66 FE 87 C3 09 FB 02 4F 21 09 22 04 4F 21 F7 CD 8B 04 B0 75 E8 33 26 01 1A C6 3C 74 83 0C 03 0C C6 2E 54 74 83 06 3B 01 0C 35 00 28 3B 01 36 13 80 00 07 F7 0C 87 2E 54 E8 F1 17 4E 2E 54 89 0A 66 01 33 EB 81 16 00 0C C0 1A 4E 01 B4 32 E8 F0 3F 75 87 50 CC 58 F7 F7 01 27 FB 02 27 08 02 4F 15 03 4F 22 03 4F 2F 04 4F 3C FF FF FF FF FF DF 25 09 FF F6 08 80 02 02 2A 50 0F 27 DF 25 0F FF F6 08 00 02 02 2A 50 0F 4F DF 25 09 FF F6 08 80 02 02 1B 65 0F 4F 8B 20 2A 38 FF 00 00 00 FB 1E BF 00 DF 01 33 1D 06 00 75 80 A0 01 51 FA A1 FE A1 E8 00 EB F6 A0 01 03 EB E8 00 26 00 EB F9 B4 1F CA 00 B0 E8 13 40 8A B0 E8 13 FB FA 0B 89 24 50 E0 0B 84 58 C3 1E 00 06 00 16 00 0E 00 FB FA 74 4A 0F 86 C3 E4 01 EC F0 8C BA 02 24 3C 75 33 33 33 33 EB 55 EC 8B 88 00 E8 00 F9 0F C7 0C 00 5E 89 0A E0 24 32 75 8B E8 00 D9 5E 3B 0A E2 2C DF 3E 2B F6 01 03 5E F6 02 03 5E F6 04 03 5E F6 08 03 5E 38 00 B4 58 5B 5A 5D C1 04 EB C1 04 EA F8 50 00 43 40 C8 40 E8 C3 5F 53 40 8E F6 A0 01 2E 06 00 06 C3 1E 00 1B 07 E4 24 EB EB E6 FB E5 F6 A0 80 F9 26 00 F8 01 5B 5F 02 FB 5F 06 B8 00 D8 26 00 16 00 00 80 F3 74 1F 61 03 FB 5C 26 07 FF C8 E0 26 47 8C C1 0C 88 04 C6 05 8D 28 C7 FF 8C C1 04 89 02 D0 E8 26 47 26 47 92 56 C8 C0 36 A5 E4 8B E8 00 07 5C 26 57 26 47 26 07 00 B0 E6 26 01 E8 00 89 02 C2 26 47 26 07 FF C6 05 26 01 0F E0 01 0F F0 FF 49 33 0F D0 28 8E B8 00 D8 18 8E FC F6 FF 00 70 D1 66 A5 F7 01 74 A5 80 70 28 8E 8E 8E 66 0F 00 25 FF 7F 22 66 EA A3 F0 0F 1E A1 5C E8 48 19 D1 64 41 75 B0 E6 E8 48 07 FF 64 2F C3 02 61 40 17 4E E8 01 02 04 04 0C E6 24 E6 B4 8A E6 EB 8C C1 04 C6 51 C1 C6 E8 03 C1 0C C3 40 8E 8E 69 8B 67 E8 00 00 70 07 86 E4 86 55 EC E4 0C 66 FE 81 06 00 0A 66 BF 81 06 00 CF B3 75 B0 E6 E8 47 12 DD 60 A1 75 B0 E6 E8 47 04 03 80 5F B0 E8 10 E0 30 99 CF 5F E8 FF 06 FF CA 00 53 5C 26 07 FF C8 E0 26 47 8C C1 0C 88 04 C6 05 5B B0 E6 8A E6 B0 E6 B0 E6 B0 E6 B0 E6 8A E6 B0 E6 B0 E6 B0 E6 8D 08 0F 17 5C 26 01 55 EC 46 30 5D 01 0D 00 01 2E 2E A1 C0 00 B8 00 D0 18 8E B8 00 C0 E4 CA 00 1E B8 00 D8 10 80 06 75 80 04 75 83 02 75 BB 00 47 92 20 8E BB FF 8B 26 07 0F 05 FF EB B8 00 DB 1F C3 C8 C0 F5 33 C3 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A1 00 30 3C 58 17 07 15 1E 00 E3 C0 04 FF 8A 42 EB B0 A2 00 49 BB B0 B4 3C 74 BB B8 D4 8E 89 63 98 B0 83 04 83 04 C0 4E A2 00 8A 12 A3 00 E3 8B 1A A3 00 EB 8A 2A 80 3F 65 24 0A A2 00 8A 32 88 66 B9 00 E8 00 8A 0A 8A 0B 49 24 3C 75 26 7C 0D 0E C5 47 8A 8A E8 00 C8 89 60 A0 00 07 07 04 00 73 B8 07 FF 00 F3 1E BF 00 C0 08 F3 F6 87 10 06 F4 E8 1E 65 83 04 C3 25 00 03 E0 0E F1 FC 72 FE 59 32 8A 49 1E F6 DE 36 00 8A 3A 03 56 B2 E9 F4 5E D8 C0 C3 07 62 98 52 26 00 4E 5A D1 B4 E8 05 D1 8B 50 E9 05 66 0A 75 80 1F E0 C3 0B 05 E3 E3 24 0A A2 00 C2 EE A0 00 46 A0 00 46 A0 00 46 C3 28 50 28 50 08 08 10 10 40 40 40 40 28 29 2E 29 30 30 30 30 00 10 20 30 01 07 1B 1B E2 1B 1B FF 95 1B FE E9 1B 1B 1B 89 EF 1B F0 F8 F8 EC E7 F8 E8 EF E7 E6 FE FF FF F0 EF 00 4A 1C 1B 1B 1B 1C 1B 1B 1B 03 02 03 03 02 14 14 01 01 00 00 30 84 40 8E 8B 13 5A ED C0 00 33 8E B9 80 AB C5 10 EE EF B8 00 C0 1E 00 C0 C0 80 B9 00 C8 96 2E AB F8 C0 C0 80 B9 00 00 AB E2 B0 E6 33 8E BE A8 C0 B9 00 C8 A5 E2 B0 E6 BE A8 00 B9 00 C8 A5 E2 57 7E 33 26 05 B0 E6 B8 00 D8 00 E4 3C 75 8A 89 72 B0 E6 B4 B9 00 DB D2 C4 E1 8A 03 FE E2 B0 E8 0B D0 AE CD 8A 3B 74 B0 E8 0B 40 E0 8E BE B0 E6 B0 E6 BB 00 D8 C0 38 84 98 BF 00 02 2E 92 42 3C 74 80 02 4A AB ED 39 84 9C BF 00 03 2E 92 F6 EE E0 3A 75 80 40 AB EB 3A 84 A2 BF 00 06 F3 A5 C9 F9 40 8E 89 10 B0 E6 E8 18 0E 00 B0 E8 0B 40 10 AD 31 A8 74 80 87 FB 11 77 2E 47 E8 F3 05 26 00 C6 84 18 94 0B 24 8A 50 B0 E6 E8 F0 58 0F FC 74 E8 01 53 84 3E C3 40 8E E8 25 09 05 05 26 00 C3 FF E9 03 50 84 40 8E B0 E6 B0 E8 0A C0 05 FF 0A B0 E8 0A 30 E0 1E 52 84 E2 1F 74 C3 90 03 DA B0 E6 E8 EF 1E 50 9F 74 33 8E BF 00 C7 E4 80 10 CF 0E 00 B4 B0 CD 80 10 CF 0E 00 B4 B0 CD E8 00 07 B0 E6 BD AA 38 24 50 20 58 1C D0 40 B0 E6 58 10 73 B0 E6 E8 1C 76 E8 1C BA BA DA C3 0A 75 87 B0 B5 80 10 10 03 20 FC 74 E8 00 03 20 26 00 08 10 50 2E 47 E8 F2 58 02 C3 B0 E6 58 00 10 C0 53 FC 74 E8 00 0E 00 5B 8E 06 9B B0 74 F9 B0 E8 09 20 E0 8E B4 C3 58 84 1F 77 B0 E6 8E 06 73 74 EB 90 5A 84 01 3F 03 02 01 17 B0 E6 33 33 8B 0D C7 C4 02 C0 C2 E2 33 8B 0D C7 C4 02 C0 C2 E1 75 80 FF D5 5C 84 BD AB FF 33 8A 02 0E F4 9D 14 5D 84 8B 08 C9 4F 8B 0A 2A 5B 5E 84 C3 81 95 73 E9 FF 5F 84 B0 E6 B9 FF 64 02 04 F8 0B FF E4 A8 75 E2 BB B8 1D BD AC 9E EB E4 FF FF FF FF FF FF FF FF FF FF FF FF FF FF EA 8E F0 0E 00 49 24 3C 75 33 8E C5 74 80 19 75 F7 18 75 8B 81 60 8A E8 00 E8 C1 0A 8A 0B B4 E8 00 24 B4 F6 D1 D1 D1 14 C3 FF 77 86 32 D1 8B 02 8F 00 62 3A 07 33 33 86 F7 4A 03 A1 00 E8 C8 B4 8A EE 8A EB EB EE FE 8A EB EB EE 8A EB EB EE C3 C4 42 C5 00 00 4A C4 C4 00 00 42 C1 00 00 4A E5 B8 00 D8 78 BA 01 10 33 BD AD 3E E4 0C E6 24 E6 BA 01 10 33 BD AD A4 73 56 E8 49 5E 1B 4B 61 40 B8 00 00 0F FB F3 05 FC EB 33 1F 50 8A 26 05 61 0C 61 F3 61 66 C0 19 32 86 80 0F F6 04 DC 05 E2 33 32 EB 66 04 26 05 F7 04 A8 75 66 E8 46 F5 C8 D6 F9 FF FF FF FF FF AE AE AE AF B0 B0 B2 B2 B0 B0 AE AF B1 B1 B2 B2 B1 B2 B2 B2 B2 B2 FA 73 CD 50 55 EC 46 89 0A 9D EB 60 06 00 EC FC 76 B8 00 D8 66 EB 81 1A FF 4E 00 FB 33 8E C4 04 F6 01 04 36 01 40 8E 8B 8A 15 E3 FF E6 07 1F CF 66 88 74 B2 CD 8A 10 9F 80 11 81 0D 15 E8 02 05 05 DA C3 74 88 14 26 00 66 C3 DA 72 E8 04 20 F6 08 74 0C 80 15 75 0C 50 8A 07 C0 02 04 46 58 48 E8 05 C2 F8 7F 7E 0A 06 C4 02 C6 66 88 01 04 E6 04 09 4A C2 E8 05 42 DD 72 8A E8 06 12 FC 74 F6 08 2C 11 EB E8 05 2C 72 E8 05 7E 0A 05 04 72 FE 01 C5 46 01 75 E8 05 03 2C C3 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 9C E8 04 7D E6 B0 26 44 C0 02 01 7E 0B 11 02 26 44 0A 75 B0 88 00 A2 00 0E B6 80 15 74 0A 75 FE 0A 14 66 74 3A 76 B4 EB E8 04 EA 8B 8B E8 04 FA 80 15 75 E8 03 19 BD 72 E8 02 0F F1 72 FE 01 DB 41 EB E8 04 E8 04 28 60 B0 26 44 C0 02 01 48 E8 04 87 72 E8 02 0A BB 72 E8 04 03 14 C3 22 72 E8 03 8A 0E 43 C6 48 50 48 E8 03 1E 68 8B 8B E8 03 49 72 E8 02 0A 7D 72 E8 03 03 D6 C3 46 A2 00 8A 10 E3 80 81 76 89 12 46 B4 E8 03 25 8B 48 3D 03 03 FF 86 C0 06 0A 0E 46 26 64 FE A0 00 46 C3 9E 72 8A 10 8A 02 CF CF F6 01 03 CF 26 5C 26 44 C1 02 1E BF 00 8A AA 01 8A AA 8A AA 05 07 9C E8 03 0F B7 72 E8 03 05 35 EB B4 E8 03 E8 03 05 25 EB E8 03 E8 03 1F 44 C6 48 70 64 E8 03 0F 7F 72 E8 03 05 FD EB E8 03 E8 03 08 FC 75 E9 00 33 8E C4 04 1F 0A C6 45 00 06 00 80 47 E0 43 B0 BA 01 E8 03 A8 E8 03 3E 00 72 80 47 10 25 B0 BA 01 E8 03 8A E8 03 66 FE C6 15 E8 13 3B 33 8E C4 04 1F 80 03 72 E8 00 25 3E 00 73 F8 20 33 8E C4 18 1F 81 E3 72 80 47 10 10 73 B4 E8 02 E8 02 1F 74 C6 48 10 94 E8 02 0F AF 72 E8 02 05 2D EB E8 02 46 C3 3C 72 E8 01 06 00 E8 02 79 72 E8 00 0E 13 32 89 14 01 05 20 02 C3 1E 00 CB C3 2A 10 0B 46 89 12 46 EB C7 14 03 8A 02 F6 0E 8B 4B E3 46 89 12 C6 14 B4 88 15 26 00 4E 01 C3 27 72 8A 10 01 E0 0C BA 01 E8 00 0E 20 04 CC 06 40 05 AA 92 C3 51 7F 3C 75 86 EB BB 00 24 A8 74 E8 DE 67 E2 4B EE 80 59 C3 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 50 B8 00 D8 06 00 B0 E6 E6 33 8E B8 91 FF 54 1F CF F7 EC 8C C3 10 04 20 02 F1 EC 8D B4 24 74 56 6C D0 72 46 F9 AC 86 A0 00 26 44 C1 02 42 8A 14 43 8A 12 3F 44 8A 13 45 8A 12 E8 8A 10 E4 C0 03 C4 46 8A 10 01 E0 0C 8A 11 E6 0A A2 00 8A 08 F6 EE B8 00 66 03 0E D2 50 E2 C1 04 D0 25 00 1E DB 00 BA 01 6F C3 ED 4E E8 DD C9 72 E8 00 0B 8E AC BA 01 E2 C3 00 BA 01 6D 32 8A 00 5F E8 FE 0C 0A 72 BA 01 AA EC 51 24 E8 FE 10 F7 EC 08 08 39 E2 B4 F9 C3 F9 32 89 14 88 15 46 00 26 00 4E 01 F9 C6 8E 00 26 00 26 00 E4 11 46 24 3C 74 FE 74 3C 74 E8 FD EB BA 03 00 E8 10 FF 72 E8 00 56 BE 00 F1 B9 00 EE E2 59 C3 51 33 8E F8 00 9C 1E 00 73 33 0A 8E 75 EB 33 BB 00 24 0A 8E 75 E8 DC F5 75 B4 F9 06 00 59 C3 20 04 CC 0F 01 05 57 EB A8 74 B4 F9 B9 F4 F7 33 EC 10 08 63 E2 B4 F9 BA 03 02 C3 70 71 E6 8A E6 C3 40 84 40 8E A1 00 80 34 02 E5 E5 FF FF 70 E9 D2 41 84 61 D0 10 E0 FF E4 24 3A 74 E2 BB B6 18 BD B5 62 EB B0 E6 66 ED 00 66 01 00 66 C5 00 8E 33 9E D1 66 E2 80 10 FA 20 E8 43 84 61 0C 61 F3 61 44 84 00 66 01 00 66 DD 8B 8A 8E 33 B9 40 E6 66 D3 8A 66 66 C3 F0 44 45 84 61 C0 00 1B C7 10 FF 20 D1 4D 02 84 46 84 40 8E FF 33 BD B6 B7 80 0F F6 04 DB 05 E2 33 32 EB 90 04 2B A8 75 66 E8 46 F5 C8 47 84 D6 DE 00 BD B6 46 BB B6 11 BD B6 88 EB 8A 32 FE 02 0E 55 83 04 75 80 45 EE C3 30 2D 79 74 6D 42 61 64 46 69 75 65 0A 32 31 4D 6D 72 20 72 6F 20 30 2D 65 6F 79 41 64 65 73 45 72 72 32 35 4D 6D 72 20 72 6F 0D 20 30 2D 6E 61 69 20 65 6F 79 43 6E 69 75 61 69 6E 0D 42 73 20 6F 75 65 20 6F 75 65 41 20 6F 75 65 42 20 6F 75 65 43 0D 50 72 74 20 68 63 20 20 50 72 74 20 68 63 20 20 3F 3F 3F 00 30 2D 4F 20 72 6F 0D 20 30 2D 6F 6F 68 6F 65 41 61 74 72 46 69 75 65 0A 35 31 44 73 6C 79 41 61 74 72 46 69 75 65 0A 33 31 4B 79 6F 72 20 72 6F 20 72 54 73 20 69 74 72 20 6E 74 6C 65 0D 20 30 2D 65 62 61 64 45 72 72 0A 33 34 4B 79 6F 72 20 72 53 73 65 20 6E 74 45 72 72 0A 30 2D 65 62 61 64 43 6E 72 6C 65 20 72 6F 0D 20 30 2D 69 6B 74 65 43 6E 72 6C 65 20 72 6F 0D 20 30 2D 6F 72 63 73 6F 20 65 65 74 6F 20 72 6F 2C 50 65 73 20 68 63 20 6E 74 6C 61 69 6E 0A 31 31 49 4F 52 4D 45 72 72 0A 31 32 53 73 65 20 70 69 6E 20 6F 20 65 2D 52 6E 53 74 70 0D 20 20 20 6E 65 74 44 41 4E 53 49 20 69 6B 74 65 69 20 72 76 20 3A 0A 31 32 53 73 65 20 70 69 6E 20 72 6F 0D 20 36 2D 65 6F 79 53 7A 20 72 6F 0D 20 36 2D 69 65 26 44 74 20 6F 20 65 0D 0D 20 52 53 4D 20 20 46 22 4B 59 0D 0D 20 30 2D 79 74 6D 55 69 20 65 75 69 79 4C 63 20 73 4C 63 65 0D 20 20 20 20 6E 6F 6B 53 73 65 20 6E 74 53 63 72 74 20 6F 6B 0A 37 30 44 73 20 20 72 6F 0D 31 39 2D 69 6B 31 45 72 72 0A 37 30 44 73 20 20 61 6C 72 0D 31 38 2D 69 6B 31 46 69 75 65 0A 37 32 44 73 20 6F 74 6F 6C 72 46 69 75 65 0A 36 35 44 73 65 74 20 72 76 20 79 65 45 72 72 28 75 20 65 75 29 0A 20 20 49 73 72 20 49 47 4F 54 43 64 73 65 74 20 6E 44 69 65 41 0D D8 D4 B4 00 00 8A 1E 40 03 29 F0 B0 60 B7 00 BD BA E5 B0 E6 33 E6 B0 E6 FA 0F 84 00 85 A0 FF D0 A2 FF 3A FE 75 BF 00 CA E9 CD E3 BD BA C3 FC 00 8E B0 E6 E6 BB FF 1F 07 0F 0B E2 8B 8B 86 8E B0 E6 B0 E6 B0 E6 B0 E6 B0 E6 32 E6 B0 E6 B0 E6 B0 E6 B0 E6 B0 E6 B0 BA 03 B0 E6 B0 BA 03 B0 BA 03 BA 03 BA 03 BA 03 C0 BB BA 6E B0 8B EE 77 8A 02 12 BD BB 8C 83 05 FA 03 03 30 4A E7 12 84 78 E9 E0 C9 57 B4 BD BB 93 83 0F FB BA BA 13 84 00 33 E2 B0 E6 E4 8A E4 3D 00 0E 8C B9 00 B4 E9 0C FE 14 84 8B 70 00 00 00 71 07 E0 8B 70 C4 71 8C 70 15 84 8D 70 00 00 00 71 80 E0 8E 70 00 00 00 71 80 C4 8A 75 80 80 16 84 17 84 8E 70 C4 71 18 84 1C E9 F9 61 F3 61 30 8E BC 01 19 84 7D B0 E6 B9 FF 64 02 10 F8 10 B9 00 4C E9 0B FE 02 E4 51 88 E8 09 E4 A8 74 E2 BB B8 1D BD BC 88 EB E8 E7 E3 B0 E6 E8 ED 1B 84 63 B0 E6 E8 0F 1D 84 F5 B0 E6 E8 24 1E 84 3C B0 E6 E8 3A 20 84 2E E8 0B CB E8 2B B0 E6 E8 10 23 84 14 B0 E6 E8 11 00 BD BC 0D 80 C0 FB 75 B0 E6 BD BC 2B B0 E6 E4 B0 E6 E4 A8 74 EB E4 A8 74 E4 24 24 8A B0 E6 E4 A8 75 8A E6 B0 E6 E8 D4 26 84 6B B0 E6 B0 BA 03 B0 E6 E8 DC 29 84 8B B0 E6 B4 CD B4 CD E4 8A 0C E6 86 E6 B0 E6 B0 E8 F7 04 0C 00 BB B9 1A E8 09 A1 FD A1 21 FB 21 40 8E C6 12 00 0E 00 80 96 20 E8 2E F2 60 B9 FF 06 00 74 E2 C6 96 00 86 3E 00 12 1B 40 E8 35 C0 75 0C E6 E8 35 92 4B D3 EB A8 75 A8 75 E8 09 00 11 3F 00 06 34 02 05 B3 B0 50 3A FA 92 4B 3C 74 E6 C7 72 00 FB 97 B0 E6 E8 33 19 C4 7F 07 BF BF 08 F2 5F 74 E9 01 FC 75 F6 96 02 03 25 BB 10 C3 E4 7B FC 74 80 B6 0A 06 00 74 E9 01 D3 FC 75 F6 96 02 13 26 00 80 96 FD 06 00 74 EB 80 18 FD 06 00 74 EB 80 9D 2D 06 00 75 F6 96 02 13 26 00 80 96 FD 06 00 74 EB 80 18 FE 06 00 75 21 17 F9 80 38 1F 06 00 74 80 96 08 26 00 EB 80 18 02 0E 00 F9 80 1D 26 06 00 75 F6 96 02 0C 0E 00 80 96 FD 05 0E 00 80 17 04 C3 1E 00 47 1E 00 06 00 75 80 52 33 06 00 75 F6 17 03 10 06 00 75 F6 17 20 10 15 06 00 75 F6 17 20 07 26 00 EB 30 17 80 52 01 C3 1D 36 3A 46 06 00 75 80 18 04 00 E8 2B 15 F9 80 18 FB 01 EB BB 00 50 F9 B4 B0 9C E8 28 F1 0E 91 3C 74 BB 00 E8 08 3C 74 3C 74 3C 74 BB 00 7D BB 00 1A F9 80 FF 02 BB FC 75 EB 80 D4 02 A3 FC 75 EB 90 FC 75 E9 00 FC 75 E9 00 FC 75 E9 00 FC 75 E9 00 49 74 3A 15 74 80 53 03 80 80 0C 78 FC 75 B0 E9 00 FC 75 B0 E9 00 C3 06 00 75 F6 17 04 F0 06 00 74 E9 00 06 00 75 EB 80 96 FE 0E 00 FA AF 45 80 49 02 07 3E 00 75 50 05 B3 CD 58 06 00 75 F9 50 C0 06 00 C0 03 27 58 9C E0 FA 75 FB E6 F6 96 10 15 06 00 74 F6 17 04 0E 26 00 EB F6 17 03 03 6B FA 47 45 05 F9 F6 18 80 02 C3 C3 06 00 74 F6 17 08 F0 F2 96 F6 17 04 E4 06 00 75 F6 96 10 0C 06 00 74 80 96 FD 0E 00 E8 01 E8 29 FB 1B C0 65 BF 10 ED C3 03 0A 78 80 3B 2E FC 7E 80 57 05 FC 75 B0 F6 17 08 35 32 06 00 75 B0 F6 17 03 23 2E 1F C3 2D 06 00 75 B0 F6 17 04 0B 19 06 00 75 32 02 32 E8 12 C3 E4 0F C4 47 04 53 07 06 00 F8 8A 2C BB 9B D7 06 00 75 BE 9B 06 00 75 F6 17 03 32 06 00 75 F6 96 02 0D 2E 0B FC 75 B0 EB 32 F6 96 02 07 26 00 B0 E8 11 C0 43 06 00 75 EB E8 D9 E0 D9 34 06 00 75 3C 74 3C 75 E8 00 D6 F0 EB 3C 75 E8 00 C8 F0 EB 2C 7C 8A 19 D5 A2 00 C3 26 00 BE 9B B7 36 00 36 00 C3 06 00 74 F6 17 04 9C A1 00 1A A3 00 E8 00 02 CF E8 CB 2B 26 00 FC 72 80 06 35 A8 8B 63 83 06 A8 75 FA A8 74 26 05 46 FB 8A 49 80 04 05 EC 76 E8 00 8B 89 00 E8 00 C1 D9 F7 D1 C1 EC 8B B7 B3 8A D0 79 8A 8A 01 08 D1 79 F9 D0 E2 F5 81 00 FE 75 83 50 CF D5 C8 D8 6E 8B E8 00 22 C0 D8 36 00 53 C8 DB C3 58 05 FE 74 8B E8 00 02 80 C4 89 00 8B 8A 32 A1 00 E3 D0 E3 9F 00 4A F6 32 03 D1 03 97 8B 50 33 86 8B D1 D1 03 F6 49 02 02 E2 FA 8B 8B 32 BA 00 8B 8B B1 F3 74 05 00 75 5E C0 C3 2B B1 D3 C3 40 8E B0 E6 32 A2 00 8E BA 01 55 32 EC 55 06 B1 84 0D 0E 00 E8 00 03 05 B0 E6 C3 E8 01 15 B2 84 00 B9 00 00 E8 03 B2 EB B0 E6 33 8E 26 3E 01 80 1B 80 75 02 12 B4 84 C0 C0 C4 18 B2 E8 00 C3 05 02 12 B4 CD 73 52 F7 EC A8 75 80 80 0F 04 10 12 67 E2 FE 75 FE 75 E8 01 5C 09 13 F5 11 13 4D 26 05 02 8A 8A C0 06 C9 80 0C E4 8A 58 D0 8A 02 CE 01 CD 73 80 0A 16 FC 74 80 10 0C C1 11 11 0D C1 DE 01 B4 CD 73 E8 00 C3 8E 9F A8 74 B0 E6 B1 F9 79 B0 E8 F0 C0 ED D8 33 8B 8E 8A C0 04 0D 0F 05 99 6F FE FE B5 F6 05 E4 A3 01 0E 01 C0 C3 0F 0D 0F 05 9A 4B FE FE F6 05 E4 18 8C 1A A1 00 00 A1 00 02 C7 4C 12 8C 4E C7 D8 43 8C DA FB 88 75 C3 B5 84 B0 80 80 03 C3 B9 00 00 E8 01 B0 E6 BB B9 FA 74 E8 00 D6 B9 00 00 E8 01 E8 00 44 BA 01 3C B9 F4 A8 74 E8 CC F6 75 B4 EB BA 01 3C 74 B4 F9 FA 8E AD 0C 8A B0 E8 EF C3 21 FB 21 A1 BF A1 B8 00 F6 EE 04 E8 CB 00 C3 53 52 57 55 EC 40 8E 81 03 8B 80 04 04 9C 00 E6 94 00 D2 34 E4 05 12 EB FE 75 E8 05 22 CC 05 5D EB FE 75 E8 05 10 CC 05 B8 EB FE 75 E8 05 1F 5E 59 CF FF FF FF 6A 10 53 01 E8 00 C3 50 E8 00 58 C3 CB FA 00 43 40 E0 40 E8 00 02 CF C4 D8 FA 00 43 40 E0 40 E8 00 02 CF C4 2B 81 50 5B E0 C6 8B B0 E6 E4 8A E4 86 8B B0 E6 E4 8A E4 86 2B 81 50 72 E2 FF 03 EB 87 86 8B 8B B9 00 EA 02 BE C6 26 8B 81 03 B9 00 D0 EB 90 20 88 00 AA 8B B9 00 E4 EB 90 E5 B8 B0 C0 2E 26 C6 04 27 40 26 85 80 47 EA E6 E9 52 D6 E2 B9 00 18 5A E2 00 04 E8 00 20 B0 5A 02 E8 00 FC 2E 26 C6 04 27 40 52 50 94 58 5A E8 1E 40 8E C6 12 FF 53 F6 C0 08 50 80 40 F3 C6 74 E8 00 EE EB 59 2E 07 E8 00 43 F5 8A 53 52 5B E2 C3 0D 48 B0 E8 00 BB 00 44 BB 01 9B C3 7D E8 00 7D E8 FE BB 03 2A BB 01 81 C3 E8 04 E8 06 8A E8 00 24 04 27 40 E8 00 BB 00 0E 10 B0 E6 B0 E6 B0 E6 E4 0C E6 E8 FE 61 FC 61 33 FC 00 8E 2E 07 26 85 80 47 F3 E5 33 FC 00 8E 8A 43 88 00 AA E2 07 60 06 D0 84 40 8E 89 67 8C 69 B0 E6 E8 B8 03 AA B0 E6 B0 E8 EC E0 B0 EF 33 BB 00 F3 F8 10 99 E8 BC 8D 05 00 D2 40 F7 8A 8A 8C E8 00 BD B0 E6 B8 00 D8 C0 D0 20 66 FE FF 0F 00 9D 00 2E 01 51 B0 E6 B8 00 D8 16 00 26 00 C1 A1 00 D2 40 F7 3D 00 03 23 2D 00 F8 00 80 00 15 C2 33 B9 40 FF 66 AB CF C6 EB 07 61 BA 00 8C B9 00 4A F4 53 57 06 18 8E C7 4A 00 80 00 1B 1E 00 48 8E 66 C0 00 33 FC F3 FE FE EB 07 5F 5B C3 CC 88 41 0A 74 81 16 00 8A 00 26 00 E4 05 4E 01 C3 C6 40 FF 10 4E D2 0C 0A 06 26 00 E4 0A BA 03 8A A0 00 E8 BA 03 C0 04 3F 24 3A 74 08 3F FB B8 90 15 23 7D 08 8A 0A 7E 03 08 7E 05 02 05 D9 02 D9 E3 D8 7B FB 51 F4 B9 00 D1 EC 80 06 F6 80 04 C3 EC A8 59 8A A0 00 46 D0 26 64 8A A0 00 46 26 64 02 02 47 2A 04 E7 BA 03 3F 24 74 D0 A8 74 B0 8A 3F B1 D2 0A 0C EE 75 80 3E 00 04 B9 F4 06 00 75 E8 C7 F4 80 EB 80 3E 7F 26 E8 25 E4 B8 00 66 03 02 D2 FA 0C 04 C4 04 C4 D8 C2 81 C1 05 C4 05 C4 C3 7E C0 02 7E E8 0A 7E E8 0A FF FF FF FF FF FF 50 20 A0 20 0B A1 8A B0 E8 EA C4 40 03 0E A8 74 E8 00 CF CD 58 06 1E B8 00 D8 06 00 74 81 9C D0 73 83 9E 01 1C 50 0B E4 E8 EA 26 00 A1 00 C0 1E 00 80 80 1F 07 50 E0 96 C2 B0 EE EA B1 D3 2E 84 CC 8A 42 42 58 1F 4A 32 EE 83 05 8A 42 C3 52 03 82 74 B7 E8 D2 06 B7 E8 D2 59 E4 0D 83 05 8A 8A 5A EB 8A C3 01 58 74 BE 00 24 4A 01 5A B4 50 00 43 40 C4 40 C4 F8 EC C7 29 24 1E B0 E6 E4 86 E4 86 57 F8 FF 5D 58 DF CD CB C4 CC 32 EB 8A 83 05 80 1E 83 04 42 B7 E9 D2 08 28 3C F5 DC DC E5 E3 E3 E3 DB FB C6 03 2E 24 FC C2 B0 EE EA 32 8B D1 2E 84 CC 86 42 42 8A EE 4A C0 4A 1A C3 02 19 C2 0A 75 EC 46 EB 80 1F C3 83 04 FC C3 04 03 01 00 00 00 00 00 00 00 00 AA 01 04 10 40 FF B0 E6 B9 00 44 E2 EB 2E 8A B0 E8 E8 8F D7 3A 74 B0 E6 BA 00 8C B9 00 C4 EB B0 E6 C3 93 84 04 08 D0 0D DA 0E BE CC 03 99 2E 8B BA 00 08 EE 42 FB C0 B9 00 EE 42 FA 87 83 81 82 8B 89 8A E0 87 C4 5A 00 83 C4 52 00 81 C4 4A 00 82 C4 42 00 8B C4 3A 00 89 C4 32 00 8A C4 2A 00 94 84 00 B9 00 EC 3A 75 E2 BA 00 08 EC 42 3A 75 E2 8B E9 FF 00 BB B6 1A E8 FA FE 95 84 0D DA 00 08 D0 40 0B 41 0B 42 0B 43 0B C0 D6 41 D6 42 D6 43 D6 96 84 9C B0 E8 E7 80 02 F5 80 C5 8A B0 E8 E7 C8 84 B7 8A 9D C6 D2 3C 77 86 8B 8A E8 00 3B 58 D8 C5 BA 3C 77 8A 8B 33 86 51 23 F7 93 52 3C F7 B9 22 E1 D8 13 8B 8A 8A B4 F6 D1 03 33 03 13 87 83 07 C8 E9 DA E9 DA E9 DA 01 1A 0E 8E 41 0C 8A B0 E8 E7 B8 00 D8 C0 C0 8B 20 26 06 00 CE 26 00 E4 24 E6 BB 00 05 F6 6B 01 0E 00 BB B6 1A E8 F8 FE 89 20 80 6B FE C3 50 40 8E 80 6B 01 20 20 1F 8A C0 04 0F 0A B8 00 D8 1E 00 E3 DD 10 A0 00 C0 03 CB E4 B0 E6 E4 A8 74 EB E4 A8 74 E4 A8 75 F6 02 20 0B C3 75 80 FD 20 80 FD BA 00 4F B9 00 7E 5B 0C A1 DF A1 21 FB 21 1E 00 B0 E6 E8 01 1B 05 10 00 BB B7 2F E8 F8 C8 C3 00 06 C0 E9 00 86 84 FF 60 E8 51 1E 59 64 01 05 F3 8B E4 3C 74 E2 E9 00 87 84 88 E4 A8 75 51 F6 59 F3 6A B0 E6 E4 3C 74 EB 90 89 84 AE 64 FF E4 A8 74 E2 EB 90 0A E4 A8 75 51 C0 59 F3 18 8A 84 60 B0 E6 E4 A8 75 58 2F EB 90 8D 84 B8 00 D8 0E 00 BA 00 D7 B9 00 9E C3 40 8E 80 12 FF 00 BB B7 24 E8 F7 B0 E6 B9 FF 64 02 10 F8 00 BB B8 1F E8 F7 FE B0 E6 B0 E6 E4 A8 75 E4 A8 74 E4 EB B0 E6 B0 E6 B9 27 64 01 09 E8 F6 E2 EB B0 E6 E4 3C 74 B0 E6 BA 00 10 B9 00 1C EB B0 E6 B0 E6 E4 A8 75 B0 E6 C3 AB 64 64 02 FA 64 E4 A8 75 51 DA 59 F3 09 8C 84 60 EB F9 FD F9 F5 E9 DA D5 A9 9A 96 55 55 00 BD D0 61 80 C0 FB 75 BF 00 94 E9 B7 8C 8E BF D0 14 8A F2 75 EB BA 00 E3 B9 00 92 B0 E8 E4 20 0E E0 88 07 C3 46 00 C2 EC EA A8 75 A8 74 C6 01 B0 EE EC E0 B0 EE EC 2B 4E 3D 10 02 C0 FF 1E 00 2A 5E 80 00 02 C0 0E 00 FB 72 80 07 32 28 F1 C8 E9 E9 4E 88 02 E0 46 B1 86 32 D3 89 06 3E 00 75 D0 02 66 83 07 C3 F1 46 88 02 03 DC E3 5E D2 88 05 E3 03 05 03 04 3E 00 07 60 08 46 0A 5F 0D 4B 01 B4 E8 B2 03 54 FE 3A 4A 75 32 FE 80 19 13 CE 02 3C B4 E8 B2 8A E8 00 B4 E8 B2 26 00 66 C3 03 1E 0A 74 FE EB B4 E8 B2 D2 DD F4 E8 F6 B4 E8 B2 FE 74 FE EB B4 E8 B1 FC 52 3E 00 74 80 49 03 02 00 01 33 B6 8A 4A 4A D0 5A C3 1D 35 38 0A 74 79 F9 E9 01 FC 7F 8A 32 2E 87 9B 06 00 75 F6 17 04 16 7F 06 00 74 E9 00 06 00 74 E9 00 FC 75 B8 94 76 FC 75 F6 96 02 0A 26 00 B8 95 60 C0 5F FC 74 80 0E 5D FC 74 80 37 1A 06 00 74 F6 96 02 05 00 EB 80 96 FD 33 20 0A 61 35 7B 31 1F 06 00 74 50 C9 C1 0E B9 00 C4 AE 75 80 96 FD E0 DF F9 B4 32 EB B0 EB BE 9B 21 72 EB 3C 7C 3C 7F 2C EB 80 37 D6 FC 75 F6 96 02 07 26 00 EB 80 0F 09 0B 8A 59 EB 32 EB BE 9B E1 72 F6 17 40 82 20 7D 24 80 35 11 06 00 74 80 96 FD A4 4B 80 1C 11 06 00 74 80 96 FD A6 35 80 0F 05 A5 2B 50 C4 C9 C1 0D 90 BF D3 AE 74 3C 74 80 02 12 FC 7C 3C 7C 3C 7F 32 E8 00 C3 C4 EB B0 EB 01 1A 1C 28 2B 34 37 8B 1C 89 46 3B 82 75 8B 80 3B 1A 74 89 1C FB 37 45 B8 91 15 C3 50 7D E8 F3 C3 01 46 81 16 00 52 39 A8 5A B0 EB B0 E8 E1 52 F6 8A 06 D2 03 E8 24 0A 74 3C 77 F8 01 5A E8 BD 27 C4 C3 8E 02 0E 0F C3 16 00 C2 74 80 C0 09 FA 75 B2 EB B2 EB B2 F9 8A 8A 06 E4 03 E0 08 8F 8A C3 FC 66 0A 74 C0 04 D0 06 00 E7 33 A0 00 66 0A 74 C0 04 0F C3 53 8A C0 06 F7 EE 8B 8A 24 C0 04 C3 74 0C 80 C0 E0 26 00 5B C3 02 74 E8 BC C3 F8 75 E8 BC C7 C3 8B 86 E8 FF FB E7 C3 E8 19 4A DD 8A 07 E7 0A 06 D1 E8 1A 11 07 BF 00 B9 88 47 F8 06 88 41 58 A0 00 C0 27 08 04 80 21 26 00 C4 74 D0 EB F6 03 04 C4 0B C4 74 B4 EB B4 C3 40 8E BB 00 3F 75 E9 00 07 C0 E8 0A 74 FE 75 B3 B5 B4 CD B4 E8 00 09 B1 33 CD 72 E9 00 FC 75 0A 75 B4 CD B4 E8 00 C5 B8 04 01 D2 13 46 FC 75 0A 75 FE 74 80 29 B7 05 ED 00 13 17 92 B8 04 10 D2 13 1C 00 13 15 7E B8 04 0F D2 13 26 CB 46 C5 D0 90 80 97 0B 04 72 BA A1 55 B4 E8 00 2F EB 90 02 5C BB 00 3F 74 BA A1 37 BA A1 31 B4 E8 00 FB EB 90 CE 75 E8 FD F0 E8 3C BA A0 11 C8 08 74 FE BA A1 03 3C E8 00 53 90 38 74 88 E8 FE 0E 00 5B E8 FD 68 98 C0 04 E0 50 FC 75 3C 74 3C 74 B0 E8 DE 04 FC C4 E0 33 BC E8 FD 20 38 E0 CC B0 E8 DE 00 BB BA 59 E8 F0 01 E8 0C 0F 10 00 10 BD 84 0E 33 E0 7F 24 86 E8 DE 50 C2 D2 C2 78 AB C8 58 60 06 A0 A8 60 84 00 8E BB 00 C3 8C 69 26 26 00 06 00 00 61 84 D9 74 81 64 10 E9 03 28 B0 E6 C7 86 80 C7 88 00 E8 A8 81 72 34 75 A1 00 86 A1 00 88 E9 01 56 1E 8C 8E BB 00 DB 0C BF 00 0B F3 07 5F B0 E6 E8 AA 07 64 84 0F 81 76 80 73 81 64 80 8B 7C 89 76 8B 7E 89 78 E8 AD 76 0B 74 E9 01 1E 00 EB 00 1E 00 1E 00 EB 00 1E 00 90 A2 00 02 06 00 E8 02 1E 00 C3 00 1E 00 C0 12 0E 00 00 2E 00 16 00 0E 00 65 84 1E 00 1E 00 1E 00 1E 00 2E 00 C5 00 91 A2 00 10 06 00 E8 02 1E 00 1E 00 C0 12 0E 00 00 2E 00 16 00 0E 00 88 05 04 80 2B 8D 3B 73 8B 88 03 86 81 80 A1 00 82 C6 8F FF 26 00 06 00 E8 02 C0 12 0E 00 00 2E 00 16 00 0E 00 B8 00 C0 80 8B E8 A8 BD 00 06 00 B0 B4 E8 03 02 74 81 64 44 88 6A 89 6B 88 6D A1 00 00 F7 B0 3A 74 8A C6 92 01 36 A9 00 12 0E 00 00 2E 00 16 00 0E 00 88 0B 74 05 04 E3 10 E2 06 00 E8 03 02 74 81 64 08 88 72 89 73 88 75 A1 00 00 BB 3F 1E 00 C3 24 8C B4 C6 92 01 D2 A9 00 12 0E 00 00 2E 00 16 00 0E 00 66 84 1E 00 89 13 8B 88 B0 8A E8 DB B1 E7 EA B1 F7 64 80 74 B1 E8 A8 67 84 3E 00 02 0E B3 C5 0C 8A B0 E8 DB 02 06 00 FF 02 03 8F B0 B0 E6 E4 B0 E6 E8 12 64 01 FA 60 E0 CC B0 E6 50 73 58 C4 60 6B B0 E6 F4 FD 69 84 00 EB 90 6A 84 01 B8 00 D8 16 00 26 00 E8 ED 0B 75 E9 00 6B 84 00 8E F7 64 01 74 E8 ED ED 0E 00 F1 0E 00 16 00 12 F7 64 04 74 E8 ED ED 0E 00 F1 0E 00 16 00 09 F7 64 02 74 E8 ED ED 0E 00 F1 0E 00 16 00 D6 F7 64 08 74 E8 ED ED 0E 00 F1 0E 00 16 00 CD F7 64 10 74 E8 ED 00 BB B6 1A E8 EC 06 00 FF 18 EF F7 64 40 74 E9 FF 61 C0 04 74 84 CA B0 E6 0F 0F 07 61 53 D8 6D 84 C3 D8 6E 84 C3 1E 00 1E 00 26 0E 00 00 1E 00 1E 00 4C 8B 84 39 80 73 8B 80 89 8A EB 90 18 0E 00 00 1E 00 28 8B 84 89 8A EB 90 B0 E6 58 1E 00 10 8B 84 89 8A F8 C0 01 5B 53 06 70 84 26 00 C4 E4 F8 00 80 92 01 0A 40 8E 8B E8 A5 3E 00 75 B8 00 06 00 00 86 B0 E6 B8 00 C0 56 55 8F 38 4C 77 E8 D1 03 F5 5D 5E 73 8A 4C B8 00 55 83 40 57 53 1E 00 08 33 33 D1 1D 00 E2 8A 4C B8 00 C3 74 B8 01 5B 5F 3E 00 75 B8 00 C0 C5 C3 CC 39 82 77 B8 00 09 80 4C 01 7E 89 84 50 73 84 07 5B 06 53 B0 E6 58 4C 50 48 8E B9 00 D8 FF C0 DB 00 AF 3B F4 8A E4 A8 74 32 33 EB 47 8B E4 A8 74 32 BF 00 26 3E 00 75 B8 00 C0 C5 40 8B E8 A4 EB 4F 26 05 06 26 25 C4 C6 00 C8 2E 00 7C 84 8B A3 00 D7 02 EB FE 3A 76 E9 FF FF 74 B8 00 5F C3 0C FA A5 FB 0E 02 F8 15 E8 E5 90 F8 36 00 04 36 00 36 00 C3 E4 FA 7D FB A0 00 80 00 23 0D 75 B8 1C 19 2F 75 B8 35 0F FC 77 3C 74 3C 75 B0 BE FF 02 F6 F6 80 00 06 F0 02 00 53 1E 00 C3 73 E3 C0 05 C3 26 00 E4 0A A0 00 C3 05 5B FF 77 80 1F 51 E8 0E FB 26 00 E8 0E F3 60 FF F6 97 10 0B F7 D7 B0 E6 EB 80 97 EF C9 8A C0 05 C3 60 FF F6 97 10 09 F7 B1 B0 E6 80 97 BF C3 8B 1C 89 46 3B 82 75 8B 80 3B 1A 74 89 1C 32 F8 03 01 FB 50 08 5F 09 67 C0 16 86 BF 80 C0 0A DE E6 2E 26 67 6E C8 16 86 BF 80 C0 0A DD E6 2E 26 67 54 C8 0C 86 7F 40 86 00 44 C8 4F 86 00 40 05 E0 E4 34 E6 EB E4 24 0C E6 B4 EB 83 01 2B F9 77 B8 00 C1 40 E0 86 BF 80 C0 C4 86 00 92 E6 80 00 04 C4 4A 58 E4 A8 75 A8 75 B4 EB A8 75 B4 24 2E 06 67 1E 01 3A DD 74 32 B9 00 C8 41 09 08 08 80 02 02 C4 E4 E8 14 FF 08 00 20 02 01 C4 E4 FB 3C 76 E9 01 EC 8B 8C 8E 8E 8B 33 B9 00 AA F5 7C 26 05 FF C6 07 26 45 00 C6 05 26 45 00 26 45 C0 7C 26 05 FF C6 07 26 45 00 C6 05 8C BB 00 E3 C5 D2 05 00 D2 26 45 26 55 33 E8 00 03 94 8D 38 8A 24 3C 74 C6 46 E9 00 02 E8 00 79 46 0A 74 8D 10 DE 74 E8 00 F3 E0 2E 3D F7 00 8D 38 FF 74 26 05 EB 26 05 33 E8 00 7C 26 05 C8 12 80 BF 02 E8 00 2D 46 02 27 80 40 02 E8 00 1B 46 01 15 7C 26 1D E3 74 C6 46 EB C6 46 83 38 B4 C3 FF FF 02 75 FF 06 04 F3 83 08 EF 8F 06 44 8F 02 04 8D 18 89 02 01 B4 CD C3 7C 26 5D B9 00 87 15 FF FF 5C 55 48 52 20 41 39 47 42 33 57 39 44 43 33 50 28 29 6F 79 69 68 20 4F 50 51 43 6D 75 65 20 6F 70 72 74 6F 20 39 32 38 2C 34 38 2C 36 E9 DA 31 00 28 43 29 43 6F 70 79 72 69 67 68 74 20 43 4F 4D 50 41 51 20 43 6F 6D 70 75 74 65 72 20 43 6F 72 70 6F 72 61 74 69 6F 6E 20 31 39 38 32 2C 38 33 2C 38 34 2C 38 35 2C 38 36 2C 38 37 2D 41 6C 6C 20 72 69 67 68 74 73 20 72 65 73 65 72 76 65 64 2E B0 E6 B0 E6 B0 BA 00 B3 E8 00 12 4B 0E 84 92 4B 22 4A EE 80 05 B0 E6 C3 00 8A E6 EC E0 3D 00 18 F1 92 4B 12 4B 8C B9 00 5A E9 E6 FE FF FF FF FF FF FF FF 50 61 40 02 CF 01 85 11 84 B0 E6 B0 E6 E6 E8 01 61 E4 E0 96 EB 90 FE CC 02 C5 C8 D8 C0 30 8E BC 01 43 E8 00 ED 08 53 E8 00 27 FA 04 D3 B9 00 A2 8B 81 03 B9 00 96 B0 B4 CD 33 B9 00 88 F4 F5 FF FF F2 E9 A5 EE C0 D8 DB 07 07 61 08 61 F5 FF FF 10 E9 A5 EE 61 F7 61 61 40 03 FF B8 00 D8 3E 04 E7 BB 00 00 8E 66 AD 61 40 0C C3 10 DF EA C0 E5 F3 D5 FF 56 E9 A5 EA E3 33 B1 D0 73 42 F9 D2 FF 10 92 26 E2 04 3C 76 04 B4 CD E2 C3 0A 74 B4 CD EB C3 2F 75 0E 33 8E BF 00 24 AB 26 AB 7C A1 71 A1 71 BF 01 2C AB 2E AB 07 B8 00 10 EA E1 F0 0E 77 8A B0 E8 D2 01 03 CC 8A A8 74 BA 20 A0 B9 00 58 80 12 FF 42 20 11 00 BB B8 56 E8 E4 0E 00 F6 10 01 11 00 BB B8 1B E8 E4 0E 00 A8 74 BA 20 11 B9 00 14 80 12 FF 60 C0 64 FF E8 AE 64 02 07 F5 27 FF E8 AE 64 01 04 F5 17 60 80 11 00 BB B9 55 E8 E3 0E 00 33 E8 EC 01 E8 00 C0 06 00 03 06 C6 12 00 60 00 BB B9 18 E8 E3 3C 74 E8 00 06 00 61 FA 21 FD 21 33 8E 26 1E 00 C7 24 E6 FB E8 E2 26 1E 00 B0 E6 B9 FF C1 E4 A8 74 E2 B0 E6 C3 E4 B0 E6 58 B4 CD 80 3B F7 FF FF FF FF 32 04 00 00 00 00 31 11 67 04 00 00 00 00 7E 11 67 06 00 00 00 00 67 11 00 08 00 02 00 00 FF 11 AC 06 00 02 00 00 AB 11 B9 05 00 00 00 00 B8 11 CE 08 00 01 00 00 FF 11 9D 05 00 00 00 00 9C 11 84 0F 00 FF 08 00 83 11 D4 05 00 FF 00 00 D4 11 9D 07 00 00 00 00 9C 11 9D 09 00 00 08 00 9C 11 64 08 00 01 00 00 63 11 D4 04 00 00 00 00 D4 11 00 00 00 00 00 00 00 00 64 04 00 00 00 00 64 11 D4 05 00 00 00 00 D4 11 C6 05 00 00 00 00 C6 11 F2 0B 00 FF 08 00 F1 11 DD 05 00 01 00 00 DC 11 DD 07 00 01 00 00 DC 11 25 06 00 FF 00 00 25 11 9C 08 00 FF 00 00 9C 11 C6 0E 00 FF 08 00 C6 11 C6 10 00 FF 08 00 C6 11 FF 0E 00 FF 08 00 FF 11 C6 0A 00 FF 08 00 C6 11 EC 10 00 FF 08 00 EC 11 25 06 00 FF 00 00 25 1A 67 04 00 00 00 00 67 19 67 08 00 00 00 00 67 19 89 09 00 00 08 00 89 19 EC 08 00 FF 00 00 EC 22 C6 07 00 FF 00 00 C6 22 C6 08 00 FF 00 00 C6 22 C6 09 00 FF 08 00 C6 22 C6 05 00 FF 00 00 C6 22 63 10 00 FF 08 00 63 3F FF 0B 00 FF 08 00 FF 21 FF 0F 00 FF 08 00 FF 22 FF 0F 00 FF 08 00 FF 21 FF 10 00 FF 08 00 FF 3F 25 04 00 FF 00 00 25 1A 25 02 00 FF 00 00 25 1A EC 08 00 FF 00 00 EC 21 EC 06 00 FF 00 00 EC 21 C6 05 00 00 00 00 C6 19 FF 0B 08 FC 00 00 00 83 06 FC 0F 84 00 85 C7 E8 EF DA B9 84 03 51 00 13 00 B9 00 01 CD 59 42 0C FF FF FF FF E9 DE DD BB 84 FA 74 B0 E8 CD 40 1E DA 40 8E 8A 75 8E 0A 74 A8 75 B0 E6 BA 00 A6 18 C2 75 53 C7 5B 84 BD 94 07 09 8B F3 75 BE 93 3F EB B0 8A E8 CD FB C4 A8 81 FE 55 75 E4 A8 75 A8 75 B0 E6 B0 E6 EA 7C 00 C4 FB 14 E8 00 00 16 19 2E 3C 74 E8 DF F5 2C BE FF 8B 2E 04 00 74 EB 90 E4 80 40 12 0A 2E 06 67 2E 06 67 E8 0B 8B B9 00 F3 75 4A F3 F3 C8 F3 74 83 04 EE F9 E5 FF FF FC 56 8B BE 00 DE E4 0B 55 E8 F4 F8 B3 FE 75 81 0A 02 66 FE E8 F4 03 9D E8 F4 05 2F EB 81 0A FF 4E 01 E9 00 CC 05 4A EB FE 75 E8 F4 74 CC 02 6E CC 05 F3 EB 80 0B 08 F7 E8 F4 58 FC 75 81 0A 02 66 FE E8 F4 44 42 81 0A FF 4E 01 EB 80 0D 05 3A EB 80 EB 05 D6 EB 80 EC 05 6E EB 80 ED 05 A4 EB 80 EF 05 AE EB 80 0D 5E CF 50 40 8E B8 FF A0 A0 C0 0C E0 A1 C4 A1 A0 16 0B 20 20 C0 0C E0 04 06 21 C4 21 FC 74 B0 E6 88 6B 58 CF B9 00 F4 E8 A8 A8 75 E2 F9 08 E8 A8 42 40 C3 FF 5C 72 E8 D4 0D B8 72 E8 D8 03 9A C3 AF B0 E6 E8 02 FC 1E BB 00 DB 06 00 74 E4 3C 75 80 96 40 26 00 B0 E6 FB FF E9 01 06 00 74 E4 3C 75 80 96 BF 0E 00 80 17 20 B0 E8 CB 40 0E 2C 67 A8 75 80 17 DF B0 E6 FB B6 80 96 DF FF E9 00 17 E8 FF D8 60 B4 CD BD 00 08 20 20 E9 00 E0 3C 75 F6 18 08 0E C2 73 FA 20 20 E9 00 20 20 80 E0 07 0E 00 EB 80 E1 07 0E 00 EB 80 FE 0A FC 75 80 97 10 EB 90 B1 F6 18 08 65 1C FF FF FF FF FF FF FF FF FF C7 72 34 E9 F5 FC 74 80 D4 07 06 00 75 80 46 1C FC 75 F6 96 01 28 61 72 80 52 1E E4 1A 0E 06 00 75 F6 17 04 07 26 00 EB E8 FE 88 15 E8 00 C6 85 07 61 04 E8 00 50 26 00 F6 96 01 12 E4 80 45 05 FC 74 80 96 FE C3 E8 01 AE 64 C3 16 E8 D7 17 FC 75 FE EB 80 4A 09 C8 28 16 EB 3A 15 74 80 2A 05 FC 75 F6 96 02 31 FC 75 F6 96 01 25 E4 21 DB 1E 00 19 E4 50 FC 61 0F 0C E6 E8 00 75 58 61 C3 53 00 43 40 D8 40 F8 00 43 40 E0 40 E0 2B 81 1D 5B EA 58 50 17 C0 04 07 26 00 E4 3A 74 80 97 F8 06 00 02 58 50 E8 00 4D 26 00 E8 00 ED 60 FF F6 97 10 0B F7 45 B0 E6 EB 80 97 EF 37 A0 00 E8 24 80 97 F8 06 00 60 FF F6 97 10 02 F7 26 00 59 C3 FA 97 0C 86 97 A8 FB C3 B9 27 64 02 FA C3 FF FF 34 45 C0 C0 C0 E1 A6 A6 48 63 7C 10 38 FB 1E 57 52 53 8B 33 8E C4 78 B8 00 D8 06 00 81 16 00 46 8A 06 FC 73 3C 77 3C 76 3C 72 2C 8A 32 D1 2E 97 EC 07 01 EF 3F 26 5C 88 40 81 16 02 5B 5A 5F 1F CF E1 75 E8 A3 0A 23 74 81 16 00 B0 E6 32 0A 74 B9 00 01 E2 E2 FA 03 EE C3 7E 02 28 46 BB 00 E3 46 83 00 FA 73 8A 00 FF DB C3 D2 80 0E 04 46 04 3E 00 74 80 41 09 07 D4 0A 75 33 8A 00 8A 03 80 D3 F7 48 C8 06 03 73 8A 01 04 0A 09 4E 01 EB 90 3B 75 32 8A 01 E3 8B D1 E6 B0 EB E6 8A E8 E7 F9 8A 07 3F 8A 04 39 83 03 3F 46 80 01 75 E8 E7 1A 8B B7 24 74 B7 A8 75 B7 E8 E7 7C E8 E7 EE E8 01 17 07 BF 00 F6 74 E8 A3 88 47 F2 38 88 41 E8 FE E4 1E 56 B9 00 C0 D8 AC 56 10 B8 10 D8 AC 59 E8 A1 66 8B 8A F6 10 0D FC 75 80 03 C4 88 E8 E6 4A 0B FF E8 DC 04 E4 66 03 73 B4 EB E8 00 2E 02 0A 4D 81 8A 07 E7 0A 06 75 83 03 7B 83 04 75 83 07 5A 74 81 16 00 26 00 66 0A C3 E1 B9 00 44 74 E2 B4 EB E8 A3 07 8A 06 35 E8 00 07 D8 A8 B4 C3 01 4E D2 84 3E 75 08 3E E8 A2 47 00 BB 74 24 3C 75 E8 FF 7A 8F E8 A2 27 46 F6 20 02 E0 4F 32 3A 74 88 04 BB 00 4F 5B B7 E8 E5 7E C0 02 7E E8 E5 91 8A 04 BF FB 7C 75 33 26 5C 8A 01 03 04 05 14 E8 A2 B0 80 02 02 0F D8 02 C3 DB 03 01 E8 00 C0 40 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 50 B8 00 D8 0E 00 B0 E6 B8 91 15 58 B7 E8 E5 02 EB A2 00 3B E2 A0 00 F8 01 CD 73 F6 3E 80 1B E4 1C 04 B9 3D C0 06 00 75 E8 A1 F4 75 E8 DA 80 26 00 0A C3 2A 2A 2A 2A 2A DF 25 0F FF F6 08 15 46 4A 42 B7 E8 E4 ED C3 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 80 14 07 FC 75 B4 FC EC 40 8E 8A 10 80 30 00 80 30 03 00 8B 63 8E 86 8B 86 81 FF D1 2E 94 97 8B FB 1E 57 53 52 EB FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 28 0A 06 1C 07 07 00 00 50 0A 06 1C 07 07 00 00 28 0A 06 70 01 07 00 00 50 0F 06 19 0D 0C 00 00 28 0A 06 1C 07 07 00 00 50 0A 06 19 0D 0C 00 00 28 0A 06 70 01 07 00 00 50 0F 06 19 0D 0C 00 00 00 00 00 00 00 00 1E 50 51 56 B0 E6 FC C9 BB 00 00 8E B8 AA 06 00 5A ED 0E 00 E1 BE 00 4F 75 8B 83 48 EC D0 C0 FD C0 48 F3 8B 8D 10 C6 04 26 05 FF C6 05 8D 18 C6 04 26 05 FF C6 05 B4 8B D1 CD 83 48 E1 84 E2 84 00 8E B8 AA 06 00 3B FF 75 32 8A 02 C1 09 FF 3B 74 2B 3B 72 83 0F E3 FF FF 2B 3B 72 BE 00 C1 75 D1 E8 00 13 E8 01 74 E8 00 5E 59 58 1F C3 E8 00 00 8E 8C 8E BF 00 8B A3 71 C7 26 05 26 C1 04 C3 E0 89 BF 00 8B A3 71 C7 26 05 2A 26 1D 0C 26 05 2C 83 02 8B A3 71 89 B0 E6 1F ED 0E 00 E1 C1 04 D9 83 00 1F 81 FF 81 00 C1 0C 10 2B B9 F0 C1 E0 26 3D 88 C3 6A 33 B8 E0 C0 FB ED 0E 00 E1 F3 C3 51 33 AC D0 FB D2 59 C3 06 57 B9 C0 C1 ED 8A 02 C1 09 E9 8B 8C 8E BE E0 03 F3 59 5E 1F 53 FC 50 06 FA FF FC E9 94 07 66 5B E4 53 FE E4 B3 EB E8 00 FF 10 0C 01 0C 08 02 04 02 00 C4 E4 50 E8 F8 A3 64 58 FA F3 B0 E6 E4 A8 74 E4 EB E8 F8 A5 64 DB 51 10 E4 A8 E1 59 02 60 9C C7 B0 E6 0E 03 EB 90 58 C3 FF 00 01 00 02 00 04 00 08 00 10 00 20 00 40 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 02 00 04 00 08 00 10 00 20 00 40 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FE FF FD FF FB FF F7 FF EF FF DF FF BF FF 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FD FF FB FF F7 FF EF FF DF FF BF FF 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 7D 84 E0 2E 34 F7 00 74 E9 01 00 80 0F 16 07 20 0D 00 22 EA F4 00 08 8E E4 8A 0C E6 A0 00 E0 61 E4 80 40 03 8A 80 02 40 38 8E B9 20 F6 F3 AD B9 20 FF B8 AA AA F3 66 D8 38 8E 33 B9 20 AD 3B 74 E9 00 74 EB B9 20 FF B8 6D 6D F3 66 D8 38 8E 33 B9 20 AD 3B 75 49 02 F4 00 33 66 55 55 66 AB 8B B8 00 D8 F6 00 66 66 C3 47 74 EB B8 00 D8 78 B8 00 7C 33 BD F5 20 BA 00 76 E9 01 FF 7C BD F5 8A 72 BA 00 8C E9 F2 0B FB F3 0C FC EB B0 E6 E9 00 08 8E 26 26 00 B8 00 C0 04 BB F3 7C 33 BD F5 CC BA 00 CA E9 00 08 8C 8E 26 0E 00 8E B8 00 7C 33 BD F5 24 72 BA 00 F2 E9 F2 A5 04 BB F3 7C 33 BD F6 88 BA 00 0E E9 00 08 8C 8E 26 26 00 8E B8 00 7C 33 BD F6 E0 72 BA 00 36 E9 F1 03 5E B8 00 D8 26 00 C6 00 FC 80 00 05 0E 00 B8 00 C0 D8 20 66 FE FF 0F 00 6D 00 2E 01 84 E4 3C 74 33 B9 00 D0 E8 D0 7E 84 C0 80 8B B9 00 F3 4A F5 F3 C8 F3 FF 1E 33 66 01 00 66 C5 00 33 9E D1 66 E2 E4 0C E6 24 E6 66 01 00 66 DD 8B 06 33 8A B9 40 E6 66 D3 8A 66 66 C3 F0 14 61 40 B8 00 00 08 4D A9 33 C3 04 50 61 0C 61 F3 61 66 C0 19 C4 86 80 0F F6 04 DC 05 E2 33 32 EB 83 04 04 A8 75 66 E8 46 F5 C8 D6 F9 60 0F 0F B0 E6 B8 00 D8 26 00 16 00 00 B0 E6 51 7B 59 06 C9 E9 00 77 84 33 59 DB 06 C9 EB 90 C1 80 06 C9 02 07 78 84 E4 B0 E6 E8 F4 64 01 FA 60 E0 CC 50 81 58 60 64 E8 F4 8A E6 58 8F 88 E8 F4 FE 64 EB B0 E6 F8 06 B0 E6 F9 40 8E 8E 69 8B 67 72 EB 90 80 C8 C1 74 BA 00 8C B9 00 46 F4 C1 74 BA 00 8C B9 00 34 F4 7B 84 A1 A9 61 B8 00 1D 30 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FB B8 00 D8 13 1F E8 A6 2A 2A 2A 2A 80 7F 4C FC 74 80 92 42 8B 81 00 C1 07 FF 84 EB 90 BF 92 EB CA 00 F8 F8 F8 A1 A1 F8 A2 A2 A4 A4 F8 F8 F8 F8 F8 F8 F8 F8 A5 FC 75 F9 02 FB 86 CA 00 32 C3 5F E8 F6 F4 F2 F0 EE 5F E4 F1 20 21 21 21 21 A0 A1 A1 A1 A1 95 95 CA D4 21 17 CB D3 D3 00 0A 03 00 03 00 B0 E6 B0 E6 B4 9E B8 FF 01 B8 00 D8 64 04 62 EA 01 84 AA 64 FF E4 A8 75 E2 EB 90 02 84 60 03 84 04 84 00 8E 33 81 AA 75 BD F9 FF FD B0 E6 B8 C8 D8 DB 3F 55 08 76 2E 2E F9 06 84 40 8E B8 00 0E 07 84 8F 70 00 00 71 D8 8F 70 00 00 00 71 FB 75 E9 AA 08 84 FB 75 EB 90 C0 F1 00 8E 33 BE F8 0B AC D0 EE F9 A0 B9 00 0B EC C0 05 20 E2 83 20 05 20 EB B0 E6 E6 B0 E6 80 0B 02 00 FF E3 8B E7 B8 00 D8 E6 0A 84 40 8E FF 67 B0 E6 B0 E6 EB B0 E6 E4 24 E6 B0 E6 CD FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 81 81 99 7E FF FF E7 7E FE FE 38 00 38 FE 38 00 7C FE 7C 7C 10 7C 7C 7C 00 3C 18 00 FF C3 E7 FF 3C 42 66 00 C3 BD 99 FF 07 7D CC 78 66 66 18 18 33 30 70 E0 63 63 67 C0 5A E7 3C 99 E0 FE E0 00 0E FE 0E 00 3C 18 7E 18 66 66 00 00 DB 7B 1B 00 63 6C 38 78 00 00 7E 00 3C 18 3C FF 3C 18 18 00 18 18 3C 00 18 FE 18 00 30 FE 30 00 00 C0 FE 00 24 FF 24 00 18 7E FF 00 FF 7E 18 00 00 00 00 00 78 30 00 00 6C 00 00 00 6C 6C 6C 00 7C 78 F8 00 C6 18 66 00 6C 76 CC 00 60 00 00 00 30 60 30 00 30 18 30 00 66 FF 66 00 30 FC 30 00 00 00 30 60 00 FC 00 00 00 00 30 00 0C 30 C0 00 C6 DE E6 00 70 30 30 00 CC 38 CC 00 CC 38 CC 00 3C CC 0C 00 C0 0C CC 00 60 F8 CC 00 CC 18 30 00 CC 78 CC 00 CC 7C 18 00 30 00 30 00 30 00 30 60 30 C0 30 00 00 00 FC 00 30 0C 30 00 CC 18 00 00 C6 DE C0 00 78 CC CC 00 66 7C 66 00 66 C0 66 00 6C 66 6C 00 62 78 62 00 62 78 60 00 66 C0 66 00 CC FC CC 00 30 30 30 00 0C 0C CC 00 66 78 66 00 60 60 66 00 EE FE C6 00 E6 DE C6 00 6C C6 6C 00 66 7C 60 00 CC CC 78 00 66 7C 66 00 CC 70 CC 00 B4 30 30 00 CC CC CC 00 CC CC 78 00 C6 D6 EE 00 C6 38 6C 00 CC 78 30 00 C6 18 66 00 60 60 60 00 60 18 06 00 18 18 18 00 38 C6 00 00 00 00 00 FF 30 00 00 00 00 0C CC 00 60 7C 66 00 00 CC CC 00 0C 7C CC 00 00 CC C0 00 6C F0 60 00 00 CC 7C F8 60 76 66 00 00 30 30 00 00 0C CC 78 60 6C 6C 00 30 30 30 00 00 FE D6 00 00 CC CC 00 00 CC CC 00 00 66 7C F0 00 CC 7C 1E 00 76 60 00 00 C0 0C 00 30 30 34 00 00 CC CC 00 00 CC 78 00 00 D6 FE 00 00 6C 6C 00 00 CC 7C F8 00 98 64 00 30 E0 30 00 18 00 18 00 30 1C 30 00 DC 00 00 00 10 6C C6 00 53 DC FF FB 00 07 E3 FF 85 32 5B BD D9 F4 1D 50 72 AA F1 FF 26 00 CD B0 E6 5A 1F 1E 52 40 8E FF 6C 75 FF 6E 83 6E 18 13 B0 2B 6C 75 A3 00 6E 40 70 A0 00 FF 1F 06 00 74 E4 A8 74 A8 74 24 E6 B0 E6 2E DD E6 FE 40 75 B0 BA 03 F6 3F 07 8C 86 80 86 40 82 C0 86 92 4B 77 FF FF E9 E9 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF CF 1E D2 02 17 C4 74 BB 00 DB 01 06 01 01 43 E8 8D 0F 10 EC B4 CD 59 33 B4 CD B4 CD E8 8D 17 C2 D5 ED D6 72 32 FE 80 19 DF C8 1A 5A 02 10 88 00 1F CF FF 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF E9 9F 7F 7F 34 20 33 4F 50 51 05 00 20 31 32 2F 38 98
86 32 D1 8B 50 89 02 0E 00 4E C7 00 00 B0 EE EC E0 B0 EE EC 50 51 B8 00 C0 02 09 01 17 05 00 7C B1 B5 B0 E8 00 7E 07 5B C3 52 8A 8C 88 4C 8E BB 00 C7 00 26 47 FF FC 26 1F FC FC 83 00 C6 00 00 08 4C 2A EB 90 2E 00 06 16 00 C7 4C 2A FE 32 C1 06 5A C3 51 56 BB 00 05 BF 00 D2 F3 C2 B6 89 93 4F E2 FC 93 BF 00 0B F3 FC 93 BF 80 0B F3 5F 5A 5B 53 52 56 18 B7 B3 B8 1C C0 00 B4 CD 0A 5E 5A 5B 60 06 00 8E 8E FC C0 00 B9 00 AB 08 B8 1C 10 F7 05 00 D2 89 02 54 C6 05 C7 5F BE 00 00 BB 00 E3 21 80 00 44 88 04 44 92 04 00 30 8C B3 E8 00 18 B8 1C 92 61 BE 00 40 B3 E8 00 28 8C B3 E8 00 40 B8 B0 92 41 BE 00 00 B3 E8 00 50 B8 C0 92 2B C6 54 C0 06 00 BE 00 00 B3 E8 00 C8 D8 21 BF 00 07 41 E9 A5 1F C3 04 FF FC E0 C0 04 44 88 04 5C C7 06 00 50 8E 58 A8 74 F9 1F 96 4C 8A B0 E8 33 76 B0 E8 33 E0 97 36 A3 00 58 50 8E 2A 8A 80 10 C9 03 E4 B0 E8 33 C3 E8 44 E8 00 00 BB B6 11 E8 45 56 BE 5B 0D BA 00 B7 B9 00 EF C3 60 24 3C 74 E9 00 06 80 FE 73 FB 74 0A 74 B7 8A 24 3C 74 3C 74 B7 3A 72 BE B7 C7 8A 24 C0 02 03 4E 02 03 C7 3A 72 BE B7 C7 8A 24 C0 04 03 32 02 03 C7 3A 72 BE B7 C7 8A 24 C0 06 03 16 02 05 C7 74 3A 73 1E C8 D8 9C 1F 1E C8 D8 00 32 B9 80 02 E2 74 BA 50 5A B9 00 3D EB 1F 30 30 30 30 30 20 4B 42 20 4F 4B 8A 49 88 01 1E 03 5D 8A 07 03 A3 52 56 B4 E8 00 4E E3 8B 0C 46 8E FC 8B 06 7E 01 13 07 0F 08 0B 0A 07 0D 03 AC 51 50 40 8E 58 1D 1F E2 5A 8A 07 46 01 05 02 4F 1F 26 00 66 C3 07 3B 08 37 0A 33 0D 2F 01 B4 E8 00 03 29 FE 3A 4A 75 32 FE 80 19 0B CE 0A 0E 0F 32 B4 E8 00 B4 E8 00 F8 53 BB 00 C3 42 8C 26 07 5B 74 CD C3 0E 6D C3 1F B0 E6 BA 03 00 B0 E6 BB 00 28 B0 EE A2 84 64 E8 42 9F BF 00 67 72 B0 BA 03 B0 E6 33 E8 09 43 F4 E8 41 4B 72 B9 00 FA 72 E1 74 E8 0D A8 75 EC 33 F5 00 15 70 11 DC 72 E8 0D BE 84 03 EB B0 E6 EB B0 E6 BB B8 20 BA 00 B9 EB B0 E6 E4 24 E6 B0 E6 E6 C3 DF 07 08 50 1E D8 06 00 1F 06 00 00 06 00 33 B1 B5 33 06 0E 00 48 8E 26 05 00 C7 02 FF FC 8B FC FC FC C0 89 74 FE EB 83 40 CD 04 C9 CC EB 00 08 1E 00 0E 00 C3 FE 06 00 00 06 00 C6 92 01 80 E8 56 C5 00 C0 12 2E 00 16 00 0E 00 0E 00 00 B0 E6 C7 50 FF C7 52 00 C6 54 0F 06 00 C6 56 00 06 00 C7 48 FF C7 4A 00 C6 4C FF 06 00 C7 4E 00 06 B8 00 D8 48 8E 33 33 B9 40 66 A5 E0 8B BB FF 37 C7 50 FF C7 52 00 C6 54 C0 06 00 C6 56 00 06 00 8B 8D 1E 50 8E E4 50 08 61 00 C6 00 FF F0 88 01 E6 26 05 B0 E6 E4 8A B0 E6 E4 05 04 80 2B 3B 72 33 C1 06 89 02 89 04 FE C9 E1 26 4D 8B 8C 26 25 88 01 FF BE 80 E4 26 02 E2 F6 FE 26 24 06 00 1F C3 99 A3 00 C8 80 F6 20 0B 00 F6 10 03 00 B8 04 E3 CA 16 00 C1 C0 40 1F 00 F6 40 0B 00 F6 80 03 00 B8 04 E3 CA 16 00 8A B3 B9 00 C7 EF 24 3C 75 80 01 07 01 05 C3 E2 1E 50 8E A0 00 F0 C3 02 1F E4 62 0A 75 B3 32 B8 04 E3 00 F7 FE 88 91 C3 06 00 FF 06 00 00 06 00 C6 55 92 06 00 C6 57 80 53 50 8E E4 8A 0C E6 E6 8B 00 C6 00 FF 84 FC FC FC FC FC FC FC FC E0 61 C3 1F 00 00 00 00 FF 00 C0 00 FF 00 00 00 FF 00 0F 00 FF 00 00 00 FF 00 FF 00 FF 00 FF 00 FF 00 0E 00 FF 00 FD 00 47 30 0F 47 30 FF FF 00 00 AA 18 F8 18 28 18 2E 01 78 0F 00 01 0F 00 FF 8A B8 00 C0 2F 88 E6 FC FC FC FC FC FC FC FC B8 00 C0 20 66 FE FF 0F 00 DC 00 2E 01 84 FF 2E 01 78 0F 00 01 0F 00 FF 8E B8 00 C0 61 E0 08 61 C4 8A 26 06 00 E6 EB 2E 01 78 0F 00 01 0F 00 FF 92 B8 00 D8 C0 64 FF FA 64 02 05 F8 90 B9 FF 64 01 05 F8 82 E4 A8 75 66 06 C0 00 B8 00 A1 C4 00 25 80 00 0D 00 C7 00 00 00 EB EB 66 06 C0 00 56 00 C7 00 00 00 EB 66 06 C0 00 64 00 C7 00 00 00 EB 66 06 C0 00 30 00 C7 00 00 FF B0 E6 E4 86 B0 E6 86 0C E6 EB B0 E6 E4 86 B0 E6 86 24 E6 B8 00 D8 DC FB 51 56 BB 00 DB E2 00 F2 9C 00 E6 94 00 D2 77 84 74 FE 74 FE 74 58 67 42 00 00 24 78 50 FE F8 15 72 B9 F4 66 EC F8 13 F6 CB EF 00 00 24 78 0C EB 42 24 0C EB EB EE 1C 0F 42 08 00 BB 00 D0 0C EB EB EE 4A EB EB EC F8 48 F8 8A 1F 5A 5B 2E 26 65 00 A5 A7 6D 00 8A 8A 8A 8A 8A 8A 8A 55 EC 53 06 B0 E6 E4 A8 75 32 8C 8E 8E 06 5E 26 0F F9 74 80 F3 08 FF 02 01 EB D6 BE 89 3C 74 3A 75 43 F2 D7 8D 8B AC 00 16 C1 F7 46 80 04 F3 D1 2E 94 89 0A 07 5B 5D E9 11 07 5B 5D CF F2 FD 75 FF 02 FC 74 4F EB 47 C3 F2 F7 20 FD 75 FF 02 4E 80 00 08 4F 4E 4E 31 47 46 46 29 FE 75 80 00 04 4E 1B 46 17 FD 75 FF 02 FC 74 4F 4E EB 47 46 C3 F2 FC 74 4E EB 46 C3 F2 F7 15 FC 74 4F 4F 4E EB 47 47 46 EB 83 FF 11 FC 74 4E 4F EB 46 47 EB 80 01 03 46 80 00 04 4F 02 47 8B 80 00 04 4F 02 47 8B 80 01 03 4E 80 00 04 4F 02 47 8B 80 00 04 4E 02 46 FD 1E 00 56 3A 72 8A FE F6 01 0C CA F5 D1 DE DA 04 F5 D1 C6 C2 75 74 80 49 02 28 3E 00 77 50 8B 63 83 04 65 24 EE 58 0E 3E 00 72 80 49 07 7C EB EA E5 00 E5 F8 C5 E3 ED C1 E0 06 00 8C 8E 8B F6 F7 00 74 F7 F7 D1 03 96 C0 14 C6 10 F0 CA A5 F5 FD CE F4 F0 E7 20 CA AB FD CE F6 40 8E E8 01 19 3E 00 72 80 49 03 0B 16 00 C2 A0 00 C3 3E 00 74 D0 D0 BD 00 8B 8A 32 98 40 F7 03 03 4E 97 F0 BA 01 E2 C6 01 10 D8 DD C7 20 3E 00 74 47 C7 C2 DA 5A 8B 0A 74 3A 73 2A 50 E6 E6 C6 F0 FB CA A4 F0 FB F6 20 F7 20 CA A4 C5 DD CE E0 8A D0 D0 58 C4 FB CA AA FB F7 20 CA AA DD CE EA 1E 33 66 01 00 66 C5 00 33 9E D1 66 E2 E4 0C E6 24 E6 66 01 00 66 DD 8B 06 33 B9 40 66 D3 AC 46 32 E1 75 E4 A8 B0 75 B1 9E D3 46 FE 72 9E 1F D3 9F 4D 9F 33 C3 04 50 61 0C 61 F3 61 8B 1F C3 32 26 05 D7 C7 E8 46 C3 22 98 C3 E0 FC 0B 30 8A 49 88 01 26 3D C7 8A 49 88 01 33 8B 02 EA 03 00 D1 D1 D1 D1 03 D1 D1 03 B7 80 49 06 04 D1 E7 DF D3 D1 EA EA EA D1 E1 D2 03 C3 0D 04 72 B0 52 D2 C0 02 20 00 17 C4 74 F9 C3 8B 51 64 E8 5B 06 F9 F9 09 F8 AC 59 E9 C3 06 00 C3 EA 8E F0 56 B8 00 D8 03 E8 45 5E CF EB C3 FA D3 E1 C1 20 03 8E B9 00 BF 03 EA F3 A5 50 3B 58 75 A2 03 57 75 BF 00 87 AB C8 BF 00 B5 AB C8 B8 FF 8C AB C5 C4 12 A3 00 06 00 8E 53 01 BA 03 0F 21 0F C9 D9 1E 02 DB 8A 80 0A 74 BA 03 09 21 01 CD 80 00 0D 05 3C 75 B4 CD 04 24 3C 72 A2 03 0F 85 EB 33 89 A6 89 A8 41 06 03 02 D2 8E B4 CD 1F 85 B4 CD 1E DB 16 00 0E 00 52 51 85 B4 CD 3C 58 1A 2B 1E D3 C2 0F DA D2 1A 21 BA 03 27 21 10 21 3D 74 BA 03 09 21 08 CD 8E 8E BA 00 1A 21 00 0D 49 73 72 20 4F 50 51 4D 2D 4F 20 69 6B 74 65 0A 6E 65 20 72 76 20 70 63 66 65 20 0D 0D 52 69 73 72 20 69 6B 74 65 69 20 72 76 20 20 66 6E 63 73 61 79 0A 74 69 65 61 79 6B 79 77 65 20 65 64 0D 24 42 53 43 20 45 45 E8 44 01 15 0A 8A E8 45 C8 33 BA 03 A8 74 B4 81 16 00 26 00 E8 44 01 04 E4 60 CA 74 E8 01 07 74 8A 80 97 03 C4 80 13 11 37 B4 3C 74 B4 3C 74 B4 88 E8 44 1F 8A 05 C6 05 E8 5E 46 00 A6 58 46 B4 BA 03 A8 74 B4 88 41 81 16 00 33 E8 FF 07 C4 75 8B 32 8A 00 05 09 01 4E 01 EB 0A 74 B4 3C 74 B4 3C 74 B4 3C 74 B4 EB B0 E8 44 05 01 FF E8 01 27 32 8B C3 2C 8A E8 44 C4 75 E8 00 E8 01 07 47 FF 00 46 3C 77 E8 43 12 73 80 06 75 C0 04 0F 03 1E 65 E8 00 61 27 E8 B0 C6 01 C6 00 50 3A 58 70 47 E8 00 02 27 CA B0 C6 01 C6 00 50 1C 58 54 29 E8 00 87 27 AC B0 C6 01 C6 00 50 FE 58 4F 0B E8 00 61 27 8E B0 C6 01 C6 00 50 E0 58 34 4E 01 E8 00 67 88 E8 43 26 00 2C 1C C5 75 E8 42 7E 00 03 E8 24 3C 75 B4 80 03 0B 80 13 40 88 E8 43 47 00 46 32 FF 16 C3 C0 66 80 02 09 01 4E 01 EB B4 E8 00 07 10 01 10 02 13 07 03 02 02 33 8A 06 C3 00 50 FA 40 E0 40 40 C4 DA F6 40 58 BA 01 A0 E8 33 3D B0 E6 FB F4 EC FD FD FD 24 0A 74 EB 90 EC 8B 33 8E C4 78 B8 00 D8 06 00 E8 38 46 00 46 00 99 C6 06 E8 00 46 00 94 B0 E6 BA 03 0C 80 3F F0 C4 B0 8A E8 23 F8 E0 33 1F 33 8B 8B 0A 90 74 FE 0A 91 74 FE 0A 74 FE C0 06 CD 08 10 FA D8 A8 75 E8 41 E0 E8 80 0F DB 0F DC 97 75 93 91 74 EB B0 8A E8 22 04 C4 C5 E8 41 E0 CC B0 E8 22 C3 76 B0 E8 41 93 F0 E8 FE 07 C6 05 E8 5B 46 08 E8 B7 E8 42 7E E8 42 6B E8 36 04 F9 33 CC EC 10 0B 7E 00 26 4E EB B4 B0 80 05 75 E8 41 07 93 01 74 E8 FE 27 94 EB F9 46 C3 00 0A 01 04 93 02 07 E0 0D 4E 6E 53 73 65 20 69 6B 6F 20 69 6B 65 72 72 0A 65 6C 63 20 6E 20 74 69 65 61 79 6B 79 77 65 20 65 64 0D 24 0A 30 2D 69 6B 74 65 42 6F 20 65 6F 64 45 72 72 0A BB 00 E8 B0 E6 E4 3C 75 E2 4B 05 E8 EB FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 EC 50 1E B0 E6 8B 04 DB 5E 8B 80 F0 0A 12 84 46 E9 01 FB 05 0C 14 84 5B 58 E9 05 13 84 27 0E BF 13 80 8E 0F 00 25 00 80 0E 00 81 0F 00 66 C1 AB 33 A1 00 AB 1A 66 BE 00 08 AD AB FB 21 66 0F F8 AB 33 A1 00 AB 1C AD AB E8 AB E0 AB 04 AD AB FB 60 66 C0 44 66 66 04 25 FF 00 AB 33 8B 04 AB 5A 66 C0 44 66 66 04 25 FF 00 AB 33 8B 04 AB 4E 66 C0 44 66 66 04 25 FF 00 AB 33 8B 04 AB 54 66 C0 44 66 66 04 25 FF 00 AB 33 8B 04 AB B8 00 00 AB 33 8C C1 04 AB FF 66 66 00 92 66 66 C0 E0 E0 66 B8 FF AB 48 66 C0 44 66 66 04 25 FF 00 AB 33 8B 04 AB 42 66 C0 44 66 66 04 25 FF 00 AB 33 8B 04 AB 3C 66 C0 44 66 66 04 25 FF 00 AB 33 8B 04 AB 36 66 C0 44 66 66 04 25 FF 00 AB 33 8B 04 AB 89 66 FF A0 0F 1F 66 5D A9 A9 8B 8B 8C 9C 3C 77 32 8B D1 2E A4 97 80 87 EF DB 05 0E 00 F8 52 DB 12 16 00 C2 A0 00 08 65 EE 10 16 00 C2 A0 00 F7 65 EE F8 92 7E CA 00 C4 BA 09 08 6D AF 64 DC 0B FB 66 FF 22 22 22 2A 7C 58 59 5E 5D 07 FF FF FF FF FF FF C8 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF E9 03 FF FF FF FF FF FF BB E8 F5 30 3E 00 72 80 49 07 03 7F E8 2A 16 00 C2 8A EC 01 FB EC 01 FB C4 47 E2 C3 3E 00 72 80 49 07 51 81 AA E2 C3 F7 74 80 49 04 07 3E 00 72 8A E8 2A 16 00 C2 8B EC 01 FB EC 01 FB C3 FB EF 80 49 04 07 3E 00 75 8A E8 2A AB E8 2A 5E 8A 49 8C 8E BE FA C0 08 D2 DA 36 00 7F D1 D1 D1 03 80 06 63 EC 8B 57 8C 8E 51 8B 80 03 08 B1 D1 D1 D0 73 0A FE 75 8A 8A AB CD E6 5A 5F D0 D8 04 8B AD FB 03 33 AB C7 1F D0 79 26 05 81 B2 E2 81 3E 4A D8 C4 EB 8A 8B 8B B9 00 F3 D0 79 26 05 81 FF AC FC 03 32 AA EF 1F E4 EF 01 75 C3 00 FC 51 3D DF F8 00 8E 33 81 55 75 33 B9 80 02 02 E2 74 B8 00 D8 0E 00 BA 50 5A B9 00 51 EB B8 00 C0 8E B8 00 8B FF 00 58 40 8E C3 D8 DB 3F AA 62 F6 C9 6F D1 8B AC D8 FB 3E 04 EA B8 00 C0 8E B8 00 8B 55 ED FF 0B 74 1E 40 8E 80 12 FF 5D 8C 1F 8C 03 3B 76 3D DF 1B 15 06 BA 50 8C B9 00 CD 1F 61 80 8C 03 C3 06 00 E8 00 07 80 76 33 07 C3 06 00 50 12 5A 07 8B E8 00 3D C7 ED 1F FC D8 DB 3F AA 2D F6 C9 6F D1 8B AC D8 FB 09 04 EA D8 C2 60 1E 00 BB B8 14 E8 2C 07 BA 00 D8 C2 D2 8E B8 00 C0 B8 00 8B FF 00 1F 51 8B 46 2E 24 05 F7 EB 46 8A F9 C3 1B 32 B4 36 B8 B0 BD 89 77 72 79 69 70 5D FF 73 66 68 6B BB E0 5C 78 76 6E AC AF 2A 20 1B 40 24 5E 2A 29 2B 0F 00 7B 7D 0D 3A 22 7E 7C 3C 3E 3F 20 38 2D 35 2B 32 30 0D 47 49 4B 4D 4F 51 48 4A 4C 4E 50 52 53 06 07 0C 1A 1B 1C 2B 0A 47 48 49 4B 4D 4F 50 51 52 53 FF 50 01 85 10 84 E9 4D 24 83 04 86 42 83 05 E4 C4 42 C4 EE E2 FF B8 07 47 33 B9 20 AB 17 47 EE E5 FF FF FF FF FF FF FF FF 8A FF FF FF 50 B0 E6 B0 E6 B8 00 C0 20 A0 20 C0 F0 F6 97 20 0B 80 97 DF 58 02 FC 53 51 83 10 EC 80 97 20 76 9B 46 8B 81 0F C1 04 5E 81 00 0B 8E B9 00 8A 24 3C 74 E2 EB 90 25 07 66 00 09 08 D9 00 C4 1F 5E 5D 58 50 01 85 16 84 20 A0 CD CF 50 40 8E 58 C0 86 70 8B 6E 8B 6C FB E9 61 50 40 8E FA 0E 00 16 00 06 00 FB 1F 8D E8 00 00 48 8A B0 E8 18 C8 04 3A 8A E9 61 0A E8 18 80 03 EB C3 EF B0 8A E8 18 02 E1 1B B0 8A E8 18 0B 0A 0C 24 24 84 74 0C 8A B0 E8 17 31 E8 FF 07 EC 8A B0 E8 17 F0 09 DE 8A B0 E8 17 E8 0F E8 FF 06 E8 17 07 E2 C7 B0 8A E8 17 09 E1 B9 B0 E8 17 02 FB E0 0B A9 B0 8A E8 17 D7 FA 0B 94 A8 74 FB 33 F9 02 B0 E8 17 80 F7 01 E6 7D B0 8A E8 17 05 E5 6F E4 24 E6 B0 E8 17 20 E0 0B 5B E9 60 B0 E8 17 DF E0 0B 49 E9 60 E3 24 EC C7 0C 8A E2 FE 75 B4 C3 00 33 BF 0F 89 F9 F9 F9 39 F9 F9 F9 B0 9C E8 17 E8 00 02 CF C0 12 FA 2D F8 0E 03 EB 90 24 C3 C0 B0 9C E8 16 E8 00 02 CF C0 12 FA AD D0 0E 03 EB 90 24 C3 C0 FB B8 00 D8 A1 00 25 FF 00 50 33 70 71 20 58 06 0D 00 01 C3 86 74 80 49 02 09 3E 00 74 EB 33 8E BF 00 46 3C 74 3C 75 B8 F0 03 A4 26 05 39 FA 8C AB A0 00 26 00 16 00 0C E8 08 F4 E8 27 C2 A0 00 B4 E8 E4 03 CF B4 E8 E4 01 C5 C3 66 50 61 40 74 83 04 89 1E B8 00 D8 61 E0 08 61 16 00 06 00 86 E6 58 F9 87 80 06 75 E8 34 17 33 70 71 04 08 FC 37 04 33 9B 73 E8 34 3B 24 E8 35 01 50 29 E8 F2 3F DF E7 80 04 3E 33 80 C0 36 2E EB BE A0 04 CC 28 C8 24 C6 EB C7 02 00 46 00 C6 07 C7 0C 00 46 00 E8 34 3C 49 68 72 8C 0C 8B 03 56 33 E8 34 0A 21 72 2E 1C FF 5E 2E 6C 88 05 8A 01 4E C6 07 E8 34 0F 88 80 00 07 F7 81 87 E8 34 56 33 81 16 FF F7 01 27 20 0F 15 03 4F 21 12 3C 87 BE A0 56 E8 33 2F BD 72 3C 74 83 06 02 0A C6 3C 74 83 06 3B 01 15 C6 2E 54 74 EB 3C 74 2E 54 75 E8 F1 3F 75 87 E8 F2 F7 8A 03 00 88 8C 0C 8B 04 56 81 16 00 C0 14 4E 01 B4 32 EB 81 16 00 0C C0 D4 80 00 09 F7 E8 F1 87 87 C3 09 93 20 09 74 21 0F 15 21 09 97 21 09 97 21 12 17 21 FF FF FF FF FF 02 02 2A 50 0F 27 DF 25 09 FF F6 08 40 02 02 1B 54 0F 4F DF 25 09 FF F6 08 80 02 02 2A 50 0F 4F DF 25 12 FF F6 08 00 A3 00 A5 00 FF 00 00 00 5F 50 40 8E 3C 77 74 F6 A0 01 2A 0E 00 E8 00 E4 24 E6 FB 20 F8 15 06 00 75 F8 0B 23 80 A0 FE 01 58 00 5F 02 FA 0B 9C 0C 50 E0 0B 97 58 C3 B0 E8 13 BF 8A B0 E8 13 FB 89 98 8C 9A 89 9C 89 9E C3 83 00 07 74 B4 F9 32 BA 02 24 E9 00 01 EC 0F 0F 0A C0 DB C9 D2 78 83 0E EC 46 FA 6D 8B B0 EE 46 00 8B 0C 5E 8A EC 0F E0 11 DF 4F 2B 89 0C 5E 77 EB 8B E8 00 D9 C4 74 89 02 C4 74 89 04 C4 74 89 06 C4 74 89 08 46 75 FB 58 59 5D 5D E8 C1 04 E9 C1 04 C3 B0 E6 E4 8A E4 8A 58 FB 1E BB 00 DB 06 00 75 C6 A0 01 8E 8D A0 E8 FF FA A1 FE 00 00 A1 E8 FE 06 00 74 80 A0 7F EB F9 1F CA 00 5F 60 1E 40 8E 89 67 8C 69 B0 E6 E8 00 06 07 B4 CF 8D 20 C7 FF 8C C1 04 89 02 C8 E8 26 47 26 47 9A 5C 26 07 FF D0 E0 26 47 8C C1 0C 88 04 C6 05 06 8C 8E 8D 92 E8 00 D0 E7 5E 8D 08 89 02 88 04 C7 FF FA 80 70 0F 1F C1 26 47 E8 00 88 04 C7 FF 26 47 92 0F 17 01 0D 00 01 2E 2E A1 C0 00 B8 00 D0 10 8E B8 00 C0 33 33 B0 E6 51 E9 F3 59 C1 00 01 B0 E6 B8 00 D8 C0 D0 50 20 66 FE FF 0F 00 58 D8 00 2E 01 51 EB FA 4A 75 B0 E6 E8 48 10 DF 60 38 75 B0 E6 E8 48 B4 E4 A8 74 4E 50 36 74 8B 89 58 08 61 F7 61 01 C4 80 91 C0 E0 03 C3 8C 8B C1 04 C1 E8 59 B8 00 D8 16 00 26 00 2C B0 E6 1F 61 C4 80 C4 8B 0A 75 81 06 FF 4E 40 EB 81 06 FF 4E 01 5D E8 47 1B D1 64 AA 75 B0 E6 E8 47 09 FF 64 98 74 B0 E6 C3 5F 31 A0 8A B0 E8 10 FB 5F 2E 74 B4 F9 02 FB 8D 38 C7 FF 8C C1 04 89 02 C8 E8 26 47 26 47 9A FA 11 20 C7 21 04 21 01 21 FF 21 11 A0 C3 A1 02 A1 01 A1 FF A1 5C 26 01 8D 10 0F 1F 8B C7 04 00 0F E0 01 0F F0 FF 4D 33 0F D0 28 8E B8 00 D8 20 8E 32 F8 02 53 06 08 8E BB 00 7F 80 2F 7F C0 29 7F 00 23 20 C6 05 B8 00 C0 E0 26 1F F7 00 75 B8 00 03 FC 33 07 5B 8C 8E BB E6 C0 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 50 10 25 00 30 74 3C 72 8B 10 80 30 EB 32 2E 87 A8 02 07 49 A0 00 00 BA 03 07 06 00 BA 03 C3 16 00 93 01 C2 EE EA 33 A3 00 62 2E 87 A8 4A D1 2E 87 A8 4C D1 2E A7 A8 E4 A0 00 C0 C4 65 2E A7 A8 26 00 10 06 79 26 6C 26 4C A0 00 FE 02 15 80 09 75 8A E8 00 E8 C1 40 8A 07 0E 00 49 3C 74 3C B8 00 03 20 33 B9 20 AB 07 50 33 B9 00 AB 06 00 74 BB 01 C0 A0 00 C2 EE 51 1F B1 D2 B1 F6 80 07 02 C0 C3 FF 1E 00 33 8E C5 74 2E 9F A8 F3 BD A7 2B FB 8C 8E 1F 24 A2 00 50 F7 4C A3 00 91 E9 0C 27 5E E6 8C 00 08 A0 00 FF 09 E3 24 0A EB B1 D2 80 20 DF C3 66 83 05 C3 49 88 00 4A 88 01 62 88 07 28 50 28 50 00 00 00 00 00 00 00 00 2C 2D 2A 1E 30 30 30 3F 00 10 20 20 03 03 D0 D0 C3 D0 D0 54 A0 D0 A5 87 D0 D0 D0 A3 57 D0 65 4D 41 59 39 59 2E D2 C0 F2 6E 53 53 A4 C7 00 97 1F D0 D0 D0 28 D0 D0 D0 F8 F8 BC 78 78 14 14 01 01 1E 3E B0 E6 B8 00 C0 1E 00 33 33 BE 20 FF C5 00 F3 81 00 3B 72 52 40 8E 89 13 33 8E BF 00 50 8C BE A8 A5 E2 33 8E BF 01 08 B8 00 AB FC 31 84 C0 C0 86 BF 01 08 8C 2E AB FB 32 84 46 BF 00 20 8C 2E AB FB BF 00 C0 89 5F 33 84 40 8E BA 12 80 34 02 D0 16 00 34 84 90 1E 33 33 8A E8 0B D0 DA C4 F3 AF D4 8A B0 E8 0B F0 D3 12 8E C2 0C 8A B0 E8 0B 35 84 36 84 00 8C 8E B0 E6 BE A8 00 B9 00 AD 42 EC FF 07 C7 4A 92 E2 B0 E6 BE A8 08 B9 00 AD EC D0 8A EC C4 05 C7 92 E2 B0 E6 BE A8 78 B9 00 2E 85 75 B8 00 D8 1E 00 3B 84 59 80 87 14 8E 3A A8 75 B0 E8 0B 05 07 26 00 EB BB BA 8E 06 F4 74 80 87 FB 06 00 B0 E8 0B 30 E0 1E 52 84 3D 1F 74 80 00 03 35 B0 E6 E8 F0 B8 00 D8 DC 72 3C 75 80 87 FB FF FF 9E B0 E6 B8 00 D8 51 84 8E BE A8 74 B4 EB 90 94 B0 24 8A 50 B0 E6 E8 EF 58 10 90 74 E8 00 53 84 E3 C3 06 E8 F3 0C C0 C0 74 26 05 F0 26 00 80 10 30 00 07 10 26 00 80 10 20 00 03 10 AA 58 1F 54 84 F9 E9 01 40 E8 00 73 F6 24 50 55 84 E8 00 0D 56 84 93 E8 1C 73 C3 77 8B 83 0F C0 40 D3 01 10 FC 74 B0 B5 80 20 07 45 B0 B5 80 10 CF 2E 00 53 8E 06 C4 5B 74 F9 50 57 84 B4 CD 33 C3 80 30 03 13 80 10 30 2E 47 E8 F2 07 D9 C3 8E B8 0C 8A B0 E8 09 B0 E6 0E BB BA 59 84 47 E8 F2 03 6F B0 E6 B0 81 B8 75 B0 8B EE 5B 84 D2 FF 4F 8B 32 7B FE 32 AA F3 FF 4F 8B 32 7B FE 32 AE F3 05 F2 75 B0 E6 9C FB E9 EF C9 57 B4 E8 00 74 B0 E6 53 57 33 8A 0C 5F E8 1B B0 E6 83 0F FB BA 03 73 B0 E6 C3 C0 64 FF E4 A8 74 E2 EB B9 FF 64 01 10 F8 10 B9 00 59 E9 1B FE 60 E5 FF FF FF FF FF FF FF FF FF FF FF FF FF 31 00 89 60 A0 00 FE 02 2A DB DB 36 00 7C 0D 1C C1 18 16 D9 E3 60 C5 11 8A 8A E8 00 C8 CB 0A 3F C3 0F 0E E4 E8 E8 E8 00 80 07 48 FB FF E3 4E 89 50 A0 00 46 75 52 C0 C5 26 00 C8 4E D1 03 5A 0E C4 42 C5 00 00 4A C4 C4 00 00 42 C1 00 00 4A 8A EE 8A EB EB EE FE 8A EB EB EE 8A EB EB EE FF 1E 58 8E BB F3 F0 B8 00 FF 4F E9 49 61 0C 61 F3 61 F0 B8 00 FF 67 E9 3A 0B 57 33 5F 72 EB E4 A8 66 00 00 75 81 FC 74 BB F3 B6 C0 C3 26 05 88 E4 0C E6 24 E6 58 0B 75 E8 D9 E0 E4 33 B1 D0 73 46 F9 F6 C0 17 8B 66 33 8B B9 00 FF 07 C1 08 E2 8A 8B 1F C3 FF FF FF FF 72 98 A6 A7 2D 5E A3 A3 9C E2 A6 A7 49 71 A3 A3 3B 19 A3 A3 44 70 80 80 12 40 9C 8B 8B 02 46 5D 58 48 1E 6A 8B 80 15 0A 40 8E E8 04 2E 66 FE 81 1A 02 FC C0 D8 36 01 C2 74 C4 18 BB 00 DB D8 5E D1 2E 97 AD 07 61 88 15 26 00 00 40 46 24 3C 72 3C 77 E8 17 EE 73 B4 E8 05 A0 00 46 88 74 88 15 E8 05 53 E7 B0 26 44 C0 02 01 7E 0A 11 02 26 44 0A 75 B0 88 00 A2 00 0F 8E 8B B6 80 15 74 0A 75 FE 0A 14 66 74 3A 76 B4 EB E8 05 D2 72 E8 03 3D F8 04 73 80 11 0A C7 74 E8 05 27 53 E8 05 1F 04 80 15 75 E8 05 11 4E 75 F7 1A 00 08 28 EB E8 05 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A E9 03 D9 72 E8 03 30 F6 08 74 0C 80 15 75 0C 50 8A 07 C0 02 04 46 58 48 E8 04 7F 7E 0B 06 C4 02 C6 66 88 01 04 E6 04 09 34 C5 E8 03 DA F0 4B E8 03 7E 0B 05 FE 72 E8 04 14 C8 72 E8 04 0A 4E 75 E8 04 03 45 C3 53 72 E8 03 40 F6 08 74 0C A2 00 77 E8 04 0F 92 72 E8 04 05 10 EB E8 04 E8 04 35 2F 26 44 A2 00 06 00 E8 04 D5 72 E8 03 DA F0 7B E8 04 0F 54 72 E8 04 05 D2 EB E8 03 89 14 74 53 5E 80 9F FB 5B 0D 46 89 10 07 B7 EB 26 04 48 FF 76 B8 03 E0 E0 26 44 89 12 8A 02 CC 75 89 10 E8 03 50 5E 26 7C FE 80 A0 C3 74 80 10 8A 0E 8B 05 E8 06 07 42 AA C3 B0 AA C4 AA C7 C6 91 E8 03 AC 72 E8 01 0A E0 72 E8 03 05 07 37 C3 45 72 E8 03 03 29 C3 37 72 E8 02 06 00 E8 03 74 72 E8 01 0A A8 72 E8 02 03 01 C3 0F 73 80 01 03 97 1E C0 D8 36 01 E8 02 06 00 C6 46 00 26 00 E8 01 A0 F6 EE 81 E8 FF 7B 80 75 02 17 0E 00 E8 01 B0 F6 EE 63 E8 FF 5D 81 1A FF 46 00 8F 72 1E C0 D8 36 01 B3 E8 FF 2A 35 72 80 75 02 03 EB 1E C0 D8 36 01 B3 E8 FE 0A 0E 00 E8 00 05 05 59 C3 67 72 E8 01 06 00 E8 02 A4 72 E8 00 0A D8 72 E8 02 03 31 88 14 E8 02 23 49 C6 48 90 69 E8 02 13 84 72 E8 01 E4 46 3C 74 B4 E8 02 8A 75 FE 80 80 5E 73 89 14 46 89 10 19 46 00 26 44 26 64 26 1C F7 89 10 56 C3 46 00 01 66 88 74 81 1A 00 E8 00 21 46 24 C0 04 A0 F6 EE 14 72 A8 74 B4 EB A8 75 B4 E8 01 53 E8 00 FF 04 C4 17 06 B9 F4 80 0E A0 E8 00 F4 75 B4 F9 5B 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 1E 40 8E C6 8E FF 20 20 A0 C0 D8 00 9C 1E 00 58 BA 01 A2 00 0A 00 00 40 BA 01 A2 00 20 D7 10 BE B3 E0 03 EB 2E 5E E0 8D C3 8B 05 E8 A2 00 46 A2 00 46 24 A2 00 46 A2 00 46 C0 06 66 80 60 EC 0A A2 00 46 24 C0 04 A0 76 80 0F C6 47 26 44 BA 03 C3 10 F7 02 46 80 00 C1 0C E8 0B 58 0F C3 8E B9 01 F0 F3 1F 32 8A 00 86 E8 FE 10 31 72 1E DB 1F F0 EE E8 B9 01 F0 F3 C3 ED 4E E8 DD A2 72 E8 00 07 F0 EC E2 C3 B9 F4 8C 72 BA 01 A8 75 E8 DD F3 80 59 E8 FE E4 46 C3 66 C6 14 88 74 81 1A 00 C3 06 00 88 74 8A 75 0A 74 8A 10 9F 80 0E CC 04 81 06 FB F9 11 F6 B0 EE EE E8 FD 03 6B C3 51 42 BA 01 07 AC 42 FB 5E 53 1E C0 D8 B8 90 FF 54 1F 0A C0 06 00 1B 16 C0 14 B9 F4 06 00 0B 9C E2 4B EF 80 C6 8E 00 5B A8 74 B4 EB A8 74 E8 FE 06 04 03 11 C3 24 BA 01 C0 A8 75 E8 DC F6 80 C3 F6 B0 EE E6 E4 C3 70 C4 71 B0 E6 B8 00 D8 72 E6 3C 75 FF 8B B3 33 BD B5 26 B0 E6 E4 F6 24 8A B9 FF 61 10 C4 10 F6 8C B9 00 95 E9 12 D9 42 84 33 BA 00 B8 00 00 33 B9 40 C2 FF 66 D0 AB F9 C6 81 00 72 B0 E6 E4 0C E6 24 E6 B0 E6 BF 00 BB 00 00 33 66 C5 F4 DF F6 00 8A 9E D1 9F F4 AD 33 E1 75 B0 E6 E4 A8 B0 75 81 00 81 00 72 66 7B EB B0 E6 B8 00 D8 E4 FF 2D E9 D1 E3 33 B1 D0 73 46 F9 F6 C0 11 B9 00 F1 FF 07 C1 08 E2 8B B0 E6 8B 8C BF 00 65 E9 10 A6 B9 00 71 E9 11 FE 45 24 3C 75 8B 4C C2 80 4E 8A 4E F9 31 32 53 73 65 20 6F 72 20 61 6C 72 0D 20 30 2D 65 6F 79 45 72 72 32 33 4D 6D 72 20 64 72 73 20 72 6F 20 30 2D 65 6F 79 45 72 72 0A 32 37 49 76 6C 64 4D 6D 72 20 6F 66 67 72 74 6F 0A 20 61 65 4D 64 6C 00 4D 64 6C 20 00 4D 64 6C 20 00 4D 64 6C 20 00 0A 61 69 79 43 65 6B 31 00 61 69 79 43 65 6B 32 00 3F 3F 3F 31 31 52 4D 45 72 72 0A 34 32 4D 6E 63 72 6D 20 64 70 65 20 61 6C 72 0D 20 30 2D 69 70 61 20 64 70 65 20 61 6C 72 0D 20 30 2D 65 62 61 64 45 72 72 6F 20 65 74 46 78 75 65 49 73 61 6C 64 0A 33 31 4B 79 6F 72 20 72 6F 0D 20 30 2D 65 62 61 64 6F 20 79 74 6D 55 69 20 72 6F 0D 33 33 4B 79 6F 72 20 6F 74 6F 6C 72 45 72 72 0A 36 31 44 73 65 74 20 6F 74 6F 6C 72 45 72 72 0A 37 32 43 70 6F 65 73 72 44 74 63 69 6E 45 72 72 20 6C 61 65 43 65 6B 49 73 61 6C 74 6F 0D 20 30 2D 2F 20 4F 20 72 6F 0D 20 36 2D 79 74 6D 4F 74 6F 73 4E 74 53 74 28 75 20 65 75 29 0A 20 20 49 73 72 20 49 47 4F 54 43 64 73 65 74 20 6E 44 69 65 41 0D 20 36 2D 79 74 6D 4F 74 6F 73 45 72 72 0A 31 34 4D 6D 72 20 69 65 45 72 72 0A 31 33 54 6D 20 20 61 65 4E 74 53 74 0A 0A 28 45 55 45 3D 22 31 20 45 29 0A 0A 33 32 53 73 65 20 6E 74 53 63 72 74 20 6F 6B 69 20 6F 6B 64 0A 20 20 2D 55 6C 63 20 79 74 6D 55 69 20 65 75 69 79 4C 63 0D 31 39 2D 69 6B 30 45 72 72 0A 37 31 44 73 20 20 72 6F 0D 31 38 2D 69 6B 30 46 69 75 65 0A 37 31 44 73 20 20 61 6C 72 0D 31 38 2D 69 6B 43 6E 72 6C 65 20 61 6C 72 0D 20 30 2D 69 6B 74 65 44 69 65 54 70 20 72 6F 2D 52 6E 53 74 70 0D 20 20 20 6E 65 74 44 41 4E 53 49 20 69 6B 74 65 69 20 72 76 20 3A 0A 03 29 F0 B8 60 B7 00 B8 B4 D4 00 00 69 21 10 9B E9 D8 8E 70 C0 71 40 86 B0 E6 B0 E6 2E FE F6 2E FE 2E 06 FF 12 02 BD BA 1A 80 BF D3 E9 CC B8 F0 D8 FF 21 A1 E0 8B F7 00 75 BB FF 1F 07 C4 E8 0C 61 10 84 12 4B 42 4B 92 4B C0 8F 54 43 12 41 36 43 00 40 00 40 0C F2 EE 11 84 01 B8 EE 01 D8 EE BA EC DA EC C0 32 EE 77 BF BB 01 17 8B 04 57 B9 00 5F E9 E0 C2 81 D9 75 B0 EE FF B0 E6 BD BB 82 33 8A 02 0E 85 E9 F1 C3 81 95 72 B0 E6 B9 01 C0 FC 00 43 40 E0 40 00 75 BB B6 18 BD BB 43 EB B0 E6 B0 E6 EB EB EB E4 24 8A B0 E6 8A E6 B0 E6 B0 E6 B0 E6 EB EB EB E4 24 8A B0 E6 EB EB EB E4 24 F6 80 E0 07 CC B0 E6 B0 E6 B0 E6 8A E6 B0 E6 BD BC 34 E4 24 E6 B8 00 D0 00 B0 E6 E8 EC AD 64 FF E4 A8 74 E2 BB B8 1D BD BC AB EB B9 00 60 BB 13 DE 59 64 01 10 EE 10 B9 00 6F E9 0B FE 6C E8 ED 1A 84 F6 B0 E6 E8 C6 1C 84 C5 B0 E6 E8 0F 2D 84 6B B0 E6 E8 13 1F 84 9D B0 E6 E8 1A 73 E8 37 27 FB 21 84 AD B0 E6 E8 12 22 84 A3 BF 00 D7 E9 CB E3 80 40 0A BE 84 E9 E9 CB 24 84 60 D0 64 64 02 02 F8 64 01 FA 60 FD F3 E0 D1 64 64 02 FA C4 60 25 84 92 B0 E6 E8 06 27 84 EC BE EE 28 84 81 B0 E6 E8 25 2A 84 0F 10 00 10 61 E0 6C 61 E0 61 2B 84 0E E6 A8 74 BA 20 29 B9 00 D7 E4 24 E6 E4 24 E6 B8 00 D8 06 00 80 96 80 0E 00 FA 9C B0 E6 FB FF F6 96 20 07 F7 06 00 E4 81 72 34 74 B0 50 57 0A 58 02 80 86 67 B0 E6 E8 09 37 40 04 80 07 C6 B0 EB 24 3C 72 3C 77 EB E8 09 00 E8 35 B0 E6 58 00 02 4A 06 00 12 E8 09 2C 84 22 CD 8A 24 0E 57 5C B9 00 AE F8 03 35 80 2A 0A 06 00 74 E9 01 00 D3 0A 79 80 AA 05 FC 75 F6 96 02 03 08 F7 80 B8 28 06 00 74 80 96 F7 26 00 F6 18 02 42 44 26 00 F6 96 08 34 36 FC 75 F6 96 01 2A 06 00 74 80 96 FB 26 00 F6 18 01 0E 10 26 00 F6 96 04 04 1E 00 C3 FC 75 F6 96 02 0C 0E 00 80 96 FD 05 0E 00 80 17 08 C3 FC 75 F6 96 01 1D 06 00 74 80 96 04 26 00 EB 80 18 01 0E 00 F9 85 17 75 09 17 F6 17 04 3C FC 75 F6 17 08 36 06 00 74 F6 96 02 17 06 00 74 EB F6 96 02 0E 06 00 74 80 18 7F 04 3E 00 FC 74 F9 38 2A 52 45 F6 18 04 0E 0E 00 B8 85 96 CD 45 C3 26 00 B8 85 EE 7D E8 08 C3 F0 03 0E 98 B4 9C E8 28 FF 20 7D 50 33 58 00 14 01 10 09 0C 7D E8 06 7D E8 08 C3 FC 75 EB 80 54 02 93 FC 75 EB 80 45 03 4F 80 B8 03 97 80 37 03 AB 80 52 03 D3 80 46 03 D6 E8 02 27 26 00 72 FC 75 E9 00 FC 74 80 33 05 00 FC 80 34 05 01 F2 F8 F6 96 01 1A 06 00 74 F6 17 08 03 9E F6 96 10 DF 05 26 00 80 18 08 E8 2A FB 3E 00 74 80 49 03 09 B8 BF 01 10 F6 18 08 F9 C3 33 86 19 84 74 E8 13 EB E9 F5 E8 2A E9 29 06 00 74 F6 96 02 15 06 00 75 80 96 FD 0A 06 00 75 E9 FF E8 2A CD FB C3 06 00 74 F9 F8 F6 17 04 F7 06 00 74 B0 E9 00 06 00 74 F6 17 08 DD 06 00 74 F6 96 02 CF 26 00 80 71 80 47 FA F6 45 CD 33 EB B4 CD 33 F9 E9 FF E4 33 FC 7C 80 44 2B FC 74 80 58 1F 34 06 00 75 B0 F6 17 04 2C 30 06 00 75 B0 EB F8 B0 F6 17 08 14 23 06 00 75 B0 F6 17 03 02 C0 E0 C0 2E F9 0A 78 8A 3C 7C 3C 7E C6 19 00 C3 C4 47 81 2E F6 17 08 55 8E F6 17 04 42 06 00 75 F6 17 20 16 06 00 75 3C 7C 80 4C 04 F0 02 C0 06 00 74 80 96 FD E0 C8 32 EB F6 17 20 D5 E2 0C 8A 72 EB F6 96 02 2F 2E 89 2B 0A 38 75 B8 4E CE 2D 0A 2A 75 B8 4A C0 30 BF 26 00 0A 19 F9 80 96 FD B8 EB 8B 1A 3B 1C AD F6 17 08 05 06 00 C3 FA 80 A3 00 1C 0E 03 EB 90 C3 39 74 8A 49 80 04 05 EC 76 E8 00 16 00 C2 EC 01 FB EC 01 FB 8B 89 00 C3 26 00 FC 72 80 06 0A 7D 26 05 46 C3 95 8C 8E 8B 8C 8E 83 08 FC 04 02 04 FC 13 F0 54 B9 00 E2 01 D0 D1 E2 AA F6 20 CB DE C6 FE 75 8C 8E BE FA FC 69 73 33 8E C5 7C 50 8C 8C 3B 5B 75 83 00 09 FC 49 72 04 83 08 46 C3 F8 DF FF 4C F7 8B D1 8B 50 A0 00 E7 FF C3 E0 C2 C3 1E 00 D2 DA FB EF EF FB 06 00 75 D1 03 C3 C6 DF ED 80 56 F0 FB 04 A7 0B 08 4A F0 33 F9 5E C6 03 E8 B8 00 D8 B0 84 C0 75 A2 00 F2 B0 EE C0 3C 74 B0 E6 EB 80 8B 01 E4 72 E8 00 B8 84 06 9B 73 B0 E6 BB BA 1E BA 00 69 E8 01 2B B3 84 C0 C0 C4 04 B2 E8 00 3E 00 72 B0 E6 33 8E 26 3E 01 81 02 07 B7 B3 B9 7A 10 13 11 BA 01 5A 80 18 FC 74 EB A8 75 E8 CD E0 CB D9 CF D3 09 EB B4 CD 72 B4 CD 72 52 8B 2D 00 E8 CC E1 80 01 E4 C0 04 D4 0A 26 75 FE B8 04 13 1B FC 74 80 11 11 FC 74 8A 24 3C 74 FE EB B9 00 0C 13 04 92 F9 B0 E8 F0 40 0A B7 84 00 EB 90 92 8C 0A 74 8A 1E C0 C8 D8 C3 E8 74 3C 75 B0 E8 F0 C1 C8 10 E5 01 FA 04 8C 06 33 8A 24 74 3C 75 B0 E8 F0 C8 C1 E5 01 A3 01 0E 01 4C A3 01 4E A3 01 06 00 2E 0E 00 06 01 33 0E 01 1F 0E 00 B0 E6 BB B9 FA 74 BB B9 13 BA 00 FD C3 B6 84 EB 80 81 06 39 BB B9 15 BA 00 E1 C3 3A E8 00 F7 BB 00 24 EC 80 0C 1E E2 4B F0 80 0A F1 EC 01 03 20 C3 B0 E8 EF 08 E0 8E A9 FB E4 24 E6 E4 24 E6 C3 00 BA 03 B0 EE DE B0 EE FB 51 56 1E 8B BE 00 DE E2 00 F2 FC 73 8A 7C D1 8B 00 0B 74 84 75 E8 05 2B CC 05 3A EB FE 75 E8 05 19 CC 05 1F EB FE 75 E8 05 07 CC 03 F4 5D 5F 5A 5B FF FF FF E9 04 00 BB 00 02 5B 55 51 04 59 5D 8B 9C B0 E6 E4 8A E4 0E 03 EB 90 86 8B 9C B0 E6 E4 8A E4 0E 03 EB 90 86 53 D8 FB 09 72 E2 C3 CB 00 43 40 E0 40 C4 D8 00 43 40 E0 40 C4 D8 FB 09 04 DC E5 D8 E4 F2 E9 D9 E6 04 D3 B9 00 C1 EB 90 D4 E2 00 04 BE C6 17 B0 26 85 80 47 D3 02 BE C6 03 FF FC 00 8E 92 F7 2D 92 90 14 27 88 00 AA E2 FF 86 51 8B C1 08 02 E8 00 81 03 B9 00 0D B0 E8 00 B9 00 01 C3 92 F7 2D 92 90 14 27 51 E8 00 59 E2 C3 B8 00 D8 06 00 1F 51 C6 74 E8 00 EE EB F6 30 08 29 80 10 F3 5B 8A 53 5D 5B E2 C3 07 E8 00 43 F6 B0 E8 00 0A 43 C3 FA E8 00 00 E8 FE BB 00 37 BB 00 8E C3 20 E8 00 00 E8 FE 8A B1 D2 E8 00 C5 01 C3 0F 90 14 27 01 C3 07 B4 CD C3 B6 43 38 42 05 42 61 03 61 48 E4 24 E6 C3 FF B8 B0 C0 8A 43 88 00 AA E2 FF 06 FF B8 B0 C0 07 26 85 80 47 F4 C3 1E B0 E6 B8 00 D8 26 00 16 00 D1 84 A2 74 E9 00 D2 84 B1 F6 8A B0 E8 EC D2 40 F7 8A B3 E8 00 3F A1 00 80 33 BB 00 F3 F8 1E 00 80 E8 BC D3 84 28 8E 8E 8E 0F 00 25 FF 7F 22 EA C8 F0 0F 1E A1 D4 84 40 8E 8E 69 8B 67 E8 DB 13 33 BB 00 F3 00 75 EB 90 01 8A BA 10 FF 74 8E 66 C0 00 33 FC F3 FE 80 10 E6 1F C3 00 BB B6 1A E8 FE 50 51 1E B8 00 D8 06 00 00 FF 74 88 4C B8 00 C0 33 B9 40 FF 66 AB CF C3 E0 1F 59 58 E8 00 26 00 E4 05 4E 01 C3 46 8A 41 0A 74 81 16 00 FA 06 00 B0 8A 06 E0 0C 46 8A 3F C0 04 C4 F2 EE E0 8B C0 06 F7 EE EC A0 00 0F C4 30 26 00 F8 FD CD 72 B0 B1 26 5C 80 01 74 80 01 75 B1 3A 73 86 F6 8B E8 FC C3 BA 03 BC E8 C7 A8 75 E2 B0 EB E8 C7 42 40 C3 FC 45 2A 05 E0 F6 04 D8 46 2A 07 F6 04 C3 06 00 46 8A C3 F2 A0 00 0F 12 E8 04 02 03 26 00 04 E4 C4 08 E8 C7 26 00 0C EE 24 F6 3E 80 0A 60 E2 B4 F9 0D 26 00 E8 25 8F 32 C3 10 F7 0C 46 80 00 E6 E6 86 E6 86 8B 8A E6 8B E6 86 E6 86 FB 8A 07 E7 0A 06 40 8A 05 3A C3 FF FF FF FF FF FF B0 E6 E6 B0 E8 EA E0 0C 9A 22 A8 74 E8 00 20 03 02 58 50 4A C3 53 50 40 8E F6 A0 01 2B 2E 00 03 23 2E 00 73 58 B0 80 BF 5F 80 A0 FE 9A 8E 8B 98 26 0F 58 5B C3 25 00 83 03 80 83 03 04 EE 8B 2E EE C4 EE 42 24 EE 4A C0 4A C2 EC E0 EC 50 B0 E8 00 0D 10 C3 74 4A 20 BB 5A 84 75 52 C2 EC E0 C1 EE 02 C1 B0 E8 00 45 71 80 7F B7 B9 00 80 B0 E6 E4 86 E4 86 8B 58 84 75 84 75 50 00 43 40 C4 40 C4 2B 81 20 5F 72 E2 FE 75 80 80 C0 09 E0 EA EC E4 C3 C2 EE 42 20 3D 00 18 38 01 D0 D0 0A D0 D0 0A 32 86 BE CB F3 0A 8A 83 03 80 83 03 ED F1 E6 8B 2E EE E0 EE 42 C7 4A 32 EE E8 FF 3C 73 83 04 C0 06 88 0C 06 E3 8A EE EA E8 FE 17 00 80 C0 60 30 18 0C 06 03 02 00 55 02 08 20 80 00 90 84 0E BE CC 02 24 AC E0 8F E1 B0 E8 E8 E0 EA 92 84 00 BB B6 1A E8 FA FE 91 84 B0 E6 B0 E6 E6 E6 E6 B9 00 44 E2 E9 00 AC D9 00 B9 00 EE E2 BA 00 08 EE 42 E2 E6 E6 E6 E6 E6 E6 E6 8A E4 3A 75 EB E4 3A 75 EB E4 3A 75 EB E4 3A 75 EB E4 3A 75 EB E4 3A 75 EB E4 3A 75 EB B0 E6 BA 00 08 EC 42 C4 17 F7 C0 B9 00 EC 42 C4 07 F6 CB 70 BA 00 8C B9 00 0D EB B0 E6 E6 E6 B0 E6 E6 B0 E6 B0 E6 B0 E6 B0 E6 B0 E6 B0 E6 B0 E6 B0 E6 B0 E6 C3 FA 8A D0 A8 74 EB B0 E8 E7 F0 82 BE 8A B0 E8 E7 E8 8A E8 00 3B 65 C4 F0 C1 C5 3C 77 8A 8A E8 00 17 4D F8 C3 C9 CC B9 22 E1 58 B9 00 E1 23 F7 03 59 D1 C6 C8 C4 92 E4 E1 C8 C0 CB D0 D1 C2 13 D1 D1 D1 D1 D1 D1 B4 CD EB B0 E8 E7 04 E0 8E 3D 06 40 8E 33 8E 26 2E 00 C7 20 54 80 6B FE 21 FE 21 3C E8 F8 06 00 75 BA 00 8C B9 00 FF EB 26 2E 00 26 00 07 1E B8 00 D8 0E 00 B0 E6 58 CF E0 EC 24 D5 C3 40 8E 8B 10 DB 9B 3E 00 10 0A 75 80 02 60 C0 64 64 02 02 F8 64 01 FA 60 04 07 C3 75 EB F6 02 06 E3 EB 90 E3 53 00 BB B8 3D E8 F8 EB E4 24 E6 E4 24 E6 89 10 C3 8B 84 5C 72 3C 75 BA 00 A8 B9 00 5D E8 00 3C 74 E8 00 8F B0 E6 B0 E6 B9 03 E8 F7 E4 A8 75 E2 E9 00 60 FA 05 E8 80 B0 E6 B9 13 64 01 0A E8 F6 E2 EB 90 88 84 60 AA 03 46 B0 E6 B0 E6 B9 FF 64 02 05 F8 30 B9 00 64 01 09 E8 F6 E2 EB B0 E6 E4 50 AD 64 64 02 FA E8 F8 06 B0 E6 C3 40 8E 80 12 FF 00 BB B7 15 E8 F7 B8 00 D8 0E 00 BA 00 EC B9 00 87 C3 AE 64 FF E4 A8 74 E2 BA 00 10 B9 00 6B EB C3 80 84 AD 64 64 02 FA 64 01 04 60 F6 81 84 AA 64 10 E4 A8 75 51 25 59 F3 0A 82 84 60 55 12 83 84 00 BB B8 1F E8 F7 FE 84 84 60 64 64 02 FA 5D 60 B0 E6 E4 A8 75 B9 00 64 01 09 E8 F5 E2 EB B0 E6 E4 F8 01 C3 FA F6 EA E5 D6 AA A5 95 56 FE BF 00 83 E9 B7 E3 80 40 37 01 BD D0 50 06 C8 C0 65 B9 00 C3 AE 02 1A 00 BB B6 23 E8 F6 0E 8C 0C B4 86 E8 E4 5D C6 01 83 06 83 06 04 6E 02 6E 46 01 10 42 8A 4A 11 42 4A 06 00 05 7C 33 32 8A 49 2E 87 D1 DC 79 33 8A 4A 80 04 37 FB 74 B1 F6 8A D0 D0 88 03 66 D0 88 05 03 E0 E4 E0 46 80 49 06 06 66 D1 06 C2 EE F6 88 03 66 B1 8A D3 89 06 E0 46 EB 03 05 03 03 8A 62 3C 74 3C 74 3C 74 3C 74 B9 00 0A 59 B4 E8 B2 C2 16 00 1C D2 C6 FE 75 FE B4 E8 B2 08 37 53 FC 40 5B 02 2B 8A 49 88 01 B4 E8 B2 D2 EF CA E6 03 11 32 EB BB 01 07 C3 03 01 80 18 04 C6 C8 08 F3 8A 51 80 49 07 09 3E 00 76 B7 B8 06 C9 18 16 00 E8 B1 59 1C 2A 37 46 E4 03 05 C3 15 80 39 F7 DC FF 8A 1F F6 17 08 E8 06 00 75 24 F6 17 03 03 AF F6 17 40 63 99 80 0F 05 00 EB 80 35 11 06 00 74 80 96 FD 00 EB 0A 78 80 03 5E FC 74 80 1C 5C FC 75 F6 96 10 46 06 00 75 B8 96 35 26 00 EB 3C 7E 3C 7C 3C 7D 24 F6 96 02 19 8C 8E BF D2 07 8A F2 58 07 26 00 B4 E8 00 C3 72 C0 D5 7F D1 AA E8 C8 C9 EA 61 C3 7A BF 20 BB FC 74 80 35 0E 06 00 74 80 96 FD C3 FC 74 7F 2E 87 9B 95 C0 91 69 E8 C7 89 06 00 75 2C E9 FF 7F FC 75 F6 96 02 0A 26 00 B4 EB 90 FC 75 F6 96 02 0A 26 00 B4 EB 90 FC 75 B4 EB 90 8A 8C 8E B9 00 FC A7 F2 58 22 20 14 FC 7C 80 0E 0F 61 09 7A 05 C0 18 F9 80 76 F4 F0 F2 0E 1B 27 29 33 35 FA 36 00 04 46 36 00 04 36 00 36 00 11 36 00 E8 17 50 02 CD 58 FB BB 00 F5 58 B4 8A 00 4E 01 C3 E8 00 40 C3 90 02 10 40 C3 E8 FF 56 0A 75 C0 04 0F C0 07 04 03 EB F9 C3 6A 8A F6 10 B0 EB B0 E8 E1 8B 10 F6 01 12 E2 74 80 40 08 02 07 01 03 00 C3 FC 66 0A 74 C0 04 06 00 E7 8A 8A 06 E4 03 E0 F6 20 8F 8A C3 C0 8F 8A 06 E4 03 E8 25 00 50 52 C4 E8 BA 03 A0 00 D8 C0 E8 F6 01 02 01 E4 0A 88 8B 5A 58 E8 F5 FB D8 EC E8 F4 FB CE 8A EE 26 1C FB EC 86 E8 FF 50 BA B7 E8 FF 7E C0 02 7E E8 FF 8F 75 B9 00 42 E8 FF 05 E2 E8 00 26 00 C3 42 A8 74 A8 74 B4 EB 8A 43 F6 30 04 EC 14 C4 74 FE EB F6 80 02 04 02 00 BB 00 DB 90 80 93 03 C7 8A 24 C0 06 C0 51 C8 24 05 27 00 13 74 DF B8 04 01 D2 13 03 84 80 04 04 C0 7B 00 13 97 BF 80 28 09 B1 33 CD 73 80 04 04 C0 3D CB 7B ED EB B3 32 B4 CD B4 E8 00 01 B1 33 CD 73 B4 CD B4 E8 00 01 B1 33 CD 73 FE 74 FE EB BB 00 3F 74 B4 E8 00 3C EB 90 34 67 BA A1 4A B4 E8 00 90 80 74 06 15 EB 90 08 EB 90 01 43 BA A0 26 E8 FD 23 D5 24 C0 04 01 FB 74 FE BA A1 0A C8 22 74 BA A1 83 C3 BB 00 27 0A 27 38 80 8F 06 C3 91 75 E8 FD E8 3A 74 80 34 08 03 47 04 43 33 C4 0C 24 0A 8A B0 E8 DE A0 A8 75 8A 80 20 0E AB BA 20 1E B9 00 9B BD 00 DF B4 CD B4 CD B0 E6 EB B0 8A E8 DE FB C4 7D C3 8B 33 8E BF 00 8C AB C3 1E 0F 0F B0 E6 B8 1C D8 40 8E 26 16 00 89 67 C7 64 00 B0 E6 E8 A9 09 0E 00 00 61 E8 AF 62 84 06 00 00 06 00 00 FE 26 3E 00 12 0F 7C A3 00 7E A3 00 FE FC 57 06 DB C3 30 8E BE 83 93 B9 00 A5 1F 5E 63 84 80 73 B0 E6 EB 90 3E 00 00 16 0E 00 00 1E 00 1E 00 1E 00 1E 00 15 E8 AD C0 03 EE 8B 76 81 80 89 7A 8B 7C 81 80 89 80 A0 00 8F B4 C6 92 01 F9 8B 8A 81 80 89 86 0B 74 81 64 01 88 66 89 67 88 69 B0 E6 8B 78 89 7A 8B 7E 89 80 8B 86 81 80 A0 00 8F B4 C6 92 01 AB 8B 8A 89 88 0B 74 81 64 02 88 6E 89 6F 88 71 A1 00 00 BB 3F 1E 00 C3 39 2E 00 2E 00 C5 00 8D A3 00 06 00 8A 8C C6 92 01 D1 0B 74 81 64 02 88 6E 89 6F 88 71 06 40 8E BD 00 C5 1F 07 80 C6 92 01 FE 00 65 A9 00 12 0E 00 00 2E 00 16 00 0E 00 86 BB 04 E3 02 C2 21 E2 06 00 E8 03 02 74 81 64 04 88 6A 89 6B 88 6D A1 00 C0 28 00 F7 B0 8A C6 92 01 07 A9 00 12 0E 00 00 2E 00 16 00 0E 00 88 05 04 80 2B 8D 3B 73 A0 00 FE 06 00 E8 02 02 74 81 64 08 88 72 89 73 88 75 B0 E6 8B 86 26 1E 00 1E 00 B0 E3 F1 B0 8A E8 DB 00 06 00 00 02 01 A6 B0 E6 81 86 80 72 B0 E8 DB 80 E0 B3 C1 B4 F7 64 FF 74 B4 B0 E8 DB 68 84 60 20 64 88 E4 A8 74 E4 8A 80 04 60 64 E8 12 8A E6 E8 12 FE 64 EB B0 E6 BB 00 08 B0 E6 BB 00 40 8E 8E 69 8B 67 53 9A 5B DB 03 98 B0 E6 B8 1C D8 06 00 00 16 7E 32 8A 66 8B 8A 69 8B 67 E8 A8 06 00 00 16 60 32 8A 6A 8B 8A 6D 8B 6B E8 A8 06 00 00 16 42 32 8A 6E 8B 8A 71 8B 6F E8 A7 06 00 00 16 24 32 8A 72 8B 8A 75 8B 73 E8 A7 06 00 00 0F 06 BA 00 8C B9 00 B9 F7 64 FF 74 E8 EC 06 00 00 03 25 E4 A8 74 B0 E6 E8 F5 6C 84 A9 A1 1F C3 8A B0 E6 8A 8A B0 E6 8A 8B 80 39 7A 76 81 64 80 8B 7A 89 82 E8 00 1E 00 1E 00 04 1E 00 1E 00 30 74 81 64 80 89 82 E8 00 1E 00 1E 00 16 50 6F 84 89 82 E8 00 1E 00 1E 00 0B 74 F9 C3 57 B0 E6 88 4C 8A 32 8B BB 00 3E 00 75 B8 00 C0 C5 4D 83 82 00 0C 00 C7 84 00 E9 00 71 84 48 8E 53 57 A0 00 06 00 05 B4 EB E8 B0 5F 5B 0A 2E 00 01 EB 90 C3 FC 51 8A 4C B9 00 FF C0 DB 00 AB F6 1E 00 00 F6 02 03 01 AB 59 80 92 01 0C 40 8E 8B 03 E8 A4 1E 00 06 00 EB 90 06 00 E9 FF 1E 00 B0 E6 58 5F C3 57 50 72 84 A2 00 BB 00 C3 08 8A 33 33 D1 1D 00 75 E2 26 05 61 C0 06 C0 FF 37 26 05 61 C0 07 C0 01 EB 80 92 01 0F 40 8E 8B 05 00 E8 4F 58 28 4F 32 75 47 32 8A 26 05 8A 8A 4C B0 E6 58 C5 84 8B B8 00 11 C0 E0 03 7A 3D 00 F8 00 5B 07 E8 0F E8 E5 75 B8 90 CD FA 98 FB 74 3B 82 75 8B 80 89 1A FB E8 0E E8 E5 C3 17 C3 FC 74 3D E0 05 0D EB 3D E0 05 2F EB 80 84 0F F0 0B E0 02 00 FF EB 33 85 C3 FC 74 3C 75 B0 C3 8A 18 8A 24 80 04 E3 0A 8A 96 80 0C E0 17 5B 3C 75 80 03 56 FB 77 51 E4 75 80 97 EF EA B0 E6 B9 FF 06 00 75 E2 E8 0E F4 60 24 26 00 E8 0E C7 E0 0A E6 B9 FF 06 00 75 E2 E8 0E F4 60 26 00 59 FA 36 00 0C 46 36 00 04 36 00 36 00 09 36 00 C0 EB B0 F9 C3 3C 74 3C 74 84 75 E4 24 0C 24 2E 06 67 86 8A DE EB FE 75 E4 24 0C 24 2E 06 67 86 8A DD EB FE 75 E4 24 0C E6 B4 EB FE 75 E4 B4 A8 74 8A 80 3F 40 86 2D 86 7F C0 86 00 21 F9 72 83 32 26 32 2B 40 8A E4 24 0C 24 0A E6 EB B0 FA 4B FC 74 8A E6 FB C3 86 40 08 80 04 08 2D 40 21 00 3F 3A DE 74 B4 2E 06 67 15 E4 32 2B 41 B4 EB B4 A8 75 B4 8A 32 C3 A3 B4 74 B4 A8 74 B4 8A 32 C3 60 02 03 0A 83 38 EC D0 C0 D8 FD C0 38 F3 8B 8D 10 C7 FF 26 45 80 C6 06 26 45 92 C7 02 00 C6 04 8D 18 C7 FF 26 45 00 C6 06 26 45 92 D0 10 F7 03 80 00 38 80 00 89 02 88 04 DB D2 73 E9 00 7C 26 05 C0 40 07 46 00 81 BB 00 B4 72 8A 46 C0 5D 7C 8B 8D 18 6E 8B BF FF 8B 2E 05 0F 7C 26 35 06 C6 FF 04 C6 FC DB 6D 8D 38 8F FE 74 26 25 BB 00 59 72 C6 46 EB 26 0D BB 00 47 72 C6 46 EB 8D 38 8A 80 40 06 46 01 04 46 02 C4 61 E2 FC 35 75 FF 04 75 B9 00 A5 EE 83 08 44 8F 04 44 8F C3 7C 26 5D B9 00 87 15 8D 10 89 02 01 B4 CD C3 FF EB 41 54 4F 53 43 42 33 4C 39 52 53 33 4A 39 4E 42 43 43 70 72 67 74 43 4D 41 20 6F 70 74 72 43 72 6F 61 69 6E 31 38 2C 33 38 2C 35 38 2C 49 EA 8E F0 28 43 29 43 6F 70 79 72 69 67 68 74 20 43 4F 4D 50 41 51 20 43 6F 6D 70 75 74 65 72 20 43 6F 72 70 6F 72 61 74 69 6F 6E 20 31 39 38 32 2C 38 33 2C 38 34 2C 38 35 2C 38 36 2C 38 37 2D 41 6C 6C 20 72 69 67 68 74 73 20 72 65 73 65 72 76 65 64 2E 0D 84 12 4B 22 48 EE 00 1C B0 E6 B0 E6 B0 E6 B0 BA 00 B3 E8 00 92 4B B9 01 C3 4B 8A EC 22 75 E2 B0 E6 B0 E6 BB B6 18 BD E1 9D EB C3 FF FF FF FF FF FF FF E4 A8 75 58 B0 E6 B0 E6 FC 80 70 FF 21 A1 04 E4 32 8B BD E1 51 8B 8B 72 FE 8C 8E 8E B8 00 D0 00 BE B7 D0 84 74 BE B7 C6 EB 87 B9 00 EA 02 E8 00 D7 E2 00 04 E8 00 20 0E 10 D2 02 E8 00 8B B3 33 BD E1 A4 8B 33 8E 33 8B 89 E4 0C E6 8B B3 33 BD E2 86 8B E4 24 E6 E4 A8 74 F8 E5 40 8E 8B 13 C1 06 00 B9 40 DB F3 E4 A8 75 81 00 3B 76 33 FF 8B 8B 33 BD E2 8E 8B 80 0F D2 04 DB 05 E2 33 F9 E5 00 F7 6B 92 30 39 02 07 0E 10 EC AC C0 06 0E 10 F5 E8 10 27 1F C0 C0 40 A1 71 A1 71 BF 00 28 AB 2A AB 0C A1 71 A1 71 BB 00 03 CD C3 6B 00 B0 E8 D2 E0 14 70 A8 75 80 20 C4 C0 13 00 BB B8 56 E8 E4 0E 00 EB A8 74 BA 20 A0 B9 00 41 80 12 FF 06 00 75 BA 20 F6 B9 00 29 80 12 FF 10 11 00 BB B9 18 E8 E4 0E 00 E4 B0 E6 B9 FF 58 E4 A8 74 E2 EB B9 FF 48 E4 A8 75 E2 EB E4 A8 75 BA 20 5B B9 00 D7 80 12 FF ED C6 72 95 2D 33 0A 12 74 E8 00 06 00 C3 BA 00 43 B9 00 A9 95 05 03 4B C6 12 00 C3 E4 24 E6 06 C0 C0 8B 24 26 06 00 E3 53 67 5B 89 24 07 60 64 FF E8 AD 64 02 02 F5 45 60 50 60 20 20 CF 00 16 FC 75 C3 FF FF FF FF 01 00 80 00 00 00 01 00 02 00 80 00 00 00 02 00 02 00 80 00 00 00 02 00 04 00 00 00 00 00 03 00 03 00 00 00 00 00 03 00 02 00 80 00 00 00 02 00 01 00 00 09 00 00 01 00 03 00 80 00 00 00 03 00 03 00 FF 00 00 00 03 00 03 00 FF 00 00 00 03 00 03 00 80 00 00 00 03 00 03 00 80 00 00 00 03 00 02 00 00 00 00 00 02 00 03 00 80 00 00 00 03 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 02 00 03 00 80 00 00 00 03 00 03 00 80 00 00 00 03 00 02 00 FF 00 00 00 02 00 02 00 00 00 00 00 02 00 02 00 00 00 00 00 02 00 03 00 FF 00 00 00 03 00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 00 02 00 FF 07 00 00 02 00 03 00 FF 00 00 00 03 00 02 00 80 00 00 00 02 00 02 00 80 00 00 00 02 00 03 00 80 07 00 00 03 00 02 00 FF 07 00 00 02 00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 00 02 00 FF 07 00 00 02 00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 00 03 00 FF 00 00 00 03 00 03 00 FF 00 00 00 03 00 02 00 FF 07 00 00 02 00 02 00 FF 07 00 00 02 00 03 00 80 00 00 00 03 00 EB 90 00 01 70 00 00 C4 FB B0 E6 B0 E6 BA EF BB 8E B0 E6 B9 00 B4 CD BB 7C 01 B8 02 13 73 72 FF FF FF FF FF 84 E2 B0 E6 80 80 27 0E F8 A8 75 8C BB 00 DB 2E 00 DA ED 0D 08 09 BA 84 80 EB CD F6 80 1E E8 ED E4 3C 74 8B B9 00 FB AF 1E 5D E8 00 FE 33 E0 AA 24 86 E8 CD BF 01 AA C5 86 80 08 40 04 92 4B BC 84 00 00 83 06 BE 93 06 B4 CD CD FC AC 24 05 F9 EB C3 2D E0 2E 34 8B A9 0F 03 1B 80 C0 FC 74 E8 0B C6 DD 22 C6 DE 24 00 C3 F3 21 66 A7 0C 75 8B 8B 66 A7 07 EF 83 04 FF FF FF FB 1E 55 EC 40 8E 84 75 E8 F4 87 74 E9 00 CC 29 4E 40 81 0A FF 64 75 E9 00 69 75 E8 F4 EE 66 BF 81 0A 00 86 FE 75 E8 F4 7D CC 05 A2 EB FE 75 EB FE 75 E8 F4 65 FC 75 E8 F3 5B EB 80 0C 1E 4E 40 81 0A FF 08 74 E8 F4 66 BF 81 0A 00 35 FC 75 E8 F4 2B FC 75 E8 F4 21 FC 75 E8 F5 17 FC 75 E8 F5 0D FC 75 E8 F5 03 EC 5D 1F 1E B8 00 D8 0B E6 E4 84 74 8A E4 0A E6 E6 EB B0 E6 E4 84 74 8A A8 75 E4 0A E6 80 FF 04 20 20 26 00 1F 51 78 BA 03 4C EC 80 06 F6 EB 90 3E EC A8 59 FF E8 D6 12 A4 72 E8 D7 08 12 72 E8 E8 E8 02 AD 64 A8 C3 60 06 40 8E F6 96 80 1B 60 AB 0A 0E 00 80 96 7F 20 20 BD FF 2D F6 96 40 41 60 41 E8 26 00 80 96 10 0E 00 50 0E 70 A8 75 B0 E8 CB 40 05 26 00 58 20 20 E8 01 26 00 BD FF E5 BF 00 7C 8A E4 F9 4F 15 00 72 B0 E6 FB C9 8A 50 46 15 06 00 75 E8 D6 09 B0 E6 FB A2 B0 E6 FB FC 75 80 96 02 1B FC 75 80 96 01 0F FC 74 80 FA 09 0E 00 58 7E E8 00 06 00 74 EB FF FF FF FF FF FF FF FF FF FF 06 00 12 D1 80 54 05 FC 75 F6 17 08 36 FC 74 80 45 07 06 00 75 E8 D3 23 FC 74 84 78 EB F6 17 08 0E 06 00 74 80 18 F7 03 90 58 26 00 0F E8 00 ED 1F 75 FA 22 CF 80 96 FD 06 00 74 80 7F FC 74 80 1D 05 26 00 58 50 1E B0 E6 58 A0 00 30 74 80 4E 04 C0 07 FC 75 FE 78 A2 00 23 26 00 42 FC 74 80 36 07 06 00 75 80 1D 07 06 00 75 84 78 33 0A 16 74 50 61 24 E6 E8 00 02 61 08 4B EF E6 58 50 B0 E6 E4 8A E4 8A B0 E6 E4 8A E4 86 53 D8 FB 01 76 5B C3 A0 00 E8 24 8A 97 80 07 C4 0C 26 00 08 97 E8 00 C3 51 52 75 80 97 EF 58 B0 E6 B9 FF 06 00 75 E2 E8 00 F4 60 27 26 00 E8 00 17 C0 04 07 26 00 08 97 E6 B9 FF 06 00 75 E2 80 97 BF 58 50 A0 00 40 06 00 40 58 51 10 E4 A8 E0 59 FF FF FF C9 C9 EC EC EC ED EC EC 9F 91 8F 90 A0 55 06 56 51 50 EC C0 D8 36 00 40 8E C6 40 FF 66 FE 8A 01 66 80 02 1B 18 1B 08 06 15 13 0C D8 FF E3 FF 3F EB 3C 76 E8 E7 8A 02 1E 00 4E 00 5B 59 5E 07 5D E8 A2 0F 99 72 E8 00 05 4E 01 C3 06 0A C0 E4 0D 04 B2 D0 3A E0 75 E8 DC 80 01 75 8B 0C 10 F7 03 02 D2 80 0E 11 7E 02 32 03 83 00 FA 72 C6 01 80 41 00 0E 3E 00 74 E8 DC E4 28 C0 46 26 4C BA 00 E2 E2 8B E8 DD C3 11 46 A8 75 B4 81 16 00 7A E8 01 74 FF 5E D1 2E 87 EF 0B 02 00 0A FC 48 E8 DC 7E E8 E7 7E E8 E7 C6 E8 E7 46 7E 05 05 34 EB A0 00 1B C0 08 23 40 02 2A 12 8A 01 0C 83 05 C7 75 B9 00 42 E8 DB FB CC EC 05 E2 E8 E7 26 00 F7 0A C3 51 FC 10 33 8E F3 5E B9 00 00 8E F3 5E 1F A4 75 E8 A3 27 C4 75 80 87 03 EC 80 13 27 74 B0 E6 B9 FF 29 B0 32 F6 00 C3 04 09 2E 64 75 B0 E6 B7 E8 E6 7E C0 02 7E E8 E6 C6 E8 E6 C6 E8 E6 EE E8 FF 0E 4E 01 88 41 E8 FE E4 E8 DA 64 E8 DB 06 F9 80 18 14 B0 EE 7E E8 E6 F3 75 E8 00 C0 80 B0 8A 06 E0 06 00 1B 06 00 E0 C6 04 E8 FF 0B 70 70 7F B0 75 E8 DA C6 8A 8A 05 C4 74 D0 8A 04 E4 C1 5F 47 53 04 E8 D7 FA 0F D4 8A 07 E7 0A 06 C8 E8 A2 7F E8 E5 E8 00 33 DB 8A 09 46 3C 74 3C 75 53 43 5B 14 FC 75 B0 3A 73 86 0B 74 E8 D7 35 A8 B4 C3 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 1E 40 8E 80 3E 80 20 20 01 CD 1F CF 08 50 B9 00 03 42 E8 E5 F8 42 C3 B8 90 15 0B 06 00 74 32 EB BB 00 09 33 F6 3E 80 0D F0 E2 4B EC 51 B4 80 3E 7F E4 2A 2A 2A 2A 2A 2A 02 02 1B 54 0F E9 99 E6 C5 E6 03 E4 E8 E4 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FC 72 80 BF 33 14 8B BE 00 DE 16 00 E2 BE B8 FA 75 BE B0 16 00 C6 C4 F0 C4 E6 00 E6 FF C6 E9 A7 06 55 56 51 50 B4 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 38 2D 1F 19 02 06 00 00 71 5A 1F 19 02 06 00 00 38 2D 7F 64 02 06 00 00 61 52 19 19 02 0B 00 00 38 2D 1F 19 02 06 00 00 71 5A 19 19 02 0B 00 00 38 2D 7F 64 02 06 00 00 61 52 19 19 02 0B 00 00 00 00 00 00 00 00 55 06 53 52 57 E0 84 E8 01 00 B8 E0 D8 55 3B 00 75 32 8A 02 C1 09 00 E8 01 49 D9 EC 8B 8C 8E 8B 33 B9 00 AA F5 7C 26 45 0E C7 FF 26 45 9A 7C 26 45 FE C7 FF 26 45 92 87 CB E9 15 C4 B0 E6 B0 E6 B8 C0 D8 55 3B 00 75 E8 00 36 ED 0E 00 E1 B8 FF D8 26 C3 C1 20 C3 81 F0 B8 FF C3 C1 10 00 E8 00 08 E9 A2 E8 00 09 E8 00 E9 5F 5A 5B 07 5D 1E F5 B8 00 C0 C8 D8 40 26 05 24 83 02 8B A3 71 EB 81 00 26 1D 7C 26 05 28 83 02 8B A3 71 89 BF 01 8B A3 71 C7 26 05 2E 26 1D E3 84 32 8A 02 C1 09 E3 03 C3 FB 74 4B C3 0F E3 F0 EB B8 00 C3 00 8E BF FF 8B 26 05 E8 00 F6 00 8E 8B 32 8A 02 C1 08 A5 50 52 D2 02 E2 84 5A 58 1E 56 51 00 8E 32 26 0E 00 E1 83 16 F9 C9 D9 2E B9 00 A7 5F 07 C3 B3 66 55 9C 33 BD F2 9A 9D 5D 58 32 C3 B3 EB 53 FF DF 25 B4 74 24 B4 3C 74 B4 A8 75 B4 8A 32 C3 FA FE B0 E6 FB C3 E8 F8 AD 64 64 01 04 60 F6 E2 B0 E6 E8 F8 B9 27 64 01 FA 74 E4 50 E8 F8 AE 64 E8 00 02 CF FB FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 02 00 04 00 08 00 10 00 20 00 40 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 02 00 04 00 08 00 10 00 20 00 40 00 80 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FD FF FB FF F7 FF EF FF DF FF BF FF 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FD FF FB FF F7 FF EF FF DF FF BF FF 7F FF FF FF B0 E6 BE FF 8B 2E 04 0F 03 F0 B0 E6 2E 01 7E 0F 00 01 0F 00 AC 28 B8 00 D8 61 E0 08 61 00 86 E6 80 C0 FC 74 E9 01 0E 00 B8 00 C0 00 33 66 26 FC 00 33 66 AA AA 66 AB 8B B8 00 D8 F6 00 66 66 C3 03 95 49 02 F1 00 33 66 B6 B6 66 AB 8B B8 00 D8 F6 00 66 66 C3 6E 74 EB B9 20 FF B8 55 55 F3 66 D8 38 8E 33 B9 20 AD 3B 75 49 02 F4 30 8E BB F3 04 BA 00 FF 6D E9 01 7C BD F5 17 33 BA 00 81 E9 F2 16 7C BD F5 7F 72 81 FC 74 BB F3 C6 01 80 9B B8 00 C0 80 02 BF 40 8E B8 00 78 BA 00 FF C1 E9 00 7C BD F5 C3 B8 00 C1 C0 80 02 40 C1 04 BA 00 FF E7 E9 F2 B0 7C BD F5 19 72 B8 00 FC BA 00 FF 05 E9 00 7C BD F6 7F B8 00 C1 C0 80 02 BF C1 04 BA 00 FF 2B E9 F1 0B 7C BD F6 D5 73 E9 FF 08 8E 80 02 BF 06 00 E4 3C 75 80 02 40 10 8E 8E 0F 00 25 FF 7F 22 EA F6 F0 0F 1E 07 80 00 0B D2 13 BB B6 C1 B0 E6 32 E6 C3 F3 21 66 A5 75 8B 8B 66 A5 E5 66 ED B8 00 00 33 B9 40 FF 66 D0 AB F9 61 0C 61 F3 61 BB 00 00 33 66 C5 1F F6 F4 00 8A 9E D1 9F F4 AD 33 E1 75 E4 A8 66 00 00 75 66 7A 1F C0 C6 00 E4 0C E6 24 E6 58 0B 75 E8 8F E0 E4 33 B1 D0 73 46 F9 F6 C0 11 EE B9 00 FF 07 C1 08 E2 8A 8B 1F C3 1E A8 A0 75 84 40 8E 89 67 8C 69 B9 00 76 84 E8 89 74 80 01 90 B0 E6 51 DB 0B 74 80 02 01 8A E6 B4 0A 74 B4 B0 E6 50 60 20 64 92 E4 A8 74 E4 8A 80 04 E8 F4 B0 E6 50 78 58 C4 60 B0 E8 BD 6A B0 E6 F4 FD 79 84 EB 90 7A 84 B8 00 D8 16 00 26 00 03 29 E4 8A F6 02 0D 00 BB B6 1A E8 CF F6 01 0D 00 BB B6 1A E8 CF B0 E6 0F 0F 1F C3 00 CF F8 00 86 00 FF FF FF FF FF FF FF FF FF FF FF FF 1E 40 8E A1 00 CF 32 CF 2A 2A 2A 2A FC 76 80 C0 17 FC 73 57 F8 E7 7F EF 2E 95 F8 07 57 00 EB 5F 02 C2 C4 C6 59 D9 C8 8E D3 9D AC BE BE BE BE BE BE CA CC 88 80 4F 04 CA 00 B4 F9 02 FB E4 5F EB EB EB EB EB EB 5F 32 CF 00 11 08 04 01 FF 11 70 02 01 FF BA BA D9 D9 FA FA F7 F7 F7 00 FA 00 E0 00 C8 00 84 00 85 02 FA F0 0F F0 40 8E E4 A8 75 8E B0 E6 B0 E6 B9 FF 64 01 05 F8 3D B0 E6 E4 B0 E6 B0 E6 B8 E0 D8 DB 3F 55 08 76 2E 2E F8 05 84 00 8E 33 81 AA 75 BD F9 FF 01 B0 E6 B8 00 D8 00 EB B0 E6 B0 E6 EB EB E4 8B B0 E6 EB EB B0 E6 80 09 03 94 B0 E6 80 0A 03 57 32 E6 B8 F0 D8 D2 D1 B9 00 8A AC E2 BA 00 08 B0 EE 0A 74 B0 EE F3 FA 74 BA 00 E6 00 20 A0 09 84 FB 76 B3 32 D0 2E B7 F8 40 8E FF B0 E6 B8 00 D8 2E 00 0B 84 20 20 E9 0C 84 61 F3 61 0E 70 19 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 7E A5 BD 81 7E DB C3 FF 6C FE 7C 10 10 7C 7C 10 38 38 FE 38 10 38 FE 38 00 18 3C 00 FF E7 C3 FF 00 66 42 3C FF 99 BD C3 0F 0F CC CC 3C 66 3C 7E 3F 3F 30 F0 7F 7F 63 E6 99 3C E7 5A 80 F8 F8 80 02 3E 3E 02 18 7E 18 3C 66 66 66 66 7F DB 1B 1B 3E 38 6C CC 00 00 7E 7E 18 7E 7E 18 18 7E 18 18 18 18 7E 18 00 0C 0C 00 00 60 60 00 00 C0 C0 00 00 66 66 00 00 3C FF 00 00 FF 3C 00 00 00 00 00 30 78 30 30 6C 6C 00 00 6C FE FE 6C 30 C0 0C 30 00 CC 30 C6 38 38 DC 76 60 C0 00 00 18 60 60 18 60 18 18 60 00 3C 3C 00 00 30 30 00 00 00 00 30 00 00 00 00 00 00 00 30 06 18 60 80 7C CE F6 7C 30 30 30 FC 78 0C 60 FC 78 0C 0C 78 1C 6C FE 1E FC F8 0C 78 38 C0 CC 78 FC 0C 30 30 78 CC CC 78 78 CC 0C 70 00 30 00 30 00 30 00 30 18 60 60 18 00 FC 00 00 60 18 18 60 78 0C 30 30 7C DE DE 78 30 CC FC CC FC 66 66 FC 3C C0 C0 3C F8 66 66 F8 FE 68 68 FE FE 68 68 F0 3C C0 CE 3E CC CC CC CC 78 30 30 78 1E 0C CC 78 E6 6C 6C E6 F0 60 62 FE C6 FE D6 C6 C6 F6 CE C6 38 C6 C6 38 FC 66 60 F0 78 CC DC 1C FC 66 6C E6 78 E0 1C 78 FC 30 30 78 CC CC CC FC CC CC CC 30 C6 C6 FE C6 C6 6C 38 C6 CC CC 30 78 FE 8C 32 FE 78 60 60 78 C0 30 0C 02 78 18 18 78 10 6C 00 00 00 00 00 00 30 18 00 00 00 78 7C 76 E0 60 66 DC 00 78 C0 78 1C 0C CC 76 00 78 FC 78 38 60 60 F0 00 76 CC 0C E0 6C 66 E6 30 70 30 78 0C 0C 0C CC E0 66 78 E6 70 30 30 78 00 CC FE C6 00 F8 CC CC 00 78 CC 78 00 DC 66 60 00 76 CC 0C 00 DC 66 F0 00 7C 78 F8 10 7C 30 18 00 CC CC 76 00 CC CC 30 00 C6 FE 6C 00 C6 38 C6 00 CC CC 0C 00 FC 30 FC 1C 30 30 1C 18 18 18 18 E0 30 30 E0 76 00 00 00 00 38 C6 FE FB 8A 32 81 07 77 D1 2E A7 FE E4 CF 9C 9C 9C 9D 9D 9D 9D 9D 80 3F F0 1C 20 20 58 CF 50 B8 00 D8 06 00 04 06 00 3E 00 75 B8 00 06 00 0A 6C A3 00 A2 00 40 3C 75 F6 3F 07 18 86 80 12 40 0E 3F 86 92 4B A0 67 4A 0E 00 9E 0C F2 EE 06 00 74 E4 A8 75 A8 75 0C E6 B0 E6 E9 FF FF FF DA FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 60 33 B4 CD F6 80 52 40 8E B0 86 00 3C 74 FB FB B4 CD 8A 51 03 10 52 D2 02 10 08 10 EA 72 FE 3A 72 E8 8D 0C D2 C6 FE 72 E8 8D C9 B4 CD FA 0E 01 61 FF 00 00 00 03 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 37 B6 BE 47 4A 30 43 4D 41 EA F9 F0 30 2F 38 38 FC
{"data":[
-13436026,-1752439855,1451819088,1611565826,72255744,18119,246465280,-1964227858,263211744,-1007926546,105993040,-1912584008,-1258114624,-402542583,-2147155945,8168192,
-38465359,149422512,8299264,1482381575,1431458755,-980627318,4984456,12305806,130491904,-953810944,-64953,-1960379140,-50529249,-75236100,113649152,1946157056,
5021704,350994730,1278097552,422912,-352302058,5021895,-1057046230,-524164046,1532648710,1381061571,180049750,375040,855640255,-2131494958,129380546,9672073,
-270381233,9682684,-1191182145,-1510801397,9682684,-1182793537,-1510801397,1499094623,1364443995,-396994734,146210840,12087475,-1094676964,-1984692224,-469101107,1499094878,
509657947,469809158,-1064380274,-1077922820,79233024,-1096027392,12058632,1096476,386039,13795328,-2013117303,1153827924,80187909,280887391,-268388352,-150990661,
-132053533,-1996434816,1418199620,88393220,117753746,3194368,-1699493748,-1107268376,12058648,-393039076,549322849,4241408,1458082483,2670080,-1833709428,-1107276568,
12058688,-393038928,1220411457,536918016,921211571,5291520,-1279262536,2877586,5506758,1460061888,1488879616,-268388352,384340659,-1899459584,-132006184,-1191138881,
-784269305,128316393,-943496929,-1962934524,81838588,-1996165184,2089288260,89950212,410823,-1336884480,861464718,57983144,-1340085255,860678294,-1783570294,-1556920856,
-1733296010,-1976353304,-392711968,2023961398,-1017579520,-393301936,-527813846,168873088,-2147256887,-1901006876,1479745256,-739748157,585653060,47616,-1179212101,82313233,
-396967099,-396671810,12189709,-1229473024,-402646599,-1581038353,-1071382432,57950268,-1107262231,-75450618,-2139917058,1853161467,1786043146,-997584713,54264612,37513588,
1085735540,1450368826,-2135485506,-997584697,-390067164,1946369026,1946303566,818380803,980606778,-2135482946,-997584697,-390057948,1946369028,1946303538,818380803,510844730,
-2135480386,-997584697,-390021084,1946369030,1946303510,818380805,-549845900,-1944188557,-388460856,-1021354084,-1899459554,-2147434792,12182578,-536695680,242547682,-1152384838,
263829338,1144907776,-1021313301,120588080,120588080,119539504,121767755,122619680,646580043,1720189001,1008648961,106788611,-1274577270,10741763,39226194,-1696070988,
72256256,1988835043,273058572,-1392715634,-2147066229,1979777150,1946631187,1946696719,1946827787,1947024391,-1817406717,-1202708911,-661782464,1960024,-740140769,2122975066,
4650503,-1274710783,5236738,1227262495,23496704,1946631363,1946696763,1946827831,1947024435,112943,786958772,-402410496,-1023541207,4855354,-768469899,-25114882,
-32803559,-1274367794,1042446,45404722,-1023407896,48762548,1358490368,12256851,-1144812032,-930348990,117913894,57956443,-1664937779,1819142158,-65073469,-2065260368,
-1341918534,-1582240256,1690010854,1109977088,-1326576464,-1148918110,468189284,-2069905854,-402651969,1416759655,-222683984,-1548685821,-315390746,1913214696,32815939,-398329368,
946997579,-402627399,812803322,745863649,-334673944,58048680,-2127303700,1946157557,1970289685,1692198929,770183794,-1564546035,245636,-1515143445,82543846,-2065259344,
-1179111493,12189728,1119479808,-1498413845,568624358,568770340,-756678480,63165670,459487,5289992,-958886370,-16777210,-1928935649,-973078528,-100627450,-5121229,
-13373259,1276020742,4765696,-953761650,637534213,-16628281,654114047,-50592373,201129212,92874432,-1040317324,-1014821909,1959606848,-339083772,-2132049460,-1995934208,
-2013229794,117476366,-939608893,-2147450362,-1895381504,113704704,-1124007790,317194368,-2134539946,1958742784,1714325522,1729530112,1762560000,1678672128,-1023393536,-2065268816,
5244615,113770495,82,5506758,1426507279,113676800,-973078442,22278,4720327,113770495,74,4982470,1292289791,113742336,78,1354243590,
-1193767424,-1064435640,-13371853,-62914375,-1146752154,1066139616,-1946164549,113712951,-65456,5375687,113639424,-960495532,-1845471994,5637830,1460061696,512458752,
-1205993331,-661782448,206594532,-1604196856,113639424,620691456,1166550768,1642485761,268813862,1894166960,-527797788,1894166704,356836,1065400580,-1053045973,-617414030,
637985729,637689225,-1258005111,-1043778818,-1993997087,-24443315,-2010716020,1166550565,2147465473,847249598,-1406731036,-85794814,-989932298,-970684378,-67108858,-389871841,
1621295257,-1144485120,-1040842112,-1156877280,-1040842240,-1157401584,12058880,-18614524,-1877571382,616663552,1950366912,67156767,1967178230,134265611,1971372534,671136515,
-150732616,-1999962397,-1023373034,11795850,-1979710279,49266887,37487396,-1015020171,1007151873,-2147126015,-404618045,5290014,44095630,183510016,172739,-1545326049,
-620101534,28508789,12123954,-1142687996,-470350848,378063614,-943521647,-16756730,1376176127,-973078528,-1073720314,5572294,1443284626,113639424,511705175,5290067,
1642387598,135061642,-2065276442,7819,1734,-58398977,-50529028,-50529028,-50529028,-2030240516,-1956518176,-1021355069,0,0,65535,-2147446080,
65535,37376,65535,39439,65535,-1073704448,65535,39679,65535,37631,65535,37390,65535,37629,120586311,4653071,
16713520,65535,-2018902016,-2013790184,-2010644456,254672920,125310465,218112015,571408385,788475392,146311050,-1329558016,495461935,-50559770,-50529028,-50529028,
-50529028,280558844,264277504,627441696,2147483646,-369090033,-268400676,503385902,-436271228,369168174,537855864,68864,771760655,-2020724993,-1912600392,-1973295936,
-435680032,650414689,-970580598,-16777210,-1293196826,369168174,537888632,68864,771760655,-2020462849,-1912594248,-423579432,-18076,-1469782790,-502959102,9497080,
-452984903,1963042916,-369565179,1625555074,2088044712,444262,192,1711336376,-339476319,2450944,1962934400,1711336205,-1073740089,369098752,15406827,444262,
192,1711336278,-1073740089,-1744830464,-949616405,12582918,-345767936,113731072,49152,15441920,444262,192,1711336240,-1073740089,67043328,1894167472,
-528059932,1894167472,537707654,317420006,1894167472,-528059932,1894167472,-551238522,280523238,-371683840,1409023708,508973649,-1912586053,65176027,-1963816192,-788498276,
143952870,1959922432,-461090697,-855766156,-855750284,-346530956,-347935129,-335484160,679016484,-1862354864,1477823992,616108402,140962036,2029528300,-17374701,-336628277,
-335484160,75036708,770375948,472181826,15401228,619577579,1108339484,-351752126,96202240,1020323840,15401996,1257111787,15417930,619446507,-1974979336,-410363656,
1499094559,1043255131,912614438,-1381651712,1869459367,864689408,-1853193334,-460663158,1368062602,1357679445,503730771,551947184,547889380,-315468427,-661731188,-1962522994,
-1977220002,-218529777,-109050508,1124627955,-1258139905,-1947473151,-2034303786,3976329,-1053161100,-1958480011,-1093145614,-561280627,1946172588,1975597590,138841079,721740928,
-422490381,-1785397458,520809353,1482381831,-1142335139,1510416145,1499289691,-2131588145,57999869,-2147332353,74711292,48975695,-1950136505,1979137010,33390624,1325336181,
38731522,1946221696,1313820424,-347189682,1179076401,-347716026,-97495,-58716811,1308914688,1176234830,-2145916090,57999869,-2147332353,108265724,1313754959,1195836651,
-1950136762,16548082,1313735796,1178993387,1005751235,-2146077193,141820156,1330597711,837504590,1195853639,703284806,1979711107,16547857,1313736308,434851663,1195853382,
-41937941,-16550655,-58719674,1325691904,1191373647,-225721529,1946221696,-347123964,-1018738942,-41880949,-16550655,-58719666,1325691904,1191373647,-225721529,1946221696,
-347189756,-1018804734,1243515645,39226112,74634042,-889269366,1946273014,717915916,-154064139,-337971490,720710148,-20513071,41281730,1048584564,1912733769,1228832808,
326566656,378229328,-1031602077,6660100,1525610276,-2146505896,67127614,1048577906,1963393097,736856956,-1736214,-1947873024,-154825992,65876707,65065409,-1761587706,
-561068404,-470355829,16828151,-654900108,-523117065,177653507,974419136,705721286,-204829968,66388901,1976499965,-1963947276,-1977569049,61600714,1976499965,4241654,
-454502258,-2145815551,33573182,1048580722,1996685385,1662421771,79856384,-301963872,1228832963,74712576,-489627184,1375752381,-980748149,-1164382926,-487128768,100909315,
-1953038258,1085970672,-136120575,1946222790,-136775920,-255360547,1228832800,24380928,-1933114553,-1764061502,-544517286,812957706,745784890,-800002006,-1947807514,-1947169850,
-204829957,-1947169884,16155131,16220448,-204830176,63243172,1976499933,-259368736,-422517040,-1950053800,-204829957,-2114221142,-1977614089,61535178,1976499933,1713292266,
-1201214157,1,-1178258586,-13418496,-791583074,-102585498,202138084,-215719450,-1150918170,1,1725772646,520537483,12187187,-781803968,1185718227,-1020115386,
594932705,-1062706716,460652720,1721633201,-2092510253,-630061826,1713353118,1721750483,530545229,-960249805,-464519164,-435418015,-420273055,-695510687,-389809889,-1977221070,
584578565,-1998007609,-389873594,580386850,-790572349,638286332,646579504,1720189001,572965633,-1429796291,4793994,-1023318392,1452015411,1944768770,536919811,-489561391,
-489561391,-489555453,-100408623,1048641207,1929773129,-791555836,-153122073,-774796333,-773139990,-2133723414,-942536735,-1329333757,321549,179312242,-2066599086,-1342016064,
-855591904,29685271,1526268276,-812953661,6601041,1952165352,1509548550,-402002951,-290716680,-118889895,-2029586749,-3996672,9318890,508973296,-1912586056,243928,
524677608,-1949345698,281248747,-1949069574,-1178497311,-888994784,1236914574,12581888,-1897218557,-1583010061,104530512,57999960,1023606946,175440215,-1207950145,-1934890617,
1824500680,-1917470720,-1412920149,-1409330248,-1901344628,113518277,-1868365806,-1845064704,-594609408,50446163,-1274837574,-350106353,-1899416817,1377733593,1977320706,1501620618,
779403274,-1274871110,-1205744375,567086081,1962950016,-16398835,108334396,567089588,1596211460,-596491972,604199330,59089423,-919358485,61214345,61345417,-1828272319,
855769091,-611442990,567089844,59095583,567093172,-1948545506,-1962929130,520094734,-1169077934,666108805,37495245,-1860537000,-1960916949,-524123693,869961231,-853887790,
-2051399903,-853036029,-854543327,4030497,985271412,-855002109,201898017,-980540979,-2135237234,-853888000,52001,1850280461,1953654131,1297040160,542196048,1143821133,
1679840079,1701540713,224752756,1953383690,1679848037,1702259058,1701868320,1768319331,606106213,168626701,1852400978,1953654131,1936286752,1953785195,1852383333,1769104416,
1092642166,543582496,1701012846,1918989171,1393167737,1802072692,1851859045,1701519481,1752637561,1914728037,2036621669,2361869,1230192962,538984771,4544581,-1471873304,
-401247231,663355914,-398129688,-1070384696,-335284294,192184488,1317078708,-2013265642,-1023393498,-1471883544,839152897,-396301340,1534394314,-167650840,259264519,-58710134,
-2147256937,-327154748,-401478893,-2018229193,141820732,71042996,1639187060,-1343740024,975169604,1342523018,33900230,-966873624,-402651834,-2007474522,112461126,-335284294,
41189544,646480052,1317077057,-1023409898,-1880555725,-167283457,1148551364,-466421621,1006651018,-1274449403,374243585,820707329,578076682,20747188,1957957748,292815420,
54269364,-1749808268,28313579,-347858456,-402542587,937968639,-400062463,-947174350,19720387,669525898,281343556,31982453,468239104,-2012771839,1996423751,88508928,
897001276,1967353064,1131669522,425600,-390069387,1007625220,-400657661,-269993627,-2006862848,1139337255,1187382960,1187382273,-397410048,1951947834,961013872,-1275014680,
-400062462,112214986,67192518,16795334,1545398352,-397118376,-1276626647,-2004372480,1135405095,1187382448,1187382273,-397410048,1951947774,957081679,-1275030040,-400062367,
112214926,67192518,16795334,1541466192,-2127268776,71246,-1979681304,663224935,-1975292440,-352304858,-400757972,393560773,-2143105816,1962935934,82362371,71044900,
129238389,-402396032,-998227189,4253715,1005070216,38258243,4624128,1996472370,851680534,107383488,1912798336,-2130594807,71246,11803115,167777768,-1273990137,
1964025857,605225986,1946364935,-1023233022,1586158387,-1866235642,-1672428800,-1975458566,-465509152,1019488832,-453609510,-1017602752,-1342048582,-152506720,-230823885,-2065258320,
66370299,-33686036,-50463235,-1073082588,1458242420,233603984,-1070338933,918870158,1085800568,-958886400,-16760826,-969403160,-973076922,-402651322,1187381401,-1830289146,
88524288,1553262592,-2065256528,-1341918534,645983756,-2081423297,-1280307772,602464394,-2030558173,-399265568,-1070390497,-930359157,9444874,-973208972,9518602,-973208972,
208989450,-440349186,30244870,1060360,1104734458,963985576,-1975410456,82362592,168813696,-2045807397,9955548,-393017227,494141585,-1280307477,-941039478,-2046555102,
583395524,-1975409176,550273248,-1192718672,-3933406,128976246,-1270755864,1106307219,-956371480,1187381255,-269996027,88524379,1541990408,199754935,108956226,-1186855448,
-85415829,-503024330,-399250439,-1460863284,-2146732784,1946158462,89062950,129291243,2122318256,91553797,-348034328,-1332497401,1098180609,-1996580376,1100277799,-1879506453,
1019413830,1007318016,-1341885183,-1341985901,-1008715257,1867385357,2035494254,1835365491,1936286752,1919885419,1936286752,1919230059,225603442,1885696522,1701011820,1684955424,
1920234272,543517545,544829025,544826731,1852139639,1634038304,168655204,906628388,1143812656,1701540713,543519860,1953460034,1667584544,543453807,1869771333,604638578,
-1191181637,-2135884312,1910796518,175505212,1951134946,-35079931,-436212501,-1,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1726778197,-65121456,-2048523856,-1912316277,39750619,-75489397,-1341491728,-8067566,
-1511456186,268140801,-1341361147,528803348,1566074459,-1341785623,-393943533,118381863,-1156341569,-611450752,1711284239,4389,101616512,-511613440,15,1723927398,
-1070373205,1711282337,1745323,650029926,571648,-492083539,-266268677,554675046,1722509048,379699251,-1096063488,1722613788,1726516395,1725992107,309675,-492083539,
6340347,-1950338202,-1419378108,1711573862,-219,1722508800,1150009395,-1096063484,862322778,38046656,-1956205722,-14326268,1711341567,-1070373205,1711555723,5160619,
-1950338202,-1419378108,1711573862,-219,1722508800,1150009395,-1096063484,862322772,38046656,-1956205722,-14326268,1711341567,-1070373205,1711555723,12084907,1711313408,
-1070373205,-524162932,-1196726780,-1419313153,47206,-1419378542,-1933560986,81838560,-4674714,-1096063233,862322760,38046656,-1956205722,-14326268,1711341567,-1070373205,
1711555723,4374187,-1950338202,-1419378108,1711573862,-219,1722508800,1150009395,-1096063484,862322748,38046656,-1956205722,-14326268,1711341567,-1070373205,1711555723,
3587755,-1950338202,-1419378108,1711573862,-219,1722508800,1150009395,-391420412,862346121,329302015,1528760079,-815966106,-1633050967,-1752459381,-1751345268,192349500,
-259267534,-13703471,-1013485404,8857216,1977289455,-2029092859,-1007153152,1960512082,1662421778,79856384,201352608,6660616,-1961825298,-2097126634,1704985794,-1560861696,
1525547109,-1500331016,-1396003714,-792428544,-1962301510,-1033008376,-1738237777,-1928615972,-781808389,-2094880769,-2094890206,-1753447638,1532582488,526212958,-12537,-1,
-1,63498751,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-739639297,-253,-1,-1,62646783,1962230504,1228832816,175244288,4800128,-352095225,-1360490369,1662421802,
113410816,-1460871030,-84183807,1946265836,-1429959941,-287114425,1228832963,124912640,4800128,-397314809,1202334337,-389808926,779416823,4800128,-2146995708,117459262,
-477481358,-1960155928,-2097126634,-661977406,1963043052,-1460864261,-1946455039,-486822973,1048626159,1912864841,1228832775,141887232,921232266,-1012141270,-1976937752,1049232990,
-896794551,1858001550,2042628858,-1898827000,2083964378,8332544,-523116335,-268181295,1946615680,283935587,106415243,-946940020,-125086895,-1258036352,145861640,-489561391,
41148624,-906046710,-963972491,-22289782,1541830093,-1939929254,-1176990000,-192217084,2046546093,87238147,-20479573,-70210273,858129273,-276714747,-454942798,20901761,
-2082966198,787157188,-779361398,79289995,-1393325312,58326224,-1442500058,536856449,2046611628,87172611,-1309703766,-2115706337,1241595887,-1195124619,-386086912,-2143485871,
-1191676193,-661725184,1065474867,964012629,12187187,-670913152,-102573054,1085806708,-2133291520,-16772594,-1152384838,263829338,760342528,1085805547,515935744,62445710,
-326414336,1476419327,4241496,-1899767666,-2116340776,1974097215,871773026,40864457,-779361839,-489160020,-1321306629,1391121156,-1912586056,-661774656,1342178232,861271179,
486487789,208989451,4241438,243325070,536805394,-661890979,-611558881,-1019487741,-2143478666,-350522657,503734293,-1152384838,347715724,751691776,-1168046305,-661913472,
516145667,-1073694714,1962944488,-947897081,-1070336394,516103943,-1073694714,1239120,1342665818,1273545355,-2143463424,133002951,-1896037601,-2116340776,1974097215,871772973,
40864457,-779361839,-489160020,-1324780037,-1930767612,-1010695208,-1172437408,-1933881344,1358264,523001576,-2135269113,64523264,-1009634366,1085855886,515935744,1342178232,
1593830539,-1021356032,210447953,976111174,-502959068,99350775,76164678,-3974663,-1288523493,-1221151308,766556600,1904806077,1953654135,1869182329,224222064,1685283327,
1785227110,-1480889237,2052915168,1651925880,-1364431506,-13959249,555482912,623125312,673850974,137060137,436210447,477961083,674899725,729688354,876360572,960443710,
959985440,909456429,858927403,863792,-2075560121,1951232843,1985049935,-1907716792,-1873899700,-1840082608,430931,520887815,488315674,472582684,-1756954614,-1723230136,
-1655858357,-1605329073,-1571643055,-23725,-436096944,-435113851,602495108,-148571571,-301677949,-297607034,839248515,-289109276,-1396375998,-169719058,548988415,105352711,
12189491,-1951665376,55020055,-1703954,-1,-1,-1,-369098753,-65398,-1,28313168,397444582,1085834470,-1329558016,-425662944,-423611872,
116795120,1948254359,645932555,132055191,-821899944,1448302076,-326951343,653036304,9899648,7788832,105286555,-427691893,-390004721,140413700,-268377215,-661732597,
-1409281863,-131800950,91543612,233567714,-14308208,140935431,1175058432,1725537032,281314048,1532909855,-816314531,-436096944,-434720635,-434065276,181229728,-1202708785,
-661782464,-88067496,7341702,7212683,7083659,-1461116933,-1202708895,-661782464,1846446586,1813416192,1879492096,1492844544,1636690207,-1342170904,407431168,45150346,
-1978121752,-402345784,-393603014,-1335790871,803797514,1954588696,-202638589,-1054525,-427163472,-1340595480,-387872254,78649371,350807434,-401887208,34347018,-31130844,
41210500,-527826676,-51901520,1630660887,-1325417240,401401863,145805450,-1978145304,-402018064,-930474018,-672648528,-370636265,-1696046833,440575,-1340616984,-387806713,
145758151,-1058478454,-1979076585,398059745,-1343747152,604113943,-1327461637,397010955,-443927888,-384326936,-1325768489,395634699,141828264,-1070375941,183033,-2081944912,
1971365911,-1979600649,394127590,-511048784,-1340639512,-387610107,-1578887313,-1578697180,1609042864,-1977611241,-401887008,-1863772325,196147808,605507048,-1327461665,390719499,
-1973387543,-198919709,1976009964,-209000436,-855705886,-2135625867,-1023363901,-20987853,92874255,-101058055,87631609,-101058055,246465529,199817884,65539607,-1878856960,
1975560399,-1325753326,385411117,256014,-812645653,868417828,-1901018176,-471270756,65539606,-1878856960,1975560399,-1325753326,382789805,256014,-812645653,868417828,
519816128,-1912586056,279013080,-14326272,1711276287,-432820144,-1468930960,1951950368,878086,520159232,-7935805,1048602740,1946288201,1228832777,41157376,-13412117,
1958725518,4622848,158597180,1182073148,-336534344,-257640445,1946499878,-1409614791,-72628084,-1979685472,-1962908122,-1191156970,-1595408372,32815880,-2094580248,1704985794,
263515648,-1260071704,-456136701,-890764620,-402541340,-54270779,-464474778,1480632417,-293395084,76113412,1220038686,-455569920,216042081,-1973295608,-973078506,-16777210,
1642513542,-872865960,2122381191,393543686,1966383336,-432820201,-1468930960,604533764,204961276,-399250684,779302043,1949611240,-1608204741,-1472919832,-1102023679,266903593,
-1975547150,115835103,1946484608,-1607221698,1958798208,-1607549386,616444395,-33246048,-30903092,-2094762808,-202701370,149191,71747328,1187381248,1187446791,-956301300,
2630,1966353640,-397808836,-596495256,772558476,-1996270453,-617412010,1966347496,874637322,-1976695438,-1979764196,-1976696226,1854407276,1284124165,72255489,17254086,
1966350568,-242685937,1962950528,-386431225,-142085503,-2009849880,-1070397866,-32086399,-1007187969,-81327871,1326383648,151200021,69280335,557600530,-843122809,72780704,
1966321896,868083759,20719218,-964486540,1946303494,214336266,208929596,772195971,1946244155,113672981,22297390,904596596,678690876,22297390,333985397,4161777,
-142145675,-2014180120,1418342135,-251598845,1317803912,1418407436,173443332,18245249,-339725568,374243604,213123073,451657778,18239105,839693312,-254482240,1962950528,
1358399241,1492241640,-142084217,654901699,35715987,141829897,1326383649,52499733,580341513,1325990689,69283735,1008160530,-223,-1,-536870913,151135490,
-162463958,-2144925681,35979999,1358899721,654839798,620945216,-15003902,135263828,48169039,705233445,267800831,-545239288,151135490,-162463958,-2142304241,35979999,
1711217426,1325928438,547588864,950348288,16776960,0,509606656,4243280,20766606,494154615,10487542,-2144701183,16818190,-100642328,-31153692,-386162202,
-336068576,-1610156523,57999616,-401871880,645922851,-335675232,-1269237503,-899735808,-1325793278,329050123,-1974452212,-401887008,-78113897,196147907,605260264,-527806273,
-2065167440,-1006938093,9969289,10094220,10229385,10358409,-92013629,1242002432,-2035019916,-466435079,-335412806,-1930825692,33667584,1007625452,856323343,870003648,
-338545719,-326937224,-1997763826,-386269114,-108330899,-940699728,3142,-1995678069,-527824290,839853292,-1961789984,5236959,1586092331,173947660,753656439,1055448971,
-153539840,57934276,-167616887,57934532,-167485815,57935044,-167354743,57936068,940072585,-1267400634,1532516603,1566399065,82362717,-1056642111,-356449047,1355020292,
1139146928,-930463516,-393592604,1610335064,1086018334,-153383424,16818182,113651317,100728992,512607118,468189344,-453376001,-335666015,-436147456,-437716063,-1610156290,
-109805568,10495616,32241791,1595890681,-83885366,106979167,4241438,646568078,378273895,11534441,-202866458,520516608,62152967,1552808911,130491936,-930283521,
637853889,-1946007671,216580552,71796774,88589862,677154202,-16267482,-1043297025,-1993997088,-796130745,638380225,637814664,-1845147706,-930327034,915259534,-454515310,
-388986112,123601127,638082189,637687689,637814664,16713671,-427773702,17770096,12707871,38242598,637584104,637814664,-63545,88589862,17770130,-536801513,
251658509,-13701119,866208046,-805302336,-1912592200,1095888,414767246,-54489600,-13371853,1894121648,1726599505,-145119757,1946157505,-2135907071,683176166,-1898410496,
1724944064,2101072,-121498,571441151,-363305472,-268393512,503385902,1558946129,1212868858,-776988299,1105749222,-1341098680,-396302625,125126712,1692860336,-1018679320,
1642332852,393494696,-397390258,41156918,76088459,-435680168,-420010911,-1979599775,-343873852,-1044345711,-972880672,-1047768637,-389953909,-1044315388,-1017574168,-1912586056,
1763086040,1730579200,2942976,1894121648,-2040461537,-2038373180,-326412860,209052682,-33134975,105808383,183173184,-1090099583,105808383,-815988735,1967633384,-422465509,
1202382948,-575663499,-1578606362,-1341557433,-396040449,74729368,-2132409424,-1335926845,278980657,816898186,-820995608,-396402693,108330798,-889585740,1408958466,641227917,
-63545,-524171124,1200170500,-1043821566,-2010772248,-970587065,1536820551,-435048198,-423130592,-435900383,-436096991,-419450847,-435048415,-423392608,-436031327,-436096863,
-419450719,140283297,385945382,638606477,1428095247,1187507339,1560293380,232784143,17760257,788475632,-1070358195,-1194328049,-796000216,-1912596296,2144472,-466435954,
183032,-1207558573,-661782520,-2147479365,1971324543,75464751,-2094434880,1962934911,2145059,-1845147706,-1912594248,-2049088,639601446,251660279,-4717195,-1207702784,
-617414404,-1017438457,-1064384372,870774203,-1543453760,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,
-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,
-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,
-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,
-1543503872,-2046820320,-1543503872,-2046820320,-1588592640,807731216,1479556096,121378676,512431474,-478150640,82559024,-1976631502,-341294457,-1576554494,1235222601,-1342129408,
1006875834,-1157204985,-725960704,-1983672829,-1744805098,-2097041261,-2081553214,-1070398230,-1577038173,-1976696734,-1549266297,-472842166,445090606,5022632,-1976636463,-2136462681,
1705000932,180364288,6660804,849840686,1713801384,1095936,7989254,174885414,189565478,603998624,1963080958,2088773141,242552073,1206437258,-1964471808,4253889,
-1995978614,-1610588146,121372745,71042932,1929380024,119584771,12189491,514585376,5291783,146391091,-156503296,268470022,-189069708,515958785,-2097125984,-1007811390,
2041169,-523107407,-235532623,1913126016,1505820162,-1962986813,503335198,-561056205,7616197,983534126,1458766760,-374885699,1593570347,-1064380276,119849759,-1744805214,
653742672,1319305292,-779003392,-401820439,-782367449,1351388134,84470016,167798432,-2146863617,-534503453,200000266,-472775247,606135168,-1564276001,-1031602074,-1597772283,
1183318089,4890624,-1610529144,1183318114,673760007,673730640,134238288,268437504,1073745920,1073758208,673988608,774514989,808462622,808464432,12351,538972176,
16986144,466618115,-490529840,466623440,-1784610988,-22733872,466676103,466623440,-279475805,-261809200,-129894323,-415634343,-399574951,-406786094,-26286350,-11272365,
-272109404,1251409920,466623519,466623440,466623528,466623440,49808376,58196924,336855672,16847892,1966337,816840766,1085834470,-1950315008,1509954334,-1070338765,
857735358,-1178235137,-1410105344,268486017,-277680581,4241490,512344206,-1070399469,-2134916978,5290240,-1765881716,-1415237976,-1070335774,-2134916978,571649,-1426063176,
-1325604181,864347697,-1094676800,-1061181306,571649,-1523660660,-1325669717,-1098586574,12560454,2144512,-1523660660,1476125355,855670463,92874432,-432820129,4241540,
12245134,1015079954,-1979550412,1914079696,-432754688,-1181698940,-617414626,-997535181,-1978932760,-19266608,-1326193980,198502575,-1364143990,-1978937880,1960000496,-393301998,
1074531266,-1901010806,-1341407512,-1333467595,-1148918218,-661913600,951107726,-1732344602,49064,771752633,1111659181,1962884332,46628871,-1416476086,967896546,-1665235738,
573352,771752889,-152268115,-527765808,1975794412,1086816261,-337466478,-2065286480,-1079467330,112787576,-1523649792,-109721211,-1912586056,270436824,-432295936,408545412,
8851072,-393301996,1084754746,-1380970379,-1475661336,-2146995195,-83851482,2008748523,1200500410,-202053626,645924212,-956628857,402686982,199791792,-1976556533,-1340190496,
-393943470,1478488125,-58716300,-402426880,1404043573,1055425766,1085850608,-388461056,158475740,91555132,8857216,-15365,60746239,-2065280848,-1912586056,-430853928,
-393301884,-1062729026,-4979340,-1332737301,179366036,-527814620,1387273808,-488078106,1951932399,-1869561072,-622328972,-430723072,-270276476,1342578371,1962123240,-1900006644,
7651264,-469383386,270958832,243322624,-1271922672,-855134208,270958608,243322624,-1272971248,-855396352,11200528,-1340143784,-1115363756,954837753,1346380801,1476403432,
-789177229,-1336917980,1485104725,1929384168,-430526451,479455364,-400787736,-1161618317,-628376969,168805251,-2025818688,-1258180397,284983312,61870196,-58711883,-402164704,
61866053,645931189,147783696,1342181422,1200500307,-221976570,41179227,-1336884231,1485104727,281870516,1405337651,1949367424,1304579,1052288,-1909564624,-1679292857,
1946661106,-1329333799,163113102,-527818740,-1259827536,1487979273,521045222,-1329956933,-1903892903,1944585799,-352094990,1521520751,28345574,62406529,28312181,-1326573685,
864347739,-1946209326,-947188401,41665586,-1036861186,871621290,223316991,-1003305077,-1057095045,-508640718,-2147125773,-713687054,-2065277776,-1409565284,871366633,39291593,
-186118476,343186688,-2065277520,139955027,1334495539,174033676,1528507112,-2065277264,-2129673341,1941607931,-9180925,-2065277008,-423579453,-18076,44590308,-119405452,
-4650005,-1469782785,-502237951,-1206862856,-1124065863,-1628853159,-453055717,-1704096,-1,-1,-1,-1,-1,-1,-1909331201,243920896,
1235222624,1023288320,858420482,-975466789,-2147453898,1963792764,415364892,-1961462504,1625522649,-389707168,-393609199,183026058,197691904,-401951541,616759359,-166808561,
-773271068,350802408,-8338688,-2042071289,-771804421,38702051,5279625,973103776,863307590,-2034224302,1244067781,-1580727552,-388956082,-1269118973,-289109490,-339375550,
-301929728,-1966801334,-352261180,-1975325184,-352261183,-1018499584,1122944138,15451530,1257111787,-997538562,15401195,-1047903506,15401195,-436253970,5814302,2025576590,
32553715,855642296,-1387282945,-464961815,-435418015,-420273055,32553569,855642296,-1385710081,1933223145,-396929525,1583302963,1273699186,1084776932,47206,259325952,
-201524351,-54852236,867625971,1354964928,637897254,1642333576,1642466316,1642525476,-1072994728,854071669,-2132769063,-164425756,-590347087,-498727565,854995961,1712843712,
644220043,-141884109,-1476393799,1711764991,1174988993,-930417182,-115353973,-61,-1,-1368195073,-1364808040,-1339183193,-1297895330,-1331907933,-1364807454,-1320570969,
-1297895055,-1321487709,-1297894887,-1304120669,-92229008,-854428800,1436307520,1183575179,172394754,-346514083,102654024,-326434710,1981152384,4241418,1726535822,-2127631612,
-124314,1724033,872217346,-992440640,-167705546,74711490,18364100,-1912586053,-1965519909,-472836770,-426246354,520554413,1720242017,1948682261,-855592448,273058368,
-2143510748,-2126769806,367529335,49211415,95683955,-1023026456,-2013236064,646452294,1720189044,-622279915,-397184507,548406503,138737190,201487552,360611841,202470666,
-1977200638,-1073084604,78643829,1476413064,-402634590,-1030879985,2142697611,169180800,-1005975948,-956431755,-2011929078,74711398,74901050,1256917428,-402275608,1114768850,
1912856040,-386364867,309528068,1947335808,147322378,300428404,-400037115,753403219,-400592379,2122319108,91556373,1912931560,21954065,1190643061,1962934554,86566920,
753402859,707445509,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,
707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,-402416407,2104624345,-1341921560,1156982320,41205768,2122318092,292883221,
642777612,168248458,-1342016064,4622340,4760152,-1241248024,360611967,168195083,-33393212,342231750,1946248840,1994799620,-351685628,80078900,-1962677528,-386888742,
-85457845,360611843,-402295541,426902526,1912913384,46721044,-236449934,-32869884,-613088946,-352042520,71690243,72607939,1625827442,641773571,-1073199882,17564276,
-402634590,-2014837641,-401640956,175243922,1912912872,68216837,350749675,585679620,-399150588,-1977220305,1134693956,1208403456,1223184384,64350212,1760042610,-1948611837,
58452208,1912883688,39118863,2112359026,-402296316,65733586,-1023158552,-1575729527,-1974271884,-478146466,-2114223969,-1995606437,1183388230,-402148336,636158903,1208257318,
67059016,-4717706,-1059027453,170264288,1183387204,1686775314,-1597178366,1183383669,-1628912880,-1974439421,-1977216930,-805436804,-157233280,57934275,638635904,638475402,
-1056619381,503710440,4374279,-1430025558,-1968569936,-1968526652,96905927,-1662515311,61663235,-1209528462,-401968639,91358176,-352111128,-402148347,-389872841,91358021,
-352115224,53078019,53995715,1156063090,1208403458,1692954624,57993219,2145914738,-401968639,91358120,-352125464,50456579,51374275,-58718093,-385649407,857604247,
-992440640,520160310,-972944664,17670,4589254,1193705472,1139335168,-1163874303,-387055114,-1461189759,58452223,7683712,-2145947134,268453646,-1342102040,32946864,
56879342,-385905944,1719731037,-956301798,-402647738,997331855,-1900006626,70698200,-2135744767,1929315304,3532842,1048585586,1929511029,552335363,-1900006626,406242520,
-2118967551,1929307112,1192132618,283643904,-1274711296,39446533,40364227,1961369458,1208403457,-1796730880,44361730,-1343746190,-401968640,91357912,-352178712,36825091,
-1022081400,1912749288,21620771,4720326,40495248,1912764904,8710163,333975154,-1981533695,20714566,548668788,-1023278360,7675530,-1014969346,274606720,1183386483,
306612500,-351254903,340182809,-1977220352,-165281212,-1960440220,-470332644,-1995422071,-960294314,-1275063226,359041025,7612040,18501249,669565696,-1977519616,19140678,
201646272,32946848,1370350,547884658,-860617612,1084753643,-1431042699,-1023307032,2145931603,1979661312,-339442172,441111,-1460394823,-401705856,1743314592,1274339840,
-2135626123,-1017423367,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,
1344940586,4241438,113694862,-1325465458,-434051552,-1900006496,-1862223656,1411317660,-816308480,-335415366,-1023374174,67112970,37756928,-335416902,-1275032158,1960256544,
1824413200,1927336115,-102021629,-2040615890,9281760,1149970115,48808197,-1979694430,1134695494,306612736,1151483684,323389952,-1979693662,-390065594,275155462,-1067391872,
-1005976596,-1979693406,19140678,201646272,292981408,168814208,4694726,138709542,-301730118,1095875,50489079,-763359674,-490647552,82362636,626577419,516096015,
12180366,32553473,-1021349901,1317727538,-578361344,1929300456,3270672,-1910633614,-1172329253,-487718416,12174312,32553473,851668467,5147373,-388145176,208862882,
1912605416,32553479,-320689428,616124867,-24319756,-138801038,145288193,971507829,-1259085091,-1017513600,855570920,340167140,359041219,1328838,7612040,18501249,
-960235264,36358,7612040,7677578,292873226,605046410,1954561183,1959591438,1954626564,-33822714,-1173230599,11535350,284092654,1929248744,7071747,-1101965629,
-239468478,506113,-498930004,-1017226757,857624915,-120025408,-1668284232,5512959,856322847,-1912206656,-350522112,-1145031914,616103956,-1912206604,-401902336,-169681764,
-1259375285,113703296,1493172366,547930971,-860617612,27791339,1474823540,-1475941378,-1274842108,-1178339055,-138742748,-322948351,141889704,-488872984,-109005578,66501315,
-1007811920,1910796518,-1972312381,-1015945532,-2065284944,-1912586056,7512536,876380390,-436272523,-4987509,1891499827,-769201739,-2065284688,-789159452,-527822812,-452984903,
974136417,-502238012,-1232290826,-1124067143,1659483541,-1327895790,1719985730,12250419,28861952,1711276032,12174643,868388416,-781803777,-492083504,281444601,536935041,
1135667314,1642366182,1642466316,1642525476,-2065283920,1711276223,443,-583834112,-1966765210,870289140,1073789430,1721689738,-1969237039,1722640116,-253639885,1169179765,
1642366182,11583656,-947840139,-8318976,-781049856,41635174,1185973483,1085834470,-2585088,-1107348508,-1209420243,266567889,78771763,91478992,872014406,-339725578,
79269905,-1460589824,1711764991,1174988993,-930351646,-2065283152,-561195381,-1124073281,1189721701,-1230587120,-1124068935,-1997949327,-1963005167,-31182267,242549308,-2092149365,
1971324098,1166704718,-1007030706,758263857,1953724755,1109421413,1685217647,1767982624,1701999980,840960525,1294807344,1919905125,1917132921,544370546,758329394,1869440333,
1092647282,1701995620,1159754611,1919906418,892351008,1835355437,544830063,1869771333,537529714,758591538,1635151433,543451500,1869440333,1126201714,1768320623,1634891111,
1852795252,1109396746,543519585,1969516365,536896876,1969516365,1092642156,1867325440,1701606756,536887840,1969516365,1126196588,1342835968,1953067617,1749229689,543908709,
1342185521,1953067617,1749229689,543908709,1056972850,1061109567,808517695,1330785585,1917132877,225603442,808722442,1867328818,1751347054,1701670770,1633960224,1919251568,
1767982624,1701999980,891292173,1143812400,1819308905,1092647265,1953522020,1176531557,1970039137,168650098,825242400,2036681517,1918988130,1917132900,544370546,1411412591,
544502629,1954048326,543519349,1953721929,1701604449,537529700,758198323,1652122955,1685217647,1920091424,168653423,875574048,2036681517,1918988130,1919885412,1937330976,
544040308,1953066581,1920091424,168653423,758329395,1652122955,1685217647,1852785440,1819243124,544367980,1869771333,537529714,758198326,1802725700,1702130789,1852785440,
1819243124,544367980,1869771333,537529714,758263863,1919971139,1936024431,544370547,1702126916,1869182051,1917132910,745697138,1701597216,543519585,1667590211,1850286187,
1818326131,1769234796,168652399,825241888,1328498989,1297044000,1920091424,168653423,842412320,1937330989,544040308,1769238607,544435823,544501582,762602835,1853182504,
1952797472,220819573,538976266,1850286112,1953654131,1095320608,1397706311,541280596,1802725732,1702130789,544106784,1986622020,977346661,824183309,1395470902,1702130553,
1884233837,1852795252,1917132915,225603442,909189130,1699556660,2037542765,2053722912,1917132901,225603442,909189130,1767124275,639657325,1952531488,1867391077,1699946612,
218762612,1378361354,1297437509,540876869,573654562,1497713440,218762537,808656906,2035494194,1835365491,1768838432,1699946612,1769108835,1277196660,543908719,1277195113,
1701536623,537529700,538976288,1851072557,1801678700,1937330976,544040308,1953066581,1667584800,1953067637,1867260025,168651619,809056049,1936278573,540024939,1869771333,
822742386,758200631,1802725700,1159737632,1919906418,925960717,1143812152,543912809,1631985712,1920298089,822742373,758200375,1802725700,1176514848,1970039137,168650098,
842544945,1936278573,1866670187,1869771886,1919249516,1767982624,1701999980,908069389,1143813424,1701540713,543519860,1986622020,2035556453,1159751024,1919906418,1968318509,
1699946606,695235956,538970637,1226842144,1919251310,1229201524,1330530113,1128879187,1936286752,1953785195,1852383333,1769096224,1092642166,-670429894,-1272327165,12058864,
515344992,62406656,-254531148,1610657792,2209641,-1164198640,-1327962647,863037070,-1334712640,-91822528,-2065297488,-2048524112,-90066,-1573990154,976158718,1979710982,
179986,-373634371,-478098150,-1160528449,-53689367,-1896873800,-419450664,-1147017695,529268704,251660279,-491058315,-1960866817,-1899723257,-435375896,-435113887,-434982780,
-431837109,-426594229,-423611829,-430657393,-434982845,-432623551,-436162493,-436162496,-1173573568,-1326578702,-1333467631,62437889,-1174294290,-1158806568,-1158937670,-1158937638,
-1070464064,-1166558226,-1329893697,-300446975,-1979418741,314114647,-1151353600,-2082435863,-92207678,58000345,1257124016,313583615,2025686246,-528291397,1468713267,-1123109886,
-1813398651,264471537,-1164575871,330349170,12158182,-490720511,-436162308,-1975458749,1027663072,242548736,-1179218757,-1262682088,205777339,347143915,-1951365914,15429862,
15401195,119828964,-1951342454,-997560090,-1934593562,363884774,-1917811482,15429862,15401195,-2145095196,-1901010806,15429862,15401195,-2145095196,-1971272458,-2146994720,
380666060,397444326,-1901034266,-997560090,414216678,482182374,-113972804,-215719452,817390054,-1127182848,430964992,2112390374,-424824596,-18076,44590308,-119402380,
-1179119429,1287454749,195815868,45743851,1365304320,-401372997,-463926818,1946265700,-1141972464,498710544,-1133527808,-351565591,-412292866,-1326586904,-393943526,464580086,
1676182758,-434327354,264628356,-2065293904,-1341131288,-393943507,514860139,1021871334,-434130925,983427204,-2065293136,-400937240,-873985165,724035639,-433999621,279832708,
-2065292368,-1340992280,-393943518,12521891,-1126712064,-2134176279,-75448093,-1341491904,-1115363650,736738537,-433803061,-1335827324,-463149360,1946331236,-453448958,1946265700,
610329850,-1963776771,-422465312,-1469782940,-1963297534,-1335826748,-393943515,649122962,1810400486,-433606650,-1158893436,-1326578754,-393943512,699456641,-1947695898,-433410011,
-854608764,-855591920,-1973296112,-429126432,-421493151,-433344415,-401690492,78182374,12192884,-1188447456,-402646343,-1578890793,-1578697436,-81518108,1085809126,-958886400,
4614,9834112,-1777434496,-386260992,-223334756,-1174707994,116850687,1948254358,-956833273,38406,1048676068,305397874,1085283188,894953552,1968750602,-427815934,
896002182,1273402032,-351677464,1967171639,1971365892,164030471,300613808,3948324,876349042,99287671,-1341541400,988303360,-1833895371,1012419558,-436046848,1913046858,
-82706432,-1341548568,-393943508,432878370,2133116042,-1084815602,146390876,1605300736,-385649416,-58719947,-167086806,33592838,636027764,268483329,-469056557,-58688647,
-2147126102,175486716,9832182,-385649662,-738787064,1975057536,-1777928664,326369792,9840256,-1775861513,116849920,1946288152,-2142966974,-50325466,9832182,-348883960,
-1644396490,116796789,1962999958,-1777928662,326369792,9840256,-1775861509,116849920,1946222616,-2146374898,-33548250,9832182,553940228,-117434594,956072131,116793205,
1946288278,-1777434612,645924864,-335740778,403603461,243270144,-116916201,503087299,116794997,1962999958,-1777928675,208929280,9834112,-1775861756,99351808,1576576,
386826241,-1007090688,1515141,503924597,116785175,1963196439,1392279612,116798325,1963458583,386332214,276038400,9832182,-166234878,536876806,367726708,9832182,
-166824702,536876806,645924724,-343998440,389951492,1392279552,-1007091340,908729656,1178942034,1574646,-2146536188,67115022,-393936712,365767574,-2134640315,-83879898,
-343604808,8240110,-116895512,-1326402365,-401695741,-239851368,-1847062884,1962884136,8239904,137619536,1946172504,1946237972,1946762256,8239884,-1157202456,451412093,
-2134640376,41287676,-58672149,-352160428,-721649517,-1544879499,1967520896,-1873810685,1975057536,9955587,1966603392,11266307,1968372864,13887747,1967586432,14084355,
1946307048,354826791,-2139982848,58020860,-2147450647,2020871420,1966341248,-385830907,-58720004,-1341819596,15919361,116835320,1962999958,386332186,-260832256,1509110,
-385649656,116785310,1963982998,-2147095585,-33515994,1576576,-1343686136,-2131016406,33573182,1048577908,1963130953,95965193,-855526465,116807696,1963458584,1355020793,
109494323,-1065091047,669516660,-1662298093,-84549399,-81103384,-165026071,268473862,116790644,1946288278,386332181,242549760,9840256,-167056387,50337542,1810432885,
1206450943,97338666,-154928645,-2147477498,-1007091084,116835320,1946419223,386332407,-260831232,-1763052880,386332160,-462158848,1509110,-153258744,268473862,116788340,
1946288278,-1775861553,243334400,-394264463,-386268857,-79353354,-1070392371,-1078696469,-315420467,65651705,2028210943,1006403635,-58708356,-2144633276,91510780,1968766080,
-164319201,134223622,850408821,1509110,-1339263740,386332208,594871040,535506608,766559224,1509110,-1340836600,386332195,192218112,116791728,1963130903,46150146,
-390057248,-1007087058,259580938,1195164810,1396442236,113641342,-134217703,751078083,-1685996729,116840238,1963458583,-1685143979,1509110,-163416828,50337542,116798069,
1965031447,-1777928682,225772032,192687676,1967979648,-336547836,-155176446,33592838,645924724,-1325596522,298379488,1139523634,1509110,-338332384,-653465374,-646782838,
116798699,1963065494,1949187119,1965767817,3729418,-256321931,1020193614,-401967827,-931856342,-347410248,2083531968,421956287,-1576348416,-1007091687,9840256,-1682391299,
915126251,909836314,-1012072420,1509110,-167414776,67114758,-1577411389,446890112,1876736,256014,-812645653,-885397309,646589300,-58720183,-2147126780,896927468,
-1962891032,-2097126634,-1460926782,-84183807,1946265836,93005563,-83868023,1227262659,83656704,-327154318,-401967610,-1960443779,4622597,9824451,-644955764,-779290741,
-326909554,-1208186104,-1979534588,2046611460,-1963947501,146342228,2044907776,-791611135,-169680175,16155050,1976303136,1355187166,-713699330,-661731188,-1946521922,6940924,
-1070390669,918935694,1397751932,-611530612,1482408763,-24967819,-1962314752,4843772,-2147220878,-1995914109,-1950154682,853510904,5022207,-796138505,-1618222127,1251999824,
854062592,-775748609,-1748892704,1344179139,-2033044736,-772043814,66048495,1225193211,41222656,-100408623,-1949922365,-1158860065,-1957298048,-1308914704,1957163780,525579,
1592816970,-1007042509,-1312412834,-1008151805,-1912586056,-424628008,-1564462460,-1901985675,32684544,854480304,1430056128,-1313864076,233538790,9113216,15001601,99091314,
-424103936,-402209916,359858587,-2065255760,-1178992453,12189726,57272320,-352210200,-424431573,-1900006524,1053042368,-2135817980,-2147476504,33584446,-1263529358,-1070365466,
-1004093298,-1308551106,190593,95929095,314114739,-854543238,1376875283,-335415366,1971365978,-2130935784,82513780,309661864,-489855000,1976303328,1976565465,17426643,
162815211,-177073203,332206516,642927986,36504971,-1964471808,115458252,-2147366528,-457175836,1490323972,-1977167862,-822214027,-855375432,-2145684717,376703740,1947335808,
284983313,-1047917452,289149220,-1040315020,28958443,-854805504,-402361581,-1007091566,-1612149072,1950394608,-424169462,-117395068,-1332708885,-259200878,-311115766,857659530,
-1899459648,-1060926760,225707240,91557692,1877514672,-20840720,-166677048,-469695003,17081338,17174156,-1014317005,225709860,91557692,1273535152,-20381968,98956993,
413393921,437160961,5021953,-1593769821,44236878,1275512577,-1943137792,-956281330,1124194310,-636580813,-2011170047,-1023380210,-2065254992,-2135314245,57966842,-1179008069,
12189715,33417216,-424234813,-1175733372,1954675328,3794950,-1179003205,12189717,31582208,3860675,-1174387480,1018888695,-198919936,1954588908,-870389748,1967912674,
-343886608,32619018,1946238188,-115297277,-1901004093,217034216,-1327461880,-274077554,568640507,568785700,-1088118300,-1195138586,-155582464,78704131,-874583826,-1007812432,
1381061627,1428051798,1086254219,-2116121088,-1962933278,83656946,-1668676493,-422510468,38027,880071179,91612292,-351989016,1976368683,87746565,-855760149,1575486837,
-31855867,-402295348,283837727,91606270,-351946520,1976368647,99936259,1583292253,-816096934,-1,1793720319,1392513028,-402652741,-1017446398,-397324203,1482227716,
-880032931,11598492,1088701414,1088741514,256014,-812645653,-661928826,11598492,1088701414,1088741514,256014,-812645653,726910086,1358660056,-529376503,-1950103838,
-436162357,-1975458749,-2042567456,-1327985724,-465312256,-455046592,734299712,1358660056,-503025143,65404892,-2015040552,-1947629838,-1176073255,-355270652,-1107295559,652986049,
-2116777072,-1191181342,-792854524,-1877480506,-2010767184,-1434451835,-1177318585,-457310206,-1878791226,-1191385601,-1064390656,653733522,76727853,1075062672,-2054674905,1202356224,
-419435806,1381099910,-490613109,178440,1509955816,254593,-402651975,548405261,1509994728,-402652487,-54329343,653733522,76727853,1075062672,1347506727,1476433128,
-387818919,1085808323,-958886400,-16772602,-162442465,141869254,-2147462936,-202686226,1949353718,2746376,-351211904,777738739,-397211766,1130037341,-1966869022,1390957319,
-498902272,229688310,-1342158616,4450314,16432067,-1157610264,-1679294208,2109457406,3663872,-402620997,-1144783218,719848224,16825088,-1006730776,78768266,115927250,
-389707264,616759297,663749647,-400080876,-1144848383,246677511,-1329393459,-1337727306,-1337792968,-465377787,-436007839,-28776351,-64724508,868442598,12123391,784371376,
641927050,-2147449464,-203274326,856090111,12123391,-1967092048,-2010758393,-1434451835,133489223,102654147,-2065248080,-1912586056,1730578904,1763085312,-422465536,-1197283196,
-1427569804,-422400000,-391008124,-527766282,-269963088,-1143852052,-201916352,280230026,-402613784,-1918780353,8389888,1086050867,-1963723008,-1944155400,8448000,-1329807896,
-1199249709,-661782488,-795950962,1711284239,-475,2232191,13147626,17772272,-1331605218,-1199249708,-661782464,6887054,6760075,-1579433496,-768409581,-150978373,
15859,602604405,77200,12253322,16744464,-1030875788,-1178586266,-13418496,-1410111748,-964636674,132573968,-1161600737,-1933901824,1751478,-184661272,1464947536,
414713374,-942109184,18950,16744448,512236404,1220018252,1723895296,12173363,-50384064,-22285466,-339476785,1595869152,-1017619623,-2013213464,167788838,-2130348828,
71246,4623043,4269706,91546634,18239105,-956644608,-16760826,1317671088,216060422,105253388,4138634,168092864,66239172,-1595897106,-390070133,66566662,
82624750,603996064,1959016975,1059457072,-1191642368,365793533,2108695410,-1977218895,2122320476,141820673,83984000,95486581,41146682,-470361722,2078857355,1371798524,
-1190923078,-773324612,-2136412985,-152959371,82542768,-322452504,1497409602,-1594062141,1177157701,652267525,-1979423498,4628696,638010922,33842422,1191576259,71707136,
-1161566326,1067451378,1947149312,-1461137390,-1342016508,1059490307,-771444480,214174436,1978199560,1042710727,67895296,-198919698,4065014,-401967744,-186464416,-335970124,
1042710541,652771072,630188069,-1195121614,1727463440,38142732,-100609408,82185446,82232454,-661928826,-2115583350,99008907,99009670,-1006910330,-1073250678,2114585319,
172025862,-402293110,-3995078,-1,-1,1358954495,-1595531088,196092134,-1964334616,-401821472,-1004344678,57950376,-1476391192,-402426848,-816316414,1481297232,
508757699,4241488,116840590,1946222752,-1674673877,1929629696,-1641118941,477298944,196104280,-390077312,645982815,-1577189216,-1064435558,9969291,-2146467802,123412312,
-534425405,-1031563776,-293556221,-1325143421,787403524,-869366645,1120176878,1480737518,1257119524,-289394102,96633674,1122011884,1381024748,-2098723920,-1223855104,-758913008,
-1219885452,-759437280,-461088422,-2091774603,-1964243518,1522633440,-1979520018,28361665,1946179816,7454277,1249846400,1522074039,1350611968,1139146928,-997834524,-997834524,
-329713525,695584644,510993540,-436162480,-2042567613,-2042567484,-131377212,1562443649,-546154401,-872493598,-863976331,-339725696,-2082436599,-2132015638,-2084364572,1122895042,
-383731902,134271549,1010313240,-590285567,-452272944,-472849456,-617422070,-960562298,787678155,-58055670,-1341930877,-360452480,-1947389437,786878961,-869366645,1122010862,
-1975368978,1246424775,1257160754,-1006691608,426967612,168084099,-335120960,-351517048,535003142,-2081504374,-51903254,68666366,25166592,6291648,1572912,393228,
131075,22391296,268960770,-8372192,-426725376,964996,-489929538,774171394,-1327461716,-387848049,-672624720,1960852200,-426594070,47748,-1179218757,-991428582,
-1325470726,-1014700399,-2065263696,149292208,233230566,247061222,-867910144,-1712782366,-1951650304,47833,-301987655,-69057810,-1191132998,-286392312,-85835198,-2082043930,
-2098822682,-1981379610,-527791386,-1002797084,15424117,-1002798108,15422069,-1002798620,15420021,-1002798364,15417973,-1002796060,15415925,-1002796572,15413877,-1002796316,
15411829,-2065263440,-1191182150,-320077816,1975794242,-1158159849,146342080,1122823168,1975794242,-1946754553,-9377333,-1157627718,448378508,-99751936,-1783562517,233211110,
11590374,-790230810,199639216,199639472,199639728,199639984,-689520464,-689552976,-689552720,-689552464,-2065262928,-1325753149,-405739382,41189544,-2135886357,-1964522008,
-394088208,-930420802,-1209498448,-1645704473,-756496758,2000370688,-1950054811,-389969168,993788101,-662022025,-1159150198,1998011392,-1946645939,-2033634365,599347660,-1813907678,
1018778200,-1176373504,-503897565,324655107,-1966699567,-1262187832,-773523822,868746209,332071872,-2083420208,-938276926,-623777327,-623777327,-623777327,449642932,-1901064469,
216482280,-1327461884,-415373170,4241414,-1070344050,-1960394610,637542446,2098887,645975636,-453115797,-419552223,3980065,-151517720,16804614,12193397,-1232291072,
-402646343,-18089729,539920678,1797685248,-1022886400,1085820958,-2133291520,16804622,551952560,-1966137512,82624736,181735204,4241603,512481422,-472186864,272555419,
1089536,58048522,-469578880,-423579552,-1469782940,-352160766,-1469782792,-453348351,1963239520,46396935,199958645,1963115510,-35422202,-2138038037,-1168900637,1337655296,
4045240,1543012072,-1578890005,-1578705116,-81518108,512303590,-1329397744,-393943413,460456284,276104508,-1157627718,800700328,-128063488,-1023358744,108265532,-385826584,
-2035285873,-5208858,-390504218,518541571,1692686839,91554216,-1947601950,1012982784,-502958854,8448488,-2065266768,-468481863,1963042916,-152547062,-203269642,-1332712725,
-461052280,1957313632,-1874400509,-2065266256,1692839600,-452984903,1946331236,-336010747,179933232,-1469783040,1359574273,1509343464,418116578,-2065266000,-1336909596,-463149395,
1963108452,803756282,-1878594568,-2065265232,4241603,243325070,-1157693422,-675610624,1423799,-1007182104,-1912586056,302940376,12254976,-1209222400,-402643783,-1329334393,
-1184569682,1692729343,276038312,12253410,-1206863104,-402645063,-18090133,-427773757,-424824700,-1469782940,-453348094,1946265700,-345971708,-427708170,-425021308,655407460,
27813092,-397342347,-497420763,-1341461517,-461052286,1951743072,-427577326,47748,-1179119429,484966431,-1325470729,-1333467516,-463149472,1963108452,-430067462,-1414479008,
1692689638,-92994904,-469736263,1963042916,-622309111,-203269643,-1934620181,1625588966,-117314568,-100991549,-370477578,-707339547,-1700419158,1431738005,12539390,-796672768,
-2135465495,-75448093,-1086884544,-1799553023,-1219434032,-1899459578,-798638144,-1979706183,1974399683,-1172641022,-474284032,2341302,-1326017816,-460527602,246685708,-1998004090,
-1017313308,83654,-335101309,-1475941757,-1469156092,-965839870,-1342111418,-331158000,-1337270134,-331157999,1309027146,268778752,-1070398852,512425778,707657801,-2133762425,
41484508,243974195,-75497398,-2143849980,846465019,-235525967,-372193142,1317595600,40273923,1183375568,-2046578427,-740019488,105286112,4800128,-804883194,1724973670,
130188038,-235486226,-2013051256,61932134,-472654710,-771334519,88508640,50586603,50529541,1049232387,121372770,138174580,171722356,222060404,28920692,-401951744,
62173785,-21867288,1242970818,840725760,-2134442286,326441470,45403902,-1263387416,-1304958968,-386102701,-1269104576,-1305745406,4793994,-1023318392,518521780,1959922354,
-339018001,-402410266,-768429551,-189014549,-167254015,-402410301,-25120255,-33262568,-1261900858,-1309415416,1381104778,4800128,-2146864121,50350398,11993718,856031672,
-1978091831,1241532950,1521602792,488424281,943142186,1961101894,-117081853,18213315,2134506624,853314295,-2020987137,116824863,1963458583,386332392,376767488,116817700,
1946353687,11528451,1509110,-379358144,-58720103,-1207601905,1995150336,1966472320,-1777928687,175374848,9840256,-1795114755,-1073061653,-58695816,-2141293565,1567887100,
1948056704,939294812,116791925,1947205782,-1777928634,91554304,-342490952,-1775861707,871103744,176037948,897343804,830307132,116793124,1946288278,-913551335,247447950,
506322,-1359821686,-2146994856,-50293210,-538386252,-1262225152,-339725710,-343953195,-1683308847,1925718504,1022028745,1019444321,750747514,-2135168224,-697026564,1966472320,
-1777928690,125043200,9840256,-2134643715,158601212,-1976693889,-342140537,-339725675,-1687568751,1925702120,386332297,-2106245120,2112430124,-2139151105,292894204,9832182,
-2146798590,-50293210,1273734324,486310032,116789621,1946288278,-1775861750,-1498088192,-2138032661,91557884,736863668,-997568368,-1047606900,-1879044679,-743981060,1951969010,
1948269602,50102292,-58715524,1007647758,1007254625,839221114,1632448,-998194183,-1326126218,32697328,471538190,724117543,926233651,473336826,1174702336,-2110375098,
-1962642176,989888566,1946163766,473336081,938015488,-1202698985,365793538,1358676824,-402620997,-1017580555,1183449524,374243584,1388511233,-1476380184,-1329374656,-1341985904,
-515839984,-152546621,106334975,58053130,604301504,1958742543,1996766215,32241667,-389850375,663403882,-1022311178,48991920,266866352,378258401,-1024065520,-2146274303,
158646498,1967192704,-352144888,-352210425,-117394941,-1963160893,-469105050,-524287116,-1895430140,-1008236032,1720384650,1961101830,81838083,102813942,-410386289,-1598016573,
1720320143,1961101830,82362371,-1023406299,-1974316208,115916996,-301729862,-1979675744,-1061149480,-1007287064,201487361,-1058766847,646504458,1532625035,48808792,-386173707,
-1007895336,1978988776,-1127290629,-1007761526,-2044949722,-1251077,-404161658,-397360129,1253513658,-1962943000,-406845570,108923394,-385887768,292887183,-1090517063,-1175977918,
1191545087,115931362,1093044224,-1597810688,-1062731710,145237876,-2135686028,646586859,-990511037,-805014480,-166401044,74712004,200000766,1954596086,-352013310,-1023364094,
-1912586053,9485275,1972584320,13101315,-1071380598,168224960,-28216128,-1289456184,-1272466171,-1273770752,14674036,-1325135432,-841862399,-385650157,-58720124,168064260,
-1266977344,-1273770752,12576919,-1205287552,28378121,332255795,-58702221,168064260,-29526592,-2139392821,-1209325075,-315488845,332202164,-1830283340,67221504,-768405327,
477303757,332202164,2129139124,67221504,-768405583,645075917,1182059518,-789854722,-2147446597,192190271,1927808180,-1589855744,-1265609237,6809652,-341758022,45387850,
-1157604120,1065353360,-1173982092,938189077,-1593263472,-1265618453,4450305,-341771334,-823619546,-400329219,-266011179,1006954688,-1594115583,-922873484,1956710586,-1161232886,
57975074,-392086342,1405288579,939561147,-2012580825,-29824985,9375360,-389850362,1752563089,-1057122072,-533068568,-58699660,1007187252,1011315715,-1337756668,-557520845,
-64748532,-527776758,-1125633104,-39786274,947200168,-863969142,-401690592,12246699,-1172391136,-402630215,29225115,216000512,281874356,281870516,-2065252944,867176171,
2145968266,-2030361378,-562173756,-1031057213,-1030827469,-1426032449,1487653004,102654147,-1475370993,-2065276752,-1910767432,4242392,-1943616626,637561110,6760073,6555335,
1638924288,-639073050,-2130086743,268461070,56748288,-1330698008,-947591582,-2147449338,-2012821760,-402653184,-2128172802,872444478,-1592822510,-2036137860,8298752,-385840989,
1459356158,-1945756073,-1144811813,-611450832,-1081930562,196673683,128316160,-1335992545,-393943453,125020800,-2065275728,-2121265173,-2147453378,-2129235200,-2147458034,2082376448,
1981712640,2115930880,2015267072,-1391073280,195917544,-385649472,512426478,-343867274,512295040,512426106,-343867268,512295040,-1868562304,9413120,113640116,-402587502,
512426745,-1014955894,512295040,-1073020794,243339892,65636,6696584,6755977,6885000,-2065275472,7872139,8003209,8265355,8396425,8793739,8439169,
-1577021024,280232079,9569990,44820481,9051787,8920713,309641227,6557313,780664834,378077294,243794031,-2002714511,67110144,725582011,989891870,-1959169085,
50366510,-2130672082,-1593802555,-2103246707,-1895381504,646643456,113639564,-402587502,-1073020207,243339892,131172,7220872,7280265,7409288,4241414,-2135048050,
-389707008,-1123571681,113639552,-1342111598,-402606850,44630885,-2129497088,1140876302,1781434368,1796638976,1829668864,8823040,-150732613,973254883,-1977518910,-1845049630,
921174272,174339,243339892,262244,6958728,7018121,7147144,184584353,86537408,-470350848,-494268240,9569990,50849793,1946157737,1678672146,-2013263872,
-1996459474,-2013236458,-1593805554,327816,1065401092,9248299,611566395,-1275032416,-1845049602,-756547328,174338,243339892,524388,7483016,7542409,7671432,
-2065275216,8789643,320768294,-2011264256,-1968132096,-604903197,-410340944,-1310987544,1678178048,1946189824,-402542334,1739630758,1048675558,41943174,-1280307598,215729640,
-1327461760,-608048973,116851380,-65436,62128756,-1326936144,-429346597,-1335827324,-396040672,1692668552,-93060696,-527802140,-1341862784,1348789856,1477604328,1625736330,
-1340970008,-194713858,1773207019,12289254,-1878463744,-2065274192,-1207959109,-661782464,6887054,6760075,-308615085,1977289563,10021123,-2065273936,-1910767432,1678178264,
1946157312,-310450154,243985714,-242548634,6885002,6755979,-139980056,67134470,-401181696,-315429536,6950538,243986827,378208365,166199403,1678178216,1946157568,
-314382314,243985714,-242548626,7409290,7280267,-139995416,134243334,-401181696,-315429596,7474826,243986827,378208373,-840433549,1678178215,1946161152,-318314481,
-1157627718,448378508,-323360768,6555383,410320895,-135467032,1073767430,-385649664,1642397477,74760360,-2065271632,-1326069016,260367980,127995817,1405313311,1840306314,
-1014332186,1857083530,-1014332186,8396427,8003129,243345014,8388708,8003211,8527497,-1962914584,956335134,1929412638,-2145481980,-1977710336,-1875842304,243341428,
8388708,8527497,-1962923800,-1996454882,-352286178,-1336897514,1485104751,8527497,-1962929944,-1996454882,-134182370,24428555,1405311993,1890584151,646481126,-997588916,
-125049806,-2147483461,16814654,1085803125,-1950315008,-1521620795,8535683,-1207143168,113704960,132,-1342142743,-1199249807,-1064435640,1431787091,939560864,1996508166,
-776673275,-169344021,1583308208,-1979026597,-1207940050,1441464321,1086555024,1397839868,4988554,855640249,-775932929,7643,-1963531605,-1207940066,-1007288320,-1207733246,
1537933569,1048600409,1962999954,4241420,-980696946,-857160957,-2111948380,-1207535872,166395904,1275494544,2129199360,-2078373377,1940934656,123241702,113466207,-1336913065,
1485104754,1342196898,-1912584005,571843,-13379446,-607010765,-1358954467,-186500235,-469399002,1958783073,868233734,1194847231,-469398746,1958783073,-1077923321,652935169,
9584256,-1206946559,-1064435648,1074120075,-387413248,-346512305,642731816,108332338,624043591,-970537846,-930480123,4992650,-2065269584,-1547334824,-678756220,-352320840,
985726481,-385648928,-12714118,-1191676928,1599799296,216580871,-1511458289,242613221,-124779848,-386263603,-1862539880,909899892,74776706,8402571,1717897,-454507525,
2112420366,-1597768731,-2134704105,594804988,1977617725,470661125,792533483,-1207601696,267072815,2005204096,1961901071,1977629707,-1107251198,49020927,-158992845,16548035,
-264501644,11534965,512381891,-1014366184,-478121180,98811908,646628106,-461373290,-1595930100,-1017446377,1534395708,1996750720,536576086,-397323913,-76214556,9905792,
250276079,1625748400,-150995015,268474118,-136180875,-1341204504,-345970956,-1759084508,-907481344,-1060664818,-1022753312,-4628250,-1761151233,158666752,-1310132254,-420171762,
-1759084448,-1017528576,473336826,1175226624,-2110375098,-1962642176,989888566,1946163766,473336073,-121622016,28312555,1355021305,1601439804,1735657788,376815748,-1088125212,
-1071349748,-570029522,780592743,1742612106,-922849557,-2031872395,-2146648284,170836004,-429400826,646590086,1424713693,209045758,2133100260,-2031730676,1156251828,1333119230,
11831012,91504808,-461315958,-431999937,-466752634,209659014,-1266227520,-2094929152,728891897,1999829379,3323942,1077985579,-2031820662,-2146648284,-1005928412,15435494,
-419786064,16547915,-997587852,1492863718,-1467554621,-1475840704,-1274776192,-1473385720,-1272875712,775889920,1742603834,28581492,-586794450,840266855,3324388,1094830123,
149621172,-2136471372,45351541,-466434934,346286275,141885364,547881140,28574324,-466434934,1012988867,-385649150,-326958838,-1930654920,-1899983152,872254424,3717568,
-175396109,638614669,-64057,122013222,1170613888,-970588154,647103813,148935,1170613760,2089664516,96937496,-970522625,637536069,411078,88458790,-1143960430,
-470351856,-763312893,3671296,637588096,637683081,855922056,13822171,-1796668557,947686656,604342822,1950366912,1179043335,8513792,-402652485,2037514420,172377738,
-1923255104,-561311620,-401050483,-208994194,788521151,-147964533,-1928396795,-14272388,637957173,-335608378,96871940,-388287492,2089615469,93267512,309643518,-1088061402,
-402652485,762445913,38160070,-2144983061,45826061,4712448,1187388274,367722822,641236109,-478143094,-972655552,-352238010,1179043332,952402690,-1008552863,-13238276,
1979646581,108396292,-218102599,149848997,-1895239805,1150223940,38047492,-1916599153,-1993992068,28901981,-846744576,2089665301,1569269264,112898,365791156,-61,
1430346987,1380927572,1094918227,1194539330,859390540,961763154,1128940595,1347302201,692267074,2037411651,1751607666,1329799284,1363234893,1836008224,1702131056,1866670194,
1919905906,1869182049,959520878,942420536,876096563,741685292,-382978504,837474889,686817422,692273960,1866679081,2037411951,1769108089,1751607145,544502888,1329808160,
1347243343,1363231056,1126178897,1836019523,1970303085,1702130805,544371301,1866679072,1886548591,1919905648,1952538994,1869179252,544108143,959525152,842545209,942418994,
741552952,876099628,942418996,741684536,909654060,942418998,758593336,1816215853,543976556,1769108000,1751607145,1937011816,1914708083,1936024946,1919247731,1702262386,
778331237,-435310546,-434982780,-1172131765,-1276247992,1894400,1273369264,-2065297744,1273402032,1253712560,-2135691776,-1342175768,-1018435950,-1979645767,-330570045,1038934154,
410320930,-1833897502,313543654,-1933882394,1620406,-371107139,-18094435,-61,-1,-1,1358954495,1084776932,-816315787,-2048523856,-2065296976,-427773700,
-419450768,-392042975,1642332420,-527702990,-337537347,-24407983,41077899,-930298370,-1064380274,-1912590152,16825552,-390642754,-310116144,1404962932,13035703,-91805717,
-754973511,178666,-1962892568,65176023,309504,-1342138648,-854674400,-1177406704,-1998061566,-175377408,-13369421,-371068227,-292837980,-661733325,126606131,1642334089,
1642465292,-4983413,280887091,-1517884958,1642393227,1642526500,1084776932,-523404,4241637,1049352334,-406780909,47878,-1908408135,-1376557349,1084776932,-1014952843,
-549777408,-1070339466,-208935425,-13380213,-371042627,-359946866,856679296,-804998702,1107653595,-768345630,283508729,653758976,76735083,1983462448,-1274608638,-502215410,
179094508,-1274645312,-351220466,803783669,237466896,-1900006625,4243392,-1418648415,-1418647903,-1593803585,-1582599896,-1079283414,748749068,782347121,129739633,243712,
-356314931,-268377749,2011696816,-1327461678,-764352492,57999784,-1977561984,1958783172,536918547,-1179082565,1491599446,302940388,1122762496,292823208,-1155530566,1455012000,
-465442816,1183360,268891903,292880640,-1155530566,465156342,-467015680,1183360,1947248895,536918545,-1179053637,350748696,302940388,1625620224,1692844208,-385876039,
1692708440,125043368,669775330,-385876039,1692708424,74777000,401339874,-2136448796,12194165,-1185170656,-402631239,243327959,872349714,-322508563,-392887950,-1070399443,
1181194,115868532,302433792,1623392256,-1157627718,414824771,-475404288,1946500245,4974595,1181382,-87858944,-47963676,856039910,650153664,2367115,604423974,
-68950528,-496506797,512304731,-1341718492,-1184569760,-1041694721,-1469782867,-503155710,-431640331,-464469152,-434065312,-1261479904,-2145989376,-143311876,-61,-1,
67187455,8388608,0,285290752,67266304,8388608,0,285376000,100820736,8388608,0,285370112,134479872,33554432,0,285474560,
100903936,33554432,0,285453056,84064512,8388608,0,285390848,134336000,16777216,9,285343488,84122880,8388608,0,285449216,
251888640,-65536,2048,285442816,84136960,-65536,0,285463552,117677312,8388608,0,285449216,151231744,8388608,2048,285449216,
134374400,16777216,0,285369088,67359744,8388608,0,285463552,0,0,0,0,67265536,0,0,285369344,
84136960,8388608,0,285463552,84133376,8388608,0,285459968,184742400,-65536,2048,285405440,84073728,16777216,0,285400064,
117628160,16777216,0,285400064,100869376,-65536,0,285418752,134454272,-65536,7,285449216,235128320,-65536,2055,285459968,
268682752,-65536,2055,285459968,235142912,-65536,2055,285474560,168019456,-65536,2055,285459968,268626944,-65536,2055,285404160,
100869376,-65536,0,436413696,67266304,8388608,0,419587840,134375168,8388608,0,419587840,151226624,8388608,2055,419662080,
134409216,-65536,7,570616832,117687808,-65536,7,570672640,134465024,-65536,7,570672640,151242240,-65536,2055,570672640,
84133376,-65536,7,570672640,268591872,-65536,2055,1057121024,184811264,-65536,2055,553910016,251920128,-65536,2055,570687232,
251920128,-65536,2055,553910016,268697344,-65536,2055,1057226496,67314944,-65536,0,436413696,33760512,-65536,0,436413696,
134409216,-65536,7,553839616,100854784,-65536,7,553839616,84133376,8388608,0,419677696,200015616,-67106672,7340033,-2097152000,
-50657596,-2065297488,-2048524112,-386938950,-628166725,-2065253968,1358955449,332202164,-1183055685,28835841,1494469890,208814707,-1,-1,-561714689,-1146036766,
-92240666,-1339591552,-839325682,511000744,1086053004,-1965322752,-1912572626,1961691866,1963501581,-423972855,8436356,416130795,1971372790,-941075682,-2065409043,-1804288708,
163121035,-201618688,-1105300049,1072206685,-1325470976,-387937741,-81474134,-1461140346,-21003827,1974097153,-1467554619,-1475840640,-1341885120,-1337203054,-360388932,31744,
-83442557,-393014082,11796486,432871117,1017917180,-402295772,-169091079,-1104335677,-1959854112,76230196,1947140265,-1877218557,-2134842240,309608700,772475624,1742538438,
113651234,-400267298,-1950151936,2210291,1973941094,-210417140,-930352245,1957163878,82805511,-117117309,-6657,-50593793,-1957341666,4243180,-461054322,1441270645,
-192419596,-1276512140,1976368640,172917033,1719730752,-385876470,58061924,-402612759,91616361,-336318488,174490094,1317142463,-385875702,-855768954,1256719733,-25302028,
-402295348,1961620642,41274622,-855740693,-202898059,-2140804108,141888508,-386664472,1491858523,1963785344,172917022,1719730752,-385876470,1148515336,-2114698520,-4257178,
17452673,-2143950080,91557372,-336315672,-335773653,-689437323,-2145260556,91614460,-336236824,-302219241,-1528298123,-2146571275,91615228,-336220440,233603075,-820027811,
1085820958,-1193767424,-1595474165,-1065049884,-527823756,-1005936156,-1595498010,196089579,551821542,208978052,78176394,568591989,568771594,1962933376,-434065404,1797687328,
-820029440,7911761,-402393926,-1460885428,-502893184,149682678,-1472272240,1084769004,-15527,1926651112,-727390190,-1192751758,-402099497,57858066,-1008166168,-1342001176,
-396040531,-54328664,-1157226912,-611450816,9832182,-467962752,1974156384,-1777434614,645939200,-1333854058,-81730016,-369098819,116785453,1950351510,1012982849,-2132249279,
-1090480602,9834112,386826256,-1336926208,-881793010,242565288,1743269040,1967171787,388399109,-1336353024,-81730016,-2147371288,-553609690,-369098819,398393573,-8591360,
1625610378,-850414343,48405,548407410,-369418010,-527826743,1967537232,403109397,242550784,1943454440,548469257,-369418010,548405410,-2131025690,125165820,9834112,
-2145654014,125166076,9834112,-2146440447,175439612,1979382912,-1760657399,-346550272,-1310158722,403109376,1702103040,-58133,-1,-1,-1,-1,
1913047039,-384683008,-58657327,-2147126188,125162748,1509110,-2143914744,477382396,1967520896,-1777928697,678756608,1926455784,1392279587,-461103500,250288760,1509110,
-166824696,67114758,645924724,-336134120,-24057853,354846808,1042432,-2063546648,1629423597,-386268043,1355743266,9840256,-1777928451,309592320,-2139102080,91506172,
1948122240,-1775861755,-1017577984,18802768,1692839600,379634520,-684660736,-58714252,-33262258,-2146964544,158681852,679004414,-352315742,354826787,-2143128576,91499260,
1966537856,-1777928697,829751808,1964899456,-1777928697,628424960,561570948,504027955,427032598,1348592720,1642527780,201330664,-396237310,1967849480,1642485999,1397801816,
1139146928,-662028060,-125157148,1139146928,-527810332,-528072476,-2116539565,1526799867,1482418806,396382403,82362368,646580004,-461373289,1959016967,-1759084532,101251072,
48758935,1354979328,5433425,645942645,-386989929,-307232680,-4628250,-1761151233,192221184,1172895714,-420171776,-2144867488,-285173978,-1610598424,-390070249,-2147015676,
-134179034,9897480,-4628250,-1761151233,41226240,645986274,1505689751,-95370408,201365408,-1761180096,-79648768,-1185823912,1692673808,-85982552,-15527,889192447,
-1060551223,-1058225940,-1494359572,1223468780,2089903007,948965519,508951456,1381390086,-1957670063,-1900006420,2016855256,4241408,113694862,-2113994688,16651878,-1979627894,
-58718618,1008431874,1008432920,1007056392,739471893,853051916,786682367,-331376641,20711403,1072230262,1552557799,1075742722,374243584,1532690944,1600019033,-815980793,
1973608936,-1550194673,602409586,-2130349056,71246,-435769149,180367882,-1190300444,28442628,-499457328,58063584,-1008931096,33652352,1183524981,1096460,1174660087,
13796098,1930361472,8292881,-617414910,-763116797,251297792,1187382386,1048577025,1946157121,1094615054,125044992,182244584,858289636,4623040,55347750,-754941766,
1222834146,115918987,1942160349,21400081,175441064,1317079476,-352321258,1005097082,846492929,22973183,-1959861295,-420490873,-352145397,-1978997248,-414652164,-1965229592,
1072170878,75401959,-2081998360,1072169926,-2142877977,1963262334,-415963131,-1952441621,605796096,-1224182592,1967171619,-399853822,2089477906,-418584575,-402264445,393544135,
-1090517063,-152567742,-386173733,-1997757492,-220051707,-1998112536,-402636506,-469041417,1448156867,1096188,-661733325,1449045235,-1207955271,-661778432,1499376883,-1583028193,
-1947703691,-165180765,225775812,1971846272,65830915,-2011970432,-428546009,199641776,-385876039,78699561,1727456306,1942160128,-351685628,6613038,45100661,1303841510,
-1964604952,-406845570,108923394,-2082048536,2078802886,80118758,-2082048536,1525155822,-2129758977,71246,4269704,184444648,-504839196,6601178,1960527080,-1258692090,
-401020032,129016596,108956398,-387566104,125108467,-1476339480,-1014975296,1317667248,-2065640954,1962950150,1040582683,-1562318848,280518,1962916840,1013982219,-394300048,
2054553520,-388329496,663397062,-167426422,41164996,1334501584,988033540,-2007010111,-1152187321,1340604420,-1208329257,-439031793,-1073250678,2114585319,-439818234,-1969057304,
-1075313537,2095643621,859010304,1552557787,21400073,74711868,343213372,-1572607917,-2146127781,41222908,-667283536,-1014627725,57989899,-388562456,-1062731723,717439156,
707406378,707406378,707406378,707406378,707406378,1344940586,4241438,243325070,-1333788610,-1205803488,365793537,-1211148257,-447682552,-352320839,4366851,-488293400,
4366584,28899523,1930808720,1040643595,460619776,485221426,-1191181125,-1070383863,4065014,-401771136,-186474000,-387156661,-2135631279,4073088,-1008465281,707406378,
707406378,-550884822,251798786,-162201829,367593487,1256605337,-1209646395,-454760445,-1008407064,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,352092415,-58718350,-1271695937,-326370284,-1912586050,269912798,820150272,
-2135424834,58011898,-1951399746,-1912577258,-1950054714,-2117826832,-788463642,-1795215642,-1947625530,503774119,1398167381,-347057583,-76,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,170731576,471402015,117835522,0,173690993,471402015,117835522,
0,170731576,1885603455,117833986,0,257052769,421070361,202050818,0,170731576,471402015,117835522,0,173690993,421070361,202050818,
0,170731576,1885603455,117833986,0,257052769,421070361,202050818,0,0,0,0,1342578261,1448235347,-421482409,-907477884,
47873,-1897922376,-1437222696,1595,-315467147,134794,-1106648639,1340604416,-1958120191,1223459801,-796070773,-41172850,1220132915,-1951730944,276598261,71681574,
96937486,-970522625,-1919285947,-970581892,654181445,-64057,88458790,-1954040686,-840314421,1220838165,-2065243728,-2065243472,-1900019528,-1437222696,1595,-1557643,
842429696,34507501,165789952,1006632888,723940568,1925266371,264471328,-990335,738197432,1925266371,48656,1962983912,-387329784,333971618,17426432,-402623256,
1583284457,1482381658,-1017307385,16115742,-1912602440,-1899459392,4243416,-1559917786,-947687132,93005314,-1049549149,-1014954773,-1993940992,8175389,-1559917786,-947687128,
93005314,644950691,213851529,93005313,-2089735005,-1960443193,1898881797,-1340241626,528803555,243985714,-507445246,82034953,-2084316925,527696123,-3964597,14909711,
216777200,721424568,-268387901,-524303986,1032529663,-1023047642,855665384,-536823562,-74727282,243985714,-507445246,-1012534520,861032784,-805131054,-763036702,-1017620134,
1465255454,-1073694383,-315440754,34507302,165789952,-1961432701,-1899393799,-533807399,-218102855,1583307175,1405296391,1348926643,-90438059,-54657229,-1801786894,1717372829,
-466461864,-21802045,-1286347541,-387978241,-4980699,203690100,205259188,45353076,41223336,-997588812,1355015218,-117511942,1692836784,-87860997,-1325861912,-463149395,
1946265700,-345971708,-119346954,1692837296,1375263720,-467201863,-519985052,41179642,-1672453916,-1325873176,241493678,-352320536,1489997826,-15365,16777216,33554432,
67108864,134217728,268435456,536870912,1073741824,-2147483648,65536,131072,262144,524288,1048576,2097152,4194304,8388608,256,512,
1024,2048,4096,8192,16384,32768,1,2,4,8,16,32,64,128,0,-16777217,
-33554433,-67108865,-134217729,-268435457,-536870913,-1073741825,2147483647,-65537,-131073,-262145,-524289,-1048577,-2097153,-4194305,-8388609,-257,
-513,-1025,-2049,-4097,-8193,-16385,-32769,-2,-3,-5,-9,-17,-33,-65,-129,-1,
-2065269328,788521150,-147966837,1947140100,32565507,-2132410192,369168174,537855870,68864,-369090033,2684076,-1912600392,-1973295912,-435680032,41057,1642520710,
-2134842240,57950460,-2147382551,1073742350,-1912588104,536918464,-211356109,-1174622938,-13426688,-1431652250,-211375446,-661952853,-1912588104,-1175047208,-1385816064,1958951782,
9824515,-352160695,536918513,-1201209549,1840672182,1722544998,951638155,869830144,536918518,996584806,1231975875,-185925004,857735353,1438148351,1716868437,-1956205581,
3717336,-164374386,1713373369,-1019517267,1950959477,-1191908606,-661782480,-1192003397,2092564484,-1107348736,552203629,8174081,-369789251,-13434601,-1124041542,-1964378751,
-1172933902,-1933770628,-226498059,-75429006,208991228,-336331589,-436096826,10217856,-1912600392,645932736,-1195442174,-1064435648,-1157626696,2092626808,-1107348736,-857082431,
8174080,-369767747,146276547,-1899918336,243279552,-1908408318,309441,855669946,-169361921,1928471785,8174256,-369757507,-1519193575,-1157626696,2092626940,-1107348736,
-1997933051,8174080,-369750339,146276479,-1899918336,645932736,-1900085246,309441,855669946,-164905473,1928454377,8174091,-369740099,57930197,-1191223575,-661782520,
140928,444095,-2132476928,91553852,134784,1095744,-661733234,1711284239,-475,2232191,16149994,17772272,-469269474,1946172544,-1177406709,-793051117,
-792598346,-2065269072,-2132361166,-1175221309,-211419103,-176862555,-930352245,-5901466,862330597,28862189,1711276032,12174643,-1627442368,1724961126,-453385557,-435418015,
-420273055,29058657,1711276032,-1956192973,857671365,-1175155978,-427147264,-741251426,1727302303,-1020041555,343273697,1084776932,47206,141885440,-1451602586,-1010814177,
1342178502,202138084,-215719450,1717068262,427147275,-2037398296,266633440,78771763,91479248,872014406,-339725578,82739985,-1476393799,1711764991,1174988993,-930417182,
-115353973,253649091,-1331687512,-1199249803,-661782464,6760073,6887052,-1342177095,1367664246,1502182376,-914356620,9496833,-2065270864,1507537745,108321547,-352138880,
-1047883775,112492774,41208074,2024802228,-464485146,-434065312,-191698844,27813092,1625619060,-863969142,-2115481596,1622169844,-397384474,-1973881736,1482745540,-1998024784,
-194320195,1692860080,-1325536268,-125507975,-1332738325,-108730758,-1912586056,1763086040,1730579200,-352095744,-2132504535,-1040791414,-1173523454,-1933901824,1751478,-187742488,
1946272246,47629,-1179218757,887619610,2075194575,-1592818458,1629464847,47299,821566927,8781824,-256,-1,-1,-1,-1,-1,
-1205928961,-661782464,520098721,-1506613041,707406543,707406378,2147254314,-58700682,-2145946432,1114870524,-2114417833,-1048641305,-13760529,-336034667,-1084780537,-336883200,
182879,-121308990,-1587939130,-121069095,-1563188594,-1532189539,-121702210,-121702210,-121702210,-120784694,-58677880,-117148337,-83885366,-889616716,855310338,1600111588,
-152311573,-219417365,-286527253,-466460833,536932815,554180881,553722116,-1592680193,-1593663120,-1778409215,-893741638,567923929,-872802310,-738733065,167772407,1018,
992,-436162360,-436162428,-1643989883,-1001222,-1192230641,-661782464,78144740,-359767435,-2065301072,1692838576,-452984903,1963042916,-336010747,45125693,1625588966,
-2065300560,-2065300304,-1897922376,-2116340776,1968548415,-109658872,-47251666,-435834632,-939476860,-617359218,1437220737,1992099957,788475641,112261377,1085834470,-1193767424,
250281984,-2065299536,1894158256,15401195,-661949980,1894158256,15401195,1910898864,1963588480,-1433081597,-2065299280,1963654016,-1873286397,-236535758,-1896873800,-1093520424,
196737233,-796218368,-102568276,-1191141190,196083720,-1073025810,548406644,-2081168658,91496698,-352313158,-436162330,-1331632608,-2138774007,41290747,-13500237,-1959861296,
-1191647305,-661782464,179365631,1085834470,-2585088,-1342150866,-1333467637,-350165472,-435375895,610395268,-1335761165,-848239090,-231,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,65535,0,-2122448896,-1715633755,-8487295,
-406585381,-26444033,947715838,940572688,947715708,2084044816,2097086008,269515832,2097052728,31800,406600728,-65536,-406600729,1006698495,1715618406,-1006698436,
-1715618407,118489027,-859013873,1715239116,406611558,859773054,1882206271,1669325040,1734566783,1520025830,1021830972,-528443046,-520552712,235012224,239009342,1008205826,
2115508350,1717966908,6710886,-612433818,454786011,1665007643,946629688,30924,2122186752,1008205950,1014896766,1008271128,404232318,404226072,1014896664,402653208,
403504652,805306368,811662944,0,-20922176,603979776,610729830,402653184,-33220,-16777216,406617855,0,0,2016411648,3158136,1819017264,
108,1819017216,1828613374,2083520620,-133400384,-973078480,1714428108,1815609542,-857967048,1616904310,192,806879232,811622496,811597848,806885400,1711276128,
1715273532,805306368,808516656,0,805306368,24624,64512,0,805306368,201719856,-1067438056,-964951936,-420028722,1882194044,808464432,-864550660,
-866109428,-864550660,-871614452,1008468088,218025068,-1057226722,-871625480,1614282872,-858982208,-855900040,808458252,-864550864,-859014964,-864550792,403471564,805306480,
805306416,805306416,805306416,806903856,811647072,24,-67108612,811597824,806882328,-864550816,3151884,-964952016,-1059135778,2016411768,-855847732,1727791308,
1717992550,1715208444,1723908288,1828192316,1818650214,1660813560,1651013736,1660813566,1617459304,1715208432,1724825792,-859045826,-858981172,813170892,808464432,203292792,
-859042804,1726349432,1718384748,1626341606,1717723232,-289013506,-958988546,-423231290,-959521034,1815609542,1824966342,1727791160,1616936038,-864550672,2027736268,1727791132,
1718385766,-864550682,-870551328,-1258553224,808464432,-859045768,-858993460,-859045636,2026687692,-960102352,-285288762,-960102202,1815623788,-859045690,808483020,-956432264,
1714559116,1618477310,1616928864,1623195768,101455920,410517506,404232216,940572792,50796,0,0,808517376,24,0,-864285576,1625292918,
1717992544,220,-859779976,203161720,-859014132,118,-1057174408,1815609464,1616965728,240,2093796470,1625356300,1717991020,3145958,808464496,786552,
-871625716,1625323724,1819831398,812646630,808464432,120,-687931700,198,-858993416,204,-858993544,120,2087085788,61536,2093796470,7692,
1617327836,240,209240188,806355192,875573372,24,-858993460,118,2026687692,48,-16853306,108,1815637190,198,2093796556,63500,
1680906492,807141628,808509488,404226076,404226072,819986456,808459312,-596246304,0,268435456,-960074696,1408958718,-13443958,523137,-472840329,-2052587730,
1541681918,-644039217,496825500,1922912413,-241325411,645988253,-839909313,-434065380,525883936,1380982479,-1912586056,1812398040,-16485120,-2097123834,402681406,-1330113675,
1812343552,-1559595776,1856176236,1889681408,4235264,527826748,4130550,-468159481,1954588806,1950394386,-432069618,-426594170,-576704949,-28645785,1962950670,-1173573474,
-152173582,117456646,-2031842188,-2039119704,-2106244952,-2031697908,1273402032,-34839,-369098753,-5670,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-805306369,-768401824,399311540,1954596086,4242258,28367758,16778886,1131675964,-1912870661,281874356,-1269699446,1494273283,
-1261292718,-1273967358,-401552120,393383402,-717569282,-689377934,839676557,-2134442286,-546170370,445499624,45374153,-1996877619,520159246,-12447,0,196608,
-1,-1,-1,-1,-1,-1,-1,-1623725569,2143190966,541733959,1329804080,1363234893,16319978,825237744,792212015,-1728301000]
};
; ROM BIOS for Compaq DeskPro 386-16
; Rev J.4, from parts 109592-001 and 109591-001, dated '01/28/88'
; (C)Copyright COMPAQ Computer Corporation 1982,83,84,85,86,87-All rights reserved.
;
; Listing produced by NDISASM, 2015-Apr-04
; Additional post-processing performed by the PCjs TextOut module
; All post-processing, comments, etc copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
;
; This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
; at <http://jsmachines.net/> and <http://pcjs.org/>.
;
; PCjs is free software: you can redistribute it and/or modify it under the terms of the
; GNU General Public License as published by the Free Software Foundation, either version 3
; of the License, or (at your option) any later version.
;
; PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
; even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License along with PCjs. If not,
; see <http://www.gnu.org/licenses/gpl.html>.
;
;
; Overview
; --------
; This 32Kb ROM image is ORG'ed at 0x8000, because most of its code is designed to run
; at real-mode addresses F000:8000 through F000:FFFF.
;
; And even though the 80386 resets with CS:IP set to F000:FFF0, the physical base address
; of CS is set to %FFFF0000, which means the ROM must also be mapped at physical addresses
; %FFFF8000 through %FFFFFFFF.
;
; Additionally, DeskPro 386 systems mirror this 32Kb ROM at real-mode address F000:0000
; through F000:7FFF. And that region is similarly mirrored at physical addresses %FFFF0000
; through %FFFF7FFFF.
;
; In other words, both 32Kb halves of the last 64Kb of both the first and last megabyte
; of the 80386's 4Gb address space are physically mapped to this ROM image.
;
; Finally, the DeskPro 386 has a "RAM Relocation" feature that allows 128Kb of RAM at
; %00FE0000 through %00FFFFFF to be mapped to %000E0000 through %000FFFFF, effectively
; replacing the ROM in the first megabyte with write-protected RAM; the top 64Kb of that
; RAM must first be initialized with the 64Kb at %000F0000 prior to remapping. It's also
; possible to copy external ROMs from %000C0000 through %000EFFFF into the bottom 64Kb of
; that RAM, but this is only done for ROMs known to contain relocatable code; eg, a Compaq
; Video Graphics Controller (VGC) Board.
;
; Every DeskPro 386 system must have a MINIMUM of 1Mb of RAM, of which either 256Kb,
; 512Kb, or 640Kb can be physically mapped as conventional memory (at the bottom of the
; first megabyte), with the remainder (either 768Kb, 512Kb, or 384Kb) physically mapped
; to the top of the 16th megabyte (ending at address %00FFFFFF), the last 128Kb of which
; is used by the "RAM Relocation" feature. The remaining memory immediately below that
; 128Kb (ie, below %00FE0000) can only be accessed by special system software, such as CEMM.
;
; Compaq refers to that remaining memory as "Compaq Built-in Memory".
;
; As the Compaq 386/25 TechRef explains:
;
; A data structure in memory indicates how much of the COMPAQ Built-in Memory (F40000h
; to FE0000h) is [available and] in use. This memory is allocated downward (decreasing
; addresses) starting at address FE0000h. Applications developed specifically for the
; COMPAQ DESKPRO 386/25 Personal Computer, such as CEMM, read and modify this data
; structure to allocate and deallocate portions of the COMPAQ Built-in Memory for their
; use. The built-in memory data structure is located in write-protected memory at segment
; F000h. The offset is specified by the word at F000:FFE0.
;
; The format of the data structure is given [below]. Because the data structure resides
; in write-protected memory, the write-protection must be disabled when updating the data
; structure.
;
; Word Description
; ---- -----------
; 0 FFFFh indicates that no COMPAQ Built-in Memory is available. Otherwise, words
; 1, 2, and 3 define the amount of memory available.
;
; 1 Total COMPAQ Built-in Memory size in 16-byte blocks.
;
; 2 Available built-in memory in 16-byte blocks.
;
; 3 Address for the last-used byte. The byte below (lower address) this byte is the
; first free byte in the COMPAQ Built-in Memory.
;
org 0x8000
CMD8042_WRITE_OUTPORT equ 0xD1
xchg bh,bl ; 00008000 86FB '..'
xor bh,bh ; 00008002 32FF '2.'
shl bx,1 ; 00008004 D1E3 '..'
mov dx,[bx+0x50] ; 00008006 8B975000 '..P.'
mov [bp+0x2],dx ; 0000800A 895602 '.V.'
mov cx,[0x60] ; 0000800D 8B0E6000 '..`.'
mov [bp+0x4],cx ; 00008011 894E04 '.N.'
mov word [bp+0x0],0x0 ; 00008014 C746000000 '.F...'
ret ; 00008019 C3 '.'
mov al,0xe ; 0000801A B00E '..'
out dx,al ; 0000801C EE '.'
inc dx ; 0000801D 42 'B'
in al,dx ; 0000801E EC '.'
mov ah,al ; 0000801F 8AE0 '..'
dec dx ; 00008021 4A 'J'
mov al,0xf ; 00008022 B00F '..'
out dx,al ; 00008024 EE '.'
inc dx ; 00008025 42 'B'
in al,dx ; 00008026 EC '.'
ret ; 00008027 C3 '.'
;
; Protected-mode memory probe
;
x8028: push ax ; 00008028 50 'P'
push bx ; 00008029 53 'S'
push cx ; 0000802A 51 'Q'
push es ; 0000802B 06 '.'
mov ax,0x48 ; 0000802C B84800 '.H.'
mov es,ax ; 0000802F 8EC0 '..'
mov cl,0x2 ; 00008031 B102 '..'
mov ch,0x9 ; 00008033 B509 '..'
mov al,0x1 ; 00008035 B001 '..'
call x8051 ; 00008037 E81700 '...'
add ax,0x80 ; 0000803A 058000 '...'
mov [0x7c],ax ; 0000803D A37C00 '.|.'
mov cl,0x10 ; 00008040 B110 '..'
mov ch,0xfd ; 00008042 B5FD '..'
mov al,0x1 ; 00008044 B001 '..'
call x8051 ; 00008046 E80800 '...'
mov [0x7e],ax ; 00008049 A37E00 '.~.'
pop es ; 0000804C 07 '.'
pop cx ; 0000804D 59 'Y'
pop bx ; 0000804E 5B '['
pop ax ; 0000804F 58 'X'
ret ; 00008050 C3 '.'
;
; (AL) == block increment (eg, 0x1)
; (CL) == starting 64Kb block number (eg, 0x02, or 0x10)
; (CH) == maximum 64Kb block number (eg, 0x09, or 0xFD)
;
x8051: push bx ; 00008051 53 'S'
push dx ; 00008052 52 'R'
push bp ; 00008053 55 'U'
mov dl,al ; 00008054 8AD0 '..'
mov bp,es ; 00008056 8CC5 '..'
;
; 0x4C is the base portion of the descriptor at DS:0x48
;
mov [0x4c],cl ; 00008058 880E4C00 '..L.'
x805c: mov es,bp ; 0000805C 8EC5 '..'
mov bx,0x0 ; 0000805E BB0000 '...'
mov word [es:bx],0x0 ; 00008061 26C7070000 '&....'
mov word [es:bx+0x2],0xffff ; 00008066 26C74702FFFF '&.G...'
cld ; 0000806C FC '.'
cld ; 0000806D FC '.'
mov bx,[es:bx] ; 0000806E 268B1F '&..'
cld ; 00008071 FC '.'
cld ; 00008072 FC '.'
cld ; 00008073 FC '.'
cld ; 00008074 FC '.'
cld ; 00008075 FC '.'
cmp bx,byte +0x0 ; 00008076 83FB00 '...'
mov byte [es:0x0],0x0 ; 00008079 26C606000000 '&.....'
jz x8089 ; 0000807F 7408 't.'
mov al,[0x4c] ; 00008081 A04C00 '.L.'
sub al,cl ; 00008084 2AC1 '*.'
jmp short x809c ; 00008086 EB14 '..'
nop ; 00008088 90 '.'
x8089: cmp [0x4c],ch ; 00008089 382E4C00 '8.L.'
jz x8095 ; 0000808D 7406 't.'
;
; Bump the base portion of the descriptor at DS:0x48 to the next 64Kb block
;
add [0x4c],dl ; 0000808F 00164C00 '..L.'
jmp short x805c ; 00008093 EBC7 '..'
x8095: mov al,[0x4c] ; 00008095 A04C00 '.L.'
sub al,cl ; 00008098 2AC1 '*.'
inc al ; 0000809A FEC0 '..'
x809c: xor ah,ah ; 0000809C 32E4 '2.'
shl ax,0x6 ; 0000809E C1E006 '...'
pop bp ; 000080A1 5D ']'
pop dx ; 000080A2 5A 'Z'
pop bx ; 000080A3 5B '['
ret ; 000080A4 C3 '.'
;
; Display (AX) as a 5-digit, zero-padded number in the top-left corner of
; the display, using (ES) as the segment of the video buffer.
;
; The number is followed by " KB OK", for a total of 11 (0x0B) characters.
;
; This function works for both Mono and CGA displays because it writes to both
; video buffers (%B0000 via ES:0000 and %B8000 via ES:8000).
;
; Called by CS:DBD6 in the normal case, where CS == 0x30 and ES == 0x40.
;
x80a5: push bx ; 000080A5 53 'S'
push cx ; 000080A6 51 'Q'
push dx ; 000080A7 52 'R'
push si ; 000080A8 56 'V'
push di ; 000080A9 57 'W'
mov bx,0xa ; 000080AA BB0A00 '.',0x0A,'.'
mov cx,0x5 ; 000080AD B90500 '...'
mov di,0x8 ; 000080B0 BF0800 '...'
x80b3: xor dx,dx ; 000080B3 33D2 '3.'
div bx ; 000080B5 F7F3 '..'
add dl,0x30 ; 000080B7 80C230 '..0'
mov dh,0x7 ; 000080BA B607 '..'
mov [di+0x93],dx ; 000080BC 89959300 '....'
dec di ; 000080C0 4F 'O'
dec di ; 000080C1 4F 'O'
loop x80b3 ; 000080C2 E2EF '..'
cld ; 000080C4 FC '.'
mov si,0x93 ; 000080C5 BE9300 '...'
mov di,0x0 ; 000080C8 BF0000 '...'
mov cx,0xb ; 000080CB B90B00 '...'
rep movsw ; 000080CE F3A5 '..'
cld ; 000080D0 FC '.'
mov si,0x93 ; 000080D1 BE9300 '...'
mov di,0x8000 ; 000080D4 BF0080 '...'
mov cx,0xb ; 000080D7 B90B00 '...'
rep movsw ; 000080DA F3A5 '..'
pop di ; 000080DC 5F '_'
pop si ; 000080DD 5E '^'
pop dx ; 000080DE 5A 'Z'
pop cx ; 000080DF 59 'Y'
pop bx ; 000080E0 5B '['
ret ; 000080E1 C3 '.'
;
; Use INT 0x15, (AH) == 0x89, to enter protected-mode
;
; Returns ZF set if successful
;
; See Compaq 386/25 TechRef, p.4-98 for details
;
x80e2: push bx ; 000080E2 53 'S'
push cx ; 000080E3 51 'Q'
push dx ; 000080E4 52 'R'
push di ; 000080E5 57 'W'
push si ; 000080E6 56 'V'
call x8102 ; 000080E7 E81800 '...'
mov bh,0x8 ; 000080EA B708 '..'
mov bl,0x70 ; 000080EC B370 '.p'
mov ax,0x1c00 ; 000080EE B8001C '...'
mov es,ax ; 000080F1 8EC0 '..'
mov si,0x0 ; 000080F3 BE0000 '...'
mov ah,0x89 ; 000080F6 B489 '..'
int 0x15 ; 000080F8 CD15 '..'
or ah,ah ; 000080FA 0AE4 0x0A,'.'
pop si ; 000080FC 5E '^'
pop di ; 000080FD 5F '_'
pop dx ; 000080FE 5A 'Z'
pop cx ; 000080FF 59 'Y'
pop bx ; 00008100 5B '['
ret ; 00008101 C3 '.'
;
; Descriptor table initialization
;
; Used by x80e2 to prepare for an INT 0x15 call to enter protected-mode
;
x8102: pusha ; 00008102 60 '`'
push ds ; 00008103 1E '.'
push es ; 00008104 06 '.'
mov ax,0x1c00 ; 00008105 B8001C '...'
mov ds,ax ; 00008108 8ED8 '..'
mov es,ax ; 0000810A 8EC0 '..'
cld ; 0000810C FC '.'
xor ax,ax ; 0000810D 33C0 '3.'
mov di,0x0 ; 0000810F BF0000 '...'
mov cx,0x4 ; 00008112 B90400 '...'
rep stosw ; 00008115 F3AB '..'
mov si,0x8 ; 00008117 BE0800 '...'
mov ax,0x1c00 ; 0000811A B8001C '...'
mov bx,0x10 ; 0000811D BB1000 '...'
mul bx ; 00008120 F7E3 '..'
add ax,0x0 ; 00008122 050000 '...'
adc dl,0x0 ; 00008125 80D200 '...'
mov [si+0x2],ax ; 00008128 894402 '.D.'
mov [si+0x4],dl ; 0000812B 885404 '.T.'
mov byte [si+0x5],0x92 ; 0000812E C6440592 '.D..'
mov word [si],0x5f ; 00008132 C7045F00 '.._.'
mov si,0x10 ; 00008136 BE1000 '...'
mov ax,0xf000 ; 00008139 B800F0 '...'
mov bx,0x10 ; 0000813C BB1000 '...'
mul bx ; 0000813F F7E3 '..'
add ax,0xf821 ; 00008141 0521F8 '.!.'
adc dl,0x0 ; 00008144 80D200 '...'
mov [si+0x2],ax ; 00008147 894402 '.D.'
mov [si+0x4],dl ; 0000814A 885404 '.T.'
mov byte [si+0x5],0x92 ; 0000814D C6440592 '.D..'
mov word [si],0x7 ; 00008151 C7040700 '....'
mov si,0x30 ; 00008155 BE3000 '.0.'
mov ax,cs ; 00008158 8CC8 '..'
mov bl,0x9a ; 0000815A B39A '..'
call x81cb ; 0000815C E86C00 '.l.'
mov si,0x18 ; 0000815F BE1800 '...'
mov ax,0x1c00 ; 00008162 B8001C '...'
mov bl,0x92 ; 00008165 B392 '..'
call x81cb ; 00008167 E86100 '.a.'
mov si,0x20 ; 0000816A BE2000 '. .'
mov ax,0x40 ; 0000816D B84000 '.@.'
mov bl,0x92 ; 00008170 B392 '..'
call x81cb ; 00008172 E85600 '.V.'
mov si,0x28 ; 00008175 BE2800 '.(.'
mov ax,ss ; 00008178 8CD0 '..'
mov bl,0x92 ; 0000817A B392 '..'
call x81cb ; 0000817C E84C00 '.L.'
mov si,0x40 ; 0000817F BE4000 '.@.'
mov ax,0xb000 ; 00008182 B800B0 '...'
mov bl,0x92 ; 00008185 B392 '..'
call x81cb ; 00008187 E84100 '.A.'
mov si,0x48 ; 0000818A BE4800 '.H.'
mov ax,0x2000 ; 0000818D B80020 '.. '
mov bl,0x92 ; 00008190 B392 '..'
call x81cb ; 00008192 E83600 '.6.'
mov si,0x50 ; 00008195 BE5000 '.P.'
mov ax,0xc000 ; 00008198 B800C0 '...'
mov bl,0x92 ; 0000819B B392 '..'
call x81cb ; 0000819D E82B00 '.+.'
mov byte [0x54],0xc0 ; 000081A0 C6065400C0 '..T..'
mov byte [0x57],0x80 ; 000081A5 C606570080 '..W..'
mov si,0x58 ; 000081AA BE5800 '.X.'
mov ax,0xf000 ; 000081AD B800F0 '...'
mov bl,0x92 ; 000081B0 B392 '..'
call x81cb ; 000081B2 E81600 '...'
mov ax,cs ; 000081B5 8CC8 '..'
mov ds,ax ; 000081B7 8ED8 '..'
mov si,0xf821 ; 000081B9 BE21F8 '.!.'
mov di,0xa9 ; 000081BC BFA900 '...'
mov cx,0x7 ; 000081BF B90700 '...'
inc cx ; 000081C2 41 'A'
shr cx,1 ; 000081C3 D1E9 '..'
rep movsw ; 000081C5 F3A5 '..'
pop es ; 000081C7 07 '.'
pop ds ; 000081C8 1F '.'
popa ; 000081C9 61 'a'
ret ; 000081CA C3 '.'
;
; Descriptor initializer
;
; Used by x8102 to initialize a descriptor table
;
x81cb: mov word [si],0xffff ; 000081CB C704FFFF '....'
mov bh,ah ; 000081CF 8AFC '..'
shl ax,0x4 ; 000081D1 C1E004 '...'
shr bh,0x4 ; 000081D4 C0EF04 '...'
mov [si+0x2],ax ; 000081D7 894402 '.D.'
mov [si+0x4],bh ; 000081DA 887C04 '.|.'
mov [si+0x5],bl ; 000081DD 885C05 '.\.'
mov word [si+0x6],0x0 ; 000081E0 C744060000 '.D...'
ret ; 000081E5 C3 '.'
x81e6: push ax ; 000081E6 50 'P'
mov al,0x8e ; 000081E7 B08E '..'
call xb544 ; 000081E9 E85833 '.X3'
test al,0xc0 ; 000081EC A8C0 '..'
jz x81f3 ; 000081EE 7403 't.'
stc ; 000081F0 F9 '.'
jmp short x8212 ; 000081F1 EB1F '..'
x81f3: mov al,0x96 ; 000081F3 B096 '..'
call xb544 ; 000081F5 E84C33 '.L3'
mov ah,al ; 000081F8 8AE0 '..'
mov al,0x95 ; 000081FA B095 '..'
call xb544 ; 000081FC E84533 '.E3'
mov [0x76],ax ; 000081FF A37600 '.v.'
mov al,0x98 ; 00008202 B098 '..'
call xb544 ; 00008204 E83D33 '.=3'
mov ah,al ; 00008207 8AE0 '..'
mov al,0x97 ; 00008209 B097 '..'
call xb544 ; 0000820B E83633 '.63'
mov [0x78],ax ; 0000820E A37800 '.x.'
clc ; 00008211 F8 '.'
x8212: pop ax ; 00008212 58 'X'
ret ; 00008213 C3 '.'
x8214: push ax ; 00008214 50 'P'
mov al,0x8e ; 00008215 B08E '..'
call xb544 ; 00008217 E82A33 '.*3'
mov ah,al ; 0000821A 8AE0 '..'
or ah,0x10 ; 0000821C 80CC10 '...'
or cl,cl ; 0000821F 0AC9 0x0A,'.'
jnz x8226 ; 00008221 7503 'u.'
and ah,0xef ; 00008223 80E4EF '...'
x8226: mov al,0x8e ; 00008226 B08E '..'
call xb549 ; 00008228 E81E33 '..3'
pop ax ; 0000822B 58 'X'
ret ; 0000822C C3 '.'
x822d: push si ; 0000822D 56 'V'
call xc704 ; 0000822E E8D344 '..D'
pop bx ; 00008231 5B '['
call x8257 ; 00008232 E82200 '.".'
mov dx,0x0 ; 00008235 BA0000 '...'
mov bx,err201 ; 00008238 BBA6B6 '...'
mov cx,err201_len ; 0000823B B91100 '...'
call xc745 ; 0000823E E80445 '..E'
ret ; 00008241 C3 '.'
x8242: push si ; 00008242 56 'V'
call xc704 ; 00008243 E8BE44 '..D'
pop bx ; 00008246 5B '['
call x8257 ; 00008247 E80D00 '.',0x0D,'.'
mov dx,0x0 ; 0000824A BA0000 '...'
mov bx,err203 ; 0000824D BBB7B6 '...'
mov cx,err203_len ; 00008250 B91900 '...'
call xc745 ; 00008253 E8EF44 '..D'
ret ; 00008256 C3 '.'
x8257: mov ax,[0x60] ; 00008257 A16000 '.`.'
and al,0xc0 ; 0000825A 24C0 '$.'
cmp al,0x40 ; 0000825C 3C40 '<@'
jz x8263 ; 0000825E 7403 't.'
jmp x82e7 ; 00008260 E98400 '...'
x8263: mov si,0xb706 ; 00008263 BE06B7 '...'
cmp bl,0xfe ; 00008266 80FBFE '...'
jz x82de ; 00008269 7473 'ts'
cmp bl,0xff ; 0000826B 80FBFF '...'
jz x82de ; 0000826E 746E 'tn'
or bl,bl ; 00008270 0ADB 0x0A,'.'
jz x82de ; 00008272 746A 'tj'
mov bh,0x10 ; 00008274 B710 '..'
mov al,ah ; 00008276 8AC4 '..'
and al,0x3 ; 00008278 2403 '$.'
cmp al,0x3 ; 0000827A 3C03 '<.'
jz x82e7 ; 0000827C 7469 'ti'
cmp al,0x2 ; 0000827E 3C02 '<.'
jz x8284 ; 00008280 7402 't.'
mov bh,0x40 ; 00008282 B740 '.@'
x8284: cmp bl,bh ; 00008284 3ADF ':.'
jc x82de ; 00008286 7256 'rV'
mov si,0xb713 ; 00008288 BE13B7 '...'
add bh,0x10 ; 0000828B 80C710 '...'
mov al,ah ; 0000828E 8AC4 '..'
and al,0xc ; 00008290 240C '$.'
shr al,0x2 ; 00008292 C0E802 '...'
cmp al,0x3 ; 00008295 3C03 '<.'
jz x82e7 ; 00008297 744E 'tN'
cmp al,0x2 ; 00008299 3C02 '<.'
jz x82a0 ; 0000829B 7403 't.'
add bh,0x30 ; 0000829D 80C730 '..0'
x82a0: cmp bl,bh ; 000082A0 3ADF ':.'
jc x82de ; 000082A2 723A 'r:'
mov si,0xb71d ; 000082A4 BE1DB7 '...'
add bh,0x10 ; 000082A7 80C710 '...'
mov al,ah ; 000082AA 8AC4 '..'
and al,0x30 ; 000082AC 2430 '$0'
shr al,0x4 ; 000082AE C0E804 '...'
cmp al,0x3 ; 000082B1 3C03 '<.'
jz x82e7 ; 000082B3 7432 't2'
cmp al,0x2 ; 000082B5 3C02 '<.'
jz x82bc ; 000082B7 7403 't.'
add bh,0x30 ; 000082B9 80C730 '..0'
x82bc: cmp bl,bh ; 000082BC 3ADF ':.'
jc x82de ; 000082BE 721E 'r.'
mov si,0xb727 ; 000082C0 BE27B7 '.',0x27,'.'
add bh,0x10 ; 000082C3 80C710 '...'
mov al,ah ; 000082C6 8AC4 '..'
and al,0xc0 ; 000082C8 24C0 '$.'
shr al,0x6 ; 000082CA C0E806 '...'
cmp al,0x3 ; 000082CD 3C03 '<.'
jz x82e7 ; 000082CF 7416 't.'
cmp al,0x2 ; 000082D1 3C02 '<.'
jz x82da ; 000082D3 7405 't.'
add bh,0x30 ; 000082D5 80C730 '..0'
jz x82de ; 000082D8 7404 't.'
x82da: cmp bl,bh ; 000082DA 3ADF ':.'
jnc x82e7 ; 000082DC 7309 's.'
x82de: push ds ; 000082DE 1E '.'
mov ax,cs ; 000082DF 8CC8 '..'
mov ds,ax ; 000082E1 8ED8 '..'
call xe282 ; 000082E3 E89C5F '.._'
pop ds ; 000082E6 1F '.'
x82e7: ret ; 000082E7 C3 '.'
x82e8: push ds ; 000082E8 1E '.'
mov ax,cs ; 000082E9 8CC8 '..'
mov ds,ax ; 000082EB 8ED8 '..'
mov si,0x8000 ; 000082ED BE0080 '...'
xor ah,ah ; 000082F0 32E4 '2.'
mov cx,0x8000 ; 000082F2 B90080 '...'
x82f5: lodsb ; 000082F5 AC '.'
add ah,al ; 000082F6 02E0 '..'
loop x82f5 ; 000082F8 E2FB '..'
jz x830a ; 000082FA 740E 't.'
mov dx,0x5000 ; 000082FC BA0050 '..P'
mov bx,err101 ; 000082FF BB5AB7 '.Z.'
mov cx,err101_len ; 00008302 B90F00 '...'
call xc745 ; 00008305 E83D44 '.=D'
x8308: jmp short x8308 ; 00008308 Hang the machine
x830a: pop ds ; 0000830A 1F '.'
ret ; 0000830B C3 '.'
xor [bx],al ; 0000830C 3007 '0.'
xor [bx],al ; 0000830E 3007 '0.'
xor [bx],al ; 00008310 3007 '0.'
xor [bx],al ; 00008312 3007 '0.'
xor [bx],al ; 00008314 3007 '0.'
and [bx],al ; 00008316 2007 ' .'
dec bx ; 00008318 4B 'K'
pop es ; 00008319 07 '.'
inc dx ; 0000831A 42 'B'
pop es ; 0000831B 07 '.'
and [bx],al ; 0000831C 2007 ' .'
dec di ; 0000831E 4F 'O'
pop es ; 0000831F 07 '.'
dec bx ; 00008320 4B 'K'
pop es ; 00008321 07 '.'
mov ah,[0x49] ; 00008322 8A264900 '.&I.'
mov [bp+0x1],ah ; 00008326 886601 '.f.'
ret ; 00008329 C3 '.'
push ds ; 0000832A 1E '.'
cmp al,0x3 ; 0000832B 3C03 '<.'
ja x838c ; 0000832D 775D 'w]'
push es ; 0000832F 06 '.'
mov bh,[bp+0x7] ; 00008330 8A7E07 '.~.'
mov ah,0x3 ; 00008333 B403 '..'
call x83db ; 00008335 E8A300 '...'
push dx ; 00008338 52 'R'
mov dx,[bp+0x2] ; 00008339 8B5602 '.V.'
mov ah,0x2 ; 0000833C B402 '..'
call x83db ; 0000833E E89A00 '...'
mov cx,[bp+0x4] ; 00008341 8B4E04 '.N.'
jcxz x837c ; 00008344 E336 '.6'
mov si,[bp+0xc] ; 00008346 8B760C '.v.'
mov ax,[bp+0x10] ; 00008349 8B4610 '.F.'
mov ds,ax ; 0000834C 8ED8 '..'
cld ; 0000834E FC '.'
x834f: lodsb ; 0000834F AC '.'
mov bx,[bp+0x6] ; 00008350 8B5E06 '.^.'
cmp byte [bp+0x0],0x1 ; 00008353 807E0001 '.~..'
jna x836c ; 00008357 7613 'v.'
cmp al,0x7 ; 00008359 3C07 '<.'
jz x836c ; 0000835B 740F 't.'
cmp al,0x8 ; 0000835D 3C08 '<.'
jz x836c ; 0000835F 740B 't.'
cmp al,0xa ; 00008361 3C0A '<',0x0A
jz x836c ; 00008363 7407 't.'
cmp al,0xd ; 00008365 3C0D '<',0x0D
jz x836c ; 00008367 7403 't.'
xchg ax,bx ; 00008369 93 '.'
lodsb ; 0000836A AC '.'
xchg ax,bx ; 0000836B 93 '.'
x836c: push cx ; 0000836C 51 'Q'
push ds ; 0000836D 1E '.'
push ax ; 0000836E 50 'P'
mov ax,0x40 ; 0000836F B84000 '.@.'
mov ds,ax ; 00008372 8ED8 '..'
pop ax ; 00008374 58 'X'
call x8395 ; 00008375 E81D00 '...'
pop ds ; 00008378 1F '.'
pop cx ; 00008379 59 'Y'
loop x834f ; 0000837A E2D3 '..'
x837c: pop dx ; 0000837C 5A 'Z'
pop es ; 0000837D 07 '.'
mov bh,[bp+0x7] ; 0000837E 8A7E07 '.~.'
test byte [bp+0x0],0x1 ; 00008381 F6460001 '.F..'
jnz x838c ; 00008385 7505 'u.'
mov ah,0x2 ; 00008387 B402 '..'
call x83db ; 00008389 E84F00 '.O.'
x838c: pop ds ; 0000838C 1F '.'
mov ah,[0x49] ; 0000838D 8A264900 '.&I.'
mov [bp+0x1],ah ; 00008391 886601 '.f.'
ret ; 00008394 C3 '.'
x8395: cmp al,0x7 ; 00008395 3C07 '<.'
jz x83d4 ; 00008397 743B 't;'
cmp al,0x8 ; 00008399 3C08 '<.'
db 't7<',0x0A,'t3<',0x0D,'t/'
mov cx,0x1 ; 000083A5 B90100 '...'
mov ah,0x9 ; 000083A8 B409 '..'
call x83db ; 000083AA E82E00 '...'
mov ah,0x3 ; 000083AD B403 '..'
call x83db ; 000083AF E82900 '.).'
inc dl ; 000083B2 FEC2 '..'
cmp dl,[0x4a] ; 000083B4 3A164A00 ':.J.'
jnz x83ce ; 000083B8 7514 'u.'
xor dl,dl ; 000083BA 32D2 '2.'
inc dh ; 000083BC FEC6 '..'
cmp dh,0x19 ; 000083BE 80FE19 '...'
jnz x83ce ; 000083C1 750B 'u.'
dec dh ; 000083C3 FECE '..'
mov al,0xa ; 000083C5 B00A '.',0x0A
mov ah,0xe ; 000083C7 B40E '..'
call x83db ; 000083C9 E80F00 '...'
xor dl,dl ; 000083CC 32D2 '2.'
x83ce: mov ah,0x2 ; 000083CE B402 '..'
call x83db ; 000083D0 E80800 '...'
x83d3: ret ; 000083D3 C3 '.'
x83d4: mov ah,0xe ; 000083D4 B40E '..'
call x83db ; 000083D6 E80200 '...'
jmp short x83d3 ; 000083D9 EBF8 '..'
x83db: push ax ; 000083DB 50 'P'
push bx ; 000083DC 53 'S'
push es ; 000083DD 06 '.'
mov bx,0x0 ; 000083DE BB0000 '...'
mov es,bx ; 000083E1 8EC3 '..'
mov bx,0x42 ; 000083E3 BB4200 '.B.'
mov ax,cs ; 000083E6 8CC8 '..'
cmp [es:bx],ax ; 000083E8 263907 '&9.'
pop es ; 000083EB 07 '.'
pop bx ; 000083EC 5B '['
pop ax ; 000083ED 58 'X'
jz x83f3 ; 000083EE 7403 't.'
int 0x10 ; 000083F0 CD10 '..'
ret ; 000083F2 C3 '.'
x83f3: pushf ; 000083F3 9C '.'
push cs ; 000083F4 0E '.'
call xf065 ; 000083F5 E86D6C '.ml'
ret ; 000083F8 C3 '.'
x83f9: push cs ; 000083F9 0E '.'
pop ds ; 000083FA 1F '.'
cld ; 000083FB FC '.'
mov al,0xa0 ; 000083FC B0A0 '..'
out 0x84,al ; 000083FE E684 '..'
mov dx,0x3f2 ; 00008400 BAF203 '...'
mov al,0x0 ; 00008403 B000 '..'
out dx,al ; 00008405 EE '.'
mov al,0xa1 ; 00008406 B0A1 '..'
out 0x84,al ; 00008408 E684 '..'
mov bx,0x64 ; 0000840A BB6400 '.d.'
call xc638 ; 0000840D E82842 '.(B'
mov al,0xc ; 00008410 B00C '..'
out dx,al ; 00008412 EE '.'
mov al,0xa2 ; 00008413 B0A2 '..'
out 0x84,al ; 00008415 E684 '..'
mov bx,0x64 ; 00008417 BB6400 '.d.'
call xc638 ; 0000841A E81B42 '..B'
mov si,0x849f ; 0000841D BE9F84 '...'
mov di,0x4 ; 00008420 BF0400 '...'
call x8d8d ; 00008423 E86709 '.g.'
jc x847c ; 00008426 7254 'rT'
mov al,0x1c ; 00008428 B01C '..'
mov dx,0x3f2 ; 0000842A BAF203 '...'
out dx,al ; 0000842D EE '.'
mov al,0xa3 ; 0000842E B0A3 '..'
out 0x84,al ; 00008430 E684 '..'
xor bp,bp ; 00008432 33ED '3.'
x8434: call x8d8d ; 00008434 E85609 '.V.'
jc x847c ; 00008437 7243 'rC'
mov bx,0x1f4 ; 00008439 BBF401 '...'
call xc638 ; 0000843C E8F941 '..A'
call x8d8d ; 0000843F E84B09 '.K.'
jc x847c ; 00008442 7238 'r8'
mov cx,0x64 ; 00008444 B96400 '.d.'
x8447: call xe944 ; 00008447 E8FA64 '..d'
jc x847c ; 0000844A 7230 'r0'
loope x8447 ; 0000844C E1F9 '..'
jz x847c ; 0000844E 742C 't,'
call x919a ; 00008450 E8470D '.G',0x0D
in al,dx ; 00008453 EC '.'
test al,0xc0 ; 00008454 A8C0 '..'
jnz x845b ; 00008456 7503 'u.'
in al,dx ; 00008458 EC '.'
jmp short x848e ; 00008459 EB33 '.3'
x845b: xor bp,0x1 ; 0000845B 81F50100 '....'
jz x8476 ; 0000845F 7415 't.'
cmp al,0x70 ; 00008461 3C70 '<p'
jnz x8476 ; 00008463 7511 'u.'
call xe944 ; 00008465 E8DC64 '..d'
jc x847c ; 00008468 7212 'r.'
call x919a ; 0000846A E82D0D '.-',0x0D
in al,dx ; 0000846D EC '.'
mov si,0x84a2 ; 0000846E BEA284 '...'
mov di,0x3 ; 00008471 BF0300 '...'
jmp short x8434 ; 00008474 EBBE '..'
x8476: mov al,0xa5 ; 00008476 B0A5 '..'
out 0x84,al ; 00008478 E684 '..'
jmp short x8480 ; 0000847A EB04 '..'
x847c: mov al,0xa4 ; 0000847C B0A4 '..'
out 0x84,al ; 0000847E E684 '..'
x8480: mov bx,0xb82f ; 00008480 BB2FB8 './.'
mov cx,0x20 ; 00008483 B92000 '. .'
mov dx,0x0 ; 00008486 BA0000 '...'
call xc745 ; 00008489 E8B942 '..B'
jmp short x8492 ; 0000848C EB04 '..'
x848e: mov al,0xa6 ; 0000848E B0A6 '..'
out 0x84,al ; 00008490 E684 '..'
x8492: in al,0x21 ; 00008492 E421 '.!'
and al,0xbf ; 00008494 24BF '$.'
out 0x21,al ; 00008496 E621 '.!'
mov al,0x0 ; 00008498 B000 '..'
out 0xd2,al ; 0000849A E6D2 '..'
out 0xd4,al ; 0000849C E6D4 '..'
ret ; 0000849E C3 '.'
add bx,di ; 0000849F 03DF '..'
add al,[bx] ; 000084A1 0207 '..'
add [bx+si],cl ; 000084A3 0008 '..'
x84a5: mov ax,0x50 ; 000084A5 B85000 '.P.'
push ds ; 000084A8 1E '.'
mov ds,ax ; 000084A9 8ED8 '..'
mov byte [0x0],0xff ; 000084AB C6060000FF '.....'
pop ds ; 000084B0 1F '.'
mov word [0x8d],0x0 ; 000084B1 C7068D000000 '......'
mov byte [0x8c],0xfa ; 000084B7 C6068C00FA '.....'
xor bx,bx ; 000084BC 33DB '3.'
mov cl,0xff ; 000084BE B1FF '..'
mov ch,0xf0 ; 000084C0 B5F0 '..'
xor di,di ; 000084C2 33FF '3.'
push es ; 000084C4 06 '.'
x84c5: mov [0x4c],cl ; 000084C5 880E4C00 '..L.'
mov ax,0x48 ; 000084C9 B84800 '.H.'
mov es,ax ; 000084CC 8EC0 '..'
mov word [es:di],0x0 ; 000084CE 26C7050000 '&....'
mov word [es:di+0x2],0xffff ; 000084D3 26C74502FFFF '&.E...'
cld ; 000084D9 FC '.'
cld ; 000084DA FC '.'
mov ax,[es:di] ; 000084DB 268B05 '&..'
cld ; 000084DE FC '.'
cld ; 000084DF FC '.'
cld ; 000084E0 FC '.'
cld ; 000084E1 FC '.'
cld ; 000084E2 FC '.'
or ax,ax ; 000084E3 0BC0 '..'
mov [es:di],ax ; 000084E5 268905 '&..'
jz x84ee ; 000084E8 7404 't.'
inc cl ; 000084EA FEC1 '..'
jmp short x84f9 ; 000084EC EB0B '..'
x84ee: add bx,byte +0x40 ; 000084EE 83C340 '..@'
cmp cl,ch ; 000084F1 3ACD ':.'
jz x84f9 ; 000084F3 7404 't.'
dec cl ; 000084F5 FEC9 '..'
jmp short x84c5 ; 000084F7 EBCC '..'
x84f9: sub bx,0x80 ; 000084F9 81EB8000 '....'
jna x8507 ; 000084FD 7608 'v.'
mov [0x8d],bx ; 000084FF 891E8D00 '....'
mov [0x8c],cl ; 00008503 880E8C00 '....'
x8507: pop es ; 00008507 07 '.'
ret ; 00008508 C3 '.'
;
; Wrapper around xdb33 to test memory at %FE0000
;
x8509: mov ah,0xfe ; 00008509 B4FE '..'
mov word [0x82],0x80 ; 0000850B C70682008000 '......'
mov byte [0x8f],0xff ; 00008511 C6068F00FF '.....'
mov byte [0x92],0x1 ; 00008516 C606920001 '.....'
mov bp,0x80 ; 0000851B BD8000 '...'
call xdb33 ; 0000851E E81256 '..V'
add bp,0x80 ; 00008521 81C58000 '....'
or ax,ax ; 00008525 0BC0 '..'
jz x853b ; 00008527 7412 't.'
mov [0x66],ch ; 00008529 882E6600 '..f.'
mov [0x67],dx ; 0000852D 89166700 '..g.'
mov [0x69],cl ; 00008531 880E6900 '..i.'
or word [0x64],0x41 ; 00008535 810E64004100 '..d.A.'
x853b: ret ; 0000853B C3 '.'
;
; Copy ROM from %0F0000 to %FF0000
;
x853c: mov al,0x7f ; 0000853C B07F '..'
out 0x84,al ; 0000853E E684 '..'
mov word [0x50],0xffff ; 00008540 C7065000FFFF '..P...'
mov word [0x52],0x0 ; 00008546 C70652000000 '..R...'
mov byte [0x54],0xf ; 0000854C C60654000F '..T..'
mov byte [0x55],0x92 ; 00008551 C606550092 '..U..'
mov byte [0x56],0x0 ; 00008556 C606560000 '..V..'
mov byte [0x57],0x0 ; 0000855B C606570000 '..W..'
mov word [0x48],0xffff ; 00008560 C7064800FFFF '..H...'
mov word [0x4a],0x0 ; 00008566 C7064A000000 '..J...'
mov byte [0x4c],0xff ; 0000856C C6064C00FF '..L..'
mov byte [0x4d],0x92 ; 00008571 C6064D0092 '..M..'
mov word [0x4e],0x0 ; 00008576 C7064E000000 '..N...'
push es ; 0000857C 06 '.'
push ds ; 0000857D 1E '.'
mov ax,0x50 ; 0000857E B85000 '.P.'
mov ds,ax ; 00008581 8ED8 '..'
mov ax,0x48 ; 00008583 B84800 '.H.'
mov es,ax ; 00008586 8EC0 '..'
xor si,si ; 00008588 33F6 '3.'
xor di,di ; 0000858A 33FF '3.'
;
; Copy 64Kb from %0F0000 to %FF0000
;
mov cx,0x4000 ; 0000858C B90040 '..@'
cld ; 0000858F FC '.'
rep movsd ; 00008590 66F3A5 'f..'
;
; (DI) -> 0x7FB6
;
mov bx,bim_table_offset ; 00008593 BBE0FF '...'
mov di,[bx] ; 00008596 8B3F '.?'
;
; (SI) -> 0x7FBE
;
mov bx,cpu_idrev_offset ; 00008598 BBE2FF '...'
mov si,[bx] ; 0000859B 8B37 '.7'
pop ds ; 0000859D 1F '.'
mov word [0x50],0xffff ; 0000859E C7065000FFFF '..P...'
mov word [0x52],0x0 ; 000085A4 C70652000000 '..R...'
mov byte [0x54],0xc0 ; 000085AA C6065400C0 '..T..'
mov byte [0x55],0x92 ; 000085AF C606550092 '..U..'
mov byte [0x56],0x0 ; 000085B4 C606560000 '..V..'
mov byte [0x57],0x80 ; 000085B9 C606570080 '..W..'
;
; (BX) is 0x100 (256Kb)
;
mov bx,[0x8d] ; 000085BE 8B1E8D00 '....'
push ds ; 000085C2 1E '.'
;
; (DS) -> 0x80C00000
;
mov ax,0x50 ; 000085C3 B85000 '.P.'
mov ds,ax ; 000085C6 8ED8 '..'
;
; Disable IOCHK NMI, since it is possible to generate a
; parity error by simply reading the RAM Diagnostics Register.
;
in al,0x61 ; 000085C8 E461 '.a'
push ax ; 000085CA 50 'P'
or al,0x8 ; 000085CB 0C08 '..'
out 0x61,al ; 000085CD E661 '.a'
;
; (AL) == RAM Diagnostics Register (from 0x80C00000)
;
mov al,[0x0] ; 000085CF A00000 '...'
;
; Ensure that relocatable RAM at %FE0000 is NEITHER currently remapped NOR write-protected
;
mov byte [0x0],0xff ; 000085D2 C6060000FF '.....'
;
; Isolate the base memory settings in bits 5-4 (00=640Kb, 10=512Kb, 11=256Kb)
;
and al,0xf0 ; 000085D7 24F0 '$.'
;
; Update [bim_table_offset]+1 (eg, %FF7FB7) with base memory settings
;
mov [es:di+0x1],al ; 000085D9 26884501 '&.E.'
pop ax ; 000085DD 58 'X'
out 0x61,al ; 000085DE E661 '.a'
;
; Update [bim_table_offset]+0 (eg, %FF7FB6) with 0x10; that will set the first word of the built-in
; memory table to one of these values:
;
; 0x0010 256kb (1024 - 640 - 128)
; 0x2010 384Kb (1024 - 512 - 128)
; 0x3010 640Kb (1024 - 256 - 128)
;
mov byte [es:di],0x10 ; 000085E0 26C60510
mov al,0xb1 ; 000085E4 B0B1 '..'
out 0x70,al ; 000085E6 E670 '.p'
in al,0x71 ; 000085E8 E471 '.q'
mov ah,al ; 000085EA 8AE0 '..'
mov al,0xb0 ; 000085EC B0B0 '..'
out 0x70,al ; 000085EE E670 '.p'
in al,0x71 ; 000085F0 E471 '.q'
;
; (AX) contains CMOS EXTMEM2 value (eg, 0x400 or 1024Kb), to which we add another 1024Kb (for conventional memory)
;
add ax,0x400 ; 000085F2 050004 '...'
mov cx,0x3f80 ; 000085F5 B9803F '..?'
;
; (CX) contains 0x3F80 (maximum # of supported Kb), reduced by the amount of built-in memory
;
sub cx,bx ; 000085F8 2BCB '+.'
;
; Compare (AX), total conventional+extended memory, to (CX)
;
cmp ax,cx ; 000085FA 3BC1 ';.'
jc x8600 ; 000085FC 7202 'r.'
xor bx,bx ; 000085FE 33DB '3.'
;
; Assuming no problems, convert Kb of built-in memory to paragraphs, by multiplying by 64
;
x8600: shl bx,0x6 ; 00008600 C1E306 '...'
;
; If (BX) was 0x100 (256Kb), we'll move the equivalent number of paragraphs
; (0x4000) to [bim_table_offset]+2 and +4 (eg, %FF7FB8 and %FF7FBA).
;
mov [es:di+0x2],bx ; 00008603 26895D02 '&.].'
mov [es:di+0x4],bx ; 00008607 26895D04 '&.].'
mov ch,0xfe ; 0000860B B5FE '..'
xor cl,cl ; 0000860D 32C9 '2.'
shl cx,0x4 ; 0000860F C1E104 '...'
;
; Move 0xE000 to [bim_table_offset]+6 (eg, %FF7FBC)
;
mov [es:di+0x6],cx ; 00008612 26894D06 '&.M.'
mov di,si ; 00008616 8BFE '..'
mov ax,gs ; 00008618 8CE8 '..'
;
; (AX) contains the processor type and revision (AH=0x03, AL=0x04),
; which were preserved on reset in (GS); store them at the offset specified
; by cpu_idrev_offset (eg, type in %FF7FBE and revision in %FF7FBF).
;
mov [es:di],ah ; 0000861A 268825 '&.%'
mov [es:di+0x1],al ; 0000861D 26884501 '&.E.'
mov cx,0x7fff ; 00008621 B9FF7F '...'
mov si,0x8000 ; 00008624 BE0080 '...'
xor ah,ah ; 00008627 32E4 '2.'
cld ; 00008629 FC '.'
x862a: es lodsb ; 0000862A 26AC '&.'
add ah,al ; 0000862C 02E0 '..'
loop x862a ; 0000862E E2FA '..'
not ah ; 00008630 F6D4 '..'
inc ah ; 00008632 FEC4 '..'
mov [es:si],ah ; 00008634 268824 '&.$'
;
; Relocate RAM at %FF0000 to %0F0000
;
mov byte [0x0],0xfc ; 00008637 C6060000FC '.....'
pop ds ; 0000863C 1F '.'
pop es ; 0000863D 07 '.'
ret ; 0000863E C3 '.'
x863f: call x86db ; 0000863F E89900 '...'
mov [0x60],ax ; 00008642 A36000 '.`.'
mov cx,ax ; 00008645 8BC8 '..'
mov bx,0x280 ; 00008647 BB8002 '...'
test cl,0x20 ; 0000864A F6C120 '.. '
jz x865a ; 0000864D 740B 't.'
mov bx,0x200 ; 0000864F BB0002 '...'
test cl,0x10 ; 00008652 F6C110 '...'
jz x865a ; 00008655 7403 't.'
mov bx,0x100 ; 00008657 BB0001 '...'
x865a: mov ax,0x400 ; 0000865A B80004 '...'
mul bx ; 0000865D F7E3 '..'
dec dl ; 0000865F FECA '..'
mov [0x90],dl ; 00008661 88169000 '....'
mov al,cl ; 00008665 8AC1 '..'
and al,0xc0 ; 00008667 24C0 '$.'
cmp al,0x40 ; 00008669 3C40 '<@'
jz x868c ; 0000866B 741F 't.'
mov bx,0x400 ; 0000866D BB0004 '...'
test cl,0x40 ; 00008670 F6C140 '..@'
jnz x8680 ; 00008673 750B 'u.'
mov bx,0x800 ; 00008675 BB0008 '...'
test cl,0x80 ; 00008678 F6C180 '...'
jnz x8680 ; 0000867B 7503 'u.'
mov bx,0x2800 ; 0000867D BB0028 '..('
x8680: mov ax,0x400 ; 00008680 B80004 '...'
mul bx ; 00008683 F7E3 '..'
dec dl ; 00008685 FECA '..'
mov [0x91],dl ; 00008687 88169100 '....'
ret ; 0000868B C3 '.'
x868c: mov bh,ch ; 0000868C 8AFD '..'
mov bl,0x0 ; 0000868E B300 '..'
mov cx,0x4 ; 00008690 B90400 '...'
x8693: mov al,bh ; 00008693 8AC7 '..'
shr bh,0x2 ; 00008695 C0EF02 '...'
and al,0x3 ; 00008698 2403 '$.'
cmp al,0x2 ; 0000869A 3C02 '<.'
jnz x86a3 ; 0000869C 7505 'u.'
add bl,0x1 ; 0000869E 80C301 '...'
jmp short x86aa ; 000086A1 EB07 '..'
x86a3: cmp al,0x1 ; 000086A3 3C01 '<.'
jnz x86ac ; 000086A5 7505 'u.'
add bl,0x4 ; 000086A7 80C304 '...'
x86aa: loop x8693 ; 000086AA E2E7 '..'
x86ac: push ds ; 000086AC 1E '.'
mov ax,0x50 ; 000086AD B85000 '.P.'
mov ds,ax ; 000086B0 8ED8 '..'
mov al,[0x2] ; 000086B2 A00200 '...'
and al,0xf0 ; 000086B5 24F0 '$.'
or al,bl ; 000086B7 0AC3 0x0A,'.'
mov [0x2],al ; 000086B9 A20200 '...'
pop ds ; 000086BC 1F '.'
xor ah,ah ; 000086BD 32E4 '2.'
mov [0x62],ax ; 000086BF A36200 '.b.'
or bl,bl ; 000086C2 0ADB 0x0A,'.'
jnz x86c8 ; 000086C4 7502 'u.'
mov bl,0x1 ; 000086C6 B301 '..'
x86c8: xor bh,bh ; 000086C8 32FF '2.'
mov ax,0x400 ; 000086CA B80004 '...'
mul bx ; 000086CD F7E3 '..'
mov bx,0x400 ; 000086CF BB0004 '...'
mul bx ; 000086D2 F7E3 '..'
dec dl ; 000086D4 FECA '..'
mov [0x91],dl ; 000086D6 88169100 '....'
ret ; 000086DA C3 '.'
x86db: mov word [0x50],0xffff ; 000086DB C7065000FFFF '..P...'
mov word [0x52],0x0 ; 000086E1 C70652000000 '..R...'
mov byte [0x54],0xc0 ; 000086E7 C6065400C0 '..T..'
mov byte [0x55],0x92 ; 000086EC C606550092 '..U..'
mov byte [0x56],0x0 ; 000086F1 C606560000 '..V..'
mov byte [0x57],0x80 ; 000086F6 C606570080 '..W..'
push ds ; 000086FB 1E '.'
push bx ; 000086FC 53 'S'
mov ax,0x50 ; 000086FD B85000 '.P.'
mov ds,ax ; 00008700 8ED8 '..'
in al,0x61 ; 00008702 E461 '.a'
mov ah,al ; 00008704 8AE0 '..'
or al,0x8 ; 00008706 0C08 '..'
out 0x61,al ; 00008708 E661 '.a'
out 0x84,al ; 0000870A E684 '..'
;
; Read the memory-mapped settings/diagnostic register at 0x80C00000 into BX
;
mov bx,[0x0] ; 0000870C 8B1E0000 '....'
mov byte [0x0],0xff ; 00008710 C6060000FF '.....'
out 0x84,al ; 00008715 E684 '..'
cld ; 00008717 FC '.'
cld ; 00008718 FC '.'
cld ; 00008719 FC '.'
cld ; 0000871A FC '.'
cld ; 0000871B FC '.'
cld ; 0000871C FC '.'
cld ; 0000871D FC '.'
cld ; 0000871E FC '.'
cld ; 0000871F FC '.'
cld ; 00008720 FC '.'
cld ; 00008721 FC '.'
cld ; 00008722 FC '.'
cld ; 00008723 FC '.'
cld ; 00008724 FC '.'
cld ; 00008725 FC '.'
cld ; 00008726 FC '.'
xchg ah,al ; 00008727 86E0 '..'
out 0x61,al ; 00008729 E661 '.a'
mov ax,bx ; 0000872B 8BC3 '..'
pop bx ; 0000872D 5B '['
pop ds ; 0000872E 1F '.'
ret ; 0000872F C3 '.'
romgdt: ; 00008730
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xFF,0xFF,0x00,0x00,0xC0,0x92,0x00,0x80
db 0xFF,0xFF,0x00,0x00,0x00,0x92,0x00,0x00, 0xFF,0xFF,0x00,0x00,0x0F,0x9A,0x00,0x00
db 0xFF,0xFF,0x00,0x00,0x00,0x92,0x00,0xC0, 0xFF,0xFF,0x00,0x00,0xFF,0x9A,0x00,0x00
db 0xFF,0xFF,0x00,0x00,0xFF,0x92,0x00,0x00, 0xFF,0xFF,0x00,0x00,0x0E,0x92,0x00,0x00
db 0xFF,0xFF,0x00,0x00,0xFD,0x92,0x00,0x00
gdtr_lo: ; accessed via offset 0x0778 (and also 0x8778)
dw 0x0047,0x0730,0x000F ; 00008778 GDTR referencing the above GDT in the 0th Mb
gdtr_hi: ; accessed via offset 0x077E
dw 0x0047,0x0730,0x00FF ; 0000877E GDTR referencing the above GDT in the 15th Mb
idtr_lo: ; accessed via offset 0x0784
dw 0xFFFF,0x0000,0x0000 ; 00008784 IDTR
db 0xAA,0x87,0x18,0x00,0xF8,0x87
db 0x18,0x00,0x28,0x88,0x18,0x00
x8796: lgdt [cs:0x0778] ; 00008796 load [gdtr_lo] into GDTR
mov eax,cr0 ; 0000879C 0F2000
or ax,0x1 ; 0000879F 0D0100 0x0D,'..'
mov cr0,eax ; 000087A2 0F2200
jmp far [cs:0x878a] ; 000087A5 2EFF2E8A87 '.....'
mov ax,0x8 ; 000087AA B80800 '...'
mov es,ax ; 000087AD 8EC0 '..'
mov al,0x2f ; 000087AF B02F './'
mov [es:di],bl ; 000087B1 26881D '&..'
out 0x84,al ; 000087B4 E684 '..'
cld ; 000087B6 FC '.'
cld ; 000087B7 FC '.'
cld ; 000087B8 FC '.'
cld ; 000087B9 FC '.'
cld ; 000087BA FC '.'
cld ; 000087BB FC '.'
cld ; 000087BC FC '.'
cld ; 000087BD FC '.'
cld ; 000087BE FC '.'
cld ; 000087BF FC '.'
cld ; 000087C0 FC '.'
cld ; 000087C1 FC '.'
cld ; 000087C2 FC '.'
cld ; 000087C3 FC '.'
cld ; 000087C4 FC '.'
cld ; 000087C5 FC '.'
x87c6: mov ax,0x10 ; 000087C6 B81000 '...'
mov es,ax ; 000087C9 8EC0 '..'
mov eax,cr0 ; 000087CB 0F2000
and eax,0x7ffffffe ; 000087CE 6625FEFFFF7F 'f%....'
mov cr0,eax ; 000087D4 0F2200
jmp 0xf000:x87dc ; 000087D7 EADC8700F0 '.....'
x87dc: lidt [cs:0x0784] ; 000087DC load [idtr_lo] into IDTR
jmp bp ; 000087E2 FFE5 '..'
x87e4: lgdt [cs:0x0778] ; 000087E4 load [gdtr_lo] into GDTR
mov eax,cr0 ; 000087EA 0F2000
or ax,0x1 ; 000087ED 0D0100 0x0D,'..'
mov cr0,eax ; 000087F0 0F2200
jmp far [cs:0x878e] ; 000087F3 2EFF2E8E87 '.....'
mov ax,0x8 ; 000087F8 B80800 '...'
mov es,ax ; 000087FB 8EC0 '..'
in al,0x61 ; 000087FD E461 '.a'
mov ah,al ; 000087FF 8AE0 '..'
or al,0x8 ; 00008801 0C08 '..'
out 0x61,al ; 00008803 E661 '.a'
mov al,ah ; 00008805 8AC4 '..'
mov bl,[es:di] ; 00008807 268A1D '&..'
mov byte [es:0x0],0xff ; 0000880A 26C6060000FF '&.....'
out 0x61,al ; 00008810 E661 '.a'
jmp short x87c6 ; 00008812 EBB2 '..'
x8814: lgdt [cs:0x8778] ; 00008814 load [gdtr_lo] into GDTR
mov eax,cr0 ; 0000881A 0F2000
or ax,0x1 ; 0000881D 0D0100 0x0D,'..'
mov cr0,eax ; 00008820 0F2200
jmp far [cs:0x8792] ; 00008823 2EFF2E9287 '.....'
mov ax,0x20 ; 00008828 B82000 '. .'
mov ds,ax ; 0000882B 8ED8 '..'
mov al,0xc0 ; 0000882D B0C0 '..'
out 0x64,al ; 0000882F E664 '.d'
mov cx,0xffff ; 00008831 B9FFFF '...'
cli ; 00008834 FA '.'
x8835: in al,0x64 ; 00008835 E464 '.d'
test al,0x2 ; 00008837 A802 '..'
jz x8840 ; 00008839 7405 't.'
loop x8835 ; 0000883B E2F8 '..'
jmp x88d0 ; 0000883D E99000 '...'
x8840: mov cx,0xffff ; 00008840 B9FFFF '...'
x8843: in al,0x64 ; 00008843 E464 '.d'
test al,0x1 ; 00008845 A801 '..'
jnz x884e ; 00008847 7505 'u.'
loop x8843 ; 00008849 E2F8 '..'
jmp x88d0 ; 0000884B E98200 '...'
x884e: in al,0x60 ; 0000884E E460 '.`'
test al,0x8 ; 00008850 A808 '..'
jnz x88d0 ; 00008852 757C 'u|'
mov dword [0xc000],0xb8000000; 00008854 66C70600C0000000 'f.......'
jmp short x885f ; 0000885D EB00 '..'
x885f: mov eax,[0xc400] ; 0000885F 66A100C4 'f...'
jmp short x8865 ; 00008863 EB00 '..'
x8865: and eax,0x8000 ; 00008865 662500800000 'f%....'
jnz x887a ; 0000886B 750D 'u',0x0D
jmp short x886f ; 0000886D EB00 '..'
x886f: mov dword [0xc000],0x16000000; 0000886F 66C70600C0000000 'f.......'
jmp short x8890 ; 00008878 EB16 '..'
x887a: jmp short x887c ; 0000887A EB00 '..'
x887c: mov dword [0xc000],0x56000000; 0000887C 66C70600C0000000 'f.......'
jmp short x8887 ; 00008885 EB00 '..'
x8887: mov dword [0xc000],0x98000000; 00008887 66C70600C0000000 'f.......'
x8890: jmp short x8892 ; 00008890 EB00 '..'
x8892: mov dword [0xc000],0x64000000; 00008892 66C70600C0000000 'f.......'
jmp short x889d ; 0000889B EB00 '..'
x889d: mov dword [0xc000],0xa0000000; 0000889D 66C70600C0000000 'f.......'
jmp short x88a8 ; 000088A6 EB00 '..'
x88a8: mov dword [0xc000],0x30000000; 000088A8 66C70600C0000000 'f.......'
jmp short x88b3 ; 000088B1 EB00 '..'
x88b3: mov dword [0xc000],0x3ff0000; 000088B3 66C70600C00000FF 'f.......'
mov al,0xb3 ; 000088BC B0B3 '..'
out 0x70,al ; 000088BE E670 '.p'
in al,0x71 ; 000088C0 E471 '.q'
xchg ah,al ; 000088C2 86E0 '..'
mov al,0xb3 ; 000088C4 B0B3 '..'
out 0x70,al ; 000088C6 E670 '.p'
xchg al,ah ; 000088C8 86C4 '..'
or al,0x20 ; 000088CA 0C20 '. '
out 0x71,al ; 000088CC E671 '.q'
jmp short x88e2 ; 000088CE EB12 '..'
x88d0: mov al,0xb3 ; 000088D0 B0B3 '..'
out 0x70,al ; 000088D2 E670 '.p'
in al,0x71 ; 000088D4 E471 '.q'
xchg ah,al ; 000088D6 86E0 '..'
mov al,0xb3 ; 000088D8 B0B3 '..'
out 0x70,al ; 000088DA E670 '.p'
xchg al,ah ; 000088DC 86C4 '..'
and al,0xdf ; 000088DE 24DF '$.'
out 0x71,al ; 000088E0 E671 '.q'
x88e2: mov ax,0x10 ; 000088E2 B81000 '...'
mov ds,ax ; 000088E5 8ED8 '..'
jmp x87c6 ; 000088E7 E9DCFE '...'
x88ea: sti ; 000088EA FB '.'
push bx ; 000088EB 53 'S'
push cx ; 000088EC 51 'Q'
push dx ; 000088ED 52 'R'
push si ; 000088EE 56 'V'
push ds ; 000088EF 1E '.'
mov bx,0x40 ; 000088F0 BB4000 '.@.'
mov ds,bx ; 000088F3 8EDB '..'
and dx,0x3 ; 000088F5 81E20300 '....'
mov si,dx ; 000088F9 8BF2 '..'
mov bl,[si+0x78] ; 000088FB 8A9C7800 '..x.'
shl si,1 ; 000088FF D1E6 '..'
mov dx,[si+0x8] ; 00008901 8B940800 '....'
or dx,dx ; 00008905 0BD2 '..'
jz x8980 ; 00008907 7477 'tw'
push ax ; 00008909 50 'P'
test ah,ah ; 0000890A 84E4 '..'
jz x8919 ; 0000890C 740B 't.'
dec ah ; 0000890E FECC '..'
jz x895b ; 00008910 7449 'tI'
dec ah ; 00008912 FECC '..'
jz x8971 ; 00008914 745B 't['
pop ax ; 00008916 58 'X'
jmp short x8980 ; 00008917 EB67 '.g'
x8919: out dx,al ; 00008919 EE '.'
inc dx ; 0000891A 42 'B'
jmp short x891d ; 0000891B EB00 '..'
x891d: jmp short x891f ; 0000891D EB00 '..'
x891f: in al,dx ; 0000891F EC '.'
and al,0xf8 ; 00008920 24F8 '$.'
js x894c ; 00008922 7828 'x('
push ax ; 00008924 50 'P'
mov ax,0x90fe ; 00008925 B8FE90 '...'
clc ; 00008928 F8 '.'
int 0x15 ; 00008929 CD15 '..'
pop ax ; 0000892B 58 'X'
jc x893f ; 0000892C 7211 'r.'
x892e: mov cx,0xf424 ; 0000892E B924F4 '.$.'
x8931: call x919a ; 00008931 E86608 '.f.'
in al,dx ; 00008934 EC '.'
and al,0xf8 ; 00008935 24F8 '$.'
js x894c ; 00008937 7813 'x.'
loop x8931 ; 00008939 E2F6 '..'
dec bl ; 0000893B FECB '..'
jnz x892e ; 0000893D 75EF 'u.'
x893f: jmp short x8941 ; 0000893F EB00 '..'
x8941: jmp short x8943 ; 00008941 EB00 '..'
x8943: in al,dx ; 00008943 EC '.'
and al,0xf8 ; 00008944 24F8 '$.'
js x894c ; 00008946 7804 'x.'
or al,0x1 ; 00008948 0C01 '..'
jmp short x8979 ; 0000894A EB2D '.-'
x894c: inc dx ; 0000894C 42 'B'
in al,dx ; 0000894D EC '.'
and al,0x1c ; 0000894E 241C '$.'
or al,0x1 ; 00008950 0C01 '..'
jmp short x8954 ; 00008952 EB00 '..'
x8954: jmp short x8956 ; 00008954 EB00 '..'
x8956: out dx,al ; 00008956 EE '.'
and al,0x1c ; 00008957 241C '$.'
jmp short x896a ; 00008959 EB0F '..'
x895b: inc dx ; 0000895B 42 'B'
inc dx ; 0000895C 42 'B'
mov al,0x8 ; 0000895D B008 '..'
jmp short x8961 ; 0000895F EB00 '..'
x8961: out dx,al ; 00008961 EE '.'
mov bx,0x5 ; 00008962 BB0500 '...'
call xc638 ; 00008965 E8D03C '..<'
or al,0x4 ; 00008968 0C04 '..'
x896a: jmp short x896c ; 0000896A EB00 '..'
x896c: jmp short x896e ; 0000896C EB00 '..'
x896e: out dx,al ; 0000896E EE '.'
dec dx ; 0000896F 4A 'J'
dec dx ; 00008970 4A 'J'
x8971: inc dx ; 00008971 42 'B'
jmp short x8974 ; 00008972 EB00 '..'
x8974: jmp short x8976 ; 00008974 EB00 '..'
x8976: in al,dx ; 00008976 EC '.'
and al,0xf8 ; 00008977 24F8 '$.'
x8979: xor al,0x48 ; 00008979 3448 '4H'
mov bh,al ; 0000897B 8AF8 '..'
pop ax ; 0000897D 58 'X'
mov ah,bh ; 0000897E 8AE7 '..'
x8980: pop ds ; 00008980 1F '.'
pop si ; 00008981 5E '^'
pop dx ; 00008982 5A 'Z'
pop cx ; 00008983 59 'Y'
pop bx ; 00008984 5B '['
iret ; 00008985 CF '.'
add [ss:bp+di+0xada5],ch ; 00008986 2E3E2664653600AB '.>&de6..'
cmpsw ; 00008990 A7 '.'
scasw ; 00008991 AF '.'
insw ; 00008992 6D 'm'
outsw ; 00008993 6F 'o'
add [di],bl ; 00008994 001D '..'
mov dh,[bp+di] ; 00008996 8A33 '.3'
mov al,[bp+di+0x918a] ; 00008998 8A838A91 '....'
mov dl,dh ; 0000899C 8AD6 '..'
mov ah,ah ; 0000899E 8AE4 '..'
mov bh,dl ; 000089A0 8AFA '..'
mov dl,[bx+di+0x55] ; 000089A2 8A5155 '.QU'
mov bp,sp ; 000089A5 8BEC '..'
push ax ; 000089A7 50 'P'
push bx ; 000089A8 53 'S'
push dx ; 000089A9 52 'R'
push es ; 000089AA 06 '.'
push ds ; 000089AB 1E '.'
mov al,0xb ; 000089AC B00B '..'
out 0x20,al ; 000089AE E620 '. '
in al,0x20 ; 000089B0 E420 '. '
test al,0x20 ; 000089B2 A820 '. '
jnz x8a0b ; 000089B4 7555 'uU'
xor ch,ch ; 000089B6 32ED '2.'
mov ax,cs ; 000089B8 8CC8 '..'
mov ds,ax ; 000089BA 8ED8 '..'
mov es,[bp+0x6] ; 000089BC 8E4606 '.F.'
mov bx,[bp+0x4] ; 000089BF 8B5E04 '.^.'
x89c2: mov cl,[es:bx] ; 000089C2 268A0F '&..'
cmp cl,0xf2 ; 000089C5 80F9F2 '...'
jz x89cf ; 000089C8 7405 't.'
cmp cl,0xf3 ; 000089CA 80F9F3 '...'
jnz x89d7 ; 000089CD 7508 'u.'
x89cf: inc bx ; 000089CF 43 'C'
dec word [bp+0x2] ; 000089D0 FF4E02 '.N.'
mov ch,0x1 ; 000089D3 B501 '..'
jmp short x89c2 ; 000089D5 EBEB '..'
x89d7: mov dx,si ; 000089D7 8BD6 '..'
cld ; 000089D9 FC '.'
mov si,0x8986 ; 000089DA BE8689 '...'
x89dd: lodsb ; 000089DD AC '.'
cmp al,0x0 ; 000089DE 3C00 '<.'
jz x89eb ; 000089E0 7409 't.'
cmp al,cl ; 000089E2 3AC1 ':.'
jnz x89dd ; 000089E4 75F7 'u.'
inc bx ; 000089E6 43 'C'
mov si,dx ; 000089E7 8BF2 '..'
jmp short x89c2 ; 000089E9 EBD7 '..'
x89eb: mov si,0x898d ; 000089EB BE8D89 '...'
mov bx,si ; 000089EE 8BDE '..'
x89f0: lodsb ; 000089F0 AC '.'
cmp al,0x0 ; 000089F1 3C00 '<.'
jz x8a0b ; 000089F3 7416 't.'
cmp al,cl ; 000089F5 3AC1 ':.'
jnz x89f0 ; 000089F7 75F7 'u.'
mov ax,[bp+0x8] ; 000089F9 8B4608 '.F.'
and ah,0x4 ; 000089FC 80E404 '...'
sub si,bx ; 000089FF 2BF3 '+.'
dec si ; 00008A01 4E 'N'
shl si,1 ; 00008A02 D1E6 '..'
call near [cs:si+0x8995] ; 00008A04 2EFF949589 '.....'
jmp short x8a15 ; 00008A09 EB0A '.',0x0A
x8a0b: pop ds ; 00008A0B 1F '.'
pop es ; 00008A0C 07 '.'
pop dx ; 00008A0D 5A 'Z'
pop bx ; 00008A0E 5B '['
pop ax ; 00008A0F 58 'X'
pop bp ; 00008A10 5D ']'
pop cx ; 00008A11 59 'Y'
jmp x9bd0 ; 00008A12 E9BB11
x8a15: pop ds ; 00008A15 1F '.'
pop es ; 00008A16 07 '.'
pop dx ; 00008A17 5A 'Z'
pop bx ; 00008A18 5B '['
pop ax ; 00008A19 58 'X'
pop bp ; 00008A1A 5D ']'
pop cx ; 00008A1B 59 'Y'
iret ; 00008A1C CF '.'
mov si,dx ; 00008A1D 8BF2 '..'
cmp ch,0x1 ; 00008A1F 80FD01 '...'
jnz x8a27 ; 00008A22 7503 'u.'
dec word [bp+0x2] ; 00008A24 FF4E02 '.N.'
x8a27: cmp ah,0x0 ; 00008A27 80FC00 '...'
jz x8a30 ; 00008A2A 7404 't.'
dec di ; 00008A2C 4F 'O'
dec di ; 00008A2D 4F 'O'
jmp short x8a32 ; 00008A2E EB02 '..'
x8a30: inc di ; 00008A30 47 'G'
inc di ; 00008A31 47 'G'
x8a32: ret ; 00008A32 C3 '.'
mov si,dx ; 00008A33 8BF2 '..'
cmp si,di ; 00008A35 3BF7 ';.'
jnz 0x8a59 ; 00008A37 7520 'u '
cmp ch,0x1 ; 00008A39 80FD01 '...'
jnz x8a44 ; 00008A3C 7506 'u.'
dec word [bp+0x2] ; 00008A3E FF4E02 '.N.'
dec word [bp+0x2] ; 00008A41 FF4E02 '.N.'
x8a44: cmp ah,0x0 ; 00008A44 80FC00 '...'
jz x8a51 ; 00008A47 7408 't.'
dec di ; 00008A49 4F 'O'
dec di ; 00008A4A 4F 'O'
dec si ; 00008A4B 4E 'N'
dec si ; 00008A4C 4E 'N'
dec si ; 00008A4D 4E 'N'
dec si ; 00008A4E 4E 'N'
jmp short x8a82 ; 00008A4F EB31 '.1'
x8a51: inc di ; 00008A51 47 'G'
inc di ; 00008A52 47 'G'
inc si ; 00008A53 46 'F'
inc si ; 00008A54 46 'F'
inc si ; 00008A55 46 'F'
inc si ; 00008A56 46 'F'
jmp short x8a82 ; 00008A57 EB29 '.)'
cmp si,byte -0x1 ; 00008A59 83FEFF '...'
jnz x8a6b ; 00008A5C 750D 'u',0x0D
cmp ah,0x0 ; 00008A5E 80FC00 '...'
jz x8a67 ; 00008A61 7404 't.'
dec si ; 00008A63 4E 'N'
dec si ; 00008A64 4E 'N'
jmp short x8a82 ; 00008A65 EB1B '..'
x8a67: inc si ; 00008A67 46 'F'
inc si ; 00008A68 46 'F'
jmp short x8a82 ; 00008A69 EB17 '..'
x8a6b: cmp ch,0x1 ; 00008A6B 80FD01 '...'
jnz x8a73 ; 00008A6E 7503 'u.'
dec word [bp+0x2] ; 00008A70 FF4E02 '.N.'
x8a73: cmp ah,0x0 ; 00008A73 80FC00 '...'
jz x8a7e ; 00008A76 7406 't.'
dec di ; 00008A78 4F 'O'
dec di ; 00008A79 4F 'O'
dec si ; 00008A7A 4E 'N'
dec si ; 00008A7B 4E 'N'
jmp short x8a82 ; 00008A7C EB04 '..'
x8a7e: inc di ; 00008A7E 47 'G'
inc di ; 00008A7F 47 'G'
inc si ; 00008A80 46 'F'
inc si ; 00008A81 46 'F'
x8a82: ret ; 00008A82 C3 '.'
mov si,dx ; 00008A83 8BF2 '..'
cmp ah,0x0 ; 00008A85 80FC00 '...'
jz x8a8e ; 00008A88 7404 't.'
dec si ; 00008A8A 4E 'N'
dec si ; 00008A8B 4E 'N'
jmp short x8a90 ; 00008A8C EB02 '..'
x8a8e: inc si ; 00008A8E 46 'F'
inc si ; 00008A8F 46 'F'
x8a90: ret ; 00008A90 C3 '.'
mov si,dx ; 00008A91 8BF2 '..'
cmp si,di ; 00008A93 3BF7 ';.'
jnz x8aac ; 00008A95 7515 'u.'
cmp ah,0x0 ; 00008A97 80FC00 '...'
jz x8aa4 ; 00008A9A 7408 't.'
dec di ; 00008A9C 4F 'O'
dec di ; 00008A9D 4F 'O'
dec di ; 00008A9E 4F 'O'
dec di ; 00008A9F 4F 'O'
dec si ; 00008AA0 4E 'N'
dec si ; 00008AA1 4E 'N'
jmp short x8ad5 ; 00008AA2 EB31 '.1'
x8aa4: inc di ; 00008AA4 47 'G'
inc di ; 00008AA5 47 'G'
inc di ; 00008AA6 47 'G'
inc di ; 00008AA7 47 'G'
inc si ; 00008AA8 46 'F'
inc si ; 00008AA9 46 'F'
jmp short x8ad5 ; 00008AAA EB29 '.)'
x8aac: cmp si,byte -0x1 ; 00008AAC 83FEFF '...'
jnz x8ac2 ; 00008AAF 7511 'u.'
cmp ah,0x0 ; 00008AB1 80FC00 '...'
jz x8abc ; 00008AB4 7406 't.'
dec si ; 00008AB6 4E 'N'
dec si ; 00008AB7 4E 'N'
dec di ; 00008AB8 4F 'O'
dec di ; 00008AB9 4F 'O'
jmp short x8ad5 ; 00008ABA EB19 '..'
x8abc: inc si ; 00008ABC 46 'F'
inc si ; 00008ABD 46 'F'
inc di ; 00008ABE 47 'G'
inc di ; 00008ABF 47 'G'
jmp short x8ad5 ; 00008AC0 EB13 '..'
x8ac2: cmp ch,0x1 ; 00008AC2 80FD01 '...'
jnz x8aca ; 00008AC5 7503 'u.'
inc word [bp+0x2] ; 00008AC7 FF4602 '.F.'
x8aca: cmp ah,0x0 ; 00008ACA 80FC00 '...'
jz x8ad3 ; 00008ACD 7404 't.'
dec di ; 00008ACF 4F 'O'
dec di ; 00008AD0 4F 'O'
jmp short x8ad5 ; 00008AD1 EB02 '..'
x8ad3: inc di ; 00008AD3 47 'G'
inc di ; 00008AD4 47 'G'
x8ad5: ret ; 00008AD5 C3 '.'
mov si,dx ; 00008AD6 8BF2 '..'
cmp ah,0x0 ; 00008AD8 80FC00 '...'
jz x8ae1 ; 00008ADB 7404 't.'
dec di ; 00008ADD 4F 'O'
dec di ; 00008ADE 4F 'O'
jmp short x8ae3 ; 00008ADF EB02 '..'
x8ae1: inc di ; 00008AE1 47 'G'
inc di ; 00008AE2 47 'G'
x8ae3: ret ; 00008AE3 C3 '.'
mov si,dx ; 00008AE4 8BF2 '..'
cmp ch,0x1 ; 00008AE6 80FD01 '...'
jnz x8aee ; 00008AE9 7503 'u.'
dec word [bp+0x2] ; 00008AEB FF4E02 '.N.'
x8aee: cmp ah,0x0 ; 00008AEE 80FC00 '...'
jz x8af7 ; 00008AF1 7404 't.'
dec di ; 00008AF3 4F 'O'
dec di ; 00008AF4 4F 'O'
jmp short x8af9 ; 00008AF5 EB02 '..'
x8af7: inc di ; 00008AF7 47 'G'
inc di ; 00008AF8 47 'G'
x8af9: ret ; 00008AF9 C3 '.'
mov si,dx ; 00008AFA 8BF2 '..'
cmp ah,0x0 ; 00008AFC 80FC00 '...'
jz x8b05 ; 00008AFF 7404 't.'
dec si ; 00008B01 4E 'N'
dec si ; 00008B02 4E 'N'
jmp short x8b07 ; 00008B03 EB02 '..'
x8b05: inc si ; 00008B05 46 'F'
inc si ; 00008B06 46 'F'
x8b07: ret ; 00008B07 C3 '.'
std ; 00008B08 FD '.'
mov bl,[0x4a] ; 00008B09 8A1E4A00 '..J.'
mov dx,[bp+0x2] ; 00008B0D 8B5602 '.V.'
cmp dl,bl ; 00008B10 3AD3 ':.'
jc x8b18 ; 00008B12 7204 'r.'
mov dl,bl ; 00008B14 8AD3 '..'
dec dl ; 00008B16 FECA '..'
x8b18: test ah,0x1 ; 00008B18 F6C401 '...'
jz x8b29 ; 00008B1B 740C 't.'
xchg cx,dx ; 00008B1D 87CA '..'
sub dh,ch ; 00008B1F 2AF5 '*.'
sub dl,cl ; 00008B21 2AD1 '*.'
neg dh ; 00008B23 F6DE '..'
neg dl ; 00008B25 F6DA '..'
jmp short x8b2d ; 00008B27 EB04 '..'
x8b29: sub dh,ch ; 00008B29 2AF5 '*.'
sub dl,cl ; 00008B2B 2AD1 '*.'
x8b2d: inc dh ; 00008B2D FEC6 '..'
inc dl ; 00008B2F FEC2 '..'
call x8da9 ; 00008B31 E87502 '.u.'
jz x8b57 ; 00008B34 7421 't!'
cmp byte [0x49],0x2 ; 00008B36 803E490002 '.>I..'
jc x8b65 ; 00008B3B 7228 'r('
cmp byte [0x49],0x3 ; 00008B3D 803E490003 '.>I..'
ja x8b57 ; 00008B42 7713 'w.'
push ax ; 00008B44 50 'P'
push dx ; 00008B45 52 'R'
mov dx,[0x63] ; 00008B46 8B166300 '..c.'
add dx,byte +0x4 ; 00008B4A 83C204 '...'
mov al,[0x65] ; 00008B4D A06500 '.e.'
and al,0xf7 ; 00008B50 24F7 '$.'
out dx,al ; 00008B52 EE '.'
pop dx ; 00008B53 5A 'Z'
pop ax ; 00008B54 58 'X'
jmp short x8b65 ; 00008B55 EB0E '..'
x8b57: cmp byte [0x49],0x4 ; 00008B57 803E490004 '.>I..'
jc x8b65 ; 00008B5C 7207 'r.'
cmp byte [0x49],0x7 ; 00008B5E 803E490007 '.>I..'
jnz x8be1 ; 00008B63 757C 'u|'
x8b65: mov bp,bx ; 00008B65 8BEB '..'
sub bp,dx ; 00008B67 2BEA '+.'
and bp,0xff ; 00008B69 81E5FF00 '....'
shl bp,1 ; 00008B6D D1E5 '..'
mov di,ax ; 00008B6F 8BF8 '..'
mov al,ch ; 00008B71 8AC5 '..'
mul bl ; 00008B73 F6E3 '..'
xor ch,ch ; 00008B75 32ED '2.'
add ax,cx ; 00008B77 03C1 '..'
shl ax,1 ; 00008B79 D1E0 '..'
add ax,[0x4e] ; 00008B7B 03064E00 '..N.'
xchg ax,di ; 00008B7F 97 '.'
mov si,es ; 00008B80 8CC6 '..'
mov ds,si ; 00008B82 8EDE '..'
mov si,ax ; 00008B84 8BF0 '..'
mul bl ; 00008B86 F6E3 '..'
test si,0x100 ; 00008B88 F7C60001 '....'
jz x8b92 ; 00008B8C 7404 't.'
neg ax ; 00008B8E F7D8 '..'
neg bp ; 00008B90 F7DD '..'
x8b92: shl ax,1 ; 00008B92 D1E0 '..'
add ax,di ; 00008B94 03C7 '..'
xchg ax,si ; 00008B96 96 '.'
or al,al ; 00008B97 0AC0 0x0A,'.'
jz x8baf ; 00008B99 7414 't.'
cmp al,dh ; 00008B9B 3AC6 ':.'
jnc x8baf ; 00008B9D 7310 's.'
sub dh,al ; 00008B9F 2AF0 '*.'
x8ba1: mov cl,dl ; 00008BA1 8ACA '..'
rep movsw ; 00008BA3 F3A5 '..'
add si,bp ; 00008BA5 03F5 '..'
add di,bp ; 00008BA7 03FD '..'
dec dh ; 00008BA9 FECE '..'
jnz x8ba1 ; 00008BAB 75F4 'u.'
mov dh,al ; 00008BAD 8AF0 '..'
x8baf: mov ah,bh ; 00008BAF 8AE7 '..'
mov al,0x20 ; 00008BB1 B020 '. '
x8bb3: mov cl,dl ; 00008BB3 8ACA '..'
rep stosw ; 00008BB5 F3AB '..'
add di,bp ; 00008BB7 03FD '..'
dec dh ; 00008BB9 FECE '..'
jnz x8bb3 ; 00008BBB 75F6 'u.'
mov ax,0x40 ; 00008BBD B84000 '.@.'
mov ds,ax ; 00008BC0 8ED8 '..'
call x8da9 ; 00008BC2 E8E401 '...'
jz x8be0 ; 00008BC5 7419 't.'
cmp byte [0x49],0x2 ; 00008BC7 803E490002 '.>I..'
jc x8be0 ; 00008BCC 7212 'r.'
cmp byte [0x49],0x3 ; 00008BCE 803E490003 '.>I..'
ja x8be0 ; 00008BD3 770B 'w.'
mov dx,[0x63] ; 00008BD5 8B166300 '..c.'
add dx,byte +0x4 ; 00008BD9 83C204 '...'
mov al,[0x65] ; 00008BDC A06500 '.e.'
out dx,al ; 00008BDF EE '.'
x8be0: ret ; 00008BE0 C3 '.'
x8be1: cmp byte [0x49],0x6 ; 00008BE1 803E490006 '.>I..'
jz x8bec ; 00008BE6 7404 't.'
shl cl,1 ; 00008BE8 D0E1 '..'
shl dl,1 ; 00008BEA D0E2 '..'
x8bec: mov bp,0x50 ; 00008BEC BD5000 '.P.'
push dx ; 00008BEF 52 'R'
mov di,ax ; 00008BF0 8BF8 '..'
mov al,ch ; 00008BF2 8AC5 '..'
xor ch,ch ; 00008BF4 32ED '2.'
cbw ; 00008BF6 98 '.'
mov dx,0x140 ; 00008BF7 BA4001 '.@.'
mul dx ; 00008BFA F7E2 '..'
add ax,cx ; 00008BFC 03C1 '..'
add ax,[0x4e] ; 00008BFE 03064E00 '..N.'
xchg ax,di ; 00008C02 97 '.'
mov si,ax ; 00008C03 8BF0 '..'
cbw ; 00008C05 98 '.'
mov dx,0x140 ; 00008C06 BA4001 '.@.'
mul dx ; 00008C09 F7E2 '..'
test si,0x100 ; 00008C0B F7C60001 '....'
jz x8c21 ; 00008C0F 7410 't.'
neg ax ; 00008C11 F7D8 '..'
neg bp ; 00008C13 F7DD '..'
add di,0x20f0 ; 00008C15 81C7F020 '... '
cmp byte [0x49],0x6 ; 00008C19 803E490006 '.>I..'
jz x8c21 ; 00008C1E 7401 't.'
inc di ; 00008C20 47 'G'
x8c21: add ax,di ; 00008C21 03C7 '..'
mov dx,es ; 00008C23 8CC2 '..'
mov ds,dx ; 00008C25 8EDA '..'
xchg ax,si ; 00008C27 96 '.'
pop dx ; 00008C28 5A 'Z'
push bx ; 00008C29 53 'S'
mov bx,di ; 00008C2A 8BDF '..'
or al,al ; 00008C2C 0AC0 0x0A,'.'
jz x8c60 ; 00008C2E 7430 't0'
cmp al,dh ; 00008C30 3AC6 ':.'
jnc x8c60 ; 00008C32 732C 's,'
sub dh,al ; 00008C34 2AF0 '*.'
push ax ; 00008C36 50 'P'
shl dh,1 ; 00008C37 D0E6 '..'
shl dh,1 ; 00008C39 D0E6 '..'
mov ax,si ; 00008C3B 8BC6 '..'
x8c3d: mov si,ax ; 00008C3D 8BF0 '..'
mov di,bx ; 00008C3F 8BFB '..'
mov cl,dl ; 00008C41 8ACA '..'
rep movsb ; 00008C43 F3A4 '..'
mov si,ax ; 00008C45 8BF0 '..'
mov di,bx ; 00008C47 8BFB '..'
xor si,0x2000 ; 00008C49 81F60020 '... '
xor di,0x2000 ; 00008C4D 81F70020 '... '
mov cl,dl ; 00008C51 8ACA '..'
rep movsb ; 00008C53 F3A4 '..'
add ax,bp ; 00008C55 03C5 '..'
add bx,bp ; 00008C57 03DD '..'
dec dh ; 00008C59 FECE '..'
jnz x8c3d ; 00008C5B 75E0 'u.'
pop ax ; 00008C5D 58 'X'
mov dh,al ; 00008C5E 8AF0 '..'
x8c60: shl dh,1 ; 00008C60 D0E6 '..'
shl dh,1 ; 00008C62 D0E6 '..'
pop ax ; 00008C64 58 'X'
mov al,ah ; 00008C65 8AC4 '..'
x8c67: mov di,bx ; 00008C67 8BFB '..'
mov cl,dl ; 00008C69 8ACA '..'
rep stosb ; 00008C6B F3AA '..'
mov di,bx ; 00008C6D 8BFB '..'
xor di,0x2000 ; 00008C6F 81F70020 '... '
mov cl,dl ; 00008C73 8ACA '..'
rep stosb ; 00008C75 F3AA '..'
add bx,bp ; 00008C77 03DD '..'
dec dh ; 00008C79 FECE '..'
jnz x8c67 ; 00008C7B 75EA 'u.'
ret ; 00008C7D C3 '.'
x8c7e: push ds ; 00008C7E 1E '.'
xor ebp,ebp ; 00008C7F 6633ED 'f3.'
x8c82: mov eax,0x1 ; 00008C82 66B801000000 'f.....'
xor eax,ebp ; 00008C88 6633C5 'f3.'
mov cx,0x4000 ; 00008C8B B90040 '..@'
xor di,di ; 00008C8E 33FF '3.'
sahf ; 00008C90 9E '.'
x8c91: rcl eax,1 ; 00008C91 66D1D0 'f..'
stosd ; 00008C94 66AB 'f.'
loop x8c91 ; 00008C96 E2F9 '..'
in al,0x61 ; 00008C98 E461 '.a'
or al,0xc ; 00008C9A 0C0C '..'
out 0x61,al ; 00008C9C E661 '.a'
and al,0xf3 ; 00008C9E 24F3 '$.'
out 0x61,al ; 00008CA0 E661 '.a'
mov ebx,0x1 ; 00008CA2 66BB01000000 'f.....'
xor ebx,ebp ; 00008CA8 6633DD 'f3.'
mov eax,ebp ; 00008CAB 668BC5 'f..'
push es ; 00008CAE 06 '.'
pop ds ; 00008CAF 1F '.'
xor si,si ; 00008CB0 33F6 '3.'
x8cb2: mov cx,0x4000 ; 00008CB2 B90040 '..@'
x8cb5: sahf ; 00008CB5 9E '.'
rcl ebx,1 ; 00008CB6 66D1D3 'f..'
lahf ; 00008CB9 9F '.'
lodsb ; 00008CBA AC '.'
inc si ; 00008CBB 46 'F'
inc si ; 00008CBC 46 'F'
inc si ; 00008CBD 46 'F'
xor al,bl ; 00008CBE 32C3 '2.'
loope x8cb5 ; 00008CC0 E1F3 '..'
jnz x8ce7 ; 00008CC2 7523 'u#'
in al,0x61 ; 00008CC4 E461 '.a'
test al,0xc0 ; 00008CC6 A8C0 '..'
mov al,0x0 ; 00008CC8 B000 '..'
jnz x8ce7 ; 00008CCA 751B 'u.'
mov cl,0x9 ; 00008CCC B109 '..'
sahf ; 00008CCE 9E '.'
rcl ebx,cl ; 00008CCF 66D3D3 'f..'
inc si ; 00008CD2 46 'F'
cmp si,byte +0x4 ; 00008CD3 83FE04 '...'
jc x8cb2 ; 00008CD6 72DA 'r.'
sahf ; 00008CD8 9E '.'
mov cl,0x1f ; 00008CD9 B11F '..'
rcl ebx,cl ; 00008CDB 66D3D3 'f..'
lahf ; 00008CDE 9F '.'
dec ebp ; 00008CDF 664D 'fM'
jpe x8c82 ; 00008CE1 7A9F 'z.'
pop ds ; 00008CE3 1F '.'
xor ax,ax ; 00008CE4 33C0 '3.'
ret ; 00008CE6 C3 '.'
x8ce7: mov byte [si],0x0 ; 00008CE7 C60400 '...'
push ax ; 00008CEA 50 'P'
in al,0x61 ; 00008CEB E461 '.a'
or al,0xc ; 00008CED 0C0C '..'
out 0x61,al ; 00008CEF E661 '.a'
and al,0xf3 ; 00008CF1 24F3 '$.'
out 0x61,al ; 00008CF3 E661 '.a'
pop cx ; 00008CF5 59 'Y'
mov dx,si ; 00008CF6 8BD6 '..'
pop ds ; 00008CF8 1F '.'
stc ; 00008CF9 F9 '.'
ret ; 00008CFA C3 '.'
call x8d30 ; 00008CFB E83200 '.2.'
mov al,[es:di] ; 00008CFE 268A05 '&..'
not bh ; 00008D01 F6D7 '..'
and al,bh ; 00008D03 22C7 '".'
shr al,cl ; 00008D05 D2E8 '..'
mov [bp+0x0],al ; 00008D07 884600 '.F.'
ret ; 00008D0A C3 '.'
call x8d30 ; 00008D0B E82200 '.".'
cbw ; 00008D0E 98 '.'
and al,bl ; 00008D0F 22C3 '".'
shl al,cl ; 00008D11 D2E0 '..'
sar ah,1 ; 00008D13 D0FC '..'
jns x8d22 ; 00008D15 790B 'y.'
xor [es:di],al ; 00008D17 263005 '&0.'
mov ah,[0x49] ; 00008D1A 8A264900 '.&I.'
mov [bp+0x1],ah ; 00008D1E 886601 '.f.'
ret ; 00008D21 C3 '.'
x8d22: and bh,[es:di] ; 00008D22 26223D '&"='
or al,bh ; 00008D25 0AC7 0x0A,'.'
stosb ; 00008D27 AA '.'
mov ah,[0x49] ; 00008D28 8A264900 '.&I.'
mov [bp+0x1],ah ; 00008D2C 886601 '.f.'
ret ; 00008D2F C3 '.'
x8d30: xor di,di ; 00008D30 33FF '3.'
mov dx,[bp+0x2] ; 00008D32 8B5602 '.V.'
shr dx,1 ; 00008D35 D1EA '..'
jnc x8d3c ; 00008D37 7303 's.'
mov di,0x2000 ; 00008D39 BF0020 '.. '
x8d3c: shl dx,1 ; 00008D3C D1E2 '..'
shl dx,1 ; 00008D3E D1E2 '..'
shl dx,1 ; 00008D40 D1E2 '..'
shl dx,1 ; 00008D42 D1E2 '..'
add di,dx ; 00008D44 03FA '..'
shl dx,1 ; 00008D46 D1E2 '..'
shl dx,1 ; 00008D48 D1E2 '..'
add di,dx ; 00008D4A 03FA '..'
mov bh,0xfe ; 00008D4C B7FE '..'
cmp byte [0x49],0x6 ; 00008D4E 803E490006 '.>I..'
jnc x8d59 ; 00008D53 7304 's.'
rcl cx,1 ; 00008D55 D1D1 '..'
shl bh,1 ; 00008D57 D0E7 '..'
x8d59: mov bl,bh ; 00008D59 8ADF '..'
not bl ; 00008D5B F6D3 '..'
mov dx,cx ; 00008D5D 8BD1 '..'
shr dx,1 ; 00008D5F D1EA '..'
shr dx,1 ; 00008D61 D1EA '..'
shr dx,1 ; 00008D63 D1EA '..'
not cl ; 00008D65 F6D1 '..'
and cl,0x7 ; 00008D67 80E107 '...'
rol bh,cl ; 00008D6A D2C7 '..'
add di,dx ; 00008D6C 03FA '..'
ret ; 00008D6E C3 '.'
x8d6f: mov al,0xd ; 00008D6F B00D '.',0x0D
call x8d78 ; 00008D71 E80400 '...'
jc x8d8c ; 00008D74 7216 'r.'
mov al,0xa ; 00008D76 B00A '.',0x0A
x8d78: push dx ; 00008D78 52 'R'
xor dx,dx ; 00008D79 33D2 '3.'
test al,al ; 00008D7B 84C0 '..'
jnz x8d81 ; 00008D7D 7502 'u.'
mov al,0x20 ; 00008D7F B020 '. '
x8d81: mov ah,0x0 ; 00008D81 B400 '..'
int 0x17 ; 00008D83 CD17 '..'
test ah,0x1 ; 00008D85 F6C401 '...'
jz x8d8b ; 00008D88 7401 't.'
stc ; 00008D8A F9 '.'
x8d8b: pop dx ; 00008D8B 5A 'Z'
x8d8c: ret ; 00008D8C C3 '.'
x8d8d: dec di ; 00008D8D 4F 'O'
mov cx,di ; 00008D8E 8BCF '..'
x8d90: push cx ; 00008D90 51 'Q'
mov cx,0x64 ; 00008D91 B96400 '.d.'
x8d94: call xe944 ; 00008D94 E8AD5B '..['
jz x8d9f ; 00008D97 7406 't.'
loop x8d94 ; 00008D99 E2F9 '..'
pop cx ; 00008D9B 59 'Y'
stc ; 00008D9C F9 '.'
jmp short x8da8 ; 00008D9D EB09 '..'
x8d9f: call x919a ; 00008D9F E8F803 '...'
lodsb ; 00008DA2 AC '.'
out dx,al ; 00008DA3 EE '.'
pop cx ; 00008DA4 59 'Y'
loop x8d90 ; 00008DA5 E2E9 '..'
clc ; 00008DA7 F8 '.'
x8da8: ret ; 00008DA8 C3 '.'
x8da9: test byte [0x87],0x4 ; 00008DA9 F606870004 '.....'
ret ; 00008DAE C3 '.'
db 0xFF ; 00008DAF FF '.'
jmp 0xf000:0x8e31 ; 00008DB0 EA318E00F0 '.1...'
push ax ; 00008DB5 50 'P'
push si ; 00008DB6 56 'V'
push ds ; 00008DB7 1E '.'
mov ax,0x40 ; 00008DB8 B84000 '.@.'
mov ds,ax ; 00008DBB 8ED8 '..'
mov ax,0x3 ; 00008DBD B80300 '...'
call xd3b4 ; 00008DC0 E8F145 '..E'
pop ds ; 00008DC3 1F '.'
pop si ; 00008DC4 5E '^'
pop ax ; 00008DC5 58 'X'
iret ; 00008DC6 CF '.'
x8dc7: mov bp,bx ; 00008DC7 8BEB '..'
add bx,byte +0x10 ; 00008DC9 83C310 '...'
cli ; 00008DCC FA '.'
mov ss,bx ; 00008DCD 8ED3 '..'
mov sp,cx ; 00008DCF 8BE1 '..'
mov es,cx ; 00008DD1 8EC1 '..'
mov cx,0x420 ; 00008DD3 B92004 '. .'
add cx,bx ; 00008DD6 03CB '..'
mov ss,cx ; 00008DD8 8ED1 '..'
mov cx,0x49 ; 00008DDA B94900 '.I.'
cld ; 00008DDD FC '.'
mov di,0x300 ; 00008DDE BF0003 '...'
mov si,0x8eea ; 00008DE1 BEEA8E '...'
cs rep movsw ; 00008DE4 F32EA5 '...'
mov ax,[0x250] ; 00008DE7 A15002 '.P.'
cmp ax,[0x258] ; 00008DEA 3B065802 ';.X.'
jnz x8df3 ; 00008DEE 7503 'u.'
mov [0x300],al ; 00008DF0 A20003 '...'
x8df3: cmp ax,0x157 ; 00008DF3 3D5701 '=W.'
jnz x8e02 ; 00008DF6 750A 'u',0x0A
mov di,0x24 ; 00008DF8 BF2400 '.$.'
mov ax,0xe987 ; 00008DFB B887E9 '...'
stosw ; 00008DFE AB '.'
mov ax,cs ; 00008DFF 8CC8 '..'
stosw ; 00008E01 AB '.'
x8e02: mov di,0x6c ; 00008E02 BF6C00 '.l.'
mov ax,0x8db5 ; 00008E05 B8B58D '...'
stosw ; 00008E08 AB '.'
mov ax,cs ; 00008E09 8CC8 '..'
stosw ; 00008E0B AB '.'
mov ax,0xff53 ; 00008E0C B853FF '.S.'
stosw ; 00008E0F AB '.'
mov ax,cs ; 00008E10 8CC8 '..'
stosw ; 00008E12 AB '.'
mov es,bp ; 00008E13 8EC5 '..'
les ax,[es:0x12] ; 00008E15 26C4061200 '&....'
mov [0x90],ax ; 00008E1A A39000 '...'
mov [0x92],es ; 00008E1D 8C069200 '....'
sti ; 00008E21 FB '.'
mov ds,sp ; 00008E22 8EDC '..'
push bx ; 00008E24 53 'S'
x8e25: mov di,0x301 ; 00008E25 BF0103 '...'
mov dx,0x385 ; 00008E28 BA8503 '...'
mov ah,0xf ; 00008E2B B40F '..'
int 0x21 ; 00008E2D CD21 '.!'
jmp short x8e40 ; 00008E2F EB0F '..'
xor cx,cx ; 00008E31 33C9 '3.'
mov ds,cx ; 00008E33 8ED9 '..'
mov bx,[0x252] ; 00008E35 8B1E5202 '..R.'
test bx,bx ; 00008E39 85DB '..'
jnz x8dc7 ; 00008E3B 758A 'u.'
jmp xe7c0 ; 00008E3D E98059 '..Y'
x8e40: or al,al ; 00008E40 0AC0 0x0A,'.'
jz x8e72 ; 00008E42 742E 't.'
x8e44: mov dx,0x302 ; 00008E44 BA0203 '...'
mov ah,0x9 ; 00008E47 B409 '..'
int 0x21 ; 00008E49 CD21 '.!'
mov ax,0xc01 ; 00008E4B B8010C '...'
int 0x21 ; 00008E4E CD21 '.!'
cmp byte [di],0x0 ; 00008E50 803D00 '.=.'
jnz x8e62 ; 00008E53 750D 'u',0x0D
mov byte [di],0xff ; 00008E55 C605FF '...'
cmp al,0xd ; 00008E58 3C0D '<',0x0D
jnz x8e62 ; 00008E5A 7506 'u.'
mov ah,0x19 ; 00008E5C B419 '..'
int 0x21 ; 00008E5E CD21 '.!'
add al,0x41 ; 00008E60 0441 '.A'
x8e62: and al,0x5f ; 00008E62 245F '$_'
cmp al,0x41 ; 00008E64 3C41 '<A'
jc x8e44 ; 00008E66 72DC 'r.'
mov [0x359],al ; 00008E68 A25903 '.Y.'
and al,0xf ; 00008E6B 240F '$.'
mov [0x385],al ; 00008E6D A28503 '...'
jmp short x8e25 ; 00008E70 EBB3 '..'
x8e72: xor cx,cx ; 00008E72 33C9 '3.'
mov [0x3a6],cx ; 00008E74 890EA603 '....'
mov [0x3a8],cx ; 00008E78 890EA803 '....'
inc cx ; 00008E7C 41 'A'
mov word [0x393],0x200 ; 00008E7D C70693030002 '......'
xor dx,dx ; 00008E83 33D2 '3.'
push ds ; 00008E85 1E '.'
mov ds,bx ; 00008E86 8EDB '..'
mov ah,0x1a ; 00008E88 B41A '..'
int 0x21 ; 00008E8A CD21 '.!'
pop ds ; 00008E8C 1F '.'
mov dx,0x385 ; 00008E8D BA8503 '...'
mov ah,0x27 ; 00008E90 B427 '.',0x27
int 0x21 ; 00008E92 CD21 '.!'
push ds ; 00008E94 1E '.'
mov ds,bx ; 00008E95 8EDB '..'
mov dx,[0x14] ; 00008E97 8B161400 '....'
mov cx,[0x4] ; 00008E9B 8B0E0400 '....'
pop ds ; 00008E9F 1F '.'
push dx ; 00008EA0 52 'R'
dec cx ; 00008EA1 49 'I'
push cx ; 00008EA2 51 'Q'
mov dx,0x385 ; 00008EA3 BA8503 '...'
mov ah,0x27 ; 00008EA6 B427 '.',0x27
int 0x21 ; 00008EA8 CD21 '.!'
cmp al,0x2 ; 00008EAA 3C02 '<.'
pop ax ; 00008EAC 58 'X'
jnz x8ec9 ; 00008EAD 751A 'u.'
xchg ax,cx ; 00008EAF 91 '.'
sub cx,ax ; 00008EB0 2BC8 '+.'
push ds ; 00008EB2 1E '.'
mov dx,bx ; 00008EB3 8BD3 '..'
add dx,0xfe0 ; 00008EB5 81C2E00F '....'
mov ds,dx ; 00008EB9 8EDA '..'
xor dx,dx ; 00008EBB 33D2 '3.'
mov ah,0x1a ; 00008EBD B41A '..'
int 0x21 ; 00008EBF CD21 '.!'
pop ds ; 00008EC1 1F '.'
mov dx,0x385 ; 00008EC2 BA8503 '...'
mov ah,0x27 ; 00008EC5 B427 '.',0x27
int 0x21 ; 00008EC7 CD21 '.!'
x8ec9: mov ah,0x10 ; 00008EC9 B410 '..'
int 0x21 ; 00008ECB CD21 '.!'
cmp byte [di],0x0 ; 00008ECD 803D00 '.=.'
jz x8ede ; 00008ED0 740C 't.'
mov dx,0x33a ; 00008ED2 BA3A03 '.:.'
mov ah,0x9 ; 00008ED5 B409 '..'
int 0x21 ; 00008ED7 CD21 '.!'
mov ax,0xc08 ; 00008ED9 B8080C '...'
int 0x21 ; 00008EDC CD21 '.!'
x8ede: mov es,bp ; 00008EDE 8EC5 '..'
mov ds,bp ; 00008EE0 8EDD '..'
mov dx,0x80 ; 00008EE2 BA8000 '...'
mov ah,0x1a ; 00008EE5 B41A '..'
int 0x21 ; 00008EE7 CD21 '.!'
retf ; 00008EE9 CB '.'
dw 0x0000 ; 00008EEA 0000 '..'
db 0x0D,0x0A,'Insert COMPAQ MS-DOS diskette',0x0D,0x0A
db 'Enter drive specifier $',0x0D,0x0A,0x0D,0x0A
db 'Reinsert diskette in drive A if necessary',0x0D,0x0A
db 'Strike any key when ready',0x0D,0x0A,'$'
db 0x00
db 'BASICA EXE',0x00
x8f7c: call xd47d ; 00008F7C E8FE44
test al,0x01 ; 00008F7F A801
jz x8f98 ; 00008F81 7415
call x9190 ; 00008F83 E80A02 '.',0x0A,'.'
mov ah,[bx] ; 00008F86 8A27 '.',0x27
call xd490 ; 00008F88 E80545 '..E'
call xc956 ; 00008F8B E8C839 '..9'
xor ax,ax ; 00008F8E 33C0 '3.'
mov dx,0x3f7 ; 00008F90 BAF703 '...'
in al,dx ; 00008F93 EC '.'
test al,0x80 ; 00008F94 A880 '..'
jz x8fa3 ; 00008F96 740B 't.'
x8f98: mov ah,0x6 ; 00008F98 B406 '..'
or word [bp+0x16],0x1 ; 00008F9A 814E160100 '.N...'
mov [0x41],ah ; 00008F9F 88264100 '.&A.'
x8fa3: ret ; 00008FA3 C3 '.'
x8fa4: call xd47d ; 00008FA4 E8D644 '..D'
test al,0x1 ; 00008FA7 A801 '..'
jnz x8faf ; 00008FA9 7504 'u.'
xor ah,ah ; 00008FAB 32E4 '2.'
jmp short x900f ; 00008FAD EB60 '.`'
x8faf: call x8f7c ; 00008FAF E8CAFF
jz x900f ; 00008FB2 745B 't['
call x9190 ; 00008FB4 E8D901 '...'
test byte [bx],0x10 ; 00008FB7 F60710 '...'
jz x8fcb ; 00008FBA 740F 't.'
mov ah,[bx] ; 00008FBC 8A27 '.',0x27
cmp ah,0x97 ; 00008FBE 80FC97 '...'
jnz x8fc6 ; 00008FC1 7503 'u.'
add ah,0x3 ; 00008FC3 80C403 '...'
x8fc6: sub ah,0x13 ; 00008FC6 80EC13 '...'
jmp short x8fdc ; 00008FC9 EB11 '..'
x8fcb: call xd405 ; 00008FCB E83744 '.7D'
mov ah,0x87 ; 00008FCE B487 '..'
cmp al,0x3 ; 00008FD0 3C03 '<.'
jz x8fdc ; 00008FD2 7408 't.'
mov ah,0x7 ; 00008FD4 B407 '..'
cmp al,0x4 ; 00008FD6 3C04 '<.'
jz x8fdc ; 00008FD8 7402 't.'
mov ah,0x61 ; 00008FDA B461 '.a'
x8fdc: mov [bx],ah ; 00008FDC 8827 '.',0x27
call xd490 ; 00008FDE E8AF44 '..D'
call xca03 ; 00008FE1 E81F3A '..:'
mov al,[bp+0x5] ; 00008FE4 8A4605 '.F.'
push ax ; 00008FE7 50 'P'
mov byte [bp+0x5],0x2 ; 00008FE8 C6460502 '.F..'
call xee9c ; 00008FEC E8AD5E '..^'
mov byte [bp+0x5],0x0 ; 00008FEF C6460500 '.F..'
call xee9c ; 00008FF3 E8A65E '..^'
pop ax ; 00008FF6 58 'X'
mov [bp+0x5],al ; 00008FF7 884605 '.F.'
mov ah,0x6 ; 00008FFA B406 '..'
mov dx,0x3f7 ; 00008FFC BAF703 '...'
in al,dx ; 00008FFF EC '.'
test al,0x80 ; 00009000 A880 '..'
jz x9006 ; 00009002 7402 't.'
mov ah,0x80 ; 00009004 B480 '..'
x9006: mov [0x41],ah ; 00009006 88264100 '.&A.'
or word [bp+0x16],0x1 ; 0000900A 814E160100 '.N...'
x900f: ret ; 0000900F C3 '.'
xor di,di ; 00009010 33FF '3.'
call x8fa4 ; 00009012 E88FFF '...'
jz x901e ; 00009015 7407 't.'
test ah,0x80 ; 00009017 F6C480 '...'
jnz x9060 ; 0000901A 7544 'uD'
mov di,ax ; 0000901C 8BF8 '..'
x901e: xor ah,ah ; 0000901E 32E4 '2.'
mov al,[bp+0x0] ; 00009020 8A4600 '.F.'
cmp al,0x5 ; 00009023 3C05 '<.'
jc x9030 ; 00009025 7209 'r.'
mov ah,0x1 ; 00009027 B401 '..'
or word [bp+0x16],0x1 ; 00009029 814E160100 '.N...'
jmp short x9060 ; 0000902E EB30 '.0'
x9030: or al,al ; 00009030 0AC0 0x0A,'.'
jz x9056 ; 00009032 7422 't"'
mov ah,0x93 ; 00009034 B493 '..'
cmp al,0x1 ; 00009036 3C01 '<.'
jz x904a ; 00009038 7410 't.'
mov ah,0x74 ; 0000903A B474 '.t'
cmp al,0x2 ; 0000903C 3C02 '<.'
jz x9051 ; 0000903E 7411 't.'
mov ah,0x15 ; 00009040 B415 '..'
cmp al,0x3 ; 00009042 3C03 '<.'
jz x9051 ; 00009044 740B 't.'
mov ah,0x97 ; 00009046 B497 '..'
jmp short x9051 ; 00009048 EB07 '..'
x904a: mov al,0x1 ; 0000904A B001 '..'
call xd468 ; 0000904C E81944 '..D'
jmp short x9056 ; 0000904F EB05 '..'
x9051: mov al,0x1 ; 00009051 B001 '..'
call xd455 ; 00009053 E8FF43 '..C'
x9056: call x9190 ; 00009056 E83701 '.7.'
mov [bx],ah ; 00009059 8827 '.',0x27
call xd490 ; 0000905B E83244 '.2D'
mov ax,di ; 0000905E 8BC7 '..'
x9060: ret ; 00009060 C3 '.'
x9061: call x9190 ; 00009061 E82C01 '.,.'
mov ah,[bx] ; 00009064 8A27 '.',0x27
call xd490 ; 00009066 E82744 '.',0x27,'D'
test ah,0x10 ; 00009069 F6C410 '...'
jnz x9071 ; 0000906C 7503 'u.'
call x9072 ; 0000906E E80100 '...'
x9071: ret ; 00009071 C3 '.'
x9072: call x9190 ; 00009072 E81B01 '...'
mov al,[bx] ; 00009075 8A07 '..'
mov [bx+0x2],al ; 00009077 884702 '.G.'
push word [bp+0x0] ; 0000907A FF7600 '.v.'
mov al,[bp+0x5] ; 0000907D 8A4605 '.F.'
cmp al,0x27 ; 00009080 3C27 '<',0x27
ja x90b9 ; 00009082 7735 'w5'
call xd3f3 ; 00009084 E86C43 '.lC'
jnz x909b ; 00009087 7512 'u.'
call xd3ff ; 00009089 E87343 '.sC'
cmp byte [bp+0x6],0x0 ; 0000908C 807E0600 '.~..'
jnz x9095 ; 00009090 7503 'u.'
shr al,0x4 ; 00009092 C0E804 '...'
x9095: and al,0xf ; 00009095 240F '$.'
cmp al,0x3 ; 00009097 3C03 '<.'
jnc x90b9 ; 00009099 731E 's.'
x909b: call xca03 ; 0000909B E86539 '.e9'
call x9190 ; 0000909E E8EF00 '...'
mov ah,0x61 ; 000090A1 B461 '.a'
mov [bx],ah ; 000090A3 8827 '.',0x27
call xd490 ; 000090A5 E8E843 '..C'
mov al,0x6 ; 000090A8 B006 '..'
mov byte [bp+0x1],0x4 ; 000090AA C6460104 '.F..'
mov byte [bp+0x0],0x1 ; 000090AE C6460001 '.F..'
push ax ; 000090B2 50 'P'
call xecf0 ; 000090B3 E83A5C '.:\'
pop ax ; 000090B6 58 'X'
jz x9129 ; 000090B7 7470 'tp'
x90b9: call xca03 ; 000090B9 E84739 '.G9'
call x9190 ; 000090BC E8D100 '...'
mov ah,0x2 ; 000090BF B402 '..'
mov [bx],ah ; 000090C1 8827 '.',0x27
call xd490 ; 000090C3 E8CA43 '..C'
mov al,0x6 ; 000090C6 B006 '..'
mov byte [bp+0x1],0x4 ; 000090C8 C6460104 '.F..'
mov byte [bp+0x0],0x1 ; 000090CC C6460001 '.F..'
push ax ; 000090D0 50 'P'
call xecf0 ; 000090D1 E81C5C '..\'
pop ax ; 000090D4 58 'X'
jz x912b ; 000090D5 7454 'tT'
call xca03 ; 000090D7 E82939 '.)9'
call x9190 ; 000090DA E8B300 '...'
mov ah,0x87 ; 000090DD B487 '..'
mov [bx],ah ; 000090DF 8827 '.',0x27
call xd490 ; 000090E1 E8AC43 '..C'
mov al,0x4 ; 000090E4 B004 '..'
mov byte [bp+0x1],0x4 ; 000090E6 C6460104 '.F..'
mov byte [bp+0x0],0x1 ; 000090EA C6460001 '.F..'
push ax ; 000090EE 50 'P'
call xecf0 ; 000090EF E8FE5B '..['
pop ax ; 000090F2 58 'X'
jz x9144 ; 000090F3 744F 'tO'
call xca03 ; 000090F5 E80B39 '..9'
call x9190 ; 000090F8 E89500 '...'
mov ah,0x61 ; 000090FB B461 '.a'
mov [bx],ah ; 000090FD 8827 '.',0x27
call xd490 ; 000090FF E88E43 '..C'
mov al,0x6 ; 00009102 B006 '..'
mov byte [bp+0x1],0x4 ; 00009104 C6460104 '.F..'
mov byte [bp+0x0],0x1 ; 00009108 C6460001 '.F..'
push ax ; 0000910C 50 'P'
call xecf0 ; 0000910D E8E05B '..['
pop ax ; 00009110 58 'X'
jz x9147 ; 00009111 7434 't4'
or word [bp+0x16],0x1 ; 00009113 814E160100 '.N...'
call x9190 ; 00009118 E87500 '.u.'
mov ah,[bx+0x2] ; 0000911B 8A6702 '.g.'
mov [bx],ah ; 0000911E 8827 '.',0x27
call xd490 ; 00009120 E86D43 '.mC'
mov ah,[0x41] ; 00009123 8A264100 '.&A.'
jmp short x9155 ; 00009127 EB2C '.,'
x9129: jmp short x9147 ; 00009129 EB1C '..'
x912b: call xd3f3 ; 0000912B E8C542 '..B'
jnz x9147 ; 0000912E 7517 'u.'
call xd3ff ; 00009130 E8CC42 '..B'
cmp byte [bp+0x6],0x0 ; 00009133 807E0600 '.~..'
jnz x913c ; 00009137 7503 'u.'
shr al,0x4 ; 00009139 C0E804 '...'
x913c: and al,0xf ; 0000913C 240F '$.'
cmp al,0x4 ; 0000913E 3C04 '<.'
jnz x9147 ; 00009140 7505 'u.'
mov ah,0x7 ; 00009142 B407 '..'
x9144: sub ah,0x3 ; 00009144 80EC03 '...'
x9147: call xd455 ; 00009147 E80B43 '..C'
add ah,0x13 ; 0000914A 80C413 '...'
call x9190 ; 0000914D E84000 '.@.'
mov [bx],ah ; 00009150 8827 '.',0x27
call xd490 ; 00009152 E83B43 '.;C'
x9155: mov byte [bx+0x2],0x0 ; 00009155 C6470200 '.G..'
pop word [bp+0x0] ; 00009159 8F4600 '.F.'
xor al,al ; 0000915C 32C0 '2.'
push word [bp+0x16] ; 0000915E FF7616 '.v.'
popf ; 00009161 9D '.'
ret ; 00009162 C3 '.'
x9163: xor al,al ; 00009163 32C0 '2.'
mov ah,[bp+0x6] ; 00009165 8A6606 '.f.'
cmp ah,0x2 ; 00009168 80FC02 '...'
jc x9176 ; 0000916B 7209 'r.'
mov ah,0x1 ; 0000916D B401 '..'
or word [bp+0x16],0x1 ; 0000916F 814E160100 '.N...'
jmp short x918f ; 00009174 EB19 '..'
x9176: mov ah,0x0 ; 00009176 B400 '..'
call x9190 ; 00009178 E81500 '...'
or al,[bx] ; 0000917B 0A07 0x0A,'.'
jz x918f ; 0000917D 7410 't.'
mov ah,0x1 ; 0000917F B401 '..'
test al,0x10 ; 00009181 A810 '..'
jnz x9187 ; 00009183 7502 'u.'
add al,0x13 ; 00009185 0413 '..'
x9187: and al,0x7 ; 00009187 2407 '$.'
sub al,0x3 ; 00009189 2C03 ',.'
jz x918f ; 0000918B 7402 't.'
mov ah,0x2 ; 0000918D B402 '..'
x918f: ret ; 0000918F C3 '.'
x9190: xor bx,bx ; 00009190 33DB '3.'
mov bl,[bp+0x6] ; 00009192 8A5E06 '.^.'
add bx,0x90 ; 00009195 81C39000 '....'
ret ; 00009199 C3 '.'
x919a: push ax ; 0000919A 50 'P'
pushf ; 0000919B 9C '.'
cli ; 0000919C FA '.'
in al,0x40 ; 0000919D E440 '.@'
mov ah,al ; 0000919F 8AE0 '..'
x91a1: in al,0x40 ; 000091A1 E440 '.@'
in al,0x40 ; 000091A3 E440 '.@'
sub al,ah ; 000091A5 2AC4 '*.'
cmp al,0xda ; 000091A7 3CDA '<.'
ja x91a1 ; 000091A9 77F6 'w.'
in al,0x40 ; 000091AB E440 '.@'
popf ; 000091AD 9D '.'
pop ax ; 000091AE 58 'X'
ret ; 000091AF C3 '.'
x91b0: mov dx,0x1f6 ; 000091B0 BAF601 '...'
mov al,0xa0 ; 000091B3 B0A0 '..'
out dx,al ; 000091B5 EE '.'
call xc5af ; 000091B6 E8F633 '..3'
call x83f9 ; 000091B9 E83DF2 '.=.'
mov al,0xa8 ; 000091BC B0A8 '..'
out 0x84,al ; 000091BE E684 '..'
sti ; 000091C0 FB '.'
mov dx,0x3f4 ; 000091C1 BAF403 '...'
in al,dx ; 000091C4 EC '.'
std ; 000091C5 FD '.'
std ; 000091C6 FD '.'
std ; 000091C7 FD '.'
std ; 000091C8 FD '.'
std ; 000091C9 FD '.'
std ; 000091CA FD '.'
cld ; 000091CB FC '.'
and al,0xf ; 000091CC 240F '$.'
or al,al ; 000091CE 0AC0 0x0A,'.'
jz x91d5 ; 000091D0 7403 't.'
jmp short x922a ; 000091D2 EB56 '.V'
nop ; 000091D4 90 '.'
x91d5: sub sp,byte +0xd ; 000091D5 83EC0D '..',0x0D
mov bp,sp ; 000091D8 8BEC '..'
xor ax,ax ; 000091DA 33C0 '3.'
mov ds,ax ; 000091DC 8ED8 '..'
les si,[0x78] ; 000091DE C4367800 '.6x.'
mov ax,0x40 ; 000091E2 B84000 '.@.'
mov ds,ax ; 000091E5 8ED8 '..'
mov byte [0x40],0xff ; 000091E7 C6064000FF '..@..'
call xca03 ; 000091EC E81438 '..8'
mov byte [bp+0x6],0x0 ; 000091EF C6460600 '.F..'
mov byte [bp+0x7],0x0 ; 000091F3 C6460700 '.F..'
call x9293 ; 000091F7 E89900 '...'
mov byte [bp+0x6],0x1 ; 000091FA C6460601 '.F..'
call x9293 ; 000091FE E89200 '...'
mov byte [bp+0x5],0x0 ; 00009201 C6460500 '.F..'
call xee9c ; 00009205 E8945C '..\'
mov al,0xaf ; 00009208 B0AF '..'
out 0x84,al ; 0000920A E684 '..'
mov dx,0x3f2 ; 0000920C BAF203 '...'
mov al,0xc ; 0000920F B00C '..'
out dx,al ; 00009211 EE '.'
and byte [0x3f],0xf0 ; 00009212 80263F00F0 '.&?..'
add sp,byte +0xd ; 00009217 83C40D '..',0x0D
mov al,0xb3 ; 0000921A B0B3 '..'
mov ah,al ; 0000921C 8AE0 '..'
call xb544 ; 0000921E E82323 '.##'
and al,0xf8 ; 00009221 24F8 '$.'
xchg ah,al ; 00009223 86E0 '..'
mov al,0x33 ; 00009225 B033 '.3'
call xb549 ; 00009227 E81F23 '..#'
x922a: xor ax,ax ; 0000922A 33C0 '3.'
mov bx,ax ; 0000922C 8BD8 '..'
mov cx,ax ; 0000922E 8BC8 '..'
or bl,[0x90] ; 00009230 0A1E9000 0x0A,'...'
jz x9238 ; 00009234 7402 't.'
inc ch ; 00009236 FEC5 '..'
x9238: or bh,[0x91] ; 00009238 0A3E9100 0x0A,'>..'
jz x9240 ; 0000923C 7402 't.'
inc ch ; 0000923E FEC5 '..'
x9240: or ch,ch ; 00009240 0AED 0x0A,'.'
jz x9250 ; 00009242 740C 't.'
dec ch ; 00009244 FECD '..'
shl ch,0x6 ; 00009246 C0E506 '...'
or ch,0x1 ; 00009249 80CD01 '...'
or [0x10],ch ; 0000924C 082E1000 '....'
x9250: cli ; 00009250 FA '.'
call xd42c ; 00009251 E8D841 '..A'
test al,0x40 ; 00009254 A840 '.@'
jnz x9291 ; 00009256 7539 'u9'
call xd3fb ; 00009258 E8A041 '..A'
mov ah,al ; 0000925B 8AE0 '..'
shr al,0x4 ; 0000925D C0E804 '...'
and ah,0xf ; 00009260 80E40F '...'
or bl,bl ; 00009263 0ADB 0x0A,'.'
jz x9276 ; 00009265 740F 't.'
xchg bl,ah ; 00009267 86DC '..'
call x9303 ; 00009269 E89700 '...'
jnz x9276 ; 0000926C 7508 'u.'
xchg ax,bx ; 0000926E 93 '.'
call x9303 ; 0000926F E89100 '...'
jz x9291 ; 00009272 741D 't.'
jmp short x9284 ; 00009274 EB0E '..'
x9276: mov al,0xb3 ; 00009276 B0B3 '..'
mov ah,al ; 00009278 8AE0 '..'
call xb544 ; 0000927A E8C722 '.."'
or al,0x4 ; 0000927D 0C04 '..'
xchg al,ah ; 0000927F 86C4 '..'
call xb549 ; 00009281 E8C522 '.."'
x9284: call xd42c ; 00009284 E8A541 '..A'
mov ah,al ; 00009287 8AE0 '..'
or ah,0x20 ; 00009289 80CC20 '.. '
mov al,0x8e ; 0000928C B08E '..'
call xb549 ; 0000928E E8B822 '.."'
x9291: sti ; 00009291 FB '.'
ret ; 00009292 C3 '.'
x9293: push word [bp+0x5] ; 00009293 FF7605 '.v.'
mov al,0x7 ; 00009296 B007 '..'
call xd468 ; 00009298 E8CD41 '..A'
mov ah,0x93 ; 0000929B B493 '..'
call xd490 ; 0000929D E8F041 '..A'
call x9190 ; 000092A0 E8EDFE '...'
mov byte [bx],0x0 ; 000092A3 C60700 '...'
mov byte [bp+0x5],0x30 ; 000092A6 C6460530 '.F.0'
call xee9c ; 000092AA E8EF5B '..['
mov byte [bp+0x5],0x8 ; 000092AD C6460508 '.F..'
x92b1: call xee9c ; 000092B1 E8E85B '..['
mov bh,0x4 ; 000092B4 B704 '..'
call xd4c4 ; 000092B6 E80B42 '..B'
mov bh,[bp+0x6] ; 000092B9 8A7E06 '.~.'
call xd4c4 ; 000092BC E80542 '..B'
mov cx,0xa86b ; 000092BF B96BA8 '.k.'
x92c2: call xc9bf ; 000092C2 E8FA36 '..6'
jnz x92cb ; 000092C5 7504 'u.'
loop x92c2 ; 000092C7 E2F9 '..'
jmp short x92fe ; 000092C9 EB33 '.3'
x92cb: call x919a ; 000092CB E8CCFE '...'
in al,dx ; 000092CE EC '.'
test al,0x10 ; 000092CF A810 '..'
jnz x92de ; 000092D1 750B 'u.'
cmp byte [bp+0x5],0x0 ; 000092D3 807E0500 '.~..'
jz x92ff ; 000092D7 7426 't&'
dec byte [bp+0x5] ; 000092D9 FE4E05 '.N.'
jmp short x92b1 ; 000092DC EBD3 '..'
x92de: mov ah,0x7 ; 000092DE B407 '..'
mov al,0x1 ; 000092E0 B001 '..'
cmp byte [bp+0x5],0x0 ; 000092E2 807E0500 '.~..'
jnz x92ed ; 000092E6 7505 'u.'
call xd455 ; 000092E8 E86A41 '.jA'
jmp short x92f4 ; 000092EB EB07 '..'
x92ed: mov ah,0x93 ; 000092ED B493 '..'
mov al,0x1 ; 000092EF B001 '..'
call xd468 ; 000092F1 E87441 '.tA'
x92f4: call x9190 ; 000092F4 E899FE '...'
mov [bx],ah ; 000092F7 8827 '.',0x27
call xd490 ; 000092F9 E89441 '..A'
jmp short x92ff ; 000092FC EB01 '..'
x92fe: stc ; 000092FE F9 '.'
x92ff: pop word [bp+0x5] ; 000092FF 8F4605 '.F.'
ret ; 00009302 C3 '.'
x9303: cmp al,0x0 ; 00009303 3C00 '<.'
jz x9311 ; 00009305 740A 't',0x0A
cmp al,0x1 ; 00009307 3C01 '<.'
jnz x930f ; 00009309 7504 'u.'
mov al,0x93 ; 0000930B B093 '..'
jmp short x9311 ; 0000930D EB02 '..'
x930f: mov al,0x7 ; 0000930F B007 '..'
x9311: cmp ah,al ; 00009311 3AE0 ':.'
ret ; 00009313 C3 '.'
boot_prompt:
db 0x0D,0x0A,'Non-System disk or disk error',0x0D,0x0A,'replace and strike any key when ready',0x0D,0x0A,'$'
boot_error:
db 0x0D,0x0A,'602-Diskette Boot Record Error',0x0D,0x0A,'$'
x9380: mov bx,0x2 ; 00009380 BB0200 '...'
mov cx,0xfde8 ; 00009383 B9E8FD '...'
x9386: mov al,0x80 ; 00009386 B080 '..'
out 0x70,al ; 00009388 E670 '.p'
in al,0x71 ; 0000938A E471 '.q'
cmp al,0xff ; 0000938C 3CFF '<.'
jnz x939a ; 0000938E 750A 'u',0x0A
loop x9386 ; 00009390 E2F4 '..'
dec bx ; 00009392 4B 'K'
jz x939a ; 00009393 7405 't.'
mov cx,0xfde8 ; 00009395 B9E8FD '...'
jmp short x9386 ; 00009398 EBEC '..'
x939a: jmp bp ; 0000939A FFE5 '..'
db 0xFF ; 0000939C FF '.'
db 0xFF ; 0000939D FF '.'
db 0xFF ; 0000939E FF '.'
inc word [bx+si] ; 0000939F FF00 '..'
times 255 dw 0x0000 ; 000093A1 - 0000959D
add [di-0x75],dl ; 0000959F 00558B '.U.'
in al,dx ; 000095A2 EC '.'
push eax ; 000095A3 6650 'fP'
push bx ; 000095A5 53 'S'
push ds ; 000095A6 1E '.'
cld ; 000095A7 FC '.'
mov al,0x1 ; 000095A8 B001 '..'
out 0x85,al ; 000095AA E685 '..'
mov bx,[bp+0x4] ; 000095AC 8B5E04 '.^.'
mov ds,bx ; 000095AF 8EDB '..'
mov bx,[bp+0x2] ; 000095B1 8B5E02 '.^.'
mov bx,[bx] ; 000095B4 8B1F '..'
cmp bl,0xf0 ; 000095B6 80FBF0 '...'
jnz x95c5 ; 000095B9 750A 'u',0x0A
mov al,0x12 ; 000095BB B012 '..'
out 0x84,al ; 000095BD E684 '..'
inc word [bp+0x2] ; 000095BF FF4602 '.F.'
jmp x976a ; 000095C2 E9A501 '...'
x95c5: cmp bx,0x50f ; 000095C5 81FB0F05 '....'
jz x95d7 ; 000095C9 740C 't.'
mov al,0x14 ; 000095CB B014 '..'
out 0x84,al ; 000095CD E684 '..'
pop ds ; 000095CF 1F '.'
pop bx ; 000095D0 5B '['
pop eax ; 000095D1 6658 'fX'
pop bp ; 000095D3 5D ']'
jmp x9bd0 ; 000095D4 E9F905
x95d7: mov al,0x13 ; 000095D7 B013 '..'
out 0x84,al ; 000095D9 E684 '..'
call xf305 ; 000095DB E8275D '.',0x27,']'
push cs ; 000095DE 0E '.'
pop es ; 000095DF 07 '.'
mov di,0x13a0 ; 000095E0 BFA013 '...'
mov bx,0x80 ; 000095E3 BB8000 '...'
mov ds,bx ; 000095E6 8EDB '..'
mov eax,cr0 ; 000095E8 0F2000
and eax,0x80000011 ; 000095EB 662511000080 'f%....'
mov cx,[0x6] ; 000095F1 8B0E0600 '....'
and ecx,0xf ; 000095F5 6681E10F000000 'f......'
or eax,ecx ; 000095FC 660BC1 'f..'
stosd ; 000095FF 66AB 'f.'
xor eax,eax ; 00009601 6633C0 'f3.'
mov ax,[0x18] ; 00009604 A11800 '...'
stosd ; 00009607 66AB 'f.'
mov ax,[0x1a] ; 00009609 A11A00 '...'
stosd ; 0000960C 66AB 'f.'
mov si,0x26 ; 0000960E BE2600 '.&.'
mov cx,0x8 ; 00009611 B90800 '...'
x9614: lodsw ; 00009614 AD '.'
stosd ; 00009615 66AB 'f.'
loop x9614 ; 00009617 E2FB '..'
mov eax,dr6 ; 00009619 0F21F0 '.!.'
stosd ; 0000961C 66AB 'f.'
mov eax,dr7 ; 0000961E 0F21F8 '.!.'
stosd ; 00009621 66AB 'f.'
xor eax,eax ; 00009623 6633C0 'f3.'
mov ax,[0x16] ; 00009626 A11600 '...'
stosd ; 00009629 66AB 'f.'
mov si,0x1c ; 0000962B BE1C00 '...'
lodsw ; 0000962E AD '.'
stosd ; 0000962F 66AB 'f.'
mov ax,gs ; 00009631 8CE8 '..'
stosd ; 00009633 66AB 'f.'
mov ax,fs ; 00009635 8CE0 '..'
stosd ; 00009637 66AB 'f.'
mov cx,0x4 ; 00009639 B90400 '...'
x963c: lodsw ; 0000963C AD '.'
stosd ; 0000963D 66AB 'f.'
loop x963c ; 0000963F E2FB '..'
mov si,0x60 ; 00009641 BE6000 '.`.'
xor eax,eax ; 00009644 6633C0 'f3.'
mov ax,[si+0x2] ; 00009647 8B4402 '.D.'
stosd ; 0000964A 66AB 'f.'
mov eax,[si] ; 0000964C 668B04 'f..'
and eax,0xffffff ; 0000964F 6625FFFFFF00 'f%....'
stosd ; 00009655 66AB 'f.'
xor eax,eax ; 00009657 6633C0 'f3.'
mov ax,[si+0x4] ; 0000965A 8B4404 '.D.'
stosd ; 0000965D 66AB 'f.'
mov si,0x5a ; 0000965F BE5A00 '.Z.'
xor eax,eax ; 00009662 6633C0 'f3.'
mov ax,[si+0x2] ; 00009665 8B4402 '.D.'
stosd ; 00009668 66AB 'f.'
mov eax,[si] ; 0000966A 668B04 'f..'
and eax,0xffffff ; 0000966D 6625FFFFFF00 'f%....'
stosd ; 00009673 66AB 'f.'
xor eax,eax ; 00009675 6633C0 'f3.'
mov ax,[si+0x4] ; 00009678 8B4404 '.D.'
stosd ; 0000967B 66AB 'f.'
mov si,0x4e ; 0000967D BE4E00 '.N.'
xor eax,eax ; 00009680 6633C0 'f3.'
mov ax,[si+0x2] ; 00009683 8B4402 '.D.'
stosd ; 00009686 66AB 'f.'
mov eax,[si] ; 00009688 668B04 'f..'
and eax,0xffffff ; 0000968B 6625FFFFFF00 'f%....'
stosd ; 00009691 66AB 'f.'
xor eax,eax ; 00009693 6633C0 'f3.'
mov ax,[si+0x4] ; 00009696 8B4404 '.D.'
stosd ; 00009699 66AB 'f.'
mov si,0x54 ; 0000969B BE5400 '.T.'
xor eax,eax ; 0000969E 6633C0 'f3.'
mov ax,[si+0x2] ; 000096A1 8B4402 '.D.'
stosd ; 000096A4 66AB 'f.'
mov eax,[si] ; 000096A6 668B04 'f..'
and eax,0xffffff ; 000096A9 6625FFFFFF00 'f%....'
stosd ; 000096AF 66AB 'f.'
xor eax,eax ; 000096B1 6633C0 'f3.'
mov ax,[si+0x4] ; 000096B4 8B4404 '.D.'
stosd ; 000096B7 66AB 'f.'
mov eax,0x920000 ; 000096B9 66B800009200 'f.....'
stosd ; 000096BF 66AB 'f.'
xor eax,eax ; 000096C1 6633C0 'f3.'
mov ax,gs ; 000096C4 8CE8 '..'
shl ax,0x4 ; 000096C6 C1E004 '...'
stosd ; 000096C9 66AB 'f.'
mov ax,0xffff ; 000096CB B8FFFF '...'
stosd ; 000096CE 66AB 'f.'
mov eax,0x920000 ; 000096D0 66B800009200 'f.....'
stosd ; 000096D6 66AB 'f.'
xor eax,eax ; 000096D8 6633C0 'f3.'
mov ax,fs ; 000096DB 8CE0 '..'
shl ax,0x4 ; 000096DD C1E004 '...'
stosd ; 000096E0 66AB 'f.'
mov ax,0xffff ; 000096E2 B8FFFF '...'
stosd ; 000096E5 66AB 'f.'
mov si,0x48 ; 000096E7 BE4800 '.H.'
xor eax,eax ; 000096EA 6633C0 'f3.'
mov ax,[si+0x2] ; 000096ED 8B4402 '.D.'
stosd ; 000096F0 66AB 'f.'
mov eax,[si] ; 000096F2 668B04 'f..'
and eax,0xffffff ; 000096F5 6625FFFFFF00 'f%....'
stosd ; 000096FB 66AB 'f.'
xor eax,eax ; 000096FD 6633C0 'f3.'
mov ax,[si+0x4] ; 00009700 8B4404 '.D.'
stosd ; 00009703 66AB 'f.'
mov si,0x42 ; 00009705 BE4200 '.B.'
xor eax,eax ; 00009708 6633C0 'f3.'
mov ax,[si+0x2] ; 0000970B 8B4402 '.D.'
stosd ; 0000970E 66AB 'f.'
mov eax,[si] ; 00009710 668B04 'f..'
and eax,0xffffff ; 00009713 6625FFFFFF00 'f%....'
stosd ; 00009719 66AB 'f.'
xor eax,eax ; 0000971B 6633C0 'f3.'
mov ax,[si+0x4] ; 0000971E 8B4404 '.D.'
stosd ; 00009721 66AB 'f.'
mov si,0x3c ; 00009723 BE3C00 '.<.'
xor eax,eax ; 00009726 6633C0 'f3.'
mov ax,[si+0x2] ; 00009729 8B4402 '.D.'
stosd ; 0000972C 66AB 'f.'
mov eax,[si] ; 0000972E 668B04 'f..'
and eax,0xffffff ; 00009731 6625FFFFFF00 'f%....'
stosd ; 00009737 66AB 'f.'
xor eax,eax ; 00009739 6633C0 'f3.'
mov ax,[si+0x4] ; 0000973C 8B4404 '.D.'
stosd ; 0000973F 66AB 'f.'
mov si,0x36 ; 00009741 BE3600 '.6.'
xor eax,eax ; 00009744 6633C0 'f3.'
mov ax,[si+0x2] ; 00009747 8B4402 '.D.'
stosd ; 0000974A 66AB 'f.'
mov eax,[si] ; 0000974C 668B04 'f..'
and eax,0xffffff ; 0000974F 6625FFFFFF00 'f%....'
stosd ; 00009755 66AB 'f.'
xor eax,eax ; 00009757 6633C0 'f3.'
mov ax,[si+0x4] ; 0000975A 8B4404 '.D.'
stosd ; 0000975D 66AB 'f.'
call xf2eb ; 0000975F E8895B '..['
xor edi,edi ; 00009762 6633FF 'f3.'
mov di,0x13a0 ; 00009765 BFA013 '...'
loadall ; 00009768 0F07 '..'
x976a: pop ds ; 0000976A 1F '.'
pop bx ; 0000976B 5B '['
pop eax ; 0000976C 6658 'fX'
pop bp ; 0000976E 5D ']'
iret ; 0000976F CF '.'
test ax,0xa99e ; 00009770 A99EA9 '...'
sahf ; 00009773 9E '.'
mov dx,[bx+0x978b] ; 00009774 8B978B97 '....'
mov [bx+0x979c],ss ; 00009778 8C979C97 '....'
cmp al,0x5 ; 0000977C 3C05 '<.'
ja x978b ; 0000977E 770B 'w.'
xor ah,ah ; 00009780 32E4 '2.'
mov si,ax ; 00009782 8BF0 '..'
shl si,1 ; 00009784 D1E6 '..'
jmp near [cs:si+0x9770] ; 00009786 2EFFA47097 '...p.'
x978b: ret ; 0000978B C3 '.'
and byte [0x87],0xef ; 0000978C 80268700EF '.&...'
or bl,bl ; 00009791 0ADB 0x0A,'.'
jnz x979a ; 00009793 7505 'u.'
or byte [0x87],0x10 ; 00009795 800E870010 '.....'
x979a: clc ; 0000979A F8 '.'
ret ; 0000979B C3 '.'
push dx ; 0000979C 52 'R'
or bl,bl ; 0000979D 0ADB 0x0A,'.'
jz x97b3 ; 0000979F 7412 't.'
mov dx,[0x63] ; 000097A1 8B166300 '..c.'
add dx,byte +0x4 ; 000097A5 83C204 '...'
mov al,[0x65] ; 000097A8 A06500 '.e.'
or al,0x8 ; 000097AB 0C08 '..'
mov [0x65],al ; 000097AD A26500 '.e.'
out dx,al ; 000097B0 EE '.'
jmp short x97c3 ; 000097B1 EB10 '..'
x97b3: mov dx,[0x63] ; 000097B3 8B166300 '..c.'
add dx,byte +0x4 ; 000097B7 83C204 '...'
mov al,[0x65] ; 000097BA A06500 '.e.'
and al,0xf7 ; 000097BD 24F7 '$.'
mov [0x65],al ; 000097BF A26500 '.e.'
out dx,al ; 000097C2 EE '.'
x97c3: pop dx ; 000097C3 5A 'Z'
clc ; 000097C4 F8 '.'
ret ; 000097C5 C3 '.'
xchg ax,dx ; 000097C6 92 '.'
cmpsb ; 000097C7 A6 '.'
db 0x7E,0xAC
retf 0xac ; 000097CA CAAC00 '...'
add ah,0xd0 ; 000097CD 80C4D0 '...'
mov dx,0x9a7 ; 000097D0 BAA709 '...'
mov cx,[bx+si] ; 000097D3 8B08 '..'
mov bp,[di-0x3e] ; 000097D5 8B6DC2 '.m.'
scasw ; 000097D8 AF '.'
cbw ; 000097D9 98 '.'
fs cbw ; 000097DA 6498 'd.'
fsub qword [bx+0x8d0b] ; 000097DC DCA70B8D '....'
sti ; 000097E0 FB '.'
mov [bp-0x2f],fs ; 000097E1 8C66D1 '.f.'
jmp near [bx+0x8322] ; 000097E4 FFA72283 '..".'
and al,[bp+di+0x8322] ; 000097E8 22832283 '".".'
sub al,[bp+di+0x977c] ; 000097EC 2A837C97 '*.|.'
x97f0: pop ax ; 000097F0 58 'X'
pop dx ; 000097F1 5A 'Z'
pop cx ; 000097F2 59 'Y'
pop bx ; 000097F3 5B '['
pop si ; 000097F4 5E '^'
pop di ; 000097F5 5F '_'
pop bp ; 000097F6 5D ']'
pop ds ; 000097F7 1F '.'
pop es ; 000097F8 07 '.'
iret ; 000097F9 CF '.'
times 11 db 0xFF ; 000097FA - 00009804
jmp x9bd0 ; 00009805 E9C803
times 74 db 0xFF ; 00009808 - 00009851
jmp x9c28 ; 00009852 E9D303
times 12 db 0xFF ; 00009855 - 00009860
jmp x9c1f ; 00009861 E9BB03 '...'
call x8da9 ; 00009864 E842F5 '.B.'
jz x9899 ; 00009867 7430 't0'
cmp byte [0x49],0x4 ; 00009869 803E490004 '.>I..'
jc x987a ; 0000986E 720A 'r',0x0A
cmp byte [0x49],0x7 ; 00009870 803E490007 '.>I..'
jz x987a ; 00009875 7403 't.'
jmp short x98f8 ; 00009877 EB7F '..'
nop ; 00009879 90 '.'
x987a: call xc32b ; 0000987A E8AE2A '..*'
mov dx,[0x63] ; 0000987D 8B166300 '..c.'
add dx,byte +0x6 ; 00009881 83C206 '...'
mov ah,al ; 00009884 8AE0 '..'
x9886: in al,dx ; 00009886 EC '.'
test al,0x1 ; 00009887 A801 '..'
jnz x9886 ; 00009889 75FB 'u.'
cli ; 0000988B FA '.'
x988c: in al,dx ; 0000988C EC '.'
test al,0x1 ; 0000988D A801 '..'
jz x988c ; 0000988F 74FB 't.'
mov al,ah ; 00009891 8AC4 '..'
stosb ; 00009893 AA '.'
inc di ; 00009894 47 'G'
sti ; 00009895 FB '.'
loop x9886 ; 00009896 E2EE '..'
ret ; 00009898 C3 '.'
x9899: cmp byte [0x49],0x4 ; 00009899 803E490004 '.>I..'
jc x98a7 ; 0000989E 7207 'r.'
cmp byte [0x49],0x7 ; 000098A0 803E490007 '.>I..'
jnz x98f8 ; 000098A5 7551 'uQ'
x98a7: call xc32b ; 000098A7 E8812A '..*'
x98aa: stosb ; 000098AA AA '.'
inc di ; 000098AB 47 'G'
loop x98aa ; 000098AC E2FC '..'
ret ; 000098AE C3 '.'
call x8da9 ; 000098AF E8F7F4 '...'
jz x98e2 ; 000098B2 742E 't.'
cmp byte [0x49],0x4 ; 000098B4 803E490004 '.>I..'
jc x98c2 ; 000098B9 7207 'r.'
cmp byte [0x49],0x7 ; 000098BB 803E490007 '.>I..'
jc x98f8 ; 000098C0 7236 'r6'
x98c2: mov ah,bl ; 000098C2 8AE3 '..'
call xc32b ; 000098C4 E8642A '.d*'
mov dx,[0x63] ; 000098C7 8B166300 '..c.'
add dx,byte +0x6 ; 000098CB 83C206 '...'
mov bx,ax ; 000098CE 8BD8 '..'
x98d0: in al,dx ; 000098D0 EC '.'
test al,0x1 ; 000098D1 A801 '..'
jnz x98d0 ; 000098D3 75FB 'u.'
cli ; 000098D5 FA '.'
x98d6: in al,dx ; 000098D6 EC '.'
test al,0x1 ; 000098D7 A801 '..'
jz x98d6 ; 000098D9 74FB 't.'
mov ax,bx ; 000098DB 8BC3 '..'
stosw ; 000098DD AB '.'
sti ; 000098DE FB '.'
loop x98d0 ; 000098DF E2EF '..'
ret ; 000098E1 C3 '.'
x98e2: cmp byte [0x49],0x4 ; 000098E2 803E490004 '.>I..'
jc x98f0 ; 000098E7 7207 'r.'
cmp byte [0x49],0x7 ; 000098E9 803E490007 '.>I..'
jnz x98f8 ; 000098EE 7508 'u.'
x98f0: mov ah,bl ; 000098F0 8AE3 '..'
call xc32b ; 000098F2 E8362A '.6*'
rep stosw ; 000098F5 F3AB '..'
ret ; 000098F7 C3 '.'
x98f8: call xc34d ; 000098F8 E8522A '.R*'
mov bl,[bp+0x6] ; 000098FB 8A5E06 '.^.'
mov bh,[0x49] ; 000098FE 8A3E4900 '.>I.'
mov dx,cs ; 00009902 8CCA '..'
mov ds,dx ; 00009904 8EDA '..'
mov si,0xfa6e ; 00009906 BE6EFA '.n.'
or al,al ; 00009909 0AC0 0x0A,'.'
jns x9915 ; 0000990B 7908 'y.'
xor dx,dx ; 0000990D 33D2 '3.'
mov ds,dx ; 0000990F 8EDA '..'
lds si,[0x7c] ; 00009911 C5367C00 '.6|.'
x9915: and ax,0x7f ; 00009915 257F00 '%..'
shl ax,1 ; 00009918 D1E0 '..'
shl ax,1 ; 0000991A D1E0 '..'
shl ax,1 ; 0000991C D1E0 '..'
add si,ax ; 0000991E 03F0 '..'
cmp bh,0x6 ; 00009920 80FF06 '...'
jz x9988 ; 00009923 7463 'tc'
sub sp,byte +0x10 ; 00009925 83EC10 '...'
mov ax,sp ; 00009928 8BC4 '..'
push di ; 0000992A 57 'W'
push es ; 0000992B 06 '.'
mov di,ss ; 0000992C 8CD7 '..'
mov es,di ; 0000992E 8EC7 '..'
push cx ; 00009930 51 'Q'
push bx ; 00009931 53 'S'
mov di,ax ; 00009932 8BF8 '..'
and bl,0x3 ; 00009934 80E303 '...'
mov ch,0x8 ; 00009937 B508 '..'
x9939: lodsb ; 00009939 AC '.'
mov cl,0x8 ; 0000993A B108 '..'
x993c: shl dx,1 ; 0000993C D1E2 '..'
shl dx,1 ; 0000993E D1E2 '..'
shl al,1 ; 00009940 D0E0 '..'
jnc x9946 ; 00009942 7302 's.'
or dl,bl ; 00009944 0AD3 0x0A,'.'
x9946: dec cl ; 00009946 FEC9 '..'
jnz x993c ; 00009948 75F2 'u.'
mov al,dh ; 0000994A 8AC6 '..'
mov ah,dl ; 0000994C 8AE2 '..'
stosw ; 0000994E AB '.'
dec ch ; 0000994F FECD '..'
jnz x9939 ; 00009951 75E6 'u.'
pop bx ; 00009953 5B '['
pop dx ; 00009954 5A 'Z'
pop es ; 00009955 07 '.'
pop di ; 00009956 5F '_'
mov ax,ss ; 00009957 8CD0 '..'
mov ds,ax ; 00009959 8ED8 '..'
x995b: mov cx,0x4 ; 0000995B B90400 '...'
mov si,sp ; 0000995E 8BF4 '..'
x9960: lodsw ; 00009960 AD '.'
sar bl,1 ; 00009961 D0FB '..'
jns x9968 ; 00009963 7903 'y.'
xor ax,[es:di] ; 00009965 263305 '&3.'
x9968: stosw ; 00009968 AB '.'
add di,0x1ffe ; 00009969 81C7FE1F '....'
lodsw ; 0000996D AD '.'
sar bl,1 ; 0000996E D0FB '..'
jns x9975 ; 00009970 7903 'y.'
xor ax,[es:di] ; 00009972 263305 '&3.'
x9975: stosw ; 00009975 AB '.'
sub di,0x1fb2 ; 00009976 81EFB21F '....'
loop x9960 ; 0000997A E2E4 '..'
sub di,0x13e ; 0000997C 81EF3E01 '..>.'
dec dx ; 00009980 4A 'J'
jnz x995b ; 00009981 75D8 'u.'
add sp,byte +0x10 ; 00009983 83C410 '...'
jmp short x99b6 ; 00009986 EB2E '..'
x9988: mov ah,bl ; 00009988 8AE3 '..'
mov dx,cx ; 0000998A 8BD1 '..'
mov bx,si ; 0000998C 8BDE '..'
x998e: mov cx,0x4 ; 0000998E B90400 '...'
mov si,bx ; 00009991 8BF3 '..'
x9993: lodsb ; 00009993 AC '.'
sar ah,1 ; 00009994 D0FC '..'
jns x999b ; 00009996 7903 'y.'
xor al,[es:di] ; 00009998 263205 '&2.'
x999b: stosb ; 0000999B AA '.'
add di,0x1fff ; 0000999C 81C7FF1F '....'
lodsb ; 000099A0 AC '.'
sar ah,1 ; 000099A1 D0FC '..'
jns x99a8 ; 000099A3 7903 'y.'
xor al,[es:di] ; 000099A5 263205 '&2.'
x99a8: stosb ; 000099A8 AA '.'
sub di,0x1fb1 ; 000099A9 81EFB11F '....'
loop x9993 ; 000099AD E2E4 '..'
sub di,0x13f ; 000099AF 81EF3F01 '..?.'
dec dx ; 000099B3 4A 'J'
jnz x998e ; 000099B4 75D8 'u.'
x99b6: ret ; 000099B6 C3 '.'
x99b7: mov ax,0xc800 ; 000099B7 B800C8 '...'
cld ; 000099BA FC '.'
x99bb: call x9a0f ; 000099BB E85100 '.Q.'
cmp ax,0xdf80 ; 000099BE 3D80DF '=..'
jna x99bb ; 000099C1 76F8 'v.'
mov ax,0xe000 ; 000099C3 B800E0 '...'
mov ds,ax ; 000099C6 8ED8 '..'
xor bx,bx ; 000099C8 33DB '3.'
cmp word [bx],0xaa55 ; 000099CA 813F55AA '.?U.'
jnz x9a09 ; 000099CE 7539 'u9'
xor si,si ; 000099D0 33F6 '3.'
mov cx,0x8000 ; 000099D2 B90080 '...'
x99d5: lodsw ; 000099D5 AD '.'
add bl,al ; 000099D6 02D8 '..'
add bl,ah ; 000099D8 02DC '..'
loop x99d5 ; 000099DA E2F9 '..'
jz x99f6 ; 000099DC 7418 't.'
mov ax,0x40 ; 000099DE B84000 '.@.'
mov ds,ax ; 000099E1 8ED8 '..'
or byte [0x12],0xff ; 000099E3 800E1200FF '.....'
mov dx,0x5000 ; 000099E8 BA0050 '..P'
mov bx,err101 ; 000099EB BB5AB7 '.Z.'
mov cx,err101_len ; 000099EE B90F00 '...'
call xc745 ; 000099F1 E8512D '.Q-'
jmp short x9a09 ; 000099F4 EB13 '..'
x99f6: mov ax,0x40 ; 000099F6 B84000 '.@.'
mov es,ax ; 000099F9 8EC0 '..'
push ds ; 000099FB 1E '.'
mov ds,ax ; 000099FC 8ED8 '..'
mov ax,0x3 ; 000099FE B80300 '...'
push ax ; 00009A01 50 'P'
mov bp,sp ; 00009A02 8BEC '..'
call far [bp+0x0] ; 00009A04 FF5E00 '.^.'
pop ax ; 00009A07 58 'X'
pop ax ; 00009A08 58 'X'
x9a09: mov ax,0x40 ; 00009A09 B84000 '.@.'
mov ds,ax ; 00009A0C 8ED8 '..'
ret ; 00009A0E C3 '.'
x9a0f: mov ds,ax ; 00009A0F 8ED8 '..'
xor bx,bx ; 00009A11 33DB '3.'
cmp word [bx],0xaa55 ; 00009A13 813F55AA '.?U.'
jnz x9a7b ; 00009A17 7562 'ub'
xor si,si ; 00009A19 33F6 '3.'
xor cx,cx ; 00009A1B 33C9 '3.'
mov ch,[bx+0x2] ; 00009A1D 8A6F02 '.o.'
shl cx,1 ; 00009A20 D1E1 '..'
mov dx,cx ; 00009A22 8BD1 '..'
x9a24: lodsb ; 00009A24 AC '.'
add bl,al ; 00009A25 02D8 '..'
loop x9a24 ; 00009A27 E2FB '..'
jnz x9a69 ; 00009A29 753E 'u>'
mov cl,0x4 ; 00009A2B B104 '..'
shr dx,cl ; 00009A2D D3EA '..'
push dx ; 00009A2F 52 'R'
mov ax,0x40 ; 00009A30 B84000 '.@.'
mov es,ax ; 00009A33 8EC0 '..'
push ds ; 00009A35 1E '.'
mov ds,ax ; 00009A36 8ED8 '..'
mov ax,0x3 ; 00009A38 B80300 '...'
push ax ; 00009A3B 50 'P'
mov si,sp ; 00009A3C 8BF4 '..'
push bp ; 00009A3E 55 'U'
xor bp,bp ; 00009A3F 33ED '3.'
call far [ss:si] ; 00009A41 36FF1C '6..'
or bp,bp ; 00009A44 0BED '..'
jz x9a54 ; 00009A46 740C 't.'
push ds ; 00009A48 1E '.'
mov ax,0x40 ; 00009A49 B84000 '.@.'
mov ds,ax ; 00009A4C 8ED8 '..'
or byte [0x12],0xff ; 00009A4E 800E1200FF '.....'
pop ds ; 00009A53 1F '.'
x9a54: pop bp ; 00009A54 5D ']'
pop ax ; 00009A55 58 'X'
mov ax,ds ; 00009A56 8CD8 '..'
pop ds ; 00009A58 1F '.'
pop dx ; 00009A59 5A 'Z'
mov bx,ds ; 00009A5A 8CDB '..'
add bx,dx ; 00009A5C 03DA '..'
cmp ax,bx ; 00009A5E 3BC3 ';.'
jna x9a7e ; 00009A60 761C 'v.'
cmp ax,0xdf80 ; 00009A62 3D80DF '=..'
jc x9a82 ; 00009A65 721B 'r.'
jmp short x9a7e ; 00009A67 EB15 '..'
x9a69: pusha ; 00009A69 60 '`'
push es ; 00009A6A 06 '.'
push ds ; 00009A6B 1E '.'
mov dx,0x5000 ; 00009A6C BA0050 '..P'
mov bx,0xb88c ; 00009A6F BB8CB8 '...'
mov cx,0x14 ; 00009A72 B91400 '...'
call xc745 ; 00009A75 E8CD2C '..,'
pop ds ; 00009A78 1F '.'
pop es ; 00009A79 07 '.'
popa ; 00009A7A 61 'a'
x9a7b: mov dx,0x80 ; 00009A7B BA8000 '...'
x9a7e: mov ax,ds ; 00009A7E 8CD8 '..'
add ax,dx ; 00009A80 03C2 '..'
x9a82: ret ; 00009A82 C3 '.'
x9a83: push ds ; 00009A83 1E '.'
push es ; 00009A84 06 '.'
mov ax,0xc000 ; 00009A85 B800C0 '...'
x9a88: call x9ab2 ; 00009A88 E82700 '.',0x27,'.'
jnz x9a94 ; 00009A8B 7507 'u.'
cmp ax,0xc780 ; 00009A8D 3D80C7 '=..'
jna x9a88 ; 00009A90 76F6 'v.'
xor ax,ax ; 00009A92 33C0 '3.'
x9a94: pop es ; 00009A94 07 '.'
pop ds ; 00009A95 1F '.'
ret ; 00009A96 C3 '.'
x9a97: push ds ; 00009A97 1E '.'
push es ; 00009A98 06 '.'
mov ax,0xc000 ; 00009A99 B800C0 '...'
x9a9c: push ax ; 00009A9C 50 'P'
call x9ab2 ; 00009A9D E81200 '...'
pop dx ; 00009AA0 5A 'Z'
jz x9aaa ; 00009AA1 7407 't.'
push ax ; 00009AA3 50 'P'
mov ax,dx ; 00009AA4 8BC2 '..'
call x9af4 ; 00009AA6 E84B00 '.K.'
pop ax ; 00009AA9 58 'X'
x9aaa: cmp ax,0xc780 ; 00009AAA 3D80C7 '=..'
jna x9a9c ; 00009AAD 76ED 'v.'
pop es ; 00009AAF 07 '.'
pop ds ; 00009AB0 1F '.'
ret ; 00009AB1 C3 '.'
x9ab2: cld ; 00009AB2 FC '.'
mov ds,ax ; 00009AB3 8ED8 '..'
xor bx,bx ; 00009AB5 33DB '3.'
cmp word [bx],0xaa55 ; 00009AB7 813F55AA '.?U.'
jnz x9aea ; 00009ABB 752D 'u-'
xor si,si ; 00009ABD 33F6 '3.'
xor cx,cx ; 00009ABF 33C9 '3.'
mov ch,[bx+0x2] ; 00009AC1 8A6F02 '.o.'
shl cx,1 ; 00009AC4 D1E1 '..'
mov dx,cx ; 00009AC6 8BD1 '..'
x9ac8: lodsb ; 00009AC8 AC '.'
add bl,al ; 00009AC9 02D8 '..'
loop x9ac8 ; 00009ACB E2FB '..'
jnz x9ad8 ; 00009ACD 7509 'u.'
mov cl,0x4 ; 00009ACF B104 '..'
shr dx,cl ; 00009AD1 D3EA '..'
mov ax,ds ; 00009AD3 8CD8 '..'
add ax,dx ; 00009AD5 03C2 '..'
ret ; 00009AD7 C3 '.'
x9ad8: pusha ; 00009AD8 60 '`'
push es ; 00009AD9 06 '.'
push ds ; 00009ADA 1E '.'
mov dx,0x5000 ; 00009ADB BA0050 '..P'
mov bx,0xb88c ; 00009ADE BB8CB8 '...'
mov cx,0x14 ; 00009AE1 B91400 '...'
call xc745 ; 00009AE4 E85E2C '.^,'
pop ds ; 00009AE7 1F '.'
pop es ; 00009AE8 07 '.'
popa ; 00009AE9 61 'a'
x9aea: mov dx,0x80 ; 00009AEA BA8000 '...'
mov ax,ds ; 00009AED 8CD8 '..'
add ax,dx ; 00009AEF 03C2 '..'
xor dx,dx ; 00009AF1 33D2 '3.'
ret ; 00009AF3 C3 '.'
x9af4: mov ds,ax ; 00009AF4 8ED8 '..'
mov ax,0x40 ; 00009AF6 B84000 '.@.'
mov es,ax ; 00009AF9 8EC0 '..'
push ds ; 00009AFB 1E '.'
mov ax,0x3 ; 00009AFC B80300 '...'
push ax ; 00009AFF 50 'P'
mov bp,sp ; 00009B00 8BEC '..'
call far [bp+0x0] ; 00009B02 FF5E00 '.^.'
pop ax ; 00009B05 58 'X'
pop ds ; 00009B06 1F '.'
ret ; 00009B07 C3 '.'
x9b08: push cx ; 00009B08 51 'Q'
mov cx,[cs:si] ; 00009B09 2E8B0C '...'
x9b0c: inc si ; 00009B0C 46 'F'
inc si ; 00009B0D 46 'F'
cmp ah,[cs:si] ; 00009B0E 2E3A24 '.:$'
jz x9b18 ; 00009B11 7405 't.'
loop x9b0c ; 00009B13 E2F7 '..'
clc ; 00009B15 F8 '.'
jmp short x9b1d ; 00009B16 EB05 '..'
x9b18: inc si ; 00009B18 46 'F'
mov al,[cs:si] ; 00009B19 2E8A04 '...'
stc ; 00009B1C F9 '.'
x9b1d: pop cx ; 00009B1D 59 'Y'
ret ; 00009B1E C3 '.'
db 0xFF,0x1B,0xB1,0x32,0xB3,0xB4,0xB5,0x36,0xB7,0xB8,0xB9,0xB0,0x2D,0xBD,0x08,0x89
db 'qwertyuiop[]'
db 0x0D,0xFF
db 'asdfghjkl'
db 0xBB,0xA7,0xE0,0xFF
db '\zxcvbnm'
db 0xAC,0xAE,0xAF,0xFF,0x2A,0xFF,0x20,0xFF,0x1B
db '!@#$%^&*()_+'
db 0x08,0x0F,0x0B,0x00,0x1A,0x7B,0x1B,0x7D,0x1C,0x0D,0x27
db ':(")~+|3<4>5?9 789-456+1230.'
db 0x0D,0x00
db 0x47,0x77,0x49,0x84,0x4B,0x73
db 'MtOuQvH'
db 0x8D,0x4A,0x8E
db 0x4C,0x8F,0x4E,0x90,0x50,0x91,0x52,0x92,0x53,0x93,0x06,0x00,0x07,0x1E,0x0C,0x1F,0x1A,0x1B,0x1B,0x1D
db 0x1C,0x0A,0x2B,0x1C,0x0A,0x00,0x47,0x97,0x48,0x98,0x49,0x99,0x4B,0x9B,0x4D,0x9D,0x4F,0x9F,0x50,0xA0
db 0x51,0xA1,0x52,0xA2,0x53,0xA3
db 0xFF,0xFF
x9bd0: push ax ; 00009BD0 50
mov al,0x01 ; 00009BD1 B001
out 0x85,al ; 00009BD3 E685
mov al,0x10 ; 00009BD5 B010
out 0x84,al ; 00009BD7 E684
pop ax ; 00009BD9 58
jmp xe900 ; 00009BDA E9234D
x9bdd: cli ; 00009BDD FA
and al,0xf7 ; 00009BDE 24F7 '$.'
add dx,byte +0x4 ; 00009BE0 83C204 '...'
out dx,al ; 00009BE3 EE '.'
xchg ah,al ; 00009BE4 86E0 '..'
inc dx ; 00009BE6 42 'B'
out dx,al ; 00009BE7 EE '.'
sub dx,byte +0x5 ; 00009BE8 83EA05 '...'
x9beb: xor ah,ah ; 00009BEB 32E4 '2.'
x9bed: mov al,ah ; 00009BED 8AC4 '..'
out dx,al ; 00009BEF EE '.'
inc dx ; 00009BF0 42 'B'
inc ah ; 00009BF1 FEC4 '..'
lodsb ; 00009BF3 AC '.'
out dx,al ; 00009BF4 EE '.'
dec dx ; 00009BF5 4A 'J'
loop x9bed ; 00009BF6 E2F5 '..'
jmp bp ; 00009BF8 FFE5 '..'
;
; Clear the screen (DS=F000, BX=BA77 for CGA or BA86 for Mono)
;
x9bfa: mov ax,0x720 ; 00009BFA B82007 '. .'
mov es,[bx+0x6] ; 00009BFD 8E4706 '.G.'
xor di,di ; 00009C00 33FF '3.'
mov cx,0x2000 ; 00009C02 B90020 '.. '
rep stosw ; 00009C05 F3AB '..'
mov dx,[bx] ; 00009C07 8B17 '..'
mov al,[bx+0x3] ; 00009C09 8A4703 '.G.'
out dx,al ; 00009C0C EE '.'
jmp bp ; 00009C0D FFE5 '..'
times 16 db 0xFF ; 00009C0F - 00009C1E
x9c1f: jmp x9cac ; 00009C1F E98A00 '...'
times 6 db 0xFF ; 00009C22 - 00009C27
x9c28: push ax ; 00009C28 50
push es ; 00009C29 06
mov al,0x1 ; 00009C2A B001 '..'
out 0x85,al ; 00009C2C E685 '..'
mov al,0x17 ; 00009C2E B017 '..'
out 0x84,al ; 00009C30 E684 '..'
mov ax,0x40 ; 00009C32 B84000 '.@.'
mov es,ax ; 00009C35 8EC0 '..'
mov al,0x20 ; 00009C37 B020 '. '
out 0xa0,al ; 00009C39 E6A0 '..'
out 0x20,al ; 00009C3B E620 '. '
xor al,al ; 00009C3D 32C0 '2.'
out 0xf0,al ; 00009C3F E6F0 '..'
test byte [es:0x97],0x20 ; 00009C41 26F606970020 '&.... '
jz x9c54 ; 00009C47 740B 't.'
and byte [es:0x97],0xdf ; 00009C49 2680269700DF '&.&...'
pop es ; 00009C4F 07 '.'
pop ax ; 00009C50 58 'X'
int 0x2 ; 00009C51 CD02 '..'
iret ; 00009C53 CF '.'
x9c54: cld ; 00009C54 FC '.'
push bp ; 00009C55 55 'U'
push bx ; 00009C56 53 'S'
push si ; 00009C57 56 'V'
push cx ; 00009C58 51 'Q'
push ds ; 00009C59 1E '.'
sub sp,byte +0x10 ; 00009C5A 83EC10 '...'
mov bp,sp ; 00009C5D 8BEC '..'
or byte [es:0x97],0x20 ; 00009C5F 26800E970020 '&.... '
fnstenv [bp+0x0] ; 00009C65 D97600 '.v.'
wait ; 00009C68 9B '.'
mov ax,[bp+0x6] ; 00009C69 8B4606 '.F.'
mov si,ax ; 00009C6C 8BF0 '..'
and si,0xf ; 00009C6E 81E60F00 '....'
shr ax,0x4 ; 00009C72 C1E804 '...'
mov bx,[bp+0x8] ; 00009C75 8B5E08 '.^.'
and bx,0xf000 ; 00009C78 81E300F0 '....'
or ax,bx ; 00009C7C 0BC3 '..'
mov ds,ax ; 00009C7E 8ED8 '..'
mov cx,0x10 ; 00009C80 B91000 '...'
x9c83: lodsb ; 00009C83 AC '.'
mov ah,al ; 00009C84 8AE0 '..'
and al,0xf8 ; 00009C86 24F8 '$.'
cmp al,0xd8 ; 00009C88 3CD8 '<.'
jz x9c91 ; 00009C8A 7405 't.'
loop x9c83 ; 00009C8C E2F5 '..'
jmp short x9c9d ; 00009C8E EB0D '.',0x0D
nop ; 00009C90 90 '.'
x9c91: lodsb ; 00009C91 AC '.'
and ax,0x7ff ; 00009C92 25FF07 '%..'
and word [bp+0x8],0xf800 ; 00009C95 81660800F8 '.f...'
or [bp+0x8],ax ; 00009C9A 094608 '.F.'
x9c9d: wait ; 00009C9D 9B '.'
fldenv [bp+0x0] ; 00009C9E D96600 '.f.'
add sp,byte +0x10 ; 00009CA1 83C410 '...'
pop ds ; 00009CA4 1F '.'
pop cx ; 00009CA5 59 'Y'
pop si ; 00009CA6 5E '^'
pop bx ; 00009CA7 5B '['
pop bp ; 00009CA8 5D ']'
pop es ; 00009CA9 07 '.'
pop ax ; 00009CAA 58 'X'
iret ; 00009CAB CF '.'
x9cac: push ax ; 00009CAC 50 'P'
mov al,0x1 ; 00009CAD B001 '..'
out 0x85,al ; 00009CAF E685 '..'
mov al,0x16 ; 00009CB1 B016 '..'
out 0x84,al ; 00009CB3 E684 '..'
mov al,0x20 ; 00009CB5 B020 '. '
out 0xa0,al ; 00009CB7 E6A0 '..'
pop ax ; 00009CB9 58 'X'
int 0xa ; 00009CBA CD0A '.',0x0A
iret ; 00009CBC CF '.'
push ds ; 00009CBD 1E '.'
push ax ; 00009CBE 50 'P'
mov ax,0x40 ; 00009CBF B84000 '.@.'
mov ds,ax ; 00009CC2 8ED8 '..'
pop ax ; 00009CC4 58 'X'
xor al,al ; 00009CC5 32C0 '2.'
cli ; 00009CC7 FA '.'
xchg al,[0x70] ; 00009CC8 86067000 '..p.'
mov cx,[0x6e] ; 00009CCC 8B0E6E00 '..n.'
mov dx,[0x6c] ; 00009CD0 8B166C00 '..l.'
sti ; 00009CD4 FB '.'
pop ds ; 00009CD5 1F '.'
jmp xfe81 ; 00009CD6 E9A861 '..a'
push ds ; 00009CD9 1E '.'
push ax ; 00009CDA 50 'P'
mov ax,0x40 ; 00009CDB B84000 '.@.'
mov ds,ax ; 00009CDE 8ED8 '..'
cli ; 00009CE0 FA '.'
mov [0x6e],cx ; 00009CE1 890E6E00 '..n.'
mov [0x6c],dx ; 00009CE5 89166C00 '..l.'
mov byte [0x70],0x0 ; 00009CE9 C606700000 '..p..'
sti ; 00009CEE FB '.'
pop ax ; 00009CEF 58 'X'
pop ds ; 00009CF0 1F '.'
jmp xfe81 ; 00009CF1 E98D61 '..a'
call x9d0f ; 00009CF4 E81800 '...'
mov al,0x0 ; 00009CF7 B000 '..'
call xb544 ; 00009CF9 E84818 '.H.'
mov dh,al ; 00009CFC 8AF0 '..'
mov al,0x2 ; 00009CFE B002 '..'
call xb544 ; 00009D00 E84118 '.A.'
mov cl,al ; 00009D03 8AC8 '..'
mov al,0x4 ; 00009D05 B004 '..'
call xb544 ; 00009D07 E83A18 '.:.'
mov ch,al ; 00009D0A 8AE8 '..'
jmp xfe81 ; 00009D0C E97261 '.ra'
x9d0f: mov al,0xa ; 00009D0F B00A '.',0x0A
cli ; 00009D11 FA '.'
call xb544 ; 00009D12 E82F18 './.'
test al,0x80 ; 00009D15 A880 '..'
jz x9d1c ; 00009D17 7403 't.'
sti ; 00009D19 FB '.'
jmp short x9d0f ; 00009D1A EBF3 '..'
x9d1c: ret ; 00009D1C C3 '.'
call x9d0f ; 00009D1D E8EFFF '...'
mov al,0x0 ; 00009D20 B000 '..'
mov ah,dh ; 00009D22 8AE6 '..'
call xb549 ; 00009D24 E82218 '.".'
mov al,0x2 ; 00009D27 B002 '..'
mov ah,cl ; 00009D29 8AE1 '..'
call xb549 ; 00009D2B E81B18 '...'
mov al,0x4 ; 00009D2E B004 '..'
mov ah,ch ; 00009D30 8AE5 '..'
call xb549 ; 00009D32 E81418 '...'
mov al,0xb ; 00009D35 B00B '..'
call xb544 ; 00009D37 E80A18 '.',0x0A,'.'
or al,0x2 ; 00009D3A 0C02 '..'
and al,0xfb ; 00009D3C 24FB '$.'
and al,0xfe ; 00009D3E 24FE '$.'
test dl,dl ; 00009D40 84D2 '..'
jz x9d46 ; 00009D42 7402 't.'
or al,0x1 ; 00009D44 0C01 '..'
x9d46: mov ah,al ; 00009D46 8AE0 '..'
mov al,0xb ; 00009D48 B00B '..'
call xb549 ; 00009D4A E8FC17 '...'
jmp xfe81 ; 00009D4D E93161 '.1a'
call x9d0f ; 00009D50 E8BCFF '...'
mov al,0x7 ; 00009D53 B007 '..'
call xb544 ; 00009D55 E8EC17 '...'
mov dl,al ; 00009D58 8AD0 '..'
mov al,0x8 ; 00009D5A B008 '..'
call xb544 ; 00009D5C E8E517 '...'
mov dh,al ; 00009D5F 8AF0 '..'
mov al,0x9 ; 00009D61 B009 '..'
call xb544 ; 00009D63 E8DE17 '...'
mov cl,al ; 00009D66 8AC8 '..'
mov al,0x32 ; 00009D68 B032 '.2'
call xb544 ; 00009D6A E8D717 '...'
mov ch,al ; 00009D6D 8AE8 '..'
jmp xfe81 ; 00009D6F E90F61 '..a'
call x9d0f ; 00009D72 E89AFF '...'
mov ax,0x6 ; 00009D75 B80600 '...'
call xb549 ; 00009D78 E8CE17 '...'
mov al,0x7 ; 00009D7B B007 '..'
mov ah,dl ; 00009D7D 8AE2 '..'
call xb549 ; 00009D7F E8C717 '...'
mov al,0x8 ; 00009D82 B008 '..'
mov ah,dh ; 00009D84 8AE6 '..'
call xb549 ; 00009D86 E8C017 '...'
mov al,0x9 ; 00009D89 B009 '..'
mov ah,cl ; 00009D8B 8AE1 '..'
call xb549 ; 00009D8D E8B917 '...'
mov al,0xb ; 00009D90 B00B '..'
call xb544 ; 00009D92 E8AF17 '...'
or al,0x2 ; 00009D95 0C02 '..'
and al,0xfb ; 00009D97 24FB '$.'
mov ah,al ; 00009D99 8AE0 '..'
mov al,0xb ; 00009D9B B00B '..'
call xb549 ; 00009D9D E8A917 '...'
mov al,0x32 ; 00009DA0 B032 '.2'
mov ah,ch ; 00009DA2 8AE5 '..'
call xb549 ; 00009DA4 E8A217 '...'
jmp xfe81 ; 00009DA7 E9D760 '..`'
cli ; 00009DAA FA '.'
mov al,0xb ; 00009DAB B00B '..'
call xb544 ; 00009DAD E89417 '...'
test al,0x20 ; 00009DB0 A820 '. '
jz x9dbc ; 00009DB2 7408 't.'
sti ; 00009DB4 FB '.'
pop bx ; 00009DB5 5B '['
xor ax,ax ; 00009DB6 33C0 '3.'
stc ; 00009DB8 F9 '.'
retf 0x2 ; 00009DB9 CA0200 '...'
x9dbc: mov al,0xa ; 00009DBC B00A '.',0x0A
call xb544 ; 00009DBE E88317 '...'
test al,0x80 ; 00009DC1 A880 '..'
jnz x9dbc ; 00009DC3 75F7 'u.'
mov al,0x1 ; 00009DC5 B001 '..'
mov ah,dh ; 00009DC7 8AE6 '..'
call xb549 ; 00009DC9 E87D17 '.}.'
mov al,0x3 ; 00009DCC B003 '..'
mov ah,cl ; 00009DCE 8AE1 '..'
call xb549 ; 00009DD0 E87617 '.v.'
mov al,0x5 ; 00009DD3 B005 '..'
mov ah,ch ; 00009DD5 8AE5 '..'
call xb549 ; 00009DD7 E86F17 '.o.'
in al,0xa1 ; 00009DDA E4A1 '..'
and al,0xfe ; 00009DDC 24FE '$.'
out 0xa1,al ; 00009DDE E6A1 '..'
mov al,0xb ; 00009DE0 B00B '..'
call xb544 ; 00009DE2 E85F17 '._.'
or al,0x20 ; 00009DE5 0C20 '. '
mov ah,al ; 00009DE7 8AE0 '..'
mov al,0xb ; 00009DE9 B00B '..'
call xb549 ; 00009DEB E85B17 '.[.'
jmp xfe81 ; 00009DEE E99060 '..`'
cli ; 00009DF1 FA '.'
mov al,0xb ; 00009DF2 B00B '..'
call xb544 ; 00009DF4 E84D17 '.M.'
and al,0xdf ; 00009DF7 24DF '$.'
mov ah,al ; 00009DF9 8AE0 '..'
mov al,0xb ; 00009DFB B00B '..'
call xb549 ; 00009DFD E84917 '.I.'
jmp xfe81 ; 00009E00 E97E60 '.~`'
x9e03: mov ah,bl ; 00009E03 8AE3 '..'
x9e05: mov cx,0xf424 ; 00009E05 B924F4 '.$.'
x9e08: in al,dx ; 00009E08 EC '.'
test bh,al ; 00009E09 84C7 '..'
jnz x9e19 ; 00009E0B 750C 'u.'
call x919a ; 00009E0D E88AF3 '...'
loop x9e08 ; 00009E10 E2F6 '..'
dec ah ; 00009E12 FECC '..'
jnz x9e05 ; 00009E14 75EF 'u.'
mov ah,0x80 ; 00009E16 B480 '..'
ret ; 00009E18 C3 '.'
x9e19: mov ah,0x0 ; 00009E19 B400 '..'
ret ; 00009E1B C3 '.'
x9e1c: xor ax,ax ; 00009E1C 33C0 '3.'
mov di,0xffe ; 00009E1E BFFE0F '...'
mov [es:di],ax ; 00009E21 268905 '&..'
stc ; 00009E24 F9 '.'
stc ; 00009E25 F9 '.'
stc ; 00009E26 F9 '.'
stc ; 00009E27 F9 '.'
stc ; 00009E28 F9 '.'
cmp [es:di],ax ; 00009E29 263905 '&9.'
stc ; 00009E2C F9 '.'
stc ; 00009E2D F9 '.'
stc ; 00009E2E F9 '.'
stc ; 00009E2F F9 '.'
stc ; 00009E30 F9 '.'
ret ; 00009E31 C3 '.'
x9e32: mov al,0xe ; 00009E32 B00E '..'
pushf ; 00009E34 9C '.'
cli ; 00009E35 FA '.'
call xb544 ; 00009E36 E80B17 '...'
push cs ; 00009E39 0E '.'
call x9e40 ; 00009E3A E80300 '...'
jmp short x9e41 ; 00009E3D EB02 '..'
nop ; 00009E3F 90 '.'
x9e40: iret ; 00009E40 CF '.'
x9e41: test al,0xc0 ; 00009E41 A8C0 '..'
jnz x9e57 ; 00009E43 7512 'u.'
pushf ; 00009E45 9C '.'
cli ; 00009E46 FA '.'
mov al,0x2d ; 00009E47 B02D '.-'
call xb544 ; 00009E49 E8F816 '...'
push cs ; 00009E4C 0E '.'
call x9e53 ; 00009E4D E80300 '...'
jmp short x9e54 ; 00009E50 EB02 '..'
nop ; 00009E52 90 '.'
x9e53: iret ; 00009E53 CF '.'
x9e54: and al,0x1 ; 00009E54 2401 '$.'
ret ; 00009E56 C3 '.'
x9e57: xor ax,ax ; 00009E57 33C0 '3.'
ret ; 00009E59 C3 '.'
x9e5a: mov al,0x8e ; 00009E5A B08E '..'
pushf ; 00009E5C 9C '.'
cli ; 00009E5D FA '.'
call xb544 ; 00009E5E E8E316 '...'
push cs ; 00009E61 0E '.'
call x9e68 ; 00009E62 E80300 '...'
jmp short x9e69 ; 00009E65 EB02 '..'
nop ; 00009E67 90 '.'
x9e68: iret ; 00009E68 CF '.'
x9e69: test al,0xc0 ; 00009E69 A8C0 '..'
jnz x9e7f ; 00009E6B 7512 'u.'
pushf ; 00009E6D 9C '.'
cli ; 00009E6E FA '.'
mov al,0xad ; 00009E6F B0AD '..'
call xb544 ; 00009E71 E8D016 '...'
push cs ; 00009E74 0E '.'
call x9e7b ; 00009E75 E80300 '...'
jmp short x9e7c ; 00009E78 EB02 '..'
nop ; 00009E7A 90 '.'
x9e7b: iret ; 00009E7B CF '.'
x9e7c: and al,0x1 ; 00009E7C 2401 '$.'
ret ; 00009E7E C3 '.'
x9e7f: xor ax,ax ; 00009E7F 33C0 '3.'
ret ; 00009E81 C3 '.'
x9e82: sti ; 00009E82 FB '.'
push ds ; 00009E83 1E '.'
mov ax,0x40 ; 00009E84 B84000 '.@.'
mov ds,ax ; 00009E87 8ED8 '..'
mov eax,[0x10] ; 00009E89 66A11000 'f...'
and eax,0xffff ; 00009E8D 6625FFFF0000 'f%....'
push eax ; 00009E93 6650 'fP'
mov al,0x33 ; 00009E95 B033 '.3'
out 0x70,al ; 00009E97 E670 '.p'
in al,0x71 ; 00009E99 E471 '.q'
test al,0x20 ; 00009E9B A820 '. '
pop eax ; 00009E9D 6658 'fX'
jz x9ea7 ; 00009E9F 7406 't.'
or eax,0x1000000 ; 00009EA1 660D00000001 'f',0x0D,'....'
x9ea7: pop ds ; 00009EA7 1F '.'
ret ; 00009EA8 C3 '.'
call x9e32 ; 00009EA9 E886FF '...'
jz x9f16 ; 00009EAC 7468 'th'
cmp byte [0x49],0x2 ; 00009EAE 803E490002 '.>I..'
jz x9ebe ; 00009EB3 7409 't.'
cmp byte [0x49],0x3 ; 00009EB5 803E490003 '.>I..'
jz x9ebe ; 00009EBA 7402 't.'
jmp short x9f16 ; 00009EBC EB58 '.X'
x9ebe: xor di,di ; 00009EBE 33FF '3.'
mov es,di ; 00009EC0 8EC7 '..'
mov di,0x74 ; 00009EC2 BF7400 '.t.'
mov al,[bp+0x0] ; 00009EC5 8A4600 '.F.'
cmp al,0x0 ; 00009EC8 3C00 '<.'
jz x9ed5 ; 00009ECA 7409 't.'
cmp al,0x1 ; 00009ECC 3C01 '<.'
jnz x9f16 ; 00009ECE 7546 'uF'
mov ax,0xf0e4 ; 00009ED0 B8E4F0 '...'
jmp short x9ed8 ; 00009ED3 EB03 '..'
x9ed5: mov ax,0xf0a4 ; 00009ED5 B8A4F0 '...'
x9ed8: cmp ax,[es:di] ; 00009ED8 263B05 '&;.'
jz x9f16 ; 00009EDB 7439 't9'
cld ; 00009EDD FC '.'
cli ; 00009EDE FA '.'
stosw ; 00009EDF AB '.'
mov ax,cs ; 00009EE0 8CC8 '..'
stosw ; 00009EE2 AB '.'
sti ; 00009EE3 FB '.'
mov al,[0x65] ; 00009EE4 A06500 '.e.'
mov ah,[0x66] ; 00009EE7 8A266600 '.&f.'
mov dx,[0x63] ; 00009EEB 8B166300 '..c.'
mov cx,0xc ; 00009EEF B90C00 '...'
call xa795 ; 00009EF2 E8A008 '...'
mov bx,0x1f4 ; 00009EF5 BBF401 '...'
call xc638 ; 00009EF8 E83D27 '.=',0x27
add dx,byte +0x4 ; 00009EFB 83C204 '...'
mov al,[0x65] ; 00009EFE A06500 '.e.'
out dx,al ; 00009F01 EE '.'
mov ah,0xf ; 00009F02 B40F '..'
call x83db ; 00009F04 E8D4E4 '...'
mov ah,0x3 ; 00009F07 B403 '..'
call x83db ; 00009F09 E8CFE4 '...'
mov ah,0x2 ; 00009F0C B402 '..'
call x83db ; 00009F0E E8CAE4 '...'
mov ah,0x1 ; 00009F11 B401 '..'
call x83db ; 00009F13 E8C5E4 '...'
x9f16: ret ; 00009F16 C3 '.'
x9f17: cld ; 00009F17 FC '.'
lodsd ; 00009F18 66AD 'f.'
push ax ; 00009F1A 50 'P'
in al,0x61 ; 00009F1B E461 '.a'
test al,0x40 ; 00009F1D A840 '.@'
pop ax ; 00009F1F 58 'X'
jz x9f47 ; 00009F20 7425 't%'
sub si,byte +0x4 ; 00009F22 83EE04 '...'
mov [si],eax ; 00009F25 668904 'f..'
push ds ; 00009F28 1E '.'
push ax ; 00009F29 50 'P'
mov ax,0x48 ; 00009F2A B84800 '.H.'
mov ds,ax ; 00009F2D 8ED8 '..'
in al,0x61 ; 00009F2F E461 '.a'
mov ah,al ; 00009F31 8AE0 '..'
or al,0x8 ; 00009F33 0C08 '..'
out 0x61,al ; 00009F35 E661 '.a'
mov dl,[0x0] ; 00009F37 8A160000 '....'
mov byte [0x0],0xff ; 00009F3B C6060000FF '.....'
xchg al,ah ; 00009F40 86C4 '..'
out 0x61,al ; 00009F42 E661 '.a'
pop ax ; 00009F44 58 'X'
pop ds ; 00009F45 1F '.'
stc ; 00009F46 F9 '.'
x9f47: retf ; 00009F47 CB '.'
xchg si,di ; 00009F48 87F7 '..'
cmp byte [bp+0x6],0x0 ; 00009F4A 807E0600 '.~..'
jnz x9f67 ; 00009F4E 7517 'u.'
call xd3f3 ; 00009F50 E8A034 '..4'
jnz x9f6c ; 00009F53 7517 'u.'
mov al,0x33 ; 00009F55 B033 '.3'
out 0x70,al ; 00009F57 E670 '.p'
in al,0x71 ; 00009F59 E471 '.q'
test al,0x4 ; 00009F5B A804 '..'
jz x9f67 ; 00009F5D 7408 't.'
and al,0xfc ; 00009F5F 24FC '$.'
jnz x9f9a ; 00009F61 7537 'u7'
or al,0x4 ; 00009F63 0C04 '..'
jmp short x9f9a ; 00009F65 EB33 '.3'
x9f67: call xd405 ; 00009F67 E89B34 '..4'
jnc x9f9a ; 00009F6A 732E 's.'
x9f6c: call xd423 ; 00009F6C E8B434 '..4'
jz x9fac ; 00009F6F 743B 't;'
mov si,0xa024 ; 00009F71 BE24A0 '.$.'
call xd47d ; 00009F74 E80635 '..5'
test al,0x1 ; 00009F77 A801 '..'
jz x9fcb ; 00009F79 7450 'tP'
mov si,0xa029 ; 00009F7B BE29A0 '.).'
call x9190 ; 00009F7E E80FF2 '...'
mov bh,[bx] ; 00009F81 8A3F '.?'
mov bl,bh ; 00009F83 8ADF '..'
and bh,0x6 ; 00009F85 80E706 '...'
cmp bh,0x4 ; 00009F88 80FF04 '...'
jz x9fcb ; 00009F8B 743E 't>'
mov si,0xa033 ; 00009F8D BE33A0 '.3.'
and bl,0xc0 ; 00009F90 80E3C0 '...'
jz x9fcb ; 00009F93 7436 't6'
mov si,0xa02e ; 00009F95 BE2EA0 '...'
jmp short x9fcb ; 00009F98 EB31 '.1'
x9f9a: mov si,0xa024 ; 00009F9A BE24A0 '.$.'
mov ah,0x4 ; 00009F9D B404 '..'
x9f9f: dec ah ; 00009F9F FECC '..'
jz x9fcb ; 00009FA1 7428 't('
dec al ; 00009FA3 FEC8 '..'
jz x9fcb ; 00009FA5 7424 't$'
add si,byte +0x5 ; 00009FA7 83C605 '...'
jmp short x9f9f ; 00009FAA EBF3 '..'
x9fac: mov word [bp+0x2],0x0 ; 00009FAC C746020000 '.F...'
mov word [bp+0x4],0x0 ; 00009FB1 C746040000 '.F...'
mov byte [bp+0x7],0x0 ; 00009FB6 C6460700 '.F..'
mov word [bp+0xc],0x0 ; 00009FBA C7460C0000 '.F...'
mov word [bp+0xa],0x0 ; 00009FBF C7460A0000 '.F',0x0A,'..'
call xd3f3 ; 00009FC4 E82C34 '.,4'
jnz xa005 ; 00009FC7 753C 'u<'
jmp short xa014 ; 00009FC9 EB49 '.I'
x9fcb: call xd436 ; 00009FCB E86834 '.h4'
jc x9fac ; 00009FCE 72DC 'r.'
mov [bp+0xc],cs ; 00009FD0 8C4E0C '.N.'
mov dx,[cs:si+0x3] ; 00009FD3 2E8B5403 '..T.'
mov [bp+0xa],dx ; 00009FD7 89560A '.V',0x0A
xor bx,bx ; 00009FDA 33DB '3.'
call xd3f3 ; 00009FDC E81434 '..4'
jnz x9feb ; 00009FDF 750A 'u',0x0A
call xd405 ; 00009FE1 E82134 '.!4'
jc x9feb ; 00009FE4 7205 'r.'
mov bl,[cs:si] ; 00009FE6 2E8A1C '...'
xor bh,bh ; 00009FE9 32FF '2.'
x9feb: mov [bp+0x2],bx ; 00009FEB 895E02 '.^.'
mov ch,[cs:si+0x2] ; 00009FEE 2E8A6C02 '..l.'
mov [bp+0x5],ch ; 00009FF2 886E05 '.n.'
mov cl,[cs:si+0x1] ; 00009FF5 2E8A4C01 '..L.'
mov [bp+0x4],cl ; 00009FF9 884E04 '.N.'
mov byte [bp+0x7],0x1 ; 00009FFC C6460701 '.F..'
call 0xd423 ; 0000A000 E82034 '. 4'
jnz xa014 ; 0000A003 750F 'u.'
xa005: call x9190 ; 0000A005 E888F1 '...'
cmp byte [bx],0x0 ; 0000A008 803F00 '.?.'
jnz xa014 ; 0000A00B 7507 'u.'
xchg si,di ; 0000A00D 87F7 '..'
call x9293 ; 0000A00F E881F2 '...'
xchg si,di ; 0000A012 87F7 '..'
xa014: call xd436 ; 0000A014 E81F34 '..4'
mov [bp+0x6],dl ; 0000A017 885606 '.V.'
xor ax,ax ; 0000A01A 33C0 '3.'
and word [bp+0x16],0xfffe ; 0000A01C 816616FEFF '.f...'
xchg si,di ; 0000A021 87F7 '..'
ret ; 0000A023 C3 '.'
add [bx+di],cx ; 0000A024 0109 '..'
daa ; 0000A026 27 0x27
sti ; 0000A027 FB '.'
and [bp+si],al ; 0000A028 2002 ' .'
cmovg dx,[di] ; 0000A02A 0F4F15 '.O.'
and [bp+di],ax ; 0000A02D 2103 '!.'
or [bx+0x22],cx ; 0000A02F 094F22 '.O"'
and [si],ax ; 0000A032 2104 '!.'
adc cl,[bx+0x3c] ; 0000A034 124F3C '.O<'
and [bx+0xbef7],ax ; 0000A037 2187F7BE '!...'
int 0xa0 ; 0000A03B CDA0 '..'
mov dx,[bp+0x4] ; 0000A03D 8B5604 '.V.'
call xd3f3 ; 0000A040 E8B033 '..3'
jnz xa074 ; 0000A043 752F 'u/'
call xd405 ; 0000A045 E8BD33 '..3'
jc xa070 ; 0000A048 7226 'r&'
cmp al,0x1 ; 0000A04A 3C01 '<.'
jz xa068 ; 0000A04C 741A 't.'
add si,byte +0x6 ; 0000A04E 83C606 '...'
cmp al,0x2 ; 0000A051 3C02 '<.'
jz xa05f ; 0000A053 740A 't',0x0A
add si,byte +0xc ; 0000A055 83C60C '...'
cmp al,0x3 ; 0000A058 3C03 '<.'
jz xa068 ; 0000A05A 740C 't.'
add si,byte +0x6 ; 0000A05C 83C606 '...'
xa05f: cmp dx,[cs:si+0x1] ; 0000A05F 2E3B5401 '.;T.'
jz xa07a ; 0000A063 7415 't.'
add si,byte +0x6 ; 0000A065 83C606 '...'
xa068: cmp dx,[cs:si+0x1] ; 0000A068 2E3B5401 '.;T.'
jz xa07a ; 0000A06C 740C 't.'
jmp short xa0a5 ; 0000A06E EB35 '.5'
xa070: cmp al,0x0 ; 0000A070 3C00 '<.'
jz xa09c ; 0000A072 7428 't('
xa074: cmp dx,[cs:si+0x1] ; 0000A074 2E3B5401 '.;T.'
jnz xa0b0 ; 0000A078 7536 'u6'
xa07a: call x9190 ; 0000A07A E813F1 '...'
cmp byte [bx],0x0 ; 0000A07D 803F00 '.?.'
jnz xa089 ; 0000A080 7507 'u.'
xchg si,di ; 0000A082 87F7 '..'
call x9293 ; 0000A084 E80CF2 '...'
xchg si,di ; 0000A087 87F7 '..'
xa089: mov dl,[cs:si+0x3] ; 0000A089 2E8A5403 '..T.'
call x9190 ; 0000A08D E800F1 '...'
mov [bx],dl ; 0000A090 8817 '..'
mov [bp+0xc],cs ; 0000A092 8C4E0C '.N.'
mov dx,[cs:si+0x4] ; 0000A095 2E8B5404 '..T.'
mov [bp+0xa],dx ; 0000A099 89560A '.V',0x0A
xa09c: and word [bp+0x16],0x1 ; 0000A09C 8166160100 '.f...'
xor ax,ax ; 0000A0A1 33C0 '3.'
jmp short xa0b9 ; 0000A0A3 EB14 '..'
xa0a5: or word [bp+0x16],0x1 ; 0000A0A5 814E160100 '.N...'
mov ah,0xc ; 0000A0AA B40C '..'
xor al,al ; 0000A0AC 32C0 '2.'
jmp short xa0ca ; 0000A0AE EB1A '..'
xa0b0: or word [bp+0x16],0x1 ; 0000A0B0 814E160100 '.N...'
mov ah,0xc ; 0000A0B5 B40C '..'
xor al,al ; 0000A0B7 32C0 '2.'
xa0b9: call x9190 ; 0000A0B9 E8D4F0 '...'
cmp byte [bx],0x0 ; 0000A0BC 803F00 '.?.'
jnz xa0ca ; 0000A0BF 7509 'u.'
xchg si,di ; 0000A0C1 87F7 '..'
push ax ; 0000A0C3 50 'P'
call x9293 ; 0000A0C4 E8CCF1 '...'
pop ax ; 0000A0C7 58 'X'
xchg si,di ; 0000A0C8 87F7 '..'
xa0ca: xchg si,di ; 0000A0CA 87F7 '..'
ret ; 0000A0CC C3 '.'
add [bx+di],cx ; 0000A0CD 0109 '..'
daa ; 0000A0CF 27 0x27
xchg ax,bx ; 0000A0D0 93 '.'
sti ; 0000A0D1 FB '.'
and [bp+si],al ; 0000A0D2 2002 ' .'
or [bx],sp ; 0000A0D4 0927 '.',0x27
jz xa0e0 ; 0000A0D6 7408 't.'
and [bp+si],ax ; 0000A0D8 2102 '!.'
cmovg dx,[di] ; 0000A0DA 0F4F15 '.O.'
adc ax,0x321 ; 0000A0DD 152103 '.!.'
xa0e0: or [bx-0x69],cx ; 0000A0E0 094F97 '.O.'
and ah,[bx+di] ; 0000A0E3 2221 '"!'
add cx,[bx+di] ; 0000A0E5 0309 '..'
dec di ; 0000A0E7 4F 'O'
xchg ax,di ; 0000A0E8 97 '.'
das ; 0000A0E9 2F '/'
and [si],ax ; 0000A0EA 2104 '!.'
adc cl,[bx+0x17] ; 0000A0EC 124F17 '.O.'
cmp al,0x21 ; 0000A0EF 3C21 '<!'
times 10 db 0xFF ; 0000A0F1 - 0000A0FA
fild word [bp+si] ; 0000A0FB DF02 '..'
and ax,0x902 ; 0000A0FD 250209 '%..'
sub bh,bh ; 0000A100 2AFF '*.'
push ax ; 0000A102 50 'P'
db 0xF6 ; 0000A103 F6 '.'
invd ; 0000A104 0F08 '..'
daa ; 0000A106 27 0x27
sbb bh,0x2 ; 0000A107 80DF02 '...'
and ax,0x902 ; 0000A10A 250209 '%..'
sub bh,bh ; 0000A10D 2AFF '*.'
push ax ; 0000A10F 50 'P'
db 0xF6 ; 0000A110 F6 '.'
invd ; 0000A111 0F08 '..'
daa ; 0000A113 27 0x27
inc ax ; 0000A114 40 '@'
fild word [bp+si] ; 0000A115 DF02 '..'
and ax,0xf02 ; 0000A117 25020F '%..'
sbb di,di ; 0000A11A 1BFF '..'
push sp ; 0000A11C 54 'T'
db 0xF6 ; 0000A11D F6 '.'
invd ; 0000A11E 0F08 '..'
dec di ; 0000A120 4F 'O'
add bh,bl ; 0000A121 00DF '..'
add ah,[di] ; 0000A123 0225 '.%'
add cl,[bx+di] ; 0000A125 0209 '..'
sub bh,bh ; 0000A127 2AFF '*.'
push ax ; 0000A129 50 'P'
db 0xF6 ; 0000A12A F6 '.'
invd ; 0000A12B 0F08 '..'
dec di ; 0000A12D 4F 'O'
sbb bh,0x2 ; 0000A12E 80DF02 '...'
and ax,0x902 ; 0000A131 250209 '%..'
sub bh,bh ; 0000A134 2AFF '*.'
push ax ; 0000A136 50 'P'
db 0xF6 ; 0000A137 F6 '.'
invd ; 0000A138 0F08 '..'
dec di ; 0000A13A 4F 'O'
sbb bh,0x2 ; 0000A13B 80DF02 '...'
and ax,0x1202 ; 0000A13E 250212 '%..'
sbb di,di ; 0000A141 1BFF '..'
db 0x65 ; 0000A143 65 'e'
db 0xF6 ; 0000A144 F6 '.'
invd ; 0000A145 0F08 '..'
dec di ; 0000A147 4F 'O'
add [bp+di+0x20a3],cl ; 0000A148 008BA320 '... '
add [bp+si],ch ; 0000A14C 002A '.*'
movsw ; 0000A14E A5 '.'
cmp [bx+si],al ; 0000A14F 3800 '8.'
db 0xFF ; 0000A151 FF '.'
inc word [bx+si] ; 0000A152 FF00 '..'
add [bx+si],al ; 0000A154 0000 '..'
add [bx+si],al ; 0000A156 0000 '..'
add bl,bh ; 0000A158 00FB '..'
pop di ; 0000A15A 5F '_'
push ds ; 0000A15B 1E '.'
push ax ; 0000A15C 50 'P'
mov di,0x40 ; 0000A15D BF4000 '.@.'
mov ds,di ; 0000A160 8EDF '..'
cmp al,0x1 ; 0000A162 3C01 '<.'
ja xa199 ; 0000A164 7733 'w3'
jz xa185 ; 0000A166 741D 't.'
test byte [0xa0],0x1 ; 0000A168 F606A00001 '.....'
jnz xa199 ; 0000A16D 752A 'u*'
or byte [0xa0],0x1 ; 0000A16F 800EA00001 '.....'
call xa1c8 ; 0000A174 E85100 '.Q.'
cli ; 0000A177 FA '.'
in al,0xa1 ; 0000A178 E4A1 '..'
and al,0xfe ; 0000A17A 24FE '$.'
out 0xa1,al ; 0000A17C E6A1 '..'
sti ; 0000A17E FB '.'
call 0xa1a2 ; 0000A17F E82000 '. .'
clc ; 0000A182 F8 '.'
jmp short xa19a ; 0000A183 EB15 '..'
xa185: test byte [0xa0],0x1 ; 0000A185 F606A00001 '.....'
jnz xa18f ; 0000A18A 7503 'u.'
clc ; 0000A18C F8 '.'
jmp short xa19a ; 0000A18D EB0B '..'
xa18f: call xa1b5 ; 0000A18F E82300 '.#.'
and byte [0xa0],0xfe ; 0000A192 8026A000FE '.&...'
jmp short xa19a ; 0000A197 EB01 '..'
xa199: stc ; 0000A199 F9 '.'
xa19a: pop ax ; 0000A19A 58 'X'
mov ah,0x0 ; 0000A19B B400 '..'
pop ds ; 0000A19D 1F '.'
pop di ; 0000A19E 5F '_'
retf 0x2 ; 0000A19F CA0200 '...'
xa1a2: cli ; 0000A1A2 FA '.'
mov al,0xb ; 0000A1A3 B00B '..'
call xb544 ; 0000A1A5 E89C13 '...'
or al,0x40 ; 0000A1A8 0C40 '.@'
push ax ; 0000A1AA 50 'P'
mov ah,al ; 0000A1AB 8AE0 '..'
mov al,0xb ; 0000A1AD B00B '..'
call xb549 ; 0000A1AF E89713 '...'
pop ax ; 0000A1B2 58 'X'
sti ; 0000A1B3 FB '.'
ret ; 0000A1B4 C3 '.'
xa1b5: cli ; 0000A1B5 FA '.'
mov al,0xb ; 0000A1B6 B00B '..'
call xb544 ; 0000A1B8 E88913 '...'
and al,0xbf ; 0000A1BB 24BF '$.'
push ax ; 0000A1BD 50 'P'
mov ah,al ; 0000A1BE 8AE0 '..'
mov al,0xb ; 0000A1C0 B00B '..'
call xb549 ; 0000A1C2 E88413 '...'
pop ax ; 0000A1C5 58 'X'
sti ; 0000A1C6 FB '.'
ret ; 0000A1C7 C3 '.'
xa1c8: mov [0x98],bx ; 0000A1C8 891E9800 '....'
mov [0x9a],es ; 0000A1CC 8C069A00 '....'
mov [0x9c],dx ; 0000A1D0 89169C00 '....'
mov [0x9e],cx ; 0000A1D4 890E9E00 '....'
ret ; 0000A1D8 C3 '.'
sti ; 0000A1D9 FB '.'
cmp dx,byte +0x0 ; 0000A1DA 83FA00 '...'
jz xa1e6 ; 0000A1DD 7407 't.'
dec dx ; 0000A1DF 4A 'J'
jz xa1f1 ; 0000A1E0 740F 't.'
mov ah,0x86 ; 0000A1E2 B486 '..'
stc ; 0000A1E4 F9 '.'
ret ; 0000A1E5 C3 '.'
xa1e6: xor ah,ah ; 0000A1E6 32E4 '2.'
mov dx,0x201 ; 0000A1E8 BA0102 '...'
in al,dx ; 0000A1EB EC '.'
and al,0xf0 ; 0000A1EC 24F0 '$.'
jmp xa27d ; 0000A1EE E98C00 '...'
xa1f1: mov dx,0x201 ; 0000A1F1 BA0102 '...'
in al,dx ; 0000A1F4 EC '.'
and al,0xf ; 0000A1F5 240F '$.'
cmp al,0xf ; 0000A1F7 3C0F '<.'
jnz xa205 ; 0000A1F9 750A 'u',0x0A
xor ax,ax ; 0000A1FB 33C0 '3.'
xor bx,bx ; 0000A1FD 33DB '3.'
xor cx,cx ; 0000A1FF 33C9 '3.'
xor dx,dx ; 0000A201 33D2 '3.'
jmp short xa27d ; 0000A203 EB78 '.x'
xa205: push bp ; 0000A205 55 'U'
sub sp,byte +0xe ; 0000A206 83EC0E '...'
mov bp,sp ; 0000A209 8BEC '..'
mov [bp+0x0],al ; 0000A20B 884600 '.F.'
cli ; 0000A20E FA '.'
call xa27f ; 0000A20F E86D00 '.m.'
mov di,cx ; 0000A212 8BF9 '..'
mov al,0xf ; 0000A214 B00F '..'
out dx,al ; 0000A216 EE '.'
mov word [bp+0xc],0x0 ; 0000A217 C7460C0000 '.F...'
xa21c: mov bx,[bp+0xc] ; 0000A21C 8B5E0C '.^.'
mov [bp+0xa],bx ; 0000A21F 895E0A '.^',0x0A
mov ah,al ; 0000A222 8AE0 '..'
in al,dx ; 0000A224 EC '.'
and al,0xf ; 0000A225 240F '$.'
xor ah,al ; 0000A227 32E0 '2.'
jnz xa23c ; 0000A229 7511 'u.'
mov bx,di ; 0000A22B 8BDF '..'
call xa27f ; 0000A22D E84F00 '.O.'
sub bx,cx ; 0000A230 2BD9 '+.'
mov [bp+0xc],bx ; 0000A232 895E0C '.^.'
cmp bx,[bp+0xa] ; 0000A235 3B5E0A ';^',0x0A
ja xa21c ; 0000A238 77E2 'w.'
jmp short xa268 ; 0000A23A EB2C '.,'
xa23c: mov bx,di ; 0000A23C 8BDF '..'
call xa27f ; 0000A23E E83E00 '.>.'
sub bx,cx ; 0000A241 2BD9 '+.'
test ah,0x1 ; 0000A243 F6C401 '...'
jz xa24b ; 0000A246 7403 't.'
mov [bp+0x2],bx ; 0000A248 895E02 '.^.'
xa24b: test ah,0x2 ; 0000A24B F6C402 '...'
jz xa253 ; 0000A24E 7403 't.'
mov [bp+0x4],bx ; 0000A250 895E04 '.^.'
xa253: test ah,0x4 ; 0000A253 F6C404 '...'
jz xa25b ; 0000A256 7403 't.'
mov [bp+0x6],bx ; 0000A258 895E06 '.^.'
xa25b: test ah,0x8 ; 0000A25B F6C408 '...'
jz xa263 ; 0000A25E 7403 't.'
mov [bp+0x8],bx ; 0000A260 895E08 '.^.'
xa263: cmp [bp+0x0],al ; 0000A263 384600 '8F.'
jnz xa21c ; 0000A266 75B4 'u.'
xa268: sti ; 0000A268 FB '.'
pop ax ; 0000A269 58 'X'
pop ax ; 0000A26A 58 'X'
pop bx ; 0000A26B 5B '['
pop cx ; 0000A26C 59 'Y'
pop dx ; 0000A26D 5A 'Z'
pop bp ; 0000A26E 5D ']'
pop bp ; 0000A26F 5D ']'
pop bp ; 0000A270 5D ']'
shr ax,0x4 ; 0000A271 C1E804 '...'
shr bx,0x4 ; 0000A274 C1EB04 '...'
shr cx,0x4 ; 0000A277 C1E904 '...'
shr dx,0x4 ; 0000A27A C1EA04 '...'
xa27d: clc ; 0000A27D F8 '.'
ret ; 0000A27E C3 '.'
xa27f: push ax ; 0000A27F 50 'P'
mov al,0x0 ; 0000A280 B000 '..'
out 0x43,al ; 0000A282 E643 '.C'
in al,0x40 ; 0000A284 E440 '.@'
mov cl,al ; 0000A286 8AC8 '..'
in al,0x40 ; 0000A288 E440 '.@'
mov ch,al ; 0000A28A 8AE8 '..'
pop ax ; 0000A28C 58 'X'
ret ; 0000A28D C3 '.'
sti ; 0000A28E FB '.'
pop di ; 0000A28F 5F '_'
push ds ; 0000A290 1E '.'
push bx ; 0000A291 53 'S'
mov bx,0x40 ; 0000A292 BB4000 '.@.'
mov ds,bx ; 0000A295 8EDB '..'
test byte [0xa0],0x1 ; 0000A297 F606A00001 '.....'
jnz xa2cc ; 0000A29C 752E 'u.'
mov byte [0xa0],0x1 ; 0000A29E C606A00001 '.....'
push es ; 0000A2A3 06 '.'
mov es,bx ; 0000A2A4 8EC3 '..'
lea bx,[0xa0] ; 0000A2A6 8D1EA000 '....'
call xa1c8 ; 0000A2AA E81BFF '...'
pop es ; 0000A2AD 07 '.'
cli ; 0000A2AE FA '.'
in al,0xa1 ; 0000A2AF E4A1 '..'
and al,0xfe ; 0000A2B1 24FE '$.'
jmp short xa2b5 ; 0000A2B3 EB00 '..'
xa2b5: jmp short xa2b7 ; 0000A2B5 EB00 '..'
xa2b7: out 0xa1,al ; 0000A2B7 E6A1 '..'
sti ; 0000A2B9 FB '.'
call xa1a2 ; 0000A2BA E8E5FE '...'
xa2bd: test byte [0xa0],0x80 ; 0000A2BD F606A00080 '.....'
jz xa2bd ; 0000A2C2 74F9 't.'
and byte [0xa0],0x7f ; 0000A2C4 8026A0007F '.&...'
clc ; 0000A2C9 F8 '.'
jmp short xa2cd ; 0000A2CA EB01 '..'
xa2cc: stc ; 0000A2CC F9 '.'
xa2cd: pop bx ; 0000A2CD 5B '['
pop ds ; 0000A2CE 1F '.'
pop di ; 0000A2CF 5F '_'
retf 0x2 ; 0000A2D0 CA0200 '...'
sti ; 0000A2D3 FB '.'
pop di ; 0000A2D4 5F '_'
pop di ; 0000A2D5 5F '_'
pusha ; 0000A2D6 60 '`'
push es ; 0000A2D7 06 '.'
push ds ; 0000A2D8 1E '.'
mov ax,0x40 ; 0000A2D9 B84000 '.@.'
mov ds,ax ; 0000A2DC 8ED8 '..'
mov [0x67],sp ; 0000A2DE 89266700 '.&g.'
mov [0x69],ss ; 0000A2E2 8C166900 '..i.'
mov al,0x0 ; 0000A2E6 B000 '..'
out 0x80,al ; 0000A2E8 E680 '..'
call xa3e0 ; 0000A2EA E8F300 '...'
jz xa2f5 ; 0000A2ED 7406 't.'
pop ds ; 0000A2EF 1F '.'
pop es ; 0000A2F0 07 '.'
popa ; 0000A2F1 61 'a'
mov ah,0x3 ; 0000A2F2 B403 '..'
iret ; 0000A2F4 CF '.'
xa2f5: sti ; 0000A2F5 FB '.'
lea bx,[si+0x20] ; 0000A2F6 8D5C20 '.\ '
mov word [es:bx],0xffff ; 0000A2F9 26C707FFFF '&....'
mov ax,cs ; 0000A2FE 8CC8 '..'
shl ax,0x4 ; 0000A300 C1E004 '...'
mov [es:bx+0x2],ax ; 0000A303 26894702 '&.G.'
mov ax,cs ; 0000A307 8CC8 '..'
shr ax,0xc ; 0000A309 C1E80C '...'
mov [es:bx+0x4],al ; 0000A30C 26884704 '&.G.'
mov byte [es:bx+0x5],0x9a ; 0000A310 26C647059A '&.G..'
lea bx,[si+0x28] ; 0000A315 8D5C28 '.\('
mov word [es:bx],0xffff ; 0000A318 26C707FFFF '&....'
mov ax,ss ; 0000A31D 8CD0 '..'
shl ax,0x4 ; 0000A31F C1E004 '...'
mov [es:bx+0x2],ax ; 0000A322 26894702 '&.G.'
mov ax,ss ; 0000A326 8CD0 '..'
shr ax,0xc ; 0000A328 C1E80C '...'
mov [es:bx+0x4],al ; 0000A32B 26884704 '&.G.'
mov byte [es:bx+0x5],0x92 ; 0000A32F 26C6470592 '&.G..'
push es ; 0000A334 06 '.'
push si ; 0000A335 56 'V'
mov ax,cs ; 0000A336 8CC8 '..'
mov es,ax ; 0000A338 8EC0 '..'
lea si,[0xa592] ; 0000A33A 8D3692A5 '.6..'
call xa425 ; 0000A33E E8E400 '...'
mov dx,ax ; 0000A341 8BD0 '..'
call xa42d ; 0000A343 E8E700 '...'
pop si ; 0000A346 5E '^'
pop es ; 0000A347 07 '.'
lea bx,[si+0x8] ; 0000A348 8D5C08 '.\.'
mov [es:bx+0x2],dx ; 0000A34B 26895702 '&.W.'
mov [es:bx+0x4],al ; 0000A34F 26884704 '&.G.'
mov word [es:bx],0xff ; 0000A353 26C707FF00 '&....'
cli ; 0000A358 FA '.'
mov al,0x80 ; 0000A359 B080 '..'
out 0x70,al ; 0000A35B E670 '.p'
lidt [es:bx] ; 0000A35D 260F011F '&...'
call xa425 ; 0000A361 E8C100 '...'
mov [es:bx+0x2],ax ; 0000A364 26894702 '&.G.'
call xa42d ; 0000A368 E8C200 '...'
mov [es:bx+0x4],al ; 0000A36B 26884704 '&.G.'
mov word [es:bx],0xffff ; 0000A36F 26C707FFFF '&....'
mov byte [es:bx+0x5],0x92 ; 0000A374 26C6470592 '&.G..'
lgdt [es:bx] ; 0000A379 260F0117 '&...'
smsw ax ; 0000A37D 0F01E0 '...'
or ax,0x1 ; 0000A380 0D0100 0x0D,'..'
lmsw ax ; 0000A383 0F01F0 '...'
jmp far [cs:0xa149] ; 0000A386 2EFF2E49A1 '...I.'
xor ax,ax ; 0000A38B 33C0 '3.'
lldt ax ; 0000A38D 0F00D0 '...'
mov ax,0x28 ; 0000A390 B82800 '.(.'
mov ss,ax ; 0000A393 8ED0 '..'
mov ax,0x10 ; 0000A395 B81000 '...'
mov ds,ax ; 0000A398 8ED8 '..'
mov ax,0x18 ; 0000A39A B81800 '...'
mov es,ax ; 0000A39D 8EC0 '..'
cld ; 0000A39F FC '.'
xor si,si ; 0000A3A0 33F6 '3.'
xor di,di ; 0000A3A2 33FF '3.'
mov al,0x0 ; 0000A3A4 B000 '..'
out 0x70,al ; 0000A3A6 E670 '.p'
push cx ; 0000A3A8 51 'Q'
shr cx,1 ; 0000A3A9 D1E9 '..'
rep movsd ; 0000A3AB 66F3A5 'f..'
pop cx ; 0000A3AE 59 'Y'
test cx,0x1 ; 0000A3AF F7C10100 '....'
jz xa3b6 ; 0000A3B3 7401 't.'
movsw ; 0000A3B5 A5 '.'
xa3b6: mov al,0x80 ; 0000A3B6 B080 '..'
out 0x70,al ; 0000A3B8 E670 '.p'
mov ax,0x28 ; 0000A3BA B82800 '.(.'
mov ds,ax ; 0000A3BD 8ED8 '..'
mov es,ax ; 0000A3BF 8EC0 '..'
mov ss,ax ; 0000A3C1 8ED0 '..'
push eax ; 0000A3C3 6650 'fP'
mov eax,cr0 ; 0000A3C5 0F2000
and eax,0x7ffffffe ; 0000A3C8 6625FEFFFF7F 'f%....'
mov cr0,eax ; 0000A3CE 0F2200
pop eax ; 0000A3D1 6658 'fX'
jmp 0xf000:0xa3d8 ; 0000A3D3 EAD8A300F0 '.....'
lidt [cs:0xa151] ; 0000A3D8 2E0F011E51A1 '....Q.'
jmp short xa43c ; 0000A3DE EB5C '.\'
;
; Enable A20
;
xa3e0: cli ; 0000A3E0 FA '.'
call xec2e_wait_8042_ready ; 0000A3E1 E84A48 '.JH'
jnz xa3ff ; 0000A3E4 7519 'u.'
mov al,CMD8042_WRITE_OUTPORT; 0000A3E6 B0D1 '..'
out 0x64,al ; 0000A3E8 E664 '.d'
call xec2e_wait_8042_ready ; 0000A3EA E84148 '.AH'
jnz xa3ff ; 0000A3ED 7510 'u.'
mov al,0xdf ; 0000A3EF B0DF '..'
out 0x60,al ; 0000A3F1 E660 '.`'
call xec2e_wait_8042_ready ; 0000A3F3 E83848 '.8H'
jnz xa3ff ; 0000A3F6 7507 'u.'
mov al,0xff ; 0000A3F8 B0FF '..'
out 0x64,al ; 0000A3FA E664 '.d'
call xec2e_wait_8042_ready ; 0000A3FC E82F48 './H'
xa3ff: ret ; 0000A3FF C3 '.'
mov ah,0x2 ; 0000A400 B402 '..'
in al,0x61 ; 0000A402 E461 '.a'
test al,0x40 ; 0000A404 A840 '.@'
jz xa41f ; 0000A406 7417 't.'
dec si ; 0000A408 4E 'N'
dec si ; 0000A409 4E 'N'
push ax ; 0000A40A 50 'P'
call xa544 ; 0000A40B E83601 '.6.'
jz xa412 ; 0000A40E 7402 't.'
mov ax,[si] ; 0000A410 8B04 '..'
xa412: mov [si],ax ; 0000A412 8904 '..'
pop ax ; 0000A414 58 'X'
or al,0x8 ; 0000A415 0C08 '..'
out 0x61,al ; 0000A417 E661 '.a'
and al,0xf7 ; 0000A419 24F7 '$.'
out 0x61,al ; 0000A41B E661 '.a'
mov ah,0x1 ; 0000A41D B401 '..'
xa41f: mov al,ah ; 0000A41F 8AC4 '..'
out 0x80,al ; 0000A421 E680 '..'
jmp short xa3b6 ; 0000A423 EB91 '..'
xa425: mov ax,es ; 0000A425 8CC0 '..'
shl ax,0x4 ; 0000A427 C1E004 '...'
add ax,si ; 0000A42A 03C6 '..'
ret ; 0000A42C C3 '.'
xa42d: push cx ; 0000A42D 51 'Q'
mov cx,es ; 0000A42E 8CC1 '..'
mov ax,si ; 0000A430 8BC6 '..'
shr ax,0x4 ; 0000A432 C1E804 '...'
add ax,cx ; 0000A435 03C1 '..'
shr ax,0xc ; 0000A437 C1E80C '...'
pop cx ; 0000A43A 59 'Y'
ret ; 0000A43B C3 '.'
xa43c: mov ax,0x40 ; 0000A43C B84000 '.@.'
mov ds,ax ; 0000A43F 8ED8 '..'
mov ss,[0x69] ; 0000A441 8E166900 '..i.'
mov sp,[0x67] ; 0000A445 8B266700 '.&g.'
;
; Disable A20
;
call xa478 ; 0000A449 E82C00 '.,.'
mov al,0x0 ; 0000A44C B000 '..'
out 0x70,al ; 0000A44E E670 '.p'
pop ds ; 0000A450 1F '.'
pop es ; 0000A451 07 '.'
popa ; 0000A452 61 'a'
xchg al,ah ; 0000A453 86C4 '..'
in al,0x80 ; 0000A455 E480 '..'
xchg al,ah ; 0000A457 86C4 '..'
push bp ; 0000A459 55 'U'
mov bp,sp ; 0000A45A 8BEC '..'
or ah,ah ; 0000A45C 0AE4 0x0A,'.'
jnz xa46c ; 0000A45E 750C 'u.'
and word [bp+0x6],0xfffe ; 0000A460 816606FEFF '.f...'
or word [bp+0x6],0x40 ; 0000A465 814E064000 '.N.@.'
jmp short xa476 ; 0000A46A EB0A '.',0x0A
xa46c: and word [bp+0x6],0xffbf ; 0000A46C 816606BFFF '.f...'
or word [bp+0x6],0x1 ; 0000A471 814E060100 '.N...'
xa476: pop bp ; 0000A476 5D ']'
iret ; 0000A477 CF '.'
;
; Disable A20
;
xa478: call xec2e_wait_8042_ready ; 0000A478 E8B347 '..G'
jnz xa498 ; 0000A47B 751B 'u.'
mov al,CMD8042_WRITE_OUTPORT; 0000A47D B0D1 '..'
out 0x64,al ; 0000A47F E664 '.d'
call xec2e_wait_8042_ready ; 0000A481 E8AA47 '..G'
jnz xa498 ; 0000A484 7512 'u.'
mov al,0xdd ; 0000A486 B0DD '..'
out 0x60,al ; 0000A488 E660 '.`'
call xec2e_wait_8042_ready ; 0000A48A E8A147 '..G'
jnz xa498 ; 0000A48D 7509 'u.'
mov al,0xff ; 0000A48F B0FF '..'
out 0x64,al ; 0000A491 E664 '.d'
call xec2e_wait_8042_ready ; 0000A493 E89847 '..G'
jz xa49c ; 0000A496 7404 't.'
xa498: mov al,0x3 ; 0000A498 B003 '..'
out 0x80,al ; 0000A49A E680 '..'
xa49c: ret ; 0000A49C C3 '.'
pop di ; 0000A49D 5F '_'
pop di ; 0000A49E 5F '_'
mov al,0x31 ; 0000A49F B031 '.1'
call xb544 ; 0000A4A1 E8A010 '...'
mov ah,al ; 0000A4A4 8AE0 '..'
mov al,0x30 ; 0000A4A6 B030 '.0'
call xb544 ; 0000A4A8 E89910 '...'
iret ; 0000A4AB CF '.'
sti ; 0000A4AC FB '.'
pop di ; 0000A4AD 5F '_'
pop di ; 0000A4AE 5F '_'
call xa3e0 ; 0000A4AF E82EFF '...'
jz xa4ba ; 0000A4B2 7406 't.'
mov ah,0xff ; 0000A4B4 B4FF '..'
stc ; 0000A4B6 F9 '.'
retf 0x2 ; 0000A4B7 CA0200 '...'
xa4ba: sti ; 0000A4BA FB '.'
push bx ; 0000A4BB 53 'S'
lea bx,[si+0x38] ; 0000A4BC 8D5C38 '.\8'
mov word [es:bx],0xffff ; 0000A4BF 26C707FFFF '&....'
mov ax,cs ; 0000A4C4 8CC8 '..'
shl ax,0x4 ; 0000A4C6 C1E004 '...'
mov [es:bx+0x2],ax ; 0000A4C9 26894702 '&.G.'
mov ax,cs ; 0000A4CD 8CC8 '..'
shr ax,0xc ; 0000A4CF C1E80C '...'
mov [es:bx+0x4],al ; 0000A4D2 26884704 '&.G.'
mov byte [es:bx+0x5],0x9a ; 0000A4D6 26C647059A '&.G..'
pop bx ; 0000A4DB 5B '['
cli ; 0000A4DC FA '.'
mov al,0x11 ; 0000A4DD B011 '..'
out 0x20,al ; 0000A4DF E620 '. '
mov al,bh ; 0000A4E1 8AC7 '..'
out 0x21,al ; 0000A4E3 E621 '.!'
mov al,0x4 ; 0000A4E5 B004 '..'
out 0x21,al ; 0000A4E7 E621 '.!'
mov al,0x1 ; 0000A4E9 B001 '..'
out 0x21,al ; 0000A4EB E621 '.!'
mov al,0xff ; 0000A4ED B0FF '..'
out 0x21,al ; 0000A4EF E621 '.!'
mov al,0x11 ; 0000A4F1 B011 '..'
out 0xa0,al ; 0000A4F3 E6A0 '..'
mov al,bl ; 0000A4F5 8AC3 '..'
out 0xa1,al ; 0000A4F7 E6A1 '..'
mov al,0x2 ; 0000A4F9 B002 '..'
out 0xa1,al ; 0000A4FB E6A1 '..'
mov al,0x1 ; 0000A4FD B001 '..'
out 0xa1,al ; 0000A4FF E6A1 '..'
mov al,0xff ; 0000A501 B0FF '..'
out 0xa1,al ; 0000A503 E6A1 '..'
lea bx,[si+0x8] ; 0000A505 8D5C08 '.\.'
lgdt [es:bx] ; 0000A508 260F0117 '&...'
lea bx,[si+0x10] ; 0000A50C 8D5C10 '.\.'
lidt [es:bx] ; 0000A50F 260F011F '&...'
push bp ; 0000A513 55 'U'
mov bp,sp ; 0000A514 8BEC '..'
mov word [bp+0x4],0x30 ; 0000A516 C746043000 '.F.0.'
pop bp ; 0000A51B 5D ']'
smsw ax ; 0000A51C 0F01E0 '...'
or ax,0x1 ; 0000A51F 0D0100 0x0D,'..'
lmsw ax ; 0000A522 0F01F0 '...'
jmp far [cs:0xa14d] ; 0000A525 2EFF2E4DA1 '...M.'
xor ax,ax ; 0000A52A 33C0 '3.'
lldt ax ; 0000A52C 0F00D0 '...'
mov ax,0x28 ; 0000A52F B82800 '.(.'
mov ss,ax ; 0000A532 8ED0 '..'
mov ax,0x18 ; 0000A534 B81800 '...'
mov ds,ax ; 0000A537 8ED8 '..'
mov ax,0x20 ; 0000A539 B82000 '. .'
mov es,ax ; 0000A53C 8EC0 '..'
xor ah,ah ; 0000A53E 32E4 '2.'
clc ; 0000A540 F8 '.'
retf 0x2 ; 0000A541 CA0200 '...'
xa544: push bx ; 0000A544 53 'S'
push ds ; 0000A545 1E '.'
push es ; 0000A546 06 '.'
mov ax,0x8 ; 0000A547 B80800 '...'
mov ds,ax ; 0000A54A 8ED8 '..'
mov bx,0x10 ; 0000A54C BB1000 '...'
cmp byte [bx+0x6],0x80 ; 0000A54F 807F0680 '....'
jnz xa584 ; 0000A553 752F 'u/'
cmp byte [bx+0x4],0xc0 ; 0000A555 807F04C0 '....'
jnz xa584 ; 0000A559 7529 'u)'
cmp word [bx+0x2],byte +0x0 ; 0000A55B 837F0200 '....'
jnz xa584 ; 0000A55F 7523 'u#'
mov bx,0x20 ; 0000A561 BB2000 '. .'
mov byte [bx+0x5],0x92 ; 0000A564 C6470592 '.G..'
mov ax,0x20 ; 0000A568 B82000 '. .'
mov es,ax ; 0000A56B 8EC0 '..'
mov bx,bim_table_offset ; 0000A56D BBE0FF '...'
mov bx,[es:bx] ; 0000A570 268B1F '&..'
test word [es:bx],0xf00 ; 0000A573 26F707000F '&....'
jnz xa57f ; 0000A578 7505 'u.'
mov ax,0xff ; 0000A57A B8FF00 '...'
jmp short xa582 ; 0000A57D EB03 '..'
xa57f: mov ax,0xfc ; 0000A57F B8FC00 '...'
xa582: xor bx,bx ; 0000A582 33DB '3.'
xa584: pop es ; 0000A584 07 '.'
pop ds ; 0000A585 1F '.'
pop bx ; 0000A586 5B '['
ret ; 0000A587 C3 '.'
mov ax,cs ; 0000A588 8CC8 '..'
mov es,ax ; 0000A58A 8EC0 '..'
mov bx,0xe6f5 ; 0000A58C BBF5E6 '...'
xor ax,ax ; 0000A58F 33C0 '3.'
ret ; 0000A591 C3 '.'
add [si+0x20],ah ; 0000A592 00A42000 '.. .'
add [bp+0x0],al ; 0000A596 00860000 '....'
add [si+0x20],ah ; 0000A59A 00A42000 '.. .'
add [bp+0x0],al ; 0000A59E 00860000 '....'
add [si+0x20],ah ; 0000A5A2 00A42000 '.. .'
add [bp+0x0],al ; 0000A5A6 00860000 '....'
add [si+0x20],ah ; 0000A5AA 00A42000 '.. .'
add [bp+0x0],al ; 0000A5AE 00860000 '....'
add [si+0x20],ah ; 0000A5B2 00A42000 '.. .'
add [bp+0x0],al ; 0000A5B6 00860000 '....'
add [si+0x20],ah ; 0000A5BA 00A42000 '.. .'
add [bp+0x0],al ; 0000A5BE 00860000 '....'
add [si+0x20],ah ; 0000A5C2 00A42000 '.. .'
add [bp+0x0],al ; 0000A5C6 00860000 '....'
add [si+0x20],ah ; 0000A5CA 00A42000 '.. .'
add [bp+0x0],al ; 0000A5CE 00860000 '....'
add [si+0x20],ah ; 0000A5D2 00A42000 '.. .'
add [bp+0x0],al ; 0000A5D6 00860000 '....'
add [si+0x20],ah ; 0000A5DA 00A42000 '.. .'
add [bp+0x0],al ; 0000A5DE 00860000 '....'
add [si+0x20],ah ; 0000A5E2 00A42000 '.. .'
add [bp+0x0],al ; 0000A5E6 00860000 '....'
add [si+0x20],ah ; 0000A5EA 00A42000 '.. .'
add [bp+0x0],al ; 0000A5EE 00860000 '....'
add [si+0x20],ah ; 0000A5F2 00A42000 '.. .'
add [bp+0x0],al ; 0000A5F6 00860000 '....'
add [si+0x20],ah ; 0000A5FA 00A42000 '.. .'
add [bp+0x0],al ; 0000A5FE 00860000 '....'
add [si+0x20],ah ; 0000A602 00A42000 '.. .'
add [bp+0x0],al ; 0000A606 00860000 '....'
add [si+0x20],ah ; 0000A60A 00A42000 '.. .'
add [bp+0x0],al ; 0000A60E 00860000 '....'
add [si+0x20],ah ; 0000A612 00A42000 '.. .'
add [bp+0x0],al ; 0000A616 00860000 '....'
add [si+0x20],ah ; 0000A61A 00A42000 '.. .'
add [bp+0x0],al ; 0000A61E 00860000 '....'
add [si+0x20],ah ; 0000A622 00A42000 '.. .'
add [bp+0x0],al ; 0000A626 00860000 '....'
add [si+0x20],ah ; 0000A62A 00A42000 '.. .'
add [bp+0x0],al ; 0000A62E 00860000 '....'
add [si+0x20],ah ; 0000A632 00A42000 '.. .'
add [bp+0x0],al ; 0000A636 00860000 '....'
add [si+0x20],ah ; 0000A63A 00A42000 '.. .'
add [bp+0x0],al ; 0000A63E 00860000 '....'
add [si+0x20],ah ; 0000A642 00A42000 '.. .'
add [bp+0x0],al ; 0000A646 00860000 '....'
add [si+0x20],ah ; 0000A64A 00A42000 '.. .'
add [bp+0x0],al ; 0000A64E 00860000 '....'
add [si+0x20],ah ; 0000A652 00A42000 '.. .'
add [bp+0x0],al ; 0000A656 00860000 '....'
add [si+0x20],ah ; 0000A65A 00A42000 '.. .'
add [bp+0x0],al ; 0000A65E 00860000 '....'
add [si+0x20],ah ; 0000A662 00A42000 '.. .'
add [bp+0x0],al ; 0000A666 00860000 '....'
add [si+0x20],ah ; 0000A66A 00A42000 '.. .'
add [bp+0x0],al ; 0000A66E 00860000 '....'
add [si+0x20],ah ; 0000A672 00A42000 '.. .'
add [bp+0x0],al ; 0000A676 00860000 '....'
add [si+0x20],ah ; 0000A67A 00A42000 '.. .'
add [bp+0x0],al ; 0000A67E 00860000 '....'
add [si+0x20],ah ; 0000A682 00A42000 '.. .'
add [bp+0x0],al ; 0000A686 00860000 '....'
add [si+0x20],ah ; 0000A68A 00A42000 '.. .'
add [bp+0x0],al ; 0000A68E 00860000 '....'
push ax ; 0000A692 50 'P'
mov ax,[0x10] ; 0000A693 A11000 '...'
and ax,0x30 ; 0000A696 253000 '%0.'
cmp al,0x30 ; 0000A699 3C30 '<0'
pop ax ; 0000A69B 58 'X'
jz xa6b5 ; 0000A69C 7417 't.'
cmp al,0x7 ; 0000A69E 3C07 '<.'
jc xa6b7 ; 0000A6A0 7215 'r.'
mov bx,[0x10] ; 0000A6A2 8B1E1000 '....'
and bl,0x30 ; 0000A6A6 80E330 '..0'
shr bl,0x4 ; 0000A6A9 C0EB04 '...'
xor bh,bh ; 0000A6AC 32FF '2.'
mov al,[cs:bx+0xa842] ; 0000A6AE 2E8A8742A8 '...B.'
jmp short xa6b7 ; 0000A6B3 EB02 '..'
xa6b5: mov al,0x7 ; 0000A6B5 B007 '..'
xa6b7: mov [0x49],al ; 0000A6B7 A24900 '.I.'
mov al,[0x49] ; 0000A6BA A04900 '.I.'
mov bx,0xb000 ; 0000A6BD BB00B0 '...'
mov dx,0x3b4 ; 0000A6C0 BAB403 '...'
cmp al,0x7 ; 0000A6C3 3C07 '<.'
jz xa6cd ; 0000A6C5 7406 't.'
mov bx,0xb800 ; 0000A6C7 BB00B8 '...'
mov dx,0x3d4 ; 0000A6CA BAD403 '...'
xa6cd: mov es,bx ; 0000A6CD 8EC3 '..'
mov [0x63],dx ; 0000A6CF 89166300 '..c.'
cbw ; 0000A6D3 98 '.'
xchg ax,bx ; 0000A6D4 93 '.'
mov al,0x1 ; 0000A6D5 B001 '..'
add dx,byte +0x4 ; 0000A6D7 83C204 '...'
out dx,al ; 0000A6DA EE '.'
sub dx,byte +0x4 ; 0000A6DB 83EA04 '...'
xor ax,ax ; 0000A6DE 33C0 '3.'
mov [0x4e],ax ; 0000A6E0 A34E00 '.N.'
mov [0x62],al ; 0000A6E3 A26200 '.b.'
mov al,[cs:bx+0xa812] ; 0000A6E6 2E8A8712A8 '.....'
mov [0x4a],ax ; 0000A6EB A34A00 '.J.'
shl bx,1 ; 0000A6EE D1E3 '..'
mov ax,[cs:bx+0xa81a] ; 0000A6F0 2E8B871AA8 '.....'
mov [0x4c],ax ; 0000A6F5 A34C00 '.L.'
shr bx,1 ; 0000A6F8 D1EB '..'
mov ah,[cs:bx+0xa82a] ; 0000A6FA 2E8AA72AA8 '...*.'
and ah,0x3f ; 0000A6FF 80E43F '..?'
mov al,[0x65] ; 0000A702 A06500 '.e.'
and al,0xc0 ; 0000A705 24C0 '$.'
or al,ah ; 0000A707 0AC4 0x0A,'.'
mov [0x65],al ; 0000A709 A26500 '.e.'
mov ah,[cs:bx+0xa832] ; 0000A70C 2E8AA732A8 '...2.'
mov [0x66],ah ; 0000A711 88266600 '.&f.'
mov cx,0x10 ; 0000A715 B91000 '...'
push es ; 0000A718 06 '.'
call xa795 ; 0000A719 E87900 '.y.'
mov ch,[es:si+0xa] ; 0000A71C 268A6C0A '&.l',0x0A
mov cl,[es:si+0xb] ; 0000A720 268A4C0B '&.L.'
mov al,[0x49] ; 0000A724 A04900 '.I.'
and al,0xfe ; 0000A727 24FE '$.'
cmp al,0x2 ; 0000A729 3C02 '<.'
jnz xa742 ; 0000A72B 7515 'u.'
cmp byte [es:si+0x9],0xd ; 0000A72D 26807C090D '&.|.',0x0D
jnz xa742 ; 0000A732 750E 'u.'
mov al,ch ; 0000A734 8AC5 '..'
call xa780 ; 0000A736 E84700 '.G.'
mov ch,al ; 0000A739 8AE8 '..'
mov al,cl ; 0000A73B 8AC1 '..'
call xa780 ; 0000A73D E84000 '.@.'
mov cl,al ; 0000A740 8AC8 '..'
xa742: pop es ; 0000A742 07 '.'
mov [0x60],cx ; 0000A743 890E6000 '..`.'
mov al,[0x49] ; 0000A747 A04900 '.I.'
cmp al,0x7 ; 0000A74A 3C07 '<.'
jz xa755 ; 0000A74C 7407
cmp al,0x4 ; 0000A74E 3C04 '<.'
mov ax,0x0 ; 0000A750 B80000 '...'
jnc xa758 ; 0000A753 7303 's.'
xa755: mov ax,0x720 ; 0000A755 B82007 '. .'
xa758: xor di,di ; 0000A758 33FF '3.'
mov cx,0x2000 ; 0000A75A B90020 '.. '
rep stosw ; 0000A75D F3AB '..'
push ds ; 0000A75F 1E '.'
pop es ; 0000A760 07 '.'
mov di,0x50 ; 0000A761 BF5000 '.P.'
xor ax,ax ; 0000A764 33C0 '3.'
mov cx,0x8 ; 0000A766 B90800 '...'
rep stosw ; 0000A769 F3AB '..'
test byte [0x87],0x10 ; 0000A76B F606870010 '.....'
jz xa778 ; 0000A770 7406 't.'
mov bx,0x1f4 ; 0000A772 BBF401 '...'
call xc638 ; 0000A775 E8C01E '...'
xa778: mov al,[0x65] ; 0000A778 A06500 '.e.'
add dx,byte +0x4 ; 0000A77B 83C204 '...'
out dx,al ; 0000A77E EE '.'
ret ; 0000A77F C3 '.'
xa780: push cx ; 0000A780 51 'Q'
and ax,0x1f ; 0000A781 251F00 '%..'
mov cl,0x3 ; 0000A784 B103 '..'
shl al,cl ; 0000A786 D2E0 '..'
mov cl,0xe ; 0000A788 B10E '..'
div cl ; 0000A78A F6F1 '..'
cmp ah,0x7 ; 0000A78C 80FC07 '...'
jc xa793 ; 0000A78F 7202 'r.'
inc al ; 0000A791 FEC0 '..'
xa793: pop cx ; 0000A793 59 'Y'
ret ; 0000A794 C3 '.'
xa795: xor bh,bh ; 0000A795 32FF '2.'
mov bl,[0x49] ; 0000A797 8A1E4900 '..I.'
push ds ; 0000A79B 1E '.'
xor si,si ; 0000A79C 33F6 '3.'
mov ds,si ; 0000A79E 8EDE '..'
lds si,[0x74] ; 0000A7A0 C5367400 '.6t.'
mov bl,[cs:bx+0xa83a] ; 0000A7A4 2E8A9F3AA8 '...:.'
add si,bx ; 0000A7A9 03F3 '..'
push si ; 0000A7AB 56 'V'
mov bp,0xa7b2 ; 0000A7AC BDB2A7 '...'
jmp x9bdd ; 0000A7AF E92BF4
sti ; 0000A7B2 FB '.'
pop si ; 0000A7B3 5E '^'
mov ax,ds ; 0000A7B4 8CD8 '..'
mov es,ax ; 0000A7B6 8EC0 '..'
pop ds ; 0000A7B8 1F '.'
ret ; 0000A7B9 C3 '.'
and al,0x7 ; 0000A7BA 2407 '$.'
mov [0x62],al ; 0000A7BC A26200 '.b.'
cbw ; 0000A7BF 98 '.'
push ax ; 0000A7C0 50 'P'
push dx ; 0000A7C1 52 'R'
mul word [0x4c] ; 0000A7C2 F7264C00 '.&L.'
mov [0x4e],ax ; 0000A7C6 A34E00 '.N.'
pop dx ; 0000A7C9 5A 'Z'
xchg ax,cx ; 0000A7CA 91 '.'
shr cx,1 ; 0000A7CB D1E9 '..'
mov ah,0xc ; 0000A7CD B40C '..'
call xacf9 ; 0000A7CF E82705 '.',0x27,'.'
pop si ; 0000A7D2 5E '^'
shl si,1 ; 0000A7D3 D1E6 '..'
mov cx,[si+0x50] ; 0000A7D5 8B8C5000 '..P.'
jmp xace4 ; 0000A7D9 E90805 '...'
mov al,[0x66] ; 0000A7DC A06600 '.f.'
or bh,bh ; 0000A7DF 0AFF 0x0A,'.'
jnz xa7ec ; 0000A7E1 7509 'u.'
and bl,0x1f ; 0000A7E3 80E31F '...'
and al,0xe0 ; 0000A7E6 24E0 '$.'
or al,bl ; 0000A7E8 0AC3 0x0A,'.'
jmp short xa7f7 ; 0000A7EA EB0B '..'
xa7ec: mov cl,0x5 ; 0000A7EC B105 '..'
shl bl,cl ; 0000A7EE D2E3 '..'
and bl,0x20 ; 0000A7F0 80E320 '.. '
and al,0xdf ; 0000A7F3 24DF '$.'
or al,bl ; 0000A7F5 0AC3 0x0A,'.'
xa7f7: mov [0x66],al ; 0000A7F7 A26600 '.f.'
add dx,byte +0x5 ; 0000A7FA 83C205 '...'
out dx,al ; 0000A7FD EE '.'
ret ; 0000A7FE C3 '.'
mov al,[0x49] ; 0000A7FF A04900 '.I.'
mov [bp+0x0],al ; 0000A802 884600 '.F.'
mov al,[0x4a] ; 0000A805 A04A00 '.J.'
mov [bp+0x1],al ; 0000A808 884601 '.F.'
mov al,[0x62] ; 0000A80B A06200 '.b.'
mov [bp+0x7],al ; 0000A80E 884607 '.F.'
ret ; 0000A811 C3 '.'
db '((PP((PP'
add [bx+si],cl ; 0000A81A 0008 '..'
add [bx+si],cl ; 0000A81C 0008 '..'
add [bx+si],dl ; 0000A81E 0010 '..'
add [bx+si],dl ; 0000A820 0010 '..'
add [bx+si+0x0],al ; 0000A822 004000 '.@.'
inc ax ; 0000A825 40 '@'
add [bx+si+0x0],al ; 0000A826 004000 '.@.'
inc ax ; 0000A829 40 '@'
sub al,0x28 ; 0000A82A 2C28 ',('
sub ax,0x2a29 ; 0000A82C 2D292A '-)*'
cs push ds ; 0000A82F 2E1E '..'
db ')000000?'
xor [bx+si],al ; 0000A839 3000 '0.'
add [bx+si],dl ; 0000A83B 0010 '..'
adc [bx+si],ah ; 0000A83D 1020 '. '
and [bx+si],ah ; 0000A83F 2020 ' '
xor [bp+di],al ; 0000A841 3003 '0.'
add [bp+di],ax ; 0000A843 0103 '..'
pop es ; 0000A845 07 '.'
rcr byte [bp+di],1 ; 0000A846 D01B '..'
rcr byte [bp+di],1 ; 0000A848 D01B '..'
ret ; 0000A84A C3 '.'
db 0xE2,0xD0
sbb dx,ax ; 0000A84D 1BD0 '..'
sbb dx,[si-0x1] ; 0000A84F 1B54FF '.T.'
mov al,[0xd095] ; 0000A852 A095D0 '...'
sbb sp,[di+0x87fe] ; 0000A855 1BA5FE87 '....'
jmp xc42c ; 0000A859 E9D01B '...'
rcr byte [bp+di],1 ; 0000A85C D01B '..'
rcr byte [bp+di],1 ; 0000A85E D01B '..'
mov [0x5789],ax ; 0000A860 A38957 '..W'
out dx,ax ; 0000A863 EF '.'
rcr byte [bp+di],1 ; 0000A864 D01B '..'
gs lock dec bp ; 0000A866 65F04D 'e.M'
clc ; 0000A869 F8 '.'
inc cx ; 0000A86A 41 'A'
clc ; 0000A86B F8 '.'
pop cx ; 0000A86C 59 'Y'
in al,dx ; 0000A86D EC '.'
cmp di,sp ; 0000A86E 39E7 '9.'
pop cx ; 0000A870 59 'Y'
clc ; 0000A871 F8 '.'
cs call 0x9848 ; 0000A872 2EE8D2EF '....'
shl bh,0xf2 ; 0000A876 C0E7F2 '...'
out 0x6e,al ; 0000A879 E66E '.n'
db 0xFE ; 0000A87B FE '.'
push bx ; 0000A87C 53 'S'
call near [bp+di-0x1] ; 0000A87D FF53FF '.S.'
movsb ; 0000A880 A4 '.'
db 0xF0 ; 0000A881 F0 '.'
db 0xC7 ; 0000A882 C7 '.'
out dx,ax ; 0000A883 EF '.'
add [bx+si],al ; 0000A884 0000 '..'
xchg ax,di ; 0000A886 97 '.'
dec dx ; 0000A887 4A 'J'
pop ds ; 0000A888 1F '.'
sbb al,0xd0 ; 0000A889 1CD0 '..'
sbb dx,ax ; 0000A88B 1BD0 '..'
sbb dx,ax ; 0000A88D 1BD0 '..'
sbb bp,[bx+si] ; 0000A88F 1B28 '.('
sbb al,0xd0 ; 0000A891 1CD0 '..'
sbb dx,ax ; 0000A893 1BD0 '..'
sbb dx,ax ; 0000A895 1BD0 '..'
sbb di,ax ; 0000A897 1BF8 '..'
add di,ax ; 0000A899 03F8 '..'
add bh,[si+0x7803] ; 0000A89B 02BC0378 '...x'
add di,[bx+si+0x2] ; 0000A89F 037802 '.x.'
adc al,0x14 ; 0000A8A2 1414 '..'
adc al,0x14 ; 0000A8A4 1414 '..'
add [bx+di],ax ; 0000A8A6 0101 '..'
add [bx+di],ax ; 0000A8A8 0101 '..'
push ds ; 0000A8AA 1E '.'
add [0xb000],bh ; 0000A8AB 003E00
xa8ae: mov al,0x30 ; 0000A8AE B030
out 0x84,al ; 0000A8B0 E684
mov ax,0x0040 ; 0000A8B2 B84000 '..@.'
mov es,ax ; 0000A8B5 8EC0 '..'
mov bx,[0x13] ; 0000A8B7 8B1E1300 '....'
pop dx ; 0000A8BB 5A 'Z'
xor bp,bp ; 0000A8BC 33ED '3.'
xor ax,ax ; 0000A8BE 33C0 '3.'
mov si,0x2000 ; 0000A8C0 BE0020 '.. '
xa8c3: xor di,di ; 0000A8C3 33FF '3.'
mov es,bp ; 0000A8C5 8EC5 '..'
mov cx,0x8000 ; 0000A8C7 B90080 '...'
rep stosw ; 0000A8CA F3AB '..'
add bp,0x1000 ; 0000A8CC 81C50010 '....'
cmp bp,si ; 0000A8D0 3BEE ';.'
jc xa8c3 ; 0000A8D2 72EF 'r.'
push dx ; 0000A8D4 52 'R'
mov ax,0x40 ; 0000A8D5 B84000 '.@.'
mov es,ax ; 0000A8D8 8EC0 '..'
mov [0x13],bx ; 0000A8DA 891E1300 '....'
xor ax,ax ; 0000A8DE 33C0 '3.'
mov es,ax ; 0000A8E0 8EC0 '..'
mov di,0x80 ; 0000A8E2 BF8000 '...'
mov cx,0x50 ; 0000A8E5 B95000 '.P.'
mov ax,cs ; 0000A8E8 8CC8 '..'
xa8ea: mov si,0xa896 ; 0000A8EA BE96A8 '...'
cs movsw ; 0000A8ED 2EA5 '..'
stosw ; 0000A8EF AB '.'
loop xa8ea ; 0000A8F0 E2F8 '..'
xor ax,ax ; 0000A8F2 33C0 '3.'
mov es,ax ; 0000A8F4 8EC0 '..'
mov di,0x180 ; 0000A8F6 BF8001 '...'
mov cx,0x8 ; 0000A8F9 B90800 '...'
mov ax,0x0 ; 0000A8FC B80000 '...'
xa8ff: stosw ; 0000A8FF AB '.'
stosw ; 0000A900 AB '.'
loop xa8ff ; 0000A901 E2FC '..'
mov al,0x31 ; 0000A903 B031 '.1'
out 0x84,al ; 0000A905 E684 '..'
xor ax,ax ; 0000A907 33C0 '3.'
mov es,ax ; 0000A909 8EC0 '..'
mov si,0xa886 ; 0000A90B BE86A8 '...'
mov di,0x1c0 ; 0000A90E BFC001 '...'
mov cx,0x8 ; 0000A911 B90800 '...'
mov ax,cs ; 0000A914 8CC8 '..'
xa916: cs movsw ; 0000A916 2EA5 '..'
stosw ; 0000A918 AB '.'
loop xa916 ; 0000A919 E2FB '..'
mov al,0x32 ; 0000A91B B032 '.2'
out 0x84,al ; 0000A91D E684 '..'
mov si,0xa846 ; 0000A91F BE46A8 '.F.'
mov di,0x0 ; 0000A922 BF0000 '...'
mov cx,0x20 ; 0000A925 B92000 '. .'
mov ax,cs ; 0000A928 8CC8 '..'
xa92a: cs movsw ; 0000A92A 2EA5 '..'
stosw ; 0000A92C AB '.'
loop xa92a ; 0000A92D E2FB '..'
push di ; 0000A92F 57 'W'
mov di,0x7e ; 0000A930 BF7E00 '.~.'
xor ax,ax ; 0000A933 33C0 '3.'
mov [es:di],ax ; 0000A935 268905 '&..'
pop di ; 0000A938 5F '_'
mov al,0x33 ; 0000A939 B033 '.3'
out 0x84,al ; 0000A93B E684 '..'
mov ax,0x40 ; 0000A93D B84000 '.@.'
mov ds,ax ; 0000A940 8ED8 '..'
mov dx,0x1200 ; 0000A942 BA0012 '...'
in al,0x80 ; 0000A945 E480 '..'
cmp al,0x34 ; 0000A947 3C34 '<4'
jnz xa94d ; 0000A949 7502 'u.'
mov dl,al ; 0000A94B 8AD0 '..'
xa94d: mov [0x72],dx ; 0000A94D 89167200 '..r.'
mov al,0x34 ; 0000A951 B034 '.4'
out 0x84,al ; 0000A953 E684 '..'
mov ah,0x90 ; 0000A955 B490 '..'
mov cx,0x1e ; 0000A957 B91E00 '...'
xor bx,bx ; 0000A95A 33DB '3.'
xor dx,dx ; 0000A95C 33D2 '3.'
xa95e: mov al,ah ; 0000A95E 8AC4 '..'
call xb544 ; 0000A960 E8E10B '...'
mov dl,al ; 0000A963 8AD0 '..'
add bx,dx ; 0000A965 03DA '..'
inc ah ; 0000A967 FEC4 '..'
loop xa95e ; 0000A969 E2F3 '..'
mov al,0xaf ; 0000A96B B0AF '..'
call xb544 ; 0000A96D E8D40B '...'
mov dl,al ; 0000A970 8AD0 '..'
mov al,0xae ; 0000A972 B0AE '..'
call xb544 ; 0000A974 E8CD0B '...'
mov dh,al ; 0000A977 8AF0 '..'
cmp dx,bx ; 0000A979 3BD3 ';.'
jz xa98f ; 0000A97B 7412 't.'
mov al,0x8e ; 0000A97D B08E '..'
call xb544 ; 0000A97F E8C20B '...'
or al,0x40 ; 0000A982 0C40 '.@'
mov ah,al ; 0000A984 8AE0 '..'
mov al,0x8e ; 0000A986 B08E '..'
call xb549 ; 0000A988 E8BE0B '...'
mov al,0x35 ; 0000A98B B035 '.5'
out 0x84,al ; 0000A98D E684 '..'
xa98f: mov al,0x36 ; 0000A98F B036 '.6'
out 0x84,al ; 0000A991 E684 '..'
mov bx,0x0 ; 0000A993 BB0000 '...'
mov ax,ds ; 0000A996 8CD8 '..'
mov es,ax ; 0000A998 8EC0 '..'
mov al,0x38 ; 0000A99A B038 '.8'
out 0x84,al ; 0000A99C E684 '..'
mov si,0xa898 ; 0000A99E BE98A8 '...'
mov di,0x0 ; 0000A9A1 BF0000 '...'
mov cx,0x2 ; 0000A9A4 B90200 '...'
xa9a7: cs lodsw ; 0000A9A7 2EAD '..'
xchg ax,dx ; 0000A9A9 92 '.'
inc dx ; 0000A9AA 42 'B'
inc dx ; 0000A9AB 42 'B'
in al,dx ; 0000A9AC EC '.'
cmp al,0xff ; 0000A9AD 3CFF '<.'
jz xa9b8 ; 0000A9AF 7407 't.'
add bh,0x2 ; 0000A9B1 80C702 '...'
dec dx ; 0000A9B4 4A 'J'
dec dx ; 0000A9B5 4A 'J'
xchg ax,dx ; 0000A9B6 92 '.'
stosw ; 0000A9B7 AB '.'
xa9b8: loop xa9a7 ; 0000A9B8 E2ED '..'
mov al,0x39 ; 0000A9BA B039 '.9'
out 0x84,al ; 0000A9BC E684 '..'
mov si,0xa89c ; 0000A9BE BE9CA8 '...'
mov di,0x8 ; 0000A9C1 BF0800 '...'
mov cx,0x3 ; 0000A9C4 B90300 '...'
xa9c7: cs lodsw ; 0000A9C7 2EAD '..'
xchg ax,dx ; 0000A9C9 92 '.'
in al,dx ; 0000A9CA EC '.'
not al ; 0000A9CB F6D0 '..'
out dx,al ; 0000A9CD EE '.'
mov ah,al ; 0000A9CE 8AE0 '..'
in al,dx ; 0000A9D0 EC '.'
cmp al,ah ; 0000A9D1 3AC4 ':.'
jnz xa9da ; 0000A9D3 7505 'u.'
add bh,0x40 ; 0000A9D5 80C740 '..@'
xchg ax,dx ; 0000A9D8 92 '.'
stosw ; 0000A9D9 AB '.'
xa9da: loop xa9c7 ; 0000A9DA E2EB '..'
mov al,0x3a ; 0000A9DC B03A '.:'
out 0x84,al ; 0000A9DE E684 '..'
mov si,0xa8a2 ; 0000A9E0 BEA2A8 '...'
mov di,0x78 ; 0000A9E3 BF7800 '.x.'
mov cx,0x6 ; 0000A9E6 B90600 '...'
xa9e9: cs rep movsw ; 0000A9E9 F32EA5 '...'
test cx,cx ; 0000A9EC 85C9 '..'
jnz xa9e9 ; 0000A9EE 75F9 'u.'
mov ax,0x40 ; 0000A9F0 B84000 '.@.'
mov ds,ax ; 0000A9F3 8ED8 '..'
mov [0x10],bx ; 0000A9F5 891E1000 '....'
mov al,0x3b ; 0000A9F9 B03B '.;'
out 0x84,al ; 0000A9FB E684 '..'
call xc259 ; 0000A9FD E85918 '.Y.'
;
; Set bit 2 (reserved?) and bit 4 (memory size?) of ROM BIOS Video Mode Options byte @40:0087.
; It would appear that Compaq had a different conception of this byte; however, in the case of an
; adapter like the IBM VGA, it doesn't matter, since the IBM VGA ROM will rewrite this byte anyway.
;
or byte [0x87],0x14 ; 0000AA00 800E870014 '.....'
mov al,0x8e ; 0000AA05 B08E '..'
call xb544 ; 0000AA07 E83A0B '.:.'
test al,0x40 ; 0000AA0A A840 '.@'
jnz xaa1e ; 0000AA0C 7510 'u.'
mov al,0xad ; 0000AA0E B0AD '..'
call xb544 ; 0000AA10 E8310B '.1.'
test al,0x5 ; 0000AA13 A805 '..'
jz xaa1e ; 0000AA15 7407 't.'
and byte [0x87],0xfb ; 0000AA17 80268700FB '.&...'
jmp short xaa2f ; 0000AA1C EB11 '..'
xaa1e: mov bx,xba77 ; 0000AA1E BB77BA '.w.'
mov es,[cs:bx+0x6] ; 0000AA21 2E8E4706 '..G.'
call x9e1c ; 0000AA25 E8F4F3 '...'
jz xaa2f ; 0000AA28 7405 't.'
and byte [0x87],0xfb ; 0000AA2A 80268700FB '.&...'
xaa2f: mov byte [0x84],0x18 ; 0000AA2F C606840018 '.....'
mov al,0x94 ; 0000AA34 B094 '..'
call xb544 ; 0000AA36 E80B0B '...'
and al,0x30 ; 0000AA39 2430 '$0'
mov ah,al ; 0000AA3B 8AE0 '..'
push ax ; 0000AA3D 50 'P'
push ds ; 0000AA3E 1E '.'
mov al,0x52 ; 0000AA3F B052 '.R'
out 0x84,al ; 0000AA41 E684 '..'
call x9a83 ; 0000AA43 E83DF0 '.=.'
pop ds ; 0000AA46 1F '.'
pop ax ; 0000AA47 58 'X'
jz xaa59 ; 0000AA48 740F 't.'
cmp ah,0x0 ; 0000AA4A 80FC00 '...'
jz xaa52 ; 0000AA4D 7403 't.'
call xab87 ; 0000AA4F E83501 '.5.'
xaa52: mov al,0x53 ; 0000AA52 B053 '.S'
out 0x84,al ; 0000AA54 E684 '..'
call x9a97 ; 0000AA56 E83EF0 '.>.'
xaa59: ret ; 0000AA59 C3 '.'
xaa5a: mov ax,0x40 ; 0000AA5A B84000 '.@.'
mov ds,ax ; 0000AA5D 8ED8 '..'
call xd03e ; 0000AA5F E8DC25 '..%'
jc xaa6d ; 0000AA62 7209 'r.'
cmp al,0x5 ; 0000AA64 3C05 '<.'
jnz xaa6d ; 0000AA66 7505 'u.'
and byte [0x87],0xfb ; 0000AA68 80268700FB '.&...'
xaa6d: ret ; 0000AA6D C3 '.'
db 0xFF ; 0000AA6E FF '.'
db 0xFF ; 0000AA6F FF '.'
db 0xFF ; 0000AA70 FF '.'
jmp xae12 ; 0000AA71 E99E03
xaa74: mov al,0x50 ; 0000AA74 B050 '.P'
out 0x84,al ; 0000AA76 E684 '..'
mov ax,0x40 ; 0000AA78 B84000 '.@.'
mov ds,ax ; 0000AA7B 8ED8 '..'
mov al,0x51 ; 0000AA7D B051 '.Q'
out 0x84,al ; 0000AA7F E684 '..'
mov al,0x8e ; 0000AA81 B08E '..'
call xb544 ; 0000AA83 E8BE0A '..',0x0A
test al,0xc0 ; 0000AA86 A8C0 '..'
jz xaa8f ; 0000AA88 7405 't.'
mov ah,0xff ; 0000AA8A B4FF '..'
jmp short xaa98 ; 0000AA8C EB0A '.',0x0A
nop ; 0000AA8E 90 '.'
xaa8f: mov al,0x94 ; 0000AA8F B094 '..'
call xb544 ; 0000AA91 E8B00A '..',0x0A
and al,0x30 ; 0000AA94 2430 '$0'
mov ah,al ; 0000AA96 8AE0 '..'
xaa98: push ax ; 0000AA98 50 'P'
push ds ; 0000AA99 1E '.'
mov al,0x52 ; 0000AA9A B052 '.R'
out 0x84,al ; 0000AA9C E684 '..'
call x9a83 ; 0000AA9E E8E2EF '...'
pop ds ; 0000AAA1 1F '.'
pop ax ; 0000AAA2 58 'X'
jz xaab5 ; 0000AAA3 7410 't.'
ret ; 0000AAA5 C3 '.'
nop ; 0000AAA6 90 '.'
nop ; 0000AAA7 90 '.'
jz xaaad ; 0000AAA8 7403 't.'
call xab87 ; 0000AAAA E8DA00 '...'
xaaad: mov al,0x53 ; 0000AAAD B053 '.S'
out 0x84,al ; 0000AAAF E684 '..'
call x9a97 ; 0000AAB1 E8E3EF '...'
ret ; 0000AAB4 C3 '.'
xaab5: push ds ; 0000AAB5 1E '.'
push es ; 0000AAB6 06 '.'
push ax ; 0000AAB7 50 'P'
call x9e5a ; 0000AAB8 E89FF3 '...'
jz xaac9 ; 0000AABB 740C 't.'
xor ax,ax ; 0000AABD 33C0 '3.'
mov es,ax ; 0000AABF 8EC0 '..'
mov di,0x74 ; 0000AAC1 BF7400 '.t.'
mov word [es:di],0xf0e4 ; 0000AAC4 26C705E4F0 '&....'
xaac9: and byte [0x10],0xcf ; 0000AAC9 80261000CF '.&...'
or byte [0x10],0x30 ; 0000AACE 800E100030 '....0'
mov ah,0x0 ; 0000AAD3 B400 '..'
mov al,0x7 ; 0000AAD5 B007 '..'
int 0x10 ; 0000AAD7 CD10 '..'
and byte [0x10],0xcf ; 0000AAD9 80261000CF '.&...'
or byte [0x10],0x20 ; 0000AADE 800E100020 '.... '
mov ah,0x0 ; 0000AAE3 B400 '..'
mov al,0x3 ; 0000AAE5 B003 '..'
int 0x10 ; 0000AAE7 CD10 '..'
call xab96 ; 0000AAE9 E8AA00 '...'
pop ax ; 0000AAEC 58 'X'
pop es ; 0000AAED 07 '.'
pop ds ; 0000AAEE 1F '.'
mov al,0x54 ; 0000AAEF B054 '.T'
out 0x84,al ; 0000AAF1 E684 '..'
mov bp,0xaaf9 ; 0000AAF3 BDF9AA '...'
jmp xac31 ; 0000AAF6 E93801 '.8.'
and al,0x40 ; 0000AAF9 2440 '$@'
push ax ; 0000AAFB 50 'P'
call 0xab1f ; 0000AAFC E82000 '. .'
pop ax ; 0000AAFF 58 'X'
jnc xab1e ; 0000AB00 731C 's.'
not al ; 0000AB02 F6D0 '..'
and al,0x40 ; 0000AB04 2440 '$@'
push ax ; 0000AB06 50 'P'
mov al,0x55 ; 0000AB07 B055 '.U'
out 0x84,al ; 0000AB09 E684 '..'
pop ax ; 0000AB0B 58 'X'
call xab1f ; 0000AB0C E81000 '...'
jnc xab1e ; 0000AB0F 730D 's',0x0D
mov al,0x56 ; 0000AB11 B056 '.V'
out 0x84,al ; 0000AB13 E684 '..'
call xc7ab ; 0000AB15 E8931C
call xc791 ; 0000AB18 E8761C '.v.'
call xc791 ; 0000AB1B E8731C '.s.'
xab1e: ret ; 0000AB1E C3 '.'
xab1f: mov dx,xba77 ; 0000AB1F BA77BA '.w.'
mov bx,dx ; 0000AB22 8BDA '..'
add bx,byte +0xf ; 0000AB24 83C30F '...'
or al,al ; 0000AB27 0AC0 0x0A,'.'
jnz xab6b ; 0000AB29 7540 'u@'
xchg dx,bx ; 0000AB2B 87D3 '..'
mov al,0x1 ; 0000AB2D B001 '..'
mov ch,0x10 ; 0000AB2F B510 '..'
cmp ah,0x10 ; 0000AB31 80FC10 '...'
jz xab46 ; 0000AB34 7410 't.'
mov al,0x3 ; 0000AB36 B003 '..'
mov ch,0x20 ; 0000AB38 B520 '. '
cmp ah,0x20 ; 0000AB3A 80FC20 '.. '
jz xab46 ; 0000AB3D 7407 't.'
call xab87 ; 0000AB3F E84500 '.E.'
mov al,0x3 ; 0000AB42 B003 '..'
mov ch,0x20 ; 0000AB44 B520 '. '
xab46: and byte [0x10],0xcf ; 0000AB46 80261000CF '.&...'
or [0x10],ch ; 0000AB4B 082E1000 '....'
push ax ; 0000AB4F 50 'P'
push bx ; 0000AB50 53 'S'
mov es,[cs:bx+0x6] ; 0000AB51 2E8E4706 '..G.'
call x9e1c ; 0000AB55 E8C4F2 '...'
pop bx ; 0000AB58 5B '['
pop ax ; 0000AB59 58 'X'
jz xab5e ; 0000AB5A 7402 't.'
stc ; 0000AB5C F9 '.'
ret ; 0000AB5D C3 '.'
xab5e: push ax ; 0000AB5E 50 'P'
mov al,0x57 ; 0000AB5F B057 '.W'
out 0x84,al ; 0000AB61 E684 '..'
pop ax ; 0000AB63 58 'X'
mov ah,0x0 ; 0000AB64 B400 '..'
int 0x10 ; 0000AB66 CD10 '..'
xor ax,ax ; 0000AB68 33C0 '3.'
ret ; 0000AB6A C3 '.'
xab6b: push bx ; 0000AB6B 53 'S'
cmp ah,0x30 ; 0000AB6C 80FC30 '..0'
jz xab74 ; 0000AB6F 7403 't.'
call xab87 ; 0000AB71 E81300 '...'
xab74: or byte [0x10],0x30 ; 0000AB74 800E100030 '....0'
pop bx ; 0000AB79 5B '['
mov es,[cs:bx+0x6] ; 0000AB7A 2E8E4706 '..G.'
call x9e1c ; 0000AB7E E89BF2 '...'
mov al,0x7 ; 0000AB81 B007 '..'
jz xab5e ; 0000AB83 74D9 't.'
stc ; 0000AB85 F9 '.'
ret ; 0000AB86 C3 '.'
xab87: mov al,0x8e ; 0000AB87 B08E '..'
call xb544 ; 0000AB89 E8B809 '...'
or al,0x20 ; 0000AB8C 0C20 '. '
mov ah,al ; 0000AB8E 8AE0 '..'
mov al,0x8e ; 0000AB90 B08E '..'
call xb549 ; 0000AB92 E8B409 '...'
ret ; 0000AB95 C3 '.'
xab96: mov al,0x58 ; 0000AB96 B058 '.X'
out 0x84,al ; 0000AB98 E684 '..'
push cs ; 0000AB9A 0E '.'
pop ds ; 0000AB9B 1F '.'
mov bx,xba77 ; 0000AB9C BB77BA '.w.'
xab9f: mov al,0x59 ; 0000AB9F B059 '.Y'
out 0x84,al ; 0000ABA1 E684 '..'
mov es,[bx+0x6] ; 0000ABA3 8E4706 '.G.'
call x9e1c ; 0000ABA6 E873F2 '.s.'
jz xabae ; 0000ABA9 7403 't.'
jmp short xac1c ; 0000ABAB EB6F '.o'
nop ; 0000ABAD 90 '.'
xabae: mov al,0x5a ; 0000ABAE B05A '.Z'
out 0x84,al ; 0000ABB0 E684 '..'
mov al,0x1 ; 0000ABB2 B001 '..'
cmp word [bx],0x3b8 ; 0000ABB4 813FB803 '.?..'
jnz xabbc ; 0000ABB8 7502 'u.'
mov al,0x1 ; 0000ABBA B001 '..'
xabbc: mov dx,[bx] ; 0000ABBC 8B17 '..'
out dx,al ; 0000ABBE EE '.'
mov al,0x5b ; 0000ABBF B05B '.['
out 0x84,al ; 0000ABC1 E684 '..'
xor dx,dx ; 0000ABC3 33D2 '3.'
xabc5: xor di,di ; 0000ABC5 33FF '3.'
mov cx,[bx+0xd] ; 0000ABC7 8B4F0D '.O',0x0D
xabca: mov ax,di ; 0000ABCA 8BC7 '..'
xor al,ah ; 0000ABCC 32C4 '2.'
jpo xabd2 ; 0000ABCE 7B02 '{.'
inc al ; 0000ABD0 FEC0 '..'
xabd2: xor al,dl ; 0000ABD2 32C2 '2.'
stosb ; 0000ABD4 AA '.'
loop xabca ; 0000ABD5 E2F3 '..'
xor di,di ; 0000ABD7 33FF '3.'
mov cx,[bx+0xd] ; 0000ABD9 8B4F0D '.O',0x0D
xabdc: mov ax,di ; 0000ABDC 8BC7 '..'
xor al,ah ; 0000ABDE 32C4 '2.'
jpo xabe4 ; 0000ABE0 7B02 '{.'
inc al ; 0000ABE2 FEC0 '..'
xabe4: xor al,dl ; 0000ABE4 32C2 '2.'
scasb ; 0000ABE6 AE '.'
loope xabdc ; 0000ABE7 E1F3 '..'
jnz xabf0 ; 0000ABE9 7505 'u.'
xor dl,0xff ; 0000ABEB 80F2FF '...'
jnz xabc5 ; 0000ABEE 75D5 'u.'
xabf0: mov al,0x5c ; 0000ABF0 B05C '.\'
out 0x84,al ; 0000ABF2 E684 '..'
pushf ; 0000ABF4 9C '.'
mov bp,0xabfb ; 0000ABF5 BDFBAB '...'
jmp x9bfa ; 0000ABF8 E9FFEF
xor cx,cx ; 0000ABFB 33C9 '3.'
mov dl,[bx+0x2] ; 0000ABFD 8A5702 '.W.'
mov ah,0xe ; 0000AC00 B40E '..'
call xacf9 ; 0000AC02 E8F400 '...'
popf ; 0000AC05 9D '.'
jz xac1c ; 0000AC06 7414 't.'
mov al,0x5d ; 0000AC08 B05D '.]'
out 0x84,al ; 0000AC0A E684 '..'
push bx ; 0000AC0C 53 'S'
mov dx,[bx+0x8] ; 0000AC0D 8B5708 '.W.'
xor cx,cx ; 0000AC10 33C9 '3.'
mov cl,[bx+0xc] ; 0000AC12 8A4F0C '.O.'
mov bx,[bx+0xa] ; 0000AC15 8B5F0A '._',0x0A
call xc745 ; 0000AC18 E82A1B '.*.'
pop bx ; 0000AC1B 5B '['
xac1c: mov al,0x5e ; 0000AC1C B05E '.^'
out 0x84,al ; 0000AC1E E684 '..'
add bx,byte +0xf ; 0000AC20 83C30F '...'
cmp bx,0xba95 ; 0000AC23 81FB95BA '....'
jnc xac2c ; 0000AC27 7303 's.'
jmp xab9f ; 0000AC29 E973FF '.s.'
xac2c: mov al,0x5f ; 0000AC2C B05F '._'
out 0x84,al ; 0000AC2E E684 '..'
ret ; 0000AC30 C3 '.'
xac31: mov al,0xc0 ; 0000AC31 B0C0 '..'
out 0x64,al ; 0000AC33 E664 '.d'
mov cx,0xffff ; 0000AC35 B9FFFF '...'
xac38: in al,0x64 ; 0000AC38 E464 '.d'
test al,0x2 ; 0000AC3A A802 '..'
jz xac42 ; 0000AC3C 7404 't.'
loop xac38 ; 0000AC3E E2F8 '..'
jmp short xac4d ; 0000AC40 EB0B '..'
xac42: mov cx,0xffff ; 0000AC42 B9FFFF '...'
xac45: in al,0x64 ; 0000AC45 E464 '.d'
test al,0x1 ; 0000AC47 A801 '..'
jnz xac5b ; 0000AC49 7510 'u.'
loop xac45 ; 0000AC4B E2F8 '..'
xac4d: mov bx,0xb810 ; 0000AC4D BB10B8 '...'
mov cx,0x1d ; 0000AC50 B91D00 '...'
mov bp,0xac59 ; 0000AC53 BD59AC '.Y.'
jmp xc7f7 ; 0000AC56 E99E1B '...'
xac59: jmp short xac59 ; 0000AC59 Hang the machine
xac5b: in al,0x60 ; 0000AC5B E460 '.`'
jmp bp ; 0000AC5D FFE5 '..'
times 26 db 0xFF ; 0000AC5F - 0000AC78
jmp 0xf000:0x8e31 ; 0000AC79 EA318E00F0 '.1...'
mov [0x60],cx ; 0000AC7E 890E6000 '..`.'
mov al,[0x49] ; 0000AC82 A04900 '.I.'
and al,0xfe ; 0000AC85 24FE '$.'
cmp al,0x2 ; 0000AC87 3C02 '<.'
jnz xacb5 ; 0000AC89 752A 'u*'
xor bx,bx ; 0000AC8B 33DB '3.'
mov ds,bx ; 0000AC8D 8EDB '..'
lds si,[0x74] ; 0000AC8F C5367400 '.6t.'
cmp byte [si+0x19],0xd ; 0000AC93 807C190D '.|.',0x0D
jnz xacb5 ; 0000AC97 751C 'u.'
test cx,0x1818 ; 0000AC99 F7C11818 '....'
jnz xacb5 ; 0000AC9D 7516 'u.'
mov bx,cx ; 0000AC9F 8BD9 '..'
and bx,0x6060 ; 0000ACA1 81E36060 '..``'
mov al,ch ; 0000ACA5 8AC5 '..'
call xacbb ; 0000ACA7 E81100 '...'
mov ch,al ; 0000ACAA 8AE8 '..'
mov al,cl ; 0000ACAC 8AC1 '..'
call xacbb ; 0000ACAE E80A00 '.',0x0A,'.'
mov cl,al ; 0000ACB1 8AC8 '..'
or cx,bx ; 0000ACB3 0BCB '..'
xacb5: mov ah,0xa ; 0000ACB5 B40A '.',0x0A
call xacf9 ; 0000ACB7 E83F00 '.?.'
ret ; 0000ACBA C3 '.'
xacbb: and al,0xf ; 0000ACBB 240F '$.'
mov ah,0xe ; 0000ACBD B40E '..'
mul ah ; 0000ACBF F6E4 '..'
shr ax,1 ; 0000ACC1 D1E8 '..'
shr ax,1 ; 0000ACC3 D1E8 '..'
shr ax,1 ; 0000ACC5 D1E8 '..'
adc al,0x0 ; 0000ACC7 1400 '..'
ret ; 0000ACC9 C3 '.'
cmp bh,0x7 ; 0000ACCA 80FF07 '...'
ja xad17 ; 0000ACCD 7748 'wH'
xchg bh,bl ; 0000ACCF 86FB '..'
xor bh,bh ; 0000ACD1 32FF '2.'
shl bx,1 ; 0000ACD3 D1E3 '..'
mov cx,[bp+0x2] ; 0000ACD5 8B4E02 '.N.'
mov [bx+0x50],cx ; 0000ACD8 898F5000 '..P.'
mov al,[0x62] ; 0000ACDC A06200 '.b.'
cmp al,[bp+0x7] ; 0000ACDF 3A4607 ':F.'
jnz xad17 ; 0000ACE2 7533 'u3'
xace4: push dx ; 0000ACE4 52 'R'
xor ax,ax ; 0000ACE5 33C0 '3.'
xchg al,ch ; 0000ACE7 86C5 '..'
mul word [0x4a] ; 0000ACE9 F7264A00 '.&J.'
add cx,ax ; 0000ACED 03C8 '..'
mov ax,[0x4e] ; 0000ACEF A14E00 '.N.'
shr ax,1 ; 0000ACF2 D1E8 '..'
add cx,ax ; 0000ACF4 03C8 '..'
pop dx ; 0000ACF6 5A 'Z'
mov ah,0xe ; 0000ACF7 B40E '..'
xacf9: mov al,ah ; 0000ACF9 8AC4 '..'
out dx,al ; 0000ACFB EE '.'
inc dx ; 0000ACFC 42 'B'
mov al,ch ; 0000ACFD 8AC5 '..'
jmp short xad01 ; 0000ACFF EB00 '..'
xad01: jmp short xad03 ; 0000AD01 EB00 '..'
xad03: out dx,al ; 0000AD03 EE '.'
dec dx ; 0000AD04 4A 'J'
inc ah ; 0000AD05 FEC4 '..'
mov al,ah ; 0000AD07 8AC4 '..'
jmp short xad0b ; 0000AD09 EB00 '..'
xad0b: jmp short xad0d ; 0000AD0B EB00 '..'
xad0d: out dx,al ; 0000AD0D EE '.'
inc dx ; 0000AD0E 42 'B'
mov al,cl ; 0000AD0F 8AC1 '..'
jmp short xad13 ; 0000AD11 EB00 '..'
xad13: jmp short xad15 ; 0000AD13 EB00 '..'
xad15: out dx,al ; 0000AD15 EE '.'
dec dx ; 0000AD16 4A 'J'
xad17: ret ; 0000AD17 C3 '.'
xad18: mov al,ah ; 0000AD18 8AC4 '..'
out dx,al ; 0000AD1A EE '.'
inc dx ; 0000AD1B 42 'B'
mov al,ch ; 0000AD1C 8AC5 '..'
jmp short xad20 ; 0000AD1E EB00 '..'
xad20: jmp short xad22 ; 0000AD20 EB00 '..'
xad22: out dx,al ; 0000AD22 EE '.'
dec dx ; 0000AD23 4A 'J'
inc ah ; 0000AD24 FEC4 '..'
mov al,ah ; 0000AD26 8AC4 '..'
jmp short xad2a ; 0000AD28 EB00 '..'
xad2a: jmp short xad2c ; 0000AD2A EB00 '..'
xad2c: out dx,al ; 0000AD2C EE '.'
inc dx ; 0000AD2D 42 'B'
mov al,cl ; 0000AD2E 8AC1 '..'
jmp short xad32 ; 0000AD30 EB00 '..'
xad32: jmp short xad34 ; 0000AD32 EB00 '..'
xad34: out dx,al ; 0000AD34 EE '.'
dec dx ; 0000AD35 4A 'J'
jmp bp ; 0000AD36 FFE5 '..'
;
; This prepares a request to performed a copy of 0x21 DWORDs (0x84 bytes)
; from 0x58:x0F378 (DS:BX) to (ES:DI) for 0x1F0 (DX) times, followed by a
; final copy of 0x10 DWORDs (0x40 bytes). DI advances, BX does not.
;
; Note that 0x84 * 0x1F0 is 0xFFC0, and 0xFFC0 + 0x40 is 0x10000, or exactly
; 64Kb. Also, DS is pointing to %F0000 and ES is pointing to %FF0000 (the
; last 64Kb at the top of 16Mb).
;
; DS:SI is the hard-coded address of a set of hard-coded values at %FF378.
;
xad38: push ds ; 0000AD38 1E '.'
mov ax,0x58 ; 0000AD39 B85800 '.X.'
mov ds,ax ; 0000AD3C 8ED8 '..'
mov bx,0xf378 ; 0000AD3E BB78F3 '.x.'
xad41: mov dx,0x1f0 ; 0000AD41 BAF001 '...'
mov ax,0x10 ; 0000AD44 B81000 '...'
xor di,di ; 0000AD47 33FF '3.'
mov bp,0xad4f ; 0000AD49 BD4FAD '.O.'
jmp xf68d ; 0000AD4C E93E49 '.>I'
;
; Now that the 64Kb buffer at ES:0 has been prepared, call xe80b to verify the buffer contents.
;
in al,0x61 ; 0000AD4F E461 '.a'
or al,0xc ; 0000AD51 0C0C '..'
out 0x61,al ; 0000AD53 E661 '.a'
and al,0xf3 ; 0000AD55 24F3 '$.'
out 0x61,al ; 0000AD57 E661 '.a'
mov dx,0x1f0 ; 0000AD59 BAF001 '...'
mov ax,0x10 ; 0000AD5C B81000 '...'
xor di,di ; 0000AD5F 33FF '3.'
mov bp,0xad67 ; 0000AD61 BD67AD '.g.'
jmp xe80b ; 0000AD64 E9A43A '..:'
jnc xad74 ; 0000AD67 730B 's.'
push si ; 0000AD69 56 'V'
push di ; 0000AD6A 57 'W'
call xf6a1 ; 0000AD6B E83349 '.3I'
pop di ; 0000AD6E 5F '_'
pop si ; 0000AD6F 5E '^'
jc xad8d ; 0000AD70 721B 'r.'
jmp short xadbf ; 0000AD72 EB4B '.K'
xad74: in al,0x61 ; 0000AD74 E461 '.a'
test al,0x40 ; 0000AD76 A840 '.@'
mov eax,0x0 ; 0000AD78 66B800000000 'f.....'
jnz xad8f ; 0000AD7E 750F 'u.'
cmp bx,pattern2 ; 0000AD80 81FBFCF3 '....'
jz xad8b ; 0000AD84 7405 't.'
mov bx,pattern2 ; 0000AD86 BBFCF3 '...'
jmp short xad41 ; 0000AD89 EBB6 '..'
xad8b: xor ax,ax ; 0000AD8B 33C0 '3.'
xad8d: pop ds ; 0000AD8D 1F '.'
ret ; 0000AD8E C3 '.'
xad8f: push ax ; 0000AD8F 50 'P'
mov al,[es:di] ; 0000AD90 268A05 '&..'
mov [es:di],al ; 0000AD93 268805 '&..'
in al,0x61 ; 0000AD96 E461 '.a'
or al,0xc ; 0000AD98 0C0C '..'
out 0x61,al ; 0000AD9A E661 '.a'
and al,0xf3 ; 0000AD9C 24F3 '$.'
out 0x61,al ; 0000AD9E E661 '.a'
pop ax ; 0000ADA0 58 'X'
or eax,eax ; 0000ADA1 660BC0 'f..'
jnz xadbf ; 0000ADA4 7519 'u.'
call x86db ; 0000ADA6 E832D9 '.2.'
xchg ah,al ; 0000ADA9 86E0 '..'
and ah,0xf ; 0000ADAB 80E40F '...'
xor si,si ; 0000ADAE 33F6 '3.'
mov cl,0x4 ; 0000ADB0 B104 '..'
xadb2: rcr ah,1 ; 0000ADB2 D0DC '..'
jnc xadbb ; 0000ADB4 7305 's.'
inc si ; 0000ADB6 46 'F'
loop xadb2 ; 0000ADB7 E2F9 '..'
xor si,si ; 0000ADB9 33F6 '3.'
xadbb: xor al,al ; 0000ADBB 32C0 '2.'
jmp short xadd6 ; 0000ADBD EB17 '..'
xadbf: mov eax,[si] ; 0000ADBF 668B04 'f..'
xor eax,[es:di] ; 0000ADC2 66263305 'f&3.'
mov si,di ; 0000ADC6 8BF7 '..'
mov cx,0x4 ; 0000ADC8 B90400 '...'
xadcb: test al,0xff ; 0000ADCB A8FF '..'
jnz xadd6 ; 0000ADCD 7507 'u.'
shr eax,0x8 ; 0000ADCF 66C1E808 'f...'
inc si ; 0000ADD3 46 'F'
loop xadcb ; 0000ADD4 E2F5 '..'
xadd6: mov cl,al ; 0000ADD6 8AC8 '..'
mov dx,si ; 0000ADD8 8BD6 '..'
pop ds ; 0000ADDA 1F '.'
stc ; 0000ADDB F9 '.'
ret ; 0000ADDC C3 '.'
times 8 db 0xFF ; 0000ADDD - 0000ADE4
push word [bp+si-0x52] ; 0000ADE5 FF72AE '.r.'
cbw ; 0000ADE8 98 '.'
scasb ; 0000ADE9 AE '.'
cmpsb ; 0000ADEA A6 '.'
scasb ; 0000ADEB AE '.'
cmpsw ; 0000ADEC A7 '.'
scasw ; 0000ADED AF '.'
sub ax,0x5eb0 ; 0000ADEE 2DB05E '-.^'
mov al,0xa3 ; 0000ADF1 B0A3 '..'
mov dl,0xa3 ; 0000ADF3 B2A3 '..'
mov dl,0x9c ; 0000ADF5 B29C '..'
mov al,0xe2 ; 0000ADF7 B0E2 '..'
mov al,0xa6 ; 0000ADF9 B0A6 '..'
scasb ; 0000ADFB AE '.'
cmpsw ; 0000ADFC A7 '.'
scasw ; 0000ADFD AF '.'
dec cx ; 0000ADFE 49 'I'
mov cl,0x71 ; 0000ADFF B171 '.q'
mov cl,0xa3 ; 0000AE01 B1A3 '..'
mov dl,0xa3 ; 0000AE03 B2A3 '..'
mov dl,0x3b ; 0000AE05 B23B '.;'
mov cl,0x19 ; 0000AE07 B119 '..'
mov dl,0xa3 ; 0000AE09 B2A3 '..'
mov dl,0xa3 ; 0000AE0B B2A3 '..'
mov dl,0x44 ; 0000AE0D B244 '.D'
mov dl,0x70 ; 0000AE0F B270 '.p'
mov dl,0x80 ; 0000AE11 B2
xae12: cmp dl,0x80 ; 0000AE12 80FA80
jnc xae29 ; 0000AE15 7312
int 0x40 ; 0000AE17 CD40
push ax ; 0000AE19 50 'P'
pushf ; 0000AE1A 9C '.'
push bp ; 0000AE1B 55 'U'
mov bp,sp ; 0000AE1C 8BEC '..'
mov ax,[bp+0x2] ; 0000AE1E 8B4602 '.F.'
mov [bp+0xa],ax ; 0000AE21 89460A '.F',0x0A
pop bp ; 0000AE24 5D ']'
popf ; 0000AE25 9D '.'
pop ax ; 0000AE26 58 'X'
jmp short xae71 ; 0000AE27 EB48 '.H'
xae29: pusha ; 0000AE29 60 '`'
push ds ; 0000AE2A 1E '.'
push es ; 0000AE2B 06 '.'
push byte +0x0 ; 0000AE2C 6A00 'j.'
mov bp,sp ; 0000AE2E 8BEC '..'
cmp ah,0x15 ; 0000AE30 80FC15 '...'
jna xae3f ; 0000AE33 760A 'v',0x0A
mov ax,0x40 ; 0000AE35 B84000 '.@.'
mov ds,ax ; 0000AE38 8ED8 '..'
call xb2a3 ; 0000AE3A E86604 '.f.'
jmp short xae6d ; 0000AE3D EB2E '..'
xae3f: and word [bp+0x1a],0xfffe ; 0000AE3F 81661AFEFF '.f...'
or word [bp+0x1a],0x200 ; 0000AE44 814E1A0002 '.N...'
sti ; 0000AE49 FB '.'
cld ; 0000AE4A FC '.'
xor ax,ax ; 0000AE4B 33C0 '3.'
mov ds,ax ; 0000AE4D 8ED8 '..'
les si,[0x104] ; 0000AE4F C4360401 '.6..'
test dl,0x1 ; 0000AE53 F6C201 '...'
jz xae5c ; 0000AE56 7404 't.'
les si,[0x118] ; 0000AE58 C4361801 '.6..'
xae5c: mov bx,0x40 ; 0000AE5C BB4000 '.@.'
mov ds,bx ; 0000AE5F 8EDB '..'
mov bx,ax ; 0000AE61 8BD8 '..'
mov bl,[bp+0x15] ; 0000AE63 8A5E15 '.^.'
shl bx,1 ; 0000AE66 D1E3 '..'
call near [cs:bx+0xade6] ; 0000AE68 2EFF97E6AD '.....'
xae6d: pop es ; 0000AE6D 07 '.'
pop es ; 0000AE6E 07 '.'
pop ds ; 0000AE6F 1F '.'
popa ; 0000AE70 61 'a'
xae71: iret ; 0000AE71 CF '.'
mov [bp+0x15],ah ; 0000AE72 886615 '.f.'
mov [0x74],ah ; 0000AE75 88267400 '.&t.'
mov dl,0x0 ; 0000AE79 B200 '..'
int 0x40 ; 0000AE7B CD40 '.@'
mov al,[bp+0x10] ; 0000AE7D 8A4610 '.F.'
and al,0x9f ; 0000AE80 249F '$.'
cmp al,0x80 ; 0000AE82 3C80 '<.'
jc xae97 ; 0000AE84 7211 'r.'
cmp al,0x81 ; 0000AE86 3C81 '<.'
ja xae97 ; 0000AE88 770D 'w',0x0D
call xc5a2 ; 0000AE8A E81517 '...'
call xb17e ; 0000AE8D E8EE02 '...'
jnc xae97 ; 0000AE90 7305 's.'
mov ah,0x5 ; 0000AE92 B405 '..'
call xb471 ; 0000AE94 E8DA05 '...'
xae97: ret ; 0000AE97 C3 '.'
mov al,[0x74] ; 0000AE98 A07400 '.t.'
mov [bp+0x14],al ; 0000AE9B 884614 '.F.'
mov [0x74],ah ; 0000AE9E 88267400 '.&t.'
mov [bp+0x15],ah ; 0000AEA2 886615 '.f.'
ret ; 0000AEA5 C3 '.'
call xb483 ; 0000AEA6 E8DA05 '...'
jc xaefe ; 0000AEA9 7253 'rS'
call xb395 ; 0000AEAB E8E704 '...'
mov al,0x20 ; 0000AEAE B020 '. '
test byte [es:si+0x8],0xc0 ; 0000AEB0 26F64408C0 '&.D..'
jz xaeb9 ; 0000AEB5 7402 't.'
or al,0x1 ; 0000AEB7 0C01 '..'
xaeb9: cmp byte [bp+0x15],0xa ; 0000AEB9 807E150A '.~.',0x0A
jnz xaed0 ; 0000AEBD 7511 'u.'
or al,0x2 ; 0000AEBF 0C02 '..'
push ax ; 0000AEC1 50 'P'
mov al,[es:si+0x7] ; 0000AEC2 268A4407 '&.D.'
or al,al ; 0000AEC6 0AC0 0x0A,'.'
jnz xaecc ; 0000AEC8 7502 'u.'
mov al,0x4 ; 0000AECA B004 '..'
xaecc: mov [bp+0x0],al ; 0000AECC 884600 '.F.'
pop ax ; 0000AECF 58 'X'
xaed0: mov [0x48],al ; 0000AED0 A24800 '.H.'
call xb3e5 ; 0000AED3 E80F05 '...'
mov es,dx ; 0000AED6 8EC2 '..'
mov di,ax ; 0000AED8 8BF8 '..'
mov dh,0x7f ; 0000AEDA B67F '..'
cmp byte [bp+0x15],0xa ; 0000AEDC 807E150A '.~.',0x0A
jz xaee8 ; 0000AEE0 7406 't.'
or al,ah ; 0000AEE2 0AC4 0x0A,'.'
jnz xaee8 ; 0000AEE4 7502 'u.'
inc dh ; 0000AEE6 FEC6 '..'
xaee8: or ah,[bp+0x14] ; 0000AEE8 0A6614 0x0A,'f.'
mov [bp+0x1],ah ; 0000AEEB 886601 '.f.'
jz xaef4 ; 0000AEEE 7404 't.'
cmp ah,dh ; 0000AEF0 3AE6 ':.'
jna xaef8 ; 0000AEF2 7604 'v.'
xaef4: mov ah,0x9 ; 0000AEF4 B409 '..'
jmp short xaf42 ; 0000AEF6 EB4A '.J'
xaef8: call xb4bd ; 0000AEF8 E8C205 '...'
xaefb: call xb4d0 ; 0000AEFB E8D205 '...'
xaefe: jc xaf42 ; 0000AEFE 7242 'rB'
call xb2e0 ; 0000AF00 E8DD03 '...'
jc xaf42 ; 0000AF03 723D 'r='
mov bh,al ; 0000AF05 8AF8 '..'
call xb50e ; 0000AF07 E80406
jnc xaf1e ; 0000AF0A 7312 's.'
cmp ah,0x11 ; 0000AF0C 80FC11 '...'
jz xaf1b ; 0000AF0F 740A 't',0x0A
test bh,0x8 ; 0000AF11 F6C708 '...'
jz xaf42 ; 0000AF14 742C 't,'
call xb42a ; 0000AF16 E81105 '...'
jmp short xaf42 ; 0000AF19 EB27 '.',0x27
xaf1b: call xb471 ; 0000AF1B E85305 '.S.'
xaf1e: call xb44d ; 0000AF1E E82C05 '.,.'
jc xaf42 ; 0000AF21 721F 'r.'
call xb42a ; 0000AF23 E80405 '...'
cmp byte [bp+0x15],0xa ; 0000AF26 807E150A '.~.',0x0A
jnz xaf31 ; 0000AF2A 7505 'u.'
call xb433 ; 0000AF2C E80405 '...'
jc xaf42 ; 0000AF2F 7211 'r.'
xaf31: dec byte [bp+0x1] ; 0000AF31 FE4E01 '.N.'
jnz xaefb ; 0000AF34 75C5 'u.'
test word [bp+0x1a],0x1 ; 0000AF36 F7461A0100 '.F...'
jnz xaf45 ; 0000AF3B 7508 'u.'
call xb468 ; 0000AF3D E82805 '.(.'
jmp short xaf45 ; 0000AF40 EB03 '..'
xaf42: call xb471 ; 0000AF42 E82C05 '.,.'
xaf45: ret ; 0000AF45 C3 '.'
db '**********************************************************************************************'
jmp xb343 ; 0000AFA4 E99C03
call xb483 ; 0000AFA7 E8D904 '...'
jc xb029 ; 0000AFAA 727D 'r}'
call xb395 ; 0000AFAC E8E603 '...'
mov al,0x30 ; 0000AFAF B030 '.0'
test byte [es:si+0x8],0xc0 ; 0000AFB1 26F64408C0 '&.D..'
jz xafba ; 0000AFB6 7402 't.'
or al,0x1 ; 0000AFB8 0C01 '..'
xafba: cmp byte [bp+0x15],0xb ; 0000AFBA 807E150B '.~..'
jnz xafd1 ; 0000AFBE 7511 'u.'
or al,0x2 ; 0000AFC0 0C02 '..'
push ax ; 0000AFC2 50 'P'
mov al,[es:si+0x7] ; 0000AFC3 268A4407 '&.D.'
or al,al ; 0000AFC7 0AC0 0x0A,'.'
jnz xafcd ; 0000AFC9 7502 'u.'
mov al,0x4 ; 0000AFCB B004 '..'
xafcd: mov [bp+0x0],al ; 0000AFCD 884600 '.F.'
pop ax ; 0000AFD0 58 'X'
xafd1: mov [0x48],al ; 0000AFD1 A24800 '.H.'
call xb3e5 ; 0000AFD4 E80E04 '...'
mov dh,0x7f ; 0000AFD7 B67F '..'
cmp byte [bp+0x15],0xb ; 0000AFD9 807E150B '.~..'
jz xafe5 ; 0000AFDD 7406 't.'
or al,ah ; 0000AFDF 0AC4 0x0A,'.'
jnz xafe5 ; 0000AFE1 7502 'u.'
inc dh ; 0000AFE3 FEC6 '..'
xafe5: or ah,[bp+0x14] ; 0000AFE5 0A6614 0x0A,'f.'
mov [bp+0x1],ah ; 0000AFE8 886601 '.f.'
jz xaff1 ; 0000AFEB 7404 't.'
cmp ah,dh ; 0000AFED 3AE6 ':.'
jna xaff5 ; 0000AFEF 7604 'v.'
xaff1: mov ah,0x9 ; 0000AFF1 B409 '..'
jmp short xb029 ; 0000AFF3 EB34 '.4'
xaff5: call xb4bd ; 0000AFF5 E8C504 '...'
call xb3e5 ; 0000AFF8 E8EA03 '...'
mov bx,dx ; 0000AFFB 8BDA '..'
mov si,ax ; 0000AFFD 8BF0 '..'
xafff: call xb44d ; 0000AFFF E84B04 '.K.'
call xb3ff ; 0000B002 E8FA03 '...'
cmp byte [bp+0x15],0xb ; 0000B005 807E150B '.~..'
jnz xb010 ; 0000B009 7505 'u.'
call xb40c ; 0000B00B E8FE03 '...'
jc xb029 ; 0000B00E 7219 'r.'
xb010: call xb4d0 ; 0000B010 E8BD04 '...'
jc xb029 ; 0000B013 7214 'r.'
call xb2e0 ; 0000B015 E8C802 '...'
jc xb029 ; 0000B018 720F 'r.'
call xb50e ; 0000B01A E8F104
jc xb029 ; 0000B01D 720A 'r',0x0A
dec byte [bp+0x1] ; 0000B01F FE4E01 '.N.'
jnz xafff ; 0000B022 75DB 'u.'
call xb468 ; 0000B024 E84104 '.A.'
jmp short xb02c ; 0000B027 EB03 '..'
xb029: call xb471 ; 0000B029 E84504 '.E.'
xb02c: ret ; 0000B02C C3 '.'
call xb483 ; 0000B02D E85304 '.S.'
jc xb05a ; 0000B030 7228 'r('
call xb395 ; 0000B032 E86003 '.`.'
mov al,0x40 ; 0000B035 B040 '.@'
test byte [es:si+0x8],0xc0 ; 0000B037 26F64408C0 '&.D..'
jz xb040 ; 0000B03C 7402 't.'
or al,0x1 ; 0000B03E 0C01 '..'
xb040: mov [0x48],al ; 0000B040 A24800 '.H.'
call xb4bd ; 0000B043 E87704 '.w.'
call xb4d0 ; 0000B046 E88704 '...'
jc xb05a ; 0000B049 720F 'r.'
call xb2e0 ; 0000B04B E89202 '...'
jc xb05a ; 0000B04E 720A 'r',0x0A
call xb50e ; 0000B050 E8BB04
jc xb05a ; 0000B053 7205 'r.'
call xb468 ; 0000B055 E81004 '...'
jmp short xb05d ; 0000B058 EB03 '..'
xb05a: call xb471 ; 0000B05A E81404 '...'
xb05d: ret ; 0000B05D C3 '.'
call xb483 ; 0000B05E E82204 '.".'
jc xb098 ; 0000B061 7235 'r5'
call xb395 ; 0000B063 E82F03 './.'
mov al,[es:si+0xe] ; 0000B066 268A440E '&.D.'
mov [0x43],al ; 0000B06A A24300 '.C.'
mov byte [0x48],0x50 ; 0000B06D C606480050 '..H.P'
call xb4bd ; 0000B072 E84804 '.H.'
call xb44d ; 0000B075 E8D503 '...'
jc xb098 ; 0000B078 721E 'r.'
call xb3e5 ; 0000B07A E86803 '.h.'
mov bx,dx ; 0000B07D 8BDA '..'
mov si,ax ; 0000B07F 8BF0 '..'
call xb3ff ; 0000B081 E87B03 '.{.'
call xb4d0 ; 0000B084 E84904 '.I.'
jc xb098 ; 0000B087 720F 'r.'
call xb2e0 ; 0000B089 E85402 '.T.'
jc xb098 ; 0000B08C 720A 'r',0x0A
call xb50e ; 0000B08E E87D04
jc xb098 ; 0000B091 7205 'r.'
call xb468 ; 0000B093 E8D203 '...'
jmp short xb09b ; 0000B096 EB03 '..'
xb098: call xb471 ; 0000B098 E8D603 '...'
xb09b: ret ; 0000B09B C3 '.'
mov [bp+0x14],ax ; 0000B09C 894614 '.F.'
mov [0x74],al ; 0000B09F A27400 '.t.'
push bx ; 0000B0A2 53 'S'
mov bl,[bp+0x10] ; 0000B0A3 8A5E10 '.^.'
and bl,0x9f ; 0000B0A6 80E39F '...'
cmp bl,0x81 ; 0000B0A9 80FB81 '...'
pop bx ; 0000B0AC 5B '['
jna xb0bc ; 0000B0AD 760D 'v',0x0D
mov [bp+0x12],ax ; 0000B0AF 894612 '.F.'
mov [bp+0x10],ax ; 0000B0B2 894610 '.F.'
mov ah,0x7 ; 0000B0B5 B407 '..'
call xb471 ; 0000B0B7 E8B703 '...'
jmp short xb0e1 ; 0000B0BA EB25 '.%'
xb0bc: mov ax,[es:si] ; 0000B0BC 268B04 '&..'
dec ax ; 0000B0BF 48 'H'
dec ax ; 0000B0C0 48 'H'
cmp ax,0x3ff ; 0000B0C1 3DFF03 '=..'
jna xb0c9 ; 0000B0C4 7603 'v.'
mov ax,0x3ff ; 0000B0C6 B8FF03 '...'
xb0c9: xchg ah,al ; 0000B0C9 86E0 '..'
shl al,0x6 ; 0000B0CB C0E006 '...'
or al,[es:si+0xe] ; 0000B0CE 260A440E '&',0x0A,'D.'
mov [bp+0x12],ax ; 0000B0D2 894612 '.F.'
mov ah,[es:si+0x2] ; 0000B0D5 268A6402 '&.d.'
dec ah ; 0000B0D9 FECC '..'
mov al,[0x75] ; 0000B0DB A07500 '.u.'
mov [bp+0x10],ax ; 0000B0DE 894610 '.F.'
xb0e1: ret ; 0000B0E1 C3 '.'
call xb483 ; 0000B0E2 E89E03 '...'
jc xb137 ; 0000B0E5 7250 'rP'
mov bl,[bp+0x10] ; 0000B0E7 8A5E10 '.^.'
xb0ea: mov bh,[es:si+0x2] ; 0000B0EA 268A7C02 '&.|.'
dec bh ; 0000B0EE FECF '..'
or bh,0xa0 ; 0000B0F0 80CFA0 '...'
test bl,0x1 ; 0000B0F3 F6C301 '...'
jz xb0fb ; 0000B0F6 7403 't.'
or bh,0x10 ; 0000B0F8 80CF10 '...'
xb0fb: mov bl,[es:si+0xe] ; 0000B0FB 268A5C0E '&.\.'
mov ax,[es:si+0x5] ; 0000B0FF 268B4405 '&.D.'
shr ax,0x2 ; 0000B103 C1E802 '...'
push es ; 0000B106 06 '.'
push ds ; 0000B107 1E '.'
pop es ; 0000B108 07 '.'
mov di,0x42 ; 0000B109 BF4200 '.B.'
stosb ; 0000B10C AA '.'
mov al,bl ; 0000B10D 8AC3 '..'
stosb ; 0000B10F AA '.'
mov al,0x1 ; 0000B110 B001 '..'
stosb ; 0000B112 AA '.'
mov al,ah ; 0000B113 8AC4 '..'
stosb ; 0000B115 AA '.'
stosb ; 0000B116 AA '.'
mov al,bh ; 0000B117 8AC7 '..'
stosb ; 0000B119 AA '.'
mov byte [di],0x91 ; 0000B11A C60591 '...'
pop es ; 0000B11D 07 '.'
call xb4bd ; 0000B11E E89C03 '...'
call xb4d0 ; 0000B121 E8AC03 '...'
jc xb135 ; 0000B124 720F 'r.'
call xb2e0 ; 0000B126 E8B701 '...'
jc xb135 ; 0000B129 720A 'r',0x0A
call xb50e ; 0000B12B E8E003
jc xb135 ; 0000B12E 7205 'r.'
call xb468 ; 0000B130 E83503 '.5.'
jmp short xb13a ; 0000B133 EB05 '..'
xb135: mov ah,0x7 ; 0000B135 B407 '..'
xb137: call xb471 ; 0000B137 E83703 '.7.'
xb13a: ret ; 0000B13A C3 '.'
call xb483 ; 0000B13B E84503 '.E.'
jc xb145 ; 0000B13E 7205 'r.'
call xb468 ; 0000B140 E82503 '.%.'
jmp short xb148 ; 0000B143 EB03 '..'
xb145: call xb471 ; 0000B145 E82903 '.).'
xb148: ret ; 0000B148 C3 '.'
call xb483 ; 0000B149 E83703 '.7.'
jc xb16d ; 0000B14C 721F 'r.'
call xb395 ; 0000B14E E84402 '.D.'
xb151: mov byte [0x48],0x70 ; 0000B151 C606480070 '..H.p'
call xb4bd ; 0000B156 E86403 '.d.'
call xb4d0 ; 0000B159 E87403 '.t.'
jc xb16d ; 0000B15C 720F 'r.'
call xb2e0 ; 0000B15E E87F01 '...'
jc xb16d ; 0000B161 720A 'r',0x0A
call xb50e ; 0000B163 E8A803
jc xb16d ; 0000B166 7205 'r.'
call xb468 ; 0000B168 E8FD02 '...'
jmp short xb170 ; 0000B16B EB03 '..'
xb16d: call xb471 ; 0000B16D E80103 '...'
xb170: ret ; 0000B170 C3 '.'
call xb483 ; 0000B171 E80F03 '...'
jnc xb17e ; 0000B174 7308 's.'
cmp ah,0x1 ; 0000B176 80FC01 '...'
jnz xb17e ; 0000B179 7503 'u.'
jmp xb215 ; 0000B17B E99700 '...'
xb17e: push ds ; 0000B17E 1E '.'
xor ax,ax ; 0000B17F 33C0 '3.'
mov ds,ax ; 0000B181 8ED8 '..'
les si,[0x104] ; 0000B183 C4360401 '.6..'
pop ds ; 0000B187 1F '.'
call xb395 ; 0000B188 E80A02 '.',0x0A,'.'
mov byte [0x45],0x0 ; 0000B18B C606450000 '..E..'
mov byte [0x46],0x0 ; 0000B190 C606460000 '..F..'
and byte [0x47],0xe0 ; 0000B195 80264700E0 '.&G..'
call xb2e0 ; 0000B19A E84301 '.C.'
mov al,0xa0 ; 0000B19D B0A0 '..'
mov dx,0x1f6 ; 0000B19F BAF601 '...'
out dx,al ; 0000B1A2 EE '.'
call xb527 ; 0000B1A3 E88103 '...'
call xb151 ; 0000B1A6 E8A8FF '...'
call xb527 ; 0000B1A9 E87B03 '.{.'
cmp byte [0x75],0x2 ; 0000B1AC 803E750002 '.>u..'
jc xb1ca ; 0000B1B1 7217 'r.'
or byte [0x47],0x10 ; 0000B1B3 800E470010 '..G..'
call xb2e0 ; 0000B1B8 E82501 '.%.'
mov al,0xb0 ; 0000B1BB B0B0 '..'
mov dx,0x1f6 ; 0000B1BD BAF601 '...'
out dx,al ; 0000B1C0 EE '.'
call xb527 ; 0000B1C1 E86303 '.c.'
call xb151 ; 0000B1C4 E88AFF '...'
call xb527 ; 0000B1C7 E85D03 '.].'
xb1ca: and word [bp+0x1a],0xfffe ; 0000B1CA 81661AFEFF '.f...'
mov byte [bp+0x15],0x0 ; 0000B1CF C6461500 '.F..'
call xc565 ; 0000B1D3 E88F13 '...'
jc xb213 ; 0000B1D6 723B 'r;'
push ds ; 0000B1D8 1E '.'
xor ax,ax ; 0000B1D9 33C0 '3.'
mov ds,ax ; 0000B1DB 8ED8 '..'
les si,[0x104] ; 0000B1DD C4360401 '.6..'
pop ds ; 0000B1E1 1F '.'
mov bl,0x80 ; 0000B1E2 B380 '..'
call xb0ea ; 0000B1E4 E803FF '...'
jc xb213 ; 0000B1E7 722A 'r*'
call xb221 ; 0000B1E9 E83500 '.5.'
jc xb213 ; 0000B1EC 7225 'r%'
cmp byte [0x75],0x2 ; 0000B1EE 803E750002 '.>u..'
jnc xb1f8 ; 0000B1F3 7303 's.'
clc ; 0000B1F5 F8 '.'
jmp short xb218 ; 0000B1F6 EB20 '. '
xb1f8: push ds ; 0000B1F8 1E '.'
xor ax,ax ; 0000B1F9 33C0 '3.'
mov ds,ax ; 0000B1FB 8ED8 '..'
les si,[0x118] ; 0000B1FD C4361801 '.6..'
pop ds ; 0000B201 1F '.'
mov bl,0x81 ; 0000B202 B381 '..'
call xb0ea ; 0000B204 E8E3FE '...'
jc xb213 ; 0000B207 720A 'r',0x0A
or byte [0x47],0x10 ; 0000B209 800E470010 '..G..'
call xb221 ; 0000B20E E81000 '...'
jnc xb218 ; 0000B211 7305 's.'
xb213: mov ah,0x5 ; 0000B213 B405 '..'
xb215: call xb471 ; 0000B215 E85902 '.Y.'
xb218: ret ; 0000B218 C3 '.'
call xb483 ; 0000B219 E86702 '.g.'
jc xb23d ; 0000B21C 721F 'r.'
call xb395 ; 0000B21E E87401 '.t.'
xb221: mov byte [0x48],0x10 ; 0000B221 C606480010 '..H..'
call xb4bd ; 0000B226 E89402 '...'
call xb4d0 ; 0000B229 E8A402 '...'
jc xb23d ; 0000B22C 720F 'r.'
call xb2e0 ; 0000B22E E8AF00 '...'
jc xb23d ; 0000B231 720A 'r',0x0A
call xb50e ; 0000B233 E8D802
jc xb23d ; 0000B236 7205 'r.'
call xb468 ; 0000B238 E82D02 '.-.'
jmp short xb240 ; 0000B23B EB03 '..'
xb23d: call xb471 ; 0000B23D E83102 '.1.'
xb240: mov [bp+0x14],al ; 0000B240 884614 '.F.'
ret ; 0000B243 C3 '.'
call xb483 ; 0000B244 E83C02 '.<.'
jc xb26c ; 0000B247 7223 'r#'
call xb395 ; 0000B249 E84901 '.I.'
mov byte [0x48],0x90 ; 0000B24C C606480090 '..H..'
call xb4bd ; 0000B251 E86902 '.i.'
call xb4d0 ; 0000B254 E87902 '.y.'
jc xb26c ; 0000B257 7213 'r.'
call xb2e0 ; 0000B259 E88400 '...'
jc xb26c ; 0000B25C 720E 'r.'
call xb374 ; 0000B25E E81301
xor ah,ah ; 0000B261 32E4 '2.'
mov [bp+0x14],ax ; 0000B263 894614 '.F.'
cmp al,0x1 ; 0000B266 3C01 '<.'
jz xb26f ; 0000B268 7405 't.'
mov ah,0x20 ; 0000B26A B420 '. '
xb26c: call xb471 ; 0000B26C E80202 '...'
xb26f: ret ; 0000B26F C3 '.'
mov bl,[0x75] ; 0000B270 8A1E7500 '..u.'
dec bl ; 0000B274 FECB '..'
add bl,0x80 ; 0000B276 80C380 '...'
sub bl,[bp+0x10] ; 0000B279 2A5E10 '*^.'
jnc xb289 ; 0000B27C 730B 's.'
mov [bp+0x14],ax ; 0000B27E 894614 '.F.'
mov [bp+0x12],ax ; 0000B281 894612 '.F.'
mov [bp+0x10],ax ; 0000B284 894610 '.F.'
jmp short xb2a2 ; 0000B287 EB19 '..'
xb289: mov word [bp+0x14],0x300 ; 0000B289 C746140003 '.F...'
mov al,[es:si+0x2] ; 0000B28E 268A4402 '&.D.'
mul byte [es:si+0xe] ; 0000B292 26F6640E '&.d.'
mov bx,[es:si] ; 0000B296 268B1C '&..'
dec bx ; 0000B299 4B 'K'
mul bx ; 0000B29A F7E3 '..'
mov [bp+0x10],ax ; 0000B29C 894610 '.F.'
mov [bp+0x12],dx ; 0000B29F 895612 '.V.'
xb2a2: ret ; 0000B2A2 C3 '.'
xb2a3: mov byte [bp+0x14],0x0 ; 0000B2A3 C6461400 '.F..'
mov ah,0x1 ; 0000B2A7 B401 '..'
mov [bp+0x15],ah ; 0000B2A9 886615 '.f.'
mov [0x74],ah ; 0000B2AC 88267400 '.&t.'
or word [bp+0x1a],0x1 ; 0000B2B0 814E1A0100 '.N...'
ret ; 0000B2B5 C3 '.'
xb2b6: call xb2e0 ; 0000B2B6 E82700 '.',0x27,'.'
jc xb2dc ; 0000B2B9 7221 'r!'
mov al,[bp+0x10] ; 0000B2BB 8A4610 '.F.'
and al,0x1 ; 0000B2BE 2401 '$.'
shl al,0x4 ; 0000B2C0 C0E004 '...'
or al,0xa0 ; 0000B2C3 0CA0 '..'
mov dx,0x1f6 ; 0000B2C5 BAF601 '...'
out dx,al ; 0000B2C8 EE '.'
call xb2e0 ; 0000B2C9 E81400 '...'
jc xb2dc ; 0000B2CC 720E 'r.'
test al,0x20 ; 0000B2CE A820 '. '
jz xb2d6 ; 0000B2D0 7404 't.'
mov ah,0xcc ; 0000B2D2 B4CC '..'
jmp short xb2dc ; 0000B2D4 EB06 '..'
xb2d6: test al,0x40 ; 0000B2D6 A840 '.@'
jnz xb2df ; 0000B2D8 7505 'u.'
mov ah,0xaa ; 0000B2DA B4AA '..'
xb2dc: call xb471 ; 0000B2DC E89201 '...'
xb2df: ret ; 0000B2DF C3 '.'
xb2e0: push bx ; 0000B2E0 53 'S'
push cx ; 0000B2E1 51 'Q'
call xb364 ; 0000B2E2 E87F00 '...'
cmp al,0xff ; 0000B2E5 3CFF '<.'
jnz xb2ed ; 0000B2E7 7504 'u.'
xchg al,ah ; 0000B2E9 86C4 '..'
jmp short xb304 ; 0000B2EB EB17 '..'
xb2ed: mov bx,0x6 ; 0000B2ED BB0600 '...'
xb2f0: mov cx,0xf424 ; 0000B2F0 B924F4 '.$.'
xb2f3: test al,0x80 ; 0000B2F3 A880 '..'
jz xb305 ; 0000B2F5 740E 't.'
call x919a ; 0000B2F7 E8A0DE '...'
call xb364 ; 0000B2FA E86700 '.g.'
loop xb2f3 ; 0000B2FD E2F4 '..'
dec bx ; 0000B2FF 4B 'K'
jnz xb2f0 ; 0000B300 75EE 'u.'
mov ah,0x80 ; 0000B302 B480 '..'
xb304: stc ; 0000B304 F9 '.'
xb305: pop cx ; 0000B305 59 'Y'
pop bx ; 0000B306 5B '['
ret ; 0000B307 C3 '.'
db '***********************************************************'
xb343: push ax ; 0000B343 50
push ds ; 0000B344 1E
mov ax,0x40 ; 0000B345 B84000 '.@.'
mov ds,ax ; 0000B348 8ED8 '..'
mov byte [0x8e],0xff ; 0000B34A C6068E00FF '.....'
mov al,0x20 ; 0000B34F B020 '. '
out 0x20,al ; 0000B351 E620 '. '
out 0xa0,al ; 0000B353 E6A0 '..'
xor ax,ax ; 0000B355 33C0 '3.'
mov ds,ax ; 0000B357 8ED8 '..'
mov ax,0x9100 ; 0000B359 B80091 '...'
pushf ; 0000B35C 9C '.'
call far [0x54] ; 0000B35D FF1E5400 '..T.'
pop ds ; 0000B361 1F '.'
pop ax ; 0000B362 58 'X'
iret ; 0000B363 CF '.'
xb364: mov dx,0x1f7 ; 0000B364 BAF701 '...'
in al,dx ; 0000B367 EC '.'
mov [0x8c],al ; 0000B368 A28C00 '...'
ret ; 0000B36B C3 '.'
or dl,[bx+si] ; 0000B36C 0A10 0x0A,'.'
add [si],al ; 0000B36E 0004 '..'
add [bx+si],ah ; 0000B370 0020 '. '
inc ax ; 0000B372 40 '@'
db 0x02 ; 0000B373 02
xb374: mov dx,0x01f1 ; 0000B374 BAF101 '...'
in al,dx ; 0000B377 EC '.'
mov [0x8d],al ; 0000B378 A28D00 '...'
mov ah,0x20 ; 0000B37B B420 '. '
and al,0xd7 ; 0000B37D 24D7 '$.'
jz xb391 ; 0000B37F 7410 't.'
push si ; 0000B381 56 'V'
mov si,0xb36c ; 0000B382 BE6CB3 '.l.'
xb385: shl al,1 ; 0000B385 D0E0 '..'
jc xb38c ; 0000B387 7203 'r.'
inc si ; 0000B389 46 'F'
jmp short xb385 ; 0000B38A EBF9 '..'
xb38c: cs lodsb ; 0000B38C 2EAC '..'
pop si ; 0000B38E 5E '^'
xchg ah,al ; 0000B38F 86E0 '..'
xb391: mov al,[0x8d] ; 0000B391 A08D00 '...'
ret ; 0000B394 C3 '.'
xb395: mov ax,[es:si+0x5] ; 0000B395 268B4405 '&.D.'
shr ax,0x2 ; 0000B399 C1E802 '...'
mov [0x42],al ; 0000B39C A24200 '.B.'
mov al,[bp+0x14] ; 0000B39F 8A4614 '.F.'
mov [0x43],al ; 0000B3A2 A24300 '.C.'
mov al,[bp+0x12] ; 0000B3A5 8A4612 '.F.'
and al,0x3f ; 0000B3A8 243F '$?'
mov [0x44],al ; 0000B3AA A24400 '.D.'
mov al,[bp+0x13] ; 0000B3AD 8A4613 '.F.'
mov [0x45],al ; 0000B3B0 A24500 '.E.'
mov al,[bp+0x12] ; 0000B3B3 8A4612 '.F.'
shr al,0x6 ; 0000B3B6 C0E806 '...'
mov ah,[bp+0x10] ; 0000B3B9 8A6610 '.f.'
and ah,0x60 ; 0000B3BC 80E460 '..`'
shr ah,0x3 ; 0000B3BF C0EC03 '...'
or al,ah ; 0000B3C2 0AC4 0x0A,'.'
mov [0x46],al ; 0000B3C4 A24600 '.F.'
mov al,[bp+0x10] ; 0000B3C7 8A4610 '.F.'
and al,0x1 ; 0000B3CA 2401 '$.'
shl al,0x4 ; 0000B3CC C0E004 '...'
or al,0xa0 ; 0000B3CF 0CA0 '..'
mov dh,[bp+0x11] ; 0000B3D1 8A7611 '.v.'
and dh,0xf ; 0000B3D4 80E60F '...'
or al,dh ; 0000B3D7 0AC6 0x0A,'.'
mov [0x47],al ; 0000B3D9 A24700 '.G.'
mov al,[es:si+0x8] ; 0000B3DC 268A4408 '&.D.'
mov dx,0x3f6 ; 0000B3E0 BAF603 '...'
out dx,al ; 0000B3E3 EE '.'
ret ; 0000B3E4 C3 '.'
xb3e5: mov ax,0x10 ; 0000B3E5 B81000 '...'
mul word [bp+0x2] ; 0000B3E8 F76602 '.f.'
add ax,[bp+0xe] ; 0000B3EB 03460E '.F.'
adc dl,0x0 ; 0000B3EE 80D200 '...'
push ax ; 0000B3F1 50 'P'
shl dx,0xc ; 0000B3F2 C1E20C '...'
shr ax,0x4 ; 0000B3F5 C1E804 '...'
or dx,ax ; 0000B3F8 0BD0 '..'
pop ax ; 0000B3FA 58 'X'
and ax,0xf ; 0000B3FB 250F00 '%..'
ret ; 0000B3FE C3 '.'
xb3ff: push ds ; 0000B3FF 1E '.'
mov ds,bx ; 0000B400 8EDB '..'
mov cx,0x100 ; 0000B402 B90001 '...'
mov dx,0x1f0 ; 0000B405 BAF001 '...'
rep outsw ; 0000B408 F36F '.o'
pop ds ; 0000B40A 1F '.'
ret ; 0000B40B C3 '.'
xb40c: xor ch,ch ; 0000B40C 32ED '2.'
mov cl,[bp+0x0] ; 0000B40E 8A4E00 '.N.'
xb411: call x919a ; 0000B411 E886DD '...'
call xb2e0 ; 0000B414 E8C9FE '...'
jc xb429 ; 0000B417 7210 'r.'
call xb44d ; 0000B419 E83100 '.1.'
jc xb429 ; 0000B41C 720B 'r.'
push ds ; 0000B41E 1E '.'
mov ds,bx ; 0000B41F 8EDB '..'
lodsb ; 0000B421 AC '.'
pop ds ; 0000B422 1F '.'
mov dx,0x1f0 ; 0000B423 BAF001 '...'
out dx,al ; 0000B426 EE '.'
loop xb411 ; 0000B427 E2E8 '..'
xb429: ret ; 0000B429 C3 '.'
xb42a: mov cx,0x100 ; 0000B42A B90001 '...'
mov dx,0x1f0 ; 0000B42D BAF001 '...'
rep insw ; 0000B430 F36D '.m'
ret ; 0000B432 C3 '.'
xb433: xor ch,ch ; 0000B433 32ED '2.'
mov cl,[bp+0x0] ; 0000B435 8A4E00 '.N.'
xb438: call x919a ; 0000B438 E85FDD '._.'
call xb2e0 ; 0000B43B E8A2FE '...'
jc xb44c ; 0000B43E 720C 'r.'
call xb44d ; 0000B440 E80A00 '.',0x0A,'.'
jc xb44c ; 0000B443 7207 'r.'
mov dx,0x1f0 ; 0000B445 BAF001 '...'
in al,dx ; 0000B448 EC '.'
stosb ; 0000B449 AA '.'
loop xb438 ; 0000B44A E2EC '..'
xb44c: ret ; 0000B44C C3 '.'
xb44d: push cx ; 0000B44D 51 'Q'
mov cx,0xf424 ; 0000B44E B924F4 '.$.'
call xb2e0 ; 0000B451 E88CFE '...'
jc xb466 ; 0000B454 7210 'r.'
xb456: mov dx,0x1f7 ; 0000B456 BAF701 '...'
in al,dx ; 0000B459 EC '.'
test al,0x8 ; 0000B45A A808 '..'
jnz xb466 ; 0000B45C 7508 'u.'
call x919a ; 0000B45E E839DD '.9.'
loop xb456 ; 0000B461 E2F3 '..'
mov ah,0x80 ; 0000B463 B480 '..'
stc ; 0000B465 F9 '.'
xb466: pop cx ; 0000B466 59 'Y'
ret ; 0000B467 C3 '.'
xb468: call xb364 ; 0000B468 E8F9FE '...'
xor ah,ah ; 0000B46B 32E4 '2.'
mov [bp+0x14],ax ; 0000B46D 894614 '.F.'
ret ; 0000B470 C3 '.'
xb471: mov [bp+0x15],ah ; 0000B471 886615 '.f.'
mov byte [bp+0x14],0x0 ; 0000B474 C6461400 '.F..'
mov [0x74],ah ; 0000B478 88267400 '.&t.'
or word [bp+0x1a],0x1 ; 0000B47C 814E1A0100 '.N...'
stc ; 0000B481 F9 '.'
ret ; 0000B482 C3 '.'
xb483: mov byte [0x8e],0x0 ; 0000B483 C6068E0000 '.....'
mov [0x74],ah ; 0000B488 88267400 '.&t.'
mov ah,[0x75] ; 0000B48C 8A267500 '.&u.'
or ah,ah ; 0000B490 0AE4 0x0A,'.'
jz xb4a5 ; 0000B492 7411 't.'
mov al,[bp+0x10] ; 0000B494 8A4610 '.F.'
and al,0x9f ; 0000B497 249F '$.'
cmp al,0x80 ; 0000B499 3C80 '<.'
jz xb4ab ; 0000B49B 740E 't.'
dec ah ; 0000B49D FECC '..'
jz xb4a5 ; 0000B49F 7404 't.'
cmp al,0x81 ; 0000B4A1 3C81 '<.'
jz xb4ab ; 0000B4A3 7406 't.'
xb4a5: call xb2a3 ; 0000B4A5 E8FBFD '...'
stc ; 0000B4A8 F9 '.'
jmp short xb4bc ; 0000B4A9 EB11 '..'
xb4ab: mov dx,0x3f6 ; 0000B4AB BAF603 '...'
mov al,0x0 ; 0000B4AE B000 '..'
out dx,al ; 0000B4B0 EE '.'
call xc5a2 ; 0000B4B1 E8EE10 '...'
call xb2b6 ; 0000B4B4 E8FFFD '...'
jc xb4bc ; 0000B4B7 7203 'r.'
call xb527 ; 0000B4B9 E86B00 '.k.'
xb4bc: ret ; 0000B4BC C3 '.'
xb4bd: push si ; 0000B4BD 56 'V'
push cx ; 0000B4BE 51 'Q'
mov si,0x42 ; 0000B4BF BE4200 '.B.'
mov dx,0x1f1 ; 0000B4C2 BAF101 '...'
mov cx,0x7 ; 0000B4C5 B90700 '...'
xb4c8: lodsb ; 0000B4C8 AC '.'
out dx,al ; 0000B4C9 EE '.'
inc dx ; 0000B4CA 42 'B'
loop xb4c8 ; 0000B4CB E2FB '..'
pop cx ; 0000B4CD 59 'Y'
pop si ; 0000B4CE 5E '^'
ret ; 0000B4CF C3 '.'
xb4d0: push bx ; 0000B4D0 53 'S'
push cx ; 0000B4D1 51 'Q'
push ds ; 0000B4D2 1E '.'
xor ax,ax ; 0000B4D3 33C0 '3.'
mov ds,ax ; 0000B4D5 8ED8 '..'
clc ; 0000B4D7 F8 '.'
mov ax,0x9000 ; 0000B4D8 B80090 '...'
pushf ; 0000B4DB 9C '.'
call far [0x54] ; 0000B4DC FF1E5400 '..T.'
pop ds ; 0000B4E0 1F '.'
jnc xb4ed ; 0000B4E1 730A 's',0x0A
xor ax,ax ; 0000B4E3 33C0 '3.'
or al,[0x8e] ; 0000B4E5 0A068E00 0x0A,'...'
jnz xb506 ; 0000B4E9 751B 'u.'
jmp short xb503 ; 0000B4EB EB16 '..'
xb4ed: xor ax,ax ; 0000B4ED 33C0 '3.'
mov bx,0x14 ; 0000B4EF BB1400 '...'
xb4f2: mov cx,0xf424 ; 0000B4F2 B924F4 '.$.'
xb4f5: or al,[0x8e] ; 0000B4F5 0A068E00 0x0A,'...'
jnz xb506 ; 0000B4F9 750B 'u.'
call x919a ; 0000B4FB E89CDC '...'
loop xb4f5 ; 0000B4FE E2F5 '..'
dec bx ; 0000B500 4B 'K'
jnz xb4f2 ; 0000B501 75EF 'u.'
xb503: mov ah,0x80 ; 0000B503 B480 '..'
stc ; 0000B505 F9 '.'
xb506: mov byte [0x8e],0x0 ; 0000B506 C6068E0000 '.....'
pop cx ; 0000B50B 59 'Y'
pop bx ; 0000B50C 5B '['
ret ; 0000B50D C3 '.'
xb50e: test al,0x20 ; 0000B50E A820 '. '
jz xb516 ; 0000B510 7404 't.'
mov ah,0xcc ; 0000B512 B4CC '..'
jmp short xb525 ; 0000B514 EB0F '..'
xb516: test al,0x1 ; 0000B516 A801 '..'
jz xb51f ; 0000B518 7405 't.'
call xb374 ; 0000B51A E857FE
jmp short xb525 ; 0000B51D EB06 '..'
xb51f: test al,0x4 ; 0000B51F A804 '..'
jz xb526 ; 0000B521 7403 't.'
mov ah,0x11 ; 0000B523 B411 '..'
xb525: stc ; 0000B525 F9 '.'
xb526: ret ; 0000B526 C3 '.'
xb527: mov cx,0xf424 ; 0000B527 B924F4 '.$.'
mov dx,0x1f7 ; 0000B52A BAF701 '...'
xor ax,ax ; 0000B52D 33C0 '3.'
xb52f: in al,dx ; 0000B52F EC '.'
test al,0x10 ; 0000B530 A810 '..'
jnz xb53c ; 0000B532 7508 'u.'
call x919a ; 0000B534 E863DC '.c.'
loop xb52f ; 0000B537 E2F6 '..'
mov ah,0x80 ; 0000B539 B480 '..'
stc ; 0000B53B F9 '.'
xb53c: ret ; 0000B53C C3 '.'
mov dx,0x3f6 ; 0000B53D BAF603 '...'
mov al,0x2 ; 0000B540 B002 '..'
out dx,al ; 0000B542 EE '.'
ret ; 0000B543 C3 '.'
xb544: out 0x70,al ; 0000B544 E670 '.p'
in al,0x71 ; 0000B546 E471 '.q'
ret ; 0000B548 C3 '.'
xb549: out 0x70,al ; 0000B549 E670 '.p'
mov al,ah ; 0000B54B 8AC4 '..'
out 0x71,al ; 0000B54D E671 '.q'
ret ; 0000B54F C3 '.'
xb550: mov al,0x40 ; 0000B550 B040 '.@'
out 0x84,al ; 0000B552 E684 '..'
mov ax,0x40 ; 0000B554 B84000 '.@.'
mov ds,ax ; 0000B557 8ED8 '..'
mov ax,[0x72] ; 0000B559 A17200 '.r.'
out 0x80,al ; 0000B55C E680 '..'
cmp al,0x34 ; 0000B55E 3C34 '<4'
jnz xb564 ; 0000B560 7502 'u.'
jmp bp ; 0000B562 FFE5 '..'
xb564: mov sp,bp ; 0000B564 8BE5 '..'
mov bl,0xff ; 0000B566 B3FF '..'
xor di,di ; 0000B568 33FF '3.'
mov bp,0xb570 ; 0000B56A BD70B5 '.p.'
jmp x8796 ; 0000B56D E926D2
xb570: mov al,0x41 ; 0000B570 B041 '.A'
out 0x84,al ; 0000B572 E684 '..'
;
; Verify that RAM refresh is occurring, by confirming that bit 4 (0x10) of port 0x61 is alternating
;
in al,0x61 ; 0000B574 E461 '.a'
not al ; 0000B576 F6D0 '..'
and al,0x10 ; 0000B578 2410 '$.'
mov ah,al ; 0000B57A 8AE0 '..'
mov cx,0xffff ; 0000B57C B9FFFF '...'
xb57f: in al,0x61 ; 0000B57F E461 '.a'
and al,0x10 ; 0000B581 2410 '$.'
cmp al,ah ; 0000B583 3AC4 ':.'
jz xb597 ; 0000B585 7410 't.'
loop xb57f ; 0000B587 E2F6 '..'
;
; Verification failed
;
mov bx,err102 ; 0000B589 BB8CB6 '...'
mov cx,err102_len-2 ; 0000B58C B91800 '...'
mov bp,0xb595 ; 0000B58F BD95B5 '...'
jmp xc7f7 ; 0000B592 E96212 '.b.'
jmp short xb570 ; 0000B595 EBD9 '..'
;
; Checkpoint 0x42: Memory test of the first 128Kb of (conventional) RAM
;
xb597: mov al,0x42 ; 0000B597 B042 '.B'
out 0x84,al ; 0000B599 E684 '..'
init_128kb:
xor ebp,ebp ; 0000B59B 6633ED 'f3.'
xb59e: mov dx,0x0 ; 0000B59E BA0000 '...'
mov eax,0x1 ; 0000B5A1 66B801000000 'f.....'
xor eax,ebp ; 0000B5A7 6633C5 'f3.'
xb5aa: mov cx,0x4000 ; 0000B5AA B90040 '..@'
mov es,dx ; 0000B5AD 8EC2 '..'
xor di,di ; 0000B5AF 33FF '3.'
sahf ; 0000B5B1 9E '.'
xb5b2: rcl eax,1 ; 0000B5B2 66D1D0 'f..'
stosd ; 0000B5B5 66AB 'f.'
loop xb5b2 ; 0000B5B7 E2F9 '..'
add dh,0x10 ; 0000B5B9 80C610 '...'
cmp dx,0x2000 ; 0000B5BC 81FA0020 '... '
jc xb5aa ; 0000B5C0 72E8 'r.'
mov al,0x43 ; 0000B5C2 B043 '.C'
out 0x84,al ; 0000B5C4 E684 '..'
in al,0x61 ; 0000B5C6 E461 '.a'
or al,0xc ; 0000B5C8 0C0C '..'
out 0x61,al ; 0000B5CA E661 '.a'
and al,0xf3 ; 0000B5CC 24F3 '$.'
out 0x61,al ; 0000B5CE E661 '.a'
mov al,0x44 ; 0000B5D0 B044 '.D'
out 0x84,al ; 0000B5D2 E684 '..'
mov di,0x0 ; 0000B5D4 BF0000 '...'
mov ebx,0x1 ; 0000B5D7 66BB01000000 'f.....'
xor ebx,ebp ; 0000B5DD 6633DD 'f3.'
mov eax,ebp ; 0000B5E0 668BC5 'f..'
mov dh,ah ; 0000B5E3 8AF4 '..'
xb5e5: mov ds,di ; 0000B5E5 8EDF '..'
xor si,si ; 0000B5E7 33F6 '3.'
mov cx,0x4000 ; 0000B5E9 B90040 '..@'
xb5ec: mov ah,dh ; 0000B5EC 8AE6 '..'
sahf ; 0000B5EE 9E '.'
rcl ebx,1 ; 0000B5EF 66D1D3 'f..'
lahf ; 0000B5F2 9F '.'
mov dh,ah ; 0000B5F3 8AF4 '..'
lodsd ; 0000B5F5 66AD 'f.'
xor eax,ebx ; 0000B5F7 6633C3 'f3.'
loope xb5ec ; 0000B5FA E1F0 '..'
jnz xb642 ; 0000B5FC 7544 'uD'
mov al,0x45 ; 0000B5FE B045 '.E'
out 0x84,al ; 0000B600 E684 '..'
in al,0x61 ; 0000B602 E461 '.a'
test al,0xc0 ; 0000B604 A8C0 '..'
mov al,0x0 ; 0000B606 B000 '..'
jnz xb625 ; 0000B608 751B 'u.'
add di,0x1000 ; 0000B60A 81C70010 '....'
cmp di,0x2000 ; 0000B60E 81FF0020 '... '
jc xb5e5 ; 0000B612 72D1 'r.'
dec ebp ; 0000B614 664D 'fM'
jpo xb61a ; 0000B616 7B02 '{.'
jmp short xb59e ; 0000B618 EB84 '..'
xb61a: mov al,0x46 ; 0000B61A B046 '.F'
out 0x84,al ; 0000B61C E684 '..'
mov ax,0x40 ; 0000B61E B84000 '.@.'
mov ds,ax ; 0000B621 8ED8 '..'
jmp sp ; 0000B623 FFE4 '..'
xb625: xor di,di ; 0000B625 33FF '3.'
mov bp,0xb62d ; 0000B627 BD2DB6 '.-.'
jmp x87e4 ; 0000B62A E9B7D1 '...'
and bl,0xf ; 0000B62D 80E30F '...'
xor si,si ; 0000B630 33F6 '3.'
mov cl,0x4 ; 0000B632 B104 '..'
xb634: rcr bl,1 ; 0000B634 D0DB '..'
jnc xb63d ; 0000B636 7305 's.'
inc si ; 0000B638 46 'F'
loop xb634 ; 0000B639 E2F9 '..'
xor si,si ; 0000B63B 33F6 '3.'
xb63d: xor al,al ; 0000B63D 32C0 '2.'
jmp short xb652 ; 0000B63F EB11 '..'
nop ; 0000B641 90 '.'
;
; The first 128Kb failed the above memory test
;
xb642: mov cx,0x4 ; 0000B642 B90400 '...'
sub si,cx ; 0000B645 2BF1 '+.'
xb647: test al,0xff ; 0000B647 A8FF '..'
jnz xb652 ; 0000B649 7507 'u.'
shr eax,0x8 ; 0000B64B 66C1E808 'f...'
inc si ; 0000B64F 46 'F'
loop xb647 ; 0000B650 E2F5 '..'
xb652: mov cx,ax ; 0000B652 8BC8 '..'
mov al,0x47 ; 0000B654 B047 '.G'
out 0x84,al ; 0000B656 E684 '..'
mov dx,si ; 0000B658 8BD6 '..'
mov si,ds ; 0000B65A 8CDE '..'
mov di,0x0 ; 0000B65C BF0000 '...'
mov bp,xb665 ; 0000B65F BD65B6 '.e.'
jmp xc6ab ; 0000B662 E94610 '.F.'
xb665: mov bx,err201 ; 0000B665 BBA6B6 '...'
mov cx,err201_len ; 0000B668 B91100 '...'
mov bp,0xb671 ; 0000B66B BD71B6 '.q.'
jmp xc7f9 ; 0000B66E E98811 '...'
xb671: jmp short xb671 ; 0000B671 Hang the machine
xb673: mov al,[di+0x32] ; 0000B673 8A4532 '.E2'
and al,0xfe ; 0000B676 24FE '$.'
cmp al,0x2 ; 0000B678 3C02 '<.'
jnz xb68a ; 0000B67A 750E 'u.'
mov dx,[di+0x4c] ; 0000B67C 8B554C '.UL'
add dx,byte +0x4 ; 0000B67F 83C204 '...'
xor byte [di+0x4e],0x80 ; 0000B682 80754E80 '.uN.'
mov al,[di+0x4e] ; 0000B686 8A454E '.EN'
out dx,al ; 0000B689 EE '.'
xb68a: stc ; 0000B68A F9 '.'
ret ; 0000B68B C3 '.'
;
; Error messages
;
err102: db '102-System Board Failure',0x0D,0x0A
err102_len equ $-err102
err201: db ' 201-Memory Error'
err201_len equ $-err201
err203: db ' 203-Memory Address Error'
err203_len equ $-err203
err205: db ' 205-Memory Error',0x0D,0x0A
err205_len equ $-err205
err207: db ' 207-Invalid Memory Configuration',0x0A,0x0D
err207_len equ $-err207
db ' Base Module',0x00
db ' Module A',0x00
db ' Module B',0x00
db ' Module C',0x00
db 0x0D,0x0A
db 'Parity Check 1 ',0x00
db 'Parity Check 2 ',0x00
db '??????',0x00
err101: db '101-ROM Error',0x0D,0x0A
err101_len equ $-err101
db ' 402-Monochrome Adapter Failure',0x0D,0x0A
db ' 501-Display Adapter Failure',0x0D,0x0A
db ' 301-Keyboard Error or Test Fixture Installed',0x0D,0x0A
db ' 301-Keyboard Error',0x0D,0x0A
db ' 304-Keyboard or System Unit Error',0x0D,0x0A
db '303-Keyboard Controller Error',0x0D,0x0A
db ' 601-Diskette Controller Error',0x0D,0x0A
db ' 702-Coprocessor Detection Error, Please Check Installation',0x0D,0x0A
db ' 101-I/O ROM Error',0x0D,0x0A
db ' 162-System Options Not Set-(Run Setup)',0x0D,0x0A
db ' Insert DIAGNOSTIC diskette in Drive A:',0x0D,0x0A
db ' 162-System Options Error',0x0D,0x0A
db ' 164-Memory Size Error',0x0D,0x0A
db ' 163-Time & Date Not Set',0x0D,0x0A,0x0D,0x0A
db ' (RESUME = "F1" KEY)',0x0D,0x0A,0x0D,0x0A
db ' 302-System Unit Security Lock is Locked',0x0D,0x0A
db ' - Unlock System Unit Security Lock',0x0D,0x0A
db '1790-Disk 0 Error',0x0D,0x0A
db '1791-Disk 1 Error',0x0D,0x0A
db '1780-Disk 0 Failure',0x0D,0x0A
db '1781-Disk 1 Failure',0x0D,0x0A
db '1782-Disk Controller Failure',0x0D,0x0A
db ' 605-Diskette Drive Type Error-(Run Setup)',0x0D,0x0A
db ' Insert DIAGNOSTIC diskette in Drive A:',0x0D,0x0A
;
; Video card data
;
xba77: dw 0x03D8 ; 0000BA77 D803 ; +0x00: I/O address of Mode Select Register (CGA)
db 0xD4,0x29,0xB4,0xF0 ; 0000BA79 D429B4F0
dw 0xB800 ; 0000BA7D 00B8 ; +0x06: real-mode segment of video buffer
db 0x00,0x60,0x8A,0xB7 ; 0000BA7F 00608AB7
db 0x1E,0x00,0x40 ; 0000BA83 1E0040
xba86: dw 0x03B8 ; 0000BA86 B803 ; +0x00: I/O address of Mode Select Register (Mono)
db 0xB4,0x29,0xD4,0xF0 ; 0000BA88 B429D4F0
dw 0xB000 ; 0000BA8C 00B0 ; +0x06: real-mode segment of video buffer
db 0x00,0x60,0x69,0xB7 ; 0000BA8E 006069B7
db 0x21,0x00,0x10 ; 0000BA92 210010
mov bp,0xba9b ; 0000BA95 BD9BBA
jmp x9380 ; 0000BA98 E9E5D8
mov al,0x8e ; 0000BA9B B08E
out 0x70,al ; 0000BA9D E670
xor ax,ax ; 0000BA9F 33C0
out 0x71,al ; 0000BAA1 E671
mov al,0x40 ; 0000BAA3 B040
out 0x86,al ; 0000BAA5 E686
xbaa7: cli ; 0000BAA7 FA '.'
mov al,0xf ; 0000BAA8 B00F '..'
out 0x84,al ; 0000BAAA E684 '..'
mov al,0x0 ; 0000BAAC B000 '..'
out 0x85,al ; 0000BAAE E685 '..'
mov al,[cs:0xfffe] ; 0000BAB0 2EA0FEFF '....'
not al ; 0000BAB4 F6D0 '..'
mov [cs:0xfffe],al ; 0000BAB6 2EA2FEFF '....'
cmp al,[cs:0xfffe] ; 0000BABA 2E3A06FEFF '.:...'
jnz xbad3 ; 0000BABF 7512 'u.'
mov di,0x2 ; 0000BAC1 BF0200 '...'
mov bp,0xbaca ; 0000BAC4 BDCABA '...'
jmp x87e4 ; 0000BAC7 E91ACD '...'
and bl,0xbf ; 0000BACA 80E3BF '...'
mov bp,0xbad3 ; 0000BACD BDD3BA '...'
jmp x8796 ; 0000BAD0 E9C3CC
xbad3: cld ; 0000BAD3 FC '.'
mov ax,0xf000 ; 0000BAD4 B800F0 '...'
mov ds,ax ; 0000BAD7 8ED8 '..'
mov al,0xff ; 0000BAD9 B0FF '..'
out 0x21,al ; 0000BADB E621 '.!'
out 0xa1,al ; 0000BADD E6A1 '..'
mov bx,bim_table_offset ; 0000BADF BBE0FF '...'
mov bx,[bx] ; 0000BAE2 8B1F '..'
test word [bx],0xf00 ; 0000BAE4 F707000F '....'
jnz xbaf5 ; 0000BAE8 750B 'u.'
mov bx,cpu_idrev_offset ; 0000BAEA BBE2FF '...'
mov bx,[bx] ; 0000BAED 8B1F '..'
mov ax,[bx] ; 0000BAEF 8B07 '..'
xchg al,ah ; 0000BAF1 86C4 '..'
mov gs,ax ; 0000BAF3 8EE8 '..'
xbaf5: mov al,0xc ; 0000BAF5 B00C '..'
out 0x61,al ; 0000BAF7 E661 '.a'
mov al,0x10 ; 0000BAF9 B010 '..'
out 0x84,al ; 0000BAFB E684 '..'
mov al,0x12 ; 0000BAFD B012 '..'
out 0x4b,al ; 0000BAFF E64B '.K'
mov al,0x42 ; 0000BB01 B042 '.B'
out 0x4b,al ; 0000BB03 E64B '.K'
mov al,0x92 ; 0000BB05 B092 '..'
out 0x4b,al ; 0000BB07 E64B '.K'
xor al,al ; 0000BB09 32C0 '2.'
out 0x8f,al ; 0000BB0B E68F '..'
mov al,0x54 ; 0000BB0D B054 '.T'
out 0x43,al ; 0000BB0F E643 '.C'
mov al,0x12 ; 0000BB11 B012 '..'
out 0x41,al ; 0000BB13 E641 '.A'
mov al,0x36 ; 0000BB15 B036 '.6'
out 0x43,al ; 0000BB17 E643 '.C'
mov al,0x0 ; 0000BB19 B000 '..'
out 0x40,al ; 0000BB1B E640 '.@'
mov al,0x0 ; 0000BB1D B000 '..'
out 0x40,al ; 0000BB1F E640 '.@'
mov al,0xc ; 0000BB21 B00C '..'
mov dx,0x3f2 ; 0000BB23 BAF203 '...'
out dx,al ; 0000BB26 EE '.'
mov al,0x11 ; 0000BB27 B011 '..'
out 0x84,al ; 0000BB29 E684 '..'
mov al,0x1 ; 0000BB2B B001 '..'
mov dx,0x3b8 ; 0000BB2D BAB803 '...'
out dx,al ; 0000BB30 EE '.'
mov al,0x1 ; 0000BB31 B001 '..'
mov dx,0x3d8 ; 0000BB33 BAD803 '...'
out dx,al ; 0000BB36 EE '.'
mov dx,0x3ba ; 0000BB37 BABA03 '...'
in al,dx ; 0000BB3A EC '.'
mov dx,0x3da ; 0000BB3B BADA03 '...'
in al,dx ; 0000BB3E EC '.'
mov dx,0x3c0 ; 0000BB3F BAC003 '...'
xor al,al ; 0000BB42 32C0 '2.'
out dx,al ; 0000BB44 EE '.'
mov bx,0xba77 ; 0000BB45 BB77BA '.w.'
xbb48: mov di,0xbb6e ; 0000BB48 BF6EBB '.n.'
mov al,0x1 ; 0000BB4B B001 '..'
mov dx,[bx] ; 0000BB4D 8B17 '..'
out dx,al ; 0000BB4F EE '.'
mov si,[bx+0x4] ; 0000BB50 8B7704 '.w.'
mov dl,[bx+0x2] ; 0000BB53 8A5702 '.W.'
mov cx,0x12 ; 0000BB56 B91200 '...'
mov bp,0xbb5f ; 0000BB59 BD5FBB '._.'
jmp x9beb ; 0000BB5C E98CE0 '...'
add dx,byte +0x5 ; 0000BB5F 83C205 '...'
cmp dx,0x3d9 ; 0000BB62 81FAD903 '....'
jnz xbb6b ; 0000BB66 7503 'u.'
mov al,0x30 ; 0000BB68 B030 '.0'
out dx,al ; 0000BB6A EE '.'
xbb6b: dec dx ; 0000BB6B 4A 'J'
jmp di ; 0000BB6C FFE7 '..'
mov al,0x12 ; 0000BB6E B012 '..'
out 0x84,al ; 0000BB70 E684 '..'
mov bp,0xbb78 ; 0000BB72 BD78BB '.x.'
jmp x9bfa ; 0000BB75 E982E0
xor cx,cx ; 0000BB78 33C9 '3.'
mov dl,[bx+0x2] ; 0000BB7A 8A5702 '.W.'
mov ah,0xe ; 0000BB7D B40E '..'
mov bp,0xbb85 ; 0000BB7F BD85BB '...'
jmp xad18 ; 0000BB82 E993F1 '...'
add bx,byte +0xf ; 0000BB85 83C30F '...'
cmp bx,0xba95 ; 0000BB88 81FB95BA '....'
jc xbb48 ; 0000BB8C 72BA 'r.'
mov al,0x13 ; 0000BB8E B013 '..'
out 0x84,al ; 0000BB90 E684 '..'
mov cx,0x100 ; 0000BB92 B90001 '...'
xbb95: xor ax,ax ; 0000BB95 33C0 '3.'
loop xbb95 ; 0000BB97 E2FC '..'
mov al,0x0 ; 0000BB99 B000 '..'
out 0x43,al ; 0000BB9B E643 '.C'
in al,0x40 ; 0000BB9D E440 '.@'
mov ah,al ; 0000BB9F 8AE0 '..'
in al,0x40 ; 0000BBA1 E440 '.@'
cmp ax,0x0 ; 0000BBA3 3D0000 '=..'
jnz xbbb6 ; 0000BBA6 750E 'u.'
mov bx,err102 ; 0000BBA8 BB8CB6 '...'
mov cx,err102_len-2 ; 0000BBAB B91800 '...'
mov bp,0xbbb4 ; 0000BBAE BDB4BB '...'
jmp xc7f7 ; 0000BBB1 E9430C '.C.'
xbbb4: jmp short xbbb4 ; 0000BBB4 Hang the machine
xbbb6: mov al,0x14 ; 0000BBB6 B014 '..'
out 0x84,al ; 0000BBB8 E684 '..'
mov al,0x8b ; 0000BBBA B08B '..'
out 0x70,al ; 0000BBBC E670 '.p'
jmp short xbbc0 ; 0000BBBE EB00 '..'
xbbc0: jmp short xbbc2 ; 0000BBC0 EB00 '..'
xbbc2: jmp short xbbc4 ; 0000BBC2 EB00 '..'
xbbc4: in al,0x71 ; 0000BBC4 E471 '.q'
and al,0x7 ; 0000BBC6 2407 '$.'
mov ah,al ; 0000BBC8 8AE0 '..'
mov al,0x8b ; 0000BBCA B08B '..'
out 0x70,al ; 0000BBCC E670 '.p'
mov al,ah ; 0000BBCE 8AC4 '..'
out 0x71,al ; 0000BBD0 E671 '.q'
mov al,0x8c ; 0000BBD2 B08C '..'
out 0x70,al ; 0000BBD4 E670 '.p'
mov al,0x15 ; 0000BBD6 B015 '..'
out 0x84,al ; 0000BBD8 E684 '..'
mov al,0x8d ; 0000BBDA B08D '..'
out 0x70,al ; 0000BBDC E670 '.p'
jmp short xbbe0 ; 0000BBDE EB00 '..'
xbbe0: jmp short xbbe2 ; 0000BBE0 EB00 '..'
xbbe2: jmp short xbbe4 ; 0000BBE2 EB00 '..'
xbbe4: in al,0x71 ; 0000BBE4 E471 '.q'
and al,0x80 ; 0000BBE6 2480 '$.'
mov ah,al ; 0000BBE8 8AE0 '..'
mov al,0x8e ; 0000BBEA B08E '..'
out 0x70,al ; 0000BBEC E670 '.p'
jmp short xbbf0 ; 0000BBEE EB00 '..'
xbbf0: jmp short xbbf2 ; 0000BBF0 EB00 '..'
xbbf2: jmp short xbbf4 ; 0000BBF2 EB00 '..'
xbbf4: in al,0x71 ; 0000BBF4 E471 '.q'
and al,0x80 ; 0000BBF6 2480 '$.'
test ah,0x80 ; 0000BBF8 F6C480 '...'
mov ah,al ; 0000BBFB 8AE0 '..'
jnz xbc06 ; 0000BBFD 7507 'u.'
or ah,0x80 ; 0000BBFF 80CC80 '...'
mov al,0x16 ; 0000BC02 B016 '..'
out 0x84,al ; 0000BC04 E684 '..'
xbc06: mov al,0x17 ; 0000BC06 B017 '..'
out 0x84,al ; 0000BC08 E684 '..'
mov al,0x8e ; 0000BC0A B08E '..'
out 0x70,al ; 0000BC0C E670 '.p'
mov al,ah ; 0000BC0E 8AC4 '..'
out 0x71,al ; 0000BC10 E671 '.q'
mov al,0x18 ; 0000BC12 B018 '..'
out 0x84,al ; 0000BC14 E684 '..'
mov bp,0xbc1c ; 0000BC16 BD1CBC '...'
jmp xb550 ; 0000BC19 E934F9 '.4.'
in al,0x61 ; 0000BC1C E461 '.a'
and al,0xf3 ; 0000BC1E 24F3 '$.'
out 0x61,al ; 0000BC20 E661 '.a'
mov ax,0x30 ; 0000BC22 B83000 '.0.'
mov ss,ax ; 0000BC25 8ED0 '..'
mov sp,0x100 ; 0000BC27 BC0001 '...'
mov al,0x19 ; 0000BC2A B019 '..'
out 0x84,al ; 0000BC2C E684 '..'
call xa8ae ; 0000BC2E E87DEC
mov al,0xad ; 0000BC31 B0AD '..'
out 0x64,al ; 0000BC33 E664 '.d'
mov cx,0xffff ; 0000BC35 B9FFFF '...'
xbc38: in al,0x64 ; 0000BC38 E464 '.d'
test al,0x2 ; 0000BC3A A802 '..'
jz xbc4e ; 0000BC3C 7410 't.'
loop xbc38 ; 0000BC3E E2F8 '..'
mov bx,0xb810 ; 0000BC40 BB10B8 '...'
mov cx,0x1d ; 0000BC43 B91D00 '...'
mov bp,0xbc4c ; 0000BC46 BD4CBC '.L.'
jmp xc7f7 ; 0000BC49 E9AB0B '...'
xbc4c: jmp short xbc4c ; 0000BC4C Hang the machine
xbc4e: mov cx,0x2 ; 0000BC4E B90200 '...'
xbc51: in al,0x60 ; 0000BC51 E460 '.`'
push cx ; 0000BC53 51 'Q'
mov bx,0x1388 ; 0000BC54 BB8813 '...'
call xc638 ; 0000BC57 E8DE09 '...'
pop cx ; 0000BC5A 59 'Y'
in al,0x64 ; 0000BC5B E464 '.d'
test al,0x1 ; 0000BC5D A801 '..'
jz xbc71 ; 0000BC5F 7410 't.'
loop xbc51 ; 0000BC61 E2EE '..'
mov bx,0xb810 ; 0000BC63 BB10B8 '...'
mov cx,0x1d ; 0000BC66 B91D00 '...'
mov bp,0xbc6f ; 0000BC69 BD6FBC '.o.'
jmp xc7f7 ; 0000BC6C E9880B '...'
xbc6f: jmp short xbc6f ; 0000BC6F Hang the machine
xbc71: call xa3e0 ; 0000BC71 E86CE7 '.l.'
call xaa5a ; 0000BC74 E8E3ED '...'
mov al,0x1a ; 0000BC77 B01A '..'
out 0x84,al ; 0000BC79 E684 '..'
call xaa74 ; 0000BC7B E8F6ED '...'
mov al,0x1b ; 0000BC7E B01B '..'
out 0x84,al ; 0000BC80 E684 '..'
call x82e8 ; 0000BC82 E863C6 '.c.'
mov al,0x1c ; 0000BC85 B01C '..'
out 0x84,al ; 0000BC87 E684 '..'
call xcc51 ; 0000BC89 E8C50F '...'
mov al,0x1d ; 0000BC8C B01D '..'
out 0x84,al ; 0000BC8E E684 '..'
call xcc88 ; 0000BC90 E8F50F '...'
mov al,0x2d ; 0000BC93 B02D '.-'
out 0x84,al ; 0000BC95 E684 '..'
call xe105 ; 0000BC97 E86B24
mov al,0x1e ; 0000BC9A B01E '..'
out 0x84,al ; 0000BC9C E684 '..'
call xcfdd ; 0000BC9E E83C13 '.<.'
mov al,0x1f ; 0000BCA1 B01F '..'
out 0x84,al ; 0000BCA3 E684 '..'
call xf745 ; 0000BCA5 E89D3A '..:'
mov al,0x20 ; 0000BCA8 B020 '. '
out 0x84,al ; 0000BCAA E684 '..'
call xd6dd ; 0000BCAC E82E1A '...'
;
; Switch to protected-mode, relocate the ROM, switch back to real-mode, disable
; the A20 line, and then initialize all conventional RAM.
;
call xc825 ; 0000BCAF E8730B
call xf480 ; 0000BCB2 E8CB37
call xe7df ; 0000BCB5 E8272B
sti ; 0000BCB8 FB '.'
mov al,0x21 ; 0000BCB9 B021 '.!'
out 0x84,al ; 0000BCBB E684 '..'
call xcd6d ; 0000BCBD E8AD10 '...'
mov al,0x23 ; 0000BCC0 B023 '.#'
out 0x84,al ; 0000BCC2 E684 '..'
call xcedb ; 0000BCC4 E81412 '...'
mov al,0x22 ; 0000BCC7 B022 '."'
out 0x84,al ; 0000BCC9 E684 '..'
call xce71 ; 0000BCCB E8A311 '...'
mov di,0x0 ; 0000BCCE BF0000 '...'
mov bp,0xbcd7 ; 0000BCD1 BDD7BC '...'
jmp x87e4 ; 0000BCD4 E90DCB '.',0x0D,'.'
and bl,0xc0 ; 0000BCD7 80E3C0 '...'
cmp bl,0x40 ; 0000BCDA 80FB40 '..@'
jnz xbce9 ; 0000BCDD 750A 'u',0x0A
mov al,0xbe ; 0000BCDF B0BE '..'
out 0x84,al ; 0000BCE1 E684 '..'
mov bp,0xbce9 ; 0000BCE3 BDE9BC '...'
jmp x8814 ; 0000BCE6 E92BCB '.+.'
xbce9: mov al,0x24 ; 0000BCE9 B024 '.$'
out 0x84,al ; 0000BCEB E684 '..'
in al,0x60 ; 0000BCED E460 '.`'
mov al,0xd0 ; 0000BCEF B0D0 '..'
out 0x64,al ; 0000BCF1 E664 '.d'
xbcf3: in al,0x64 ; 0000BCF3 E464 '.d'
test al,0x2 ; 0000BCF5 A802 '..'
jz xbcfb ; 0000BCF7 7402 't.'
jmp short xbcf3 ; 0000BCF9 EBF8 '..'
xbcfb: in al,0x64 ; 0000BCFB E464 '.d'
test al,0x1 ; 0000BCFD A801 '..'
jz xbcfb ; 0000BCFF 74FA 't.'
in al,0x60 ; 0000BD01 E460 '.`'
and al,0xfd ; 0000BD03 24FD '$.'
and al,0xf3 ; 0000BD05 24F3 '$.'
mov ah,al ; 0000BD07 8AE0 '..'
mov al,0xd1 ; 0000BD09 B0D1 '..'
out 0x64,al ; 0000BD0B E664 '.d'
xbd0d: in al,0x64 ; 0000BD0D E464 '.d'
test al,0x2 ; 0000BD0F A802 '..'
jnz xbd0d ; 0000BD11 75FA 'u.'
mov al,ah ; 0000BD13 8AC4 '..'
out 0x60,al ; 0000BD15 E660 '.`'
mov al,0x25 ; 0000BD17 B025 '.%'
out 0x84,al ; 0000BD19 E684 '..'
call x91b0 ; 0000BD1B E892D4 '...'
mov al,0x26 ; 0000BD1E B026 '.&'
out 0x84,al ; 0000BD20 E684 '..'
call xc390 ; 0000BD22 E86B06 '.k.'
mov al,0x27 ; 0000BD25 B027 '.',0x27
out 0x84,al ; 0000BD27 E684 '..'
mov al,0xec ; 0000BD29 B0EC '..'
mov dx,0x3be ; 0000BD2B BABE03 '...'
out dx,al ; 0000BD2E EE '.'
mov al,0x28 ; 0000BD2F B028 '.('
out 0x84,al ; 0000BD31 E684 '..'
call x99b7 ; 0000BD33 E881DC '...'
mov al,0x29 ; 0000BD36 B029 '.)'
out 0x84,al ; 0000BD38 E684 '..'
call xe2c8 ; 0000BD3A E88B25 '..%'
mov al,0x2a ; 0000BD3D B02A '.*'
out 0x84,al ; 0000BD3F E684 '..'
mov ah,0xf ; 0000BD41 B40F '..'
int 0x10 ; 0000BD43 CD10 '..'
mov ah,0x0 ; 0000BD45 B400 '..'
int 0x10 ; 0000BD47 CD10 '..'
in al,0x61 ; 0000BD49 E461 '.a'
mov ah,al ; 0000BD4B 8AE0 '..'
or al,0x6c ; 0000BD4D 0C6C '.l'
out 0x61,al ; 0000BD4F E661 '.a'
xchg ah,al ; 0000BD51 86E0 '..'
out 0x61,al ; 0000BD53 E661 '.a'
mov al,0x2b ; 0000BD55 B02B '.+'
out 0x84,al ; 0000BD57 E684 '..'
mov al,0xe ; 0000BD59 B00E '..'
call xb544 ; 0000BD5B E8E6F7 '...'
test al,0x4 ; 0000BD5E A804 '..'
jz xbd6e ; 0000BD60 740C 't.'
mov dx,0x2000 ; 0000BD62 BA0020 '.. '
mov bx,0xb929 ; 0000BD65 BB29B9 '.).'
mov cx,0x1a ; 0000BD68 B91A00 '...'
call xc745 ; 0000BD6B E8D709 '...'
xbd6e: in al,0xa1 ; 0000BD6E E4A1 '..'
and al,0xfd ; 0000BD70 24FD '$.'
out 0xa1,al ; 0000BD72 E6A1 '..'
in al,0x21 ; 0000BD74 E421 '.!'
and al,0xfb ; 0000BD76 24FB '$.'
out 0x21,al ; 0000BD78 E621 '.!'
mov ax,0x40 ; 0000BD7A B84000 '.@.'
mov ds,ax ; 0000BD7D 8ED8 '..'
mov byte [0x12],0x0 ; 0000BD7F C606120000 '.....'
or byte [0x96],0x80 ; 0000BD84 800E960080 '.....'
or byte [0x96],0x20 ; 0000BD89 800E960020 '.... '
cli ; 0000BD8E FA '.'
call xec2e_wait_8042_ready ; 0000BD8F E89C2E '...'
mov al,0xf2 ; 0000BD92 B0F2 '..'
out 0x60,al ; 0000BD94 E660 '.`'
sti ; 0000BD96 FB '.'
mov cx,0xffff ; 0000BD97 B9FFFF '...'
test byte [0x96],0x20 ; 0000BD9A F606960020 '.... '
jz xbda8 ; 0000BD9F 7407 't.'
db 0xE2,0xF7
mov byte [0x96],0x0 ; 0000BDA3 C606960000 '.....'
xbda8: in al,0x86 ; 0000BDA8 E486 '..'
cmp word [0x72],0x1234 ; 0000BDAA 813E72003412 '.>r.4.'
jz xbdcd ; 0000BDB0 741B 't.'
mov al,0x40 ; 0000BDB2 B040 '.@'
push ax ; 0000BDB4 50 'P'
call xf30f ; 0000BDB5 E85735 '.W5'
or al,al ; 0000BDB8 0AC0 0x0A,'.'
pop ax ; 0000BDBA 58 'X'
jnz xbdbf ; 0000BDBB 7502 'u.'
or al,0x80 ; 0000BDBD 0C80 '..'
xbdbf: out 0x86,al ; 0000BDBF E686 '..'
call xf32b ; 0000BDC1 E86735 '.g5'
mov al,0x92 ; 0000BDC4 B092 '..'
out 0x4b,al ; 0000BDC6 E64B '.K'
call xc79e ; 0000BDC8 E8D309 '...'
jmp short xbe04 ; 0000BDCB EB37 '.7'
xbdcd: test al,0x40 ; 0000BDCD A840 '.@'
jnz xbdd5 ; 0000BDCF 7504 'u.'
test al,0x80 ; 0000BDD1 A880 '..'
jnz xbddc ; 0000BDD3 7507 'u.'
xbdd5: call xc79e ; 0000BDD5 E8C609 '...'
mov al,0x0 ; 0000BDD8 B000 '..'
jmp short xbded ; 0000BDDA EB11 '..'
xbddc: and al,0x3f ; 0000BDDC 243F '$?'
cmp al,0x0 ; 0000BDDE 3C00 '<.'
jc xbde8 ; 0000BDE0 7206 'r.'
cmp al,0x34 ; 0000BDE2 3C34 '<4'
ja xbde8 ; 0000BDE4 7702 'w.'
jmp short xbded ; 0000BDE6 EB05 '..'
xbde8: call xc79e ; 0000BDE8 E8B309 '...'
mov al,0x0 ; 0000BDEB B000 '..'
xbded: push ax ; 0000BDED 50 'P'
call xf32b ; 0000BDEE E83A35 '.:5'
cli ; 0000BDF1 FA '.'
mov al,0x92 ; 0000BDF2 B092 '..'
out 0x4b,al ; 0000BDF4 E64B '.K'
pop ax ; 0000BDF6 58 'X'
cmp al,0x0 ; 0000BDF7 3C00 '<.'
jz xbdfd ; 0000BDF9 7402 't.'
out 0x4a,al ; 0000BDFB E64A '.J'
xbdfd: mov word [0x72],0x1200 ; 0000BDFD C70672000012 '..r...'
sti ; 0000BE03 FB '.'
xbe04: call xc79e ; 0000BE04 E89709 '...'
mov al,0x2c ; 0000BE07 B02C '.,'
out 0x84,al ; 0000BE09 E684 '..'
call xf130 ; 0000BE0B E82233 '."3'
int 0x19 ; 0000BE0E CD19 '..'
xbe10: mov al,ah ; 0000BE10 8AC4 '..'
and al,0x7f ; 0000BE12 247F '$.'
push cs ; 0000BE14 0E '.'
pop es ; 0000BE15 07 '.'
push di ; 0000BE16 57 'W'
mov di,0xbf5c ; 0000BE17 BF5CBF '.\.'
mov cx,0x8 ; 0000BE1A B90800 '...'
repne scasb ; 0000BE1D F2AE '..'
pop di ; 0000BE1F 5F '_'
clc ; 0000BE20 F8 '.'
jz xbe26 ; 0000BE21 7403 't.'
jmp xbf5b ; 0000BE23 E93501 '.5.'
xbe26: cmp ah,0x2a ; 0000BE26 80FC2A '..*'
jnz xbe35 ; 0000BE29 750A 'u',0x0A
test byte [0x96],0x2 ; 0000BE2B F606960002 '.....'
jz xbe35 ; 0000BE30 7403 't.'
jmp xbf5a ; 0000BE32 E92501 '.%.'
xbe35: mov bx,0x1000 ; 0000BE35 BB0010 '...'
rol bx,cl ; 0000BE38 D3C3 '..'
or ah,ah ; 0000BE3A 0AE4 0x0A,'.'
jns xbeb9 ; 0000BE3C 797B 'y{'
cmp ah,0xaa ; 0000BE3E 80FCAA '...'
jz xbe48 ; 0000BE41 7405 't.'
cmp ah,0xb6 ; 0000BE43 80FCB6 '...'
jnz xbe52 ; 0000BE46 750A 'u',0x0A
xbe48: test byte [0x96],0x2 ; 0000BE48 F606960002 '.....'
jz xbe52 ; 0000BE4D 7403 't.'
jmp xbf5a ; 0000BE4F E90801 '...'
xbe52: not bx ; 0000BE52 F7D3 '..'
cmp ah,0xb8 ; 0000BE54 80FCB8 '...'
jnz xbe81 ; 0000BE57 7528 'u('
test byte [0x96],0x2 ; 0000BE59 F606960002 '.....'
jz xbe73 ; 0000BE5E 7413 't.'
and byte [0x96],0xf7 ; 0000BE60 80269600F7 '.&...'
and byte [0x96],0xfd ; 0000BE65 80269600FD '.&...'
test byte [0x18],0x2 ; 0000BE6A F606180002 '.....'
jz xbeb3 ; 0000BE6F 7442 'tB'
jmp short xbeb7 ; 0000BE71 EB44 '.D'
xbe73: and byte [0x18],0xfd ; 0000BE73 80261800FD '.&...'
test byte [0x96],0x8 ; 0000BE78 F606960008 '.....'
jz xbeb3 ; 0000BE7D 7434 't4'
jmp short xbeb7 ; 0000BE7F EB36 '.6'
xbe81: cmp ah,0x9d ; 0000BE81 80FC9D '...'
jnz xbeb3 ; 0000BE84 752D 'u-'
test byte [0x96],0x1 ; 0000BE86 F606960001 '.....'
jnz xbeb7 ; 0000BE8B 752A 'u*'
test byte [0x96],0x2 ; 0000BE8D F606960002 '.....'
jz xbea7 ; 0000BE92 7413 't.'
and byte [0x96],0xfb ; 0000BE94 80269600FB '.&...'
and byte [0x96],0xfd ; 0000BE99 80269600FD '.&...'
test byte [0x18],0x1 ; 0000BE9E F606180001 '.....'
jz xbeb3 ; 0000BEA3 740E 't.'
jmp short xbeb7 ; 0000BEA5 EB10 '..'
xbea7: and byte [0x18],0xfe ; 0000BEA7 80261800FE '.&...'
test byte [0x96],0x4 ; 0000BEAC F606960004 '.....'
jnz xbeb7 ; 0000BEB1 7504 'u.'
xbeb3: and [0x17],bx ; 0000BEB3 211E1700 '!...'
xbeb7: stc ; 0000BEB7 F9 '.'
ret ; 0000BEB8 C3 '.'
xbeb9: cmp ah,0x38 ; 0000BEB9 80FC38 '..8'
jnz xbedd ; 0000BEBC 751F 'u.'
test byte [0x96],0x2 ; 0000BEBE F606960002 '.....'
jz xbed1 ; 0000BEC3 740C 't.'
or byte [0x96],0x8 ; 0000BEC5 800E960008 '.....'
and byte [0x96],0xfd ; 0000BECA 80269600FD '.&...'
jmp short xbed6 ; 0000BECF EB05 '..'
xbed1: or byte [0x18],0x2 ; 0000BED1 800E180002 '.....'
xbed6: or byte [0x17],0x8 ; 0000BED6 800E170008 '.....'
stc ; 0000BEDB F9 '.'
ret ; 0000BEDC C3 '.'
xbedd: cmp ah,0x1d ; 0000BEDD 80FC1D '...'
jnz xbf08 ; 0000BEE0 7526 'u&'
test byte [0x96],0x1 ; 0000BEE2 F606960001 '.....'
jnz xbf06 ; 0000BEE7 751D 'u.'
test byte [0x96],0x2 ; 0000BEE9 F606960002 '.....'
jz xbefc ; 0000BEEE 740C 't.'
or byte [0x96],0x4 ; 0000BEF0 800E960004 '.....'
and byte [0x96],0xfd ; 0000BEF5 80269600FD '.&...'
jmp short xbf01 ; 0000BEFA EB05 '..'
xbefc: or byte [0x18],0x1 ; 0000BEFC 800E180001 '.....'
xbf01: or byte [0x17],0x4 ; 0000BF01 800E170004 '.....'
xbf06: stc ; 0000BF06 F9 '.'
ret ; 0000BF07 C3 '.'
xbf08: test [0x17],bx ; 0000BF08 851E1700 '....'
jnz xbf55 ; 0000BF0C 7547 'uG'
or [0x17],bx ; 0000BF0E 091E1700 '....'
test byte [0x17],0x4 ; 0000BF12 F606170004 '.....'
jnz xbf55 ; 0000BF17 753C 'u<'
cmp ah,0x52 ; 0000BF19 80FC52 '..R'
jnz xbf51 ; 0000BF1C 7533 'u3'
test byte [0x17],0x8 ; 0000BF1E F606170008 '.....'
jnz xbf5b ; 0000BF23 7536 'u6'
test byte [0x17],0x3 ; 0000BF25 F606170003 '.....'
jz xbf3c ; 0000BF2A 7410 't.'
test byte [0x96],0x2 ; 0000BF2C F606960002 '.....'
jnz xbf4a ; 0000BF31 7517 'u.'
test byte [0x17],0x20 ; 0000BF33 F606170020 '.... '
jz xbf4a ; 0000BF38 7410 't.'
jmp short xbf51 ; 0000BF3A EB15 '..'
xbf3c: test byte [0x96],0x2 ; 0000BF3C F606960002 '.....'
jnz xbf51 ; 0000BF41 750E 'u.'
test byte [0x17],0x20 ; 0000BF43 F606170020 '.... '
jz xbf51 ; 0000BF48 7407 't.'
xbf4a: and byte [0x18],0x7f ; 0000BF4A 802618007F '.&...'
jmp short xbf55 ; 0000BF4F EB04 '..'
xbf51: xor [0x17],bh ; 0000BF51 303E1700 '0>..'
xbf55: cmp ah,0x52 ; 0000BF55 80FC52 '..R'
jz xbf5b ; 0000BF58 7401 't.'
xbf5a: stc ; 0000BF5A F9 '.'
xbf5b: ret ; 0000BF5B C3 '.'
cmp [di],bl ; 0000BF5C 381D '8.'
sub dh,[0x3a52] ; 0000BF5E 2A36523A '*6R:'
inc bp ; 0000BF62 45 'E'
inc si ; 0000BF63 46 'F'
xbf64: test byte [0x18],0x4 ; 0000BF64 F606180004 '.....'
jnz xbf79 ; 0000BF69 750E 'u.'
or byte [0x18],0x4 ; 0000BF6B 800E180004 '.....'
mov ax,0x8500 ; 0000BF70 B80085 '...'
xbf73: call xeb0c ; 0000BF73 E8962B '..+'
int 0x15 ; 0000BF76 CD15 '..'
inc bp ; 0000BF78 45 'E'
xbf79: stc ; 0000BF79 F9 '.'
ret ; 0000BF7A C3 '.'
xbf7b: and byte [0x18],0xfb ; 0000BF7B 80261800FB '.&...'
mov ax,0x8501 ; 0000BF80 B80185 '...'
jmp short xbf73 ; 0000BF83 EBEE '..'
xbf85: mov bx,0x7d ; 0000BF85 BB7D00 '.}.'
call xc7db ; 0000BF88 E85008 '.P.'
stc ; 0000BF8B F9 '.'
ret ; 0000BF8C C3 '.'
mov ah,0xf0 ; 0000BF8D B4F0 '..'
mov al,0x3 ; 0000BF8F B003 '..'
pushf ; 0000BF91 9C '.'
push cs ; 0000BF92 0E '.'
call xe82e ; 0000BF93 E89828 '..('
mov ah,0xf1 ; 0000BF96 B4F1 '..'
pushf ; 0000BF98 9C '.'
push cs ; 0000BF99 0E '.'
call xe82e ; 0000BF9A E89128 '..('
cmp al,0xff ; 0000BF9D 3CFF '<.'
jz 0xbfc1 ; 0000BF9F 7420 't '
mov bx,0x7d ; 0000BFA1 BB7D00 '.}.'
push ax ; 0000BFA4 50 'P'
call xc7db ; 0000BFA5 E83308 '.3.'
pop ax ; 0000BFA8 58 'X'
cmp al,0x0 ; 0000BFA9 3C00 '<.'
jz xbfc1 ; 0000BFAB 7414 't.'
cmp al,0x1 ; 0000BFAD 3C01 '<.'
jz xbfc1 ; 0000BFAF 7410 't.'
cmp al,0x9 ; 0000BFB1 3C09 '<.'
jz xbfc1 ; 0000BFB3 740C 't.'
mov bx,0x7d ; 0000BFB5 BB7D00 '.}.'
call xc638 ; 0000BFB8 E87D06 '.}.'
mov bx,0x7d ; 0000BFBB BB7D00 '.}.'
call xc7db ; 0000BFBE E81A08 '...'
xbfc1: stc ; 0000BFC1 F9 '.'
ret ; 0000BFC2 C3 '.'
xbfc3: cmp ah,0xff ; 0000BFC3 80FCFF '...'
jnz xbfca ; 0000BFC6 7502 'u.'
jmp short xbf85 ; 0000BFC8 EBBB '..'
xbfca: cmp ah,0x54 ; 0000BFCA 80FC54 '..T'
jnz xbfd1 ; 0000BFCD 7502 'u.'
jmp short xbf64 ; 0000BFCF EB93 '..'
xbfd1: cmp ah,0xd4 ; 0000BFD1 80FCD4 '...'
jnz xbfd8 ; 0000BFD4 7502 'u.'
jmp short xbf7b ; 0000BFD6 EBA3 '..'
xbfd8: cmp ah,0x45 ; 0000BFD8 80FC45 '..E'
jnz xbfe0 ; 0000BFDB 7503 'u.'
jmp short xc02e ; 0000BFDD EB4F '.O'
nop ; 0000BFDF 90 '.'
xbfe0: cmp ah,0xb8 ; 0000BFE0 80FCB8 '...'
jnz xbfe8 ; 0000BFE3 7503 'u.'
jmp xc07f ; 0000BFE5 E99700 '...'
xbfe8: cmp ah,0x37 ; 0000BFE8 80FC37 '..7'
jnz xbff0 ; 0000BFEB 7503 'u.'
jmp xc09b ; 0000BFED E9AB00 '...'
xbff0: cmp ah,0x52 ; 0000BFF0 80FC52 '..R'
jnz xbff8 ; 0000BFF3 7503 'u.'
jmp xc0cb ; 0000BFF5 E9D300 '...'
xbff8: cmp ah,0x46 ; 0000BFF8 80FC46 '..F'
jnz xc000 ; 0000BFFB 7503 'u.'
jmp xc0d6 ; 0000BFFD E9D600 '...'
xc000: call xc24c ; 0000C000 E84902 '.I.'
jz xc02c ; 0000C003 7427 't',0x27
cmp ah,[0x15] ; 0000C005 3A261500 ':&..'
jz xc07d ; 0000C009 7472 'tr'
cmp ah,0x53 ; 0000C00B 80FC53 '..S'
jnz xc013 ; 0000C00E 7503 'u.'
jmp xc093 ; 0000C010 E98000 '...'
xc013: cmp ah,0xc ; 0000C013 80FC0C '...'
jz xc090 ; 0000C016 7478 'tx'
cmp ah,0x33 ; 0000C018 80FC33 '..3'
jnz xc022 ; 0000C01B 7505 'u.'
mov al,0x0 ; 0000C01D B000 '..'
jmp xc11e ; 0000C01F E9FC00 '...'
xc022: cmp ah,0x34 ; 0000C022 80FC34 '..4'
jnz xc02c ; 0000C025 7505 'u.'
mov al,0x1 ; 0000C027 B001 '..'
jmp xc11e ; 0000C029 E9F200 '...'
xc02c: clc ; 0000C02C F8 '.'
ret ; 0000C02D C3 '.'
xc02e: test byte [0x96],0x1 ; 0000C02E F606960001 '.....'
jnz xc04f ; 0000C033 751A 'u.'
test byte [0x17],0x4 ; 0000C035 F606170004 '.....'
jz xc02c ; 0000C03A 74F0 't.'
test byte [0x17],0x8 ; 0000C03C F606170008 '.....'
jz xc046 ; 0000C041 7403 't.'
jmp xc0e4 ; 0000C043 E99E00 '...'
xc046: test byte [0x96],0x10 ; 0000C046 F606960010 '.....'
jnz xc02c ; 0000C04B 75DF 'u.'
jmp short xc054 ; 0000C04D EB05 '..'
xc04f: and byte [0x96],0xfe ; 0000C04F 80269600FE '.&...'
xc054: or byte [0x18],0x8 ; 0000C054 800E180008 '.....'
cli ; 0000C059 FA '.'
call xeb0c ; 0000C05A E8AF2A '..*'
inc bp ; 0000C05D 45 'E'
sti ; 0000C05E FB '.'
cmp byte [0x49],0x2 ; 0000C05F 803E490002 '.>I..'
jz xc06d ; 0000C064 7407 't.'
cmp byte [0x49],0x3 ; 0000C066 803E490003 '.>I..'
jnz xc076 ; 0000C06B 7509 'u.'
xc06d: push ax ; 0000C06D 50 'P'
mov ax,0xbf05 ; 0000C06E B805BF '...'
mov bl,0x1 ; 0000C071 B301 '..'
int 0x10 ; 0000C073 CD10 '..'
pop ax ; 0000C075 58 'X'
xc076: test byte [0x18],0x8 ; 0000C076 F606180008 '.....'
jnz xc076 ; 0000C07B 75F9 'u.'
xc07d: stc ; 0000C07D F9 '.'
ret ; 0000C07E C3 '.'
xc07f: push ax ; 0000C07F 50 'P'
xor ax,ax ; 0000C080 33C0 '3.'
xchg al,[0x19] ; 0000C082 86061900 '....'
test al,al ; 0000C086 84C0 '..'
jz xc08d ; 0000C088 7403 't.'
call xd3b4 ; 0000C08A E82713 '.',0x27,'.'
xc08d: pop ax ; 0000C08D 58 'X'
jmp short xc02c ; 0000C08E EB9C '..'
xc090: jmp xb673 ; 0000C090 E9E0F5 '...'
xc093: cli ; 0000C093 FA '.'
call xeb0c ; 0000C094 E8752A '.u*'
sti ; 0000C097 FB '.'
jmp xea81 ; 0000C098 E9E629
xc09b: test byte [0x96],0x10 ; 0000C09B F606960010 '.....'
jz xc0b7 ; 0000C0A0 7415 't.'
test byte [0x96],0x2 ; 0000C0A2 F606960002 '.....'
jz xc0be ; 0000C0A7 7415 't.'
test byte [0x17],0x4 ; 0000C0A9 F606170004 '.....'
jnz xc0be ; 0000C0AE 750E 'u.'
and byte [0x96],0xfd ; 0000C0B0 80269600FD '.&...'
jmp short xc0c1 ; 0000C0B5 EB0A '.',0x0A
xc0b7: test byte [0x17],0x3 ; 0000C0B7 F606170003 '.....'
jnz xc0c1 ; 0000C0BC 7503 'u.'
xc0be: jmp xc02c ; 0000C0BE E96BFF '.k.'
xc0c1: cli ; 0000C0C1 FA '.'
call xeb0c ; 0000C0C2 E8472A '.G*'
inc bp ; 0000C0C5 45 'E'
int 0x5 ; 0000C0C6 CD05 '..'
sti ; 0000C0C8 FB '.'
stc ; 0000C0C9 F9 '.'
ret ; 0000C0CA C3 '.'
xc0cb: test byte [0x18],0x80 ; 0000C0CB F606180080 '.....'
jz xc0d4 ; 0000C0D0 7402 't.'
stc ; 0000C0D2 F9 '.'
ret ; 0000C0D3 C3 '.'
xc0d4: clc ; 0000C0D4 F8 '.'
ret ; 0000C0D5 C3 '.'
xc0d6: test byte [0x17],0x4 ; 0000C0D6 F606170004 '.....'
jz xc0d4 ; 0000C0DB 74F7 't.'
test byte [0x17],0x8 ; 0000C0DD F606170008 '.....'
jz xc0d4 ; 0000C0E2 74F0 't.'
xc0e4: mov al,0xf2 ; 0000C0E4 B0F2 '..'
jmp xc17f ; 0000C0E6 E99600 '...'
xc0e9: test byte [0x17],0x4 ; 0000C0E9 F606170004 '.....'
jz xc0d4 ; 0000C0EE 74E4 't.'
test byte [0x17],0x8 ; 0000C0F0 F606170008 '.....'
jnz xc0d4 ; 0000C0F5 75DD 'u.'
test byte [0x96],0x10 ; 0000C0F7 F606960010 '.....'
jz xc10a ; 0000C0FC 740C 't.'
test byte [0x96],0x2 ; 0000C0FE F606960002 '.....'
jz xc0d4 ; 0000C103 74CF 't.'
and byte [0x96],0xfd ; 0000C105 80269600FD '.&...'
xc10a: or byte [0x71],0x80 ; 0000C10A 800E710080 '..q..'
call xc259 ; 0000C10F E84701 '.G.'
cli ; 0000C112 FA '.'
call xeb0c ; 0000C113 E8F629 '..)'
inc bp ; 0000C116 45 'E'
sti ; 0000C117 FB '.'
int 0x1b ; 0000C118 CD1B '..'
xor ax,ax ; 0000C11A 33C0 '3.'
jmp short xc183 ; 0000C11C EB65 '.e'
xc11e: mov ah,0xbf ; 0000C11E B4BF '..'
int 0x10 ; 0000C120 CD10 '..'
xor bp,bp ; 0000C122 33ED '3.'
stc ; 0000C124 F9 '.'
ret ; 0000C125 C3 '.'
jmp xc02c ; 0000C126 E903FF '...'
xc129: or ah,ah ; 0000C129 0AE4 0x0A,'.'
js xc160 ; 0000C12B 7833 'x3'
cmp ah,0x3b ; 0000C12D 80FC3B '..;'
jl xc160 ; 0000C130 7C2E '|.'
cmp ah,0x44 ; 0000C132 80FC44 '..D'
jng xc162 ; 0000C135 7E2B '~+'
cmp ah,0x57 ; 0000C137 80FC57 '..W'
jz xc141 ; 0000C13A 7405 't.'
cmp ah,0x58 ; 0000C13C 80FC58 '..X'
jnz xc160 ; 0000C13F 751F 'u.'
xc141: mov al,0x34 ; 0000C141 B034 '.4'
test byte [0x17],0x8 ; 0000C143 F606170008 '.....'
jnz xc17f ; 0000C148 7535 'u5'
mov al,0x32 ; 0000C14A B032 '.2'
test byte [0x17],0x4 ; 0000C14C F606170004 '.....'
jnz xc17f ; 0000C151 752C 'u,'
mov al,0x30 ; 0000C153 B030 '.0'
test byte [0x17],0x3 ; 0000C155 F606170003 '.....'
jnz xc17f ; 0000C15A 7523 'u#'
mov al,0x2e ; 0000C15C B02E '..'
jmp short xc17f ; 0000C15E EB1F '..'
xc160: clc ; 0000C160 F8 '.'
ret ; 0000C161 C3 '.'
xc162: mov al,0x2d ; 0000C162 B02D '.-'
test byte [0x17],0x8 ; 0000C164 F606170008 '.....'
jnz xc17f ; 0000C169 7514 'u.'
mov al,0x23 ; 0000C16B B023 '.#'
test byte [0x17],0x4 ; 0000C16D F606170004 '.....'
jnz xc17f ; 0000C172 750B 'u.'
mov al,0x19 ; 0000C174 B019 '..'
test byte [0x17],0x3 ; 0000C176 F606170003 '.....'
jnz xc17f ; 0000C17B 7502 'u.'
xor al,al ; 0000C17D 32C0 '2.'
xc17f: add ah,al ; 0000C17F 02E0 '..'
xor al,al ; 0000C181 32C0 '2.'
xc183: call xd3b4 ; 0000C183 E82E12 '...'
stc ; 0000C186 F9 '.'
ret ; 0000C187 C3 '.'
xc188: or ah,ah ; 0000C188 0AE4 0x0A,'.'
js xc19b ; 0000C18A 780F 'x.'
mov al,ah ; 0000C18C 8AC4 '..'
cmp al,0x47 ; 0000C18E 3C47 '<G'
jl xc196 ; 0000C190 7C04 '|.'
cmp al,0x53 ; 0000C192 3C53 '<S'
jng xc19d ; 0000C194 7E07 '~.'
xc196: mov byte [0x19],0x0 ; 0000C196 C606190000 '.....'
xc19b: clc ; 0000C19B F8 '.'
ret ; 0000C19C C3 '.'
xc19d: mov al,ah ; 0000C19D 8AC4 '..'
sub al,0x47 ; 0000C19F 2C47 ',G'
mov bx,0x9b81 ; 0000C1A1 BB819B '...'
cs xlatb ; 0000C1A4 2ED7 '..'
test byte [0x17],0x8 ; 0000C1A6 F606170008 '.....'
jnz xc202 ; 0000C1AB 7555 'uU'
mov si,0x9b8e ; 0000C1AD BE8E9B '...'
test byte [0x17],0x4 ; 0000C1B0 F606170004 '.....'
jnz xc1f9 ; 0000C1B5 7542 'uB'
test byte [0x17],0x3 ; 0000C1B7 F606170003 '.....'
jnz xc1f0 ; 0000C1BC 7532
test byte [0x17],0x20 ; 0000C1BE F606170020 '.... '
jnz xc1db ; 0000C1C3 7516 'u.'
test byte [0x96],0x2 ; 0000C1C5 F606960002 '.....'
jnz xc1d9 ; 0000C1CA 750D 'u',0x0D
xc1cc: cmp al,0x2e ; 0000C1CC 3C2E '<.'
jl xc1db ; 0000C1CE 7C0B '|.'
cmp ah,0x4c ; 0000C1D0 80FC4C '..L'
jnz xc1d9 ; 0000C1D3 7504 'u.'
mov al,0xf0 ; 0000C1D5 B0F0 '..'
jmp short xc1db ; 0000C1D7 EB02 '..'
xc1d9: xor al,al ; 0000C1D9 32C0 '2.'
xc1db: test byte [0x96],0x2 ; 0000C1DB F606960002 '.....'
jz xc1e9 ; 0000C1E0 7407 't.'
and byte [0x96],0xfd ; 0000C1E2 80269600FD '.&...'
mov al,0xe0 ; 0000C1E7 B0E0 '..'
xc1e9: call xd3b4 ; 0000C1E9 E8C811 '...'
xc1ec: xor al,al ; 0000C1EC 32C0 '2.'
jmp short xc233 ; 0000C1EE EB43 '.C'
xc1f0: test byte [0x17],0x20 ; 0000C1F0 F606170020 '.... '
jnz xc1cc ; 0000C1F5 75D5 'u.'
jmp short xc1db ; 0000C1F7 EBE2 '..'
xc1f9: call x9b08 ; 0000C1F9 E80CD9 '...'
mov ah,al ; 0000C1FC 8AE0 '..'
jc xc1d9 ; 0000C1FE 72D9 'r.'
jmp short xc236 ; 0000C200 EB34 '.4'
xc202: test byte [0x96],0x2 ; 0000C202 F606960002 '.....'
jnz xc238 ; 0000C207 752F 'u/'
cmp al,0x2e ; 0000C209 3C2E '<.'
jz xc196 ; 0000C20B 7489 't.'
cmp al,0x2b ; 0000C20D 3C2B '<+'
jnz xc21b ; 0000C20F 750A 'u',0x0A
call xc24c ; 0000C211 E83800 '.8.'
jnz xc1ec ; 0000C214 75D6 'u.'
mov ax,0x4ef0 ; 0000C216 B8F04E '..N'
jmp short xc1e9 ; 0000C219 EBCE '..'
xc21b: cmp al,0x2d ; 0000C21B 3C2D '<-'
jnz xc229 ; 0000C21D 750A 'u',0x0A
call xc24c ; 0000C21F E82A00 '.*.'
jnz xc1ec ; 0000C222 75C8 'u.'
mov ax,0x4af0 ; 0000C224 B8F04A '..J'
jmp short xc1e9 ; 0000C227 EBC0 '..'
xc229: sub al,0x30 ; 0000C229 2C30 ',0'
jl xc1ec ; 0000C22B 7CBF '|.'
mov ah,[0x19] ; 0000C22D 8A261900 '.&..'
aad ; 0000C231 D50A '.',0x0A
xc233: mov [0x19],al ; 0000C233 A21900 '...'
xc236: stc ; 0000C236 F9 '.'
ret ; 0000C237 C3 '.'
xc238: and byte [0x96],0xfd ; 0000C238 80269600FD '.&...'
mov si,0x9bb8 ; 0000C23D BEB89B '...'
jmp short xc1f9 ; 0000C240 EBB7 '..'
xc242: mov si,[0x1a] ; 0000C242 8B361A00 '.6..'
cmp si,[0x1c] ; 0000C246 3B361C00 ';6..'
lodsw ; 0000C24A AD '.'
ret ; 0000C24B C3 '.'
xc24c: test byte [0x17],0x8 ; 0000C24C F606170008 '.....'
jz xc258 ; 0000C251 7405 't.'
test byte [0x17],0x4 ; 0000C253 F606170004 '.....'
xc258: ret ; 0000C258 C3 '.'
xc259: pushf ; 0000C259 9C '.'
cli ; 0000C25A FA '.'
mov ax,[0x80] ; 0000C25B A18000 '...'
mov [0x1a],ax ; 0000C25E A31A00 '...'
mov [0x1c],ax ; 0000C261 A31C00 '...'
push cs ; 0000C264 0E '.'
call xc26b ; 0000C265 E80300 '...'
jmp short xc26c ; 0000C268 EB02 '..'
nop ; 0000C26A 90 '.'
xc26b: iret ; 0000C26B CF '.'
xc26c: ret ; 0000C26C C3 '.'
call x8da9 ; 0000C26D E839CB '.9.'
jz xc29d ; 0000C270 742B 't+'
mov ah,[0x49] ; 0000C272 8A264900 '.&I.'
cmp ah,0x4 ; 0000C276 80FC04 '...'
jc xc280 ; 0000C279 7205 'r.'
sub ah,0x6 ; 0000C27B 80EC06 '...'
jna xc2b5 ; 0000C27E 7635 'v5'
xc280: call xc32b ; 0000C280 E8A800 '...'
mov dx,[0x63] ; 0000C283 8B166300 '..c.'
add dx,byte +0x6 ; 0000C287 83C206 '...'
xc28a: in al,dx ; 0000C28A EC '.'
test al,0x1 ; 0000C28B A801 '..'
jnz xc28a ; 0000C28D 75FB 'u.'
cli ; 0000C28F FA '.'
xc290: in al,dx ; 0000C290 EC '.'
test al,0x1 ; 0000C291 A801 '..'
jz xc290 ; 0000C293 74FB 't.'
mov ax,[es:di] ; 0000C295 268B05 '&..'
mov [bp+0x0],ax ; 0000C298 894600 '.F.'
sti ; 0000C29B FB '.'
ret ; 0000C29C C3 '.'
xc29d: mov ah,[0x49] ; 0000C29D 8A264900 '.&I.'
cmp ah,0x4 ; 0000C2A1 80FC04 '...'
jc xc2ab ; 0000C2A4 7205 'r.'
sub ah,0x6 ; 0000C2A6 80EC06 '...'
jna xc2b5 ; 0000C2A9 760A 'v',0x0A
xc2ab: call xc32b ; 0000C2AB E87D00 '.}.'
mov ax,[es:di] ; 0000C2AE 268B05 '&..'
mov [bp+0x0],ax ; 0000C2B1 894600 '.F.'
ret ; 0000C2B4 C3 '.'
xc2b5: call xc34d ; 0000C2B5 E89500 '...'
mov cx,es ; 0000C2B8 8CC1 '..'
mov ds,cx ; 0000C2BA 8ED9 '..'
mov si,di ; 0000C2BC 8BF7 '..'
mov cx,ss ; 0000C2BE 8CD1 '..'
mov es,cx ; 0000C2C0 8EC1 '..'
sub sp,byte +0x8 ; 0000C2C2 83EC08 '...'
mov di,sp ; 0000C2C5 8BFC '..'
mov bh,0x4 ; 0000C2C7 B704 '..'
xc2c9: mov bl,0x2 ; 0000C2C9 B302 '..'
xc2cb: mov al,[si] ; 0000C2CB 8A04 '..'
sar ah,1 ; 0000C2CD D0FC '..'
jns xc2e4 ; 0000C2CF 7913 'y.'
mov dh,al ; 0000C2D1 8AF0 '..'
mov dl,[si+0x1] ; 0000C2D3 8A5401 '.T.'
mov cx,0x8 ; 0000C2D6 B90800 '...'
xc2d9: shl dx,1 ; 0000C2D9 D1E2 '..'
jns xc2de ; 0000C2DB 7901 'y.'
stc ; 0000C2DD F9 '.'
xc2de: rcl al,1 ; 0000C2DE D0D0 '..'
shl dx,1 ; 0000C2E0 D1E2 '..'
loop xc2d9 ; 0000C2E2 E2F5 '..'
xc2e4: stosb ; 0000C2E4 AA '.'
xor si,0x2000 ; 0000C2E5 81F60020 '... '
dec bl ; 0000C2E9 FECB '..'
jnz xc2cb ; 0000C2EB 75DE 'u.'
add si,byte +0x50 ; 0000C2ED 83C650 '..P'
dec bh ; 0000C2F0 FECF '..'
jnz xc2c9 ; 0000C2F2 75D5 'u.'
mov ax,cs ; 0000C2F4 8CC8 '..'
mov ds,ax ; 0000C2F6 8ED8 '..'
mov si,0xfa6e ; 0000C2F8 BE6EFA '.n.'
mov di,sp ; 0000C2FB 8BFC '..'
call xc369 ; 0000C2FD E86900 '.i.'
jnc xc324 ; 0000C300 7322 's"'
xor ax,ax ; 0000C302 33C0 '3.'
mov ds,ax ; 0000C304 8ED8 '..'
lds si,[0x7c] ; 0000C306 C5367C00 '.6|.'
push ax ; 0000C30A 50 'P'
push bx ; 0000C30B 53 'S'
mov ax,cs ; 0000C30C 8CC8 '..'
mov bx,ds ; 0000C30E 8CDB '..'
cmp ax,bx ; 0000C310 3BC3 ';.'
pop bx ; 0000C312 5B '['
pop ax ; 0000C313 58 'X'
jnz xc31b ; 0000C314 7505 'u.'
cmp si,byte +0x0 ; 0000C316 83FE00 '...'
jz xc324 ; 0000C319 7409 't.'
xc31b: mov di,sp ; 0000C31B 8BFC '..'
call xc369 ; 0000C31D E84900 '.I.'
jc xc324 ; 0000C320 7202 'r.'
add al,0x80 ; 0000C322 0480 '..'
xc324: add sp,byte +0x8 ; 0000C324 83C408 '...'
mov [bp+0x0],ax ; 0000C327 894600 '.F.'
ret ; 0000C32A C3 '.'
xc32b: mov di,ax ; 0000C32B 8BF8 '..'
mov bl,bh ; 0000C32D 8ADF '..'
xor bh,bh ; 0000C32F 32FF '2.'
mov ax,[0x4c] ; 0000C331 A14C00 '.L.'
mul bx ; 0000C334 F7E3 '..'
mov dx,ax ; 0000C336 8BD0 '..'
shl bx,1 ; 0000C338 D1E3 '..'
mov bx,[bx+0x50] ; 0000C33A 8B9F5000 '..P.'
mov al,[0x4a] ; 0000C33E A04A00 '.J.'
mul bh ; 0000C341 F6E7 '..'
xor bh,bh ; 0000C343 32FF '2.'
add ax,bx ; 0000C345 03C3 '..'
shl ax,1 ; 0000C347 D1E0 '..'
add ax,dx ; 0000C349 03C2 '..'
xchg ax,di ; 0000C34B 97 '.'
ret ; 0000C34C C3 '.'
xc34d: mov bx,[0x50] ; 0000C34D 8B1E5000 '..P.'
xor dx,dx ; 0000C351 33D2 '3.'
xchg bl,dl ; 0000C353 86DA '..'
mov di,bx ; 0000C355 8BFB '..'
shr di,1 ; 0000C357 D1EF '..'
shr di,1 ; 0000C359 D1EF '..'
add di,bx ; 0000C35B 03FB '..'
test byte [0x49],0x2 ; 0000C35D F606490002 '..I..'
jnz xc366 ; 0000C362 7502 'u.'
shl dx,1 ; 0000C364 D1E2 '..'
xc366: add di,dx ; 0000C366 03FA '..'
ret ; 0000C368 C3 '.'
xc369: mov ax,si ; 0000C369 8BC6 '..'
mov bx,di ; 0000C36B 8BDF '..'
xor ch,ch ; 0000C36D 32ED '2.'
mov dx,0x80 ; 0000C36F BA8000 '...'
push si ; 0000C372 56 'V'
xc373: mov si,ax ; 0000C373 8BF0 '..'
mov di,bx ; 0000C375 8BFB '..'
mov cl,0x4 ; 0000C377 B104 '..'
repe cmpsw ; 0000C379 F3A7 '..'
jz xc388 ; 0000C37B 740B 't.'
add ax,0x8 ; 0000C37D 050800 '...'
dec dx ; 0000C380 4A 'J'
jnz xc373 ; 0000C381 75F0 'u.'
pop si ; 0000C383 5E '^'
xor ax,ax ; 0000C384 33C0 '3.'
stc ; 0000C386 F9 '.'
ret ; 0000C387 C3 '.'
xc388: pop si ; 0000C388 5E '^'
sub ax,si ; 0000C389 2BC6 '+.'
mov cl,0x3 ; 0000C38B B103 '..'
shr ax,cl ; 0000C38D D3E8 '..'
ret ; 0000C38F C3 '.'
xc390: mov ax,0x40 ; 0000C390 B84000 '.@.'
mov ds,ax ; 0000C393 8ED8 '..'
mov al,0xb0 ; 0000C395 B0B0 '..'
out 0x84,al ; 0000C397 E684 '..'
xor al,al ; 0000C399 32C0 '2.'
mov [0x75],al ; 0000C39B A27500 '.u.'
mov [0x8e],al ; 0000C39E A28E00 '...'
mov dx,0x1f2 ; 0000C3A1 BAF201 '...'
mov al,0x55 ; 0000C3A4 B055 '.U'
out dx,al ; 0000C3A6 EE '.'
xor al,al ; 0000C3A7 32C0 '2.'
in al,dx ; 0000C3A9 EC '.'
cmp al,0x55 ; 0000C3AA 3C55 '<U'
jz xc3b4 ; 0000C3AC 7406 't.'
mov al,0xb1 ; 0000C3AE B0B1 '..'
out 0x84,al ; 0000C3B0 E684 '..'
jmp short xc3c1 ; 0000C3B2 EB0D '.',0x0D
xc3b4: or byte [0x8b],0x1 ; 0000C3B4 800E8B0001 '.....'
call xc4a0 ; 0000C3B9 E8E400 '...'
jc xc3c1 ; 0000C3BC 7203 'r.'
call xc3c6 ; 0000C3BE E80500 '...'
xc3c1: mov al,0xb8 ; 0000C3C1 B0B8 '..'
out 0x84,al ; 0000C3C3 E684 '..'
ret ; 0000C3C5 C3 '.'
xc3c6: push es ; 0000C3C6 06 '.'
call xc565 ; 0000C3C7 E89B01 '...'
jnc xc3e1 ; 0000C3CA 7315 's.'
mov al,0xb2 ; 0000C3CC B0B2 '..'
out 0x84,al ; 0000C3CE E684 '..'
mov bx,0xba00 ; 0000C3D0 BB00BA '...'
mov cx,0x1e ; 0000C3D3 B91E00 '...'
mov dx,0x0 ; 0000C3D6 BA0000 '...'
call xc745 ; 0000C3D9 E86903 '.i.'
call xc591 ; 0000C3DC E8B201 '...'
jmp short xc40c ; 0000C3DF EB2B '.+'
xc3e1: mov al,0xb3 ; 0000C3E1 B0B3 '..'
out 0x84,al ; 0000C3E3 E684 '..'
xor ax,ax ; 0000C3E5 33C0 '3.'
mov es,ax ; 0000C3E7 8EC0 '..'
les di,[es:0x104] ; 0000C3E9 26C43E0401 '&.>..'
mov dl,0x80 ; 0000C3EE B280 '..'
call xc40e ; 0000C3F0 E81B00 '...'
cmp byte [0x75],0x2 ; 0000C3F3 803E750002 '.>u..'
jc xc40c ; 0000C3F8 7212 'r.'
mov al,0xb4 ; 0000C3FA B0B4 '..'
out 0x84,al ; 0000C3FC E684 '..'
xor ax,ax ; 0000C3FE 33C0 '3.'
mov es,ax ; 0000C400 8EC0 '..'
les di,[es:0x118] ; 0000C402 26C43E1801 '&.>..'
mov dl,0x81 ; 0000C407 B281 '..'
call xc40e ; 0000C409 E80200 '...'
xc40c: pop es ; 0000C40C 07 '.'
ret ; 0000C40D C3 '.'
xc40e: mov bh,0x5 ; 0000C40E B705 '..'
xc410: mov bl,0x2 ; 0000C410 B302 '..'
xc412: mov cx,0x7a12 ; 0000C412 B9127A '..z'
xc415: mov ah,0x10 ; 0000C415 B410 '..'
int 0x13 ; 0000C417 CD13 '..'
jnc xc42c ; 0000C419 7311 's.'
push dx ; 0000C41B 52 'R'
mov dx,0x1f7 ; 0000C41C BAF701 '...'
in al,dx ; 0000C41F EC '.'
pop dx ; 0000C420 5A 'Z'
test al,0x80 ; 0000C421 A880 '..'
jnz xc43d ; 0000C423 7518 'u.'
cmp ah,0x80 ; 0000C425 80FC80 '...'
jz xc439 ; 0000C428 740F 't.'
jmp short xc430 ; 0000C42A EB04 '..'
xc42c: test al,0x10 ; 0000C42C A810 '..'
jnz xc442 ; 0000C42E 7512 'u.'
xc430: call x919a ; 0000C430 E867CD '.g.'
loop xc415 ; 0000C433 E2E0 '..'
dec bl ; 0000C435 FECB '..'
jnz xc412 ; 0000C437 75D9 'u.'
xc439: dec bh ; 0000C439 FECF '..'
jnz xc410 ; 0000C43B 75D3 'u.'
xc43d: call xc549 ; 0000C43D E80901 '...'
jmp short xc49e ; 0000C440 EB5C '.\'
xc442: mov ah,0x9 ; 0000C442 B409 '..'
int 0x13 ; 0000C444 CD13 '..'
jc xc43d ; 0000C446 72F5 'r.'
mov ah,0x11 ; 0000C448 B411 '..'
int 0x13 ; 0000C44A CD13 '..'
jc xc49b ; 0000C44C 724D 'rM'
push dx ; 0000C44E 52 'R'
mov ax,[es:di] ; 0000C44F 268B05 '&..'
sub ax,0x2 ; 0000C452 2D0200 '-..'
mov ch,al ; 0000C455 8AE8 '..'
mov cl,ah ; 0000C457 8ACC '..'
shl cl,0x6 ; 0000C459 C0E106 '...'
or cl,0x1 ; 0000C45C 80C901 '...'
and ah,0xc ; 0000C45F 80E40C '...'
shl ah,0x4 ; 0000C462 C0E404 '...'
mov dl,ah ; 0000C465 8AD4 '..'
pop ax ; 0000C467 58 'X'
or dl,al ; 0000C468 0AD0 0x0A,'.'
mov dh,[es:di+0x2] ; 0000C46A 268A7502 '&.u.'
dec dh ; 0000C46E FECE '..'
xc470: mov ax,0x401 ; 0000C470 B80104 '...'
int 0x13 ; 0000C473 CD13 '..'
jnc xc492 ; 0000C475 731B 's.'
cmp ah,0xa ; 0000C477 80FC0A '..',0x0A
jz xc492 ; 0000C47A 7416 't.'
cmp ah,0x11 ; 0000C47C 80FC11 '...'
jz xc492 ; 0000C47F 7411 't.'
cmp ah,0x10 ; 0000C481 80FC10 '...'
jz xc492 ; 0000C484 740C 't.'
mov al,cl ; 0000C486 8AC1 '..'
and al,0x11 ; 0000C488 2411 '$.'
cmp al,0x11 ; 0000C48A 3C11 '<.'
jz xc49b ; 0000C48C 740D 't',0x0D
inc cl ; 0000C48E FEC1 '..'
jmp short xc470 ; 0000C490 EBDE '..'
xc492: mov cx,0x1 ; 0000C492 B90100 '...'
mov ah,0xc ; 0000C495 B40C '..'
int 0x13 ; 0000C497 CD13 '..'
jnc xc49f ; 0000C499 7304 's.'
xc49b: call xc530 ; 0000C49B E89200 '...'
xc49e: stc ; 0000C49E F9 '.'
xc49f: ret ; 0000C49F C3 '.'
xc4a0: mov al,0x8e ; 0000C4A0 B08E '..'
call xb544 ; 0000C4A2 E89FF0 '...'
test al,0x40 ; 0000C4A5 A840 '.@'
jz xc4b3 ; 0000C4A7 740A 't',0x0A
xc4a9: mov al,0xb7 ; 0000C4A9 B0B7 '..'
out 0x84,al ; 0000C4AB E684 '..'
mov cl,0x0 ; 0000C4AD B100 '..'
stc ; 0000C4AF F9 '.'
jmp short xc52b ; 0000C4B0 EB79 '.y'
nop ; 0000C4B2 90 '.'
xc4b3: mov al,0x92 ; 0000C4B3 B092 '..'
call xb544 ; 0000C4B5 E88CF0 '...'
or al,al ; 0000C4B8 0AC0 0x0A,'.'
jz xc4a9 ; 0000C4BA 74ED 't.'
mov bl,al ; 0000C4BC 8AD8 '..'
push ds ; 0000C4BE 1E '.'
xor ax,ax ; 0000C4BF 33C0 '3.'
mov cx,ax ; 0000C4C1 8BC8 '..'
mov ds,ax ; 0000C4C3 8ED8 '..'
mov al,bl ; 0000C4C5 8AC3 '..'
shr al,0x4 ; 0000C4C7 C0E804 '...'
jz xc4d9 ; 0000C4CA 740D 't',0x0D
cmp al,0xf ; 0000C4CC 3C0F '<.'
jnz xc4d5 ; 0000C4CE 7505 'u.'
mov al,0x99 ; 0000C4D0 B099 '..'
call xb544 ; 0000C4D2 E86FF0 '.o.'
xc4d5: inc cl ; 0000C4D5 FEC1 '..'
dec al ; 0000C4D7 FEC8 '..'
xc4d9: mov ch,0x10 ; 0000C4D9 B510 '..'
mul ch ; 0000C4DB F6E5 '..'
add ax,0xe401 ; 0000C4DD 0501E4 '...'
cli ; 0000C4E0 FA '.'
mov [0x104],ax ; 0000C4E1 A30401 '...'
mov [0x106],cs ; 0000C4E4 8C0E0601 '....'
xor ax,ax ; 0000C4E8 33C0 '3.'
mov al,bl ; 0000C4EA 8AC3 '..'
and al,0xf ; 0000C4EC 240F '$.'
jz xc4fd ; 0000C4EE 740D 't',0x0D
cmp al,0xf ; 0000C4F0 3C0F '<.'
jnz xc4f9 ; 0000C4F2 7505 'u.'
mov al,0x9a ; 0000C4F4 B09A '..'
call xb544 ; 0000C4F6 E84BF0 '.K.'
xc4f9: dec al ; 0000C4F9 FEC8 '..'
inc cl ; 0000C4FB FEC1 '..'
xc4fd: mul ch ; 0000C4FD F6E5 '..'
add ax,0xe401 ; 0000C4FF 0501E4 '...'
mov [0x118],ax ; 0000C502 A31801 '...'
mov [0x11a],cs ; 0000C505 8C0E1A01 '....'
mov ax,[0x4c] ; 0000C509 A14C00 '.L.'
mov [0x100],ax ; 0000C50C A30001 '...'
mov ax,[0x4e] ; 0000C50F A14E00 '.N.'
mov [0x102],ax ; 0000C512 A30201 '...'
mov word [0x4c],0x2e12 ; 0000C515 C7064C00122E '..L...'
mov [0x4e],cs ; 0000C51B 8C0E4E00 '..N.'
mov word [0x1d8],0x3343 ; 0000C51F C706D8014333 '....C3'
mov [0x1da],cs ; 0000C525 8C0EDA01 '....'
sti ; 0000C529 FB '.'
pop ds ; 0000C52A 1F '.'
xc52b: mov [0x75],cl ; 0000C52B 880E7500 '..u.'
ret ; 0000C52F C3 '.'
xc530: mov al,0xb5 ; 0000C530 B0B5 '..'
out 0x84,al ; 0000C532 E684 '..'
mov bx,0xb9b0 ; 0000C534 BBB0B9 '...'
cmp dl,0x80 ; 0000C537 80FA80 '...'
jz xc53f ; 0000C53A 7403 't.'
mov bx,0xb9c3 ; 0000C53C BBC3B9 '...'
xc53f: mov cx,0x13 ; 0000C53F B91300 '...'
mov dx,0x0 ; 0000C542 BA0000 '...'
call xc745 ; 0000C545 E8FD01 '...'
ret ; 0000C548 C3 '.'
xc549: mov al,0xb6 ; 0000C549 B0B6 '..'
out 0x84,al ; 0000C54B E684 '..'
mov bx,0xb9eb ; 0000C54D BBEBB9 '...'
cmp dl,0x81 ; 0000C550 80FA81 '...'
jz xc55b ; 0000C553 7406 't.'
call xc591 ; 0000C555 E83900 '.9.'
mov bx,0xb9d6 ; 0000C558 BBD6B9 '...'
xc55b: mov cx,0x15 ; 0000C55B B91500 '...'
mov dx,0x0 ; 0000C55E BA0000 '...'
call xc745 ; 0000C561 E8E101 '...'
ret ; 0000C564 C3 '.'
xc565: call xc5a2 ; 0000C565 E83A00 '.:.'
call xc5af ; 0000C568 E84400 '.D.'
mov dx,0x1f7 ; 0000C56B BAF701 '...'
mov bx,0x3c ; 0000C56E BB3C00 '.<.'
xc571: mov cx,0xf424 ; 0000C571 B924F4 '.$.'
xc574: in al,dx ; 0000C574 EC '.'
test al,0x80 ; 0000C575 A880 '..'
jz xc585 ; 0000C577 740C 't.'
call x919a ; 0000C579 E81ECC '...'
loop xc574 ; 0000C57C E2F6 '..'
dec bx ; 0000C57E 4B 'K'
jnz xc571 ; 0000C57F 75F0 'u.'
mov ah,0x80 ; 0000C581 B480 '..'
jmp short xc58f ; 0000C583 EB0A '.',0x0A
xc585: mov dx,0x1f1 ; 0000C585 BAF101 '...'
in al,dx ; 0000C588 EC '.'
cmp al,0x1 ; 0000C589 3C01 '<.'
jz xc590 ; 0000C58B 7403 't.'
mov ah,0x20 ; 0000C58D B420 '. '
xc58f: stc ; 0000C58F F9 '.'
xc590: ret ; 0000C590 C3 '.'
xc591: cli ; 0000C591 FA '.'
mov al,0x8e ; 0000C592 B08E '..'
call xb544 ; 0000C594 E8ADEF '...'
or al,0x8 ; 0000C597 0C08 '..'
mov ah,al ; 0000C599 8AE0 '..'
mov al,0x8e ; 0000C59B B08E '..'
call xb549 ; 0000C59D E8A9EF '...'
sti ; 0000C5A0 FB '.'
ret ; 0000C5A1 C3 '.'
xc5a2: in al,0x21 ; 0000C5A2 E421 '.!'
and al,0xfb ; 0000C5A4 24FB '$.'
out 0x21,al ; 0000C5A6 E621 '.!'
in al,0xa1 ; 0000C5A8 E4A1 '..'
and al,0xbf ; 0000C5AA 24BF '$.'
out 0xa1,al ; 0000C5AC E6A1 '..'
ret ; 0000C5AE C3 '.'
xc5af: mov ax,0x0 ; 0000C5AF B80000 '...'
mov dx,0x3f6 ; 0000C5B2 BAF603 '...'
out dx,al ; 0000C5B5 EE '.'
mov al,0x4 ; 0000C5B6 B004 '..'
out dx,al ; 0000C5B8 EE '.'
call x919a ; 0000C5B9 E8DECB '...'
mov al,0x0 ; 0000C5BC B000 '..'
out dx,al ; 0000C5BE EE '.'
ret ; 0000C5BF C3 '.'
xc5c0: sti ; 0000C5C0 FB '.'
push bx ; 0000C5C1 53 'S'
push cx ; 0000C5C2 51 'Q'
push dx ; 0000C5C3 52 'R'
push si ; 0000C5C4 56 'V'
push di ; 0000C5C5 57 'W'
push ds ; 0000C5C6 1E '.'
push bp ; 0000C5C7 55 'U'
mov bp,sp ; 0000C5C8 8BEC '..'
mov si,0x40 ; 0000C5CA BE4000 '.@.'
mov ds,si ; 0000C5CD 8EDE '..'
and dx,0x3 ; 0000C5CF 81E20300 '....'
mov si,dx ; 0000C5D3 8BF2 '..'
cmp ah,0x4 ; 0000C5D5 80FC04 '...'
jnc xc5de ; 0000C5D8 7304 's.'
mov bl,[si+0x7c] ; 0000C5DA 8A9C7C00 '..|.'
xc5de: shl si,1 ; 0000C5DE D1E6 '..'
mov dx,[si+0x0] ; 0000C5E0 8B940000 '....'
or dx,dx ; 0000C5E4 0BD2 '..'
jz xc61c ; 0000C5E6 7434 't4'
test ah,ah ; 0000C5E8 84E4 '..'
jnz xc5f1 ; 0000C5EA 7505 'u.'
call xcb01 ; 0000C5EC E81205 '...'
jmp short xc61c ; 0000C5EF EB2B '.+'
xc5f1: dec ah ; 0000C5F1 FECC '..'
jnz xc5fa ; 0000C5F3 7505 'u.'
call xcb32 ; 0000C5F5 E83A05 '.:.'
jmp short xc61c ; 0000C5F8 EB22 '."'
xc5fa: dec ah ; 0000C5FA FECC '..'
jnz xc603 ; 0000C5FC 7505 'u.'
call xcb5e ; 0000C5FE E85D05 '.].'
jmp short xc61c ; 0000C601 EB19 '..'
xc603: dec ah ; 0000C603 FECC '..'
jnz xc60c ; 0000C605 7505 'u.'
call xcb29 ; 0000C607 E81F05 '...'
jmp short xc61c ; 0000C60A EB10 '..'
xc60c: dec ah ; 0000C60C FECC '..'
jnz xc615 ; 0000C60E 7505 'u.'
call xcbcb ; 0000C610 E8B805
jmp short xc61c ; 0000C613 EB07 '..'
xc615: dec ah ; 0000C615 FECC '..'
jnz xc61c ; 0000C617 7503 'u.'
call xcc10 ; 0000C619 E8F405 '...'
xc61c: pop bp ; 0000C61C 5D ']'
pop ds ; 0000C61D 1F '.'
pop di ; 0000C61E 5F '_'
pop si ; 0000C61F 5E '^'
pop dx ; 0000C620 5A 'Z'
pop cx ; 0000C621 59 'Y'
pop bx ; 0000C622 5B '['
iret ; 0000C623 CF '.'
times 6 db 0xFF ; 0000C624 - 0000C629
jmp xca97 ; 0000C62A E96A04
dw 0x0010 ; 0000C62D 1000
xc62f: push bx ; 0000C62F 53 'S'
mov bx,0x1 ; 0000C630 BB0100 '...'
call xc638 ; 0000C633 E80200 '...'
pop bx ; 0000C636 5B '['
ret ; 0000C637 C3 '.'
xc638: push bp ; 0000C638 55 'U'
push ax ; 0000C639 50 'P'
push cx ; 0000C63A 51 'Q'
call xc642 ; 0000C63B E80400 '...'
pop cx ; 0000C63E 59 'Y'
pop ax ; 0000C63F 58 'X'
pop bp ; 0000C640 5D ']'
ret ; 0000C641 C3 '.'
xc642: mov cx,bx ; 0000C642 8BCB '..'
xc644: pushf ; 0000C644 9C '.'
cli ; 0000C645 FA '.'
mov al,0x0 ; 0000C646 B000 '..'
out 0x43,al ; 0000C648 E643 '.C'
in al,0x40 ; 0000C64A E440 '.@'
mov ah,al ; 0000C64C 8AE0 '..'
in al,0x40 ; 0000C64E E440 '.@'
push cs ; 0000C650 0E '.'
call xc657 ; 0000C651 E80300 '...'
jmp short xc658 ; 0000C654 EB02 '..'
nop ; 0000C656 90 '.'
xc657: iret ; 0000C657 CF '.'
xc658: xchg al,ah ; 0000C658 86C4 '..'
mov bx,ax ; 0000C65A 8BD8 '..'
xc65c: pushf ; 0000C65C 9C '.'
cli ; 0000C65D FA '.'
mov al,0x0 ; 0000C65E B000 '..'
out 0x43,al ; 0000C660 E643 '.C'
in al,0x40 ; 0000C662 E440 '.@'
mov ah,al ; 0000C664 8AE0 '..'
in al,0x40 ; 0000C666 E440 '.@'
push cs ; 0000C668 0E '.'
call xc66f ; 0000C669 E80300 '...'
jmp short xc670 ; 0000C66C EB02 '..'
nop ; 0000C66E 90 '.'
xc66f: iret ; 0000C66F CF '.'
xc670: xchg al,ah ; 0000C670 86C4 '..'
push bx ; 0000C672 53 'S'
sub bx,ax ; 0000C673 2BD8 '+.'
cmp bx,0x950 ; 0000C675 81FB5009 '..P.'
pop bx ; 0000C679 5B '['
jc xc65c ; 0000C67A 72E0 'r.'
loop xc644 ; 0000C67C E2C6 '..'
ret ; 0000C67E C3 '.'
mov cx,bx ; 0000C67F 8BCB '..'
xc681: mov al,0x0 ; 0000C681 B000 '..'
out 0x43,al ; 0000C683 E643 '.C'
in al,0x40 ; 0000C685 E440 '.@'
mov ah,al ; 0000C687 8AE0 '..'
in al,0x40 ; 0000C689 E440 '.@'
xchg al,ah ; 0000C68B 86C4 '..'
mov bx,ax ; 0000C68D 8BD8 '..'
xc68f: mov al,0x0 ; 0000C68F B000 '..'
out 0x43,al ; 0000C691 E643 '.C'
in al,0x40 ; 0000C693 E440 '.@'
mov ah,al ; 0000C695 8AE0 '..'
in al,0x40 ; 0000C697 E440 '.@'
xchg al,ah ; 0000C699 86C4 '..'
sub bx,ax ; 0000C69B 2BD8 '+.'
cmp bx,0x950 ; 0000C69D 81FB5009 '..P.'
jc xc6a7 ; 0000C6A1 7204 'r.'
loop xc681 ; 0000C6A3 E2DC '..'
jmp bp ; 0000C6A5 FFE5 '..'
xc6a7: add bx,ax ; 0000C6A7 03D8 '..'
jmp short xc68f ; 0000C6A9 EBE4 '..'
xc6ab: xchg si,dx ; 0000C6AB 87F2 '..'
xchg ch,cl ; 0000C6AD 86E9 '..'
mov bx,cx ; 0000C6AF 8BD9 '..'
mov sp,si ; 0000C6B1 8BE6 '..'
mov cx,0x4 ; 0000C6B3 B90400 '...'
shr dx,cl ; 0000C6B6 D3EA '..'
mov cx,0x2 ; 0000C6B8 B90200 '...'
mov si,0xc6c1 ; 0000C6BB BEC1C6 '...'
jmp short xc6e6 ; 0000C6BE EB26 '.&'
nop ; 0000C6C0 90 '.'
mov dx,sp ; 0000C6C1 8BD4 '..'
and dx,0x3 ; 0000C6C3 81E20300 '....'
mov cx,0x4 ; 0000C6C7 B90400 '...'
mov si,0xc6d0 ; 0000C6CA BED0C6 '...'
jmp short xc6e6 ; 0000C6CD EB17 '..'
nop ; 0000C6CF 90 '.'
mov al,0x20 ; 0000C6D0 B020 '. '
mov [es:di+0x8000],al ; 0000C6D2 2688850080 '&....'
stosb ; 0000C6D7 AA '.'
inc di ; 0000C6D8 47 'G'
mov dx,bx ; 0000C6D9 8BD3 '..'
mov cx,0x2 ; 0000C6DB B90200 '...'
mov si,0xc6e4 ; 0000C6DE BEE4C6 '...'
jmp short xc6e6 ; 0000C6E1 EB03 '..'
nop ; 0000C6E3 90 '.'
jmp bp ; 0000C6E4 FFE5 '..'
xc6e6: cld ; 0000C6E6 FC '.'
mov ax,0xb000 ; 0000C6E7 B800B0 '...'
mov es,ax ; 0000C6EA 8EC0 '..'
xc6ec: xchg ax,dx ; 0000C6EC 92 '.'
mul word [cs:0xc62d] ; 0000C6ED 2EF7262DC6 '..&-.'
xchg ax,dx ; 0000C6F2 92 '.'
add al,0x90 ; 0000C6F3 0490 '..'
daa ; 0000C6F5 27 0x27
adc al,0x40 ; 0000C6F6 1440 '.@'
daa ; 0000C6F8 27 0x27
mov [es:di+0x8000],al ; 0000C6F9 2688850080 '&....'
stosb ; 0000C6FE AA '.'
inc di ; 0000C6FF 47 'G'
loop xc6ec ; 0000C700 E2EA '..'
jmp si ; 0000C702 FFE6 '..'
xc704: xchg ch,cl ; 0000C704 86E9 '..'
push cx ; 0000C706 51 'Q'
push dx ; 0000C707 52 'R'
mov dx,si ; 0000C708 8BD6 '..'
shl dx,0x8 ; 0000C70A C1E208 '...'
mov cx,0x2 ; 0000C70D B90200 '...'
call xc72b ; 0000C710 E81800 '...'
pop dx ; 0000C713 5A 'Z'
and dx,0x3 ; 0000C714 81E20300 '....'
mov cx,0x4 ; 0000C718 B90400 '...'
call xc72b ; 0000C71B E80D00 '.',0x0D,'.'
mov al,0x20 ; 0000C71E B020 '. '
call print_char ; 0000C720 E8B000 '...'
pop dx ; 0000C723 5A 'Z'
mov cx,0x2 ; 0000C724 B90200 '...'
call xc72b ; 0000C727 E80100 '...'
ret ; 0000C72A C3 '.'
;
; Print the value in (DX) as (CX) hex digits
;
xc72b: cld ; 0000C72B FC '.'
xc72c: xchg ax,dx ; 0000C72C 92 '.'
mul word [cs:0xc62d] ; multiply by 16
xchg ax,dx ; 0000C732 92 '.'
add al,0x90 ; 0000C733 0490 '..'
daa ; 0000C735 27 0x27
adc al,0x40 ; 0000C736 1440 '.@'
daa ; 0000C738 27 0x27
push dx ; 0000C739 52 'R'
push cx ; 0000C73A 51 'Q'
push ax ; 0000C73B 50 'P'
call print_char ; 0000C73C E89400 '...'
pop ax ; 0000C73F 58 'X'
pop cx ; 0000C740 59 'Y'
pop dx ; 0000C741 5A 'Z'
loop xc72c ; 0000C742 E2E8 '..'
ret ; 0000C744 C3 '.'
xc745: push ds ; 0000C745 1E '.'
mov ax,0x40 ; 0000C746 B84000 '.@.'
mov ds,ax ; 0000C749 8ED8 '..'
mov byte [0x12],0xff ; 0000C74B C6061200FF '.....'
pop ds ; 0000C750 1F '.'
xc751: push bx ; 0000C751 53 'S'
push cx ; 0000C752 51 'Q'
xc753: test dh,0xc0 ; 0000C753 F6C6C0 '...'
jz xc760 ; 0000C756 7408 't.'
call xc7ab ; 0000C758 E85000
sub dh,0x40 ; 0000C75B 80EE40 '..@'
jmp short xc753 ; 0000C75E EBF3 '..'
xc760: test dh,0x30 ; 0000C760 F6C630 '..0'
jz xc76d ; 0000C763 7408 't.'
call xc791 ; 0000C765 E82900 '.).'
sub dh,0x10 ; 0000C768 80EE10 '...'
jmp short xc760 ; 0000C76B EBF3 '..'
xc76d: pop cx ; 0000C76D 59 'Y'
pop bx ; 0000C76E 5B '['
xc76f: mov al,[cs:bx] ; 0000C76F 2E8A07 '...'
push bx ; 0000C772 53 'S'
call print_char ; 0000C773 E85D00 '.].'
pop bx ; 0000C776 5B '['
inc bx ; 0000C777 43 'C'
loop xc76f ; 0000C778 E2F5 '..'
ret ; 0000C77A C3 '.'
;
; print_str(BX -> string, CX == length)
;
; NOTE: This appears to be dead code
;
print_str:
mov al,[bx] ; 0000C77B 8A07 '..'
push bx ; 0000C77D 53 'S'
call print_char ; 0000C77E E85200 '.R.'
pop bx ; 0000C781 5B '['
inc bx ; 0000C782 43 'C'
loop print_str ; 0000C783 E2F6 '..'
ret ; 0000C785 C3 '.'
;
; print_crlf()
;
print_crlf:
mov al,0xd ; 0000C786 B00D '.',0x0D
call print_char ; 0000C788 E84800 '.H.'
mov al,0xa ; 0000C78B B00A '.',0x0A
call print_char ; 0000C78D E84300 '.C.'
ret ; 0000C790 C3 '.'
xc791: mov bx,0xfa ; 0000C791 BBFA00 '...'
call xc7db ; 0000C794 E84400 '.D.'
mov bx,0x100 ; 0000C797 BB0001 '...'
call xc638 ; 0000C79A E89BFE '...'
ret ; 0000C79D C3 '.'
xc79e: mov bx,0x7d ; 0000C79E BB7D00 '.}.'
call xc7db ; 0000C7A1 E83700 '.7.'
mov bx,0x7d ; 0000C7A4 BB7D00 '.}.'
call xc638 ; 0000C7A7 E88EFE '...'
ret ; 0000C7AA C3 '.'
xc7ab: mov bx,0x320 ; 0000C7AB BB2003 '. .'
call xc7db ; 0000C7AE E82A00 '.*.'
mov bx,0x100 ; 0000C7B1 BB0001 '...'
call xc638 ; 0000C7B4 E881FE '...'
ret ; 0000C7B7 C3 '.'
xc7b8: mov ch,al ; 0000C7B8 8AE8 '..'
mov cl,0x4 ; 0000C7BA B104 '..'
shr al,cl ; 0000C7BC D2E8 '..'
call xc7c7 ; 0000C7BE E80600 '...'
mov al,ch ; 0000C7C1 8AC5 '..'
call xc7c7 ; 0000C7C3 E80100 '...'
ret ; 0000C7C6 C3 '.'
xc7c7: and al,0xf ; 0000C7C7 240F '$.'
add al,0x90 ; 0000C7C9 0490 '..'
daa ; 0000C7CB 27 0x27
adc al,0x40 ; 0000C7CC 1440 '.@'
daa ; 0000C7CE 27 0x27
call print_char ; 0000C7CF E80100 '...'
ret ; 0000C7D2 C3 '.'
print_char:
mov bx,0x7 ; 0000C7D3 BB0700 '...'
mov ah,0xe ; 0000C7D6 B40E '..'
int 0x10 ; 0000C7D8 CD10 '..'
ret ; 0000C7DA C3 '.'
xc7db: mov al,0xb6 ; 0000C7DB B0B6 '..'
out 0x43,al ; 0000C7DD E643 '.C'
mov al,0x38 ; 0000C7DF B038 '.8'
out 0x42,al ; 0000C7E1 E642 '.B'
mov al,0x5 ; 0000C7E3 B005 '..'
out 0x42,al ; 0000C7E5 E642 '.B'
in al,0x61 ; 0000C7E7 E461 '.a'
or al,0x3 ; 0000C7E9 0C03 '..'
out 0x61,al ; 0000C7EB E661 '.a'
call xc638 ; 0000C7ED E848FE '.H.'
in al,0x61 ; 0000C7F0 E461 '.a'
and al,0xfc ; 0000C7F2 24FC '$.'
out 0x61,al ; 0000C7F4 E661 '.a'
ret ; 0000C7F6 C3 '.'
xc7f7: xor di,di ; 0000C7F7 33FF '3.'
xc7f9: cld ; 0000C7F9 FC '.'
mov ax,0xb000 ; 0000C7FA B800B0 '...'
mov es,ax ; 0000C7FD 8EC0 '..'
xc7ff: mov al,[cs:bx] ; 0000C7FF 2E8A07 '...'
inc bx ; 0000C802 43 'C'
mov [es:di+0x8000],al ; 0000C803 2688850080 '&....'
stosb ; 0000C808 AA '.'
inc di ; 0000C809 47 'G'
loop xc7ff ; 0000C80A E2F3 '..'
jmp bp ; 0000C80C FFE5 '..'
push es ; 0000C80E 06 '.'
xor di,di ; 0000C80F 33FF '3.'
cld ; 0000C811 FC '.'
mov ax,0xb000 ; 0000C812 B800B0 '...'
mov es,ax ; 0000C815 8EC0 '..'
xc817: mov al,[bx] ; 0000C817 8A07 '..'
inc bx ; 0000C819 43 'C'
mov [es:di+0x8000],al ; 0000C81A 2688850080 '&....'
stosb ; 0000C81F AA '.'
inc di ; 0000C820 47 'G'
loop xc817 ; 0000C821 E2F4 '..'
pop es ; 0000C823 07 '.'
ret ; 0000C824 C3 '.'
;
; Copy ROM to RAM
;
; This function ends by disabling A20 and zeroing all conventional memory.
;
xc825: pusha ; 0000C825 60 '`'
push ds ; 0000C826 1E '.'
push es ; 0000C827 06 '.'
mov al,0xd0 ; 0000C828 B0D0 '..'
out 0x84,al ; 0000C82A E684 '..'
mov ax,0x40 ; 0000C82C B84000 '.@.'
mov ds,ax ; 0000C82F 8ED8 '..'
mov [0x67],sp ; 0000C831 89266700 '.&g.'
mov [0x69],ss ; 0000C835 8C166900 '..i.'
mov al,0xd1 ; 0000C839 B0D1 '..'
out 0x84,al ; 0000C83B E684 '..'
;
; Enter protected-mode
;
call x80e2 ; 0000C83D E8A2B8 '...'
jz xc845 ; 0000C840 7403 't.'
jmp xc8ef ; 0000C842 E9AA00 '...'
xc845: mov al,0xd2 ; 0000C845 B0D2 '..'
out 0x84,al ; 0000C847 E684 '..'
mov al,0xb1 ; 0000C849 B0B1 '..'
call xb544 ; 0000C84B E8F6EC '...'
mov ah,al ; 0000C84E 8AE0 '..'
mov al,0xb0 ; 0000C850 B0B0 '..'
call xb544 ; 0000C852 E8EFEC '...'
xor dx,dx ; 0000C855 33D2 '3.'
mov bx,0x40 ; 0000C857 BB4000 '.@.'
div bx ; 0000C85A F7F3 '..'
mov bh,al ; 0000C85C 8AF8 '..'
mov bl,0x10 ; 0000C85E B310 '..'
call xc8fc ; 0000C860 E89900 '...'
;
; The next function writes 0xFF to 0x80C00000, presumably to ensure that
; Compaq Built-in Memory at 0xFE0000 is NOT mapped to 0x0E000 at the moment
;
call x84a5 ; 0000C863 E83FBC '.?.'
mov ax,[0x8d] ; 0000C866 A18D00 '...'
add ax,0x80 ; 0000C869 058000 '...'
xor dx,dx ; 0000C86C 33D2 '3.'
mov bx,0x40 ; 0000C86E BB4000 '.@.'
div bx ; 0000C871 F7F3 '..'
mov bh,al ; 0000C873 8AF8 '..'
mov bl,[0x8c] ; 0000C875 8A1E8C00 '....'
call xc8fc ; 0000C879 E88000 '...'
;
; Relocate the ROM
;
; On return, we should now be running in RAM (ie, a copy of the ROM in 128Kb of RAM
; now mapped to %0E0000 through %0FFFFF)
;
call x853c ; 0000C87C E8BDBC '...'
;
; Return to real-mode
;
mov al,0xd3 ; 0000C87F B0D3 '..'
out 0x84,al ; 0000C881 E684 '..'
mov ax,0x28 ; 0000C883 B82800 '.(.'
mov ds,ax ; 0000C886 8ED8 '..'
mov es,ax ; 0000C888 8EC0 '..'
mov ss,ax ; 0000C88A 8ED0 '..'
mov eax,cr0 ; 0000C88C 0F2000
and eax,0x7ffffffe ; 0000C88F 6625FEFFFF7F 'f%....'
mov cr0,eax ; 0000C895 0F2200
jmp 0xf000:xc89d ; 0000C898 EA9DC800F0 '.....'
xc89d: lidt [cs:0xa151] ; 0000C89D 2E0F011E51A1 '....Q.'
mov al,0xd4 ; 0000C8A3 B0D4 '..'
out 0x84,al ; 0000C8A5 E684 '..'
mov ax,0x40 ; 0000C8A7 B84000 '.@.'
mov ds,ax ; 0000C8AA 8ED8 '..'
mov ss,[0x69] ; 0000C8AC 8E166900 '..i.'
mov sp,[0x67] ; 0000C8B0 8B266700 '.&g.'
;
; Disable A20
;
call xa478 ; 0000C8B4 E8C1DB
;
; Get the (conventional) memory size in Kb from 0x40:0x0013, divide by 64 (0x40) to yield
; the number of 64Kb blocks of RAM below 1Mb, and then zero each 64Kb block with "rep stosd".
;
mov ax,[0x13] ; 0000C8B7 A11300 '...'
xor dx,dx ; 0000C8BA 33D2 '3.'
mov bx,0x40 ; 0000C8BC BB4000 '.@.'
div bx ; 0000C8BF F7F3 '..'
cmp ax,0x0 ; 0000C8C1 3D0000 '=..'
jnz xc8c9 ; 0000C8C4 7503 'u.'
jmp short xc8eb ; 0000C8C6 EB23 '.#'
nop ; 0000C8C8 90 '.'
xc8c9: sub ax,0x1 ; 0000C8C9 2D0100 '-..'
mov bh,al ; 0000C8CC 8AF8 '..'
mov dx,0x1000 ; 0000C8CE BA0010 '...'
xc8d1: cmp bh,0x0 ; 0000C8D1 80FF00 '...'
jz xc8eb ; 0000C8D4 7415 't.'
mov es,dx ; 0000C8D6 8EC2 '..'
xor eax,eax ; 0000C8D8 6633C0 'f3.'
mov cx,0x4000 ; 0000C8DB B90040 '..@'
xor di,di ; 0000C8DE 33FF '3.'
cld ; 0000C8E0 FC '.'
rep stosd ; 0000C8E1 66F3AB 'f..'
dec bh ; 0000C8E4 FECF '..'
add dh,0x10 ; 0000C8E6 80C610 '...'
jmp short xc8d1 ; 0000C8E9 EBE6 '..'
xc8eb: pop es ; 0000C8EB 07 '.'
pop ds ; 0000C8EC 1F '.'
popa ; 0000C8ED 61 'a'
ret ; 0000C8EE C3 '.'
xc8ef: mov dx,0x0 ; 0000C8EF BA0000 '...'
mov bx,err102 ; 0000C8F2 BB8CB6 '...'
mov cx,err102_len ; 0000C8F5 B91A00 '...'
call xc745 ; 0000C8F8 E84AFE '.J.'
hlt ; 0000C8FB F4 '.'
xc8fc: push ax ; 0000C8FC 50 'P'
push bx ; 0000C8FD 53 'S'
push cx ; 0000C8FE 51 'Q'
push di ; 0000C8FF 57 'W'
push ds ; 0000C900 1E '.'
push es ; 0000C901 06 '.'
mov ax,0x18 ; 0000C902 B81800 '...'
mov ds,ax ; 0000C905 8ED8 '..'
mov word [0x4a],0x0 ; 0000C907 C7064A000000 '..J...'
xc90d: cmp bh,0x0 ; 0000C90D 80FF00 '...'
jz xc92d ; 0000C910 741B 't.'
mov [0x4c],bl ; 0000C912 881E4C00 '..L.'
mov ax,0x48 ; 0000C916 B84800 '.H.'
mov es,ax ; 0000C919 8EC0 '..'
xor eax,eax ; 0000C91B 6633C0 'f3.'
mov cx,0x4000 ; 0000C91E B90040 '..@'
xor di,di ; 0000C921 33FF '3.'
cld ; 0000C923 FC '.'
rep stosd ; 0000C924 66F3AB 'f..'
dec bh ; 0000C927 FECF '..'
inc bl ; 0000C929 FEC3 '..'
jmp short xc90d ; 0000C92B EBE0 '..'
xc92d: pop es ; 0000C92D 07 '.'
pop ds ; 0000C92E 1F '.'
pop di ; 0000C92F 5F '_'
pop cx ; 0000C930 59 'Y'
pop bx ; 0000C931 5B '['
pop ax ; 0000C932 58 'X'
ret ; 0000C933 C3 '.'
call xca03 ; 0000C934 E8CC00 '...'
mov [0x41],ah ; 0000C937 88264100 '.&A.'
or ah,ah ; 0000C93B 0AE4 0x0A,'.'
jz xc944 ; 0000C93D 7405 't.'
or word [bp+0x16],0x1 ; 0000C93F 814E160100 '.N...'
xc944: ret ; 0000C944 C3 '.'
mov al,[bp+0x0] ; 0000C945 8A4600 '.F.'
mov ah,[0x41] ; 0000C948 8A264100 '.&A.'
or ah,ah ; 0000C94C 0AE4 0x0A,'.'
jz xc955 ; 0000C94E 7405 't.'
or word [bp+0x16],0x1 ; 0000C950 814E160100 '.N...'
xc955: ret ; 0000C955 C3 '.'
xc956: cli ; 0000C956 FA '.'
mov byte [0x40],0xff ; 0000C957 C6064000FF '..@..'
mov al,0x10 ; 0000C95C B010 '..'
mov cl,[bp+0x6] ; 0000C95E 8A4E06 '.N.'
shl al,cl ; 0000C961 D2E0 '..'
or al,0xc ; 0000C963 0C0C '..'
or al,[bp+0x6] ; 0000C965 0A4606 0x0A,'F.'
mov ah,[0x3f] ; 0000C968 8A263F00 '.&?.'
shl ah,0x4 ; 0000C96C C0E404 '...'
or al,ah ; 0000C96F 0AC4 0x0A,'.'
mov dx,0x3f2 ; 0000C971 BAF203 '...'
out dx,al ; 0000C974 EE '.'
mov ah,al ; 0000C975 8AE0 '..'
mov al,[0x8b] ; 0000C977 A08B00 '...'
shr al,0x6 ; 0000C97A C0E806 '...'
mov dx,0x3f7 ; 0000C97D BAF703 '...'
out dx,al ; 0000C980 EE '.'
shr ah,0x4 ; 0000C981 C0EC04 '...'
mov al,[0x3f] ; 0000C984 A03F00 '.?.'
and al,0xf ; 0000C987 240F '$.'
cmp al,ah ; 0000C989 3AC4 ':.'
jz xc9bd ; 0000C98B 7430 't0'
or [0x3f],ah ; 0000C98D 08263F00 '.&?.'
sti ; 0000C991 FB '.'
clc ; 0000C992 F8 '.'
mov ax,0x90fd ; 0000C993 B8FD90 '...'
int 0x15 ; 0000C996 CD15 '..'
jc xc9bd ; 0000C998 7223 'r#'
mov al,0x7d ; 0000C99A B07D '.}'
mov cl,0x8 ; 0000C99C B108 '..'
mov bl,[es:si+0xa] ; 0000C99E 268A5C0A '&.\',0x0A
cmp byte [bp+0x1],0x3 ; 0000C9A2 807E0103 '.~..'
jz xc9b0 ; 0000C9A6 7408 't.'
cmp byte [bp+0x1],0x5 ; 0000C9A8 807E0105 '.~..'
jnz xc9b0 ; 0000C9AC 7502 'u.'
mov cl,0x5 ; 0000C9AE B105 '..'
xc9b0: cmp bl,cl ; 0000C9B0 3AD9 ':.'
jnc xc9b6 ; 0000C9B2 7302 's.'
xchg bl,cl ; 0000C9B4 86D9 '..'
xc9b6: mul bl ; 0000C9B6 F6E3 '..'
mov bx,ax ; 0000C9B8 8BD8 '..'
call xc638 ; 0000C9BA E87BFC '.{.'
xc9bd: sti ; 0000C9BD FB '.'
ret ; 0000C9BE C3 '.'
xc9bf: push cx ; 0000C9BF 51 'Q'
mov dx,0x3f4 ; 0000C9C0 BAF403 '...'
mov cx,0xbc ; 0000C9C3 B9BC00 '...'
xc9c6: call x919a ; 0000C9C6 E8D1C7 '...'
in al,dx ; 0000C9C9 EC '.'
test al,0x80 ; 0000C9CA A880 '..'
jnz xc9d4 ; 0000C9CC 7506 'u.'
loop xc9c6 ; 0000C9CE E2F6 '..'
mov al,0x80 ; 0000C9D0 B080 '..'
jmp short xc9d8 ; 0000C9D2 EB04 '..'
xc9d4: call x919a ; 0000C9D4 E8C3C7 '...'
in al,dx ; 0000C9D7 EC '.'
xc9d8: inc dx ; 0000C9D8 42 'B'
test al,0x40 ; 0000C9D9 A840 '.@'
pop cx ; 0000C9DB 59 'Y'
ret ; 0000C9DC C3 '.'
xc9dd: mov bh,ah ; 0000C9DD 8AFC '..'
mov al,[0x45] ; 0000C9DF A04500 '.E.'
sub al,[bp+0x5] ; 0000C9E2 2A4605 '*F.'
shl al,1 ; 0000C9E5 D0E0 '..'
mul byte [es:si+0x4] ; 0000C9E7 26F66404 '&.d.'
mov bl,al ; 0000C9EB 8AD8 '..'
mov al,[0x46] ; 0000C9ED A04600 '.F.'
sub al,[bp+0x7] ; 0000C9F0 2A4607 '*F.'
mul byte [es:si+0x4] ; 0000C9F3 26F66404 '&.d.'
add al,bl ; 0000C9F7 02C3 '..'
add al,[0x47] ; 0000C9F9 02064700 '..G.'
sub al,[bp+0x4] ; 0000C9FD 2A4604 '*F.'
mov ah,bh ; 0000CA00 8AE7 '..'
ret ; 0000CA02 C3 '.'
xca03: mov dx,0x3f2 ; 0000CA03 BAF203 '...'
mov al,[0x3f] ; 0000CA06 A03F00 '.?.'
and al,0xf ; 0000CA09 240F '$.'
jz xca1f ; 0000CA0B 7412 't.'
shr al,1 ; 0000CA0D D0E8 '..'
test al,0x4 ; 0000CA0F A804 '..'
jz xca15 ; 0000CA11 7402 't.'
mov al,0x3 ; 0000CA13 B003 '..'
xca15: mov ah,[0x3f] ; 0000CA15 8A263F00 '.&?.'
mov cl,0x4 ; 0000CA19 B104 '..'
shl ah,cl ; 0000CA1B D2E4 '..'
or al,ah ; 0000CA1D 0AC4 0x0A,'.'
xca1f: or al,0x8 ; 0000CA1F 0C08 '..'
out dx,al ; 0000CA21 EE '.'
call x919a ; 0000CA22 E875C7 '.u.'
and byte [0x3e],0x0 ; 0000CA25 80263E0000 '.&>..'
or al,0x4 ; 0000CA2A 0C04 '..'
out dx,al ; 0000CA2C EE '.'
mov cx,0xf424 ; 0000CA2D B924F4 '.$.'
xca30: test byte [0x3e],0x80 ; 0000CA30 F6063E0080 '..>..'
jnz xca41 ; 0000CA35 750A 'u',0x0A
call x919a ; 0000CA37 E860C7 '.`.'
loop xca30 ; 0000CA3A E2F4 '..'
mov ah,0x80 ; 0000CA3C B480 '..'
stc ; 0000CA3E F9 '.'
jmp short xca4e ; 0000CA3F EB0D '.',0x0D
xca41: and byte [0x3e],0x7f ; 0000CA41 80263E007F '.&>..'
call xef6f ; 0000CA46 E82625 '.&%'
call xefdb ; 0000CA49 E88F25 '..%'
xor ah,ah ; 0000CA4C 32E4 '2.'
xca4e: ret ; 0000CA4E C3 '.'
xca4f: mov ax,0x10 ; 0000CA4F B81000 '...'
mul word [bp+0xc] ; 0000CA52 F7660C '.f.'
add ax,[bp+0x2] ; 0000CA55 034602 '.F.'
adc dl,0x0 ; 0000CA58 80D200 '...'
cli ; 0000CA5B FA '.'
out 0xc,al ; 0000CA5C E60C '..'
out 0x4,al ; 0000CA5E E604 '..'
xchg al,ah ; 0000CA60 86C4 '..'
out 0x4,al ; 0000CA62 E604 '..'
xchg al,ah ; 0000CA64 86C4 '..'
mov bx,ax ; 0000CA66 8BD8 '..'
mov al,dl ; 0000CA68 8AC2 '..'
out 0x81,al ; 0000CA6A E681 '..'
mov ax,cx ; 0000CA6C 8BC1 '..'
out 0x5,al ; 0000CA6E E605 '..'
xchg al,ah ; 0000CA70 86C4 '..'
out 0x5,al ; 0000CA72 E605 '..'
xchg al,ah ; 0000CA74 86C4 '..'
sti ; 0000CA76 FB '.'
ret ; 0000CA77 C3 '.'
xca78: mov bh,[bp+0x7] ; 0000CA78 8A7E07 '.~.'
shl bh,0x2 ; 0000CA7B C0E702 '...'
or bh,[bp+0x6] ; 0000CA7E 0A7E06 0x0A,'~.'
call xd4c4 ; 0000CA81 E8400A '.@',0x0A
mov bh,[bp+0x5] ; 0000CA84 8A7E05 '.~.'
call xd4c4 ; 0000CA87 E83A0A '.:',0x0A
ret ; 0000CA8A C3 '.'
times 12 db 0xFF ; 0000CA8B - 0000CA96
xca97: push ax ; 0000CA97 50
mov al,0x20 ; 0000CA98 B020
out 0xa0,al ; 0000CA9A E6A0
out 0x20,al ; 0000CA9C E620
mov al,0xb ; 0000CA9E B00B '..'
call xb544 ; 0000CAA0 E8A1EA '...'
mov ah,al ; 0000CAA3 8AE0 '..'
mov al,0xc ; 0000CAA5 B00C '..'
call xb544 ; 0000CAA7 E89AEA '...'
and al,ah ; 0000CAAA 22C4 '".'
test al,0x40 ; 0000CAAC A840 '.@'
jz xcab3 ; 0000CAAE 7403
call xcac1 ; 0000CAB0 E80E00 '...'
xcab3: test al,0x20 ; 0000CAB3 A820 '. '
jz xcaba ; 0000CAB5 7403 't.'
call xcabc ; 0000CAB7 E80200 '...'
xcaba: pop ax ; 0000CABA 58 'X'
iret ; 0000CABB CF '.'
xcabc: push ax ; 0000CABC 50 'P'
int 0x4a ; 0000CABD CD4A '.J'
pop ax ; 0000CABF 58 'X'
ret ; 0000CAC0 C3 '.'
xcac1: push es ; 0000CAC1 06 '.'
push bx ; 0000CAC2 53 'S'
push ds ; 0000CAC3 1E '.'
push ax ; 0000CAC4 50 'P'
mov ax,0x40 ; 0000CAC5 B84000 '.@.'
mov ds,ax ; 0000CAC8 8ED8 '..'
test byte [0xa0],0x1 ; 0000CACA F606A00001 '.....'
jz xcafc ; 0000CACF 742B 't+'
sub word [0x9c],0x3d0 ; 0000CAD1 812E9C00D003 '......'
jnc xcafc ; 0000CAD7 7323 's#'
sub word [0x9e],byte +0x1 ; 0000CAD9 832E9E0001 '.....'
jnc xcafc ; 0000CADE 731C 's.'
pop ax ; 0000CAE0 58 'X'
push ax ; 0000CAE1 50 'P'
mov al,0xb ; 0000CAE2 B00B '..'
and ah,0xbf ; 0000CAE4 80E4BF '...'
call xb549 ; 0000CAE7 E85FEA '._.'
and byte [0xa0],0xfe ; 0000CAEA 8026A000FE '.&...'
mov ax,[0x9a] ; 0000CAEF A19A00 '...'
mov es,ax ; 0000CAF2 8EC0 '..'
mov bx,[0x98] ; 0000CAF4 8B1E9800 '....'
or byte [es:bx],0x80 ; 0000CAF8 26800F80 '&...'
xcafc: pop ax ; 0000CAFC 58 'X'
pop ds ; 0000CAFD 1F '.'
pop bx ; 0000CAFE 5B '['
pop es ; 0000CAFF 07 '.'
ret ; 0000CB00 C3 '.'
xcb01: push ax ; 0000CB01 50 'P'
and ax,0xe0 ; 0000CB02 25E000 '%..'
xchg ax,si ; 0000CB05 96 '.'
add dx,byte +0x3 ; 0000CB06 83C203 '...'
mov al,0x80 ; 0000CB09 B080 '..'
out dx,al ; 0000CB0B EE '.'
sub dx,byte +0x3 ; 0000CB0C 83EA03 '...'
mov cl,0x4 ; 0000CB0F B104 '..'
shr si,cl ; 0000CB11 D3EE '..'
mov ax,[cs:si+0xcc2e] ; 0000CB13 2E8B842ECC '.....'
out dx,al ; 0000CB18 EE '.'
mov al,ah ; 0000CB19 8AC4 '..'
inc dx ; 0000CB1B 42 'B'
out dx,al ; 0000CB1C EE '.'
inc dx ; 0000CB1D 42 'B'
inc dx ; 0000CB1E 42 'B'
pop ax ; 0000CB1F 58 'X'
and al,0x1f ; 0000CB20 241F '$.'
out dx,al ; 0000CB22 EE '.'
dec dx ; 0000CB23 4A 'J'
dec dx ; 0000CB24 4A 'J'
xor al,al ; 0000CB25 32C0 '2.'
out dx,al ; 0000CB27 EE '.'
dec dx ; 0000CB28 4A 'J'
xcb29: add dx,byte +0x5 ; 0000CB29 83C205 '...'
in al,dx ; 0000CB2C EC '.'
mov ah,al ; 0000CB2D 8AE0 '..'
inc dx ; 0000CB2F 42 'B'
in al,dx ; 0000CB30 EC '.'
ret ; 0000CB31 C3 '.'
xcb32: push ax ; 0000CB32 50 'P'
push dx ; 0000CB33 52 'R'
mov al,0x3 ; 0000CB34 B003 '..'
call xcbbb ; 0000CB36 E88200 '...'
jz xcb48 ; 0000CB39 740D 't',0x0D
mov bh,0x10 ; 0000CB3B B710 '..'
call x9e03 ; 0000CB3D E8C3D2 '...'
jz xcb48 ; 0000CB40 7406 't.'
dec dx ; 0000CB42 4A 'J'
mov bh,0x20 ; 0000CB43 B720 '. '
call x9e03 ; 0000CB45 E8BBD2 '...'
xcb48: pop dx ; 0000CB48 5A 'Z'
pop cx ; 0000CB49 59 'Y'
test ah,ah ; 0000CB4A 84E4 '..'
jnz xcb5b ; 0000CB4C 750D 'u',0x0D
push dx ; 0000CB4E 52 'R'
add dx,byte +0x5 ; 0000CB4F 83C205 '...'
in al,dx ; 0000CB52 EC '.'
mov ah,al ; 0000CB53 8AE0 '..'
mov al,cl ; 0000CB55 8AC1 '..'
pop dx ; 0000CB57 5A 'Z'
out dx,al ; 0000CB58 EE '.'
jmp short xcb5d ; 0000CB59 EB02 '..'
xcb5b: mov al,cl ; 0000CB5B 8AC1 '..'
xcb5d: ret ; 0000CB5D C3 '.'
xcb5e: mov al,0x1 ; 0000CB5E B001 '..'
call xcbbb ; 0000CB60 E85800 '.X.'
jz xcbaa ; 0000CB63 7445 'tE'
mov si,0x71 ; 0000CB65 BE7100 '.q.'
and byte [si],0x7f ; 0000CB68 80247F '.$.'
dec dx ; 0000CB6B 4A 'J'
mov bh,0x1 ; 0000CB6C B701 '..'
xcb6e: mov cx,0x5a ; 0000CB6E B95A00 '.Z.'
mov ah,0x80 ; 0000CB71 B480 '..'
xcb73: push ax ; 0000CB73 50 'P'
mov al,0x0 ; 0000CB74 B000 '..'
out 0x43,al ; 0000CB76 E643 '.C'
in al,0x40 ; 0000CB78 E440 '.@'
xchg al,ah ; 0000CB7A 86C4 '..'
in al,0x40 ; 0000CB7C E440 '.@'
xchg al,ah ; 0000CB7E 86C4 '..'
mov di,ax ; 0000CB80 8BF8 '..'
pop ax ; 0000CB82 58 'X'
xcb83: in al,dx ; 0000CB83 EC '.'
test bh,al ; 0000CB84 84C7 '..'
jnz xcbb1 ; 0000CB86 7529 'u)'
test [si],ah ; 0000CB88 8424 '.$'
jnz xcbaa ; 0000CB8A 751E 'u.'
push ax ; 0000CB8C 50 'P'
mov al,0x0 ; 0000CB8D B000 '..'
out 0x43,al ; 0000CB8F E643 '.C'
in al,0x40 ; 0000CB91 E440 '.@'
xchg al,ah ; 0000CB93 86C4 '..'
in al,0x40 ; 0000CB95 E440 '.@'
xchg al,ah ; 0000CB97 86C4 '..'
push di ; 0000CB99 57 'W'
sub di,ax ; 0000CB9A 2BF8 '+.'
cmp di,0x5d20 ; 0000CB9C 81FF205D '.. ]'
pop di ; 0000CBA0 5F '_'
pop ax ; 0000CBA1 58 'X'
jc xcb83 ; 0000CBA2 72DF 'r.'
loop xcb73 ; 0000CBA4 E2CD '..'
dec bl ; 0000CBA6 FECB '..'
jnz xcb6e ; 0000CBA8 75C4 'u.'
xcbaa: or ah,0x80 ; 0000CBAA 80CC80 '...'
xor al,al ; 0000CBAD 32C0 '2.'
jmp short xcbba ; 0000CBAF EB09 '..'
xcbb1: mov ah,al ; 0000CBB1 8AE0 '..'
sub dx,byte +0x5 ; 0000CBB3 83EA05 '...'
in al,dx ; 0000CBB6 EC '.'
and ah,0x1e ; 0000CBB7 80E41E '...'
xcbba: ret ; 0000CBBA C3 '.'
xcbbb: add dx,byte +0x4 ; 0000CBBB 83C204 '...'
out dx,al ; 0000CBBE EE '.'
inc dx ; 0000CBBF 42 'B'
inc dx ; 0000CBC0 42 'B'
mov bh,0x20 ; 0000CBC1 B720 '. '
jmp x9e03 ; 0000CBC3 E93DD2 '.=.'
add [bx+si],cl ; 0000CBC6 0008 '..'
sbb [bx+si],ch ; 0000CBC8 1828 '.('
db 0x38 ; 0000CBCA 38
xcbcb: cmp al,0x01 ; 0000CBCB 3C01
cmc ; 0000CBCD F5
rcr ah,1 ; 0000CBCE D0DC '..'
rcr ah,1 ; 0000CBD0 D0DC '..'
or ah,ch ; 0000CBD2 0AE5 0x0A,'.'
shl bl,1 ; 0000CBD4 D0E3 '..'
shl bl,1 ; 0000CBD6 D0E3 '..'
or ah,bl ; 0000CBD8 0AE3 0x0A,'.'
xor bl,bl ; 0000CBDA 32DB '2.'
xchg bh,bl ; 0000CBDC 86FB '..'
mov si,0xcbc6 ; 0000CBDE BEC6CB '...'
add si,bx ; 0000CBE1 03F3 '..'
or ah,[cs:si] ; 0000CBE3 2E0A24 '.',0x0A,'$'
mov bh,ah ; 0000CBE6 8AFC '..'
add dx,byte +0x3 ; 0000CBE8 83C203 '...'
mov al,0x80 ; 0000CBEB B080 '..'
out dx,al ; 0000CBED EE '.'
sub dx,byte +0x3 ; 0000CBEE 83EA03 '...'
xor ch,ch ; 0000CBF1 32ED '2.'
mov si,cx ; 0000CBF3 8BF1 '..'
shl si,1 ; 0000CBF5 D1E6 '..'
mov ax,[cs:si+0xcc2e] ; 0000CBF7 2E8B842ECC '.....'
out dx,al ; 0000CBFC EE '.'
xchg ah,al ; 0000CBFD 86E0 '..'
inc dx ; 0000CBFF 42 'B'
out dx,al ; 0000CC00 EE '.'
inc dx ; 0000CC01 42 'B'
inc dx ; 0000CC02 42 'B'
mov al,bh ; 0000CC03 8AC7 '..'
out dx,al ; 0000CC05 EE '.'
dec dx ; 0000CC06 4A 'J'
dec dx ; 0000CC07 4A 'J'
xor al,al ; 0000CC08 32C0 '2.'
out dx,al ; 0000CC0A EE '.'
dec dx ; 0000CC0B 4A 'J'
call xcb29 ; 0000CC0C E81AFF '...'
ret ; 0000CC0F C3 '.'
xcc10: cmp al,0x2 ; 0000CC10 3C02 '<.'
jnc xcc2d ; 0000CC12 7319 's.'
add dx,byte +0x4 ; 0000CC14 83C204 '...'
or al,al ; 0000CC17 0AC0 0x0A,'.'
jnz xcc21 ; 0000CC19 7506 'u.'
in al,dx ; 0000CC1B EC '.'
mov [bp+0xc],al ; 0000CC1C 88460C '.F.'
jmp short xcc27 ; 0000CC1F EB06 '..'
xcc21: and bl,0x1f ; 0000CC21 80E31F '...'
mov al,bl ; 0000CC24 8AC3 '..'
out dx,al ; 0000CC26 EE '.'
xcc27: sub dx,byte +0x4 ; 0000CC27 83EA04 '...'
call xcb29 ; 0000CC2A E8FCFE '...'
xcc2d: ret ; 0000CC2D C3 '.'
pop ss ; 0000CC2E 17 '.'
add al,0x0 ; 0000CC2F 0400 '..'
add ax,[bx+si+0xc001] ; 0000CC31 038001C0 '....'
add [bx+si+0x0],ah ; 0000CC35 006000 '.`.'
xor [bx+si],al ; 0000CC38 3000 '0.'
sbb [bx+si],al ; 0000CC3A 1800 '..'
or al,0x0 ; 0000CC3C 0C00 '..'
push es ; 0000CC3E 06 '.'
add [bp+di],al ; 0000CC3F 0003 '..'
add [bp+si],al ; 0000CC41 0002 '..'
add [bx+si],al ; 0000CC43 0000 '..'
stosb ; 0000CC45 AA '.'
push bp ; 0000CC46 55 'U'
add [bp+si],ax ; 0000CC47 0102 '..'
add al,0x8 ; 0000CC49 0408 '..'
adc [bx+si],ah ; 0000CC4B 1020 '. '
inc ax ; 0000CC4D 40 '@'
cmp bh,0x0 ; 0000CC4E 80FF00 '...'
xcc51: mov al,0x90 ; 0000CC51 B090 '..'
out 0x84,al ; 0000CC53 E684 '..'
mov cx,0xe ; 0000CC55 B90E00 '...'
mov si,0xcc44 ; 0000CC58 BE44CC '.D.'
xcc5b: loop xcc5f ; 0000CC5B E202 '..'
jmp short xcc83 ; 0000CC5D EB24 '.$'
xcc5f: cs lodsb ; 0000CC5F 2EAC '..'
mov ah,al ; 0000CC61 8AE0 '..'
mov al,0x8f ; 0000CC63 B08F '..'
call xb549 ; 0000CC65 E8E1E8 '...'
mov al,0x8f ; 0000CC68 B08F '..'
call xb544 ; 0000CC6A E8D7E8 '...'
cmp ah,al ; 0000CC6D 3AE0 ':.'
jz xcc5b ; 0000CC6F 74EA 't.'
mov al,0x92 ; 0000CC71 B092 '..'
out 0x84,al ; 0000CC73 E684 '..'
mov dx,0x0 ; 0000CC75 BA0000 '...'
mov bx,err102 ; 0000CC78 BB8CB6 '...'
mov cx,err102_len ; 0000CC7B B91A00 '...'
call xc745 ; 0000CC7E E8C4FA '...'
xcc81: jmp short xcc81 ; 0000CC81 Hang the machine
xcc83: mov al,0x91 ; 0000CC83 B091 '..'
out 0x84,al ; 0000CC85 E684 '..'
ret ; 0000CC87 C3 '.'
xcc88: mov al,0x93 ; 0000CC88 B093 '..'
out 0x84,al ; 0000CC8A E684 '..'
mov al,0x4 ; 0000CC8C B004 '..'
out 0x8,al ; 0000CC8E E608 '..'
out 0xd0,al ; 0000CC90 E6D0 '..'
out 0xd,al ; 0000CC92 E60D '.',0x0D
out 0xda,al ; 0000CC94 E6DA '..'
mov cx,0xe ; 0000CC96 B90E00 '...'
mov si,0xcc44 ; 0000CC99 BE44CC '.D.'
xcc9c: loop xcca1 ; 0000CC9C E203 '..'
jmp xcd3a ; 0000CC9E E99900 '...'
xcca1: cs lodsb ; 0000CCA1 2EAC '..'
mov bx,cx ; 0000CCA3 8BD9 '..'
mov dx,0x0 ; 0000CCA5 BA0000 '...'
mov cx,0x8 ; 0000CCA8 B90800 '...'
xccab: out dx,al ; 0000CCAB EE '.'
out dx,al ; 0000CCAC EE '.'
inc dx ; 0000CCAD 42 'B'
loop xccab ; 0000CCAE E2FB '..'
mov dx,0xc0 ; 0000CCB0 BAC000 '...'
mov cx,0x8 ; 0000CCB3 B90800 '...'
xccb6: out dx,al ; 0000CCB6 EE '.'
out dx,al ; 0000CCB7 EE '.'
inc dx ; 0000CCB8 42 'B'
inc dx ; 0000CCB9 42 'B'
loop xccb6 ; 0000CCBA E2FA '..'
out 0x87,al ; 0000CCBC E687 '..'
out 0x83,al ; 0000CCBE E683 '..'
out 0x81,al ; 0000CCC0 E681 '..'
out 0x82,al ; 0000CCC2 E682 '..'
out 0x8b,al ; 0000CCC4 E68B '..'
out 0x89,al ; 0000CCC6 E689 '..'
out 0x8a,al ; 0000CCC8 E68A '..'
mov ah,al ; 0000CCCA 8AE0 '..'
in al,0x87 ; 0000CCCC E487 '..'
cmp al,ah ; 0000CCCE 3AC4 ':.'
jnz xcd2c ; 0000CCD0 755A 'uZ'
jmp short xccd4 ; 0000CCD2 EB00 '..'
xccd4: in al,0x83 ; 0000CCD4 E483 '..'
cmp al,ah ; 0000CCD6 3AC4 ':.'
jnz xcd2c ; 0000CCD8 7552 'uR'
jmp short xccdc ; 0000CCDA EB00 '..'
xccdc: in al,0x81 ; 0000CCDC E481 '..'
cmp al,ah ; 0000CCDE 3AC4 ':.'
jnz xcd2c ; 0000CCE0 754A 'uJ'
jmp short xcce4 ; 0000CCE2 EB00 '..'
xcce4: in al,0x82 ; 0000CCE4 E482 '..'
cmp al,ah ; 0000CCE6 3AC4 ':.'
jnz xcd2c ; 0000CCE8 7542 'uB'
jmp short xccec ; 0000CCEA EB00 '..'
xccec: in al,0x8b ; 0000CCEC E48B '..'
cmp al,ah ; 0000CCEE 3AC4 ':.'
jnz xcd2c ; 0000CCF0 753A 'u:'
jmp short xccf4 ; 0000CCF2 EB00 '..'
xccf4: in al,0x89 ; 0000CCF4 E489 '..'
cmp al,ah ; 0000CCF6 3AC4 ':.'
jnz xcd2c ; 0000CCF8 7532 'u2'
jmp short xccfc ; 0000CCFA EB00 '..'
xccfc: in al,0x8a ; 0000CCFC E48A '..'
cmp al,ah ; 0000CCFE 3AC4 ':.'
jnz xcd2c ; 0000CD00 752A 'u*'
jmp short xcd04 ; 0000CD02 EB00 '..'
xcd04: mov al,0x94 ; 0000CD04 B094 '..'
out 0x84,al ; 0000CD06 E684 '..'
mov dx,0x0 ; 0000CD08 BA0000 '...'
mov cx,0x8 ; 0000CD0B B90800 '...'
xcd0e: in al,dx ; 0000CD0E EC '.'
in al,dx ; 0000CD0F EC '.'
inc dx ; 0000CD10 42 'B'
cmp al,ah ; 0000CD11 3AC4 ':.'
jnz xcd2c ; 0000CD13 7517 'u.'
loop xcd0e ; 0000CD15 E2F7 '..'
mov dx,0xc0 ; 0000CD17 BAC000 '...'
mov cx,0x8 ; 0000CD1A B90800 '...'
xcd1d: in al,dx ; 0000CD1D EC '.'
in al,dx ; 0000CD1E EC '.'
inc dx ; 0000CD1F 42 'B'
inc dx ; 0000CD20 42 'B'
cmp al,ah ; 0000CD21 3AC4 ':.'
jnz xcd2c ; 0000CD23 7507 'u.'
loop xcd1d ; 0000CD25 E2F6 '..'
mov cx,bx ; 0000CD27 8BCB '..'
jmp xcc9c ; 0000CD29 E970FF '.p.'
xcd2c: mov dx,0x0 ; 0000CD2C BA0000 '...'
mov bx,err102 ; 0000CD2F BB8CB6 '...'
mov cx,err102_len ; 0000CD32 B91A00 '...'
call xc745 ; 0000CD35 E80DFA '.',0x0D,'.'
xcd38: jmp short xcd38 ; 0000CD38 Hang the machine
xcd3a: mov al,0x95 ; 0000CD3A B095 '..'
out 0x84,al ; 0000CD3C E684 '..'
out 0xd,al ; 0000CD3E E60D '.',0x0D
out 0xda,al ; 0000CD40 E6DA '..'
mov al,0x0 ; 0000CD42 B000 '..'
out 0x8,al ; 0000CD44 E608 '..'
out 0xd0,al ; 0000CD46 E6D0 '..'
mov al,0x40 ; 0000CD48 B040 '.@'
out 0xb,al ; 0000CD4A E60B '..'
mov al,0x41 ; 0000CD4C B041 '.A'
out 0xb,al ; 0000CD4E E60B '..'
mov al,0x42 ; 0000CD50 B042 '.B'
out 0xb,al ; 0000CD52 E60B '..'
mov al,0x43 ; 0000CD54 B043 '.C'
out 0xb,al ; 0000CD56 E60B '..'
mov al,0xc0 ; 0000CD58 B0C0 '..'
out 0xd6,al ; 0000CD5A E6D6 '..'
mov al,0x41 ; 0000CD5C B041 '.A'
out 0xd6,al ; 0000CD5E E6D6 '..'
mov al,0x42 ; 0000CD60 B042 '.B'
out 0xd6,al ; 0000CD62 E6D6 '..'
mov al,0x43 ; 0000CD64 B043 '.C'
out 0xd6,al ; 0000CD66 E6D6 '..'
mov al,0x96 ; 0000CD68 B096 '..'
out 0x84,al ; 0000CD6A E684 '..'
ret ; 0000CD6C C3 '.'
xcd6d: pushf ; 0000CD6D 9C '.'
cli ; 0000CD6E FA '.'
xcd6f: mov al,0x8a ; 0000CD6F B08A '..'
call xb544 ; 0000CD71 E8D0E7 '...'
test al,0x80 ; 0000CD74 A880 '..'
jz xcd7a ; 0000CD76 7402 't.'
jmp short xcd6f ; 0000CD78 EBF5 '..'
xcd7a: mov al,0x80 ; 0000CD7A B080 '..'
call xb544 ; 0000CD7C E8C5E7 '...'
mov dh,al ; 0000CD7F 8AF0 '..'
mov al,0x82 ; 0000CD81 B082 '..'
call xb544 ; 0000CD83 E8BEE7 '...'
mov cl,al ; 0000CD86 8AC8 '..'
mov al,0x84 ; 0000CD88 B084 '..'
call xb544 ; 0000CD8A E8B7E7 '...'
mov ch,al ; 0000CD8D 8AE8 '..'
popf ; 0000CD8F 9D '.'
mov al,dh ; 0000CD90 8AC6 '..'
call xce67 ; 0000CD92 E8D200 '...'
cmp al,0x3b ; 0000CD95 3C3B '<;'
ja xcdfe ; 0000CD97 7765 'we'
xchg al,ah ; 0000CD99 86C4 '..'
mov si,ax ; 0000CD9B 8BF0 '..'
mov al,cl ; 0000CD9D 8AC1 '..'
call xce67 ; 0000CD9F E8C500 '...'
cmp al,0x3b ; 0000CDA2 3C3B '<;'
ja xcdfe ; 0000CDA4 7758 'wX'
mov bl,al ; 0000CDA6 8AD8 '..'
mov al,ch ; 0000CDA8 8AC5 '..'
call xce67 ; 0000CDAA E8BA00 '...'
cmp al,0x17 ; 0000CDAD 3C17 '<.'
ja xcdfe ; 0000CDAF 774D 'wM'
mov bh,al ; 0000CDB1 8AF8 '..'
mov ax,bx ; 0000CDB3 8BC3 '..'
xor cx,cx ; 0000CDB5 33C9 '3.'
xchg cl,ah ; 0000CDB7 86CC '..'
push cx ; 0000CDB9 51 'Q'
mov cx,0x2223 ; 0000CDBA B92322 '.#"'
mul cx ; 0000CDBD F7E1 '..'
xchg ax,bx ; 0000CDBF 93 '.'
pop ax ; 0000CDC0 58 'X'
push dx ; 0000CDC1 52 'R'
mov cx,0x3c ; 0000CDC2 B93C00 '.<.'
mul cx ; 0000CDC5 F7E1 '..'
mov cx,0x2223 ; 0000CDC7 B92322 '.#"'
mul cx ; 0000CDCA F7E1 '..'
add bx,ax ; 0000CDCC 03D8 '..'
pop cx ; 0000CDCE 59 'Y'
adc dx,cx ; 0000CDCF 13D1 '..'
mov ax,si ; 0000CDD1 8BC6 '..'
mov cl,al ; 0000CDD3 8AC8 '..'
mov al,ah ; 0000CDD5 8AC4 '..'
mov ah,0x92 ; 0000CDD7 B492 '..'
mul ah ; 0000CDD9 F6E4 '..'
shl cx,1 ; 0000CDDB D1E1 '..'
add cx,ax ; 0000CDDD 03C8 '..'
xor ax,ax ; 0000CDDF 33C0 '3.'
add cx,bx ; 0000CDE1 03CB '..'
adc dx,ax ; 0000CDE3 13D0 '..'
xchg dx,cx ; 0000CDE5 87D1 '..'
add dx,byte +0x7 ; 0000CDE7 83C207 '...'
adc cx,ax ; 0000CDEA 13C8 '..'
shr cx,1 ; 0000CDEC D1E9 '..'
rcr dx,1 ; 0000CDEE D1DA '..'
shr cx,1 ; 0000CDF0 D1E9 '..'
rcr dx,1 ; 0000CDF2 D1DA '..'
shr cx,1 ; 0000CDF4 D1E9 '..'
rcr dx,1 ; 0000CDF6 D1DA '..'
mov ah,0x1 ; 0000CDF8 B401 '..'
int 0x1a ; 0000CDFA CD1A '..'
jmp short xce0c ; 0000CDFC EB0E '..'
xcdfe: mov al,0x8e ; 0000CDFE B08E '..'
call xb544 ; 0000CE00 E841E7 '.A.'
or al,0x4 ; 0000CE03 0C04 '..'
mov ah,al ; 0000CE05 8AE0 '..'
mov al,0x8e ; 0000CE07 B08E '..'
call xb549 ; 0000CE09 E83DE7 '.=.'
xce0c: push es ; 0000CE0C 06 '.'
mov ax,0x40 ; 0000CE0D B84000 '.@.'
mov ds,ax ; 0000CE10 8ED8 '..'
xor ax,ax ; 0000CE12 33C0 '3.'
mov es,ax ; 0000CE14 8EC0 '..'
mov bp,[es:0x20] ; 0000CE16 268B2E2000 '&.. .'
mov word [es:0x20],0xce54 ; 0000CE1B 26C706200054CE '&.. .T.'
and byte [0x6b],0xfe ; 0000CE22 80266B00FE '.&k..'
in al,0x21 ; 0000CE27 E421 '.!'
and al,0xfe ; 0000CE29 24FE '$.'
out 0x21,al ; 0000CE2B E621 '.!'
mov bx,0x3c ; 0000CE2D BB3C00 '.<.'
call xc638 ; 0000CE30 E805F8 '...'
test byte [0x6b],0x1 ; 0000CE33 F6066B0001 '..k..'
jnz xce48 ; 0000CE38 750E
mov dx,0x0 ; 0000CE3A BA0000 '...'
mov bx,err102 ; 0000CE3D BB8CB6 '...'
mov cx,err102_len ; 0000CE40 B91A00 '...'
call xc745 ; 0000CE43 E8FFF8 '...'
xce46: jmp short xce46 ; 0000CE46 Hang the machine
xce48: mov [es:0x20],bp ; 0000CE48 26892E2000 '&.. .'
and byte [0x6b],0xfe ; 0000CE4D 80266B00FE '.&k..'
pop es ; 0000CE52 07 '.'
ret ; 0000CE53 C3 '.'
push ds ; 0000CE54 1E '.'
push ax ; 0000CE55 50 'P'
mov ax,0x40 ; 0000CE56 B84000 '.@.'
mov ds,ax ; 0000CE59 8ED8 '..'
or byte [0x6b],0x1 ; 0000CE5B 800E6B0001 '..k..'
mov al,0x20 ; 0000CE60 B020 '. '
out 0x20,al ; 0000CE62 E620 '. '
pop ax ; 0000CE64 58 'X'
pop ds ; 0000CE65 1F '.'
iret ; 0000CE66 CF '.'
xce67: mov ah,al ; 0000CE67 8AE0 '..'
shr ah,0x4 ; 0000CE69 C0EC04 '...'
and al,0xf ; 0000CE6C 240F '$.'
aad ; 0000CE6E D50A '.',0x0A
ret ; 0000CE70 C3 '.'
xce71: mov ax,0x40 ; 0000CE71 B84000 '.@.'
mov ds,ax ; 0000CE74 8ED8 '..'
mov bx,[0x10] ; 0000CE76 8B1E1000 '....'
fninit ; 0000CE7A DBE3 '..'
wait ; 0000CE7C 9B '.'
fnstsw [0x10] ; 0000CE7D DD3E1000 '.>..'
mov al,[0x10] ; 0000CE81 A01000 '...'
or al,al ; 0000CE84 0AC0 0x0A,'.'
jnz xce8b ; 0000CE86 7503 'u.'
or bl,0x2 ; 0000CE88 80CB02 '...'
xce8b: in al,0x60 ; 0000CE8B E460 '.`'
mov al,0xc0 ; 0000CE8D B0C0 '..'
out 0x64,al ; 0000CE8F E664 '.d'
xce91: in al,0x64 ; 0000CE91 E464 '.d'
test al,0x2 ; 0000CE93 A802 '..'
jz xce99 ; 0000CE95 7402 't.'
jmp short xce91 ; 0000CE97 EBF8 '..'
xce99: in al,0x64 ; 0000CE99 E464 '.d'
test al,0x1 ; 0000CE9B A801 '..'
jz xce99 ; 0000CE9D 74FA 't.'
in al,0x60 ; 0000CE9F E460 '.`'
test al,0x4 ; 0000CEA1 A804 '..'
jnz xceac ; 0000CEA3 7507 'u.'
test bl,0x2 ; 0000CEA5 F6C302 '...'
jnz 0xceca ; 0000CEA8 7520 'u '
jmp short xceb7 ; 0000CEAA EB0B '..'
xceac: test bl,0x2 ; 0000CEAC F6C302 '...'
jnz xceb7 ; 0000CEAF 7506 'u.'
and bl,0xfd ; 0000CEB1 80E3FD '...'
jmp short xced6 ; 0000CEB4 EB20 '. '
nop ; 0000CEB6 90 '.'
xceb7: and bl,0xfd ; 0000CEB7 80E3FD '...'
push bx ; 0000CEBA 53 'S'
mov dx,0x0 ; 0000CEBB BA0000 '...'
mov bx,0xb84f ; 0000CEBE BB4FB8 '.O.'
mov cx,0x3d ; 0000CEC1 B93D00 '.=.'
call xc745 ; 0000CEC4 E87EF8 '.~.'
pop bx ; 0000CEC7 5B '['
jmp short xced6 ; 0000CEC8 EB0C '..'
in al,0xa1 ; 0000CECA E4A1 '..'
and al,0xdf ; 0000CECC 24DF '$.'
out 0xa1,al ; 0000CECE E6A1 '..'
in al,0x21 ; 0000CED0 E421 '.!'
and al,0xfb ; 0000CED2 24FB '$.'
out 0x21,al ; 0000CED4 E621 '.!'
xced6: mov [0x10],bx ; 0000CED6 891E1000 '....'
ret ; 0000CEDA C3 '.'
xcedb: mov al,0x8b ; 0000CEDB B08B '..'
out 0x84,al ; 0000CEDD E684 '..'
call xd03e ; 0000CEDF E85C01 '.\.'
jc xceff ; 0000CEE2 721B 'r.'
cmp al,0x5 ; 0000CEE4 3C05 '<.'
jnz xcef8 ; 0000CEE6 7510 'u.'
mov dx,0x0 ; 0000CEE8 BA0000 '...'
mov bx,0xb7a8 ; 0000CEEB BBA8B7 '...'
mov cx,0x2f ; 0000CEEE B92F00 './.'
call xc751 ; 0000CEF1 E85DF8 '.].'
call xcfbf ; 0000CEF4 E8C800 '...'
ret ; 0000CEF7 C3 '.'
xcef8: cmp al,0x0 ; 0000CEF8 3C00 '<.'
jz xcf02 ; 0000CEFA 7406 't.'
call xcfbf ; 0000CEFC E8C000 '...'
xceff: jmp xcf91 ; 0000CEFF E98F00 '...'
xcf02: mov al,0x86 ; 0000CF02 B086 '..'
out 0x84,al ; 0000CF04 E684 '..'
mov al,0xff ; 0000CF06 B0FF '..'
out 0x60,al ; 0000CF08 E660 '.`'
mov cx,0x3e8 ; 0000CF0A B9E803 '...'
xcf0d: push cx ; 0000CF0D 51 'Q'
call xc62f ; 0000CF0E E81EF7 '...'
pop cx ; 0000CF11 59 'Y'
in al,0x64 ; 0000CF12 E464 '.d'
test al,0x1 ; 0000CF14 A801 '..'
jnz xcf1d ; 0000CF16 7505 'u.'
loop xcf0d ; 0000CF18 E2F3 '..'
jmp xcfa8 ; 0000CF1A E98B00 '...'
xcf1d: in al,0x60 ; 0000CF1D E460 '.`'
cmp al,0xfa ; 0000CF1F 3CFA '<.'
jz xcf28 ; 0000CF21 7405 't.'
loop xcf0d ; 0000CF23 E2E8 '..'
jmp xcfa8 ; 0000CF25 E98000 '...'
xcf28: mov al,0x87 ; 0000CF28 B087 '..'
out 0x84,al ; 0000CF2A E684 '..'
mov cx,0x1388 ; 0000CF2C B98813 '...'
xcf2f: in al,0x64 ; 0000CF2F E464 '.d'
test al,0x1 ; 0000CF31 A801 '..'
jnz xcf3f ; 0000CF33 750A 'u',0x0A
push cx ; 0000CF35 51 'Q'
call xc62f ; 0000CF36 E8F6F6 '...'
pop cx ; 0000CF39 59 'Y'
loop xcf2f ; 0000CF3A E2F3 '..'
jmp short xcfa8 ; 0000CF3C EB6A '.j'
nop ; 0000CF3E 90 '.'
xcf3f: mov al,0x88 ; 0000CF3F B088 '..'
out 0x84,al ; 0000CF41 E684 '..'
in al,0x60 ; 0000CF43 E460 '.`'
cmp al,0xaa ; 0000CF45 3CAA '<.'
jz xcf4c ; 0000CF47 7403 't.'
jmp short xcf91 ; 0000CF49 EB46 '.F'
nop ; 0000CF4B 90 '.'
xcf4c: mov al,0x89 ; 0000CF4C B089 '..'
out 0x84,al ; 0000CF4E E684 '..'
mov al,0xae ; 0000CF50 B0AE '..'
out 0x64,al ; 0000CF52 E664 '.d'
mov cx,0xffff ; 0000CF54 B9FFFF '...'
xcf57: in al,0x64 ; 0000CF57 E464 '.d'
test al,0x2 ; 0000CF59 A802 '..'
jz xcf62 ; 0000CF5B 7405 't.'
loop xcf57 ; 0000CF5D E2F8 '..'
jmp short xcf91 ; 0000CF5F EB30 '.0'
nop ; 0000CF61 90 '.'
xcf62: mov cx,0xa ; 0000CF62 B90A00 '.',0x0A,'.'
xcf65: in al,0x64 ; 0000CF65 E464 '.d'
test al,0x1 ; 0000CF67 A801 '..'
jnz xcf74 ; 0000CF69 7509 'u.'
push cx ; 0000CF6B 51 'Q'
call xc62f ; 0000CF6C E8C0F6 '...'
pop cx ; 0000CF6F 59 'Y'
loop xcf65 ; 0000CF70 E2F3 '..'
jmp short xcf8c ; 0000CF72 EB18 '..'
xcf74: mov al,0x8a ; 0000CF74 B08A '..'
out 0x84,al ; 0000CF76 E684 '..'
in al,0x60 ; 0000CF78 E460 '.`'
push ax ; 0000CF7A 50 'P'
mov al,0xad ; 0000CF7B B0AD '..'
out 0x64,al ; 0000CF7D E664 '.d'
xcf7f: in al,0x64 ; 0000CF7F E464 '.d'
test al,0x2 ; 0000CF81 A802 '..'
jnz xcf7f ; 0000CF83 75FA 'u.'
pop ax ; 0000CF85 58 'X'
call xc7b8 ; 0000CF86 E82FF8 './.'
jmp short xcf91 ; 0000CF89 EB06 '..'
nop ; 0000CF8B 90 '.'
xcf8c: mov al,0x8d ; 0000CF8C B08D '..'
out 0x84,al ; 0000CF8E E684 '..'
ret ; 0000CF90 C3 '.'
xcf91: mov ax,0x40 ; 0000CF91 B84000 '.@.'
mov ds,ax ; 0000CF94 8ED8 '..'
or byte [0x12],0xff ; 0000CF96 800E1200FF '.....'
mov dx,0x0 ; 0000CF9B BA0000 '...'
mov bx,0xb7d7 ; 0000CF9E BBD7B7 '...'
mov cx,0x15 ; 0000CFA1 B91500 '...'
call xc745 ; 0000CFA4 E89EF7 '...'
ret ; 0000CFA7 C3 '.'
xcfa8: mov ax,0x40 ; 0000CFA8 B84000 '.@.'
mov ds,ax ; 0000CFAB 8ED8 '..'
or byte [0x12],0xff ; 0000CFAD 800E1200FF '.....'
mov dx,0x0 ; 0000CFB2 BA0000 '...'
mov bx,0xb7ec ; 0000CFB5 BBECB7 '...'
mov cx,0x24 ; 0000CFB8 B92400 '.$.'
call xc745 ; 0000CFBB E887F7 '...'
ret ; 0000CFBE C3 '.'
xcfbf: mov al,0xae ; 0000CFBF B0AE '..'
out 0x64,al ; 0000CFC1 E664 '.d'
mov cx,0xffff ; 0000CFC3 B9FFFF '...'
xcfc6: in al,0x64 ; 0000CFC6 E464 '.d'
test al,0x2 ; 0000CFC8 A802 '..'
jz xcfdc ; 0000CFCA 7410 't.'
loop xcfc6 ; 0000CFCC E2F8 '..'
mov dx,0x0 ; 0000CFCE BA0000 '...'
mov bx,0xb810 ; 0000CFD1 BB10B8 '...'
mov cx,0x1f ; 0000CFD4 B91F00 '...'
call xc745 ; 0000CFD7 E86BF7 '.k.'
xcfda: jmp short xcfda ; 0000CFDA Hang the machine
xcfdc: ret ; 0000CFDC C3 '.'
xcfdd: mov al,0x80 ; 0000CFDD B080 '..'
out 0x84,al ; 0000CFDF E684 '..'
mov al,0xad ; 0000CFE1 B0AD '..'
out 0x64,al ; 0000CFE3 E664 '.d'
xcfe5: in al,0x64 ; 0000CFE5 E464 '.d'
test al,0x2 ; 0000CFE7 A802 '..'
jnz xcfe5 ; 0000CFE9 75FA 'u.'
xcfeb: in al,0x64 ; 0000CFEB E464 '.d'
test al,0x1 ; 0000CFED A801 '..'
jz xcff5 ; 0000CFEF 7404 't.'
in al,0x60 ; 0000CFF1 E460 '.`'
jmp short xcfeb ; 0000CFF3 EBF6 '..'
xcff5: mov al,0x81 ; 0000CFF5 B081 '..'
out 0x84,al ; 0000CFF7 E684 '..'
mov al,0xaa ; 0000CFF9 B0AA '..'
out 0x64,al ; 0000CFFB E664 '.d'
mov cx,0x2710 ; 0000CFFD B91027 '..',0x27
xd000: in al,0x64 ; 0000D000 E464 '.d'
test al,0x1 ; 0000D002 A801 '..'
jnz xd00f ; 0000D004 7509 'u.'
push cx ; 0000D006 51 'Q'
call xc62f ; 0000D007 E825F6 '.%.'
pop cx ; 0000D00A 59 'Y'
loop xd000 ; 0000D00B E2F3 '..'
jmp short xd019 ; 0000D00D EB0A '.',0x0A
xd00f: mov al,0x82 ; 0000D00F B082 '..'
out 0x84,al ; 0000D011 E684 '..'
in al,0x60 ; 0000D013 E460 '.`'
cmp al,0x55 ; 0000D015 3C55 '<U'
jz xd02b ; 0000D017 7412 't.'
xd019: mov al,0x83 ; 0000D019 B083 '..'
out 0x84,al ; 0000D01B E684 '..'
mov dx,0x0 ; 0000D01D BA0000 '...'
mov bx,0xb810 ; 0000D020 BB10B8 '...'
mov cx,0x1f ; 0000D023 B91F00 '...'
call xc745 ; 0000D026 E81CF7 '...'
xd029: jmp short xd029 ; 0000D029 EBFE Hang the machine
xd02b: mov al,0x84 ; 0000D02B B084 '..'
out 0x84,al ; 0000D02D E684 '..'
mov al,0x60 ; 0000D02F B060 '.`'
out 0x64,al ; 0000D031 E664 '.d'
xd033: in al,0x64 ; 0000D033 E464 '.d'
test al,0x2 ; 0000D035 A802 '..'
jnz xd033 ; 0000D037 75FA 'u.'
mov al,0x5d ; 0000D039 B05D '.]'
out 0x60,al ; 0000D03B E660 '.`'
ret ; 0000D03D C3 '.'
xd03e: mov al,0xab ; 0000D03E B0AB '..'
out 0x64,al ; 0000D040 E664 '.d'
xd042: in al,0x64 ; 0000D042 E464 '.d'
test al,0x2 ; 0000D044 A802 '..'
jnz xd042 ; 0000D046 75FA 'u.'
mov cx,0x64 ; 0000D048 B96400 '.d.'
xd04b: in al,0x64 ; 0000D04B E464 '.d'
test al,0x1 ; 0000D04D A801 '..'
jnz xd05a ; 0000D04F 7509 'u.'
push cx ; 0000D051 51 'Q'
call xc62f ; 0000D052 E8DAF5 '...'
pop cx ; 0000D055 59 'Y'
loop xd04b ; 0000D056 E2F3 '..'
jmp short xd063 ; 0000D058 EB09 '..'
xd05a: mov al,0x8c ; 0000D05A B08C '..'
out 0x84,al ; 0000D05C E684 '..'
in al,0x60 ; 0000D05E E460 '.`'
clc ; 0000D060 F8 '.'
jmp short xd064 ; 0000D061 EB01 '..'
xd063: stc ; 0000D063 F9 '.'
xd064: ret ; 0000D064 C3 '.'
std ; 0000D065 FD '.'
cli ; 0000D066 FA '.'
stc ; 0000D067 F9 '.'
div ch ; 0000D068 F6F5 '..'
jmp 0xd6da:0xe5e9 ; 0000D06A EAE9E5DAD6 '.....'
aad 0xaa ; 0000D06F D5AA '..'
test ax,0x9aa5 ; 0000D071 A9A59A '...'
xchg ax,bp ; 0000D074 95 '.'
xchg ax,si ; 0000D075 96 '.'
push si ; 0000D076 56 'V'
push bp ; 0000D077 55 'U'
db 0xFE ; 0000D078 FE '.'
xd079: push bp ; 0000D079 55 'U'
mov di,0x0 ; 0000D07A BF0000 '...'
mov bp,0xd083 ; 0000D07D BD83D0 '...'
jmp x87e4 ; 0000D080 E961B7 '.a.'
and bl,0xc0 ; 0000D083 80E3C0 '...'
cmp bl,0x40 ; 0000D086 80FB40 '..@'
jnz xd0c2 ; 0000D089 7537 'u7'
mov di,0x1 ; 0000D08B BF0100 '...'
mov bp,0xd094 ; 0000D08E BD94D0 '...'
jmp x87e4 ; 0000D091 E950B7 '.P.'
push es ; 0000D094 06 '.'
mov ax,cs ; 0000D095 8CC8 '..'
mov es,ax ; 0000D097 8EC0 '..'
mov di,0xd065 ; 0000D099 BF65D0 '.e.'
mov cx,0x14 ; 0000D09C B91400 '...'
mov al,bl ; 0000D09F 8AC3 '..'
repne scasb ; 0000D0A1 F2AE '..'
jnz xd0a7 ; 0000D0A3 7502 'u.'
jmp short xd0c1 ; 0000D0A5 EB1A '..'
xd0a7: mov dx,0x0 ; 0000D0A7 BA0000 '...'
mov bx,err207 ; 0000D0AA BBE3B6 '...'
mov cx,err207_len ; 0000D0AD B92300 '.#.'
call xc745 ; 0000D0B0 E892F6 '...'
mov al,0xe ; 0000D0B3 B00E '..'
call xb544 ; 0000D0B5 E88CE4 '...'
or al,0x20 ; 0000D0B8 0C20 '. '
mov ah,0xe ; 0000D0BA B40E '..'
xchg ah,al ; 0000D0BC 86E0 '..'
call xb549 ; 0000D0BE E888E4 '...'
xd0c1: pop es ; 0000D0C1 07 '.'
xd0c2: pop bp ; 0000D0C2 5D ']'
ret ; 0000D0C3 C3 '.'
mov byte [bp+0x1],0x0 ; 0000D0C4 C6460100 '.F..'
add dx,byte +0x6 ; 0000D0C8 83C206 '...'
in al,dx ; 0000D0CB EC '.'
sub dx,byte +0x6 ; 0000D0CC 83EA06 '...'
test al,0x4 ; 0000D0CF A804 '..'
jnz xd141 ; 0000D0D1 756E 'un'
test al,0x2 ; 0000D0D3 A802 '..'
jz xd145 ; 0000D0D5 746E 'tn'
mov byte [bp+0x1],0x1 ; 0000D0D7 C6460101 '.F..'
mov al,0x10 ; 0000D0DB B010 '..'
out dx,al ; 0000D0DD EE '.'
inc dx ; 0000D0DE 42 'B'
in al,dx ; 0000D0DF EC '.'
mov ah,al ; 0000D0E0 8AE0 '..'
dec dx ; 0000D0E2 4A 'J'
mov al,0x11 ; 0000D0E3 B011 '..'
out dx,al ; 0000D0E5 EE '.'
inc dx ; 0000D0E6 42 'B'
in al,dx ; 0000D0E7 EC '.'
dec dx ; 0000D0E8 4A 'J'
sub ax,[0x4e] ; 0000D0E9 2B064E00 '+.N.'
cmp ax,0x1005 ; 0000D0ED 3D0510 '=..'
jl xd0f4 ; 0000D0F0 7C02 '|.'
xor ax,ax ; 0000D0F2 33C0 '3.'
xd0f4: xor bh,bh ; 0000D0F4 32FF '2.'
mov bl,[0x49] ; 0000D0F6 8A1E4900 '..I.'
sub al,[cs:bx+0xd15e] ; 0000D0FA 2E2A875ED1 '.*.^.'
sbb ah,0x0 ; 0000D0FF 80DC00 '...'
jns xd106 ; 0000D102 7902 'y.'
xor ax,ax ; 0000D104 33C0 '3.'
xd106: mov cl,[0x4a] ; 0000D106 8A0E4A00 '..J.'
cmp bl,0x4 ; 0000D10A 80FB04 '...'
jc xd146 ; 0000D10D 7237 'r7'
cmp bl,0x7 ; 0000D10F 80FB07 '...'
jz xd146 ; 0000D112 7432 't2'
mov cl,0x28 ; 0000D114 B128 '.('
div cl ; 0000D116 F6F1 '..'
mov cl,al ; 0000D118 8AC8 '..'
shr cl,1 ; 0000D11A D0E9 '..'
shr cl,1 ; 0000D11C D0E9 '..'
mov [bp+0x3],cl ; 0000D11E 884E03 '.N.'
mov [bp+0x2],ah ; 0000D121 886602 '.f.'
shl al,1 ; 0000D124 D0E0 '..'
mov [bp+0x5],al ; 0000D126 884605 '.F.'
mov cl,0x3 ; 0000D129 B103 '..'
xchg ah,al ; 0000D12B 86E0 '..'
xor ah,ah ; 0000D12D 32E4 '2.'
shl ax,cl ; 0000D12F D3E0 '..'
mov [bp+0x6],ax ; 0000D131 894606 '.F.'
cmp byte [0x49],0x6 ; 0000D134 803E490006 '.>I..'
jnz xd141 ; 0000D139 7506 'u.'
shl byte [bp+0x2],1 ; 0000D13B D06602 '.f.'
shl word [bp+0x6],1 ; 0000D13E D16606 '.f.'
xd141: add dx,byte +0x7 ; 0000D141 83C207 '...'
out dx,al ; 0000D144 EE '.'
xd145: ret ; 0000D145 C3 '.'
xd146: div cl ; 0000D146 F6F1 '..'
mov [bp+0x3],al ; 0000D148 884603 '.F.'
mov [bp+0x2],ah ; 0000D14B 886602 '.f.'
mov cl,0x3 ; 0000D14E B103 '..'
mov bl,ah ; 0000D150 8ADC '..'
shl bx,cl ; 0000D152 D3E3 '..'
mov [bp+0x6],bx ; 0000D154 895E06 '.^.'
shl al,cl ; 0000D157 D2E0 '..'
mov [bp+0x5],al ; 0000D159 884605 '.F.'
jmp short xd141 ; 0000D15C EBE3 '..'
add ax,[bp+di] ; 0000D15E 0303 '..'
add ax,0x305 ; 0000D160 050503 '...'
add ax,[bp+di] ; 0000D163 0303 '..'
add al,0x8a ; 0000D165 048A '..'
bound ax,[ds:bx+si] ; 0000D167 3E6200 '>b.'
cmp al,0x7 ; 0000D16A 3C07 '<.'
jz xd1ce ; 0000D16C 7460 't`'
cmp al,0x8 ; 0000D16E 3C08 '<.'
db 'tF<',0x0A,'t_<',0x0D,'tK'
mov cx,0x1 ; 0000D17A B90100 '...'
mov ah,0xa ; 0000D17D B40A '.',0x0A
call x83db ; 0000D17F E859B2 '.Y.'
mov ah,0x3 ; 0000D182 B403 '..'
call x83db ; 0000D184 E854B2 '.T.'
inc dl ; 0000D187 FEC2 '..'
cmp dl,[0x4a] ; 0000D189 3A164A00 ':.J.'
jnz xd1ab ; 0000D18D 751C 'u.'
xor dl,dl ; 0000D18F 32D2 '2.'
inc dh ; 0000D191 FEC6 '..'
cmp dh,0x19 ; 0000D193 80FE19 '...'
jnz xd1ab ; 0000D196 7513 'u.'
dec dh ; 0000D198 FECE '..'
mov ah,0x2 ; 0000D19A B402 '..'
call x83db ; 0000D19C E83CB2 '.<.'
mov ah,0x8 ; 0000D19F B408 '..'
call x83db ; 0000D1A1 E837B2 '.7.'
push bx ; 0000D1A4 53 'S'
mov bh,ah ; 0000D1A5 8AFC '..'
call xd1ea ; 0000D1A7 E84000 '.@.'
pop bx ; 0000D1AA 5B '['
xd1ab: mov ah,0x2 ; 0000D1AB B402 '..'
call x83db ; 0000D1AD E82BB2 '.+.'
xd1b0: mov ah,[0x49] ; 0000D1B0 8A264900 '.&I.'
mov [bp+0x1],ah ; 0000D1B4 886601 '.f.'
ret ; 0000D1B7 C3 '.'
mov ah,0x3 ; 0000D1B8 B403 '..'
call x83db ; 0000D1BA E81EB2 '...'
or dl,dl ; 0000D1BD 0AD2 0x0A,'.'
jz xd1b0 ; 0000D1BF 74EF 't.'
dec dl ; 0000D1C1 FECA '..'
jmp short xd1ab ; 0000D1C3 EBE6 '..'
mov ah,0x3 ; 0000D1C5 B403 '..'
call x83db ; 0000D1C7 E811B2 '...'
xor dl,dl ; 0000D1CA 32D2 '2.'
jmp short xd1ab ; 0000D1CC EBDD '..'
xd1ce: mov bx,0x1f4 ; 0000D1CE BBF401 '...'
call xc7db ; 0000D1D1 E807F6 '...'
ret ; 0000D1D4 C3 '.'
mov ah,0x3 ; 0000D1D5 B403 '..'
call x83db ; 0000D1D7 E801B2 '...'
cmp dh,0x18 ; 0000D1DA 80FE18 '...'
jz xd1e3 ; 0000D1DD 7404 't.'
inc dh ; 0000D1DF FEC6 '..'
jmp short xd1ab ; 0000D1E1 EBC8 '..'
xd1e3: mov ah,0x8 ; 0000D1E3 B408 '..'
call x83db ; 0000D1E5 E8F3B1 '...'
mov bh,ah ; 0000D1E8 8AFC '..'
xd1ea: push cx ; 0000D1EA 51 'Q'
push dx ; 0000D1EB 52 'R'
cmp byte [0x49],0x7 ; 0000D1EC 803E490007 '.>I..'
jz xd1fc ; 0000D1F1 7409 't.'
cmp byte [0x49],0x3 ; 0000D1F3 803E490003 '.>I..'
jna xd1fc ; 0000D1F8 7602 'v.'
mov bh,0x0 ; 0000D1FA B700 '..'
xd1fc: mov ax,0x601 ; 0000D1FC B80106 '...'
xor cx,cx ; 0000D1FF 33C9 '3.'
mov dh,0x18 ; 0000D201 B618 '..'
mov dl,[0x4a] ; 0000D203 8A164A00 '..J.'
dec dx ; 0000D207 4A 'J'
call x83db ; 0000D208 E8D0B1 '...'
pop dx ; 0000D20B 5A 'Z'
pop cx ; 0000D20C 59 'Y'
ret ; 0000D20D C3 '.'
db 0x1c,0x1d,'*578F' ; 0000D20E 1C1D2A35373846
xd215: or ah,ah ; 0000D215 0AE4
jz xd21c ; 0000D217 7403
jns xd220 ; 0000D219 7905
stc ; 0000D21B F9 '.'
xd21c: ret ; 0000D21C C3 '.'
xd21d: jmp xd335 ; 0000D21D E91501 '...'
xd220: cmp ah,0x39 ; 0000D220 80FC39 '..9'
jg xd21c ; 0000D223 7FF7 '..'
mov bl,ah ; 0000D225 8ADC '..'
xor bh,bh ; 0000D227 32FF '2.'
mov al,[cs:bx+0x9b1f] ; 0000D229 2E8A871F9B '.....'
test byte [0x17],0x8 ; 0000D22E F606170008 '.....'
jnz xd21d ; 0000D233 75E8 'u.'
test byte [0x17],0x4 ; 0000D235 F606170004 '.....'
jnz xd252 ; 0000D23A 7516 'u.'
and al,0x7f ; 0000D23C 247F '$.'
test byte [0x17],0x3 ; 0000D23E F606170003 '.....'
jz xd248 ; 0000D243 7403 't.'
jmp xd2f7 ; 0000D245 E9AF00 '...'
xd248: test byte [0x17],0x40 ; 0000D248 F606170040 '....@'
jz xd2b2 ; 0000D24D 7463 'tc'
jmp xd2eb ; 0000D24F E99900 '...'
xd252: cmp ah,0xf ; 0000D252 80FC0F '...'
jnz xd25c ; 0000D255 7505 'u.'
mov ax,0x9400 ; 0000D257 B80094 '...'
jmp short xd2d2 ; 0000D25A EB76 '.v'
xd25c: cmp ah,0x35 ; 0000D25C 80FC35 '..5'
jnz xd272 ; 0000D25F 7511 'u.'
test byte [0x96],0x2 ; 0000D261 F606960002 '.....'
jz xd272 ; 0000D266 740A 't',0x0A
and byte [0x96],0xfd ; 0000D268 80269600FD '.&...'
mov ax,0x9500 ; 0000D26D B80095 '...'
jmp short xd2d2 ; 0000D270 EB60 '.`'
xd272: or al,al ; 0000D272 0AC0 0x0A,'.'
js xd2d5 ; 0000D274 785F 'x_'
cmp ah,0x3 ; 0000D276 80FC03 '...'
jz xd2d9 ; 0000D279 745E 't^'
cmp ah,0xe ; 0000D27B 80FC0E '...'
jz xd2dd ; 0000D27E 745D 't]'
cmp ah,0x1c ; 0000D280 80FC1C '...'
jz xd2e1 ; 0000D283 745C 't\'
cmp ah,0x37 ; 0000D285 80FC37 '..7'
jnz xd2a4 ; 0000D288 751A
test byte [0x96],0x10 ; 0000D28A F606960010 '.....'
jz xd2d7 ; 0000D28F 7446 'tF'
test byte [0x96],0x2 ; 0000D291 F606960002 '.....'
jnz xd29d ; 0000D296 7505 'u.'
mov ax,0x9600 ; 0000D298 B80096 '...'
jmp short xd2d2 ; 0000D29B EB35 '.5'
xd29d: and byte [0x96],0xfd ; 0000D29D 80269600FD '.&...'
jmp short xd2d7 ; 0000D2A2 EB33 '.3'
xd2a4: cmp al,0x20 ; 0000D2A4 3C20
jng xd2b2 ; 0000D2A6 7E0A
cmp al,0x61 ; 0000D2A8 3C61
jl xd2e1 ; 0000D2AA 7C35
cmp al,0x7b ; 0000D2AC 3C7B
jnl xd2e1 ; 0000D2AE 7D31
and al,0x1f ; 0000D2B0 241F '$.'
xd2b2: test byte [0x96],0x2 ; 0000D2B2 F606960002 '.....'
jz xd2d2 ; 0000D2B7 7419 't.'
push ax ; 0000D2B9 50 'P'
mov cx,cs ; 0000D2BA 8CC9 '..'
mov es,cx ; 0000D2BC 8EC1 '..'
mov di,0xd20e ; 0000D2BE BF0ED2 '...'
mov cx,0x7 ; 0000D2C1 B90700 '...'
mov al,ah ; 0000D2C4 8AC4 '..'
repne scasb ; 0000D2C6 F2AE '..'
pop ax ; 0000D2C8 58 'X'
jnz xd2d2 ; 0000D2C9 7507 'u.'
and byte [0x96],0xfd ; 0000D2CB 80269600FD '.&...'
mov ah,0xe0 ; 0000D2D0 B4E0 '..'
xd2d2: call xd3b4 ; 0000D2D2 E8DF00 '...'
xd2d5: stc ; 0000D2D5 F9 '.'
ret ; 0000D2D6 C3 '.'
xd2d7: mov ah,0x72 ; 0000D2D7 B472 '.r'
xd2d9: xor al,al ; 0000D2D9 32C0 '2.'
jmp short xd2b2 ; 0000D2DB EBD5 '..'
xd2dd: mov al,0x7f ; 0000D2DD B07F '..'
jmp short xd2b2 ; 0000D2DF EBD1 '..'
xd2e1: mov si,0x9baa ; 0000D2E1 BEAA9B '...'
call x9b08 ; 0000D2E4 E821C8 '.!.'
jc xd2b2 ; 0000D2E7 72C9 'r.'
jmp short xd2d5 ; 0000D2E9 EBEA '..'
xd2eb: cmp al,0x61 ; 0000D2EB 3C61 '<a'
jl xd2b2 ; 0000D2ED 7CC3 '|.'
cmp al,0x7a ; 0000D2EF 3C7A '<z'
jg xd2b2 ; 0000D2F1 7FBF '..'
sub al,0x20 ; 0000D2F3 2C20 ', '
jmp short xd2b2 ; 0000D2F5 EBBB '..'
xd2f7: cmp ah,0x37 ; 0000D2F7 80FC37 '..7'
jz xd2d2 ; 0000D2FA 74D6 't.'
cmp ah,0x35 ; 0000D2FC 80FC35 '..5'
jnz xd30f ; 0000D2FF 750E 'u.'
test byte [0x96],0x2 ; 0000D301 F606960002 '.....'
jz xd30f ; 0000D306 7407 't.'
and byte [0x96],0xfd ; 0000D308 80269600FD '.&...'
jmp short xd2d2 ; 0000D30D EBC3 '..'
xd30f: cmp ah,0xf ; 0000D30F 80FC0F '...'
jz xd31d ; 0000D312 7409 't.'
jg xd321 ; 0000D314 7F0B '..'
mov al,[cs:bx+0x9b59] ; 0000D316 2E8A87599B '...Y.'
jmp short xd2b2 ; 0000D31B EB95 '..'
xd31d: xor al,al ; 0000D31D 32C0 '2.'
jmp short xd2b2 ; 0000D31F EB91 '..'
xd321: mov si,0x9b69 ; 0000D321 BE699B '.i.'
call x9b08 ; 0000D324 E8E1C7 '...'
jc xd2b2 ; 0000D327 7289 'r.'
test byte [0x17],0x40 ; 0000D329 F606170040 '....@'
jnz xd2b2 ; 0000D32E 7582 'u.'
sub al,0x20 ; 0000D330 2C20 ', '
jmp xd2b2 ; 0000D332 E97DFF '.}.'
xd335: and al,0x7f ; 0000D335 247F '$.'
cmp ah,0x35 ; 0000D337 80FC35 '..5'
jnz xd34d ; 0000D33A 7511 'u.'
test byte [0x96],0x2 ; 0000D33C F606960002 '.....'
jz xd34d ; 0000D341 740A 't',0x0A
and byte [0x96],0xfd ; 0000D343 80269600FD '.&...'
mov ah,0xa4 ; 0000D348 B4A4 '..'
jmp short xd397 ; 0000D34A EB4B '.K'
nop ; 0000D34C 90 '.'
xd34d: cmp ah,0x1c ; 0000D34D 80FC1C '...'
jnz xd363 ; 0000D350 7511 'u.'
test byte [0x96],0x2 ; 0000D352 F606960002 '.....'
jz xd363 ; 0000D357 740A 't',0x0A
and byte [0x96],0xfd ; 0000D359 80269600FD '.&...'
mov ah,0xa6 ; 0000D35E B4A6 '..'
jmp short xd397 ; 0000D360 EB35 '.5'
nop ; 0000D362 90 '.'
xd363: cmp ah,0xf ; 0000D363 80FC0F '...'
jnz xd36d ; 0000D366 7505 'u.'
mov ah,0xa5 ; 0000D368 B4A5 '..'
jmp short xd397 ; 0000D36A EB2B '.+'
nop ; 0000D36C 90 '.'
xd36d: push ax ; 0000D36D 50 'P'
mov al,ah ; 0000D36E 8AC4 '..'
mov cx,cs ; 0000D370 8CC9 '..'
mov es,cx ; 0000D372 8EC1 '..'
mov cx,0xd ; 0000D374 B90D00 '.',0x0D,'.'
nop ; 0000D377 90 '.'
cld ; 0000D378 FC '.'
mov di,0xd3a7 ; 0000D379 BFA7D3 '...'
repne scasb ; 0000D37C F2AE '..'
pop ax ; 0000D37E 58 'X'
jz xd3a3 ; 0000D37F 7422 't"'
cmp al,0x20 ; 0000D381 3C20 '< '
jz xd399 ; 0000D383 7414 't.'
cmp ah,0x2 ; 0000D385 80FC02 '...'
jl xd39c ; 0000D388 7C12 '|.'
cmp ah,0xe ; 0000D38A 80FC0E '...'
jl xd39e ; 0000D38D 7C0F '|.'
cmp al,0x61 ; 0000D38F 3C61 '<a'
jl xd39c ; 0000D391 7C09 '|.'
cmp al,0x7a ; 0000D393 3C7A '<z'
jg xd39c ; 0000D395 7F05 '..'
xd397: xor al,al ; 0000D397 32C0 '2.'
xd399: call xd3b4 ; 0000D399 E81800 '...'
xd39c: stc ; 0000D39C F9 '.'
ret ; 0000D39D C3 '.'
xd39e: add ah,0x76 ; 0000D39E 80C476 '..v'
jmp short xd397 ; 0000D3A1 EBF4 '..'
xd3a3: mov al,0xf0 ; 0000D3A3 B0F0 '..'
jmp short xd399 ; 0000D3A5 EBF2 '..'
add [0x1b1a],cx ; 0000D3A7 010E1A1B '....'
sbb al,0x27 ; 0000D3AB 1C27 '.',0x27
db '()+3457'
xd3b4: cli ; 0000D3B4 FA '.'
mov si,[0x1c] ; 0000D3B5 8B361C00 '.6..'
mov [si],ax ; 0000D3B9 8904 '..'
inc si ; 0000D3BB 46 'F'
inc si ; 0000D3BC 46 'F'
cmp si,[0x82] ; 0000D3BD 3B368200 ';6..'
jnz xd3c7 ; 0000D3C1 7504 'u.'
mov si,[0x80] ; 0000D3C3 8B368000 '.6..'
xd3c7: cmp si,[0x1a] ; 0000D3C7 3B361A00 ';6..'
jz xd3de ; 0000D3CB 7411 't.'
mov [0x1c],si ; 0000D3CD 89361C00 '.6..'
sti ; 0000D3D1 FB '.'
call xeb0c ; 0000D3D2 E83717 '.7.'
inc bp ; 0000D3D5 45 'E'
push ax ; 0000D3D6 50 'P'
mov ax,0x9102 ; 0000D3D7 B80291 '...'
int 0x15 ; 0000D3DA CD15 '..'
pop ax ; 0000D3DC 58 'X'
ret ; 0000D3DD C3 '.'
xd3de: sti ; 0000D3DE FB '.'
push ax ; 0000D3DF 50 'P'
mov bx,0x7d ; 0000D3E0 BB7D00 '.}.'
call xc7db ; 0000D3E3 E8F5F3 '...'
pop ax ; 0000D3E6 58 'X'
ret ; 0000D3E7 C3 '.'
xd3e8: mov ah,0x1 ; 0000D3E8 B401 '..'
mov al,[bp+0x0] ; 0000D3EA 8A4600 '.F.'
or word [bp+0x16],0x1 ; 0000D3ED 814E160100 '.N...'
ret ; 0000D3F2 C3 '.'
xd3f3: push dx ; 0000D3F3 52 'R'
call xd430 ; 0000D3F4 E83900 '.9.'
test al,0x40 ; 0000D3F7 A840 '.@'
pop dx ; 0000D3F9 5A 'Z'
ret ; 0000D3FA C3 '.'
xd3fb: mov al,0x90 ; 0000D3FB B090 '..'
jmp short xd401 ; 0000D3FD EB02 '..'
xd3ff: mov al,0x10 ; 0000D3FF B010 '..'
xd401: call xb544 ; 0000D401 E840E1 '.@.'
ret ; 0000D404 C3 '.'
xd405: push dx ; 0000D405 52 'R'
call xd3ff ; 0000D406 E8F6FF '...'
mov dl,[bp+0x6] ; 0000D409 8A5606 '.V.'
or dl,dl ; 0000D40C 0AD2 0x0A,'.'
jnz xd413 ; 0000D40E 7503 'u.'
shr al,0x4 ; 0000D410 C0E804 '...'
xd413: and al,0xf ; 0000D413 240F '$.'
or al,al ; 0000D415 0AC0 0x0A,'.'
jz xd420 ; 0000D417 7407 't.'
cmp al,0x4 ; 0000D419 3C04 '<.'
ja xd420 ; 0000D41B 7703 'w.'
clc ; 0000D41D F8 '.'
jmp short xd421 ; 0000D41E EB01 '..'
xd420: stc ; 0000D420 F9 '.'
xd421: pop dx ; 0000D421 5A 'Z'
ret ; 0000D422 C3 '.'
xd423: call x9190 ; 0000D423 E86ABD '.j.'
mov ah,[bx] ; 0000D426 8A27 '.',0x27
test ah,0x10 ; 0000D428 F6C410 '...'
ret ; 0000D42B C3 '.'
xd42c: mov al,0x8e ; 0000D42C B08E '..'
jmp short xd432 ; 0000D42E EB02 '..'
xd430: mov al,0xe ; 0000D430 B00E '..'
xd432: call xb544 ; 0000D432 E80FE1 '...'
ret ; 0000D435 C3 '.'
xd436: mov dx,[0x10] ; 0000D436 8B161000 '....'
test dl,0x1 ; 0000D43A F6C201 '...'
jz xd451 ; 0000D43D 7412 't.'
and dl,0xc0 ; 0000D43F 80E2C0 '...'
jz xd44d ; 0000D442 7409 't.'
cmp dl,0x40 ; 0000D444 80FA40 '..@'
jnz xd451 ; 0000D447 7508 'u.'
mov dl,0x2 ; 0000D449 B202 '..'
jmp short xd454 ; 0000D44B EB07 '..'
xd44d: mov dl,0x1 ; 0000D44D B201 '..'
jmp short xd454 ; 0000D44F EB03 '..'
xd451: mov dl,0x0 ; 0000D451 B200 '..'
stc ; 0000D453 F9 '.'
xd454: ret ; 0000D454 C3 '.'
xd455: mov bh,ah ; 0000D455 8AFC '..'
mov ah,[bp+0x6] ; 0000D457 8A6606 '.f.'
or ah,ah ; 0000D45A 0AE4 0x0A,'.'
jz xd461 ; 0000D45C 7403 't.'
shl al,0x4 ; 0000D45E C0E004 '...'
xd461: or [0x8f],al ; 0000D461 08068F00 '....'
mov ah,bh ; 0000D465 8AE7 '..'
ret ; 0000D467 C3 '.'
xd468: mov bh,ah ; 0000D468 8AFC '..'
mov ah,[bp+0x6] ; 0000D46A 8A6606 '.f.'
or ah,ah ; 0000D46D 0AE4 0x0A,'.'
jz xd474 ; 0000D46F 7403 't.'
shl al,0x4 ; 0000D471 C0E004 '...'
xd474: not al ; 0000D474 F6D0 '..'
and [0x8f],al ; 0000D476 20068F00 ' ...'
mov ah,bh ; 0000D47A 8AE7 '..'
ret ; 0000D47C C3 '.'
xd47d: xor ax,ax ; 0000D47D 33C0 '3.'
mov al,[0x8f] ; 0000D47F A08F00 '...'
mov ah,[bp+0x6] ; 0000D482 8A6606 '.f.'
or ah,ah ; 0000D485 0AE4 0x0A,'.'
jz xd48c ; 0000D487 7403 't.'
shr al,0x4 ; 0000D489 C0E804 '...'
xd48c: and ax,0xf ; 0000D48C 250F00 '%..'
ret ; 0000D48F C3 '.'
xd490: push ax ; 0000D490 50 'P'
push bx ; 0000D491 53 'S'
push dx ; 0000D492 52 'R'
mov al,ah ; 0000D493 8AC4 '..'
shr al,0x6 ; 0000D495 C0E806 '...'
mov dx,0x3f7 ; 0000D498 BAF703 '...'
out dx,al ; 0000D49B EE '.'
mov al,[0x8b] ; 0000D49C A08B00 '...'
mov bl,al ; 0000D49F 8AD8 '..'
and al,0xc0 ; 0000D4A1 24C0 '$.'
shr al,0x4 ; 0000D4A3 C0E804 '...'
test bl,0x1 ; 0000D4A6 F6C301 '...'
jz xd4ad ; 0000D4A9 7402 't.'
or al,0x1 ; 0000D4AB 0C01 '..'
xd4ad: and ah,0xc0 ; 0000D4AD 80E4C0 '...'
or ah,al ; 0000D4B0 0AE0 0x0A,'.'
mov [0x8b],ah ; 0000D4B2 88268B00 '.&..'
pop dx ; 0000D4B6 5A 'Z'
pop bx ; 0000D4B7 5B '['
pop ax ; 0000D4B8 58 'X'
ret ; 0000D4B9 C3 '.'
xd4ba: call xc9bf ; 0000D4BA E802F5 '...'
jz xd4ba ; 0000D4BD 74FB 't.'
call x919a ; 0000D4BF E8D8BC '...'
in al,dx ; 0000D4C2 EC '.'
ret ; 0000D4C3 C3 '.'
xd4c4: call xc9bf ; 0000D4C4 E8F8F4 '...'
jnz xd4c4 ; 0000D4C7 75FB 'u.'
call x919a ; 0000D4C9 E8CEBC '...'
mov al,bh ; 0000D4CC 8AC7 '..'
out dx,al ; 0000D4CE EE '.'
ret ; 0000D4CF C3 '.'
xd4d0: mov bx,[es:si] ; 0000D4D0 268B1C '&..'
xchg bh,bl ; 0000D4D3 86FB '..'
call xd4c4 ; 0000D4D5 E8ECFF '...'
xchg bh,bl ; 0000D4D8 86FB '..'
call xd4c4 ; 0000D4DA E8E7FF '...'
ret ; 0000D4DD C3 '.'
push ax ; 0000D4DE 50 'P'
call xee9c ; 0000D4DF E8BA19 '...'
mov bh,0x4a ; 0000D4E2 B74A '.J'
call xd4c4 ; 0000D4E4 E8DDFF '...'
mov bh,[bp+0x7] ; 0000D4E7 8A7E07 '.~.'
shl bh,0x2 ; 0000D4EA C0E702 '...'
or bh,[bp+0x6] ; 0000D4ED 0A7E06 0x0A,'~.'
call xd4c4 ; 0000D4F0 E8D1FF '...'
call xef85 ; 0000D4F3 E88F1A '...'
jnz xd509 ; 0000D4F6 7511 'u.'
mov cx,0x7 ; 0000D4F8 B90700 '...'
mov di,0x42 ; 0000D4FB BF4200 '.B.'
xd4fe: call xd4ba ; 0000D4FE E8B9FF '...'
mov [di],al ; 0000D501 8805 '..'
inc di ; 0000D503 47 'G'
loop xd4fe ; 0000D504 E2F8 '..'
call xd50f ; 0000D506 E80600 '...'
xd509: mov [0x41],ah ; 0000D509 88264100 '.&A.'
pop ax ; 0000D50D 58 'X'
ret ; 0000D50E C3 '.'
;
; Check the FDC's ST0 response
;
xd50f: mov al,[0x42] ; 0000D50F A04200 '.B.'
test al,0xc0 ; 0000D512 A8C0 '..'
jz xd53d ; 0000D514 No problems
test al,0x8 ; 0000D516 A808 '..'
jz xd51e ; 0000D518 7404 't.'
mov ah,0x80 ; 0000D51A B480 '..'
jmp short xd53f ; 0000D51C EB21 '.!'
xd51e: mov ah,[0x43] ; 0000D51E 8A264300 '.&C.'
test ah,0x30 ; 0000D522 F6C430 '..0'
jz xd52b ; 0000D525 7404 't.'
shr ah,1 ; 0000D527 D0EC '..'
jmp short xd53f ; 0000D529 EB14 '..'
xd52b: test ah,0x3 ; 0000D52B F6C403 '...'
jz xd534 ; 0000D52E 7404 't.'
inc ah ; 0000D530 FEC4 '..'
jmp short xd53f ; 0000D532 EB0B '..'
xd534: test ah,0x80 ; 0000D534 F6C480 '...'
jz xd53b ; 0000D537 7402 't.'
mov ah,0x4 ; 0000D539 B404 '..'
xd53b: jmp short xd53f ; 0000D53B EB02 '..'
xd53d: mov ah,0x0 ; 0000D53D B400 '..'
xd53f: ret ; 0000D53F C3 '.'
xd540: mov bx,0x40 ; 0000D540 BB4000 '.@.'
mov ds,bx ; 0000D543 8EDB '..'
mov bx,0x90 ; 0000D545 BB9000 '...'
cmp byte [bx],0x93 ; 0000D548 803F93 '.?.'
jnz xd550 ; 0000D54B 7503 'u.'
jmp xd617 ; 0000D54D E9C700 '...'
xd550: mov al,[bx] ; 0000D550 8A07 '..'
and al,0xc0 ; 0000D552 24C0 '$.'
shr al,0x6 ; 0000D554 C0E806 '...'
or al,al ; 0000D557 0AC0 0x0A,'.'
jz xd5ac ; 0000D559 7451 'tQ'
dec al ; 0000D55B FEC8 '..'
jnz xd583 ; 0000D55D 7524 'u$'
mov bl,0x5 ; 0000D55F B305 '..'
mov ch,0x27 ; 0000D561 B527 '.',0x27
xd563: mov ah,0x0 ; 0000D563 B400 '..'
int 0x13 ; 0000D565 CD13 '..'
mov ah,0x74 ; 0000D567 B474 '.t'
call xd64b ; 0000D569 E8DF00 '...'
mov ax,0x409 ; 0000D56C B80904 '...'
mov cl,0x1 ; 0000D56F B101 '..'
xor dx,dx ; 0000D571 33D2 '3.'
int 0x13 ; 0000D573 CD13 '..'
jc xd57a ; 0000D575 7203 'r.'
jmp xd5fe ; 0000D577 E98400 '...'
xd57a: cmp ah,0x4 ; 0000D57A 80FC04 '...'
jnz xd583 ; 0000D57D 7504 'u.'
or al,al ; 0000D57F 0AC0 0x0A,'.'
jnz xd5fe ; 0000D581 757B 'u{'
xd583: mov ah,0x0 ; 0000D583 B400 '..'
int 0x13 ; 0000D585 CD13 '..'
mov ah,0x97 ; 0000D587 B497 '..'
call xd64b ; 0000D589 E8BF00 '...'
add ch,0x28 ; 0000D58C 80C528 '..('
mov ax,0x409 ; 0000D58F B80904 '...'
mov cl,0x1 ; 0000D592 B101 '..'
xor dx,dx ; 0000D594 33D2 '3.'
int 0x13 ; 0000D596 CD13 '..'
jnc xd5e0 ; 0000D598 7346 'sF'
cmp ah,0x4 ; 0000D59A 80FC04 '...'
jnz xd5a3 ; 0000D59D 7504 'u.'
or al,al ; 0000D59F 0AC0 0x0A,'.'
jnz xd5e0 ; 0000D5A1 753D 'u='
xd5a3: dec bl ; 0000D5A3 FECB '..'
jz xd622 ; 0000D5A5 747B 't{'
sub ch,0x29 ; 0000D5A7 80ED29 '..)'
jmp short xd563 ; 0000D5AA EBB7 '..'
xd5ac: mov bl,0x5 ; 0000D5AC B305 '..'
xor ch,ch ; 0000D5AE 32ED '2.'
xd5b0: mov ah,0x0 ; 0000D5B0 B400 '..'
int 0x13 ; 0000D5B2 CD13 '..'
mov ah,0x17 ; 0000D5B4 B417 '..'
call xd64b ; 0000D5B6 E89200 '...'
mov ax,0x401 ; 0000D5B9 B80104 '...'
mov cl,0x10 ; 0000D5BC B110 '..'
xor dx,dx ; 0000D5BE 33D2 '3.'
int 0x13 ; 0000D5C0 CD13 '..'
jnc xd5e0 ; 0000D5C2 731C 's.'
mov ah,0x0 ; 0000D5C4 B400 '..'
int 0x13 ; 0000D5C6 CD13 '..'
mov ah,0x15 ; 0000D5C8 B415 '..'
call xd64b ; 0000D5CA E87E00 '.~.'
mov ax,0x401 ; 0000D5CD B80104 '...'
mov cl,0xf ; 0000D5D0 B10F '..'
xor dx,dx ; 0000D5D2 33D2 '3.'
int 0x13 ; 0000D5D4 CD13 '..'
jnc xd5fe ; 0000D5D6 7326 's&'
dec bl ; 0000D5D8 FECB '..'
jz xd622 ; 0000D5DA 7446 'tF'
inc ch ; 0000D5DC FEC5 '..'
jmp short xd5b0 ; 0000D5DE EBD0 '..'
xd5e0: mov bx,0x90 ; 0000D5E0 BB9000 '...'
cmp byte [bx],0x97 ; 0000D5E3 803F97 '.?.'
jz xd5f3 ; 0000D5E6 740B 't.'
mov ah,0x4 ; 0000D5E8 B404 '..'
call xd65f ; 0000D5EA E87200 '.r.'
mov dx,0xa13c ; 0000D5ED BA3CA1 '.<.'
jmp short xd647 ; 0000D5F0 EB55 '.U'
nop ; 0000D5F2 90 '.'
xd5f3: mov ah,0x34 ; 0000D5F3 B434 '.4'
call xd65f ; 0000D5F5 E86700 '.g.'
mov dx,0xa12f ; 0000D5F8 BA2FA1 './.'
jmp short xd647 ; 0000D5FB EB4A '.J'
nop ; 0000D5FD 90 '.'
xd5fe: mov ah,0x2 ; 0000D5FE B402 '..'
call xd65f ; 0000D600 E85C00 '.\.'
mov bx,0x90 ; 0000D603 BB9000 '...'
cmp byte [bx],0x74 ; 0000D606 803F74 '.?t'
jz xd611 ; 0000D609 7406 't.'
mov dx,0xa115 ; 0000D60B BA15A1 '...'
jmp short xd647 ; 0000D60E EB37 '.7'
nop ; 0000D610 90 '.'
xd611: mov dx,0xa108 ; 0000D611 BA08A1 '...'
jmp short xd647 ; 0000D614 EB31 '.1'
nop ; 0000D616 90 '.'
xd617: mov ah,0x1 ; 0000D617 B401 '..'
call xd65f ; 0000D619 E84300 '.C.'
mov dx,0xa0fb ; 0000D61C BAFBA0 '...'
jmp short xd647 ; 0000D61F EB26 '.&'
nop ; 0000D621 90 '.'
xd622: call xd3f3 ; 0000D622 E8CEFD '...'
jnz xd64a ; 0000D625 7523 'u#'
call xd3ff ; 0000D627 E8D5FD '...'
and al,0xf0 ; 0000D62A 24F0 '$.'
shr al,0x4 ; 0000D62C C0E804 '...'
cmp al,0x1 ; 0000D62F 3C01 '<.'
mov dx,0xa0fb ; 0000D631 BAFBA0 '...'
jz xd647 ; 0000D634 7411 't.'
dec al ; 0000D636 FEC8 '..'
mov dx,0xa108 ; 0000D638 BA08A1 '...'
jz xd647 ; 0000D63B 740A 't',0x0A
dec al ; 0000D63D FEC8 '..'
mov dx,0xa122 ; 0000D63F BA22A1 '.".'
jz xd647 ; 0000D642 7403 't.'
mov dx,0xa13c ; 0000D644 BA3CA1 '.<.'
xd647: call xd6cd ; 0000D647 E88300 '...'
xd64a: ret ; 0000D64A C3 '.'
xd64b: push bx ; 0000D64B 53 'S'
mov bx,0x90 ; 0000D64C BB9000 '...'
cmp [bx],ah ; 0000D64F 3827 '8',0x27
jz xd65d ; 0000D651 740A 't',0x0A
mov [bx],ah ; 0000D653 8827 '.',0x27
call xd490 ; 0000D655 E838FE '.8.'
or byte [0x8f],0x6 ; 0000D658 800E8F0006 '.....'
xd65d: pop bx ; 0000D65D 5B '['
ret ; 0000D65E C3 '.'
xd65f: call xd3f3 ; 0000D65F E891FD '...'
jnz xd6cc ; 0000D662 7568 'uh'
call xd3ff ; 0000D664 E898FD '...'
shr al,0x4 ; 0000D667 C0E804 '...'
cmp ah,al ; 0000D66A 3AE0 ':.'
jz xd6be ; 0000D66C 7450 'tP'
cmp ah,0x34 ; 0000D66E 80FC34 '..4'
jnz xd67b ; 0000D671 7508 'u.'
cmp al,0x3 ; 0000D673 3C03 '<.'
jz xd6be ; 0000D675 7447 'tG'
cmp al,0x4 ; 0000D677 3C04 '<.'
jz xd6be ; 0000D679 7443 'tC'
xd67b: mov al,0x33 ; 0000D67B B033 '.3'
call xb544 ; 0000D67D E8C4DE '...'
or al,0x4 ; 0000D680 0C04 '..'
and al,0xfc ; 0000D682 24FC '$.'
or al,ah ; 0000D684 0AC4 0x0A,'.'
mov ah,al ; 0000D686 8AE0 '..'
mov al,0x33 ; 0000D688 B033 '.3'
call xb549 ; 0000D68A E8BCDE '...'
call xd430 ; 0000D68D E8A0FD '...'
test al,0x20 ; 0000D690 A820 '. '
jnz xd6cc ; 0000D692 7538 'u8'
mov ah,al ; 0000D694 8AE0 '..'
or ah,0x20 ; 0000D696 80CC20 '.. '
mov al,0xe ; 0000D699 B00E '..'
call xb549 ; 0000D69B E8ABDE '...'
mov dx,0x2000 ; 0000D69E BA0020 '.. '
mov bx,0xba1e ; 0000D6A1 BB1EBA '...'
mov cx,0x59 ; 0000D6A4 B95900 '.Y.'
call xc745 ; 0000D6A7 E89BF0 '...'
mov bp,0x1 ; 0000D6AA BD0100 '...'
call xe38f ; 0000D6AD E8DF0C '...'
mov ah,0xf ; 0000D6B0 B40F '..'
int 0x10 ; 0000D6B2 CD10 '..'
mov ah,0x0 ; 0000D6B4 B400 '..'
int 0x10 ; 0000D6B6 CD10 '..'
mov al,0xbd ; 0000D6B8 B0BD '..'
out 0x84,al ; 0000D6BA E684 '..'
jmp short xd6cc ; 0000D6BC EB0E '..'
xd6be: mov al,0x33 ; 0000D6BE B033 '.3'
mov ah,al ; 0000D6C0 8AE0 '..'
call xb544 ; 0000D6C2 E87FDE '...'
and al,0xfb ; 0000D6C5 24FB '$.'
xchg al,ah ; 0000D6C7 86C4 '..'
call xb549 ; 0000D6C9 E87DDE '.}.'
xd6cc: ret ; 0000D6CC C3 '.'
xd6cd: push ax ; 0000D6CD 50 'P'
mov ax,dx ; 0000D6CE 8BC2 '..'
xor dx,dx ; 0000D6D0 33D2 '3.'
mov es,dx ; 0000D6D2 8EC2 '..'
mov di,0x78 ; 0000D6D4 BF7800 '.x.'
stosw ; 0000D6D7 AB '.'
mov ax,cs ; 0000D6D8 8CC8 '..'
stosw ; 0000D6DA AB '.'
pop ax ; 0000D6DB 58 'X'
ret ; 0000D6DC C3 '.'
xd6dd: pusha ; 0000D6DD 60 '`'
push ds ; 0000D6DE 1E '.'
push es ; 0000D6DF 06 '.'
push fs ; 0000D6E0 0FA0 '..'
push gs ; 0000D6E2 0FA8 '..'
mov al,0x60 ; 0000D6E4 B060 '.`'
out 0x84,al ; 0000D6E6 E684 '..'
mov ax,0x1c00 ; 0000D6E8 B8001C '...'
mov ds,ax ; 0000D6EB 8ED8 '..'
mov bx,0x40 ; 0000D6ED BB4000 '.@.'
mov es,bx ; 0000D6F0 8EC3 '..'
mov [es:0x69],ss ; 0000D6F2 268C166900 '&..i.'
mov [es:0x67],sp ; 0000D6F7 2689266700 '&.&g.'
mov word [0x64],0x0 ; 0000D6FC C70664000000 '..d...'
mov al,0x61 ; 0000D702 B061 '.a'
out 0x84,al ; 0000D704 E684 '..'
call x80e2 ; 0000D706 E8D9A9 '...'
jz xd714 ; 0000D709 7409 't.'
or word [0x64],0x10 ; 0000D70B 810E64001000 '..d...'
jmp xda75 ; 0000D711 E96103 '.a.'
xd714: call x863f ; 0000D714 E828AF '.(.'
mov al,0x62 ; 0000D717 B062 '.b'
out 0x84,al ; 0000D719 E684 '..'
mov word [0x86],0x80 ; 0000D71B C70686008000 '......'
mov word [0x88],0x0 ; 0000D721 C70688000000 '......'
call x8028 ; 0000D727 E8FEA8 '...'
cmp word [es:0x72],0x1234 ; 0000D72A 26813E72003412 '&.>r.4.'
jnz xd742 ; 0000D731 750F 'u.'
mov ax,[0x7c] ; 0000D733 A17C00 '.|.'
mov [0x86],ax ; 0000D736 A38600 '...'
mov ax,[0x7e] ; 0000D739 A17E00 '.~.'
mov [0x88],ax ; 0000D73C A38800 '...'
jmp xd940 ; 0000D73F E9FE01 '...'
xd742: cld ; 0000D742 FC '.'
push si ; 0000D743 56 'V'
push di ; 0000D744 57 'W'
push ds ; 0000D745 1E '.'
push es ; 0000D746 06 '.'
mov bx,ds ; 0000D747 8CDB '..'
mov es,bx ; 0000D749 8EC3 '..'
mov bx,0x30 ; 0000D74B BB3000 '.0.'
mov ds,bx ; 0000D74E 8EDB '..'
mov si,0x830c ; 0000D750 BE0C83 '...'
mov di,0x93 ; 0000D753 BF9300 '...'
mov cx,0xb ; 0000D756 B90B00 '...'
rep movsw ; 0000D759 F3A5 '..'
pop es ; 0000D75B 07 '.'
pop ds ; 0000D75C 1F '.'
pop di ; 0000D75D 5F '_'
pop si ; 0000D75E 5E '^'
mov al,0x63 ; 0000D75F B063 '.c'
out 0x84,al ; 0000D761 E684 '..'
call x81e6 ; 0000D763 E880AA '...'
jnc xd76f ; 0000D766 7307 's.'
mov al,0x64 ; 0000D768 B064 '.d'
out 0x84,al ; 0000D76A E684 '..'
jmp short xd77d ; 0000D76C EB0F '..'
nop ; 0000D76E 90 '.'
xd76f: cmp word [0x76],0x80 ; 0000D76F 813E76008000 '.>v...'
jnc xd78d ; 0000D775 7316 's.'
or word [0x64],0x80 ; 0000D777 810E64008000 '..d...'
xd77d: mov bx,[0x7c] ; 0000D77D 8B1E7C00 '..|.'
mov [0x76],bx ; 0000D781 891E7600 '..v.'
mov bx,[0x7e] ; 0000D785 8B1E7E00 '..~.'
mov [0x78],bx ; 0000D789 891E7800 '..x.'
xd78d: call x84a5 ; 0000D78D E815AD '...'
;
; Call this xdb33 wrapper to test 128Kb of memory at %FE0000
;
call x8509 ; 0000D790 E876AD '.v.'
or ax,ax ; 0000D793 0BC0 '..'
jz xd79a ; 0000D795 7403 't.'
jmp xd988 ; 0000D797 E9EE01 '...'
xd79a: mov bx,[0x76] ; 0000D79A 8B1E7600 '..v.'
;
; (BX) contains 0x280 (640)
;
sub bx,0x80 ; 0000D79E 81EB8000 '....'
;
; (BX) is reduced by 128 for a total of 512
;
mov [0x7a],bx ; 0000D7A2 891E7A00 '..z.'
;
; (BX) again contains 0x280 (640), again is reduced by 128, and again stored elsewhere
;
mov bx,[0x7c] ; 0000D7A6 8B1E7C00 '..|.'
sub bx,0x80 ; 0000D7AA 81EB8000 '....'
mov [0x80],bx ; 0000D7AE 891E8000 '....'
mov al,[0x90] ; 0000D7B2 A09000 '...'
;
; (AL) contains 0x09
;
mov [0x8f],al ; 0000D7B5 A28F00 '...'
mov ah,0x2 ; 0000D7B8 B402 '..'
mov byte [0x92],0x1 ; 0000D7BA C606920001 '.....'
call xdabb ; 0000D7BF E8F902 '...'
mov bx,[0x8a] ; 0000D7C2 8B1E8A00 '....'
add bx,0x80 ; 0000D7C6 81C38000 '....'
mov [0x86],bx ; 0000D7CA 891E8600 '....'
or ax,ax ; 0000D7CE 0BC0 '..'
jz xd7e4 ; 0000D7D0 7412 't.'
or word [0x64],0x1 ; 0000D7D2 810E64000100 '..d...'
mov [0x66],ch ; 0000D7D8 882E6600 '..f.'
mov [0x67],dx ; 0000D7DC 89166700 '..g.'
mov [0x69],cl ; 0000D7E0 880E6900 '..i.'
xd7e4: mov al,0x65 ; 0000D7E4 B065 '.e'
out 0x84,al ; 0000D7E6 E684 '..'
;
; (BX) becomes 0x400 (the amount of extended memory in Kb)
;
mov bx,[0x78] ; 0000D7E8 8B1E7800 '..x.'
mov [0x7a],bx ; 0000D7EC 891E7A00 '..z.'
;
; (BX) becomes 0x3B80 (not sure where this number comes from)
;
mov bx,[0x7e] ; 0000D7F0 8B1E7E00 '..~.'
mov [0x80],bx ; 0000D7F4 891E8000 '....'
mov bp,[0x86] ; 0000D7F8 8B2E8600 '....'
add bp,0x80 ; 0000D7FC 81C58000 '....'
;
; (BP) is now 0x280 + 0x80, for a total of 0x300
;
; (AL) becomes 0x9F
;
mov al,[0x91] ; 0000D800 A09100 '...'
mov [0x8f],al ; 0000D803 A28F00 '...'
mov ah,0x10 ; 0000D806 B410 '..'
mov byte [0x92],0x1 ; 0000D808 C606920001 '.....'
call xdabb ; 0000D80D E8AB02 '...'
mov bx,[0x8a] ; 0000D810 8B1E8A00 '....'
mov [0x88],bx ; 0000D814 891E8800 '....'
or ax,ax ; 0000D818 0BC0 '..'
jz xd82e ; 0000D81A 7412 't.'
or word [0x64],0x2 ; 0000D81C 810E64000200 '..d...'
mov [0x6e],ch ; 0000D822 882E6E00 '..n.'
mov [0x6f],dx ; 0000D826 89166F00 '..o.'
mov [0x71],cl ; 0000D82A 880E7100 '..q.'
xd82e: mov ax,[0x88] ; 0000D82E A18800 '...'
add ax,0x400 ; 0000D831 050004 '...'
mov bx,0x3f80 ; 0000D834 BB803F '..?'
sub bx,[0x8d] ; 0000D837 2B1E8D00 '+...'
cmp ax,bx ; 0000D83B 3BC3 ';.'
jnc xd878 ; 0000D83D 7339 's9'
mov bp,[0x88] ; 0000D83F 8B2E8800 '....'
add bp,[0x86] ; 0000D843 032E8600 '....'
add bp,0x80 ; 0000D847 81C58000 '....'
mov ax,[0x8d] ; 0000D84B A18D00 '...'
mov [0x82],ax ; 0000D84E A38200 '...'
mov byte [0x8f],0xff ; 0000D851 C6068F00FF '.....'
mov ah,[0x8c] ; 0000D856 8A268C00 '.&..'
mov byte [0x92],0x1 ; 0000D85A C606920001 '.....'
call xdb33 ; 0000D85F E8D102 '...'
or ax,ax ; 0000D862 0BC0 '..'
jz xd878 ; 0000D864 7412 't.'
or word [0x64],0x2 ; 0000D866 810E64000200 '..d...'
mov [0x6e],ch ; 0000D86C 882E6E00 '..n.'
mov [0x6f],dx ; 0000D870 89166F00 '..o.'
mov [0x71],cl ; 0000D874 880E7100 '..q.'
;
; We now restart the memory verification process, by redisplaying "00128 KB OK",
; and then calling xdbfb for each region of RAM identified earlier. As before, (AH)
; contains the 64Kb block number of the region to verify.
;
xd878: push es ; 0000D878 06 '.'
mov ax,0x40 ; 0000D879 B84000 '.@.'
mov es,ax ; 0000D87C 8EC0 '..'
mov bp,0x80 ; 0000D87E BD8000 '...'
mov ax,bp ; 0000D881 8BC5 '..'
call x80a5 ; 0000D883 E81FA8 '...'
pop es ; 0000D886 07 '.'
mov bp,0x80 ; 0000D887 BD8000 '...'
mov byte [0x92],0x1 ; 0000D88A C606920001 '.....'
mov al,0xfe ; 0000D88F B0FE '..'
mov ah,0x0 ; 0000D891 B400 '..'
call xdbfb ; 0000D893 E86503 '.e.'
test ax,0x2 ; 0000D896 A90200 '...'
jz xd8ad ; 0000D899 7412 't.'
or word [0x64],0x44 ; 0000D89B 810E64004400 '..d.D.'
mov [0x6a],ch ; 0000D8A1 882E6A00 '..j.'
mov [0x6b],dx ; 0000D8A5 89166B00 '..k.'
mov [0x6d],cl ; 0000D8A9 880E6D00 '..m.'
xd8ad: mov ax,[0x86] ; 0000D8AD A18600 '...'
mov bx,0x400 ; 0000D8B0 BB0004 '...'
mul bx ; 0000D8B3 F7E3 '..'
mov al,0x2 ; 0000D8B5 B002 '..'
cmp al,dl ; 0000D8B7 3AC2 ':.'
jz xd8dc ; 0000D8B9 7421 't!'
mov ah,dl ; 0000D8BB 8AE2 '..'
mov byte [0x92],0x1 ; 0000D8BD C606920001 '.....'
call xdbfb ; 0000D8C2 E83603 '.6.'
test ax,0x2 ; 0000D8C5 A90200 '...'
jz xd8dc ; 0000D8C8 7412 't.'
or word [0x64],0x4 ; 0000D8CA 810E64000400 '..d...'
mov [0x6a],ch ; 0000D8D0 882E6A00 '..j.'
mov [0x6b],dx ; 0000D8D4 89166B00 '..k.'
mov [0x6d],cl ; 0000D8D8 880E6D00 '..m.'
xd8dc: mov ax,[0x88] ; 0000D8DC A18800 '...'
or ax,ax ; 0000D8DF 0BC0 '..'
jz xd90b ; 0000D8E1 7428 't('
add ax,0x400 ; 0000D8E3 050004 '...'
mul bx ; 0000D8E6 F7E3 '..'
mov al,0x10 ; 0000D8E8 B010 '..'
mov ah,dl ; 0000D8EA 8AE2 '..'
mov byte [0x92],0x1 ; 0000D8EC C606920001 '.....'
call xdbfb ; 0000D8F1 E80703 '...'
test ax,0x2 ; 0000D8F4 A90200 '...'
jz xd90b ; 0000D8F7 7412 't.'
or word [0x64],0x8 ; 0000D8F9 810E64000800 '..d...'
mov [0x72],ch ; 0000D8FF 882E7200 '..r.'
mov [0x73],dx ; 0000D903 89167300 '..s.'
mov [0x75],cl ; 0000D907 880E7500 '..u.'
xd90b: mov ax,[0x88] ; 0000D90B A18800 '...'
add ax,0x400 ; 0000D90E 050004 '...'
mov bx,0x3f80 ; 0000D911 BB803F '..?'
sub bx,[0x8d] ; 0000D914 2B1E8D00 '+...'
cmp ax,bx ; 0000D918 3BC3 ';.'
jnc xd940 ; 0000D91A 7324 's$'
mov al,[0x8c] ; 0000D91C A08C00 '...'
mov ah,0xfe ; 0000D91F B4FE '..'
mov byte [0x92],0x1 ; 0000D921 C606920001 '.....'
call xdbfb ; 0000D926 E8D202 '...'
test ax,0x2 ; 0000D929 A90200 '...'
jz xd940 ; 0000D92C 7412 't.'
or word [0x64],0x8 ; 0000D92E 810E64000800 '..d...'
mov [0x72],ch ; 0000D934 882E7200 '..r.'
mov [0x73],dx ; 0000D938 89167300 '..s.'
mov [0x75],cl ; 0000D93C 880E7500 '..u.'
xd940: mov al,0x66 ; 0000D940 B066 '.f'
out 0x84,al ; 0000D942 E684 '..'
mov bx,[0x86] ; 0000D944 8B1E8600 '....'
;
; Store the total amount of conventional RAM (in Kb) into the ROM BIOS Data Area at 0x40:0x13
;
mov [es:0x13],bx ; 0000D948 26891E1300 '&....'
mov bx,[0x88] ; 0000D94D 8B1E8800 '....'
mov al,0xb0 ; 0000D951 B0B0 '..'
mov ah,bl ; 0000D953 8AE3 '..'
call xb549 ; 0000D955 E8F1DB '...'
mov al,0xb1 ; 0000D958 B0B1 '..'
mov ah,bh ; 0000D95A 8AE7 '..'
call xb549 ; 0000D95C E8EADB '...'
mov cl,0x0 ; 0000D95F B100 '..'
test word [0x64],0x80 ; 0000D961 F70664008000 '..d...'
jz xd96b ; 0000D967 7402 't.'
mov cl,0x1 ; 0000D969 B101 '..'
xd96b: call x8214 ; 0000D96B E8A6A8 '...'
mov al,0x67 ; 0000D96E B067 '.g'
out 0x84,al ; 0000D970 E684 '..'
cmp word [0x86],0x280 ; 0000D972 813E86008002 '.>....'
jc xd988 ; 0000D978 720E 'r.'
mov al,0xb3 ; 0000D97A B0B3 '..'
call xb544 ; 0000D97C E8C5DB '...'
or al,0x80 ; 0000D97F 0C80 '..'
mov ah,al ; 0000D981 8AE0 '..'
mov al,0xb3 ; 0000D983 B0B3 '..'
call xb549 ; 0000D985 E8C1DB '...'
xd988: mov ah,0x2 ; 0000D988 B402 '..'
test word [0x64],0xffff ; 0000D98A F7066400FFFF '..d...'
jz xd994 ; 0000D990 7402 't.'
mov ah,0x3 ; 0000D992 B403 '..'
xd994: mov al,0x8f ; 0000D994 B08F '..'
call xb549 ; 0000D996 E8B0DB '...'
mov al,0x68 ; 0000D999 B068 '.h'
out 0x84,al ; 0000D99B E684 '..'
;
; Set SYS_FLAG (0x04) in the 8042 CMD byte, and then pulse OUTPORT to return to real-mode
;
in al,0x60 ; 0000D99D E460 '.`'
mov al,0x20 ; 0000D99F B020 '. '
out 0x64,al ; 0000D9A1 E664 '.d'
call xec2e_wait_8042_ready ; 0000D9A3 E88812 '...'
xd9a6: in al,0x64 ; 0000D9A6 E464 '.d'
test al,0x1 ; 0000D9A8 A801 '..'
jz xd9a6 ; 0000D9AA 74FA 't.'
in al,0x60 ; 0000D9AC E460 '.`'
mov ah,al ; 0000D9AE 8AE0 '..'
or ah,0x4 ; 0000D9B0 80CC04 '...'
mov al,0x60 ; 0000D9B3 B060 '.`'
out 0x64,al ; 0000D9B5 E664 '.d'
push ax ; 0000D9B7 50 'P'
call xec2e_wait_8042_ready ; 0000D9B8 E87312 '.s.'
pop ax ; 0000D9BB 58 'X'
mov al,ah ; 0000D9BC 8AC4 '..'
out 0x60,al ; 0000D9BE E660 '.`'
call xec2e_wait_8042_ready ; 0000D9C0 E86B12 '.k.'
mov al,0xfe ; 0000D9C3 B0FE '..'
out 0x64,al ; 0000D9C5 E664 '.d'
;
; The following hang is temporary; the 8042 should reset the processor, returning us to real-mode
;
xd9c7: hlt ; 0000D9C7 F4 '.'
jmp short xd9c7 ; 0000D9C8 EBFD '..'
mov al,0x69 ; 0000D9CA B069 '.i'
out 0x84,al ; 0000D9CC E684 '..'
mov bx,0x0 ; 0000D9CE BB0000 '...'
jmp short xd9db ; 0000D9D1 EB08 '..'
nop ; 0000D9D3 90 '.'
;
; Code for CMOS SHUTDOWN byte 0x03
;
xd9d4: mov al,0x6a ; 0000D9D4 B06A '.j'
out 0x84,al ; 0000D9D6 E684 '..'
mov bx,0x1 ; 0000D9D8 BB0100 '...'
xd9db: mov ax,0x40 ; 0000D9DB B84000 '.@.'
mov ds,ax ; 0000D9DE 8ED8 '..'
mov ss,[0x69] ; 0000D9E0 8E166900 '..i.'
mov sp,[0x67] ; 0000D9E4 8B266700 '.&g.'
push bx ; 0000D9E8 53 'S'
call print_crlf ; 0000D9E9 E89AED '...'
pop bx ; 0000D9EC 5B '['
or bx,bx ; 0000D9ED 0BDB '..'
jnz xd9f4 ; 0000D9EF 7503 'u.'
jmp xda8c ; 0000D9F1 E99800 '...'
;
; At checkpoint 0x6B, the conventional+extended memory test has been completed,
; and you should see a total at the top of the screen (eg, "01792 KB OK").
;
xd9f4: mov al,0x6b ; 0000D9F4 B06B '.k'
out 0x84,al ; 0000D9F6 E684 '..'
mov ax,0x1c00 ; 0000D9F8 B8001C '...'
mov ds,ax ; 0000D9FB 8ED8 '..'
test word [0x64],0x1 ; 0000D9FD F70664000100 '..d...'
jz xda1b ; 0000DA03 7416 't.'
call print_crlf ; 0000DA05 E87EED '.~.'
xor ch,ch ; 0000DA08 32ED '2.'
mov cl,[0x66] ; 0000DA0A 8A0E6600 '..f.'
mov si,cx ; 0000DA0E 8BF1 '..'
mov cl,[0x69] ; 0000DA10 8A0E6900 '..i.'
mov dx,[0x67] ; 0000DA14 8B166700 '..g.'
call x822d ; 0000DA18 E812A8 '...'
xda1b: test word [0x64],0x4 ; 0000DA1B F70664000400 '..d...'
jz xda39 ; 0000DA21 7416 't.'
call print_crlf ; 0000DA23 E860ED '.`.'
xor ch,ch ; 0000DA26 32ED '2.'
mov cl,[0x6a] ; 0000DA28 8A0E6A00 '..j.'
mov si,cx ; 0000DA2C 8BF1 '..'
mov cl,[0x6d] ; 0000DA2E 8A0E6D00 '..m.'
mov dx,[0x6b] ; 0000DA32 8B166B00 '..k.'
call x8242 ; 0000DA36 E809A8 '...'
xda39: test word [0x64],0x2 ; 0000DA39 F70664000200 '..d...'
jz xda57 ; 0000DA3F 7416 't.'
call print_crlf ; 0000DA41 E842ED '.B.'
xor ch,ch ; 0000DA44 32ED '2.'
mov cl,[0x6e] ; 0000DA46 8A0E6E00 '..n.'
mov si,cx ; 0000DA4A 8BF1 '..'
mov cl,[0x71] ; 0000DA4C 8A0E7100 '..q.'
mov dx,[0x6f] ; 0000DA50 8B166F00 '..o.'
;
; The next call prints an address, value, and error message; eg:
;
; F00000 02 201-Memory Error
;
call x822d ; 0000DA54 E8D6A7 '...'
xda57: test word [0x64],0x8 ; 0000DA57 F70664000800 '..d...'
jz xda75 ; 0000DA5D 7416 't.'
call print_crlf ; 0000DA5F E824ED '.$.'
xor ch,ch ; 0000DA62 32ED '2.'
mov cl,[0x72] ; 0000DA64 8A0E7200 '..r.'
mov si,cx ; 0000DA68 8BF1 '..'
mov cl,[0x75] ; 0000DA6A 8A0E7500 '..u.'
mov dx,[0x73] ; 0000DA6E 8B167300 '..s.'
;
; The next call prints an address, value, and error message; eg:
;
; F00000 FF 203-Memory Address Error
;
call x8242 ; 0000DA72 E8CDA7 '...'
xda75: test word [0x64],0x10 ; 0000DA75 F70664001000 '..d...'
jz xda8c ; 0000DA7B 740F 't.'
call print_crlf ; 0000DA7D E806ED '...'
mov dx,0x0 ; 0000DA80 BA0000 '...'
mov bx,err102 ; 0000DA83 BB8CB6 '...'
mov cx,err102_len ; 0000DA86 B91A00 '...'
call xc745 ; 0000DA89 E8B9EC '...'
xda8c: test word [0x64],0xffff ; 0000DA8C F7066400FFFF '..d...'
jz xdaac ; 0000DA92 7418 't.'
call print_crlf ; 0000DA94 E8EFEC '...'
test word [0x64],0x40 ; 0000DA97 F70664004000 '..d.@.'
jz xdaa2 ; 0000DA9D 7403 't.'
jmp xd9c7 ; 0000DA9F E925FF '.%.'
xdaa2: in al,0x61 ; 0000DAA2 E461 '.a'
test al,0xc0 ; 0000DAA4 A8C0 '..'
jz xdaac ; 0000DAA6 7404 't.'
mov al,0x74 ; 0000DAA8 B074 '.t'
out 0x84,al ; 0000DAAA E684 '..'
xdaac: call xd079 ; 0000DAAC E8CAF5 '...'
mov al,0x6c ; 0000DAAF B06C '.l'
out 0x84,al ; 0000DAB1 E684 '..'
pop gs ; 0000DAB3 0FA9 '..'
pop fs ; 0000DAB5 0FA1 '..'
pop es ; 0000DAB7 07 '.'
pop ds ; 0000DAB8 1F '.'
popa ; 0000DAB9 61 'a'
ret ; 0000DABA C3 '.'
;
; Another wrapper around the xdb33 memory test
;
; When called for conventional memory:
;
; (AH) == starting 64Kb block number (eg, 0x02)
; (AL) == 0x09, which came from byte [0x90]
; (BX) == amount of memory in Kb to test (eg, 0x200 or 512)
;
; When called for extended memory:
;
; (AH) == starting 64Kb block number (eg, 0x10)
; (AL) == 0x9F, which came from byte [0x91]
; (BX) == amount of memory in Kb to test (eg, 0x3B80 or 15232)
;
xdabb: push bx ; 0000DABB 53 'S'
mov bl,al ; 0000DABC 8AD8 '..'
mov al,0x6d ; 0000DABE B06D '.m'
out 0x84,al ; 0000DAC0 E684 '..'
;
; This is special: move BL into AL, and then move AL back into BL.
; We'll give Compaq the benefit of the doubt and assume this is macro nonsense.
;
mov al,bl ; 0000DAC2 8AC3 '..'
mov bl,al ; 0000DAC4 8AD8 '..'
mov al,0x6e ; 0000DAC6 B06E '.n'
out 0x84,al ; 0000DAC8 E684 '..'
mov al,bl ; 0000DACA 8AC3 '..'
mov bx,[0x80] ; 0000DACC 8B1E8000 '....'
cmp [0x7a],bx ; 0000DAD0 391E7A00 '9.z.'
jna xdafc ; 0000DAD4 7626 'v&'
or word [0x64],0x80 ; 0000DAD6 810E64008000 '..d...'
mov bx,[0x7a] ; 0000DADC 8B1E7A00 '..z.'
mov [0x82],bx ; 0000DAE0 891E8200 '....'
call xdb33 ; 0000DAE4 E84C00 '.L.'
mov bx,[0x84] ; 0000DAE7 8B1E8400 '....'
cmp [0x80],bx ; 0000DAEB 391E8000 '9...'
jnc xdaf5 ; 0000DAEF 7304 's.'
mov bx,[0x80] ; 0000DAF1 8B1E8000 '....'
xdaf5: mov [0x8a],bx ; 0000DAF5 891E8A00 '....'
jmp short xdb2b ; 0000DAF9 EB30 '.0'
nop ; 0000DAFB 90 '.'
xdafc: jz xdb16 ; 0000DAFC 7418 't.'
or word [0x64],0x80 ; 0000DAFE 810E64008000 '..d...'
mov [0x82],bx ; 0000DB04 891E8200 '....'
call xdb33 ; 0000DB08 E82800 '.(.'
;
; Assuming another 1024Kb of extended RAM has been successfully tested, (BX) will
; be loaded with 0x400 (1024).
;
mov bx,[0x84] ; 0000DB0B 8B1E8400 '....'
mov [0x8a],bx ; 0000DB0F 891E8A00 '....'
jmp short xdb2b ; 0000DB13 EB16 '..'
nop ; 0000DB15 90 '.'
;
; This is where we end up testing the remaining 512Kb of the first 640Kb, because
; the value in word [0x80] (0x200) matched the value in word [0x7a] (0x200).
;
xdb16: push ax ; 0000DB16 50 'P'
mov al,0x6f ; 0000DB17 B06F '.o'
out 0x84,al ; 0000DB19 E684 '..'
pop ax ; 0000DB1B 58 'X'
mov [0x82],bx ; 0000DB1C 891E8200 '....'
call xdb33 ; 0000DB20 E81000 '...'
mov bx,[0x84] ; 0000DB23 8B1E8400 '....'
mov [0x8a],bx ; 0000DB27 891E8A00 '....'
xdb2b: clc ; 0000DB2B F8 '.'
or ax,ax ; 0000DB2C 0BC0 '..'
jz xdb31 ; 0000DB2E 7401 't.'
stc ; 0000DB30 F9 '.'
xdb31: pop bx ; 0000DB31 5B '['
ret ; 0000DB32 C3 '.'
;
; Protected-mode Memory Test
;
; When called from x8509 (ie, the initial call):
;
; word [0x82]: 0x80
; byte [0x8f]: 0xff
; byte [0x92]: 0x01 (this means display the value in BP immediately)
; (BP): 0x80 (128)
; (AH): 0xFE (64Kb block number, copied to byte [0x4c] on entry)
;
; On the initial call, the first 128Kb has already been tested and initialized (see init_128kb),
; which is why BP is set to 128 for immediate display of "00128 KB OK".
;
; We then proceed to test the 128Kb starting at %FE0000 through %FFFFFF (the top of the 16Mb range),
; which is where this ROM (and potentially other ROMs) will be copied and then mapped to %0E0000
; through %0FFFFF. Compaq refers to this as "relocatable RAM".
;
; On the second call (from xdb16), AH is 0x02 (the first 64Kb block after the first 128Kb), and on
; successful completion of that call, "00768 KB OK" will be displayed, referring to the first 640Kb
; of conventional RAM plus the 128Kb of "relocatable RAM" tested earlier.
;
; On the third call (from xdafc), AH is 0x10 (the first 64Kb block above 1Mb). Assuming this call
; successfully tests another 1024Kb, a total of "01792 KB OK" will be displayed.
;
; There appears to be a fourth call (from xd82e), where AH is 0xF0 (the first 64Kb of the last 1Mb
; of the first 16Mb); we place no memory there, and Compaq memory maps typically show no memory there,
; so I'm not sure what that's all about. -JP
;
xdb33: push bx ; 0000DB33 53 'S'
push di ; 0000DB34 57 'W'
push es ; 0000DB35 06 '.'
mov al,0x70 ; 0000DB36 B070 '.p'
out 0x84,al ; 0000DB38 E684 '..'
mov [0x4c],ah ; 0000DB3A 88264C00 '.&L.'
mov al,ah ; 0000DB3E 8AC4 '..'
xor ah,ah ; 0000DB40 32E4 '2.'
mov di,ax ; 0000DB42 8BF8 '..'
mov bx,0x0 ; 0000DB44 BB0000 '...'
cmp byte [0x92],0x1 ; 0000DB47 803E920001 '.>...'
jnz xdb58 ; 0000DB4C 750A 'u',0x0A
;
; Display the Kb value in (BP)
;
mov ax,0x40 ; segment 0x40 mapped to %B0000
mov es,ax ; (ES) -> video buffers
mov ax,bp ; (AX) == value to display (in Kb)
call x80a5 ; display it
xdb58: cmp word [0x82],byte +0x0 ; 0000DB58 833E820000 '.>...'
jnz xdb6b ; 0000DB5D 750C 'u.'
mov ax,0x0 ; 0000DB5F B80000 '...'
mov word [0x84],0x0 ; 0000DB62 C70684000000 '......'
jmp xdbf1 ; 0000DB68 E98600 '...'
;
; Test another 64Kb of memory
;
xdb6b: mov al,0x71 ; 0000DB6B B071 '.q'
out 0x84,al ; 0000DB6D E684 '..'
mov ax,0x48 ; 0000DB6F B84800 '.H.'
mov es,ax ; 0000DB72 8EC0 '..'
push bx ; 0000DB74 53 'S'
push si ; 0000DB75 56 'V'
push di ; 0000DB76 57 'W'
push bp ; 0000DB77 55 'U'
mov al,[0x8f] ; 0000DB78 A08F00 '...'
cmp [0x4c],al ; 0000DB7B 38064C00 '8.L.'
ja xdb86 ; 0000DB7F 7705 'w.'
;
; Test the memory at segment 0x48 (ES), carry clear if success
;
call xad38 ; 0000DB81 E8B4D1 '...'
jmp short xdb89 ; 0000DB84 EB03 '..'
xdb86: call x8c7e ; 0000DB86 E8F5B0 '...'
xdb89: pop bp ; 0000DB89 5D ']'
pop di ; 0000DB8A 5F '_'
pop si ; 0000DB8B 5E '^'
pop bx ; 0000DB8C 5B '['
jnc xdb99 ; 0000DB8D 730A 's',0x0A
mov ch,[0x4c] ; 0000DB8F 8A2E4C00 '..L.'
mov ax,0x1 ; 0000DB93 B80100 '...'
jmp short xdbed ; 0000DB96 EB55 '.U'
nop ; 0000DB98 90 '.'
xdb99: add bx,byte +0x40 ; 0000DB99 83C340 '..@'
cld ; 0000DB9C FC '.'
push di ; 0000DB9D 57 'W'
push cx ; 0000DB9E 51 'Q'
push bx ; 0000DB9F 53 'S'
mov bl,[0x4c] ; 0000DBA0 8A1E4C00 '..L.'
mov cx,0x8 ; 0000DBA4 B90800 '...'
xor di,di ; 0000DBA7 33FF '3.'
xdba9: xor ax,ax ; 0000DBA9 33C0 '3.'
rcr bx,1 ; 0000DBAB D1DB '..'
sbb ax,0x0 ; 0000DBAD 1D0000 '...'
stosw ; 0000DBB0 AB '.'
loop xdba9 ; 0000DBB1 E2F6 '..'
mov bl,[0x4c] ; 0000DBB3 8A1E4C00 '..L.'
mov ax,0x0 ; 0000DBB7 B80000 '...'
test bl,0x2 ; 0000DBBA F6C302 '...'
jz xdbc2 ; 0000DBBD 7403 't.'
mov ax,0x101 ; 0000DBBF B80101 '...'
xdbc2: stosw ; 0000DBC2 AB '.'
pop bx ; 0000DBC3 5B '['
pop cx ; 0000DBC4 59 'Y'
pop di ; 0000DBC5 5F '_'
cmp byte [0x92],0x1 ; 0000DBC6 803E920001 '.>...'
jnz xdbd9 ; 0000DBCB 750C 'u.'
mov ax,0x40 ; 0000DBCD B84000 '.@.'
mov es,ax ; 0000DBD0 8EC0 '..'
mov ax,bp ; 0000DBD2 8BC5 '..'
add ax,bx ; 0000DBD4 03C3 '..'
;
; Display (AX) as a 5-digit value in the top-left corner of the screen, followed by " KB OK"
;
call x80a5 ; 0000DBD6 E8CCA4
;
; After displaying "00192 KB OK", BX is 0x40 and [0x82] contains 0x80.
;
xdbd9: cmp [0x82],bx ; 0000DBD9 391E8200 '9...'
ja xdbe5 ; 0000DBDD 7706 'w.'
mov ax,0x0 ; 0000DBDF B80000 '...'
jmp short xdbed ; 0000DBE2 EB09 '..'
nop ; 0000DBE4 90 '.'
xdbe5: add byte [0x4c],0x1 ; 0000DBE5 80064C0001 '..L..'
jmp xdb6b ; 0000DBEA E97EFF '.~.'
;
; Now we're on to a new phase, after displaying "00256 KB OK"
;
xdbed: mov [0x84],bx ; 0000DBED 891E8400 '....'
xdbf1: push ax ; 0000DBF1 50 'P'
mov al,0x73 ; 0000DBF2 B073 '.s'
out 0x84,al ; 0000DBF4 E684 '..'
pop ax ; 0000DBF6 58 'X'
pop es ; 0000DBF7 07 '.'
pop di ; 0000DBF8 5F '_'
pop bx ; 0000DBF9 5B '['
ret ; 0000DBFA C3 '.'
xdbfb: push es ; 0000DBFB 06 '.'
push di ; 0000DBFC 57 'W'
push bx ; 0000DBFD 53 'S'
push ax ; 0000DBFE 50 'P'
mov al,0x72 ; 0000DBFF B072 '.r'
out 0x84,al ; 0000DC01 E684 '..'
pop ax ; 0000DC03 58 'X'
xdc04: mov [0x4c],al ; 0000DC04 A24C00 '.L.'
push ax ; 0000DC07 50 'P'
mov bx,0x48 ; 0000DC08 BB4800 '.H.'
mov es,bx ; 0000DC0B 8EC3 '..'
mov cx,0x8 ; 0000DC0D B90800 '...'
mov bl,al ; 0000DC10 8AD8 '..'
xor di,di ; 0000DC12 33FF '3.'
xdc14: xor ax,ax ; 0000DC14 33C0 '3.'
rcr bx,1 ; 0000DC16 D1DB '..'
sbb ax,0x0 ; 0000DC18 1D0000 '...'
scasw ; 0000DC1B AF '.'
jnz xdc59 ; 0000DC1C 753B 'u;'
loop xdc14 ; 0000DC1E E2F4 '..'
mov al,[es:di] ; 0000DC20 268A05 '&..'
in al,0x61 ; 0000DC23 E461 '.a'
test al,0xc0 ; 0000DC25 A8C0 '..'
jz xdc2f ; 0000DC27 7406 't.'
xor al,al ; 0000DC29 32C0 '2.'
xor di,di ; 0000DC2B 33FF '3.'
jmp short xdc66 ; 0000DC2D EB37 '.7'
xdc2f: inc di ; 0000DC2F 47 'G'
mov ax,[es:di] ; 0000DC30 268B05 '&..'
in al,0x61 ; 0000DC33 E461 '.a'
test al,0xc0 ; 0000DC35 A8C0 '..'
jz xdc40 ; 0000DC37 7407 't.'
xor al,al ; 0000DC39 32C0 '2.'
mov di,0x1 ; 0000DC3B BF0100 '...'
jmp short xdc66 ; 0000DC3E EB26 '.&'
xdc40: cmp byte [0x92],0x1 ; 0000DC40 803E920001 '.>...'
jnz xdc56 ; 0000DC45 750F 'u.'
mov ax,0x40 ; 0000DC47 B84000 '.@.'
mov es,ax ; 0000DC4A 8EC0 '..'
mov ax,bp ; 0000DC4C 8BC5 '..'
add ax,0x40 ; 0000DC4E 054000 '.@.'
mov bp,ax ; 0000DC51 8BE8 '..'
call x80a5 ; 0000DC53 E84FA4 '.O.'
xdc56: pop ax ; 0000DC56 58 'X'
jmp short xdc81 ; 0000DC57 EB28 '.('
xdc59: dec di ; 0000DC59 4F 'O'
dec di ; 0000DC5A 4F 'O'
xor al,[es:di] ; 0000DC5B 263205 '&2.'
jnz xdc66 ; 0000DC5E 7506 'u.'
inc di ; 0000DC60 47 'G'
xor ah,[es:di] ; 0000DC61 263225 '&2%'
mov al,ah ; 0000DC64 8AC4 '..'
xdc66: mov byte [es:di],0x0 ; 0000DC66 26C60500 '&...'
mov cl,al ; 0000DC6A 8AC8 '..'
mov ch,[0x4c] ; 0000DC6C 8A2E4C00 '..L.'
mov al,0x7c ; 0000DC70 B07C '.|'
out 0x84,al ; 0000DC72 E684 '..'
pop ax ; 0000DC74 58 'X'
mov ax,bp ; 0000DC75 8BC5 '..'
mov [0x84],ax ; 0000DC77 A38400 '...'
mov dx,di ; 0000DC7A 8BD7 '..'
mov ax,0x2 ; 0000DC7C B80200 '...'
jmp short xdc92 ; 0000DC7F EB11 '..'
xdc81: inc al ; 0000DC81 FEC0 '..'
cmp ah,al ; 0000DC83 3AE0 ':.'
jna xdc8a ; 0000DC85 7603 'v.'
xdc87: jmp xdc04 ; 0000DC87 E97AFF '.z.'
xdc8a: cmp ax,0xff ; 0000DC8A 3DFF00 '=..'
jz xdc87 ; 0000DC8D 74F8 't.'
mov ax,0x0 ; 0000DC8F B80000 '...'
xdc92: pop bx ; 0000DC92 5B '['
pop di ; 0000DC93 5F '_'
pop es ; 0000DC94 07 '.'
ret ; 0000DC95 C3 '.'
xdc96: call xeba5 ; 0000DC96 E80C0F '...'
cli ; 0000DC99 FA '.'
call xc242 ; 0000DC9A E8A5E5 '...'
sti ; 0000DC9D FB '.'
jnz xdcae ; 0000DC9E 750E 'u.'
mov ax,0x9002 ; 0000DCA0 B80290 '...'
clc ; 0000DCA3 F8 '.'
int 0x15 ; 0000DCA4 CD15 '..'
xdca6: cli ; 0000DCA6 FA '.'
call xc242 ; 0000DCA7 E898E5 '...'
sti ; 0000DCAA FB '.'
nop ; 0000DCAB 90 '.'
jz xdca6 ; 0000DCAC 74F8 't.'
xdcae: cmp si,[0x82] ; 0000DCAE 3B368200 ';6..'
jnz xdcb8 ; 0000DCB2 7504 'u.'
mov si,[0x80] ; 0000DCB4 8B368000 '.6..'
xdcb8: mov [0x1a],si ; 0000DCB8 89361A00 '.6..'
sti ; 0000DCBC FB '.'
ret ; 0000DCBD C3 '.'
xdcbe: call xeba5 ; 0000DCBE E8E40E '...'
cli ; 0000DCC1 FA '.'
call xc242 ; 0000DCC2 E87DE5 '.}.'
sti ; 0000DCC5 FB '.'
ret ; 0000DCC6 C3 '.'
xdcc7: mov al,[0x17] ; 0000DCC7 A01700 '...'
ret ; 0000DCCA C3 '.'
xdccb: cmp ah,0x0 ; 0000DCCB 80FC00 '...'
jz xdcf3 ; 0000DCCE 7423 't#'
cmp ax,0xe00d ; 0000DCD0 3D0DE0 '=',0x0D,'.'
jnz xdcda ; 0000DCD3 7505 'u.'
mov ax,0x1c0d ; 0000DCD5 B80D1C '.',0x0D,'.'
jmp short xdcf3 ; 0000DCD8 EB19 '..'
xdcda: cmp ax,0xe02f ; 0000DCDA 3D2FE0 '=/.'
jnz xdce4 ; 0000DCDD 7505 'u.'
mov ax,0x352f ; 0000DCDF B82F35 './5'
jmp short xdcf3 ; 0000DCE2 EB0F '..'
xdce4: cmp ah,0x84 ; 0000DCE4 80FC84 '...'
ja xdcf8 ; 0000DCE7 770F 'w.'
cmp al,0xf0 ; 0000DCE9 3CF0 '<.'
jz xdcf8 ; 0000DCEB 740B 't.'
cmp al,0xe0 ; 0000DCED 3CE0 '<.'
jnz xdcf3 ; 0000DCEF 7502 'u.'
mov al,0x0 ; 0000DCF1 B000 '..'
xdcf3: mov si,0xffff ; 0000DCF3 BEFFFF '...'
jmp short xdcfa ; 0000DCF6 EB02 '..'
xdcf8: xor si,si ; 0000DCF8 33F6 '3.'
xdcfa: test si,si ; 0000DCFA 85F6 '..'
ret ; 0000DCFC C3 '.'
xdcfd: cmp ah,0x0 ; 0000DCFD 80FC00 '...'
jz xdd08 ; 0000DD00 7406 't.'
cmp al,0xf0 ; 0000DD02 3CF0 '<.'
jnz xdd08 ; 0000DD04 7502 'u.'
mov al,0x0 ; 0000DD06 B000 '..'
xdd08: ret ; 0000DD08 C3 '.'
xdd09: push bx ; 0000DD09 53 'S'
mov bl,[0x18] ; 0000DD0A 8A1E1800 '....'
mov al,bl ; 0000DD0E 8AC3 '..'
and al,0x73 ; 0000DD10 2473 '$s'
and bl,0x4 ; 0000DD12 80E304 '...'
shl bl,0x5 ; 0000DD15 C0E305 '...'
or al,bl ; 0000DD18 0AC3 0x0A,'.'
mov ah,[0x96] ; 0000DD1A 8A269600 '.&..'
and ah,0xc ; 0000DD1E 80E40C '...'
or ah,al ; 0000DD21 0AE0 0x0A,'.'
mov al,[0x17] ; 0000DD23 A01700 '...'
pop bx ; 0000DD26 5B '['
ret ; 0000DD27 C3 '.'
xdd28: cmp al,0x5 ; 0000DD28 3C05 '<.'
jnz xdd87 ; 0000DD2A 755B 'u['
cmp bh,0x3 ; 0000DD2C 80FF03 '...'
ja xdd87 ; 0000DD2F 7756 'wV'
cmp bl,0x1f ; 0000DD31 80FB1F '...'
ja xdd87 ; 0000DD34 7751 'wQ'
push cx ; 0000DD36 51 'Q'
xdd37: call xec1e ; 0000DD37 E8E40E '...'
jnz xdd37 ; 0000DD3A 75FB 'u.'
and byte [0x97],0xef ; 0000DD3C 80269700EF '.&...'
call xec2e_wait_8042_ready ; 0000DD41 E8EA0E '...'
mov al,0xf3 ; 0000DD44 B0F3 '..'
out 0x60,al ; 0000DD46 E660 '.`'
mov cx,0xffff ; 0000DD48 B9FFFF '...'
xdd4b: test byte [0x97],0x10 ; 0000DD4B F606970010 '.....'
jnz xdd5d ; 0000DD50 750B 'u.'
loop xdd4b ; 0000DD52 E2F7 '..'
call xec2e_wait_8042_ready ; 0000DD54 E8D70E '...'
mov al,0xf4 ; 0000DD57 B0F4 '..'
out 0x60,al ; 0000DD59 E660 '.`'
jmp short xdd81 ; 0000DD5B EB24 '.$'
xdd5d: and byte [0x97],0xef ; 0000DD5D 80269700EF '.&...'
call xec2e_wait_8042_ready ; 0000DD62 E8C90E '...'
mov al,bh ; 0000DD65 8AC7 '..'
shl al,0x5 ; 0000DD67 C0E005 '...'
or al,bl ; 0000DD6A 0AC3 0x0A,'.'
out 0x60,al ; 0000DD6C E660 '.`'
mov cx,0xffff ; 0000DD6E B9FFFF '...'
xdd71: test byte [0x97],0x10 ; 0000DD71 F606970010 '.....'
jnz xdd81 ; 0000DD76 7509 'u.'
loop xdd71 ; 0000DD78 E2F7 '..'
call xec2e_wait_8042_ready ; 0000DD7A E8B10E '...'
mov al,0xf4 ; 0000DD7D B0F4 '..'
out 0x60,al ; 0000DD7F E660 '.`'
xdd81: and byte [0x97],0xbf ; 0000DD81 80269700BF '.&...'
pop cx ; 0000DD86 59 'Y'
xdd87: ret ; 0000DD87 C3 '.'
xdd88: cli ; 0000DD88 FA '.'
mov si,[0x1c] ; 0000DD89 8B361C00 '.6..'
mov [si],cx ; 0000DD8D 890C '..'
inc si ; 0000DD8F 46 'F'
inc si ; 0000DD90 46 'F'
cmp si,[0x82] ; 0000DD91 3B368200 ';6..'
jnz xdd9b ; 0000DD95 7504 'u.'
mov si,[0x80] ; 0000DD97 8B368000 '.6..'
xdd9b: cmp si,[0x1a] ; 0000DD9B 3B361A00 ';6..'
jz xddaa ; 0000DD9F 7409 't.'
mov [0x1c],si ; 0000DDA1 89361C00 '.6..'
xor al,al ; 0000DDA5 32C0 '2.'
clc ; 0000DDA7 F8 '.'
jmp short xddad ; 0000DDA8 EB03 '..'
xddaa: mov al,0x1 ; 0000DDAA B001 '..'
stc ; 0000DDAC F9 '.'
xddad: sti ; 0000DDAD FB '.'
ret ; 0000DDAE C3 '.'
xddaf: push ax ; 0000DDAF 50 'P'
cmp al,0x8 ; 0000DDB0 3C08 '<.'
jz xde13 ; 0000DDB2 745F 't_'
cmp al,0x9 ; 0000DDB4 3C09 '<.'
jz xde1f ; 0000DDB6 7467 'tg'
test al,al ; 0000DDB8 84C0 '..'
jnz xddd2 ; 0000DDBA 7516 'u.'
in al,0x86 ; 0000DDBC E486 '..'
and al,0xbf ; 0000DDBE 24BF '$.'
or al,0x80 ; 0000DDC0 0C80 '..'
and al,0xc0 ; 0000DDC2 24C0 '$.'
or al,[cs:0x67de] ; 0000DDC4 2E0A06DE67 '.',0x0A,'..g'
out 0x86,al ; 0000DDC9 E686 '..'
mov ah,[cs:0x67de] ; 0000DDCB 2E8A26DE67 '..&.g'
jmp short xde40 ; 0000DDD0 EB6E '.n'
xddd2: dec al ; 0000DDD2 FEC8 '..'
jnz xddec ; 0000DDD4 7516 'u.'
in al,0x86 ; 0000DDD6 E486 '..'
and al,0xbf ; 0000DDD8 24BF '$.'
or al,0x80 ; 0000DDDA 0C80 '..'
and al,0xc0 ; 0000DDDC 24C0 '$.'
or al,[cs:0x67dd] ; 0000DDDE 2E0A06DD67 '.',0x0A,'..g'
out 0x86,al ; 0000DDE3 E686 '..'
mov ah,[cs:0x67dd] ; 0000DDE5 2E8A26DD67 '..&.g'
jmp short xde40 ; 0000DDEA EB54 '.T'
xddec: dec al ; 0000DDEC FEC8 '..'
jnz xddfc ; 0000DDEE 750C 'u.'
in al,0x86 ; 0000DDF0 E486 '..'
and al,0x7f ; 0000DDF2 247F '$.'
or al,0x40 ; 0000DDF4 0C40 '.@'
out 0x86,al ; 0000DDF6 E686 '..'
mov ah,0x0 ; 0000DDF8 B400 '..'
jmp short xde40 ; 0000DDFA EB44 '.D'
xddfc: dec al ; 0000DDFC FEC8 '..'
jnz xde4f ; 0000DDFE 754F 'uO'
in al,0x86 ; 0000DE00 E486 '..'
mov ah,0x0 ; 0000DE02 B400 '..'
test al,0x40 ; 0000DE04 A840 '.@'
jz xde0d ; 0000DE06 7405 't.'
mov ah,al ; 0000DE08 8AE0 '..'
and ah,0x3f ; 0000DE0A 80E43F '..?'
xde0d: xor al,0x40 ; 0000DE0D 3440 '4@'
out 0x86,al ; 0000DE0F E686 '..'
jmp short xde40 ; 0000DE11 EB2D '.-'
xde13: in al,0x86 ; 0000DE13 E486 '..'
and al,0x7f ; 0000DE15 247F '$.'
or al,0xc0 ; 0000DE17 0CC0 '..'
out 0x86,al ; 0000DE19 E686 '..'
mov ah,0x0 ; 0000DE1B B400 '..'
jmp short xde40 ; 0000DE1D EB21 '.!'
xde1f: cmp cx,byte +0x1 ; 0000DE1F 83F901 '...'
jc xde4f ; 0000DE22 722B 'r+'
cmp cx,byte +0x32 ; 0000DE24 83F932 '..2'
ja xde4f ; 0000DE27 7726 'w&'
mov ax,0x32 ; 0000DE29 B83200 '.2.'
sub ax,cx ; 0000DE2C 2BC1 '+.'
inc ax ; 0000DE2E 40 '@'
inc ax ; 0000DE2F 40 '@'
mov ah,al ; 0000DE30 8AE0 '..'
in al,0x86 ; 0000DE32 E486 '..'
and al,0xbf ; 0000DE34 24BF '$.'
or al,0x80 ; 0000DE36 0C80 '..'
and al,0xc0 ; 0000DE38 24C0 '$.'
or al,ah ; 0000DE3A 0AC4 0x0A,'.'
out 0x86,al ; 0000DE3C E686 '..'
jmp short xde40 ; 0000DE3E EB00 '..'
xde40: mov al,0x92 ; 0000DE40 B092 '..'
cli ; 0000DE42 FA '.'
out 0x4b,al ; 0000DE43 E64B '.K'
cmp ah,0x0 ; 0000DE45 80FC00 '...'
jz xde4e ; 0000DE48 7404 't.'
mov al,ah ; 0000DE4A 8AC4 '..'
out 0x4a,al ; 0000DE4C E64A '.J'
xde4e: sti ; 0000DE4E FB '.'
xde4f: pop ax ; 0000DE4F 58 'X'
ret ; 0000DE50 C3 '.'
xde51: in al,0x86 ; 0000DE51 E486 '..'
test al,0x40 ; 0000DE53 A840 '.@'
jnz xde5f ; 0000DE55 7508 'u.'
test al,0x80 ; 0000DE57 A880 '..'
jnz xde5f ; 0000DE59 7504 'u.'
mov ah,0x8 ; 0000DE5B B408 '..'
jmp short xde8c ; 0000DE5D EB2D '.-'
xde5f: test al,0x40 ; 0000DE5F A840 '.@'
jnz xde84 ; 0000DE61 7521 'u!'
mov ah,0x0 ; 0000DE63 B400 '..'
and al,0x3f ; 0000DE65 243F '$?'
cmp al,[cs:0x67de] ; 0000DE67 2E3A06DE67 '.:..g'
jz xde8c ; 0000DE6C 741E 't.'
mov ah,0x1 ; 0000DE6E B401 '..'
cmp al,[cs:0x67dd] ; 0000DE70 2E3A06DD67 '.:..g'
jz xde8c ; 0000DE75 7415 't.'
xor ah,ah ; 0000DE77 32E4 '2.'
mov cx,0x32 ; 0000DE79 B93200 '.2.'
sub cx,ax ; 0000DE7C 2BC8 '+.'
inc cx ; 0000DE7E 41 'A'
inc cx ; 0000DE7F 41 'A'
mov ah,0x9 ; 0000DE80 B409 '..'
jmp short xde8c ; 0000DE82 EB08 '..'
xde84: mov ah,0x8 ; 0000DE84 B408 '..'
test al,0x80 ; 0000DE86 A880 '..'
jnz xde8c ; 0000DE88 7502 'u.'
mov ah,0x2 ; 0000DE8A B402 '..'
xde8c: mov al,ah ; 0000DE8C 8AC4 '..'
xor ah,ah ; 0000DE8E 32E4 '2.'
ret ; 0000DE90 C3 '.'
xde91: call xf337 ; 0000DE91 E8A314 '...'
mov ah,0xff ; 0000DE94 B4FF '..'
jz xdea0 ; 0000DE96 7408 't.'
mov ah,0x0 ; 0000DE98 B400 '..'
test al,0x20 ; 0000DE9A A820 '. '
jz xdea0 ; 0000DE9C 7402 't.'
mov ah,0x1 ; 0000DE9E B401 '..'
xdea0: mov al,ah ; 0000DEA0 8AC4 '..'
xor ah,ah ; 0000DEA2 32E4 '2.'
ret ; 0000DEA4 C3 '.'
xdea5: sti ; 0000DEA5 FB '.'
pusha ; 0000DEA6 60 '`'
cmp al,0x2 ; 0000DEA7 3C02 '<.'
jna xdeae ; 0000DEA9 7603 'v.'
jmp xdfb8 ; 0000DEAB E90A01 '.',0x0A,'.'
xdeae: sub sp,byte +0x38 ; 0000DEAE 83EC38 '..8'
mov bp,sp ; 0000DEB1 8BEC '..'
mov ax,ss ; 0000DEB3 8CD0 '..'
mov es,ax ; 0000DEB5 8EC0 '..'
mov ds,ax ; 0000DEB7 8ED8 '..'
mov di,bp ; 0000DEB9 8BFD '..'
xor ax,ax ; 0000DEBB 33C0 '3.'
mov cx,0x38 ; 0000DEBD B93800 '.8.'
rep stosb ; 0000DEC0 F3AA '..'
mov si,bp ; 0000DEC2 8BF5 '..'
lea di,[si+0x10] ; 0000DEC4 8D7C10 '.|.'
mov word [es:di],0xffff ; 0000DEC7 26C705FFFF '&....'
mov byte [es:di+0x7],0x80 ; 0000DECC 26C6450780 '&.E..'
mov byte [es:di+0x6],0x0 ; 0000DED1 26C6450600 '&.E..'
mov byte [es:di+0x5],0x92 ; 0000DED6 26C6450592 '&.E..'
mov word [es:di+0x2],0x0 ; 0000DEDB 26C745020000 '&.E...'
mov byte [es:di+0x4],0xc0 ; 0000DEE1 26C64504C0 '&.E..'
lea di,[si+0x18] ; 0000DEE6 8D7C18 '.|.'
mov word [es:di],0xffff ; 0000DEE9 26C705FFFF '&....'
mov byte [es:di+0x7],0x0 ; 0000DEEE 26C6450700 '&.E..'
mov byte [es:di+0x6],0x0 ; 0000DEF3 26C6450600 '&.E..'
mov byte [es:di+0x5],0x92 ; 0000DEF8 26C6450592 '&.E..'
mov ax,ss ; 0000DEFD 8CD0 '..'
mov bx,0x10 ; 0000DEFF BB1000 '...'
mul bx ; 0000DF02 F7E3 '..'
add ax,bp ; 0000DF04 03C5 '..'
adc dl,0x0 ; 0000DF06 80D200 '...'
add ax,0x38 ; 0000DF09 053800 '.8.'
adc dl,0x0 ; 0000DF0C 80D200 '...'
mov [es:di+0x2],ax ; 0000DF0F 26894502 '&.E.'
mov [es:di+0x4],dl ; 0000DF13 26885504 '&.U.'
xor bx,bx ; 0000DF17 33DB '3.'
call xdfee ; 0000DF19 E8D200 '...'
jnc xdf21 ; 0000DF1C 7303 's.'
jmp xdfb5 ; 0000DF1E E99400 '...'
xdf21: lea di,[si+0x38] ; 0000DF21 8D7C38 '.|8'
mov al,[es:di] ; 0000DF24 268A05 '&..'
and al,0xc0 ; 0000DF27 24C0 '$.'
cmp al,0x40 ; 0000DF29 3C40 '<@'
jz xdf34 ; 0000DF2B 7407 't.'
mov byte [bp+0x46],0x0 ; 0000DF2D C6464600 '.FF.'
jmp xdfb5 ; 0000DF31 E98100 '...'
xdf34: mov bx,0x2 ; 0000DF34 BB0200 '...'
call xdfee ; 0000DF37 E8B400 '...'
jc xdfb5 ; 0000DF3A 7279 'ry'
mov al,[bp+0x46] ; 0000DF3C 8A4646 '.FF'
or al,al ; 0000DF3F 0AC0 0x0A,'.'
jz xdfa0 ; 0000DF41 745D 't]'
lea di,[si+0x10] ; 0000DF43 8D7C10 '.|.'
mov bx,si ; 0000DF46 8BDE '..'
lea si,[si+0x18] ; 0000DF48 8D7418 '.t.'
call xdfbc ; 0000DF4B E86E00 '.n.'
mov si,bx ; 0000DF4E 8BF3 '..'
mov di,bim_table_offset ; 0000DF50 BFE0FF '...'
mov di,[cs:di] ; 0000DF53 2E8B3D '..='
test word [cs:di],0xf00 ; 0000DF56 2EF705000F '.....'
lea di,[si+0x38] ; 0000DF5B 8D7C38 '.|8'
push word [es:di] ; 0000DF5E 26FF35 '&.5'
jz xdf69 ; 0000DF61 7406 't.'
mov byte [es:di],0xff ; 0000DF63 26C605FF '&...'
jmp short xdf6d ; 0000DF67 EB04 '..'
xdf69: mov byte [es:di],0xfc ; 0000DF69 26C605FC '&...'
xdf6d: xor bx,bx ; 0000DF6D 33DB '3.'
call xdfdf ; 0000DF6F E86D00 '.m.'
lea di,[si+0x38] ; 0000DF72 8D7C38 '.|8'
pop word [es:di] ; 0000DF75 268F05 '&..'
dec al ; 0000DF78 FEC8 '..'
jz xdf8e ; 0000DF7A 7412 't.'
and byte [es:di],0xbf ; 0000DF7C 268025BF '&.%.'
mov bx,0x2 ; 0000DF80 BB0200 '...'
call xdfdf ; 0000DF83 E85900 '.Y.'
jc xdfb5 ; 0000DF86 722D 'r-'
mov byte [bp+0x46],0x2 ; 0000DF88 C6464602 '.FF.'
jmp short xdfb5 ; 0000DF8C EB27 '.',0x27
xdf8e: or byte [es:di],0x40 ; 0000DF8E 26800D40 '&.',0x0D,'@'
mov bx,0x2 ; 0000DF92 BB0200 '...'
call xdfdf ; 0000DF95 E84700 '.G.'
jc xdfb5 ; 0000DF98 721B 'r.'
mov byte [bp+0x46],0x1 ; 0000DF9A C6464601 '.FF.'
jmp short xdfb5 ; 0000DF9E EB15 '..'
xdfa0: lea di,[si+0x38] ; 0000DFA0 8D7C38 '.|8'
mov bl,[es:di] ; 0000DFA3 268A1D '&..'
and bl,0x40 ; 0000DFA6 80E340 '..@'
jz xdfb1 ; 0000DFA9 7406 't.'
mov byte [bp+0x46],0x1 ; 0000DFAB C6464601 '.FF.'
jmp short xdfb5 ; 0000DFAF EB04 '..'
xdfb1: mov byte [bp+0x46],0x2 ; 0000DFB1 C6464602 '.FF.'
xdfb5: add sp,byte +0x38 ; 0000DFB5 83C438 '..8'
xdfb8: popa ; 0000DFB8 61 'a'
mov ah,0xe2 ; 0000DFB9 B4E2 '..'
ret ; 0000DFBB C3 '.'
xdfbc: cld ; 0000DFBC FC '.'
push word [di] ; 0000DFBD FF35 '.5'
push word [di+0x2] ; 0000DFBF FF7502 '.u.'
push word [di+0x4] ; 0000DFC2 FF7504 '.u.'
push word [di+0x6] ; 0000DFC5 FF7506 '.u.'
mov cx,0x4 ; 0000DFC8 B90400 '...'
rep movsw ; 0000DFCB F3A5 '..'
sub si,byte +0x8 ; 0000DFCD 83EE08 '...'
sub di,byte +0x8 ; 0000DFD0 83EF08 '...'
pop word [si+0x6] ; 0000DFD3 8F4406 '.D.'
pop word [si+0x4] ; 0000DFD6 8F4404 '.D.'
pop word [si+0x2] ; 0000DFD9 8F4402 '.D.'
pop word [si] ; 0000DFDC 8F04 '..'
ret ; 0000DFDE C3 '.'
xdfdf: lea di,[si+0x18] ; 0000DFDF 8D7C18 '.|.'
mov [es:di+0x2],bx ; 0000DFE2 26895D02 '&.].'
mov cx,0x1 ; 0000DFE6 B90100 '...'
mov ah,0x87 ; 0000DFE9 B487 '..'
int 0x15 ; 0000DFEB CD15 '..'
ret ; 0000DFED C3 '.'
xdfee: lea di,[si+0x10] ; 0000DFEE 8D7C10 '.|.'
mov [es:di+0x2],bx ; 0000DFF1 26895D02 '&.].'
mov cx,0x1 ; 0000DFF5 B90100 '...'
mov ah,0x87 ; 0000DFF8 B487 '..'
int 0x15 ; 0000DFFA CD15 '..'
ret ; 0000DFFC C3 '.'
db 0xFF ; 0000DFFD FF '.'
db 0xFF ; 0000DFFE FF '.'
db 0xFF ; 0000DFFF FF '.'
jmp short xe05e ; 0000E000 EB5C '.\'
db 'AUTHORS CAB93GLB93RWS93DJC93NPB(C)Copyright COMPAQ Computer Corporation 1982,83,84,85,86,'
xe05b: jmp xbaa7 ; 0000E05B E949DA
xe05e: jmp 0xf000:0x8e31 ; 0000E05E EA318E00F0 '.1...'
db '((CC))CCooppyyrriigghhtt CCOOMMPPAAQQ CCoommppuutteerr CCoorrppoorraattiioonn 11998822,,8833,,8844,,8855,,8866,,8877--AAllll rriigghhttss rreesseerrvveedd..'
xe105: mov al,0xd ; 0000E105 B00D '.',0x0D 0x0D
out 0x84,al ; 0000E107 E684 '..'
mov al,0x12 ; 0000E109 B012 '..'
out 0x4b,al ; 0000E10B E64B '.K'
mov al,0x22 ; 0000E10D B022 '."'
mov dx,0x48 ; 0000E10F BA4800 '.H.'
out dx,al ; 0000E112 EE '.'
mov bl,0x0 ; 0000E113 B300 '..'
call xe134 ; 0000E115 E81C00 '...'
mov al,0x12 ; 0000E118 B012 '..'
out 0x4b,al ; 0000E11A E64B '.K'
mov al,0xe ; 0000E11C B00E '..'
out 0x84,al ; 0000E11E E684 '..'
mov al,0x92 ; 0000E120 B092 '..'
out 0x4b,al ; 0000E122 E64B '.K'
mov al,0x22 ; 0000E124 B022 '."'
mov dx,0x4a ; 0000E126 BA4A00 '.J.'
out dx,al ; 0000E129 EE '.'
mov bl,0x80 ; 0000E12A B380 '..'
call xe134 ; 0000E12C E80500 '...'
mov al,0x92 ; 0000E12F B092 '..'
out 0x4b,al ; 0000E131 E64B '.K'
ret ; 0000E133 C3 '.'
xe134: mov cx,0x100 ; 0000E134 B90001 '...'
xe137: mov al,bl ; 0000E137 8AC3 '..'
out 0x4b,al ; 0000E139 E64B '.K'
in al,dx ; 0000E13B EC '.'
mov ah,al ; 0000E13C 8AE0 '..'
in al,dx ; 0000E13E EC '.'
cmp ax,0x22 ; 0000E13F 3D2200 '=".'
jnz xe15c ; 0000E142 7518 'u.'
loop xe137 ; 0000E144 E2F1 '..'
mov al,0x92 ; 0000E146 B092 '..'
out 0x4b,al ; 0000E148 E64B '.K'
mov al,0x12 ; 0000E14A B012 '..'
out 0x4b,al ; 0000E14C E64B '.K'
mov bx,err102 ; 0000E14E BB8CB6 '...'
mov cx,err102_len-2 ; 0000E151 B91800 '...'
mov bp,0xe15a ; 0000E154 BD5AE1 '.Z.'
jmp xc7f7 ; 0000E157 E99DE6 '...'
xe15a: jmp short xe15a ; 0000E15A Hang the machine
xe15c: ret ; 0000E15C C3 '.'
times 13 db 0xFF ; 0000E15D - 0000E169
call near [bx+si-0x1c] ; 0000E16A FF50E4 '.P.'
popa ; 0000E16D 61 'a'
test al,0x40 ; 0000E16E A840 '.@'
jnz xe174 ; 0000E170 7502 'u.'
pop ax ; 0000E172 58 'X'
iret ; 0000E173 CF '.'
xe174: mov al,0x1 ; 0000E174 B001 '..'
out 0x85,al ; 0000E176 E685 '..'
mov al,0x11 ; 0000E178 B011 '..'
out 0x84,al ; 0000E17A E684 '..'
cld ; 0000E17C FC '.'
mov al,0x80 ; 0000E17D B080 '..'
out 0x70,al ; 0000E17F E670 '.p'
mov al,0xff ; 0000E181 B0FF '..'
out 0x21,al ; 0000E183 E621 '.!'
out 0xa1,al ; 0000E185 E6A1 '..'
call xe28e ; 0000E187 E80401 '...'
in al,0x61 ; 0000E18A E461 '.a'
xor ah,ah ; 0000E18C 32E4 '2.'
mov sp,ax ; 0000E18E 8BE0 '..'
mov bp,0xe196 ; 0000E190 BD96E1 '...'
jmp short xe1e6 ; 0000E193 EB51 '.Q'
nop ; 0000E195 90 '.'
mov di,si ; 0000E196 8BFE '..'
mov cx,sp ; 0000E198 8BCC '..'
jc xe19e ; 0000E19A 7202 'r.'
inc ch ; 0000E19C FEC5 '..'
xe19e: mov ax,cs ; 0000E19E 8CC8 '..'
mov ds,ax ; 0000E1A0 8ED8 '..'
mov es,ax ; 0000E1A2 8EC0 '..'
mov ax,0x30 ; 0000E1A4 B83000 '.0.'
mov ss,ax ; 0000E1A7 8ED0 '..'
mov sp,0x100 ; 0000E1A9 BC0001 '...'
mov si,0xb743 ; 0000E1AC BE43B7 '.C.'
call xe282 ; 0000E1AF E8D000 '...'
test ch,ch ; 0000E1B2 84ED '..'
jz xe1be ; 0000E1B4 7408 't.'
mov si,0xb753 ; 0000E1B6 BE53B7 '.S.'
call xe282 ; 0000E1B9 E8C600 '...'
jmp short xe1e5 ; 0000E1BC EB27 '.',0x27
xe1be: xchg di,dx ; 0000E1BE 87FA '..'
mov cx,0x4 ; 0000E1C0 B90400 '...'
shr dx,cl ; 0000E1C3 D3EA '..'
mov cx,0x2 ; 0000E1C5 B90200 '...'
call xe26d ; 0000E1C8 E8A200 '...'
mov dx,di ; 0000E1CB 8BD7 '..'
and dx,0x3 ; 0000E1CD 81E20300 '....'
mov cx,0x4 ; 0000E1D1 B90400 '...'
call xe26d ; 0000E1D4 E89600 '...'
mov al,0x20 ; 0000E1D7 B020 '. '
mov ah,0xe ; 0000E1D9 B40E '..'
int 0x10 ; 0000E1DB CD10 '..'
xor dx,dx ; 0000E1DD 33D2 '3.'
mov cx,0x2 ; 0000E1DF B90200 '...'
call xe26d ; 0000E1E2 E88800 '...'
xe1e5: hlt ; 0000E1E5 F4 '.'
xe1e6: mov si,bp ; 0000E1E6 8BF5 '..'
mov bl,0xff ; 0000E1E8 B3FF '..'
xor di,di ; 0000E1EA 33FF '3.'
mov bp,0xe1f2 ; 0000E1EC BDF2E1 '...'
jmp x8796 ; 0000E1EF E9A4A5
mov bp,si ; 0000E1F2 8BEE '..'
xor ax,ax ; 0000E1F4 33C0 '3.'
mov ds,ax ; 0000E1F6 8ED8 '..'
xor bx,bx ; 0000E1F8 33DB '3.'
mov ax,[bx] ; 0000E1FA 8B07 '..'
mov [bx],ax ; 0000E1FC 8907 '..'
in al,0x61 ; 0000E1FE E461 '.a'
or al,0x8 ; 0000E200 0C08 '..'
out 0x61,al ; 0000E202 E661 '.a'
mov si,bp ; 0000E204 8BF5 '..'
mov bl,0xff ; 0000E206 B3FF '..'
xor di,di ; 0000E208 33FF '3.'
mov bp,0xe210 ; 0000E20A BD10E2 '...'
jmp x8796 ; 0000E20D E986A5
mov bp,si ; 0000E210 8BEE '..'
in al,0x61 ; 0000E212 E461 '.a'
and al,0xf7 ; 0000E214 24F7 '$.'
out 0x61,al ; 0000E216 E661 '.a'
in al,0x61 ; 0000E218 E461 '.a'
test al,0x40 ; 0000E21A A840 '.@'
jz xe221 ; 0000E21C 7403 't.'
clc ; 0000E21E F8 '.'
jmp bp ; 0000E21F FFE5 '..'
xe221: mov ax,0x40 ; 0000E221 B84000 '.@.'
mov ds,ax ; 0000E224 8ED8 '..'
mov di,[0x413] ; 0000E226 8B3E1304 '.>..'
shl di,0x6 ; 0000E22A C1E706 '...'
mov bx,0x0 ; 0000E22D BB0000 '...'
xe230: mov cx,0x4000 ; 0000E230 B90040 '..@'
mov ds,bx ; 0000E233 8EDB '..'
rep lodsd ; 0000E235 66F3AD 'f..'
in al,0x61 ; 0000E238 E461 '.a'
test al,0x40 ; 0000E23A A840 '.@'
jnz xe24a ; 0000E23C 750C 'u.'
add bx,0x1000 ; 0000E23E 81C30010 '....'
cmp bx,di ; 0000E242 3BDF ';.'
jna xe230 ; 0000E244 76EA 'v.'
xor ax,ax ; 0000E246 33C0 '3.'
jmp bp ; 0000E248 FFE5 '..'
xe24a: mov si,bx ; 0000E24A 8BF3 '..'
mov dx,bp ; 0000E24C 8BD5 '..'
xor di,di ; 0000E24E 33FF '3.'
mov bp,0xe256 ; 0000E250 BD56E2 '.V.'
jmp x87e4 ; 0000E253 E98EA5 '...'
mov bp,dx ; 0000E256 8BEA '..'
and bl,0xf ; 0000E258 80E30F '...'
xor dx,dx ; 0000E25B 33D2 '3.'
mov cl,0x4 ; 0000E25D B104 '..'
xe25f: rcr bl,1 ; 0000E25F D0DB '..'
jnc xe268 ; 0000E261 7305 's.'
inc dx ; 0000E263 42 'B'
loop xe25f ; 0000E264 E2F9 '..'
xor dx,dx ; 0000E266 33D2 '3.'
xe268: stc ; 0000E268 F9 '.'
jmp bp ; 0000E269 FFE5 '..'
adc [bx+si],al ; 0000E26B 1000 '..'
xe26d: xchg ax,dx ; 0000E26D 92 '.'
mul word [0xe26b] ; 0000E26E F7266BE2 '.&k.'
xchg ax,dx ; 0000E272 92 '.'
add al,0x30 ; 0000E273 0430 '.0'
cmp al,0x39 ; 0000E275 3C39 '<9'
jna xe27b ; 0000E277 7602 'v.'
add al,0x7 ; 0000E279 0407 '..'
xe27b: mov ah,0xe ; 0000E27B B40E '..'
int 0x10 ; 0000E27D CD10 '..'
loop xe26d ; 0000E27F E2EC '..'
ret ; 0000E281 C3 '.'
xe282: lodsb ; 0000E282 AC '.'
or al,al ; 0000E283 0AC0 0x0A,'.'
jz xe28d ; 0000E285 7406 't.'
mov ah,0xe ; 0000E287 B40E '..'
int 0x10 ; 0000E289 CD10 '..'
jmp short xe282 ; 0000E28B EBF5 '..'
xe28d: ret ; 0000E28D C3 '.'
xe28e: call xf2c0 ; 0000E28E E82F10 './.'
jnz xe2ba ; 0000E291 7527 'u',0x27
push cs ; 0000E293 0E '.'
pop ds ; 0000E294 1F '.'
xor ax,ax ; 0000E295 33C0 '3.'
mov es,ax ; 0000E297 8EC0 '..'
mov di,0x40 ; 0000E299 BF4000 '.@.'
mov ax,[0x7124] ; 0000E29C A12471 '.$q'
stosw ; 0000E29F AB '.'
mov ax,[0x7126] ; 0000E2A0 A12671 '.&q'
stosw ; 0000E2A3 AB '.'
mov di,0x7c ; 0000E2A4 BF7C00 '.|.'
mov ax,[0x7128] ; 0000E2A7 A12871 '.(q'
stosw ; 0000E2AA AB '.'
mov ax,[0x712a] ; 0000E2AB A12A71 '.*q'
stosw ; 0000E2AE AB '.'
mov di,0x10c ; 0000E2AF BF0C01 '...'
mov ax,[0x712c] ; 0000E2B2 A12C71 '.,q'
stosw ; 0000E2B5 AB '.'
mov ax,[0x712e] ; 0000E2B6 A12E71 '..q'
stosw ; 0000E2B9 AB '.'
xe2ba: mov bx,0x7 ; 0000E2BA BB0700 '...'
mov ax,0x3 ; 0000E2BD B80300 '...'
int 0x10 ; 0000E2C0 CD10 '..'
ret ; 0000E2C2 C3 '.'
jmp 0xf000:0xe16b ; 0000E2C3 EA6BE100F0 '.k...'
xe2c8: mov al,0xe ; 0000E2C8 B00E '..'
call xb544 ; 0000E2CA E877D2 '.w.'
mov ah,al ; 0000E2CD 8AE0 '..'
mov al,0x14 ; 0000E2CF B014 '..'
call xb544 ; 0000E2D1 E870D2 '.p.'
test al,0x1 ; 0000E2D4 A801 '..'
jnz xe2db ; 0000E2D6 7503 'u.'
or ah,0x20 ; 0000E2D8 80CC20 '.. '
xe2db: mov al,ah ; 0000E2DB 8AC4 '..'
test al,0xc0 ; 0000E2DD A8C0 '..'
jz xe2f4 ; 0000E2DF 7413
mov dx,0x2000 ; 0000E2E1 BA0020 '.. '
mov bx,0xb8a0 ; 0000E2E4 BBA0B8 '...'
mov cx,0x56 ; 0000E2E7 B95600 '.V.'
call xc745 ; 0000E2EA E858E4 '.X.'
or byte [0x12],0xff ; 0000E2ED 800E1200FF '.....'
jmp short xe336 ; 0000E2F2 EB42 '.B'
xe2f4: test al,0x20 ; 0000E2F4 A820 '. '
jz xe309 ; 0000E2F6 7411 't.'
mov dx,0x2000 ; 0000E2F8 BA0020 '.. '
mov bx,0xb8a0 ; 0000E2FB BBA0B8 '...'
mov cx,0x56 ; 0000E2FE B95600 '.V.'
call xc745 ; 0000E301 E841E4 '.A.'
or byte [0x12],0xff ; 0000E304 800E1200FF '.....'
xe309: test byte [0x10],0x1 ; 0000E309 F606100001 '.....'
jnz xe321 ; 0000E30E 7511 'u.'
mov dx,0x2000 ; 0000E310 BA0020 '.. '
mov bx,0xb8f6 ; 0000E313 BBF6B8 '...'
mov cx,0x1b ; 0000E316 B91B00 '...'
call xc745 ; 0000E319 E829E4 '.).'
or byte [0x12],0xff ; 0000E31C 800E1200FF '.....'
xe321: test al,0x10 ; 0000E321 A810 '..'
jz xe336 ; 0000E323 7411 't.'
mov dx,0x2000 ; 0000E325 BA0020 '.. '
mov bx,0xb911 ; 0000E328 BB11B9 '...'
mov cx,0x18 ; 0000E32B B91800 '...'
call xc745 ; 0000E32E E814E4 '...'
or byte [0x12],0xff ; 0000E331 800E1200FF '.....'
xe336: in al,0x60 ; 0000E336 E460 '.`'
mov al,0xc0 ; 0000E338 B0C0 '..'
out 0x64,al ; 0000E33A E664 '.d'
mov cx,0xffff ; 0000E33C B9FFFF '...'
xe33f: call x919a ; 0000E33F E858AE '.X.'
in al,0x64 ; 0000E342 E464 '.d'
test al,0x2 ; 0000E344 A802 '..'
jz xe34f ; 0000E346 7407 't.'
loop xe33f ; 0000E348 E2F5 '..'
jmp short xe373 ; 0000E34A EB27 '.',0x27
mov cx,0xffff ; 0000E34C B9FFFF '...'
xe34f: call x919a ; 0000E34F E848AE '.H.'
in al,0x64 ; 0000E352 E464 '.d'
test al,0x1 ; 0000E354 A801 '..'
jnz xe35c ; 0000E356 7504 'u.'
loop xe34f ; 0000E358 E2F5 '..'
jmp short xe373 ; 0000E35A EB17 '..'
xe35c: in al,0x60 ; 0000E35C E460 '.`'
test al,0x80 ; 0000E35E A880 '..'
jnz xe373 ; 0000E360 7511 'u.'
mov dx,0x2000 ; 0000E362 BA0020 '.. '
mov bx,0xb95b ; 0000E365 BB5BB9 '.[.'
mov cx,0x55 ; 0000E368 B95500 '.U.'
call xc745 ; 0000E36B E8D7E3 '...'
or byte [0x12],0xff ; 0000E36E 800E1200FF '.....'
xe373: xor bp,bp ; 0000E373 33ED '3.'
call xd03e ; 0000E375 E8C6EC '...'
jc xe37b ; 0000E378 7201 'r.'
xchg ax,bp ; 0000E37A 95 '.'
xe37b: call xe3ab ; 0000E37B E82D00 '.-.'
xor ax,ax ; 0000E37E 33C0 '3.'
or al,[0x12] ; 0000E380 0A061200 0x0A,'...'
jz xe389 ; 0000E384 7403 't.'
call xe38f ; 0000E386 E80600 '...'
xe389: mov byte [0x12],0x0 ; 0000E389 C606120000 '.....'
ret ; 0000E38E C3 '.'
xe38f: pusha ; 0000E38F 60 '`'
mov dx,0x0 ; 0000E390 BA0000 '...'
mov bx,0xb943 ; 0000E393 BB43B9 '.C.'
mov cx,0x18 ; 0000E396 B91800 '...'
call xc745 ; 0000E399 E8A9E3 '...'
xchg ax,bp ; 0000E39C 95 '.'
cmp al,0x5 ; 0000E39D 3C05 '<.'
jz xe3a4 ; 0000E39F 7403 't.'
call xe3ef ; 0000E3A1 E84B00 '.K.'
xe3a4: mov byte [0x12],0x0 ; 0000E3A4 C606120000 '.....'
popa ; 0000E3A9 61 'a'
ret ; 0000E3AA C3 '.'
xe3ab: cli ; 0000E3AB FA '.'
in al,0x21 ; 0000E3AC E421 '.!'
and al,0xfd ; 0000E3AE 24FD '$.'
out 0x21,al ; 0000E3B0 E621 '.!'
push es ; 0000E3B2 06 '.'
xor ax,ax ; 0000E3B3 33C0 '3.'
mov es,ax ; 0000E3B5 8EC0 '..'
mov bx,[es:0x24] ; 0000E3B7 268B1E2400 '&..$.'
mov word [es:0x24],0xe3e6 ; 0000E3BC 26C7062400E6E3 '&..$...'
sti ; 0000E3C3 FB '.'
push bx ; 0000E3C4 53 'S'
call xc62f ; 0000E3C5 E867E2 '.g.'
pop bx ; 0000E3C8 5B '['
mov [es:0x24],bx ; 0000E3C9 26891E2400 '&..$.'
pop es ; 0000E3CE 07 '.'
mov al,0x60 ; 0000E3CF B060 '.`'
out 0x64,al ; 0000E3D1 E664 '.d'
mov cx,0xffff ; 0000E3D3 B9FFFF '...'
xe3d6: call x919a ; 0000E3D6 E8C1AD '...'
in al,0x64 ; 0000E3D9 E464 '.d'
test al,0x2 ; 0000E3DB A802 '..'
jz xe3e1 ; 0000E3DD 7402 't.'
loop xe3d6 ; 0000E3DF E2F5 '..'
xe3e1: mov al,0x45 ; 0000E3E1 B045 '.E'
out 0x60,al ; 0000E3E3 E660 '.`'
ret ; 0000E3E5 C3 '.'
push ax ; 0000E3E6 50 'P'
in al,0x60 ; 0000E3E7 E460 '.`'
mov al,0x20 ; 0000E3E9 B020 '. '
out 0x20,al ; 0000E3EB E620 '. '
pop ax ; 0000E3ED 58 'X'
iret ; 0000E3EE CF '.'
xe3ef: mov ah,0x0 ; 0000E3EF B400 '..'
int 0x16 ; 0000E3F1 CD16 '..'
cmp ah,0x3b ; 0000E3F3 80FC3B '..;'
jnz xe3ef ; 0000E3F6 75F7 'u.'
ret ; 0000E3F8 C3 '.'
times 7 db 0xFF ; 0000E3F9 - 0000E3FF
db 0xFF,0x32,0x01,0x04,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x01,0x11 ; 0000E400
db 0x00,0x67,0x02,0x04,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x02,0x11 ; 0000E410
db 0x00,0x67,0x02,0x06,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x02,0x11 ; 0000E420
db 0x00,0x00,0x04,0x08,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0xFF,0x03,0x11 ; 0000E430
db 0x00,0xAC,0x03,0x06,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0xAB,0x03,0x11 ; 0000E440
db 0x00,0xB9,0x02,0x05,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0xB8,0x02,0x11 ; 0000E450
db 0x00,0xCE,0x01,0x08,0x00,0x00,0x00,0x01,0x09,0x00,0x00,0x00,0x00,0xFF,0x01,0x11 ; 0000E460
db 0x00,0x9D,0x03,0x05,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x9C,0x03,0x11 ; 0000E470
db 0x00,0x84,0x03,0x0F,0x00,0x00,0xFF,0xFF,0x00,0x08,0x00,0x00,0x00,0x83,0x03,0x11 ; 0000E480
db 0x00,0xD4,0x03,0x05,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xD4,0x03,0x11 ; 0000E490
db 0x00,0x9D,0x03,0x07,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x9C,0x03,0x11 ; 0000E4A0
db 0x00,0x9D,0x03,0x09,0x00,0x00,0x80,0x00,0x00,0x08,0x00,0x00,0x00,0x9C,0x03,0x11 ; 0000E4B0
db 0x00,0x64,0x02,0x08,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x63,0x02,0x11 ; 0000E4C0
db 0x00,0xD4,0x03,0x04,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0xD4,0x03,0x11 ; 0000E4D0
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0000E4E0
db 0x00,0x64,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x02,0x11 ; 0000E4F0
db 0x00,0xD4,0x03,0x05,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0xD4,0x03,0x11 ; 0000E500
db 0x00,0xC6,0x03,0x05,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0xC6,0x03,0x11 ; 0000E510
db 0x00,0xF2,0x02,0x0B,0x00,0x00,0xFF,0xFF,0x00,0x08,0x00,0x00,0x00,0xF1,0x02,0x11 ; 0000E520
db 0x00,0xDD,0x02,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0xDC,0x02,0x11 ; 0000E530
db 0x00,0xDD,0x02,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0xDC,0x02,0x11 ; 0000E540
db 0x00,0x25,0x03,0x06,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x25,0x03,0x11 ; 0000E550
db 0x00,0x9C,0x03,0x08,0x00,0x00,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x9C,0x03,0x11 ; 0000E560
db 0x00,0xC6,0x03,0x0E,0x00,0x00,0xFF,0xFF,0x07,0x08,0x00,0x00,0x00,0xC6,0x03,0x11 ; 0000E570
db 0x00,0xC6,0x03,0x10,0x00,0x00,0xFF,0xFF,0x07,0x08,0x00,0x00,0x00,0xC6,0x03,0x11 ; 0000E580
db 0x00,0xFF,0x03,0x0E,0x00,0x00,0xFF,0xFF,0x07,0x08,0x00,0x00,0x00,0xFF,0x03,0x11 ; 0000E590
db 0x00,0xC6,0x03,0x0A,0x00,0x00,0xFF,0xFF,0x07,0x08,0x00,0x00,0x00,0xC6,0x03,0x11 ; 0000E5A0
db 0x00,0xEC,0x02,0x10,0x00,0x00,0xFF,0xFF,0x07,0x08,0x00,0x00,0x00,0xEC,0x02,0x11 ; 0000E5B0
db 0x00,0x25,0x03,0x06,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x25,0x03,0x1A ; 0000E5C0
db 0x00,0x67,0x02,0x04,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x02,0x19 ; 0000E5D0
db 0x00,0x67,0x02,0x08,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x02,0x19 ; 0000E5E0
db 0x00,0x89,0x03,0x09,0x00,0x00,0x80,0x00,0x07,0x08,0x00,0x00,0x00,0x89,0x03,0x19 ; 0000E5F0
db 0x00,0xEC,0x02,0x08,0x00,0x00,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0xEC,0x02,0x22 ; 0000E600
db 0x00,0xC6,0x03,0x07,0x00,0x00,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0xC6,0x03,0x22 ; 0000E610
db 0x00,0xC6,0x03,0x08,0x00,0x00,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0xC6,0x03,0x22 ; 0000E620
db 0x00,0xC6,0x03,0x09,0x00,0x00,0xFF,0xFF,0x07,0x08,0x00,0x00,0x00,0xC6,0x03,0x22 ; 0000E630
db 0x00,0xC6,0x03,0x05,0x00,0x00,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0xC6,0x03,0x22 ; 0000E640
db 0x00,0x63,0x02,0x10,0x00,0x00,0xFF,0xFF,0x07,0x08,0x00,0x00,0x00,0x63,0x02,0x3F ; 0000E650
db 0x00,0xFF,0x03,0x0B,0x00,0x00,0xFF,0xFF,0x07,0x08,0x00,0x00,0x00,0xFF,0x03,0x21 ; 0000E660
db 0x00,0xFF,0x03,0x0F,0x00,0x00,0xFF,0xFF,0x07,0x08,0x00,0x00,0x00,0xFF,0x03,0x22 ; 0000E670
db 0x00,0xFF,0x03,0x0F,0x00,0x00,0xFF,0xFF,0x07,0x08,0x00,0x00,0x00,0xFF,0x03,0x21 ; 0000E680
db 0x00,0xFF,0x03,0x10,0x00,0x00,0xFF,0xFF,0x07,0x08,0x00,0x00,0x00,0xFF,0x03,0x3F ; 0000E690
db 0x00,0x25,0x03,0x04,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x25,0x03,0x1A ; 0000E6A0
db 0x00,0x25,0x03,0x02,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x25,0x03,0x1A ; 0000E6B0
db 0x00,0xEC,0x02,0x08,0x00,0x00,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0xEC,0x02,0x21 ; 0000E6C0
db 0x00,0xEC,0x02,0x06,0x00,0x00,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0xEC,0x02,0x21 ; 0000E6D0
db 0x00,0xC6,0x03,0x05,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0xC6,0x03,0x19 ; 0000E6E0
db 0x00,0xFF,0xEB,0x0B,0x90,0x08,0x00,0xFC,0x01,0x00,0x70,0x00,0x00,0x00,0x00,0x83 ; 0000E6F0
db 0xC4,0x06 ; 0000E700
;
; Start of warm boot code: read first sector from boot drive
;
sti ; 0000E702 FB '.'
cld ; 0000E703 FC '.'
mov al,0xf ; 0000E704 B00F '..'
out 0x84,al ; 0000E706 E684 '..'
mov al,0x0 ; 0000E708 B000 '..'
out 0x85,al ; 0000E70A E685 '..'
mov dx,0xefc7 ; 0000E70C BAC7EF '...'
call xd6cd ; 0000E70F E8BBEF '...'
mov ds,dx ; 0000E712 8EDA '..'
xe714: mov al,0xb9 ; 0000E714 B0B9 '..'
out 0x84,al ; 0000E716 E684 '..'
mov cx,0x3 ; 0000E718 B90300 '...'
xe71b: push cx ; 0000E71B 51 'Q'
;
; Reset the disk controller
;
mov ah,0x0 ; 0000E71C B400 '..'
int 0x13 ; 0000E71E CD13 '..'
;
; Read the boot sector
;
mov bx,0x7c00 ; 0000E720 BB007C '..|'
mov cx,0x1 ; 0000E723 B90100 '...'
mov ax,0x201 ; 0000E726 B80102 '...'
int 0x13 ; 0000E729 CD13 '..'
pop cx ; 0000E72B 59 'Y'
jnc xe770 ; 0000E72C 7342 'sB'
jc xe73c ; 0000E72E 720C 'r.'
times 9 db 0xFF ; 0000E730 - 0000E738
jmp xc5c0 ; 0000E739 E984DE (NOTE: This JMP doesn't appear reachable)
xe73c: loop xe71b ; 0000E73C E2DD '..'
mov al,0xbb ; 0000E73E B0BB '..'
out 0x84,al ; 0000E740 E684 '..'
cmp dl,0x80 ; 0000E742 80FA80 '...'
jz xe76e ; 0000E745 7427 't',0x27
mov al,0xe ; 0000E747 B00E '..'
call xb544 ; 0000E749 E8F8CD '...'
test al,0x40 ; 0000E74C A840 '.@'
jnz xe76e ; 0000E74E 751E 'u.'
mov dx,ds ; 0000E750 8CDA '..'
mov bx,0x40 ; 0000E752 BB4000 '.@.'
mov ds,bx ; 0000E755 8EDB '..'
mov ch,[0x75] ; 0000E757 8A2E7500 '..u.'
mov ds,dx ; 0000E75B 8EDA '..'
or ch,ch ; 0000E75D 0AED 0x0A,'.'
jz xe76e ; 0000E75F 740D 't',0x0D
test al,0x8 ; 0000E761 A808 '..'
jnz xe76e ; 0000E763 7509 'u.'
mov al,0xba ; 0000E765 B0BA '..'
out 0x84,al ; 0000E767 E684 '..'
mov dx,0x80 ; 0000E769 BA8000 '...'
jmp short xe714 ; 0000E76C EBA6 '..'
;
; On warm boot failure, pass control to the traditional ROM BASIC entry point
;
xe76e: int 0x18 ; 0000E76E CD18 '..'
;
; Boot sector successfully read
;
xe770: test dl,0x80 ; 0000E770 F6C280 '...'
jnz xe793 ; 0000E773 751E 'u.'
;
; More diskette I/O (TODO: Investigate)
;
push bx ; 0000E775 53 'S'
call xd540 ; 0000E776 E8C7ED '...'
pop bx ; 0000E779 5B '['
;
; Check the ROM status byte for 0xBD (values I've seen: 0xB9)
;
in al,0x84 ; 0000E77A E484 '..'
cmp al,0xbd ; 0000E77C 3CBD '<.'
jz xe714 ; 0000E77E 7494 't.'
;
; This code looks broken: ES:BX points to the boot sector just loaded
; (0x0000:0x7C00), and apparently the ROM wants to scan the first 9 words
; of the boot sector, to see if they all match the 1st word; if they do,
; then it's likely the boot sector is invalid (hence the "boot_error"
; message). However, it's loading AX with the 1st word from DS:BX
; (0x0040:0x7C00) rather than ES:BX, which aside from being the wrong word,
; also increases the likelihood that this code will always see a difference
; and never trigger the error.
;
; The value in AX is typically 0x0000.
;
mov ax,[bx] ; 0000E780 8B07 '..'
mov cx,0x9 ; 0000E782 B90900 '...'
mov di,bx ; 0000E785 8BFB '..'
repe scasw ; 0000E787 F3AF '..'
jnz xe7a9 ; 0000E789 751E 'u.'
mov si,boot_error ; 0000E78B BE5D93 '.].'
call print_str$ ; 0000E78E E83F00 '.?.'
xe791: jmp short xe791 ; 0000E791 Hang the machine
;
; Hard disk sector validation (as opposed to the preceding floppy disk sector validation)
;
xe793: mov al,0x33 ; 0000E793 B033 '.3'
mov ah,al ; 0000E795 8AE0 '..'
call xb544 ; 0000E797 E8AACD '...'
and al,0xfb ; 0000E79A 24FB '$.'
xchg al,ah ; 0000E79C 86C4 '..'
call xb549 ; 0000E79E E8A8CD '...'
;
; Verify the hard disk boot sector signature (0xAA55)
;
cmp word [bx+0x1fe],0xaa55 ; 0000E7A1 81BFFE0155AA '....U.'
jnz xe76e ; 0000E7A7 75C5 'u.'
xe7a9: in al,0x86 ; 0000E7A9 E486 '..'
test al,0x80 ; 0000E7AB A880 '..'
jnz xe7b7 ; 0000E7AD 7508 'u.'
test al,0x40 ; 0000E7AF A840 '.@'
jnz xe7b7 ; 0000E7B1 7504 'u.'
mov al,0x92 ; 0000E7B3 B092 '..'
out 0x4b,al ; 0000E7B5 E64B '.K'
xe7b7: mov al,0xbc ; 0000E7B7 B0BC '..'
out 0x84,al ; 0000E7B9 E684 '..'
;
; Jump to the start of the boot sector
;
jmp 0x0:0x7c00 ; 0000E7BB EA007C0000 '..|..'
xe7c0: add sp,byte +0x6 ; 0000E7C0 83C406 '...'
sti ; 0000E7C3 FB '.'
mov si,boot_prompt ; 0000E7C4 BE1493 '...'
call print_str$ ; 0000E7C7 E80600 '...'
mov ah,0x0 ; 0000E7CA B400 '..'
int 0x16 ; 0000E7CC CD16 '..'
int 0x19 ; 0000E7CE CD19 '..'
;
; print_str$(CS:SI -> $-terminated string)
;
print_str$:
cld ; 0000E7D0 FC '.'
xe7d1: cs lodsb ; 0000E7D1 2EAC '..'
cmp al,0x24 ; 0000E7D3 3C24 '<$'
jz xe7dc ; 0000E7D5 7405 't.'
call print_char ; 0000E7D7 E8F9DF '...'
jmp short xe7d1 ; 0000E7DA EBF5 '..'
xe7dc: ret ; 0000E7DC C3 '.'
sub al,0x2d ; 0000E7DD 2C2D ',-' (NOTE: This instruction doesn't appear reachable)
xe7df: mov si,bim_table_offset ; 0000E7DF BEE0FF '...'
mov si,[cs:si] ; 0000E7E2 2E8B34 '..4'
mov ax,[cs:si] ; 0000E7E5 2E8B04 '...'
test ax,0xf00 ; 0000E7E8 A9000F '...'
jz xe7f0 ; 0000E7EB 7403 't.'
jmp short xe80a ; 0000E7ED EB1B '..'
nop ; 0000E7EF 90 '.'
xe7f0: and ah,0xc0 ; 0000E7F0 80E4C0 '...'
cmp ah,0x40 ; 0000E7F3 80FC40 '..@'
jz xe80a ; 0000E7F6 7412 't.'
call xf305 ; 0000E7F8 E80A0B '.',0x0A,'.'
mov byte [cs:0x67dd],0x22 ; 0000E7FB 2EC606DD6722 '....g"'
mov byte [cs:0x67de],0x24 ; 0000E801 2EC606DE6724 '....g$'
call xf30a ; 0000E807 E8000B '...'
xe80a: ret ; 0000E80A C3 '.'
;
; Compare DS:BX to ES:DI; return carry CLEAR if success, SET if failure
;
xe80b: mov si,bx ; 0000E80B 8BF3 '..'
mov cx,0x21 ; 0000E80D B92100 '.!.'
repe cmpsd ; 0000E810 66F3A7 'f..'
jnz xe821 ; 0000E813 750C 'u.'
dec dx ; 0000E815 4A 'J'
jnz xe80b ; 0000E816 75F3 'u.'
mov si,bx ; 0000E818 8BF3 '..'
mov cx,ax ; 0000E81A 8BC8 '..'
repe cmpsd ; 0000E81C 66F3A7 'f..'
jz xe828 ; 0000E81F 7407 't.'
xe821: sub di,byte +0x4 ; 0000E821 83EF04 '...'
sub si,byte +0x4 ; 0000E824 83EE04 '...'
stc ; 0000E827 F9 '.'
xe828: jmp bp ; 0000E828 FFE5 '..'
times 4 db 0xFF ; 0000E82A - 0000E82D
xe82e: sti ; 0000E82E FB '.'
cld ; 0000E82F FC '.'
push ds ; 0000E830 1E '.'
push si ; 0000E831 56 'V'
push bp ; 0000E832 55 'U'
mov bp,sp ; 0000E833 8BEC '..'
mov si,0x40 ; 0000E835 BE4000 '.@.'
mov ds,si ; 0000E838 8EDE '..'
test ah,ah ; 0000E83A 84E4 '..'
jnz xe849 ; 0000E83C 750B 'u.'
xe83e: call xdc96 ; 0000E83E E855F4 '.U.'
call xdccb ; 0000E841 E887F4 '...'
jz xe83e ; 0000E844 74F8 't.'
jmp xe8fc ; 0000E846 E9B300 '...'
xe849: dec ah ; 0000E849 FECC '..'
jnz xe876 ; 0000E84B 7529 'u)'
or word [bp+0xa],0x240 ; 0000E84D 814E0A4002 '.N',0x0A,'@.'
and word [bp+0xa],0xfffe ; 0000E852 81660AFEFF '.f',0x0A,'..'
xe857: call xdcbe ; 0000E857 E864F4 '.d.'
jnz xe85f ; 0000E85A 7503 'u.'
jmp xe8fc ; 0000E85C E99D00 '...'
xe85f: call xdccb ; 0000E85F E869F4 '.i.'
jnz xe869 ; 0000E862 7505 'u.'
call xdc96 ; 0000E864 E82FF4 './.'
jmp short xe857 ; 0000E867 EBEE '..'
xe869: and word [bp+0xa],0xffbf ; 0000E869 81660ABFFF '.f',0x0A,'..'
or word [bp+0xa],0x1 ; 0000E86E 814E0A0100 '.N',0x0A,'..'
jmp xe8fc ; 0000E873 E98600 '...'
xe876: dec ah ; 0000E876 FECC '..'
jnz xe87f ; 0000E878 7505 'u.'
call xdcc7 ; 0000E87A E84AF4 '.J.'
jmp short xe8fc ; 0000E87D EB7D '.}'
xe87f: dec ah ; 0000E87F FECC '..'
jnz xe888 ; 0000E881 7505 'u.'
call xdd28 ; 0000E883 E8A2F4 '...'
jmp short xe8fc ; 0000E886 EB74 '.t'
xe888: dec ah ; 0000E888 FECC '..'
jnz xe88e ; 0000E88A 7502 'u.'
jmp short xe8fc ; 0000E88C EB6E '.n'
xe88e: dec ah ; 0000E88E FECC '..'
jnz xe897 ; 0000E890 7505 'u.'
call xdd88 ; 0000E892 E8F3F4 '...'
jmp short xe8fc ; 0000E895 EB65 '.e'
xe897: cmp ah,0xb ; 0000E897 80FC0B '...'
jnz xe8a4 ; 0000E89A 7508 'u.'
call xdc96 ; 0000E89C E8F7F3 '...'
call xdcfd ; 0000E89F E85BF4 '.[.'
jmp short xe8fc ; 0000E8A2 EB58 '.X'
xe8a4: cmp ah,0xc ; 0000E8A4 80FC0C '...'
jnz xe8c7 ; 0000E8A7 751E 'u.'
or word [bp+0xa],0x240 ; 0000E8A9 814E0A4002 '.N',0x0A,'@.'
and word [bp+0xa],0xfffe ; 0000E8AE 81660AFEFF '.f',0x0A,'..'
call xdcbe ; 0000E8B3 E808F4 '...'
jz xe8fc ; 0000E8B6 7444 'tD'
call xdcfd ; 0000E8B8 E842F4 '.B.'
and word [bp+0xa],0xffbf ; 0000E8BB 81660ABFFF '.f',0x0A,'..'
or word [bp+0xa],0x1 ; 0000E8C0 814E0A0100 '.N',0x0A,'..'
jmp short xe8fc ; 0000E8C5 EB35 '.5'
xe8c7: cmp ah,0xd ; 0000E8C7 80FC0D '..',0x0D
jnz xe8d1 ; 0000E8CA 7505 'u.'
call xdd09 ; 0000E8CC E83AF4 '.:.'
jmp short xe8fc ; 0000E8CF EB2B '.+'
xe8d1: cmp ah,0xeb ; 0000E8D1 80FCEB '...'
jnz xe8db ; 0000E8D4 7505 'u.'
call xddaf ; 0000E8D6 E8D6F4 '...'
jmp short xe8fc ; 0000E8D9 EB21 '.!'
xe8db: cmp ah,0xec ; 0000E8DB 80FCEC '...'
jnz xe8e5 ; 0000E8DE 7505 'u.'
call xde51 ; 0000E8E0 E86EF5 '.n.'
jmp short xe8fc ; 0000E8E3 EB17 '..'
xe8e5: cmp ah,0xed ; 0000E8E5 80FCED '...'
jnz xe8ef ; 0000E8E8 7505 'u.'
call xde91 ; 0000E8EA E8A4F5 '...'
jmp short xe8fc ; 0000E8ED EB0D '.',0x0D
xe8ef: cmp ah,0xef ; 0000E8EF 80FCEF '...'
jnz xe8f9 ; 0000E8F2 7505 'u.'
call xdea5 ; 0000E8F4 E8AEF5 '...'
jmp short xe8fc ; 0000E8F7 EB03 '..'
xe8f9: sub ah,0xd ; 0000E8F9 80EC0D '..',0x0D
xe8fc: pop bp ; 0000E8FC 5D ']'
pop si ; 0000E8FD 5E '^'
pop ds ; 0000E8FE 1F '.'
iret ; 0000E8FF CF '.'
xe900: push ds ; 0000E900 1E '.'
push ax ; 0000E901 50 'P'
mov ax,0x40 ; 0000E902 B84000 '.@.'
mov ds,ax ; 0000E905 8ED8 '..'
mov ax,0xff0b ; 0000E907 B80BFF '...'
out 0xa0,al ; 0000E90A E6A0 '..'
in al,0xa0 ; 0000E90C E4A0 '..'
test al,al ; 0000E90E 84C0 '..'
jz xe91e ; 0000E910 740C 't.'
mov ah,al ; 0000E912 8AE0 '..'
in al,0xa1 ; 0000E914 E4A1 '..'
or al,ah ; 0000E916 0AC4 0x0A,'.'
out 0xa1,al ; 0000E918 E6A1 '..'
out 0xa0,al ; 0000E91A E6A0 '..'
jmp short xe934 ; 0000E91C EB16 '..'
xe91e: mov al,0xb ; 0000E91E B00B '..'
out 0x20,al ; 0000E920 E620 '. '
in al,0x20 ; 0000E922 E420 '. '
test al,al ; 0000E924 84C0 '..'
jz xe934 ; 0000E926 740C 't.'
mov ah,al ; 0000E928 8AE0 '..'
test al,0x4 ; 0000E92A A804 '..'
jnz xe934 ; 0000E92C 7506 'u.'
in al,0x21 ; 0000E92E E421 '.!'
or al,ah ; 0000E930 0AC4 0x0A,'.'
out 0x21,al ; 0000E932 E621 '.!'
xe934: cmp ah,0xff ; 0000E934 80FCFF '...'
jz xe93d ; 0000E937 7404 't.'
mov al,0x20 ; 0000E939 B020 '. '
out 0x20,al ; 0000E93B E620 '. '
xe93d: mov [0x6b],ah ; 0000E93D 88266B00 '.&k.'
pop ax ; 0000E941 58 'X'
pop ds ; 0000E942 1F '.'
iret ; 0000E943 CF '.'
xe944: push cx ; 0000E944 51 'Q'
mov cx,0x78 ; 0000E945 B97800 '.x.'
mov dx,0x3f4 ; 0000E948 BAF403 '...'
xe94b: call x919a ; 0000E94B E84CA8 '.L.'
in al,dx ; 0000E94E EC '.'
test al,0x80 ; 0000E94F A880 '..'
jnz xe959 ; 0000E951 7506 'u.'
loop xe94b ; 0000E953 E2F6 '..'
stc ; 0000E955 F9 '.'
jmp short xe960 ; 0000E956 EB08 '..'
nop ; 0000E958 90 '.'
xe959: call x919a ; 0000E959 E83EA8 '.>.'
in al,dx ; 0000E95C EC '.'
inc dx ; 0000E95D 42 'B'
test al,0x40 ; 0000E95E A840 '.@'
xe960: pop cx ; 0000E960 59 'Y'
ret ; 0000E961 C3 '.'
db 0xFF ; 0000E962 FF '.'
db 0xFF ; 0000E963 FF '.'
xe964: call xbfc3 ; 0000E964 E85CD6 '.\.'
jc xe97b ; 0000E967 7212 'r.'
call xbe10 ; 0000E969 E8A4D4 '...'
jc xe97b ; 0000E96C 720D 'r',0x0D
call xc129 ; 0000E96E E8B8D7 '...'
jc xe97b ; 0000E971 7208 'r.'
call xc188 ; 0000E973 E812D8 '...'
jc xe97b ; 0000E976 7203 'r.'
call xd215 ; 0000E978 E89AE8
xe97b: ret ; 0000E97B C3 '.'
xe97c: call xec2e_wait_8042_ready ; 0000E97C E8AF02 '...'
mov al,0xad ; 0000E97F B0AD '..'
out 0x64,al ; 0000E981 E664 '.d'
call xec2e_wait_8042_ready ; 0000E983 E8A802 '...'
ret ; 0000E986 C3 '.'
cld ; 0000E987 FC '.'
pusha ; 0000E988 60 '`'
push ds ; 0000E989 1E '.'
push es ; 0000E98A 06 '.'
mov bx,0x40 ; 0000E98B BB4000 '.@.'
mov ds,bx ; 0000E98E 8EDB '..'
test byte [0x96],0x80 ; 0000E990 F606960080 '.....'
jz xe9b2 ; 0000E995 741B 't.'
in al,0x60 ; 0000E997 E460 '.`'
cmp al,0xab ; 0000E999 3CAB '<.'
jnz xe9a7 ; 0000E99B 750A
or byte [0x96],0x40 ; 0000E99D 800E960040 '....@'
and byte [0x96],0x7f ; 0000E9A2 802696007F '.&...'
xe9a7: mov al,0x20 ; 0000E9A7 B020 '. '
out 0x20,al ; 0000E9A9 E620 '. '
sti ; 0000E9AB FB '.'
mov bp,0xffff ; 0000E9AC BDFFFF '...'
jmp xeadf ; 0000E9AF E92D01 '.-.'
xe9b2: test byte [0x96],0x40 ; 0000E9B2 F606960040 '....@'
jz xe9fa ; 0000E9B7 7441 'tA'
in al,0x60 ; 0000E9B9 E460 '.`'
cmp al,0x41 ; 0000E9BB 3C41 '<A'
jnz xe9a7 ; 0000E9BD 75E8
and byte [0x96],0xbf ; 0000E9BF 80269600BF '.&...'
or byte [0x96],0x10 ; 0000E9C4 800E960010 '.....'
or byte [0x17],0x20 ; 0000E9C9 800E170020 '.... '
push ax ; 0000E9CE 50 'P'
mov al,0xe ; 0000E9CF B00E '..'
call xb544 ; 0000E9D1 E870CB '.p.'
test al,0x40 ; 0000E9D4 A840 '.@'
jnz xe9e6 ; 0000E9D6 750E 'u.'
mov al,0x2c ; 0000E9D8 B02C '.,'
call xb544 ; 0000E9DA E867CB '.g.'
test al,0x40 ; 0000E9DD A840 '.@'
jnz xe9e6 ; 0000E9DF 7505 'u.'
and byte [0x17],0xdf ; 0000E9E1 80261700DF '.&...'
xe9e6: pop ax ; 0000E9E6 58 'X'
mov al,0x20 ; 0000E9E7 B020 '. '
out 0x20,al ; 0000E9E9 E620 '. '
sti ; 0000E9EB FB '.'
call xeba5 ; 0000E9EC E8B601 '...'
and byte [0x96],0xdf ; 0000E9EF 80269600DF '.&...'
mov bp,0xffff ; 0000E9F4 BDFFFF '...'
jmp xeadf ; 0000E9F7 E9E500 '...'
xe9fa: mov di,0x17 ; 0000E9FA BF1700 '...'
call xe97c ; 0000E9FD E87CFF '.|.'
mov bl,al ; 0000EA00 8AD8 '..'
in al,0x60 ; 0000EA02 E460 '.`'
stc ; 0000EA04 F9 '.'
mov ah,0x4f ; 0000EA05 B44F '.O'
int 0x15 ; 0000EA07 CD15 '..'
mov bp,0x0 ; 0000EA09 BD0000 '...'
jc xea16 ; 0000EA0C 7208 'r.'
mov al,0x20 ; 0000EA0E B020 '. '
out 0x20,al ; 0000EA10 E620 '. '
sti ; 0000EA12 FB '.'
jmp xeadf ; 0000EA13 E9C900 '...'
xea16: mov ah,al ; 0000EA16 8AE0 '..'
push ax ; 0000EA18 50 'P'
cmp al,0x46 ; 0000EA19 3C46 '<F'
jnz xea32 ; 0000EA1B 7515
test byte [0x18],0x8 ; 0000EA1D F606180008 '.....'
jnz xea32 ; 0000EA22 750E
call xc0e9 ; 0000EA24 E8C2D6 '...'
jnc xea32 ; 0000EA27 7309
cli ; 0000EA29 FA '.'
mov al,0x20 ; 0000EA2A B020 '. '
out 0x20,al ; 0000EA2C E620 '. '
sti ; 0000EA2E FB '.'
jmp xead4 ; 0000EA2F E9A200 '...'
xea32: mov al,0x20 ; 0000EA32 B020 '. '
out 0x20,al ; 0000EA34 E620 '. '
sti ; 0000EA36 FB '.'
cmp ah,0xe0 ; 0000EA37 80FCE0 '...'
jnz xea43 ; 0000EA3A 7507 'u.'
or byte [0x96],0x2 ; 0000EA3C 800E960002 '.....'
jmp short xea5e ; 0000EA41 EB1B '..'
xea43: cmp ah,0xe1 ; 0000EA43 80FCE1 '...'
jnz xea4f ; 0000EA46 7507 'u.'
or byte [0x96],0x1 ; 0000EA48 800E960001 '.....'
jmp short xea5e ; 0000EA4D EB0F '..'
xea4f: cmp ah,0xfe ; 0000EA4F 80FCFE '...'
jz xea5e ; 0000EA52 740A 't',0x0A
cmp ah,0xfa ; 0000EA54 80FCFA '...'
jnz xea62 ; 0000EA57 7509 'u.'
or byte [0x97],0x10 ; 0000EA59 800E970010 '.....'
xea5e: pop ax ; 0000EA5E 58 'X'
jmp short xeadf ; 0000EA5F EB7E '.~'
nop ; 0000EA61 90 '.'
xea62: call xeb16 ; 0000EA62 E8B100 '...'
test byte [0x18],0x8 ; 0000EA65 F606180008 '.....'
jz xead1 ; 0000EA6A 7465 'te'
jmp short xea8a ; 0000EA6C EB1C '..'
times 19 db 0xFF ; 0000EA6E - 0000EA80
xea81: mov word [0x0072],0x1234 ; 0000EA81 C70672003412
jmp xe05b ; 0000EA87 E9D1F5
xea8a: cmp ah,0x54 ; 0000EA8A 80FC54 '..T'
jz xea94 ; 0000EA8D 7405 't.'
cmp ah,0xd4 ; 0000EA8F 80FCD4 '...'
jnz xea9b ; 0000EA92 7507 'u.'
xea94: test byte [0x17],0x8 ; 0000EA94 F606170008 '.....'
jnz xead1 ; 0000EA99 7536 'u6'
xea9b: cmp ah,0x46 ; 0000EA9B 80FC46 '..F'
jz xeabc ; 0000EA9E 741C 't.'
cmp ah,0x45 ; 0000EAA0 80FC45 '..E'
jnz xeaac ; 0000EAA3 7507 'u.'
test byte [0x96],0x1 ; 0000EAA5 F606960001 '.....'
jnz xead4 ; 0000EAAA 7528 'u('
xeaac: call xbe10 ; 0000EAAC E861D3 '.a.'
jc xead4 ; 0000EAAF 7223 'r#'
cmp ah,0x52 ; 0000EAB1 80FC52 '..R'
jz xead4 ; 0000EAB4 741E 't.'
test ah,ah ; 0000EAB6 84E4 '..'
js xead4 ; 0000EAB8 781A 'x.'
jmp short xeaca ; 0000EABA EB0E '..'
xeabc: test byte [0x17],0x8 ; 0000EABC F606170008 '.....'
jnz xead1 ; 0000EAC1 750E 'u.'
test byte [0x17],0x4 ; 0000EAC3 F606170004 '.....'
jz xead1 ; 0000EAC8 7407 't.'
xeaca: and byte [0x18],0xf7 ; 0000EACA 80261800F7 '.&...'
jmp short xead4 ; 0000EACF EB03 '..'
xead1: call xe964 ; 0000EAD1 E890FE '...'
xead4: pop ax ; 0000EAD4 58 'X'
mov [0x15],ah ; 0000EAD5 88261500 '.&..'
call xeaeb ; 0000EAD9 E80F00 '...'
call xeba5 ; 0000EADC E8C600 '...'
xeadf: test bp,bp ; 0000EADF 85ED '..'
pop es ; 0000EAE1 07 '.'
pop ds ; 0000EAE2 1F '.'
popa ; 0000EAE3 61 'a'
jnz xeaea ; 0000EAE4 7504 'u.'
cli ; 0000EAE6 FA '.'
call xeb0c ; 0000EAE7 E82200 '.".'
xeaea: iret ; 0000EAEA CF '.'
xeaeb: push ax ; 0000EAEB 50 'P'
and byte [0x96],0xfd ; 0000EAEC 80269600FD '.&...'
test byte [0x96],0x1 ; 0000EAF1 F606960001 '.....'
jz xeb0a ; 0000EAF6 7412 't.'
and ah,0x7f ; 0000EAF8 80E47F '...'
cmp ah,0x45 ; 0000EAFB 80FC45 '..E'
jz xeb05 ; 0000EAFE 7405 't.'
cmp ah,0x1d ; 0000EB00 80FC1D '...'
jz xeb0a ; 0000EB03 7405 't.'
xeb05: and byte [0x96],0xfe ; 0000EB05 80269600FE '.&...'
xeb0a: pop ax ; 0000EB0A 58 'X'
ret ; 0000EB0B C3 '.'
xeb0c: push ax ; 0000EB0C 50 'P'
call xec2e_wait_8042_ready ; 0000EB0D E81E01 '...'
mov al,0xae ; 0000EB10 B0AE '..'
out 0x64,al ; 0000EB12 E664 '.d'
pop ax ; 0000EB14 58 'X'
ret ; 0000EB15 C3 '.'
xeb16: mov al,[0x16] ; 0000EB16 A01600 '...'
call xc24c ; 0000EB19 E830D7 '.0.'
jz xeb35 ; 0000EB1C 7417 't.'
cmp ah,0x4e ; 0000EB1E 80FC4E '..N'
jnz xeb27 ; 0000EB21 7504 'u.'
inc al ; 0000EB23 FEC0 '..'
jmp short xeb2e ; 0000EB25 EB07 '..'
xeb27: cmp ah,0x4a ; 0000EB27 80FC4A '..J'
jnz xeb35 ; 0000EB2A 7509 'u.'
dec al ; 0000EB2C FEC8 '..'
xeb2e: js xeb58 ; 0000EB2E 7828 'x('
mov [0x16],al ; 0000EB30 A21600 '...'
jmp short xeb58 ; 0000EB33 EB23 '.#'
xeb35: cmp ah,[0x15] ; 0000EB35 3A261500 ':&..'
jz xeb7d ; 0000EB39 7442 'tB'
cmp ah,0x2a ; 0000EB3B 80FC2A '..*'
jz xeb45 ; 0000EB3E 7405 't.'
cmp ah,0x36 ; 0000EB40 80FC36 '..6'
jnz xeb4c ; 0000EB43 7507 'u.'
xeb45: test byte [0x96],0x2 ; 0000EB45 F606960002 '.....'
jnz xeb7d ; 0000EB4A 7531 'u1'
xeb4c: cmp ah,0x1d ; 0000EB4C 80FC1D '...'
jnz xeb58 ; 0000EB4F 7507 'u.'
test byte [0x96],0x1 ; 0000EB51 F606960001 '.....'
jnz xeb7d ; 0000EB56 7525 'u%'
xeb58: test ah,ah ; 0000EB58 84E4 '..'
js xeb7d ; 0000EB5A 7821 'x!'
xor bx,bx ; 0000EB5C 33DB '3.'
or bl,[0x16] ; 0000EB5E 0A1E1600 0x0A,'...'
jz xeb7d ; 0000EB62 7419 't.'
push ax ; 0000EB64 50 'P'
in al,0x61 ; 0000EB65 E461 '.a'
push ax ; 0000EB67 50 'P'
xeb68: and al,0xfc ; 0000EB68 24FC '$.'
out 0x61,al ; 0000EB6A E661 '.a'
call xeb7e ; 0000EB6C E80F00 '...'
or al,0x2 ; 0000EB6F 0C02 '..'
out 0x61,al ; 0000EB71 E661 '.a'
call xeb7e ; 0000EB73 E80800 '...'
dec bx ; 0000EB76 4B 'K'
jnz xeb68 ; 0000EB77 75EF 'u.'
pop ax ; 0000EB79 58 'X'
out 0x61,al ; 0000EB7A E661 '.a'
pop ax ; 0000EB7C 58 'X'
xeb7d: ret ; 0000EB7D C3 '.'
xeb7e: push ax ; 0000EB7E 50 'P'
push bx ; 0000EB7F 53 'S'
mov al,0x0 ; 0000EB80 B000 '..'
out 0x43,al ; 0000EB82 E643 '.C'
in al,0x40 ; 0000EB84 E440 '.@'
mov bl,al ; 0000EB86 8AD8 '..'
in al,0x40 ; 0000EB88 E440 '.@'
mov bh,al ; 0000EB8A 8AF8 '..'
xeb8c: mov al,0x0 ; 0000EB8C B000 '..'
out 0x43,al ; 0000EB8E E643 '.C'
in al,0x40 ; 0000EB90 E440 '.@'
mov ah,al ; 0000EB92 8AE0 '..'
in al,0x40 ; 0000EB94 E440 '.@'
xchg ah,al ; 0000EB96 86E0 '..'
push bx ; 0000EB98 53 'S'
sub bx,ax ; 0000EB99 2BD8 '+.'
cmp bx,0x11d ; 0000EB9B 81FB1D01 '....'
pop bx ; 0000EB9F 5B '['
jna xeb8c ; 0000EBA0 76EA 'v.'
pop bx ; 0000EBA2 5B '['
pop ax ; 0000EBA3 58 'X'
ret ; 0000EBA4 C3 '.'
xeba5: push ax ; 0000EBA5 50 'P'
mov al,[0x17] ; 0000EBA6 A01700 '...'
shr al,0x4 ; 0000EBA9 C0E804 '...'
and al,0x7 ; 0000EBAC 2407 '$.'
mov ah,[0x97] ; 0000EBAE 8A269700 '.&..'
and ah,0x7 ; 0000EBB2 80E407 '...'
cmp al,ah ; 0000EBB5 3AC4 ':.'
jz xebc5 ; 0000EBB7 740C 't.'
and byte [0x97],0xf8 ; 0000EBB9 80269700F8 '.&...'
or [0x97],al ; 0000EBBE 08069700 '....'
call xebc7 ; 0000EBC2 E80200 '...'
xebc5: pop ax ; 0000EBC5 58 'X'
ret ; 0000EBC6 C3 '.'
xebc7: push ax ; 0000EBC7 50 'P'
push cx ; 0000EBC8 51 'Q'
call xec1e ; 0000EBC9 E85200 '.R.'
jnz xec1b ; 0000EBCC 754D 'uM'
and byte [0x97],0xef ; 0000EBCE 80269700EF '.&...'
call xec2e_wait_8042_ready ; 0000EBD3 E85800 '.X.'
mov al,0xed ; 0000EBD6 B0ED '..'
out 0x60,al ; 0000EBD8 E660 '.`'
mov cx,0xffff ; 0000EBDA B9FFFF '...'
xebdd: test byte [0x97],0x10 ; 0000EBDD F606970010 '.....'
jnz xebef ; 0000EBE2 750B 'u.'
loop xebdd ; 0000EBE4 E2F7 '..'
call xec2e_wait_8042_ready ; 0000EBE6 E84500 '.E.'
mov al,0xf4 ; 0000EBE9 B0F4 '..'
out 0x60,al ; 0000EBEB E660 '.`'
jmp short xec16 ; 0000EBED EB27 '.',0x27
xebef: and byte [0x97],0xef ; 0000EBEF 80269700EF '.&...'
call xec2e_wait_8042_ready ; 0000EBF4 E83700 '.7.'
mov al,[0x17] ; 0000EBF7 A01700 '...'
shr al,0x4 ; 0000EBFA C0E804 '...'
and al,0x7 ; 0000EBFD 2407 '$.'
and byte [0x97],0xf8 ; 0000EBFF 80269700F8 '.&...'
or [0x97],al ; 0000EC04 08069700 '....'
out 0x60,al ; 0000EC08 E660 '.`'
mov cx,0xffff ; 0000EC0A B9FFFF '...'
xec0d: test byte [0x97],0x10 ; 0000EC0D F606970010 '.....'
jnz xec16 ; 0000EC12 7502 'u.'
loop xec0d ; 0000EC14 E2F7 '..'
xec16: and byte [0x97],0xbf ; 0000EC16 80269700BF '.&...'
xec1b: pop cx ; 0000EC1B 59 'Y'
pop ax ; 0000EC1C 58 'X'
ret ; 0000EC1D C3 '.'
xec1e: push ax ; 0000EC1E 50 'P'
cli ; 0000EC1F FA '.'
mov al,[0x97] ; 0000EC20 A09700 '...'
or al,0x40 ; 0000EC23 0C40 '.@'
xchg al,[0x97] ; 0000EC25 86069700 '....'
test al,0x40 ; 0000EC29 A840 '.@'
sti ; 0000EC2B FB '.'
pop ax ; 0000EC2C 58 'X'
ret ; 0000EC2D C3 '.'
xec2e_wait_8042_ready:
xec2e: push cx ; 0000EC2E 51 'Q'
mov cx,0x2710 ; 0000EC2F B91027 '..',0x27
xec32: in al,0x64 ; 0000EC32 E464 '.d'
test al,0x2 ; 0000EC34 A802 '..'
loopne xec32 ; 0000EC36 E0FA '..'
pop cx ; 0000EC38 59 'Y'
ret ; 0000EC39 C3 '.'
db 0xFF,0xFF,0xFF,0xFF,0xFF,0x34,0xC9,0x45,0xC9,0xC0,0xEC,0xC0,0xEC,0xC0,0xEC,0xE1
db 0xED,0xA6,0xEC,0xA6,0xEC,0x48,0x9F,0x63,0x91,0x7C,0x8F,0x10,0x90,0x38,0xA0
;
; This address (F000:EC59) is stored in the IDT vector for INT 0x40 when a hard disk controls INT 0x13
;
int13_diskette:
sti ; 0000EC59 FB '.'
push bp ; 0000EC5A 55 'U'
push ds ; 0000EC5B 1E '.'
push es ; 0000EC5C 06 '.'
push di ; 0000EC5D 57 'W'
push si ; 0000EC5E 56 'V'
push dx ; 0000EC5F 52 'R'
push cx ; 0000EC60 51 'Q'
push bx ; 0000EC61 53 'S'
push ax ; 0000EC62 50 'P'
mov bp,sp ; 0000EC63 8BEC '..'
xor ax,ax ; 0000EC65 33C0 '3.'
mov ds,ax ; 0000EC67 8ED8 '..'
les si,[0x78] ; 0000EC69 C4367800 '.6x.'
mov ax,0x40 ; 0000EC6D B84000 '.@.'
mov ds,ax ; 0000EC70 8ED8 '..'
mov byte [0x40],0xff ; 0000EC72 C6064000FF '..@..'
and word [bp+0x16],0xfe ; 0000EC77 816616FE00 '.f...'
mov al,[bp+0x1] ; 0000EC7C 8A4601 '.F.'
mov ah,[bp+0x6] ; 0000EC7F 8A6606 '.f.'
cmp ah,0x2 ; 0000EC82 80FC02 '...'
jnc xeca2 ; 0000EC85 731B 's.'
cmp al,0x18 ; 0000EC87 3C18 '<.'
ja xeca6 ; 0000EC89 771B 'w.'
cmp al,0x8 ; 0000EC8B 3C08 '<.'
jna xec95 ; 0000EC8D 7606 'v.'
cmp al,0x15 ; 0000EC8F 3C15 '<.'
jc xeca6 ; 0000EC91 7213 'r.'
sub al,0xc ; 0000EC93 2C0C ',.'
xec95: mov bl,al ; 0000EC95 8AD8 '..'
xor bh,bh ; 0000EC97 32FF '2.'
shl bx,1 ; 0000EC99 D1E3 '..'
call near [cs:bx+0xec3f] ; 0000EC9B 2EFF973FEC '...?.'
jmp short xeca9 ; 0000ECA0 EB07 '..'
xeca2: cmp al,0x1 ; 0000ECA2 3C01 '<.'
jna xec95 ; 0000ECA4 76EF 'v.'
xeca6: call xd3e8 ; 0000ECA6 E83FE7 '.?.'
xeca9: mov bl,[es:si+0x2] ; 0000ECA9 268A5C02 '&.\.'
mov [0x40],bl ; 0000ECAD 881E4000 '..@.'
or word [bp+0x16],0x200 ; 0000ECB1 814E160002 '.N...'
pop bx ; 0000ECB6 5B '['
pop bx ; 0000ECB7 5B '['
pop cx ; 0000ECB8 59 'Y'
pop dx ; 0000ECB9 5A 'Z'
pop si ; 0000ECBA 5E '^'
pop di ; 0000ECBB 5F '_'
pop es ; 0000ECBC 07 '.'
pop ds ; 0000ECBD 1F '.'
pop bp ; 0000ECBE 5D ']'
iret ; 0000ECBF CF '.'
call x8fa4 ; 0000ECC0 E8E1A2 '...'
jnz xecd4 ; 0000ECC3 750F 'u.'
call x9061 ; 0000ECC5 E899A3 '...'
jc xecd4 ; 0000ECC8 720A 'r',0x0A
;
; Perform FDC operation (eg, read); ZF set on success
;
call xecf0 ; 0000ECCA E82300 '.#.'
jz xecd4 ; 0000ECCD 7405 't.'
or word [bp+0x16],0x1 ; 0000ECCF 814E160100 '.N...'
xecd4: ret ; 0000ECD4 C3 '.'
xecd5: mov al,0x6 ; 0000ECD5 B006 '..'
out 0xa,al ; 0000ECD7 E60A '.',0x0A
xor al,al ; 0000ECD9 32C0 '2.'
or ah,ah ; 0000ECDB 0AE4 0x0A,'.'
jz xecec ; 0000ECDD 740D 't',0x0D
mov cx,0x4 ; 0000ECDF B90400 '...'
mov dl,0x1 ; 0000ECE2 B201 '..'
xece4: shl dl,1 ; 0000ECE4 D0E2 '..'
cmp ah,dl ; 0000ECE6 3AE2 ':.'
loopne xece4 ; 0000ECE8 E0FA '..'
jnz xecef ; 0000ECEA 7503 'u.'
xecec: call xc9dd ; 0000ECEC E8EEDC '...'
xecef: ret ; 0000ECEF C3 '.'
xecf0: cmp byte [bp+0x1],0x2 ; 0000ECF0 807E0102 '.~..'
jnz xed1e ; 0000ECF4 7528 'u('
mov ax,[bp+0xc] ; 0000ECF6 8B460C '.F.'
mov bx,0x10 ; 0000ECF9 BB1000 '...'
mul bx ; 0000ECFC F7E3 '..'
add ax,[bp+0x2] ; 0000ECFE 034602 '.F.'
adc dx,byte +0x0 ; 0000ED01 83D200 '...'
cmp dl,0xe ; 0000ED04 80FA0E '...'
jnc xed1a ; 0000ED07 7311 's.'
mov bh,[bp+0x0] ; 0000ED09 8A7E00 '.~.'
add bh,bh ; 0000ED0C 02FF '..'
xor bl,bl ; 0000ED0E 32DB '2.'
add ax,bx ; 0000ED10 03C3 '..'
adc dx,byte +0x0 ; 0000ED12 83D200 '...'
cmp dl,0xe ; 0000ED15 80FA0E '...'
jc xed1e ; 0000ED18 7204 'r.'
xed1a: mov byte [bp+0x1],0x4 ; 0000ED1A C6460104 '.F..'
xed1e: cmp byte [0x41],0x0 ; 0000ED1E 803E410000 '.>A..'
jz xed33 ; 0000ED23 740E 't.'
cmp byte [0x41],0x9 ; 0000ED25 803E410009 '.>A..'
jz xed33 ; 0000ED2A 7407 't.'
call xca03 ; 0000ED2C E8D4DC '...'
or ah,ah ; 0000ED2F 0AE4 0x0A,'.'
jnz xed5b ; 0000ED31 7528 'u('
xed33: xor ax,ax ; 0000ED33 33C0 '3.'
mov al,[bp+0x0] ; 0000ED35 8A4600 '.F.'
mov cl,[es:si+0x3] ; 0000ED38 268A4C03 '&.L.'
mov dx,0x80 ; 0000ED3C BA8000 '...'
shl dx,cl ; 0000ED3F D3E2 '..'
mul dx ; 0000ED41 F7E2 '..'
dec ax ; 0000ED43 48 'H'
mov cx,ax ; 0000ED44 8BC8 '..'
call xca4f ; 0000ED46 E806DD '...'
add ax,bx ; 0000ED49 03C3 '..'
jnc xed5e ; 0000ED4B 7311 's.'
mov al,[bp+0x1] ; 0000ED4D 8A4601 '.F.'
test al,0x4 ; 0000ED50 A804 '..'
jnz xed5e ; 0000ED52 750A 'u',0x0A
mov ah,0x9 ; 0000ED54 B409 '..'
or word [bp+0x16],0x1 ; 0000ED56 814E160100 '.N...'
xed5b: jmp short xedd7 ; 0000ED5B EB7A '.z'
nop ; 0000ED5D 90 '.'
xed5e: call xee9c ; 0000ED5E E83B01 '.;.'
jnz xedd7 ; 0000ED61 7574 'ut'
xor bh,bh ; 0000ED63 32FF '2.'
mov bl,[bp+0x1] ; 0000ED65 8A5E01 '.^.'
shl bx,1 ; 0000ED68 D1E3 '..'
mov ax,[cs:bx+0xefd1] ; 0000ED6A 2E8B87D1EF '.....'
out 0xb,al ; 0000ED6F E60B '..'
mov al,0x2 ; 0000ED71 B002 '..'
jmp short xed75 ; 0000ED73 EB00 '..'
xed75: out 0xa,al ; 0000ED75 E60A '.',0x0A
mov bh,ah ; 0000ED77 8AFC '..'
call xd4c4 ; 0000ED79 E848E7 '.H.'
call xca78 ; 0000ED7C E8F9DC '...'
mov bh,[bp+0x7] ; 0000ED7F 8A7E07 '.~.'
call xd4c4 ; 0000ED82 E83FE7 '.?.'
mov bh,[bp+0x4] ; 0000ED85 8A7E04 '.~.'
call xd4c4 ; 0000ED88 E839E7 '.9.'
add si,byte +0x3 ; 0000ED8B 83C603 '...'
call xd4d0 ; 0000ED8E E83FE7 '.?.'
inc si ; 0000ED91 46 'F'
inc si ; 0000ED92 46 'F'
cmp byte [bp+0x1],0x5 ; 0000ED93 807E0105 '.~..'
jnz xed9e ; 0000ED97 7505 'u.'
call xd4d0 ; 0000ED99 E834E7 '.4.'
jmp short xedb8 ; 0000ED9C EB1A '..'
xed9e: mov al,[0x8b] ; 0000ED9E A08B00 '...'
mov bh,0x1b ; 0000EDA1 B71B '..'
and al,0xc0 ; 0000EDA3 24C0 '$.'
jz xedaf ; 0000EDA5 7408 't.'
mov bh,0x23 ; 0000EDA7 B723 '.#'
test al,0x40 ; 0000EDA9 A840 '.@'
jnz xedaf ; 0000EDAB 7502 'u.'
mov bh,0x2a ; 0000EDAD B72A '.*'
xedaf: call xd4c4 ; 0000EDAF E812E7 '...'
mov bh,[si+0x1] ; 0000EDB2 8A7C01 '.|.'
call xd4c4 ; 0000EDB5 E80CE7 '...'
xedb8: sub si,byte +0x5 ; 0000EDB8 83EE05 '...'
xedbb: call xef85 ; 0000EDBB E8C701 '...'
jnz xedd7 ; 0000EDBE 7517 'u.'
;
; Read 7 FDC response bytes, starting with ST0, storing them at 0x40:0x42
;
mov cx,0x7 ; 0000EDC0 B90700 '...'
mov di,0x42 ; 0000EDC3 BF4200 '.B.'
xedc6: call xc9bf ; 0000EDC6 E8F6DB '...'
jz xedc6 ; 0000EDC9 74FB 't.'
call x919a ; 0000EDCB E8CCA3 '...'
in al,dx ; 0000EDCE EC '.'
mov [di],al ; 0000EDCF 8805 '..'
inc di ; 0000EDD1 47 'G'
loop xedc6 ; 0000EDD2 E2F2 '..'
;
; If the FDC's response in ST0 is good, this will return (AH) == 0x00
;
call xd50f ; 0000EDD4 E838E7 '.8.'
xedd7: mov [0x41],ah ; 0000EDD7 88264100 '.&A.'
;
; This appears to validate the rest of the FDC response bytes; (AX) should be zero on success
;
call xecd5 ; 0000EDDB E8F7FE '...'
or ah,ah ; 0000EDDE 0AE4 0x0A,'.'
ret ; 0000EDE0 C3 '.'
push ds ; 0000EDE1 1E '.'
push cx ; 0000EDE2 51 'Q'
push si ; 0000EDE3 56 'V'
cld ; 0000EDE4 FC '.'
mov cx,0x10 ; 0000EDE5 B91000 '...'
xor ax,ax ; 0000EDE8 33C0 '3.'
mov ds,ax ; 0000EDEA 8ED8 '..'
rep lodsb ; 0000EDEC F3AC '..'
pop si ; 0000EDEE 5E '^'
push si ; 0000EDEF 56 'V'
mov cx,0x10 ; 0000EDF0 B91000 '...'
mov ax,0x1000 ; 0000EDF3 B80010 '...'
mov ds,ax ; 0000EDF6 8ED8 '..'
rep lodsb ; 0000EDF8 F3AC '..'
pop si ; 0000EDFA 5E '^'
pop cx ; 0000EDFB 59 'Y'
pop ds ; 0000EDFC 1F '.'
call x8fa4 ; 0000EDFD E8A4A1 '...'
jnz xee68 ; 0000EE00 7566 'uf'
call x9190 ; 0000EE02 E88BA3 '...'
mov ah,[bx] ; 0000EE05 8A27 '.',0x27
test ah,0x10 ; 0000EE07 F6C410 '...'
jnz xee19 ; 0000EE0A 750D 'u',0x0D
cmp ah,0x87 ; 0000EE0C 80FC87 '...'
jnz xee14 ; 0000EE0F 7503 'u.'
sub ah,0x3 ; 0000EE11 80EC03 '...'
xee14: add ah,0x13 ; 0000EE14 80C413 '...'
mov [bx],ah ; 0000EE17 8827 '.',0x27
xee19: call xd490 ; 0000EE19 E874E6 '.t.'
mov al,0x4a ; 0000EE1C B04A '.J'
out 0xb,al ; 0000EE1E E60B '..'
mov cx,0xffff ; 0000EE20 B9FFFF '...'
call xca4f ; 0000EE23 E829DC '.).'
mov al,0x4 ; 0000EE26 B004 '..'
xor ah,ah ; 0000EE28 32E4 '2.'
mul byte [bp+0x0] ; 0000EE2A F66600 '.f.'
add ax,bx ; 0000EE2D 03C3 '..'
jnc xee35 ; 0000EE2F 7304 's.'
mov ah,0x9 ; 0000EE31 B409 '..'
jmp short xee63 ; 0000EE33 EB2E '..'
xee35: call xee9c ; 0000EE35 E86400 '.d.'
jnz xee68 ; 0000EE38 752E 'u.'
mov al,0x2 ; 0000EE3A B002 '..'
out 0xa,al ; 0000EE3C E60A '.',0x0A
mov bh,0x4d ; 0000EE3E B74D '.M'
call xd4c4 ; 0000EE40 E881E6 '...'
mov bh,[bp+0x7] ; 0000EE43 8A7E07 '.~.'
shl bh,0x2 ; 0000EE46 C0E702 '...'
or bh,[bp+0x6] ; 0000EE49 0A7E06 0x0A,'~.'
call xd4c4 ; 0000EE4C E875E6 '.u.'
add si,byte +0x3 ; 0000EE4F 83C603 '...'
call xd4d0 ; 0000EE52 E87BE6 '.{.'
add si,byte +0x4 ; 0000EE55 83C604 '...'
call xd4d0 ; 0000EE58 E875E6 '.u.'
sub si,byte +0x7 ; 0000EE5B 83EE07 '...'
call xedbb ; 0000EE5E E85AFF '.Z.'
jz xee71 ; 0000EE61 740E 't.'
xee63: or word [bp+0x16],0x1 ; 0000EE63 814E160100 '.N...'
xee68: mov [0x41],ah ; 0000EE68 88264100 '.&A.'
call xecd5 ; 0000EE6C E866FE '.f.'
or ah,ah ; 0000EE6F 0AE4 0x0A,'.'
xee71: ret ; 0000EE71 C3 '.'
xee72: call xc956 ; 0000EE72 E8E1DA '...'
mov cx,0x64 ; 0000EE75 B96400 '.d.'
xee78: call xc9bf ; 0000EE78 E844DB '.D.'
jz xee83 ; 0000EE7B 7406 't.'
loop xee78 ; 0000EE7D E2F9 '..'
mov ah,0x80 ; 0000EE7F B480 '..'
jmp short xee9b ; 0000EE81 EB18 '..'
xee83: call x919a ; 0000EE83 E814A3 '...'
mov al,0x7 ; 0000EE86 B007 '..'
out dx,al ; 0000EE88 EE '.'
mov bh,[bp+0x6] ; 0000EE89 8A7E06 '.~.'
call xd4c4 ; 0000EE8C E835E6 '.5.'
call xef85 ; 0000EE8F E8F300 '...'
jnz xee9b ; 0000EE92 7507 'u.'
call xef6f ; 0000EE94 E8D800 '...'
test al,0xc0 ; 0000EE97 A8C0 '..'
mov ah,0x80 ; 0000EE99 B480 '..'
xee9b: ret ; 0000EE9B C3 '.'
xee9c: mov al,0x1 ; 0000EE9C B001 '..'
mov cl,[bp+0x6] ; 0000EE9E 8A4E06 '.N.'
shl al,cl ; 0000EEA1 D2E0 '..'
test [0x3e],al ; 0000EEA3 84063E00 '..>.'
jnz xeec4 ; 0000EEA7 751B 'u.'
or [0x3e],al ; 0000EEA9 08063E00 '..>.'
call x9190 ; 0000EEAD E8E0A2 '...'
mov byte [bx+0x4],0x0 ; 0000EEB0 C6470400 '.G..'
call xee72 ; 0000EEB4 E8BBFF '...'
jz xeec4 ; 0000EEB7 740B 't.'
and al,0x70 ; 0000EEB9 2470 '$p'
cmp al,0x70 ; 0000EEBB 3C70 '<p'
jnz xef3e ; 0000EEBD 757F 'u.'
call xee72 ; 0000EEBF E8B0FF '...'
jnz xef3e ; 0000EEC2 757A 'uz'
xeec4: call xc956 ; 0000EEC4 E88FDA '...'
call x9190 ; 0000EEC7 E8C6A2 '...'
mov ah,[bx] ; 0000EECA 8A27 '.',0x27
mov al,[bp+0x5] ; 0000EECC 8A4605 '.F.'
test ah,0x20 ; 0000EECF F6C420 '.. '
jz xeed6 ; 0000EED2 7402 't.'
shl al,1 ; 0000EED4 D0E0 '..'
xeed6: mov cl,[bx+0x4] ; 0000EED6 8A4F04 '.O.'
xor ah,ah ; 0000EED9 32E4 '2.'
cmp al,cl ; 0000EEDB 3AC1 ':.'
jz xef3e ; 0000EEDD 745F 't_'
mov [bx+0x4],al ; 0000EEDF 884704 '.G.'
push bx ; 0000EEE2 53 'S'
mov bx,0x4 ; 0000EEE3 BB0400 '...'
call xc638 ; 0000EEE6 E84FD7 '.O.'
pop bx ; 0000EEE9 5B '['
cli ; 0000EEEA FA '.'
mov bh,0xf ; 0000EEEB B70F '..'
call xd4c4 ; 0000EEED E8D4E5 '...'
mov bh,[bp+0x7] ; 0000EEF0 8A7E07 '.~.'
shl bh,0x2 ; 0000EEF3 C0E702 '...'
or bh,[bp+0x6] ; 0000EEF6 0A7E06 0x0A,'~.'
call xd4c4 ; 0000EEF9 E8C8E5 '...'
call x9190 ; 0000EEFC E891A2 '...'
mov bh,[bx+0x4] ; 0000EEFF 8A7F04 '...'
call xd4c4 ; 0000EF02 E8BFE5 '...'
sti ; 0000EF05 FB '.'
call xef85 ; 0000EF06 E87C00 '.|.'
jnz xef3e ; 0000EF09 7533 'u3'
xor bx,bx ; 0000EF0B 33DB '3.'
mov bl,[es:si+0x9] ; 0000EF0D 268A5C09 '&.\.'
mov al,[bp+0x1] ; 0000EF11 8A4601 '.F.'
cmp al,0x3 ; 0000EF14 3C03 '<.'
jz xef1c ; 0000EF16 7404 't.'
cmp al,0x5 ; 0000EF18 3C05 '<.'
jnz xef30 ; 0000EF1A 7514 'u.'
xef1c: push bx ; 0000EF1C 53 'S'
call x9163 ; 0000EF1D E843A2 '.C.'
pop bx ; 0000EF20 5B '['
mov al,0x14 ; 0000EF21 B014 '..'
cmp ah,0x2 ; 0000EF23 80FC02 '...'
jnz xef2a ; 0000EF26 7502 'u.'
mov al,0xf ; 0000EF28 B00F '..'
xef2a: cmp bl,al ; 0000EF2A 3AD8 ':.'
jnc xef30 ; 0000EF2C 7302 's.'
xchg al,bl ; 0000EF2E 86C3 '..'
xef30: or bx,bx ; 0000EF30 0BDB '..'
jz xef37 ; 0000EF32 7403 't.'
call xc638 ; 0000EF34 E801D7 '...'
xef37: call xef6f ; 0000EF37 E83500 '.5.'
test al,0xc0 ; 0000EF3A A8C0 '..'
mov ah,0x40 ; 0000EF3C B440 '.@'
xef3e: ret ; 0000EF3E C3 '.'
db '************************P'
push ds ; 0000EF58 1E '.'
mov ax,0x40 ; 0000EF59 B84000 '.@.'
mov ds,ax ; 0000EF5C 8ED8 '..'
or byte [0x3e],0x80 ; 0000EF5E 800E3E0080 '..>..'
mov al,0x20 ; 0000EF63 B020 '. '
out 0x20,al ; 0000EF65 E620 '. '
mov ax,0x9101 ; 0000EF67 B80191 '...'
int 0x15 ; 0000EF6A CD15 '..'
pop ds ; 0000EF6C 1F '.'
pop ax ; 0000EF6D 58 'X'
iret ; 0000EF6E CF '.'
xef6f: mov bh,0x8 ; 0000EF6F B708 '..'
call xd4c4 ; 0000EF71 E850E5 '.P.'
mov cx,0x2 ; 0000EF74 B90200 '...'
jmp short xef7c ; 0000EF77 EB03 '..'
xef79: mov [0x42],al ; 0000EF79 A24200 '.B.'
xef7c: call xd4ba ; 0000EF7C E83BE5 '.;.'
loop xef79 ; 0000EF7F E2F8 '..'
mov al,[0x42] ; 0000EF81 A04200 '.B.'
ret ; 0000EF84 C3 '.'
xef85: clc ; 0000EF85 F8 '.'
mov ax,0x9001 ; 0000EF86 B80190 '...'
int 0x15 ; 0000EF89 CD15 '..'
jnc xef98 ; 0000EF8B 730B 's.'
test byte [0x3e],0x80 ; 0000EF8D F6063E0080 '..>..'
jz xefaf ; 0000EF92 741B 't.'
xor ah,ah ; 0000EF94 32E4 '2.'
jmp short xefb4 ; 0000EF96 EB1C '..'
xef98: mov bx,0x4 ; 0000EF98 BB0400 '...'
xef9b: mov cx,0x3d09 ; 0000EF9B B9093D '..='
xor ax,ax ; 0000EF9E 33C0 '3.'
xefa0: test byte [0x3e],0x80 ; 0000EFA0 F6063E0080 '..>..'
jnz xefb4 ; 0000EFA5 750D 'u',0x0D
call x919a ; 0000EFA7 E8F0A1 '...'
loop xefa0 ; 0000EFAA E2F4 '..'
dec bx ; 0000EFAC 4B 'K'
jnz xef9b ; 0000EFAD 75EC 'u.'
xefaf: call xca03 ; 0000EFAF E851DA '.Q.'
mov ah,0x80 ; 0000EFB2 B480 '..'
xefb4: and byte [0x3e],0x7f ; 0000EFB4 80263E007F '.&>..'
or ah,ah ; 0000EFB9 0AE4 0x0A,'.'
ret ; 0000EFBB C3 '.'
db '**********'
sub bl,bh ; 0000EFC6 2ADF '*.'
add ah,[di] ; 0000EFC8 0225 '.%'
add cl,[bx] ; 0000EFCA 020F '..'
sbb di,di ; 0000EFCC 1BFF '..'
push sp ; 0000EFCE 54 'T'
db 0xF6 ; 0000EFCF F6 '.'
invd ; 0000EFD0 0F08 '..'
jmp x88ea ; 0000EFD2 E91599 '...'
inc si ; 0000EFD5 46 'F'
out 0x4a,al ; 0000EFD6 E64A '.J'
lds ax,[bp+si-0x1a] ; 0000EFD8 C542E6 '.B.'
xefdb: mov bh,0x3 ; 0000EFDB B703 '..'
call xd4c4 ; 0000EFDD E8E4E4 '...'
call xd4d0 ; 0000EFE0 E8EDE4 '...'
ret ; 0000EFE3 C3 '.'
times 65 db 0xFF ; 0000EFE4 - 0000F024
xf025: cmp ah,0x14 ; 0000F025 80FC14 '...'
jc xf031 ; 0000F028 7207 'r.'
cmp ah,0xbf ; 0000F02A 80FCBF '...'
jnz xf062 ; 0000F02D 7533 'u3'
mov ah,0x14 ; 0000F02F B414 '..'
xf031: cld ; 0000F031 FC '.'
mov bp,sp ; 0000F032 8BEC '..'
mov si,0x40 ; 0000F034 BE4000 '.@.'
mov ds,si ; 0000F037 8EDE '..'
mov dl,[0x10] ; 0000F039 8A161000 '....'
and dl,0x30 ; 0000F03D 80E230 '..0'
mov si,0xb800 ; 0000F040 BE00B8 '...'
cmp dl,0x30 ; 0000F043 80FA30 '..0'
jnz xf04b ; 0000F046 7503 'u.'
mov si,0xb000 ; 0000F048 BE00B0 '...'
xf04b: mov dx,[0x63] ; 0000F04B 8B166300 '..c.'
mov es,si ; 0000F04F 8EC6 '..'
xchg al,ah ; 0000F051 86C4 '..'
mov si,ax ; 0000F053 8BF0 '..'
xchg al,ah ; 0000F055 86C4 '..'
and si,0xff ; 0000F057 81E6FF00 '....'
shl si,1 ; 0000F05B D1E6 '..'
call near [cs:si+0x97c6] ; 0000F05D 2EFF94C697 '.....'
xf062: jmp x97f0 ; 0000F062 E98BA7 '...'
xf065: sti ; 0000F065 FB '.'
push es ; 0000F066 06 '.'
push ds ; 0000F067 1E '.'
push bp ; 0000F068 55 'U'
push di ; 0000F069 57 'W'
push si ; 0000F06A 56 'V'
push bx ; 0000F06B 53 'S'
push cx ; 0000F06C 51 'Q'
push dx ; 0000F06D 52 'R'
push ax ; 0000F06E 50 'P'
jmp short xf025 ; 0000F06F EBB4 '..'
times 47 db 0xFF ; 0000F071 - 0000F09F
db 0xFF,0xFF,0xFF,0xFF,0x38,0x28,0x2D,0x0A,0x1F,0x06,0x19,0x1C,0x02,0x07,0x06,0x07 ; 0000F0A0
db 0x00,0x00,0x00,0x00,0x71,0x50,0x5A,0x0A,0x1F,0x06,0x19,0x1C,0x02,0x07,0x06,0x07 ; 0000F0B0
db 0x00,0x00,0x00,0x00,0x38,0x28,0x2D,0x0A,0x7F,0x06,0x64,0x70,0x02,0x01,0x06,0x07 ; 0000F0C0
db 0x00,0x00,0x00,0x00,0x61,0x50,0x52,0x0F,0x19,0x06,0x19,0x19,0x02,0x0D,0x0B,0x0C ; 0000F0D0
db 0x00,0x00,0x00,0x00,0x38,0x28,0x2D,0x0A,0x1F,0x06,0x19,0x1C,0x02,0x07,0x06,0x07 ; 0000F0E0
db 0x00,0x00,0x00,0x00,0x71,0x50,0x5A,0x0A,0x19,0x06,0x19,0x19,0x02,0x0D,0x0B,0x0C ; 0000F0F0
db 0x00,0x00,0x00,0x00,0x38,0x28,0x2D,0x0A,0x7F,0x06,0x64,0x70,0x02,0x01,0x06,0x07 ; 0000F100
db 0x00,0x00,0x00,0x00,0x61,0x50,0x52,0x0F,0x19,0x06,0x19,0x19,0x02,0x0D,0x0B,0x0C ; 0000F110
times 8 dw 0x0000 ; 0000F120 - 0000F12E
xf130: push bp ; 0000F130 55 'U'
push ds ; 0000F131 1E '.'
push es ; 0000F132 06 '.'
push ax ; 0000F133 50 'P'
push bx ; 0000F134 53 'S'
push cx ; 0000F135 51 'Q'
push dx ; 0000F136 52 'R'
push si ; 0000F137 56 'V'
push di ; 0000F138 57 'W'
mov al,0xe0 ; 0000F139 B0E0 '..'
out 0x84,al ; 0000F13B E684 '..'
cld ; 0000F13D FC '.'
call xf30a ; 0000F13E E8C901 '...'
mov bx,0x0 ; 0000F141 BB0000 '...'
mov ax,0xe000 ; 0000F144 B800E0 '...'
mov ds,ax ; 0000F147 8ED8 '..'
mov ax,0xaa55 ; 0000F149 B855AA '.U.'
cmp ax,[0x0] ; 0000F14C 3B060000 ';...'
jnz xf1ac ; 0000F150 755A 'uZ'
xor ch,ch ; 0000F152 32ED '2.'
mov cl,[0x2] ; 0000F154 8A0E0200 '....'
shl cx,0x9 ; 0000F158 C1E109 '...'
mov si,0x0 ; 0000F15B BE0000 '...'
call xf2b0 ; 0000F15E E84F01 '.O.'
jnz xf1ac ; 0000F161 7549 'uI'
mov bx,cx ; 0000F163 8BD9 '..'
sub sp,byte +0x48 ; 0000F165 83EC48 '..H'
mov bp,sp ; 0000F168 8BEC '..'
mov ax,ss ; 0000F16A 8CD0 '..'
mov es,ax ; 0000F16C 8EC0 '..'
mov di,bp ; 0000F16E 8BFD '..'
xor ax,ax ; 0000F170 33C0 '3.'
mov cx,0x48 ; 0000F172 B94800 '.H.'
rep stosb ; 0000F175 F3AA '..'
mov si,bp ; 0000F177 8BF5 '..'
lea di,[si+0x10] ; 0000F179 8D7C10 '.|.'
mov byte [es:di+0x4],0xe ; 0000F17C 26C645040E '&.E..'
mov word [es:di],0xffff ; 0000F181 26C705FFFF '&....'
mov byte [es:di+0x5],0x9a ; 0000F186 26C645059A '&.E..'
lea di,[si+0x18] ; 0000F18B 8D7C18 '.|.'
mov byte [es:di+0x4],0xfe ; 0000F18E 26C64504FE '&.E..'
mov word [es:di],0xffff ; 0000F193 26C705FFFF '&....'
mov byte [es:di+0x5],0x92 ; 0000F198 26C6450592 '&.E..'
mov ah,0x87 ; 0000F19D B487 '..'
mov cx,bx ; 0000F19F 8BCB '..'
shr cx,1 ; 0000F1A1 D1E9 '..'
int 0x15 ; 0000F1A3 CD15 '..'
add sp,byte +0x48 ; 0000F1A5 83C448 '..H'
mov al,0xe1 ; 0000F1A8 B0E1 '..'
out 0x84,al ; 0000F1AA E684 '..'
xf1ac: mov al,0xe2 ; 0000F1AC B0E2 '..'
out 0x84,al ; 0000F1AE E684 '..'
mov ax,0xc000 ; 0000F1B0 B800C0 '...'
mov ds,ax ; 0000F1B3 8ED8 '..'
mov ax,0xaa55 ; 0000F1B5 B855AA '.U.'
cmp ax,[0x0] ; 0000F1B8 3B060000 ';...'
jnz xf1f9 ; 0000F1BC 753B 'u;'
call xf2c0 ; 0000F1BE E8FF00 '...'
jnz xf1f9 ; 0000F1C1 7536 'u6'
xor ch,ch ; 0000F1C3 32ED '2.'
mov cl,[0x2] ; 0000F1C5 8A0E0200 '....'
shl cx,0x9 ; 0000F1C9 C1E109 '...'
mov ax,0xffff ; 0000F1CC B8FFFF '...'
cmp bx,ax ; 0000F1CF 3BD8 ';.'
jz xf1f9 ; 0000F1D1 7426 't&'
sub ax,bx ; 0000F1D3 2BC3 '+.'
cmp ax,cx ; 0000F1D5 3BC1 ';.'
jc 0xf1f9 ; 0000F1D7 7220 'r '
add bx,byte +0xf ; 0000F1D9 83C30F '...'
and bx,0xfff0 ; 0000F1DC 81E3F0FF '....'
mov ax,0xffff ; 0000F1E0 B8FFFF '...'
sub ax,bx ; 0000F1E3 2BC3 '+.'
cmp ax,cx ; 0000F1E5 3BC1 ';.'
jc xf1f9 ; 0000F1E7 7210 'r.'
mov si,0x0 ; 0000F1E9 BE0000 '...'
call xf2b0 ; 0000F1EC E8C100 '...'
jnz xf1f9 ; 0000F1EF 7508 'u.'
shr cx,1 ; 0000F1F1 D1E9 '..'
call xf298 ; 0000F1F3 E8A200 '...'
call xf20c ; 0000F1F6 E81300 '...'
xf1f9: call xf305 ; 0000F1F9 E80901 '...'
call xf273 ; 0000F1FC E87400 '.t.'
call xf2eb ; 0000F1FF E8E900 '...'
pop di ; 0000F202 5F '_'
pop si ; 0000F203 5E '^'
pop dx ; 0000F204 5A 'Z'
pop cx ; 0000F205 59 'Y'
pop bx ; 0000F206 5B '['
pop ax ; 0000F207 58 'X'
pop es ; 0000F208 07 '.'
pop ds ; 0000F209 1F '.'
pop bp ; 0000F20A 5D ']'
ret ; 0000F20B C3 '.'
xf20c: push ds ; 0000F20C 1E '.'
call xf305 ; 0000F20D E8F500 '...'
mov ax,0x0 ; 0000F210 B80000 '...'
mov es,ax ; 0000F213 8EC0 '..'
mov ax,cs ; 0000F215 8CC8 '..'
mov ds,ax ; 0000F217 8ED8 '..'
mov di,0x40 ; 0000F219 BF4000 '.@.'
mov ax,[es:di] ; 0000F21C 268B05 '&..'
mov [0x7124],ax ; 0000F21F A32471 '.$q'
add di,byte +0x2 ; 0000F222 83C702 '...'
mov ax,[es:di] ; 0000F225 268B05 '&..'
mov [0x7126],ax ; 0000F228 A32671 '.&q'
shr bx,0x4 ; 0000F22B C1EB04 '...'
add bx,0xe000 ; 0000F22E 81C300E0 '....'
mov [es:di],bx ; 0000F232 26891D '&..'
mov di,0x7c ; 0000F235 BF7C00 '.|.'
mov ax,[es:di] ; 0000F238 268B05 '&..'
mov [0x7128],ax ; 0000F23B A32871 '.(q'
add di,byte +0x2 ; 0000F23E 83C702 '...'
mov ax,[es:di] ; 0000F241 268B05 '&..'
mov [0x712a],ax ; 0000F244 A32A71 '.*q'
mov [es:di],bx ; 0000F247 26891D '&..'
mov di,0x10c ; 0000F24A BF0C01 '...'
mov ax,[es:di] ; 0000F24D 268B05 '&..'
mov [0x712c],ax ; 0000F250 A32C71 '.,q'
add di,byte +0x2 ; 0000F253 83C702 '...'
mov ax,[es:di] ; 0000F256 268B05 '&..'
mov [0x712e],ax ; 0000F259 A32E71 '..q'
mov [es:di],bx ; 0000F25C 26891D '&..'
mov al,0xe3 ; 0000F25F B0E3 '..'
out 0x84,al ; 0000F261 E684 '..'
pop ds ; 0000F263 1F '.'
xor ch,ch ; 0000F264 32ED '2.'
mov cl,[0x2] ; 0000F266 8A0E0200 '....'
shl cx,0x9 ; 0000F26A C1E109 '...'
shl bx,0x4 ; 0000F26D C1E304 '...'
add bx,cx ; 0000F270 03D9 '..'
ret ; 0000F272 C3 '.'
xf273: cmp bx,byte +0x0 ; 0000F273 83FB00 '...'
jz xf297 ; 0000F276 741F 't.'
dec bx ; 0000F278 4B 'K'
add bx,0xfff ; 0000F279 81C3FF0F '....'
and bx,0xf000 ; 0000F27D 81E300F0 '....'
shr bx,0xc ; 0000F281 C1EB0C '...'
mov ax,0x10 ; 0000F284 B81000 '...'
sub ax,bx ; 0000F287 2BC3 '+.'
mov cx,0xf000 ; 0000F289 B900F0 '...'
mov es,cx ; 0000F28C 8EC1 '..'
mov di,bim_table_offset ; 0000F28E BFE0FF '...'
mov di,[es:di] ; 0000F291 268B3D '&.='
mov [es:di],al ; 0000F294 268805 '&..'
xf297: ret ; 0000F297 C3 '.'
xf298: call xf305 ; 0000F298 E86A00 '.j.'
xor si,si ; 0000F29B 33F6 '3.'
mov ax,0xe000 ; 0000F29D B800E0 '...'
mov es,ax ; 0000F2A0 8EC0 '..'
mov di,bx ; 0000F2A2 8BFB '..'
xor ch,ch ; 0000F2A4 32ED '2.'
mov cl,[0x2] ; 0000F2A6 8A0E0200 '....'
shl cx,0x8 ; 0000F2AA C1E108 '...'
rep movsw ; 0000F2AD F3A5 '..'
ret ; 0000F2AF C3 '.'
xf2b0: push ax ; 0000F2B0 50 'P'
push cx ; 0000F2B1 51 'Q'
push dx ; 0000F2B2 52 'R'
xor dx,dx ; 0000F2B3 33D2 '3.'
xf2b5: lodsb ; 0000F2B5 AC '.'
add dl,al ; 0000F2B6 02D0 '..'
loop xf2b5 ; 0000F2B8 E2FB '..'
test dl,dl ; 0000F2BA 84D2 '..'
pop dx ; 0000F2BC 5A 'Z'
pop cx ; 0000F2BD 59 'Y'
pop ax ; 0000F2BE 58 'X'
ret ; 0000F2BF C3 '.'
xf2c0: push ds ; 0000F2C0 1E '.'
push es ; 0000F2C1 06 '.'
push si ; 0000F2C2 56 'V'
push di ; 0000F2C3 57 'W'
push cx ; 0000F2C4 51 'Q'
mov cx,0xc000 ; 0000F2C5 B900C0 '...'
mov es,cx ; 0000F2C8 8EC1 '..'
xor ch,ch ; 0000F2CA 32ED '2.'
mov cl,[es:0x2] ; 0000F2CC 268A0E0200 '&....'
shl cx,0x9 ; 0000F2D1 C1E109 '...'
sub cx,byte +0x16 ; 0000F2D4 83E916 '...'
mov di,cx ; 0000F2D7 8BF9 '..'
mov cx,cs ; 0000F2D9 8CC9 '..'
mov ds,cx ; 0000F2DB 8ED9 '..'
mov si,0xe02e ; 0000F2DD BE2EE0 '...'
mov cx,0x3 ; 0000F2E0 B90300 '...'
repe cmpsw ; 0000F2E3 F3A7 '..'
pop cx ; 0000F2E5 59 'Y'
pop di ; 0000F2E6 5F '_'
pop si ; 0000F2E7 5E '^'
pop es ; 0000F2E8 07 '.'
pop ds ; 0000F2E9 1F '.'
ret ; 0000F2EA C3 '.'
xf2eb: push bx ; 0000F2EB 53 'S'
mov bl,0xfc ; 0000F2EC B3FC '..'
xf2ee: push eax ; 0000F2EE 6650 'fP'
push bp ; 0000F2F0 55 'U'
push es ; 0000F2F1 06 '.'
pushf ; 0000F2F2 9C '.'
cli ; 0000F2F3 FA '.'
xor di,di ; 0000F2F4 33FF '3.'
mov bp,0xf2fc ; 0000F2F6 BDFCF2 '...'
jmp x8796 ; 0000F2F9 E99A94
popf ; 0000F2FC 9D '.'
pop es ; 0000F2FD 07 '.'
pop bp ; 0000F2FE 5D ']'
pop eax ; 0000F2FF 6658 'fX'
pop bx ; 0000F301 5B '['
xor ah,ah ; 0000F302 32E4 '2.'
ret ; 0000F304 C3 '.'
xf305: push bx ; 0000F305 53 'S'
mov bl,0xfe ; 0000F306 B3FE '..'
jmp short xf2ee ; 0000F308 EBE4 '..'
xf30a: push bx ; 0000F30A 53 'S'
mov bl,0xff ; 0000F30B B3FF '..'
jmp short xf2ee ; 0000F30D EBDF '..'
xf30f: call xf337 ; 0000F30F E82500 '.%.'
mov ah,0xff ; 0000F312 B4FF '..'
jz xf326 ; 0000F314 7410 't.'
and al,0xc ; 0000F316 240C '$.'
mov ah,0x1 ; 0000F318 B401 '..'
cmp al,0xc ; 0000F31A 3C0C '<.'
jz xf326 ; 0000F31C 7408 't.'
mov ah,0x2 ; 0000F31E B402 '..'
test al,0x4 ; 0000F320 A804 '..'
jnz xf326 ; 0000F322 7502 'u.'
mov ah,0x0 ; 0000F324 B400 '..'
xf326: mov al,ah ; 0000F326 8AC4 '..'
xor ah,ah ; 0000F328 32E4 '2.'
ret ; 0000F32A C3 '.'
xf32b: push ax ; 0000F32B 50 'P'
cli ; 0000F32C FA '.'
call xec2e_wait_8042_ready ; 0000F32D E8FEF8 '...'
mov al,0xa3 ; 0000F330 B0A3 '..'
out 0x64,al ; 0000F332 E664 '.d'
sti ; 0000F334 FB '.'
pop ax ; 0000F335 58 'X'
ret ; 0000F336 C3 '.'
xf337: cli ; 0000F337 FA '.'
call xec2e_wait_8042_ready ; 0000F338 E8F3F8 '...'
mov al,0xad ; 0000F33B B0AD '..'
out 0x64,al ; 0000F33D E664 '.d'
xf33f: in al,0x64 ; 0000F33F E464 '.d'
test al,0x1 ; 0000F341 A801 '..'
jz xf349 ; 0000F343 7404 't.'
in al,0x60 ; 0000F345 E460 '.`'
jmp short xf33f ; 0000F347 EBF6 '..'
xf349: call xec2e_wait_8042_ready ; 0000F349 E8E2F8 '...'
mov al,0xa5 ; 0000F34C B0A5 '..'
out 0x64,al ; 0000F34E E664 '.d'
call xec2e_wait_8042_ready ; 0000F350 E8DBF8 '...'
push cx ; 0000F353 51 'Q'
mov cx,0x2710 ; 0000F354 B91027 '..',0x27
xf357: in al,0x64 ; 0000F357 E464 '.d'
test al,0x1 ; 0000F359 A801 '..'
loope xf357 ; 0000F35B E1FA '..'
pop cx ; 0000F35D 59 'Y'
jz xf362 ; 0000F35E 7402 't.'
in al,0x60 ; 0000F360 E460 '.`'
xf362: push ax ; 0000F362 50 'P'
pushf ; 0000F363 9C '.'
call xec2e_wait_8042_ready ; 0000F364 E8C7F8 '...'
mov al,0xae ; 0000F367 B0AE '..'
out 0x64,al ; 0000F369 E664 '.d'
push cs ; 0000F36B 0E '.'
call xf372 ; 0000F36C E80300 '...'
jmp short xf373 ; 0000F36F EB02 '..'
nop ; 0000F371 90 '.'
xf372: iret ; 0000F372 CF '.'
xf373: pop ax ; 0000F373 58 'X'
sti ; 0000F374 FB '.'
ret ; 0000F375 C3 '.'
dw 0xFFFF ; 0000F376 FFFF
;
; Pattern buffers for memory tests
;
pattern1:
db 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02 ; 0000F378
db 0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x20 ; 0000F380
db 0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x80,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00 ; 0000F390
db 0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x20,0x00 ; 0000F3A0
db 0x00,0x00,0x40,0x00,0x00,0x00,0x80,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00 ; 0000F3B0
db 0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x20,0x00,0x00 ; 0000F3C0
db 0x00,0x40,0x00,0x00,0x00,0x80,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00 ; 0000F3D0
db 0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x20,0x00,0x00,0x00 ; 0000F3E0
db 0x40,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0000F3F0
pattern2:
db 0xFF,0xFF,0xFF,0xFE ; 0000F3FC
db 0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xEF ; 0000F400
db 0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFE,0xFF ; 0000F410
db 0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xEF,0xFF ; 0000F420
db 0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFE,0xFF,0xFF ; 0000F430
db 0xFF,0xFD,0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF ; 0000F440
db 0xFF,0xDF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF ; 0000F450
db 0xFD,0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF ; 0000F460
db 0xDF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ; 0000F470
xf480: mov al,0x7d ; 0000F480 B07D
out 0x84,al ; 0000F482 E684
mov si,bim_table_offset ; 0000F484 BEE0FF
mov si,[cs:si] ; 0000F487 2E8B34
test word [cs:si],0x0f00 ; 0000F48A 2EF704000F
jz xf494 ; 0000F48F 7403
jmp xf684 ; 0000F491 E9F001
xf494: mov al,0x0 ; 0000F494 B000
out 0x80,al ; 0000F496 E680
;
; When we arrive here, the A20 line has been disabled; on most systems, that would
; mean that the ROM's GDT would only be accessible at the "low" ROM address (%0F0730),
; not the "high" address (%FF0730). But fortunately, A20 management on Compaq
; DeskPros affects wrap-around only from the 1st to the 2nd megabyte; no other address
; range is affected.
;
; FYI, it seems this code doesn't do anything if bits 6 and 7 of the RAM Settings
; register are set to anything other than 0x40 (ie, it returns to real-mode almost
; immediately after entering protected-mode).
;
lgdt [cs:0x077e] ; 0000F498 load [gdtr_hi] into GDTR
mov eax,cr0 ; 0000F49E 0F2000
or ax,0x1 ; 0000F4A1 0D0100
mov cr0,eax ; 0000F4A4 0F2200
jmp 0x28:xf4ac ; 0000F4A7 EAACF42800
xf4ac: mov ax,0x8 ; 0000F4AC B80800 '...'
mov ds,ax ; 0000F4AF 8ED8 '..'
in al,0x61 ; 0000F4B1 E461 '.a'
mov ah,al ; 0000F4B3 8AE0 '..'
or al,0x8 ; 0000F4B5 0C08 '..'
out 0x61,al ; 0000F4B7 E661 '.a'
mov al,[0x0] ; 0000F4B9 A00000 '...'
xchg ah,al ; 0000F4BC 86E0 '..'
out 0x61,al ; 0000F4BE E661 '.a'
and ah,0xc0 ; 0000F4C0 80E4C0 '...'
;
; (AH) contains only bits 6 and 7 from the RAM Settings/Diagnostics register
;
cmp ah,0x40 ; 0000F4C3 80FC40
jz xf4cb ; 0000F4C6 7403
jmp xf655 ; 0000F4C8 E98A01
xf4cb: or byte [0x2],0x40 ; 0000F4CB 800E020040 '....@'
mov ax,0x38 ; 0000F4D0 B83800 '.8.'
mov es,ax ; 0000F4D3 8EC0 '..'
mov cx,0x2000 ; 0000F4D5 B90020 '.. '
xor si,si ; 0000F4D8 33F6 '3.'
es rep lodsd ; 0000F4DA 66F326AD 'f.&.'
cld ; 0000F4DE FC '.'
mov cx,0x2000 ; 0000F4DF B90020 '.. '
xor di,di ; 0000F4E2 33FF '3.'
mov eax,0xaaaaaaaa ; 0000F4E4 66B8AAAAAAAA 'f.....'
rep stosd ; 0000F4EA 66F3AB 'f..'
mov ebx,eax ; 0000F4ED 668BD8 'f..'
mov ax,0x38 ; 0000F4F0 B83800 '.8.'
mov ds,ax ; 0000F4F3 8ED8 '..'
xor si,si ; 0000F4F5 33F6 '3.'
mov cx,0x2000 ; 0000F4F7 B90020 '.. '
xf4fa: lodsd ; 0000F4FA 66AD 'f.'
cmp eax,ebx ; 0000F4FC 663BC3 'f;.'
jz xf504 ; 0000F4FF 7403 't.'
jmp xf599 ; 0000F501 E99500 '...'
xf504: dec cx ; 0000F504 49 'I'
jz xf509 ; 0000F505 7402
jmp short xf4fa ; 0000F507 EBF1 '..'
xf509: mov cx,0x2000 ; 0000F509 B90020 '.. '
xor di,di ; 0000F50C 33FF '3.'
mov eax,0x6db66db6 ; 0000F50E 66B8B66DB66D 'f..m.m'
rep stosd ; 0000F514 66F3AB 'f..'
mov ebx,eax ; 0000F517 668BD8 'f..'
mov ax,0x38 ; 0000F51A B83800 '.8.'
mov ds,ax ; 0000F51D 8ED8 '..'
xor si,si ; 0000F51F 33F6 '3.'
mov cx,0x2000 ; 0000F521 B90020 '.. '
xf524: lodsd ; 0000F524 66AD 'f.'
cmp eax,ebx ; 0000F526 663BC3 'f;.'
jnz xf599 ; 0000F529 756E 'un'
dec cx ; 0000F52B 49 'I'
jz xf530 ; 0000F52C 7402
jmp short xf524 ; 0000F52E EBF4 '..'
xf530: mov cx,0x2000 ; 0000F530 B90020 '.. '
xor di,di ; 0000F533 33FF '3.'
mov eax,0x55555555 ; 0000F535 66B855555555 'f.UUUU'
rep stosd ; 0000F53B 66F3AB 'f..'
mov ebx,eax ; 0000F53E 668BD8 'f..'
mov ax,0x38 ; 0000F541 B83800 '.8.'
mov ds,ax ; 0000F544 8ED8 '..'
xor si,si ; 0000F546 33F6 '3.'
mov cx,0x2000 ; 0000F548 B90020 '.. '
xf54b: lodsd ; 0000F54B 66AD 'f.'
cmp eax,ebx ; 0000F54D 663BC3 'f;.'
jnz xf599 ; 0000F550 7547 'uG'
dec cx ; 0000F552 49 'I'
jz xf557 ; 0000F553 7402 't.'
jmp short xf54b ; 0000F555 EBF4 '..'
xf557: mov ax,0x30 ; 0000F557 B83000 '.0.'
mov ds,ax ; 0000F55A 8ED8 '..'
mov bx,pattern1 ; 0000F55C BB78F3 '.x.'
xf55f: mov ax,0x4 ; 0000F55F B80400 '...'
mov dx,0x7c ; 0000F562 BA7C00 '.|.'
xor di,di ; 0000F565 33FF '3.'
mov bp,0xf56d ; 0000F567 BD6DF5 '.m.'
jmp 0xf68d ; 0000F56A E92001 '. .'
mov dx,0x7c ; 0000F56D BA7C00 '.|.'
mov bp,0xf576 ; 0000F570 BD76F5 '.v.'
jmp xf68d ; 0000F573 E91701 '...'
xor di,di ; 0000F576 33FF '3.'
mov dx,0x7c ; 0000F578 BA7C00 '.|.'
mov bp,0xf581 ; 0000F57B BD81F5 '...'
jmp xe80b ; 0000F57E E98AF2 '...'
jc xf599 ; 0000F581 7216 'r.'
mov dx,0x7c ; 0000F583 BA7C00 '.|.'
mov bp,0xf58c ; 0000F586 BD8CF5 '...'
jmp xe80b ; 0000F589 E97FF2 '...'
jc xf599 ; 0000F58C 720B 'r.'
cmp bx,pattern2 ; 0000F58E 81FBFCF3 '....'
jz xf5a0 ; 0000F592 740C 't.'
mov bx,pattern2 ; 0000F594 BBFCF3 '...'
jmp short xf55f ; 0000F597 EBC6 '..'
xf599: mov al,0x1 ; 0000F599 B001 '..'
out 0x80,al ; 0000F59B E680 '..'
jmp xf63b ; 0000F59D E99B00 '...'
xf5a0: mov ax,0x8 ; 0000F5A0 B80800 '...'
mov es,ax ; 0000F5A3 8EC0 '..'
and byte [es:0x2],0xbf ; 0000F5A5 2680260200BF '&.&...'
mov ax,0x40 ; 0000F5AB B84000 '.@.'
mov es,ax ; 0000F5AE 8EC0 '..'
mov ax,0x4 ; 0000F5B0 B80400 '...'
mov bx,pattern1 ; 0000F5B3 BB78F3 '.x.'
mov dx,0x7c ; 0000F5B6 BA7C00 '.|.'
xor di,di ; 0000F5B9 33FF '3.'
mov bp,0xf5c1 ; 0000F5BB BDC1F5 '...'
jmp xf68d ; 0000F5BE E9CC00 '...'
mov dx,0x7c ; 0000F5C1 BA7C00 '.|.'
mov bp,0xf5ca ; 0000F5C4 BDCAF5 '...'
jmp xf68d ; 0000F5C7 E9C300 '...'
mov ax,0x8 ; 0000F5CA B80800 '...'
mov cx,es ; 0000F5CD 8CC1 '..'
mov es,ax ; 0000F5CF 8EC0 '..'
or byte [es:0x2],0x40 ; 0000F5D1 26800E020040 '&....@'
mov es,cx ; 0000F5D7 8EC1 '..'
mov ax,0x4 ; 0000F5D9 B80400 '...'
mov dx,0x7c ; 0000F5DC BA7C00 '.|.'
xor di,di ; 0000F5DF 33FF '3.'
mov bp,0xf5e7 ; 0000F5E1 BDE7F5 '...'
jmp xe80b ; 0000F5E4 E924F2 '.$.'
jc xf599 ; 0000F5E7 72B0 'r.'
mov dx,0x7c ; 0000F5E9 BA7C00 '.|.'
mov bp,0xf5f2 ; 0000F5EC BDF2F5 '...'
jmp xe80b ; 0000F5EF E919F2 '...'
jc xf599 ; 0000F5F2 72A5 'r.'
mov ax,0x4 ; 0000F5F4 B80400 '...'
mov bx,pattern2 ; 0000F5F7 BBFCF3 '...'
mov dx,0x7c ; 0000F5FA BA7C00 '.|.'
xor di,di ; 0000F5FD 33FF '3.'
mov bp,0xf605 ; 0000F5FF BD05F6 '...'
jmp xf68d ; 0000F602 E98800 '...'
mov dx,0x7c ; 0000F605 BA7C00 '.|.'
mov bp,0xf60e ; 0000F608 BD0EF6 '...'
jmp xf68d ; 0000F60B E97F00 '...'
mov ax,0x8 ; 0000F60E B80800 '...'
mov cx,es ; 0000F611 8CC1 '..'
mov es,ax ; 0000F613 8EC0 '..'
and byte [es:0x2],0xbf ; 0000F615 2680260200BF '&.&...'
mov es,cx ; 0000F61B 8EC1 '..'
mov ax,0x4 ; 0000F61D B80400 '...'
mov dx,0x7c ; 0000F620 BA7C00 '.|.'
xor di,di ; 0000F623 33FF '3.'
mov bp,0xf62b ; 0000F625 BD2BF6 '.+.'
jmp xe80b ; 0000F628 E9E0F1 '...'
jc xf638 ; 0000F62B 720B 'r.'
mov dx,0x7c ; 0000F62D BA7C00 '.|.'
mov bp,0xf636 ; 0000F630 BD36F6 '.6.'
jmp xe80b ; 0000F633 E9D5F1 '...'
jnc xf63b ; 0000F636 7303 's.'
xf638: jmp xf599 ; 0000F638 E95EFF '.^.'
xf63b: mov ax,0x8 ; 0000F63B B80800 '...'
mov ds,ax ; 0000F63E 8ED8 '..'
and byte [0x2],0xbf ; 0000F640 80260200BF '.&...'
mov byte [0x0],0xfc ; 0000F645 C6060000FC '.....'
in al,0x80 ; 0000F64A E480 '..'
cmp al,0x0 ; 0000F64C 3C00 '<.'
jnz xf655 ; 0000F64E 7505 'u.'
or byte [0x2],0x40 ; 0000F650 800E020040 '....@'
xf655: mov ax,0x10 ; 0000F655 B81000 '...'
mov es,ax ; 0000F658 8EC0 '..'
mov ds,ax ; 0000F65A 8ED8 '..'
mov eax,cr0 ; 0000F65C 0F2000
and eax,0x7ffffffe ; 0000F65F 6625FEFFFF7F 'f%....'
mov cr0,eax ; 0000F665 0F2200
jmp 0xf000:0xf66d ; 0000F668 EA6DF600F0 '.m...'
lidt [cs:0x0784] ; 0000F66D load [idtr_lo] into IDTR
in al,0x80 ; 0000F673 E480 '..'
cmp al,0x0 ; 0000F675 3C00 '<.'
jz xf684 ; 0000F677 740B 't.'
xor dx,dx ; 0000F679 33D2 '3.'
mov cx,err205_len ; 0000F67B B91300 '...'
mov bx,err205 ; 0000F67E BBD0B6 '...'
call xc745 ; 0000F681 E8C1D0 '...'
xf684: mov al,0x7e ; 0000F684 B07E '.~'
out 0x84,al ; 0000F686 E684 '..'
xor al,al ; 0000F688 32C0 '2.'
out 0x80,al ; 0000F68A E680 '..'
ret ; 0000F68C C3 '.'
;
; Repeatedly copy 0x84 bytes from DS:BX to ES:DI for DX iterations, followed by AX more
; bytes after DX is exhausted. DI advances, BX does not. Return to BP.
;
xf68d: mov si,bx ; 0000F68D 8BF3 '..'
mov cx,0x21 ; 0000F68F B92100 '.!.'
rep movsd ; 0000F692 66F3A5 'f..'
dec dx ; 0000F695 4A 'J'
jnz xf68d ; 0000F696 75F5 'u.'
mov si,bx ; 0000F698 8BF3 '..'
mov cx,ax ; 0000F69A 8BC8 '..'
rep movsd ; 0000F69C 66F3A5 'f..'
jmp bp ; 0000F69F FFE5 '..'
xf6a1: push ds ; 0000F6A1 1E '.'
xor ebp,ebp ; 0000F6A2 6633ED 'f3.'
xf6a5: mov eax,0x1 ; 0000F6A5 66B801000000 'f.....'
xor eax,ebp ; 0000F6AB 6633C5 'f3.'
mov cx,0x4000 ; 0000F6AE B90040 '..@'
xor di,di ; 0000F6B1 33FF '3.'
sahf ; 0000F6B3 9E '.'
xf6b4: rcl eax,1 ; 0000F6B4 66D1D0 'f..'
stosd ; 0000F6B7 66AB 'f.'
loop xf6b4 ; 0000F6B9 E2F9 '..'
in al,0x61 ; 0000F6BB E461 '.a'
or al,0xc ; 0000F6BD 0C0C '..'
out 0x61,al ; 0000F6BF E661 '.a'
and al,0xf3 ; 0000F6C1 24F3 '$.'
out 0x61,al ; 0000F6C3 E661 '.a'
mov ebx,0x1 ; 0000F6C5 66BB01000000 'f.....'
xor ebx,ebp ; 0000F6CB 6633DD 'f3.'
mov eax,ebp ; 0000F6CE 668BC5 'f..'
push es ; 0000F6D1 06 '.'
pop ds ; 0000F6D2 1F '.'
xor si,si ; 0000F6D3 33F6 '3.'
mov dh,ah ; 0000F6D5 8AF4 '..'
mov cx,0x4000 ; 0000F6D7 B90040 '..@'
xf6da: mov ah,dh ; 0000F6DA 8AE6 '..'
sahf ; 0000F6DC 9E '.'
rcl ebx,1 ; 0000F6DD 66D1D3 'f..'
lahf ; 0000F6E0 9F '.'
mov dh,ah ; 0000F6E1 8AF4 '..'
lodsd ; 0000F6E3 66AD 'f.'
xor eax,ebx ; 0000F6E5 6633C3 'f3.'
loope xf6da ; 0000F6E8 E1F0 '..'
jnz xf700 ; 0000F6EA 7514 'u.'
in al,0x61 ; 0000F6EC E461 '.a'
test al,0x40 ; 0000F6EE A840 '.@'
mov eax,0x0 ; 0000F6F0 66B800000000 'f.....'
jnz xf700 ; 0000F6F6 7508 'u.'
dec ebp ; 0000F6F8 664D 'fM'
jpe xf6a5 ; 0000F6FA 7AA9 'z.'
pop ds ; 0000F6FC 1F '.'
xor ax,ax ; 0000F6FD 33C0 '3.'
ret ; 0000F6FF C3 '.'
xf700: mov byte [si],0x0 ; 0000F700 C60400 '...'
push ax ; 0000F703 50 'P'
in al,0x61 ; 0000F704 E461 '.a'
or al,0xc ; 0000F706 0C0C '..'
out 0x61,al ; 0000F708 E661 '.a'
and al,0xf3 ; 0000F70A 24F3 '$.'
out 0x61,al ; 0000F70C E661 '.a'
pop ax ; 0000F70E 58 'X'
or eax,eax ; 0000F70F 660BC0 'f..'
jnz xf72d ; 0000F712 7519 'u.'
call x86db ; 0000F714 E8C48F '...'
xchg ah,al ; 0000F717 86E0 '..'
and ah,0xf ; 0000F719 80E40F '...'
xor si,si ; 0000F71C 33F6 '3.'
mov cl,0x4 ; 0000F71E B104 '..'
xf720: rcr ah,1 ; 0000F720 D0DC '..'
jnc xf729 ; 0000F722 7305 's.'
inc si ; 0000F724 46 'F'
loop xf720 ; 0000F725 E2F9 '..'
xor si,si ; 0000F727 33F6 '3.'
xf729: xor al,al ; 0000F729 32C0 '2.'
jmp short xf73e ; 0000F72B EB11 '..'
xf72d: sub si,byte +0x4 ; 0000F72D 83EE04 '...'
mov cx,0x4 ; 0000F730 B90400 '...'
xf733: test al,0xff ; 0000F733 A8FF '..'
jnz xf73e ; 0000F735 7507 'u.'
shr eax,0x8 ; 0000F737 66C1E808 'f...'
inc si ; 0000F73B 46 'F'
loop xf733 ; 0000F73C E2F5 '..'
xf73e: mov cl,al ; 0000F73E 8AC8 '..'
mov dx,si ; 0000F740 8BD6 '..'
pop ds ; 0000F742 1F '.'
stc ; 0000F743 F9 '.'
ret ; 0000F744 C3 '.'
xf745: pusha ; 0000F745 60 '`'
push ds ; 0000F746 1E '.'
push gs ; 0000F747 0FA8 '..'
push fs ; 0000F749 0FA0 '..'
mov al,0x75 ; 0000F74B B075 '.u'
out 0x84,al ; 0000F74D E684 '..'
mov ax,0x40 ; 0000F74F B84000 '.@.'
mov ds,ax ; 0000F752 8ED8 '..'
mov [0x67],sp ; 0000F754 89266700 '.&g.'
mov [0x69],ss ; 0000F758 8C166900 '..i.'
mov cx,0x0 ; 0000F75C B90000 '...'
mov al,0x76 ; 0000F75F B076 '.v'
out 0x84,al ; 0000F761 E684 '..'
push cx ; 0000F763 51 'Q'
call x80e2 ; 0000F764 E87B89 '.{.'
pop cx ; 0000F767 59 'Y'
jz xf770 ; 0000F768 7406 't.'
or cl,0x1 ; 0000F76A 80C901 '...'
jmp xf800 ; 0000F76D E99000 '...'
xf770: mov al,0x77 ; 0000F770 B077 '.w'
out 0x84,al ; 0000F772 E684 '..'
push cx ; 0000F774 51 'Q'
xor bx,bx ; 0000F775 33DB '3.'
pop cx ; 0000F777 59 'Y'
or bx,bx ; 0000F778 0BDB '..'
jz xf782 ; 0000F77A 7406 't.'
or cl,0x2 ; 0000F77C 80C902 '...'
jmp short xf782 ; 0000F77F EB01 '..'
nop ; 0000F781 90 '.'
xf782: mov al,cl ; 0000F782 8AC1 '..'
out 0x80,al ; 0000F784 E680 '..'
mov ah,0x6 ; 0000F786 B406 '..'
or cl,cl ; 0000F788 0AC9 0x0A,'.'
jz xf78e ; 0000F78A 7402 't.'
mov ah,0x7 ; 0000F78C B407 '..'
xf78e: mov al,0x78 ; 0000F78E B078 '.x'
out 0x84,al ; 0000F790 E684 '..'
push ax ; 0000F792 50 'P'
in al,0x60 ; 0000F793 E460 '.`'
mov al,0x20 ; 0000F795 B020 '. '
out 0x64,al ; 0000F797 E664 '.d'
call xec2e_wait_8042_ready ; 0000F799 E892F4 '...'
xf79c: in al,0x64 ; 0000F79C E464 '.d'
test al,0x1 ; 0000F79E A801 '..'
jz xf79c ; 0000F7A0 74FA 't.'
in al,0x60 ; 0000F7A2 E460 '.`'
mov ah,al ; 0000F7A4 8AE0 '..'
or ah,0x4 ; 0000F7A6 80CC04 '...'
push ax ; 0000F7A9 50 'P'
call xec2e_wait_8042_ready ; 0000F7AA E881F4 '...'
pop ax ; 0000F7AD 58 'X'
mov al,0x60 ; 0000F7AE B060 '.`'
out 0x64,al ; 0000F7B0 E664 '.d'
push ax ; 0000F7B2 50 'P'
call xec2e_wait_8042_ready ; 0000F7B3 E878F4 '.x.'
pop ax ; 0000F7B6 58 'X'
mov al,ah ; 0000F7B7 8AC4 '..'
out 0x60,al ; 0000F7B9 E660 '.`'
pop ax ; 0000F7BB 58 'X'
mov al,0x8f ; 0000F7BC B08F '..'
call xb549 ; 0000F7BE E888BD '...'
call xec2e_wait_8042_ready ; 0000F7C1 E86AF4 '.j.'
mov al,0xfe ; 0000F7C4 B0FE '..'
out 0x64,al ; 0000F7C6 E664 '.d'
xf7c8: hlt ; 0000F7C8 F4 '.'
jmp short xf7c8 ; 0000F7C9 EBFD '..'
mov al,0x79 ; 0000F7CB B079 '.y'
out 0x84,al ; 0000F7CD E684 '..'
clc ; 0000F7CF F8 '.'
jmp short xf7d8 ; 0000F7D0 EB06 '..'
nop ; 0000F7D2 90 '.'
mov al,0x7a ; 0000F7D3 B07A '.z'
out 0x84,al ; 0000F7D5 E684 '..'
stc ; 0000F7D7 F9 '.'
xf7d8: mov ax,0x40 ; 0000F7D8 B84000 '.@.'
mov ds,ax ; 0000F7DB 8ED8 '..'
mov ss,[0x69] ; 0000F7DD 8E166900 '..i.'
mov sp,[0x67] ; 0000F7E1 8B266700 '.&g.'
jc xf7ea ; 0000F7E5 7203 'r.'
jmp short xf812 ; 0000F7E7 EB29 '.)'
nop ; 0000F7E9 90 '.'
xf7ea: in al,0x80 ; 0000F7EA E480 '..'
mov cl,al ; 0000F7EC 8AC8 '..'
test cl,0x2 ; 0000F7EE F6C102 '...'
jz xf800 ; 0000F7F1 740D 't',0x0D
mov dx,0x0 ; 0000F7F3 BA0000 '...'
mov bx,err102 ; 0000F7F6 BB8CB6 '...'
mov cx,err102_len ; 0000F7F9 B91A00 '...'
call xc745 ; 0000F7FC E846CF '.F.'
hlt ; 0000F7FF F4 '.'
xf800: test cl,0x1 ; 0000F800 F6C101 '...'
jz xf812 ; 0000F803 740D 't',0x0D
mov dx,0x0 ; 0000F805 BA0000 '...'
mov bx,err102 ; 0000F808 BB8CB6 '...'
mov cx,err102_len ; 0000F80B B91A00 '...'
call xc745 ; 0000F80E E834CF '.4.'
hlt ; 0000F811 F4 '.'
xf812: mov al,0x7b ; 0000F812 B07B '.{'
out 0x84,al ; 0000F814 E684 '..'
pop fs ; 0000F816 0FA1 '..'
pop gs ; 0000F818 0FA9 '..'
pop ds ; 0000F81A 1F '.'
popa ; 0000F81B 61 'a'
ret ; 0000F81C C3 '.'
mov ax,0x0 ; 0000F81D B80000 '...'
iret ; 0000F820 CF '.'
sbb ax,0x30f8 ; 0000F821 1DF830 '..0'
add [bx+si],al ; 0000F824 0000 '..'
xchg al,[bx+si] ; 0000F826 8600 '..'
add bh,bh ; 0000F828 00FF '..'
times 23 db 0xFF ; 0000F82A - 0000F840
sti ; 0000F841 FB '.'
push ds ; 0000F842 1E '.'
mov ax,0x40 ; 0000F843 B84000 '.@.'
mov ds,ax ; 0000F846 8ED8 '..'
mov ax,[0x13] ; 0000F848 A11300 '...'
pop ds ; 0000F84B 1F '.'
iret ; 0000F84C CF '.'
call x9e82 ; 0000F84D E832A6 '.2.'
iret ; 0000F850 CF '.'
db '********'
cmp ah,0x7f ; 0000F859 80FC7F '...'
jna xf8aa ; 0000F85C 764C 'vL'
cmp ah,0xc0 ; 0000F85E 80FCC0 '...'
jz xf87a ; 0000F861 7417 't.'
cmp ah,0x92 ; 0000F863 80FC92 '...'
jnc xf8aa ; 0000F866 7342 'sB'
push di ; 0000F868 57 'W'
mov di,ax ; 0000F869 8BF8 '..'
xf86b: and di,0x7f00 ; 0000F86B 81E7007F '....'
shr di,0x7 ; 0000F86F C1EF07 '...'
call near [cs:di+0xf884] ; 0000F872 2EFF9584F8 '.....'
jmp short xf880 ; 0000F877 EB07 '..'
nop ; 0000F879 90 '.'
xf87a: push di ; 0000F87A 57 'W'
mov di,0x9200 ; 0000F87B BF0092 '...'
jmp short xf86b ; 0000F87E EBEB '..'
xf880: pop di ; 0000F880 5F '_'
retf 0x2 ; 0000F881 CA0200 '...'
ret 0xc4f8 ; 0000F884 C2F8C4 '...'
clc ; 0000F887 F8 '.'
db 0xC6 ; 0000F888 C6 '.'
clc ; 0000F889 F8 '.'
pop cx ; 0000F88A 59 'Y'
mov ax,[0xa1d9] ; 0000F88B A1D9A1 '...'
enter 0x8ef8,0xa2 ; 0000F88E C8F88EA2 '....'
shl word [bp+si+0xa49d],cl ; 0000F892 D3A29DA4 '....'
lodsb ; 0000F896 AC '.'
movsb ; 0000F897 A4 '.'
mov si,0xbef8 ; 0000F898 BEF8BE '...'
clc ; 0000F89B F8 '.'
mov si,0xbef8 ; 0000F89C BEF8BE '...'
clc ; 0000F89F F8 '.'
mov si,0xbef8 ; 0000F8A0 BEF8BE '...'
clc ; 0000F8A3 F8 '.'
retf 0xccf8 ; 0000F8A4 CAF8CC '...'
clc ; 0000F8A7 F8 '.'
db 0x88 ; 0000F8A8 88 '.'
movsw ; 0000F8A9 A5 '.'
xf8aa: cmp ah,0x4f ; 0000F8AA 80FC4F '..O'
jnz xf8b3 ; 0000F8AD 7504 'u.'
stc ; 0000F8AF F9 '.'
retf 0x2 ; 0000F8B0 CA0200 '...'
xf8b3: sti ; 0000F8B3 FB '.'
mov ah,0x86 ; 0000F8B4 B486 '..'
stc ; 0000F8B6 F9 '.'
retf 0x2 ; 0000F8B7 CA0200 '...'
xf8ba: sti ; 0000F8BA FB '.'
xor ah,ah ; 0000F8BB 32E4 '2.'
ret ; 0000F8BD C3 '.'
pop di ; 0000F8BE 5F '_'
pop di ; 0000F8BF 5F '_'
jmp short xf8aa ; 0000F8C0 EBE8 '..'
jmp short xf8ba ; 0000F8C2 EBF6 '..'
jmp short xf8ba ; 0000F8C4 EBF4 '..'
jmp short xf8ba ; 0000F8C6 EBF2 '..'
jmp short xf8ba ; 0000F8C8 EBF0 '..'
jmp short xf8ba ; 0000F8CA EBEE '..'
pop di ; 0000F8CC 5F '_'
pop di ; 0000F8CD 5F '_'
xor ah,ah ; 0000F8CE 32E4 '2.'
iret ; 0000F8D0 CF '.'
;
; 11 pairs of I/O ports/values for early I/O port (eg, PIC) initialization
;
xf8d1: db 0xF1,0x00
db 0x20,0x11
db 0x21,0x08
db 0x21,0x04
db 0x21,0x01
db 0x21,0xFF
db 0xA0,0x11
db 0xA1,0x70
db 0xA1,0x02
db 0xA1,0x01
db 0xA1,0xFF
xf8e7: dw 0xba95 ; SHUTDOWN 0x00
dw 0xba95 ; SHUTDOWN 0x01
dw 0xd9ca ; SHUTDOWN 0x02
dw 0xd9d4 ; SHUTDOWN 0x03
dw 0xfa21 ; SHUTDOWN 0x04
dw 0xfa17 ; SHUTDOWN 0x05
dw 0xf7cb ; SHUTDOWN 0x06
dw 0xf7d3 ; SHUTDOWN 0x07
dw 0xf7d3 ; SHUTDOWN 0x08
;
; The entry for 0x09 is empty because the ROM dispatches directly to xa43c,
; bypassing I/O port (eg, PIC) re-initialization.
;
dw 0x0000 ; SHUTDOWN 0x09
;
; The entry for 0x0a seems useless, because the ROM dispatches directly to xfa0a,
; also bypassing I/O port (eg, PIC) re-initialization.
;
dw 0xfa0a ; SHUTDOWN 0x0a
;
; ROM dispatch addresses
;
xf8fd: dw 0x0003,0xe000
xf901: dw 0x0003,0xc800
reset: mov al,0x0 ; 0000F905 B000 '..'
out 0x84,al ; 0000F907 E684 '..'
mov al,0x0 ; 0000F909 B000 '..'
out 0x85,al ; 0000F90B E685 '..'
mov ah,0x2 ; 0000F90D B402 '..'
sahf ; 0000F90F 9E '.'
cli ; 0000F910 FA '.'
mov ax,0xfff0 ; 0000F911 B8F0FF '...'
lmsw ax ; 0000F914 0F01F0 '...'
mov ax,0x40 ; 0000F917 B84000 '.@.'
mov ds,ax ; 0000F91A 8ED8 '..'
in al,0x64 ; 0000F91C E464 '.d'
test al,0x4 ; 0000F91E A804 '..'
jnz xf984 ; 0000F920 7562 'ub'
mov gs,dx ; 0000F922 8EEA '..'
mov al,0x1 ; 0000F924 B001 '..'
out 0x84,al ; 0000F926 E684 '..'
mov al,0xaa ; 0000F928 B0AA '..'
out 0x64,al ; 0000F92A E664 '.d'
mov cx,0xffff ; 0000F92C B9FFFF '...'
xf92f: in al,0x64 ; 0000F92F E464 '.d'
test al,0x1 ; 0000F931 A801 '..'
jnz xf93a ; 0000F933 7505 'u.'
loop xf92f ; 0000F935 E2F8 '..'
jmp short xf976 ; 0000F937 EB3D '.='
nop ; 0000F939 90 '.'
xf93a: mov al,0x2 ; 0000F93A B002 '..'
out 0x84,al ; 0000F93C E684 '..'
in al,0x60 ; 0000F93E E460 '.`'
mov al,0x3 ; 0000F940 B003 '..'
out 0x84,al ; 0000F942 E684 '..'
mov al,0x4 ; 0000F944 B004 '..'
out 0x84,al ; 0000F946 E684 '..'
mov ax,0xe000 ; 0000F948 B800E0 '...'
mov ds,ax ; 0000F94B 8ED8 '..'
xor bx,bx ; 0000F94D 33DB '3.'
cmp word [bx],0x55aa ; 0000F94F 813FAA55 '.?.U'
jnz xf95d ; 0000F953 7508 'u.'
mov bp,0xf976 ; 0000F955 BD76F9 '.v.'
jmp far [cs:0xf8fd] ; 0000F958 2EFF2EFDF8 '.....'
xf95d: mov al,0x5 ; 0000F95D B005 '..'
out 0x84,al ; 0000F95F E684 '..'
mov ax,0xc800 ; 0000F961 B800C8 '...'
mov ds,ax ; 0000F964 8ED8 '..'
xor bx,bx ; 0000F966 33DB '3.'
cmp word [bx],0x55aa ; 0000F968 813FAA55 '.?.U'
jnz xf976 ; 0000F96C 7508 'u.'
mov bp,0xf976 ; 0000F96E BD76F9 '.v.'
jmp far [cs:0xf901] ; 0000F971 2EFF2E01F9 '.....'
xf976: mov al,0x6 ; 0000F976 B006 '..'
out 0x84,al ; 0000F978 E684 '..'
mov ax,0x40 ; 0000F97A B84000 '.@.'
mov ds,ax ; 0000F97D 8ED8 '..'
mov ax,0x0 ; 0000F97F B80000 '...'
jmp short xf992 ; 0000F982 EB0E '..'
xf984: mov al,0x7 ; 0000F984 B007 '..'
out 0x84,al ; 0000F986 E684 '..'
;
; Request the CMOS SHUTDOWN byte at CMOS address 0x0F, and then zero it
;
mov al,0x8f ; 0000F988 B08F '..'
out 0x70,al ; 0000F98A E670 '.p'
jmp $+2 ; 0000F98C EB00 '..'
jmp $+2 ; 0000F98E EB00 '..'
in al,0x71 ; 0000F990 E471 '.q'
xf992: mov bx,ax ; 0000F992 8BD8 '..'
mov al,0x8f ; 0000F994 B08F '..'
out 0x70,al ; 0000F996 E670 '.p'
jmp $+2 ; 0000F998 EB00 '..'
jmp $+2 ; 0000F99A EB00 '..'
mov al,0x0 ; 0000F99C B000 '..'
out 0x71,al ; 0000F99E E671 '.q'
;
; Special CMOS SHUTDOWN dispatch for 0x09
;
cmp bl,0x9 ; 0000F9A0 80FB09 '...'
jnz xf9a8 ; 0000F9A3 7503 'u.'
jmp xa43c ; 0000F9A5 E994AA '...'
xf9a8: mov al,0x8 ; 0000F9A8 B008 '..'
out 0x84,al ; 0000F9AA E684 '..'
;
; Special CMOS SHUTDOWN dispatch for 0x0a
;
cmp bl,0xa ; 0000F9AC 80FB0A '..',0x0A
jnz xf9b4 ; 0000F9AF 7503 'u.'
jmp short xfa0a ; 0000F9B1 EB57 '.W'
nop ; 0000F9B3 90 '.'
xf9b4: xor al,al ; 0000F9B4 32C0 '2.'
out 0xf1,al ; 0000F9B6 E6F1 '..'
mov ax,0xf000 ; 0000F9B8 B800F0 '...'
mov ds,ax ; 0000F9BB 8ED8 '..'
xor dx,dx ; 0000F9BD 33D2 '3.'
mov si,xf8d1 ; 0000F9BF BED1F8 '...'
mov cx,0xb ; 0000F9C2 B90B00 '...'
xf9c5: lodsb ; 0000F9C5 AC '.'
mov dl,al ; 0000F9C6 8AD0 '..'
lodsb ; 0000F9C8 AC '.'
out dx,al ; 0000F9C9 EE '.'
loop xf9c5 ; 0000F9CA E2F9 '..'
mov dx,0xa0 ; 0000F9CC BAA000 '...'
xf9cf: mov cx,0x8 ; 0000F9CF B90800 '...'
xf9d2: mov al,0xb ; 0000F9D2 B00B '..'
out dx,al ; 0000F9D4 EE '.'
in al,dx ; 0000F9D5 EC '.'
or al,al ; 0000F9D6 0AC0 0x0A,'.'
jz xf9df ; 0000F9D8 7405
mov al,0x20 ; 0000F9DA B020 '. '
out dx,al ; 0000F9DC EE '.'
loop xf9d2 ; 0000F9DD E2F3 '..'
xf9df: cmp dx,byte +0x20 ; 0000F9DF 83FA20 '.. '
jz xf9e9 ; 0000F9E2 7405 't.'
mov dx,0x20 ; 0000F9E4 BA2000 '. .'
jmp short xf9cf ; 0000F9E7 EBE6 '..'
xf9e9: mov al,0x0 ; 0000F9E9 B000 '..'
out 0x20,al ; 0000F9EB E620 '. '
out 0xa0,al ; 0000F9ED E6A0 '..'
mov al,0x9 ; 0000F9EF B009 '..'
out 0x84,al ; 0000F9F1 E684 '..'
;
; Verify that the CMOS SHUTDOWN byte is <= 0x0B (and if not, set it to 0x00)
;
; NOTE: This test permits 0x0B, but there is no entry for 0x0B in the table at xf8e7.
;
cmp bl,0xb ; 0000F9F3 80FB0B '...'
jna xf9fa ; 0000F9F6 7602 'v.'
mov bl,0x0 ; 0000F9F8 B300 '..'
;
; Dispatch according to the CMOS SHUTDOWN byte
;
xf9fa: xor bh,bh ; 0000F9FA 32FF '2.'
shl bl,1 ; 0000F9FC D0E3 '..'
mov si,[cs:bx+xf8e7] ; 0000F9FE 2E8BB7E7F8 '.....'
mov ax,0x40 ; 0000FA03 B84000 '.@.'
mov ds,ax ; 0000FA06 8ED8 '..'
jmp si ; 0000FA08 FFE6 '..'
xfa0a: mov al,0xa ; 0000FA0A B00A '.',0x0A
out 0x84,al ; 0000FA0C E684 '..'
mov ax,0x40 ; 0000FA0E B84000 '.@.'
mov ds,ax ; 0000FA11 8ED8 '..'
jmp far [0x67] ; 0000FA13 FF2E6700 '..g.'
mov al,0xb ; 0000FA17 B00B '..'
out 0x84,al ; 0000FA19 E684 '..'
mov al,0x20 ; 0000FA1B B020 '. '
out 0x20,al ; 0000FA1D E620 '. '
jmp short xfa0a ; 0000FA1F EBE9 '..'
mov al,0xc ; 0000FA21 B00C '..'
out 0x84,al ; 0000FA23 E684 '..'
in al,0x61 ; 0000FA25 E461 '.a'
and al,0xf3 ; 0000FA27 24F3 '$.'
out 0x61,al ; 0000FA29 E661 '.a'
mov al,0xe ; 0000FA2B B00E '..'
out 0x70,al ; 0000FA2D E670 '.p'
;
; Begin warm boot
;
int 0x19 ; 0000FA2F CD19 '..'
db 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ; 0000FA31
db 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ; 0000FA40
db 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ; 0000FA50
db 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00 ; 0000FA60
db 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x81,0xA5,0x81,0xBD,0x99,0x81,0x7E,0x7E,0xFF ; 0000FA70
db 0xDB,0xFF,0xC3,0xE7,0xFF,0x7E,0x6C,0xFE,0xFE,0xFE,0x7C,0x38,0x10,0x00,0x10,0x38 ; 0000FA80
db 0x7C,0xFE,0x7C,0x38,0x10,0x00,0x38,0x7C,0x38,0xFE,0xFE,0x7C,0x38,0x7C,0x10,0x10 ; 0000FA90
db 0x38,0x7C,0xFE,0x7C,0x38,0x7C,0x00,0x00,0x18,0x3C,0x3C,0x18,0x00,0x00,0xFF,0xFF ; 0000FAA0
db 0xE7,0xC3,0xC3,0xE7,0xFF,0xFF,0x00,0x3C,0x66,0x42,0x42,0x66,0x3C,0x00,0xFF,0xC3 ; 0000FAB0
db 0x99,0xBD,0xBD,0x99,0xC3,0xFF,0x0F,0x07,0x0F,0x7D,0xCC,0xCC,0xCC,0x78,0x3C,0x66 ; 0000FAC0
db 0x66,0x66,0x3C,0x18,0x7E,0x18,0x3F,0x33,0x3F,0x30,0x30,0x70,0xF0,0xE0,0x7F,0x63 ; 0000FAD0
db 0x7F,0x63,0x63,0x67,0xE6,0xC0,0x99,0x5A,0x3C,0xE7,0xE7,0x3C,0x5A,0x99,0x80,0xE0 ; 0000FAE0
db 0xF8,0xFE,0xF8,0xE0,0x80,0x00,0x02,0x0E,0x3E,0xFE,0x3E,0x0E,0x02,0x00,0x18,0x3C ; 0000FAF0
db 0x7E,0x18,0x18,0x7E,0x3C,0x18,0x66,0x66,0x66,0x66,0x66,0x00,0x66,0x00,0x7F,0xDB ; 0000FB00
db 0xDB,0x7B,0x1B,0x1B,0x1B,0x00,0x3E,0x63,0x38,0x6C,0x6C,0x38,0xCC,0x78,0x00,0x00 ; 0000FB10
db 0x00,0x00,0x7E,0x7E,0x7E,0x00,0x18,0x3C,0x7E,0x18,0x7E,0x3C,0x18,0xFF,0x18,0x3C ; 0000FB20
db 0x7E,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x7E,0x3C,0x18,0x00,0x00,0x18 ; 0000FB30
db 0x0C,0xFE,0x0C,0x18,0x00,0x00,0x00,0x30,0x60,0xFE,0x60,0x30,0x00,0x00,0x00,0x00 ; 0000FB40
db 0xC0,0xC0,0xC0,0xFE,0x00,0x00,0x00,0x24,0x66,0xFF,0x66,0x24,0x00,0x00,0x00,0x18 ; 0000FB50
db 0x3C,0x7E,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0x7E,0x3C,0x18,0x00,0x00,0x00,0x00 ; 0000FB60
db 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x78,0x78,0x30,0x30,0x00,0x30,0x00,0x6C,0x6C ; 0000FB70
db 0x6C,0x00,0x00,0x00,0x00,0x00,0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00,0x30,0x7C ; 0000FB80
db 0xC0,0x78,0x0C,0xF8,0x30,0x00,0x00,0xC6,0xCC,0x18,0x30,0x66,0xC6,0x00,0x38,0x6C ; 0000FB90
db 0x38,0x76,0xDC,0xCC,0x76,0x00,0x60,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x18,0x30 ; 0000FBA0
db 0x60,0x60,0x60,0x30,0x18,0x00,0x60,0x30,0x18,0x18,0x18,0x30,0x60,0x00,0x00,0x66 ; 0000FBB0
db 0x3C,0xFF,0x3C,0x66,0x00,0x00,0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00,0x00,0x00 ; 0000FBC0
db 0x00,0x00,0x00,0x30,0x30,0x60,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00 ; 0000FBD0
db 0x00,0x00,0x00,0x30,0x30,0x00,0x06,0x0C,0x18,0x30,0x60,0xC0,0x80,0x00,0x7C,0xC6 ; 0000FBE0
db 0xCE,0xDE,0xF6,0xE6,0x7C,0x00,0x30,0x70,0x30,0x30,0x30,0x30,0xFC,0x00,0x78,0xCC ; 0000FBF0
db 0x0C,0x38,0x60,0xCC,0xFC,0x00,0x78,0xCC,0x0C,0x38,0x0C,0xCC,0x78,0x00,0x1C,0x3C ; 0000FC00
db 0x6C,0xCC,0xFE,0x0C,0x1E,0x00,0xFC,0xC0,0xF8,0x0C,0x0C,0xCC,0x78,0x00,0x38,0x60 ; 0000FC10
db 0xC0,0xF8,0xCC,0xCC,0x78,0x00,0xFC,0xCC,0x0C,0x18,0x30,0x30,0x30,0x00,0x78,0xCC ; 0000FC20
db 0xCC,0x78,0xCC,0xCC,0x78,0x00,0x78,0xCC,0xCC,0x7C,0x0C,0x18,0x70,0x00,0x00,0x30 ; 0000FC30
db 0x30,0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x60,0x18,0x30 ; 0000FC40
db 0x60,0xC0,0x60,0x30,0x18,0x00,0x00,0x00,0xFC,0x00,0x00,0xFC,0x00,0x00,0x60,0x30 ; 0000FC50
db 0x18,0x0C,0x18,0x30,0x60,0x00,0x78,0xCC,0x0C,0x18,0x30,0x00,0x30,0x00,0x7C,0xC6 ; 0000FC60
db 0xDE,0xDE,0xDE,0xC0,0x78,0x00,0x30,0x78,0xCC,0xCC,0xFC,0xCC,0xCC,0x00,0xFC,0x66 ; 0000FC70
db 0x66,0x7C,0x66,0x66,0xFC,0x00,0x3C,0x66,0xC0,0xC0,0xC0,0x66,0x3C,0x00,0xF8,0x6C ; 0000FC80
db 0x66,0x66,0x66,0x6C,0xF8,0x00,0xFE,0x62,0x68,0x78,0x68,0x62,0xFE,0x00,0xFE,0x62 ; 0000FC90
db 0x68,0x78,0x68,0x60,0xF0,0x00,0x3C,0x66,0xC0,0xC0,0xCE,0x66,0x3E,0x00,0xCC,0xCC ; 0000FCA0
db 0xCC,0xFC,0xCC,0xCC,0xCC,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x1E,0x0C ; 0000FCB0
db 0x0C,0x0C,0xCC,0xCC,0x78,0x00,0xE6,0x66,0x6C,0x78,0x6C,0x66,0xE6,0x00,0xF0,0x60 ; 0000FCC0
db 0x60,0x60,0x62,0x66,0xFE,0x00,0xC6,0xEE,0xFE,0xFE,0xD6,0xC6,0xC6,0x00,0xC6,0xE6 ; 0000FCD0
db 0xF6,0xDE,0xCE,0xC6,0xC6,0x00,0x38,0x6C,0xC6,0xC6,0xC6,0x6C,0x38,0x00,0xFC,0x66 ; 0000FCE0
db 0x66,0x7C,0x60,0x60,0xF0,0x00,0x78,0xCC,0xCC,0xCC,0xDC,0x78,0x1C,0x00,0xFC,0x66 ; 0000FCF0
db 0x66,0x7C,0x6C,0x66,0xE6,0x00,0x78,0xCC,0xE0,0x70,0x1C,0xCC,0x78,0x00,0xFC,0xB4 ; 0000FD00
db 0x30,0x30,0x30,0x30,0x78,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xFC,0x00,0xCC,0xCC ; 0000FD10
db 0xCC,0xCC,0xCC,0x78,0x30,0x00,0xC6,0xC6,0xC6,0xD6,0xFE,0xEE,0xC6,0x00,0xC6,0xC6 ; 0000FD20
db 0x6C,0x38,0x38,0x6C,0xC6,0x00,0xCC,0xCC,0xCC,0x78,0x30,0x30,0x78,0x00,0xFE,0xC6 ; 0000FD30
db 0x8C,0x18,0x32,0x66,0xFE,0x00,0x78,0x60,0x60,0x60,0x60,0x60,0x78,0x00,0xC0,0x60 ; 0000FD40
db 0x30,0x18,0x0C,0x06,0x02,0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x78,0x00,0x10,0x38 ; 0000FD50
db 0x6C,0xC6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x30,0x30 ; 0000FD60
db 0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x0C,0x7C,0xCC,0x76,0x00,0xE0,0x60 ; 0000FD70
db 0x60,0x7C,0x66,0x66,0xDC,0x00,0x00,0x00,0x78,0xCC,0xC0,0xCC,0x78,0x00,0x1C,0x0C ; 0000FD80
db 0x0C,0x7C,0xCC,0xCC,0x76,0x00,0x00,0x00,0x78,0xCC,0xFC,0xC0,0x78,0x00,0x38,0x6C ; 0000FD90
db 0x60,0xF0,0x60,0x60,0xF0,0x00,0x00,0x00,0x76,0xCC,0xCC,0x7C,0x0C,0xF8,0xE0,0x60 ; 0000FDA0
db 0x6C,0x76,0x66,0x66,0xE6,0x00,0x30,0x00,0x70,0x30,0x30,0x30,0x78,0x00,0x0C,0x00 ; 0000FDB0
db 0x0C,0x0C,0x0C,0xCC,0xCC,0x78,0xE0,0x60,0x66,0x6C,0x78,0x6C,0xE6,0x00,0x70,0x30 ; 0000FDC0
db 0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00,0xCC,0xFE,0xFE,0xD6,0xC6,0x00,0x00,0x00 ; 0000FDD0
db 0xF8,0xCC,0xCC,0xCC,0xCC,0x00,0x00,0x00,0x78,0xCC,0xCC,0xCC,0x78,0x00,0x00,0x00 ; 0000FDE0
db 0xDC,0x66,0x66,0x7C,0x60,0xF0,0x00,0x00,0x76,0xCC,0xCC,0x7C,0x0C,0x1E,0x00,0x00 ; 0000FDF0
db 0xDC,0x76,0x66,0x60,0xF0,0x00,0x00,0x00,0x7C,0xC0,0x78,0x0C,0xF8,0x00,0x10,0x30 ; 0000FE00
db 0x7C,0x30,0x30,0x34,0x18,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00 ; 0000FE10
db 0xCC,0xCC,0xCC,0x78,0x30,0x00,0x00,0x00,0xC6,0xD6,0xFE,0xFE,0x6C,0x00,0x00,0x00 ; 0000FE20
db 0xC6,0x6C,0x38,0x6C,0xC6,0x00,0x00,0x00,0xCC,0xCC,0xCC,0x7C,0x0C,0xF8,0x00,0x00 ; 0000FE30
db 0xFC,0x98,0x30,0x64,0xFC,0x00,0x1C,0x30,0x30,0xE0,0x30,0x30,0x1C,0x00,0x18,0x18 ; 0000FE40
db 0x18,0x00,0x18,0x18,0x18,0x00,0xE0,0x30,0x30,0x1C,0x30,0x30,0xE0,0x00,0x76,0xDC ; 0000FE50
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xFE,0x00 ; 0000FE60
sti ; 0000FE6E FB
push bx ; 0000FE6F 53
mov bl,ah ; 0000FE70 8ADC
xor bh,bh ; 0000FE72 32FF
cmp bx,0x7 ; 0000FE74 81FB0700
ja xfe81 ; 0000FE78 7707
shl bx,1 ; 0000FE7A D1E3
jmp near [cs:bx+0xfe85] ; 0000FE7C 2EFFA785FE
xfe81: xor ah,ah ; 0000FE81 32E4
pop bx ; 0000FE83 5B
iret ; 0000FE84 CF
db 0xBD,0x9C,0xD9,0x9C,0xF4,0x9C,0x1D,0x9D,0x50,0x9D,0x72,0x9D,0xAA,0x9D,0xF1,0x9D,0xFF ; 0000FE85-0000FE95
xfe96: and byte [0x003f],0xf0 ; 0000FE96 80263F00F0
xfe9b: int 0x1c ; 0000FE9B CD1C '..'
mov al,0x20 ; 0000FE9D B020 '. '
out 0x20,al ; 0000FE9F E620 '. '
pop dx ; 0000FEA1 5A 'Z'
pop ax ; 0000FEA2 58 'X'
pop ds ; 0000FEA3 1F '.'
iret ; 0000FEA4 CF '.'
push ds ; 0000FEA5 1E '.'
push ax ; 0000FEA6 50 'P'
push dx ; 0000FEA7 52 'R'
mov ax,0x40 ; 0000FEA8 B84000 '.@.'
mov ds,ax ; 0000FEAB 8ED8 '..'
inc word [0x6c] ; 0000FEAD FF066C00 '..l.'
jnz xfeb7 ; 0000FEB1 7504 'u.'
inc word [0x6e] ; 0000FEB3 FF066E00 '..n.'
xfeb7: cmp word [0x6e],byte +0x18 ; 0000FEB7 833E6E0018 '.>n..'
jnz xfed1 ; 0000FEBC 7513 'u.'
mov ax,0xb0 ; 0000FEBE B8B000 '...'
sub ax,[0x6c] ; 0000FEC1 2B066C00 '+.l.'
jnz xfed1 ; 0000FEC5 750A 'u',0x0A
mov [0x6c],ax ; 0000FEC7 A36C00 '.l.'
mov [0x6e],ax ; 0000FECA A36E00 '.n.'
inc ax ; 0000FECD 40 '@'
mov [0x70],al ; 0000FECE A27000 '.p.'
xfed1: mov al,[0x40] ; 0000FED1 A04000 '.@.'
cmp al,0xff ; 0000FED4 3CFF '<.'
jnz xfef7 ; 0000FED6 751F 'u.'
test byte [0x3f],0x7 ; 0000FED8 F6063F0007 '..?..'
jz xfef7 ; 0000FEDD 7418 't.'
in al,0x86 ; 0000FEDF E486 '..'
test al,0x80 ; 0000FEE1 A880 '..'
jz xfef7 ; 0000FEE3 7412 't.'
test al,0x40 ; 0000FEE5 A840 '.@'
jz xfef7 ; 0000FEE7 740E 't.'
and al,0x3f ; 0000FEE9 243F '$?'
out 0x86,al ; 0000FEEB E686 '..'
mov al,0x92 ; 0000FEED B092 '..'
out 0x4b,al ; 0000FEEF E64B '.K'
mov al,[cs:0x67dd] ; 0000FEF1 2EA0DD67 '...g'
out 0x4a,al ; 0000FEF5 E64A '.J'
xfef7: dec byte [0x40] ; 0000FEF7 FE0E4000 '..@.'
jnz xfe9b ; 0000FEFB 759E 'u.'
mov al,0xc ; 0000FEFD B00C '..'
mov dx,0x3f2 ; 0000FEFF BAF203 '...'
out dx,al ; 0000FF02 EE '.'
test byte [0x3f],0x7 ; 0000FF03 F6063F0007 '..?..'
jz xfe96 ; 0000FF08 748C
in al,0x86 ; 0000FF0A E486 '..'
test al,0x80 ; 0000FF0C A880 '..'
jnz xfe96 ; 0000FF0E 7586
test al,0x40 ; 0000FF10 A840 '.@'
jnz xfe96 ; 0000FF12 7582
or al,0xc0 ; 0000FF14 0CC0 '..'
out 0x86,al ; 0000FF16 E686 '..'
mov al,0x92 ; 0000FF18 B092 '..'
out 0x4b,al ; 0000FF1A E64B '.K'
jmp xfe96 ; 0000FF1C E977FF
times 4 db 0xFF ; 0000FF1F - 0000FF22
jmp xe900 ; 0000FF23 E9DAE9 '...'
times 44 db 0xFF ; 0000FF26 - 0000FF51
dec di ; 0000FF52 FFCF '..'
pusha ; 0000FF54 60 '`'
push ds ; 0000FF55 1E '.'
xor dx,dx ; 0000FF56 33D2 '3.'
mov ah,0x2 ; 0000FF58 B402 '..'
int 0x17 ; 0000FF5A CD17 '..'
test ah,0x80 ; 0000FF5C F6C480 '...'
jz xffb3 ; 0000FF5F 7452 'tR'
mov bx,0x40 ; 0000FF61 BB4000 '.@.'
mov ds,bx ; 0000FF64 8EDB '..'
mov al,0x1 ; 0000FF66 B001 '..'
xchg al,[0x100] ; 0000FF68 86060001 '....'
cmp al,0x1 ; 0000FF6C 3C01 '<.'
jz xffb3 ; 0000FF6E 7443 'tC'
sti ; 0000FF70 FB '.'
call x8d6f ; 0000FF71 E8FB8D '...'
mov ah,0xf ; 0000FF74 B40F '..'
int 0x10 ; 0000FF76 CD10 '..'
mov ch,ah ; 0000FF78 8AEC '..'
push cx ; 0000FF7A 51 'Q'
mov ah,0x3 ; 0000FF7B B403 '..'
int 0x10 ; 0000FF7D CD10 '..'
pop cx ; 0000FF7F 59 'Y'
push dx ; 0000FF80 52 'R'
xor dx,dx ; 0000FF81 33D2 '3.'
xff83: mov ah,0x2 ; 0000FF83 B402 '..'
int 0x10 ; 0000FF85 CD10 '..'
mov ah,0x8 ; 0000FF87 B408 '..'
int 0x10 ; 0000FF89 CD10 '..'
call x8d78 ; 0000FF8B E8EA8D '...'
jc xffa7 ; 0000FF8E 7217 'r.'
inc dl ; 0000FF90 FEC2 '..'
cmp dl,ch ; 0000FF92 3AD5 ':.'
jc xff83 ; 0000FF94 72ED 'r.'
call x8d6f ; 0000FF96 E8D68D '...'
jc xffa7 ; 0000FF99 720C 'r.'
xor dl,dl ; 0000FF9B 32D2 '2.'
inc dh ; 0000FF9D FEC6 '..'
cmp dh,0x19 ; 0000FF9F 80FE19 '...'
jc xff83 ; 0000FFA2 72DF 'r.'
call x8d6f ; 0000FFA4 E8C88D '...'
xffa7: sbb cl,cl ; 0000FFA7 1AC9 '..'
pop dx ; 0000FFA9 5A 'Z'
mov ah,0x2 ; 0000FFAA B402 '..'
int 0x10 ; 0000FFAC CD10 '..'
cli ; 0000FFAE FA '.'
mov [0x100],cl ; 0000FFAF 880E0001 '....'
xffb3: pop ds ; 0000FFB3 1F '.'
popa ; 0000FFB4 61 'a'
iret ; 0000FFB5 CF '.'
dw 0xFFFF ; 0000FFB6 FFFF
db 0x0000 ; 0000FFB8 0000
dw 0x0000 ; 0000FFBA 0000
dw 0x0000 ; 0000FFBC 0000
dw 0x0003 ; 0000FFBE 0300 (replaced during ROM relocation with 0x03nn where nn is the CPU revision identifier)
times 29 db 0xFF ; 0000FFC0 - 0000FFDC
jmp x9f17 ; 0000FFDD E9379F
;
; Offset for storing built-in memory table
;
; (Refer to "Compaq Built-in Memory" description at the top of this file)
;
bim_table_offset:
dw 0x7FB6 ; 0000FFE0 B67F
;
; Offset for storing CPU identifier (low byte) and revision number (high byte)
;
cpu_idrev_offset:
dw 0x7FBE ; 0000FFE2 BE7F
db 'G' ; 0000FFE4 Product Family Code
db '4' ; 0000FFE5 Point-Release Code
db 'J ' ; 0000FFE6 Revision Code
db '03' ; 0000FFE8 BIOS Type Code
db 'COMPAQ' ; 0000FFEA Machine ID
jmp 0xf000:reset ; 0000FFF0 EA05F900F0
db 0x20 ; 0000FFF5
db '01/28/88' ; 0000FFF6 BIOS Revision Date
db 0xFC ; 0000FFFE Machine Type Code
db 0x98 ; 0000FFFF Checksum
# # Steps to produce a binary ROM from a JSON-encoded ROM, and then disassemble and re-assemble it. # all: 1988-01-28-test.rom 1988-01-28.rom: 1988-01-28.json node ../../../../../../modules/filedump/bin/filedump --file=1988-01-28.json --output=1988-01-28.rom --format=rom 1988-01-28-test.nasm: 1988-01-28.rom ndisasm -o0x8000 -se105h -se05ah -se6ffh -sf025h -sf8aah 1988-01-28.rom > 1988-01-28-test.nasm node ../../../../../../modules/textout/bin/textout --file=1988-01-28-test.nasm --nasm > temp.nasm mv temp.nasm 1988-01-28-test.nasm 1988-01-28-test.rom: 1988-01-28-test.nasm nasm -f bin 1988-01-28-test.nasm -l 1988-01-28-test.lst -o 1988-01-28-test.rom
2D BE FF 8B 2E 04 00 74 EB 90 24 80 C0 FC 75 E8 00 58 13 33 E8 72 88 00 2E 1E 00 64 61 9C BA 0C E4 8A F6 80 10 61 10 E0 F8 FF EC F8 9D 86 32 D1 8B 50 89 02 0E 00 4E C7 00 00 B0 EE EC E0 B0 EE EC 50 51 B8 00 C0 02 09 01 17 05 00 7C B1 B5 B0 E8 00 7E 07 5B C3 52 8A 8C 88 4C 8E BB 00 C7 00 26 47 FF FC 26 1F FC FC 83 00 C6 00 00 08 4C 2A EB 90 2E 00 06 16 00 C7 4C 2A FE 32 C1 06 5A C3 51 56 BB 00 05 BF 00 D2 F3 C2 B6 89 93 4F E2 FC 93 BF 00 0B F3 FC 93 BF 80 0B F3 5F 5A 5B 53 52 56 18 B7 B3 B8 1C C0 00 B4 CD 0A 5E 5A 5B 60 06 00 8E 8E FC C0 00 B9 00 AB 08 B8 1C 10 F7 05 00 D2 89 02 54 C6 05 C7 5F BE 00 00 BB 00 E3 B8 80 00 44 88 04 44 92 04 00 30 8C B3 E8 00 18 B8 1C 92 61 BE 00 40 B3 E8 00 28 8C B3 E8 00 40 B8 B0 92 41 BE 00 00 B3 E8 00 50 B8 C0 92 2B C6 54 C0 06 00 BE 00 00 B3 E8 00 C8 D8 B8 BF 00 07 41 E9 A5 1F C3 04 FF FC E0 C0 04 44 88 04 5C C7 06 00 50 8E A3 A8 74 F9 1F 96 97 8A B0 E8 76 76 B0 E8 76 E0 97 81 A3 00 58 50 8E 75 8A 80 10 C9 03 E4 B0 E8 76 C3 E8 44 E8 00 00 BB B6 11 E8 44 56 63 5B 0D BA 00 94 B9 00 94 C3 60 24 3C 74 E9 00 E3 80 FE 73 FB 74 0A 74 B7 8A 24 3C 74 3C 74 B7 3A 72 BE B6 C7 8A 24 C0 02 03 4E 02 03 C7 3A 72 BE B6 C7 8A 24 C0 04 03 32 02 03 C7 3A 72 BE B7 C7 8A 24 C0 06 03 16 02 05 C7 74 3A 73 1E C8 D8 41 1F 1E C8 D8 00 32 B9 80 02 E2 74 BA 50 37 B9 00 E2 EB 1F 30 30 30 30 30 20 4B 42 20 4F 4B 8A 49 88 01 1E 03 5D 8A 07 03 A3 52 56 B4 E8 00 4E E3 8B 0C 46 8E FC 8B 06 7E 01 13 07 0F 08 0B 0A 07 0D 03 AC 51 50 40 8E 58 1D 1F E2 5A 8A 07 46 01 05 02 4F 1F 26 00 66 C3 07 3B 08 37 0A 33 0D 2F 01 B4 E8 00 03 29 FE 3A 4A 75 32 FE 80 19 0B CE 0A 0E 0F 32 B4 E8 00 B4 E8 00 F8 53 BB 00 C3 42 8C 26 07 5B 74 CD C3 0E 12 C3 0E 91 8A B0 E8 74 01 03 CC 8A A8 74 BA 20 7D B9 00 CC EB A8 74 BA 20 7D B9 00 BA F6 10 01 0C 00 BB B8 1B E8 42 10 0C 00 BB B8 18 E8 42 06 00 74 32 0A 12 74 E8 72 9E E8 72 37 C0 64 A0 72 E8 72 29 60 80 23 C0 06 00 0F 83 74 80 96 10 94 EB BA 20 38 B9 00 46 33 E8 72 01 E8 00 C0 06 00 03 06 C6 12 00 60 00 BB B9 18 E8 42 3C 74 E8 00 06 00 61 FA 21 FD 21 33 8E 26 1E 00 C7 24 72 FB E8 40 26 1E 00 B0 E6 B9 FF 35 E4 A8 74 E2 B0 E6 C3 E4 B0 E6 58 B4 CD 80 3B F7 B8 00 8E C6 00 FF C7 8D 00 C6 8C FA DB FF F0 FF 88 4C B8 00 C0 C7 00 26 45 FF FC 26 05 FC FC 0B 26 05 04 C1 0B C3 3A 74 FE EB 81 80 76 89 8D 88 8C 07 B4 C7 82 80 C6 8F FF 06 00 BD 00 95 81 80 0B 74 88 66 89 67 88 69 81 64 41 C3 7F 84 C0 50 C7 FF 89 02 44 0F 44 92 44 88 07 48 C7 FF 89 02 44 FF 44 92 44 88 07 1E 50 8E B8 00 C0 F6 FF 00 FC F3 BB FF 3F E2 8B 1F 06 00 C6 57 80 1E 00 B8 00 D8 61 0C E6 A0 00 06 00 24 26 45 58 61 C6 10 B1 70 71 E0 B0 70 71 00 B9 3F CB C1 02 DB E3 26 5D 26 5D B5 32 C1 04 89 06 FE E8 88 26 45 B9 7F 00 32 FC AC E0 FA D4 C4 88 C6 00 FC 84 07 E8 00 60 8B BB 02 C1 74 BB 02 C1 74 BB 01 00 F7 FE 88 90 8A 24 3C 74 BB 04 C1 75 BB 08 C1 75 BB 28 00 F7 FE 88 91 C3 FD 00 04 8A C0 02 03 02 05 C3 EB 3C 75 80 04 E7 B8 00 D8 00 8A 02 B0 C3 44 C6 FF 04 C6 FF 04 1F E4 62 0A 75 B3 32 B8 04 E3 00 F7 FE 88 91 C3 06 00 FF 06 00 00 06 00 C6 55 92 06 00 C6 57 80 53 50 8E E4 8A 0C E6 E6 8B 00 C6 00 FF 84 FC FC FC FC FC FC FC FC E0 61 C3 1F 00 00 00 00 FF 00 C0 00 FF 00 00 00 FF 00 0F 00 FF 00 00 00 FF 00 FF 00 FF 00 FF 00 FF 00 0E 00 FF 00 FD 00 FF 00 FE 00 4F 01 0F 4F 01 FF FF 00 00 87 18 D5 18 05 18 DB 18 2E 01 51 0F C0 01 0F C0 FF 63 B8 00 C0 2F 88 E6 FC FC FC FC FC FC FC FC B8 00 C0 20 66 FE FF 0F C0 B9 00 2E 01 5D FF 2E 01 51 0F C0 01 0F C0 FF 67 B8 00 C0 61 E0 08 61 C4 8A 26 06 00 E6 EB 2E 01 51 0F C0 01 0F C0 FF 6B B8 00 D8 C0 64 FF FA 64 02 05 F8 90 B9 FF 64 01 05 F8 82 E4 A8 75 66 06 C0 00 B8 00 A1 C4 00 25 80 00 0D 00 C7 00 00 00 EB EB 66 06 C0 00 56 00 C7 00 00 00 EB 66 06 C0 00 64 00 C7 00 00 00 EB 66 06 C0 00 30 00 C7 00 00 FF B0 E6 E4 86 B0 E6 86 0C E6 EB B0 E6 E4 86 B0 E6 86 24 E6 B8 00 D8 DC 2E 01 51 0F C0 01 0F C0 FF 6F B8 00 D8 F6 04 E6 B8 00 D8 48 8E 33 B9 40 66 A5 08 8E 33 C6 FC 84 10 8E E9 FE 0D 04 72 B0 52 D2 C0 02 20 00 17 C4 74 F9 C3 3E 64 36 AB AD AF 6F C3 D9 29 37 7C 8A A0 51 8B 50 52 1E 0B 20 20 20 55 ED C8 D8 46 8B 04 8A 80 F2 05 F9 75 43 4E B5 EB 8B FC 2C AC 00 09 C1 F7 8B EB BE 8A DE 3C 74 3A 75 8B 08 E4 2B 4E E6 FF 3B EB 1F 5A 58 59 15 1F 5A 58 59 8B 80 01 03 4E 80 00 04 4F 02 47 8B 3B 75 80 01 06 4E FF 02 FC 74 4F 4E 4E EB 47 46 46 EB 83 FF 0D FC 74 4E EB 46 EB 80 01 03 4E 80 00 06 4F 4E 04 47 46 8B 80 00 04 4E 02 46 8B 3B 75 80 00 08 4F 4F 4E 31 47 47 46 29 FE 75 80 00 06 4E 4F 19 46 47 13 FD 75 FF 02 FC 74 4F EB 47 C3 F2 FC 74 4F EB 47 C3 F2 FD 75 FF 02 FC 74 4F EB 47 C3 F2 FC 74 4E EB 46 C3 8A 4A 8B 02 D3 04 D3 CA C4 74 87 2A 2A F6 F6 EB 2A 2A FE FE E8 01 21 3E 00 72 80 49 03 13 52 16 00 C2 A0 00 F7 5A EB 80 49 04 07 3E 00 75 8B 2B 81 FF D1 8B 8A F6 32 03 D1 03 4E 97 C6 DE F0 E3 C6 01 04 D8 DD E0 C7 0A 74 3A 73 2A 8A F3 03 03 FE 75 8A 8A B0 8A F3 03 FE 75 B8 00 D8 36 74 80 49 02 12 3E 00 77 8B 63 83 04 65 EE 80 49 06 04 E1 E2 50 52 F8 C5 ED BA 01 E2 C1 06 00 8B 98 40 F7 F7 00 74 F7 F7 81 F0 80 49 06 01 03 8C 8E 96 53 DF C0 30 C6 2C F0 D0 D0 8B 8B 8B 8A F3 8B 8B 81 00 81 00 8A F3 03 03 FE 75 58 F0 E6 E6 8A 8B 8A F3 8B 81 00 8A F3 03 FE 75 C3 66 ED B8 00 00 33 B9 40 FF 66 D0 AB F9 61 0C 61 F3 61 BB 00 00 33 66 C5 1F F6 00 9E D1 9F 46 46 C3 F3 23 61 C0 00 1B 09 66 D3 83 04 DA B1 66 D3 66 7A 1F C0 C6 00 E4 0C E6 24 E6 59 D6 F9 F6 87 04 FF FF FF FF FF 31 00 50 1E 40 8E B8 00 4E 1F 58 8B 83 10 8E 8B 8E B9 04 CB D1 49 FC 00 BE 8E 2E A1 02 06 02 03 00 3D 01 0A 24 B8 E9 8C AB 6C B8 8D 8C AB 53 AB C8 8E 26 06 00 90 8C 92 FB DC BF 03 85 B4 CD EB 33 8E 8B 52 85 75 E9 59 C0 2E 02 B4 CD B8 0C 21 3D 75 C6 FF 0D 06 19 21 41 5F 41 DC 59 24 A2 03 B3 C9 0E 03 0E 03 C7 93 00 33 1E DB 1A 21 BA 03 27 21 8E 8B 14 8B 04 1F 49 BA 03 27 21 02 75 91 C8 8B 81 E0 8E 33 B4 CD 1F 85 B4 CD B4 CD 80 00 0C 3A B4 CD B8 0C 21 C5 DD 80 B4 CD CB 00 0A 6E 65 74 43 4D 41 20 53 44 53 64 73 65 74 0D 45 74 72 64 69 65 73 65 69 69 72 24 0A 0A 65 6E 65 74 64 73 65 74 20 6E 64 69 65 41 69 20 65 65 73 72 0D 53 72 6B 20 6E 20 65 20 68 6E 72 61 79 0A 00 41 49 41 20 58 00 5B A8 74 E8 02 27 62 E8 39 C0 F7 EC 80 0B 06 4E 01 88 41 C3 33 A8 75 32 EB E8 FF 5B D9 F6 10 0F 27 FC 75 80 03 EC EB E8 41 87 03 08 07 04 02 61 27 0C E8 3A 46 50 46 02 AD C6 05 E8 5E 88 05 06 F7 EC 80 02 80 26 00 4E 01 C3 FF 8F 74 F6 80 44 F8 E4 46 3C 72 B4 81 16 00 30 C0 22 93 01 10 74 02 11 15 03 0B 97 07 01 76 EB B0 E8 41 37 88 E8 41 C7 E8 01 27 84 F6 10 03 01 C3 1B 8A 88 02 76 8A 05 27 35 C9 75 E8 40 7E 00 03 E8 24 3C 73 E8 39 EF B4 88 E8 41 06 46 04 46 01 E8 5C 74 E8 39 D1 B4 88 E8 41 06 46 04 46 01 E8 5C 74 E8 39 B3 B4 88 E8 41 04 46 04 46 01 E8 5B 74 E8 39 95 B4 88 E8 40 06 46 04 46 01 E8 5B 74 81 16 00 75 8A 02 27 CA 8A 41 EB EB E8 40 17 29 80 06 75 C0 04 0F 04 05 07 EC E8 40 C4 E8 00 27 98 C6 02 8F 00 C0 76 9D 32 8A 06 FC 72 B4 81 16 00 19 00 15 0A 74 B4 A8 75 04 24 2C 74 B4 C3 DB 5E 81 90 C3 9C E4 8A E4 E4 2A 3C 77 E4 9D C3 F6 B0 EE E6 E8 65 A8 84 BA 03 FD FD FD FC 0F C0 03 56 83 0D EC C0 D8 36 00 40 8E C6 40 FF 14 C6 06 C6 07 E8 00 46 01 92 C6 05 E8 5C AF 84 F2 B0 EE 26 00 83 0D B3 E0 C9 24 86 B0 E8 66 C0 D8 C8 1E 00 02 C5 3E 00 02 C5 ED 0C CD E5 80 01 2E 00 E8 3F 40 39 FD 8A C0 04 E4 0A 74 86 E8 00 08 E8 00 1D 0E B3 E0 6D 0C 86 E8 66 02 8A 80 20 8E 5E FB FF 05 07 2A B4 E8 3F ED C6 00 46 30 EF C6 05 E8 5B 04 68 8A 06 62 B9 A8 FA 75 E2 EB E8 FE A8 75 80 05 74 FE 05 D3 07 01 7E 00 05 C7 EB B4 B0 E8 3E 99 88 E8 3E 01 8F 05 3C 74 3C 75 B0 EB B0 3A C3 0A 6F 2D 79 74 6D 64 73 20 72 64 73 20 72 6F 0D 72 70 61 65 61 64 73 72 6B 20 6E 20 65 20 68 6E 72 61 79 0A 0D 36 32 44 73 65 74 20 6F 74 52 63 72 20 72 6F 0D 24 02 B9 FD 80 70 71 FF 0A F4 74 B9 FD EC E5 FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 8B 66 53 FC 01 85 5E 8E 8B 02 1F FB 75 B0 E6 FF 02 A5 81 0F 74 B0 E6 1F 66 5D F9 B0 E6 E8 5C 07 A0 BB 00 DB 20 66 11 00 8B 06 66 E1 00 00 0B 66 66 C0 18 66 A1 00 AB 26 B9 00 66 E2 0F F0 AB 21 66 66 C0 16 66 BE 00 66 8C 66 8C 66 B9 00 66 E2 BE 00 33 8B 02 AB 8B 66 FF FF 66 66 C0 44 66 BE 00 33 8B 02 AB 8B 66 FF FF 66 66 C0 44 66 BE 00 33 8B 02 AB 8B 66 FF FF 66 66 C0 44 66 BE 00 33 8B 02 AB 8B 66 FF FF 66 66 C0 44 66 66 00 92 66 66 C0 E8 E0 66 B8 FF AB B8 00 00 AB 33 8C C1 04 AB FF 66 BE 00 33 8B 02 AB 8B 66 FF FF 66 66 C0 44 66 BE 00 33 8B 02 AB 8B 66 FF FF 66 66 C0 44 66 BE 00 33 8B 02 AB 8B 66 FF FF 66 66 C0 44 66 BE 00 33 8B 02 AB 8B 66 FF FF 66 66 C0 44 66 E8 5B 33 BF 13 07 5B 58 CF 9E 9E 97 97 97 97 05 0B E4 F0 E6 FF 70 C3 26 00 0A 75 80 87 10 C3 0A 74 8B 63 83 04 65 0C A2 00 EB 8B 63 83 04 65 24 A2 00 5A C3 A6 AC AC 80 DF A7 8B 8B C2 98 98 A7 F5 F5 CE A7 83 83 83 83 97 5A 5B 5F 1F CF FF FF FF FF FF E9 03 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF D3 FF FF FF FF FF FF E9 03 3A 74 80 49 04 0A 3E 00 74 EB 90 9E 8B 63 83 06 E0 A8 75 FA A8 74 8A AA FB EE 80 49 04 07 3E 00 75 E8 2A 47 FC E8 F4 2E 3E 00 72 80 49 07 36 E3 54 8B 63 83 06 D8 A8 75 FA A8 74 8B AB E2 C3 3E 00 72 80 49 07 08 E3 26 F3 C3 42 8A 06 3E 00 CA DA 6E 0A 79 33 8E C5 7C 25 00 E0 E0 E0 F0 FF 74 83 10 C4 06 D7 C7 53 F8 E3 B5 AC 08 E2 E2 E0 02 D3 C9 F2 C6 E2 FE 75 5B 07 8C 8E B9 00 F4 D0 79 26 05 81 FE AD FB 03 33 AB EF 1F E4 EF 01 75 83 10 2E E3 D1 DE 04 8B AC FC 03 32 AA C7 1F D0 79 26 05 81 B1 E2 81 3F 4A D8 B8 C8 E8 00 80 76 B8 E0 D8 DB 3F AA 39 F6 00 AD D8 DC F9 18 40 8E 80 12 FF 00 BB B7 0F E8 2D 13 40 8E 1E D8 03 50 EC 5E 58 B8 00 D8 8E 33 81 55 75 33 33 8A 02 E1 D1 02 E2 75 B1 D3 52 40 8E 1E D8 03 50 F4 33 36 1C ED 0C B8 00 D8 0E 00 1F 58 D8 5A DB DA C3 1C 80 72 EB 60 1E 00 BB B8 14 E8 2C 07 BA 00 D8 C2 1E B8 C0 27 75 3D C7 F6 C0 1F 1E B8 C0 E8 00 74 50 C2 4B 58 80 76 07 C3 8E 33 81 55 75 33 33 8A 02 E1 D1 02 E2 75 B1 D3 8C 03 C3 06 BA 50 69 B9 00 5E 1F 61 80 8C 03 33 C3 D8 40 8E 1E 03 50 EC 5E 58 C3 2E 0C 46 3A 74 E2 F8 05 2E 04 59 FF B1 B3 B5 B7 B9 2D 08 71 65 74 75 6F 5B 0D 61 64 67 6A 6C A7 FF 7A 63 62 6D AE FF FF FF 21 23 25 26 28 5F 08 0B 1A 1B 1C 27 28 29 2B 33 34 35 39 37 39 34 36 31 33 2E 00 77 84 73 74 75 76 8D 8E 8F 90 91 92 93 00 1E 1F 1B 1D 0A 1C 00 97 98 99 9B 9D 9F A0 A1 A2 A3 FF B0 E6 B0 E6 58 23 FA F7 C2 EE E0 EE EA 32 8A EE FE AC 4A F5 E5 20 8E 06 FF 00 F3 8B 8A 03 FF FF FF FF FF FF FF FF FF E9 00 FF FF FF 06 01 85 17 84 40 8E B0 E6 E6 32 E6 26 06 00 74 26 26 00 07 CD CF 55 56 1E EC 8B 26 0E 00 D9 00 8B 06 F0 E6 00 E8 8B 08 E3 F0 C3 D8 10 AC E0 F8 D8 05 F5 0D AC FF 81 08 F8 46 9B 66 83 10 59 5B 07 CF B0 E6 B0 E6 B0 E6 58 0A 1E B8 00 D8 32 FA 06 00 0E 00 16 00 1F A8 1E B8 00 D8 89 6E 89 6C C6 70 00 58 E9 61 18 B0 E8 5B F0 02 E7 8A B0 E8 5B E8 72 B0 FA D5 A8 74 FB F3 E8 FF 00 E6 C8 B0 8A E8 5B 04 E5 BA B0 E8 5B 02 FB FE D2 02 01 E0 0B A2 E9 61 BC B0 E8 5B D0 08 8B 8A B0 E8 5B C8 32 7D 8A E9 61 9A B8 00 74 B0 8A E8 5B 08 E6 66 B0 8A E8 5B 0B 55 0C 24 8A B0 E8 5B 32 E5 48 E9 60 B0 E8 5B 20 08 5B C0 CA 00 0A 29 A8 75 B0 8A E8 5B 03 E1 1C B0 8A E8 5B A1 FE A1 0B 05 0C 8A B0 E8 5B 90 FA 0B F3 24 8A B0 E8 5A 7E 8A B9 F4 84 75 E8 F3 F6 CC EF 80 B4 C3 C0 FE 26 05 F9 F9 26 05 F9 F9 C3 0E FA B1 0E 03 EB 90 A8 75 9C B0 E8 5A E8 00 02 CF 01 33 C3 8E FA 89 0E 03 EB 90 A8 75 9C B0 E8 5A E8 00 02 CF 01 33 C3 1E 40 8E 66 10 66 FF 00 66 B0 E6 E4 A8 66 74 66 00 00 1F E8 FF 68 3E 00 74 80 49 03 02 58 FF C7 74 8A 00 00 09 01 46 E4 EB B8 F0 3B 74 FC AB C8 FB 65 8A 66 8B 63 B9 00 A0 BB 01 3D 83 04 65 EE 0F 2F B4 E8 E5 02 25 B4 E8 E5 FC AD E4 A8 58 25 EE 66 04 50 48 8E E4 8A 0C E6 8A 00 C6 00 FF C4 61 1F CB F7 7E 00 17 FD 75 B0 E6 E4 A8 74 24 75 0C EB E8 31 2E 11 74 BE A0 63 A8 74 BE A0 0F 8A 8A 80 06 FF 74 BE A0 E3 74 BE A0 31 24 B4 FE 74 FE 74 83 05 F3 46 00 C7 04 00 46 00 46 00 C7 0A 00 89 75 EB E8 31 DC 4E 2E 54 89 0A DB 71 75 E8 31 05 8A 32 89 02 8A 02 6E 2E 4C 88 04 46 01 7D 75 E8 F1 3F 75 87 E8 F2 F7 7C 88 06 C0 66 FE 87 C3 09 FB 02 4F 21 09 22 04 4F 21 F7 CD 8B 04 0D 75 E8 31 26 01 1A C6 3C 74 83 0C 03 0C C6 2E 54 74 83 06 3B 01 0C 35 00 28 3B 01 36 13 80 00 07 F7 0C 87 2E 54 E8 F1 17 4E 2E 54 89 0A 66 01 33 EB 81 16 00 0C C0 1A 4E 01 B4 32 E8 F0 3F 75 87 50 CC 58 F7 F7 01 27 FB 02 27 08 02 4F 15 03 4F 22 03 4F 2F 04 4F 3C FF FF FF FF FF DF 25 09 FF F6 08 80 02 02 2A 50 0F 27 DF 25 0F FF F6 08 00 02 02 2A 50 0F 4F DF 25 09 FF F6 08 80 02 02 1B 65 0F 4F 8B 20 2A 38 FF 00 00 00 FB 1E BF 00 DF 01 33 1D 06 00 75 80 A0 01 51 FA A1 FE A1 E8 00 EB F6 A0 01 03 EB E8 00 26 00 EB F9 B4 1F CA 00 B0 E8 57 40 8A B0 E8 57 FB FA 0B 2F 24 50 E0 0B 2A 58 C3 1E 00 06 00 16 00 0E 00 FB FA 74 4A 0F 86 C3 E4 01 EC F0 8C BA 02 24 3C 75 33 33 33 33 EB 55 EC 8B 88 00 E8 00 F9 0F C7 0C 00 5E 89 0A E0 24 32 75 8B E8 00 D9 5E 3B 0A E2 2C DF 3E 2B F6 01 03 5E F6 02 03 5E F6 04 03 5E F6 08 03 5E 38 00 B4 58 5B 5A 5D C1 04 EB C1 04 EA F8 50 00 43 40 C8 40 E8 C3 5F 53 40 8E F6 A0 01 2E 06 00 06 C3 1E 00 1B 07 E4 24 EB EB E6 FB E5 F6 A0 80 F9 26 00 F8 01 5B 5F 02 FB 5F 06 B8 00 D8 26 00 16 00 00 80 F3 74 1F 61 03 FB 5C 26 07 FF C8 E0 26 47 8C C1 0C 88 04 C6 05 8D 28 C7 FF 8C C1 04 89 02 D0 E8 26 47 26 47 92 56 C8 C0 36 A5 E4 8B E8 00 07 5C 26 57 26 47 26 07 00 B0 E6 26 01 E8 00 89 02 C2 26 47 26 07 FF C6 05 26 01 0F E0 01 0F F0 FF 49 33 0F D0 28 8E B8 00 D8 18 8E FC F6 FF 00 70 D1 66 A5 F7 01 74 A5 80 70 28 8E 8E 8E 66 0F 00 25 FF 7F 22 66 EA A3 F0 0F 1E A1 5C E8 48 19 D1 64 41 75 B0 E6 E8 48 07 FF 64 2F C3 02 61 40 17 4E E8 01 02 04 04 0C E6 24 E6 B4 8A E6 EB 8C C1 04 C6 51 C1 C6 E8 03 C1 0C C3 40 8E 8E 69 8B 67 E8 00 00 70 07 86 E4 86 55 EC E4 0C 66 FE 81 06 00 0A 66 BF 81 06 00 CF B3 75 B0 E6 E8 47 12 DD 60 A1 75 B0 E6 E8 47 04 03 80 5F B0 E8 54 E0 30 3F CF 5F E8 FF 06 FF CA 00 53 5C 26 07 FF C8 E0 26 47 8C C1 0C 88 04 C6 05 5B B0 E6 8A E6 B0 E6 B0 E6 B0 E6 B0 E6 8A E6 B0 E6 B0 E6 B0 E6 8D 08 0F 17 5C 26 01 55 EC 46 30 5D 01 0D 00 01 2E 2E A1 C0 00 B8 00 D0 18 8E B8 00 C0 E4 CA 00 1E B8 00 D8 10 80 07 75 80 04 75 83 02 75 BB 00 47 92 20 8E BB FF 8B 26 07 0F 05 FF EB B8 00 DB 1F C3 C8 C0 F5 33 C3 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A1 00 30 3C 58 17 07 15 1E 00 E3 C0 04 FF 8A 42 EB B0 A2 00 49 BB B0 B4 3C 74 BB B8 D4 8E 89 63 98 B0 83 04 83 04 C0 4E A2 00 8A 12 A3 00 E3 8B 1A A3 00 EB 8A 2A 80 3F 65 24 0A A2 00 8A 32 88 66 B9 00 E8 00 8A 0A 8A 0B 49 24 3C 75 26 7C 0D 0E C5 47 8A 8A E8 00 C8 89 60 A0 00 07 07 04 00 73 B8 07 FF 00 F3 1E BF 00 C0 08 F3 F6 87 10 06 F4 E8 1E 65 83 04 C3 25 00 03 E0 0E F1 FC 72 FE 59 32 8A 49 1E F6 DE 36 00 8A 3A 03 56 B2 E9 F4 5E D8 C0 C3 07 62 98 52 26 00 4E 5A D1 B4 E8 05 D1 8B 50 E9 05 66 0A 75 80 1F E0 C3 0B 05 E3 E3 24 0A A2 00 C2 EE A0 00 46 A0 00 46 A0 00 46 C3 28 50 28 50 08 08 10 10 40 40 40 40 28 29 2E 29 30 30 30 30 00 10 20 30 01 07 1B 1B E2 1B 1B FF 95 1B FE E9 1B 1B 1B 8A EF 1B F0 F8 F8 EC E7 F8 E8 EF E7 E6 FE FF FF F0 EF 00 4A 1C 1B 1B 1B 1C 1B 1B 1B 03 02 03 03 02 14 14 01 01 00 00 30 84 40 8E 8B 13 5A ED C0 00 33 8E B9 80 AB C5 10 EE EF B8 00 C0 1E 00 C0 C0 80 B9 00 C8 96 2E AB F8 C0 C0 80 B9 00 00 AB E2 B0 E6 33 8E BE A8 C0 B9 00 C8 A5 E2 B0 E6 BE A8 00 B9 00 C8 A5 E2 57 7E 33 26 05 B0 E6 B8 00 D8 00 E4 3C 75 8A 89 72 B0 E6 B4 B9 00 DB D2 C4 87 8A 03 FE E2 B0 E8 4F D0 AE 73 8A 3B 74 B0 E8 4F 40 E0 8E 64 B0 E6 B0 E6 BB 00 D8 C0 38 84 98 BF 00 02 2E 92 42 3C 74 80 02 4A AB ED 39 84 9C BF 00 03 2E 92 F6 EE E0 3A 75 80 40 AB EB 3A 84 A2 BF 00 06 F3 A5 C9 F9 40 8E 89 10 B0 E6 E8 18 0E 00 B0 E8 4E 40 10 AD D7 A8 74 80 87 FB 11 84 2E 47 E8 F3 05 26 00 C6 84 18 94 B1 24 8A 50 B0 E6 E8 F0 58 0F FC 74 E8 01 53 84 3E C3 40 8E E8 4C 09 05 05 26 00 C3 FF E9 03 50 84 40 8E B0 E6 B0 E8 4E C0 05 FF 0A B0 E8 4E 30 E0 1E 52 84 E2 1F 74 C3 06 E8 F3 0C C0 C0 74 26 05 F0 26 00 80 10 30 00 07 10 26 00 80 10 20 00 03 10 C0 58 1F 54 84 65 73 BB B7 1D BD AA 02 EB 24 50 20 58 1C D0 40 B0 E6 58 10 73 B0 E6 E8 1C 78 E8 1C BA BA DA C3 0A 75 87 B0 B5 80 10 10 03 20 FC 74 E8 00 03 20 26 00 08 10 50 2E 47 E8 F2 58 02 C3 B0 E6 58 00 10 C0 53 FC 74 E8 00 0E 00 5B 8E 06 9D B0 74 F9 E8 37 03 01 C3 8E 57 0C 8A B0 E8 4D B0 E6 0E BB BA 59 84 47 E8 F2 03 82 B0 E6 B0 81 B8 75 B0 8B EE 5B 84 D2 FF 4F 8B 32 7B FE 32 AA F3 FF 4F 8B 32 7B FE 32 AE F3 05 F2 75 B0 E6 9C 02 E9 EF C9 57 B4 E8 00 74 B0 E6 53 57 33 8A 0C 5F 1E 40 8E A0 00 E8 1B 35 58 03 12 1F B0 E6 83 0F FB BA 03 5F B0 E6 C3 20 72 E8 4B C0 64 14 72 E8 4B 02 60 FF FF FF FF FF FF FF FF FF FF EA 8E F0 0E 00 49 24 3C 75 33 8E C5 74 80 19 75 F7 18 75 8B 81 60 8A E8 00 E8 C1 0A 8A 0B B4 E8 00 24 B4 F6 D1 D1 D1 14 C3 FF 77 86 32 D1 8B 02 8F 00 62 3A 07 33 33 86 F7 4A 03 A1 00 E8 C8 B4 8A EE 8A EB EB EE FE 8A EB EB EE 8A EB EB EE C3 C4 42 C5 00 00 4A C4 C4 00 00 42 C1 00 00 4A E5 B8 00 D8 FE BA 01 10 33 BD AD 87 E4 0C E6 24 E6 BA 01 10 33 BD AD 83 73 56 E8 47 5E 1B 4B 61 40 B8 00 00 0F FB F9 05 82 EB 33 1F 50 8A 26 05 61 0C 61 F3 61 66 C0 19 03 86 80 0F F6 04 DC 05 E2 33 32 EB 66 04 26 05 F7 04 A8 75 66 E8 46 F5 C8 D6 F9 FF FF FF FF FF AE AE AE AF B0 B0 B2 B2 B0 B0 AE AF B1 B1 B2 B2 B1 B2 B2 B2 B2 B2 FA 73 CD 50 55 EC 46 89 0A 9D EB 60 06 00 EC FC 76 B8 00 D8 66 EB 81 1A FF 4E 00 FB 33 8E C4 04 F6 01 04 36 01 40 8E 8B 8A 15 E3 FF E6 07 1F CF 66 88 74 B2 CD 8A 10 9F 80 11 81 0D 05 E8 02 05 05 DB C3 74 88 14 26 00 66 C3 DB 72 E8 04 20 F6 08 74 0C 80 15 75 0C 50 8A 07 C0 02 04 46 58 48 E8 05 C2 F8 7F 7E 0A 06 C4 02 C6 66 88 01 04 E6 04 09 4A C3 E8 05 42 DD 72 8A E8 06 12 FC 74 F6 08 2C 12 EB E8 05 2D 72 E8 05 7E 0A 05 05 72 FE 01 C5 46 01 75 E8 05 03 2D C3 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 9C E8 04 7D E7 B0 26 44 C0 02 01 7E 0B 11 02 26 44 0A 75 B0 88 00 A2 00 0F B6 80 15 74 0A 75 FE 0A 14 66 74 3A 76 B4 EB E8 04 EB 8B 8B E8 04 FB 80 15 75 E8 03 19 BE 72 E8 02 0F F3 72 FE 01 DB 42 EB E8 04 E8 04 28 61 B0 26 44 C0 02 01 48 E8 04 88 72 E8 02 0A BD 72 E8 04 03 15 C3 23 72 E8 03 8A 0E 43 C6 48 50 49 E8 03 1E 69 8B 8B E8 03 4A 72 E8 02 0A 7F 72 E8 03 03 D7 C3 46 A2 00 8A 10 E3 80 81 76 89 12 46 B4 E8 03 25 8B 3D 03 03 FF 48 86 C0 06 0A 0E 46 26 64 FE A0 00 46 C3 9F 72 8A 10 8A 02 CF CF F6 01 03 CF 26 5C 26 44 C1 02 1E BF 00 8A AA 01 8A AA 8A AA 05 07 9D E8 03 0F B7 72 E8 03 05 36 EB B4 E8 03 E8 03 05 26 EB E8 03 E8 03 1F 45 C6 48 70 65 E8 03 0F 7F 72 E8 03 05 FE EB E8 03 E8 03 08 FC 75 E9 00 33 8E C4 04 1F 0B C6 45 00 06 00 80 47 E0 43 B0 BA 01 E8 03 A8 E8 03 3E 00 72 80 47 10 25 B0 BA 01 E8 03 8A E8 03 66 FE C6 15 E8 13 3B 33 8E C4 04 1F 80 03 72 E8 00 25 3E 00 73 F8 20 33 8E C4 18 1F 81 E3 72 80 47 10 10 73 B4 E8 02 E8 02 1F 75 C6 48 10 95 E8 02 0F AF 72 E8 02 05 2E EB E8 02 46 C3 3D 72 E8 01 06 00 E8 02 7A 72 E8 00 0E 14 32 89 14 01 05 20 03 C3 1E 00 CB C3 2A 10 0B 46 89 12 46 EB C7 14 03 8A 02 F6 0E 8B 4B E3 46 89 12 C6 14 B4 88 15 26 00 4E 01 C3 27 72 8A 10 01 E0 0C BA 01 E8 00 0E 20 04 CC 06 40 05 AA 93 C3 51 80 3C 75 86 EB BB 00 24 A8 74 E8 DE 68 E2 4B EE 80 59 C3 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 50 B8 00 D8 06 00 B0 E6 E6 33 8E B8 91 FA 1E 00 58 BA 01 A2 00 0A 00 00 40 BA 01 A2 00 20 D7 10 BE B3 E0 03 EB 2E 5E E0 8D C3 8B 05 E8 A2 00 46 A2 00 46 24 A2 00 46 A2 00 46 C0 06 66 80 60 EC 0A A2 00 46 24 C0 04 A0 76 80 0F C6 47 26 44 BA 03 C3 10 F7 02 46 80 00 C1 0C E8 0B 58 0F C3 8E B9 01 F0 F3 1F 32 8A 00 85 E8 FE 10 31 72 1E DB 1F F0 EE E8 B9 01 F0 F3 C3 ED 4E E8 DD A1 72 E8 00 07 F0 EC E2 C3 B9 F4 8B 72 BA 01 A8 75 E8 DD F3 80 59 E8 FE E4 46 C3 66 C6 14 88 74 81 1A 00 C3 06 00 88 74 8A 75 0A 74 8A 10 9F 80 0E CC 04 81 06 FA F9 11 F6 B0 EE DD E8 FD 03 6C C3 51 42 BA 01 07 AC 42 FB 5E 53 1E C0 D8 B8 90 FA 1E 00 73 33 0A 8E 75 EB 33 BB 00 24 0A 8E 75 E8 DC F5 75 B4 F9 06 00 59 C3 20 04 CC 0F 01 05 56 EB A8 74 B4 F9 B9 F4 F7 33 EC 10 08 61 E2 B4 F9 BA 03 02 C3 40 84 40 8E A1 00 80 34 02 E5 E5 FF FF 66 E9 D3 41 84 61 D0 10 E0 FF E4 24 3A 74 E2 BB B6 18 BD B5 6C EB B0 E6 66 ED 00 66 01 00 66 C5 00 8E 33 9E D1 66 E2 80 10 FA 20 E8 43 84 61 0C 61 F3 61 44 84 00 66 01 00 66 DD 8B 8A 8E 33 B9 40 E6 66 D3 8A 66 66 C3 F0 44 45 84 61 C0 00 1B C7 10 FF 20 D1 4D 02 84 46 84 40 8E FF 33 BD B6 9E 80 0F F6 04 DB 05 E2 33 32 EB 90 04 2B A8 75 66 E8 46 F5 C8 47 84 D6 DE 00 BD B6 50 BB B6 11 BD B6 92 EB 31 32 53 73 65 20 6F 72 20 61 6C 72 0D 20 30 2D 65 6F 79 45 72 72 32 33 4D 6D 72 20 64 72 73 20 72 6F 20 30 2D 65 6F 79 45 72 72 0A 32 37 49 76 6C 64 4D 6D 72 20 6F 66 67 72 74 6F 0A 20 61 65 4D 64 6C 00 4D 64 6C 20 00 4D 64 6C 20 00 4D 64 6C 20 00 0A 61 69 79 43 65 6B 31 00 61 69 79 43 65 6B 32 00 3F 3F 3F 31 31 52 4D 45 72 72 0A 34 32 4D 6E 63 72 6D 20 64 70 65 20 61 6C 72 0D 20 30 2D 69 70 61 20 64 70 65 20 61 6C 72 0D 20 30 2D 65 62 61 64 45 72 72 6F 20 65 74 46 78 75 65 49 73 61 6C 64 0A 33 31 4B 79 6F 72 20 72 6F 0D 20 30 2D 65 62 61 64 6F 20 79 74 6D 55 69 20 72 6F 0D 33 33 4B 79 6F 72 20 6F 74 6F 6C 72 45 72 72 0A 36 31 44 73 65 74 20 6F 74 6F 6C 72 45 72 72 0A 37 32 43 70 6F 65 73 72 44 74 63 69 6E 45 72 72 20 6C 61 65 43 65 6B 49 73 61 6C 74 6F 0D 20 30 2D 2F 20 4F 20 72 6F 0D 20 36 2D 79 74 6D 4F 74 6F 73 4E 74 53 74 28 75 20 65 75 29 0A 20 20 49 73 72 20 49 47 4F 54 43 64 73 65 74 20 6E 44 69 65 41 0D 20 36 2D 79 74 6D 4F 74 6F 73 45 72 72 0A 31 34 4D 6D 72 20 69 65 45 72 72 0A 31 33 54 6D 20 20 61 65 4E 74 53 74 0A 0A 28 45 55 45 3D 22 31 20 45 29 0A 0A 33 32 53 73 65 20 6E 74 53 63 72 74 20 6F 6B 69 20 6F 6B 64 0A 20 20 2D 55 6C 63 20 79 74 6D 55 69 20 65 75 69 79 4C 63 0D 0D 53 63 72 74 20 6F 6B 41 74 76 20 72 4E 20 65 62 61 64 41 74 63 65 0D 31 39 2D 69 6B 30 45 72 72 0A 37 31 44 73 20 20 72 6F 0D 31 38 2D 69 6B 30 46 69 75 65 0A 37 31 44 73 20 20 61 6C 72 0D 31 38 2D 69 6B 43 6E 72 6C 65 20 61 6C 72 0D 20 30 2D 69 6B 74 65 44 69 65 54 70 20 72 6F 2D 52 6E 53 74 70 0D 20 20 20 6E 65 74 44 41 4E 53 49 20 69 6B 74 65 69 20 72 76 20 3A 0A 03 29 F0 B8 60 B7 00 B8 B4 D4 00 00 46 21 10 A8 E9 D8 8E 70 00 C0 71 B3 70 C0 00 71 40 86 B0 E6 B0 E6 FC 00 8E B0 E6 E6 BB FF 1F 07 0F 0B E2 8B 8B 86 8E B0 E6 B0 E6 B0 E6 B0 E6 B0 E6 32 E6 B0 E6 B0 E6 B0 E6 B0 E6 B0 E6 B0 BA 03 B0 E6 B0 BA 03 B0 BA 03 BA 03 BA 03 BA 03 C0 BB BA 64 B0 8B EE 77 8A 02 12 BD BB 96 83 05 FA 03 03 30 4A E7 12 84 6E E9 E0 C9 57 B4 BD BB 9D 83 0F FB BA BA 13 84 00 33 E2 B0 E6 E4 8A E4 3D 00 0E 69 B9 00 AA E9 0C FE 14 84 8B 70 00 71 07 E0 8B 70 C4 71 8C 70 15 84 8D 70 00 71 80 E0 8E 70 00 71 80 C4 8A 75 80 80 16 84 17 84 8E 70 C4 71 18 84 06 E9 F9 61 F3 61 30 8E BC 01 19 84 93 E8 3B 09 AD 64 48 73 BB B7 1D BD BC C2 EB B9 00 60 BB 13 F5 59 64 01 04 EE DB 8F E8 EE 1A 84 19 B0 E6 E8 C6 1C 84 E8 B0 E6 E8 10 2D 84 8E B0 E6 E8 3A 1F 84 2E B0 E6 E8 17 96 E8 36 98 E9 CD 67 FB 21 84 BF B0 E6 E8 39 22 84 AA BB FF 8B 2E 47 24 3C 75 B0 E6 BD BC 26 B0 E6 E8 3A 9A 72 B0 E6 E8 3A 16 A0 72 E4 24 8A B0 E6 50 7C 58 03 30 8A E6 B0 E6 E8 D4 26 84 75 B0 E6 B0 BA 03 B0 E6 E8 DC 29 84 31 B0 E6 B4 CD B4 CD E4 8A 0C E6 86 E6 B0 E6 B0 E8 3B 04 0C 00 BB B9 1A E8 09 A1 FD A1 21 FB 21 40 8E C6 12 00 06 00 75 80 96 80 0E 00 FA AF B0 E6 FB FF F6 96 20 07 F7 06 00 E4 81 72 34 74 B0 50 1C 0A 58 02 80 86 2C B0 E6 E8 09 37 40 04 80 07 D9 B0 EB 24 3C 72 3C 77 EB E8 09 00 E8 34 B0 E6 58 00 02 4A 06 00 12 E8 09 2C 84 35 E8 25 19 C4 7F 07 BF BF 08 F2 5F 74 E9 01 FC 75 F6 96 02 03 25 BB 10 C3 E4 7B FC 74 80 B6 0A 06 00 74 E9 01 D3 FC 75 F6 96 02 13 26 00 80 96 FD 06 00 74 EB 80 18 FD 06 00 74 EB 80 9D 2D 06 00 75 F6 96 02 13 26 00 80 96 FD 06 00 74 EB 80 18 FE 06 00 75 21 17 F9 80 38 1F 06 00 74 80 96 08 26 00 EB 80 18 02 0E 00 F9 80 1D 26 06 00 75 F6 96 02 0C 0E 00 80 96 FD 05 0E 00 80 17 04 C3 1E 00 47 1E 00 06 00 75 80 52 33 06 00 75 F6 17 03 10 06 00 75 F6 17 20 10 15 06 00 75 F6 17 20 07 26 00 EB 30 17 80 52 01 C3 1D 36 3A 46 06 00 75 80 18 04 00 E8 2B 15 F9 80 18 FB 01 EB BB 00 60 F9 B4 B0 9C E8 28 F1 0E A1 3C 74 BB 00 E8 08 3C 74 3C 74 3C 74 BB 00 8D BB 00 2A F9 80 FF 02 BB FC 75 EB 80 D4 02 A3 FC 75 EB 90 FC 75 E9 00 FC 75 E9 00 FC 75 E9 00 FC 75 E9 00 49 74 3A 15 74 80 53 03 80 80 0C 78 FC 75 B0 E9 00 FC 75 B0 E9 00 C3 06 00 75 F6 17 04 F0 06 00 74 E9 00 06 00 75 EB 80 96 FE 0E 00 FA BF 45 80 49 02 07 3E 00 75 50 05 B3 CD 58 06 00 75 F9 50 C0 06 00 C0 03 94 58 9C 4E FA 85 FB F6 F6 96 10 15 06 00 74 F6 17 04 0E 26 00 EB F6 17 03 03 6B FA 57 45 05 F9 F6 18 80 02 C3 C3 06 00 74 F6 17 08 F0 F2 96 F6 17 04 E4 06 00 75 F6 96 10 0C 06 00 74 80 96 FD 0E 00 E8 01 E8 2A FB 1B C0 65 BF 10 ED C3 03 0A 78 80 3B 2E FC 7E 80 57 05 FC 75 B0 F6 17 08 35 32 06 00 75 B0 F6 17 03 23 2E 1F C3 2D 06 00 75 B0 F6 17 04 0B 19 06 00 75 32 02 32 E8 0F C3 E4 0F C4 47 04 53 07 06 00 F8 8A 2C BB 9B D7 06 00 75 BE 9B 06 00 75 F6 17 03 32 06 00 75 F6 96 02 0D 2E 0B FC 75 B0 EB 32 F6 96 02 07 26 00 B0 E8 0F C0 43 06 00 75 EB E8 D9 E0 D9 34 06 00 75 3C 74 3C 75 E8 00 D6 F0 EB 3C 75 E8 00 C8 F0 EB 2C 7C 8A 19 D5 A2 00 C3 26 00 BE 9B B7 36 00 36 00 C3 06 00 74 F6 17 04 9C A1 00 1A A3 00 E8 00 02 CF E8 CB 2B 26 00 FC 72 80 06 35 A8 8B 63 83 06 A8 75 FA A8 74 26 05 46 FB 8A 49 80 04 05 EC 76 E8 00 8B 89 00 E8 00 C1 D9 F7 D1 C1 EC 8B B7 B3 8A D0 79 8A 8A 01 08 D1 79 F9 D0 E2 F5 81 00 FE 75 83 50 CF D5 C8 D8 6E 8B E8 00 22 C0 D8 36 00 53 C8 DB C3 58 05 FE 74 8B E8 00 02 80 C4 89 00 8B 8A 32 A1 00 E3 D0 E3 9F 00 4A F6 32 03 D1 03 97 8B 50 33 86 8B D1 D1 03 F6 49 02 02 E2 FA 8B 8B 32 BA 00 8B 8B B1 F3 74 05 00 75 5E C0 C3 2B B1 D3 C3 40 8E B0 E6 32 A2 00 8E BA 01 55 32 EC 55 06 B1 84 0D 0E 00 E8 00 03 05 B0 E6 C3 E8 01 15 B2 84 0D B9 00 00 E8 03 B2 EB B0 E6 33 8E 26 3E 01 80 1B 80 75 02 12 B4 84 C0 C0 C4 18 B2 E8 00 C3 05 02 12 B4 CD 73 52 F7 EC A8 75 80 80 0F 04 10 12 77 E2 FE 75 FE 75 E8 01 5C 09 13 F5 11 13 4D 26 05 02 8A 8A C0 06 C9 80 0C E4 8A 58 D0 8A 02 CE 01 CD 73 80 0A 16 FC 74 80 10 0C C1 11 11 0D C1 DE 01 B4 CD 73 E8 00 C3 8E 55 A8 74 B0 E6 B1 F9 79 B0 E8 34 C0 ED D8 33 8B 8E 8A C0 04 0D 0F 05 99 25 FE FE B5 F6 05 E4 A3 01 0E 01 C0 C3 0F 0D 0F 05 9A 01 FE FE F6 05 E4 18 8C 1A A1 00 00 A1 00 02 C7 4C 12 8C 4E C7 D8 43 8C DA FB 88 75 C3 B5 84 BD F6 01 03 D0 B9 00 00 E8 02 B0 E6 BB B9 C2 75 E8 00 E3 B9 00 00 E8 01 E8 00 44 BA 01 3C B9 F4 A8 74 E8 CC F6 75 B4 EB BA 01 3C 74 B4 F9 FA 8E 63 0C 8A B0 E8 33 C3 21 FB 21 A1 BF A1 B8 00 F6 EE 04 E8 CB 00 C3 53 52 57 55 EC 40 8E 81 03 8B 80 04 04 9C 00 E6 94 00 D2 34 E4 05 22 EB FE 75 E8 05 22 CC 05 6D EB FE 75 E8 05 10 CC 05 C8 EB FE 75 E8 06 1F 5E 59 CF FF FF FF FF FF FF FF FF FF FF FF 6A 10 53 01 E8 00 C3 50 E8 00 58 C3 CB FA 00 43 40 E0 40 E8 00 02 CF C4 D8 FA 00 43 40 E0 40 E8 00 02 CF C4 2B 81 50 5B E0 C6 8B B0 E6 E4 8A E4 86 8B B0 E6 E4 8A E4 86 2B 81 50 72 E2 FF 03 EB 87 86 8B 8B B9 00 EA 02 BE C6 26 8B 81 03 B9 00 D0 EB 90 20 88 00 AA 8B B9 00 E4 EB 90 E5 B8 B0 C0 2E 26 C6 04 27 40 26 85 80 47 EA E6 E9 52 D6 E2 B9 00 18 5A E2 00 04 E8 00 20 B0 5A 02 E8 00 FC 2E 26 C6 04 27 40 52 50 94 58 5A E8 1E 40 8E C6 12 FF 53 F6 C0 08 50 80 40 F3 C6 74 E8 00 EE EB 59 2E 07 E8 00 43 F5 8A 53 52 5B E2 C3 0D 48 B0 E8 00 BB 00 44 BB 01 9B C3 7D E8 00 7D E8 FE BB 03 2A BB 01 81 C3 E8 04 E8 06 8A E8 00 24 04 27 40 E8 00 BB 00 0E 10 B0 E6 B0 E6 B0 E6 E4 0C E6 E8 FE 61 FC 61 33 FC 00 8E 2E 07 26 85 80 47 F3 E5 33 FC 00 8E 8A 43 88 00 AA E2 07 60 06 D0 84 40 8E 89 67 8C 69 B0 E6 E8 B8 03 AA B0 E6 B0 E8 30 E0 B0 95 33 BB 00 F3 F8 10 99 E8 BD 8D 05 00 D2 40 F7 8A 8A 8C E8 00 9D B0 E6 B8 00 D8 C0 D0 20 66 FE FF 0F C0 9D 00 2E 01 51 B0 E6 B8 00 D8 16 00 26 00 C1 A1 00 D2 40 F7 3D 00 03 23 2D 00 F8 00 80 00 15 C2 33 B9 40 FF 66 AB CF C6 EB 07 61 BA 00 69 B9 00 4A F4 53 57 06 18 8E C7 4A 00 80 00 1B 1E 00 48 8E 66 C0 00 33 FC F3 FE FE EB 07 5F 5B C3 CC 88 41 0A 74 81 16 00 8A 00 26 00 E4 05 4E 01 C3 C6 40 FF 10 4E D2 0C 0A 06 26 00 E4 0A BA 03 8A A0 00 E8 BA 03 C0 04 3F 24 3A 74 08 3F FB B8 90 15 23 7D 08 8A 0A 7E 03 08 7E 05 02 05 D9 02 D9 E3 D8 7B FB 51 F4 B9 00 D1 EC 80 06 F6 80 04 C3 EC A8 59 8A A0 00 46 D0 26 64 8A A0 00 46 26 64 02 02 47 2A 04 E7 BA 03 3F 24 74 D0 A8 74 B0 8A 3F B1 D2 0A 0C EE 75 80 3E 00 04 B9 F4 06 00 75 E8 C7 F4 80 EB 80 3E 7F 26 E8 25 E4 B8 00 66 03 02 D2 FA 0C 04 C4 04 C4 D8 C2 81 C1 05 C4 05 C4 C3 7E C0 02 7E E8 07 7E E8 07 FF FF FF FF FF FF 50 20 A0 20 0B 47 8A B0 E8 2E C4 40 03 0E A8 74 E8 00 CF CD 58 06 1E B8 00 D8 06 00 74 81 9C D0 73 83 9E 01 1C 50 0B E4 E8 2E 26 00 A1 00 C0 1E 00 80 80 1F 07 50 E0 96 C2 B0 EE EA B1 D3 2E 84 CC 8A 42 42 58 1F 4A 32 EE 83 05 8A 42 C3 52 03 82 74 B7 E8 D2 06 B7 E8 D2 59 E4 0D 83 05 8A 8A 5A EB 8A C3 01 58 74 BE 00 24 4A 01 5A B4 50 00 43 40 C4 40 C4 F8 EC C7 29 24 1E B0 E6 E4 86 E4 86 57 F8 FF 5D 58 DF CD CB C4 CC 32 EB 8A 83 05 80 1E 83 04 42 B7 E9 D2 08 28 3C F5 DC DC E5 E3 E3 E3 DB FB C6 03 2E 24 FC C2 B0 EE EA 32 8B D1 2E 84 CC 86 42 42 8A EE 4A C0 4A 1A C3 02 19 C2 0A 75 EC 46 EB 80 1F C3 83 04 FC C3 04 03 01 00 00 00 00 00 00 00 00 AA 01 04 10 40 FF B0 E6 B9 00 44 E2 EB 2E 8A B0 E8 2C 8F 7D 3A 74 B0 E6 E9 00 91 84 B0 E6 B0 E6 E6 E6 E6 B9 00 44 E2 E9 00 AC D9 00 B9 00 EE E2 BA 00 08 EE 42 E2 E6 E6 E6 E6 E6 E6 E6 8A E4 3A 75 EB E4 3A 75 EB E4 3A 75 EB E4 3A 75 EB E4 3A 75 EB E4 3A 75 EB E4 3A 75 EB B0 E6 BA 00 08 EC 42 C4 17 F7 C0 B9 00 EC 42 C4 07 F6 CB 70 BA 00 69 B9 00 18 EB B0 E6 E6 E6 B0 E6 E6 B0 E6 B0 E6 B0 E6 B0 E6 B0 E6 B0 E6 B0 E6 B0 E6 B0 E6 C3 FA 8A 81 A8 74 EB B0 E8 2B F0 82 6F 8A B0 E8 2B E8 8A E8 00 3B 65 C4 F0 C1 BA 3C 77 8A 8A E8 00 17 4D F8 C3 C9 CC B9 22 E1 58 B9 00 E1 23 F7 03 59 D1 C6 C8 C4 92 E4 E1 C8 C0 CB D0 D1 C2 13 D1 D1 D1 D1 D1 D1 B4 CD EB B0 E8 2A 04 E0 8E EE 06 40 8E 33 8E 26 2E 00 C7 20 3E 80 6B FE 21 FE 21 3C E8 F8 06 00 75 E9 FE 89 20 80 6B FE C3 50 40 8E 80 6B 01 20 20 1F 8A C0 04 0F 0A B8 00 D8 1E 00 E3 DD 10 A0 00 C0 11 CB B0 E8 2A 10 E0 B3 6C E8 11 C3 A8 75 F6 02 20 0B C3 75 80 FD 20 80 FD BA 00 2C B9 00 96 5B 0C A1 DF A1 21 FB 21 1E 00 8A 62 3C 74 3C 74 3C 74 3C 74 B9 00 0A 57 B4 E8 B5 C2 16 00 1C D2 C6 FE 75 FE B4 E8 B5 08 35 53 FC 40 5B 02 29 8A 49 88 01 B4 E8 B5 D2 EF CA E6 03 0F 32 EB BB 01 AA C3 03 FF 80 18 04 C6 C8 08 F1 8A 51 80 49 07 09 3E 00 76 B7 B8 06 C9 18 16 00 E8 B4 59 1C 2A 37 46 E4 03 05 C3 15 80 39 F7 DC FF 8A 1F F6 17 08 E8 06 00 75 24 F6 17 03 03 AF F6 17 40 63 99 80 0F 05 00 EB 80 35 11 06 00 74 80 96 FD 00 EB 0A 78 80 03 5E FC 74 80 1C 5C FC 75 F6 96 10 46 06 00 75 B8 96 35 26 00 EB 3C 7E 3C 7C 3C 7D 24 F6 96 02 19 8C 8E BF CF 07 8A F2 58 07 26 00 B4 E8 00 C3 72 C0 D5 7F D1 AA E8 CA C9 EA 61 C3 7A BF 20 BB FC 74 80 35 0E 06 00 74 80 96 FD C3 FC 74 7F 2E 87 9B 95 C0 91 69 E8 CA 89 06 00 75 2C E9 FF 7F FC 75 F6 96 02 0A 26 00 B4 EB 90 FC 75 F6 96 02 0A 26 00 B4 EB 90 FC 75 B4 EB 90 8A 8C 8E B9 00 FC 04 F2 58 22 20 14 FC 7C 80 0E 0F 61 09 7A 05 C0 18 F9 80 76 F4 F0 F2 0E 1B 27 29 33 35 FA 36 00 04 46 36 00 04 36 00 36 00 11 36 00 E8 19 50 02 CD 58 FB BB 00 98 58 B4 8A 00 4E 01 C3 E8 00 40 C3 90 02 10 89 C3 E8 FF 56 0A 75 C0 04 0F C0 07 04 03 EB F9 C3 0D 8A F6 10 B0 EB B0 E8 27 8B 10 F6 01 12 E2 74 80 40 08 02 07 01 03 00 C3 FC 66 0A 74 C0 04 06 00 E7 8A 8A 06 E4 03 E0 F6 20 8F 8A C3 C0 8F 8A 06 E4 03 E8 25 00 50 52 C4 E8 BA 03 A0 00 D8 C0 E8 F6 01 02 01 E4 0A 88 8B 5A 58 E8 F7 FB 7B EC E8 F7 FB 71 8A EE 26 1C FB EC 86 E8 FF 50 5D B7 E8 FF 7E C0 02 7E E8 FF 32 75 B9 00 42 E8 FF 05 E2 E8 00 26 00 C3 42 A8 74 A8 74 B4 EB 8A 43 F6 30 04 EC 14 C4 74 FE EB F6 80 02 04 02 00 BB 00 DB 90 8B 80 93 03 C7 8A 24 C0 06 C0 51 C8 24 05 27 00 13 74 E3 B8 04 01 D2 13 03 84 80 04 04 C0 7B 00 13 97 C3 80 28 09 B1 33 CD 73 80 04 04 C0 3D CB 7B ED EB B3 32 B4 CD B4 E8 00 01 B1 33 CD 73 B4 CD B4 E8 00 01 B1 33 CD 73 FE 74 FE EB BB 00 3F 74 B4 E8 00 3C EB 90 34 6B BA A1 4E B4 E8 00 90 80 74 06 15 EB 90 08 EB 90 01 47 BA A0 2A 89 90 E8 FD 23 CF 24 C0 04 C8 FB 74 FE BA A1 0A C8 22 74 BA A1 83 C3 BB 00 27 0A 27 32 80 8F 06 C3 8B 75 E8 FD E8 3A 74 80 34 08 03 47 04 43 33 07 0C 24 0A 8A B0 E8 24 9A A8 75 8A 80 20 0E EE BA 20 2B B9 00 38 BD 00 08 B4 CD B4 CD B0 E6 EB B0 8A E8 24 FB C4 C0 C3 8B 33 8E BF 00 8C AB C3 1E 0F 0F B0 E6 B8 1C D8 40 8E 26 16 00 89 67 C7 64 00 B0 E6 E8 AC 09 0E 00 00 61 E8 B2 62 84 06 00 00 06 00 00 F6 26 3E 00 12 0F 7C A3 00 7E A3 00 FE FC 57 06 DB C3 30 8E BE 83 93 B9 00 A5 1F 5E 63 84 78 73 B0 E6 EB 90 3E 00 00 16 0E 00 00 1E 00 1E 00 1E 00 1E 00 92 E8 B0 C0 03 EE 8B 76 81 80 89 7A 8B 7C 81 80 89 80 A0 00 8F B4 C6 92 01 F9 8B 8A 81 80 89 86 0B 74 81 64 01 88 66 89 67 88 69 B0 E6 8B 78 89 7A 8B 7E 89 80 8B 86 81 80 A0 00 8F B4 C6 92 01 AB 8B 8A 89 88 0B 74 81 64 02 88 6E 89 6F 88 71 A1 00 00 BB 3F 1E 00 C3 39 2E 00 2E 00 C5 00 8D A3 00 06 00 8A 8C C6 92 01 D1 0B 74 81 64 02 88 6E 89 6F 88 71 06 40 8E BD 00 C5 17 07 80 C6 92 01 FE 00 65 A9 00 12 0E 00 00 2E 00 16 00 0E 00 86 BB 04 E3 02 C2 21 E2 06 00 E8 03 02 74 81 64 04 88 6A 89 6B 88 6D A1 00 C0 28 00 F7 B0 8A C6 92 01 07 A9 00 12 0E 00 00 2E 00 16 00 0E 00 88 05 04 80 2B 8D 3B 73 A0 00 FE 06 00 E8 02 02 74 81 64 08 88 72 89 73 88 75 B0 E6 8B 86 26 1E 00 1E 00 B0 E3 34 B0 8A E8 22 00 06 00 00 02 01 9E B0 E6 81 86 80 72 B0 E8 22 80 E0 B3 04 B4 F7 64 FF 74 B4 B0 E8 21 68 84 60 20 64 25 E4 A8 74 E4 8A 80 04 60 64 E8 15 8A E6 E8 15 FE 64 EB B0 E6 BB 00 08 B0 E6 BB 00 40 8E 8E 69 8B 67 53 37 5B DB 03 98 B0 E6 B8 1C D8 06 00 00 16 1B 32 8A 66 8B 8A 69 8B 67 E8 AB 06 00 00 16 FD 32 8A 6A 8B 8A 6D 8B 6B E8 AB 06 00 00 16 DF 32 8A 6E 8B 8A 71 8B 6F E8 AA 06 00 00 16 C1 32 8A 72 8B 8A 75 8B 73 E8 AA 06 00 00 0F A3 BA 00 69 B9 00 56 F7 64 FF 74 E8 EF 06 00 00 03 25 E4 A8 74 B0 E6 E8 06 6C 84 A9 A1 1F C3 8A B0 E6 8A 8A B0 E6 8A 8B 80 39 7A 76 81 64 80 8B 7A 89 82 E8 00 1E 00 1E 00 04 1E 00 1E 00 30 74 81 64 80 89 82 E8 00 1E 00 1E 00 16 50 6F 84 89 82 E8 00 1E 00 1E 00 0B 74 F9 C3 57 B0 E6 88 4C 8A 32 8B BB 00 3E 00 75 B8 00 C0 C5 45 83 82 00 0C 00 C7 84 00 E9 00 71 84 48 8E 53 57 A0 00 06 00 05 51 EB E8 B4 5F 5B 0A 2E 00 01 EB 90 C3 FC 51 8A 4C B9 00 FF C0 DB 00 AB F6 1E 00 00 F6 02 03 01 AB 59 80 92 01 0C 40 8E 8B 03 E8 A7 1E 00 06 00 EB 90 06 00 E9 FF 1E 00 B0 E6 58 5F C3 57 50 72 84 A2 00 BB 00 C3 08 8A 33 33 D1 1D 00 75 E2 26 05 61 C0 06 C0 FF 37 26 05 61 C0 07 C0 01 EB 80 92 01 0F 40 8E 8B 05 00 E8 47 58 28 4F 32 75 47 32 8A 26 05 8A 8A 4C B0 E6 58 C5 84 8B B8 00 11 C0 E0 03 7A 3D 00 F8 00 5B 07 E8 11 E8 E8 75 B8 90 CD FA 25 FB 74 3B 82 75 8B 80 89 1A FB E8 11 E8 E8 C3 17 C3 FC 74 3D E0 05 0D EB 3D E0 05 2F EB 80 84 0F F0 0B E0 02 00 FF EB 33 85 C3 FC 74 3C 75 B0 C3 8A 18 8A 24 80 04 E3 0A 8A 96 80 0C E0 17 5B 3C 75 80 03 56 FB 77 51 81 75 80 97 EF 87 B0 E6 B9 FF 06 00 75 E2 E8 11 F4 60 24 26 00 E8 11 C7 E0 0A E6 B9 FF 06 00 75 E2 E8 11 F4 60 26 00 59 FA 36 00 0C 46 36 00 04 36 00 36 00 09 36 00 C0 EB B0 F9 C3 3C 74 3C 74 84 75 E4 24 0C 24 2E 06 00 86 8A 01 EB FE 75 E4 24 0C 24 2E 06 00 86 8A 00 EB FE 75 E4 24 0C E6 B4 EB FE 75 E4 B4 A8 74 8A 80 3F 40 86 2D 86 7F C0 86 00 21 F9 72 83 32 26 32 2B 40 8A E4 24 0C 24 0A E6 EB B0 FA 4B FC 74 8A E6 FB C3 86 40 08 80 04 08 2D 40 21 00 3F 3A 01 74 B4 2E 06 00 15 E4 32 2B 41 B4 EB B4 A8 75 B4 8A 32 C3 F2 B4 74 B4 A8 74 B4 8A 32 C3 06 60 02 03 0A 83 38 EC D0 C0 D8 FD C0 38 F3 8B 8D 10 C7 FF 26 45 80 C6 06 26 45 92 C7 02 00 C6 04 8D 18 C7 FF 26 45 00 C6 06 26 45 92 D0 10 F7 03 80 00 30 80 00 89 02 88 04 DB D4 73 E9 00 7C 26 05 C0 40 07 46 00 81 BB 00 B6 72 8A 46 C0 5D 7C 8B 8D 18 70 8B BF FF 8B 2E 05 0F 7C 26 35 06 C6 FF 04 C6 FC DB 6F 8D 30 8F FE 74 26 25 BB 00 5B 72 C6 46 EB 26 0D BB 00 49 72 C6 46 EB 8D 30 8A 80 40 06 46 01 04 46 02 C4 61 07 E2 FC 35 75 FF 04 75 B9 00 A5 EE 83 08 44 8F 04 44 8F C3 7C 26 5D B9 00 87 15 8D 10 EF 00 11 08 04 01 FF 11 70 02 01 FF BA BA D7 D7 DE DE E3 E3 E3 00 DE 00 E0 00 C8 00 84 00 85 02 FA F0 0F F0 B3 70 00 71 10 08 20 24 0F C0 40 8E E4 A8 75 8E B0 E6 B0 E6 B9 FF 64 01 05 F8 3D B0 E6 E4 B0 E6 B0 E6 B8 E0 D8 DB 3F 55 08 13 2E 2E DD 05 84 00 8E 33 81 AA 75 BD DE FF 8A B0 E6 B8 00 D8 00 EB B0 E6 B0 E6 EB EB E4 8B B0 E6 EB EB B0 E6 80 09 03 F7 B0 E6 80 0A 03 57 32 E6 B8 F0 D8 D2 5A B9 00 8A AC E2 BA 00 08 B0 EE 0A 74 B0 EE F3 FA 74 BA 00 E6 00 20 A0 09 84 FB 76 B3 32 D0 2E B7 DD 40 8E FF B0 E6 B8 00 D8 2E 00 0B 84 20 20 E9 0C 84 61 F3 61 0E 70 19 FA F6 EA E5 D6 AA A5 95 56 FE BF 00 EC E9 A9 E3 80 40 37 01 BD DE C4 06 C8 C0 CE B9 00 C3 AE 02 1A 00 BB B6 23 E8 E8 0E C9 0C B4 86 E8 19 5D C6 01 83 06 83 06 04 6E 02 6E 46 01 10 42 8A 4A 11 42 4A 06 00 05 7C 33 32 8A 49 2E 87 DF DC 79 33 8A 4A 80 04 37 FB 74 B1 F6 8A D0 D0 88 03 66 D0 88 05 03 E0 E4 E0 46 80 49 06 06 66 D1 06 C2 EE F6 88 03 66 B1 8A D3 89 06 E0 46 EB 03 05 03 03 60 FA 06 00 DF 0E 00 26 00 16 00 88 B8 0A 02 B0 E6 F4 FD 16 00 26 00 61 FF 5C 55 48 52 20 41 39 47 42 33 57 39 44 43 33 50 28 29 6F 79 69 68 20 4F 50 51 43 6D 75 65 20 6F 70 72 74 6F 20 39 32 38 2C 34 38 2C 36 E9 DA 31 00 28 43 29 43 6F 70 79 72 69 67 68 74 20 43 4F 4D 50 41 51 20 43 6F 6D 70 75 74 65 72 20 43 6F 72 70 6F 72 61 74 69 6F 6E 20 31 39 38 32 2C 38 33 2C 38 34 2C 38 35 2C 38 36 2C 38 37 2D 41 6C 6C 20 72 69 67 68 74 73 20 72 65 73 65 72 76 65 64 2E B0 E6 B0 E6 B0 BA 00 B3 E8 00 12 4B 0E 84 92 4B 22 4A EE 80 05 B0 E6 C3 00 8A E6 EC E0 3D 00 18 F1 92 4B 12 4B 69 B9 00 5A E9 E6 FE FF FF FF FF FF FF FF 50 61 40 02 CF 01 85 11 84 B0 E6 B0 E6 E6 E8 01 61 E4 E0 96 EB 90 FE CC 02 C5 C8 D8 C0 30 8E BC 01 20 E8 00 ED 08 30 E8 00 27 FA 04 D3 B9 00 A2 8B 81 03 B9 00 96 B0 B4 CD 33 B9 00 88 F4 F5 FF FF F2 E9 A6 EE C0 D8 DB 07 07 61 08 61 F5 FF FF 10 E9 A6 EE 61 F7 61 61 40 03 FF B8 00 D8 3E 04 E7 BB 00 00 8E 66 AD 61 40 0C C3 10 DF EA C0 E5 F3 D5 FF 56 E9 A6 EA E3 33 B1 D0 73 42 F9 D2 FF 10 92 26 E2 04 3C 76 04 B4 CD E2 C3 0A 74 B4 CD EB C3 E1 75 0E 33 8E BF 00 24 AB 26 AB 7C A1 71 A1 71 BF 01 2C AB 2E AB 07 B8 00 10 EA E1 F0 53 52 1E 40 8E 81 03 8B 8A 78 D1 8B 08 0B 74 50 E4 0B CC 49 CC 5B EB EE EB EB EC F8 28 B8 90 CD 58 11 24 E8 AE 24 78 E2 FE 75 EB EB EC F8 04 01 2D EC 1C 01 00 00 24 EB 42 B0 EB EE 05 E8 E2 04 00 00 4A 42 00 00 24 34 8A 58 E7 5E 59 CF BB 8E 04 BB 0E C7 77 A8 74 32 EB 8A E8 15 02 C3 E8 0F C6 84 80 0C C3 80 84 80 18 00 BB B9 30 E8 E3 B8 00 D8 06 00 1F C3 00 CF E3 00 86 00 80 00 18 7F 31 75 E8 9C 58 0A 09 B9 00 16 0E 86 80 08 40 04 92 4B C3 FF FF FF FF FF FF FF FF FF 32 04 00 00 00 00 31 11 67 04 00 00 00 00 7E 11 67 06 00 00 00 00 67 11 00 08 00 02 00 00 FF 11 AC 06 00 02 00 00 AB 11 B9 05 00 00 00 00 B8 11 CE 08 00 01 00 00 FF 11 9D 05 00 00 00 00 9C 11 84 0F 00 FF 08 00 83 11 D4 05 00 FF 00 00 D4 11 9D 07 00 00 00 00 9C 11 9D 09 00 00 08 00 9C 11 64 08 00 01 00 00 63 11 D4 04 00 00 00 00 D4 11 00 00 00 00 00 00 00 00 64 04 00 00 00 00 64 11 D4 05 00 00 00 00 D4 11 C6 05 00 00 00 00 C6 11 F2 0B 00 FF 08 00 F1 11 DD 05 00 01 00 00 DC 11 DD 07 00 01 00 00 DC 11 0C 04 00 FF 00 00 0C 28 9C 08 00 FF 00 00 9C 11 C6 0E 00 FF 08 00 C6 11 C6 10 00 FF 08 00 C6 11 FF 0E 00 FF 08 00 FF 11 40 06 00 FF 00 00 40 21 C6 0F 00 FF 08 00 C6 22 D8 07 00 FF 00 00 D8 22 67 04 00 00 00 00 67 19 67 08 00 00 00 00 67 19 89 09 00 00 08 00 89 19 40 08 00 FF 00 00 40 21 C6 07 00 FF 00 00 C6 22 C6 08 00 FF 00 00 C6 22 C6 09 00 FF 08 00 C6 22 C6 05 00 FF 00 00 C6 22 63 10 00 FF 08 00 63 3F FF 0B 00 FF 08 00 FF 21 FF 0F 00 FF 08 00 FF 22 5E 0F 00 FF 08 00 5E 34 FF 10 00 FF 08 00 FF 3F 25 04 00 FF 00 00 25 1A 25 02 00 FF 00 00 25 1A EC 08 00 FF 00 00 EC 21 EC 06 00 FF 00 00 EC 21 C6 05 00 00 00 00 C6 19 FF 0B 08 FC 00 00 00 83 06 FC 0F 84 00 85 C7 E8 ED DA 8A 84 B0 E6 B9 00 B4 CD BB 7C 01 B8 02 13 73 72 FF FF E9 DE E2 BB 84 FA 74 B0 E8 11 40 1E DA 40 8E 8A 75 8E 0A 74 A8 75 B0 E6 BA 00 AB 18 C2 75 60 06 22 07 61 84 BD 95 07 09 8B F3 75 BE 93 34 EB B0 8A E8 11 FB C4 4A 81 FE 55 75 E8 FC BC 84 00 00 83 06 BE 93 06 B4 CD CD FC AC 24 05 00 EB C3 F3 21 66 A5 75 8B 8B 66 A5 E5 F3 21 66 A7 0C 75 8B 8B 66 A7 07 EF 83 04 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FC 56 8B BE 00 DE E4 0B B8 E8 F1 F8 B3 FE 75 81 0A 02 66 FE E8 F1 03 9D E8 F1 05 92 EB 81 0A FF 4E 01 E9 00 CC 05 AD EB FE 75 E8 F2 74 CC 02 6E CC 05 56 EB 80 0B 08 5A E8 F1 58 FC 75 81 0A 02 66 FE E8 F1 44 A5 81 0A FF 4E 01 EB 80 0D 05 9D EB 80 EB 05 39 EB 80 EC 05 D1 EB 80 ED 05 07 EB 80 EF 05 11 EB 80 0D 5E CF 50 40 8E B8 FF A0 A0 C0 0C E0 A1 C4 A1 A0 16 0B 20 20 C0 0C E0 04 06 21 C4 21 FC 74 B0 E6 88 6B 58 CF B9 00 F4 E8 A8 A8 75 E2 F9 08 E8 A8 42 40 C3 FF 4C 72 E8 D4 0D A8 72 E8 D8 03 F7 C3 AF B0 E6 E8 02 FC 1E BB 00 DB 06 00 74 E4 3C 75 80 96 40 26 00 B0 E6 FB FF E9 01 06 00 74 E4 3C 75 80 96 BF 0E 00 80 17 20 B0 E8 0F 40 0E 2C 0D A8 75 80 17 DF B0 E6 FB B6 80 96 DF FF E9 00 17 E8 FF D8 60 B4 CD BD 00 08 20 20 E9 00 E0 3C 75 F6 18 08 0E B2 73 FA 20 20 E9 00 20 20 80 E0 07 0E 00 EB 80 E1 07 0E 00 EB 80 FE 0A FC 75 80 97 10 EB 90 B1 F6 18 08 65 1C FF FF FF FF FF FF FF FF FF C7 72 34 E9 F5 FC 74 80 D4 07 06 00 75 80 46 1C FC 75 F6 96 01 28 51 72 80 52 1E E4 1A 0E 06 00 75 F6 17 04 07 26 00 EB E8 FE 88 15 E8 00 C6 85 07 61 04 E8 00 50 26 00 F6 96 01 12 E4 80 45 05 FC 74 80 96 FE C3 E8 01 AE 64 C3 16 E8 D7 17 FC 75 FE EB 80 4A 09 C8 28 16 EB 3A 15 74 80 2A 05 FC 75 F6 96 02 31 FC 75 F6 96 01 25 E4 21 DB 1E 00 19 E4 50 FC 61 0F 0C E6 E8 00 75 58 61 C3 53 00 43 40 D8 40 F8 00 43 40 E0 40 E0 2B 81 1D 5B EA 58 50 17 C0 04 07 26 00 E4 3A 74 80 97 F8 06 00 02 58 50 E8 00 4D 26 00 E8 00 ED 60 FF F6 97 10 0B F7 45 B0 E6 EB 80 97 EF 37 A0 00 E8 24 80 97 F8 06 00 60 FF F6 97 10 02 F7 26 00 59 C3 FA 97 0C 86 97 A8 FB C3 B9 04 65 E4 A8 E0 59 FF 34 45 C0 C0 C0 E1 A6 A6 48 63 7C 10 38 FB 1E 57 52 53 8B 33 8E C4 78 B8 00 D8 06 00 81 16 00 46 8A 06 FC 73 3C 77 3C 76 3C 72 2C 8A 32 D1 2E 97 EC 07 01 EF 9C 26 5C 88 40 81 16 02 5B 5A 5F 1F CF E1 75 E8 A3 0A 23 74 81 16 00 B0 E6 32 0A 74 B9 00 01 E2 E2 FA 03 EE C3 7E 02 28 46 BB 00 E3 46 83 00 FA 73 8A 00 FF DB C3 D2 80 0F 04 46 04 3E 00 74 80 41 09 07 D4 0A 75 33 8A 00 8A 03 80 D3 F7 48 C8 06 03 73 8A 01 04 0A 09 4E 01 EB 90 3B 75 32 8A 01 E3 8B D1 E6 B0 EB E6 8A E8 E4 F9 8A 07 9C 8A 04 96 83 03 9C 46 80 01 75 E8 E4 1A 8B B7 24 74 B7 A8 75 B7 E8 E4 7C E8 E4 EE E8 01 17 07 BF 00 F6 74 E8 A3 88 47 F2 95 88 41 E8 FE E4 1E 56 B9 00 C0 D8 AC 56 10 B8 10 D8 AC 59 E8 A1 66 8B 8A F6 10 0D FC 75 80 03 C4 88 E8 E3 4A 0B FF E8 DC 04 E4 66 03 73 B4 EB E8 00 2E 02 0A 4D DE 8A 07 E7 0A 06 D2 83 03 D8 83 04 D2 83 07 5A 74 81 16 00 26 00 66 0A C3 E1 B9 00 44 74 E2 B4 EB E8 A3 07 8A 06 92 E8 00 07 D8 A8 B4 C3 01 4E D2 84 3E 75 08 3E E8 A2 47 00 BB 74 24 3C 75 E8 FF 7A 8F E8 A2 27 46 F6 20 02 E0 4F 32 3A 74 88 04 BB 00 4F 5B B7 E8 E3 7E C0 02 7E E8 E3 91 8A 04 1C FB 7C 75 33 26 5C 8A 01 03 04 05 14 E8 A2 B0 80 02 02 0F D8 02 C3 DB 03 01 E8 00 C0 40 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 50 B8 00 D8 0E 00 B0 E6 B8 91 15 58 B7 E8 E2 02 EB A2 00 98 E2 A0 00 F8 01 CD 73 F6 3E 80 1B E4 1C 04 B9 3D C0 06 00 75 E8 A1 F4 75 E8 DA 80 26 00 0A C3 2A 2A 2A 2A 2A DF 25 0F FF F6 08 F3 46 4A 42 B7 E8 E2 4A C3 08 8E BE 00 04 C6 FE 04 C6 FE 38 8E B9 20 F6 F3 B8 00 C0 33 33 B9 20 F3 FF FF FF FF FF FF FF FF 80 14 07 FC 75 B4 FC EC 40 8E 8A 10 80 30 00 80 30 03 00 8B 63 8E 86 8B 86 81 FF D1 2E 94 97 8B FB 1E 57 53 52 EB 4F CF B9 00 C9 74 E2 59 EB E8 A1 EE E2 F8 FF FF FF FF FF FF FF FF FF FF FF FF 28 0A 06 1C 07 07 00 00 50 0A 06 1C 07 07 00 00 28 0A 06 70 01 07 00 00 50 0F 06 19 0D 0C 00 00 28 0A 06 1C 07 07 00 00 50 0A 06 19 0D 0C 00 00 28 0A 06 70 01 07 00 00 50 0F 06 19 0D 0C 00 00 00 00 00 00 00 00 1E 50 51 56 B0 E6 FC 00 B8 E0 D8 55 3B 00 75 33 33 E8 01 06 8B EB 90 E2 84 00 8E B8 AA 06 00 3B FF 75 32 8A 02 C1 09 FF 3B 74 2B 3B 72 83 0F E3 FF FF 2B 3B 72 BE 00 C1 75 D1 E8 00 13 E8 01 74 E8 00 5E 59 58 1F C3 E8 00 00 8E 8C 8E BF 00 8B A3 71 C7 26 05 26 C1 04 C3 E0 89 BF 00 8B A3 71 C7 26 05 2A 26 1D 0C 26 05 2C 83 02 8B A3 71 89 B0 E6 1F ED 0E 00 E1 C1 04 D9 83 00 1F 81 FF 81 00 C1 0C 10 2B B9 F0 C1 E0 26 3D 88 C3 6A 33 B8 E0 C0 FB ED 0E 00 E1 F3 C3 51 33 AC D0 FB D2 59 C3 06 57 B9 C0 C1 ED 8A 02 C1 09 E9 8B 8C 8E BE E0 03 F3 59 5E 1F 53 FC 50 06 FA FF AE E9 95 07 66 5B E4 53 FE E4 B3 EB E8 00 FF 10 0C 01 0C 08 02 04 02 00 C4 E4 50 E8 F9 A3 64 58 FA 41 B0 E6 E4 A8 74 E4 EB E8 F9 A5 64 29 51 10 E4 A8 E1 59 02 60 9C 15 B0 E6 0E 03 EB 90 58 C3 7D 84 E0 2E 34 8A 01 C0 40 03 B7 E8 B0 00 80 2E 01 57 0F C0 01 0F C0 5B 28 B8 00 D8 06 00 E6 80 02 40 BB AA AA 78 E9 06 76 BB 6D DB 86 E9 06 68 BB 55 55 94 E9 06 5A FE B8 00 D8 48 8E B8 00 7C 33 BD F3 25 BA 00 BA E9 F4 C0 E9 FC 30 8E B8 00 C0 04 BA 00 FF D8 E9 F4 16 7C BD F3 07 72 81 82 74 BB F9 A9 01 80 AE B8 00 D8 48 8E B8 00 FE BA 00 00 BD F4 C3 BA 00 1C E9 F3 38 8E B8 00 7C BF 80 30 E9 F3 BE 7C BD F4 AF 72 8C B8 00 D8 C0 F6 00 66 AD DB 04 BB F9 7C BF 00 62 E9 F3 7C BD F4 6B B8 00 D9 D8 00 80 02 C6 FE 04 C6 FE 04 8E B8 00 7C 33 BD F4 55 72 BA 00 A0 E9 F3 03 4B B8 00 D8 00 80 02 C6 FC 04 C6 FC 04 E4 3C 75 80 02 B8 00 C0 D8 20 66 FE FF 0F C0 DF 00 2E 01 5D E4 3C 74 33 B9 00 AD E8 D2 7F B0 E6 32 E6 C3 66 ED B8 00 00 33 B9 40 FF 66 D0 AB F9 61 0C 61 F3 61 BB 00 00 33 66 C5 1F F6 F4 00 8A 9E D1 9F F4 AD 33 E1 75 E4 A8 66 00 00 75 66 7A 1F C0 C6 00 E4 0C E6 24 E6 58 0B 75 E8 92 E0 E4 33 B1 D0 73 46 F9 F6 C0 11 EE B9 00 FF 07 C1 08 E2 8A 8B 1F C3 32 26 05 D7 C7 E8 46 C3 22 98 C3 E0 FC 0B 30 8A 49 88 01 26 3D C7 8A 49 88 01 33 8B 02 EA 03 00 D1 D1 D1 D1 03 D1 D1 03 B7 80 49 06 04 D1 E7 DF D3 D1 EA EA EA D1 E1 D2 03 C3 8B 84 1F 72 3C 75 BA 00 85 B9 00 1E E8 00 3C 74 E8 00 7B B0 E6 B0 E6 B9 00 34 73 E2 EB 90 60 FA F5 87 84 32 E8 01 1A F9 40 8E 80 96 EF ED 74 80 96 10 EB 90 88 84 60 AA 03 2D B0 E6 B0 E6 E8 00 1F E4 72 B0 E6 E4 50 AD 64 C0 58 05 EB 90 8D 84 BA 00 B4 B9 00 09 00 BB B7 24 E8 D0 B0 E6 E8 00 0E 00 BB B7 1F E8 D0 FE B0 E6 E8 00 2E AD 64 74 72 E8 00 81 84 AA 64 64 E8 00 04 F9 0A 82 84 60 55 12 83 84 00 BB B7 1F E8 D0 FE 84 84 60 64 34 B0 E6 C3 2C 72 E8 00 AB 64 20 72 E8 00 09 8C 84 60 EB F9 E8 CE 64 01 04 60 F3 51 64 E4 A8 74 51 B2 59 F3 59 51 64 E4 A8 75 51 9E 59 F3 59 0E FC A0 84 F2 B0 EE A1 84 64 E8 CE 0C B0 E6 BB 00 7D BE F8 04 E8 F8 54 1C F2 EE A3 84 ED 9C 72 BB 01 5B E8 F8 38 64 E8 F1 30 F9 2C A9 EC C0 03 EB 81 01 74 3C 75 E8 F1 12 8F EC F9 BF 00 BE A5 84 04 A4 84 0C B9 00 00 E8 CF 04 A6 84 21 BF 21 00 D2 D4 FF FF FB B8 00 D8 13 1F E8 A6 2A 2A 2A 2A 80 7F 4C FC 74 80 92 42 8B 81 00 C1 07 FF 84 EB 90 BF 92 EB CA 00 F8 F8 F8 A1 A1 F8 A2 A2 A4 A4 F8 F8 F8 F8 F8 F8 F8 F8 A5 FC 75 F9 02 FB 86 CA 00 32 C3 5F E8 F6 F4 F2 F0 EE 5F E4 8A 32 FE 02 0E 55 83 04 75 80 45 EE C3 70 71 E6 8A E6 C3 DF 07 08 FF 00 01 00 02 00 04 00 08 00 10 00 20 00 40 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 02 00 04 00 08 00 10 00 20 00 40 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FE FF FD FF FB FF F7 FF EF FF DF FF BF FF 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FD FF FB FF F7 FF EF FF DF FF BF FF 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 48 8E B9 20 FF 8B 66 AB 08 8E BE 00 04 C6 FE 04 C6 FE 38 8E 33 B9 20 F3 33 B9 20 8B 66 D0 F3 33 B9 20 AD 3B E1 74 F9 E5 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 81 81 99 7E FF FF E7 7E FE FE 38 00 38 FE 38 00 7C FE 7C 7C 10 7C 7C 7C 00 3C 18 00 FF C3 E7 FF 3C 42 66 00 C3 BD 99 FF 07 7D CC 78 66 66 18 18 33 30 70 E0 63 63 67 C0 5A E7 3C 99 E0 FE E0 00 0E FE 0E 00 3C 18 7E 18 66 66 00 00 DB 7B 1B 00 63 6C 38 78 00 00 7E 00 3C 18 3C FF 3C 18 18 00 18 18 3C 00 18 FE 18 00 30 FE 30 00 00 C0 FE 00 24 FF 24 00 18 7E FF 00 FF 7E 18 00 00 00 00 00 78 30 00 00 6C 00 00 00 6C 6C 6C 00 7C 78 F8 00 C6 18 66 00 6C 76 CC 00 60 00 00 00 30 60 30 00 30 18 30 00 66 FF 66 00 30 FC 30 00 00 00 30 60 00 FC 00 00 00 00 30 00 0C 30 C0 00 C6 DE E6 00 70 30 30 00 CC 38 CC 00 CC 38 CC 00 3C CC 0C 00 C0 0C CC 00 60 F8 CC 00 CC 18 30 00 CC 78 CC 00 CC 7C 18 00 30 00 30 00 30 00 30 60 30 C0 30 00 00 00 FC 00 30 0C 30 00 CC 18 00 00 C6 DE C0 00 78 CC CC 00 66 7C 66 00 66 C0 66 00 6C 66 6C 00 62 78 62 00 62 78 60 00 66 C0 66 00 CC FC CC 00 30 30 30 00 0C 0C CC 00 66 78 66 00 60 60 66 00 EE FE C6 00 E6 DE C6 00 6C C6 6C 00 66 7C 60 00 CC CC 78 00 66 7C 66 00 CC 70 CC 00 B4 30 30 00 CC CC CC 00 CC CC 78 00 C6 D6 EE 00 C6 38 6C 00 CC 78 30 00 C6 18 66 00 60 60 60 00 60 18 06 00 18 18 18 00 38 C6 00 00 00 00 00 FF 30 00 00 00 00 0C CC 00 60 7C 66 00 00 CC CC 00 0C 7C CC 00 00 CC C0 00 6C F0 60 00 00 CC 7C F8 60 76 66 00 00 30 30 00 00 0C CC 78 60 6C 6C 00 30 30 30 00 00 FE D6 00 00 CC CC 00 00 CC CC 00 00 66 7C F0 00 CC 7C 1E 00 76 60 00 00 C0 0C 00 30 30 34 00 00 CC CC 00 00 CC 78 00 00 D6 FE 00 00 6C 6C 00 00 CC 7C F8 00 98 64 00 30 E0 30 00 18 00 18 00 30 1C 30 00 DC 00 00 00 10 6C C6 00 53 DC FF FB 00 07 E3 FF 85 32 5B BD D9 F4 1D 50 72 AA F1 FF 26 00 CD B0 E6 5A 1F 1E 52 40 8E FF 6C 75 FF 6E 83 6E 18 13 B0 2B 6C 75 A3 00 6E 40 70 A0 00 FF 1F 06 00 74 E4 A8 74 A8 74 24 E6 B0 E6 2E 00 E6 FE 40 75 B0 BA 03 F6 3F 07 8C 86 80 86 40 82 C0 86 92 4B 77 FF FF E9 E9 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF CF 1E D2 02 17 C4 74 BB 00 DB 01 06 01 01 43 E8 8A 0F 10 EC B4 CD 59 33 B4 CD B4 CD E8 8A 17 C2 D5 ED 75 72 32 FE 80 19 DF 67 1A 5A 02 10 88 00 1F CF FF 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF E9 9F 7F 7F 32 20 33 4F 50 51 8E 00 30 2F 30 38 20 19
2C 60 E0 2E 34 8B A9 0F 03 26 BB 22 E4 80 40 0A 19 3C 75 BB 32 8B 2E 3E 00 88 01 E8 72 C3 52 7C FA 61 E0 D4 E4 E4 24 3A 75 B0 EE 24 5A C3 FB FF E3 97 00 56 8B 60 89 04 46 00 C3 0E 42 8A 4A 0F 42 C3 53 06 48 8E B1 B5 B0 E8 00 80 A3 00 10 FD 01 08 A3 00 59 58 53 55 D0 C5 0E 00 C5 00 26 07 00 C7 02 FF FC 8B FC FC FC FB 26 06 00 74 A0 00 C1 14 38 4C 74 00 4C EB A0 00 C1 C0 E4 E0 5D 5B 53 52 57 0A B9 00 08 33 F7 80 30 07 95 00 4F EF BE 00 00 B9 00 A5 BE 00 00 B9 00 A5 5E 59 C3 51 57 E8 00 08 70 00 8E BE 00 89 15 E4 5F 59 C3 1E B8 1C D8 C0 33 BF 00 04 F3 BE 00 00 BB 00 E3 00 80 00 44 88 04 44 92 04 00 10 B8 F0 10 F7 05 E3 D2 89 02 54 C6 05 C7 07 BE 00 C8 9A 6C BE 00 00 B3 E8 00 20 B8 00 92 56 BE 00 D0 92 4C BE 00 00 B3 E8 00 48 B8 20 92 36 BE 00 00 B3 E8 00 06 00 C6 57 80 58 B8 F0 92 16 8C 8E BE E3 A9 B9 00 D1 F3 07 61 C7 FF 8A C1 04 EF 89 02 7C 88 05 44 00 C3 B0 E8 76 C0 03 EB B0 E8 76 E0 95 90 A3 00 98 88 8A B0 E8 76 78 F8 C3 B0 E8 76 E0 CC 0A 75 80 EF 8E 69 58 56 78 5B 22 BA 00 83 B9 00 A9 C3 E8 44 E8 00 00 BB B6 19 E8 44 A1 00 C0 40 03 84 BE B6 FB 74 80 FF 6E DB 6A 10 C4 03 03 69 02 02 40 DF 56 F0 80 10 C4 0C E8 3C 74 3C 74 80 30 DF 3A FA 80 10 C4 30 E8 3C 74 3C 74 80 30 DF 1E 04 80 10 C4 C0 E8 3C 74 3C 74 80 30 04 DF 09 8C 8E E8 5F C3 8C 8E BE 80 E4 00 AC E0 FB 0E 00 BB B7 0F E8 43 FE C3 07 07 07 07 07 07 07 07 07 07 07 26 00 66 C3 3C 77 06 7E B4 E8 00 8B 02 02 9A 8B 04 36 76 8B 10 D8 AC 5E 80 00 76 3C 74 3C 74 3C 74 3C 74 93 93 1E B8 00 D8 E8 00 59 D3 07 7E F6 00 75 B4 E8 00 8A 49 88 01 3C 74 3C 74 3C 74 3C 74 B9 00 09 2E B4 E8 00 C2 16 00 14 D2 C6 FE 75 FE B0 B4 E8 00 D2 02 08 C3 0E 02 EB 50 06 00 8E BB 00 C8 39 07 58 03 10 9C E8 6C B0 E8 74 E0 14 8A A8 75 80 20 C4 C0 0E 00 BB B8 56 E8 42 33 20 0C 00 BB B8 56 E8 42 06 00 75 BA 20 D3 B9 00 A7 A8 74 BA 20 EE B9 00 97 F6 96 10 0B C0 06 00 31 06 E8 72 A9 72 B0 E6 E8 72 2E AF 72 E4 A8 75 32 0A 12 75 E8 5E 0A 0E 00 E8 5E 0C 00 BB B9 55 E8 42 ED 3C 72 95 2D 33 0A 12 74 E8 00 06 00 C3 BA 00 20 B9 00 1D 95 05 03 4B C6 12 00 C3 E4 24 E6 06 C0 C0 8B 24 26 06 00 85 53 DB 5B 89 24 07 60 64 FF E8 0C 64 02 02 F5 45 60 50 60 20 20 CF 00 16 FC 75 C3 50 1E D8 06 00 1F 06 00 00 06 00 33 B1 B5 33 06 0E 00 48 8E 26 05 00 C7 02 FF FC 8B FC FC FC C0 89 74 FE EB 83 40 CD 04 C9 CC EB 00 08 1E 00 0E 00 C3 FE 06 00 00 06 00 C6 92 01 80 E8 52 C5 00 C0 12 2E 00 16 00 0E 00 0E 00 00 B0 E6 33 BE 00 04 FF 44 C6 04 C6 05 88 06 44 BE 00 04 FF 44 C6 04 C6 05 88 06 44 06 B8 00 D8 48 8E 33 33 B9 40 66 A5 E0 8B BB FF 37 C6 54 C0 06 00 8B 8D 1E 50 8E E4 50 08 61 00 C6 00 FF F0 88 01 E6 26 05 B0 E6 E4 8A B0 E6 E4 05 04 80 2B 3B 72 33 C1 06 89 02 89 04 FE C9 E1 26 4D 8B 8C 26 25 88 01 FF BE 80 E4 26 02 E2 F6 FE 26 24 06 00 E6 1F C3 A8 A3 00 C8 80 F6 20 0B 00 F6 10 03 00 B8 04 E3 CA 16 00 C1 C0 40 1F 00 F6 40 0B 00 F6 80 03 00 B8 04 E3 CA 16 00 8A B3 B9 00 C7 EF 24 3C 75 80 01 07 01 05 C3 E2 1E 50 8E BE 00 44 24 0A 88 02 04 C6 FF 04 C6 FF 32 A3 00 DB 02 01 FF 00 F7 BB 04 E3 CA 16 00 C7 50 FF C7 52 00 C6 54 C0 06 00 C6 56 00 06 00 1E B8 00 D8 61 E0 08 61 84 1E 00 06 00 E6 FC FC FC FC FC FC FC FC 86 E6 8B 5B C3 00 00 00 00 FF 00 92 80 FF 00 92 00 FF 00 9A 00 FF 00 92 C0 FF 00 9A FF FF 00 92 00 FF 00 92 00 FF 00 92 00 FF 00 92 00 00 08 00 00 08 FF FF 00 00 88 00 88 00 89 00 89 00 0F 16 08 20 0D 00 22 2E 2E 88 08 8E B0 26 1D 84 FC FC FC FC FC FC FC FC 10 8E 0F C0 25 FF 7F 22 EA 88 F0 0F 1E 08 E5 0F 16 08 20 0D 00 22 2E 2E 88 08 8E E4 8A 0C E6 8A 26 1D C6 00 FF 61 B2 0F 16 88 20 0D 00 22 2E 2E 88 20 8E B0 E6 B9 FF E4 A8 74 E2 E9 00 FF E4 A8 75 E2 E9 00 60 08 7C C7 00 00 00 EB 66 00 EB 66 00 00 75 EB 66 06 C0 00 16 16 00 C7 00 00 00 EB 66 06 C0 00 98 00 C7 00 00 00 EB 66 06 C0 00 A0 00 C7 00 00 00 EB 66 06 C0 00 03 B3 70 71 E0 B3 70 C4 20 71 12 B3 70 71 E0 B3 70 C4 DF 71 10 8E E9 FE 0F 16 08 20 0D 00 22 2E 2E 88 08 8E 33 C6 FF 84 38 8E B8 00 C0 FF 00 FC F3 B8 00 D8 F6 04 E6 B8 00 D8 95 B0 E8 00 16 0A 33 84 75 B0 B4 CD F6 01 01 5A 2E 26 65 00 A5 A7 6D 00 8A 8A 8B 8B 8B 8B 8B 55 EC 53 06 B0 E6 E4 A8 75 32 8C 8E 8E 06 5E 26 0F F9 74 80 F3 08 FF 02 01 EB D6 BE 8A 3C 74 3A 75 43 F2 D7 33 8B AC 00 16 C1 F7 46 80 04 F3 D1 2E 94 8A 0A 07 5B 5D E9 11 07 5B 5D CF F2 FD 75 FF 02 FC 74 4F EB 47 C3 F2 F7 20 FD 75 FF 02 4E 80 00 08 4F 4E 4E 31 47 46 46 29 FE 75 80 00 04 4E 1B 46 17 FD 75 FF 02 FC 74 4F 4E EB 47 46 C3 F2 FC 74 4E EB 46 C3 F2 F7 15 FC 74 4F 4F 4E EB 47 47 46 EB 83 FF 11 FC 74 4E 4F EB 46 47 EB 80 01 03 46 80 00 04 4F 02 47 8B 80 00 04 4F 02 47 8B 80 01 03 4E 80 00 04 4F 02 47 8B 80 00 04 4E 02 46 FD 1E 00 56 3A 72 8A FE F6 01 0C CA F5 D1 DE DA 04 F5 D1 C6 C2 C7 74 80 49 02 28 3E 00 77 50 8B 63 83 04 65 24 EE 58 0E 3E 00 72 80 49 07 7C EB EA E5 00 E5 F8 C5 E3 ED C1 E0 06 00 8C 8E 8B F6 F7 00 74 F7 F7 D1 03 96 C0 14 C6 10 F0 CA A5 F5 FD CE F4 F0 E7 20 CA AB FD CE F6 40 8E E8 01 19 3E 00 72 80 49 03 0B 16 00 C2 A0 00 C3 3E 00 74 D0 D0 BD 00 8B 8A 32 98 40 F7 03 03 4E 97 F0 BA 01 E2 C6 01 10 D8 DD C7 20 3E 00 74 47 C7 C2 DA 5A 8B 0A 74 3A 73 2A 50 E6 E6 C6 F0 FB CA A4 F0 FB F6 20 F7 20 CA A4 C5 DD CE E0 8A D0 D0 58 C4 FB CA AA FB F7 20 CA AA DD CE EA 1E 33 66 01 00 66 C5 00 33 9E D1 66 E2 E4 0C E6 24 E6 66 01 00 66 DD 8B 06 33 B9 40 66 D3 AC 46 32 E1 75 E4 A8 B0 75 B1 9E D3 46 FE 72 9E 1F D3 9F 4D 9F 33 C3 04 50 61 0C 61 F3 61 8B 1F C3 06 00 C3 FF FF FF FF EA 8E F0 56 B8 00 D8 03 E8 43 5E CF EB C3 FA D3 E1 C1 20 03 8E B9 00 BF 03 EA F3 A5 50 3B 58 75 A2 03 57 75 BF 00 87 AB C8 BF 00 B5 AB C8 B8 FF 8C AB C5 C4 12 A3 00 06 00 8E 53 01 BA 03 0F 21 0F C9 D9 1E 02 DB 8A 79 0A 74 BA 03 09 21 01 CD 80 00 0D 05 3C 75 B4 CD 04 24 3C 72 A2 03 0F 85 EB 33 89 A6 89 A8 41 06 03 02 D2 8E B4 CD 1F 85 B4 CD 1E DB 16 00 0E 00 52 51 85 B4 CD 3C 58 1A 2B 1E D3 C2 0F DA D2 1A 21 BA 03 27 21 10 21 3D 74 BA 03 09 21 08 CD 8E 8E BA 00 1A 21 00 0D 49 73 72 20 4F 50 51 4D 2D 4F 20 69 6B 74 65 0A 6E 65 20 72 76 20 70 63 66 65 20 0D 0D 52 69 73 72 20 69 6B 74 65 69 20 72 76 20 20 66 6E 63 73 61 79 0A 74 69 65 61 79 6B 79 77 65 20 65 64 0D 24 42 53 43 20 45 45 E8 42 01 15 0A 8A E8 42 C8 33 BA 03 A8 74 B4 81 16 00 26 00 E8 42 01 04 E4 60 CA 74 E8 01 07 74 8A 80 97 03 C4 80 13 11 94 B4 3C 74 B4 3C 74 B4 88 E8 42 1F 8A 05 C6 05 E8 5E 46 00 A6 58 46 B4 BA 03 A8 74 B4 88 41 81 16 00 33 E8 FF 07 C4 75 8B 32 8A 00 05 09 01 4E 01 EB 0A 74 B4 3C 74 B4 3C 74 B4 3C 74 B4 EB B0 E8 41 05 01 5C E8 01 27 8F 8B C3 2C 8A E8 41 C4 75 E8 00 E8 01 07 47 FF 00 46 3C 77 E8 40 12 D0 80 06 75 C0 04 0F 03 1E 65 E8 00 61 27 45 B0 C6 01 C6 00 50 3A 58 70 47 E8 00 02 27 27 B0 C6 01 C6 00 50 1C 58 54 29 E8 00 87 27 09 B0 C6 01 C6 00 50 FE 58 4F 0B E8 00 61 27 EB B0 C6 01 C6 00 50 E0 58 34 4E 01 E8 00 67 88 E8 40 26 00 2C 1C 22 75 E8 40 7E 00 03 E8 24 3C 75 B4 80 03 68 80 13 40 88 E8 40 47 00 46 32 FF 16 C3 C0 66 80 02 09 01 4E 01 EB B4 E8 00 07 10 01 10 02 13 07 03 02 02 33 8A 06 C3 00 50 FA 40 E0 40 40 C4 DA F6 40 58 BA 01 A0 E8 33 DB B0 E6 FB F4 EC FD FD FD 24 0A 74 EB 90 EC 8B 33 8E C4 78 B8 00 D8 06 00 E8 38 46 00 46 00 99 C6 06 E8 00 46 00 94 B0 E6 BA 03 0C 80 3F F0 C4 B0 8A E8 66 F8 E0 33 C5 33 8B 8B 0A 90 74 FE 0A 91 74 FE 0A 74 FE C0 06 CD 08 10 FA 35 A8 75 E8 3E E0 E8 80 0F DB 0F DC 97 75 93 91 74 EB B0 8A E8 66 04 C4 6B E8 3F E0 CC B0 E8 66 C3 76 B0 E8 3F 93 4D E8 FE 07 C6 05 E8 5B 46 08 E8 B7 E8 3F 7E E8 3F 6B E8 36 04 F9 33 CC EC 10 0B 7E 00 26 4E EB B4 B0 80 05 75 E8 3E 07 93 01 D1 E8 FE 27 F1 EB F9 46 C3 00 0A 01 04 93 02 07 E0 0D 4E 6E 53 73 65 20 69 6B 6F 20 69 6B 65 72 72 0A 65 6C 63 20 6E 20 74 69 65 61 79 6B 79 77 65 20 65 64 0D 24 0A 30 2D 69 6B 74 65 42 6F 20 65 6F 64 45 72 72 0A BB 00 E8 B0 E6 E4 3C 75 E2 4B 05 E8 EB FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 EC 50 1E B0 E6 8B 04 DB 5E 8B 80 F0 0A 12 84 46 E9 01 FB 05 0C 14 84 5B 58 E9 05 13 84 D9 0E BF 13 80 8E 0F C0 25 00 80 0E 00 81 0F 00 66 C1 AB 33 A1 00 AB 1A 66 BE 00 08 AD AB FB 21 66 0F F8 AB 33 A1 00 AB 1C AD AB E8 AB E0 AB 04 AD AB FB 60 66 C0 44 66 66 04 25 FF 00 AB 33 8B 04 AB 5A 66 C0 44 66 66 04 25 FF 00 AB 33 8B 04 AB 4E 66 C0 44 66 66 04 25 FF 00 AB 33 8B 04 AB 54 66 C0 44 66 66 04 25 FF 00 AB 33 8B 04 AB B8 00 00 AB 33 8C C1 04 AB FF 66 66 00 92 66 66 C0 E0 E0 66 B8 FF AB 48 66 C0 44 66 66 04 25 FF 00 AB 33 8B 04 AB 42 66 C0 44 66 66 04 25 FF 00 AB 33 8B 04 AB 3C 66 C0 44 66 66 04 25 FF 00 AB 33 8B 04 AB 36 66 C0 44 66 66 04 25 FF 00 AB 33 8B 04 AB 3B 66 FF A0 0F 1F 66 5D A9 A9 8B 8B 8C 9C 3C 77 32 8B D1 2E A4 97 80 87 EF DB 05 0E 00 F8 52 DB 12 16 00 C2 A0 00 08 65 EE 10 16 00 C2 A0 00 F7 65 EE F8 92 7E CA 5B 2D BA AF AE 5D AF 64 DC B6 A6 C3 FF 7D 7D 7D 85 7C 58 59 5E 5D 07 FF FF FF FF FF FF C8 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF E9 03 FF FF FF FF FF FF BB E8 F5 30 3E 00 72 80 49 07 03 7F E8 2A 16 00 C2 8A EC 01 FB EC 01 FB C4 47 E2 C3 3E 00 72 80 49 07 51 71 AA E2 C3 EF 74 80 49 04 07 3E 00 72 8A E8 2A 16 00 C2 8B EC 01 FB EC 01 FB C3 FB EF 80 49 04 07 3E 00 75 8A E8 2A AB E8 2A 5E 8A 49 8C 8E BE FA C0 08 D2 DA 36 00 7F D1 D1 D1 03 80 06 63 EC 8B 57 8C 8E 51 8B 80 03 08 B1 D1 D1 D0 73 0A FE 75 8A 8A AB CD E6 5A 5F D0 D8 04 8B AD FB 03 33 AB C7 1F D0 79 26 05 81 B2 E2 81 3E 4A D8 C4 EB 8A 8B 8B B9 00 F3 D0 79 26 05 81 FF AC FC 03 32 AA EF 1F E4 EF 01 75 C3 00 FC 51 3D DF F8 00 8E 33 81 55 75 33 B9 80 02 02 E2 74 B8 00 D8 0E 00 BA 50 37 B9 00 51 EB B8 00 C0 8E B8 00 8B FF 00 58 40 8E C3 D8 DB 3F AA 62 F6 C9 6F D1 8B AC D8 FB 3E 04 EA B8 00 C0 8E B8 00 8B 55 ED FF 0B 74 1E 40 8E 80 12 FF 5D 8C 1F 8C 03 3B 76 3D DF 1B 15 06 BA 50 69 B9 00 CD 1F 61 80 8C 03 C3 06 00 E8 00 07 80 76 33 07 C3 06 00 50 12 5A 07 8B E8 00 3D C7 ED 1F FC D8 DB 3F AA 2D F6 C9 6F D1 8B AC D8 FB 09 04 EA D8 C2 60 1E 00 BB B8 14 E8 2C 07 BA 00 D8 C2 D2 8E B8 00 C0 B8 00 8B FF 00 1F 51 8B 46 2E 24 05 F7 EB 46 8A F9 C3 1B 32 B4 36 B8 B0 BD 89 77 72 79 69 70 5D FF 73 66 68 6B BB E0 5C 78 76 6E AC AF 2A 20 1B 40 24 5E 2A 29 2B 0F 00 7B 7D 0D 3A 22 7E 7C 3C 3E 3F 20 38 2D 35 2B 32 30 0D 47 49 4B 4D 4F 51 48 4A 4C 4E 50 52 53 06 07 0C 1A 1B 1C 2B 0A 47 48 49 4B 4D 4F 50 51 52 53 FF 50 01 85 10 84 E9 4D 24 83 04 86 42 83 05 E4 C4 42 C4 EE E2 FF B8 07 47 33 B9 20 AB 17 47 EE E5 FF FF FF FF FF FF FF FF 8A FF FF FF 50 B0 E6 B0 E6 B8 00 C0 20 A0 20 C0 F0 F6 97 20 0B 80 97 DF 58 02 FC 53 51 83 10 EC 80 97 20 76 9B 46 8B 81 0F C1 04 5E 81 00 0B 8E B9 00 8A 24 3C 74 E2 EB 90 25 07 66 00 09 08 D9 00 C4 1F 5E 5D 58 50 01 85 16 84 20 A0 CD CF 50 40 8E 58 C0 86 70 8B 6E 8B 6C FB E9 61 50 40 8E FA 0E 00 16 00 06 00 FB 1F 8D E8 00 00 EE 8A B0 E8 5B C8 04 E0 8A E9 61 0A E8 5B 80 03 EB C3 EF B0 8A E8 5B 02 E1 C1 B0 8A E8 5B 0B B0 0C 24 24 84 74 0C 8A B0 E8 5B 31 E8 FF 07 92 8A B0 E8 5B F0 09 84 8A B0 E8 5B E8 0F E8 FF 06 E8 5B 07 E2 6D B0 8A E8 5B 09 E1 5F B0 E8 5B 02 FB E0 0B 4F B0 8A E8 5B D7 FA 0B 3A A8 74 FB 33 F9 02 B0 E8 5B 80 F7 01 E6 23 B0 8A E8 5B 05 E5 15 E4 24 E6 B0 E8 5B 20 E0 0B 01 E9 60 B0 E8 5A DF E0 0B EF E9 60 E3 24 EC C7 0C 8A E2 FE 75 B4 C3 00 33 BF 0F 89 F9 F9 F9 39 F9 F9 F9 B0 9C E8 5A E8 00 02 CF C0 12 FA 2D 9E 0E 03 EB 90 24 C3 C0 B0 9C E8 5A E8 00 02 CF C0 12 FA AD 76 0E 03 EB 90 24 C3 C0 FB B8 00 D8 A1 00 25 FF 00 50 33 70 71 20 58 06 0D 00 01 C3 86 74 80 49 02 09 3E 00 74 EB 33 8E BF 00 46 3C 74 3C 75 B8 F0 03 A4 26 05 39 FA 8C AB A0 00 26 00 16 00 0C E8 08 F4 E8 27 C2 A0 00 B4 E8 E5 03 2A B4 E8 E5 01 20 C3 66 50 61 40 74 83 04 89 1E B8 00 D8 61 E0 08 61 16 00 06 00 86 E6 58 F9 87 80 06 75 E8 31 17 33 70 71 04 08 FC 37 04 33 F8 73 E8 32 3B 24 E8 32 01 50 29 E8 F2 3F DF E7 80 04 3E 33 80 C0 36 2E EB BE A0 04 CC 28 C8 24 C6 EB C7 02 00 46 00 C6 07 C7 0C 00 46 00 E8 31 3C 49 C5 72 8C 0C 8B 03 56 33 E8 31 0A 7E 72 2E 1C FF 5E 2E 6C 88 05 8A 01 4E C6 07 E8 31 0F 88 80 00 07 F7 81 87 E8 31 56 33 81 16 FF F7 01 27 20 0F 15 03 4F 21 12 3C 87 BE A0 56 E8 31 2F 1A 72 3C 74 83 06 02 0A C6 3C 74 83 06 3B 01 15 C6 2E 54 74 EB 3C 74 2E 54 75 E8 F1 3F 75 87 E8 F2 F7 8A 03 00 88 8C 0C 8B 04 56 81 16 00 C0 14 4E 01 B4 32 EB 81 16 00 0C C0 D4 80 00 09 F7 E8 F1 87 87 C3 09 93 20 09 74 21 0F 15 21 09 97 21 09 97 21 12 17 21 FF FF FF FF FF 02 02 2A 50 0F 27 DF 25 09 FF F6 08 40 02 02 1B 54 0F 4F DF 25 09 FF F6 08 80 02 02 2A 50 0F 4F DF 25 12 FF F6 08 00 A3 00 A5 00 FF 00 00 00 5F 50 40 8E 3C 77 74 F6 A0 01 2A 0E 00 E8 00 E4 24 E6 FB 20 F8 15 06 00 75 F8 0B 23 80 A0 FE 01 58 00 5F 02 FA 0B 42 0C 50 E0 0B 3D 58 C3 B0 E8 57 BF 8A B0 E8 57 FB 89 98 8C 9A 89 9C 89 9E C3 83 00 07 74 B4 F9 32 BA 02 24 E9 00 01 EC 0F 0F 0A C0 DB C9 D2 78 83 0E EC 46 FA 6D 8B B0 EE 46 00 8B 0C 5E 8A EC 0F E0 11 DF 4F 2B 89 0C 5E 77 EB 8B E8 00 D9 C4 74 89 02 C4 74 89 04 C4 74 89 06 C4 74 89 08 46 75 FB 58 59 5D 5D E8 C1 04 E9 C1 04 C3 B0 E6 E4 8A E4 8A 58 FB 1E BB 00 DB 06 00 75 C6 A0 01 8E 8D A0 E8 FF FA A1 FE 00 00 A1 E8 FE 06 00 74 80 A0 7F EB F9 1F CA 00 5F 60 1E 40 8E 89 67 8C 69 B0 E6 E8 00 06 07 B4 CF 8D 20 C7 FF 8C C1 04 89 02 C8 E8 26 47 26 47 9A 5C 26 07 FF D0 E0 26 47 8C C1 0C 88 04 C6 05 06 8C 8E 8D 92 E8 00 D0 E7 5E 8D 08 89 02 88 04 C7 FF FA 80 70 0F 1F C1 26 47 E8 00 88 04 C7 FF 26 47 92 0F 17 01 0D 00 01 2E 2E A1 C0 00 B8 00 D0 10 8E B8 00 C0 33 33 B0 E6 51 E9 F3 59 C1 00 01 B0 E6 B8 00 D8 C0 D0 50 20 66 FE FF 0F 00 58 D8 00 2E 01 51 EB FA 4A 75 B0 E6 E8 48 10 DF 60 38 75 B0 E6 E8 48 B4 E4 A8 74 4E 50 36 74 8B 89 58 08 61 F7 61 01 C4 80 91 C0 E0 03 C3 8C 8B C1 04 C1 E8 59 B8 00 D8 16 00 26 00 2C B0 E6 1F 61 C4 80 C4 8B 0A 75 81 06 FF 4E 40 EB 81 06 FF 4E 01 5D E8 47 1B D1 64 AA 75 B0 E6 E8 47 09 FF 64 98 74 B0 E6 C3 5F 31 46 8A B0 E8 54 FB 5F 2E 74 B4 F9 02 FB 8D 38 C7 FF 8C C1 04 89 02 C8 E8 26 47 26 47 9A FA 11 20 C7 21 04 21 01 21 FF 21 11 A0 C3 A1 02 A1 01 A1 FF A1 5C 26 01 8D 10 0F 1F 8B C7 04 00 0F E0 01 0F F0 FF 4D 33 0F D0 28 8E B8 00 D8 20 8E 32 F8 02 53 06 08 8E BB 00 7F 80 2F 7F C0 29 7F 00 23 20 C6 05 B8 00 C0 E0 26 1F F7 00 74 B8 00 03 FC 33 07 5B 8C 8E BB E6 C0 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 50 10 25 00 30 74 3C 72 8B 10 80 30 EB 32 2E 87 A8 02 07 49 A0 00 00 BA 03 07 06 00 BA 03 C3 16 00 93 01 C2 EE EA 33 A3 00 62 2E 87 A8 4A D1 2E 87 A8 4C D1 2E A7 A8 E4 A0 00 C0 C4 65 2E A7 A8 26 00 10 06 79 26 6C 26 4C A0 00 FE 02 15 80 09 75 8A E8 00 E8 C1 40 8A 07 0E 00 49 3C 74 3C B8 00 03 20 33 B9 20 AB 07 50 33 B9 00 AB 06 00 74 BB 01 C0 A0 00 C2 EE 51 1F B1 D2 B1 F6 80 07 02 C0 C3 FF 1E 00 33 8E C5 74 2E 9F A8 F3 BD A7 2B FB 8C 8E 1F 24 A2 00 50 F7 4C A3 00 91 E9 0C 27 5E E6 8C 00 08 A0 00 FF 09 E3 24 0A EB B1 D2 80 20 DF C3 66 83 05 C3 49 88 00 4A 88 01 62 88 07 28 50 28 50 00 00 00 00 00 00 00 00 2C 2D 2A 1E 30 30 30 3F 00 10 20 20 03 03 D0 D0 C3 D0 D0 54 A0 D0 A5 87 D0 D0 D0 49 57 D0 65 4D 41 59 39 59 2E D2 B9 F2 6E 53 53 A4 C7 00 97 1F D0 D0 D0 28 D0 D0 D0 F8 F8 BC 78 78 14 14 01 01 1E 3E B0 E6 B8 00 C0 1E 00 33 33 BE 20 FF C5 00 F3 81 00 3B 72 52 40 8E 89 13 33 8E BF 00 50 8C BE A8 A5 E2 33 8E BF 01 08 B8 00 AB FC 31 84 C0 C0 86 BF 01 08 8C 2E AB FB 32 84 46 BF 00 20 8C 2E AB FB BF 00 C0 89 5F 33 84 40 8E BA 12 80 34 02 D0 16 00 34 84 90 1E 33 33 8A E8 4F D0 DA C4 F3 AF 7A 8A B0 E8 4F F0 D3 12 8E 68 0C 8A B0 E8 4F 35 84 36 84 00 8C 8E B0 E6 BE A8 00 B9 00 AD 42 EC FF 07 C7 4A 92 E2 B0 E6 BE A8 08 B9 00 AD EC D0 8A EC C4 05 C7 92 E2 B0 E6 BE A8 78 B9 00 2E 85 75 B8 00 D8 1E 00 3B 84 49 80 87 14 8E E0 A8 75 B0 E8 4E 05 07 26 00 EB BB BA 8E 06 F4 74 80 87 FB 06 00 B0 E8 4E 30 E0 1E 52 84 3D 1F 74 80 00 03 3C B0 E6 E8 F0 B8 00 D8 DE 72 3C 75 80 87 FB FF FF 9E B0 E6 B8 00 D8 51 84 8E 64 A8 74 B4 EB 90 94 56 24 8A 50 B0 E6 E8 EF 58 01 1E 50 AE 74 33 8E BF 00 C7 E4 80 10 CF 0E 00 B4 B0 CD 80 10 CF 0E 00 B4 B0 CD E8 00 07 B0 E6 E8 01 0E ED B9 00 F5 E9 1D FE 40 E8 00 73 F6 24 50 55 84 E8 00 0D 56 84 95 E8 1C 75 C3 84 8B 83 0F C0 40 D3 01 10 FC 74 B0 B5 80 20 07 45 B0 B5 80 10 CF 2E 00 53 8E 06 C6 5B 74 F9 50 57 84 B4 CD 33 C3 80 30 03 13 80 10 30 2E 47 E8 F2 07 D9 C3 DC 75 E8 00 B0 E8 4D 20 E0 8E 53 C3 58 84 1F 84 B0 E6 8E 06 6C 74 E9 00 5A 84 01 3F 03 02 01 17 B0 E6 33 33 8B 0D C7 C4 02 C0 C2 E2 33 8B 0D C7 C4 02 C0 C2 E1 75 80 FF D5 5C 84 BD AC F8 33 8A 02 0E ED 9D 28 5D 84 8B 08 C9 4F 8B 0A B8 00 D8 12 50 19 E8 37 74 A2 00 5B 5E 84 C3 81 A2 73 E9 FF 5F 84 E8 4B 13 0D B0 E6 E8 4B 07 23 72 E4 C3 FF FF FF FF FF FF FF FF FF FF 31 00 89 60 A0 00 FE 02 2A DB DB 36 00 7C 0D 1C C1 18 16 D9 E3 60 C5 11 8A 8A E8 00 C8 CB 0A 3F C3 0F 0E E4 E8 E8 E8 00 80 07 48 FB FF E3 4E 89 50 A0 00 46 75 52 C0 C5 26 00 C8 4E D1 03 5A 0E C4 42 C5 00 00 4A C4 C4 00 00 42 C1 00 00 4A 8A EE 8A EB EB EE FE 8A EB EB EE 8A EB EB EE FF 1E 58 8E BB F8 F0 B8 00 FF 4F E9 3A 61 0C 61 F3 61 F0 B8 00 FF 67 E9 3A 0B 57 94 5F 72 EB E4 A8 66 00 00 75 81 82 74 BB F9 B6 C0 C3 26 05 88 E4 0C E6 24 E6 58 0B 75 E8 DA E0 E4 33 B1 D0 73 46 F9 F6 C0 17 8B 66 33 8B B9 00 FF 07 C1 08 E2 8A 8B 1F C3 FF FF FF FF 72 98 A6 A7 2D 5E A3 A3 9C E2 A6 A7 49 71 A3 A3 3B 19 A3 A3 44 70 80 80 12 40 9C 8B 8B 02 46 5D 58 48 1E 6A 8B 80 15 0A 40 8E E8 04 2E 66 FE 81 1A 02 FC C0 D8 36 01 C2 74 C4 18 BB 00 DB D8 5E D1 2E 97 AD 07 61 88 15 26 00 00 40 46 24 3C 72 3C 77 E8 17 EE 73 B4 E8 05 A0 00 46 88 74 88 15 E8 05 53 E8 B0 26 44 C0 02 01 7E 0A 11 02 26 44 0A 75 B0 88 00 A2 00 10 8E 8B B6 80 15 74 0A 75 FE 0A 14 66 74 3A 76 B4 EB E8 05 D3 72 E8 03 3D F8 06 73 80 11 0A C7 74 E8 05 27 54 E8 05 1F 05 80 15 75 E8 05 11 4E 75 F7 1A 00 08 29 EB E8 05 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A E9 03 DA 72 E8 03 30 F6 08 74 0C 80 15 75 0C 50 8A 07 C0 02 04 46 58 48 E8 04 7F 7E 0B 06 C4 02 C6 66 88 01 04 E6 04 09 34 C6 E8 03 DA F0 4C E8 03 7E 0B 05 FF 72 E8 04 14 C8 72 E8 04 0A 4E 75 E8 04 03 46 C3 54 72 E8 03 40 F6 08 74 0C A2 00 78 E8 04 0F 92 72 E8 04 05 11 EB E8 04 E8 04 35 30 26 44 A2 00 06 00 E8 04 D6 72 E8 03 DA F0 7C E8 04 0F 54 72 E8 04 05 D3 EB E8 03 89 14 74 53 5E 80 9F FB 5B 0D 46 89 10 07 B8 EB 26 04 FF 76 B8 03 48 E0 E0 26 44 89 12 8A 02 CC 75 89 10 E8 03 50 5E 26 7C FE 80 A0 C3 74 80 10 8A 0E 8B 05 E8 06 07 42 AA C3 B0 AA C4 AA C7 C6 91 E8 03 AD 72 E8 01 0A E2 72 E8 03 05 07 38 C3 46 72 E8 03 03 2A C3 38 72 E8 02 06 00 E8 03 75 72 E8 01 0A AA 72 E8 02 03 02 C3 10 73 80 01 03 97 1E C0 D8 36 01 E8 02 06 00 C6 46 00 26 00 E8 01 A0 F6 EE 83 E8 FF 7D 80 75 02 17 0E 00 E8 01 B0 F6 EE 65 E8 FF 5F 81 1A FF 46 00 7F 72 1E C0 D8 36 01 B3 E8 FF 2A 35 72 80 75 02 03 EB 1E C0 D8 36 01 B3 E8 FE 0A 0E 00 E8 00 05 05 5A C3 68 72 E8 01 06 00 E8 02 A5 72 E8 00 0A DA 72 E8 02 03 32 88 14 E8 02 23 4A C6 48 90 6A E8 02 13 84 72 E8 01 E4 46 3C 74 B4 E8 02 8A 75 FE 80 80 5E 73 89 14 46 89 10 19 46 00 26 44 26 64 26 1C F7 89 10 56 C3 46 00 01 66 88 74 81 1A 00 E8 00 21 46 24 C0 04 A0 F6 EE 14 72 A8 74 B4 EB A8 75 B4 E8 01 53 E8 00 FF 04 C4 17 06 B9 F4 80 0E A0 E8 00 F4 75 B4 F9 5B 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 1E 40 8E C6 8E FF 20 20 A0 C0 D8 00 9C FF 54 1F CF F7 EC 8C C3 10 04 20 02 F1 EC 8D B4 24 74 56 6D D0 72 46 F9 AC 86 A0 00 26 44 C1 02 42 8A 14 43 8A 12 3F 44 8A 13 45 8A 12 E8 8A 10 E4 C0 03 C4 46 8A 10 01 E0 0C 8A 11 E6 0A A2 00 8A 08 F6 EE B8 00 66 03 0E D2 50 E2 C1 04 D0 25 00 1E DB 00 BA 01 6F C3 ED 4E E8 DD C8 72 E8 00 0B 8E AC BA 01 E2 C3 00 BA 01 6D 32 8A 00 5E E8 FE 0C 0A 72 BA 01 AA EC 51 24 E8 FE 10 F7 EC 08 08 38 E2 B4 F9 C3 F9 32 89 14 88 15 46 00 26 00 4E 01 F9 C6 8E 00 26 00 26 00 E4 11 46 24 3C 74 FE 74 3C 74 E8 FD EB BA 03 00 E8 10 FE 72 E8 00 56 BE 00 F1 B9 00 EE E2 59 C3 51 33 8E F8 00 9C FF 54 1F 0A C0 06 00 1B 16 C0 14 B9 F4 06 00 0B 9A E2 4B EF 80 C6 8E 00 5B A8 74 B4 EB A8 74 E8 FE 06 04 03 11 C3 24 BA 01 C0 A8 75 E8 DC F6 80 C3 F6 B0 EE B0 E6 B8 00 D8 72 E6 3C 75 FF 8B B3 33 BD B5 0D B0 E6 E4 F6 24 8A B9 FF 61 10 C4 10 F6 69 B9 00 8B E9 12 D9 42 84 33 BA 00 B8 00 00 33 B9 40 C2 FF 66 D0 AB F9 C6 81 00 72 B0 E6 E4 0C E6 24 E6 B0 E6 BF 00 BB 00 00 33 66 C5 F4 DF F6 00 8A 9E D1 9F F4 AD 33 E1 75 B0 E6 E4 A8 B0 75 81 00 81 00 72 66 7B EB B0 E6 B8 00 D8 E4 FF 23 E9 D2 E3 33 B1 D0 73 46 F9 F6 C0 11 B9 00 F1 FF 07 C1 08 E2 8B B0 E6 8B 8C BF 00 5B E9 10 83 B9 00 67 E9 11 FE 30 2D 79 74 6D 42 61 64 46 69 75 65 0A 32 31 4D 6D 72 20 72 6F 20 30 2D 65 6F 79 41 64 65 73 45 72 72 32 35 4D 6D 72 20 72 6F 0D 20 30 2D 6E 61 69 20 65 6F 79 43 6E 69 75 61 69 6E 0D 42 73 20 6F 75 65 20 6F 75 65 41 20 6F 75 65 42 20 6F 75 65 43 0D 50 72 74 20 68 63 20 20 50 72 74 20 68 63 20 20 3F 3F 3F 00 30 2D 4F 20 72 6F 0D 20 30 2D 6F 6F 68 6F 65 41 61 74 72 46 69 75 65 0A 35 31 44 73 6C 79 41 61 74 72 46 69 75 65 0A 33 31 4B 79 6F 72 20 72 6F 20 72 54 73 20 69 74 72 20 6E 74 6C 65 0D 20 30 2D 65 62 61 64 45 72 72 0A 33 34 4B 79 6F 72 20 72 53 73 65 20 6E 74 45 72 72 0A 30 2D 65 62 61 64 43 6E 72 6C 65 20 72 6F 0D 20 30 2D 69 6B 74 65 43 6E 72 6C 65 20 72 6F 0D 20 30 2D 6F 72 63 73 6F 20 65 65 74 6F 20 72 6F 2C 50 65 73 20 68 63 20 6E 74 6C 61 69 6E 0A 31 31 49 4F 52 4D 45 72 72 0A 31 32 53 73 65 20 70 69 6E 20 6F 20 65 2D 52 6E 53 74 70 0D 20 20 20 6E 65 74 44 41 4E 53 49 20 69 6B 74 65 69 20 72 76 20 3A 0A 31 32 53 73 65 20 70 69 6E 20 72 6F 0D 20 36 2D 65 6F 79 53 7A 20 72 6F 0D 20 36 2D 69 65 26 44 74 20 6F 20 65 0D 0D 20 52 53 4D 20 20 46 22 4B 59 0D 0D 20 30 2D 79 74 6D 55 69 20 65 75 69 79 4C 63 20 73 4C 63 65 0D 20 20 20 20 6E 6F 6B 53 73 65 20 6E 74 53 63 72 74 20 6F 6B 0A 0A 65 75 69 79 4C 63 20 63 69 65 6F 20 6F 4B 79 6F 72 20 74 61 68 64 0A 37 30 44 73 20 20 72 6F 0D 31 39 2D 69 6B 31 45 72 72 0A 37 30 44 73 20 20 61 6C 72 0D 31 38 2D 69 6B 31 46 69 75 65 0A 37 32 44 73 20 6F 74 6F 6C 72 46 69 75 65 0A 36 35 44 73 65 74 20 72 76 20 79 65 45 72 72 28 75 20 65 75 29 0A 20 20 49 73 72 20 49 47 4F 54 43 64 73 65 74 20 6E 44 69 65 41 0D D8 D4 B4 00 00 67 1E 40 03 29 F0 B0 60 B7 00 BD BA D8 B0 E6 EB 33 E6 B0 E6 32 EB E6 B0 E6 FA 0F 84 00 85 B8 F0 D8 FF 21 A1 E0 8B F7 00 75 BB FF 1F 07 C4 E8 0C 61 10 84 12 4B 42 4B 92 4B C0 8F 54 43 12 41 36 43 00 40 00 40 0C F2 EE 11 84 01 B8 EE 01 D8 EE BA EC DA EC C0 32 EE 84 BF BB 01 17 8B 04 57 B9 00 55 E9 E0 C2 81 D9 75 B0 EE FF B0 E6 BD BB 8C 33 8A 02 0E 7B E9 F1 C3 81 A2 72 B0 E6 B9 01 C0 FC 00 43 40 E0 40 00 75 BB B6 18 BD BB 4D EB B0 E6 B0 E6 EB E4 24 8A B0 E6 8A E6 B0 E6 B0 E6 B0 E6 EB E4 24 8A B0 E6 EB E4 24 F6 80 E0 07 CC B0 E6 B0 E6 B0 E6 8A E6 B0 E6 BD BC 40 E4 24 E6 B8 00 D0 00 B0 E6 E8 EC 51 72 B0 E6 E8 3B 0E ED B9 00 35 E9 0B FE 02 E4 51 88 E8 09 E4 A8 74 E2 EB E8 E7 06 B0 E6 E8 EE 1B 84 E1 B0 E6 E8 0F 1D 84 0D B0 E6 E8 24 1E 84 6D B0 E6 E8 27 20 84 B4 E8 0B 96 BD BC 2F E8 C3 B0 E6 E8 10 23 84 70 B0 E6 E8 11 E0 2E 1F 8A 01 C0 40 0A BE 84 CB E9 CC 24 84 8F E8 3A 1F D0 64 91 72 E8 3A 11 60 F1 E0 D1 64 E8 3A 73 E9 FF C4 60 25 84 AC B0 E6 E8 06 27 84 EC BE EE 28 84 9B B0 E6 E8 C7 2A 84 0F 10 00 10 61 E0 6C 61 E0 61 2B 84 0E A6 A8 74 BA 20 06 B9 00 F1 E4 24 E6 E4 24 E6 B8 00 D8 06 00 F6 96 10 24 0E 00 80 96 20 E8 2E F2 60 B9 FF 06 00 74 E2 C6 96 00 86 3E 00 12 1B 40 E8 35 C0 75 0C E6 E8 35 92 4B E6 EB A8 75 A8 75 E8 09 00 11 3F 00 06 34 02 05 C6 B0 50 FF FA 92 4B 3C 74 E6 C7 72 00 FB AA B0 E6 E8 33 94 CD 8A 24 0E 57 4C B9 00 AE F8 03 35 80 2A 0A 06 00 74 E9 01 00 D3 0A 79 80 AA 05 FC 75 F6 96 02 03 08 F7 80 B8 28 06 00 74 80 96 F7 26 00 F6 18 02 42 44 26 00 F6 96 08 34 36 FC 75 F6 96 01 2A 06 00 74 80 96 FB 26 00 F6 18 01 0E 10 26 00 F6 96 04 04 1E 00 C3 FC 75 F6 96 02 0C 0E 00 80 96 FD 05 0E 00 80 17 08 C3 FC 75 F6 96 01 1D 06 00 74 80 96 04 26 00 EB 80 18 01 0E 00 F9 85 17 75 09 17 F6 17 04 3C FC 75 F6 17 08 36 06 00 74 F6 96 02 17 06 00 74 EB F6 96 02 0E 06 00 74 80 18 7F 04 3E 00 FC 74 F9 38 2A 52 45 F6 18 04 0E 0E 00 B8 85 A6 CD 45 C3 26 00 B8 85 EE 7D E8 08 C3 F0 03 0E A8 B4 9C E8 28 FF 20 7D 50 43 58 00 14 01 10 09 0C 7D E8 06 7D E8 08 C3 FC 75 EB 80 54 02 93 FC 75 EB 80 45 03 4F 80 B8 03 97 80 37 03 AB 80 52 03 D3 80 46 03 D6 E8 02 27 26 00 72 FC 75 E9 00 FC 74 80 33 05 00 FC 80 34 05 01 F2 F8 F6 96 01 1A 06 00 74 F6 17 08 03 9E F6 96 10 DF 05 26 00 80 18 08 E8 2A FB 3E 00 74 80 49 03 09 B8 BF 01 10 F6 18 08 F9 C3 33 86 19 84 74 E8 10 EB E9 38 E8 2A E9 29 06 00 74 F6 96 02 15 06 00 75 80 96 FD 0A 06 00 75 E9 FF E8 2A CD FB C3 06 00 74 F9 F8 F6 17 04 F7 06 00 74 B0 E9 00 06 00 74 F6 17 08 DD 06 00 74 F6 96 02 CF 26 00 80 71 80 47 FA 06 45 CD 33 EB B4 CD 33 F9 E9 FF E4 33 FC 7C 80 44 2B FC 74 80 58 1F 34 06 00 75 B0 F6 17 04 2C 30 06 00 75 B0 EB F8 B0 F6 17 08 14 23 06 00 75 B0 F6 17 03 02 C0 E0 C0 9B F9 0A 78 8A 3C 7C 3C 7E C6 19 00 C3 C4 47 81 2E F6 17 08 55 8E F6 17 04 42 06 00 75 F6 17 20 16 06 00 75 3C 7C 80 4C 04 F0 02 C0 06 00 74 80 96 FD E0 35 32 EB F6 17 20 D5 E2 1C 8A 72 EB F6 96 02 2F 2E 89 2B 0A 38 75 B8 4E CE 2D 0A 2A 75 B8 4A C0 30 BF 26 00 0A 19 F9 80 96 FD B8 EB 8B 1A 3B 1C AD F6 17 08 05 06 00 C3 FA 80 A3 00 1C 0E 03 EB 90 C3 41 74 8A 49 80 04 05 EC 76 E8 00 16 00 C2 EC 01 FB EC 01 FB 8B 89 00 C3 26 00 FC 72 80 06 0A 7D 26 05 46 C3 95 8C 8E 8B 8C 8E 83 08 FC 04 02 04 FC 13 F0 54 B9 00 E2 01 D0 D1 E2 AA F6 20 CB DE C6 FE 75 8C 8E BE FA FC 69 73 33 8E C5 7C 50 8C 8C 3B 5B 75 83 00 09 FC 49 72 04 83 08 46 C3 F8 DF FF 4C F7 8B D1 8B 50 A0 00 E7 FF C3 E0 C2 C3 1E 00 D2 DA FB EF EF FB 06 00 75 D1 03 C3 C6 DF ED 80 56 F0 FB 04 A7 0B 08 4A F0 33 F9 5E C6 03 E8 B8 00 D8 B0 84 C0 75 A2 00 F2 B0 EE C0 3C 74 B0 E6 EB 80 8B 01 E4 72 E8 00 B8 84 06 9B 73 B0 E6 BB BA 1E BA 00 79 E8 01 2B B3 84 C0 C0 C4 04 B2 E8 00 3E 00 72 B0 E6 33 8E 26 3E 01 81 02 07 B7 B3 B9 7A 10 13 11 BA 01 5A 80 18 FC 74 EB A8 75 E8 CD E0 CB D9 CF D3 09 EB B4 CD 72 B4 CD 72 52 8B 2D 00 E8 CC E1 80 01 E4 C0 03 D4 0A 26 75 FE B8 04 13 1B FC 74 80 11 11 FC 74 8A 24 3C 74 FE EB B9 00 0C 13 04 92 F9 B0 E8 34 40 0A B7 84 00 EB 90 92 42 0A 74 8A 1E C0 C8 D8 C3 E8 74 3C 75 B0 E8 34 C1 C8 10 E5 01 FA 04 8C 06 33 8A 24 74 3C 75 B0 E8 34 C8 C1 E5 01 A3 01 0E 01 4C A3 01 4E A3 01 06 00 2E 0E 00 06 01 33 0E 01 1F 0E 00 B0 E6 BB B9 C2 74 BB B9 13 BA 00 0D C3 B6 84 F8 F6 01 06 39 BB B9 15 BA 00 F1 C3 3A E8 00 F7 BB 00 24 EC 80 0C 2E E2 4B F0 80 0A F1 EC 01 03 20 C3 B0 E8 33 08 E0 8E 5F FB E4 24 E6 E4 24 E6 C3 00 BA 03 B0 EE EE B0 EE FB 51 56 1E 8B BE 00 DE E2 00 F2 FC 73 8A 7C D1 8B 00 0B 74 84 75 E8 05 2B CC 05 4A EB FE 75 E8 05 19 CC 05 2F EB FE 75 E8 05 07 CC 03 04 5D 5F 5A 5B FF FF FF FF FF FF FF FF FF FF FF E9 04 00 BB 00 02 5B 55 51 04 59 5D 8B 9C B0 E6 E4 8A E4 0E 03 EB 90 86 8B 9C B0 E6 E4 8A E4 0E 03 EB 90 86 53 D8 FB 09 72 E2 C3 CB 00 43 40 E0 40 C4 D8 00 43 40 E0 40 C4 D8 FB 09 04 DC E5 D8 E4 F2 E9 D9 E6 04 D3 B9 00 C1 EB 90 D4 E2 00 04 BE C6 17 B0 26 85 80 47 D3 02 BE C6 03 FF FC 00 8E 92 F7 2D 92 90 14 27 88 00 AA E2 FF 86 51 8B C1 08 02 E8 00 81 03 B9 00 0D B0 E8 00 B9 00 01 C3 92 F7 2D 92 90 14 27 51 E8 00 59 E2 C3 B8 00 D8 06 00 1F 51 C6 74 E8 00 EE EB F6 30 08 29 80 10 F3 5B 8A 53 5D 5B E2 C3 07 E8 00 43 F6 B0 E8 00 0A 43 C3 FA E8 00 00 E8 FE BB 00 37 BB 00 8E C3 20 E8 00 00 E8 FE 8A B1 D2 E8 00 C5 01 C3 0F 90 14 27 01 C3 07 B4 CD C3 B6 43 38 42 05 42 61 03 61 48 E4 24 E6 C3 FF B8 B0 C0 8A 43 88 00 AA E2 FF 06 FF B8 B0 C0 07 26 85 80 47 F4 C3 1E B0 E6 B8 00 D8 26 00 16 00 D1 84 FD 74 E9 00 D2 84 B1 9C 8A B0 E8 30 D2 40 F7 8A B3 E8 00 1F A1 00 80 33 BB 00 F3 F8 1E 00 80 E8 BD D3 84 28 8E 8E 8E 0F C0 25 FF 7F 22 EA C8 F0 0F 1E A1 D4 84 40 8E 8E 69 8B 67 E8 DB 13 33 BB 00 F3 00 75 EB 90 01 8A BA 10 FF 74 8E 66 C0 00 33 FC F3 FE 80 10 E6 1F C3 00 BB B6 1A E8 FE 50 51 1E B8 00 D8 06 00 00 FF 74 88 4C B8 00 C0 33 B9 40 FF 66 AB CF C3 E0 1F 59 58 E8 00 26 00 E4 05 4E 01 C3 46 8A 41 0A 74 81 16 00 FA 06 00 B0 8A 06 E0 0C 46 8A 3F C0 04 C4 F2 EE E0 8B C0 06 F7 EE EC A0 00 0F C4 30 26 00 F8 FD CD 72 B0 B1 26 5C 80 01 74 80 01 75 B1 3A 73 86 F6 8B E8 FC C3 BA 03 BC E8 C7 A8 75 E2 B0 EB E8 C7 42 40 C3 FC 45 2A 05 E0 F6 04 D8 46 2A 07 F6 04 C3 06 00 46 8A C3 F2 A0 00 0F 12 E8 04 02 03 26 00 04 E4 C4 08 E8 C7 26 00 0C EE 24 F6 3E 80 0A 60 E2 B4 F9 0D 26 00 E8 25 8F 32 C3 10 F7 0C 46 80 00 E6 E6 86 E6 86 8B 8A E6 8B E6 86 E6 86 FB 8A 07 E7 0A 06 9D 8A 05 97 C3 FF FF FF FF FF FF B0 E6 E6 B0 E8 2E E0 0C 40 22 A8 74 E8 00 20 03 02 58 50 4A C3 53 50 40 8E F6 A0 01 2B 2E 00 03 23 2E 00 73 58 B0 80 BF 05 80 A0 FE 9A 8E 8B 98 26 0F 58 5B C3 25 00 83 03 80 83 03 04 EE 8B 2E EE C4 EE 42 24 EE 4A C0 4A C2 EC E0 EC 50 B0 E8 00 0D 10 C3 74 4A 20 BB 5A 84 75 52 C2 EC E0 C1 EE 02 C1 B0 E8 00 45 71 80 7F B7 B9 00 80 B0 E6 E4 86 E4 86 8B 58 84 75 84 75 50 00 43 40 C4 40 C4 2B 81 20 5F 72 E2 FE 75 80 80 C0 09 E0 EA EC E4 C3 C2 EE 42 20 3D 00 18 38 01 D0 D0 0A D0 D0 0A 32 86 BE CB F3 0A 8A 83 03 80 83 03 ED F1 E6 8B 2E EE E0 EE 42 C7 4A 32 EE E8 FF 3C 73 83 04 C0 06 88 0C 06 E3 8A EE EA E8 FE 17 00 80 C0 60 30 18 0C 06 03 02 00 55 02 08 20 80 00 90 84 0E BE CC 02 19 AC E0 8F 87 B0 E8 2C E0 EA 92 84 A9 B0 E6 C3 93 84 04 08 D0 0D DA 0E BE CC 03 99 2E 8B BA 00 08 EE 42 FB C0 B9 00 EE 42 FA 87 83 81 82 8B 89 8A E0 87 C4 5A 00 83 C4 52 00 81 C4 4A 00 82 C4 42 00 8B C4 3A 00 89 C4 32 00 8A C4 2A 00 94 84 00 B9 00 EC 3A 75 E2 BA 00 08 EC 42 3A 75 E2 8B E9 FF 00 BB B6 1A E8 FA FE 95 84 0D DA 00 08 D0 40 0B 41 0B 42 0B 43 0B C0 D6 41 D6 42 D6 43 D6 96 84 9C B0 E8 2B 80 02 F5 80 76 8A B0 E8 2B C8 84 68 8A 9D C6 C7 3C 77 86 8B 8A E8 00 3B 58 D8 C5 AF 3C 77 8A 8B 33 86 51 23 F7 93 52 3C F7 B9 22 E1 D8 13 8B 8A 8A B4 F6 D1 03 33 03 13 87 83 07 C8 E9 DA E9 DA E9 DA 01 1A 0E 8E F2 0C 8A B0 E8 2A B8 00 D8 C0 C0 8B 20 26 06 00 CE 26 00 E4 24 E6 BB 00 10 F6 6B 01 03 EF 26 2E 00 26 00 07 1E B8 00 D8 0E 00 B0 E6 58 CF E0 EC 24 D5 C3 40 8E 8B 10 DB 9B 3E 00 10 0A 75 80 02 B3 70 0C 8A B0 E8 2A 49 E8 DD 04 07 C3 75 EB F6 02 06 E3 EB 90 E3 53 00 BB B8 3D E8 F8 EB E4 24 E6 E4 24 E6 89 10 C3 3E 00 07 60 08 46 0A 5F 0D 4B 01 B4 E8 B5 03 52 FE 3A 4A 75 32 FE 80 19 13 CE 02 3A B4 E8 B5 8A E8 00 B4 E8 B5 26 00 66 C3 03 1C 0A 74 FE EB B4 E8 B5 D2 DD F4 E8 F8 B4 E8 B4 FE 74 FE EB B4 E8 B4 FC 52 3E 00 74 80 49 03 02 00 01 33 B6 8A 4A 4A CE 5A C3 1D 35 38 0A 74 79 F9 E9 01 FC 7F 8A 32 2E 87 9B 06 00 75 F6 17 04 16 7F 06 00 74 E9 00 06 00 74 E9 00 FC 75 B8 94 76 FC 75 F6 96 02 0A 26 00 B8 95 60 C0 5F FC 74 80 0E 5D FC 74 80 37 1A 06 00 74 F6 96 02 05 00 EB 80 96 FD 33 20 0A 61 35 7B 31 1F 06 00 74 50 C9 C1 6B B9 00 C4 AE 75 80 96 FD E0 DF F9 B4 32 EB B0 EB BE 9B C4 72 EB 3C 7C 3C 7F 2C EB 80 37 D6 FC 75 F6 96 02 07 26 00 EB 80 0F 09 0B 8A 59 EB 32 EB BE 9B 84 72 F6 17 40 82 20 7D 24 80 35 11 06 00 74 80 96 FD A4 4B 80 1C 11 06 00 74 80 96 FD A6 35 80 0F 05 A5 2B 50 C4 C9 C1 0D 90 BF D1 AE 74 3C 74 80 02 12 FC 7C 3C 7C 3C 7F 32 E8 00 C3 C4 EB B0 EB 01 1A 1C 28 2B 34 37 8B 1C 89 46 3B 82 75 8B 80 3B 1A 74 89 1C FB DA 45 B8 91 15 C3 50 7D E8 F6 C3 01 46 81 16 00 52 39 A8 5A B0 EB B0 E8 27 52 F6 8A 06 D2 03 E8 24 0A 74 3C 77 F8 01 5A E8 C0 27 C4 C3 8E 02 0E 58 C3 16 00 C2 74 80 C0 09 FA 75 B2 EB B2 EB B2 F9 8A 8A 06 E4 03 E0 08 8F 8A C3 FC 66 0A 74 C0 04 D0 06 00 E7 33 A0 00 66 0A 74 C0 04 0F C3 53 8A C0 06 F7 EE 8B 8A 24 C0 04 C3 74 0C 80 C0 E0 26 00 5B C3 A5 74 E8 BF C3 9B 75 E8 BF C7 C3 8B 86 E8 FF FB E7 C3 E8 1C 4A DD 8A 07 E7 0A 06 D1 E8 1D 11 07 BF 00 B9 88 47 F8 06 88 41 58 A0 00 C0 27 08 04 80 21 26 00 C4 74 D0 EB F6 03 04 C4 0B C4 74 B4 EB B4 C3 40 8E BB 00 2F 3F 75 E9 00 07 C0 E8 0A 74 FE 75 B3 B5 B4 CD B4 E8 00 09 B1 33 CD 72 E9 00 FC 75 0A 75 B4 CD B4 E8 00 C5 B8 04 01 D2 13 46 FC 75 0A 75 FE 74 80 29 B7 05 ED 00 13 17 96 B8 04 10 D2 13 1C 00 13 15 82 B8 04 0F D2 13 26 CB 46 C5 D0 90 80 97 0B 04 76 BA A1 59 B4 E8 00 2F EB 90 02 60 BB 00 3F 74 BA A1 3B BA A1 35 B4 E8 00 FB EB 90 2E 00 C8 75 E8 FD F0 E8 FE BA A0 11 C8 08 74 FE BA A1 03 3C E8 00 53 90 38 74 88 E8 FE 0E 00 5B E8 FD 68 92 C0 04 E0 50 FC 75 3C 74 3C 74 B0 E8 25 04 FC C4 E0 33 FF E8 FD 20 38 E0 CC B0 E8 24 00 BB BA 59 E8 F3 01 E8 B1 0F 10 00 10 BD 84 0E 33 E0 C2 24 86 E8 24 50 C2 D2 C2 78 AB C8 58 60 06 A0 A8 60 84 00 8E BB 00 C3 8C 69 26 26 00 06 00 00 61 84 D1 74 81 64 10 E9 03 87 B0 E6 C7 86 80 C7 88 00 E8 AB 81 72 34 75 A1 00 86 A1 00 88 E9 01 56 1E 8C 8E BB 00 DB 67 BF 00 0B F3 07 5F B0 E6 E8 AD 07 64 84 0F 81 76 80 73 81 64 80 8B 7C 89 76 8B 7E 89 78 E8 B0 F3 0B 74 E9 01 1E 00 EB 00 1E 00 1E 00 EB 00 1E 00 90 A2 00 02 06 00 E8 02 1E 00 C3 00 1E 00 C0 12 0E 00 00 2E 00 16 00 0E 00 65 84 1E 00 1E 00 1E 00 1E 00 2E 00 C5 00 91 A2 00 10 06 00 E8 02 1E 00 1E 00 C0 12 0E 00 00 2E 00 16 00 0E 00 88 05 04 80 2B 8D 3B 73 8B 88 03 86 81 80 A1 00 82 C6 8F FF 26 00 06 00 E8 02 C0 12 0E 00 00 2E 00 16 00 0E 00 B8 00 C0 80 8B E8 AB BD 00 06 00 B0 B4 E8 03 02 74 81 64 44 88 6A 89 6B 88 6D A1 00 00 F7 B0 3A 74 8A C6 92 01 36 A9 00 12 0E 00 00 2E 00 16 00 0E 00 88 0B 74 05 04 E3 10 E2 06 00 E8 03 02 74 81 64 08 88 72 89 73 88 75 A1 00 00 BB 3F 1E 00 C3 24 8C B4 C6 92 01 D2 A9 00 12 0E 00 00 2E 00 16 00 0E 00 66 84 1E 00 89 13 8B 88 B0 8A E8 22 B1 E7 2D B1 F7 64 80 74 B1 E8 AB 67 84 3E 00 02 0E B3 08 0C 8A B0 E8 22 02 06 00 FF 02 03 8F F3 B0 E6 E4 B0 E6 E8 15 64 01 FA 60 E0 CC B0 E6 50 10 58 C4 60 08 B0 E6 F4 FD 69 84 00 EB 90 6A 84 01 B8 00 D8 16 00 26 00 E8 F0 0B 75 E9 00 6B 84 00 8E F7 64 01 74 E8 F0 ED 0E 00 F1 0E 00 16 00 0A F7 64 04 74 E8 EF ED 0E 00 F1 0E 00 16 00 01 F7 64 02 74 E8 EF ED 0E 00 F1 0E 00 16 00 CE F7 64 08 74 E8 EF ED 0E 00 F1 0E 00 16 00 C5 F7 64 10 74 E8 EF 00 BB B6 1A E8 EF 06 00 FF 18 8C F7 64 40 74 E9 FF 61 C0 04 74 84 D0 B0 E6 0F 0F 07 61 53 D8 6D 84 C3 D8 6E 84 C3 1E 00 1E 00 26 0E 00 00 1E 00 1E 00 4C 8B 84 39 80 73 8B 80 89 8A EB 90 18 0E 00 00 1E 00 28 8B 84 89 8A EB 90 B0 E6 58 1E 00 10 8B 84 89 8A F8 C0 01 5B 53 06 70 84 26 00 C4 E4 F8 00 80 92 01 0A 40 8E 8B E8 A8 3E 00 75 B8 00 06 00 00 86 B0 E6 B8 00 C0 56 55 8F 38 4C 77 E8 D4 03 38 5D 5E 73 8A 4C B8 00 55 83 40 57 53 1E 00 08 33 33 D1 1D 00 E2 8A 4C B8 00 C3 74 B8 01 5B 5F 3E 00 75 B8 00 C0 C5 C3 C4 39 82 77 B8 00 09 80 4C 01 7E 89 84 50 73 84 07 5B 06 53 B0 E6 58 4C 50 48 8E B9 00 D8 FF C0 DB 00 AF 3B F4 8A E4 A8 74 32 33 EB 47 8B E4 A8 74 32 BF 00 26 3E 00 75 B8 00 C0 C5 40 8B E8 A7 EB 4F 26 05 06 26 25 C4 C6 00 C8 2E 00 7C 84 8B A3 00 D7 02 EB FE 3A 76 E9 FF FF 74 B8 00 5F C3 A9 FA 32 FB 0E 02 F8 15 E8 E8 90 F8 36 00 04 36 00 36 00 C3 81 FA 0A FB A0 00 80 00 23 0D 75 B8 1C 19 2F 75 B8 35 0F FC 77 3C 74 3C 75 B0 BE FF 02 F6 F6 80 00 06 F0 02 00 53 1E 00 C3 73 E3 C0 05 C3 26 00 E4 0A A0 00 C3 05 5B FF 77 80 1F 51 E8 11 FB 26 00 E8 11 F3 60 FF F6 97 10 0B F7 74 B0 E6 EB 80 97 EF 66 8A C0 05 C3 60 FF F6 97 10 09 F7 4E B0 E6 80 97 BF C3 8B 1C 89 46 3B 82 75 8B 80 3B 1A 74 89 1C 32 F8 03 01 FB 50 08 5F 09 67 C0 16 86 BF 80 C0 0A 01 E6 2E 26 00 6E C8 16 86 BF 80 C0 0A 00 E6 2E 26 00 54 C8 0C 86 7F 40 86 00 44 C8 4F 86 00 40 05 E0 E4 34 E6 EB E4 24 0C E6 B4 EB 83 01 2B F9 77 B8 00 C1 40 E0 86 BF 80 C0 C4 86 00 92 E6 80 00 04 C4 4A 58 E4 A8 75 A8 75 B4 EB A8 75 B4 24 2E 06 00 1E 01 3A 00 74 32 B9 00 C8 41 09 08 08 80 02 02 C4 E4 E8 16 FF 08 00 20 02 01 C4 E4 FB 1E 3C 76 E9 01 EC 8B 8C 8E 8E 8B 33 B9 00 AA F5 7C 26 05 FF C6 07 26 45 00 C6 05 26 45 00 26 45 C0 7C 26 05 FF C6 07 26 45 00 C6 05 8C BB 00 E3 C5 D2 05 00 D2 26 45 26 55 33 E8 00 03 94 8D 30 8A 24 3C 74 C6 46 E9 00 02 E8 00 79 46 0A 74 8D 10 DE 74 E8 00 F3 E0 2E 3D F7 00 8D 30 FF 74 26 05 EB 26 05 33 E8 00 7C 26 05 C8 12 80 BF 02 E8 00 2D 46 02 27 80 40 02 E8 00 1B 46 01 15 7C 26 1D E3 74 C6 46 EB C6 46 83 38 1F B4 C3 FF FF 02 75 FF 06 04 F3 83 08 EF 8F 06 44 8F 02 04 8D 18 89 02 01 B4 CD C3 7C EB F1 20 21 21 21 21 A0 A1 A1 A1 A1 A2 A2 2D 37 BE B4 B4 B4 B4 00 A7 03 00 03 00 B0 E6 B0 E6 B4 9E B8 FF 01 B0 E6 EB E4 A8 75 0F C0 EF 22 B8 00 D8 64 04 62 EA 01 84 AA 64 FF E4 A8 75 E2 EB 90 02 84 60 03 84 04 84 00 8E 33 81 AA 75 BD DE FF 86 B0 E6 B8 C8 D8 DB 3F 55 08 13 2E 2E DD 06 84 40 8E B8 00 0E 07 84 8F 70 00 00 71 D8 8F 70 00 00 00 71 FB 75 E9 C5 08 84 FB 75 EB 90 C0 F1 00 8E 33 BE DD 0B AC D0 EE F9 A0 B9 00 0B EC C0 05 20 E2 83 20 05 20 EB B0 E6 E6 B0 E6 80 0B 02 00 FF E3 8B 70 B8 00 D8 E6 0A 84 40 8E FF 67 B0 E6 B0 E6 EB B0 E6 E4 24 E6 B0 E6 CD FD F9 F5 E9 DA D5 A9 9A 96 55 55 00 BD DE D5 80 C0 FB 75 BF 00 FD E9 A9 8C 8E BF DE 14 8A F2 75 EB BA 00 C0 B9 00 29 B0 E8 19 20 0E E0 C5 07 C3 46 00 C2 EC EA A8 75 A8 74 C6 01 B0 EE EC E0 B0 EE EC 2B 4E 3D 10 02 C0 FF 1E 00 2A C7 80 00 02 C0 0E 00 FB 72 80 07 32 28 F1 C8 E9 E9 4E 88 02 E0 46 B1 86 32 D3 89 06 3E 00 75 D0 02 66 83 07 C3 F1 46 88 02 03 DC E3 5E D2 88 05 E3 03 05 03 04 9C C7 67 F4 8C 69 89 98 8C 9A E8 17 8F E8 19 FE 64 EB 8E 9A 8B 98 9D C3 EB 41 54 4F 53 43 42 33 4C 39 52 53 33 4A 39 4E 42 43 43 70 72 67 74 43 4D 41 20 6F 70 74 72 43 72 6F 61 69 6E 31 38 2C 33 38 2C 35 38 2C 62 EA 8E F0 28 43 29 43 6F 70 79 72 69 67 68 74 20 43 4F 4D 50 41 51 20 43 6F 6D 70 75 74 65 72 20 43 6F 72 70 6F 72 61 74 69 6F 6E 20 31 39 38 32 2C 38 33 2C 38 34 2C 38 35 2C 38 36 2C 38 37 2D 41 6C 6C 20 72 69 67 68 74 73 20 72 65 73 65 72 76 65 64 2E 0D 84 12 4B 22 48 EE 00 1C B0 E6 B0 E6 B0 E6 B0 BA 00 B3 E8 00 92 4B B9 01 C3 4B 8A EC 22 75 E2 B0 E6 B0 E6 BB B6 18 BD E1 9D EB C3 FF FF FF FF FF FF FF E4 A8 75 58 B0 E6 B0 E6 FC 80 70 FF 21 A1 04 E4 32 8B BD E1 51 8B 8B 72 FE 8C 8E 8E B8 00 D0 00 BE B7 D0 84 74 BE B7 C6 EB 87 B9 00 EA 02 E8 00 D7 E2 00 04 E8 00 20 0E 10 D2 02 E8 00 8B B3 33 BD E1 81 8B 33 8E 33 8B 89 E4 0C E6 8B B3 33 BD E2 63 8B E4 24 E6 E4 A8 74 F8 E5 40 8E 8B 13 C1 06 00 B9 40 DB F3 E4 A8 75 81 00 3B 76 33 FF 8B 8B 33 BD E2 6B 8B 80 0F D2 04 DB 05 E2 33 F9 E5 00 F7 6B 92 30 39 02 07 0E 10 EC AC C0 06 0E 10 F5 E8 0F 27 1F C0 C0 40 A1 71 A1 71 BF 00 28 AB 2A AB 0C A1 71 A1 71 BB 00 03 CD C3 6B 00 FB 51 56 BB 00 DB E2 00 F2 9C 00 E6 94 00 D2 77 84 74 FE 74 FE 74 58 67 42 00 00 24 78 50 FE F8 15 72 B9 F4 88 EC F8 13 F6 CB EF 00 00 24 78 0C EB 42 24 0C EB EB EE 1C 0F 42 08 00 BB 00 F2 0C EB EB EE 4A EB EB EC F8 48 F8 8A 1F 5A 5B 53 93 EB 53 13 8A E8 15 40 04 C0 07 C3 6A A8 5B 00 2F 2E 06 63 E8 0F 2E 3E 63 75 BA 00 8D B9 00 9F 1E 40 8E C6 12 00 C3 B8 00 B4 30 00 00 60 FA 75 81 07 30 11 6B 3C 75 B8 F0 28 CD EB E4 A8 75 A8 75 B0 E6 61 FF FF FF FF FF FF FF FF FF FF 01 00 80 00 00 00 01 00 02 00 80 00 00 00 02 00 02 00 80 00 00 00 02 00 04 00 00 00 00 00 03 00 03 00 00 00 00 00 03 00 02 00 80 00 00 00 02 00 01 00 00 00 00 00 01 00 03 00 80 00 00 00 03 00 03 00 FF 00 00 00 03 00 03 00 FF 00 00 00 03 00 03 00 80 00 00 00 03 00 03 00 80 00 00 00 03 00 02 00 00 00 00 00 02 00 03 00 80 00 00 00 03 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 02 00 03 00 80 00 00 00 03 00 03 00 80 00 00 00 03 00 02 00 FF 00 00 00 02 00 02 00 00 00 00 00 02 00 02 00 00 00 00 00 02 00 02 00 FF 00 00 00 02 00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 00 04 00 FF 07 00 00 04 00 04 00 FF 07 00 00 04 00 02 00 80 00 00 00 02 00 02 00 80 00 00 00 02 00 03 00 80 07 00 00 03 00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 00 02 00 FF 07 00 00 02 00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 00 06 00 FF 07 00 00 06 00 03 00 FF 07 00 00 03 00 03 00 FF 00 00 00 03 00 03 00 FF 00 00 00 03 00 02 00 FF 07 00 00 02 00 02 00 FF 07 00 00 02 00 03 00 80 00 00 00 03 00 EB 90 00 01 70 00 00 C4 FB B0 E6 B0 E6 BA EF 1E 8E 2E 16 63 B9 84 03 51 00 13 00 B9 00 01 CD 59 3D 07 FF FF 74 E2 B0 E6 80 80 27 0E 9E A8 75 8C BB 00 DB 2E 00 DA ED 0D 08 09 BA 84 80 EB CD F6 80 22 1E E8 EB 1F E4 3C 74 8B B9 00 FB AF 1E 5D E8 00 FE 33 E0 4C 24 86 E8 11 BF 01 AA C1 10 B0 E6 EA 7C 00 C4 FB 14 E8 00 00 16 19 2E 3C 74 E8 E0 F5 8B B9 00 F3 4A F5 F3 C8 F3 FF 8B B9 00 F3 75 4A F3 F3 C8 F3 74 83 04 EE F9 E5 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FB 1E 55 EC 40 8E 84 75 E8 F1 EA 74 E9 00 CC 29 4E 40 81 0A FF C7 75 E9 00 CC 75 E8 F1 EE 66 BF 81 0A 00 86 FE 75 E8 F1 7D CC 05 05 EB FE 75 EB FE 75 E8 F2 65 FC 75 E8 F1 BE EB 80 0C 1E 4E 40 81 0A FF 6B 74 E8 F1 66 BF 81 0A 00 35 FC 75 E8 F1 2B FC 75 E8 F2 21 FC 75 E8 F2 17 FC 75 E8 F3 0D FC 75 E8 F3 03 EC 5D 1F 1E B8 00 D8 0B E6 E4 84 74 8A E4 0A E6 E6 EB B0 E6 E4 84 74 8A A8 75 E4 0A E6 80 FF 04 20 20 26 00 1F 51 78 BA 03 4C EC 80 06 F6 EB 90 3E EC A8 59 FF E8 D6 12 94 72 E8 D7 08 02 72 E8 E5 E8 02 AD 64 A8 C3 60 06 40 8E F6 96 80 1B 60 AB 0A 0E 00 80 96 7F 20 20 BD FF 2D F6 96 40 41 60 41 E8 26 00 80 96 10 0E 00 50 0E 16 A8 75 B0 E8 0F 40 05 26 00 58 20 20 E8 01 26 00 BD FF E5 BF 00 7C 8A E4 F9 4F 15 00 72 B0 E6 FB C9 8A 50 46 15 06 00 75 E8 D6 09 B0 E6 FB A2 B0 E6 FB FC 75 80 96 02 1B FC 75 80 96 01 0F FC 74 80 FA 09 0E 00 58 7E E8 00 06 00 74 EB FF FF FF FF FF FF FF FF FF FF 06 00 12 D1 80 54 05 FC 75 F6 17 08 36 FC 74 80 45 07 06 00 75 E8 D3 23 FC 74 84 78 EB F6 17 08 0E 06 00 74 80 18 F7 03 90 58 26 00 0F E8 00 ED 1F 75 FA 22 CF 80 96 FD 06 00 74 80 7F FC 74 80 1D 05 26 00 58 50 1E B0 E6 58 A0 00 20 74 80 4E 04 C0 07 FC 75 FE 78 A2 00 23 26 00 42 FC 74 80 36 07 06 00 75 80 1D 07 06 00 75 84 78 33 0A 16 74 50 61 24 E6 E8 00 02 61 08 4B EF E6 58 50 B0 E6 E4 8A E4 8A B0 E6 E4 8A E4 86 53 D8 FB 01 76 5B C3 A0 00 E8 24 8A 97 80 07 C4 0C 26 00 08 97 E8 00 C3 51 52 75 80 97 EF 58 B0 E6 B9 FF 06 00 75 E2 E8 00 F4 60 27 26 00 E8 00 17 C0 04 07 26 00 08 97 E6 B9 FF 06 00 75 E2 80 97 BF 58 50 A0 00 40 06 00 40 58 51 E2 E8 A5 64 02 F7 C3 FF C9 C9 EC EC EC ED EC EC 9F 91 8F 90 A0 55 06 56 51 50 EC C0 D8 36 00 40 8E C6 40 FF 66 FE 8A 01 66 80 02 1B 18 1B 08 06 15 13 0C D8 FF E3 FF 3F EB 3C 76 E8 E4 8A 02 1E 00 4E 00 5B 59 5E 07 5D E8 A2 0F 99 72 E8 00 05 4E 01 C3 06 0A C0 E4 0D 04 B2 D0 3A E0 75 E8 DC 80 01 75 8B 0C 10 F7 03 02 D2 80 0F 11 7E 02 32 03 83 00 FA 72 C6 01 80 41 00 0E 3E 00 74 E8 DC E4 28 C0 46 26 4C BA 00 E2 E2 8B E8 DD C3 11 46 A8 75 B4 81 16 00 7A E8 01 74 FF 5E D1 2E 87 EF 0B 02 00 0A FC A5 E8 DC 7E E8 E4 7E E8 E4 C6 E8 E4 46 7E 05 05 91 EB A0 00 1B C0 08 23 40 02 2A 6F 8A 01 69 83 05 C7 75 B9 00 42 E8 DB FB CC EC 05 E2 E8 E4 26 00 F7 0A C3 51 FC 10 33 8E F3 5E B9 00 00 8E F3 5E 1F A4 75 E8 A3 27 C4 75 80 87 03 EC 80 13 27 D1 B0 E6 B9 FF 29 B0 32 F6 00 C3 04 09 2E 64 75 B0 E6 B7 E8 E3 7E C0 02 7E E8 E3 C6 E8 E3 C6 E8 E3 EE E8 FF 0E 4E 01 88 41 E8 FE E4 E8 DA 64 E8 DB 06 F9 80 18 14 B0 EE 7E E8 E3 F3 75 E8 00 C0 80 B0 8A 06 E0 06 00 1B 06 00 E0 C6 04 E8 FF 0B 70 70 7F B0 75 E8 DA C6 8A 8A 05 C4 74 D0 8A 04 E4 C1 5F 47 53 04 E8 D7 FA 0F 31 8A 07 E7 0A 06 25 E8 A2 7F E8 E3 E8 00 33 DB 8A 09 46 3C 74 3C 75 53 43 5B 14 FC 75 B0 3A 73 86 0B 74 E8 D7 35 A8 B4 C3 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 1E 40 8E 80 3E 80 20 20 01 CD 1F CF 08 AD B9 00 03 42 E8 E2 F8 42 C3 B8 90 15 0B 06 00 74 32 EB BB 00 09 33 F6 3E 80 0D F0 E2 4B EC 51 B4 80 3E 7F E4 2A 2A 2A 2A 2A 2A 02 02 1B 54 0F E9 F2 E6 C5 E6 03 41 E8 E2 B8 00 D8 00 C6 FE 04 C6 FE 04 B8 00 D8 00 33 66 AD 48 8E 66 C0 FF 00 66 AB E5 FF FF FF FF FF FF FF FC 72 80 BF 33 14 8B BE 00 DE 16 00 E2 BE B8 FA 75 BE B0 16 00 C6 C4 F0 C4 E6 00 E6 FF C6 E9 A7 06 55 56 51 50 B4 8B 51 64 E8 F8 06 F9 F9 09 14 AC 59 E9 C3 FF FF FF FF FF FF FF FF FF FF FF 38 2D 1F 19 02 06 00 00 71 5A 1F 19 02 06 00 00 38 2D 7F 64 02 06 00 00 61 52 19 19 02 0B 00 00 38 2D 1F 19 02 06 00 00 71 5A 19 19 02 0B 00 00 38 2D 7F 64 02 06 00 00 61 52 19 19 02 0B 00 00 00 00 00 00 00 00 55 06 53 52 57 E0 84 BB 00 00 8E B8 AA 06 00 0F C9 F6 0C 75 49 D9 4E B0 E6 B8 C0 D8 55 3B 00 75 E8 00 36 ED 0E 00 E1 B8 FF D8 26 C3 C1 20 C3 81 F0 B8 FF C3 C1 10 00 E8 00 08 E9 A2 E8 00 09 E8 00 E9 5F 5A 5B 07 5D 1E F5 B8 00 C0 C8 D8 40 26 05 24 83 02 8B A3 71 EB 81 00 26 1D 7C 26 05 28 83 02 8B A3 71 89 BF 01 8B A3 71 C7 26 05 2E 26 1D E3 84 32 8A 02 C1 09 E3 03 C3 FB 74 4B C3 0F E3 F0 EB B8 00 C3 00 8E BF FF 8B 26 05 E8 00 F6 00 8E 8B 32 8A 02 C1 08 A5 50 52 D2 02 E2 84 5A 58 1E 56 51 00 8E 32 26 0E 00 E1 83 16 F9 C9 D9 2E B9 00 A7 5F 07 C3 B3 66 55 9C 33 BD F2 C5 9D 5D 58 32 C3 B3 EB 53 FF DF 25 B4 74 24 B4 3C 74 B4 A8 75 B4 8A 32 C3 FA 4C B0 E6 FB C3 E8 F9 AD 64 64 01 04 60 F6 30 B0 E6 E8 F9 B9 27 64 01 FA 74 E4 50 E8 F9 AE 64 E8 00 02 CF FB B0 E6 BE FF 8B 2E 44 24 3C 74 E9 01 9E B0 E6 66 0F 16 08 20 0D 00 22 EA F3 00 08 8E C6 00 FE 84 0E 00 66 AA AA BD F3 8E 72 66 B6 6D BD F3 80 72 66 55 55 BD F3 72 72 BB F8 30 8E B8 00 C0 04 BA 00 FF B1 E9 F4 7C BD F3 1C BD F3 24 B8 00 D8 38 8E B8 00 7C 33 BD F3 12 72 BA 00 E3 E9 F4 0B FB F9 0C 82 EB B0 E6 E9 00 30 8E B8 00 C0 04 BB F8 7C BF 80 13 E9 F3 7C BD F4 BA B8 00 C0 04 BA 00 00 BD F4 BA 72 BA 00 3B E9 F3 B3 DB 40 8E 8E 33 B9 20 F3 8E B8 00 82 BA 00 00 BD F4 74 BA 00 6B E9 F3 08 8C 8E BE 00 64 BF 04 C6 FE 04 C6 FE D9 04 BA 00 FF 95 E9 F3 0B 7C BD F4 4A 73 E9 FF 08 8E BE 00 64 BF 04 C6 FC 04 C6 FC 80 00 04 4C 40 10 8E 8E 0F C0 25 FF 7F 22 EA F4 F0 0F 1E 08 80 00 0B D2 13 BB B6 4F E8 AF 7E 84 C0 80 1E 33 66 01 00 66 C5 00 33 9E D1 66 E2 E4 0C E6 24 E6 66 01 00 66 DD 8B 06 33 8A B9 40 E6 66 D3 8A 66 66 C3 F0 14 61 40 B8 00 00 08 4D A9 33 C3 04 50 61 0C 61 F3 61 66 C0 19 34 86 80 0F F6 04 DC 05 E2 33 32 EB 83 04 04 A8 75 66 E8 46 F5 C8 D6 F9 E8 00 8A F6 22 D2 88 00 E8 00 22 D2 D0 79 26 05 26 00 66 C3 22 0A AA 26 00 66 C3 FF 56 D1 73 BF 20 E2 E2 E2 E2 FA E2 E2 FA FE 3E 00 73 D1 D0 8A F6 8B D1 D1 D1 F6 80 07 C7 FA B0 E6 E8 01 1B 05 10 00 BB B7 2F E8 D1 9D C3 00 06 95 EB 90 86 84 FF 60 0A E8 01 05 F9 71 E4 3C 75 B0 E6 B9 00 1D 73 E2 B8 00 D8 26 00 E8 EC 06 0E 00 C3 45 B0 E6 E4 3C 74 EB 90 89 84 AE 64 D5 72 E8 00 15 8A 84 60 B0 E6 E8 00 E8 D1 06 B0 E6 C3 00 BB B7 15 EB BA 00 C9 B9 00 73 C3 AE 64 95 73 BA 00 ED B9 00 5D EB C3 80 84 7D 72 B0 E6 E8 00 25 61 B0 E6 B0 E6 B9 00 75 73 E2 EB B0 E6 E4 3C 74 B0 E6 BA 00 ED B9 00 17 EB B0 E6 B0 E6 E8 00 5D 60 E8 00 1A 19 B0 E6 E8 00 0E 2F 72 B0 E6 E4 F8 01 C3 CB E4 A8 74 E4 EB C3 B9 00 64 02 08 E8 CE E2 F9 C3 B9 00 64 01 08 E8 CE E2 F9 C3 1F B0 E6 BA 03 00 B0 E6 BB 00 8A B0 EE A2 84 64 E8 CE F6 BF 00 AD 72 B0 BA 03 B0 E6 33 E8 F8 43 F4 E8 CE 91 72 B9 00 5C 72 E1 74 E8 99 A8 75 EC 33 F5 00 15 70 11 3E 72 E8 99 BE F8 03 EB B0 E6 EB B0 E6 BB B8 20 BA 00 1B EB B0 E6 E4 24 E6 B0 E6 E6 C3 FF FF 1E 40 8E A1 00 CF 32 CF 2A 2A 2A 2A FC 76 80 C0 17 FC 73 57 F8 E7 7F EF 2E 95 F8 07 57 00 EB 5F 02 C2 C4 C6 59 D9 C8 8E D3 9D AC BE BE BE BE BE BE CA CC 88 80 4F 04 CA 00 B4 F9 02 FB E4 5F EB EB EB EB EB EB 5F 32 CF 45 24 3C 75 8B 4C C2 80 4E 8A 4E F9 E6 E4 C3 70 C4 71 03 02 00 FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 02 00 04 00 08 00 10 00 20 00 40 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 02 00 04 00 08 00 10 00 20 00 40 00 80 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FD FF FB FF F7 FF EF FF DF FF BF FF 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FE FF FD FF FB FF F7 FF EF FF DF FF BF FF 7F FF FF FF B8 00 C0 00 33 66 C3 F3 B8 00 D8 00 C6 FE 04 C6 FE 04 B8 00 D8 F6 00 66 AD FF 00 66 C3 F7 66 AB F6 00 66 66 C3 F9 01 FF FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 7E A5 BD 81 7E DB C3 FF 6C FE 7C 10 10 7C 7C 10 38 38 FE 38 10 38 FE 38 00 18 3C 00 FF E7 C3 FF 00 66 42 3C FF 99 BD C3 0F 0F CC CC 3C 66 3C 7E 3F 3F 30 F0 7F 7F 63 E6 99 3C E7 5A 80 F8 F8 80 02 3E 3E 02 18 7E 18 3C 66 66 66 66 7F DB 1B 1B 3E 38 6C CC 00 00 7E 7E 18 7E 7E 18 18 7E 18 18 18 18 7E 18 00 0C 0C 00 00 60 60 00 00 C0 C0 00 00 66 66 00 00 3C FF 00 00 FF 3C 00 00 00 00 00 30 78 30 30 6C 6C 00 00 6C FE FE 6C 30 C0 0C 30 00 CC 30 C6 38 38 DC 76 60 C0 00 00 18 60 60 18 60 18 18 60 00 3C 3C 00 00 30 30 00 00 00 00 30 00 00 00 00 00 00 00 30 06 18 60 80 7C CE F6 7C 30 30 30 FC 78 0C 60 FC 78 0C 0C 78 1C 6C FE 1E FC F8 0C 78 38 C0 CC 78 FC 0C 30 30 78 CC CC 78 78 CC 0C 70 00 30 00 30 00 30 00 30 18 60 60 18 00 FC 00 00 60 18 18 60 78 0C 30 30 7C DE DE 78 30 CC FC CC FC 66 66 FC 3C C0 C0 3C F8 66 66 F8 FE 68 68 FE FE 68 68 F0 3C C0 CE 3E CC CC CC CC 78 30 30 78 1E 0C CC 78 E6 6C 6C E6 F0 60 62 FE C6 FE D6 C6 C6 F6 CE C6 38 C6 C6 38 FC 66 60 F0 78 CC DC 1C FC 66 6C E6 78 E0 1C 78 FC 30 30 78 CC CC CC FC CC CC CC 30 C6 C6 FE C6 C6 6C 38 C6 CC CC 30 78 FE 8C 32 FE 78 60 60 78 C0 30 0C 02 78 18 18 78 10 6C 00 00 00 00 00 00 30 18 00 00 00 78 7C 76 E0 60 66 DC 00 78 C0 78 1C 0C CC 76 00 78 FC 78 38 60 60 F0 00 76 CC 0C E0 6C 66 E6 30 70 30 78 0C 0C 0C CC E0 66 78 E6 70 30 30 78 00 CC FE C6 00 F8 CC CC 00 78 CC 78 00 DC 66 60 00 76 CC 0C 00 DC 66 F0 00 7C 78 F8 10 7C 30 18 00 CC CC 76 00 CC CC 30 00 C6 FE 6C 00 C6 38 C6 00 CC CC 0C 00 FC 30 FC 1C 30 30 1C 18 18 18 18 E0 30 30 E0 76 00 00 00 00 38 C6 FE FB 8A 32 81 07 77 D1 2E A7 FE E4 CF 9C 9C 9C 9D 9D 9D 9D 9D 80 3F F0 1C 20 20 58 CF 50 B8 00 D8 06 00 04 06 00 3E 00 75 B8 00 06 00 0A 6C A3 00 A2 00 40 3C 75 F6 3F 07 18 86 80 12 40 0E 3F 86 92 4B A0 00 4A 0E 00 9E 0C F2 EE 06 00 74 E4 A8 75 A8 75 0C E6 B0 E6 E9 FF FF FF DA FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 60 33 B4 CD F6 80 52 40 8E B0 86 00 3C 74 FB 9A B4 CD 8A 51 03 10 52 D2 02 10 08 10 89 72 FE 3A 72 E8 8A 0C D2 C6 FE 72 E8 8A C9 B4 CD FA 0E 01 61 FF 00 00 00 03 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 37 B6 BE 47 4B 30 43 4D 41 EA DD F0 35 31 2F 38 FC
{"data":[
-1100993236,-1959854112,76230196,1947140265,-1876497661,-2145246021,-58670876,-401967808,1480327193,867898229,1921771570,4098094,512241152,1692925953,-1664917134,209500754,
-1973295878,-2133526816,1642336484,-533065692,-5179275,-131797778,-2034000550,-771804421,1352109027,39225600,6295179,-956019063,70,-301027133,-527766462,-300961718,
1355017282,-1207545517,-1064435640,162857649,401080752,8389888,-1325368157,-1325550320,583681,117472931,-1017619623,-1974119853,-2000319280,-1912583154,48069,509734,
1204233728,-50331902,529213180,-50529028,16483324,443942,141819904,704662688,-1877677119,4992568,369100404,-940900276,704662688,851508929,115392996,-1017423267,
1448235347,703319,-1090517575,-768409592,-1031736329,-1995983312,1325437845,-51387825,-1090481218,196673536,-56233216,-1090481218,196706304,1604711168,1532582494,1381061571,
417879639,-1291274496,469809264,12501134,-846613504,1592003093,1532582495,102654147,-1910767432,-54489384,12566579,309504,146713587,469809152,-150990661,1507,
-1996434816,1418199620,88393220,1594148754,1097216,-1141899080,-470351856,-2132559867,1149829330,72648706,-1845148474,459975,-1946144578,-392514616,415105132,469809152,
1642631859,2145792,-1291829064,5695634,-1946146626,-393038896,1086193740,-1342130176,1105760947,4767232,-1289748296,3598482,-1207938882,-1833713664,-973067288,-1073720314,
5703366,5815936,-1276116808,1501330,-661731188,-1075595074,129564841,-372162304,520594931,80200545,-57999361,-1073422143,1149830383,75270146,-955949944,1604,
-1901047613,-1468619800,-117214016,-1766842389,-1971939352,-392843040,1990424208,-392646656,-527796600,-2115463248,7906166,1354979576,1978175152,-2132768138,-922087220,-461372555,
-393301777,-1017612695,1148774486,2287707,-1157627718,297383555,1151985664,1676170947,233331524,47616,-1179216709,-1796734951,1621214020,1019225088,-385649600,-474087292,
-17071946,-75467916,175011071,-1217760037,616860176,1946369027,1946303593,977319682,-1101630753,-947865872,616860176,48807948,1316225852,57934396,976275328,-1103465761,
-947865862,616860176,82362416,846463804,57934396,976275328,-1105300769,-947865852,616860176,115916992,376701756,91488828,1949353856,1944009220,-930341367,1105778830,
516104031,-661731188,847249598,-2147436060,-488635732,-1173457669,935022592,1030583,-347872536,818094078,805777415,805777415,1258758151,537346567,1258770183,1227262471,
23496704,54271683,-1979294345,62130046,1375773672,-1274915189,10151938,-486257013,209095478,-1911535989,-1951597352,2122319454,326500608,259262268,192153660,125045308,
57937212,1368632467,1085820958,1490587136,520101352,1523835481,125733383,16795382,45352309,520114152,4793994,-1023318392,997459772,930351164,863242812,796134716,
-1275067975,3074057,703071156,985857536,1962953238,-19779052,436109510,-822211723,246680240,838864872,-402475822,-1262288888,190478,1397815531,47878,1119601550,
650677248,1527187257,-855411624,245154576,-1016327448,-1847062864,-1327461772,1955260436,57999784,-1977561984,1958783172,536918542,-1179091525,-857210794,-1472992446,-1173588960,
2109415424,5683640,-163398936,16781318,12192885,-1194083552,-402646087,279462567,12192884,-1192314080,-402646855,116802199,1947205782,180367883,1946161670,1913055281,
-395141400,930247337,1692844208,1920114920,1924130862,1625565554,594903208,101367858,259325970,1952351208,-1777434614,-1796730880,-1173558434,951787520,5618105,859981544,
1916594413,-392887950,-1070399443,1181194,115868532,302433792,1623392256,-1157627718,414824736,1109256192,1946500245,4974595,1181382,-87858944,-47963676,856039910,
650153664,2367115,604423974,-75140608,1088153683,512304731,-1341718492,-1184569760,904462335,-1469783028,-503155710,-431640331,-464469152,-434065312,-1261479904,-2145989376,
-143311876,5290179,-958886370,-16777210,-1928935649,-973078528,-100627450,-5121229,-13373259,1276020742,4765696,-953761650,637534213,-16628281,654114047,-50592373,
201129212,92874432,-1040317324,-1014821909,1959606848,-339083772,-2132049460,-1995934208,-2013229794,117476366,-939608893,-2147450362,-1895381504,113704704,-1124007790,-1779957632,
-2134539950,1958742784,1714325522,1729530112,1762560000,1678672128,-1023393536,-2065268816,1354678323,-16464128,38046207,251937990,-1845148474,-2012855160,1220413252,-16464128,
38046207,-16497466,-1845148474,-2012855160,503711556,-1912581960,4765912,-164380530,12189491,-211354560,-2049115,-491044981,523734015,5506758,1460061888,512458752,
-1205993331,-661782448,206594532,-1604196856,113639424,620691456,1166550768,1642485761,268813862,1894166960,-527797788,1894166704,356836,1065400580,-1053045973,-617414030,
637985729,637689225,-1258005111,-1043778818,-1993997087,-24443315,-2010716020,1166550565,2147465473,847249598,-1406731036,-85794814,-989932298,-970684378,-67108858,119506150,
11069635,-1962909533,41991112,1948303862,33602315,1947255286,16825091,-150732616,-1999962397,-1979674602,1019225281,-1155566528,-1040841728,-1156876992,-1040840704,-1157401216,
12068864,-18614524,-1860794166,-41237760,79233203,-1060664832,52691695,91554364,-352205952,1963015175,79921157,-1205934110,-661782448,-1979711298,-1339817404,1149813514,
-16464382,-956365626,80150276,-466477057,167797411,-1291684389,-1191235071,-470350848,-150732613,-1999962397,-1023373034,5244615,113770495,82,5506758,1426507456,
113676800,-973078442,-2147461370,1354257182,-455569920,216042081,-429791736,2001796,443904,-2065236224,-50529028,-50529028,-50529028,-50529028,1642520710,526107531,
195,0,16776960,9617408,16777088,9568256,16776960,10096384,16776960,9568256,16777152,10157824,16777215,9633536,16776960,9571840,
16776960,9633024,16776960,9633280,16797440,1325403912,-16252672,16777215,-2030043136,-721414008,83892360,-620750711,771758217,1360396559,-1071640824,251658509,
-13713374,-1199021266,-1064435704,-2010763344,-58399203,-50529028,-50529028,-50529028,-1191379716,-1064435696,1723867151,-475,-1071509633,8960490,17772272,-16229090,
17772261,252203286,17678368,-1071509760,1731133230,571528,1642381454,135061642,-997563930,639470118,1734,-345905409,17772210,260591894,17678368,-1071509760,
1798242094,2144392,-1062152050,-4627226,1692728063,91488936,-1863714590,-18176,27813092,-119405195,-469728535,1963501664,113731196,49152,15448064,-1006591642,
627441899,32768,15404405,444262,192,-350819562,113731072,49152,15422976,444262,192,1711336344,-1073740089,1677721600,-949616405,12582918,
-341835776,113731072,49152,15413248,444262,-16777024,-424431613,-2039356304,-424431392,214206064,-344857056,-424431598,-2039356304,-424431392,616859248,-1200494881,
-661782512,788454633,1360396559,-1071640824,251658509,-13713374,-1199018194,-661782520,80148019,-1199249665,-661782472,-1912584008,-1174457408,1727807488,146318835,869830144,
-66795786,280528102,-371683840,229703317,1912603880,1376432150,-1065037261,548405877,399311028,1946273014,-1017448191,1680227886,-1426049435,-1347965531,-1023381651,696965514,
2089498507,-1601467765,-1957342837,1381191916,196091398,551821542,1433739432,-930288334,1183766670,73304838,-2146465242,91550457,1978923392,1325351688,-352209662,-53048341,
-1400230722,158597180,-143277766,-336426173,-1976320297,1017962123,974550016,-1946716735,-461371322,1324559108,-13703471,-343262316,1510416138,1499289691,521213417,1482381831,
-1949345443,33390834,1325335413,16547842,1330578548,1195836139,1005751235,-2145356297,108331517,-16625921,-58719666,1325954048,1313754703,1194453838,1179010631,-2094404794,
225837054,1946221696,-347189756,-347716069,33390615,1325335413,16547842,1330579060,82529870,1179010887,-2131588157,74711292,48975438,-1950136762,1979137010,16547861,
1330579572,1313754959,1195848171,1179010887,-24958485,-2146339329,108265724,1330597454,1178999275,334186311,1963064704,38207235,1946221696,-347123964,-1018738942,-58658165,
1325691904,1191373647,-225721529,1963064704,38731523,1946221696,-347123964,-1018738942,-58658165,1308914688,1174596430,-1963080890,-1962915298,-751173034,-745929614,-990459138,
-2029227007,720710346,-153159983,704965594,-19846411,-389873978,561250759,4800128,-2144833022,50350398,1380979575,6493835,-1610300797,-148635547,-346531090,1228832782,
124912640,4800128,-1954777849,-2115359765,-788463643,-1963422747,853800645,-775879699,1309017056,-963864832,-259268978,-956832778,74711296,-570959625,-956047151,1958742678,
1942370836,-1963972080,61207498,-16972811,-1963690546,-1327002896,-204830176,-16972885,-1191807538,-661782464,1946236648,1228832793,309461504,4800128,-1962182909,-2097126634,
1704985794,-2134643200,100682046,-506461068,1354621648,-125087232,-315439734,21019288,-1056709897,5113347,-1729066089,-150912838,13039586,-149916671,-2116159528,-2145324857,
100682046,54985076,-1899852601,1398445786,-1073029237,-969265036,-265671565,-790179760,-1949922330,-1963226128,-1952123958,-2114221072,-2128609034,-1977614089,61141962,-19070011,
1491105230,-422514550,-1973885232,-1963226172,-1951730742,16220667,-204830176,-19070038,-1008044594,-315398626,112742,862322688,1073789381,1721696051,-1419325231,1642396130,
1642466316,1642525476,113510,862322688,-980719907,-164421882,-1639972679,-1613508250,1179010732,-203308238,1642341237,11583656,162601845,-741120354,83788614,-1314989454,
-741120481,2051892895,-1070391393,313027,207742032,610395660,1499588339,-115353973,-2029586749,-3996672,-1,-1,9318890,508973296,-1912586056,243928,
524504808,-1949345698,281248747,-1949069574,-1178497311,-888994784,1236914574,12581888,-1897218557,-1583010061,104530512,57999960,1023606946,175440215,-1207950145,-1934890617,
1824500680,-1917470720,-1412920149,-1409330248,-1901344628,113518277,-1868365806,-1845064704,-594609408,50446163,-1274837574,-350106353,-1899416817,1377733593,1977320706,1501161866,
779403274,-1274871110,-1205744375,567086081,1962950016,-16398835,108334396,567089588,1596211460,-596491972,604199330,59089423,-919358485,61214345,61345417,-1828272319,
855769091,-611442990,567089844,59095583,567093172,-1948545506,-1962929130,520094734,-1169077934,666108805,37495245,-1860537000,-1960916949,-524123693,869961231,-853887790,
-2051399903,-853036029,-854543327,4030497,985271412,-855002109,201898017,-980540979,-2135237234,-853888000,52001,1850280461,1953654131,1297040160,542196048,1143821133,
1679840079,1701540713,224752756,1953383690,1679848037,1702259058,1701868320,1768319331,606106213,168626701,1852400978,1953654131,1936286752,1953785195,1852383333,1769104416,
1092642166,543582496,1701012846,1918989171,1393167737,1802072692,1851859045,1701519481,1752637561,1914728037,2036621669,2361869,1230192962,538984771,4544581,-1472046104,
-401247231,663355914,-398302488,-1070384696,-335284294,192184488,1317078708,-2013265642,-1023393498,-1472056344,839152897,-396301340,1534394314,-167650840,259264519,-58710134,
-2147256937,-327154748,-401478893,-2018229868,141820732,71042996,1639187060,216541064,975169602,1342523018,33900230,-966873624,-402651834,-2007474522,112461126,-335284294,
41189544,646480052,1317077057,-1023409898,-1880555725,-167283457,1148551364,-466421621,1006651018,-1274449403,374243585,820707329,578076682,20747188,1957957748,292815420,
54269364,-1749808268,28313579,-348031256,-402542587,937967964,-400062463,-947175025,19720387,-2065160310,281343553,31982453,468239104,-2012771839,1996423751,88508928,
897001276,1967180264,1087432722,425600,-390069387,1007625220,-400657661,-269993627,-2006862848,1095100455,1187382960,1187382273,-397410048,1951947834,961013872,-1275014680,
-400062462,112214311,67192518,16795334,1545398352,-397118376,-1276626647,-2004372480,1091168295,1187382448,1187382273,-397410048,1951947774,957081679,-1275030040,-400062367,
112214251,67192518,16795334,1541466192,-2127268776,71246,-1979681304,663224935,-1975465240,-352304858,-400757972,393560098,-2143278616,1962935934,82362371,71044900,
129238389,-402396032,-998227864,4253715,-1729615992,38258240,4624128,1996472370,851680534,107383488,1912798336,-2130594807,71246,11803115,167777768,-1273990137,
1964025857,605225986,1946364935,-1023233022,1586158387,-1866235642,-1672428800,-1975458566,-465509152,1019488832,-453609510,-1017602752,-1342048582,-420942176,1708910643,-2065258320,
66370299,-33686036,-50463235,-1073082588,1458242420,233603984,-1070338933,918870158,1085800568,-958886400,-16760826,-969403160,-973076922,-402651322,1187381401,-1830289146,
88524288,1553262592,-2065256528,-1341918534,645983756,-2081423297,-1280307772,-907485046,-2030558106,-399265568,-1070373179,-930359157,9444874,-973208972,9518602,-973208972,
208989450,-440349186,30244870,1060360,1060497658,963985576,-1975583256,82362592,168813696,-2045807397,9955548,-393017227,494141585,-1280307477,1843978378,-2046555034,
1718347972,-1975581976,550273248,1592299184,-3933338,128976246,-1270928664,1062070419,-956371480,1187381255,-269996027,88524379,1541990408,1760036023,108956223,-1187028248,
-85415829,-503024330,-399250439,-1460863284,-2146732784,1946158462,89062950,129291243,2122318256,91553797,-348207128,-1332497401,1053943809,-1996580376,1056040999,-1879506453,
1019413830,1007318016,-1341885183,-1341985901,-1008715257,1867385357,2035494254,1835365491,1936286752,1919885419,1936286752,1919230059,225603442,1885696522,1701011820,1684955424,
1920234272,543517545,544829025,544826731,1852139639,1634038304,168655204,906628388,1143812656,1701540713,543519860,1953460034,1667584544,543453807,1869771333,604638578,
-1191181637,-2135884312,1910796518,175505212,1951134946,-35079931,-436212501,-1,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1726778197,-65121456,-2048523856,-1912316277,39750619,-75489397,-1341491728,-8067566,
-1511456186,268140801,-1341361147,528803348,1566074459,-1341785623,-393943533,118381785,-1156341569,-611450752,1723867151,4389,101616512,-511613440,15,1723927398,
-1070373205,1711282337,1745323,650029926,571648,-492083539,-266268677,554675046,1722509048,379699251,-1096063488,1722613788,1726516395,1725992107,309675,-492083539,
6340347,-1950338202,-1419378108,1711573862,-219,1722508800,1150009395,-1096063484,862322778,38046656,-1956205722,-14326268,1711341567,-1070373205,1711555723,5160619,
-1950338202,-1419378108,1711573862,-219,1722508800,1150009395,-1096063484,862322772,38046656,-1956205722,-14326268,1711341567,-1070373205,1711555723,12084907,1711313408,
-1070373205,-524162932,-1196726780,-1419313153,47206,-1419378542,-1933560986,81838560,-4674714,-1096063233,862322760,38046656,-1956205722,-14326268,1711341567,-1070373205,
1711555723,4374187,-1950338202,-1419378108,1711573862,-219,1722508800,1150009395,-1096063484,862322748,38046656,-1956205722,-14326268,1711341567,-1070373205,1711555723,
3587755,-1950338202,-1419378108,1711573862,-219,1722508800,1150009395,-391420412,862346043,329302015,1528760079,-815966106,-1633050967,-1752459381,-1751345268,192349500,
-259267534,-13703471,-1013485404,8857216,1977289455,-2029092859,-1007153152,1960512082,1662421778,79856384,201352608,6660616,-1961825298,-2097126634,1704985794,-1560861696,
1525547109,-1500331016,-1396003714,-550666149,-1951422534,-1034056786,-1738237777,-172578852,-826018394,-2088916993,-2088926339,-1753447547,1532582488,526212958,-12537,-1,
-1,63498751,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-739639297,-253,-1,-1,62646783,1962228456,1228832816,175244288,4800128,-352095225,-1628925825,1662421802,
113410816,-1460871030,-84183807,1946265836,-1429959941,-287114425,1228832963,124912640,4800128,-397314809,1202334321,-389808926,779416815,4800128,-2146995708,117459262,
-477481358,-1960160024,-2097126634,-661977406,1963043052,-1460864261,-1946455039,-486822973,1048626159,1912864841,1228832775,141887232,652796810,-1012141270,-1976941848,1049232990,
-896794551,1858001550,2042628858,-1898827000,2083964378,8332544,-523116335,-268181295,1946615680,283935587,106415243,-946940020,-125086895,-1258036352,145861640,-489561391,
41148624,-906046710,-963972491,-22289782,1541830093,-1939929254,-1176990000,-192217084,2046546093,87238147,-20479573,-70210273,858129273,-276714747,-454942798,20901761,
-2082966198,787157188,-779361398,79289995,-1393325312,58326224,-1442500058,536856449,2046611628,87172611,-1309703766,-2115706337,1241595887,-1195124619,-386086912,-2143485871,
-1191676193,-661725184,1065474867,964012629,12187187,-670913152,-102573054,1085806708,-2133291520,-16772594,-1152384838,263829303,760342528,1085805547,515935744,62445710,
-326414336,1476419327,4241496,-1899767666,-2116340776,1974097215,871773026,40864457,-779361839,-489160020,-1321306629,1391121156,-1912586056,-661774656,1342178232,861271179,
486487789,208989451,4241438,243325070,536805394,-661890979,-611558881,-1019487741,-2143478666,-350522657,503734293,-1152384838,347715689,751691776,-1168046305,-661913472,
516145667,-1073694714,1962944488,-947897081,-1070336394,516103943,-1073694714,1239120,1342665818,1273545355,-2143463424,133002951,-1896037601,-2116340776,1974097215,871772973,
40864457,-779361839,-489160020,-1324780037,-1930767612,-1010695208,-1172437408,1773883392,1358264,523001576,-2135269113,64523264,-1009634366,1085855886,515935744,1342178232,
1593830539,-1021356032,210447953,976111174,-502959068,99350775,76164678,-3974663,-1288523493,-1221151308,766556600,1904806077,1953654135,1869182329,224222064,1685283327,
1785227110,-1480889237,2052915168,1651925880,-1364431506,-13959249,555482912,623125312,673850974,137060137,436210447,477961083,674899725,729688354,876360572,960443710,
959985440,909456429,858927403,863792,-2075560121,1951232843,1985049935,-1907716792,-1873899700,-1840082608,430931,520887815,488315674,472582684,-1756954614,-1723230136,
-1655858357,-1605329073,-1571643055,-23725,-436096944,-435113851,602495108,-148571571,-301677949,-297607034,839248515,-289109276,-1396375998,-169719058,548988415,105352711,
12189491,-1951665376,55020055,-1703954,-1,-1,-1,-369098753,-65398,-1,28313168,397444582,1085834470,-1329558016,-425662944,-423611872,
116795120,1948254359,645932555,132055191,-821899944,1448302076,-326951343,653036304,9899648,7788832,105286555,-427691893,-390004721,140413700,-268377215,-661732597,
-1409281863,-131800950,91543612,233567714,-14308208,140935431,1175058432,1725537032,281314048,1532909855,-816314531,-436096944,-434720635,-434065276,181229728,-1202708785,
-661782464,-88067496,7341702,7212683,7083659,-1461116933,-1202708895,-661782464,1846446586,1813416192,1879492096,1492844544,1636690207,-1342170904,1542383616,45150346,
-1973688344,-402345784,-393585696,-1335790871,-706151926,1954588763,-202638589,-1054525,-427163472,-1336162072,-387872254,78666689,-1159142006,-401887141,34364336,-31130844,
41210500,-527826676,-1561850960,1630660955,-1325417240,1536354311,145805450,-1973711896,-402018064,-930456700,2112369328,-370636197,-1696046833,440575,-1336183576,-387806713,
145775469,1726539402,-1979076517,1533012193,1441270704,604114011,-1327461637,1531963403,-443927888,-379893528,-1325768489,1530587147,141828264,-1070375941,183033,703072944,
1971365979,-1979600649,1529080038,-511048784,-1336206104,-387610107,-1578869995,-1578697180,99093424,-1977611173,-401887008,-1863755007,196147808,609940456,-1327461665,1525671947,
-1973387543,-198919709,1976009964,-209000436,-855705886,-2135625867,-1023363901,-20987853,92874255,-101058055,87631609,-101058055,246465529,-1310131556,65539674,-1878856960,
1975560399,-1325753326,1520363565,256014,-812645653,868417828,-1901018176,-1981220196,65539674,-1878856960,1975560399,-1325753326,1517742253,256014,-812645653,868417828,
519816128,-1912586056,279013080,-14326272,1711276287,-432820144,-1468930960,1951950368,878086,520159232,-7935805,1048602740,1946288201,1228832777,41157376,-13412117,
1958725518,4622848,158597180,1182073148,-336534344,-257640445,1946499878,-1409614791,-72628084,-1979685472,-1962908122,-1191156970,-1595408372,32815880,-2094580248,1704985794,
263515648,-1260048408,-450172925,635962036,-402541339,-54270688,-464474778,1480632417,-293395084,76113412,1220038686,-455569920,216042081,-1973295608,-973078506,-16777210,
1642513542,-872865960,2122381191,393543686,1966210536,-432820201,-1468930960,604533764,204961276,-399250684,779301368,1949438440,-1608204741,-1473092632,-1102023679,266903593,
-1975547150,115835103,1946484608,-1607221698,1958798208,-1607549386,616444395,-33246048,-30903092,-2094762808,-202701370,149191,71747328,1187381248,1187446791,-956301300,
2630,1966180840,-397808836,-596495931,772558476,-1996270453,-617412010,1966174696,830400522,-1976695438,-1979764196,-1976696226,1854407276,1284124165,72255489,17254086,
1966177768,-242685937,1962950528,-386431225,-142085503,-2010022680,-1070397866,-32086399,-1007187969,-81327871,1326383648,151200021,69280335,557600530,-843122809,72780704,
1966149096,823846959,20719218,-964486540,1946303494,214336266,208929596,772195971,1946244155,113672981,22297390,904596596,678690876,22297390,333985397,4161777,
-142145675,-2014180120,1418342135,-251598845,1317803912,1418407436,173443332,18245249,-339725568,374243604,213123073,451657778,18239105,839693312,-254482240,1962950528,
1358399241,1492241640,-142084217,654901699,35715987,141829897,1326383649,52499733,580341513,1325990689,69283735,1008160530,-223,-1,-536870913,151135490,
-162463958,-2144925681,35979999,1358899721,654839798,620945216,-15003902,135263828,48169039,705233445,267800831,-545239288,151135490,-162463958,-2142304241,35979999,
1711217426,1325928438,547588864,950348288,16776960,0,509606656,4243280,20766606,494154615,10487542,-2144701183,16818190,-100642328,-31153692,-386162202,
-336068576,-1610156523,57999616,-401871880,645922851,-335675232,-1269237503,-899735808,-1325793278,1464002571,-1974452212,-401887008,-78096579,196147907,609693672,-527806273,
719850416,-1006938025,9969289,10094220,10229385,10358409,-92013629,1242002432,-2035019916,-466435079,-335412806,-1930825692,33667584,1007625452,856323343,870003648,
-338545719,-326937224,-1997763826,-386269114,-108330899,-940699728,3142,-1995678069,-527824290,839853292,-1961789984,5236959,1586092331,173947660,753656439,1055448971,
-153539840,57934276,-167616887,57934532,-167485815,57935044,-167354743,57936068,940072585,-1267400634,1532516603,1566399065,82362717,-1056642111,-356449047,1355020292,
1139146928,-930463516,-393592604,1610335064,1086018334,-153383424,16818182,113651317,100728992,512607118,468189344,-453376001,-335666015,-436147456,-437716063,-1610156290,
-109805568,10495616,32241791,1595890681,-83885366,106979167,4241438,646568078,378273895,11534441,-202866458,520516608,62152967,1552808911,130491936,-930283521,
637853889,-1946007671,216580552,71796774,88589862,677154202,-16267482,-1043297025,-1993997088,-796130745,638380225,637814664,-1845147706,-930327034,915259534,-454515310,
-388986112,123601127,638082189,637687689,637814664,16713671,-427773702,17770096,12707871,38242598,637584104,637814664,-63545,88589862,17770130,-536801513,
251658509,-13701119,866208046,-805302336,-1912592200,1095888,414767246,-54489600,-13371853,1894121648,1726599505,-145119757,1946157505,-2135907071,683176166,-1898410496,
1724944064,2101072,-121498,571441151,-363305472,-268393512,503385902,1558946129,1212868858,-776988299,1105749222,-1341098680,-396302625,125126712,1692860336,-1018679320,
1642332852,393494696,-397390258,41156918,76088459,-435680168,-420010911,-1979599775,-343873852,-1044345711,-972880672,-1047768637,-389953909,-1044315388,-1017574168,-1912586056,
1763086040,1730579200,2942976,1894121648,-2040461537,-2038373180,-326412860,209052682,-33134975,105808383,183173184,-1090099583,105808383,-815988735,1967633384,-422465509,
1202382948,-575663499,-1578606362,-1341557433,-396040449,74729368,-2132409424,-1335926845,1413933105,816898186,-816562200,-396402693,108330798,-889585740,1408958466,641227917,
-63545,-524171124,1200170500,-1043821566,-2010772248,-970587065,1536820551,-435048198,-423130592,-435900383,-436096991,-419450847,-435048415,-423392608,-436031327,-436096863,
-419450719,140283297,385945382,638606477,1428095247,1187507339,1560293380,232784143,17760257,788475632,-1070358195,-1194328049,-796000216,-1912596296,2144472,-466435954,
183032,-1207558573,-661782520,-2147479365,1971324799,75464751,-2094434880,1962934911,2145059,-1845147706,-1912594248,-2049088,639601446,251660279,-4717196,-1207702784,
-617414404,-1017438457,-1064384372,870774203,-1543453760,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,
-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,
-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,
-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,
-1543503872,-2046820320,-1543503872,-2046820320,-1588592640,807731216,1479556096,121378676,512431474,-478150640,82559024,-1976631502,-341294457,-1576554494,1235222601,-1342129408,
1006875834,-1157204985,-725960704,-1983672829,-1744805098,-2097041261,-2081553214,-1070398230,-1577038173,-1976696734,-1549266297,-472842166,445090606,5022632,-1976636463,-2136462681,
1705000932,180364288,6660804,849840686,1713801384,1095936,7989254,174885414,189565478,603998624,1963080958,2088773141,242552073,1206437258,-1964471808,4253889,
-1995978614,-1610588146,121372745,71042932,1929380024,119584771,12189491,514585376,5291783,146391091,-156503296,268470022,-189069708,515958785,-2097125984,-1007811390,
2041169,-523107407,-235532623,1913126016,1505820162,-1962986813,503335198,-561056205,7616197,983534126,1458766760,-374885699,1593570347,-1064380276,119849759,-1744805214,
653742672,1319305292,-779003392,-401820439,-782367449,1351388134,84470016,167798432,-2146863617,-534503453,200000266,-472775247,606135168,-1564276001,-1031602074,-1597772283,
1183318089,4890624,-1610529144,1183318114,673760007,673730640,134238288,268437504,1073745920,1073758208,673988608,774514989,808462622,808464432,12351,538972176,
16986144,466618115,-490529840,466623440,-1784610988,-22733872,466676103,466623440,-279475639,-261809200,-129894323,-415634343,-399574951,-407244846,-26286350,-11272365,
-272109404,1251409920,466623519,466623440,466623528,466623440,49808376,58196924,336855672,16847892,1966337,816840766,1085834470,-1950315008,1509954334,-1070338765,
857735358,-1178235137,-1410105344,268486017,-277680581,4241490,512344206,-1070399469,-2134916978,5290240,-1765881716,-1415237976,-1070335774,-2134916978,571649,-1426063176,
-1325604181,864347697,-1094676800,-1061181306,571649,-1523660660,-1325669717,-1098586574,12560454,2144512,-1523660660,1476125355,855670463,92874432,-432820129,4241540,
12245134,1015079954,-1979550412,1914079696,-432754688,-1181698940,-617414626,-997535181,-1974499352,-19266608,-1326193980,1333455023,-1364143990,-1974504472,1960000496,-393301998,
1074548584,-1901010806,-1336974104,-1333467595,-1148918218,-661913600,951107726,-1732344602,49064,771752633,1111659181,1962884332,46628871,-1416476086,967896546,-1665235738,
573352,771752889,-152268115,-527765808,1975794412,1086816261,-337466478,-2065286480,-1079467330,112787576,-1523649792,-109721211,-1912586056,270436824,-432295936,407496836,
8851072,-393301996,1084772064,-1380970379,-1471227928,-2146995195,-83851482,-2068114965,1200500410,-202053626,645924212,-956628857,402686982,-1310157648,-1976556466,-1340190496,
-393943470,1478488125,-58716300,-402426880,1404043580,1055425766,1085850608,-388461056,158485726,91555132,8857216,-15365,60746239,-2065280848,-1912586056,-430853928,
-393301884,-1062711708,-4979340,-1332737301,1314318484,-527814620,1387273808,-488078106,1951932399,102679297,-206641072,-1070396300,1958723726,96937472,645984484,-2133917680,
805310478,128975028,645927117,-2133917680,536875022,61866164,-1058533171,520574976,-2065279824,1929471464,-1209156850,-1124065863,48868085,620686109,552095808,477321216,
1076154614,-430591920,283662468,-1341295872,-393943466,2028477589,477489180,-1165706557,-1014769013,1975519759,-1328314560,-2146388735,276041980,548733872,1948318848,4581383,
548733872,1058432,271452367,777211904,-402241650,1482420934,-1007091084,-430460848,11819140,-1070395187,-58698813,-402426832,243269651,1529872400,105352750,-1326277144,
-103189497,937224387,31982453,-1901018368,206395368,-1327461856,1297344654,-430395197,-1155592572,1504754308,1200522470,-227743738,-2098658444,-430264320,-2130595708,1963178047,
-1962823678,1538321943,-768375578,1334574899,851938061,-33391676,-1430113600,-13372446,-1962061941,2076455623,851508738,-203313470,-226491019,-1328187905,-1669011876,-374603075,
-919343112,-1274914934,15591438,-1339525987,1401218653,856184715,206539465,503996299,-1912586056,1220824,454682704,1480013288,312607604,-1336205568,-2088442274,-75427901,
57916066,-1325441047,-1014700449,1917526248,1259202579,1692844208,1917523176,1260644359,1625555570,-61,-1,-1,-1,-1,-1909331201,243920896,
1235222624,1023288320,858420482,-975466789,-2147453898,1963792764,415364892,-1961462504,1625522649,-389707168,-393609199,183026058,197691904,-401951541,616759359,-166808561,
-773271068,350802408,-8338688,-2042071289,-771804421,38702051,5279625,973103776,863307590,-2034224302,1244067781,-1580727552,-388956082,-1269118973,-289109490,-339375550,
-301929728,-1966801334,-352261180,-1975325184,-352261183,-1018499584,1122944138,15451530,1257111787,-997538562,15401195,-1047903506,15401195,-436253970,5814302,-21243762,
32553720,855642296,-1387282945,-465926167,-435418015,-420273055,32553569,855642296,-1385710081,1933214697,-396929525,1583302548,1273699186,1084776932,47206,259325952,
-108856447,-2101672588,867625977,1354964928,637897254,1642333576,1642466316,1642525476,-1072994728,65542517,-2132769062,-164425756,-590347087,-498727565,854995961,1712843712,
644220043,-141884109,-1476393799,1711764991,1174988993,-930417182,-115353973,-61,-1,-1368195073,-1364808040,-1339183193,-1297895330,-1331907933,-1364807454,-1320570969,
-1297895055,-1321487709,-1297894887,-1304120669,-92229008,-854428800,1436307520,1183575179,172394754,-346514083,102654024,-326434710,1981152384,4241418,1726535822,-2127631612,
-124314,1724033,872217346,-992440640,-167705546,74711490,18364100,-1912586053,-1965519909,-472836770,-426246354,520554413,1720242017,1948682261,-855592448,273058368,
-2143510748,-2126769806,99093879,49211415,95683955,-1023026200,-2013236064,646452294,1720189044,-605502699,-397184507,548406504,138737190,201487552,360611841,202470666,
-1977200638,-1073084604,78643829,1476413064,-402634590,-1030879984,2142697611,169180800,-1005975948,-956431755,-2011929078,74711398,74901050,1256917428,-402275352,1114768851,
1912856040,-386364867,309528070,1947335808,147322378,317205620,-400037115,770180436,-400592379,2122319109,91556373,1912931816,21954065,1190643061,1962934554,86632456,
770180075,707445509,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,
707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,-402416407,2104624346,-1341921304,1156982320,41205768,2122318092,292883221,
642777612,168248458,-1342016064,4622340,4760152,-1241247768,360611967,168195083,-33393212,342231750,1946248840,1994799620,-351685628,80144436,-1962677272,-386888742,
-68680628,360611843,-402295541,426902527,1912913640,46721044,-202895502,-32869884,-613088946,-352042264,71755779,72673475,1642604658,641773571,-1073199882,17564276,
-402634590,-1998060424,-401640956,175243922,1912913384,68282373,367526891,602456836,-399150588,-1977220304,1134693956,1208403456,1239961600,64415748,1776819826,-1948611837,
58517744,1912883944,39118863,2145913458,-402296316,65733587,-1023158296,-1575729527,-1974271884,-478146466,-2114223969,-1995606437,1183388230,-402148336,636158904,1023707942,
58065919,1208221624,-1059027384,170264288,1183387204,1686775314,-1597178366,1183383669,-1612135664,-1974439421,-1977216930,-805436804,-157233280,57934275,638635904,638475402,
-1056619381,503710440,4374279,-1430025558,-1968569936,-1968526652,96905927,-1645738095,61728771,-1209528462,-401968639,91358178,-352110872,-402148347,-389872840,91358022,
-352114968,53143555,54061251,1172840306,1208403458,1709731840,58058755,2145914738,-401968639,91358122,-352125208,50522115,51439811,-58718093,-385649407,857604247,
-992440640,520160310,-972944408,17670,4589254,1193705472,1139335168,-1163874303,-387055114,-1461189757,58583295,7683712,-2145947134,268453646,-1342102040,32946864,
57010414,-385905944,1719731039,-956301798,-402647738,997331839,-1900006626,70698200,-2135744767,1929315304,3532842,1048585586,1929511029,552335363,-1900006626,406242520,
-2118967551,1929307112,1192132618,283643904,-1274711296,39512069,40429763,1978146674,1208403457,-1779953664,44427266,-1343746190,-401968640,91357914,-352178456,36890627,
-1022081400,1912749544,21686307,4720326,40560784,1912765160,8710163,350752370,-1981533695,20714566,548668788,-1023278104,7675530,-1014969346,274606720,1183386483,
306612500,-351254903,340182809,-1977220352,-165281212,-1960440220,-470332644,-1995422071,-960294314,-1275063226,359041025,7612040,18501249,669565696,-1977519616,19140678,
201646272,32946848,1370350,547884658,-860617612,1084753643,-1431042699,-1023306776,-2132258477,1979661312,-339442172,441111,-1460394823,-401705856,1760091808,1274339840,
-2135626123,-1017423367,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,
1344940586,4241438,113694862,-1325465458,-434051552,-1900006496,-1862223656,520092316,1478426708,33012431,9216748,1051331,1075838980,32619010,9282284,-685498188,
-1101655948,-523193491,-347733134,1588342521,-1918836602,-1960393984,-390003388,4366850,-1575729526,1183449155,-1572920302,1183449156,4563475,-1072544118,1720321768,1625587728,
168029376,4629188,605046410,81838081,1988796428,266764305,1201849866,1149904384,66501128,280544238,40302336,-2146548221,-1051721518,-390001438,1490029316,-1023406299,
-1176793570,-256245504,527430401,-1964166461,-2048393138,-20387619,837292146,504066560,531422094,-301862726,-1178343198,-256245504,-1016204543,1317727538,-580982784,1929290216,
714764,-256243854,-492114943,-1185823764,-1947667420,-1173327106,-1460928009,-402098936,-203236040,1509523636,-17176381,1183441970,1720238868,340182549,1948682240,441352448,
-1007091711,9307846,1948682240,1965459968,1961101824,273058321,-2143510748,-855765388,-2126773132,-85457292,300677629,-1341917510,-571937280,-33626096,1827144562,1364640512,
-1174388034,129565169,1122937856,1582955490,508646339,-661733325,-1879000840,520092316,1931411540,180368138,1962970630,857139995,1358784,183772345,1962970630,-593827829,
1967912418,-109005585,9307846,-1017423616,74719400,267111604,91488680,-335653144,1946462214,-116280317,-198919741,855766970,279506112,1642596469,-1258888484,-1161561728,
45089782,1085326318,1085834470,-1579643392,-2132410254,41235516,-443816449,-13369421,-373987651,1102107405,1642366182,270848246,-4595574,610395391,1959016976,-1141448176,
414824041,-1249133312,-351114007,-431836967,-315398524,1711276218,440,-986487296,-1908408135,-1627442238,1724961126,-2131107157,-92204858,-395173888,-2065284176,202138084,
-215719450,1152410086,12551398,29058560,1711276032,-1956192973,-1896576315,-1175047201,-427147264,-741251426,1727302303,-1020041555,1148580065,-2065283664,-1062706716,460652720,
268486529,536936321,1298583922,-2064973189,-2065283408,-1912586056,870645720,-1239171585,-2133680407,-164425757,-607124303,-498727565,854995961,-1877873728,721421497,1979689201,
-389978617,-169720312,1202768011,-695499546,12574348,-1235501824,-1156558615,297383555,-1234715392,-351169815,842019326,1937330989,544040308,1918988098,1631985764,1920298089,
537529701,758198322,1869440333,1159756146,1919906418,858796576,1835355437,544830063,1919181889,544437093,1869771333,808591474,1699556661,2037542765,1920091424,168653423,
925905440,1986939181,1684630625,1835355424,544830063,1718513475,1920296809,1869182049,537725550,1702060354,1685015840,6646901,1685015840,543517813,1293942849,1819632751,
4333669,1685015840,543517813,168624195,1769103696,1126201716,1801676136,2109728,1769103696,1126201716,1801676136,2109984,1061109567,822099775,1378693424,1159744847,
1919906418,874514957,1294807600,1668247151,1836020328,1681989733,1702129761,1631985778,1920298089,537529701,758198325,1886611780,544825708,1885430849,544367988,1818845510,
224752245,808656906,1699425585,1634689657,1159750770,1919906418,544370464,1953719636,2020165152,1701999988,1936607520,1819042164,168649829,825242400,2036681517,1918988130,
1917132900,225603442,808656906,1699425588,1634689657,1864393842,2035490930,1835365491,1768838432,1917132916,225603442,858796810,2036681517,1918988130,1866670180,1869771886,
1919249516,1920091424,168653423,825243168,1936278573,1953785195,1866670181,1869771886,1919249516,1920091424,168653423,842020640,1886339885,1701015410,1919906675,1952793632,
1769235301,1159753327,1919906418,1817190444,1702060389,1701331744,1226861411,1635021678,1952541804,225341289,808525834,793324849,1330782287,1917132877,225603442,909189130,
2035494194,1835365491,1953517344,1936617321,1953451552,1952797472,1968318509,1699946606,695235956,538970637,1226842144,1919251310,1229201524,1330530113,1128879187,1936286752,
1953785195,1852383333,1769096224,1092642166,537529658,758265393,1953724755,1327525221,1869182064,1159754606,1919906418,824183309,1294808118,1919905125,1767055481,1159751034,
1919906418,824183309,1412248374,543518057,1631854630,1310745972,1394635887,168653925,673188365,1431520594,1025525069,826679840,1162551330,168634713,857737741,1395470896,
1702130553,1851072621,1394635881,1920295781,544830569,1801678668,544434464,1801678668,168649829,538976288,1428172064,1668246638,2035490923,1835365491,1768838432,1699946612,
1769108835,1277196660,225141615,1393167626,1920295781,544830569,1801678668,1952661792,543520361,1310749295,1699422319,1634689657,1092641906,1667331188,224683368,959918346,
1766075696,807431027,1920091424,168653423,825833265,1936278573,540090475,1869771333,822742386,758134839,1802725700,1176514592,1970039137,168650098,825767729,1936278573,
540090475,1818845510,224752245,943141130,1766075698,1126198131,1920233071,1701604463,1631985778,1920298089,537529701,758460470,1802725700,1702130789,1769096224,1411409270,
543518841,1869771333,1378364786,1394634357,1886745701,537529641,538976288,1702063689,1142977650,1313292617,1230263119,1768169539,1952803699,1763730804,1917067374,543520361,
168639041,701760472,-1207897932,-1217961984,-1203765218,-735464445,11534576,565659232,-1464004608,-656873030,1894158000,-1070399253,-1280282138,-1070436122,1910898923,-2031730512,
-435179270,-436162428,12123269,-1327984912,-433985793,-2049119,133635979,192220928,-1946164549,-2046325985,-1326936380,-1335761396,-1333467632,-1337203182,-1337203134,843835026,
-1332746560,-1337727404,-1337858542,-1337727434,-1337924096,-1337924096,66238988,-435048210,-1174294396,-1326578760,64535041,62569198,64666348,62962412,-1141981134,1690286724,
-1962823493,2005659159,39291396,-1124068679,-1763067051,96633824,64617089,816841589,-402699538,-2065296720,-373592387,-919347060,-1274914934,-1149518578,-2081317399,-75427901,
-1166886238,-2065296464,855703737,-1325604160,-465312256,-455046592,15680,1773866613,1620406,-373577027,-18150323,-2065296208,1894157232,1910767851,-527825116,1894157232,
1910949002,1894157488,-2065295952,1894157744,1910767851,-527794140,1894158000,1910767851,-990478300,1977649792,-2134081529,-2065295696,-2065295440,1894158000,1910949002,-2065295184,
-373553475,1642395968,1642525476,-1912590152,16825552,-2065294928,-387148824,158481233,1692839344,1933265128,-1209156850,-1124065863,-1024869323,-1174476021,1625554946,327727953,
1493825000,27813092,-287177612,-1880564757,-301537049,-2065294672,-1326573080,-393943525,481347297,-387414810,-434262001,269346948,-2065289808,-1339781400,-393943522,531642989,
786990310,-434065369,397731972,-401893656,-1732430186,-852497988,-71079960,-2065292880,-1341079576,-393943517,581974384,-1427602202,-2049263,773819182,604063626,1967144128,
-423710710,-1127498364,-1328797975,-393943516,-1696056689,-1340116422,-396040496,376584849,1916444904,610329617,-1327461647,1348789969,1480228072,820577139,-423326977,-433737632,
-726865788,-2065291600,-1341753880,-1333467609,62831340,-433540882,-593762172,-2065290832,-1329122840,-1266358742,-1273967345,-468660992,216042081,-2040404372,-1335761184,-1333467605,
1000794126,208929960,-1155530566,448379142,166848512,-47930908,568631782,568785700,-1912586056,302434008,116785152,1963982998,-1777434588,243302400,-98565994,-1339117592,
-77535502,-150995015,536909318,-136181900,9832134,-2121866240,872444478,-1340378094,484986944,1488980533,-2146696587,753436390,-426594251,166127691,1084766187,-2136472459,
-639105163,-352276471,1010770961,1007055360,-352159948,164030469,-397410128,-1325779713,1481369234,41156668,113724134,301990002,162195707,-2065290064,-399297048,432874900,
2133116042,-1084815602,146390860,1605300736,-385649416,-58719947,-167086806,33592838,636027764,268483329,-469056557,-58688647,-2147126102,175486716,9832182,-385649662,
-738787064,1975057536,-1777928664,326369792,9840256,-1775861513,116849920,1946288152,-2142966974,-50325466,9832182,-348883960,-1644396490,116796789,1962999958,-1777928662,
326369792,9840256,-1775861509,116849920,1946222616,-2146374898,-33548250,9832182,553940228,-117434594,956072131,116793205,1946288278,-1777434612,645924864,-335740778,
403603461,243270144,-116916201,503087299,116794997,1962999958,-1777928675,208929280,9834112,-1775861756,99351808,1576576,386826241,-1007090688,1515141,503924597,
116785175,1963196439,1392279612,116798325,1963458583,386332214,276038400,9832182,-166234878,536876806,367726708,9832182,-166824702,536876806,645924724,-343998440,
389951492,1392279552,-1007091340,908729656,1178942034,1574646,-2146536188,67115022,-393936712,365767590,-2134640315,-83879898,-343604808,8240110,-116891416,-1326402365,
-401695741,-239851352,-1578627428,1962884136,8239904,138668112,1946172504,1946237972,1946762256,8239884,-1157198360,719847549,-2134640376,41287676,-58672149,-352160428,
-721649517,-1544879499,1967520896,-1873810685,1975057536,9955587,1966603392,11266307,1968372864,13887747,1967586432,14084355,1946307048,354826791,-2139982848,58020860,
-2147450647,2020871420,1966341248,-385830907,-58720004,-1341819596,15919361,116835320,1962999958,386332186,-260832256,1509110,-385649656,116785310,1963982998,-2147095585,
-33515994,1576576,-1075250680,-2131016406,33573182,1048577908,1963130953,95965193,-855526465,116807696,1963458584,1355020793,109494323,-1065091047,-1796734092,-1662298096,
-96973079,-81099288,-165021975,268473862,116790644,1946288278,386332181,242549760,9840256,-167056387,50337542,1810432885,1474886399,97338666,-154928645,-2147477498,
-1007091084,116835320,1946419223,386332407,-260831232,-1763052880,386332160,-462158848,1509110,-153258744,268473862,116788340,1946288278,-1775861553,243334400,-394264463,
-386268857,-79353338,-1070392371,-1078696469,-315420467,65651705,2028210943,1006403635,-58708356,-2144633276,91510780,1968766080,-164319201,134223622,850408821,1509110,
-1339263740,386332208,594871040,535506608,766559224,1509110,-1340836600,386332195,192218112,116791728,1963130903,46150146,-390057248,-1007087717,259580938,1195164810,
1396442236,113641342,-134217703,751078083,-1685996729,116840238,1963458583,-1685143979,1509110,-163416828,50337542,116798069,1965031447,-1777928682,225772032,192687676,
1967979648,-336547836,-155176446,33592838,645924724,-1325596522,255191264,1139523634,1509110,-338332384,-652416798,-646782838,116798699,1963065494,1949187119,1965767817,
3729418,-256321931,1020193614,-401967827,-931856342,-347410248,2083531968,421956287,-1576348416,-1007091687,9840256,-1682391299,915126251,909836314,-1012072420,1509110,
-167414776,67114758,-1577411389,446890112,1876736,256014,-812645653,-884873021,646589300,-58720183,-2147126780,896927468,-1962891032,-2097126634,-1460926782,-84183807,
1946265836,93005563,-83868023,1227262659,83656704,-327154318,-401967610,-1960443779,4622597,9824451,-644955764,-779290741,-326909554,-1208186104,-1979534588,2046611460,
-1963947501,146342228,2044907776,-791611135,-169680175,16155050,1976303136,1355187166,-713699330,-661731188,-1946521922,6940924,-1070390669,918935694,1397751932,-611530612,
1482408763,-24967819,-1962314752,4843772,-2147220878,-1995914109,-1950154682,853510904,5022207,-796138505,-1618222127,1251999824,854062592,-775748609,-1748892704,1344179139,
-2033044736,-772043814,66048495,1225193211,41222656,-100408623,-1949922365,-1158860065,-1957298048,-1308914704,1957163780,525579,1592816970,-1007042509,-1312412834,-1008151805,
-1912586056,-424628008,-1564462460,-1901985675,32684544,854480304,1430056128,-1313864076,233538790,9113216,15001601,99091314,-424103936,-402209916,359858587,-2065255760,
-1178989125,12189726,58320896,-352210200,-424431573,-1900006524,1053042368,-2135817980,-2147476504,33584446,-1263529358,-1070365466,-1004093298,-1308551106,190593,95929095,
314114739,-854543238,1376875283,-335415366,1971365978,-2130935784,82513780,309661864,-489850904,1976303328,1976565465,17426643,162815211,-177073203,332206516,642927986,
36504971,-1964471808,115458252,-2147366528,-457175836,1490323971,-1977167862,-822214027,-855375432,-2145684717,376703740,1947335808,284983313,-1047917452,289149220,-1040315020,
28958443,-854805504,-402361581,-1007091566,1441304240,1950394420,-424169462,-117395068,-1332708885,876800146,-311115766,857659530,-1899459648,-1060926760,225707240,91557692,
636000688,-20840908,-166677048,-469695003,17081338,17174156,-1014317005,225709860,91557692,32021168,-20382156,98956993,413393921,437160961,5021953,-1593769821,
44236878,1275512577,-1943137792,-956281330,1124194310,-636580813,-2011170047,-1023380210,-2065254992,-155599429,57934274,-1179004741,12189715,34465792,-424234813,-1174881404,
1963049718,3794950,-1178999877,12189717,32630784,3860675,-1174387480,1018888695,-198919936,1954588908,-869341172,1967912674,-343886608,32619018,1946238188,-115297277,
-1901004093,204694504,-1327461880,861923470,568640507,568785700,-1088118300,-1195138586,-155582464,78704131,-873535250,-1007812432,1381061627,1428051798,1086254219,-2116121088,
-1962933278,83656946,-1668676493,-422510468,38027,880071179,91612292,-351984920,1976368683,88795141,-855760149,1843922293,-31855867,-402295348,283837743,91606270,
-351942424,1976368647,100984835,1583292253,-816096934,-1,-1,-1,-1,-1,1793720319,1392513028,-402652741,-1017446398,-397324203,1482227716,
-880032931,11598492,1088701414,1088741514,256014,-812645653,-661928826,11598492,1088701414,1088741514,256014,-812645653,726910086,1358660056,-529376503,-1950103838,
-436162357,-1975458749,-2042567456,-1327985724,-465312256,-455046592,734299712,1358660056,-503025143,65404892,-2015040552,-1947629838,-1176073255,-355270652,-1107295559,652986049,
-2116777072,-1191181342,-792854524,-1877480506,-2010767184,-1434451835,-1177318585,-457310206,-1878791226,-1191385601,-1064390656,653733522,76727853,1075062672,-2054674905,1202356224,
-419435806,1381099910,-490613109,178440,1509955816,254593,-402651975,548405261,1509994728,-402652487,-54329343,653733522,76727853,1075062672,1347506727,1476433128,
-387818919,1085808323,-958886400,-16772602,-162442465,141869254,-2147462936,-202686226,1949353718,2746376,-351211904,777738739,-397211766,1130037341,-1966869022,1390957319,
-498902272,229688310,-1342158616,4450314,16432067,-1157610264,-1679294208,2109457406,3663872,-402620997,-1144783218,719848224,16825088,-1006730776,78768266,115927250,
-389707264,616759297,663749647,-400080876,-1144848383,246677511,-1329393459,-1337727306,-1337792968,-465377787,-436007839,-28776351,-64724508,868442598,12123391,784371376,
641927050,-2147449464,-203274326,856090111,12123391,-1967092048,-2010758393,-1434451835,133489223,102654147,-2065248080,-1912586056,1730578904,1763085312,-422465536,-1191319420,
-1427569804,-422400000,-391008124,-527814500,-1779912528,-1143852240,-201916352,280230026,-402613784,-1918780129,8389888,1086050867,-1963723008,-1944155400,8448000,-1329750552,
-1199249709,-661782488,-795950962,1723867151,-475,-1071509633,13147626,17772272,-1331605218,-1199249708,-661782464,6887054,6760075,-1579433496,-768409581,-150978373,
15859,602604405,77200,12253322,16744464,-1030875788,-1178586266,-13418496,-1410111748,-964636674,132573968,-1161600737,1773862912,1751478,-184661272,1464947536,
414713374,-942109184,18950,16744448,512236404,1220018252,1723895296,12173363,-50384064,-22285466,-339476785,1595869152,-1017619623,-2013213464,167788838,-2130348828,
71246,4623043,4269706,91546634,18239105,-956644608,-16760826,1317671088,216060422,105253388,4138634,168092864,66239172,-1595897106,-390070133,66566662,
82624750,603996064,1959016975,1059457072,-1191642368,365793533,2108695410,-1977218895,2122320476,141820673,83984000,95486581,41146682,-470361722,2078857355,1371798524,
-1190923078,-773324612,-2136412985,-152959371,82542768,-322452504,1497409602,-1594062141,1177157701,652267525,-1979423498,4628696,638010922,33842422,1191576259,71707136,
-1161566326,1067451378,1947149312,-1461137390,-1342016508,1059490307,-771444480,214174436,1978199560,1042710727,67895296,-198919698,4065014,-401967744,-186464416,-335970124,
1042710541,652771072,630188069,-1195121614,1727463440,38142732,-100609408,82185446,82232454,-661928826,-2115583350,99008907,99009670,-1006910330,-1073250678,2114585319,
127789062,-402293110,-3995753,-1,-1,1358954495,-1595531088,196092134,-1976678424,-401821472,-1004392896,57950376,-1476391192,-402426848,-816316414,1481297232,
508757699,4241488,116840590,1946222752,-1674673877,1929629696,-1641118941,477298944,196104280,-390077312,645934597,-1577189216,-1064435558,9969291,-2146467802,123412312,
-534425405,-1031563776,-293556221,-1325143421,787403524,-869366645,1120176878,1480737518,1257119524,-289394102,96633674,1122011884,1381024748,-2098723920,-1223855104,-758913008,
-1219885452,-759437280,-461088422,-2091774603,-1964243518,1522633440,-1979520018,28361665,1946179816,7454277,1249846400,1522074039,1350611968,1139146928,-997834524,-997834524,
-329713525,695584644,510993540,-436162480,-2042567613,-2042567484,-131377212,1562443649,-546154401,-872493598,-863976331,-339725696,-2082436599,-2132015638,-2084364572,1122895042,
-383731902,134271549,1010313240,-590285567,-452272944,-472849456,-617422070,-960562298,787678155,-58055670,-1341930877,-360452480,-1947389437,786878961,-869366645,1122010862,
-1975368978,1246424775,1257160754,-1006691608,426967612,168084099,-335120960,-351517048,535003142,-2081504374,-51903254,68666366,25166592,6291648,1572912,393228,
131075,22391296,268960770,-8372192,-426725376,964996,-489929538,773450498,-1327461716,747104399,2112393136,1960852012,-426594070,11135364,-2065264208,-426528573,
-435900284,-422517240,-1176836595,1153302542,-385621300,-1406271335,12245387,571648,-498929938,12630779,-301987655,-498973970,-427301126,-427694461,-427039102,-1970608503,
981984480,-346393148,981722112,-346917436,981591040,-347441724,981656576,-347966012,982246400,-348490300,982115328,-349014588,982180864,-349538876,-426463232,47748,
-335542087,-1002814740,-136177803,-1191132998,-320077816,-1002814910,-152959115,1894370187,47871,-1179227717,417857562,-1325470726,-427497835,-1327831539,-435624448,-431968048,
-431902709,-431837173,-431771637,-423579637,-431902506,-431836970,-431771434,-426331946,-90389628,-2115466576,1954588715,-1326060798,729213056,-2102333302,-1976864792,-393957176,
-393598104,-389641571,993788103,-997825161,-1047859061,1006680808,-1973913797,-389707048,389808303,-125153929,-919354485,-1185821562,-503897565,-1185785709,-503906244,-148757575,
1507328993,-963915501,-997537654,-453602636,-939269679,-888946637,-779628525,319275651,-773205560,-773205542,-773205542,-855526182,-1341199590,720562318,-527825908,-286749008,
1085802026,869830144,650153664,2109067,537315110,-2133967360,-33527002,-31186460,1018896870,-133109760,7014134,-385649407,-1993933073,-2147475410,-33527002,1344193287,
-1912586056,1796112600,548405504,525869286,-1059026225,254018796,-1195177259,-661782464,1056395,-576986149,-1610608578,-1073086448,-880799371,-390877182,269232752,-1280253814,
-399872792,-1008201399,1963239645,46396935,199958645,1963115510,-35422202,-2138038037,-1168900637,750452736,4045240,1543018216,-1578890005,-1578705116,-81518108,512303590,
-1966931952,1006658110,1012954119,1011250184,1012888586,-1186237427,179568641,-1263183896,-1252857853,372949758,477429834,-956378574,1964637824,-1261502957,-1254430718,904399028,
-58043467,1526743272,703070900,1227262645,23496704,-402410301,-771050212,-889262220,62187243,850726888,-1143084078,-1427635724,62178296,-2135621656,74717438,-924072194,
-236451660,1375505076,1228832850,158598912,4800128,-1224575485,100775936,414632243,4855434,-1261508534,482564442,926231069,-469088712,91816820,367641593,972849153,
-594872449,-1976631502,-157606009,134223622,116844661,1963196439,-159439850,50337542,-1343683724,386332160,1668562944,-2147444247,91557884,-342622024,905740406,116789621,
1946288278,-1775861750,12123392,174123925,-2141226816,1584661500,1947139200,486309981,-58696588,-166038217,268473862,116803188,1963065494,-1778337787,645936619,-335740778,
2116041779,2086747146,2105228341,-165731279,33592838,-1940907660,-1077834039,129617771,-222000640,125130926,9840256,-387926787,-1007091489,-1070435660,2142295531,-1430334997,
-893065061,-353646222,-1015258820,-1082164676,-1142218708,1949826176,905740502,116788853,1946288278,-1775861753,-1007944448,1947204736,772505353,-1688631414,-1070426645,1774096875,
-897259365,116820338,1967128599,-383767422,2133131133,1966472320,-1777928687,175374848,9840256,-341527299,-58683317,-166628068,33592838,645925492,-1258487658,-1875514458,
1963981952,-341462011,-1974431701,-1899393852,899521,79690896,1487860433,540811892,-58715020,-2146272254,259788540,159146300,92240444,417906738,-2134640384,-185895228,
-219418448,454692353,690497308,892613419,915143223,76087324,909854278,74776706,8402571,1717819,914952564,-386203620,1346705882,-846134600,-71084011,8239952,
1492556008,-1979599677,1317077062,-1023409898,3795026,-1017495384,48992432,-1981280080,-397229273,1451950070,1976699398,82362371,-1073082588,71042932,-336067721,-1017448191,
-1967125016,281343527,-342970173,-401690622,-1950144680,-167768042,309592514,1958797952,1090158601,45222005,28444651,11666411,-58014727,168191626,-1073515292,101188832,
-410386289,-1963160893,-469105050,-524287116,550565380,-1979674874,-1070349337,-1979674720,-469105050,-390069388,992516,1381191875,-390019958,66566662,9150702,-1071327094,
-167450432,41157059,-461373172,-1998583104,1509985062,-389851045,-76220507,-322995224,-140777277,1911094133,-288912705,478881475,-320275578,-386169089,1355022311,-1222877720,
-2234294,-1073250678,2114585319,-3020794,1964847848,506129,-402636097,92864441,-386342329,646447110,-1017642943,-1476377952,-1473809216,-1274776568,-1977488512,-167754970,
74723524,351005904,1946404086,-339411452,-2134575605,78905972,11797227,4242371,-1866736754,-2144367872,58037055,-1979660311,-1061149689,-1073084696,-922857100,95626357,
11806645,1957958605,-1207901208,28378121,332255795,-2065104014,83656704,-1073085323,11828085,-1749806131,-2147433496,163064005,855748868,1930677714,83656774,-1073085323,
-872530571,-310346892,-1279792343,-1259523579,-1273770752,9889815,-1325137480,-841862384,-1273203949,-1273770752,8579093,-1325137480,-841862385,-31034605,-28937013,-1143936059,
1065353360,-1274317673,7792644,-341754694,884248665,-1174377496,1324065071,-402475888,-1866792864,1950318592,364512884,-1875121247,-341768006,28610613,-1174386712,720085243,
-1875998320,-37165056,-806870155,-1058003715,-922876696,1956707258,-1161232879,175415560,582666494,-1174178655,-2081906372,-1152138496,657981584,663226996,-2130824472,100699918,
-1947679909,-395807235,-390005358,1960851972,888963152,54265973,71059316,867189620,203753448,184296452,-1327461692,620750899,-1459774744,-1976011488,550273248,-286781776,
536918564,-1178981445,954728537,114163,-1263466264,-1273967345,-1341076224,-343611715,-1976324082,616753376,-997786844,-1021001496,868387664,-1077768494,-1934950280,-1017599032,
252059232,-1331163232,-1199249824,-661775360,-1912586053,378283715,-1993998231,-956274906,25606,-429805568,-1395529596,243337588,1048676,-402431511,1655747207,113738982,
8388742,8914631,-152567808,1048651435,305397874,2090930037,8823552,-1560248671,-18284408,1465318401,-611580386,817611662,-1092907520,-1816165529,768256,520594931,
1672502879,2028504294,-1341688915,-343611804,1048678415,8388726,243340915,8388708,8134283,7741065,8265355,7872137,-391081240,-1072975629,-286719116,1981713153,
-2132049664,2048821504,2082376448,-2132049664,-2145482496,9478144,-1275031646,-1845049854,-102235904,-1977709822,-2134671104,-2044819200,1958742784,1678672146,-2013265664,-1996462546,
-2013239530,-1342150386,-1954224539,-1996457954,-1962903010,-1996456418,-1962901474,-2130672082,-1610579771,-1885208431,-971983872,16814598,-1962759192,-1996453346,184584222,-2129496896,
33580046,1848543232,1863747840,1896777728,8954112,-1157365755,506150784,-1019543411,780876147,771948680,-981401466,-1918828416,8561408,9373382,-1943631105,-1845049856,
-773324544,1958742786,1678672146,-2013265408,-1996460498,-2013237482,100692238,-1912586056,8437184,401130891,-2135095381,-1845049856,-22019840,1709703348,174339,243339892,
4456548,6958728,7018121,7147144,-1157593439,-470350848,-1036385616,-494263948,9569990,53929985,1946157737,1678672146,-2013264896,-1996461522,-2013238506,-1593807602,
-1073020792,338036,-1327237372,-958232048,16814598,-1459419160,309592066,6557313,780664840,378077298,243794035,-2002714507,67110144,725582011,989891870,-1608223805,
-21757812,9569990,47376385,1946157737,1678672146,-2013263872,-1996459474,-2013236458,-1342147314,-1954224538,637568542,1253001,8920715,-477450064,-1339935512,-387478863,
11608621,6555383,41156736,-1628962383,-429412181,-2042723964,1912766464,-390877170,-2146688504,-1280253814,-1272838936,1678178050,1962934016,-1341934590,569632911,-2065274704,
548430052,635987174,-1469783019,-453348351,-2132768160,1622148300,-397384474,-1973938928,-396302652,-22014712,-336304922,-429281027,48004,-1332737813,-1148918166,1085800449,
-1898410496,-1962907370,1392535334,1542469608,58055435,-1342138135,-1199249813,-661775360,6555383,376700929,854596584,1712229101,-1963881728,-1962907378,-402626794,116894474,
262244,-35121548,-1964166417,-1962907122,1829669617,1796639488,-1425938432,6555383,376700930,854581224,1846446829,-1963881728,-1962905330,-402624746,116894414,524388,
-1041754508,-1964166417,-1962905074,1963887345,1930857216,-1429870592,6555383,259260432,-1158700056,1773862912,1751478,-135309592,-16751610,-401050369,116912012,4194404,
636027764,-1469979393,-1341885248,-393943436,1823475408,-1458600730,520593679,-1974221983,-429018920,-1966896508,-428953384,-1950119292,956334110,1979742750,1678672166,-1962901504,
-1996457442,-402619874,512426060,507052164,74645632,8396427,9051785,1955606763,1678672152,-1996455936,-402619874,512426024,512295044,384499850,1873825936,-1990687514,
-402619874,512426000,512295044,200802442,-117345088,1465107291,-428822522,1277593732,851741184,-1141339164,1048576000,1962999954,4241418,-980696946,-2086124056,33342,
12061813,-2079930624,-385875968,1907359878,1220052198,1405128192,-1605019818,104333455,91684940,-338406936,-1271339005,1532911453,780798579,28835916,-1873417472,-62864509,
-1974251177,-1191162850,-13434872,-607010765,-1426063331,512423650,12058700,46396928,28836724,1499179777,-1841397665,208994560,-1912586056,63278016,-1480267581,8527417,
12060279,-1878398208,4982400,-8460031,8658569,-428625840,1594316932,1460061019,1924157523,-1571257114,-1152384948,-1014103992,-1979709255,872362968,500945344,1974403072,
653582907,1642333578,108314792,-13385678,642201579,1642333579,125092008,29343794,-2144933120,16814654,1085804405,-1950315008,4195781,1206446219,686512295,841371471,
1191605509,-1977273818,96872132,-1966568960,-1342157778,1485104764,-2069641845,-1193833728,300613634,-533020418,2062091126,16727551,12122228,123689728,296347843,-399316742,
-1207011845,-839348222,636025365,1955658728,-2110374920,-1962642176,-1996455882,-83879370,293726403,-401938182,396411899,-58670336,1025733632,91611149,-350483016,-533775079,
800589173,-2146440395,259491068,192213052,41279548,-4325200,855829503,-1007254026,1946221696,1978678278,-1023365118,404654675,616794624,82018419,168158144,-1775859005,
216301568,396419082,1019435776,-2141489915,1450640383,1998584704,-2115481263,-2131004143,-285173978,-1341028376,-1184831757,116850687,1963982999,-386407925,-189787788,619405542,
9905792,291956975,-524236918,-423425531,-18080,9897718,-502696688,290384119,1625748656,9905792,-87860801,1848971,1178995849,8533563,915080309,909836416,
158597146,1848969,-336019406,-117329917,1011926011,1012888584,-2073594871,-468290112,213853318,784344192,67082,-1976662298,-352321242,1976106606,612819990,612371647,
101330624,-2031747072,2525742,-27989248,-468945464,209659014,-1266227648,-29037824,-464554552,-1476348794,-1979354048,1071939808,-2031730636,-2031866389,-1072922844,11831014,
-108846613,-2094304767,645346041,721433272,-1975500607,612820192,612371647,-423359808,-1342116986,1273428626,1946221696,-423327228,-1017578678,1084786404,-2136471435,146015349,
1084763627,11805045,976109348,1946157318,771863582,1594,-466479756,721433273,-1270791736,-1274483959,1971365896,-1979534334,-1008454972,-1273564440,-1274514177,1948297216,
-1979599870,-1008454972,1612580603,58065468,-2097083671,-326420244,-1064382324,-41166706,951697459,-1951730944,276598261,-16398554,1170614015,-970555385,637535813,-1845148218,
38127398,-970588160,-1916795835,-953804676,654311173,476614,105236006,1170613760,-796093947,-150990661,-2134572061,805634258,13795328,38111526,72714278,-722937037,
-385649920,2089615508,92939824,1077723172,1187383156,-2115436474,178944,1912649448,1179028089,1567932426,-1961853811,410291678,-1962905368,-2048013,775785262,251659767,
640711821,108279295,-16398810,-970586901,-617350139,-1929351192,-1893322628,1959329285,629155346,179135,1912626152,1179043373,640150274,-1153430144,1239941122,-971279872,
-352238010,813468949,-2145547738,108282083,21382854,1187382507,-998047162,119497016,-54271308,1979659775,74841858,-1190758913,-1510801404,-2096566653,1150224623,71601926,
-1895676785,2089665284,1569269272,112898,365791156,276598211,15855595,136384800,18940961,295763745,44134561,-6225503,-1163740510,-684206291,-558571842,-474684492,
58292,253607,253952,11585536,11568358,45385190,-256312674,-268365825,1894167472,1910767851,141889704,616570895,-1071509521,-1912586056,-1469782824,-1906150140,
-436096790,-425021308,-18076,27813092,-119405195,-1332724245,-461052414,-435965856,-435900284,-536823676,-617359218,1437220737,331155573,788475614,95477126,12092646,
869830344,-1438678565,-1123519147,-13705709,-1327658450,-1199249914,-661782464,-352321352,-435703794,-426790780,-352261264,-1955470336,-426790696,-352261264,-436162560,167477361,
-135724171,-435638075,184254596,1475019637,-423611760,-268388111,-768354162,-1176675650,-1968439285,-487674672,10533625,-1342175047,183299595,-1341819712,-203231712,1948318339,
2144773,11593451,-1595531034,-2065299024,1980496768,838906626,786682111,-579815541,-1912586056,-1327038504,-1199249910,-661782464,6762239,-2065298512,551952560,212920811,
1642366182,1642525476,1894125232,-84076083,-352979207,-690297367,-1515607339,1452709274,-1084883371,-323158016,-1445598754,-2134842496,930431227,-1124073025,-991305987,-930347351,
-826294130,1358302,-1359821942,451609205,-1157627718,599373504,-399906816,-907538768,-1272968167,-387938802,1560746437,21415619,113410816,116032492,1853162664,1853096616,
16860870,1122898096,1256229612,1122898352,103500524,87883854,855800848,-1962986816,771770654,-540571862,2030099584,-1967115518,-2147464690,930219259,1946680192,-165105358,
-792163599,-1997942551,1720189774,-1998532606,61932870,-466427770,1183441107,1228832774,108332544,-788371760,-1031600538,-154931705,54954225,-1325242744,-740521469,106858979,
1183375570,65268485,50660611,1610875651,113769116,-537657241,6885004,9971337,10098316,-1206417176,48761487,-419516391,-34868124,10098318,9971339,-3972707,
1430346987,1380927572,1094918227,1194539330,859390540,961763154,1128940595,1347302201,692267074,2037411651,1751607666,1329799284,1363234893,1836008224,1702131056,1866670194,
1919905906,1869182049,959520878,942420536,876096563,741685292,-382978504,837474914,686817422,692273960,1866679081,2037411951,1769108089,1751607145,544502888,1329808160,
1347243343,1363231056,1126178897,1836019523,1970303085,1702130805,544371301,1866679072,1886548591,1919905648,1952538994,1869179252,544108143,959525152,842545209,942418994,
741552952,876099628,942418996,741684536,909654060,942418998,758593336,1816215853,543976556,1769108000,1751607145,1937011816,1914708083,1936024946,1919247731,1702262386,
778331237,-435310546,-434982780,-1172131765,-1276247992,1894400,1273369264,-2065297744,1273402032,1253712560,-2135691776,-1342175768,-1018435950,-1979645767,-330570045,1038934154,
410320930,-1833897502,313543654,1773882342,1620406,-371107139,-18094435,-61,-1,-1,1358954495,1084776932,-816315787,-2048523856,-2065296976,-427773700,
-419450768,-392042975,1642332420,-527702990,-337537347,-24407983,41077899,-930298370,-1064380274,-1912590152,16825552,-390651714,-310116144,817760372,13035703,-91805717,
-754973511,178666,-1962892568,65176023,309504,-1342138648,-854674400,-1177406704,-1998061566,-175377408,-13369421,-371068227,-292837759,-661733325,126606131,1642334089,
1642465292,-4983413,280887091,-1503401502,1642393227,1642526500,1084776932,-523404,4241637,1049352334,-406780909,47878,-1908408135,-1376557349,1084776932,-1014952843,
-549777408,-1070339466,-208935425,-13380213,-371042627,-359946645,856679296,-804998702,1107653595,-768345630,283508729,653758976,76735083,1983462448,-1274608638,-502215410,
179094508,-1274645312,-351220466,-504839179,237466895,-1900006625,4243392,-1418648415,-1418647903,-1593803585,-1582599896,-1079283414,748749068,782347121,129739633,243712,
-356314931,-268377749,1381061627,1086004822,-2116317696,-1962933278,2023525106,-1947807488,184551572,1350005970,192210052,1232391422,1534381310,-295179432,-352261310,-131798016,
-1202706312,-839347970,292706325,-386652999,619490952,-502040328,1976303350,-352261137,-131798016,17564792,-331207189,17570852,15401195,-350477074,-1337834993,-301929720,
-402651717,67953394,15401195,1112165102,15401195,888677612,1492683336,1579149194,-816096934,-1902920877,-1152187157,-947253741,-1474988056,839152704,-1979192384,359327939,
-1017445720,254797824,-2079930834,216563811,-2144419057,-2140961730,12195957,-1181893888,-402640711,-1205935201,-661782464,1181382,-1010622720,-822083400,3204020,34304,
16416864,2139166837,1966092551,-1670649839,175462460,-1175451208,382533672,-2031874325,141918376,74793128,1273402032,-15519,-1,-1,-1,-1,
67187455,8388608,0,285290752,67266304,8388608,0,285376000,100820736,8388608,0,285370112,134479872,33554432,0,285474560,
100903936,33554432,0,285453056,84064512,8388608,0,285390848,134336000,16777216,0,285343488,84122880,8388608,0,285449216,
251888640,-65536,2048,285442816,84136960,-65536,0,285463552,117677312,8388608,0,285449216,151231744,8388608,2048,285449216,
134374400,16777216,0,285369088,67359744,8388608,0,285463552,0,0,0,0,67265536,0,0,285369344,
84136960,8388608,0,285463552,84133376,8388608,0,285459968,184742400,-65536,2048,285405440,84073728,16777216,0,285400064,
117628160,16777216,0,285400064,67243008,-65536,0,671222784,134454272,-65536,7,285449216,235128320,-65536,2055,285459968,
268682752,-65536,2055,285459968,235142912,-65536,2055,285474560,100876288,-65536,7,553861120,251971072,-65536,2055,570738176,
117757952,-65536,7,570742784,67266304,8388608,0,419587840,134375168,8388608,0,419587840,151226624,8388608,2055,419662080,
134430720,-65536,7,553861120,117687808,-65536,7,570672640,134465024,-65536,7,570672640,151242240,-65536,2055,570672640,
84133376,-65536,7,570672640,268591872,-65536,2055,1057121024,184811264,-65536,2055,553910016,251920128,-65536,2055,570687232,
252075520,-65536,2055,872832512,268697344,-65536,2055,1057226496,67314944,-65536,0,436413696,33760512,-65536,0,436413696,
134409216,-65536,7,553839616,100854784,-65536,7,553839616,84133376,8388608,0,419677696,200015616,-67106672,7340033,-2097152000,
-50657596,-2065297488,-2048524112,-386938950,-628167394,-2078897618,-424038301,244100,-855591855,2080422675,-1207959111,332202497,1916629849,-249,-562763265,-1146035486,
-92240666,-1339591552,295626766,511000744,1086053004,-1965322752,-1912572626,1961691866,1963501581,-423972855,8436356,416132075,1971372790,102653986,132850408,-2065407713,
-1787511492,163121035,-201618688,-1105300049,887657309,-1325470976,-387937741,-81522356,1256768646,-21004015,1974097153,-66000703,-2065253200,8126698,113541888,-1827356933,
-1275066648,-854143744,-1406206951,91497532,-337641240,-208944139,1711284665,1967826419,-1946973195,-1510775096,-208935425,1711284665,209037299,-1946978998,1724419059,125085683,
-2096828541,-457490,-27,-1,-1,-1,-1,-1,-1,-1,-1,-50593793,-1957341666,4243180,-461054322,-1192752267,
-236263183,-1276512140,1976368640,172917033,1719730752,-385876470,58061255,-402612759,91615692,-336489752,174490094,1317142463,-385875702,-855768954,-1377303179,-25302031,
-402295348,1961619973,41274622,-855740693,1458046325,-2140804110,141888508,-386835736,1491857854,1963785344,172917022,1719730752,-385876470,1148514667,-2114869784,-4257178,
17452673,-2143950080,91557372,-336486936,-335773653,971507061,-2145260558,91614460,-336408088,-302219241,132646261,-2146571277,91615228,-336391704,233603075,-820027811,
1085820958,-1193767424,-1595474165,-1065049884,-527823756,-1005936156,-1595498010,196089579,551821542,208978052,78176394,568591989,568771594,1962933376,-434065404,1797687328,
-820029440,7911761,-402393926,-1460885428,-502893184,149682678,-1472272240,1084769004,-15527,1926647016,-728438766,-1461187214,-402099497,57858050,-1008338968,-1342001176,
-396040531,-54328664,-1157226912,-611450816,9832182,-467962752,1974156384,-1777434614,645939200,-1333854058,-81730016,-369098819,116785453,1950351510,1012982849,-2132249279,
-1090480602,9834112,386826256,-1336926208,253159438,242565288,233319600,1967171599,388399109,-1336353024,-81730016,-2147371288,-553609690,-369098819,398393573,-8591360,
1625610378,-850414343,48405,548407410,-369418010,-527826743,1967537232,403109397,242550784,1943450344,548469257,-369418010,548405410,-2131025690,125165820,9834112,
-2145654014,125166076,9834112,-2146440447,175439612,1979382912,-1760657399,-346550272,-1310158722,403109376,1702103040,-58133,-1,-1,-1,-1,
1913047039,-384683008,-58657327,-2147126188,125162748,1509110,-2143914744,477382396,1967520896,-1777928697,678756608,1926451688,1392279587,-461103500,250288760,1509110,
-166824696,67114758,645924724,-336134120,-24057853,354846808,1042432,-2063546648,1629423597,-386268043,1355743266,9840256,-1777928451,309592320,-2139102080,91506172,
1948122240,-1775861755,-1017577984,18802768,1692839600,379634520,-685709312,-58714252,-33262258,-2146964544,158681852,679004414,-352315742,354826787,-2143128576,91499260,
1966537856,-1777928697,829751808,1964899456,-1777928697,628424960,561570948,504027955,427032598,1348592720,1642527780,201330664,-396237310,1967849480,1642485999,1397801816,
1139146928,-662028060,-125157148,1139146928,-527810332,-528072476,-2116539565,1526799867,1482418806,396382403,82362368,646580004,-461373289,1959016967,-1759084532,101251072,
48758935,1354979328,5433425,645942645,-386989929,-307232680,-4628250,-1761151233,192221184,1172895714,-420171776,-2144867488,-285173978,-1610598424,-390070249,-2147015676,
-134179034,9897480,-4628250,-1761151233,41226240,645986274,1505689751,-95370408,201365408,-1761180096,-79648768,-1185823912,1709704418,-1469782875,1509416962,889192387,
-1060551223,-1058225940,-1494359572,1223468780,2089903007,948965519,508951456,1381390086,-1957670063,-1900006420,2016855256,4241408,113694862,-2113994688,16651878,-1979627894,
-58718618,1008431874,1008432920,1007056392,739471893,853051916,786682367,-331376641,20711403,-1662455946,1552557796,1075742722,374243584,1532690944,1600019033,-815980793,
1973608936,-1550194673,602409586,-2130349056,71246,-435769149,180367882,-1190300444,28442628,-499457328,58063584,-1008931096,33652352,1183524981,1096460,1174660087,
13796098,1930427008,8292881,-617414910,-763116797,268075008,1187382386,1048577025,1946157121,1094615054,125044992,182244584,858289636,4623040,55347750,-754941766,
1222834146,115918987,1942160349,21400081,175441064,1317079476,-352321258,1005097082,846492929,22973183,-1959861295,-420490873,-352145397,-1978997248,-458888964,-1965229592,
-1662515330,75401956,-2082171160,-1662516282,-2142877980,1963262334,-460199931,-1952441621,605796096,-1224182592,1967171619,-399853822,2089477231,-462821375,-402264445,393544135,
-1090517063,-152567742,-386173733,-1997757492,-220051707,-1998285336,-402636506,-469041417,1448156867,1096188,-661733325,1449045235,-1207955271,-661778432,1499376883,-1583028193,
-1947703691,-165180765,225775812,1971846272,65830915,-2011970432,-472782809,199641776,-385876039,78699561,1727456306,1942160128,-351685628,6613038,45100661,1303841510,
-1964777752,-406845570,108923394,-2082221336,-655883322,80118755,-2082221336,1525155822,-2129758977,71246,4269704,184444648,-504839196,6601178,1960527080,-1258692090,
-401020032,129016596,108956398,-387738904,125108467,-1476339480,-1014975296,1317667248,-2065640954,1962950150,1040582683,-1562318848,280518,1962916840,1013982219,-394300048,
2054553520,-388329496,663397062,-167426422,41164996,1334501584,988033540,-2007010111,-1152187321,1340604420,-1208329257,-483268593,-1073250678,2114585319,-484055034,-1969057304,
484967551,2095643619,859010304,1552557787,21400073,74711868,343213372,-1572607917,-2146127781,41222908,-667283536,-1014627725,57989899,-388562456,-1062731723,717439156,
707406378,707406378,707406378,707406378,707406378,1344940586,4241438,243325070,-1333788610,-1205803488,365793537,-1211148257,-491919352,-352320839,4366851,-488466200,
4366584,28899523,1930808720,1040643595,460619776,485221426,-1191181125,-1070383863,4065014,-401771136,-186474000,-387156661,-2135631279,4073088,-1008465281,707406378,
707406378,-550884822,251798786,-162201829,-202831857,1256605426,-1209646395,-498997245,-1008579864,-1912600392,48856,-956431162,80150020,-33241346,-1912588104,536918488,
-211356109,4765869,862371982,-1174457408,-211410944,-1704021,-1,-1,-1,352092415,-58718350,-1271695937,-326370284,-1912586050,269912798,820150272,
-2135424834,58011898,-1951399746,-1912577258,-1950054714,-2117826832,-788463642,-1795215642,-1947625530,503774119,1398167381,-347057583,-812953676,6601041,1962461672,1509548550,
-402002951,-290676460,-118889895,-61,-1,-1,-1,-1,-1,170731576,471402015,117835522,0,173690993,471402015,117835522,
0,170731576,1885603455,117833986,0,257052769,421070361,202050818,0,170731576,471402015,117835522,0,173690993,421070361,202050818,
0,170731576,1885603455,117833986,0,257052769,421070361,202050818,0,0,0,0,1342578261,1448235347,-421482409,12319876,
-536823808,1438177422,408490,856651008,-386518071,108331276,-338064567,-491745202,12092646,-1193767232,104573525,997523456,1962999784,-1964166602,-1056964082,-4716063,
1960328191,1002646310,-2095025471,-478081085,-4653072,1002646527,-1106218303,-1041760256,-787974912,10676457,-402648088,1961361673,15329280,1499094623,520575067,-400637091,
12058869,-1933537792,-1076326712,-1960443840,1898226437,637716355,648217995,82559345,-536820863,-1088583386,-1960443780,1898488581,637716355,715326859,495527537,637603007,
748881291,46629745,-1559917786,-1993969362,-421285859,-315482236,134794,-1056316991,-654113565,16483267,-2125783180,-2129657917,-1041235741,280497387,-1178391808,-1047597056,
654303423,-2010759797,1793639173,-1191824640,-1064378368,-315425909,134794,-217521727,1364247461,-1395510446,-69021694,1499124356,102679384,-1185851562,-1047609344,-1977160398,
-1056964082,-377288223,-1929802986,-1093038391,62513198,1504178944,520576607,-55356477,106254438,-13370724,-369971523,127768005,1532520029,1405346866,-454295885,-335563949,
2484447,276103092,28576804,141823036,78119604,11797109,-466434934,-386248509,-1548682932,1492870374,1105787587,-424824583,-1469782940,-469470207,-386471072,-1515128528,
703096038,280580601,-1469783001,1509613825,1625555572,367565904,-424759047,65539684,-1878856960,-1006937905,-2065269328,788521150,-1976683381,-1071382204,57950268,-402540567,
11579550,778469606,1461059855,-1071640824,251658509,1542111266,-1207949069,-661782520,1734,-2138773762,1073742350,-1431651482,2025695914,110029299,-1150912910,-613585482,
-369916227,1752303232,1431681894,-1799531179,108194291,-21276046,3193080,1220073614,-1195340288,2092564484,-1107348736,636089265,8174324,-369902915,-1061293028,-64689677,
-1912590152,3717336,79216782,8174080,-658637005,-200087053,2092570226,-203178752,1928595433,-2097446645,-1156811527,-1444152958,-2132409936,-1207914775,-661782480,-1912584008,
309440,-1158086981,12517500,-200032896,-1158429719,482148476,-205854220,-1912588104,309440,-1090487110,817725440,-205854220,2092613234,-197411584,1928572905,-1193571149,
-661782464,-164380530,1713373369,-611406349,-1157626696,2092628354,48896,-369859907,2092626804,-194265856,-1192006679,-645136376,12507278,40140800,-33241409,-956431162,
80150020,-1193701634,2092564484,-1107348736,1441395861,-1173654797,-1598226308,-213194252,1273561971,571647,12507278,40140800,-66795841,-956562234,80149508,1015080188,
-2147191552,-1203764660,-1064435696,537909390,-31103296,260046847,-538263518,787480820,1562247439,1015079944,856388608,1292754,-390681157,2145964623,-427904849,-423611772,
1713292160,-1201214157,1,-1178258586,-13418496,-791583074,-102585498,202138084,-215719450,-1150918170,1,1725772646,520537483,-192219597,-1975516999,-781803802,
-192241709,862367078,1978720707,-1469979628,12084800,1962934272,2051892744,-1070391383,313027,207742032,610395660,1482811123,1975520102,-1842026471,-461315962,-1309265137,
1943851012,-102611451,-1070401997,-293400085,309508,125173672,149471590,-1963597242,534154184,854115321,92939776,-954017802,1183377618,585679616,-1021143040,-53419822,
807799673,1227262469,23496704,1025648323,-1968519414,-2013247194,868417894,39226367,57928401,-786431809,-773664286,65196514,-773664262,-1208351774,1228833022,74647040,
-405745199,-738795638,-355348085,-355341615,-511651338,63427079,-1951349766,535332070,1008431617,-1173326587,-2051342336,3127735,-388948248,1019412637,-402230272,2078998677,
-427380592,-419450748,702816,1929458920,-335945211,1625591921,-176817604,-2065266768,-402640199,443744541,1085864418,-2133291520,-285174234,1961684456,-1777434618,-339537920,
-2001694651,1625588966,57977404,-1332728341,-1333467511,-396040530,527565013,1912661224,-427118571,1348527236,1692839344,1476444392,-338623000,-1917808634,-1161591578,-1262813184,
1423799,12192235,-1211516160,-402643783,-1329344397,-396040530,242417813,-1157627718,532264941,-799152128,-1329332501,-393943424,779223165,1692839344,1912632552,6416421,
-2065268304,1692838576,-402627399,74645621,183237090,-2065268048,1430020324,-2085612940,12223718,-1209156864,-402645063,-18100201,-2065267536,1692819632,-1342163736,-1017059747,
1912614120,1697818,1692838832,1912611048,3139598,-1934620302,1625588966,-117314568,-825497405,27813092,1625556084,1371796459,-469736263,1946331236,-1293397752,-203269682,
1371757049,-469736263,1963042916,-1628942072,-203269682,247683577,-1599013857,-222657306,-301944829,-2065260112,-402627397,212913802,-425545490,6601604,-1093763608,79689974,
-122820608,481318002,-301731142,-2065259600,-1662456525,-1153207560,1541931508,-124655410,1689860210,-245569536,-102682510,-1444402060,-1062671207,-336854155,32866611,1008038912,
-401509008,309522750,-325480472,-1074202178,-1091895293,-2065259088,-1531968277,213615846,2144696,-402652998,82562843,-2065258832,-1088151068,11543014,-723070234,-61,
-1205928961,-661782464,520098721,-1506613041,707406543,707406378,2147254314,-58700682,-2145946432,1114870524,-2114417833,-1048641305,-13760529,-336034667,-1084780537,-336883200,
182879,-121308990,-1587939130,-121069095,-1563188594,-1532189539,-121702210,-121702210,-121702210,-120784694,-58677880,-117148337,-83885366,-889616716,855310338,1600111588,
-152311573,-219417365,-286527253,-466460833,843418319,37551652,1435176565,79856460,-2142341760,-296860278,1894171641,-423398940,-423327120,-553401487,134219522,65535,
256,512,1024,2048,4096,8192,16384,32768,1,2,4,8,16,32,64,16777344,
33554432,67108864,134217728,268435456,536870912,1073741824,-2147483648,65536,131072,262144,524288,1048576,2097152,4194304,8388608,0,
-65536,-257,-513,-1025,-2049,-4097,-8193,-16385,-32769,-2,-3,-5,-9,-17,-33,-65,
-16777345,-33554433,-67108865,-134217729,-268435457,-536870913,-1073741825,2147483647,-65537,-131073,-262145,-524289,-1048577,-2097153,-4194305,-8388609,
-1,1220083711,-1178563072,-13426688,1724091238,146320371,-1093104128,80084992,-33241346,-956431162,951647748,869830144,536918518,867038054,536918527,1724091238,
-211365641,-1175047253,-1385816064,-507298970,-117345031,-6657,-1,-1,-1,-1,-1,65535,0,-2122448896,-1715633755,-8487295,
-406585381,-26444033,947715838,940572688,947715708,2084044816,2097086008,269515832,2097052728,31800,406600728,-65536,-406600729,1006698495,1715618406,-1006698436,
-1715618407,118489027,-859013873,1715239116,406611558,859773054,1882206271,1669325040,1734566783,1520025830,1021830972,-528443046,-520552712,235012224,239009342,1008205826,
2115508350,1717966908,6710886,-612433818,454786011,1665007643,946629688,30924,2122186752,1008205950,1014896766,1008271128,404232318,404226072,1014896664,402653208,
403504652,805306368,811662944,0,-20922176,603979776,610729830,402653184,-33220,-16777216,406617855,0,0,2016411648,3158136,1819017264,
108,1819017216,1828613374,2083520620,-133400384,-973078480,1714428108,1815609542,-857967048,1616904310,192,806879232,811622496,811597848,806885400,1711276128,
1715273532,805306368,808516656,0,805306368,24624,64512,0,805306368,201719856,-1067438056,-964951936,-420028722,1882194044,808464432,-864550660,
-866109428,-864550660,-871614452,1008468088,218025068,-1057226722,-871625480,1614282872,-858982208,-855900040,808458252,-864550864,-859014964,-864550792,403471564,805306480,
805306416,805306416,805306416,806903856,811647072,24,-67108612,811597824,806882328,-864550816,3151884,-964952016,-1059135778,2016411768,-855847732,1727791308,
1717992550,1715208444,1723908288,1828192316,1818650214,1660813560,1651013736,1660813566,1617459304,1715208432,1724825792,-859045826,-858981172,813170892,808464432,203292792,
-859042804,1726349432,1718384748,1626341606,1717723232,-289013506,-958988546,-423231290,-959521034,1815609542,1824966342,1727791160,1616936038,-864550672,2027736268,1727791132,
1718385766,-864550682,-870551328,-1258553224,808464432,-859045768,-858993460,-859045636,2026687692,-960102352,-285288762,-960102202,1815623788,-859045690,808483020,-956432264,
1714559116,1618477310,1616928864,1623195768,101455920,410517506,404232216,940572792,50796,0,0,808517376,24,0,-864285576,1625292918,
1717992544,220,-859779976,203161720,-859014132,118,-1057174408,1815609464,1616965728,240,2093796470,1625356300,1717991020,3145958,808464496,786552,
-871625716,1625323724,1819831398,812646630,808464432,120,-687931700,198,-858993416,204,-858993544,120,2087085788,61536,2093796470,7692,
1617327836,240,209240188,806355192,875573372,24,-858993460,118,2026687692,48,-16853306,108,1815637190,198,2093796556,63500,
1680906492,807141628,808509488,404226076,404226072,819986456,808459312,-596246304,0,268435456,-960074696,1408958718,-13443958,523137,-472840329,-2052587730,
1541681918,-644039217,496825500,1922912413,-241325411,645988253,-839909313,-434065380,525883936,1380982479,-1912586056,1812398040,-16485120,-2097123834,402681406,-1330113675,
1812343552,-1559595776,1856176236,1889681408,4235264,527826748,4130550,-468159481,1954588806,1950394386,-432069618,-426594170,10497611,-28645888,1962950670,-1173573474,
-152173582,117456646,-2031842188,-2039119704,-2106244952,-2031697908,1273402032,-34839,-369098753,-5670,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-805306369,-768401824,399311540,1954596086,4242258,28367758,16778886,1131675964,-1969559301,281874356,-1269699446,1494273283,
-1261292718,-1273967358,-401552120,393382537,-717569282,1978199410,839676554,-2134442286,-546170370,445278184,45374153,-1996877619,520159246,-12447,0,196608,
-1,-1,-1,-1,-1,-1,-1,-1623725569,2143190966,541798983,1329804080,1363234893,14520042,792015088,942616625,435953720]
}# # Steps to produce a binary ROM from a JSON-encoded ROM, and then disassemble and re-assemble it. # all: 1988-05-10-test.rom 1988-05-10.rom: 1988-05-10.json node ../../../../../../modules/filedump/bin/filedump --file=1988-05-10.json --output=1988-05-10.rom --format=rom 1988-05-10-test.nasm: 1988-05-10.rom ndisasm -o0x8000 1988-05-10.rom > 1988-05-10-test.nasm node ../../../../../../modules/textout/bin/textout --file=1988-05-10-test.nasm --nasm > temp.nasm mv temp.nasm 1988-05-10-test.nasm 1988-05-10-test.rom: 1988-05-10-test.nasm nasm -f bin 1988-05-10-test.nasm -l 1988-05-10-test.lst -o 1988-05-10-test.rom
{"data":[
-215511036,-1446729497,-970077091,-889074117,-1059597233,0,0,0,4793994,-1023318392,1996700702,2122974813,-402410489,-1957560157,45351510,-1962894616,
920847438,-1962117493,-661778362,1586212092,8290310,1007908353,1007645703,1007383560,1007121418,-1828490227,508662700,4241488,-396830578,1495203869,123392994,-167281014,
1962999878,-402476027,-1977679793,-2013247194,1019412838,1010529287,1010267144,1010005002,-1188072435,162791425,-1275056408,2746371,372949758,343212106,-956378574,1964637824,
-1328611829,-401689590,-768475121,149422772,246727424,-352320792,106123512,-1912602437,4373443,958843020,1482360583,281871220,-401695549,-389845137,729049176,4793994,
1912929408,116162565,-1461176970,1662421760,113410816,1963043052,-1460864261,654013441,1183384971,-1966867712,-2147464922,91358460,1980165248,8251402,-1996125402,-389873594,
-1047789419,-141829746,-1047604852,-1962349437,-1291536388,-805008894,-1978435076,22317808,-788526919,-117343774,-489566000,-2119502366,-31457034,-2082572853,-805416762,-930294411,
1858001038,-386102278,577962089,-661733325,8140485,-930327728,-1019487348,91576411,1946222211,-386102519,41025609,-998014972,4622600,-1963422781,-1577110817,-470351796,
-472788853,5283723,-167753056,67056359,65065411,-1950115902,855658526,-1948612910,-772812293,-151321617,33573126,-489618827,-1950090749,853511110,8436461,-1947169962,
-217796101,84636839,1967783944,-1070375184,727630841,-754732602,626050024,-2087321376,-2135948350,65700846,-288160591,1199868718,-997527933,1111682626,-299948968,-1070446006,
-1031582994,-527766523,1355017282,-402411438,225706114,-1645735753,1241936988,-1779949385,-2074518948,1376613860,-335166845,-1047863158,49016410,-1329348214,5826561,1908295028,
2133098496,-1191069878,-2135687078,-436162480,-2042567613,-2042567484,1492683716,1976009964,1965327401,11554846,1088701414,1088734342,727172230,553615864,1918394205,-20061473,
-2134608437,-1070432052,-527824405,-335156605,-1021385600,-301677949,548880962,6035433,942151688,-789249732,182243548,-790376219,853740259,-1090812197,-217873697,-1977349586,
63079420,-2081521488,-315489302,-422448757,1199868718,-528028029,1111682626,1257162634,-289394102,-15013814,1929526467,79856409,108380170,205949164,-478148885,-289175009,
-402331005,398720764,-2147287036,1610661889,402665472,100666368,33555200,616860160,1460080255,-1182475585,-1359871992,57997407,-2147391767,175450876,9832182,-385649662,
12255574,180605712,-2139391516,91532028,1974926464,-1777928694,57934336,-150914583,-1191411501,116795509,1946288278,-1775861741,645986048,-151191402,33560582,1156268660,
1582720,-1777928451,880019456,-58706197,-164792931,16815622,116796021,1946288278,-1775861741,645987072,-151191402,16783366,283840116,1582720,-1777928450,74777600,
1515041,-58670087,-165710536,33592838,243272820,-2146959210,-50293210,243271147,-2147352552,134223630,-58670087,-165251811,16815622,116792693,1946288278,-1777434612,
645923840,-335740778,403603461,243269888,-117178345,386332355,91490304,1951595648,386332249,91489280,1979971968,387876173,155677952,-167766242,67114758,-58704779,
-164399790,134223622,116805493,1946353687,-1777928688,510984704,1509110,-351243232,-1777928683,242549248,1509110,-2146995168,2130712614,1043334379,-58720233,-166038446,
134223622,116789876,1946419223,989626379,12060277,1282533440,490259449,978466346,116803141,1963196440,403603470,12059648,1712908421,-112912947,405176515,28900096,
-1141970043,-722993027,-1262225085,-1677479696,1662707726,245166516,1013126120,-1155500801,-397410179,1012417463,1007973376,1007711233,-1156811767,736624765,8239938,-113008920,
-229181,-1142226315,1968503936,-2137789694,41276668,-58678293,-352094907,-58683306,-385649224,-58720099,-385649353,-58720079,-385649326,-58720039,-385649338,1374159068,
-2144439294,-1660938946,641338996,1903427605,1968438400,8382723,1947008128,872185975,11535733,-2147418647,91567356,-202833488,-154929152,16815622,116791669,1946419223,
386332400,41158656,116835321,1963982998,-2147095584,-33515994,1576576,736688648,-2131016347,33573182,1048577908,1963130953,95965193,-855526465,116807696,1963458584,
1355020793,109494323,-1065091047,954729332,-1645520821,-99494423,-77270552,-161193239,268473862,116790644,1946288278,386332181,242549760,9840256,-167056387,50337542,
1827210101,-1008141569,97338724,-154928645,-2147477498,-1007091084,116835320,1946419223,386332407,-260831232,-223296519,-167733527,67114758,116843124,1963458583,-1777928485,
208932864,9832182,-2134019070,-50293210,7409280,21489792,1685121274,466484037,1709948979,281919412,-1007030989,184484585,-2144110364,779893756,2118450304,1476165675,
-58718860,-1340115624,386332212,896862208,116798128,1963196439,-164581332,50337542,783295349,-1007149077,116796848,1963458583,-165433324,67114758,430967669,1509110,
839021827,853541568,1245571264,-469056519,-997585032,75253564,125719356,1640134,-1966868480,-1152963388,-684811391,1509110,-1101695736,116824974,1963196439,386332226,
846529280,1509110,-166300384,33592838,775687541,-58717316,-1341885108,839052272,-1777928512,125043200,9840256,-387927811,-1070446121,116802539,1965031447,-387781675,
-527821946,887871858,9832182,1009743106,1015641134,-401967829,-696975304,-347148104,1965898958,2811914,-256325515,750840650,-1967162320,-721413850,1679882,645972985,
-1090715498,-1209295944,1717899,1848891,116835245,1946681367,386332165,-1664941056,8430074,-1560274269,-401735652,48955395,-1195126896,-1910636464,444120,-954204416,
36102,-1945713152,-617350656,-256507983,-2012807373,-1207940082,-1064435640,378662,1170679296,-50331902,93005564,-50529028,650120188,74712457,199999998,977322883,
-33262387,-2117276727,1979744491,-1927378680,-1945204736,-1262287104,-2113484802,-973045760,-16740602,9569990,8436993,-2125445400,184582341,-2012121920,-1996462546,-2013239530,
-2097125106,1090544654,-427839293,-1094700156,80150608,1149894655,71616002,88393231,105154706,-1106819960,80150600,1149894655,71616002,88393471,105154706,101139592,
5290014,1220073614,868257280,-1174457354,1727807488,-524573197,-1153463297,931921890,1409730079,113688576,-1954545577,503352606,-1912581960,1348592856,1642465292,-973078368,
-16777210,-2010714076,-430440123,96872033,-424562672,-1972247440,-424628000,91350128,-2135358464,1003170623,855798465,115589595,39684390,73238822,-919404875,637854145,
-1962521207,652774654,-1191099000,12484607,-52153728,-536695770,-722011422,-2010725122,443940,-2065236992,-389871841,1621295305,-1144485120,-1040842112,-1156877280,-1040842240,
-1157401584,12058880,-18614524,-1877571382,616663552,1950366912,67156767,1967178230,134265611,1971372534,671136515,-150732616,-1999962397,-1023373034,11795850,-1979710279,
49266887,37487396,-1015020171,1007151873,-2147126015,-404618045,5290014,12507278,38046208,-1152363770,-1014104032,-436096877,-2128178296,872444478,604468498,115916864,
1532528870,179315719,38045891,-956365626,80150276,-16464129,-1545326049,-620101534,28508789,12123954,-1142687996,-470350848,378063614,-943521647,-16756730,1376176127,
-973078528,-1073720314,5572294,1443284626,113639424,511705175,5290067,1642387598,135061642,-2065276442,7819,1734,-58398977,-50529028,-50529028,-50529028,
-2030240516,-1956518176,-1021355069,1680227886,-1426049435,-1347965531,587231085,-1987364469,-594831477,9169547,-1957342836,1381191916,196091398,551821542,1433739432,-930288334,
1183766670,73304838,-2146465242,91550457,1978923392,1325351688,-352209662,-53048341,-1400206146,158597180,-143277766,-336426173,-1970028841,1017962123,974550016,-1946716735,
-461371322,1324559108,-13703471,-343237740,1510416138,1499289691,521188841,1482381831,-1949345443,33390834,1325335413,16547842,1330578548,1195836139,1005751235,-2145356297,
108331517,-16625921,-58719666,1325954048,1313754703,1194453838,1179010631,-2094404794,225837054,1946221696,-347189756,-347716069,33390615,1325335413,16547842,1330579060,
82529870,1179010887,-2131588157,74711292,48975438,-1950136762,1979137010,16547861,1330579572,1313754959,1195848171,1179010887,-24958485,-2146339329,108265724,1330597454,
1178999275,334186311,1963064704,38207235,1946221696,-347123964,-1018738942,-58658165,1325691904,1191373647,-225721529,1963064704,38731523,1946221696,-347123964,-1018738942,
-58658165,1308914688,1174596430,-1963080890,-1962915298,-751173034,-745929614,-990459138,-2029227007,720710346,-153159983,704965594,-19846411,-154992954,67143430,1048584564,
1912733769,1228832808,326566656,378229328,-1031602077,6660100,1525610276,-2146505896,67127614,1048577906,1963393097,736856956,-1736214,-1947873024,-154825992,65876707,
65065409,-1761587706,-561068404,-470355829,16828151,-654900108,-523117065,177653507,974419136,705721286,-204829968,66388901,1976499965,-1963947276,-1977569049,61600714,
1976499965,4241654,-2048337778,-2145815460,33573182,1048580722,1996685385,1662421771,79856384,-301963872,1228832963,74647040,-489627184,1375752381,-980748149,-1164382926,
-487128768,100909315,-1953038258,1085970672,-1243416831,1226213890,1090158592,78971506,16828151,-654897548,-947790345,-92274448,1191277318,-1030961405,1519835790,182422355,
976778432,708080582,-422555408,-963909936,1372228177,-259265230,-1527514229,536872281,536920961,-344601090,-2128609499,1495269347,-586955517,-663367938,-789542312,1491521766,
-1974352758,-315469366,-1426850933,12812633,1976434208,-1867280,-586983137,-495595778,-61,-1,-1,-1,9560810,508973296,-1912586056,243928,
524519144,-389064610,27804743,333976948,-400061950,1474839630,-1161809093,-1460927497,-1274383232,374244102,1093044225,552125184,1963042884,-337366524,-3413911,-471309196,
268957185,225716106,1972894848,63209475,-351015808,268206107,1793594996,-401509053,-2018229385,141820732,71042996,1639187060,-269998200,1000728643,1342523018,33900230,
-966765080,-402651834,-2007474098,112461126,-335284294,41189544,646480052,1317208129,868417814,-7935745,-990509196,-1958513280,-1964756232,87818310,28575858,18239107,
-1073073941,-1816911244,276037948,37516468,364122484,192152380,132880308,1541931440,-1341789373,1128392705,-2013185560,1131735079,-389822581,663355694,-163354136,58003652,
-1023409688,-1979638296,38242311,1006663423,-1975749617,658244934,-1427622537,-401443518,2122334897,57999366,604301504,1929591823,988407838,-1275007512,-400062367,112214822,
67192518,16795334,1575151696,-395348904,-806864181,-2013088768,1124657191,1187382960,1187382273,-397410048,1951948228,984475731,-1275022872,-400062329,78660330,67192518,
16795334,1571219536,-397511592,-1813497201,-2006862848,1120725031,1187382960,1187382273,-397410048,1951948168,374244147,7661569,-2013108342,1118627879,4269706,485174507,
1967260904,1108076567,425600,-390069387,1007625220,-1274710780,65830919,-2143139096,1072174020,-400062464,1204175482,1183776770,-4181504,-1013115274,1720369202,50102278,
28575858,18239107,11803115,167777768,-1273990137,1964025857,605225986,1946364935,-1023233022,1586158387,-1866235642,-1672428800,-1975458566,-465509152,1019488832,-453609510,
-1017602752,-1342048582,1575546528,1391847525,-2065258320,66370299,-33686036,-50463235,-1073082588,1458242420,233603984,-1070338933,918870158,1085800568,-958886400,-16760826,
-969303320,-973076922,-402651322,1187381401,-1830289146,88524288,1581049856,-2065256528,-1341918534,645983756,-2081423297,-1280307772,-2031558518,-2030558103,-399265568,-1070372478,
-930359157,9444874,-973208972,9518602,-973208972,208989450,-440349186,30244870,1060360,1092151546,963985576,-1975459608,82362592,168813696,-2045807397,10414300,
-393017227,494141592,-1280307477,719904906,-2046555031,1764288708,-1975458328,550273248,468225712,-3933335,128976246,-1270805016,1093724307,-956371480,1187381255,-1746391035,
88524381,1569777672,1273496759,108956225,-1186904600,-2132236181,-503024328,-398791687,-1460863284,-2146732784,1946158462,89062957,129291243,2122318256,208994309,1968277992,
-401624062,132858019,28349364,-398414360,663289490,-348074520,1183840513,3982085,20714356,-1817181067,-58717205,-1341885425,-1274877177,-1008715260,-1014764661,-745604592,
-1047600757,50602169,-1177448757,-1074003895,-1682046208,-1523649646,990007457,1963087878,50373123,1963022141,2408202,-1410758728,-1079261044,-1246232468,-930305139,-11290453,
-1412920149,-1004092018,-1560276474,109838480,-1896152942,29316060,59095555,567087028,-919400469,512481678,-612040110,803834485,1958742632,50510382,567085492,-854851144,
4030497,96865653,1963801855,-853953530,608240673,1916877919,56206044,-2052976860,867429123,-1508996663,-1475442429,113721603,33555347,-1910582733,-853887781,-2051399903,
-853036029,-611443167,1316491,265867,1363759647,-1274837574,1008848167,443897858,516434833,-1031679093,-628224032,448057907,-1172364851,666108805,280240589,1031807437,
-1173588992,162792250,146285005,-1910387444,-1159885115,448004224,13312461,1225395456,1919251310,1329799284,1363234893,760433952,542330692,1802725732,1702130789,1850018317,
544367988,1986622052,1886593125,1718182757,544367977,218762532,1768247818,1919251310,1768169588,1952803699,1763730804,1919164526,543520361,1718165569,1667591712,1634956133,
168655218,1769108563,1629513067,1797290350,1998616933,544105832,1684104562,604638585,1396785664,541147977,1163412768,1309281536,1395486319,1702130553,1768169581,1864395635,
1768169586,1696623475,1919906418,1701972493,1667329136,1851859045,1953701988,1701538162,2037276960,2036689696,1701345056,1701978222,226059361,168633354,758263862,1802725700,
1702130789,1869562400,1699881076,1685221219,1920091424,168653423,-220,-1,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1726778197,-65121456,-2048523856,-1912316277,39750619,-75489397,-1341491728,-8067566,
-1528233402,268140801,-1341361147,528803348,1566074459,-1341785623,-393943533,118381784,-1156341569,-611450752,1723867151,4389,101616512,-511482368,1711276047,-1419329269,
-1581239450,-1419378664,1711282849,2539179,-1392506695,-69031066,1727013135,-132051029,862366566,1483200,482257766,-1419334400,-1419319156,-1419321204,-1392507719,-69031066,
1711300798,1150009395,1722508802,627442827,16777215,862366566,71601088,1522445158,-1070373376,1711424651,76244651,-55962,-1419378433,-1950338202,-1419377596,1711296190,
1150009395,1722508802,627442827,16777215,862366566,71601088,1421781862,-1070373376,1711424651,76244651,-55962,-1419378433,-1950338202,-1419377596,47206,-1419378542,
-1933560986,81838568,-4674714,1722509055,-1845493576,1722508800,-527646669,1711595713,-18261,1220455270,-1070373376,1711424651,76244651,-55962,-1419378433,-1950338202,
-1419377596,1711293118,1150009395,1722508802,627442827,16777215,862366566,71601088,1019128678,-1070373376,1711424651,76244651,-55962,-1419378433,-1950338202,-1419377596,
1711290046,1150009395,1722508802,627442827,16777215,862366566,71601088,1005103974,-13408677,252944575,1717247751,516906328,1726821222,440,-986487296,859832505,
-781803777,-492083504,207742201,610395660,1717692147,443,-583834112,113609574,-1175047393,1721647104,-1398811695,843466310,1978917315,-1469979613,1962979520,-1643532005,
1188287334,1912929923,531734234,-1613507738,-1619374746,-1010814177,1342178502,202138084,-215719450,-1957076506,-1007083562,607274378,1963080958,1280674574,-2147171709,-1971302795,
-101822907,63498691,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-739639297,-253,-1,-1,62646783,1951460328,1228832816,175244288,4800128,-352095225,954765439,1662421993,
113410816,-1460871030,-84183807,1946265836,-1429959941,-287114425,1228832963,124912640,4800128,-397314809,1202383115,-389808926,779374752,4800128,-2146995708,117459262,
-477481358,-1947668760,-2097126634,-661977406,1963043052,-1460864261,-1946455039,-486822973,1048626159,1912864841,1228832775,141887232,-1058479222,-1012141080,-1964450584,1049232990,
-896794551,1858001550,2042628858,-1898827000,2083964378,8332544,-523116335,-268181295,1946615680,283935587,106415243,-946940020,-125086895,-1258036352,145861640,-489561391,
41148624,-906046710,-963972491,-22289782,1541830093,-1939929254,-1176990000,-192217084,2046546093,87238147,-20479573,-70210273,858129273,-276714747,-454942798,20901761,
-2082966198,787157188,-779361398,79289995,-1393325312,58326224,-1442500058,536856449,2046611628,87172611,-1309703766,-2115706337,1241595887,-1195124619,-386086912,-2143485871,
-1191676193,-661725184,1065474867,964012629,12187187,-670913152,-102573054,1085806708,-2133291520,-16772594,-1152384838,280606378,777971712,1085805547,515935744,62445710,
-326414336,1476419327,4241496,-1899767666,-2116340776,1974097215,871773026,40864457,-779361839,-489160020,-1321306629,1391121156,-1912586056,-661774656,1342178232,861271179,
486487789,208989451,4241438,243325070,536805394,-661890979,-611558881,-1019487741,-2143478666,-350522657,503734293,-1152384838,347715566,769320960,-1168046305,-661913472,
516145667,-1073694714,1962944488,-947897081,-1070336394,516103943,-1073694714,1239120,1342665818,1273545355,-2143463424,133002951,-1896037601,-2116340776,1974097215,871772973,
40864457,-779361839,-489160020,-1324780037,-1930767612,-1010695208,-1172437408,-289714176,1358263,523070440,-2135269113,64523264,-1009634366,1085855886,515935744,1342178232,
1593830539,-1021356032,210447953,976111174,-502959068,99350775,76164678,-3974663,-1288523493,-1221151308,766556600,1904806077,1953654135,1869182329,224222064,1685283327,
1785227110,-1480889237,2052915168,1651925880,-1364431506,-13959249,555482912,623125312,673850974,137060137,436210447,477961083,674899725,729688354,876360572,960443710,
959985440,909456429,858927403,863792,-2075560121,1951232843,1985049935,-1907716792,-1873899700,-1840082608,430931,520887815,488315674,472582684,-1756954614,-1723230136,
-1655858357,-1605329073,-1571643055,-23725,-436096944,-435113851,1693014148,-148571573,-301677949,-297607034,839248515,-289109276,-1396375998,-169719058,548988415,105352711,
12189491,-1951665376,55020055,-1703954,255,50331648,-256,-369098753,-65399,-1,28313168,397444582,1085834470,-1329558016,-425662944,-423611872,
116795120,1948254359,645932555,132055191,-821899944,1448302076,-326951343,653036304,9899648,7788832,105286555,-427560821,82362639,-2130157941,200278243,-1176990013,
-1968439280,1022895328,-502958888,-1878135819,134161836,550529,138807800,6740379,521192579,1566269017,1355765767,-2048523856,-2065295696,-1595531088,-821375656,1085820958,
1490587136,-2030387150,-1962905594,-1962906098,-83858410,1638525215,1085820958,-86471168,7212681,7083657,7341766,525925120,-396259607,11534360,-1973616408,-402476816,
-930456327,-219675472,-370636196,179331443,1558702330,57966760,-1007424517,-1325404184,-387544576,45112538,-739712630,-1979404196,1556932837,-1024980048,604114012,-2063719173,
201487570,-1327461887,1555359755,-396283159,129040316,-1973639960,-402083632,-259367779,-1763178064,-1329034660,1552934962,283764874,-6625183,-402651464,128998534,2145968778,
-1979142052,1551427814,-511047248,-1336118808,1550313483,-81526260,196141194,-1336122904,-387610062,-655795110,196147808,-1470346008,-83332064,-104844453,-1342176566,1547429898,
-143294296,-427163216,-1336134168,-387872253,95444014,669574538,614589532,-1331566850,1545070603,-527818740,333974448,1620175196,-401886982,-551265275,196141194,-379846168,
1049256063,121372770,138176372,171724148,222062196,28922484,-401951744,62186171,-18696472,1242970818,841184512,1405550290,8658570,-214252546,-32279205,-402475826,
146072215,1407357672,1105788042,45374208,-1964865816,-2013247194,-1262288538,-495327229,-277556726,-420754690,1827144628,-338545950,32816093,-1020631320,1558709172,-2076820766,
-33262592,-1261966394,-498210808,1381104778,4800128,-2146864121,50350398,11993718,856031672,-2076800311,1242991104,686311936,-1017554206,1950379752,1228832872,158597632,
4800128,-352160765,-1895877800,7651271,1006651018,1007252480,-1203342079,65794276,653305016,963904827,-1934886148,-1594119224,646578277,378208358,213450851,143845376,
-402524997,-1031591842,6660100,-401623826,62185927,-1260272920,-507647998,-1192754764,1727841249,1642352813,1951940776,82740005,503613798,4765776,1642387598,135061642,
378167782,113639424,-2030108672,1482811076,-2016675553,108953847,-401115904,393556521,1894134704,78148068,-64747404,67909493,619197419,-399609038,997470781,-392155458,
27800207,868110452,-262608736,-544587894,-2147031168,1047790847,-2136982082,913621219,-341821250,-1607549391,-855767884,-922867596,-964483980,-940315899,582,280263,
122078720,205965056,1187446784,-402653174,1014313397,-236434965,-1931709903,-1959916466,1451819860,-388287734,175452573,1915857640,478817797,1586102066,1820995074,91129858,
21793326,-972796280,-402585786,259338665,-2131766808,125108287,-890701945,-386430992,1451766184,-2084556026,-2013391258,151110647,35715879,555044623,575604995,1326580769,
-142139076,-1952394050,988283990,-399542991,645017927,443810108,1007076995,-2096466942,54267078,-964490124,1413164550,-2095746047,992872134,208929108,3945707,992880756,
880083284,-2131796504,125108287,1458108295,787974128,-402434934,394850122,772558476,-1996204917,1719863894,-1070399210,1317212907,213123350,434880562,18239107,-1070461772,
-2131811864,158662719,-397346937,-2024214503,-1007187977,-1826158335,151134459,554202151,357502722,151200021,555915087,-1756428029,302260527,557586255,-536870913,151135490,
-162463958,-2144925681,35979999,1358899721,654839798,620945216,-15003902,135263828,48169039,705233445,267800831,-545239288,151135490,-162463958,-2142304241,35979999,
1711217426,1325928438,547588864,950347264,16776960,0,509606656,4243280,20766606,494154615,10487542,-2144701183,16818190,-100642328,-31153692,-386162202,
-336068576,-1610156523,57999616,-401871880,645922851,-335675232,-1269237503,-899735808,-1325793278,1481893899,-1974452212,-401887008,-78096306,196147907,609763560,-527806273,
1005063088,-1006938024,9969289,10094220,10229385,10358409,-92013629,1242002432,-2035019916,-466435079,-335412806,-1930825692,33667584,1007625452,856323343,870003648,
-338545719,-326937224,-1997763826,-386269114,-108330899,-940699728,3142,-1995678069,-527824290,839853292,-1961789984,5236959,1586092331,173947660,753656439,1055448971,
-153539840,57934276,-167616887,57934532,-167485815,57935044,-167354743,57936068,940072585,-1267400634,1532516603,1566399065,82362717,-1056642111,-356449047,1355020292,
1139146928,-930463516,-393592604,1610335064,1086018334,-153383424,16818182,113651317,100728992,512607118,468189344,-453376001,-335666015,-436147456,-437716063,-1610156290,
-109805568,10495616,32241791,1595890681,-83885366,106979167,4241438,646568078,378273895,11534441,-202866458,520516608,62152967,1552808911,130491936,-930283521,
637853889,-1946007671,216580552,71796774,88589862,677154202,-16267482,-1043297025,-1993997088,-796130745,638380225,637814664,-1845147706,-930327034,915259534,-454515313,
-388986112,123601127,638082189,637687689,637814664,16713671,-427773702,17770096,12707871,38242598,637584104,637814664,-63545,88589862,17770130,-536801513,
251658509,-13701119,866208046,-805302336,-1912592200,1095888,414767246,-54489600,-13371853,1894121648,1726599505,-145119757,1946157505,-2135907071,683176166,-1898410496,
1724944064,2101072,-121498,571441151,-363305472,-268393512,503385902,1558946129,1165289722,-776988299,1810392294,-1341098683,-396302625,125125986,1692860336,-1018865176,
1642332852,393494696,-397390258,41156914,76088459,-435680168,-420010911,-1979599775,-343873852,-1044345711,-972880672,-1047768637,-389953909,-1044315388,-1017574168,-1912586056,
1763086040,1730579200,2680832,1894121648,-2040461537,-2038373180,-326412860,175498250,-33134973,1074155139,1719863531,1317256966,-815988474,1967448552,-422465509,1155065956,
-575663499,-806854426,-1341557436,-396040449,74728646,-2132409424,-1335926845,1432086577,816898186,-816491288,-396402693,108330802,-889585740,1408958466,641227917,-63545,
-524171124,1200170500,-1043821566,-2010772248,-970587065,1536820551,-435048198,-423130592,-435900383,-436096991,-419450847,-435048415,-423392608,-436031327,-436096863,-419450719,
140283297,385945382,638606477,1428095247,1187507339,1560293380,232784143,17760257,788475632,-1070358195,-1194328049,-796000216,-1912596296,2144472,-466435954,183032,
-1207558573,-661782520,-2147479365,1971324799,75464751,-2094434880,1962934911,2145059,-1845147706,-1912594248,-2049088,639601446,251660279,-4717196,-1207702784,-617414404,
-1017438457,-1899459333,-420103232,12828723,8356,134,8356,134,8356,134,8356,134,8356,134,8356,134,
8356,134,8356,134,8356,134,8356,134,8356,134,8356,134,8356,134,8356,134,
8356,134,8356,134,8356,134,8356,134,8356,134,8356,134,8356,134,8356,134,
8356,134,8356,134,8356,134,8356,134,8356,134,8356,134,8356,134,8356,134,
8356,134,8356,1342177414,620761249,809238576,1008170072,-1961528825,-2147479522,-339726109,788476420,-1472231542,128975595,-1610593886,12255305,62175920,
108267324,-1162346309,-1014103084,6493833,28349336,-301677949,855960195,5153728,771777186,-1475377270,-788510045,-2020921629,1285793815,787206400,-1473796214,-1606425472,
-1071382427,1705165834,-1484116480,646490159,280559718,2045249024,1820993024,1284122122,4825099,37551652,-2144987787,1963788668,-389707250,-393609145,1088995722,130583040,
6295177,1006651808,1007121415,47108,548930419,-1174457593,-1410129920,1354696478,-1178586368,-1410138104,8849142,-1157204976,-270007820,6660127,-301677949,522539459,
-771510016,-166809120,133988593,-1057095054,-13450407,4791946,-1896467682,1949746654,-1618334208,-217864137,-1481654954,-67883287,-1898410914,616767424,6464007,-145600360,
-1560261594,-1856372658,213182929,1577396968,-1936988463,199819344,6725637,158727946,606069632,-339539232,-771378933,551780579,-1022697692,-2097125726,-1007811134,-2013247072,
1251999814,21399552,-2013240672,683870022,676352040,5263400,524296,1048592,4194368,742391872,707341608,808001070,808464432,3161904,537923584,53485600,
503776001,1726821222,440,-986487296,859832505,-781803777,-492083504,207742201,610395660,1717692147,443,-583834112,113609574,-1963576545,1073789428,1721689738,
-1969237039,1722640116,-253639885,1642337397,-1201258328,0,1298532469,857713018,80135104,1642352640,1642466316,1642525476,-1072994728,2129140085,-2132769055,-164425756,
-590347087,-498727565,854995961,-2095977536,79234286,1979688960,-389978617,-169720312,-695482230,-1329333985,-393943413,460456235,276104508,-1157627718,800700153,526313472,
-1023366680,108265532,-385834520,-2035285882,-5208858,179921126,21030912,-102627981,-460292629,1979333728,-427314955,3324292,1929456104,519692838,-1912586056,-1760657192,
-1205925888,-661782464,9840256,975562991,243271284,-1022361450,-1332722197,-461052280,1957313632,-1876038909,-2065266256,1692839600,1912657384,15001631,-1968171662,1625588966,
-424824752,12642404,523167832,-1332738325,-1014700403,-1157627718,364492584,-1173755136,1035665408,2406839,-1021401112,1692839600,1929418216,47630,-1179164229,-1847066592,
-1006703842,-2065268560,1912634856,-424824786,7661668,1642603890,-427708416,-425021308,6601060,1929410024,-335945212,-427642870,1012982916,-1340967851,-1165695357,1639645184,
2144695,-350336024,-427511554,-429870972,3467364,1625710000,2943171,434641522,-424955904,2156644,803737202,-1341558272,-461052276,32241760,518571001,-1469783011,
-469470207,-1007424672,6601041,44590308,-397342604,-497476347,-1017513485,6601041,27813092,-397342603,-497476367,-1017513485,60746239,-2065280848,-1912586056,-430853928,
-393301884,-1062711435,-4979340,-1332737301,1332209812,-527814620,1387273808,-488078106,1951932399,102679297,883026000,-1070396300,1958723726,96937472,645984484,-2133917680,
805310478,128975028,645927117,-2133917680,536875022,61866164,-1058533171,520574976,-2065279824,1929471464,-1218331890,-1124065607,82422517,620686110,552095808,477321216,
1076154614,-430591920,283662468,-1341295872,-393943466,2062032279,494397469,-1169900861,-1014769013,1975519759,-1328314560,-2146388735,276041980,548733872,1948318848,4581383,
548733872,1058432,271452367,777211904,-402241650,1482372025,-1007091084,-430460848,11819140,-1070395187,-58698813,-402426832,243269651,1529872400,105352750,-1338797848,
-103189497,938338499,31982453,-1901018368,206465256,-1327461856,1315235982,-430395197,-1155592572,1504754244,1200522470,861923334,-2098658444,-430264320,-2130595708,1963178047,
-1962823678,1538321943,-768375578,1334574899,851938061,-33391676,-1430113600,-13372446,-1962061941,2076455623,851508738,-203313470,-226491019,-1328187905,-1669011876,-374603075,
-919343112,-1274914934,15591438,-1339525987,1401218653,856184715,206539465,503996299,-1912586056,1220824,472311888,1480017640,312607604,-1336205568,-2088442274,-75427901,
57916002,-1325441047,-1014700449,1929247208,-35198957,1692844208,1929244136,-33757177,1625555570,-1175221309,-211419103,-176862555,-930352245,-5901466,-1847399707,243920896,
1235222624,1023288320,858420482,-975466789,-2147453898,1963792764,415364892,-1961462504,1625522649,-389707168,-393609199,183026058,197691904,-401951541,616759359,-166808561,
-773271068,350802408,-8338688,-2042071289,-771804421,38702051,5279625,973103776,863307590,-2034224302,1244067781,-1580727552,-388956082,-1269118973,-289109490,-339375550,
-301929728,-1966801334,-352261180,-1975325184,-352261183,-1018499584,1122944138,15451530,1257111787,-997538562,15401195,-1047903506,15401195,-436253970,2144286,79419534,
32553477,855642296,-1387282945,-453044503,-435418015,-420273055,32553569,855642296,-1385710081,1934418921,-396929525,1583348437,1273699186,1084776932,47206,259325952,
92863361,-2001009292,867625733,1354964928,637897254,1642333576,1642466316,1642525476,-1072994728,-1897391755,-2132769060,-164425756,-590347087,-498727565,854995961,1712843712,
644220043,-141884109,-1476393799,1711764991,1174988993,-930417182,-115353973,-61,-1,-1367932929,-1365461640,-1339183193,-1296715682,-1331907915,-1365462814,-1319325785,
-1296715388,-1320242507,-1296715221,-1302941003,-92228990,-854428800,1436307520,1183575179,172394754,-346514083,102654028,-326958998,-2131981564,175511036,-1912586056,74836184,
1719873003,1317142046,-83754978,-1900006404,70698200,29554177,918815860,1085997336,-1948545536,425626328,-13704239,-2085755241,520554180,1720242017,1948682265,-855592448,
340167232,-2143510748,-2126769806,-857207433,50194502,95683955,-1023012376,1913003752,83028051,-165273424,1958742084,-2147415038,1963596158,1342311441,121932326,41271306,
1183319216,1218598916,89450496,-125058418,2122350518,108268057,41272330,1711982334,90605592,-432405388,162792566,115886827,102164486,-118996366,-1975684605,105507064,
-58715533,-167087087,745801927,-351971608,93906983,1912959464,88729631,169442944,1239942517,-32411131,-982186674,18761463,-402098944,65733997,-1023053336,-1612145568,
113769204,-1352400793,6885004,9971337,10098316,-1191513624,-1545074033,-419516342,-34868124,10098318,9971339,-1644886552,-2141142175,410321146,822574977,-401509072,
1480347700,163056245,2669040,250287821,-2136439068,1084754037,-1833958283,-1017033754,-1,-402416407,2104624403,-1341921304,1156982320,41205768,2122318092,292883225,
642777612,168248458,-1342016064,71731204,4760152,-1241232920,427720831,168195083,-33393212,409340614,1946510984,1994799620,-351685628,83879988,-1962662424,-386888742,
904397958,427720708,-402295541,426902585,1912928232,47835156,753405810,-32869883,-613087922,-352027416,75556867,76409027,1642604658,641773571,-1073199882,17564276,
-402634590,-1041759055,-401640956,175243939,1912927976,72083461,1340605419,1558758148,-399150588,-1977220304,1134693956,1208403456,-2098704384,68216836,-1545068942,-1948611837,
62318832,1912898536,40232975,-1192752526,-402296316,65733645,-1023143448,-1575467383,-1974271884,-478145442,-2114223969,-1995606437,1183389254,-402148332,636158962,1023707942,
58065919,1208221624,-1059027384,170264288,1183387204,1686775318,-1597178366,1183383669,-655834348,-1973194237,-1712843682,638219524,638280842,-352041846,1686775304,1149904386,
-17004018,-1597013809,1946272758,282034179,-1960388470,-390003388,119408130,-1442823489,-1330986102,-997545471,-947213654,-1861892438,63170567,1912853480,28698639,149424754,
-402296316,99287901,1609041844,1827193603,-402296317,65733453,-1023192600,1912823528,36890655,4720326,59500656,1912839144,25028623,-790099342,-402296317,65733413,
-1023202840,1929590504,33325064,-1763114123,-1070391808,918870158,-400621308,113639928,-973078459,17926,4662912,21096672,-155541328,-1444352511,-5707773,-2147245080,
33584446,243275634,-401604537,-1330642653,-301861190,-402420760,-2048327798,510034691,424068862,1127802880,857619314,-992440640,520160310,-236420941,-399871234,628228149,
7683712,-133991678,857612523,-992440640,520165430,-773291597,-2146798850,268453646,1929384168,-402279419,-389873022,527565455,-972987416,268453894,-402473752,259130060,
1912647400,50456586,1458046322,-402396414,1183318618,1692975896,-400330238,113639736,-393215928,-1578630511,-401378814,242352259,838927080,407276004,91488572,736633012,
512410370,-872546187,713081728,192091230,-1994897783,1183389254,-954602732,50337862,38046246,241497638,1260161830,1183441911,374769940,407291587,-2013154304,646453606,
1317208180,-389873378,561119271,605308554,81838081,-155541492,350809601,-1475448320,-1274776544,-1475941428,-1274710720,29157546,-397323325,-12844945,-997849995,112924651,
-198919936,242516136,-388176920,-186515369,-1259440821,1532623232,-401755965,376569860,861014704,1975551186,-1272926206,-166212352,24379844,1489197817,1583044954,119496031,
1358954447,4241438,113694862,-1325465458,-434051552,-1900006496,-1862223656,520092316,1478426708,33012431,9216748,1051331,1075838980,32619010,9282284,-685498188,
-1101655948,-523193491,-347733134,1588342521,-1918836602,-303512832,-1976208127,1059395142,4497920,638928522,-1978960650,-306178450,340691462,-1067392640,-385219607,-787001718,
-2134375711,243794133,780664901,686489670,605439626,4497983,-1575532918,1183449157,115916822,-2146146678,-322936604,-1564210685,1720320070,266633237,605308554,81838081,
-1005936628,637552546,-1056619381,1117913832,407276032,637551522,-1173863286,-1007811594,-150990664,1174603366,13795346,216187216,184871105,254105808,-1910586624,16824795,
-217976646,851648367,72256237,-388259864,275971743,1912615400,-611443189,-256237652,-387781119,16824771,-217976646,-315440275,-402370934,2028526456,-401837314,124911626,
-335417158,-1007885654,-198919855,1929274088,33012240,1963501804,-615323640,-2135624734,-389850631,-466420033,-1021819255,-971413880,-2013259706,-2097122266,-117367218,-1912158525,
646447104,646578292,-469106571,1183453556,1017062420,-32607104,1006925004,-402230143,-335938093,66501137,-387055440,-689422225,-402427139,1455620204,4374097,-1191054918,
-290717689,1509679682,1364443998,-1900006626,12122328,-353136,520115230,-1070396813,9307658,384506741,347848755,-198919936,9307658,-1243083915,1274405594,-2135625867,
-1912158471,1532559360,1948297411,-338906108,1946265615,-31594491,78120683,297010036,616154105,33012468,-1460879309,-402098928,-152905092,-1007058764,-2013236064,646453318,
1720189044,509002521,7802506,-661733325,909836725,141885700,104579212,41156870,-853409099,-2144990859,1974338428,639101718,-1375503232,-467005323,637538489,-488635732,
520320506,263504734,11800781,163254477,3914170,-390070086,552866424,758263857,1953724755,1109421413,1685217647,1767982624,1701999980,840960525,1294807344,1919905125,
1917132921,544370546,758329394,1869440333,1092647282,1701995620,1159754611,1919906418,892351008,1835355437,544830063,1869771333,537529714,758591538,1635151433,543451500,
1869440333,1126201714,1768320623,1634891111,1852795252,1109396746,543519585,1969516365,536896876,1969516365,1092642156,1867325440,1701606756,536887840,1969516365,1126196588,
1342835968,1953067617,1749229689,543908709,1342185521,1953067617,1749229689,543908709,1056972850,1061109567,824180799,1378693424,1159744847,1919906418,874514957,1294807600,
1668247151,1836020328,1681989733,1702129761,1631985778,1920298089,537529701,758198325,1886611780,544825708,1885430849,544367988,1818845510,224752245,808656906,1699425585,
1634689657,1159750770,1919906418,544370464,1953719636,2020165152,1701999988,1936607520,1819042164,168649829,825242400,2036681517,1918988130,1917132900,225603442,808656906,
1699425588,1634689657,1864393842,2035490930,1835365491,1768838432,1917132916,225603442,808656906,1699425587,1634689657,1126196338,1920233071,1701604463,1917132914,225603442,
808853514,1766075697,1952803699,1126196596,1920233071,1701604463,1917132914,225603442,808919050,1866673458,1668248176,1869837157,1698963570,1952671092,544108393,1869771333,
1344285810,1935762796,1749229669,543908709,1953721929,1634495585,1852795252,1394608653,1702130553,1632116845,1684370540,824183309,1227698480,1377849135,1159744847,1919906418,
824183309,1395470902,1702130553,1884233837,1852795252,1867391091,1699946612,1378364788,1394634357,1886745701,537529641,538976288,1702063689,1142977650,1313292617,1230263119,
1768169539,1952803699,1763730804,1917067374,543520361,168639041,842412320,1937330989,544040308,1769238607,544435823,1869771333,537529714,758396465,1869440333,1394637170,
543521385,1869771333,537529714,758330929,1701669204,1142957600,543519841,544501582,225731923,537529610,1397051944,541412693,1176641597,1260397105,220813637,537529610,
758263859,1953724755,1428188517,544500078,1969448275,2037672306,1668238368,1936269419,1668238368,224683371,538976266,539828256,1869377109,1394633571,1702130553,1851072621,
1394635881,1920295781,544830569,1801678668,168626701,1969448275,2037672306,1668238368,1665212523,1702259060,544370464,1260416846,1868724581,543453793,1635021889,1684367459,
925960717,1143812153,543912809,1917132848,225603442,959918346,1766075697,824208243,1920091424,168653423,808990513,1936278573,540024939,1818845510,224752245,943141130,
1766075697,824208243,1767982624,1701999980,925960717,1143812664,543912809,1953394499,1819045746,1176531557,1970039137,168650098,892352032,1936278573,1953785195,1917067365,
543520361,1701869908,1920091424,674067055,544109906,1970562387,168634736,538976288,1936607520,544502373,1195460932,1414745934,1679835977,1701540713,543519860,1142976105,
1702259058,221921568,2020165130,1142973541,543912809,1634885968,1702126957,1632903282,543517794,1109422703,542330697,541933906,1869771333,1393167730,1702130553,1632116845,
1684370540,701760472,-1207897932,-1227137024,-1203765218,-735464445,11534576,565623392,1757220864,764668346,1894158000,-1070399253,-1280282138,-1070436122,1910898923,7487105,
74715700,-2031730512,-435179270,-436162428,12123269,-1327984912,-433985793,-2049119,133635979,192220928,-1946164549,-2046325985,-1326936380,-1335761396,-1333467632,-1337203182,
-1337203134,843835026,-1332746560,-1337727404,-1337858542,-1337727434,-1337924096,-1337924096,66238988,-435048210,-1174294396,-1326578760,64535041,62569198,64666348,62962412,
-1141981134,750762564,-1962823493,2005659159,39291396,-1124068679,-823543011,96633824,64617089,816841589,-402699538,-2065296720,-373606723,-919347004,-1274914934,-1153188594,
-2081303063,-75427901,-1166886302,-2065296464,855703737,-1325604160,-465312256,-455046592,15680,-608498059,1685941,-373591363,-18150009,-2065296208,1894157232,1910767851,
-527825116,1894157232,1910949002,1894157488,-2065295952,1894157744,1910767851,-527794140,1894158000,1910767851,-990478300,1977649792,-2134081529,-2065295696,-2065295440,1894158000,
1910949002,-2065295184,-373567811,1642336051,1642525476,-1912590152,16825552,-2065294928,-398851864,158527074,1692839344,1945000424,-1218331890,-1124065607,-51790851,-1174476020,
1625554946,327727953,1493916136,27813092,-287177612,-941040661,997452007,-2065294672,-1326558744,-393943525,481298788,15238374,-434262000,270919812,-2065289808,-1339765528,
-393943522,531688830,-504855322,-434065361,402385028,-402427416,1623000189,52554172,-81304600,-2065292880,-1341073432,-393943517,582020213,-1024949018,-2049263,773819182,
604063626,1967144128,-423710710,-1131168380,-1342039831,-393943516,-1410798176,-1340116243,-396040496,376630690,1928180200,610329617,-1327461647,1348789969,1491963368,820577139,
-423326977,-433737632,-751245180,-2065291600,-1338616600,-1333467609,62831340,-433540882,-590092156,-2065290832,-1341570328,-461052374,216042081,-2040404372,-1335761184,-1333467605,
1022879758,208929960,-1155530566,448379019,188672000,-47930908,568631782,568785700,-1912586056,-1777928488,611651584,9834112,-1777434496,-386260992,-223335394,-1174707994,
116850687,1948254358,-956833273,38406,1048676068,305397874,1085283188,895543376,1968750602,-427815934,896592006,1273402032,-351588888,1967171639,1971365892,186705927,
300613808,3948324,876349042,99287671,-1341452824,1139298304,-1833895371,1012419558,-436046848,1913046858,-82706432,-1341459992,-393943508,-353881222,1690917,0,
-16777216,-1073741569,-8388462,255,-16777070,251658495,-16777062,255,-4194158,-16776961,-65382,-16776961,-16777070,234881279,-16777070,-50331393,
-16777070,-33554177,1325400210,255703808,-1157607680,-195,255,415121664,415141632,415153920,415208704,17772032,255724310,17678368,-1071509760,489619246,
571582,800112782,-434272218,-50529148,-50529028,-50529028,-50529028,1095932,537903246,-31103296,260046847,1944764450,787480766,387842319,786825022,185991439,
-1071640770,251658509,-13713374,-1195499218,-1064435704,-527801884,1642465292,-1977170806,113649181,-419495936,783477601,185991439,-1071640642,251658509,-13713374,-1195498194,
-661782496,1692844208,-83886151,44590308,-119405196,-1191145239,1692729343,91554216,-2098595614,-1470045184,1719432456,-1073740089,-1207959552,-1587150613,15451136,-2147474074,
225771520,-949616405,12582918,-350879744,1711336214,-1073740089,1442840576,-949616405,12582918,-342360064,113731072,49152,15426560,444262,192,1711336352,
-1073740089,805306368,-949616405,12582918,-1341915392,-462362957,-1327462799,-2039421261,-434107196,-1340937359,-462362957,-1327462799,-2039421261,-421583676,1095793,-588654450,
17772286,255724310,17678368,-1071509760,690945838,571582,-164374386,-419494714,3717252,1220073614,868257280,1073789439,-1510775044,-1912600392,-956943400,-2065236988,
-1912598344,-23729704,-1341776288,-1199249712,-661782464,6760073,6887052,-2065247824,1946396136,11200771,-2065247568,183022000,-1327461830,973334704,1086050867,-1963723008,
-401558536,-353894247,9281991,855670789,4242386,-125111305,9182858,-402620184,-743389081,683181286,-1898410496,265326272,627490848,2147483646,-356507121,-268386240,
503385902,-726621871,1085834470,-1898410496,-1962907370,-402626778,329376794,-1143852288,-201916352,1962934333,-1876694269,-1979711187,268483320,1946222464,1724026389,12173363,
-50384064,-22285466,281444559,520611563,12239713,-1243890944,-402646087,1358170036,509038931,1619974,113760398,74,1946222464,1277069339,4765696,862371982,
1073789376,1727856435,-805393421,-521419778,1499406087,-1329375141,-1098586499,-1959854112,1149906484,1019225089,-385649600,-270007852,-436162334,254699136,1041307137,230694927,
571408385,-1056249152,146276392,-958886400,-33554426,243303654,1715470338,-1431655749,-1054360150,1915212777,-1229232612,-1109693075,-974536395,1712222759,1431655867,-1052525227,
1931982825,-352145404,-100155826,-1192201798,-1064435640,856686777,-1050755585,12183295,-1050231536,1824384767,779676097,-1912588104,268483032,2076046899,1927479233,268482840,
-4094531,-2129759518,1961917178,-99566065,-336561478,-435965766,10086784,-1912584008,268483008,-1115684673,1525268909,268482872,-373180739,951597137,-1176990208,12455936,
-1043874432,1915661033,268482827,-373173571,74657439,-1075116880,-1912586056,868257496,536918518,-1179782298,-13430784,-373165379,12138526,-1040466672,-1204283927,-661782520,
-2147483458,-960560540,80150020,-33241346,-1191312186,-661782464,856686777,-1037845002,1915639785,268482827,-373150019,91434572,1659438512,571647,12507278,40140800,
-66795841,-956562234,80149508,1015080188,-469076736,1946265736,38567940,1095744,-661733234,1723867151,-475,-1071509633,12744170,17772272,-465692898,1946172544,
-259370175,-402652487,548406702,-1962522904,309719,-1341808152,104458272,-1956228261,-356423981,309520,1510313448,-402651975,548406662,856039144,1292754,-390717253,
-1343748720,-427904799,-423611772,1397801856,1220019793,-1312780800,-1341541118,1566721,-1560248315,280035452,28376501,-1560278808,1493631102,1405311067,-796240558,243844492,
-980549556,637534395,1991,38258470,-50528257,-65041626,-50529028,637598595,1734,-1610058752,-1054212020,948966635,1946176558,1276510214,-1597510912,-1054212020,
-466435842,1560731841,1405311834,1465274961,-1191179589,146735109,-137219328,818053363,-1786181706,1330577555,-1090719774,12517523,768256,-1090738701,12517523,768384,
1583326707,-1017423526,1465012563,1632342,1890781367,-1910767432,48832,365791668,1600054282,-1017423526,-1207558560,-661775360,872202382,49088,-218102599,573099,
-1155792712,-470351856,-2147483643,1149829330,72648706,-1845148474,6227143,-1207955266,280752128,98825984,-763302861,38045952,-972794744,-946731708,-1107294460,-930349008,
1827183283,1621504,-1290010440,6416530,-1207951170,-1833762752,-1107274008,-796131288,1290310323,4242944,-1280311112,4319378,-1207940930,-1833754624,-1107282200,12058704,
-393038912,113639467,-960495532,-2147461370,-1207936834,-1833701376,-1946151192,-1093103928,-1447039949,506112,-202780351,1629423525,-16463933,-1040413953,-272628512,38045956,
-2012971896,1153893724,-1023410170,-393301936,-1062718103,-336002188,-392777697,-527813283,1458083248,7775029,1323866288,-1327461835,893905047,-134186845,-1336884392,893118606,
-863969142,1976109584,-270237693,803770032,1455642677,1526938600,-1174396184,-155516928,1161653,-1023185944,52881494,911451,-1157627718,431601159,56027136,6332867,
1077723172,-2065104012,-1235829248,1962867584,-294797,-620073356,280455796,52741258,1769210684,41157180,-549830473,1673418354,281510070,203736202,1006823616,1011774467,
-2147257342,-549834553,1841183346,281510070,807715978,1006954688,1009939459,-2147257342,-549834553,2008948338,281510070,-1071332214,1007085760,1008104451,-2147126270,74723527,
158588730,-1899459554,485943512,-1944141025,-1093103928,-466452480,-1400897351,-69017598,12193396,-1230324912,-402648903,-18152796,120636191,120588080,120588080,122357536,
119539522,122357583,-151389443,-437654795,-1428826406,-1785027159,-27961706,48981,-372906307,-478087019,1090224320,29308789,-973619968,116950249,-1064384372,-1178220353,
-1014366188,41266930,12196587,-1238123776,-402644039,246415932,204726504,-2045856736,870115552,-3973881,1793720319,-401690620,-527813687,-1024977744,1963042867,550273027,
-1062681462,12193396,-1207780576,-402630983,871039488,208937128,-1155530566,1455011842,32434176,1050358,-1173588735,1488658432,1817016,-1476273176,-1173588976,1941643264,
1620408,-167654424,268473862,-1070462092,1181194,115880308,-476124957,1927522792,-423579593,-475994012,-1343738254,-467045661,1971365984,180367907,1962938886,482076687,
243272308,-401604458,216734924,-1155530566,1438234813,24832000,-1023397656,47712,-1179081285,1776812056,87856385,-1763176076,-1341557494,855894061,58001576,-1207938840,
-661782464,1181382,-87858944,-47963676,856039910,650153664,2367115,604423974,-70826496,3401811,512304731,-1341718492,-1184569760,-1243021313,-1469782840,-503155710,
-431640331,-464469152,-434065312,-1261479904,-2145989376,-143311876,1392513219,-402652741,-1017446398,-397324203,1482227716,-1957510307,156285643,11598492,1088701414,1088741514,
256014,-812645653,-661921658,11598492,1088701414,1088741514,256014,-812645653,-1957568378,1926769611,-338482427,-785674237,1935267979,1522197207,-225983496,-645142138,
79292043,-1175792896,-792854526,-1876563001,-494676853,309507,-339222850,548442135,8751142,-1958237568,178643,-339217730,-436236285,-1342129924,781369486,-950458633,
663749778,640106516,-2147449464,-354269270,-377035009,-695512495,-1190599999,401080322,-494708224,309507,-1342173720,10872864,178522,-1023409688,-147942660,-1832429274,
338137092,1364338496,9037904,-497395368,-1205943320,-661782464,1181382,1364402175,1958790902,4581384,-348066176,818345715,518522996,284065792,1532621803,1393003054,
1526747880,-1007295933,1223167408,-401952768,-1144848317,1156055290,16825088,-1006713368,-402620997,2109407287,-21436416,52476867,-1157616920,-1410858752,-393559042,-388889423,
-1979709720,125125,68101315,1075062672,124967,506819,281874100,-424234813,-432492477,-435834814,207742018,-396237309,1642397298,1642527780,-50383933,-1901068104,
126496448,-2054674877,1202356224,-436210718,-2013213976,167788838,-2096859932,-1023338930,-1979693430,167788838,-2096859932,-1023338930,1074185978,280035072,-771338614,168561888,
646579782,-457179073,-1161557500,-1964112910,9150688,-1173952320,-1058143241,1067451628,974070784,137393348,-83869914,-1862420232,594679245,145849776,173836838,50429568,
2122319988,41223425,-650508879,-645528973,-661920778,-67252760,-189115965,12368131,-322548760,108363944,-2135886110,1038615787,-1472009018,-1966909120,4563196,-804960726,
1693853408,-1596421628,1177157702,1693853191,46334468,704661254,-410385338,66239171,603996064,-804097009,1946462440,-1979469822,-1325383898,182768132,-301462332,-2134511640,
15910,-1175583732,116847652,1971322942,-975509494,-2135624478,-2146571271,2130722342,-400208664,-466475595,1095875,51144439,-763362746,216463872,-997849882,-997849882,
-1031087989,-1047821850,-997849626,-997849626,2123023355,48742407,-402227702,2122975226,133490693,2124844995,-508769620,-1211169031,244060071,-1350502516,-644324200,-2014865497,
-56753433,545267879,679485568,-2121600,-1,1358954495,-1595531088,196092134,-1976608536,-401821472,-1004392623,57950376,-1476391192,-402426848,-816316414,1481297232,
508757699,4241488,116840590,1946222752,-1674673877,1929629696,-1641118941,477298944,196104280,-390077312,645934870,-1577189216,-1064435558,9969291,-2146467802,123412312,
-431968061,4241540,1923209358,1015080448,-16616140,-1276802075,-1107348481,216648481,-431902477,-161356668,-1978653488,-17952,270819812,276087866,-608438558,1685941,
-372554051,-638845517,-2065284432,-1158859930,-1201274880,1,-1178258586,-1030864896,1721696051,-1419325231,-964625950,16417040,-1326943712,-461052349,-435418015,-420273055,
-431706015,49028,113510,862322688,-980719907,-544279414,12187187,-1629058496,-1613508250,-1385761654,-507301018,-1337690640,-461052347,-1329551263,-2128907008,-2129657657,
1914700031,2068670161,-1333466366,-1199249850,-661782464,-13376257,-372515139,-478088547,-1309265137,1943785476,-102611451,-1070401997,-1181740565,-248840188,125173672,149471590,
-1946820026,-431509304,-1932096636,49118,-372500803,-155452508,1161653,-372497731,-18088743,22391296,268960770,-8372192,-426725376,964996,-489937730,773450498,
-1327461716,767092879,-1360490576,1960852013,-426594070,11135364,-2065264208,-426528573,-435900284,-422517240,-1176836595,616431630,-385621300,-1406271335,12245387,571648,
-498929938,12630779,-301987655,-498973970,-427301126,-427694461,-427039102,-1970608503,981984480,-346393148,981722112,-346917436,981591040,-347441724,981656576,-347966012,
982246400,-348490300,982115328,-349014588,982180864,-349538876,-426463232,47748,-335542087,-1002814740,-136177803,-1191132998,-320077816,-1002814910,-152959115,1894370187,
47871,-1179264069,1172832283,-1325470725,-427497835,-1327831539,-435624448,-431968048,-431902709,-431837173,-431771637,-423579637,-431902506,-431836970,-431771434,-426331946,
-90389628,-1293382992,1954588716,-1326060798,749201536,-2102333302,-1976786712,-393957176,-393597799,-389641571,993788103,-997825161,-1047859061,1006680808,-1973913797,-389707048,
389808303,-125153929,-919354485,-1185821562,-503897565,-1185785709,-503906244,-148757575,1507328993,-963915501,-997537654,-453602636,-939269679,-888946637,-779628525,319275651,
-773205560,-773205542,-773205542,-855526182,-1341199590,740550798,-527825908,535334576,1085802028,869830144,650153664,2109067,537315110,-2133975552,-33527002,-31186460,
1018896870,-111351808,7014134,-385649407,-1993933073,-2147475410,-33527002,1344193287,-1912586056,1796112600,548405504,525869286,-1059026225,254018796,-1195177259,-661782464,
1056395,-576986149,-1610608578,-1073086448,-880799371,-390877182,269233057,-1280253814,-399794712,-471277354,1963239645,46396935,199958645,1963115510,-35422202,-2138038037,
-1168900637,-1581580288,5093815,1543095272,-1578828053,-1578705116,-81518108,512303590,-71106544,1448235347,-1957355945,4243180,-494674290,-2131588349,74646780,8166538,
-1802770735,-771031040,-461097868,1239942517,-30676045,-402295348,585872241,91606270,-340552472,1976368665,-1286150139,-855764757,-270006923,-33035341,-402426420,526234667,
1499094623,1187434331,-1031602175,-360453114,1963239430,1946331239,21415527,-300896255,-527766462,-300830646,726330434,838880774,1226738431,-2027278848,-595538023,855800064,
1242467008,83591168,-75483278,-1322093561,-1963854296,-789983032,55478505,-805149048,88508640,-528088143,-522984398,-2147072375,100682046,1724909173,107401474,-301481341,
-1997408573,1720189766,-1979469566,-1981557796,-523106722,-351975800,84083683,50529029,706550788,1178089269,57992202,-1007090311,-2147411991,-142657028,-13443958,528976430,
386332315,-394983424,1509110,605451524,386332287,57934592,-167727127,1073747718,-1712757900,268206080,12060021,-2139690092,292894204,9832182,-2146798590,-50293210,
-342556488,2025851488,66879583,-58696076,-2141359090,1551113468,1966603392,-1777928678,1182011392,9832182,-1207601918,904631808,9840256,1010035709,1007320608,1010138209,
607223163,-1777928673,427033088,-1899393968,-811483199,-1979709511,1487860420,645924725,-1258487658,14805216,1924449273,-705970126,-773095504,-392451394,-915223922,1631382251,
2050802556,539803519,-58672149,-2133429193,276116988,9832182,-2146864126,-50293210,-1041506124,1947204736,772505353,-1688631414,-1070427157,1774096363,-900929381,116819826,
1967128599,-383767424,2133131131,1966472320,-1777928687,175374848,9840256,-341527299,-58683317,-166628068,33592838,645925492,-1258487658,-1875514458,1963981952,-341462011,
-1974431701,-1899393852,899521,1019214992,1487860433,540811892,-58715020,-2146272254,259788540,159146300,92240444,417906738,-2134640384,-185895228,-219418448,454692353,
690497308,892613419,915143223,76087324,909854278,74776706,8402571,1717819,914952564,-386203620,1346705826,-846134600,-71084011,8239952,1492607720,-1979599677,
1317208134,1388511510,-1476380184,-1329374656,-1341985904,677636112,-152546621,106334975,58053130,604301504,1958742543,1996766215,32241667,-389850375,663404074,-1022311178,
48991920,854068912,378258216,-1024065520,-2146274303,158646498,1967192704,-352144888,-352210425,-117394941,-1963160893,-469105050,-524287116,-1895430140,-1008236032,1720384650,
1961101830,81838083,102813942,-410386289,-1598016573,1720320143,1961101830,82362371,-1023406299,-1974316208,115916996,-301729862,-1979675744,-1061149480,-1007287064,201487361,
-1058766847,646504458,1532625035,1223213912,-386173705,-1007895144,1979137768,-1114707717,-1007761526,-2044949722,-1251077,-404161658,1117832191,1958782976,1946724391,-343886844,
1126599201,818214400,-321911692,-990505749,-33262589,-166990908,41189572,48956596,-1144848204,-611450816,-1962897221,-1824554961,-941030539,604473856,115916992,1366605834,
611698942,666174899,332202164,-471305036,67745792,-768409167,57807821,-2147449623,74777852,2071314442,332202164,-1008166988,684032000,-1325135432,-841862399,-2142866669,
74777852,1031127050,2071251966,-349573760,839234487,-855591699,-401099757,28835990,856731908,1930677714,-855591908,-401230829,28835970,856666372,1930677714,1959525926,
-339345850,9485264,1956069248,-402344949,1018822774,-1873155167,1810379956,-1590707712,-1265611029,6350850,-2147446597,108295231,-341764678,146444347,-1875514463,1206387124,
-1594115584,-1987040533,-402616274,594935289,620626152,82362608,-71644930,-32410464,-1593263416,-922875276,1956717242,-1589855741,-1023374104,9485139,175384376,1676158856,
-1894874882,-1017444864,1979563240,-37492623,973400256,-2141621024,192230652,1349780284,1282671676,504358016,-2128674710,-16757186,-2129954833,20030,520319688,-1340129045,
637003827,-64748532,-527776758,-269995088,-38737883,645210280,-863969142,-401690592,12199390,-1179600096,-402630215,250344484,-527813712,606455016,-389773573,1354966466,
-768359797,2025833102,-930305280,1623414955,-1609628130,1622190095,12092646,-1143435748,-1014104000,1763085350,646522368,113705063,100,-2065276496,1961823720,1678672648,
1927876608,-1260132349,-2065276240,8783559,113705088,136,653145064,7487105,259330612,-1560249183,2124480646,8954624,-66973719,102651734,-1014047860,-1912590149,
-978141477,-1191144513,-1510801397,1583292167,-1090510407,-591593212,623634900,-1090510407,-390266488,623438292,-2065275984,1945083368,-429608953,-1878004860,7749249,376635520,
6557313,512426112,512295036,512426102,512295038,-622329736,-1287919438,57982987,-1962809367,-2130676194,-1996455701,-1962903010,-2130674658,-1996455701,-1610579938,-1885208432,
-972901376,16814598,-1962741016,-2130671074,-1996455741,184583710,-2096008000,16802830,6696584,6755977,6885000,-2065275472,7872139,8003209,8265355,8396425,
8793739,8439169,-1577021024,280232079,9569990,44427265,9051787,8920713,292864011,6557315,1848543234,1863747840,1896777728,8954112,-1157365755,506150784,
-1019543411,780875891,771948680,-981401466,-1918828416,8561408,9373382,-1943631105,-1845049856,-857210624,1958742786,1678672657,780665344,378077294,243794031,-1207566223,
-1064435648,-1962901315,-314578747,8436999,9569990,-1258377215,56748032,1946157737,1678672657,780682240,378077290,243794027,-2036268947,67156736,45147127,544522810,
113697418,-402587502,44630835,-2096008192,67134478,6958728,7018121,7147144,184584353,86471872,-470350848,-494268240,9569990,50718721,1946157737,1678672657,
780666880,378077298,243794035,-2002714507,67110144,725582011,989891870,-1608289341,-21757812,9569990,47310849,1946157737,1678672657,780666880,378077298,243794035,
1722810485,512460006,-1993998202,-1962929378,-1342142434,-387741008,-1313856730,535357322,-150949597,-2147458042,-1325239296,-305469439,-2065274960,8797825,242352768,-85412944,
-1971319774,-390876960,45359862,6555383,41222143,-1884290124,-1339890200,-461052312,-434065312,305195108,27813092,1625619060,-863969142,-429871100,468209764,-997566446,
333996262,-419516398,-34868124,-2065274448,-352321349,1789956104,29066470,4241408,378460302,646643817,-397213593,190574874,-385649189,1806696600,12092646,-136802788,
16802822,-401181696,-315428610,6688394,243986827,378208361,921174119,1678178285,1946158080,-253695978,243985714,-242548630,7147146,7018123,-135451160,33580038,
-401181696,-315428670,7212682,243986827,378208369,-85458833,1678178284,1946159104,-257628138,243985714,-242548622,7671434,7542411,-135466520,268461062,-401640448,
12251270,-1243890944,-402646087,116912196,-65436,1877481588,1678178288,1946173440,-14292733,-1062706716,1957692532,-1410824986,-429084435,262737796,1629423521,-662023229,
-2065273424,-661994614,-2065273168,512476042,507052160,645267578,6557313,512426112,512295034,1290272898,-2078373120,-2145502976,-1962642688,-1996455906,-352286178,410292272,
6557313,512295040,686293122,-2078373120,-1977710336,-1877546240,-428887984,512317572,283639938,-2078373120,-1977710336,-1072957440,1543045492,106386371,-2065272656,4990600,
-466434934,12318859,-1841397760,175440128,-1912586056,-389706816,1048832625,1962934402,47116,8652487,-2031550464,-428756992,4765828,1448329358,-1885317801,1275475968,
-402295040,65786930,1572758760,1935367775,1278118410,112640,-2087692821,1476149443,512381777,146341964,872362752,500945344,-492109824,1277070070,47104,1946338294,
16889859,1599691691,9584256,-1207143167,-1064435648,-1023162997,971632872,1996522014,47110,-2138043925,16796678,-1979744535,1342211102,-2065271888,1532954456,1398212291,
-428691376,1285707908,1220235264,-1178366464,-662044664,-1070334157,1956817,997568256,-1977158430,-1469979643,839283904,-335596608,-1960425673,-1469979643,839349440,114624,
1048585963,1962999954,4241423,-980696946,-1962917883,-378279704,1328081752,87172687,642188917,-997579470,378406,780847242,2091909196,-1957133082,8692677,45668235,
-32380160,1994406592,-8722173,1946222397,47352,-1022927013,-99513624,-72504856,45616757,365820048,-1382225670,-126578437,8533563,915080309,914948224,-1006960614,
-99523864,-72515096,1548483,16548035,171781236,-1207601696,585833482,1977617725,470661125,-58713877,-1274776096,-2146440395,259491068,192213052,41279548,-4325200,
855829503,-1007254026,1946221696,1978678278,-1023365118,404654675,616794624,82018419,168158144,-1775859005,216301568,396419082,1019435776,-2141489915,1450640383,1998584704,
1508397393,-2131004143,-285173978,-1341224472,-1184831757,116850687,1963982999,-386407925,-189788554,619405542,9905792,241756399,-524236918,-423425531,-18080,9897718,
-502696688,240183543,1625748656,9905792,-87860801,1848971,1178995849,8533563,915080309,909836416,158597146,1848969,-336019406,-117329917,1011926011,1012888584,
-2073594871,-468290112,213853318,784344192,1673856522,-1976662298,-345783002,1976106606,612819990,612371647,101330624,-2031721532,-1004107218,-27989149,-468945464,209659014,
-1266227648,-29037824,-464554552,-1476348794,-1979354048,1071939808,-2031730636,-2031866389,-1072922844,11831014,-108846613,-2094304767,645346041,721433272,-1975500607,612820192,
612371647,-423359808,-1342116986,1273428626,1946221696,-423327228,-1017578678,1084786404,-2136471435,146015349,1084763627,11805045,976109348,1952695558,771863582,1673791034,
-466479756,721433273,-1270791736,-1274483959,1971365896,-1979534334,-1008454972,-1273574936,-1274514177,1948297216,-1979599870,-1008454972,1612580603,58065468,-2097083671,-326420244,
-1064382324,-41166706,951697459,-1951730944,276598261,-16398554,1170614015,-970555385,637535813,-1845148218,38127398,-970588160,-1916795835,-953804676,654311173,476614,
105236006,1170613760,-796093947,-150990661,-2134572061,805634258,13795328,38111526,72714278,-722937037,-385649920,2089615508,92939824,1077723172,1187383156,-2115436474,
178944,1912649448,1179028089,1567932426,-1961853811,410291678,-1962905368,-2048013,775785262,251659767,640711821,108279295,-16398810,-970586901,-617350139,-1929351192,
-1893322628,1959329285,629155346,179135,1912626152,1179043373,640150274,-1153430144,1239941122,-971279872,-352238010,813468949,-2145547738,108282083,21382854,1187382507,
-998047162,119497016,-54271308,1979659775,74841858,-1190758913,-1510801404,-2096566653,1150224623,71601926,-1895676785,2089665284,1569269272,112898,365791156,276598211,
15855595,136384800,18940961,295763745,44134561,-6225503,-1167934878,-682174644,-555950362,-332403665,60463,253647,253952,11585536,11568358,45385190,
-256312674,-268365825,1894167472,1910767851,141889704,616570895,-1071509521,-1912586056,-1469782824,-1906150140,-436096790,-425021308,-18076,27813092,-119405195,-1332724245,
-461052414,-435965856,-435900284,-536823676,-617359218,1437220737,1002244213,788475614,95477166,12092646,869830344,-1438678565,-1123519147,-13705669,-1327648210,-1199249914,
-661782464,-352321352,-435703794,-426790780,-352261264,-1955470336,-426790696,-352261264,-436162560,167477361,-806812811,-435638075,184254596,1475019637,-423611760,-268388111,
-768354162,-1176665410,-1968439285,-487674672,10533625,-1342175047,183299595,-1341819712,-203231712,1948318339,2144773,11593451,-1595531034,-2065299024,1980496768,838906626,
786682111,-577194101,-1912586056,-1327038504,-1199249910,-661782464,6762239,-2065298512,551952560,212920811,1642366182,1642525476,1894125232,-477488691,-319544135,209045380,
-491721752,1976368886,-1014975249,868417716,268353472,-117077722,-101058055,-117098202,-101058055,-1676758845,449833210,256014,-812645653,309706920,766573212,236633320,
-352320536,617582594,-1070349567,-1668370237,447211770,256014,-812645653,309706920,-1380910436,236623080,-352320536,617582594,-1070349567,-1205929021,-661782464,-1329581210,
-462363085,-1591695247,108265488,3430,-820051712,-1632330060,-542122065,-541007952,192349500,-259267534,-13703471,-1008757596,8857216,1977289455,-2029092859,-1007153152,
1960512082,1662421778,79856384,201352608,6660616,-1961825298,-2097126634,1704985794,-1560861696,1525547109,-15368,-1,-1,-1,-1,-1,
1430346987,1380927572,1094918227,1194539330,859390540,960711236,1112559155,1126777640,1920561263,1952999273,1297040160,542196048,1886220099,1919251573,1919894304,1634889584,
1852795252,943272224,859319346,741619756,942421304,926428214,-382191572,-487925206,686817425,692273960,1866679081,2037411951,1769108089,1751607145,544502888,1329808160,
1347243343,1363231056,1126178897,1836019523,1970303085,1702130805,544371301,1866679072,1886548591,1919905648,1952538994,1869179252,544108143,959525152,842545209,942418994,
741552952,876099628,942418996,741684536,909654060,942418998,741816120,943208492,1093479736,1819044929,1914708076,1734961522,1952999527,544437108,1701999136,1702064997,
1987211877,1684366710,-1339150748,-1333467635,-1337203182,4766242,-402607122,313524252,246434790,-1833925402,581979110,-301970758,99123379,-426594304,12174155,-423392767,
-527766453,2244076,-236840843,1273402032,1273369264,-1179264069,1622999065,-409343519,-3932437,-1,-1,-1469979568,1476556096,-436096817,-435048315,-2135884668,
-5213978,-1578753562,-469695512,-1947979167,-510149152,-1953476373,1926007806,-1933181438,-1898410296,3193024,12374158,-1231831551,-2080321560,-1106742035,-974604637,-2027492608,
309754,45738707,10610688,-494676085,309507,-1342138648,-854674400,-1177406704,-1998061566,-175377408,-13369421,-371068227,-292824005,-661733325,126606131,1642334089,
1642465292,-4983413,280887091,-602019358,1642393227,1642526500,1084776932,-523404,4241637,1049352334,-406780909,47878,-1908408135,-1376557349,1084776932,-1014952843,
-549777408,-1070339466,-208935425,-13380213,-371042627,-359932891,856679296,-804998702,1107653595,-768345630,283508729,653758976,76735083,1983462448,-1274608638,-502215410,
179094508,-1274645312,-351220466,-521616395,237466895,-1900006625,4243392,-1418648415,-1418647903,-1593803585,-1582599896,-1079283414,748749068,782347121,129739633,243712,
-356314931,-268377748,-394218416,96071510,-1390745600,1642396642,-722018166,-468654976,974136417,-1158122016,-5241871,1358687470,9119370,-2147162944,669565156,-435099409,
1484826712,-425676605,233603972,15409636,568770340,-756629454,15401195,-466430746,332255794,-326421134,-661733325,7878340,-1912586056,105301720,122078720,-1962490368,
113677056,-385941440,561253156,192245820,1946885096,-425414632,-1341854844,-1148918107,549042049,47616,-337319960,-425283580,230982532,-1816439869,1392831374,-1978788933,
376957127,74727592,132890674,1793639306,1526900758,501743811,113651215,-394239083,784535290,1670725248,-1172802176,314245120,3193273,518298600,-1912586056,302434008,
-1021378560,-1100993236,-1959854112,76230196,1947140265,-1876497661,-2145246021,-58670876,-401967808,1480334288,867898229,247916594,-1002534866,512241251,-1612160059,-3972850,
67187455,8388608,0,285290752,67266304,8388608,0,285376000,100820736,8388608,0,285370112,134479872,33554432,0,285474560,
100869376,-65536,0,285418752,84064512,8388608,0,285390848,134336000,16777216,0,285343488,84122880,8388608,0,285449216,
251888640,-65536,2048,285442816,84136960,-65536,0,285463552,117677312,8388608,0,285449216,151231744,8388608,2048,285449216,
134374400,16777216,0,285369088,67359744,8388608,0,285463552,0,0,0,0,67265536,0,0,285369344,
84136960,8388608,0,285463552,84133376,8388608,0,285459968,184742400,-65536,2048,285405440,84073728,16777216,0,285400064,
117628160,16777216,0,285400064,67243008,-65536,0,671222784,134454272,-65536,7,285449216,235128320,-65536,2055,285459968,
268682752,-65536,2055,285459968,235142912,-65536,2055,285474560,100876288,-65536,7,553861120,235104256,-65536,2055,872638464,
117757952,-65536,7,570742784,67266304,8388608,0,419587840,134375168,8388608,0,419587840,151226624,8388608,2055,419662080,
134430720,-65536,7,553861120,117687808,-65536,7,570672640,134465024,-65536,7,570672640,151242240,-65536,2055,570672640,
84133376,-65536,7,570672640,268591872,-65536,2055,1057121024,184811264,-65536,2055,553910016,251920128,-65536,2055,570687232,
252075776,-65536,2055,872832768,268697344,-65536,2055,1057226496,67314944,-65536,0,436413696,33760512,-65536,0,436413696,
134409216,-65536,7,553839616,100854784,-65536,7,553839616,84133376,8388608,0,419677696,-588699136,-67106799,7602177,-301989888,
503525425,-52050,106891271,872624143,229,0,0,0,0,0,0,0,707406336,707406378,-412620502,707406378,
-1202708950,-661782464,-419492936,-2069830496,-1978764096,178382048,-1331566908,-341776864,-435441642,-2078219232,-1978895168,1963239648,169993222,-2145261884,74776572,551952560,
7022216,-389079208,-1977221070,584578565,-1998007609,-389873594,580386850,-790572349,638286332,646579504,1720189001,572965633,-1429796291,4793994,-1023318392,1452015411,
1944768770,536919811,-489561391,-489561391,-489555453,-100408623,1048641207,1929773129,-791555836,-153122073,-774796333,-773139990,-2133723414,-942536735,-1144784381,-390529022,
-427773699,1014097008,-502630913,91507700,-335681351,-1703956,-1,-1,-1,-1,-1,-50593793,-1957341666,4243180,-461054322,-672658571,
-234231567,-1377175436,1976368640,172917030,1719861824,-404161014,-385649167,-320339816,-402295311,-286527054,-1089837437,17452675,-33520663,-402295348,2062283215,91606270,
-336449304,1976368753,-26481918,-402295348,1659630209,1963719808,-243472376,-336467480,217874517,1317084021,-2097004534,-386004378,1114960270,-2081304088,-2084631962,-352253362,
234651701,-873986699,-2144605199,91614204,-336435224,-318996447,-1571467,-2145915918,91614716,-336382488,-268664819,1072170357,-2147226637,1583156716,1220071199,-1178563072,
-13426688,1724091238,146320371,-1093104128,80084992,-33241346,-956431162,951647748,869830144,536918518,867038054,536918527,1724091238,-211365641,-1175047253,-1385816064,
-507298970,1711895801,-293349325,-100758780,116844031,-1023147897,654358865,44590308,-1017513248,1922816744,-1712199662,1055395186,-402099555,57843096,-1008325144,-1325409816,
-396040531,-54263854,-1157226912,-611450816,9832182,-467962752,1974156384,-1777434614,645939200,-1333854058,-81730016,-369098819,116785453,1950351510,1012982849,-2132249279,
-1090480602,9834112,386826256,-1336926208,271050766,242565288,518532272,1967171600,388399109,-1336353024,-81730016,-2147371288,-553609690,-369098819,398393573,-8591360,
1625610378,-850414343,48405,548407410,-369418010,-527826743,1967537232,403109397,242550784,1939622120,548469257,-369418010,548405410,-2131025690,125165820,9834112,
-2145654014,125166076,9834112,-2146440447,175439612,1979382912,-1760657400,-346550272,11724926,1574646,-345607160,-227,-1,-1,-1,-1,
1913047039,-384683008,-58657327,-2147126188,125162748,1509110,-2143914744,477382396,1967520896,-1777928697,678756608,1922608872,1392279587,-461103500,250288760,1509110,
-166824696,67114758,645924724,-336134120,-24057853,354846808,1042432,-2063546648,1629423597,-386268043,1355743266,9840256,-1777928451,309592320,-2139102080,91506172,
1948122240,-1775861755,-1017577984,-28776368,1692839600,379634520,-1665734656,-58714252,-33262258,-2146964544,158681852,679004414,-352315742,354826787,-2143128576,91499260,
1966537856,-1777928697,829751808,1964899456,-1777928697,628424960,561570948,504027955,427032598,1348592720,1642527780,201330664,-396237310,1967849480,1642485999,1397801816,
1139146928,-662028060,-125157148,1139146928,-527810332,-528072476,-2116539565,1526799867,1482418806,396382403,82362368,646580004,-461373289,1959016967,-1759084532,101251072,
48758935,1354979328,5433425,645942645,-386989929,-307167870,-4628250,-1761151233,192221184,1877538786,-420171523,-2144867488,-285173978,-1594007064,-390070249,-2147015676,
-134179034,9897480,-4628250,-1761151233,41226240,645986274,1505689751,-95370408,201365408,-1761180096,-79648768,-1195130024,802095104,12524,-16777082,285212671,
-1077337911,-1075003412,-1511137556,1408017900,-946882401,1116627853,508951456,1381390086,-1957670063,-1900006420,2016855256,4241408,113694862,-2080440256,-1963059610,1720320326,
50102278,406592371,138156919,356255350,204215154,-13444982,-13704239,-336838761,1979792391,-455743249,39619110,4202120,1461889,1499159298,123690586,-389063393,
242589996,1923214568,2287625,1317209204,-1329397482,839575046,1961102016,309517,-489684558,-85925318,-890764427,2122367964,678756865,-1156823413,-470351856,-2097003005,
-92274478,-1978567921,-16646018,-1023157454,-2147429757,74584058,67192518,4275840,-2146536448,151011646,-1326971020,1977879260,-1967115481,-1977221050,-2135293108,-136129792,
-930395934,64807656,-1978633277,78119238,162793845,18239107,-393184533,1953825082,1586167602,786682113,-271480949,45091814,182845675,-538379126,-589895452,-402162038,
2123031766,-456071164,-402405757,1179051222,83984000,-873986699,-1608848412,464978059,141869092,1084761015,716636789,-1964725784,-1545076356,99517412,1963051752,506135,
-402636097,-76227629,-324918296,-498662008,-459347726,4269704,184482024,1360970724,280624214,-1900006656,1588392920,1096022,-1911553864,1588392920,-236445863,-396003937,
663396834,1964033270,-2013495283,-327154827,331644931,199763848,-431312668,-18165,-1327757592,-152817148,-1023213466,162792563,1676160747,-1339198208,-1224022526,-468129715,
-1073250678,2114585319,-468916218,-402405757,-964434926,-468916220,-402133373,225771354,18239107,4269704,184445160,-1075264540,6601178,1960518376,-1258692090,-401020032,
129016172,108956398,-387723800,125108471,-1476338456,-1014975296,1317667248,-2065640954,1962950150,1040582683,-1590106112,280518,1962916840,1013982219,-394300048,2054553520,
-388338200,663396638,-167426422,41164996,1334501584,988033540,-2007010111,-1152187321,2145910788,-1208329256,-479401969,-1073250678,2114585319,-480188410,-1969165848,1474823295,
-2132214813,859010304,1552557787,21400073,74711868,343213372,-1600329645,-2146127781,41222908,-667283536,-1014627725,57989899,-388484632,-1062731719,717439156,707406378,
707406378,707406378,707406378,707406378,707406378,1344940586,4241438,243325070,-1333788610,-1205803488,365793537,-1211148257,-488314872,-352320839,4366851,-488452120,
4366584,28899523,1930808720,1040643595,460619776,485221426,-1191181125,-1070383863,4065014,-401771136,-186474428,-387156661,-2135631317,4073088,-1008465281,707406378,
707406378,-550884822,251798786,-162201829,-823588849,1256605191,-1209646395,-495392765,-1008565784,-1912600392,48856,-956431162,80150020,-33241346,-1912588104,536918488,
-211356109,4765869,862371982,-1174457408,-211410944,-1704021,-1,-1,-1,352092415,-58718350,-1271695937,-326370284,-1912586050,269912798,820150272,
-2135424834,58011898,-1951399746,-1912577258,-1950054714,-2117826832,-788463642,-1795215642,-756430235,503774146,1398167381,-347057583,-1150879564,1,1727596523,-325,
-125067265,862367078,-1760922173,-741251426,-336007198,82739977,-1948742810,-436209154,-1,170731576,471402015,117835522,0,173690993,471402015,117835522,
0,170731576,1885603455,117833986,0,257052769,421070361,202050818,0,170731576,471402015,117835522,0,173690993,421070361,202050818,
0,170731576,1885603455,117833986,0,257052769,421070361,202050818,0,0,0,0,1342578261,1448235347,-421482409,12319876,
-536823808,1438177422,408490,856651008,-386518071,108331275,-338064567,-491745203,12092646,-1193767232,104573525,980746240,1962999528,-1964166603,-1056964082,-4716063,
1960328191,1002646309,-2095091007,-477950013,-18192,-1053048021,12456050,12707840,-372176779,-402611480,166199315,7661569,1593895400,1532582494,1562314584,-169337149,
47104,-930299762,1086314638,93005312,-2089737053,-1960443193,1898357509,-2130383935,652214467,2092899721,93005312,-2089736029,-1960443193,1898619653,-1088583386,-1960443636,
1898750725,637716355,782435723,495527537,-2065243216,-1964166625,-1056964082,-473888287,-1009188092,1946221443,-1014936801,-478081025,-339611648,1095692,12174123,-1077834000,
-1960378400,92808765,7006403,12121651,-1950314784,-1964166405,-1056964082,-1510799135,1381060803,44880435,-2063867184,1482250962,1443241667,12144983,851545792,243934957,
-507445246,384402185,-913507957,700373390,244192,1599711219,-1021376674,1727837011,-1677306544,-1107348486,-2132151635,1560780235,844847206,-1286355996,1407511550,-538181709,
-1275058712,605058303,1006744588,-1274514420,1963239426,-1979665406,-1008454972,2011757136,-425479946,-1017578652,-160634630,1692839344,27813092,1625556084,1541994219,-425348874,
-162207644,655407441,27813092,1952053985,1348527106,-163518308,1692839600,256014,-812645653,-1195115688,-661782464,-2065256272,1973600306,9347584,-1174374494,1437598194,
-322948370,108287292,-2065256016,243273195,-402587509,57802980,-1342175768,-1014700360,29157382,-1297083021,-1833204506,2013625,-402652998,-739715876,-1339299071,864347827,
650153664,17055428,468222130,1967030272,309461504,-2065255248,-1064386509,406766630,-394153471,-1022951422,45286839,-1267068231,1930677520,-138784239,-1470436351,-2145880704,
259293436,279446763,568857205,-18816356,-19302965,-388794929,1558905130,332204468,297071986,1299321805,93005394,-1979710931,-1060336920,-914356511,216301569,-1979456320,
-804628268,41257510,28888830,1930677508,184320027,-58714508,-2146339823,208933116,287621514,225710396,-554974722,-1275067975,1930677516,11790340,-1901018119,-1476018968,
-1341492160,-1316690249,-1712719616,-393039872,-1073085015,-661983884,-1064380276,-1950338274,-1965519160,82362563,255593844,-1716517515,-33191704,-1245118783,98956816,-1543838719,
244056324,-125107962,58556462,637957550,7802496,616794625,1007514639,-1341819633,89647258,-1040267010,17163766,18392036,18484876,-2144405365,1974338429,243279366,
-1593704329,10682444,5153025,-956235101,302009350,1309576238,-670644480,-1942797567,-83764722,243857439,-1329397643,-1148918091,-1024018110,-1157401599,330938709,47616,
-1009561624,-2065254736,-155615813,108331458,-1157613080,364493160,47616,-1009568792,-402638104,-138805180,3980033,-319544135,208961704,-493176856,-260748298,183206068,
-335416902,57934140,-1007083340,-393301766,135005353,-1901010806,-83581464,606201027,-467540229,-423680863,12108705,66501120,-301682450,-1332054040,-792465920,-1021587429,
-803483422,-1593879525,-1524903787,-790001666,-803483621,1468705051,1696321775,1106791920,971790840,788027879,552588008,1860629242,1409242110,-940530433,-1761607441,-803463350,
-803483621,-803461093,-803483621,-133957605,2013510658,335706115,18093076,503382273,-1342161408,-1199249872,-1064435648,1253003,871183194,536919744,-980484301,-209715015,
12943787,1928215312,1085821679,-1983869440,855642910,-1077899584,1354301568,-1094153216,-1523649077,871948971,-1077899584,146342272,47104,-52253781,-2065288784,-1064386509,
-1074414658,146342336,784894976,-69031003,-2065288528,-1074431042,548995072,784894976,-69031003,8306519,-1993949133,867196677,1085834470,-1160212992,-2132536832,41235516,
378130570,883949682,-1867217690,855645881,-1965935653,56879300,-637284214,-203242242,1458089904,-1328510461,55568558,-751046518,-1901063564,201540840,-1327461824,54585486,
-2065287760,-2065287504,-1946156869,-1329557800,-1098586568,12580301,178432,1116908846,-12784574,-947910796,-1840625150,-1326587221,-1098586567,146798033,243968,-325931730,
-1964060426,-1002771232,-947911307,-492072384,-432361237,-170410364,-1191151425,787677190,1976141221,4241657,512350350,1001390096,-1427602202,-2029092720,-1901063168,-1476215576,
-1341098688,45344941,125044136,8857216,-1156453381,-1909540284,-1293416889,-2147126041,-83851482,8652486,-392908776,807666317,508616842,-2065280336,530778344,-2146470824,
57934076,-1330378776,-393943469,-1195138295,-661782464,1924301544,1963277321,-2027519995,-71042304,1448235347,4242206,-494675058,-1963816189,-788498276,143952870,1959922432,
-461090697,-855766156,-855750284,-346530956,-347935129,-335484160,679016484,-1862354864,1477823992,616108402,-1744639756,2029528300,-17374701,-336628277,-335484160,75036708,
770375948,472181826,15401228,619577579,1108339484,-351752126,96202240,-817567744,15401996,1257111787,15417930,619446507,-1974979336,-410363656,1499094559,-12453,
-1205928961,-661782464,520098721,-416945713,707406378,707406378,2147254527,-58700682,-2145946432,1114870524,-2114417833,-1048641305,-13760529,-336034667,-1084780537,-336883200,
182879,-121308990,-1587939130,-121069095,-1563188594,-1532451687,-121702210,-121702210,-121702210,-120784694,-58677884,-117148337,-83885366,-889616716,855310338,1600111588,
-152311573,-219417365,-286527253,-466460833,113542095,263257339,11568358,-944077338,-614733585,-1976640882,-1184656106,-1269759997,-1156330240,28933120,33667072,1935217613,
-1326718385,-2138773829,661946618,-353890640,1967171584,-1143305186,-611450816,7679626,-318055794,145231220,-1162868363,-2135259930,515435264,-1912586056,306086104,1948188672,
16377861,263493867,-466480947,416092365,1971372790,102653980,131680488,126574879,-1962931783,1974465531,-1820934624,-352271896,867193598,-2098667382,-2030361600,8448196,
-21003942,1974097153,-1243158358,-2065253200,1085808224,-2133291520,4670,-92262540,-1155370112,-2128184320,2033387903,246421365,-1476376344,-167283212,134256390,113641332,
-352321518,7727112,300507423,-1759084289,263517952,-466480947,1629425869,8126698,855344640,-1948003841,-1996468073,243991126,1317601376,4638468,-423428096,-1015946128,
-997560090,-121409050,112742,132841472,-21469447,1728053247,-791583061,-436209182,-83442557,-393007682,11796486,432871117,1017917180,-402295772,-169095525,-85118013,
-72362264,-1813452661,-208944180,1711284665,209037299,-1946978998,1724419059,125085683,-2096828541,-457490,-27,65535,0,-2122448896,-1715633755,-8487295,
-406585381,-26444033,947715838,940572688,947715708,2084044816,2097086008,269515832,2097052728,31800,406600728,-65536,-406600729,1006698495,1715618406,-1006698436,
-1715618407,118489027,-859013873,1715239116,406611558,859773054,1882206271,1669325040,1734566783,1520025830,1021830972,-528443046,-520552712,235012224,239009342,1008205826,
2115508350,1717966908,6710886,-612433818,454786011,1665007643,946629688,30924,2122186752,1008205950,1014896766,1008271128,404232318,404226072,1014896664,402653208,
403504652,805306368,811662944,0,-20922176,603979776,610729830,402653184,-33220,-16777216,406617855,0,0,2016411648,3158136,1819017264,
108,1819017216,1828613374,2083520620,-133400384,-973078480,1714428108,1815609542,-857967048,1616904310,192,806879232,811622496,811597848,806885400,1711276128,
1715273532,805306368,808516656,0,805306368,24624,64512,0,805306368,201719856,-1067438056,-964951936,-420028722,1882194044,808464432,-864550660,
-866109428,-864550660,-871614452,1008468088,218025068,-1057226722,-871625480,1614282872,-858982208,-855900040,808458252,-864550864,-859014964,-864550792,403471564,805306480,
805306416,805306416,805306416,806903856,811647072,24,-67108612,811597824,806882328,-864550816,3151884,-964952016,-1059135778,2016411768,-855847732,1727791308,
1717992550,1715208444,1723908288,1828192316,1818650214,1660813560,1651013736,1660813566,1617459304,1715208432,1724825792,-859045826,-858981172,813170892,808464432,203292792,
-859042804,1726349432,1718384748,1626341606,1717723232,-289013506,-958988546,-423231290,-959521034,1815609542,1824966342,1727791160,1616936038,-864550672,2027736268,1727791132,
1718385766,-864550682,-870551328,-1258553224,808464432,-859045768,-858993460,-859045636,2026687692,-960102352,-285288762,-960102202,1815623788,-859045690,808483020,-956432264,
1714559116,1618477310,1616928864,1623195768,101455920,410517506,404232216,940572792,50796,0,0,808517376,24,0,-864285576,1625292918,
1717992544,220,-859779976,203161720,-859014132,118,-1057174408,1815609464,1616965728,240,2093796470,1625356300,1717991020,3145958,808464496,786552,
-871625716,1625323724,1819831398,812646630,808464432,120,-687931700,198,-858993416,204,-858993544,120,2087085788,61536,2093796470,7692,
1617327836,240,209240188,806355192,875573372,24,-858993460,118,2026687692,48,-16853306,108,1815637190,198,2093796556,63500,
1680906492,807141628,808509488,404226076,404226072,819986456,808459312,-596246304,0,268435456,-960074696,1408958718,-13443958,523137,-472840329,-2052587730,
1541681918,-660816689,480048028,1906134941,-258102883,645988253,-839909313,-434065380,525883936,1380982479,-1912586056,1812398040,-16485120,-2097123834,402681406,-1330113675,
1812343552,-1559595776,1856176236,1889681408,4235264,527826748,4130550,-468159481,1954588806,1950394386,-432069618,-426594170,-996135349,-28645789,1962950670,-1173573474,
-152173582,117456646,-2031842188,-2039119704,-2106244952,-2031697908,1273402032,-34839,-369098753,-6117,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-805306369,-768401824,399311540,1954596086,4242258,28367758,16778886,1131675964,-1280972549,281874356,-1269699446,1494273283,
-1261292718,-1273967358,-401552120,393393044,-717569282,-2132218510,839676595,-2134442286,-546170370,447967976,45374153,-1996877619,520159246,1386008417,-99844934,-527801884,
-461318922,610395152,1977629200,-285232904,1526211820,-15459,-1,-1623004673,471276559,541995335,1329804080,1363234893,14530282,791949552,942617649,503062585]
}# # Steps to produce a binary ROM from a JSON-encoded ROM, and then disassemble and re-assemble it. # all: 1989-04-14-test.rom 1989-04-14.rom: 1989-04-14.json node ../../../../../../modules/filedump/bin/filedump --file=1989-04-14.json --output=1989-04-14.rom --format=rom 1989-04-14-test.nasm: 1989-04-14.rom ndisasm -o0x8000 1989-04-14.rom > 1989-04-14-test.nasm node ../../../../../../modules/textout/bin/textout --file=1989-04-14-test.nasm --nasm > temp.nasm mv temp.nasm 1989-04-14-test.nasm 1989-04-14-test.rom: 1989-04-14-test.nasm nasm -f bin 1989-04-14-test.nasm -l 1989-04-14-test.lst -o 1989-04-14-test.rom
Compaq DeskPro 386 ROMs --- The oldest Compaq DeskPro 386 ROM I have is a Rev J.4 ROM from a "Version 2" motherboard designed in 1987 and released in 1988.  Thanks to folks on the [Vintage Computer](http://www.vintage-computer.com/) forums, I also have a Rev N.1 ROM from 1989. However, I'm still on the lookout for any "Version 1" motherboards from 1986, so that I can obtain dumps of Compaq's ROMs for their earliest 80386-based systems. ### System ROM Locations on COMPAQ DESKPRO 386 System Board Version 2 (Assembly No. 000558-001) U13 (EVEN) U15 (ODD) ### System ROM Revisions Rev Even ROM # Odd ROM # Size Date --- ---------- ---------- ---- ---- E 108285-001 108284-001 F 108328-001 108327-001 G 108328-002 108327-002 H.8 113270-008 113269-008 J.4 109592-001 109591-001 32Kb 1988-01-28 (from a 386/16 motherboard) K.2 109592-003 109591-003 32Kb 1988-05-10 (from a 386/25 motherboard) M.1 109592-004 109591-004 N.1 109592-005 109591-005 32Kb 1989-04-14 [1988-01-28.json](1988-01-28/1988-01-28.json) was created with the following [FileDump](/modules/filedump/) command: cd 1988-01-28 filedump --file=109592-001.hex --merge=109591-001.hex --output=1988-01-28.json For a more human-readable dump, use the `--comments` option: filedump --file=109592-001.hex --merge=109591-001.hex --output=1988-01-28.dump --comments And for those who want a binary file, the FileDump API can be used to recreate binary data from JSON data: > [http://www.pcjs.org/api/v1/dump?file=http://www.pcjs.org/devices/pc/bios/compaq/deskpro386/1988-01-28/1988-01-28.json&format=rom](http://www.pcjs.org/api/v1/dump?file=http://www.pcjs.org/devices/pc/bios/compaq/deskpro386/1988-01-28/1988-01-28.json&format=rom) Similarly, [1989-04-14.json](1989-04-14/1989-04-14.json) was generated by first creating [1989-04-14.rom](http://www.pcjs.org/api/v1/dump?file=http://www.pcjs.org/devices/pc/bios/compaq/deskpro386/1989-04-14/1989-04-14.json&format=rom) from the two 16Kb BIN files provided by [Al Kossow](http://www.vintage-computer.com/vcforum/member.php?2256-Al-Kossow): cd 1989-04-14 filedump --file=static/109592-005.U11.bin --merge=static/109591-005.U13.bin --output=static/1989-04-14.rom --format=rom filedump --file=static/1989-04-14.rom --output=1989-04-14.json Dumping the ROMs --- The *.hex* files for the 1988-01-28 DeskPro ROM were produced by running [eeprom_read](http://github.com/phooky/PROM/blob/master/tools/eeprom_read/eeprom_read.pde) on a [chipKIT Uno32](http://www.digilentinc.com/Products/Detail.cfm?NavPath=2,892,893&Prod=CHIPKIT-UNO32) Arduino-compatible prototyping board, and capturing the serial port output on my MacBook Pro -- as outlined in "[Stick a Straw in Its Brain and Suck: How to Read a ROM](http://www.nycresistor.com/2012/07/07/stick-a-straw-in-its-brain-and-suck-how-to-read-a-rom/)" by [NYC Resistor](http://www.nycresistor.com/) contributor [phooky](http://www.nycresistor.com/author/phooky/). The DeskPro 386 ROMs were P27128A-2 chips, so I wired my Uno32 based on this [27128A](/pubs/pc/datasheets/static/27128A.pdf) datasheet -- the closest match I could find online.  On my first dump attempt, every ROM address returned 0xFF. After looking at the 27128A datasheet more closely, I noticed the DEVICE OPERATION table indicated that, for a READ operation, /CE and /OE pins should be connected to INPUT LOW VOLTAGE, while the /PGM should be connected to INPUT HIGH VOLTAGE. So I wired pin 27 (/PGM) to +5V instead of GND, and the dump worked perfectly. The NYC Resistor article implied that every *active low* pin should be connected to GND, but apparently there are exceptions to that general rule. Recreating ROM Source Code --- In the current directory, an original ROM can be regenerated from the JSON-encoded file: cd 1988-01-28 node ../../../../../../modules/filedump/bin/filedump --file=1988-01-28.json --output=1988-01-28.rom --format=rom The ROM can then be fed into NDISASM, the disassembler included with NASM: ndisasm -o0x8000 -se105h -se05ah -se6ffh -sf025h -sf8aah 1988-01-28.rom > 1988-01-28.nasm The `-o0x8000` argument is required to "org" the file at the proper starting address, but the `-s` arguments are optional; they simply establish a few sync points within the ROM image that save a little cleanup effort, by preventing disassembly in the middle of instructions. Next, the PCjs [TextOut](/modules/textout/lib/) command, with the *--nasm* option, prepares the code for reassembly: node ../../../../../../modules/textout/bin/textout --file=1988-01-28.nasm --nasm > temp.nasm mv temp.nasm 1988-01-28.nasm The result, [1988-01-28.nasm](1988-01-28/1988-01-28.nasm), after a small amount of manual cleanup, can now be successfully reassembled: nasm -f bin 1988-01-28.nasm -l 1988-01-28.lst -o 1988-01-28.rom However, it does NOT produce a binary identical to the original ROM, in part because of instruction ambiguities (ie, instructions that can be assembled multiple ways). It's possible the reassembled ROM may still work, but more research is required. One interesting section of the Compaq DeskPro ROM is this string at offset 0xE002: db 'AUTHORS CAB93GLB93RWS93DJC93NPB(C)Copyright COMPAQ Computer Corporation 1982,83,84,85,86' which appears to list the initials of 5 authors: **CAB**, **GLB**, **RWS**, **DJC**, and **NPB**. The meaning of the "93" sequences is unknown; they may have simply been a form of obfuscation.
{"data":[
-2065284944,-1912586056,7512536,876380390,-436272523,1102112139,1642366182,270848246,-4595574,610395391,1959016976,-1141448176,414823662,-2143568640,-347608855,-431836967,
536919684,-768348877,855638456,-2147436091,-13385074,-1412378210,-964625438,1926642448,-431771412,207742084,-352261364,610395648,-352261133,-1335761408,-2021333436,-1143852034,
-583860223,-628177525,12187187,-741237120,843492511,1979113923,-431640529,-1469979516,1962979520,1189007651,-1314987917,-2133601528,-683994938,-142094222,-1333036467,-1199249850,
-661782464,-436212597,1202768011,-695499546,12574348,-2133082880,-1153045271,297383212,-2132296448,-347652375,-1340186370,-1199249803,-661782464,6760073,6887052,-1342177095,
1367664246,1497410024,-914356620,-1872827647,-2065270864,-388287663,190382188,-2147060517,32178889,-423523696,168211584,-1274907447,-428298233,497871236,-2065270352,-1878594568,
-2065270096,4241657,378460302,646643817,57802855,-460314133,-154629504,225706689,-1157627718,448378094,1174792192,29488884,12193140,-1259422976,-402646343,-1326168589,
528803451,-779304095,13489291,1946157117,20113667,20775373,-385649664,46989608,1946157629,18802947,212428,367592308,1023724801,57933828,-855569431,343301,
32047988,1023855873,57933830,-855574551,474375,-303496332,1023986944,57933832,-855579671,605449,-639040652,1024118016,57933834,-855584791,736523,-974584972,
1024249088,57933836,-855589911,867597,-1310129292,1024380160,57933838,-855595031,998671,-1645673612,1024511232,57933840,-855600151,1129745,-1981217932,1024642304,
57933842,-855605271,1260819,1995113332,1024773520,57933844,-846172949,1391893,1659569012,1024904592,57933846,-846178069,1522967,1324024692,1025035664,57933848,
-846183189,1654041,988480372,1025166736,57933850,-846188309,1785115,652936052,1025297808,57933852,-846193429,1916189,317391732,1025428880,57933854,-846198549,
2047263,-880737164,-779223038,-1195122037,-1194393600,-1194393599,-1194393598,-1194393597,-1194393596,-1194393595,-1194393594,-1194393593,-1194393592,-1194393591,-1194393590,-1194393589,
-1194393588,-1194393587,-1194393586,-1194393585,-1194393584,-1194393583,-1194393582,-1194393581,-1194393580,-1194393579,-1194393578,-1194393577,-1194393576,-1194393575,-1194393574,-1194393573,
-1194393572,-1194393571,-1194393570,-808517601,12418,-754974586,12418,-687865722,12418,-620756858,12418,-553647994,12418,-486539130,12418,-419430266,
12418,-352321402,12418,-285212538,12418,-218103674,12418,-150994810,12418,-83885946,12418,-16777082,12418,50331782,12419,117440646,
12419,184549510,12419,251658374,12419,318767238,12419,385876102,12419,452984966,12419,520093830,12419,587202694,12419,654311558,
12419,721420422,12419,788529286,12419,855638150,12419,922747014,12419,989855878,12419,1056964742,12419,1124073606,12419,1191182470,
12419,1258291334,12419,-402653050,125126129,1964413416,-401347727,1786003197,4800128,-2146995198,50350398,-13411211,1958725518,4622848,158597180,1249182012,
-336534344,-257640445,1946499878,1169418301,921174901,-1409614848,-72628084,-1979685472,-1962908122,-1191156970,-2132279284,32815965,-2092857880,1704985794,263515648,62132429,
45355213,28577997,1354961101,-1169010349,-1964239930,61931622,-461314862,183968776,-617419068,91556008,-350913048,363784195,1482381658,1648265923,1946631168,1946696793,
1946827841,1947024472,112965,281873076,281871284,372949758,443875402,-956378574,1964637824,-1261502959,-1273967358,1393609992,1005124746,45374208,646582477,1720189001,
62178049,-771092275,-889261964,62187755,-768470835,-189013781,1118562305,-855395133,419332112,-956431244,146066667,-58060595,1048597073,1946615881,1228832777,41288448,
28836023,-1228328186,1242991128,281889280,-37529254,4857482,973231755,-1979419949,-154468653,208929220,-181745017,-554249942,82565878,-785713878,-1023490306,1948696552,
1228832801,678560256,4800128,1343452931,1662421842,79856384,604005792,1482354423,1048579819,1912864841,1228832775,2088044288,-366220405,16770433,-125049391,-470366838,
-1056707278,100917457,-1936261042,-1948348730,-136055056,1946222790,-136775932,65065437,-1073047865,-969272204,-265678733,-1510749558,-50072317,-193605890,-410324854,-896917328,
-50091021,-160051458,-1912586056,640608472,1048582516,1912733769,1228832786,192348928,6493835,-1610300797,-1007812507,4800128,-805014778,-1109208863,-1957560240,851806968,
1085970669,65206017,1309017025,-259287296,21019288,45474551,4789898,1916861056,-150686462,1946222790,-136775913,-255360547,1090158624,-947846030,-92258304,1191277318,
-1030961405,1519835790,182422355,976778432,708080582,-422555408,-963909936,1372228177,-259265230,-1527514229,536872281,536920961,-344601090,-2128609499,1495269347,-586955517,
-663367938,-789542312,1491521766,-1974352758,-315469366,-1426850933,12812633,1976434208,-1867280,-586983137,-495595778,-1959898685,776357388,91497530,-336005150,-1976678907,
-1017513724,850467839,917877939,-1330005833,-1995915987,1919252337,1769306484,1566273647,1935802125,1751606884,-1150522518,1560273063,1986230394,-1402114462,721399726,469704959,
606289953,707157541,727656744,724744,2098952986,975637788,2116624936,1010007083,1060453940,943136825,892611897,842083126,221130803,1232553728,1299401604,1366642548,
1250773110,1318014094,1385255056,110318482,203294464,454760991,722082845,1191184924,1234716823,1302023065,1352617885,1386303904,10703778,33641898,537921540,16744512,
-2065264464,-1107292487,48400371,-1406262037,-1884233590,-1335333144,1751181455,-361439174,-2065263952,-1157627718,448378094,1061283840,-1850671381,-1329363738,-343611757,-1342117120,
-435624444,-352261168,-436147456,-337975795,-352261376,964864,-494406722,16247043,-645157842,-1191182150,-336723960,-352261376,15461888,15401195,-1158684094,146342080,
15461888,15401195,-352261138,1107356416,-420552126,-352261241,-436147456,-352261245,-436147456,-352261247,-436147456,-352261246,-436147456,-352261237,-436147456,-352261239,
-436147456,-352261238,-1979651328,981984480,-344558140,981722112,-345082428,981591040,-345606716,981656576,-346131004,982246400,-346655292,982115328,-347179580,982180864,
-347703868,-426463232,-352261244,47616,-335542087,15401195,-336854805,-352261376,-1002814976,-337501323,-1191132998,-336855032,-352261376,15461376,15401195,-1002814910,
-354285707,317311883,47871,-1179324741,484966426,-1325470914,-343611755,-352261376,8436224,280559792,-498930176,-435296516,-1342116902,-436147456,-338631160,-1342117120,
-351541696,-1342117120,-351541695,-1342117120,-351541694,-1342117120,-351541693,-1342117120,-338237760,-1342117120,-338237887,-1342117120,-338237886,-1342117120,-338237885,-1342117120,
-1014700394,-393563910,-2136447310,-335871116,-394219277,-259365210,-1612152144,-1329034650,1721297028,-1963202422,14084294,1702312764,-259275642,-907492982,2000370688,-1965520296,
12511429,1299650364,-1014237046,-863581901,572766545,1486086647,3979602,599384567,65140514,-787260968,-930429301,-1833646966,-506338058,-1070348285,-804009213,-1031548537,
-775417081,-774188567,-774188567,-1260727831,-350565119,-393302002,67921442,-1901010806,107356904,-1912586056,-1900006440,780871360,-953810912,-1358946298,1797685386,568655360,
15466020,568721643,-402637637,116800426,1962999915,47630,-1179324741,-790101990,654240572,2109065,7022208,516098046,4241488,243325070,-1342111637,1478551072,
-527773921,604302528,-1022700273,-1912586056,270437336,-1679566080,1064669,167776416,-2145815104,-464518453,-337697631,-436147456,606200993,-352261125,1478616576,1056393,
-430919485,4241540,1370544270,-1901034266,-1469748760,-1274710848,-1878332417,1541969072,-1976556443,-1340190496,-393943470,1478452930,516096372,1256738822,856454200,-1077899584,
-953810828,-2131696635,-822079450,1052288,-1342131152,-2146382585,-822079450,1052288,-1342131168,-401552125,123207851,-430657505,-1955086972,604060137,568873024,494098432,
1076154614,-430591920,300439684,-1341230336,-393943466,619199553,1008855100,1320862659,-2082829384,-1073082429,-746110859,280297904,1947270272,-1258049520,553418784,1172834164,
-1258049536,270958624,772329216,1397751824,105352750,1530361064,-117279656,1471172803,-1269267226,856739072,-2141994048,57946364,-2147478552,805310478,1200500315,927721478,
-646707280,-1901018119,207909352,-1327461856,1685186702,-430395197,-1155592572,1504753742,1200522470,925100038,1877672820,-430264176,-2130595708,1963178047,-1962823678,1538321943,
-768375578,1334574899,851938061,-33391676,-1430113600,-13372446,-1962061941,2076455623,851508738,-203313470,-226491019,-1328187905,-1669011876,-376669507,-919399321,-1274914934,
356902926,-1340836707,1401218653,856184715,206539465,-401973365,-1336198441,-2088442274,-75427901,57915500,-1325435927,-1014700449,1692844208,-335544391,-352261376,-1469783040,
-503024638,-1190401038,1692729343,276103592,901511394,1948086,-376643907,-18138299,-436248348,1867385357,2035494254,1835365491,1936286752,1919885419,1936286752,1919230059,
225603442,1885696522,1701011820,1684955424,1920234272,543517545,544829025,544826731,1852139639,1634038304,168655204,906628388,1143812656,1701540713,543519860,1953460034,
1667584544,543453807,1869771333,604638578,-1205971376,-661782464,-402652232,1579096164,1011928920,1946448385,-1312597995,1661069312,-1168967819,1525426118,-930463964,-253170709,
-2146142878,41304057,-1169014863,-1047910458,-1336386834,1490283264,-347045712,-52,-1,-1,-1,-1,12849898,527427824,359924136,-1979594520,
527886375,856679144,66566848,1954588908,-2130267125,71246,4269704,524806339,74777000,1626072114,1962920680,26732635,1947207670,-2144892401,58038268,-2147236736,
300618732,-1273060888,1946369159,1007137800,-1274907644,-400062367,770187040,88508944,88524368,1613424642,345798,1482695656,-1274722680,66566662,1954588908,-2004831230,
-2130689754,71246,-385928253,125108111,1971373302,855149380,4623076,158467388,1317077428,-352321258,1958742576,1016312866,-1273990143,1946303604,1008055313,-1274317821,
-1341658217,512419841,28313067,-400658200,663224565,-1960926232,-353844281,-400061952,-990503272,-402426608,-389873663,126484697,-16627832,1183449206,1999059973,260761630,
-1275018008,-400062367,112205424,67192518,16795334,1578690640,-396135336,-1494741140,-2013088768,508749863,1187382960,1187382273,-397410048,1951948282,256829492,-1275033368,
-400062329,78650932,67192518,16795334,1574758480,-2128317352,71246,-1979684632,663224935,-1977740312,-352304858,492824607,1726483573,1963211805,-2146978811,-1092090900,
331644957,-2013249304,502196263,149446,838878863,376897472,-1070414947,-2147064182,158466812,1317077428,-352321258,-402607079,118095893,28577908,41226408,119804676,
41157420,868418228,106859227,9487233,-95203133,1139146928,15401195,-662028060,1088684267,11597962,15418342,1088684267,15458442,-528072476,-2082985133,1985685755,
1482423269,32946883,-387014480,132670908,-425152407,-189072508,-33690621,-33686019,168764668,-352095040,-326922170,871140109,-992440640,-1207928778,-661782464,4196038,
239528191,411334,476870,-973045528,-402586042,1187381369,904396805,-424693666,66239108,-2131882832,-268419290,856540291,-1948742720,-1877079352,-33393664,-1858204987,
-33393664,1961691845,-1060241908,-847247643,271452161,1994979840,1967171612,473425968,-390012790,266633220,225762058,-1897341818,-1828293376,1946192104,475260948,-863969142,
-1165053920,-1410858896,-423327213,-3933327,128976246,-1273201688,480176275,-956372760,1187381255,-1444401147,88524381,1570957320,-1243085641,108956188,-1189302296,1172875371,
-503024371,-399250439,-1460863289,-2146732784,1946158462,89062950,129291243,2122318256,91553797,-350480152,-1332497401,472049665,-1996581656,474146855,-1879506453,1019413830,
1007318016,-1341885183,-1341985901,-1008715257,-2065265744,15401195,1913285096,1963277339,47632,-1179267653,1357381679,14870582,1946172611,14346246,-1342133783,-1333467514,
-1184831745,-397343768,-463915803,1963042916,-369892859,15401125,15401195,-96706332,-488503948,-1342139159,-1182472569,1692668808,175440296,884467793,-336338343,-2001694594,
1625588966,57977404,-1332716821,-1333467511,-1184569682,15466495,15401195,44590308,-220068492,-1181729045,1692663818,158663080,880535633,-336338343,-427118554,-352261244,
1348527104,15401195,1692839344,15401195,1692664043,-193658200,906553432,-1332738325,-1014700403,-1912586056,302940376,12254976,-1241728256,-402647623,-1195166345,-661782464,
1183360,47871,-1179250245,1625817124,-1364147403,-4627226,-352261121,-469701888,1946331236,-1158487536,901447680,2079158,-348832024,-2135899138,-1380940570,15426790,
15401195,44590308,15463541,15401195,27813092,15403124,1625555179,-2119111445,15434982,-1431306005,15426790,15401195,-349761351,-352261376,-1469783040,1359574273,
1496558824,250342882,-2065268048,15401195,1430020324,-2085612940,12223718,-1237992704,-402645063,-18139957,-2065267536,1692819632,15401195,1692664043,-193658200,15424944,
-1966907162,243213508,-792766713,571795,-127947022,-152501388,268483328,-469056557,-738762631,1975057536,-1777928664,326369792,9840256,-1775861513,116849920,1946288152,
-2143425733,-50325466,9832182,-349342712,-1644396497,116794997,1946288278,-1775861741,645987072,-151191402,16783366,283840116,1582720,-1777928450,74777600,1515041,
-58670087,-165710536,33592838,243272820,-2146959210,-50293210,243271147,-2147352552,134223630,-58670087,-165710563,33592838,243272820,-2147221354,-50293210,243271147,
-2147418088,67114766,512082937,963969047,1515017,1509110,-2144439036,628445948,1509110,-165120760,50337542,116787572,1948254231,-166794487,536876806,645924724,
-343998440,389951492,1392279552,-1007091340,908729656,1178942034,1574646,-2146536188,67115022,-393936712,365778690,-2134640315,-83879898,-343604808,8240110,-114030360,
-1326402365,-401695741,-991407068,1962884195,8239896,871360592,1946172504,8239884,-1154345496,-555220867,-2134640333,41287676,-58669077,-352160428,-721649505,-1343552907,
1967520896,-1872434429,1975057536,11200771,1966603392,12511491,1968372864,14346499,1967586432,14543107,1946307048,354826812,-385649408,-58720126,-385649325,-58720112,
-385649396,-58720123,-1341819597,16640256,1966406784,-385765371,-58720013,-385649365,-58654881,-117279317,-154928957,67114758,116848500,1946681367,9955587,9832182,
-166956016,16815622,645980020,-2130837354,134223886,1444210938,1048640325,1946288201,1228832775,158663424,-1090144176,281870771,403109464,-109770752,860931065,419858112,
1958773760,280684547,-375461032,-386245930,-369404454,116807019,1946353687,-1777928564,208932864,9832182,-2145881086,-50293210,1438181626,-83505851,116835321,1954545688,
-121374462,386332355,-143391744,1509110,-1326418936,9890290,1509110,-152800252,134223622,116841845,1947205782,-1777928692,-814480896,9840256,1896775933,1088978944,
1743321601,-839170731,-339725541,-843074459,-101895408,-15603261,863560714,2084306048,1157398574,-58709122,-2147126185,527784188,116798640,1963458583,-164450251,67114758,
816852085,1509110,-1339853565,-132125906,-164777789,134223622,598742133,1509110,-1341426428,386332185,41222912,-536690638,-840384462,180615439,-1978697500,2085043396,
2119384068,419874311,-1007157248,1194116234,780641979,386332375,1316292608,-158878786,67114758,116800373,1963130903,386332203,259334144,192687676,1967979648,-336547836,
-155176446,33592838,645924724,-1325596522,258926816,1139523634,1509110,-338332384,-255203102,-646782838,116798699,1963065494,1949187119,1965767824,3729418,-256321931,
1020193614,-401967827,-931856342,-347410248,2083531968,421956287,-1576348416,-1007091687,9840256,-2015510787,915126251,909836314,-1012072420,1509110,-167414776,67114758,
-1577411389,446890112,1876736,256014,-812645653,-436162365,-1643989884,-1001222,-1192230641,-661782464,78144740,28339829,-1431272218,-4627226,-352261121,-469701888,
1946265700,1012982790,-502959019,-1874859028,-2065300816,-2065300560,15401195,-2065300304,-1897922376,-2116340776,1968548415,-1756447480,-1607532754,-435834710,-939476860,-617359218,
1437220737,1321011317,788475543,112241316,1085834470,-1193767424,283836416,-2065299536,1894158256,15401195,1910767851,-1884235637,15429862,11534571,-75468314,-385649399,
145756300,-75463450,-352094966,12095536,869830384,-1435189550,-1409283143,-290664310,162593250,-75463450,-1291684341,-788581888,-1215615261,1085844106,-2585088,-435506970,
4241540,788519054,196083815,548439270,-370466586,-2065298256,-215719452,15401195,1642463467,1894125232,-58931,-1,-1,-1,-1,-1,
-1,63498751,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-739639297,-253,-1,-1,62646783,1947473896,1227262516,83656704,-58717582,-2143063232,1047922412,-1962885144,
-2097126634,-336853310,1963042816,-336790791,1946265600,93005561,-83868023,1227262659,83656704,-58717582,-2146471104,175507180,637570024,1183384971,45728512,1090289672,
79233916,10020880,-611400820,-745736309,-779369586,-315437686,-57941717,-1946007576,-1093103928,-2135295378,285114368,12126325,-877478399,1256721899,856192305,-975663424,
-1962864586,7661820,-25154957,858092560,-975663424,1342209078,-1933013933,1539521499,-2096794280,208929022,-2135294837,5040128,-2147220878,-315437430,1183441155,-125058304,
-13443190,-150975327,-774861853,1352633315,4890624,-13441034,-523123965,-1013464573,5250699,-628698573,-271451253,-83628079,4800128,-788368634,-1007025182,-1948284074,
-1964166463,-372222258,242526195,63867486,1224444913,-111218827,1582827499,-151599573,-1715944456,-1707238970,192348988,-259267534,-13703471,-1013341532,-334248262,-1912449397,
317198406,-960838912,145288211,-1746401931,-402396416,1438843080,-141877498,-1007222989,-1090292735,-359985152,12193972,1007101112,-1174178557,-1030836224,-997534325,-152532072,
-1963457566,-1946209569,2044537811,-1159034110,1240212422,16769409,-301462463,-997792718,-204633263,197888932,-150570551,-341117991,1508967170,-997528862,1575941924,1364414659,
600226386,-1325694740,78840437,1957821312,83591183,95489399,522511314,49005322,1525551156,-1017619623,1381061456,102651734,-661733325,-2135357257,-992857344,-402583490,
-1070334123,146266254,-1174372167,1053032576,1122500732,1595869183,1532582494,1397801816,1465274961,280430110,855703737,-1928917294,-389303746,520617761,1499094623,1388533851,
-960831350,-31134685,1950416000,1962704902,201684472,-116870143,1522830062,-1169010493,-1460923450,-1017619960,1235243600,1946631168,600226310,167847148,-1017619776,-24488106,
-793978230,637762044,-2119563982,-31457337,-32672561,-2115275317,-2095054873,-521449273,-498639265,-24460329,-793978230,1377532412,-1979709255,182505712,-1978365200,182505666,
-790441520,-488451632,-2119542024,-31457338,-32672561,-2116848181,-2095054874,-924102458,6725827,158727946,606069632,-339539232,-771378933,551780579,-1022697692,-2097125726,
-1007811134,1692838832,15401195,1692664043,-193658200,-469736263,1963042916,-1897377527,-203269846,-1934619157,15401195,1625588966,-117314568,-61,-1,-1,
-1,-1,-1,-1,-2040935703,-771804421,1352109027,39225600,6295179,-956019063,70,-301027133,-352261310,-527766528,-351293366,-301929728,
-352261310,-3937280,-1,-1,-1,-1,-1,1358954495,-1595531088,-821375656,-434065328,841016992,1492182720,516883149,4241488,844683406,
109509312,243990640,378208366,536543340,509751017,4241488,-1980049266,-1996460530,-973050858,28678,-383821573,417882643,-402608128,-259369978,-1572176,-1329034669,
1408821252,-118888310,-99962783,-1470894616,-83659648,-389811221,11599855,-454498678,-1979535277,1407052001,-443939664,-1336682776,1405675531,-98303476,41210500,-1974468340,
-401887008,-380087361,-1125621321,-402149121,-796240982,-1545074512,-1326413229,1402791945,850446474,-1974233624,1637214696,-1191208216,-1863843834,-1979207597,1401546978,-427161424,
-1336704280,-387872247,196105083,206794216,1358636034,196141194,1481861864,-443927888,-380411160,-1325768357,1397811211,141828264,-1070375941,183033,1072171696,1971365971,
-1979600649,1396566246,-511048784,-1336723736,-387610107,-1578872017,15466020,-1578762005,401083312,1344277587,196141194,1481840360,-94302487,65538992,1356801107,196141194,
1481835240,-396297495,646447296,-469106623,1317078388,-1023409898,-1979693430,167788838,-2130348828,71246,113703619,-1325465536,105810448,202170578,-1173993974,-1964112910,
9150688,-1173952320,-1058143241,646186220,812974143,4138632,-38209285,1914031504,-1317162973,1552557576,25067530,-2146929661,1963262334,973451522,-2046659623,-1947994407,
674556120,-1169046533,-1128725516,-243144704,1971366124,-1325997562,-402330752,1122824563,-1017560920,1168178314,88484352,-165224240,-662043548,704661152,-165279930,-1023277980,
4654594,-1979431382,-222641177,4169731,309595940,78178512,61866612,4138634,-455998287,135054346,619204846,645945585,201326654,616164868,1040643828,175472640,
-487518488,-109005580,645926379,-394330050,1189630173,-1008455087,-150990664,1174604902,13795330,-351475974,-436147456,-339442172,-436147456,-1950054908,-423458088,-339637375,
-436147456,-339442171,-436147456,-71006715,125733571,167962560,-1914173826,92178958,-1022457880,-1662480464,-345971631,-1342117120,-396040672,15420716,1692664043,-160169560,
15401195,-527802140,1342491776,1481446376,1692819632,1292560464,-423327144,1292036192,1692860080,1358818292,509038931,1619974,113760398,74,1946222464,1277069337,
4765696,-1070350194,864026809,-1410073345,-1006710786,520610539,1482381663,-534425405,-1031563776,-293556221,-1325143421,787403524,-1607039861,1120176878,1480737518,1257119524,
-289394102,96633674,1122011884,1381024748,-1763179600,-1223855104,596764688,-1219885452,596240416,-461088422,-2091774603,-1964243518,1522633440,-1979520018,28361665,1946184936,
7454297,1249846400,1522074039,1350611968,1139146928,15401195,1088684267,15451270,1088684267,-125057914,-947590056,612643701,-1336924043,-347871744,-352261376,-2042567680,
-352261180,-2042567680,-131377212,1562443649,-713926561,-872498718,-863981451,-339725696,-2082436599,-2132015638,-2084364572,1122895042,-383731902,68625143,25166592,6291648,
1572912,1364393996,-1879000840,175314381,101367859,460652686,-1070393621,-1191177029,101381156,192217230,-487643416,-277525515,-956727116,36358,-1463592103,-1274776544,
-1475351604,-402295807,116068043,57935016,-1007087180,-1899459554,-2147434792,12182578,-536695680,242547682,-1152384838,263828863,649979904,-1021313301,-2080955142,-2031221566,
15418080,-2081554197,-466483734,1122944138,-340998914,-301929728,-352261302,-1187328,119584997,856049550,536918527,395029491,-301774966,-6657,-536870913,151135490,
-162463958,-2144925681,35979999,1358899721,654839798,620945216,-15003902,135263828,48169039,705233445,267800831,-545239288,151135490,-162463958,-2142304241,35979951,
1828657938,1325928438,1611565312,4825088,485031460,1009677391,858420482,-975466789,-2147453898,1963792764,415364892,-1961462504,1625522649,-389707168,-393609199,183026058,
197691904,-401951541,616759359,-166808561,-773271068,350802408,-8338688,-2042071289,-771804421,38702051,5279625,973103776,863307590,-2034224302,1244067781,-1580727552,
-388956082,-1269118973,-289109490,-339375550,-301929728,-1966801334,-352261180,-1975325184,-352261183,-1018499584,1122944138,15451530,1257111787,-997538562,15401195,-1047903506,
15401195,-436253970,466623440,466674371,-11265072,466623440,-376963419,466623440,466623440,466677591,-129109915,-329648063,-128325831,-271390674,-420288615,-11272594,
-257622189,61383,471812759,466623440,472390608,466623440,66591696,62653176,41419640,336860180,16843009,4063262,-2065289040,-1912586056,320768960,-315401728,
12501043,-1895877856,-2147436091,-981357581,-298119168,-1202524302,-1064435648,1253001,-1064386509,-1191149377,-930348976,782391486,-119362651,-1064386509,-1191083841,12058632,
-492066048,-432951044,-1900006524,-1572290880,-1191067457,-930349048,-492067538,-432885509,-1576485244,-1191182145,-930349024,-492067538,2126469115,650130176,-396425847,477449587,
-1077375913,-953810820,651932165,-1090370167,-953810672,653946373,1593984393,-2065288272,-1912586056,302037720,876380388,-796261771,7476873,-2065288016,515477684,870003456,
-389772590,-796242634,-989931005,-1347357726,-1974654488,-391204656,-259371742,309646139,401116848,-1975514035,-393301792,900746519,917538022,12289254,-1898411008,-432557888,
33667716,1007625452,-2147257329,951062735,1522435302,49058,771752633,1111659181,1962884332,46628871,-1416476086,967896546,1589544166,573346,771752889,-152268115,
-352261168,-527766016,15401195,1975794412,1086816261,-471684206,-2065286480,-1079876418,112787576,-1523649792,-109721211,-1912586056,270436824,-432295936,-221910908,8851072,
-393301996,1084771446,-1380970891,-1471386136,-2147126267,-83851482,8652486,1085850392,-388461056,158529374,91555132,8857216,-1007893509,-469056530,91816820,48874489,
972849153,-594872449,-1976631502,-158907257,134223622,116844661,1963196439,-159439850,50337542,-1645673612,386332160,1668562944,-2147448855,91557884,-342622024,905740388,
116789621,1946288278,-1775861750,12123392,172944277,-2142406464,1282671612,1947139200,486309963,-58701196,-166038217,268473862,116798580,1963065494,-1778337787,645932011,
-335740778,2116041761,2086747146,2105228323,-165731297,33592838,645924724,-1258487658,14608608,1924449273,-403980238,-471105616,-393752642,-613227977,1631382251,2050807164,
539808127,-58667541,-2133429193,242562556,9832182,-2146995198,-50293210,-58670101,2131325967,-2020987381,-1477736578,-1544830926,-393769282,-1686969865,1509110,747926848,
613477152,905740415,116789621,1946288278,-1775861750,-1531642624,-2138027029,292887804,9832182,-2146798590,-50293210,904636084,268206224,-1514928779,1351625707,-913521526,
230277518,-1073967104,-1359829579,1008890968,-2146143200,310117116,2081356928,2086747151,2138717193,-390057467,-1007091688,-344537984,-336547596,437125618,673651739,875768617,
-1946536139,-1996481482,994461188,1962967606,-2143909116,439761664,-1995344896,-83878858,1162152424,-1862092720,-1017637427,2109427963,571729920,-1482374312,-1455161312,1610285112,
1086279710,1021283840,1949792001,-1610156511,779419904,10489472,5629953,614589690,-352261122,-73275904,-134209304,116790763,1962999968,200013827,-2147474456,-33513434,
1492713963,1595867316,-100662582,736627632,1346374730,196141194,1481255656,-1325743109,1243146251,-1974419676,-401887008,-78099945,-1742829117,-1710846976,-1676244736,-1643214592,
1610334976,4241438,116840590,1962999968,-1610168784,106103040,512606350,-790101856,-94697473,-31153692,15401195,-386162202,116850585,1954545824,-1608089351,-336036096,
1595930881,-83885366,106979167,4241438,646568078,378273895,11534441,-386236186,561333568,-776994581,904422630,-350849723,-421548032,1160439904,15403893,1692860336,
1950687208,1627856646,-70319180,639655053,-63545,-524171124,1200170500,-1043821566,-2010772248,-970587065,-1919285945,-953800612,-1929380089,81838544,38242598,-389951348,
1200104972,1204168196,1443271173,-1064384372,-1452788083,-1962893080,10741968,1552746334,1468605960,1200104962,130491908,-1325793025,-402017137,254167311,2062032641,1200170496,
8120322,71796774,-16267482,1204168447,254185989,17766145,69088,787480847,-1510592769,1032243,2668752,280547470,-1193767424,-1064435688,871773180,-436162305,
-391777424,-22002596,-1259051802,-1469979646,-1476102848,1310356608,76238926,207094921,-435942392,-352261279,620176384,-1268652293,-423327231,-1932727424,81838528,1371784707,
-963919476,50653377,216580545,1085850457,-1898410496,-1962907370,-402626778,561333252,-776994581,-102210330,-350849725,-421679104,1139730528,15403893,1692860336,1950606312,
-435965948,-436162432,1627856752,-2132491130,-1957313402,1977879276,107381004,1317142526,-352305146,107381002,1317142463,1560281350,-1335926833,1208281137,816898186,-817365528,
-94412805,1967365096,-1342117087,-396040495,376783760,-542113557,-2048368410,-351570621,-419450880,1132128356,-4979084,183033,1552765947,130491960,-930283521,637853889,
-1946007671,216580552,71796774,88589862,-1325769830,-350165487,-1979651328,-350099769,-1342117120,-350099964,-1342117120,-350099967,-1342117120,-350099713,-1342117120,-341776879,
-1979651328,-341711165,-1342117120,-341711358,-1342117120,-341711359,-1342117120,-1918769409,254150748,1552750337,17770000,-326413025,805586631,17784064,69088,787480847,
-1510330625,1032243,2668752,414765198,-1193767424,-1064435680,-889658318,-930349054,-172244850,-1010813978,2140107,34304,2140107,34304,2140107,34304,
2140107,34304,2140107,34304,2140107,34304,2140107,34304,2140107,34304,2140107,34304,2140107,34304,2140107,34304,
2140107,34304,2140107,34304,2140107,34304,2140107,34304,2140107,34304,2140107,34304,2140107,34304,2140107,34304,
2140107,34304,2140107,34304,2140107,34304,2140107,34304,2140107,34304,2140107,34304,2140107,34304,2140107,34304,
2140107,34304,2140107,34304,2140107,34304,2140107,34304,2140107,34304,-1,-1,60746239,287310065,69273633,-14614239,
1889604000,27329185,-1200816223,-1102530452,-1747665326,-2126997558,-2126479040,-1749178354,-536870909,-939524093,-1192414434,-986513407,864026809,-791568641,-453254485,-351531935,
-436147456,-336386975,-436147456,113505,-980689613,-164421882,-1635778375,-1398811695,-507301306,-468093450,-1329551263,-787385088,-462207266,-754404962,-1350939181,-1010814177,
1342178502,202138084,15401195,-215719450,15401195,-1957076506,-1007083562,1946247144,1228832817,124912640,4800128,-399543033,378269196,-1031602077,-320828922,27787499,
-319096459,27787499,-997525132,-486848598,1048626154,1912864841,1228832775,1433732864,-1427252248,-1006837177,1946227688,1228832818,124912640,4800128,-1975880441,-306255645,
6493835,-1962491261,15461592,-109772376,15461626,-109837912,-72629365,-2134643742,67127614,1048577906,1963393097,-387741176,-1410077300,-307697469,-1979294070,-1946138306,
-1092972854,-466433102,1933639552,-93405668,175685642,1964928232,17874448,2092828139,863970304,-975532334,-773795532,-2132749856,41042175,-268181295,1929838464,283935587,
106415243,-946940020,-125086895,-1258036352,145861640,-489561391,41148624,-906046710,-963972491,-22289782,1541830093,-1939929254,-1176990000,-192217084,2046546093,87238147,
-20479573,-70210273,858129273,-276714747,-454942798,20901761,-2082966198,283840708,45802378,1090486280,79299442,-292755440,-61,-1,-1005393153,116846592,
-1023147897,1183449524,374243584,1388511233,-1476378392,-1329374656,-1341985904,7387664,1123521000,-1007186968,-1054638,168187530,-1073515054,254018792,125091850,58131516,
-117314568,-1092041894,-165180702,-1329393468,-1341985906,7387662,1123506664,-1007201304,1054347,1946272502,-1058897902,-92272268,-1308068544,-1308103934,-1308366079,-1966868224,
107383548,57992202,134537408,-1979674874,-58014745,168191626,-1073515292,-789183264,9373216,868476810,9412800,168191626,-1073515292,254084328,-1974418688,115916996,
-301729862,-1979675744,-1061149480,-1007287064,201487361,-1058766847,646504458,-1017642869,1961927656,-500569861,-1712798740,-386173456,-947199457,-1960393746,-386169316,-75038740,
-1006639128,1087039568,-571979081,125733631,167962560,-773323138,1105848575,129569141,4374272,-1996506648,-119388411,-2013264152,1476411686,4366531,661962920,74713256,
569082036,4400778,1949353206,-336801788,63239700,-989985676,-990508053,-1274907520,-1274877180,-1368210688,-1364873577,-1339183193,-1298878370,-1331907948,-1364873005,-1321554009,
-1298878110,-1322470764,-1298877942,-1305103724,-92229023,-854428800,1436307520,1183575179,172394754,-346514083,102654024,-326434710,1981152384,4241418,1474877582,-2127631612,
-124314,1724033,872217346,-992440640,-2147417034,74744058,18364100,-1912586053,-1965519909,-472836770,-426246354,520554413,1720242017,1948682261,-855592448,276725824,
-2146209152,2004947070,1189472269,1929568488,-402279419,-1597818510,1183318132,1948682260,359041024,822798531,1374180210,639676474,-1073199882,17564276,169180800,34345333,
1149904464,1975519751,-2012958718,-1571291066,619184200,-1950183932,-2139113736,1946817918,1975781894,180813314,1720194150,973370369,-1274775834,-397743351,1239953637,-398298383,
1030882255,1927870602,-2146274319,175378940,1946732534,8185900,-337106965,975431736,1877483378,360611840,-402295542,292684786,1963020030,440858565,141885441,-348602136,
952428547,33012419,9216748,1051331,1075838980,32619010,9282284,-685498188,-1101655948,-523194547,-347733134,1588342521,-1918836602,-315440384,-402633078,1357438995,
-401575421,192035261,-1394897378,32553503,-1008147730,-1174339399,1844642288,707406531,707406378,-402416407,2104635400,-1338421272,1156982320,41205768,2122318092,292883221,
642777612,168248458,-1342016064,4622340,4760152,-1241308440,360611967,168195083,-33393212,342231750,1946248840,1994799620,-351685628,803727412,-1962737944,-386888742,
250100033,360611843,-402295541,426966888,1928344552,45738004,1592266610,-32869648,-613088946,-348661528,937224195,797108419,-907532174,641773624,-1073199882,17564276,
-402634590,-35115111,-401640721,175243907,1928341736,933750789,-1410858005,1374208823,-399150545,-1977206632,1134693956,1208403456,1793609728,952887343,2095586930,-1948611838,
42985712,1928314856,38135823,-353891726,-402296081,65746793,-1019777560,-1575729527,2122317940,225870096,-1995290999,129241158,-348695064,76228125,-528070584,637984960,
-1995553782,-1977216442,-855768476,-1996458592,-389869498,1349660380,638606986,-33391478,-1597013809,1946272758,282034179,240945702,88378150,100853953,1119815454,-1014322688,
-1442729814,-1431649142,-961886326,-402157307,837299917,-401640721,175243703,1928289512,920381445,129238507,-1019814424,1915651048,919332869,-806878229,1978188598,-400592338,
113653692,-395313080,-102224235,-401640722,175243647,1928275176,916711429,-1477966869,1307099958,-2146929874,57999868,503355369,-661733325,17053380,931325983,4523718,
1174849024,645922816,-387973049,-1599078077,-301861190,-398997528,-1041694808,1967030327,393347584,4656768,19261456,-155537232,-1444352511,-7673801,-2127059992,-124314,
1394374,1917021672,-1070391749,918870158,-1289813756,-16521088,904407666,-2145029632,33584446,-336067725,-1070391776,918870158,-1289813736,-18618239,243272306,-401604537,
91422736,-1571404,-1511472331,-400592339,113653484,-401604536,703081925,-401640722,175243439,1928221928,903079941,-672660501,340166709,763029699,-1041751182,1208403510,
-1696034816,-302061523,-2065165454,-401706496,-466420477,1007961737,-1274711039,900261920,1964935875,-2134114816,1579843779,-1995738352,1183388742,273058066,1187453419,637730836,
637682826,638477558,-146072437,273058275,-1022208375,1328838,1720189364,1948682261,441352448,-389873663,561119271,605046410,81838081,-155541492,350809601,-1475448320,
-1274776544,-1475941428,-1274710720,892922026,-397323325,-12780433,-997849995,112924651,-198919936,242516136,-388192536,-186450857,-1259440821,1532623232,1095875,50489079,
-763359674,-490647552,82362636,626577419,516096015,12180366,32553473,-1021349901,1317727538,-597039104,1929357032,907274252,-256243854,-492114943,707445740,707406378,
1344940586,4241438,113694862,-1325465458,-434051552,-1862223712,1478432205,-386431025,91617581,1945715176,-111482834,566115188,-105649996,1349779880,-390846786,1066064905,
-410984566,83853318,817774196,-1058832204,733886068,-1104024652,78951457,678743294,611633406,-351943037,38193139,1187446784,-973078524,-956299450,3142,673479,
-120854528,1240153205,1928926696,206474460,55872302,856315529,-122427173,-941094283,772109048,-13493110,771907209,-2013107062,-1976695442,1317536076,122078724,-121182207,
-2098720907,4161755,-142145675,-2015592216,-120788745,856053384,375816640,-142082050,654901699,251830523,60888399,-1591587063,1011814916,-1091074143,1451996362,-128980988,
1676160885,1009152760,-2095418367,37488326,-964490636,1946369036,113672972,22297390,-964487820,1413164550,-351505407,1946172469,1413164584,-399084287,1065409293,-2029554432,
-603199241,-1976633465,-85458092,-1944614694,-1959916466,1451820116,375816458,-1070399487,1317082347,-1275068138,-339725812,374243610,213123073,-823607246,4161754,-142145163,
-607393712,-2013821096,151110647,-1594125529,1948715266,251830536,-1592453809,-1756428029,151232802,-1590716593,391057924,808558908,2035494194,1835365491,1634681376,1176527986,
1970039137,168650098,758263857,1953724755,1864396133,1699553394,2037542765,1634681376,1176527986,1970039137,168650098,825242144,1835355437,544830063,1869771333,808591474,
1699556659,2037542765,1684291872,1936942450,1920091424,168653423,1769103696,1126201716,1801676136,2109728,1769103696,1126201716,1801676136,2109984,1061109567,822099775,
1378693424,1159744847,1919906418,874514957,1294807600,1668247151,1836020328,1681989733,1702129761,1631985778,1920298089,537529701,758198325,1886611780,544825708,1885430849,
544367988,1818845510,224752245,808656906,1699425585,1634689657,1159750770,1919906418,544370464,1953719636,2020165152,1701999988,1936607520,1819042164,168649829,825242400,
2036681517,1918988130,1917132900,225603442,808656906,1699425588,1634689657,1864393842,2035490930,1835365491,1768838432,1917132916,225603442,858796810,2036681517,1918988130,
1866670180,1869771886,1919249516,1920091424,168653423,825242656,1769099309,1919251566,1920091424,168653423,825243168,1936278573,1953785195,1866670181,1869771886,1919249516,
1920091424,168653423,808923424,1766206769,543450488,1802725700,1920091424,168653423,825243424,842020909,1126184760,1869770863,1936942435,1159754351,1919906418,825241888,
1328498989,1297044000,1920091424,168653423,842412320,1937330989,544040308,1769238607,544435823,544501582,762602835,1853182504,1952797472,220819573,538976266,1850286112,
1953654131,1095320608,1397706311,541280596,1802725732,1702130789,544106784,1986622020,977346661,824183309,1395470902,1702130553,1884233837,1852795252,1917132915,225603442,
909189130,1699556660,2037542765,2053722912,1917132901,225603442,909189130,1767124275,639657325,1952531488,1867391077,1699946612,218762612,1378361354,1297437509,540876869,
573654562,1497713440,218762537,808656906,2035494194,1835365491,1768838432,1699946612,1769108835,1277196660,543908719,1277195113,1701536623,537529700,538976288,1851072557,
1801678700,1937330976,544040308,1953066581,1667584800,1953067637,1867260025,168651619,809056049,1936278573,540024939,1869771333,822742386,758200631,1802725700,1159737632,
1919906418,925960717,1143812152,543912809,1631985712,1920298089,822742373,758200375,1802725700,1176514848,1970039137,168650098,842544945,1936278573,1866670187,1869771886,
1919249516,1767982624,1701999980,64489997,-256628268,1610659840,2012591,-1274824640,15782953,-1906310992,268444085,1894158000,15401195,1910947891,12123386,-1327984912,
-433985793,-435375967,-435113887,-423611772,-430657393,-351096765,-436147456,-348737471,-436147456,-352276413,-436147456,-352276416,-436147456,-1173573568,-1326578702,-1165695471,
145757126,-352261138,1084812288,-725788555,-740496968,62380170,-373760323,-1019554862,-662043020,-260714498,-1464336199,-1341754304,12185099,600226480,-662011728,-1930557428,
-1093103928,-1047606350,12189491,-1096420600,12176306,-1968835832,-960827709,-300961749,-1339570502,28372495,-301745990,-658898512,-1162154493,-625284093,-1061491709,-289394173,
-1078440261,28359017,-1947330677,1468662903,1227010,-373728579,-1031542928,-637894395,-1341950717,-11866576,-434982681,-1183597180,870805225,39291593,-2135093580,-395777607,
-2129673341,1924689147,-434917190,16824708,15401195,-119357389,1139146928,-527810332,15401195,4014308,-1156680448,414823662,-1179140864,-351376151,-434851586,-427052924,
-352261264,-469701888,-1979243407,-427052832,-352261264,-423327232,-426987407,-352261264,-434786304,-426921852,-352261264,-469701888,-1971313551,-426856224,-352261264,-469701888,
-159374223,-527793980,-864024715,-434720640,-434655100,-426856316,-352261264,-423327232,-352261263,-434589696,-1171276412,-456797719,-336386975,-436147456,3192929,12374158,
-434524159,-399972220,803771568,-1976556490,-1340190496,-393943470,1478440854,-58716300,-402426880,1404096928,-1746369306,-424824777,-352261276,-18176,15426788,44564715,
-186511244,-1179241029,-1866661859,227797434,45743851,-345971712,1359014656,-401372997,-463926378,1946265700,-1142234608,498710069,-1162363648,-351441687,-379393794,-2065294672,
-1328529688,-393943525,481355210,803767526,-434261811,-849352572,-2065293648,-1328064536,-393943521,548455939,1860732134,565246721,-806845210,-433934130,-808392572,-2065292368,
-1328149016,-461052380,-352261280,-422531072,-352261276,-469701888,1946331236,-453842174,1946265700,610329850,-1963776771,-422465312,-352261276,-469701888,1963108452,-423326988,
-433737632,-729945980,-2065291600,-1338494232,-1333467609,62831340,-433540882,902097028,-2065290832,839707368,-1266227520,-1978216975,1014753496,443876008,145815690,-940144922,
-402295804,410334443,343202570,-2031695696,45616875,169266675,-1207601957,382595074,-672657744,1967171636,-399724515,1059337422,-299383110,-1008194128,-1963973580,600226528,
168764652,716238532,263488742,11800781,1642336461,1812783242,-528064026,1642463467,-2065290320,-1813508432,1946462260,536918540,-1179166277,2028470298,614589451,-335600387,
-352261376,-1197349376,-661782464,7472839,113644032,-1275068398,169266673,1007514816,-469338879,1963501702,194963459,-2146722840,-2147445234,9834112,-437716448,-420302801,
-4588704,-1777928449,15409152,-169736332,9832134,-433278976,1612303748,1622148638,12092646,-1143435748,-1014104000,1763085350,646522368,113705063,80,-2065276496,
1946496488,1343127817,-385871872,1655702117,113738982,8388722,7603911,1642332160,15404044,-1259839002,610395139,-436147213,1048651361,305397874,1755393397,7512832,
1086050867,-1963723008,704820216,-497555205,-1560253791,-768409484,-150978373,-1275557133,-498866160,-1342108951,-393943453,124978621,-2065275728,-2121265173,-2147458498,-2129235200,
-2147463154,1746832128,1646168320,1780386560,1679722752,8436992,6430347,512351531,512426086,-584384408,7085705,-320339276,1981713153,-2134671104,1914603776,1958742784,
1343127826,-2013265664,-1996467666,-2013244650,-1342155506,-1954224539,-1996463074,-1962908130,-1996461538,-1962906594,-1275039186,28174352,7741067,7609993,309641227,5246593,
780664834,378077274,243794011,-1207566243,-1064435648,-1962901315,64481477,7512327,-150732613,973254883,-1977846590,53340386,1946157737,1343127826,-2013264896,-1996466642,
-2013243626,-1593812722,-1073020812,336756,-1327237372,-387806704,44630787,-2129497088,134238222,1580107776,1595312384,1628342272,-429477888,1914604420,512304640,512426003,
-1330642828,2095637386,-1968066510,846588135,116850865,8388688,28377716,-1341867032,-2121996697,-2147454402,-1341230590,843901107,-527794164,1290318768,-150817742,-16756730,
-1274907648,-526587645,-2065274448,-352321349,1789956104,29066470,4241408,378460302,646643817,-397213593,190515528,-385649189,1806696600,12092646,-136802788,16797702,
-401181696,-315487956,5377674,243986827,378208341,1592262739,1342633732,1946158080,151971862,243985714,-242548650,5836426,5707403,-150712088,33574918,-401181696,
-315488016,5901962,243986827,378208349,585629787,1342633732,1946159104,148039702,243985714,-242548642,6360714,6231691,-150727448,268455942,-401640448,12191924,
-1259422976,-402646343,116852839,-65456,-1645739148,-429084664,1629423492,-662023229,-2065273424,1459405706,-1945756073,-1144811813,-611450832,-1077733442,196673656,128316160,
-1973526753,-428953384,-1950119292,956328990,1979737630,1343127846,-1962901504,-1996462562,-402624994,512426060,507052144,74645612,7085707,7741065,1955606763,1343127832,
-1996455936,-402624994,512426024,512295024,384499830,1873825936,-1990687514,-402624994,512426000,512295024,200802422,-117345088,1465107291,-428822522,1277593732,851741184,
-1141339164,1085800448,-1950315008,27519173,7224963,-1207143168,113704960,112,-1332710933,-1199249807,-1064435640,1431787091,1575663080,1935367775,1278118410,112640,
-2087694869,1476149443,512381777,146341964,872362752,500945344,-492109824,1277070070,47104,1946338294,16889859,1599691691,-1912586056,63278016,20441283,7216697,
12060279,-1878463744,4982400,-1986729215,1342205982,-2065271888,1532954456,1364414659,4765702,45203598,28314037,83892200,1755512960,-1257197312,-402542339,1789067272,
1532561152,1381221208,-1932490155,1276020933,-1144680960,-953810944,637534215,-16627769,654114047,-50585717,-2080572164,-970587909,6,1285556340,-339662336,775458839,
175243340,704662688,-339673407,369135623,-1108672436,-524164046,1532648710,1398212291,-428691376,-4630396,-1560354049,-1152384948,-1014103992,-1979709255,872362968,500945344,
1974403072,653582910,1642333578,108314792,-13385678,642202347,1642333579,125092008,29343794,858385152,-1174893632,-1410105344,-1912586056,96832448,-393543616,1476408552,
1334845931,87172687,642188917,-997579470,780847242,-1957167028,7381957,45668235,-32707840,1994406592,-8722173,1526726840,1405290335,1465274961,-1191179589,146735109,
-137219328,818053363,-1786181706,1330577528,-1090719774,12517496,768256,-1090738701,12517496,768384,1583326707,-1017423526,1465012563,1632342,1890781367,-1910767432,
48832,365791668,1600054282,-1017423526,102650704,-1910767432,-54489384,12566579,309504,146713587,1325713152,469809152,-524157814,82821124,-1996488699,-679476668,
75270144,-1845148474,410823,1097216,16712903,-1977876296,81838588,84209600,1149829262,14123010,-972784504,-946731708,1604,-1699493748,-402640706,12058706,
-1097682148,1206386712,4241408,549360307,3991552,-1833709428,-402642754,12058674,-1097682000,669515840,536918016,1220448947,1894400,-1910767432,-1899459392,-2091925800,
-1191145793,-784269057,128316393,-1017619681,-64313,-524157814,82821124,-2013117303,1552417916,105170693,1354956800,-873951568,1958783021,552335620,-392777584,-527815234,
-1209494096,6464301,-1343711056,-1327461843,766044311,-134191965,-1336884392,765257870,-922034038,-461371787,-1878725649,-1341076352,764536974,-389850888,12190766,-1255359744,
-402648647,-389872533,12190750,-1254245632,-402646599,818087003,805777415,805777415,1258758151,537346567,1258770183,-1176270329,-2064907388,1393653191,-402652741,-497351942,
1976368881,-1014975254,868417716,268353472,-351958746,637594368,-1329396423,-386229234,-401724134,48955395,-1062678640,-90434955,132656560,65539629,-1878856960,-1023335217,
-1329348557,-386229106,-401724174,48955395,-1062678640,-90379659,-538399312,65539628,-1878856960,-1023335217,-1014764661,-745604592,-1047600757,50602169,-1177448757,-1074003895,
-876739840,-1523649596,990007457,1963087878,50373123,1963022141,2408202,-1410758728,-1079261044,1354236012,-930305139,-11290453,-1412920149,-1004092018,-1560276474,109838480,
-1896152942,29316060,59095555,567087028,-919400469,512481678,-612040110,2028571253,1958742563,50510382,567085492,-854851144,4030497,96865653,1963801855,-853953530,
608240673,1916877919,56206044,-2052976860,867429123,-1508996663,-1475442429,113721603,33555347,-1910582733,-853887781,-2051399903,-853036029,-611443167,1316491,265867,
1363759647,-1274837574,1008848167,443897858,516434833,-1031679093,-628224032,448057907,-1172364851,666108805,280240589,1031807437,-1173588992,162792250,146285005,-1910387444,
-1159885115,448004224,13312461,1225395456,1919251310,1329799284,1363234893,760433952,542330692,1802725732,1702130789,1850018317,544367988,1986622052,1886593125,1718182757,
544367977,218762532,1768247818,1919251310,1768169588,1952803699,1763730804,1919164526,543520361,1718165569,1667591712,1634956133,168655218,1769108563,1629513067,1797290350,
1998616933,544105832,1684104562,604638585,1396785664,541147977,1163412768,-92013824,1242002432,-2035019916,-466435079,-335412806,-1930825692,33667584,1007625452,856323343,
870003648,-338545719,-326937224,-1997763826,-386269114,-108330899,-940699728,3142,-1995678069,-527824290,839853292,-1961789984,5236959,1586092331,173947660,753656439,
1055448971,-153539840,57934276,-167616887,57934532,-167485815,57935044,-167354743,57936068,940072585,-1267400634,1532516603,1566399065,82362717,-1056642111,-356449047,
1355020292,1139146928,15401195,1088684267,15401195,1088735370,-1017583478,-1,-1,-1,1793720319,1392513028,-402652741,-1017446398,-397324203,1482227716,
-880032931,11598492,1088701414,15458442,1088684267,256014,-812645653,-661928826,11598492,15418342,15401195,-527810332,15401195,-401719068,48955395,-997798000,
-2116539565,1527337211,-1193093518,-1328837693,-465312256,-337606080,-469701888,-1950054848,-436162344,-352261309,-469701888,-337606080,-469701888,734299712,1358660056,-503025143,
65404878,-2015695912,-772984078,-2046659874,-1948855831,-1176073255,-355270652,-1107295559,652986085,-2116777072,-1191181854,-188874748,-1877480506,-2010767184,-1434451835,-1177318585,
146669572,-1878791225,-1191385601,-1064390656,653733522,76727853,1075062672,-2054674905,1202356224,-419435806,-623776462,-377093518,1381094097,-490613109,178440,1509955816,
123521,-402651975,548405261,1509994728,-402651975,-54329343,653733522,76727853,1075062672,1347506727,1476433128,-387818919,1085808323,-958886400,-16772602,-162442465,
141869254,-2147462936,-202686226,1949353718,2746376,-351211904,777738739,-397211766,1130037341,-1966869022,1390957319,-498902272,229688310,-1342158616,4450314,16432067,
-1157610264,1877475584,2109457406,3663872,-402620997,-1144783262,719848224,16825088,-1006742040,78768266,115927250,-389707264,616759297,663749647,-400080876,-1144848383,
246677511,-1329393459,-1337727306,-1337792968,-465377787,-436007839,-31659935,-64724508,868442598,12123391,784371376,641927050,-2147449464,-203274326,856090111,12123391,
-1967092048,-2010758393,-1434451835,133489223,-393301821,-527816666,535336112,1963042856,550273027,-1062681462,12194676,-1227834592,-402630983,243334907,-335609838,1948297282,
536918545,-1179201349,-454557610,302940414,116850432,1962999824,536918545,-1179179333,-857210853,302940414,279510784,12194164,-1220429024,-402646855,243334839,-453050350,
-352261280,-1342117120,-345708864,-352261376,-1469783040,-352160766,-352261134,-469701888,1946265700,-1470044940,-1173260928,-1950670848,5618103,-2130806040,-16772594,-2081886925,
-1795067182,855647464,302385856,-972655360,4614,47811,-1179159621,1357381656,87856638,1055451508,-85660928,-47963676,856039910,650153664,2367115,604423974,
-70689280,-51910573,512304731,-1341718492,-463149472,1963108452,-431640326,-464469152,-434065312,-1261479904,-2145989376,-143311876,1239480771,-744383839,1391855003,-1819962142,
1754817669,1638603947,1224300699,1954870777,30081506,164299211,-1449547573,1334071241,248116100,-909526582,1996831945,-1947979253,786878960,-912415489,-2027519805,-620040448,
243271029,-133169017,-620080445,378212980,-1031602077,6660100,1705117708,283897344,6493835,-1610300797,-148635547,-301963870,-389810086,359989325,-960867760,-410325997,
-2147160960,-131856412,1525597194,854115160,-1171294976,854334406,-754667036,-1981230368,-960888250,-789124073,1183441970,331790852,-1462029332,-33393656,67577031,-1982297596,
-389872034,645211691,-960867760,119860243,54322226,1048578932,1963393097,-339411443,1228832777,41158400,-469056258,-3975078,-1,-1,-1,-1,
-1,-1,-1,-1,-1,1358954495,-1595531088,196092134,-1977230872,-401821472,-1004395054,57950376,-1476391192,-402426848,-816316414,1481297232,
508776643,4241414,116840590,1946222752,-1674673877,1929629696,-1641118941,477298944,196104280,-390077312,645932443,-1577189216,-1064435558,9969291,-2146467802,1482366727,
1227262659,23496704,54271683,-1979295113,62130046,-1957556019,45351510,1317736653,-1959337212,1183517814,-52916720,106859436,16809600,121377654,138153844,171707252,
222037876,-1399651468,1344164243,-1912586056,484989144,-497475840,-1979229485,1190528894,74776832,281871028,1227262495,23496704,1946631363,1946696759,1946827827,1947024431,
112939,281872820,281871284,372949758,326434890,-956378574,1964637824,-1328611830,-854674422,-1261293040,-1022309118,281874100,63979,0,0,0,
0,-2119859842,-1715633791,32385,0,-2359426,-406585345,32511,0,-26476544,2097086206,4152,0,940572672,947715708,16,
0,1010571264,417851367,15384,0,2117867520,410976255,15384,0,0,406600728,0,-65536,-1,-406600729,-1,
65535,1006632960,1715618406,60,-65536,-1006632961,-1715618407,-61,65535,437132800,-859015118,30924,0,1717976064,2115517542,6168,
0,1060323072,1882206256,57584,0,2137227008,1734566755,12642023,0,-619177984,-616765636,6168,0,-524255232,-520552712,32960,
0,235274752,239009342,518,0,2117867520,2115508248,6204,0,1717986816,6710886,26214,0,-606372096,454786011,6939,
0,945866364,1824966252,2093354040,0,0,-33554432,65278,0,2117867520,2115508248,8263740,0,2117867520,404232216,6168,
0,404226048,404232216,1588350,0,402653184,403504652,0,0,805306368,811662944,0,0,0,-20922176,0,
0,671088640,678231660,0,0,940572672,-25396168,254,0,-16908288,943225980,16,0,0,0,0,
0,1010580504,1579068,6168,1711276032,2385510,0,0,0,-26448896,-26448788,27756,402653184,-1027179496,-2046395200,404257990,
0,-1040187392,806882502,50790,0,1819031552,-857967048,30412,805306368,6303792,0,0,0,806882310,405811248,1548,
0,202911840,403442700,24624,0,1711276032,1715273532,0,0,402653184,404258328,0,0,0,0,806885400,
0,0,65024,0,0,0,0,6168,0,201720320,-1067438056,128,0,-825833860,-420020514,8177350,
0,410531864,404232216,8263704,0,113690236,1613764620,16697024,0,113690236,101071878,8177350,0,1815878668,218025164,1969164,
0,-1061109506,101121216,8177350,0,-1061134276,-960037696,8177350,0,113690366,808458252,3158064,0,-960051588,-960070458,8177350,
0,-960051588,101088966,7867398,0,404226048,402653184,24,0,404226048,402653184,12312,0,403441152,405823536,1548,
0,0,2113929342,0,0,405823488,403441164,24624,0,-960070600,404232204,1579008,0,-960070600,-858861874,3964096,
0,-965986288,-956381498,13027014,0,1717987068,1717992550,16541286,0,-1061001668,-1061109568,3958466,0,1717988600,1717986918,16280678,
0,1617061630,1617459304,16672354,0,1617061630,1617459304,15753312,0,-1061001668,-958480192,3827398,0,-960051514,-960037178,13027014,
0,404232252,404232216,3938328,0,202116126,202116108,7916748,0,1818650342,1819048044,15099494,0,1616929008,1616928864,16672354,
0,-17906046,-960047362,13027014,0,-423180602,-824246538,13027014,0,-960074696,-960051514,3697862,0,1717987068,1616936038,15753312,
0,-960051588,-960051514,209510102,14,1717987068,1718385766,15099494,0,-960051588,-972277664,8177350,0,408583806,404232216,3938328,
0,-960051514,-960051514,8177350,0,-960051514,-960051514,1063020,0,-960051514,-19474746,2649212,0,1824966342,1815623736,13027014,
0,1717986918,404241510,3938328,0,243713790,-529516516,16697026,0,808464444,808464432,3944496,0,-524255232,236730480,518,
0,202116156,202116108,3935244,268435456,13003832,0,0,0,0,0,-16777216,805306368,6192,0,0,
0,0,-864285576,7785676,0,1616928992,1717986940,8152678,0,0,-1061108100,8177344,0,202116124,-858993540,7785676,
0,0,-20527492,8177344,0,1617194040,1616965728,15753312,0,0,-858993546,209505484,30924,1616928992,1717986940,15099494,
0,6168,404232248,3938328,0,1542,101058062,1717962246,60,1616928992,2020370022,15099500,0,404232248,404232216,3938328,
0,0,-690553108,13027030,0,0,1717987036,6710886,0,0,-960051588,8177350,0,0,1717987036,1618765414,
61536,0,-858993546,209505484,7692,0,1617323740,15753312,0,0,2093008508,8177158,0,808464400,808464636,1848880,
0,0,-858993460,7785676,0,0,1717986918,1588326,0,0,-691616058,7143126,0,0,946652870,13026924,
0,0,-960051514,108971718,31750,0,940361470,16696928,0,404232206,404254744,923672,0,404232216,404226072,1579032,
0,404232304,404229656,7346200,0,56438,0,0,0,268435456,-960074696,254,0,-1061001668,-1027555136,101465190,
124,52428,-858993460,7785676,201326592,12312,-20527492,8177344,268435456,27704,-864285576,7785676,0,52428,-864285576,7785676,
1610612736,6192,-864285576,7785676,939524096,14444,-864285576,7785676,0,1006632960,1616928870,101465190,268435516,27704,-20527492,8177344,
0,52428,-20527492,8177344,1610612736,6192,-20527492,8177344,0,26214,404232248,3938328,402653184,26172,404232248,3938328,
1610612736,6192,404232248,3938328,-973078528,940572870,-20527508,13027014,1815609344,940572728,-20527508,13027014,806879232,1727922272,1618763872,16672352,
0,-872415232,-662817162,28376,0,-859018178,-858980660,13552844,268435456,27704,-960051588,8177350,0,50886,-960051588,8177350,
1610612736,6192,-960051588,8177350,805306368,52344,-858993460,7785676,1610612736,6192,-858993460,7785676,0,50886,-960051514,108971718,
-973046778,1815609542,-960051514,3697862,-973078528,-960102202,-960051514,8177350,0,1715214360,1717592160,1579068,0,1617194040,1616965728,16574048,
0,1013343846,2115534360,1579032,0,-858993416,-557005576,13028556,234881024,404232219,404258328,-669509608,402653296,24624,-864285576,7785676,
201326592,12312,404232248,3938328,402653184,24624,-960051588,8177350,402653184,24624,-858993460,7785676,0,56438,1717987036,6710886,
1979711488,-960102180,-553715994,13027022,0,1047292988,32256,0,0,946629688,31744,0,0,12336,1613770800,8177350,
0,0,-1061093888,192,0,0,101121536,6,0,-859389760,-597675816,1041763494,0,-859389760,-832163624,101072542,
0,402659352,1010571288,1588284,0,905969664,913102956,0,0,-671088640,-663996820,0,289669120,289673540,289673540,289673540,
1437208900,1437226410,1437226410,1437226410,-579381846,-579347081,-579347081,-579347081,404282743,404232216,404232216,404232216,404232216,404232216,418912280,404232216,
404232216,404232216,418912504,404232216,909514776,909522486,922105398,909522486,13878,0,922615808,909522486,13878,0,418912504,404232216,
909514776,909522486,922093302,909522486,909522486,909522486,909522486,909522486,13878,0,922093310,909522486,909522486,909522486,16647926,0,
909508608,909522486,16660022,0,404226048,404232216,16259320,0,0,0,418906112,404232216,404232216,404232216,2037784,0,
404226048,404232216,16717848,0,0,0,419364864,404232216,404232216,404232216,404690968,404232216,6168,0,16711680,0,
404226048,404232216,419371032,404232216,404232216,404232216,404690975,404232216,909514776,909522486,909588022,909522486,909522486,909522486,4141111,0,
0,0,909586495,909522486,909522486,909522486,16711927,0,0,0,922157311,909522486,909522486,909522486,909586487,909522486,
13878,0,16711935,0,909508608,909522486,922157303,909522486,404239926,404232216,16711935,0,909508608,909522486,16725558,0,
0,0,419365119,404232216,6168,0,922681344,909522486,909522486,909522486,4142646,0,404226048,404232216,2037791,0,
0,0,404690975,404232216,6168,0,910098432,909522486,909522486,909522486,922695222,909522486,404239926,404232216,419371263,404232216,
404232216,404232216,16259096,0,0,0,404684800,404232216,-59368,-1,-1,-1,65535,0,-65536,-1,
-252641281,-252645136,-252645136,-252645136,252702960,252645135,252645135,252645135,-61681,-1,65535,0,0,0,-656640512,7789784,
0,2080374784,-960037690,1086374140,0,-1060714754,-1061109568,12632256,0,0,1819045118,7105644,0,811648766,806882328,16696928,
0,0,-656900608,7395544,0,0,1717986918,-1067425668,0,0,404282486,1579032,0,1008212094,1013343846,8263704,
0,-960074696,-960037178,3697862,0,-960074696,1819068102,15625324,0,202911774,1717976582,3958374,0,0,2128337790,0,
0,100859904,-203695234,12607614,0,1616916508,1616936032,1847392,0,-964952064,-960051514,13027014,0,16646144,65024,254,
0,404226048,1579134,65280,0,202911744,806882310,32256,0,806882304,202911840,32256,0,454757888,404232216,404232216,
404232216,404232216,-669509608,28888,0,404226048,402685440,24,0,1979711488,-596246308,0,0,946629688,0,0,
0,0,1579008,0,0,0,1572864,0,251658240,202116108,1013771276,28,-671088640,1819044972,108,0,
1879048192,-933220136,248,0,0,2080374784,2088533116,124,0,0,0,0,-864550912,410569920,-872384500,-858993664,
1835134,-1057174408,-1015152520,1715340860,13369407,-864285576,14680190,-864285576,808452222,-864285576,126,2025898104,-1015138292,1618896444,13369404,-1057174408,
14680184,-1057174408,13369464,808464496,-964951944,404232248,14680124,808464496,952500344,-956381588,808452294,-53708800,1835212,1618501884,252,-864088961,
1816002687,-858980660,-864550706,-859015168,-872415112,-859015168,-536870792,-859015168,-864550792,-858993664,-536870786,-858993664,-872415106,2093796352,415496204,1013343804,
13369368,-858993460,404226168,2126561406,1815615512,-429854620,-859045636,-63898504,-856149968,-809043252,453953478,404241432,1863896,-864285576,3670142,808464496,
469762168,-859015168,469762168,-858993664,-134217602,-858982400,16515276,-587404084,1815871692,2113945196,1815609344,2080389228,3145728,-859807696,120,-1061094400,
0,202177536,-960299008,1714675404,-960294964,1865931724,404227023,404232192,855638040,862375014,-872415232,-865717402,-2011037696,-2011002846,-1437235166,-1437226411,
2010884693,2010902235,404287195,404232216,404232216,418912280,404232216,418912504,909514776,922105398,13878,922615808,13878,418912504,909514776,922093302,
909522486,909522486,13878,922093310,909522486,16647926,909508608,16660022,404226048,16259320,0,418906112,404232216,2037784,404226048,16717848,
0,419364864,404232216,404690968,6168,16711680,404226048,419371032,404232216,404690975,909514776,909588022,909522486,4141111,0,909586495,
909522486,16711927,0,922157311,909522486,909586487,13878,16711935,909508608,922157303,404239926,16711935,909508608,16725558,0,419365119,
6168,922681344,909522486,4142646,404226048,2037791,0,404690975,6168,910098432,909522486,922695222,404239926,419371263,404232216,16259096,
0,404684800,-59368,-1,65535,-65536,-252641281,-252645136,252702960,252645135,-61681,65535,0,-590816138,2013266038,-120784692,
-67059520,-1061109556,-33554240,1819044972,-855900052,-866111392,252,-656877442,1711276144,2087085670,1979760736,404232412,821821464,2026687608,1815673904,1824980678,
1815609400,1819068102,807141614,-859014120,120,2128337790,201719808,2128337790,1614332000,1623259328,-864550856,-858993460,-67108660,-67044352,808452096,3158268,
811598076,6303768,806879484,1585248,453902588,404232219,404232216,-669509608,808480984,805370880,1979711536,-596246308,1815609344,14444,0,1579008,
0,1572864,202309632,1827408908,1819810876,7105644,409993216,7888944,0,1010580540,0,0,113639424,-2013265778,-1610583002,-922877835,
1177190404,-402230512,-335949110,66501137,-387055440,-823650917,-402427182,1455622528,4374097,-1191054918,-290717689,-503256254,-1017226759,-1,-1,-1,
1397382379,1313875782,1212360513,1127556940,673204818,1866672451,1769109872,544499815,1347243843,1126191425,1970302319,544367988,1886547779,1952543343,544108393,842545457,
741554220,942421048,53,0,0,0,-385875968,317380634,686817476,692273960,1866679081,2037411951,1769108089,1751607145,544502888,1329808160,
1347243343,1363231056,1126178897,1836019523,1970303085,1702130805,544371301,1866679072,1886548591,1919905648,1952538994,1869179252,544108143,959525152,842545209,942418994,
741552952,876099628,942418996,758461752,1816215853,543976556,1769108000,1751607145,1937011816,1914708083,1936024946,1919247731,1702262386,778331237,-394320850,91557747,
1924775144,279007270,3155200,1951936572,1913076760,270437142,820215808,-338557775,-1976631502,-337461881,-1576554494,1235222601,-1342129408,1006875834,-1157204985,-725960704,
-1983672829,-1744805098,-2097041261,-2081553214,-1070398230,-1577038173,-1976696734,-1545435257,-472842166,-1870165202,5022690,-1976636463,-1595759961,-1071316891,-1564210625,-1976696731,
-1998410841,-1191156186,1426456592,1560321768,174885414,189565478,-402634336,91557587,1958296296,1023288347,638940418,218725504,-980808075,-1979686424,-389969176,-930480038,
1611565319,4825088,1008730297,-788367865,1007121633,47108,548930419,-151047417,1971322950,514585346,5291783,146391091,-1599343872,279445639,-189069708,-466032639,
-2097125984,-1964112702,2133065798,74727484,58029116,-1023391326,2041169,-523107407,-235532623,1913126016,1505820162,-1962986813,503335198,-561056205,7616197,-1264612818,
1458766818,-371045699,1593556590,-1064380276,119849759,-1744805214,653742672,1319305292,-779003392,-401820439,-782319777,1351388134,-1086265088,-2013247072,1251999814,21399552,
-2013240672,683870022,676352040,1347440680,134219776,268439552,1073758208,1073758208,674004992,774514989,807282974,808464432,1060126512,269484032,807411744,50397984,
1358954247,-1062706716,-816315787,-1444937457,1920270337,568786864,1642373606,-527702990,-337451331,-24407962,41077899,-1929591298,-1898410296,3193024,12374158,506625,
-855637064,-1251426800,1954595318,-1252475389,-2080323864,-1106742035,-1125599880,-2027427072,309754,45738707,10020864,-494807157,79233025,9234432,246685872,-768405299,
-402651975,-2135949186,871657702,869830336,-1995994149,-352261369,-469701888,-351531935,-352261376,610395648,-352261133,-436147456,-352261279,-469701888,1958783073,-436209661,
1894154416,-1056800584,-125106464,-67108677,712302395,-352321346,114179,-1904213831,-498684709,-1469979396,-150178368,1946157510,12812776,-1948652784,-101479466,-1070340609,
1107455,-1037633646,805606115,41302332,246679300,-320728883,-1073042237,246679156,-169144115,-61,-1,-1,-1,-1,-1,-1,
67187455,8388608,0,285290752,67266304,8388608,0,285376000,100820736,8388608,0,285370112,134479872,33554432,0,285474560,
100903936,33554432,0,285453056,84064512,8388608,0,285390848,134336000,16777216,9,285343488,84122880,8388608,0,285449216,
251888640,-65536,2048,285442816,84136960,-65536,0,285463552,117677312,8388608,0,285449216,151231744,8388608,2048,285449216,
134374400,16777216,0,285369088,67359744,8388608,0,285463552,0,0,0,0,67265536,0,0,285369344,
84136960,8388608,0,285463552,100910592,8388608,0,285459968,134479616,-65536,0,285474560,84073728,16777216,0,285400064,
117628160,16777216,0,285400064,100869376,-65536,0,285418752,134454272,-65536,7,285449216,235128320,-65536,2055,285459968,
268682752,-65536,2055,285459968,235142912,-65536,2055,285474560,168019456,-65536,2055,285459968,268626944,-65536,2055,285404160,
100869376,-65536,0,436413696,67266304,8388608,0,419587840,134375168,8388608,0,419587840,151226624,8388608,2055,419662080,
134409216,-65536,7,570616832,117687808,-65536,7,570672640,134465024,-65536,7,570672640,151242240,-65536,2055,570672640,
84133376,-65536,7,570672640,268591872,-65536,2055,1057121024,184811264,-65536,2055,553910016,251920128,-65536,2055,570687232,
251920128,-65536,2055,553910016,268697344,-65536,2055,1057226496,67314944,-65536,0,436413696,33760512,-65536,0,436413696,
134409216,-65536,7,553839616,100854784,-65536,7,553839616,84133376,8388608,0,419677696,200015616,-67106672,7340033,-2097152000,
-50657596,-2065253968,-1030827469,-1207928641,-1934889017,-628184120,1358955449,332202164,-1183055685,28835841,1494469890,208814707,-1,-1,8055295,-1146036766,
-92240666,-1339591552,154200078,511000744,1086053004,-1965322752,-1912572626,1961691866,1963501581,-423972855,8436356,416131819,1971372790,-1190687981,-74776567,276148211,
-393400898,-18153437,33472385,-562714027,-2065253200,8126698,113541888,-1931165957,-1275066648,-854143744,-1406206951,91497532,-337621784,1409008629,1465274961,4242206,
-494806130,-225771517,8166538,-1802770735,-771031040,-461102476,-2132277899,-31855689,-402295348,283883432,91606270,-340276248,1976368647,-1215436797,1516134175,-389063847,
-466434237,-1022081399,-971676024,-2013260730,-2130676698,72270,-15367,-1,-1,-1,-1,-50593793,-1957341666,4243180,-461054322,887622517,
174516234,-1310066572,1976368640,172917033,1719730752,-385876470,58001987,-402613271,91556424,-351662360,174490094,1317142463,-385875702,-855768956,703071605,-25433334,
-402295348,1928006260,41274622,-855741205,-974649995,-2140935414,141888508,-402008344,1458244154,1963785344,172917022,1719730752,-385876470,1114900967,-2130042392,-4257178,
17452673,-2144081152,91557372,-351659544,-335773655,-555219595,-2145391859,91614460,-351381272,-302219243,-790100619,-2146702578,58060540,-2146525720,1583156716,-1960390881,
-390003388,4366850,-1575729526,1183449155,-1572920302,1183449156,4563475,-1072544118,1185023720,273058304,-524287708,-1969222652,-427814538,-1564079601,-1977221049,-155580348,
1371794947,-386652999,275958151,-335415366,141887656,-492422424,-109005581,616153945,33012468,-1460879309,-402098928,-152918493,-1007058764,-1341917510,-3936766,-1,
-1,-50331649,-1157226912,-611450816,9832182,-467962752,1974156384,-1777434614,645939200,-1333854058,-81730016,-369098819,116785382,1950351510,1012982824,-2132249279,
-1090480602,9834112,386826256,548413440,-386195226,645923267,-1109458794,-1209401345,1556224,-1979647256,-111090472,365776820,1912602813,-434065400,-1679164640,1356892672,
360007228,1574646,-401705720,158575434,-434065158,1978399520,-434065264,-58655968,-2146994720,33592846,-58713109,-2146994719,16815630,-58716181,-2146798338,158726908,
9899648,1357600784,11200656,1574646,-2144701432,276055804,1923639528,1392279600,-461100172,250292088,1509110,-166824696,67114758,645928820,-336134120,-15996144,
1913047039,-384683008,401143249,646469632,669515797,16902144,520613253,-100371103,-822064664,1923712232,-1474828270,-404222606,-402099542,57846593,-1011254296,209314948,
9840256,-1775861506,351010048,1949891712,503087343,-58658956,-2132446166,-529254660,20900035,1692839344,-1023330328,20113488,1692839600,379634520,-1413945344,-58714252,
-33262258,-2146964544,158681852,679004414,-352315742,354826787,-2143128576,91499260,1966537856,-1777928697,829751808,1964899456,-1777928697,628424960,561570948,504027955,
427032598,1348592720,1642527780,201330664,-396237310,1967849480,1642485999,1397801816,1139146928,15401195,1088684267,15456394,1088684267,11597962,15418342,15401195,
-527810332,15401195,-528072476,-2116539565,1526799867,1482416246,396382403,82362368,646580004,-461373289,1959016967,-1759084532,101251072,48758935,1354979328,5433425,
645942645,-386989929,-307232680,-4628250,-1761151233,192221184,1172895714,-420171776,-2144867488,-285173978,-1610598424,-390070249,-2147015676,-134179034,9897480,-4628250,
-1761151233,41226240,645986274,1505689751,-95370408,201365408,-1761180096,-79648768,-1185823912,1692673808,-85982552,-15527,-1,-1,-1,-2013265921,
-1063413603,-1058225940,-1494371348,1575790316,-1248896333,898517389,508951476,1381390086,-1957670063,-1900006420,2016855256,4241408,113694862,-2113994688,16651878,-1979627894,
-58718618,1008431874,1008432920,1007056392,739471893,853051916,786682367,-331376641,20711403,-605491338,1552557759,1075742722,374243584,1532690944,1600019033,-815980793,
1973492456,-1580013553,602409586,-2130349056,71246,-435769149,180367882,-1190300444,28442628,-499457328,58063584,-1011796504,4275840,-2146536448,151011646,1239943028,
1977879217,-1967115480,-1977221050,-2135293108,-136129792,-930395934,61963752,-1978567741,78119238,162794101,18239105,-1870992640,1963007976,-1962986892,-472841890,-779646162,
-1341397265,-436147454,-386102774,-2132230116,125733553,-1967123480,233309310,63341504,1186993128,25067590,-402295547,451657736,-1224701024,1958749211,-1474054392,-1224575680,
-1075386326,-402555766,-293355552,32892933,129570677,4374272,1957719016,-1577981701,1191545068,216593122,1093044416,-14292992,-389815286,1718984743,-1969107736,281343527,
-58716811,-2147256953,-998243348,-400062445,1253097320,-4650010,-1329796865,-466484048,50358006,-1274776637,-399578359,779419748,182846128,1911049655,125733567,167962560,
1709704830,63341503,-2084607000,1709704390,133071807,1962899176,374243598,646447105,-1326972863,-1008465154,-1179681048,-706215836,-502893393,-343886599,-1588205544,-1964111952,
635963006,20834495,585631605,-1262442495,28361600,-771338614,1040614624,136017152,-402637306,1204199713,-1142423548,604730623,1970289776,-5183371,753430645,-1593317201,
1183459210,549778949,-523238796,839143306,1958820580,71796821,-840429641,125733566,167962560,-1041758594,-1596200770,-402358390,-790053192,859010304,1552557787,21400073,
74711868,343213372,-1601247149,-2146127781,41222908,-667283536,-1014627725,57989899,-388540952,-1062731639,717439156,707406378,707406378,707406378,707406378,707406378,
707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,
707406378,707406378,707406378,707406378,707406378,1344940586,4241438,243325070,-1333788610,-1205803488,365793537,-1211148257,-1107892216,-352320839,4366851,-490872344,
4366584,28899523,1930808720,1040643595,460619776,485221426,-1191181637,-1070383863,4065014,-401771136,-186474521,-387156661,-2135642472,4073088,-1008465281,707406378,
707406378,-550884822,251798786,-162201829,-169277425,1256605193,-1209646395,-1114970109,-1010986008,607274378,1963080958,1280674574,-2147171709,-1971302795,-101822907,-61,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2130706433,124917244,1975516288,-65686483,1086254219,-1948348928,
-1107270890,-1023952896,57999424,-1901068098,-1950054714,-2117826832,-788463642,-1795215642,-1763063439,503773957,1398167381,-347057583,-1169010502,-1460923450,-1017619904,15429862,
1910767851,-344922429,-1979651328,-1015945532,-1,-1,-1,-1,-1,170731576,471402015,117835522,0,173690993,471402015,117835522,
0,170731576,1885603455,117833986,0,257052769,421070361,202050818,0,170731576,471402015,117835522,0,173690993,421070361,202050818,
0,170731576,1885603455,117833986,0,257052769,421070361,202050818,0,-54001480,1023431144,-126427264,-1897922376,-2116340776,1974097215,-1175047367,
44924928,-488897832,-1206356743,-661782464,1183360,1342225151,-1179287621,283639823,-1206653994,-1064435648,-1193767394,-1957691389,6225900,1085823064,-1009218048,-617359218,
-1437253759,-164404619,1871366451,-1948135166,-670913327,1047919586,-355269455,4241490,-1910587250,243928,1442089808,-13177549,1961691932,1085808140,-2133291520,-16772594,
-1940366049,-1940250664,1004143579,1025275587,460513152,106960363,1342224926,-1179206469,-1930952684,1627856853,-1946124102,-1010695208,12060190,2615488,-2143484043,871790279,
-1021376576,12060190,317214912,125065728,-389903536,1029177419,-310982784,-54321401,-617359218,-1437253759,-164418187,1871366451,-1948135166,-670913327,158727138,-355269455,
-1039935348,503734467,-1152384838,347715260,-719460352,-1168046305,-661913472,-768359933,-1193767229,-1064435648,243742,-1275056,525860958,-115218237,-1540429574,-1191506059,
-839348222,568916501,1955658660,-2110374920,-1962642176,-1996455882,-83879370,-117839677,-1543051014,396411899,-58670336,1025733632,91611149,-350483016,-533775079,800589173,
-2146440395,259491068,192213052,41279548,-4325200,855829503,-1007254026,1946221696,1978678278,-1023365118,603986080,-1775859197,216301568,396419082,87868160,-8365195,
-2141817085,1366761467,-116987823,645987189,-386989929,-206505716,-4628250,-1761151233,192221184,-102172702,-420171528,-2145064096,-285173978,-1963398168,98615495,1625735946,
-150995015,268474118,-136181387,-1325870104,-2141133068,-1090480346,-1946500263,-1996481482,994461196,1962967606,-2143909116,439761664,-1995869184,838868022,65796288,-67567184,
4241603,-1330587506,-1070431002,-1577028190,-222691186,-296374271,15401195,-1070464789,1951743212,-424562682,-2146571388,16812814,1912650984,387075,-2065254224,24438979,
-1297083021,817595622,2013624,-402652998,-1947675745,-1340478719,-1299913037,1173632,7683712,-1341558270,-1299913036,125057,-1291470909,2048047362,332206260,-1169026701,
1525416439,410353832,1954610304,-1476072689,-401443568,-522019973,-646591490,-747253762,-352258584,-855002040,-1258982893,1913900305,146035257,-511700019,29982912,-1194292648,
332203009,-58713229,-2146012150,292819452,1947270272,616663564,1947286545,-339608051,113118,332205236,-1830288269,-1329334016,-66525042,175390888,-2065254480,-336002895,
-1833922439,184284648,-1964149568,-1070391592,-661731189,-390020214,1007514628,-1341819633,-69670759,-922828290,-436858699,-85720827,-1946090333,855705102,616794816,1007514639,
-1341819633,-72030054,-1040267010,17163766,18392036,18484876,-1560261471,1319174400,16950016,4982471,244067858,113705038,860029400,31067788,243802107,-1329397643,
-1148918091,-92227616,-1157401472,330938355,47616,-1009624344,-2065254736,-2135417925,108298746,-1157613080,364492806,47616,-1009631512,-402638104,-138805168,3980033,
-319544135,208961704,-493205784,-260748298,183206068,-335416902,57934140,-1007083340,-393301766,135068438,-1901010806,-67430680,606201027,-352261125,-436147456,614589473,
-352261185,-436147456,12108705,66501120,-1342116882,-118952444,-301944679,-1202708797,-661782464,-419492936,-352261216,-2069830656,-1978108736,-352261152,178381824,-352261180,
-341711360,-434065408,-1340019808,-350165493,-469701888,1958773792,-1461679598,-468945660,-339473887,-436147456,-2147423455,74776572,551952560,7022216,1489968984,1583044954,
119496031,21415631,113410816,116032492,2054489256,2121532072,16860870,1122898096,15401195,1256229612,15405488,1122894059,15401195,103500524,87883854,855800848,
-1962986816,771770654,-156268758,2030099584,-1967115518,-2147464690,997328123,1946680192,-165105354,-792163599,-1997942551,1720189774,-1998532606,61932870,-466427770,1183441107,
1228832774,108332544,-788371760,15402598,-1031601941,-154931705,54954225,-1325242744,-740521469,106858979,1183375570,65006341,50660611,-100400381,-455046576,-154892666,
1433667780,1903427644,242550844,-2134848384,-997793820,28346086,54281707,779443063,-990510672,-163285888,91570372,-348074880,-1075544047,1948304630,-538673143,-2031696762,
-461359125,-423328033,-339442042,-461336546,-423328225,-20674938,-2069777208,-1273858880,1959329442,-22825972,-1274645304,1976106660,-185669624,1692845194,-1262266117,612819976,
1958755520,2877481,578092980,-464516060,1476962438,45353588,309658792,250282420,205259188,45353076,41223336,-997588812,-87825358,-1326142488,-1335564627,7727269,
-1645700016,-424759052,65539684,-1878856960,-1006937905,-456882608,1963501702,1019512350,1343780610,-193271558,1692837552,15401195,1492414440,15401195,1492869350,-4986685,
141885364,547881140,28574324,-466434934,-391794493,-4980705,203690100,205259188,45353076,41223336,-997588812,-1329339342,125120,-335916861,-352261376,-1469783040,
-351767551,-469701888,-387126432,-430377964,-200349596,-18095,15401195,27813092,1952052961,-352261368,-345971712,-71290366,-1467554621,-1476234112,-15552,-1,
-1205928961,-661782464,520098721,-1205929009,-661782464,520097953,1090289871,-1084815755,418091776,1988099200,-1057193909,-1084815755,149656064,1939012736,-125085893,2130765697,
772272065,-125004289,182879,-120850231,-1510016819,-120601251,-1496865150,-1467963279,-121243451,-121243451,-121243451,-120325935,-1922913954,1968176256,-1258565887,46856582,
-466420992,-346071101,-336139285,-336401420,1609493488,-807128481,-2065260368,-468849533,604039969,841082559,-338499904,-436147456,853816020,1913900498,871140149,-992440640,
-1207928778,-661782464,411334,476870,9111238,1074185875,199819008,1008825589,-401902224,410318082,-2065259344,-1515191061,1757119718,2144694,-402652998,82562611,
-2065258832,-1022507901,637547240,-671742582,-388839646,-1023392120,-1744821528,-523058398,192543952,-1979371482,-2013247194,650314086,-955630302,1227262634,23496704,-1946209341,
512361046,-355401655,-75440175,-788105722,-337653270,-772812542,-773664273,-773664286,-772144158,65196514,-2130790406,74647291,-405745199,-738795638,-355348085,-355341615,
-511651338,63427079,1409008634,508973649,-1912586053,65176027,-1963816192,-788498276,143952870,1959922432,-461090692,-855766156,-855749004,-346529676,-347935124,-335484160,
762902564,-1862354864,1477823992,-809953678,29053699,-870258688,-131797925,-236842120,-361378818,15401195,2029528300,-352252924,619463213,-352252898,-301929728,267066916,
145769026,-1142030101,-337117179,-352056117,-301929728,-347977142,-335484160,1211430948,-1973880694,1516117991,-3187879,65535,0,-2122448896,-1715633755,-8487295,
-406585381,-26444033,947715838,940572688,947715708,2084044816,2097086008,269515832,2097052728,31800,406600728,-65536,-406600729,1006698495,1715618406,-1006698436,
-1715618407,118489027,-859013873,1715239116,406611558,859773054,1882206271,1669325040,1734566783,1520025830,1021830972,-528443046,-520552712,235012224,239009342,1008205826,
2115508350,1717966908,6710886,-612433818,454786011,1665007643,946629688,30924,2122186752,1008205950,1014896766,1008271128,404232318,404226072,1014896664,402653208,
403504652,805306368,811662944,0,-20922176,603979776,610729830,402653184,-33220,-16777216,406617855,0,0,2016411648,3158136,1819017264,
108,1819017216,1828613374,2083520620,-133400384,-973078480,1714428108,1815609542,-857967048,1616904310,192,806879232,811622496,811597848,806885400,1711276128,
1715273532,805306368,808516656,0,805306368,24624,64512,0,805306368,201719856,-1067438056,-964951936,-420028722,1882194044,808464432,-864550660,
-866109428,-864550660,-871614452,1008468088,218025068,-1057226722,-871625480,1614282872,-858982208,-855900040,808458252,-864550864,-859014964,-864550792,403471564,805306480,
805306416,805306416,805306416,806903856,811647072,24,-67108612,811597824,806882328,-864550816,3151884,-964952016,-1059135778,2016411768,-855847732,1727791308,
1717992550,1715208444,1723908288,1828192316,1818650214,1660813560,1651013736,1660813566,1617459304,1715208432,1724825792,-859045826,-858981172,813170892,808464432,203292792,
-859042804,1726349432,1718384748,1626341606,1717723232,-289013506,-958988546,-423231290,-959521034,1815609542,1824966342,1727791160,1616936038,-864550672,2027736268,1727791132,
1718385766,-864550682,-870551328,-1258553224,808464432,-859045768,-858993460,-859045636,2026687692,-960102352,-285288762,-960102202,1815623788,-859045690,808483020,-956432264,
1714559116,1618477310,1616928864,1623195768,101455920,410517506,404232216,940572792,50796,0,0,808517376,24,0,-864285576,1625292918,
1717992544,220,-859779976,203161720,-859014132,118,-1057174408,1815609464,1616965728,240,2093796470,1625356300,1717991020,3145958,808464496,786552,
-871625716,1625323724,1819831398,812646630,808464432,120,-687931700,198,-858993416,204,-858993544,120,2087085788,61536,2093796470,7692,
1617327836,240,209240188,806355192,875573372,24,-858993460,118,2026687692,48,-16853306,108,1815637190,198,2093796556,63500,
1680906492,807141628,808509488,404226076,404226072,819986456,808459312,-596246304,0,268435456,-960074696,1408958718,-13443958,523137,-472840329,-2052587730,
1541681918,1402746831,-1751355748,-325268836,1939678876,-99,-1,-1,-1,1380982527,7126614,-1912586056,1963261912,38076163,402816128,-1330114443,
1963207424,-1996191479,-2009071036,1048577092,1979646016,1057420823,276039424,1962496744,-434107381,-314906490,1692836272,4198142,212870005,-301731142,4130550,-468618233,
1948297350,-421583861,-317265786,1692836528,4138624,483221232,551952560,-820029350,-369098753,-2441,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-805306369,1381061456,4242206,28367758,16778886,1131675964,4581627,281874356,-1269699446,1494273283,-1261292718,-1273967358,
-401552120,393347124,-717569282,552136050,839676416,-2134442286,-546170370,436212456,45374153,-1996877619,520159246,1482381658,-401755953,376569860,861014704,1975551186,
-1272926206,-166212352,24379844,-3974407,-13390,-1,-1,-1,-1,541851647,1329803568,1363234893,9885162,791752944,942618930,-906223561]
}Compaq Portable III Information --- ### System ROM Locations U89 (EVEN) U72 (ODD) ### System ROM Revisions (Spare Part 107592-001) Rev Even ROM # Odd ROM # Size Date --- ---------- ---------- ---- ---- K 106779-002 106778-002 16Kb 1987-01-29 N.2 107825-001 107824-001 32Kb P.2 109738-001 109737-001 32Kb R.2 109738-002 109737-002 32Kb
[85,170,16,235,30,53,48,48,48,48,53,57,32,40,67,41,67,79,80,89,82,73,71,72,84,32,32,73,66,77,32,49,57,56,50,43,192,142,216, 250,161,76,0,163,0,1,161,78,0,163,2,1,199,6,76,0,86,2,140,14,78,0,184,96,7,163,52,0,140,14,54,0,199,6,100,0,134,1,140,14, 102,0,199,6,4,1,231,3,140,14,6,1,251,184,64,0,142,216,198,6,116,0,0,198,6,117,0,0,198,6,67,0,0,198,6,119,0,0,185,37,0,232, 242,0,115,5,226,249,233,191,0,185,1,0,186,128,0,184,0,18,205,19,115,3,233,175,0,184,0,20,205,19,115,3,233,165,0,199,6,108, 0,0,0,161,114,0,61,52,18,117,6,199,6,108,0,154,1,228,33,36,254,230,33,232,180,0,114,7,184,0,16,205,19,115,11,161,108,0,61, 190,1,114,236,235,117,144,185,1,0,186,128,0,184,0,17,205,19,114,103,184,0,9,205,19,114,96,184,0,200,142,192,43,219,184,0, 15,205,19,114,82,254,6,117,0,186,19,2,176,0,238,186,33,3,236,36,15,60,15,116,6,199,6,108,0,164,1,186,19,2,176,255,238,185, 1,0,186,129,0,43,192,205,19,114,64,184,0,17,205,19,115,11,161,108,0,61,190,1,114,235,235,47,144,184,0,9,205,19,114,39,254, 6,117,0,129,250,129,0,115,29,66,235,212,189,15,0,43,192,139,240,185,6,0,144,183,0,46,138,132,104,1,180,14,205,16,70,226,244, 249,250,228,33,12,1,230,33,251,232,165,0,203,49,55,48,49,13,10,81,82,248,185,0,1,232,7,6,238,232,3,6,236,36,2,116,3,226,242, 249,90,89,195,43,192,142,216,250,199,6,4,1,231,3,140,14,6,1,199,6,120,0,1,2,140,14,122,0,251,185,3,0,81,43,210,43,192,205, 19,114,15,184,1,2,43,210,142,194,187,0,124,185,1,0,205,19,89,115,10,128,252,128,116,10,226,222,235,6,144,234,0,124,0,0,43, 192,43,210,205,19,185,3,0,81,186,128,0,43,192,205,19,114,18,184,1,2,43,219,142,195,187,0,124,186,128,0,185,1,0,205,19,89, 114,8,161,254,125,61,85,170,116,203,226,215,205,24,207,2,37,2,8,42,255,80,246,25,4,30,184,64,0,142,216,138,38,119,0,80,198, 6,119,0,0,232,105,5,42,192,238,198,6,119,0,4,232,94,5,42,192,238,198,6,119,0,8,232,83,5,42,192,238,198,6,119,0,12,232,72, 5,42,192,238,176,7,230,10,250,228,33,12,32,230,33,251,88,136,38,119,0,31,195,128,250,128,115,5,205,64,202,2,0,251,10,228, 117,9,205,64,42,228,128,250,129,119,239,128,252,8,117,3,233,26,1,83,81,82,30,6,86,87,232,106,0,80,232,136,255,184,64,0,142, 216,88,138,38,116,0,128,252,1,245,95,94,7,31,90,89,91,202,2,0,56,3,77,3,86,3,96,3,106,3,114,3,121,3,128,3,48,3,39,4,207,4, 221,4,242,4,56,3,249,4,7,5,21,5,28,5,35,5,42,5,49,5,198,6,116,0,0,81,138,234,128,202,1,254,202,208,226,136,22,119,0,138,213, 128,226,1,177,5,210,226,10,214,136,22,67,0,89,195,80,184,64,0,142,216,88,128,252,1,117,3,235,85,144,128,234,128,128,250,8, 115,47,232,194,255,254,201,198,6,66,0,0,136,14,68,0,136,46,69,0,162,70,0,160,118,0,162,71,0,80,138,196,50,228,209,224,139, 240,61,42,0,88,115,5,46,255,164,156,2,198,6,116,0,1,176,0,195,232,67,4,238,232,63,4,236,36,2,116,6,198,6,116,0,5,195,233, 218,0,160,116,0,198,6,116,0,0,195,176,71,198,6,66,0,8,233,229,1,176,75,198,6,66,0,10,233,219,1,198,6,66,0,5,233,196,1,198, 6,66,0,6,235,12,198,6,66,0,7,235,5,198,6,66,0,4,160,68,0,36,192,162,68,0,233,166,1,30,6,83,43,192,142,216,196,30,4,1,184, 64,0,142,216,128,234,128,128,250,8,115,47,232,27,255,232,223,3,114,39,3,216,38,139,7,45,2,0,138,232,37,0,3,209,232,209,232, 12,17,138,200,38,138,119,2,254,206,138,22,117,0,43,192,91,7,31,202,2,0,198,6,116,0,7,180,7,42,192,43,210,43,201,249,235,234, 50,1,2,50,1,0,0,11,0,12,180,40,0,0,0,0,119,1,8,119,1,0,0,11,5,12,180,40,0,0,0,0,50,1,6,128,0,0,1,11,5,12,180,40,0,0,0,0,50, 1,4,50,1,0,0,11,5,12,180,40,0,0,0,0,198,6,66,0,12,198,6,67,0,0,232,16,0,114,13,198,6,66,0,12,198,6,67,0,32,232,1,0,195,42, 192,232,25,1,115,1,195,30,43,192,142,216,196,30,4,1,31,232,52,3,114,87,3,216,191,1,0,232,95,0,114,77,191,0,0,232,87,0,114, 69,191,2,0,232,79,0,114,61,191,4,0,232,71,0,114,53,191,3,0,232,63,0,114,45,191,6,0,232,55,0,114,37,191,5,0,232,47,0,114,29, 191,7,0,232,39,0,114,21,191,8,0,38,138,1,162,118,0,43,201,232,211,2,236,168,2,117,9,226,246,198,6,116,0,7,249,195,232,181, 2,236,36,2,117,241,195,232,197,1,114,7,232,167,2,38,138,1,238,195,232,25,0,114,107,198,6,66,0,229,176,71,235,104,232,11,0, 114,93,198,6,66,0,230,176,75,235,90,160,70,0,60,128,245,195,198,6,66,0,11,235,61,198,6,66,0,14,198,6,70,0,1,176,71,235,62, 198,6,66,0,15,198,6,70,0,1,176,75,235,48,198,6,66,0,0,235,26,198,6,66,0,1,235,19,198,6,66,0,224,235,12,198,6,66,0,227,235, 5,198,6,66,0,228,176,2,232,39,0,114,33,235,22,198,6,116,0,9,195,232,87,1,114,245,176,3,232,19,0,114,13,176,3,230,10,228,33, 36,223,230,33,232,170,1,232,59,0,195,190,66,0,232,27,2,238,232,28,2,238,43,201,232,12,2,236,36,15,60,13,116,9,226,247,198, 6,116,0,128,249,195,252,185,6,0,232,232,1,172,238,226,249,232,238,1,236,168,1,116,6,198,6,116,0,32,249,195,160,116,0,10,192, 117,1,195,184,64,0,142,192,43,192,139,248,198,6,66,0,3,42,192,232,171,255,114,35,185,4,0,232,203,0,114,32,232,173,1,236,38, 136,69,66,71,232,177,1,226,237,232,184,0,114,13,232,154,1,236,168,2,116,15,198,6,116,0,255,249,195,26,6,39,6,106,6,119,6, 38,138,30,66,0,138,195,36,15,128,227,48,42,255,177,3,211,235,46,255,167,227,5,0,32,64,32,128,0,32,0,64,16,16,2,0,4,64,0,0, 17,11,1,2,32,32,16,187,2,6,60,9,115,99,46,215,162,116,0,195,187,11,6,139,200,60,10,115,84,46,215,162,116,0,128,225,8,128, 249,8,117,42,198,6,66,0,13,42,192,232,27,255,114,30,232,62,0,114,25,232,32,1,236,138,200,232,51,0,114,14,232,21,1,236,168, 1,116,6,198,6,116,0,32,249,138,193,195,187,21,6,60,2,115,19,46,215,162,116,0,195,187,23,6,60,3,115,6,46,215,162,116,0,195, 198,6,116,0,187,195,81,43,201,232,238,0,236,168,1,117,8,226,249,198,6,116,0,128,249,89,195,80,160,70,0,60,129,88,114,2,249, 195,81,250,230,12,80,88,230,11,140,192,177,4,211,192,138,232,36,240,3,195,115,2,254,197,80,230,6,138,196,230,6,138,197,36, 15,230,130,160,70,0,208,224,254,200,138,224,176,255,80,160,66,0,60,229,116,7,60,230,116,3,88,235,17,88,184,4,2,83,42,255, 138,30,70,0,82,247,227,90,91,72,80,230,7,138,196,230,7,251,89,88,3,193,89,195,251,83,81,6,86,30,43,192,142,216,196,54,4,1, 31,42,255,38,138,92,9,138,38,66,0,128,252,4,117,6,38,138,92,10,235,9,128,252,227,117,4,38,138,92,11,43,201,232,68,0,236,36, 32,60,32,116,10,226,244,75,117,241,198,6,116,0,128,232,35,0,236,36,2,8,6,116,0,232,48,0,50,192,238,94,7,89,91,195,80,176, 32,230,32,176,7,230,10,228,33,12,32,230,33,88,207,186,32,3,80,42,228,160,119,0,3,208,88,195,232,240,255,66,195,232,248,255, 66,195,232,248,255,66,195,232,243,255,236,80,232,233,255,236,36,2,88,117,22,138,38,67,0,128,228,32,117,4,208,232,208,232, 36,3,177,4,210,224,42,228,195,249,195,48,56,47,49,54,47,56,50,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,201]
0320 = HF_PORT
0000:0034 4 HDISK_INT
0040:0042 1 CMD_BLOCK
0003 . DISK_SETUP: JMP SHORT L3
0005 . DB '5000059 (C)COPYRIGHT IBM 1982' ; COPYRIGHT NOTICE
0023 . L3: SUB AX,AX
016E @ HD_RESET_1
1503033 DISASSEMBLY
===================
A. Tarpai 2010 October
Comments and corrections are welcome to tarpai76 at gmail! Feel free
This file has been downloaded from http://www.halicery.com/8042/8042_1503033.TXT
For more detailed info on the 8042 please look at http://www.halicery.com/8042/8042_INTERN.TXT.
TOC
Intro
8042 ROM disassembly
8042 RAM map
What is this?
=============
Commented disassembly of the file 1503033.bin, a 2KB IBM ROM dump of an AT 8042 keyboard controller (KBC) from 1983. The rom is from the MESS project, I wrote a simple 41/42 disassembler and did my best to comment this wonderful vintage piece.
Why?
====
It is for historical interest.. and fun. An attept to understand how one of the 8042 KBC internally worked. I love keyboard hardware programming and it gave me a lot of headache to understand why are things like they are, and I was hoping to find some answers in this quite old and outdated code. Reading and commenting the code reminded me of the good ol' 8-bit days anyway and that I'm still alive..
Conclusions
===========
Not much actually..:) The 8042 programming interface is well documented by IBM and the firmware really does what it said to do. No hidden code or undocumented features. Still, it's very interesting - IMHO!
Syntax
======
Everything is hexa, $ is the sign. Eg. #$CF is an immediate hexa 8-bit value. The 2K Program memory (ROM) is separate from the small RAM (128 bytes). The RAM is also the place for 8 general purpose registers, R0-R7. @R0 and @R1 can be used to indirectly address the other RAM locations. There is an Accumulator (A). @A addresses locations in program ROM. P1 and P2 are the two 8-bit I/O ports. The two test input pins (T0 and T1) are directly tested by the conditional branch instructions, eg. JNT0 $0310 jumps when T0=0.
This firmware relies on the following
=====================================
+---------------+
| P27| -> DATA
| 8042 P26| -> _CLK (inverted)
| ==== |
| P17| <- KEYBOARD SWITCH (0=INHIBITED)
| |
| T0| <- CLK
| T1| <- DATA
(NB: P26 connects to an INVERTER and then drives the keyboard CLOCK line!)
STATUS bits
===========
STATUS is a physical register. Host reads it on 0x64:
sw-bits hw-bits
+---------------- ----------------+
<-- |PER|RTO|TTO|INH| |A0 | |IBF|OBF|
+---------------- ----------------+
Command Byte (CMD) bits in this 8042 firmware
=============================================
CMD is a byte in the 8042's RAM. Host can read it by writing 0x20 (or 0) to 0x64, then reading 0x60:
+--------------------------------+
<-- | - |XLAT|XT |_EN|OVR| F0|IBF|OBF|
+--------------------------------+
TODO
====
- There are some white spots, like the ROM checksum, and many small details to be cleared up.
- Find a PS/2-style keyboard/mouse controller ROM dump(!)
- Find a keyboard ROM dump (the 'other side')
***
Opening 1503033.bin
; START VECTORS
0000: 04 45 JMP $0045 ; -> Reset
0002: 00 NOP
0003: 04 3A JMP $003A ; -> IBF intr
0005: 00 NOP
0006: 00 NOP
0007: 04 21 JMP $0021 ; -> Timer intr
; Timer intr
; ==========
; This is something special: used as a general timeout in subroutines.
; It manipulates the Stack Pointer and pretends the
; called function returned with value 2 in the Accumulator.
; (And disables kbd on the wire). Brilliant.
0021: 65 STOP TCNT
0022: C7 MOV A,PSW
0023: 53 07 ANL A,#$07
0025: 07 DEC A ; dec SP
0026: A8 MOV R0,A
0027: C7 MOV A,PSW
0028: 53 F8 ANL A,#$F8
002A: 48 ORL A,R0
002B: D7 MOV PSW,A
002C: B8 20 MOV R0,#$20 ; check bit5 in CMD
002E: F0 MOV A,@R0
002F: B2 35 JB5 $0035
0031: 74 DE CALL $03DE ; AT-KBD: we pull CLK low and hold
0033: 04 37 JMP $0037
0035: 9A 7F ANL P2,#$7F ; XT-KBD: we just pull DATA low
0037: 23 02 MOV A,#$02
0039: 93 RETR
; IBF intr
; ========
; This is not supposed to happen
; and is considered as ERROR. We just count it in @2F.
; Then back to Main
003A: 65 STOP TCNT
003B: 15 DIS I
003C: B8 2F MOV R0,#$2F
003E: F0 MOV A,@R0
003F: 17 INC A
0040: C6 43 JZ $0043
0042: A0 MOV @R0,A
0043: 24 02 JMP $0102 ; -> Main
; Reset routine
; =============
;
; \/\/\__________ CLK pulled low
; _________ (AT-KBD disabled state?)
; \/\/\/ DATA set high
0045: 23 CF MOV A,#$CF ; DATA=1 CLK=0 (KBD DISABLED)
0047: 3A OUTL P2,A
0048: F5 EN FLAGS ; OBF/_IBF routing ON to P24/P25, but so far disabled (P2=CF)
0049: 26 4D JNT0 $004D
004B: 9A BF ANL P2,#$BF
004D: 09 IN A,P1
004E: 90 MOV STS,A ; Stage1
004F: D6 4F JNIBF $004F ; wait for data from Host..
0051: 23 10 MOV A,#$10
0053: 90 MOV STS,A
0054: 22 IN A,DBB
0055: 76 59 JF1 $0059
0057: 04 4F JMP $004F
0059: D3 AA XRL A,#$AA ; Command Self-Test?
005B: 96 4F JNZ $004F
005D: E4 06 JMP $0706 ; do Command AA (it will return here on success)
005F: 23 60 MOV A,#$60 ; Stage2. Init RAM variables
0061: 90 MOV STS,A
0062: B8 20 MOV R0,#$20
0064: B0 10 MOV @R0,#$10 ; @20=10 (CMD = kbd disable by default)
0066: 18 INC R0
0067: B0 01 MOV @R0,#$01 ; @21=1 (this is how many times we try after parity error)
0069: 18 INC R0
006A: B0 06 MOV @R0,#$06 ; @22=6
006C: 18 INC R0
006D: 18 INC R0
006E: 18 INC R0
006F: B0 01 MOV @R0,#$01 ; @25=1
0071: 18 INC R0
0072: 18 INC R0
0073: B0 FB MOV @R0,#$FB ; @27=FB (Timer reload value for send data to kbd)
0075: 18 INC R0
0076: B0 E0 MOV @R0,#$E0 ; @28=E0 (Timer reload before read scan code?)
0078: 18 INC R0
0079: B0 06 MOV @R0,#$06 ; @29=6
007B: 18 INC R0
007C: B0 10 MOV @R0,#$10 ; @2A=10 (pull CLK low and hold for AT-KBD in a loop of @2A)
007E: 18 INC R0
007F: B0 20 MOV @R0,#$20 ; @2B=20 (base for RAM address read/write commands)
0081: 18 INC R0
0082: B0 15 MOV @R0,#$15 ; @2C=15 (set and hold CLK/DATA for XT-KBD in a loop of 256 x @2C before IDLE)
0084: BC 55 MOV R4,#$55 ; Send 55 to Host (Self-test completed)
0086: B9 00 MOV R1,#$00
0088: 74 D3 CALL $03D3
008A: 24 02 JMP $0102 ; -> Main
; to read this page
008C: A3 MOVP A,@A
008D: 83 RET
; to read this page
0100: A3 MOVP A,@A
0101: 83 RET
; Main Entry
; ==========
0102: 86 0A JOBF $010A ; DBBOUT still full? (wait until Host reads out previous byte sent)
0104: D6 10 JNIBF $0110 ; DBBOUT empty, go an poll kbd if enabled
; DBBIN is full: parse command/data
0106: 76 49 JF1 $0149 ; Command written to 0x64. Returns to $0102
0108: 44 02 JMP $0202 ; Data is written to 0x60. Returns to $0102
010A: D6 02 JNIBF $0102 ; DBBOUT full, loop until emptied or we receive sth
010C: 76 06 JF1 $0106
010E: 24 02 JMP $0102 ; -> Main
; DBBIN empty: deal with kbd
0110: B8 20 MOV R0,#$20 ;
0112: F0 MOV A,@R0
0113: 92 02 JB4 $0102 ; _EN set -> kbd disabled, back to Main loop
; KBD enabled: do XT- or AT-protocol based on CMD5
0115: B2 3F JB5 $013F ; XT-kbd?
; AT-KBD enabled
; (or has just been enabled by Host, @2E=1: then we make sure DATA is high)
0117: B8 28 MOV R0,#$28 ; Preload Timer for later call $03AE (READ BYTE FROM AT-KBD)
0119: F0 MOV A,@R0
011A: 62 MOV T,A
011B: B8 2E MOV R0,#$2E ; Host has just enabled kbd by clearing _EN in CMD?
011D: F0 MOV A,@R0
011E: C6 26 JZ $0126
0120: 46 02 JNT1 $0102 ; ??? start all over if DATA is pulled low??
0122: 46 02 JNT1 $0102 ; ??? make sure DATA is still high??
0124: 27 CLR A ; OK, DATA is Idle
0125: A0 MOV @R0,A ; clear flag, release CLK and do the poll loop
0126: 9A BF ANL P2,#$BF ; release CLK!
0128: 24 2A JMP $012A ; and do the AT-KBD Main Poll Loop
; AT-KBD Main Poll Loop of CLK and IBF
; ====================================
; Either CLK gets pulled down by AT-KBD
; or Host sends a byte will exit from here
012A: 26 32 JNT0 $0132 ; kbd pulled CLK down?
012C: D6 2A JNIBF $012A ; Host wrote 0x60 or 0x64
; byte arrived from Host in AT-mode
012E: 74 DE CALL $03DE ; pull CLK low and hold (disable kbd.. it will be re-enabled when reading the response byte)
0130: 24 06 JMP $0106 ; and deal with command/data from Host. Returns to $0102
; DBBIN empty
; AT-KBD pulled CLK down
0132: 26 4B JNT0 $014B
; CLK fall was noise, count ERROR in @24 and loop again
; CLK |_| short fall
0134: 74 DE CALL $03DE
0136: B8 24 MOV R0,#$24
0138: F0 MOV A,@R0
0139: 17 INC A
013A: C6 26 JZ $0126
013C: A0 MOV @R0,A
013D: 24 26 JMP $0126
; XT-KBD Main Poll Loop of CLK and IBF
; ====================================
; (strange, CLK always checked twice.. ?)
013F: 36 45 JT0 $0145
0141: 36 3F JT0 $013F
0143: 84 02 JMP $0402 ; XT-KBD has pulled CLK low -> read scan code
0145: D6 3F JNIBF $013F
; byte arrived from Host in XT-mode: now what?
; (XT-KBD is uni-directional.. funny)
0147: 24 06 JMP $0106 ; Command, XT-mode(!)
0149: A4 02 JMP $0502 ; Command Parser, AT-mode
; OK, AT-KBD pulled the CLK down
; (scan code is expected)
014B: 74 AE CALL $03AE ; READ BYTE FROM AT-KBD
014D: 12 53 JB0 $0153 ; parity error?
014F: 32 79 JB1 $0179 ; timeout error?
0151: 24 7F JMP $017F ; OK ->
; scan code received with Parity Error
0153: B8 21 MOV R0,#$21 ; # of retry-s variable @21 (=1 init)
0155: F0 MOV A,@R0
0156: C6 75 JZ $0175
0158: AD MOV R5,A ; if we allow retry (normally do, 1) -> loop in R5
; Resend RETRY after Parity error
0159: B8 23 MOV R0,#$23 ; inc ERROR COUNTER @23
015B: F0 MOV A,@R0
015C: 17 INC A
015D: C6 60 JZ $0160
015F: A0 MOV @R0,A
0160: BC FE MOV R4,#$FE ; Send FE (resend) to AT-KBD
0162: 54 32 CALL $0232
0164: 32 75 JB1 $0175 ; did sending FE timed out?
0166: B9 29 MOV R1,#$29 ; Receive scan code again from AT-KBD, call 380 passing R1=29(?)
0168: 74 80 CALL $0380
016A: 12 73 JB0 $0173 ; did second attempt ended with Parity Error again? Try again, loop
016C: 32 75 JB1 $0175 ; did second attempt ended with Time Out?
016E: FC MOV A,R4
016F: D3 FE XRL A,#$FE
0171: 96 7F JNZ $017F
0173: ED 59 DJNZ R5,$0159
0175: B9 80 MOV R1,#$80 ; sending FE to AT-KBD Timed out
0177: 24 7B JMP $017B
; Scan code receive ended with Timeout Error
0179: B9 40 MOV R1,#$40
017B: BC 00 MOV R4,#$00
017D: 24 81 JMP $0181
; Send received scan code from AT-KBD to Host
; Translation set?
017F: B9 00 MOV R1,#$00
0181: B8 20 MOV R0,#$20
0183: F0 MOV A,@R0
0184: 37 CPL A
0185: D2 BE JB6 $01BE ; XLAT?
; XLAT=1
; Translate set-2 to set-1
; Watch for
; - set-2 scan codes over 0x7f
; - F0 break codes
; - INH and key switch
0187: FC MOV A,R4 ; XLAT ON: translate to set-1 (7-bit make codes, msb set for break codes)
0188: D3 83 XRL A,#$83
018A: 96 90 JNZ $0190
018C: BC 02 MOV R4,#$02 ; 0x80 -> 0x02 (=F7)
018E: 24 97 JMP $0197
0190: FC MOV A,R4
0191: D3 84 XRL A,#$84
0193: 96 97 JNZ $0197
0195: BC 7F MOV R4,#$7F ; 0x84 -> 0x7F (=SysRq, the new key pressed)
0197: F0 MOV A,@R0 ; Send scan code to Host only if (INH || SW)
0198: 72 A6 JB3 $01A6 ; (INH=CMD3, SW=P17)
019A: 09 IN A,P1
019B: F2 A6 JB7 $01A6
019D: FC MOV A,R4 ; KBD disabled.
019E: F2 B4 JB7 $01B4 ; Just store make/break in @2D and exit
01A0: 27 CLR A
01A1: B8 2D MOV R0,#$2D
01A3: A0 MOV @R0,A
01A4: 24 C0 JMP $01C0
01A6: FC MOV A,R4 ; KBD enabled.
01A7: F2 B4 JB7 $01B4 ; Is it break code?
01A9: E3 MOVP3 A,@A ; No, do the translation (table at $0300, 128 bytes)
01AA: AC MOV R4,A ; get possible break code bit
01AB: B8 2D MOV R0,#$2D
01AD: F0 MOV A,@R0
01AE: 4C ORL A,R4
01AF: AC MOV R4,A
01B0: 27 CLR A
01B1: A0 MOV @R0,A
01B2: 24 BE JMP $01BE ; send to Host
01B4: D3 F0 XRL A,#$F0 ; did AT-KBD send us the break code (F0)?
01B6: 96 BE JNZ $01BE ; no, send R4 to Host and exit
01B8: B8 2D MOV R0,#$2D ; yes, set flag @2D and exit
01BA: B0 80 MOV @R0,#$80
01BC: 24 C0 JMP $01C0
; XLAT=0, do nothing
; Send byte and status to Host
01BE: 74 D3 CALL $03D3 ; R4->DBBOUT, R1->STATUS
01C0: 24 02 JMP $0102 ; -> Main
***************************************************************
** BANK 2: **
** **
** $0202 Send Keyboard Command to KBD and read reply **
** $0232 Send byte to KBD **
***************************************************************
; to read this page
0200: A3 MOVP A,@A
0201: 83 RET
; Host has written to 0x60
0202: 22 IN A,DBB
0203: AC MOV R4,A
0204: B8 20 MOV R0,#$20
0206: F0 MOV A,@R0
0207: 53 EF ANL A,#$EF
0209: A0 MOV @R0,A ; enable kbd in CMD BYTE (for reading response?) - will be disabled before back to Main
020A: B2 2E JB5 $022E ; CMD5?
; Send Byte to AT-kbd
020C: 54 32 CALL $0232 ; Send byte in R4
020E: 8A 80 ORL P2,#$80 ; DATA=1 (above returned with CLK pulled low)
0210: B9 20 MOV R1,#$20
0212: 32 28 JB1 $0228 ; Timeout Error? Set TxTO and Resend
0214: B8 22 MOV R0,#$22 ; pass @22 to $0380 if non-zero (=6 on reset)
0216: F0 MOV A,@R0
0217: C6 30 JZ $0230
0219: A9 MOV R1,A ; receive reply (pass 6 in R1?)
021A: 74 80 CALL $0380
021C: B9 A0 MOV R1,#$A0
021E: 12 28 JB0 $0228 ; Parity Error? Set PERR & RxTO and Resend
0220: B9 60 MOV R1,#$60
0222: 32 28 JB1 $0228 ; Timeout Error? Set RxTO & TxTO and Resend
0224: B9 00 MOV R1,#$00 ; OK. Send reply byte to Host
0226: 44 2A JMP $022A
; Parity Error occured during sending byte to kbd
0228: BC FE MOV R4,#$FE ; Send FE to Host (resend)
022A: 74 D3 CALL $03D3
022C: 44 30 JMP $0230 ; -> Main
022E: 94 50 CALL $0450 ; Send Byte to XT-kbd
0230: 24 02 JMP $0102 ; -> Main
; Send byte in AT-keyboard protocol (byte in R4)
0232: 9A 7F ANL P2,#$7F ; pull DATA low
0234: 74 DE CALL $03DE ; pull CLK low and hold (prepare AT-kbd to receive byte?)
0236: B8 26 MOV R0,#$26
0238: F0 MOV A,@R0
0239: 62 MOV T,A ; Timer Reload with @26 for start bit
023A: 55 STRT T
023B: B8 27 MOV R0,#$27
023D: BA 08 MOV R2,#$08
023F: BB 00 MOV R3,#$00
0241: 9A BF ANL P2,#$BF ; release CLK!
0243: FC MOV A,R4 ; loop for sending 8 data bits
0244: 67 RRC A
0245: AC MOV R4,A
0246: 36 46 JT0 $0246 ; wait for CLK falling edge..
0248: F6 4E JC $024E
024A: 9A 7F ANL P2,#$7F ; then write DATA
024C: 44 51 JMP $0251
024E: 8A 80 ORL P2,#$80
0250: 1B INC R3 ; compute parity
0251: 65 STOP TCNT
0252: F0 MOV A,@R0
0253: 62 MOV T,A ; Timer Reload with @27 for data bits
0254: 55 STRT T
0255: 26 55 JNT0 $0255 ; wait for CLK rising edge..
0257: EA 43 DJNZ R2,$0243 ; next data bit
0259: 23 01 MOV A,#$01 ; send Parity bit
025B: DB XRL A,R3
025C: 67 RRC A
025D: 36 5D JT0 $025D
025F: F6 65 JC $0265
0261: 9A 7F ANL P2,#$7F
0263: 44 67 JMP $0267
0265: 8A 80 ORL P2,#$80
0267: 65 STOP TCNT
0268: F0 MOV A,@R0 ; send Stop bit..
0269: 62 MOV T,A
026A: 55 STRT T
026B: 26 6B JNT0 $026B
026D: 44 6F JMP $026F
026F: 36 6F JT0 $026F
0271: 8A 80 ORL P2,#$80
0273: 65 STOP TCNT
0274: F0 MOV A,@R0 ; Wait for |_| on DATA (ACK)..
0275: 62 MOV T,A
0276: 55 STRT T
0277: 56 77 JT1 $0277
0279: 44 7B JMP $027B
027B: 46 7B JNT1 $027B
027D: 65 STOP TCNT
027E: 00 NOP
027F: 74 DE CALL $03DE ; pull CLK low and hold
0281: 27 CLR A ; return A=0, OK
0282: 83 RET
*******************************************************************************
** BANK 3: **
** **
** $0300 set-2 to set-1 translation table (128 entries) **
** $0380 Read byte from AT-KBD (wait first for CLK pulled low by kbd) **
** $03AE Read byte from AT-KBD (CLK already pulled low by kbd) **
** $03D3 SEND BYTE to HOST (R4) and set STATUS (R1) **
** $03DE PULL CLK LOW and HOLD for AT-KBD **
*******************************************************************************
0300: ff 43 41 3f 3d 3b 3c 58 | 64 44 42 40 3e 0f 29 59
0310: 65 38 2a 70 1d 10 02 5a | 66 71 2c 1f 1e 11 03 5b
0320: 67 2e 2d 20 12 05 04 5c | 68 39 2f 21 14 13 06 5d
0330: 69 31 30 23 22 15 07 5e | 6a 72 32 24 16 08 09 5f
0340: 6b 33 25 17 18 0b 0a 60 | 6c 34 35 26 27 19 0c 61
0350: 6d 73 28 74 1a 0d 62 6e | 3a 36 1c 1b 75 2b 63 76
0360: 55 56 77 78 79 7a 0e 7b | 7c 4f 7d 4b 47 7e 7f 6f
0370: 52 53 50 4c 4d 48 01 45 | 57 4e 51 4a 37 49 46 54
; This was always a little mistique.. what is this really?
0380: B8 28 MOV R0,#$28 ; reload Timer with @28
0382: F0 MOV A,@R0 ; that is for $03AE!
0383: 62 MOV T,A
0384: 9A BF ANL P2,#$BF ; release CLK.. and wait for kbd to answer in a doesn't-make-sense-way(?)
0386: 27 CLR A ; loop R1-times (6?)
0387: 26 AC JNT0 $03AC ;CLK pulled low by kbd?
0389: 17 INC A
038A: C6 90 JZ $0390
038C: 26 AC JNT0 $03AC
038E: 64 87 JMP $0387
0390: 26 AC JNT0 $03AC
0392: C9 DEC R1
0393: F9 MOV A,R1
0394: 96 86 JNZ $0386
0396: 64 A7 JMP $03A7 ; disable kbd and return with Timeout Error
0398: AA MOV R2,A
0399: 74 DE CALL $03DE ; pull CLK low and hold
039B: FA MOV A,R2
039C: 17 INC A
039D: C6 A3 JZ $03A3
039F: 9A BF ANL P2,#$BF ; release CLK..
03A1: 64 87 JMP $0387
03A3: C9 DEC R1
03A4: F9 MOV A,R1
03A5: 96 84 JNZ $0384
03A7: 74 DE CALL $03DE ; pull CLK low and hold
03A9: 23 02 MOV A,#$02 ; disable kbd and return with Timeout Error
03AB: 83 RET
03AC: 36 98 JT0 $0398 ; CLK pulled low by kbd AND stable? Yes.. we fall thru start reading byte
; Receive byte from AT-keyboard
; CLK fell.. and CMD5=0. Timer should be preloaded.
; we read DATA on falling edges of CLK
; and compute parity (will be returned in A)
; (Amazing how much 8-bit code fits into 37 bytes!:)
03AE: 55 STRT T
03AF: BA 09 MOV R2,#$09
03B1: BB 00 MOV R3,#$00
03B3: 26 B3 JNT0 $03B3
03B5: 67 RRC A
03B6: 36 B6 JT0 $03B6 ; wait for CLK falling edge..
03B8: 97 CLR C
03B9: 46 BD JNT1 $03BD ; read in DATA into Carry
03BB: A7 CPL C
03BC: 1B INC R3
03BD: EA B3 DJNZ R2,$03B3
03BF: AC MOV R4,A
03C0: 26 C0 JNT0 $03C0
03C2: 64 C4 JMP $03C4
03C4: 36 C4 JT0 $03C4
03C6: 65 STOP TCNT ; done
03C7: 00 NOP
03C8: 74 DE CALL $03DE ; pull CLK low
03CA: FB MOV A,R3 ; return parity: A=0 is OK
03CB: 12 D1 JB0 $03D1
03CD: 23 01 MOV A,#$01
03CF: 64 D2 JMP $03D2
03D1: 27 CLR A
03D2: 83 RET
; Send data and status to Host
; R1 -> STATUS (host can read 0x64)
; R4 -> DBBOUT (host can read 0x60)
; this then sets OBF -> IRQ1 on AT
03D3: 09 IN A,P1 ; Copy keylock status bit
03D4: 53 80 ANL A,#$80
03D6: 77 RR A
03D7: 77 RR A
03D8: 77 RR A
03D9: 49 ORL A,R1
03DA: 90 MOV STS,A ; write STATUS
03DB: FC MOV A,R4
03DC: 02 OUT DBB,A ; write DBBOUT
03DD: 83 RET
; Frequently called.
; What does this mean to an AT-keyboard? Disable? Abort sending scan codes and wait for command?
; __
; \____ _ _ pull CLK low and hold stable a while
03DE: 8A 40 ORL P2,#$40
03E0: B8 2A MOV R0,#$2A
03E2: F0 MOV A,@R0
03E3: A8 MOV R0,A
03E4: E8 E4 DJNZ R0,$03E4
03E6: 83 RET
*****************************************************************
** BANK 4: XT-keyboard protocol routines **
** **
** $0402 Read byte from XT-KBD **
** $0450 Send byte to XT-KBD (hae?) **
*****************************************************************
; to read this page
0400: A3 MOVP A,@A
0401: 83 RET
; Read scan code from XT-KBD and handle errors
; send result to Host
0402: 94 1C CALL $041C
0404: 12 1A JB0 $041A ;
0406: 32 14 JB1 $0414
0408: B9 00 MOV R1,#$00
040A: B8 20 MOV R0,#$20
040C: F0 MOV A,@R0
040D: 72 18 JB3 $0418
040F: 09 IN A,P1
0410: F2 18 JB7 $0418 ; SW=1 send scan code to Host
0412: 84 1A JMP $041A ; SW=0 exit to Main
0414: B9 40 MOV R1,#$40 ;
0416: BC FF MOV R4,#$FF
0418: 74 D3 CALL $03D3
041A: 24 02 JMP $0102 ; -> Main
; Receive byte in XT-keyboard protocol
; CLK fell.. and CMD5=1
041C: 27 CLR A
041D: 62 MOV T,A
041E: 55 STRT T
041F: B8 09 MOV R0,#$09
0421: 27 CLR A
0422: 8A 80 ORL P2,#$80
0424: 00 NOP
0425: 00 NOP
0426: 00 NOP
0427: 00 NOP
0428: 26 37 JNT0 $0437
042A: B8 24 MOV R0,#$24
042C: F0 MOV A,@R0
042D: 17 INC A
042E: C6 31 JZ $0431
0430: A0 MOV @R0,A
0431: 23 01 MOV A,#$01
0433: 9A 7F ANL P2,#$7F
0435: 84 4E JMP $044E
0437: 26 37 JNT0 $0437
0439: 26 37 JNT0 $0437
043B: 97 CLR C
043C: 46 3F JNT1 $043F
043E: A7 CPL C
043F: 67 RRC A
0440: 36 40 JT0 $0440
0442: 36 40 JT0 $0440
0444: E8 37 DJNZ R0,$0437
0446: 9A 7F ANL P2,#$7F
0448: 26 48 JNT0 $0448
044A: 26 48 JNT0 $0448
044C: AC MOV R4,A
044D: 27 CLR A
044E: 65 STOP TCNT
044F: 83 RET
; Send byte to XT-keyboard???
0450: D2 54 JB6 $0454 ; XLAT?
0452: 84 68 JMP $0468
0454: B9 00 MOV R1,#$00 ; XLAT=1
0456: E9 56 DJNZ R1,$0456
0458: FC MOV A,R4
0459: AA MOV R2,A
045A: D3 EE XRL A,#$EE
045C: C6 60 JZ $0460
045E: BC FA MOV R4,#$FA
0460: B9 00 MOV R1,#$00
0462: 74 D3 CALL $03D3 ; Send to Host
0464: FA MOV A,R2
0465: 17 INC A
0466: 96 7A JNZ $047A
; Set and hold.. then IDLE for XT-keyboard(?)
; ___
; CLK \___ __ __/
; __ __ _
; DATA / \____
0468: 8A 40 ORL P2,#$40 ; XLAT=0
046A: 8A 80 ORL P2,#$80
046C: B8 2C MOV R0,#$2C ; pull CLK low and set DATA high
046E: F0 MOV A,@R0
046F: A8 MOV R0,A
0470: B9 00 MOV R1,#$00
0472: E9 72 DJNZ R1,$0472
0474: E8 72 DJNZ R0,$0472 ; hold it in a loop of 256 x @2C
0476: 9A 7F ANL P2,#$7F
0478: 9A BF ANL P2,#$BF ; set the XT idle state
047A: 83 RET
*******************************************************************************
** **
** BANK 5: Command parser and most Commands **
*******************************************************************************
; to read this page
0500: A3 MOVP A,@A
0501: 83 RET
; There is a byte in DBBIN written to 0x64 bu the Host
0502: 22 IN A,DBB
; xxxx xxxx
0503: F2 09 JB7 $0509
; 0xxx xxxx
0505: D2 12 JB6 $0512
; 00xx xxxx
0507: A4 0D JMP $050D
; 1xxx xxxx
0509: D2 8C JB6 $058C
; 10xx xxxx
050B: A4 62 JMP $0562
; Command 00xx xxxx: Read RAM
; 0x00-0x1F will read 0x20-0x3F
; 0x20-0x3F will read 0x20-0x3F
050D: B4 59 CALL $0559 ; Compute RAM address
050F: F0 MOV A,@R0 ; read RAM into A
0510: A4 DE JMP $05DE ; -> send A to Host and go Main
; Command 01xx xxxx: Write RAM
; 0x40-0x5F will write 0x20-0x3F
; 0x60-0x7F will write 0x20-0x3F
0512: B4 59 CALL $0559 ; Compute RAM address
0514: D6 14 JNIBF $0514 ; wait for byte from Host..
0516: 76 02 JF1 $0502 ; command? abort
0518: D3 20 XRL A,#$20 ; Host writes CMD BYTE?
051A: C6 20 JZ $0520 ; no, write RAM and exit
051C: 22 IN A,DBB
051D: A0 MOV @R0,A
051E: A4 E3 JMP $05E3 ; -> Main
; This is special: Host writes CMD BYTE at 0x20
; watch the bits
0520: F0 MOV A,@R0 ; save CMD
0521: A9 MOV R1,A ; into R1 (for re-enabling the AT-KBD)
0522: 22 IN A,DBB
0523: A0 MOV @R0,A ; write CMD (!)
0524: 12 42 JB0 $0542 ; CMD0 (OBF)
0526: 9A EF ANL P2,#$EF ; P24=0 (OBF routed)
0528: 32 46 JB1 $0546 ; CMD1 (_IBF)
052A: 9A DF ANL P2,#$DF ; P25=0
052C: 52 4A JB2 $054A ; CMD2 (mirror of F0 in STATUS)
052E: 85 CLR F0 ; F0=0
052F: 92 4F JB4 $054F ; CMD4 (_EN)
0531: F9 MOV A,R1 ; check previous _EN
0532: 37 CPL A
0533: 92 39 JB4 $0539 ; _EN 1->0 transition? Host enabled a previously disabled keyboard?
0535: B9 2E MOV R1,#$2E ; just set flag @2E=1 for Main and do next bit
0537: B1 01 MOV @R1,#$01 ; (bc that will leave the AT-KBD disabled, CLK low!)
0539: F0 MOV A,@R0
053A: B2 53 JB5 $0553 ; CMD5?
; CMD5=0, set AT-KBD protocol: DISABLE AT-KBD on the wire immediately
; ______
; __/ set DATA high (idle)
; ___
; \_____ pull CLK low (= disable AT-KBD)
053C: 8A 80 ORL P2,#$80
053E: 8A 40 ORL P2,#$40
0540: A4 E3 JMP $05E3 ; -> Main
; Host wrote CMD0 (OBF)
0542: 8A 10 ORL P2,#$10 ; P24=1 means enable OBF routing (= IRQ1 enable on AT)
0544: A4 28 JMP $0528 ; next bit..
; Host wrote CMD1 (_IBF)
0546: 8A 20 ORL P2,#$20 ; P25=1
0548: A4 2C JMP $052C
; CMD2 (mirror of F0 in STATUS)
054A: B6 2F JF0 $052F
054C: 95 CPL F0 ; F0=1
054D: A4 2F JMP $052F
; Host set CMD4 (_EN) = DISABLE KEYBOARD
; __
; \______ pull CLK LOW immediately
054F: 8A 40 ORL P2,#$40
0551: A4 3A JMP $053A
; CMD=1 (XT-keyboard protocol): SET XT-KBD to IDLE on the wire immediately
; __
; \______ DATA pulled low
; _____
; ___/ CLK high (idle) = this is XT-mode IDLE state.
0553: 9A 7F ANL P2,#$7F
0555: 9A BF ANL P2,#$BF
0557: A4 E3 JMP $05E3 ; -> Main
; Compute RAM address for R/W commands
; if 001x xxxx (0x20 - 0x3F) we leave it (actual RAM address)
; if 000x xxxx (0x00 - 0x1F) we add the value @2B (that is reset to 0x20)
0559: 53 3F ANL A,#$3F
055B: B2 60 JB5 $0560
055D: B8 2B MOV R0,#$2B
055F: 60 ADD A,@R0
0560: A8 MOV R0,A
0561: 83 RET ; return RAM address in R0
; 10xx xxxx
0562: 03 56 ADD A,#$56
0564: 96 68 JNZ $0568
; Command AA
; Self-test and Reset
0566: E4 00 JMP $0700
0568: 07 DEC A
0569: 96 6F JNZ $056F
; Command AB
; Test kbd interface (DATA and CLK lines)
056B: D4 69 CALL $0669 ; returns 0 (OK), 1, 2, 3 or 4 in R4
056D: A4 DF JMP $05DF ; -> send R4 to Host with OK, then ->Main
056F: 07 DEC A
0570: 96 76 JNZ $0576
; Command AC
; Diagnostic Dump of 20 bytes in scan code set-1 format
0572: D4 12 CALL $0612
0574: A4 E3 JMP $05E3 ; -> Main
0576: 07 DEC A
0577: 96 81 JNZ $0581
; Command AD
; Disable kbd interface
; = set _EN
0579: B8 20 MOV R0,#$20
057B: F0 MOV A,@R0
057C: 43 10 ORL A,#$10 ; CMD4=1 _EN (kbd disabled)
057E: A0 MOV @R0,A
057F: A4 E3 JMP $05E3 ; -> Main
0581: 07 DEC A
0582: 96 E3 JNZ $05E3 ; -> Main
; Command AE
; Enable kbd interface
; = clr _EN
0584: B8 20 MOV R0,#$20
0586: F0 MOV A,@R0
0587: 53 EF ANL A,#$EF ; CMD4=0 _EN (kbd enabled)
0589: A0 MOV @R0,A
058A: A4 E3 JMP $05E3 ; -> Main
; 11xx xxxx
058C: B2 AC JB5 $05AC
; 110x xxxx
058E: 92 CE JB4 $05CE
; 1100 xxxx
0590: D3 C0 XRL A,#$C0
0592: 96 97 JNZ $0597
; Command C0
; Read P1 into A and return
0594: 09 IN A,P1
0595: A4 DE JMP $05DE ; -> send A to Host and -> Main
0597: D3 02 XRL A,#$02
0599: 96 A1 JNZ $05A1
; Command C2
; Read P1 higher nibble into STATUS (4..7 only)
; and loop until Host writes a dummy byte to 0x60 or 0x64 (!)
; (what is this? to let Host poll P1 through STATUS?)
059B: 09 IN A,P1
059C: 90 MOV STS,A
059D: D6 9B JNIBF $059B
059F: A4 E3 JMP $05E3 ; -> Main
05A1: D3 01 XRL A,#$01 ; ignore all other 0xCx
05A3: 96 E3 JNZ $05E3 ; -> Main
; C1
; Read P1 lower nibble into STATUS (4..7 only)
; and loop until Host writes a dummy byte to 0x60 or 0x64 (!)
; (what is this? to let Host poll P1 through STATUS?)
05A5: 09 IN A,P1
05A6: 47 SWAP A
05A7: 90 MOV STS,A
05A8: D6 A5 JNIBF $05A5
05AA: A4 E3 JMP $05E3 ; -> Main
05AC: 92 BC JB4 $05BC
05AE: D3 E0 XRL A,#$E0 ; we ignore if not E0
05B0: 96 E3 JNZ $05E3 ; -> Main
; Command E0
; Read T0/T1 input pins (CLK/DATA)
05B2: 26 B6 JNT0 $05B6
05B4: 43 01 ORL A,#$01
05B6: 46 DE JNT1 $05DE
05B8: 43 02 ORL A,#$02
05BA: A4 DE JMP $05DE ; -> send A to Host and -> Main
; Command F0..FF
; Pulse P2 bits 0..3
05BC: AA MOV R2,A
05BD: 37 CPL A
05BE: A9 MOV R1,A
05BF: B8 20 MOV R0,#$20
05C1: F0 MOV A,@R0
05C2: 47 SWAP A
05C3: 53 30 ANL A,#$30
05C5: AB MOV R3,A
05C6: 0A IN A,P2
05C7: 4B ORL A,R3
05C8: 5A ANL A,R2
05C9: 3A OUTL P2,A
05CA: 49 ORL A,R1
05CB: 3A OUTL P2,A
05CC: A4 E3 JMP $05E3 ; -> Main
05CE: D3 D0 XRL A,#$D0
05D0: C6 DD JZ $05DD
05D2: 07 DEC A
05D3: 96 E3 JNZ $05E3 ; -> Main
; Command D1
; Write P2
05D5: D6 D5 JNIBF $05D5 ; wait for byte from Host (NB! infinite loop)
05D7: 76 02 JF1 $0502 ; 0x64 written? Parse command
05D9: 22 IN A,DBB ; read byte written to 0x60
05DA: 3A OUTL P2,A ; out P2
05DB: A4 E3 JMP $05E3 ; -> Main
; Command D0
; Read P2
05DD: 0A IN A,P2 ; read P2
; Return to Main with sending A to Host
05DE: AC MOV R4,A ; send to Host fall through
; Return to Main with sending R4 to Host
05DF: B9 00 MOV R1,#$00 ; STATUS=OK
05E1: 74 D3 CALL $03D3 ; send R4 to Host
; Return to Main
05E3: 27 CLR A ;
05E4: 24 02 JMP $0102 ; -> Main
****************************************
*** BANK 6: Command AC and AB **
****************************************
; 16 ASCII hexa digits in scan code set-1 format
; Eg. 0B in scan code set-1 is the '0'-key..
0600: 0B 02 03 04 05 06 07 08 09 0A 1E 30 2E 20 12 21
; to read this page
0610: A3 MOVP A,@A
0611: 83 RET
; Command AC
; ==========
; Will send 20 bytes to Host in scan code set-1 format(!), like "10 06 E0 ..."
; First it stored these:
; @30=P1
; @31=P2
; @32 T0/T1 (KB CLK and DATA from Test pins)
; @33 PSW
; Then pumps 20 bytes out from @20-@33
; @20 (CMD byte)
; @21-@2F (different variables, error counters, see above)
0612: 23 10 MOV A,#$10 ; set _EN
0614: 90 MOV STS,A
0615: B8 30 MOV R0,#$30
0617: 09 IN A,P1
0618: A0 MOV @R0,A ; @30=P1
0619: 18 INC R0
061A: 0A IN A,P2
061B: A0 MOV @R0,A ; @31=P2
061C: 18 INC R0
061D: 27 CLR A
061E: 26 22 JNT0 $0622
0620: 43 01 ORL A,#$01
0622: 46 26 JNT1 $0626
0624: 43 02 ORL A,#$02
0626: A0 MOV @R0,A ; @32=T0/T1
0627: 18 INC R0
0628: C7 MOV A,PSW
0629: A0 MOV @R0,A ; @33=PSW
062A: B9 14 MOV R1,#$14 ; Dump 20 bytes
062C: B8 20 MOV R0,#$20 ; from @20
062E: D6 32 JNIBF $0632 ; Host should just read patiently
0630: C4 57 JMP $0657 ; Host sending aborts dumping
0632: 86 2E JOBF $062E
0634: D4 58 CALL $0658
0636: F0 MOV A,@R0
0637: 47 SWAP A ; hexa hi-nibble first
0638: 53 0F ANL A,#$0F
063A: A3 MOVP A,@A ; look-up
063B: 02 OUT DBB,A ; send scan code to Host
063C: D6 40 JNIBF $0640
063E: C4 57 JMP $0657
0640: 86 3C JOBF $063C
0642: D4 58 CALL $0658 ; delay..
0644: F0 MOV A,@R0 ; hexa lo-nibble
0645: 53 0F ANL A,#$0F
0647: A3 MOVP A,@A
0648: 02 OUT DBB,A
0649: D6 4D JNIBF $064D
064B: C4 57 JMP $0657
064D: 86 49 JOBF $0649
064F: D4 58 CALL $0658
0651: 23 39 MOV A,#$39 ; send 0x39 (set-1 space? yes!)
0653: 02 OUT DBB,A
0654: 18 INC R0 ; inc pointer
0655: E9 2E DJNZ R1,$062E ; loop
0657: 83 RET
; Some delay to give Host to remove characters
0658: F8 MOV A,R0
0659: AA MOV R2,A
065A: F9 MOV A,R1
065B: AB MOV R3,A
065C: B8 00 MOV R0,#$00
065E: B9 40 MOV R1,#$40
0660: E8 60 DJNZ R0,$0660
0662: E9 60 DJNZ R1,$0660
0664: FB MOV A,R3
0665: A9 MOV R1,A
0666: FA MOV A,R2
0667: A8 MOV R0,A
0668: 83 RET
; Command AB
; ==========
; "lines stuck test"
; returns 0 (OK), 1, 2, 3 or 4
0669: 9A BF ANL P2,#$BF ; release CLK line (=> should be HIGH)
066B: 8A 80 ORL P2,#$80 ; release DATA line (=> should be HIGH)
066D: B8 00 MOV R0,#$00
066F: 36 77 JT0 $0677 ; OK, CLK high
0671: E8 6F DJNZ R0,$066F
0673: BC 01 MOV R4,#$01 ; Error, CLK stuck low
0675: C4 98 JMP $0698
0677: 8A 40 ORL P2,#$40 ; pull CLK low
0679: C4 7B JMP $067B ; delay
067B: 26 83 JNT0 $0683 ; OK, CLK low
067D: 9A BF ANL P2,#$BF ; (release CLK line anyway from my side)
067F: BC 02 MOV R4,#$02 ; Error, CLK stuck low
0681: C4 98 JMP $0698
0683: B8 00 MOV R0,#$00 ;
0685: 56 8D JT1 $068D ; OK, DATA high
0687: E8 85 DJNZ R0,$0685
0689: BC 03 MOV R4,#$03 ; Error, DATA stuck low
068B: C4 98 JMP $0698
068D: 9A 7F ANL P2,#$7F ; pull DATA low
068F: 00 NOP
0690: BC 00 MOV R4,#$00 ;
0692: 46 96 JNT1 $0696 ; OK
0694: BC 04 MOV R4,#$04 ; Error, DATA stuck high
0696: 8A 80 ORL P2,#$80 ; release DATA line anyway, exit
0698: 83 RET
**********************************
*** BANK7: SELF-TEST ***
**********************************
; Entry point when Host sends Command AA
0700: 89 FF ORL P1,#$FF
0702: 23 CF MOV A,#$CF
0704: 3A OUTL P2,A
0705: C5 SEL RB0
; Entry point after Reset
0706: 23 20 MOV A,#$20
0708: 90 MOV STS,A
0709: 96 0D JNZ $070D
070B: 04 4F JMP $004F
070D: 27 CLR A
070E: C6 12 JZ $0712
0710: 04 4F JMP $004F
0712: 97 CLR C
0713: E6 17 JNC $0717
0715: 04 4F JMP $004F
0717: A7 CPL C
0718: F6 1C JC $071C
071A: 04 4F JMP $004F
071C: 23 30 MOV A,#$30
071E: 90 MOV STS,A
071F: B8 00 MOV R0,#$00
0721: F8 MOV A,R0
0722: 96 52 JNZ $0752
0724: B8 55 MOV R0,#$55
0726: F8 MOV A,R0
0727: D3 55 XRL A,#$55
0729: 96 52 JNZ $0752
072B: B8 AA MOV R0,#$AA
072D: F8 MOV A,R0
072E: D3 AA XRL A,#$AA
0730: 96 52 JNZ $0752
0732: B8 7F MOV R0,#$7F ; 128 bytes of RAM
0734: F8 MOV A,R0
0735: A0 MOV @R0,A
0736: E8 34 DJNZ R0,$0734
0738: B8 7F MOV R0,#$7F ; 128 bytes of RAM
073A: F8 MOV A,R0
073B: D0 XRL A,@R0
073C: 96 52 JNZ $0752
073E: 23 55 MOV A,#$55
0740: A0 MOV @R0,A
0741: D0 XRL A,@R0
0742: 96 52 JNZ $0752
0744: 23 AA MOV A,#$AA
0746: A0 MOV @R0,A
0747: D0 XRL A,@R0
0748: 96 52 JNZ $0752
074A: A0 MOV @R0,A
074B: D0 XRL A,@R0
074C: 96 52 JNZ $0752
074E: E8 3A DJNZ R0,$073A
0750: E4 54 JMP $0754
0752: 04 4F JMP $004F
0754: 23 40 MOV A,#$40 ; ROM checksum?
0756: 90 MOV STS,A
0757: 23 FF MOV A,#$FF
0759: AE MOV R6,A
075A: AF MOV R7,A
075B: BA 08 MOV R2,#$08
075D: B8 00 MOV R0,#$00
075F: FA MOV A,R2
0760: AB MOV R3,A
0761: F8 MOV A,R0
0762: 37 CPL A
0763: 17 INC A
0764: EB 67 DJNZ R3,$0767
0766: A3 MOVP A,@A
0767: EB 6B DJNZ R3,$076B
0769: D4 10 CALL $0610
076B: EB 6F DJNZ R3,$076F
076D: B4 00 CALL $0500
076F: EB 73 DJNZ R3,$0773
0771: 94 00 CALL $0400
0773: EB 76 DJNZ R3,$0776
0775: E3 MOVP3 A,@A
0776: EB 7A DJNZ R3,$077A
0778: 54 00 CALL $0200
077A: EB 7E DJNZ R3,$077E
077C: 34 00 CALL $0100
077E: EB 82 DJNZ R3,$0782
0780: 14 8C CALL $008C
0782: DE XRL A,R6
0783: AD MOV R5,A
0784: 47 SWAP A
0785: AC MOV R4,A
0786: DD XRL A,R5
0787: AE MOV R6,A
0788: E7 RL A
0789: 53 E0 ANL A,#$E0
078B: DD XRL A,R5
078C: 2E XCH A,R6
078D: F7 RLC A
078E: 47 SWAP A
078F: 67 RRC A
0790: 67 RRC A
0791: E7 RL A
0792: 53 F1 ANL A,#$F1
0794: 2C XCH A,R4
0795: 53 0F ANL A,#$0F
0797: AD MOV R5,A
0798: E7 RL A
0799: DC XRL A,R4
079A: DF XRL A,R7
079B: 2E XCH A,R6
079C: DD XRL A,R5
079D: AF MOV R7,A
079E: E8 5F DJNZ R0,$075F
07A0: EA 5F DJNZ R2,$075F
07A2: FE MOV A,R6
07A3: 96 AA JNZ $07AA
07A5: FF MOV A,R7
07A6: 96 AA JNZ $07AA
07A8: E4 AC JMP $07AC
07AA: 04 4F JMP $004F
07AC: 23 50 MOV A,#$50 ; Test Timer intr
07AE: 90 MOV STS,A
07AF: 27 CLR A
07B0: 62 MOV T,A
07B1: 25 EN TCNTI ; INT enable
07B2: B9 0F MOV R1,#$0F
07B4: F4 C4 CALL $07C4 ; A=0 here
07B6: 32 C2 JB1 $07C2 ; A=2? Timer Intr occured
07B8: B9 02 MOV R1,#$02
07BA: F4 C4 CALL $07C4
07BC: 32 C0 JB1 $07C0
07BE: E4 C2 JMP $07C2
07C0: 04 5F JMP $005F
07C2: 04 4F JMP $004F
07C4: 55 STRT T ; loop and let Timer intr happen
07C5: B8 00 MOV R0,#$00
07C7: E8 C7 DJNZ R0,$07C7
07C9: E9 C7 DJNZ R1,$07C7
07CB: 65 STOP TCNT
07CC: 00 NOP
07CD: 83 RET
; A0 38 (what is this at the end of the ROM?)
07FE: A0 MOV @R0,A
07FF: 38 OUTL P0,A
RAM Memory Map
==============
The 8042 has 128 bytes of RAM. The RAM also stores 2 x 8 General Registers and the Program Stack. The rest is used by the firmware for variables (eg. the COMMAND BYTE @20, timer reload values, flags) and for different *Error Counters*: they count an event from zero to 255, but not more, and can be read by the AC Command.
Theoretically.. the Host could write these parameters and affect the operation of the 8042! Eg. to change a timer reload value, clear an Error Counter, etc.. just thinking.
@00 --+ R0-R7
@01 | 8 BANK0 registers
@02 | Direct RAM access:
@03 | R0-R7 implicite in instruction byte
@04 | Indirect RAM access:
@05 | Indexed through @R0 or @R1
@06 |
@07 --+
@08 --+
@09 |
@0A |
@0B |
@0C |
@0D | 8 words (2 x 8 bytes)
@0E |
@0F | PROGRAM STACK
@10 |
@11 |
@12 |
@13 |
@14 |
@15 |
@16 |
@17 --+
@18 --+
@19 |
@1A | R0'-R7'
@1B | 8 BANK1 registers
@1C |
@1D |
@1E |
@2F --+
@20 --- COMMAND BYTE, the *mighty*
@21 --- This is how many times we resend (FE) after parity error (init to 1)
@22 --- (=0x06) Used in 380. checked for zero after succesful sending byte to kbd. If zero, jump back into main loop..
@23 --- ERROR CNT: # of parity errors detected since reset
@24 --- ERROR CNT: too short signal fall on CLK detected (noise?)
@25 --- (=0x01) ?
@26 --- TIMER RELOAD, first pulse, when Send BYTE to KBD (init to 0x00)
@27 --- TIMER RELOAD, bit pulses, when Send BYTE to KBD (init to 0xFB)
@28 --- Timer reload (=0xE0): after kbd pulls down CLK, this is how much we wait to set it high again.
@29 --- (=0x06) ?
@2A --- loop counter for pulling CLK low and hold it stable for a while (how long? 60us? 250us?)
@2B --- base for RAM write command = 0x20
@2C --- loop counter for XT-keyboard before set to IDLE
@2D --- make/brake code (0x00 or 0x80) for scan code set-2
@2E --- flag, Host has enabled a previously disabled kbd by clearing _EN in Command Byte
@2F --- ERROR CNT: IBF interrupt occured (not supposed to, we poll IBF)
@30 --- We copy P1 here for CMD AC (Diagnostic Dump)
@31 --- We copy P2 here for CMD AC (Diagnostic Dump)
@32 --- bit0: T0, bit1:T1 (KB CLK and DATA from Test pins) for CMD AC (Diagnostic Dump)
@33 --- PSW (Program Status Word) of the 8042, for CMD AC (Diagnostic Dump)
@34-@7F unused?
<EOF>
8042 INTERN
===========
An attempt to reveal the internal operation of the IBM PC AT 8042 keyboard controller based the disassembly of 2KB ROM from 1983. This is of historical interest.
A. Tarpai 2010
A little 8-bit nostalgia :)
(Questions & comments are welcome to tarpai76 at gmail)
This file has been downloaded from
http://www.halicery.com/8042/8042_INTERN.TXT
*** TOC
===
PART I
-
All the information I could collect on the 8042
PART II
-
ROM Disassembly
PART III
-
An UPI 41/42 disassembler
***
PART I
About the 8042
==============
+----------------+
| |
| IBM PC/AT |
| ("Host") | <- scan codes
| +----+ +-------------------------+
| 0x60 |8042| <--- DATA ----------> | AT KEYBOARD |
| 0x64 |KBC | <--- CLOCK ---------> | 84-key |
| | | +-------------------------+
| +----+ kbd commands ->
| |
| |
| |
+----------------+
IBM used an 8042 slave UPI microcomputer in the AT in 1984 as the keyboard controller. The AT keyboard was an improvement to the previous keyboard of the IBM PC and XT: it not only had 1 extra key (84 keys), but it could also receive commands from the host. Thus the connection became bi-directional and the interface much more complex. They chose to program up an 8042 for the job and solder it onto the new AT motherboard. Today all Super I/O chips sitting on the LPC bus is emulating the functions of the 8042 for the PC when turned on.
I was always very interested in the keyboard - as I'm currently typing it - and in the low-level keyboard hardware programming. Using a pre-programmed microcontroller (as it would be called today) is a quite advanced and cool feature I think (the PC and XT had only a simple serial-to-parallel converter IC to interface the keyboard).
The 'programming interface' for the AT- and PS/2-like keyboard and mouse controllers, just as the whole IBM PC is well-documented - except the program, the firmware, that drives the 8042 to function as a keyboard controller (KBC). The only thing I knew was that IBM, Award and Phoenix all wrote firmware for the 8042 and derivates used in the AT and PS/2 line of computers. The code itself was never found.
Then someone talented has dumped the 2K program ROM of a 8042-like KBC in the AT. This is a 2KB binary file and I had no idea what's inside! But peeked in with a hex editor and it looked very exciting: IBM 1983. OK, so what are these microcomputers anyway and how they work? I found these always very confusing when programming ibm-style keyboards, mice and controllers: the status register and the command byte? both has status bits... where are they exactly? When sending commands? to the KBC, to the KBD (and to the mouse)? This is the base of the whole exciting quest, that hopefully adds a bit and clears up some of the mist how these controllers really operate.
How this was done
==================
From the MESS project: "the 1503033 AT i8042 keyboard controller was dumped by Kevin Horton", "Keyboard Controller is effectively dumped (it is almost certainly the same as on the AT, has same P/N but is on a preprogrammed eprom-based i8642 instead of a mask rom i8042)" - isn't it 8742??
1. get 1503033.bin
2. study Intel UPI-41/42 USER'S MANUAL
3. wrote a (dumb) 41/42 disassembler
4. comment it.. with some love of 8-bit-nostalgia :))
TODO
====
1. there are still some white spots in the code (eg. the ROM checksum?)
2. and I certainly made mistakes.. feel free to contribute!
3. a PS/2-style firmware dump would be GREAT!
*******************************************************************************
The 8042 in general
===================
The 8042 was a slave UPI from Intel used for controlling hardware peripherials (it became famous for being used as the KBC of the AT and later for kbd/mouse of the PS/2).
The 8042 faces 2 sides: the Host system (eg. AT ISA bus) and the I/O lines to the peripherials. There is a microcomputer 'in the middle' with its own little 8-bit CPU, 2KB program memory in the ROM it executes, and some 128 bytes RAM:
+-------------------+
----> |R P27| --
----> |W 8042 P26| --
----> |A0 ==== P25| --
| P24| --
| P23| --
| P22| -- I/O lines
| P21| --
| C P U P20| --
Host | R O M |
system |D7 R A M P17| --
R/W |D6 P16| --
|D5 P15| --
<----> |D4 P14| --
|D3 P13| --
|D2 P12| --
|D1 P11| --
|D0 P10| --
| |
| T0| --
| T1| --
+-------------------+
History of the 8042
===================
February, 1978.. a preliminary description from iNTEL of the 8041/8741 UPI 8-bit microcomputer:
- Pin Compatible ROM (8041) and UV-erasable EPROM (8741) versions
- 1K words of program memory, 64 words data memory on-chip
- CPU, ROM, RAM, I/O, Timer and Clock in a Single Package
- clocked at 6 MHz
This was the same year as the MCS-48 (8048) products.
The later 8042/8742 model had doubled the memory and clock frequency:
- 2KB ROM, 128 byte RAM
- 12 MHz
8242. Pre-programmed versions for the keyboard and keyboard/mouse controller, firmware from IBM, Award and Phoenix for the AT and PS/2.
8742. EPROM (UV-erasable ROM) version of the 8042.
8042 architecture
=================
I/O lines
---------
- 2x8 input and output lines, open-collector
- pins in, out, in/out
- open collector with high imp internal pull-up
- 2 Test input pins, T0 and T1 (can be tested by machine instructions: JT0, JNT0, JT1, JNT1)
Host interface
--------------
- 8-bit data bus
- 3 physical registers
- 2 DATA BUS BUFFER registers (DBBIN and DBBOUT)
- 1 status register (STATUS)
- R, W, A0 input to chose register and R/W
- the 8042 never initiates bus cycles (='slave') only answers them
How the DATA BUS BUFFER registers work?
---------------------------------------
The name is very descriptive actually: data bus buffers. They buffer between the external- and the internal 8-bit data buses in both (R/W) directions:
+------------------------------------------------------------+
| R=1 +----------+ 8042 |
| <----- | STATUS | <----->-+ MOV STS,A ==== |
R ---> | A0=1 +----------+ | MOV A,STS |
W ---> | | |
A0 ---> | R=1 +---------------+ (OUT DBB,A) |
| +----<-- | DBB OUT | <------+ |
| | A0=0 +---------------+ | |
D0-7 <--> | <-> '<-----> Accumulator |
| | +---------------+ | |
| +------> | DBB IN | -->----+ |
| W=1 +---------------+ (IN A,DBB) |
| |
| |
+------------------------------------------------------------+
DBBIN
- Host write sets IBF in STATUS
- 8042 read clears IBF in STATUS
DBBOUT
- 8042 write sets OBF in STATUS
- Host read clears OBF in STATUS
(OBF can also be routed to output P24 to interrupt Host)
In the STATUS register these bits are controlled by the 8042 hardware automatically (the remaining bits are for software use and don't-care for the 8042):
+-----------------------+
| | | | |A0 | |IBF|OBF|
+-----------------------+
They reflect the data bus buffer registers' status and the A0 input pin. The Host can read out the content of this register any time by setting A0 and make a read from the 8042.
8-bit CPU
---------
- 2K program ROM
- 128 byte RAM
- 2 banks of 8 registers
- Accumulator for ALU (add, or, and, xor..)
- 8 words stack
- 3-bit stack pointer SP
- PSW and flags
- 10-bit Prg Cnt
- Timer and IBF interrupts
- port (P1 and P2) instructions
- TEST pin instr
- inc/dec registers
- jmp abs and conditional
- instructions can wait for data from the Host
- or some signal change on the input pins
- subroutines
- nice instruction set
- faces the ISA Host
Open collector
==============
Took me a while to understand.. but there is a very important principle:
- if the line is not controlled by anybody, it's HIGH
- if anybody pulls the line LOW, it stays low.
5V
| Line pulled low..
|
0 ->------+
|
+---> '0' ..read as '0'
|
5V
|
|
1 ->-- + 'Disconnected'..
|
+---> '1' ..read as '1'
|
5V
|
|
1 ->-- +-----<--- When disconnected, others drive the bus..
|
0/1 <----+ ..and level can be read as input
|
The 8042 in the AT
==================
To understand and comment the disassembly these were *must* to know how the 8042 was soldered on the AT mobo: the 8042 is in a HARDWIRED configuration and the firmware is programmed accordingly. This means the code controls certain lines and I had to know the schematics to understand.
The main function of the keyboard controller (KBC) is to handle the bi-directional data flow between the computer and the keyboard (KBD). It appeared on the IBM PC/AT motherboard as a 8042-variant in 1984:
+----------------+
| |
| IBM PC/AT |
| | <- scan codes
| +----+ +-------------------------+
| |8042| <--- DATA ----------> | AT KEYBOARD |
| 0x60 |KBC | <--- CLOCK ---------> | 84-key |
| 0x64 | | +-------------------------+
| +----+ kb commands ->
| |
| |
| |
+----------------+
Data flows in both directions (half-duplex) on 2-wires, CLK and DATA, using a 5 pin DIN plug:
____ ____
/ - \
| |
| 1 3 |
| 4 5 |
\ 2 /
-------
AT schematics of 8042: The Host interface
-----------------------------------------
The AT provides the chip select signal when the CPU reads/writes I/O-space 0x60 or 0x64. Bit 2 of the address line is connected to the A0 input of the 8042, so the 4 legal combinations from the Host side are:
>> AT << R W A0 >> 8042 <<
"""""""""" | | | """"""""""""
read 0x60 1 0 0 <----- DBBOUT
read 0x64 1 0 1 <----- STATUS
write 0x60 0 1 0 ---+ +--> KBD CMD
|--> DBBIN + F1 --|
write 0x64 0 1 1 ---+ +--> KBC CMD
- when Host makes a read cycle the 8042 places the contents of the DBBOUT or STATUS onto the external data bus based on the state of A0
- when Host makes a write cycle, the 8042 places the data into the DBBIN register and sets bit3 of the STATUS register based on the state of A0 (this is the reason for "before writing to 0x60 or 0x64 check if IBF=0 in the STATUS register"). Note that it is the 8042's program that will interpret the contents of the DBBIN register (data byte with write address of 0x60 or a so called command byte written to 0x64).
The AT-style STATUS register (read 0x64)
----------------------------------------
+---------------+
0x64 <-- | STATUS | <---->
+---------------+
7 Parity error
6 Receive timeout
5 Transmit timeout
4 INH (copy of P17 input, the keyboard switch, when a byte sent to Host)
3 F1 (hw, A0 input)
2 F0
1 IBF (hw)
0 OBF (hw)
There are 3 hardware status bits: OBF, IBF and F1, which are set/cleared by the 8042 hardware during operation.
F0 ('SYS'): This firmware never touches it. Host can write it by setting bit2 in the Command Byte.
The upper 4 bits (and F0) are software status bits and can mean anything.. (that's the reason they differ in AT- or PS/2-mode programmed 8042). These bits can be set in software by executing 8042 machine instructions:
"MOV STS,A"
writes the upper nibble, bits 4-7 of the STATUS register
"CLR F0" and "CPL F0"
clears and complements the F0 bit
"CLR F1" and "CPL F1"
clears and complements the F1 bit
AT schematics of 8042: The I/O interface
----------------------------------------
I drew only the pins that has meaning in the code:
+----------------+
| P27| ------> DATA
| 8042 P26| ------> _CLK
| ==== P25| ------>
| P24| ------> OBF (IRQ1)
| P23| ------> _IBF (NC)
| P22| ------>
| P21| ------>
| P20| ------>
| |
| P17| <----- KEY INHIBIT SWITCH
| P16| <-----
| P15| <-----
| P14| <-----
| P13| <-----
| P12| <-----
| P11| <-----
| P10| <-----
| |
| T0| <----- CLK
| T1| <----- DATA
+----------------+
Because of the hardwired configuration of the pins this is very important to know when reading the code. There are 2 8-bit I/O ports on the 8042, any pins can be input, output, or both(!) - cool and flexible by the way. In the AT P1 is set for input on reset, P2 is for output:
P27 -> Keyboard Data
P26 -> inverted(!) -> Keyboard Clock
P25 -> (not connected) _IBF routing for host interrupts: inverted, we interrupt host when DBBIN had been emptied by 8042
P24 -> OBF routing for host interrupts: we interrupt host when DBBOUT had been written by 8042
(The rest of the pins left free and was used for various things in the AT, don't care for the 8042, like A20-line and Reset-line).
P17 <- keyboard switch (I've seen this in my life=): it's really a KEY in a keyhole, kbd INHIBITED when the key is not in and locked (=0).
(The rest of the input lines are don't care for the 8042)
AT schematics of 8042: Keyboard CLOCK and DATA
----------------------------------------------
When I first read the disassembly it was very confusing and didn't make any sense, setting/clearing CLK and DATA.. then I saw this: an AT-compatible implementation (VT82C42) of the 8042, which cleared it up.
C L O C K I S I N V E R T E D ! (DATA is not, and don't ask me why, and the whole code is written for this schematics - caused me days of headache.. eg. "ANL P2,#$BF" pulls output P26 low, which will set the CLK HIGH):
+----------------------------+
| |
| |\ |
| | \ |
+--> T0 P26 ---| 0----+------ Keyboard CLOCK
| /
|/
|\
| \
+--> T1 P27 ---| -----+------ Keyboard DATA
| | / |
| |/ |
| |
+----------------------------+
The following CLK schematics is actually from a PS/2-style datasheet (8242BB), but it's interesting. Note the inverter on the output pin!
5V
|
� 10K
|
|\ |
| \ |
P26 ----| 0----+
| / |
|/ +---<---->--- KBD
|
T0 <-----------+
|
= 47pF
|
GND
H _____ idle = input that can be tested by reading the level back
\
L \_____ pulled down: written, read as low for sure
****************************************************************************************************************
The disassembler was written by me and is totally free of use, full source code included.
About the code
==============
This code is from an AT-style 8042 controller so it's keyboard controller only. It was written by IBM in 1983: this keyboard controller firmware was already done in 1983 for the AT to be released in 1984.
It implements the keyboard serial protocol by direct programming of 2 lines (CLK and DATA are pulled-up open-collector lines), for both the bi-directional AT- and the previous uni-directional PC/XT-keyboard.
It really does what is well documented in reference manuals.. (but it's still interesting how - at least for me :) ).
It's amazing how much code fits into 2KB! 8-bit really rulez!
Obvious that the code was originally not written in assembly (many redundant jumps, register saves sometimes as a product of some kind of compiler - as I don't know too much about that)
*******************************************************************
THe disassembly in details
==========================
All the details I could figure out are in the source code, here is the big picture only.
The 8042 internals
==================
Reset
=====
After reset the 8042 fetches the first instruction from program ROM at $0000. In my file here is a 0x04: JMP! That was promising so I wrote a disassembler to learn the instruction set..
- dis i
- P1=ff
- P2=cf
- waits for AA command from Host - and nothing else
- then does the self-test
- enter the main poll loop
The Main Poll Loop
==================
When 'nothing' is happening, the 8042 runs in a crazy loop and waiting for things happen from the 2 sides:
host writes, IBF set <------+
KBD pulls down the CLK line --+
This is the main loop (note, that 8042 polls IBF and doesn't use interrupts).
I. Host writes to input buffer (DBBIN - INput Data Bus Buffer)
The IBF bit in the STATUS register is set. 8042 disables KBD by pulling CLK low. Checks, if write was 0x60 or 0x64 (by examining the F1 bit in the STATUS register).
- if Host has written data to 0x60, it will send it to the KBD, read the reply, and puts it into DBBOUT
- if Host has written data to 0x64, that is a 'Controller Command' and the 8042 will execute the appropriate program code
Then loops again.
II. KBD pulls down the CLK line
Probably, because the user has pressed or released a key and the KBD wants the send the 'scan code' (see another chapter on scan codes). Transmission happens on the Keyboard Data line guided by the Keyboard Clock line: this is the "AT-keyboard protocol" - see there.
Sending and receiving data from the kbd
=======================================
See the 2-wire protocol in details.
It can not only time out, but the AT serial protocol transfers with parity bit. When parity error occurs, the 8042 will try 1 more time (variable @21).
General timeout
===============
The 8042 implements a safety timeout function during each transfer. It uses the on-chip Timer and the Timer Interrupt for this function. The implementation is actually brilliant!! This is where assembly comes handy, C cannot do this.
The idea is the following. In a subroutine (eg. 'Read byte from KBD') the 8042 has to wait for a pin to change state and there is a danger for an infinite loop. So first, it starts the Timer. If the 8042 has been waiting too long, the Timer will overflow and cause an interrupt. At this point the stack looks like this:
| | Timer Interrupt Stack
| |
| INT |
| CALL |
+------+
First the return address for the subroutine was pushed by the original caller, then the interrupt occured. The Timer interrupt then does only one thing: "it returns to the original caller placing A=2 as a Timeout error code in A", by manipulating the stack: decrements the 3-bit stack pointer before executing its RETR. For the caller it looks like as if the subroutine simply returned with a 'timeout error' code!! We're in 1983.. :)
This construct is used by many functions, and the caller can decide what to do when a subroutine returns with A=2.
Earlier (IBM PC and XT) keyboard support
========================================
After days of confusion I've finally figured out what bit 5 of the Command Byte means! The IBM PC keyboard protocol mode!! So.. Did you know that the first AT-style 8042 keyboard controllers did support the old IBM PC and PC/XT keyboards? Well, I didn't.. :)
In this 'mode' all lines are driven by the keyboard and data flows only from the keyboard (uni-directional). The code at $041C does:
1. IDLE is when CLK is HIGH and DATA is LOW.
2. kbd pulls down CLK to start transmitting
3. makes a long startbit (that's why wait CLK hig.. then low.. then high again) to read first bit
4. data bit is valid on DATA line on CLK RISING EDGE
5. NO PARITY bit
XLAT
====
The other compatibility feature that can be confusing with the PC-keyboard compatibility. I hope the following will clear it up (see http:...)
The hardware part of the IBM PC keyboard was simple and straightforward: 83-keys with 83 scan codes (make codes, msb set for break codes), read from 0x60 after IRQ1. It was the PC ROM BIOS that made many confusions by implementing Special codes, functions, etc..)
XLAT is used to pretend for programs, which directly read the scan code from 0x60, that the 84-key AT keyboard is an 83-key PC/XT-keyboard:
- AT-kbd sends 0x1C when 'A' is pressed, while the XT-kbd sends 0x1E
- AT-kbd sends 0xF0 0x1C when 'A' is released, while the XT-kbd sends 0x9E.
The 8042 firmware is capable of this translation.
Why is this??
Legacy programs that read scan codes from 0x60 has relied on that 'A' is 0x1E. The 8042 could further provide this illusion even when an AT-keyboard was attached to the computer. That's it.
What about both XT-keyboard and XLAT??
======================================
Now.. we have 4 cases: XT and XLAT. The 8042 firmware cares about XLAT only in AT-mode. This means 3 cases:
XT=0 XLAT=0 => AT-KBD is attached, set-2 program reads 0x60
XT=0 XLAT=1 => AT-KBD is attached, set-1 program reads 0x60 (compatibility)
XT=1 => XT-KBD is attached, set-1 program reads 0x60
(There is no 'REVERSE XLAT' function, when set-2 with XT-KBD)
The AT keyboard protocol
========================
(Code at $03AE)
This is important, the whole keyboard protocol is programmed by 8042 code. Main features of the protocol, when the KBD is sending data to the 8042 KBC:
- KBD starts transmission by pulling CLK low
- CLK is driven by the KBD
- DATA is valid on falling edges of CLK
- CLK is INVERTED and connected to the T0 test-input pin of the 8042
- DATA on T1.
_____
C
_____
D
In the Idle state both lines are high, passively pulled up (see the open-collector 'bus protocol'). The 8042 runs in a crazy circle and constantly monitors the CLK line. When it falls.. that is a sign, so (probably) the KBD wants to send a scan code ('probably' means the 8042, before start reading in bits, will make sure that CLK is stable low).
__
C \__
_____
D
CLK pulled low by KBD (the protocol also talks about the 'start bit' on the DATA line, which is 0 when this CLK falls happen, but this 8042 code doesn't seem to care about it(?)).
__ _
C \___ _/ \__
__ ^
D \___ ~~~0
The first data bit (bit 0, LSB) will be valid on the next falling edge of CLK. 8042 simply waits for this to happen.. (loop: JT0 loop). Then reads the level of T1 (^ here) and right rotates into accumulator register, A. Here we have the first bit! (~ represents unknown state of DATA, 0 is 'bit 0', high or low depending on the data byte to send).
__ _ _
C \___ _/ \__ _/ \__
__ ^ ^
D \___ ~~~0 ~~~1
The next bit is the same: 8042 waits for the next falling edge, then reads in DATA.
_ _ _ _ _ _ _
C _/ \__ _/ \__ _/ \__ _/ \__ _/ \__ _/ \__ _/ \__
^ ^ ^ ^ ^ ^ ^
D ~~~1 ~~~2 ~~~3 ~~~4 ~~~5 ~~~6 ~~~7
It happens 8 times for all the data bits to arrive.
_ _
C _/ \__ _/ \__
^ ^
D ~~~7 ~~~P
After the last data bit the AT-keyboard will send the PARITY bit, in the same way as the 8 data bits (as a 9th bit), using 'odd-parity' (odd parity is a method to append a bit to the data, so the overall number of 1-s will be an odd number).
_ _ _
C _/ \__ _/ \__ _/
^ ___ ___
D ~~~P ~~/
After the parity bit another bit, called a '1' stop-bit is written by the KBD. After that the KBD pulls up ('releases') both lines, which returns to the high Idle state.
Compare timing of the AT and PC/XT keyboard protocol - both supported by this firmware
--------------------------------------------------------------------------------------
Here is the whole cycle when the KBD is sending data to the 8042. There are a few time constrains, and many things can go wrong during transfer. The code is dealing with all these, see the details.
AT
==
___ _ _ _ _ _ _ _ _ _ _ __
C \____ _/ \__ _/ \__ _/ \__ _/ \__ _/ \__ _/ \__ _/ \__ _/ \__ _/ \__ _/ \__ / C
IDLE __ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^__ ___ IDLE
D \___ ~~~0 ~~~1 ~~~2 ~~~3 ~~~4 ~~~5 ~~~6 ~~~7 ~~~P __/ D
AT short version:
___ _ _ _ _ __
C \____ _/ \__ _/ \__ _/ \__ _/ \__/ C
IDLE __ ^ ^ ... ^ ^ ^____ IDLE
D \___ ~~~0 ~~~7 ~~~P __/ D
- IDLE is when both CLK and DATA is high
- CLK falls..
- 11 falling edges - 11 bits
- start bit (=0) .. 8 data bits .. Parity bit .. stop bit (=1)
PC/XT
=====
__ _ _ _ _ _ _ _ _ _ ___
C \_____ _/ \__ _/ \__ _/ \__ _/ \__ _/ \__ _/ \__ _/ \__ _/ \__ _/ \__ _/ C
IDLE ____ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ IDLE
D___/ ~0 ~1 ~2 ~3 ~4 ~5 ~6 ~7 \____D
PC/XT short version:
__ _ _ _ ___
C \____ _/ \__ _/ \__ _/ \__ _/ C
IDLE ___ ^ ^ ... ^ ^ IDLE
D___/ ~0 ~7 \____D
- IDLE is when CLK is high and DATA is pulled low
- CLK falls
- 10 rising edges - 10 bits
- start bit (=1) .. 8 data bits .. stop bit (=0)
Host Commands of this 8042 firmware
===================================
Bit 0 and 1 of the Command Byte @20
-----------------------------------
= enable/disable keyboard IRQ.
Background:
When the 8042 writes a byte into DBBOUT, the OBF bit in the STATUS register gets set by the hardware. This is the normal operation, but the Host has to periodically read, poll, the OBF bit in the STATUS register to check whether a byte has been written by the 8042.
Using the "EN FLAGS" instruction (and when a '1' has been previously written to P24) the 8042 will also set the P24 output pin. If this pin is connected to the IRQ-system of the Host, it will cause an IRQ.
This firmware executes the "EN FLAGS" instruction after RESET. Better cited: "This instruction allocates two I/O lines on PORT 2 (P24 and P25). P24 is the Output Buffer Full interrupt request line to the host system. P25 is the Input Buffer empty interrupt request line. These interrupt outputs reflect the internal status of the OBF flag and the IBF inverted flag " - in the STATUS register. "Note, these outputs may be inhibited by writing a '0' to these pins. Reenabling interrupts is done by writing a '1' to these port pins." UPI-41AH/42AH manual.
So.. the 8042 can route the OBF bit of the STATUS register to one of the output pins (P24), causing an interrupt request (IRQ) to the Host system when connected. Routing OBF is the proper configuration for an interrupt-driven system, like the AT.
Note, that _IBF-routing is handled similarly to OBF and this 8042 firmware handles them together (bit 1 of the Command Byte will be written to P25), because they are not separable: "EN FLAGS" will allocate P24 and P25 together. In the AT bit 1 is specified as Reserved, because pin P25 is not connected, not used (seems like it was fine to poll IBF when the Host is writing to 0x60/0x64 and not use interrupts for that).
The 8042 firmware uses the Command Byte bit 0 to write P24, thus enabling/disabling OBF-routing to P24, thus enabling/disabling IRQ1, Keyboard Interrupt, in the AT system.
STATUS bits
===========
This register is a hardware register.
The lower nibble part is used for maintaining the Data Bus Buffer (DBB) registers' status and the A0-line by the hardware.
The upper nibble part can be set by software and are therefore firmware-dependent (8042 uses "MOV STS,A" to write data into the STATUS register).
The host reads this register on 0x64.
In the AT-firmware the bits are defined as:
+---------------- ----------------+
0x64 <-- |PER|RTO|TTO|INH| |A0 | |IBF|OBF| <----> 8042
+---------------- ----------------+
7 Parity error
6 Receive timeout
5 Transmit timeout
4 INH (copy of P17 input, the keyboard switch, updated when a byte sent to Host)
3 F1 (hw, A0 input)
2 F0
1 IBF (hw)
0 OBF (hw)
.
Writing the Command Byte @20
============================
The Command Byte is _not_ a register for the Host: just one of the 128 memory bytes at address 0x20 in the 8042's RAM. It is special when the Host issues a RAM write command to address 0x20 (by writing 0x60/0x40 to 0x64, then the value to 0x60). The 8042 firmware monitors the bits and performs different tasks, *in this order*:
1. save @20
2. write the new @20
3. Examine bit 0: OBF (set/clr P24 to en/dis IRQ1 for the Host)
4. bit 1: _IBF (same, but N/C on AT)
5. bit 2: SYS (don't care for 8042, set/clr F0 in STATUS)
6. bit 3: OVR (nop): scan code received from KBD will be passed to Host if (P17 || OVR)
7. bit 4: _EN (=1 disable kbd interface)
Setting _EN: the 8042 pulls down the CLK line immediately, disabling serial communication with the KBD.
Clearing _EN (Host enables the keyboard interface from the disabled state): nothing happens here, only set the flag @2E=1 for Main, bc of the next bit will leave the AT-KBD DISABLED(!)
8. bit 5: set AT/XT-keyboard protocol (NB. this gets examimned after _EN)
=0 Set AT-KBD protocol: DATA=1 CLK=0 (pull CLK low, DISABLE AT-KBD), go to Main and Main will enable if flag @2E is set
=1 Set XT-KBD protocol: DATA=0 CLK=1 (pull DATA low, this is IDLE-state of XT-KBD), go to Main
9. bit 6: XLAT (nop)
10. bit 7: (nop)
KBD EN variations
=================
CMD _EN CLK/DATA
RESET 1 0/1 (P2=#$CF at $0045)
CMDAA 1 0/1 (P2=#$CF at $0700)
CMD60/AT 0 0/1 (disabled & @2E=1)
CMD60/XT 0 1/0 (idle)
CMDAE 0 N/A
CMDAD 1 N/A
CMD (write P2 directly)
****
PART II
-
ROM Disassembly
see http://www.halicery.com/8042/8042_1503033.TXT
****
PART III
-
A UPI 41/42 disassembler
http://www.halicery.com/8042/dasm42.c
(and a simple win32 console front-end, main.c)
.
.8042 Keyboard Controller Internals --- The following documents were obtained from [halicery.com](http://halicery.com/): - [8042_INTERN.TXT]() - [8042_1503033.TXT]() - [dasm42.c]() Additional information (eg, undocumented 8042 commands) is also available from [OS/2 Museum](http://www.os2museum.com/wp/?p=589).
#include <stdio.h> // we use printf()
/*
Small Intel UPI-41/42 DISASSEMBLER
==================================
A. Tarpai 2010 (tarpai76 gmail com)
It was written to look at some 8042 ROM dump code.
You can use and modify it for any purpose.
I'm happy if you mention me, the author.
No warranties (what for?).
Usage:
------
Call dasm42() passing a pointer, an offset and number of bytes.
Uses 1 external: printf().
The disassembler is based on the book
"Microprocessor Peripherals UPI-41A/41AH/42/42AH User's Manual, INTEL CORPORATION, 1996"
*/
static int PC;
/* Operand Addressing Mode writers */
typedef void (*Tfop)(unsigned char *p);
static void fopJMP(unsigned char *p) // JMP and CALL: 11-bit absolute address (2K)
{
printf("$%04X", ((*p<<3)&0x700) | p[1]);
}
static void fopJ(unsigned char *p) // jumps: 8-bit in-page address
{
printf("$%04X", (PC&0xff00)|p[1]); // TODO!! Jump at page boundary?? PC or PC+2 here?
}
static void fopRx(unsigned char *p) // Register Direct (x=0-7)
{
printf("R%x", *p&7);
}
static void fopPx(unsigned char *p) // Port Direct (x=[1,2])
{
printf("P%x", *p&3);
}
static void fopRRx(unsigned char *p) // Indexed @R0 or @R1
{
printf("@R%x", *p&1);
}
static void fopA(unsigned char *p) // Accumulator
{
printf("A");
}
static void fopIMM(unsigned char *p) // Immediate 8-bit value
{
printf("#$%02X", p[1]);
}
typedef void (*Tfmnop)(unsigned char *p, Tfop fop1, Tfop fop2);
static void fopJB(unsigned char *p, Tfop fop1, Tfop fop2) // JBx is special (have to complete the mn)
{
printf("%x ", *p>>5);
fopJ(p);
}
static void fmnop2(unsigned char *p, Tfop fop1, Tfop fop2) // 2-operand instructions
{
printf(" ");
fop1(p);
printf(",");
fop2(p);
}
static void fmnop1(unsigned char *p, Tfop fop1, Tfop fop2) // 1-operand instructions
{
printf(" ");
fop1(p);
}
struct instr {
char *mn;
unsigned char opcd;
unsigned char opcdmsk;
char len;
Tfmnop fmnop;
Tfop fop1, fop2;
};
static struct instr instrs[] = {
{ "ADD", 0x68, 0xf8, 1, fmnop2, fopA, fopRx}, // ADD A,Rr Add Register Contents to Accumulator
{ "ADD", 0x60, 0xfe, 1, fmnop2, fopA, fopRRx}, // ADD A,@Rr Add Data Memory Contents to Accumulator
{ "ADD", 0x03, 0xff, 2, fmnop2, fopA, fopIMM}, // ADD A,�data Add Immediate Data to Accumulator
{ "ADDC", 0x78, 0xf8, 1, fmnop2, fopA, fopRx}, // ADDC A,Rr Add Carry and Register Contents to Accumulator
{ "ADDC", 0x70, 0xfe, 1, fmnop2, fopA, fopRRx}, // ADDC A,@Rr Add Carry and Data Memory Contents to Accumulator
{ "ADDC", 0x13, 0xff, 2, fmnop2, fopA, fopIMM}, // Add Carry and Immediate Data to Accumulator
{ "ANL", 0x58, 0xf8, 1, fmnop2, fopA, fopRx}, // AND A,Rr Add Register Contents to Accumulator
{ "ANL", 0x50, 0xfe, 1, fmnop2, fopA, fopRRx}, // AND A,@Rr Add Data Memory Contents to Accumulator
{ "ANL", 0x53, 0xff, 2, fmnop2, fopA, fopIMM}, // AND A,�data Add Immediate Data to Accumulator
{ "ANL", 0x98, 0xfc, 2, fmnop2, fopPx, fopIMM}, // ANL PP,�data Logical AND PORT 1�2 With Immediate Mask
{ "ANLD", 0x9C, 0xfc, 1, fmnop2, fopPx, fopA}, // ANLD Pp,A Logical AND Port 4�7 With Accumulator Mask
{ "CALL", 0x14, 0x1f, 2, fmnop1, fopJMP},
{ "CLR A", 0x27, 0xff, 1, 0}, // CLR A
{ "CLR C", 0x97, 0xff, 1, 0}, // CLR C Clear Carry Bit
{ "CLR F1", 0xA5, 0xff, 1, 0}, // CLR F1 Clear Flag 1
{ "CLR F0", 0x85, 0xff, 1, 0}, // CLR F0 Clear Flag 0
{ "CPL A", 0x37, 0xff, 1, 0}, // CPL A Complement Accumulator
{ "CPL C", 0xA7, 0xff, 1, 0}, // CPL C Complement Carry Bit
{ "CPL F0", 0x95, 0xff, 1, 0}, // CPL F0 COMPLEMENT FLAG 0
{ "CPL F1", 0xB5, 0xff, 1, 0}, // CPL F1 COMPLEMENT FLAG 1
{ "DA A", 0x57, 0xff, 1, 0}, // DA A Decimal Adjust Accumulator
{ "DEC A", 0x07, 0xff, 1, 0}, // DEC A Decrement Accumulator
{ "DEC", 0xC8, 0xf8, 1, fmnop1, fopRx}, // DEC Rr Decrement Register
{ "DIS I", 0x15, 0xff, 1, 0}, // DIS I Disable IBF Interrupt
{ "DIS TCNTI", 0x35, 0xff, 1, 0}, // DIS TCNTI Disable Timer/Counter Interrupt
{ "DJNZ", 0xE8, 0xf8, 2, fmnop2, fopRx, fopJ}, // DJNZ Rr, address Decrement Register and Test
{ "EN DMA", 0xE5, 0xff, 1, 0}, // EN DMA Enable DMA Handshake Lines
{ "EN FLAGS", 0xF5, 0xff, 1, 0 }, // EN FLAGS Enable Master Interrupts
{ "EN I", 0x05, 0xff, 1, 0 }, // EN I Enable IBF Interrupt
{ "EN TCNTI", 0x25, 0xff, 1, 0}, // EN TCNTI Enable Timer/Counter Interrupt
{ "IN A,DBB", 0x22, 0xff, 1, 0}, // IN A,DBB Input Data Bus Buffer Contents to Accumulator
{ "IN", 0x08, 0xfc, 1, fmnop2, fopA, fopPx}, // IN A,Pp Input Port 1�2 Data to Accumulator
{ "INC A", 0x17, 0xff, 1, 0}, // INC A
{ "INC", 0x18, 0xf8, 1, fmnop1, fopRx}, // INC Rr Increment Register
{ "INC", 0x10, 0xfe, 1, fmnop1, fopRRx}, // INC @Rr Increment Data Memory Location
{ "JB", 0x12, 0x1f, 2, fopJB}, // JBb address Jump If Accumulator Bit is Set
{ "JC", 0xF6, 0xff, 2, fmnop1, fopJ }, //
{ "JF0", 0xB6, 0xff, 2, fmnop1, fopJ }, //
{ "JF1", 0x76, 0xff, 2, fmnop1, fopJ }, //
{ "JMP", 0x04, 0x1f, 2, fmnop1, fopJMP},
{ "JMPP @A", 0xB3, 0xff, 1, 0 }, // JMPP @A Indirect Jump Within Page
{ "JNC", 0xE6, 0xff, 2, fmnop1, fopJ }, //
{ "JNIBF", 0xD6, 0xff, 2, fmnop1, fopJ }, //
{ "JNT0", 0x26, 0xff, 2, fmnop1, fopJ }, // JNTO address Jump if TEST 0 is Low
{ "JNT1", 0x46, 0xff, 2, fmnop1, fopJ }, //
{ "JNZ", 0x96, 0xff, 2, fmnop1, fopJ }, //
{ "JOBF", 0x86, 0xff, 2, fmnop1, fopJ }, //
{ "JTF", 0x16, 0xff, 2, fmnop1, fopJ }, //
{ "JT0", 0x36, 0xff, 2, fmnop1, fopJ }, //
{ "JT1", 0x56, 0xff, 2, fmnop1, fopJ }, //
{ "JZ", 0xC6, 0xff, 2, fmnop1, fopJ }, //
{ "MOV", 0x23, 0xff, 2, fmnop2, fopA, fopIMM }, // MOV A,�data Move Immediate Data to Accumulator
{ "MOV A,PSW", 0xC7, 0xff, 1, 0}, // MOV A,PSW Move PSW Contents to Accumulator
{ "MOV", 0xF8, 0xf8, 1, fmnop2, fopA, fopRx }, // MOV A,Rr Move Register Contents to Accumulator
{ "MOV", 0xF0, 0xfe, 1, fmnop2, fopA, fopRRx }, // MOV A,@Rr Move Data Memory Contents to Accumulator
{ "MOV A,T", 0x42, 0xff, 1, 0}, // MOV A,T Move Timer/Counter Contents to Accumulator
{ "MOV PSW,A", 0xD7, 0xff, 1, 0}, // MOV PSW,A Move Accumulator Contents to PSW
{ "MOV", 0xA8, 0xf8, 1, fmnop2, fopRx, fopA }, // MOV Rr,A Move Accumulator Contents to Register
{ "MOV", 0xB8, 0xf8, 2, fmnop2, fopRx, fopIMM }, // MOV Rr,�data Move Immediate Data to Register
{ "MOV", 0xA0, 0xfe, 1, fmnop2, fopRRx, fopA }, // MOV @Rr,A Move Accumulator Contents to Data Memory
{ "MOV", 0xB0, 0xfe, 2, fmnop2, fopRRx, fopIMM }, // MOV @Rr,�data Move Immediate Data to Data Memory
{ "MOV STS,A", 0x90, 0xff, 1, 0}, // MOV STS,A Move Accumulator Contents to STS Register
{ "MOV T,A", 0x62, 0xff, 1, 0}, // MOV T,A Move Accumulator Contents to Timer/Counter
{ "MOVD", 0x0C, 0xfc, 2, fmnop2, fopA, fopPx }, // MOVD A,Pp Move Port 4�7 Data to Accumulator
{ "MOVD", 0x3C, 0xfc, 2, fmnop2, fopPx, fopA }, // MOVD Pp,A Move Accumulator Data to Port 4, 5, 6 and 7
{ "MOVP A,@A", 0xA3, 0xff, 1, 0}, // MOVP A,@A Move Current Page Data to Accumulator
{ "MOVP3 A,@A", 0xE3, 0xff, 1, 0}, // MOVP3 A,@A Move Page 3 Data to Accumulator
{ "NOP", 0x00, 0xff, 1, 0},
{ "ORL", 0x48, 0xf8, 1, fmnop2, fopA, fopRx}, // ORL A,Rr Logical OR Accumulator With Register Mask
{ "ORL", 0x40, 0xfe, 1, fmnop2, fopA, fopRRx}, // ORL A,@Rr Logical OR Accumulator With Memory Mask
{ "ORL", 0x43, 0xff, 2, fmnop2, fopA, fopIMM}, // ORL A,�Data Logical OR Accumulator With Immediate Mask
{ "ORL", 0x88, 0xfc, 2, fmnop2, fopPx, fopIMM}, // ORL Pp,�data Logical OR Port 1�2 With Immediate Mask
{ "ORLD", 0x8C, 0xfc, 2, fmnop2, fopPx, fopA}, // ORLD Pp,A Logical OR Port 4�7 With Accumulator Mask
{ "OUT DBB,A", 0x02, 0xff, 1, 0}, // OUT DBB,A Output Accumulator Contents to Data Bus Buffer
{ "OUTL", 0x38, 0xfc, 1, fmnop2, fopPx, fopA }, // OUTL Pp,A Output Accumulator Data to Port 1 and 2
{ "RET", 0x83, 0xff, 1, 0}, // RET Return Without PSW Restore
{ "RETR", 0x93, 0xff, 1, 0}, // RET Return Without PSW Restore
{ "RL A", 0xE7, 0xff, 1, 0}, // RL A Rotate Left Without Carry
{ "RLC A", 0xF7, 0xff, 1, 0}, // RLC A Rotate Left Through Carry
{ "RR A", 0x77, 0xff, 1, 0}, // RR A Rotate Right Without Carry
{ "RRC A", 0x67, 0xff, 1, 0}, // RRC A Rotate Right Through Carry
{ "SEL RB0", 0xC5, 0xff, 1, 0}, // SEL RB0 Select Register Bank 0
{ "SEL RB1", 0xD5, 0xff, 1, 0}, // SEL RB1 Select Register Bank 1
{ "STOP TCNT", 0x65, 0xff, 1, 0}, // STOP TCNT Stop Timer/Event Counter
{ "STRT CNT", 0x45, 0xff, 1, 0}, // STRT CNT Start Event Counter
{ "STRT T", 0x55, 0xff, 1, 0}, // STRT T Start Timer
{ "SWAP A", 0x47, 0xff, 1, 0}, // SWAP A Swap Nibbles Within Accumulator
{ "XCH", 0x28, 0xf8, 1, fmnop2, fopA, fopRx}, // XCH ARr Exchange Accumulator-Register Contents
{ "XCH", 0x20, 0xfe, 1, fmnop2, fopA, fopRRx}, // XCH A,@Rr Exchange Accumulator and Data Memory Contents
{ "XCHD", 0x30, 0xfe, 1, fmnop2, fopA, fopRRx}, // XCHD A,@Rr Exchange Accumulator and Data Memory 4-bit Data
{ "XRL", 0xD8, 0xf8, 1, fmnop2, fopA, fopRx}, // XRL A,Rr Logical XOR Accumulator With Register Mask
{ "XRL", 0xD0, 0xfe, 1, fmnop2, fopA, fopRRx}, // XRL A,@Rr Logical XOR Accumulator With Memory Mask
{ "XRL", 0xD3, 0xff, 2, fmnop2, fopA, fopIMM}, // XRL A,�data, Logical XOR Accumulator With Immediate Mask
{ "???", 0, 0, 1, 0} // All others (zero-mask will be true - if reached, len=1)
};
static int instr1(unsigned char *p)
{
struct instr *i= instrs;
for (; ; i++) {
if ((*p & i->opcdmsk) == i->opcd) {
printf("%04X: ", PC); // print Program Counter
PC+=i->len; // we increment PC as if CPU did for JMP instructions(?)
printf("%02X ", p[0]); // write 1 or 2 code bytes
if (i->len==2) printf("%02X ", p[1]);
else printf(" ");
printf("%s", i->mn); // write mnemonic
if (i->fmnop) i->fmnop(p, i->fop1, i->fop2); // write 0, 1 or 2 operands
printf("\n");
return i->len;
}
}
}
/* Extern.
Disassemble iNTEL UPI-41/42 machine code
of n bytes, from p + offset
*/
void dasm42(char *p, int offs, int n)
{
p+=offs;
PC=offs;
n+=offs;
for (; PC < n;) p+=instr1(p);
}
/********** NOTES ****************************************************
Addressing:
- implicite (in instr)
- register Rn (0..7)
- indexed @Rn (0..1)
- A
- # (0..$ff)
- addr, 1 byte + PC (0..$ffff)
--------------------
RAM (DATA) 256 bytes
--------------------
0..7 R0..R7 BANK0 (Bs in PSW)
8..23 STACK (8x16bit) .....
24..31 R0..R7 BANK1
...... to top: "RAM" .....
R0, R1 can be index register
----------------
ROM (PROGRAM) 2K
----------------
RESET: $0000
IBR INT: $0003
TIMER INT: $0007
-----------
PC - 10-bit (not 11?)
-----------
PC always points to next instruction.
----
JUMP
----
a.) absolute address: JMP $35E = aa a9 a8 0 0 1 0 0 a7 a6 a5 a4 a3 a2 a1 a0 (2-byte instr)
b.) "relative" (op -> PC-LO): JZ $addr = $C6 $op (2-byte instr)
// OK.. "If a conditional JUMP or indirect JUMP begins in location 255 of a page, it must reference a destination on the following page"
--------
PC-stack
--------
8x16 bits: call/int saves PSW[7..4]&PC[11..0]
-------------------------
PSW - program status word
-------------------------
7 6 5 4 | 3 | 2 1 0
C AC F0 Bs| - | SP
CALL: push PC&PSW[7..4]
RET: pop PC
RETR: pop PC&PSW[7..4]
On-chip oscillator
------------------
1 to 12.5 MHz
or external
-------------------
8-bit Timer/Counter
-------------------
Timer-mode
- increments on OSC + 32-prescale
- START T .. STOP TCNT
Counter-mode
- increments on falling edges on TEST1-pin
- START CNT .. STOP TCNT
- MOV T,A and MOV A,T for reading/writing
Timer/Counter OVERFLOW
----------------------
fe..ff..00
1. sets timer flag (TF) - then can be tested by JTF (which clears TF)
2. generates IRQ
3. EN/DIS TCNTI
4. if enabled: CALL $0007 happens
----------
INTERRUPTS
----------
IBF:
- higher pri
- EN/DIS I
- CS & RW triggers
Timer
- EN/DIS TCNTI
-
1. IRQ set + disable all interrupts
2. CALL 3 (IBF) or 7 (T)
3. entering ISR clears IRQ
4. ISR
5. RETR (re-enables interrupt)
HOST INTERRUPTS
---------------
EN FLAGS will allocate P24/P25 to OBF/_IBF (only RESET clears it)
"These interrupt outputs reflect the internal status of the OBF flag and the IBF inverted flag."
"Note, these outputs may be inhibited by writing a '0' to these pins. Reenabling interrupts is done by writing a '1' to these port pins."
==> so host cpu doesn't have to poll the same bits in STATUS REG (0x64); it can have it as interrupts (this is set in the code after RESET..)
------------
HOST CPU I/O
------------
!!! There are 3 registers in the UPI on the host side !!! (NB. host CPU writes into DBBIN..)
<--R-- STATUS <--- MOV STS,A + JF0,JF1,JOBF,JNIBF
HOST CPU I/O <--R-- DBBOUT <--- OUT DBB,A
--W--> DBBIN ---> IN A,DBB
RD WR A0
0 1 0 (0x60) Read DBBOUT register
0 1 1 (0x64) Read STATUS register
1 0 0 (0x60) Write DBBIN!
1 0 1 (0x64) Write DBBIN!
==> A0-pin simply latches into STATUS-F1-bit on host write, what the UPI can test by JF1 $xx.
-----------------
Data buffers: DBB
-----------------
DBBIN, DBBOUT
"When CS, A0 and RD are low, the contents of the DBBOUT register is placed on the three-state Data lines D0-D7 and the OBF flag is cleared."
"When CS and WR are low, the contents of the system data bus is latched into DBBIN. Also, the IBF flag is set and an interrupt is generated, if enabled."
--------------------
ST - status register
--------------------
= Bus buffer register status word.
ST7 ST6 ST5 ST4 | F1 F0 | IBF OBF
ST7-4: user defined, MOV STS,A writes them, UPI doesn't care more about it.
F0: user defined (JF0 $xx)
F1 = A0-pin (Command/Data)
"OBF Output Buffer Full: This flag is automatically set when the UPI-Microcomputer loads the DBBOUT register and is cleared when the master processor reads the data register."
"IBF Input Buffer Full: This flag is set when the master processor writes a character to the DBBIN register and is cleared when the UPI INputs the data register contents to its accumulator."
---------
I/O PORTS
---------
2 x 8-bit: P1 and P2
OUTL Pn,A
IN A,Pn
"To use a particular PORT pin as an input, a logic '1' must first be written to that pin."
*/
<?xml version="1.0" encoding="UTF-8"?> <keyboard id="keyboard" padleft="8px"> <control type="button" binding="esc">ESC</control> <control type="button" binding="ctrl-c">CTRL-C</control> <control type="button" binding="f1">F1</control> <control type="button" binding="f10">F10</control> <control type="button" binding="left"><</control> <control type="button" binding="right">></control> <control type="button" binding="up">^</control> <control type="button" binding="down">v</control> </keyboard>
<?xml version="1.0" encoding="UTF-8"?> <keyboard id="keyboard" padleft="8px"> <control type="button" binding="esc">ESC</control> <control type="button" binding="ctrl-c">CTRL-C</control> <control type="button" binding="ctrl-alt-del">CTRL-ALT-DEL</control> <control type="button" binding="f1">F1</control> <control type="button" binding="f2">F2</control> <control type="button" binding="f3">F3</control> <control type="button" binding="f4">F4</control> <control type="button" binding="f5">F5</control> <control type="button" binding="f6">F6</control> <control type="button" binding="f7">F7</control> <control type="button" binding="f8">F8</control> <control type="button" binding="f9">F9</control> <control type="button" binding="f10">F10</control> </keyboard>
<?xml version="1.0" encoding="UTF-8"?> <keyboard id="keyboard" padleft="8px"> <control type="button" binding="esc">ESC</control> <control type="button" binding="ctrl-c">CTRL-C</control> <control type="button" binding="f1">F1</control> <control type="button" binding="f10">F10</control> </keyboard>
<keyboard id="keyboard" model="us83" pos="center" width="900px" height="210px" padleft="8px">
<control type="container">
<control type="key" binding="f1" width="34px" top="0px" left="0px">F1</control>
<control type="key" binding="f2" width="34px" top="0px" left="42px">F2</control>
<control type="key" binding="f3" width="34px" top="42px" left="0px">F3</control>
<control type="key" binding="f4" width="34px" top="42px" left="42px">F4</control>
<control type="key" binding="f5" width="34px" top="84px" left="0px">F5</control>
<control type="key" binding="f6" width="34px" top="84px" left="42px">F6</control>
<control type="key" binding="f7" width="34px" top="126px" left="0px">F7</control>
<control type="key" binding="f8" width="34px" top="126px" left="42px">F8</control>
<control type="key" binding="f9" width="34px" top="168px" left="0px">F9</control>
<control type="key" binding="f10" width="34px" top="168px" left="42px">F10</control>
<control type="key" binding="esc" width="46px" top="0px" left="96px">Esc</control>
<control type="key" binding="1" width="34px" top="0px" left="150px">1 !</control>
<control type="key" binding="2" width="34px" top="0px" left="192px">2 @</control>
<control type="key" binding="3" width="34px" top="0px" left="234px">3 #</control>
<control type="key" binding="4" width="34px" top="0px" left="276px">4 $</control>
<control type="key" binding="5" width="34px" top="0px" left="318px">5 %</control>
<control type="key" binding="6" width="34px" top="0px" left="360px">6 ^</control>
<control type="key" binding="7" width="34px" top="0px" left="402px">7 &</control>
<control type="key" binding="8" width="34px" top="0px" left="444px">8 *</control>
<control type="key" binding="9" width="34px" top="0px" left="486px">9 (</control>
<control type="key" binding="0" width="34px" top="0px" left="528px">0 )</control>
<control type="key" binding="-" width="34px" top="0px" left="570px">- _</control>
<control type="key" binding="=" width="34px" top="0px" left="612px">= +</control>
<control type="key" binding="bs" width="46px" top="0px" left="654px">Back</control>
<control type="key" binding="num-lock" width="76px" top="0px" left="708px">Num</control>
<control type="key" binding="scroll-lock" width="76px" top="0px" left="792px">Scroll</control>
<control type="key" binding="tab" width="46px" top="42px" left="96px">Tab</control>
<control type="key" binding="q" width="34px" top="42px" left="150px">Q</control>
<control type="key" binding="w" width="34px" top="42px" left="192px">W</control>
<control type="key" binding="e" width="34px" top="42px" left="234px">E</control>
<control type="key" binding="r" width="34px" top="42px" left="276px">R</control>
<control type="key" binding="t" width="34px" top="42px" left="318px">T</control>
<control type="key" binding="y" width="34px" top="42px" left="360px">Y</control>
<control type="key" binding="u" width="34px" top="42px" left="402px">U</control>
<control type="key" binding="i" width="34px" top="42px" left="444px">I</control>
<control type="key" binding="o" width="34px" top="42px" left="486px">O</control>
<control type="key" binding="p" width="34px" top="42px" left="528px">P</control>
<control type="key" binding="[" width="34px" top="42px" left="570px">[ {</control>
<control type="key" binding="]" width="34px" top="42px" left="612px">] }</control>
<control type="key" binding="enter" height="76px" width="46px" top="42px" left="654px"><br/>Enter</control>
<control type="key" binding="num-home" width="34px" top="42px" left="708px">7</control>
<control type="key" binding="num-up" width="34px" top="42px" left="750px">8</control>
<control type="key" binding="num-pgup" width="34px" top="42px" left="792px">9</control>
<control type="key" binding="num-sub" width="34px" top="42px" left="834px">-</control>
<control type="key" binding="ctrl" width="46px" top="84px" left="96px">Ctrl</control>
<control type="key" binding="a" width="34px" top="84px" left="150px">A</control>
<control type="key" binding="s" width="34px" top="84px" left="192px">S</control>
<control type="key" binding="d" width="34px" top="84px" left="234px">D</control>
<control type="key" binding="f" width="34px" top="84px" left="276px">F</control>
<control type="key" binding="g" width="34px" top="84px" left="318px">G</control>
<control type="key" binding="h" width="34px" top="84px" left="360px">H</control>
<control type="key" binding="j" width="34px" top="84px" left="402px">J</control>
<control type="key" binding="k" width="34px" top="84px" left="444px">K</control>
<control type="key" binding="l" width="34px" top="84px" left="486px">L</control>
<control type="key" binding=";" width="34px" top="84px" left="528px">; :</control>
<control type="key" binding="quote" width="34px" top="84px" left="570px">' "</control>
<control type="key" binding="`" width="34px" top="84px" left="612px">` ~</control>
<control type="key" binding="num-left" width="34px" top="84px" left="708px">4</control>
<control type="key" binding="num-center" width="34px" top="84px" left="750px">5</control>
<control type="key" binding="num-right" width="34px" top="84px" left="792px">6</control>
<control type="key" binding="num-add" height="118px" width="34px" top="84px" left="834px"><br/>+</control>
<control type="key" binding="shift" width="46px" top="126px" left="96px">Shift</control>
<control type="key" binding="\\" width="34px" top="126px" left="150px">\ |</control>
<control type="key" binding="z" width="34px" top="126px" left="192px">Z</control>
<control type="key" binding="x" width="34px" top="126px" left="234px">X</control>
<control type="key" binding="c" width="34px" top="126px" left="276px">C</control>
<control type="key" binding="v" width="34px" top="126px" left="318px">V</control>
<control type="key" binding="b" width="34px" top="126px" left="360px">B</control>
<control type="key" binding="n" width="34px" top="126px" left="402px">N</control>
<control type="key" binding="m" width="34px" top="126px" left="444px">M</control>
<control type="key" binding="," width="34px" top="126px" left="486px">, <</control>
<control type="key" binding="." width="34px" top="126px" left="528px">. ></control>
<control type="key" binding="/" width="34px" top="126px" left="570px">/ ?</control>
<control type="key" binding="right-shift" width="46px" top="126px" left="612px">Shift</control>
<control type="key" binding="prtsc" width="34px" top="126px" left="666px">PrtSc</control>
<control type="key" binding="num-end" width="34px" top="126px" left="708px">1</control>
<control type="key" binding="num-down" width="34px" top="126px" left="750px">2</control>
<control type="key" binding="num-pgdn" width="34px" top="126px" left="792px">3</control>
<control type="key" binding="alt" width="46px" top="168px" left="96px">Alt</control>
<control type="key" binding="space" width="434px" top="168px" left="150px">Space</control>
<control type="key" binding="caps-lock" width="66px" top="168px" left="592px">Caps</control>
<control type="key" binding="num-ins" width="76px" top="168px" left="666px">Ins</control>
<control type="key" binding="num-del" width="76px" top="168px" left="750px">Del</control>
</control>
</keyboard>
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.18.2/machine.xsl"?> <machine id="ibm5150" class="pc" border="1" width="1000px" pos="center" style="background-color:white"> <name>IBM PC (Model 5150), CGA, 384K</name> <computer id="pc-cga-384k" name="IBM PC"/> <cpu id="cpu8088" model="8088"/> <debugger id="debugger"/> <ram id="ramLow" addr="0x00000" test="false" comment="no memory test"/> <rom id="romBASIC" addr="0xf6000" size="0x8000" file="/devices/pc/basic/ibm-basic-1.00.json"/> <rom id="romBIOS" addr="0xfe000" size="0x2000" file="/devices/pc/bios/5150/1981-04-24.json"/> <video ref="/devices/pc/video/ibm/cga/ibm-cga-960.xml"/> <keyboard ref="/devices/pc/keyboard/keyboard-us83.xml"/> <panel ref="/devices/pc/panel/wide.xml"/> <fdc ref="/disks/pc/samples.xml" width="280px"/> <chipset id="chipset" model="5150" sw1="01001001" sw2="10100000" pos="left" padleft="8px" padbottom="8px"> <control type="switches" label="SW1" binding="sw1" left="0px"/> <control type="switches" label="SW2" binding="sw2" left="0px"/> <control type="description" binding="swdesc" left="0px"/> </chipset> </machine>
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.18.2/machine.xsl"?> <machine id="ibm5150" class="pc" border="1" width="980px" pos="center" style="background-color:#FAEBD7"> <name pos="center">IBM PC (Model 5150), CGA, 64K</name> <computer id="pc-cga-64k" name="IBM PC" state="/devices/pc/machine/5150/cga/64kb/donkey/state.json"/> <ram id="ramLow" addr="0x00000"/> <rom id="romBASIC" addr="0xf6000" size="0x8000" file="/devices/pc/basic/ibm-basic-1.00.json"/> <rom id="romBIOS" addr="0xfe000" size="0x2000" file="/devices/pc/bios/5150/1981-04-24.json"/> <video ref="/devices/pc/video/ibm/cga/ibm-cga-960.xml"/> <cpu id="cpu8088" model="8088" autostart="true"/> <keyboard ref="/devices/pc/keyboard/keyboard-minimal.xml"/> <debugger id="debugger"/> <panel ref="/devices/pc/panel/wide.xml"/> <fdc ref="/disks/pc/samples.xml" width="280px"/> <chipset id="chipset" model="5150" sw1="01001001" sw2="11110000" pos="left" padleft="8px" padbottom="8px"> <control type="switches" label="SW1" binding="sw1" left="0px"/> <control type="switches" label="SW2" binding="sw2" left="0px"/> <control type="description" binding="swdesc" left="0px"/> </chipset> </machine>
[IBM PC](machine.xml "PCjs:ibm5150") The above simulation is configured for a clock speed of 4.77Mhz, with 64Kb of RAM and a CGA display, using the original IBM PC Model 5150 ROM BIOS and CGA font ROM. This configuration also includes a predefined state, with PC-DOS 1.0 already booted and DONKEY.BAS ready to run. And now that PCjs automatically saves all your changes (subject to the limits of your browser's local storage), you can even close the browser in the middle of a game of DONKEY, and the next time you load this page, your progress (and the donkey) will be perfectly restored. For more control over this machine, try the [Control Panel](debugger/) configuration, featuring the built-in PCjs Debugger.
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.18.2/machine.xsl"?> <machine id="ibm5150" class="pc" border="1" width="980px" pos="center" style="background-color:#FAEBD7"> <name pos="center">IBM PC (Model 5150), CGA, 64K</name> <computer id="pc-cga-64k" name="IBM PC" state="/devices/pc/machine/5150/cga/64kb/donkey/state.json"/> <ram id="ramLow" addr="0x00000"/> <rom id="romBASIC" addr="0xf6000" size="0x8000" file="/devices/pc/basic/ibm-basic-1.00.json"/> <rom id="romBIOS" addr="0xfe000" size="0x2000" file="/devices/pc/bios/5150/1981-04-24.json"/> <video ref="/devices/pc/video/ibm/cga/ibm-cga-960.xml"/> <cpu id="cpu8088" model="8088" autostart="true" padleft="8px"> <control type="button" binding="run">Run</control> <control type="button" binding="reset">Reset</control> </cpu> <keyboard ref="/devices/pc/keyboard/keyboard-minimal.xml"/> <fdc ref="/disks/pc/samples.xml" pos="right"/> <chipset id="chipset" model="5150" sw1="01001001" sw2="11110000"/> </machine>
�PNG
{"timestamp":"2013-03-07 13:53:43","version":"1.08","ibm5160.cpu8088":{"0":[4096,256,4,1550,2176,0,0,4],"1":[61541,61440,1687,1550,0,61442],"2":[26992,24800,0,0,0,-1,-1],"3":[1,195272478],"4":[0,[14889283,7340351,-268371873,7340351,7340351,-268370092,-268370141,-268370141,-268370267,-268375673,-268370141,-268370141,-268370141,-939522208,-268374185,7340351,-268373915,-268371891,-268371903,-939523498,-268376263,-268371879,-268376018,-268374062,-167772160,-939523706,-268370322,7340344,-268370101,-268373852,1314,-268435456,14879739,88211840,88212108,88212121,88212706,14882004,14882081,14886887,14879751,7340326,0,0,0,0,88212333,0,-485750550,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-268374951,-939523097,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-18546688,-4096,-4259,-295108544,-226299904,6,4194305,60527,8452521,0,2080374785,-939523491,29096067,-230242304,-428933117,-234426368,49808376,0,0,0,1133,513,2752512,525533226,290921485,827201353,470621197,541339203,290928928,827201353,407838788,69975,34078851,67593,5244418,16384,0,0,0,0,-738195961,54468099,13107200,845,1073741824,256,336860180,16843009,4063262,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1651310592,538968064,661483363,0,0,1610612736,132712,4608,48194153,705233445,16142591,2,0,1610612736,722536,17152,1296912195,541347393,541937475,0,0,1610612736,2950760,17664,1230196289,538976288,542333267,0,0,1610612736,5244520,1664,1297239878,538989633,541937475,0,0,1610612736,5506664,6016,1145784387,538987347,541937475,0,0,1610612736,6293096,6400,542333267,538976288,541937475,0,0,1610612736,7145064,1408,1263749444,1498435395,541937475,0,0,1610612736,7341672,2444,1263749444,1347243843,541937475,0,0,1610612736,7669352,2074,1347243843,538976288,541937475,0,0,1610612736,7997032,2523,1229734981,538976334,541937475,0,0,1610612736,8324712,4608,1162104653,538976288,541937475,0,0,1610612736,8914536,3139,1397310534,538976331,541937475,0,0,1610612736,9373288,6177,1262698818,538988629,541937475,0,0,134742016,-4259,-4259,-295108544,-226299904,6,4195585,60527,75889065,7340037,905970945,-939523491,97777795,112,-18481549,-234360832,18022823,7209235,1065681014,460571,0,0,0,0,1560281088,235133702,-1744765948,302053380,-1526656511,302292228,302060033,1392573441,302087937,-989746687,302105857,302060033,-83821567,302129665,1661098753,1157784322,302060034,-67038719,-133994240,302060032,201526273,302060035,-67038719,-134149888,302060032,-1425888511,302173186,-486454527,-1993424640,771784990,8586892,733894347,1445915392,-339725744,-1336912380,4177409,1347821803,183222322,28332118,1347814635,1774060208,1443621632,-352299586,398349828,1381060608,102651223,-2052968877,516238848,1200226433,224889345,-1961734261,-1969810345,-466484665,-268177405,209128252,243254423,620699406,418055092,516228016,1328087169,-343821294,-2128689909,-1983892736,28578375,-2128689874,55019776,1562314587,1482250847,1358678878,-1275066437,1477496078,-2062120241,-1007275520,1376175662,-812645631,7340501,8814611,1329791121,538976334,-486531040,115888392,-492152576,867429368,1376159424,1975519745,186043669,1039168704,41251328,-1073082192,646448245,-1597832878,-1073086126,28579701,460592845,108380171,382533812,4057579,-1342016142,-2128689904,222791680,-369136663,48824142,-956962048,86534,-1897057506,436651741,113647108,522060828,652075971,1363608970,1596575063,-336272807,1879213775,-2038431744,1090557696,538990677,-1742725088,28674,-1761573248,1297040128,538976305,-486539232,8185873,126271539,58048522,-1442838808,32111330,-402475777,-990511041,1476817934,-571929680,1474872318,168266240,-401312320,-990511067,-1475382271,-401902560,1072234455,-385382400,-1276510373,780542,-160161624,1948304630,-1262752783,-19273725,-389868339,130416670,-475272448,92939945,-402541497,-990445593,-1341819776,-24712950,-1830032414,-1946242328,-104627750,49857281,-2147483536,10879110,542003792,538976288,7341683,8814592,1347158182,538980692,-486531040,92939804,-1442396601,-466485246,1946165480,-1439268854,-227213054,-486656023,-28907036,1962937064,-2134575373,535425909,-402475778,399375955,-990510416,-1341098751,147125770,-990508684,-1342016480,-1010824695,7340989,8814600,1279459515,608912207,8224,-1559917786,-1070398710,-1960437043,-1960443315,1018168405,11920886,1891221763,-136672489,-1329034271,65533540,13796296,-888995657,-1845439869,-385107055,-779623433,65271698,13796289,375698,-930417674,-997588811,-201878888,28627083,-1444341043,-843041795,168165658,-1950250237,-773664294,-773664303,332596177,196711105,-1947076631,-138398760,-1177318415,-235470648,1919220352,1693089795,-774206731,-788483376,3979730,-91557385,-997789194,51028304,-1951704917,1441377219,1879173117,-2046820352,50381056,216066,512,33554432,134939264,-1089801728,-990511103,857830404,63487743,410321978,449642676,453071915,-922025140,-771028363,-92076428,1191278376,8462021,-384925815,-1977156348,1108005,8462021,-1995610232,1334579839,-51451628,1397903696,-511652726,-117866248,-21757324,973544639,1946407686,-1090162109,1022035759,146473392,21018944,-1090453062,-990509947,-33065726,-2084307264,-990500671,50885633,-26167351,-2000486714,2106065525,139299078,-2012584568,1569196869,257263629,1482250843,16908483,1073872897,-67016704,589826,1,-352314392,-855193839,-352255229,-855193850,-402652413,57868301,-369341463,113704028,-134085683,-928900125,-651785981,-388004093,-225706150,1426321667,141900561,145753206,104514553,158467027,1946622880,-339673586,-817987574,57999619,-1576945944,243860436,865207249,225834962,378061566,1300956118,-137219313,-719943439,64463619,-1945906783,-773402170,-773402138,-2114780186,1912733638,-790722789,713077999,987662311,-1979549984,-997568288,1476416232,443860010,-397212080,-947912670,6547458,-396884133,-922877930,-402471040,11796531,378084045,243860425,-1007156277,-1957670057,46629115,-1174604917,-1960443648,76228125,-1424193242,-220051898,63977088,1599821825,1958742723,224758523,640337150,-533068842,-527826314,-389772720,710410251,48550084,-1327567876,376321,63776394,-686388400,-771313405,-701101338,-2033546493,-736719895,1913900291,-2125440960,50580798,-1274645247,1913900292,-511682512,702820927,33804550,-703690552,223164931,113646198,-1979644970,-33303242,259340998,-164493710,64423679,64304776,11817155,1314395085,-58718092,1476621440,1048614635,1946158032,123427590,251607528,-1564177913,129566293,105889536,1166716658,-787576058,-651785469,-2134640381,67637312,100794371,525316,-953775604,107462403,-2046972439,470058244,470232839,-2063126777,28678,-1409251712,1414548480,538976306,1879480096,-2038431744,1275113984,540234832,-14671840,28927,-1660909952,1297040128,538976306,-164422112,-527769970,84158086,1959016991,-1572797420,-641857803,199774982,-85465088,382592050,-1010814373,1954489516,-349581830,1225395703,1919251310,1768169588,1952803699,1713399156,1679848047,1702259058,540688672,543452769,1769108595,168650091,544829025,544826731,1852139639,1634038304,168655204,-2147418102,17302016,33554944,150491395,67113216,256,222301417,1986610186,543515753,1919252079,2003790950,52693517,5653828,84219904,131584,1481982208,538976288,538976288,65536,0,720929,1879168448,0,0,132608,1313817344,538976288,538976288,65536,0,720929,1879130323,0,29555,66048,1314017280,538976288,538976288,65536,0,720929,1879213760,0,0,536870912,1313429251,538976288,1297040160,65574,4867,759237487,16794690,2114816,1245955,0,0,0,0,0,0,0,0,0,0,16777216,512,-2147352576,396800,83832640,603979776,771763200,0,0,1109329175,1769699,49807587,20971632,196720,-482341118,1879130112,-914357248,1309725712,538987605,18882592,1,134349312,-16777216,256,369434624,16778242,0,0,536875256,1241514245,1879097602,83889664,781,0,-1291845632,16835330,234881024,1280,0,0,-486362368,256,-928593920,-928659291,522002341,522067742,505355807,396831,1230441663,1313410382,1398230852,13,0,0,1073750221,-1009152,16838669,201786647],1,[1,201785571,1,227,1,-16777216,4,-1,9,0,1,13312461,39,0,1,1596672,1,1,1,1313429248,1,538976288,1,1297040160,1,5632,1,0,1,184549376,1,8448,1,0,1,637603840,1,18089612,1,-452984694,1,-1943605966,1,19274308,1,50266369,1,14893787,1,264,1,-15055872,1,-1107164929,1,1879213570,1,-486499328,1,1245952,1,-16777216,1,1157628415,1,33566976,1,637534208,1,199,1,50331648,1,151061249,1,-256,1,-1525678081,1,10692097,1,335872,1,1207959975,1,7340352,1,21025747,1,112,1,65536,1,723910656,1,-150931706,1,61032664,1,-1084743936,1,61866017,1,17743786,1,203,417,0,1,-1879048192,35,0,1,-268370203,1,60748295,1,88220962,1,14879839,1,14938627,3,0,1,134744072,1,125896704,1,134217728,1,1921,1,126224257,1,37750667,1,4194368,1,134218372,1,134219548,1,1921,1,126224257,1,37750667,1,4194368,1,134218372,1,329500,1,7341344,1,134873728,1,97714192,1,112,1,7405171,1,7341410,1,77328966,1,14877003,1,1121648752,1,38404096,1,38405408,1,722485263,1,1048577,1,76560,1,16,1,16974410,1,1121648640,1,263456,1,965410818,1,290804999,1,88211499,1,213847608,14,0,1,2097152,1,14938112,1,2097408,1,16837646,1,14938112,1,-18481435,1,-226234368,1,54132736,1,458758,1,-234556906,1,1835040,1,101122055,1,4197632,1,-143673344,1,-230232064,1,28181261,1,458828,1,58654727,1,14876899,1,7340335,1,913922,1,14880923,1,51048962,1,722154710,1,908999856,1,213845314,1,653083788,1,1018178639,1,1107303680,1,-1728052475,1,33612544,1,188479488,1,-16775930,1,255,2,0,1,-1275067904,1,-2145326336,1,1989171196,1,-822038502,1,-1892788136,1,-1677531898,1,-13741830,1,-2147293898,1,2005935353,1,-387872024,1,-1943142180,1,771967006,1,54926985,1,-611398772,1,21038846,1,-1560091231,1,-408876078,1,198222594,1,646533208,1,378274533,1,512623335,1,646513061,1,378273838,1,-880017360,1,-1866673266,1,521075466,1,1049165618,1,113639748,1,-973012667,1,59654,1,-472785782,1,1961102076,1,217874459,1,-58717578,1,-2147126191,1,209015036,1,21118592,1,-1138854656,1,434834384,1,21104326,1,1124517376,1,817692417,1,1174861323,1,91553537,1,593750096,1,-1472790696,1,-1208013311,1,512429332,1,512623430,1,-87882936,1,1091501614,1,646655489,1,-1909587227,1,-1962744042,1,4622572,1,198353198,1,48603950,1,198222126,1,48735022,1,-822082584,1,-1892807449,1,1477240838,1,1582979419,1,119496031,1,-399048914,1,-1892760820,1,101509126,1,1448563998,1,1347637586,1,-986780949,1,-1023220426,1,883363502,1,893596848,1,895890784,1,275320893,1,898184570,1,928724373,1,268187493,1,779948079,1,249048803,1,762515257,1,755707139,1,770781013,1,271191492,1,231149524,1,230952393,1,266276292,1,756747716,1,258944291,1,285151149,1,757797147,1,283389235,1,747318382,1,750529707,1,264244785,1,666766841,1,238555105,1,284102231,1,338890351,1,301796882,1,313332618,1,970734387,1,1003371193,1,989674491,1,1018117217,1,1009007870,1,1038302283,1,372118962,1,666441283,1,665528308,1,1070153497,1,298848714,1,342167139,1,286592556,1,1043218023,1,-1295794126,1,-1977674240,1,308144322,1,359858096,1,639154920,1,1242388107,1,71731750,1,-1960394498,1,-981269938,1,-14489578,1,-1996206967,1,1820919380,1,239373314,1,-1960896829,1,-1962150114,1,-1593051890,1,99093497,1,39619071,1,-1996206967,1,-1073036540,1,28312948,1,503565289,1,375345671,1,16498207,1,-204960851,1,-1010814043,1,15704118,1,906044611,1,-1023348830,1,192266250,1,922669032,1,-2013182304,1,-20773308,1,-2146863672,1,-2009726494,1,-1023326698,1,-389808208,1,1153957556,1,-1946074878,1,-389869484,1,1153957544,1,-1946087934,1,381882452,1,-389903841,1,-4714057,1,-400264449,1,-768403437,1,637534907,1,1225608843,1,386132049,1,1128399221,1,643561442,1,-33274230,1,652489408,1,-402502005,1,1284111980,1,106727684,1,-1996335991,1,-1070415100,1,1309066806,1,-1976172541,1,906186278,1,-402436957,1,1552875084,1,-1900006636,1,704192,1,-1526691649,1,-1515870811,1,592570789,1,-1307958296,1,173175296,1,-1593476892,1,-1023540929,1,272992550,1,637726881,1,-1592638071,1,-1993997582,1,396432453,1,1166616067,1,-990672106,1,-1207897282,1,104464639,1,158663393,1,-1413415253,1,46506155,1,49258666,1,178962686,1,-1912310574,1,-1190972130,1,-1510801392,1,516145202,1,-18425,1,272992550,1,612034755,1,-277677429,1,-1005566581,1,-1073016211,1,1569449336,1,1344164374,1,-265385674,1,109852162,1,501744370,1,113727499,1,-64725,1,-401975832,1,1594296820,1,-385913623,1,-5240436,1,-947666318,1,1300964897,1,1976110061,1,8435971,1,1179046451,1,53812878,1,-150846325,1,-139636495,1,1523715057,1,1967129716,1,-1951710719,1,11578050,1,1933638019,1,629679619,1,435218627,1,-2011085431,1,2105746261,1,57884686,1,-1021020792,1,-216102090,1,244004352,1,1105723637,1,39619069,1,-1022342007,1,-216626890,1,512505344,1,-1295843083,1,-1977674240,1,273017026,1,-1528295566,1,-48306154,1,-1945998199,1,-1070461372,1,-1006653245,1,-5234922,1,-954469144,1,-16692986,1,1191626751,1,-385876223,1,1170610797,1,2105540871,1,141885188,1,-16497209,1,444917760,1,1964667368,1,-1607023639,1,918749502,1,973151904,1,906326992,1,20846216,1,1019382467,1,909800959,1,48578244,1,-840377549,1,-1259507185,1,101705729,1,719850357,1,1300244000,1,-1070448618,1,1702897347,1,451460886,1,-388287712,1,-260960340,1,-286785100,1,854553605,1,99084516,1,29053891,1,261548032,1,1156979570,1,292847640,1,1959089694,1,71628313,1,1948212752,1,-349582076,1,583683,1,-389850120,1,-93188236,1,-402396336,1,62136277,1,1946530024,1,45373686,1,-133846808,1,1017917123,1,-386304988,1,-169139220,1,512306883,1,-1943141576,1,-888980986,1,-1003597050,1,637745182,1,216961,1,-888710399,1,1445050344,1,-1879301144,1,-389871548,1,-1004142568,1,-65607649,1,-1946002295,1,-389869500,1,-1993998328,1,1603020311,1,-617364734,1,-661994610,1,-472783919,1,113653443,1,-1895890521,1,116797122,1,1962869159,1,512634375,1,116064677,1,-1896095768,1,-164424612,1,-2135294325,1,782627584,1,27723510,1,238449919,1,-1176816865,1,-402259948,1,343025788,1,854087430,1,637760040,1,123667966,1,117803558,1,126494214,1,-488488185,1,27604735,1,-1893313701,1,-1946151418,1,-1912494842,1,113651419,1,-1593835097,1,-919404542,1,-1030825586,1,-1090484034,1,112787466,1,648409856,1,721420963,1,268385730,1,-4717706,1,834319,1,78764075,1,-628170541,1,-1996487005,1,-956299234,1,-855638010,1,84330016,1,113744384,1,567083088,1,5375686,1,-1993423925,1,-1023302370],2,[788216808,27604735,-1023261553,-315416,-123922828,-466482453,-318488,-107145612,-1885600631,-373090748,-1410793296,651225088,-225708686,118918190,113716739,174588677,-953282384,188934,143190245,-680393808,1053153397,-148176077,141950806,922689302,-1070398697,-402450525,1366427186,-1006141976,637743934,17122758,-1206859901,-1951719378,-402450666,783812229,-396711122,784598653,844759792,418244800,51844747,53690053,-1980300450,-1982713068,1418265172,88458756,639571457,-402635126,1340676461,-1000711425,839053358,415099072,53690053,-2080963746,80091886,-2758427,971572656,639691007,1377720946,-1914113397,1968140808,51880269,-2027497333,-1073013666,-1099686050,-947651189,785877790,49626752,1174565888,785288006,49692288,1174696960,187427649,858354907,1031808731,1191474176,-1325995197,104476207,41222393,1135238320,1482169067,-706149456,-75283458,-617364672,1958742700,1949187174,3008541,1916861315,1166681839,558426367,844038517,-953767232,-58298,179097323,1010791616,-388926162,179044387,-348949312,-391489593,326369211,1946172544,401124364,-1427147487,1946135272,1606637570,994791363,1358525690,-12219866,1478557160,1263529588,-1437602325,-369207831,1139277989,-1946652123,129165554,561377650,51854987,427097867,474909478,1979709827,109635605,-1946591256,1552811604,1490283278,-385503144,-113508824,279970933,1053160939,-550829261,141950803,118890262,-1341998657,768319,-1070421261,152692906,-1912220952,-1962724066,775794163,-2084276960,1034755782,-1149948370,113712918,131391,-972705048,369280262,1929714920,-265370458,387877634,373483523,-390057382,1053103923,56296243,-452475169,-1325510935,378661635,1975519775,-115963386,-31462656,-2012908088,-1023346410,108382462,16389770,-922874645,378013045,-1329397510,-1377254401,106203640,-2080535613,-1414724921,-22228853,-1057051960,27845682,-989985163,-152311600,-1968520054,-1431525928,-1414662006,-355269199,-1950219448,-137219126,1204325361,648848711,-1391049080,652736170,-1425652221,-1993948925,723913542,-654897850,-388772982,1183393344,1187456525,-1023410148,67896834,1082130440,50595842,378285818,-1993473305,235070758,187743255,1090977334,503773953,166207254,443686659,1946927592,118359573,112845874,348700416,74821362,90540582,-100140793,1091501622,646657537,-1909062939,-83695850,-1943078197,771942166,48572041,817633038,117323275,117113153,-400615906,1914634940,194570445,-1590251029,619184396,-1023315200,507059974,108331009,67271,1048576000,1952055296,190698,-661855253,198147,650153536,16000,638219341,16000,-117279654,-2134640445,1509949502,-639043468,653488895,81539,652965120,200331,51249473,243934720,243793920,-672464896,-1070399488,211891792,-4855807,520492402,81539,-2145553408,1509949502,-1712845964,1491825663,233375664,-147658500,39618907,-219477840,1929355496,51284970,-902080000,-779419018,2010725202,-1943702322,1086522328,512344206,-886374397,243869257,1303576579,7814,2000934,113714688,1,27631926,-1946156637,-379895592,-1064502354,-12720056,-953808526,262,-1326650624,-1935676663,686311616,-352160769,-388460921,-143458507,200331,1993947985,-8787556,922126312,24450700,1929824054,906146561,24577735,-1556742143,1156973235,58032152,-402620183,371127928,857675271,1746831835,1914603521,23444225,168040121,-1189579548,-855767794,381227380,1959591432,168671570,1265945854,-1274605639,1695451270,1731102721,533498369,906022120,23608971,-2147432457,-511045772,1008368104,914715649,23668352,-2145446147,108332541,-1576963424,646578867,-722075287,-402463616,-1590233616,-1262288205,179760007,-31034140,-33196852,-1022266164,-14584577,350757748,591695616,-1021229937,-402643992,384305151,5302294,1501379,1359395816,1494616296,1072220427,-1281346048,-1326877438,-1892236518,-402563834,-13175376,906031926,16070399,-1960896994,-1996393202,-1962871538,-1996393714,-1962872050,520189710,17712327,-388592896,317395106,1560710966,110048769,-1892286219,-402590970,-13175460,-989766362,1149966708,1638086150,512505345,-13237917,-1962843874,-1556740028,-13237919,-1023319778,-162441386,134399238,633217141,71628545,259293184,180781910,-1191003713,-1477246972,-988908450,-97484,385475445,1583307039,512505539,2089419523,-1060143100,920643456,50411145,784655851,1059324174,18744890,638350069,1946175034,1858348550,-1980437736,-1945964498,-1023217146,-1320136361,370585604,21741319,1353341098,866828682,-947672128,-528066552,1355056810,-1934900341,1482271704,-1851026773,-1151348345,1472397643,145838161,-284294602,-1580799232,-12778711,-2089388545,202558,-1007091083,51846795,57989899,-1190003736,1139277825,-1947438575,184751894,-401902126,113705456,-65217,1048646635,267911955,512296050,-745864429,-353838286,1317676560,851574276,-5221907,638755560,100814475,53690052,281510743,-372129741,24357875,-1057071190,88442918,-498968313,20947416,-1178339264,548929540,-1431571680,50673291,-2086006608,1149962951,1150003990,-1031034092,-1413467221,-1159150677,1392144922,583710,-389849337,-93185363,-1612177642,-402361602,-389866887,1048576991,1963459269,19589123,503353064,53812878,-469096566,976630644,1946346278,189265452,906327048,53937918,118944651,-1191003713,-1494024181,-2144981132,1950351229,784605173,-2098724112,-339447040,243998541,238747967,74646313,53022345,48440890,243916916,-336002261,523012657,46474890,1946732022,147125769,-466433932,-58714901,-2084604920,1827147718,-167283709,-16588282,784642164,-1977220368,118882406,20947395,-1325318237,870372100,-773795374,1586177746,-521961470,-628362249,107604051,857115483,281182979,52877827,-1581055402,104530239,628359979,549684032,527620667,48963210,507167742,410125044,53288587,267975553,-75298957,-352161278,-1547437657,-1007156929,48963208,503398307,53690053,1107842443,105572383,-1511269581,475958054,376757003,267975553,520501362,-400656755,645071346,474400550,521535488,396607539,48996867,51618632,189172518,274107174,-190660053,353798402,396477187,1183393283,-619986148,521589876,51846793,71731750,-190660354,184543234,51592841,-617426037,48963208,-1995509528,-1023208170,10414160,911856010,46468744,259246219,-771095435,78644341,-1070414855,1950018553,906211372,46466806,169375000,1360558317,891194934,191859203,1963050486,36562947,-1341885351,852617989,-352079680,906080268,46466806,-121539568,521556163,-1187086180,91565570,-352210787,-1006199536,503514430,-1047853481,521431784,1488980487,45089908,-1006189575,1191380286,512644638,-208993483,-218100807,119496356,74907964,-1007108086,-1070349319,49652534,-989411786,-391375358,1131682082,1017962634,1315271738,374742606,1048589831,1946157306,10807301,417876083,-375376384,-969519104,59654,1493086696,15311414,-1259790498,-390057472,-1317927781,-119005418,516159498,-1185706,-30007458,-2147289594,1081344060,-402237922,1929838656,-383820283,1482162306,-756545770,-1010762217,-184091082,214206978,509619232,118902870,1476410856,-1293361037,1914658559,-1813467934,1320907800,-1981065698,855532520,118932416,855644351,243939017,-1494024169,-397538188,975575081,-227213499,-391330823,-126543770,-1191003713,317194249,1949187096,408217614,-1073084556,-492173964,-2084308499,548405953,521579251,-1006929432,-32315362,-397015521,-930474225,1602275712,1979136775,9103619,76174878,1048583958,1946157306,118883863,133909992,-1073082766,1583248501,518522646,-1010762217,-397343145,123337885,-982486433,-167562434,1947208519,1048589909,1946157289,-1932031215,-2145427496,1349779517,-91531490,344709262,-148119765,1364611155,-1962379777,-37558054,-390057382,1582894743,1049320280,-150797517,526376707,-1073085046,-1958273420,396421367,1692992373,-919449857,526369785,-1073085046,-141884300,-1057045511,1589845782,-1962636769,-104854793,-265370429,-1547685118,933364031,698566659,53191427,-1607053117,-789183803,371508514,1460061016,29053782,476047360,-1979463805,-989642466,637747766,639202697,639327628,370695560,-388287713,-947708863,1075743235,1010222339,1971922435,1569465881,1569203739,-971041256,82950,21300934,1600019201,1460060935,113660758,-973012668,83206,115923763,63406876,408783398,54533768,427148582,1010207030,512505347,-986315970,-1979513546,1959073884,1569203737,1971922456,1569465881,-1155590629,-823656447,63406875,408783398,54599304,427148582,1110870326,512505347,-986315964,-1979513546,1959073884,1569203737,1971922456,1569465881,-383838693,451477371,2027620867,70248452,-213990205,1086584320,-1007286412,842626052,11200960,-544530682,-1070345677,922355176,50673349,-1946585880,914797783,21905035,-2147432457,535300468,1023052563,-1948814335,1040398074,1995112797,1965081590,29619911,-1612119180,-1899983872,870288344,1371704274,-402652743,911866302,50673349,-400984891,703074725,-2035001351,1312721718,13104897,-401378176,912200402,22873799,20709377,-1070408332,912200427,22888067,505378049,1528729142,520456705,1493630774,113718785,334,1947876423,-536003580,535515058,222079660,80085877,-536200182,856126963,367454454,521535756,-1979823128,369160246,155093279,-1006013181,637732158,-1088920192,-1023132952,-1946255384,184610870,-2134805002,-2147341762,113706612,-8388054,-1168701871,-1998061014,1493655318,-2147341122,-1602938308,1336548016,-1847063888,-336186603,31713449,1702419210,639132648,638862729,-401189495,516097112,770187030,-208986114,440183889,1709704564,1492574741,-400572117,703331784,-219627469,918894328,786957061,-1260942344,1049310855,-940113586,158629888,-1961764376,1946238170,1570840539,87999489,651309827,-1961986569,66185416,1087078595,-370950093,-977040866,-1962872034,-1462619141,-1464765152,-1466927870,-1956154108,440369346,-1185850764,-1830289407,-986293768,-989657802,1189615988,-137697264,914863191,21905035,-2147432457,1944588660,-952738031,16866566,1946237952,1594485725,1564377910,477364225,117388866,507969881,1528729142,440238081,906589215,21890759,-1226702848,-383794549,-779354261,521598699,1726502662,-1962446311,63341559,123674374,104347331,-126746338,75090174,20881462,49259062,-200373565,-1997408766,-1979520218,-1947389240,33756438,14057684,51584651,53288585,719853795,-2116057339,1930426619,-1980505598,-1962726114,-388199721,-1070462699,-722989132,-108281078,139364902,256281126,-326441934,-1957670574,2156751,443832664,-236793853,-389051558,-1737228270,-301545930,-1243086846,1946237968,-1017461778,1720329809,1183458838,-402238719,585889622,1108112,-969479820,16969222,1007718376,-1007782911,1720329809,1183458838,-402238719,-645073051,-985784801,-1578626442,131698422,244004443,727646557,920254415,-1459532127,1354989568,-922876534,49259062,-1961343606,-167047563,-2135030155,242583808,119442486,-1994451453,167970110,839023040,-154998592,856257368,-335100215,-1017445374,1916862083,-1980354046,-1560080626,378077963,512426765,512295155,113640201,-973077780,191750,-419964277,1375936419,-419970165,-2084371621,1584726226,-1962729053,52404688,39750438,1316213563,430175223,488016131,651201283,-1576778206,-1047854357,89033254,378137299,-420019437,100911243,-763166477,-1592101888,-654901005,860356981,-1544095790,-420019441,49022662,-473396478],3,[87999504,1569334787,113689368,855704300,87999689,-1581032701,-645201123,242532363,38152998,-668215049,-1023212429,597941043,868453123,1995908818,52929282,52762249,52631051,20828277,650867968,-1560131957,378077989,650314535,638600587,722623883,453189382,1912807710,185234718,991458496,-1962773567,-265370424,-6559742,51580555,184933096,-385256247,-1326906959,12970240,51451529,51584649,52641411,-402426880,1048774177,1946157863,109832417,113696626,-1979645203,-1962743018,-1962727666,-402451682,1347880613,-182546861,-397323776,1515978245,-1977165309,-689438650,122013191,71645697,1429815669,960262664,930285661,359808,1347956340,1428902487,-1948584184,-1946645513,1317742274,65140482,281445368,906422737,16057998,24356339,1599735716,4622886,-402147864,-1317730398,1499012886,-2129730725,1930426619,-16731616,-352120570,52797826,292864011,-402447453,158467565,52233927,1860698112,87475205,50962691,103544971,-768409357,239897382,104591863,578028303,49022662,1959922433,-335100391,-903150846,-184119802,-1070361856,24373713,-1817447510,-930398201,-165216629,2029983813,51618068,493191462,153546752,295771461,1166616067,51093787,51189387,55117795,13796289,-478100671,1569203775,-265370600,-28841982,-1962729567,-486334186,-2084502664,-148504366,-661978506,24498699,1317676616,1357435653,1053034066,-1960443131,-1960439739,637997653,-1962772745,1959922632,463683585,-1547685117,832766767,-651470845,947150706,647219851,721577719,14320577,-763116797,-1960056064,72214728,-1209526045,856912645,-335100215,195100930,219581187,87999491,1575731971,17557904,561431083,799265331,823560451,624853763,292814851,52903555,-16092160,-956094714,206086,244013056,-588774637,320768259,286689539,1958882051,1369498400,1541982347,-1552787451,378259595,1229062929,-588774540,320768259,286689539,591299331,125042691,51584651,-1593558296,-1073020121,100754804,1860698905,-318323196,378142978,512426731,243991315,-1964506329,1380996868,1183458899,64588544,96725210,17253830,1963214138,139802898,1564020082,-955747576,16712773,-402271768,-529201730,-1909040549,-402590434,1532623843,199434006,117375154,-1226112239,-1577118487,-1073020123,597888884,67364867,52233927,-1192755200,87999491,53453059,53546635,74825739,141871371,272957734,307040550,51318411,-1946273815,1959398344,77115,637590147,637695735,-754626934,-389510168,484639459,1912893928,87999651,52404483,272992550,637739425,856835465,-31856183,-401604678,-504691470,-1006183629,637732158,639327625,639196551,1926529,-620034064,-773273740,650308356,1997364795,8579093,124992907,-754667183,-2114364945,370147303,-1269775585,268418944,1477178600,6482115,208876939,-754667183,-427730462,82509839,-268376447,898232843,859227446,88393219,1048589825,369099511,1355904031,-106868397,891194882,281445123,521544840,-82408624,114178,1458094130,859751685,88458755,281510657,2114135631,92821506,1532567318,113689432,1342178039,-1957539501,65589699,651310019,-150843765,1174611697,1380993286,852527953,114368,-989522712,-1929170122,1482231932,1006109530,-1976994367,-31517179,-1576863994,378077945,843186939,114368,-989532952,-1929170122,92934268,-90038506,49921794,-1956947622,1491653059,-1605181,-1610435584,451412719,49258507,-1326357528,1720329743,21734145,21825222,1309067009,637534209,-1575598454,503710040,637619131,118650565,384882664,1049298719,-940113586,-1183481856,-2044271566,-274720922,1495665154,1947564033,-989936895,18955973,1946436923,-2093103628,-193593345,-972845848,973145925,141886533,-16497209,61138944,1963168232,2126849770,71694098,242556928,45817622,-25958400,53690053,1426459883,557761846,84338689,-947714211,512505360,521535835,22625929,-1977215312,1268973926,1292289537,113705473,334,373721638,100751522,1996432926,1996432916,21740306,-402186402,369618988,1312721695,13104897,640775552,-988395894,973167926,326371908,921493224,22625989,138840614,258378278,385500553,-18401,474383654,650314101,-1021557111,922671849,855854241,378091218,602473292,-385765142,911272488,55445190,109983235,-92077659,-1174179066,-628424698,1793590867,1918574574,64523271,172995,-1205540008,-1031589632,-754667249,-468981270,-2043222990,167832102,113653476,1946157902,113653254,-402586802,-13179648,-1895717578,-1645669308,113126,1031862923,-2096925185,1166739399,592808737,1053034179,-1960443131,-478077603,-1960439809,-620029099,-903143820,-905770893,-1960390093,-486074019,-46405618,267976577,-544799373,-1007492542,-1018543865,51582603,48963210,-402579224,113640163,-1962867987,-1962735306,588155902,-1980169469,-1006433986,-2096942274,1040388295,113443613,-402521928,-1014169654,16057998,-24650866,24373713,128316324,859751734,274566403,-35065045,1983587841,-402427390,521536079,52011459,52011840,52102715,41353648,-402210766,512688010,-372178699,-207355533,-986314843,-972868834,-1929312953,-30732169,-74713205,637647848,1912763963,34465795,-154984682,-16585466,-341826188,650182146,1979991610,320768791,-117735165,-401444081,1049230441,117375763,11535121,-134026334,1388575171,1183458899,-1967063548,-1950209312,47569,50087144,13992136,762563131,994296970,1273853179,51584649,-1957506773,1727473345,154569474,-1547304189,1515717385,503437867,-396688623,-561315823,717892547,-1999831327,-1962743002,1372449738,89033254,-489469366,52876042,-1017574570,1031862923,-2096925185,28903367,541428224,-804498037,-789917216,-1964864808,-1023363370,-388287661,1049230281,1381696255,-1014279343,641979275,2114805307,81195,-1168430209,2078806015,-1054124032,6482010,650249026,-1241229686,-487112192,237750411,41353995,-1007040205,1962641640,-964802548,-75503469,-342686860,-1948612675,-73799486,-1327310709,-401604678,1499200399,-77338534,-2030034968,1979648991,1053034190,-478084347,-1993994241,-2128209571,-268427931,492636454,1381221127,-1948568745,-402456810,1516239707,-768359589,1962618088,-389575688,-130155701,1926793999,451462125,-117472773,-1946782961,921955295,18955973,-2000669872,1036322629,1979711363,1053112054,-1017642719,1962934147,125665530,-973835007,-1007555779,-399129594,520486920,-1022886261,1172854763,-2096249630,1299513337,119457164,557237558,8054785,-1992946571,906043662,19082889,1444812011,1709716677,1476686848,1593043800,-1995667169,1444807276,-24955707,1476687103,1593043800,-1942189793,-953810364,654311173,-16628281,-505747201,-504698685,-986314978,906043702,18955913,587631670,898180609,39685158,885347870,1946162152,-346531836,-954245389,-939524348,-64956,-147077141,1381090933,-1030956660,1499122235,-1544145981,-1977220355,1053098054,-8191673,990672127,125110357,1963214138,913304322,18955973,1963480379,71645703,1240138357,-8176187,921531903,18955973,106254934,117480424,912153181,50136822,-1927776769,28905565,1381455360,91551243,-336277528,-185866237,-1990303910,1837697109,239438860,-1977162702,1166606406,112644,141882891,138840614,258378278,-401980023,-1942552876,906179870,21569164,1049173782,1049166643,-977075897,-1274994370,73742591,-533059980,1161430388,-2145553148,1946158461,1979666455,1763332,920924760,21169722,-5242251,1476674953,-8176187,382629375,-4668641,71665408,-176881860,-243997686,1124481590,-991267839,1569524845,139823888,-1979036277,-1964166459,1347508197,1392509369,-194647982,1498962778,-287125501,521585503,-1593096984,512426297,-1847066313,106727904,-1995981819,-1607072700,-1329397443,-1125547521,-2095615481,309819385,242546186,175428106,1997340288,-400615931,381881240,185067551,-1981785112,1284048468,-1010814460,-41877584,-2131201256,-210551559,1933377152,1694138606,1381099891,-1380245738,440578,-1031024077,-348592045,372688158,-357898239,1592285983,-1324970005,-1358524670,372688130,-359208959,-389824462,-437715814,-402199568,350813330,88400882,-763166719,-398660864,-840369413,-400233488,-51840269,-400757775,-1108804882,-402199568,-320275738,-539825935,-486257527,66822,637588099,639714697,170087816,637826294,-1960544888,645866696,-2145368696,-506363679,-980757807,-1993940342,-1607070651,-389872916,-5241275,48538166,-1607011214,522453701,309665596,-1342174279,45727551,108375795,-486095306,1944584194,1929359595,2028210897,-265370419,-484013566,1053105666,-164232397,16958726,1207306613,57934091,907864863,48498374,88458752,-1960343551,-620028132,992348532,58133854,-386105368,2045307863,-390171669,-459275942,-1981168894,96987136,-964429710,46579461,1913001704,-351475475,-469047182,-1178672008,47431426,-218100295,45727652,-1191000386,1017905163,503870783,53812878,-1440807030,1206903363,-401209914,1064561022,922730547,-622329537,863197418,49295044,-1947504152,889622267,45727235,-218100807,859736996,1170613763,118882565,-1090333762,230228665,-391843072,-1586238740,-402600471,-5242678,-360781629,1347876978,-469057486,-274724744,891194882,866795523,197624768,-1417629525,-1513059411,-129725531,-163279957,-1973528405,-1438643004,-1031067784,-1070378837,-1968547669,646592196,-1320090857,182768132,-1590252860,78709527,-1973821229,-1070355772,17221059,-1943622909,-1946948835,-12746502,-947715211,407238151,-396593728,1517421760,-225763758,-1323410293,1407963908,-1998053610,1843944439,-368318229,1047682823,53681861,552684672,424512294,-1960440695,1418268757,1435182594,72648978,341150502,654201993,-1995025013,1204223060,521535749,49295044,4622886,855419112,-5192768,73656515,-1178654350,768258,-1359855696,-969532044,-16588282,-1612177838,-265370391,-401181950,91416801,-336970264,-346415303,1493654221,-351907502,183662052,511080676,53690053,1972046987,451092232,223230758,-550824841,-645179821,1526378472,-1595359182,503536635,116785971,1946682053,926842887,-1183514621,53806734,-1178666101,375042,-1599736924,-1314258235,-205507835,128903339,-1416451182,-1420312525,915123115,-970587341,-1006566076,637726766,1342195338,-67901357,-1973528485,1594357984,922644969,21053056,-1023314943,508757585,235343446,-959892705,83983622,24839878,2114881806,24886017,18495173,921132008,25036535,779420160,25731126,678757180,2097595958,-969538559,369195782,-2012313546,243873281,910229886,26021513,1592208360,1493654303,-1070438421,123412318,272417625,54281588,-1664925324,1161723958,175374337,1111392310,41222145,-1013110579,-388287661,1918627708,-402541322,-613096003,-831188164,-1293360078,906619877,15603446,-3675965,-1561853516,1408660709,1374214963,-881697809,-1830230990,1947221221,1963146462,-402411297,1676149840,-2145446395,83006,837288820,646707948,378405605,-236453145,113651419,771752257,21104326,646524416,600638282,48735022,992893084,1963149862,-408867321,-622860030,1244562222,992870915,1946372646,1275115531,-368654802,-437518592,-1892770480,1929570054,1458236376,245328,1491038952,-819737250,-1224307658,780744194,-2125069643,-1946091545,5761245,-2120760482,-2097086489,175440127,1183458896,1134704128,-1054124031,642961411,1510106871,-466429949,106314534,-989982094,274086694,-989984142,190200614,-989986190,171369680,637726246,905987722,45549196,-1255241418,1992566274,918916114,21118592,911045888,48834185,922355478,21104382],4,[1091501622,378418689,-1960443161,-855448282,646522404,-1943665947,-1945966826,919899844,48834187,1090977334,113653249,-83885758,-1255226314,1946303490,113653259,-1006698173,-320094158,1048583958,1946157380,-352393213,55445190,-1524724222,581967361,920568040,45549196,-1256289994,512439810,-611450459,1493178017,578077499,511039803,1048589904,1946354510,-487659504,-1962928967,-397717031,-497481641,110049014,521011621,-2031550544,113703673,-973078207,-16694522,27598478,3151502,3024523,1490706408,45635672,-13741838,771929910,45430527,-969486341,60166,44618290,-970587019,-1186529275,78118920,1948299411,871957252,-1314196535,147060227,-117242764,-1426863821,-2085901423,-1007283985,-402033663,1961361523,1174697217,-402625816,376832329,1966750848,1076643345,976619382,1979784710,-1426083326,1196314438,-402650951,1015021587,1174893870,-402652231,-1031143411,1324942275,18081987,-397478026,594673933,-164230027,-16717050,540809588,-337439371,1965702217,-213929980,1060940458,-897524363,-1327961343,1319826208,552119491,1325036545,113653443,369164523,45727495,-1189040041,-1426915317,-796213198,1015046058,-1534233298,16836780,-1073080972,775688564,-1398141835,1946218984,1958742534,1313754626,-1195130830,-1044439008,866822914,702912,-391468045,-809565204,-1834249726,-1178889301,855083778,29344704,855829248,113719039,-452984094,917303947,839049634,1979661540,130188042,-1979267453,-391315612,-713888689,1347834398,-1090054569,686293689,393371392,326500107,-1142415594,-401837085,-969477485,369280262,1491480040,-987330506,526016002,-1178663146,540835842,-1181059847,250085387,1963684352,-115327995,-492139659,-1396442895,1631354660,2050754162,539755127,-294375876,-361487812,1946169832,1952136421,1952267489,1949973725,1950104793,1954299093,1950235857,1948990669,1950170313,1950039237,1949056193,1946762429,-1021297479,-76271812,12803132,1396395328,1027423804,1095912255,-768225215,1731677750,1412905526,204921142,37150519,-466164681,-399026634,-397410096,-1017643004,540852874,2134655858,-30014092,503376902,117323350,-2143944462,50393638,-397408907,-396821562,526310311,-301533642,-814416128,-1151984045,837287937,-166956309,1954551876,310022,-339509781,1947024509,1946696736,1963539494,-325044550,-151516160,-930459176,132317365,-1712840528,1509548799,113653443,-352321300,915139482,15470334,540840427,154989427,-1336873100,-8984482,-398455720,-389808272,62651218,-355538944,65795186,-1258606360,-519313407,-466422156,-1008663320,244563,-1152187157,-1031143420,-81205168,-397009320,526310189,1444856667,1962613224,-387697925,526311645,-1393390653,-126606276,-335601688,-1898935050,854756288,-1073041939,-594876812,-1019544182,947914102,-1979550707,1255181021,15507510,15573558,27967318,-131168202,-1963095550,-5314315,58001980,1023387624,922317830,880739898,2134653044,138161012,222046068,171720820,456941684,-231054732,-22406797,-13440826,-130121674,-864747518,-931923142,-339214778,-1336349757,-23140345,1642642155,1460515327,-231440193,-506372178,-1493177973,-391498611,-2006974844,-956366987,-611531380,-577846386,-1979602242,-1012599858,1776815536,-385175298,-202834332,-8590849,1508400304,-404201730,-308267265,-22419456,184503785,-401509130,-1977221038,1931492357,1946762247,4712469,-130121674,125108226,57999114,-380710914,1331167042,-1328641283,129192736,1991118563,2105550345,158599425,-220017666,-316790218,48114176,132219083,1952406524,518339,-1125385246,-1336946946,-34936824,-437772112,-385306371,-1607008800,434713727,717982463,-402134065,48955444,-969539151,194566,259322426,192215866,904440492,-20447490,-370679098,-80019762,-939591308,-20649658,50333672,-369556751,1642659514,717982462,1226273999,503714932,-24422649,1605300807,-167283449,717947601,-379730993,1085341334,1610445800,-400685481,119537390,-371291554,-164167924,-385681386,447807098,-385968151,11598138,-15936652,861032643,-391190309,78906738,1524560104,1021348440,1007907841,1007645702,1007383559,1007121416,-1341950966,-369442048,106026184,117448936,-506404400,-506338863,-288300591,-779366902,-1325320031,-773795324,101341664,1455620407,44940115,855639737,-389903406,-987832234,-402581962,1528815560,44933470,45026955,45160075,20645435,909984372,-1556253781,1364590907,-1177406638,-235469387,-523116335,-930357039,-402550338,-372178909,-1031732109,619184328,-1107185408,283640217,940476416,378028545,-1830289097,1582914048,-1409239869,359845947,-348008405,957253878,63043073,41229488,-1700609794,-253181183,-1144616193,987169176,1929359554,-2234252,20387465,-372119087,-1962560072,-1964902438,-2147403506,-1849818143,-774862079,5433569,-1715548278,1239959809,1238075904,-1550659325,1398145339,44940112,855639737,1405258706,517965288,18233029,534706152,-542381989,44893839,372688158,-555292671,-1587651809,-768409285,1073743801,-1997408448,838941974,11846592,61668323,-1006902576,-1957277360,16759282,-1073085301,-58709644,-2147060422,1946157692,-1073042402,1060910708,708582004,2145916532,-470911493,-1073042422,1944587892,1105425915,485214475,-638858957,-24907221,-2096270334,-344652546,2088825483,-478856703,24496395,1482252025,-6231869,-225768078,1944195048,167948531,-1342016055,1355020547,922726481,27592334,-1191176001,-1359871980,1325561337,-1017619976,306103376,-31999,723918452,92013637,-348273626,1157834480,683365124,1541666304,50333189,32241912,1354979577,1912618984,92940023,-260767940,-1008147406,1407904767,516175441,-164429550,1962933123,442136,72321830,3768358,-947712396,-186497496,-350239706,65796579,1509489411,-75250853,-1911852268,-1962826490,415728635,-1007041544,-469318090,37486603,212862326,920124393,198581900,378085142,-660468780,-12064757,78644339,109897451,1049168859,-1897395239,-1980796161,-1995711178,-1945379010,504094982,198448837,536808168,-655687053,53806734,199435912,1971373302,1200236068,1947248651,-351948796,1963501797,1946265848,-465666030,192217099,198721152,-337218304,-1190717950,-1957298165,-549549069,-1912201717,520872198,638281610,-2096994936,-1527577401,1053056543,-947713057,-484013565,-201791477,1053040406,-31061025,198746117,21334054,-1993949133,-1993989051,641738309,-1005501047,-1593059010,-2010772515,418349829,602523531,-400615721,91488012,568919728,92939991,-193659076,-16398810,-2014780366,115962622,-1928462817,1173750613,393592859,-402491905,911997132,46472840,1022625256,-1341884929,-339219710,-30545735,-169147789,-986313868,-167562434,1946225479,-351948796,-452475155,17122758,-2116514899,370147299,-402426849,-1977159884,-957874106,-389485584,74710426,-672463952,521543250,48367303,378332671,113705735,174588677,-1047858549,-2013142656,520872974,-549132258,-1073063393,54265972,95421556,45141227,922644457,199689868,-383874762,110048779,-1003090971,100725534,922695251,719850469,378091008,-1942617869,906032414,199689870,-383874250,-1892236533,906749190,15926927,-184119498,922695168,1371737061,-754667182,64589034,1524207306,1041025,-1561803943,3926271,-2144990862,1963000189,-402280441,-1997799484,-386841368,1150013732,244004356,1284049899,-5314556,-388636183,250150773,651981312,97664,652792692,383314929,-351368929,-42997749,243992240,1435306987,-1021377021,451419926,102265597,-44570537,326246238,-1979318746,76027975,-1961300349,-1330254906,-1331959036,-2013598970,-397323303,521600615,1911053145,1943635965,-351883058,1912814824,-352210940,-400615690,520551705,1173810034,108298267,-768360397,-922872085,-922873988,-2020467076,323290065,-350923501,-779644413,-1994111607,1911039573,106203600,-1645542263,64063378,1427317829,1021700902,-1341884927,1924197121,-2116449522,1962924259,-351948794,1375529968,-60692400,-177055398,859751478,169809411,638940370,-670341248,189728806,88458790,-385896447,-1293160695,-1977169613,367528783,72124880,-561188629,54271766,-397259145,1935342717,-351883260,1929526452,637549618,1947944330,1962281490,-351424508,1954588906,1434986067,852355867,1954588900,2110006792,1703552540,-808523771,1418317963,652667654,-2145696266,-1004130700,1240145021,-922826498,678822716,69992884,62129780,343263486,-491853744,-401509800,-527771407,41287600,-907296514,-1544879696,-85260880,1448104529,-1595358326,-402099486,-1004082945,1593315966,1918458456,1173825251,1950351364,-20381993,-972589880,201418502,113640939,-1207762585,1705181206,-1547685119,1923219816,1997441281,1930856705,1966508289,-1960901119,-1157163273,-1175977627,2007054041,513272577,-118991277,1979661521,1482184711,-1897197648,38047583,240945499,478053158,1393391103,113653335,-401210683,1533008934,520549771,2089010062,74776604,1983686,-1189165437,-1431568320,-85934070,37532651,28312690,521583851,1945849064,-351883260,1975519987,1300964883,1435182617,-826349545,-1996206967,-722794924,424511782,391481638,459636774,921693119,200087177,-283210698,1049179659,-1942615055,-401870074,41155247,712293867,891194934,410517251,-15042561,2013208183,376962844,906721279,49231615,-248068810,-593565685,-2096663976,95423684,976670443,1946349318,214205191,-253029968,-248068810,911235083,48367303,-1942559233,906168086,50661063,-941094296,919368411,53688005,189237336,-1894365297,1200561223,440897310,-971487345,906036548,200095429,920404968,53688005,-958068794,369165636,-385896417,-1008079647,-105584430,74712691,-1695874384,911340171,15271678,-502872266,-387645438,911858704,46468744,313525363,-1909006101,-1979501282,-991425681,906851549,20920063,387877686,10545411,-213990346,-979356160,-1607030270,-1180040465,-1101856757,371065529,530903839,20947254,-257870165,-1590252798,917177074,-1425860703,-1442101366,-1424603253,-1424472181,-1424210037,-1424078965,571742,540846764,24509152,-2131688625,259268668,-1180029264,-1431568381,-85974980,844038517,334080704,918894290,-695533325,-504867262,91447027,166269616,222596050,185560260,-1947109184,344593244,-988379082,-1992929278,906162222,49415820,1490713576,53151431,-1276575745,-648877863,16723433,33890304,1090584576,-620756734,-385817790,889192894,0,1702063689,1142977650,1227117391,1919251310,1883316340,1667853424,1869182049,1850287214,1953654131,1852397344,1937207140,1635013408,1886745714,1768169508,1763732339,1919164526,543520361,168639096,1936028240,1851859059,1701519481,1752637561,1914728037,2036621669,168633376,1344539149,1919381362,1948282209,1646292847,1948280681,1768300655,1852383348,1835363616,7959151,544501582,1970237029,1679845479,543912809,1667330163,1868963941,1668489330,1852138866,1668834592,1735287144,1631780965,1953459822,1852401184,1767317604,2003788910,1953702003,1970565729,1768300656,7562604,1130117697,1095585103,1127105614,1124093263,1347636559,4014917,1213481296,1230438461,808464718,1313423918,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1543503872,1734894456,606348334,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],5,[0,0,0,0,-402091844,434635907,444164,-1274906111,-1574843088,-857210270,1465432067,-972921949,164102,-1677643032,72935504,695442776,40451712,1007777024,-402295544,13435103,131072,33554688,589888,84017504,1879293184,2097216512,58178,0,0,0,0,0,0,0,0,0,-385875968,1861,0,0,0,0,106758144,66011,16777218,4194816,23068681,-1124072190,-67080189,-482157569,16777216,29688234,17957317,17957138,33227004,17957410,40043099,38077027,17957138,16515346,16253801,17957138,51118860,17957138,16515346,16253193,34734354,117571586,33554691,3211776,285739547,1879293184,-16713728,50331647,1313429248,1398230852,28332032,-352305218,844125728,1443556288,-352210864,-1336912380,6929922,-1101657109,82509909,1556054,1465012560,1392909909,8757806,-2128689874,-989746688,302105857,692024653,-83821568,302129665,1661098753,1073807359,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,16777218,66122,14893787,12648387,15794175,-1056964861,12648195,16580352,15793983,-65536,-65344,16777215,-251658496,-64768,-251723584,0,218042112,-62979265,-251723776,-1006697728,50381055,-1,50393343,49407,50396223,-1,16580607,-61696,61695,-253,15794175,15793920,0,806158095,16531395,12599040,-3932413,50331840,-251658241,-16580608,1056964800,251658492,-1,255,-49408,0,-253,240,61695,251658240,817889535,0,0,0,0,0,0,0,0,15794175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1123728819,0,0,0,1073750221,-1009152,60747789,43582786,201786690,88211683,65793,-254,-1,-1,-1,21626880,1346,0,0,0,0,0,0,0,13312461,0,0,538976256,538976288,538976288,0,538976256,538976288,538976288,0,0,1230441728,1464812622,852051,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,753129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,855641319,16711680,23594496,256,216465408,1067910475,101642310,80157184,88212005,186403584,743376194,16777472,1018167296,42730818,-230292158,1951136896,788475397,503712683,1381390165,777016145,196417164,-1289320146,375066123,1958951768,-1126986235,-4521600,-850873089,1509654817,-1267699200,1914817864,920126314,157752969,5892993,-1323398858,-1262449141,237096265,7727135,196548155,968506484,1023457289,1064444365,-1061496693,1891795216,-1194773714,567099904,-1878700359,196157070,567099316,-851528624,-108963551,393545038,905984744,196548155,-969536139,602630,-1356923082,907209483,196294341,525511,-1659472641,1150262521,378418710,-1959916619,1477161766,1582979419,119496031,-1909580081,-1190416098,865076558,73853430,1024007610,410255362,1946158397,144685587,1946159165,144030219,1946159933,143178243,-1259856114,-1944851709,-1127117111,567083392,1303694962,-1557257779,99158380,-930284799,229955726,116859341,-63181,-315415179,158795462,1996932608,1048772618,1946159475,1929824006,-2130706679,617278,166265717,-389285631,1908015604,56485896,-854851144,1012868129,1008170062,-1897171623,-1274465530,-954086071,602886,1845937664,-219676407,-1163138302,521013487,-2147275032,619070,1048776564,1962936691,150321672,-352118040,151763710,-2147282200,619070,382015093,565709739,773967141,772353185,-1207953757,567102464,113712910,2419,196937358,567101876,153755275,567103668,-2146866015,617278,-1070398859,158009030,640614145,110046729,-1892808410,1476995078,-2134964466,4241664,1370793459,-1993465395,-1274467810,-842298288,113716769,8456563,1795606062,-2144468727,617278,-4509580,-850873089,1895530785,-385649917,1219821385,-143515187,1795606062,-1557266423,-670889027,1730054446,1357611273,512306691,-930346653,-2135109490,-388461055,-315424589,-2013265992,1024029958,74776575,567094964,158547587,-385649153,-840368347,-28710910,196548155,-1427633803,1763064578,-971017207,17379846,-402502168,373030447,158665655,990023912,1946773782,41936901,12118507,-2011050697,-2146713834,91566074,197134022,839304796,-1178730487,748601099,157484686,571900,1738647027,172809,157363967,-889191960,1975519824,-853953530,1405156897,298702986,-1060060976,41222948,-1057046274,1985730618,-339736060,1488990978,125123,-1948568629,-1962316018,973084694,-1274514230,-2011050690,1124079630,141880890,567099060,1650312,-1190870141,1051983887,-498916915,1394525177,-850283440,-1579446751,-1557266408,446695728,-1545565696,1532493848,519815967,1347507974,1150016910,646458884,118360079,-1190676545,-964493304,1487205130,-402170023,521076672,19327058,-1572797350,-990509140,-167086976,-2146955514,-1192688779,127122944,1946273014,127385091,127837101,127968173,16770945,1980563331,835331,154025609,-1114904623,-91814169,-1174346008,-521664613,252114432,158629896,-1274564678,-350106359,128301586,-2147431704,602686,2062026100,-1166873856,-1192753159,201439232,-1377295923,-1272968192,1953053696,1019543107,-29526926,1969306820,-2033044514,168458006,-2096270126,619326,113706612,-63117,154025603,-2096663552,34156094,113644149,-2097149577,619326,113706612,-63117,-678706038,520100072,135314127,-1174382872,1357383589,-352145408,1894635,519956457,1370771539,815866317,-1545892343,1532493848,-1128611041,-50665208,-1610076742,1474824549,-386959874,1035599903,1698594824,57999369,-402111046,1387921423,649224,-854849608,-1380269279,1381191687,-1393390762,1014965328,1008038448,739342137,-523134928,50790843,-401110056,116129759,45404298,-1470619187,1591243904,-1017619622,154778181,-851640136,1024488225,108331012,-385294406,-2014774140,-1947866113,281066200,12110131,1914817858,868137232,1662946846,16824841,567099316,1052023839,1922900429,-1090944762,-1162316749,1458047008,514976767,157490830,-1191116610,-772003322,-1378733079,-69021693,-1631927521,623032323,-1715854899,623097858,-491118131,623163396,365109709,705110535,1057436423,1376207623,1644647943,2047308295,-1895332601,-1039684345,-905497849,-603466233,-402136825,-217584377,1769101063,1881171316,1702129522,1631777891,1853169764,1867445353,1701978228,1123640417,1663067233,1634561391,1151362158,1122071649,1663067233,543976545,1836216166,1700000865,1867443045,1329868142,1768169555,1699998579,1919906915,1953459744,1970234912,1867441262,1885433888,1918366309,543519849,1819631974,1634030324,1634082916,1156869237,1928033129,2003067237,544500082,1920415077,1852404841,1919164647,543520361,545918273,1769366884,2123107,0,218103808,1126179850,1095585103,1629537358,1668246636,1869182049,1713414254,-1603965847,1919906418,1851868064,-1602982034,1919905125,1633820921,1239966580,1919251310,1868710388,539784306,1920230738,1226845305,1919905383,10501989,1818838576,1635005285,543517794,-1402707614,1986939184,1684630625,1329802801,825831501,1297040174,1936286752,1852383339,1769104544,1092642166,1717920928,1953264993,1769104416,1630594422,1931502702,1802072692,1851859045,1701519481,1752637561,1914728037,2036621669,1700016304,1852403058,946173025,1651468832,794372128,-1606473394,1128618053,1767990816,1701999980,1765098928,1480925294,1353724997,1919381362,1948282209,1646292847,1948280681,1768300655,1852383348,-1338544864,1684095536,544370464,1936943469,543649385,1835888451,543452769,1702129225,1701998706,821192052,1713401678,879060338,1684955496,821257580,1697855309,1815490741,828662127,2037588012,1835365491,1818322976,820274548,1635021622,741438578,1769497888,1735289204,1919890096,1835101748,45157,0,1346,0,0,1547321600,1296912195,776228417,5066563,0,0,0,0,0,0,-1342100480,316,25947712,16842752,65537,16776960,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16711680,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,623852127,1162889552,606350897,979304484,1229989167,775046480,2368548,185207548,8390144,6030658,7079234,1346,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-16777216,58123,1749001984,503661057,1107595661,788925189,1107460956,1107584005,5,0,168116813,0,0,0],6,[1213481296,1329791037,1162892109,977354051,1297040220,1145979213,1297040174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33951309,13108480,-1593066077,512491522,1213481296,1329791037,1162892109,977354051,1297040220,1145979213,1297040174,-65536,-234484134,-1930898631,-1547566118,12061468,1073750221,-1009152,42790925,43582786,81921346,88212802,65793,-254,-1,-1,-1,21366283,1346,0,0,0,0,0,0,0,13312461,0,0,538976256,538976288,538976288,0,538976256,538976288,538976288,0,0,1230441728,1464812622,852051,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,114409,53,1936607488,544502373,609439556,1702063689,1092646002,1768714352,1769234787,1227124335,1919251310,1767317620,2003788910,1951604851,1970565729,1679828080,543912809,1679847017,1702259058,221935648,1701990410,1629516659,1797290350,1998616933,544105832,1684104562,220471417,604638474,1735357008,544039282,544173940,543648098,1713401716,1763734633,1701650542,2037542765,1953451520,1869505824,543713141,1802725732,1634759456,1713399139,1931506287,1701147235,2019893358,1851877475,1124099431,1869508193,1768300660,1461740654,1868852841,1931506551,1953653108,1713401973,1936026729,1547321600,1296912195,776228417,5066563,1397575491,1027818832,1413566464,1459633480,808537673,1229073968,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1751349340,606350951,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,143703040,-402357272,113706009,41550080,567095476,-402496862,1488454604,40084311,42010310,20113408,1491619996,1939691524,1765703721,292880386,91555900,-855580696,29081120,-855581976,1963473952,54847493,-974600725,14870529,113688043,-2147417495,164158,-1763114123,41281536,184712865,-1106283328,-1930952704,43640834,-402652226,-2118516093,19851266,37560947,-1173654272,-2118254316,10872834,138275051,-2146667264,50487870,-337115789,-103290110,8390343,-2086925056,163390,113116788,38135808,-402230371,1374224472,45869311,-1962931778,855827398,-2147027264,58003458,-402512152,1369178734,-402500632,-1655110757,1203242610,-14030505,-1849817373,2484225,-1157686295,1102316120,-474078771,17950726,1001707147,1303650765,1286873549,138158541,1891500917,-1073042431,-796260236,567083700,229831659,-1308622104,-855460854,666551073,-1576760575,162791757,1052385741,-855002111,201898017,1807360461,-855002111,385663777,40083719,-1107231069,230228475,1765703680,242483202,-1962801474,-17922,-1359822797,-2134912521,-1967115520,96535045,2116878339,671251968,-1967115515,-134002939,-1951789648,1048619713,1962934889,-853953524,-1270807519,-377246918,-1163595006,-661913082,113754254,8389228,40771212,40896199,512491612,113705586,7078516,41295500,-1090485826,28835932,-1088303831,28835948,-1155412695,119407210,-1996477279,106044935,2877523,1763523,-1073042346,1555168117,1963735118,313083,-851725222,-1962112991,113165298,-2146137598,246694378,1438851533,-326898549,-973332908,118884470,-1951498611,792505567,1547438196,977011828,-544537739,-1073042877,1586097013,139904428,-402366780,1601372264,74711612,1450509116,1963023336,142525521,973175936,431229300,1090789837,-1398064460,1950039210,1975519749,1555058422,-29018074,642711925,520045960,-1960896938,-1431524234,-92946422,-1006086459,434635870,1931435520,1946303502,1963146244,3964933,536457077,-1034033781,519569416,378285653,-1993473787,-1207892186,567102208,85364270,646655489,526188807,-1960966461,-1962771426,-850873141,-2017423839,-1912440314,871773144,-773729793,-52309535,119514611,914955971,512623224,-13237638,520255518,252006595,-754667264,-1260876824,1914817864,868257300,-1547684865,109838949,-1414856089,-1949158568,244040698,65208935,-1962932504,-486376946,-1262383610,-1021194935,-486525720,-1041752535,39369470,1018480947,376578509,382064779,-91553179,-2097001077,1085539521,1051992525,-1323359795,1488634625,-851332094,-993789663,-1946000066,637854657,-1023259253,-1191056193,736624648,235238400,31309343,76275596,21865006,-695476338,-851246920,1931415073,17414664,-335707160,-171981845,375041,-1910110442,855649310,-212381194,1952014246,-1073042420,1015085941,200176896,519881673,33996551,567089588,-1196801788,-1951704006,-1261292553,-1105081017,-474021370,178957318,-1325763136,-29083556,-2008153739,-24379580,-1409156162,1975519914,96729338,78710943,-661919533,1253312278,-4513331,-850873089,507194913,158531843,-402636056,-1226179368,1048653564,555745409,724447861,771818270,8521414,784347936,738231200,1997093936,113651223,-1323302781,199283468,-1207732800,-1019542528,-668268941,567101620,507843,79629803,-2143387648,57933824,516145203,-1615278452,-754667256,-1896872984,868234206,1279033846,-2129693361,1330053756,-1207039883,508561278,-1021326505,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-268370203,64287363,4194304,-268373645,262208,0,101580804,1687,110559743,13365762,101582718,46597646,1330073420,855687401,-1597993280,-1574567911,413139984,-888091392,5270787,94373280,1073741824,236959744,1919117645,1718580079,1767317620,2003788910,253821043,1936876886,544108393,825241137,1125582848,1920561263,1952999273,694364192,1667845408,1869836146,1126200422,1869640303,1769234802,539782767,892877105,1092624430,1377856620,1952999273,1699881075,1987208563,3040357,1766660109,1936683619,544499311,1629516649,1734701600,1702130537,543450482,1684107892,1918987621,1718558827,1667845408,1869836146,1126200422,779121263,-67108864,-1912534808,-402643962,-890765127,437684992,1139441664,2102827,2102827,1049350659,1122500636,473860864,507380480,2269440,-133961519,6154319,-52202166,-1979701570,3932484,115869044,-1191908608,-53805030,869305261,-1258310693,-1408185086,108314634,281874100,-54266389,-1093520814,-288292828,1707659,-1960384047,-775649787,-1966550584,-1058635532,171959424,-2032760094,-421352508,1524462926,844299715,2408146,244051665,-372178918,-2046457050,-775892540,-2131719488,-64748570,-695549430,-492059514,-562737433,-1094452134,313524743,1713910,1040447627,314245152,-1340019968,438760978,438209280,1139507200,512475907,-338624478,-125058301,2113067,-1593830725,1127022618,4438272,-218086471,1274545060,-1262226571,-1575957233,-1070399464,-1608073074,430048272,-1462700544,-167217872,653206736,-1207693150,281870342,-1223688008,-1206858495,28774401,12783821,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-12648448,192,-1006682368,49407,-50393344,50331648,-251658241,0,-49408,49407,-15794176,240,-15794176,252,-256,-3841,-1,-251707408,0,-3932161,-16777024,-1,-16580416,-50331649,0,0,0,-253,192,-1,49407,-1,-16,-251658241,16580415,-16580608,-1056979969,-49408,-1,-64768,-1056964609,-61696,-12648256,1057014015,-50331649,-12648448,-1,-16776961,-251658241,-1,1072758783,65535,-61696,62980035,64767,-251719936,12648195,15793935,0,0,-65536,16777215,16580355,-15794176,-251723536,0,16715520,-12648448,49407,-1006633153,-12599041,0,67059456,49407,-16515841,192,-62980096,16580352,1057029903,255,-12648448,15793920,0,65295,-49408,-16776976,-3932161,15794112,0,-3932413,1056964800,252,0,0,65535,-251723776,0,-1057029376,61695,251658240,255,-50331841,-64768,-1006648321,49407,0,-1056979969,-50397184,64575,0,1069612803,64767,12648192,0,-4129024,240,-15794176,1056964608,16777212,-786673,-3932221,192,0,12648195,15793935,0,0,-15794176,50397183,49407,0,-3841,15794175,16715520,-62980096,1069612863,-1006648321,-1056979969,0,50331648,-1,-16129,49407,-49408,-65296,-16518913,192,-16777216,-16,61695,65295,268189440,-3841,-3932413,12648387,0,-16580608,-50331649,0,0,0,-65536,-1057029121,0,-251723776,-1,251658480,255,-16516033,66912255,-1056979969,49407,0,-64768,16777215,64575,0,12648195,-12648448,12648384,0,-4129024,240,-15794176,1056964608,-65284,-16518913,-4128829,240,-16580608,12648387,12648255,0,0,-1057029376,-1057029376,61695,50331648,-251674369,0,16715520,-62930881,-49408,-1006697536,-12599041,0,67059456,50381055,-16518913,192,-62980096,15793923,1069612815,255,-12648448,15793920,0,261903,16531212,16776975,-3932413,-50396224,251658240,-16518913,-16777024,252,0,50331648,-1,-16531201,252,15793935,61695,251658240,-1020261121,50396223,50396415,-1056979969,-49408,-1,-1057029376,-62980096,-61696,-12648256,1056964863,-50331649,-12648448,-1,-16776961,240,-15794176,1057174284,-16776964,-16580368,12648387,-256,12648447,12648195,16531200,0,0,-16580608,12648447,-65536,-1056964609,-251723776,0,67047168,-62977024,-1069613056,-1006697728,49407,-50393344,50331648],7,[49407,64575,-49408,49407,-15794176,240,-15794176,252,15793920,0,1057029903,192,0,0,0,0,0,0,0,-251658496,0,0,0,0,0,0,0,0,12648255,1056964608,-1056979969,-16580608,15794175,-64768,65535,-15794176,-1,0,16777215,50331648,-251658241,-16777216,-251658241,-1,1072758783,61695,-65536,12648387,-253,15794175,-253,64767,-253,-50331649,-15794176,15794175,-64768,-251658241,-65536,-983041,-1,-12586753,252,-1006633213,-16727809,50393343,62980095,-1,1057014015,61695,-1056964864,-49408,65535,15794175,-1056964861,-256,-3841,-1,-49168,251658240,-3932161,-251719744,50331648,-16515841,-16777024,-64528,-1,16580607,-4128769,-15744769,240,16580355,61695,251658240,255,-1056964801,-12648448,-1056979969,64575,251658240,-1057029121,-62980096,65295,0,-16711921,-15793924,16531200,0,-16711921,240,-15794176,1056964608,15794175,-256,-4128829,240,-16580608,12648387,1073495808,16777215,-61696,-12599041,192,61695,50331648,-251674369,0,16715520,-62980096,50396415,-1006636033,-1056979969,0,50331648,49407,-264244993,0,-16777216,-49216,-16580368,192,-16777216,-16,61695,65295,1073495808,-15793921,-3932221,12648387,0,-16580608,-1,15794112,0,-251723776,-253,-1057029184,0,-251723776,-1,251658480,255,-15729601,67059648,-1006648321,49407,0,-64768,16777215,61695,0,15793920,-50331889,12648195,0,-983296,-251658241,-15794176,1056964608,-251722756,-16515841,-3932221,192,0,-253,1057029375,240,0,49407,67108611,49407,0,-3841,15794175,16715520,-62980096,-256,-1006697488,-251674369,0,50331648,-16727809,-12648193,65535,-241,192,-4129009,240,-16580608,15794112,0,65295,16531200,-1056964801,-3932413,16531392,0,-16515313,-15793984,16715712,0,67047168,50393343,-62930689,0,16715520,61695,251658240,817889535,251722815,50397183,-1056979969,15793935,-16580608,-1057029124,-251723776,-253,-1,-16515841,-12648196,-251719744,50331648,-16712449,240,-15794176,1057177356,-16580356,-16580356,12648387,15794175,-1056964861,12648195,16580352,15793983,-65536,-65344,16777215,-251658496,-64768,-251723584,0,218042112,-62979265,-251723776,-1006697728,50381055,-1,50393343,49407,50396223,-1,16580607,-61696,61695,-253,15794175,15793920,0,806158095,16531395,12599040,-3932413,50331840,-251658241,-16580608,1056964800,251658492,-1,255,-49408,0,-253,240,61695,251658240,817889535,0,0,0,0,0,0,0,0,15794175,0,0,0,0,0,0,0,0,-397904802,-370671397,-399054080,1014235364,-1403593933,259263804,-143311556,1015071742,-17795827,1592585159,108317694,-383202630,-397150506,-27590596,-401574705,-1595408190,222080000,-471333516,-1007228160,748691086,186392206,1015084595,-1947175936,309455062,-1392814360,-76169206,2092887275,-1107039448,508962945,1912612328,-386430192,-142147429,721479912,-216070450,-1017241692,-349668162,679591427,1912604136,-1870992589,3008764,748684942,470191654,1375679243,-391358634,642187375,1979663674,1609818626,208951646,5630033,1031808601,-102730496,-1962467645,1088968702,1459940096,1493188328,-108529365,222068931,-391378060,1072169015,1966947328,-2134981648,-1073042432,-1394080396,-1022542596,748684942,470191654,-385928437,-2144993269,-143327171,-348278589,-1178586622,-1359871744,1918975171,2004499462,-1021301758,988304209,-2082895104,-80018709,1364207730,-193009581,46367579,-338492239,-850742205,-1912169439,-399728634,-1660423053,108222553,-383383878,648738214,1479,113465691,1220578384,-1591295858,78708739,-930357037,-1262287016,69324057,139389249,-402650648,-960234965,23558,6035082,1074053770,108347452,749733378,-1102003970,1202990424,91431373,-2132205810,760594418,-1269246069,-1516197062,216640044,109970961,-1591333728,-1557788372,-2144993258,619070,-987362699,-1207194858,567092513,109983239,1236544674,12067277,-400437940,45677850,1914817853,-1193768176,567100416,1971372790,-851528691,682080801,-351225368,-164458455,-1207711104,567100417,244051,1052039987,-498916915,1169447929,1169433037,1169433037,1051992525,-1909055027,506241054,-1560274783,-692582033,-1144303613,12058625,-165556924,880050370,1947255542,891926575,-1064558131,1996525629,856405027,-1273967141,-1978610417,-1228210476,-1950338279,-1274562616,856739078,-1275021358,-1022309118,-1406549826,-315438966,-1968437580,-501101104,-1281244167,-1190786260,653048364,-2118240907,-84547584,125046076,977120582,-385649395,1273560774,-1224280324,108331565,567098292,-2098636941,1304825,968099445,1232282061,-383256902,-2084899806,-1090983127,-1192755071,1947024634,749969905,750323211,1965485242,-66262814,766969590,-555171070,-1274644993,1931595066,672381460,-1158418967,-1645730099,201439247,-1863835187,213894136,79858220,1967144000,-1341783546,-1430192596,749020810,111884976,-1258845409,1914817863,-1021374974,-1409283911,24387644,-1392975190,309600316,783343754,-1429961046,1017905841,-1442614240,-1070401310,113689514,-2130704009,619326,-955877889,-16157946,-311105025,167657088,-1169197825,236858709,-853887969,-4579551,-2146257911,654910,297011060,167642822,169987328,515864000,-1105261049,2042572117,1049175561,78383612,1950366784,1048585739,1946159480,-1422216189,654276072,234833350,118365958,167517835,1946173312,-1393325175,-76214980,-1581328757,730578697,1017956659,-1978108635,973732646,1175483684,-1393325226,74714428,-135550399,-1427903650,1963801665,-2009708067,-1993635314,-167117802,-16159226,326377230,-12204506,730577444,638488040,234833350,-370213399,-1910575363,-1171480546,1048651993,-16774797,113706613,-63117,-224073441,855671230,-1610182967,158973740,-1574518734,-2044327560,168392454,650868160,167526025,-33110490,485031689,624733689,-2010747531,-401999066,222099727,1034757236,91508297,1970170173,-117577642,1965571244,-118101938,125118780,748691086,-1392592919,1114901820,510929212,1948925098,1967078404,113649158,-402585090,-478807849,-12204506,-121247731,230218219,2105550336,41225727,-391397325,1034811571,91508548,1970234429,-123344827,1047792956,-1408654913,1963801770,117319418,-2094659209,-16157890,-953809035,619270,1048585983,1963002366,-1088485865,2042497535,24936457,-33262278,-1207339002,567093504,-893757245,-239277784,749668038,8502784,1022907112,-1947503603,703447022,-175439691,-481882742,1963125555,-1977177072,-1002813659,-864025228,-490456544,-117202962,1195842955,-1394903650,-1166799556,1979196136,-132781871,385278975,-1192547153,-1396100266,-1586229956,1962412776,-202686205,125058364,-1854665412,-1393169492,-1988805316,1022880488,1602384909,343189235,234847360,1017953396,-390630387,-160040997,418119600,-137238356,-1070404235,1438584555,687978541,263463373,567138187,749668086,-167611137,1958742736,-352524029,-1946705176,-2115403314,-2146555904,-2146530816,-1978759168,730578731,229680371,-316413526,-617477449,1947024556,-142481244,808193140,-403258490,-1014578430,-1910576405,-1976786914,520711206,-482688974,-922835341,512664299,866200736,-22263,-1064422540,-919349106,-108281461,-1951468983,-1186576649,-1510801399,1962884483,-952792296,922746629,748691086,1963801772,3965179,-1993997452,512672565,116862112,-63181,-768347276,154474121,154605193,-1090486552,196673629,-232738816,1090614702,-150214269,243873497,-1813500587,1949973750,-158537695,125110844,1022789096,-149720006,-16174330,-387287553,521011261,-383207238,1572859934,244004352,-397333163,207222370,87696928,132842101,975577132,1204843781,1273555170,1998601462,1947024582,-163518457,-109769412,787888616,785456779,567099060,512630467,-768407245,-851640136,521499169,785490742,378263691,243992885,12060983,-1021194942,126540427,-115392468,9496771,512627314,108342432,158205638,113689345,-1023407762,1006665888,-1173786110,1323827330,-197269237,748691086,158211722,1589255950,-383194327,1474883450,855750656,91556978,567083442,-841862461,243974945,-922091392,-1070407307,-628481587,-399947334,1153043222,1977289257,691976707,-401929751,28835874,1963618862,-1021195005,567134462,-2146530621,1976109568,-850086738,-1160213983,-873780909,-1409262146,1866211340,229448565,1849434144,-58718603,-1022462688,1969645117,540847112,-1057094795,675986115,503759865,-1064384372,113760398,852097,730400454,-1979267200,-401800917,-1712848890,-888725760,-402619970,222098799,767244660,17492015,110117867,-1090056617,716451014,-1952964147,65458672,13009392,-1176925401,-1527578621,-1951784784,-1295348797,-2030897564,766743236,-1174331671,1340614436,-3676150,-1155058246,-1326960851,1916171264,-1019565003,-952499084,-706204555,-1188597248,1015023468,-1341426675,-1947928988,12773576,-997583758,-939327308,1963801772,-852773879,1975519777,364561153,168093735,-2118207765,-187045888,309595452,-398837061,518717556,-852708208,-382029023,1471807656,165734439,872410856,661174985,-398837061,1718878271,-896846990,1017958963,975336461,-1289325117,6219822,-192274574,1947024556,1975728656,5171220,-729149582,1963801772,-852642808,1958742561,659077681,-351693336,159574198,-1984296268,-400437973,-1950420365,222068779,501748852,-1978699264,-1019564812,-75493772,1308915002,985858226,-92931641,-1979710488,283689940,-1964019200,649440,181732466,17621130,738495171,1022980656,-193792758,106414918,-960559346,-1211790804,2746384,-1968520310,2222273,-1968520310,1697990,1966799744,-1439780861,216580746,-1430244608,-399718726,1594296591,-2046110525,808455620,41234492,12044074,1351795627,1476970216,1377747858,777081680,748691086,175586944,-402230016,719847433,1482381568,-2134696102,665150,649729908,1023457290,-608558643,-1962184155,-2030063400,413276231,521061120,-2131957271,675646,1048589940,1946159694,172997143,-851639880,856519201,-1949748270,1107474648,283845069,856313786,-851659575,639744545,-661927822,1200029616,1679896,272531651,225771310,784545419,772880009,772802246,-1947388929,-1288781002,779075371,-167209240,594837703,1963050998,32303344,-1074614296,12070105,-1155412695,-625070695,356420396,109766702,-402486295,-1070398536,-1557349470,-1130222401,288787244,-1019836114,46196782,-1947663500,38856961,-1180450765,749904428,-1573991262,-878563640,751084334,-1573992030,279063729,779068206,-1557284701,-1734136296,760587053,1210914211,-1574125150,-1281217009,8502829,-315413581,-399609921,1198655495,1954596854,-871971323,-940179154],8,[151680001,153925422,-349390546,-2134378787,117310581,-1588187982,1874734803,-1077531858,-956093000,-2010270301,1093514254,1049142515,113716663,11447,-1599083682,-1314771252,-790573012,784704224,-1607892038,-1073075022,37487732,-1813445770,766754283,544538940,70037664,-969231295,-1090387642,-945082952,2930438,71747072,4638210,110159872,33652352,1048581493,1966747065,72253454,767213314,18118,-1962510872,1031799422,-1173064448,2105550818,-1435157762,33572550,100945536,-1173988888,-1180621076,-2147467988,279549044,-1273728000,505531732,748691086,1973675058,28843785,857853230,8503021,1874799539,118614062,1963050998,-1221719563,147191596,-2146667264,2928958,113640820,1443114699,-1104227423,-970248593,53352639,773170119,773066376,-2002455743,1580078910,552125835,-406853628,-402384152,-1679228835,34793472,751056523,1978203955,646298351,-385454616,1048634526,1962945713,773372507,-402234648,-608506046,61860133,785621334,724463550,773373894,363054851,336496686,-1527561938,773275272,-389706914,1726481351,63039719,749813376,856388864,750494400,-1574125661,914959548,213855939,773045548,-1962631448,-1020390090,785137280,-352160512,-1947389056,-1288781002,779075371,-167363864,-344686393,1963050998,-7280400,-1207935809,567093504,-2144462687,41171708,1076641968,-1275044702,8972305,-264836964,-385649507,-1070399660,750847622,192200714,-1090515783,1438526872,849670957,784835264,773144203,-399681858,1048639006,1962945713,386332167,158597678,-399632198,1894253963,5368046,749813376,-401967872,91357452,750454470,-1321304064,225706028,-167655704,-13758458,-320273548,846076,113641333,-352310084,-12260954,116789940,1963077143,-1008465405,-1172655024,567094613,6077016,-1073077811,-1358510397,414842924,1023457326,-260955699,512350347,12070508,-1994273449,-1993421546,-1204891890,567100416,-2004819328,1949199894,-935428083,108265518,-383182918,512426573,244002412,378219709,-903140161,1088949877,-901873663,1702166574,750587531,-1575055842,-851463124,1433542433,1373882507,778976896,-2146994944,3066686,-779412620,750730891,-1912202576,-231955962,91555758,749668094,-1949226175,-1089600566,-1089566420,-1123140820,-401837524,1048576235,1962946250,-2138051824,3042878,1048577908,1946168495,1813941121,-851528658,1048625953,1962945724,750231800,1946284776,-1088517322,-1122092244,-402033364,41156770,-617364487,-1575055842,436717356,117382912,113650879,-1610600761,-466473271,750716419,20776306,-396135424,-730529674,784940672,-1957202944,-1959916514,-1959866610,-2144416490,3065150,750006644,-506453555,-506338864,-506338863,-838144304,-852839343,-1125547743,-773224953,-790179615,-790179610,-2132356890,-703987499,-1202063990,567105281,567099060,751044351,750520062,512476152,-420991476,767081215,567099828,751044295,-387252224,1345106336,1476396776,749798970,-905525565,1048576046,1946168507,8448259,-402572056,376767238,778976896,-2146470656,2928958,1948661690,-955857317,28836142,-952205251,74776622,-919389004,-852641606,639744545,212024946,-1157183954,-661978836,-851181384,236357665,-2134706642,-1214238092,1963729964,785096713,784860682,544872564,477366440,843317688,550142198,772675208,216736205,113669611,-2147209525,70173966,784809600,-400722688,410321538,778976896,-1173261056,-135780773,-1090074878,-33554388,-1020343802,772546187,243779891,-203215681,784926462,784809600,861238528,512630482,1085549730,-1172364851,527574508,-747321301,772671222,-166431616,539889158,1048578677,1962946245,1014253887,-399924550,117310114,1048587452,1946168507,203328276,-851528658,767080993,567099828,750454470,-66983680,-779627981,-851312200,-1354858463,74711084,567099572,2047616195,136597520,1479461026,-878574556,-989460434,785096750,-2134654966,-13782210,213847157,766754092,-402599192,-1070404432,772736646,58048522,-1962901527,-1087523530,12070165,-1591620311,-58708552,-1342016454,-888239552,-1572852690,-1214239467,388401709,33695022,326418442,259376186,785137280,-33000448,841879558,872868800,-792452606,-872019224,749838894,-523181872,-2144418398,3065918,-878566283,1976109614,1958742557,-1089565927,-1340873940,-13433318,748816014,1963437810,1049186053,1455107263,-1321304019,57933868,-1104307781,1049308438,146353589,1060940800,126485109,24387644,-236829782,1015022513,-1340967904,1017948718,-1979550401,1948269575,-498882047,-1430244623,71759555,-1960676094,96633813,-851640136,-1961463263,1140898008,1051992525,-1024056883,-163482240,1946420294,89557819,1950023296,-2143243774,-1729609494,-2083157007,2122974658,115834884,1963392896,41323286,989756544,1187382901,99287552,16795334,-2141263026,91554559,18118,-851725117,-400133599,-91495090,-930365389,1336865353,-970152544,973209670,91553605,4638378,72253441,3991558,4638403,75401728,1946470390,4638451,41323266,1946172544,775716896,2088770420,91503358,16795334,-2032455090,-851725284,1914471969,-453711868,-366220861,-2147320183,-1207172794,146353727,-2035617024,-997807420,-1426914383,-1012219854,415125585,767082286,749735562,2088823178,91568641,-1975440211,25002184,-1979157190,742868741,988318273,-400525847,460587040,-1946205045,575733581,259348673,74788412,132899850,1966012800,1491929602,1973863257,-8617810,-341281792,1364336373,521031763,-2010331461,-1143764201,-880082943,567099572,1515805528,1397801759,45819056,1343351552,149622192,-349917104,-1070379005,113491,-91531439,117440441,-1359870178,1239021319,-851397559,990474785,1594193345,-1017619623,109977358,-323343200,1048585765,1946159735,113649161,-1174402441,-202823439,-1547684893,-694014253,785883694,1469905034,-391329485,326494855,-160161732,-227276484,785843846,-361447414,-402593047,-1019548193,-813693579,1021045632,-385649395,104464592,58010788,-2147429911,326449724,-1409220888,-1996424472,-970009794,3069190,-1996454423,-970009794,3069190,1978000104,-1331671016,-398392276,984613079,1476449000,785596041,785712838,1965964288,-704184823,-720976338,1060962094,-813694091,1965702146,47153189,1048577972,1946169046,-1342000126,-718919105,-2041417170,-2046172191,9562337,-136126074,-1998003834,-2145749531,-940178225,-1992526590,-13708482,-970009850,-13708026,785778374,6940672,-316282708,1961472744,1947024424,-1543095772,975074348,1008366787,-964266694,-350159036,694663696,-371004951,-13440971,-107126962,787173059,-2130587776,-394264371,1011280243,-387484659,-521666525,1364657900,884934414,375044,125153010,-754974280,1508379616,11536223,-123904086,-29250877,-1020340986,1364678150,12079952,650153712,-115072,-133663491,1599690843,-1195178146,-1064386560,-2128150733,1957319997,8389898,1928331325,652274669,839015818,-773598721,2143519715,-8330367,637535935,843517322,1976110061,-339541244,1190300631,125085427,-947652349,-2132481277,91504444,1965046912,109850351,-1993462351,-114446530,-4482325,-850873089,-850873311,-1202695391,773727522,748691086,-855470406,-1898279903,-1269162046,-1910387371,8436442,567089844,186425638,1526738083,-754722164,136841,-1907697012,378094298,-628228095,268499841,-617414030,-472709967,-762389876,-1070341237,785446736,766588671,-1355350226,-876442067,1631717901,543712116,1701603686,1936289056,1735289203,220465677,1936607498,544502373,1802725732,1953068832,1633820776,543712116,1701603686,1851853325,1919950948,544437093,544829025,544826731,1852139639,1634038304,168655204,1684095524,1836016416,1684955501,544370464,1701603686,1835101728,604638565,1819309380,1952539497,1768300645,1847616876,543518049,1176531567,543517801,544501614,1853189990,604638564,1970499145,1667851878,1953391977,1936286752,1886593131,224748385,1968120842,1718558836,1986946336,1852797545,1953391981,1634759456,168650083,1818838564,1919098981,1769234789,1696624239,1919906418,1176766989,543517801,1852727651,1646294127,1868767333,1684367728,1953394464,1953046639,1718379891,1126435341,1702129263,1864397934,1701060710,1852404851,1869182049,1869357166,1646294131,1919903333,1868767333,168655216,1766203428,1932027244,1868767273,1684367728,539232781,1701603654,539587368,2036473892,544433524,1701147238,1227098637,1818326638,1679844457,1702259058,1701868320,1768319331,1769234787,168652399,1920226084,543517545,1701519457,1752637561,1914728037,2036621669,773860896,606088736,1635151433,543451500,1634886000,1702126957,604638578,1299084627,1968467567,1684363109,1182099540,1632856434,1225395572,1818326638,1679844457,610628705,1920103747,544501349,1702125924,544434464,1158286628,1919251566,2003136032,1952539680,606091877,1850280461,1768710518,1769218148,1126458733,1701999221,1948284014,543518057,606106473,1850018317,544367988,544695662,1701669236,1092886586,2032166258,1931507055,543519349,1311725864,606093097,1229208608,538984018,1112089632,1699749965,1852797810,1126198369,1970302319,544367988,542330692,1936876886,544108393,1867915300,1701672300,544106784,1986622052,539238501,606106473,1935763488,544173600,1700946284,1850287212,1768710518,1768169572,1952671090,226062959,1851073546,1701601889,544175136,1634038371,1679844724,1667592809,2037542772,1227098637,1818326638,1881171049,745043041,1953459744,1919509536,1869898597,221018482,544370442,1701996900,1919906915,1869488249,1835343988,226063472,1967989770,1931506803,1768121712,1327528294,1919885390,1179012896,539232781,1701996868,1919906915,1718558841,1310990368,1632641135,606103668,1213481296,1330794557,1028935757,1635151433,543451500,1986622052,1852383333,1634038560,543712114,1752457584,1227098637,1818326638,1679844457,1667855973,604638565,1700946252,1869488236,1868963956,224685685,2035491850,2019652718,1920099616,168653423,1329990948,1633886290,1953459822,543515168,1953719662,168649829,1953384740,1701671525,1952541028,1768300645,1696621932,1919906418,1920295968,543649385,1701865840,1126435341,1869508193,1868832884,1852400160,544830049,1684104562,1919295603,1629515119,1986356256,224748393,1718559754,604638566,168652399,1163018788,1763724097,1445208179,1179210309,1936269401,1128604704,1763725128,1227104371,1818326638,1881171049,543716449,1713402479,543517801,1701667182,1227098637,1818326638,1847616617,1700949365,1718558834,1918988320,1952804193,225669733,1917133834,544370546,1953067639,543649385,1679847284,1667855973,604638565,532488,844831492,407585866,1343807828,-2092035693,241194513,1276053319,255987467,196960015,1159322148,-112718077,251613454,1330512640,169187924,1330795077,1447382098,371739717,1230521605,367678547,1229194240,167379282,1313165831,21318977,1375997106,-1308537275,1380255244,21320513,1141115965,1023495237,1498678540,-285129392,1163002892,17039437,1347371781,449577305,1430343686,520111443,1094976787,939541844,1230243096,-838843059,1163265048,240582738,1280267780,51234817,-1509866429,1212352018,22169924,1292047014,316211524,1145785606,-654224823,1146225426,101912065,1229213010,319684946,1163018758,-1845474495,1163265815,1497778514,68667136,5522771,1342640143,1347243858,268042324,1413566469,262144072,1230521605,298385492,1414808325,301400409,1212368133,391708751,1414481669,378929231,1229476614,1442862150,1179190038,68505600,5394246,1124340840,1392530252,18,0,0,0,0,0,0],9,[276,0,1,12066574,1,-2011050701,1,856000022,1,855750866,1,1370759629,1,512303565,1,-1014102647,1,-1289829322,1,109848075,1,-1993998288,1,-1275056610,1,-1977496295,1,-854674224,1,93037089,1,-759692111,1,250139392,1,-1547500709,1,-270006905,1,-1962636540,1,1418396252,1,272928262,1,1007574158,1,-1341688317,1,79227137,1,37551083,1,-1993411212,1,772099614,1,89130636,1,89301550,1,1728497198,1,12058629,1,1914817853,1,1403203295,1,-1193768187,1,567100416,1,1954595574,1,-352145404,1,113716939,1,1381,1,1376187950,1,1618280965,1,1312212270,1,184847109,1,772830656,1,92872334,1,771763361,1,184902051,1,-62556992,1,-13385586,1,847249337,1,1957622464,1,-385175547,1,1974337694,1,-544516108,1,-1324366973,1,116118276,1,567101620,1,57891103,1,-1912569879,1,1638084288,1,-1047768827,1,992922371,1,1493534494,1,-164402057,1,-1527513293,1,515448590,1,1394510592,1,90749445,1,-857203194,1,-851463165,1,63891489,1,1316095775,1,1962942013,1,1950253849,1,91553797,1,90638022,1,90743295,1,1952075069,1,1297759496,1,-1024916620,1,91005185,1,-523041359,1,91227691,1,-167422045,1,33903110,1,1053043572,1,-1960442546,1,92578565,1,38112038,1,-385526365,1,145752250,1,196084459,1,512437840,1,1760036179,1,-851528701,1,-1746315231,1,-4501501,1,1219763967,1,1478435277,1,-2097147899,1,-697167365,1,-763903173,1,90652288,1,51934464,1,1912959494,1,2009283525,1,1913007041,1,1946551045,1,990147077,1,-1962772797,1,-661971261,1,90381961,1,567101620,1,-1549569505,1,268764517,1,1732149248,1,192151557,1,90375683,1,89589291,1,-1560276947,1,-2069691051,1,-2029634811,1,53114629,1,990205702,1,1980073734,1,1732149295,1,628359173,1,371970187,1,369296739,1,372966743,1,360121735,1,721782689,1,-351971578,1,-2117432118,1,989878722,1,-338267198,1,-12129829,1,91231883,1,-754667182,1,212949218,1,-930354989,1,89333387,1,1107343390,1,-1960894003,1,-2130356450,1,1913651451,1,266386179,1,89595433,1,-754667181,1,-1949594653,1,503665438,1,92544654,1,-397290957,1,1068761723,1,2112365005,1,991910146,1,192240584,1,92544513,1,89603715,1,-1950321408,1,-1593486066,1,-1056766602,1,-1593483357,1,1570964856,1,2080818181,1,89760517,1,-1056718708,1,855989155,1,-2146006071,1,1394510597,1,12066309,1,522308930,1,-1175911565,1,1846971390,1,1757041157,1,1882373,1,1394510638,1,417865221,1,-851463166,1,35317793,1,-562931193,1,-1090517063,1,-1959918232,1,-2096802506,1,57999610,1,637586921,1,-661905979,1,-661731837,1,-972879989,1,-947714167,1,-471709180,1,-1175773434,1,788424681,1,89261814,1,772568066,1,89011909,1,-2069680467,1,-1153307899,1,1219821567,1,-620027443,1,-1993417100,1,-1274715362,1,773967176,1,84239779,1,-1557266416,1,-343734908,1,244002320,1,-1053096569,1,-936703881,1,41405243,1,-75376245,1,141758464,1,78758795,1,65790163,1,1358954424,1,1394510638,1,-1949748475,1,1107343569,1,-1959910963,1,1493521182,1,-2078372306,1,1372730117,1,-1274976536,1,-400437953,1,996016488,1,-385649210,1,-164692512,1,33903110,1,-1590812043,1,271385988,1,1537420800,1,113716741,1,16778585,1,914959950,1,-1557265059,1,-661781153,1,1223,1,1394510638,1,19261445,1,567099060,1,771827688,1,89261814,1,-385649662,1,-1959919271,1,-1106942698,1,-1590820863,1,-1073019551,1,-1907882636,1,773097944,1,1208313249,1,344578190,1,-850021294,1,784502305,1,92870281,1,922693210,1,-1893333663,1,771763206,1,90388107,1,-1993936381,1,771752502,1,89011909,1,1959089694,1,833798,1,6078289,1,-1527571318,1,-1414807501,1,505372249,1,175424854,1,-1979683649,1,-1415253188,1,-987799893,1,-2135358860,1,-201749760,1,784989860,1,93011514,1,-108395402,1,-13499669,1,-1960953298,1,-1979419131,1,839052249,1,13953243,1,-15436545,1,1962873460,1,309657364,1,168202022,1,110044672,1,-1070399476,1,110090382,1,110035080,1,508690570,1,-1994486226,1,8436229,1,567089844,1,-164734433,1,17125894,1,-986831244,1,772103478,1,89013956,1,274566182,1,478760526,1,242583846,1,1493615918,1,1569465861,1,1166616084,1,-1872434414,1,771782888,1,89732805,1,378416890,1,-1959918241,1,-83534554,1,-1030859234,1,-1014244722,1,12276683,1,911360,1,777241435,1,92872331,1,1526727400,1,777002691,1,184902049,1,1208448192,1,512350350,1,-1590820863,1,-1073019547,1,-1907882124,1,18778584,1,-1021356032,1,-16769560,1,-466479500,1,-107150199,1,-393213461,1,1962868750,1,-1661428458,1,-1895822104,1,-1460988348,1,918888214,1,1354959795,1,378154578,1,28837254,1,1512164659,1,50008,408,0],10,[1024,0],11,[1024,0],12,[1024,0],13,[1024,0],14,[1024,0],15,[1024,0],16,[1024,0],17,[1024,0],18,[1024,0],19,[1024,0],20,[1024,0],21,[1024,0],22,[54,0,1,16777216,1,1550,968,0],23,[1024,0],24,[1024,0],25,[1024,0],26,[1024,0],27,[1024,0],28,[1024,0],29,[1024,0],30,[1024,0],31,[1024,0],32,[1024,0],33,[1024,0],34,[1024,0],35,[1024,0],36,[1024,0],37,[1024,0],38,[1024,0],39,[1024,0],40,[1024,0],41,[1024,0],42,[1024,0],43,[1024,0],44,[1024,0],45,[1024,0],46,[1024,0],47,[1024,0],48,[1024,0],49,[1024,0],50,[1024,0],51,[1024,0],52,[1024,0],53,[1024,0],54,[1024,0],55,[1024,0],56,[1024,0],57,[1024,0],58,[1024,0],59,[1024,0],60,[727,0,1,538976256,2,538976288,1,0,1,538976256,2,538976288,2,0,1,1230441728,1,1464812622,1,852051,29,0,1,567086772,1,-1608610258,1,-18388,1,158664327,1,1962934077,1,-852577276,1,520039969,1,-315413346,1,158547587,1,235238911,1,278784287,1,-1899459332,1,795065552,1,-1909014386,1,-80961506,1,101107254,1,-969506773,1,-2144630522,1,158657803,1,117884726,1,-351469269,1,1899921426,1,192151561,1,-1172369890,1,1001663500,1,-2145443379,1,686142,1,1048578676,1,1962936951,1,100329475,1,158009030,1,1896269312,1,-930349047,1,103536782,1,280636578,1,199423744,1,-1207733038,1,-1113325569,1,-1608610260,1,1845949996,1,141885193,1,1912957928,1,168945667,1,567089588,1,749773366,1,158205686,1,-402098945,1,57804116,1,-166927640,1,-16091386,1,552141684,1,1996944902,1,57999113,1,-971916823,1,665094,1,172951238,1,1309066752,1,116850698,1,-63181,1,99156852,1,1933476609,1,494141449,1,-2013265986,1,-1089899722,1,-919393397,1,1010936492,1,1241085197,1,243801870,1,870919050,1,-1172369919,1,179579654,1,243933645,1,-315479290,1,-1107050109,1,-1983960314,1,-375065813,1,1444806934,1,752533335,1,-391499772,1,1017776926,1,1007252493,1,653554981,1,1040139718,1,237820606,1,239396895,1,118365958,1,1935669131,1,-1105261051,1,179055834,1,1007580352,1,1007318029,1,-1442614211,1,632353003,1,1008688810,1,-384928755,1,-605552484,1,1948597258,1,1963801604,1,10021123,1,-1569574868,1,-1636366020,1,-772764776,1,-1906899226,1,856240902,1,-1950250039,1,-1359853063,1,-1960378877,1,-2096668875,1,1718943742,1,1947024556,1,-118773151,1,908422074,1,749346559,1,109978484,1,1236535603,1,113713613,1,2355,1,158795462,1,1996932608,1,521011210,1,-400206662,1,468262876,1,-400617730,1,28843988,1,-383660788,1,887684622,1,-1077841388,1,1541942155,1,1966750730,1,173336600,1,-109769412,1,-150319640,1,-16174330,1,-370706945,1,1072233962,1,1965374474,1,-10819325,1,1963801770,1,-1930460687,1,650611499,1,-399799646,1,-353891802,1,1845949971,1,521076489,1,-1950742156,1,528738347,1,-402099480,1,57935160,1,-1107014935,1,-641782901,1,687978540,1,20718029,1,-12843148,1,-790034827,1,60549376,1,-1130232438,1,-1189040084,1,-230227959,1,705278126,1,752460481,1,855671231,1,-1431546167,1,-85979844,1,243847670,1,-396492672,1,-1281163151,1,6078252,1,-852950600,1,749838881,1,-1543095636,1,1007252524,1,-402295795,1,-260765181,1,5236814,1,-1087588957,1,28835948,1,-1574843095,1,1055403186,1,750232320,1,750061067,1,-2144552541,1,175377724,1,2877510,1,750323209,1,-643763733,1,-1139373524,1,1959922220,1,8907011,1,1266010366,1,748691086,1,158547587,1,-385649409,1,585760170,1,868455421,1,161605851,1,748947002,1,-880675979,1,-398032896,1,-398063213,1,884935943,1,375044,1,1974399632,1,112649,1,-670310189,1,-705964053,1,1346454102,1,649050711,1,-1107112471,1,11872777,1,-1976772161,1,-214768884,1,-251420762,1,-1365070690,1,-327832276,1,1048629387,1,1946168494,1,749838347,1,749864458,1,-847970500,1,-15371288,1,-57611822,1,-17004055,1,1959329482,1,-1358510345,1,378142764,1,378023100,1,-1578619687,1,-1086345202,1,-1431687966,1,760593066,1,567089844,1,200337414,1,-1089996917,1,96873551,1,-1375287808,1,297009197,1,-642113778,1,531949612,1,117311347,1,-420926034,1,169987329,1,1964160192,1,1581154627,1,1968128813,1,1614708751,1,141905197,1,749670016,1,29878532,1,761151105,1,242571333,1,761282176,1,-2146994875,1,19705614,1,1048689387,1,1094856030,1,1048621685],61,[1968450912,-1358004053,-1528102356,749668086,-955354111,1160601094,1611056728,-2031532755,-1358498303,527696428,761136839,113656130,-1168888480,263466325,-1073077811,250087028,29616392,-1174360343,1001663500,512631245,113650848,-1090516623,-695522225,186392206,1958742700,-1428475378,175423498,259275580,-369824852,-970587759,1312554821,1342135434,-1957538221,-2133708046,1966735740,-2146137595,236863722,-652834785,-1847044308,108224269,-399996742,1511988522,1552309086,-851725057,-10713055,-1608610250,1896283692,-375885303,-1912144148,-1272143354,119655753,-17469,567101620,567101620,196977446,-1960009053,734563544,1096387,-770972937,-4717708,750625791,334162115,748684942,1996932646,-970588151,685830,856094502,1979711241,-5314543,-1275066693,639749448,-402050141,637992875,154338958,760551050,15269683,-1950338291,-1359853112,749051983,-12240346,-1096154764,199765334,-18419,179953547,128709376,-1106839320,717171595,702731,1007110888,-484215795,-1910110708,638137094,1124548489,1021881411,-1442352121,175377724,229700587,1239016362,-1070410005,113259434,154510111,-2096547933,-16157890,113706613,-1046157,-386245143,1031800485,-1978764288,-1326907579,-1609599998,-341168987,760586249,-1331019772,1455335994,210298925,-1911352344,-1272143354,-1910387383,640458758,158009086,1896269350,1556021257,-1174959360,-1510801326,-1154723910,12061468,-1375275445,57999149,-14818327,237807150,631880223,-384060440,1048836594,1946159475,1933476114,-1007681783,-1910636112,-1574133730,-1021376143,751044343,91619327,-349840454,751018195,750913082,2028471156,-1003058428,-385928404,-1749416828,461170726,378156724,567083100,1962934077,-136185910,-1946514461,73853168,-383344198,-1169024162,1102318332,179970509,-851332085,-1547685087,113642103,1510017390,684374723,-239467541,-2430936,1877548814,-1608610049,2013724204,-853953526,-1572797407,-54850806,-1962440694,-1261882413,1914817852,-1260876843,-1172189890,1018432266,-965598771,1052039307,719856077,1845937682,915079177,1048775289,1979648371,1929824006,-336592887,1845937699,915079177,1017907833,-1955105412,-1207232490,567098624,-661943182,1200029616,1614360,858491839,222068937,1894318965,2084339967,-1431504780,947129660,1971076161,1170614005,910757375,730467976,2033617230,437685002,-919383797,-851705672,-1200465631,-5187445,-1575467130,377946137,378080024,233507610,-1978759114,914968107,-1226306951,-383840751,-35063071,1933476350,1978662921,1929824006,-369098999,110033022,-919393120,-1960080450,222080254,574359668,-973146251,-141822997,1965178028,1959656976,1191544844,1017954814,-17402590,1967013069,1044152370,648808053,172885758,1006954216,638153997,172951239,1760231433,172998487,1947024556,81127492,104480628,963914916,1022225322,-401181380,222037179,-953808523,151660038,1463675648,-351656257,-2132768045,594902268,1996946982,77195274,74714428,326466620,1827217158,652248830,989822336,844038517,-2006996288,-58702043,-33197043,-10163775,2000584742,343146506,638221247,175718025,-399799362,-1431567269,-92992196,730467976,2000584742,118358026,-1539407677,74723116,41168700,-1966908356,-402629610,-1746400844,-1224280571,376767021,567098292,-1813507982,-1086344963,196673629,850064128,915129280,-1974587992,-1058472124,991982847,-1977060110,-4855804,-347208844,24936690,-1978895314,977076036,-1595403916,-117279233,313027,567098292,-1966925965,-7477244,855078393,22841051,567098292,1552477298,-46864383,-1254717114,6078253,-852950344,-303512799,-1086345213,196673629,-1096092928,-85458815,6078457,-852947528,749969697,750323211,-970087261,388869126,28311976,95421044,-1574124638,113716418,11460,-1272097350,-400437990,1939668785,-1287749622,57933869,-1107161879,1438580828,-1177056467,-1527578612,567087028,1344824250,-401053208,1357383458,-1073063935,116787829,1954557293,-54990589,113643956,-956366763,268458758,1948676765,-1086345192,196673629,-1951730944,-1087523530,246939740,-1272853207,5618193,-397401651,-346553695,5618181,-1057087027,1877542517,10611196,751044351,-399680066,116785362,1963011492,761839340,1947206902,663796232,-350752280,15132675,187528609,-1082755904,-1202705210,1487609888,95539339,254077139,-924315465,-1439846386,522502794,-1341210904,-963990995,1342564560,1919171584,-396088318,512429739,-620024461,548942452,-338580704,-338564143,-338629680,1639368586,108137532,41185462,-1073083348,212861557,2095583415,-1438994418,1961411466,-1429829106,-1163214797,1961372870,-1039204841,-1607568084,-1029559101,5105708,765724406,-31886334,1965927438,-1408842221,-843442387,390653990,-854849352,3008545,485036724,-402018049,-185921984,-1188247873,-1527578616,-1180032848,-1527578621,1386922035,-399718726,-1017506017,501817520,-1178971634,521018921,521603560,915129178,1049308537,-1070387845,-393488245,-788520775,-1781018138,-1795141656,4909203,-503311213,751222766,-1843916615,-1828706328,-1795158552,855640552,-960845120,382593324,-388724144,-1973813247,-789917454,-789917462,190698,-494872950,-1325239281,583925248,818577613,-1031089878,-1072512086,314869287,-997840960,696498883,-1409253186,376750090,1006723816,-401640435,225705249,766721664,-1173982208,-1410783262,768506,-1409262146,41238332,-108791326,-1171557120,1474832251,8437270,80205451,179830904,-1390293748,-411769846,201400040,1953381408,-1669776356,-1644223768,330618229,-855614278,-1494724575,-608544768,1958805029,-1092041925,-2146864132,2995006,-1679097228,765998731,-402625345,28836067,-2145268439,536898878,1948877754,-1172851693,567083100,7071824,633649752,-982138626,-1090904599,-1192755071,1963801600,99543299,-1207822872,567098624,1915083706,-1898411037,858563102,244004562,1068772541,-930405939,-1152172573,1085538305,1918575053,1958820617,-1053079068,29043060,1140897792,-1024056883,-384010880,-1910630982,-2144559074,618814,-1173588961,1001663500,-1070456371,-1007040536,154470019,924222209,-1168965623,-1959392922,-1272000226,112959,-1956961843,-485920056,157720583,678763068,856067590,-850807799,113706785,2355,-1341551384,1933476109,1979707401,1929824006,-956301559,17395206,82357443,1325036544,1948269763,1950170126,1949056010,1950039046,-1022804990,-402619970,1048641503,1946157148,-1958328821,-3020578,175496763,108268860,-383340614,-790038238,-1090052355,-4718507,-1070355713,-1330992213,-1186485752,1068498955,1438296819,-853887955,5618209,567087540,666745424,-1609255448,1074004060,91570236,70037664,196012097,1958742616,668252681,-384525848,-809828989,345040935,-1188209218,-960561141,-203977940,168671396,-1430244437,-401309975,65600867,-44177152,-400057670,-960555926,-852446164,-466464735,-235533647,-523107151,280609802,-388986351,783351181,-997566294,179430450,78770678,-1005920046,-1978658631,-42735408,-1163214797,820587718,521018900,32106502,-2144991630,175439933,-1341993752,186574910,-1977206549,-1073068283,607924340,233309556,653257483,-1152973430,-1073075774,-1014817676,38135811,125044538,1962950528,114551793,-16314793,123666775,520603883,700234435,-1340877079,-1341199555,-1341461733,-1341723842,-1341985988,180808060,-1409253186,-1499208654,-1472820947,-1224292819,113639469,-1962922573,-1959942090,-1959942642,1362879446,-187963306,1529719459,56221227,-472478773,-391362263,74840599,766707454,91569980,766971520,1965702146,-1223786491,1290273325,973501694,1965859846,-1070444842,1011221638,-2013104883,-1472820988,-1508996819,-2134981843,-1073042432,65537396,-1022542848,-31594324,993789045,-1018235275,-402592280,712310752,-402603032,887619926,-2955263,376716092,1947024556,23455761,91503420,1962798824,23390213,-1070339349,82363307,-68818944,1031808707,-1173850880,521021555,101902825,99582751,753457035,-425727,-370641920,1994920667,17098752,15919190,-397904802,-370671397,-399054080,1014235364,-1403593933,259263804,-143311556,1015071742,-17795827,1592585159,108317694,-383202630,-397150506,-27590596,-401574705,-1595408190,222080000,-471333516,-1007228160,748691086,186392206,1015084595,-1947175936,309455062,-1392814360,-76169206,2092887275,-1107039448,508962945,1912612328,-386430192,-142147429,721479912,-216070450,-1017241692,-349668162,679591427,1912604136,-1870992589,3008764,748684942,470191654,1375679243,-391358634,642187375,1979663674,1609818626,208951646,5630033,1031808601,-102730496,-1962467645,1088968702,1459940096,1493188328,-108529365,222068931,-391378060,1072169015,1966947328,-2134981648,-1073042432,-1394080396,-1022542596,748684942,470191654,-385928437,-2144993269,-143327171,-348278589,-1178586622,-1359871744,1918975171,2004499462,-1021301758,988304209,-2082895104,-80018709,1364207730,-193009581,46367579,-338492239,-850742205,-1912169439,-399728634,-1660423053,108222553,-383383878,648738214,1479,113465691,1220578384,-1591295858,78708739,-930357037,-1262287016,69324057,139389249,-402650648,-960234965,23558,6035082,1074053770,108347452,749733378,-1102003970,1202990424,91431373,-2132205810,760594418,-1269246069,-1516197062,216640044,109970961,-1591333728,-1557788372,-2144993258,619070,-987362699,-1207194858,567092513,109983239,1236544674,12067277,-400437940,45677850,1914817853,-1193768176,567100416,1971372790,-851528691,682080801,-351225368,-164458455,-1207711104,567100417,244051,1052039987,-498916915,1169447929,1169433037,1169433037,1051992525,-1909055027,506241054,-1560274783,-692582033,-1144303613,12058625,-165556924,880050370,1947255542,891926575,-1064558131,1996525629,856405027,-1273967141,-1978610417,-1228210476,-1950338279,-1274562616,856739078,-1275021358,-1022309118,-1406549826,-315438966,-1968437580,-501101104,-1281244167,-1190786260,653048364,-2118240907,-84547584,125046076,977120582,-385649395,1273560774,-1224280324,108331565,567098292,-2098636941,1304825,968099445,1232282061,-383256902,-2084899806,-1090983127,-1192755071,1947024634,749969905,750323211,1965485242,-66262814,766969590,-555171070,-1274644993,1931595066,672381460,-1158418967,-1645730099,201439247,-1863835187,213894136,79858220,1967144000,-1341783546,-1430192596,749020810,111884976,-1258845409,1914817863,-1021374974,-1409283911,24387644,-1392975190,309600316,783343754,-1429961046,1017905841,-1442614240,-1070401310,113689514,-2130704009,619326,-955877889,-16157946,-311105025,167657088,-1169197825,236858709,-853887969,-4579551,-2146257911,654910,297011060,167642822,169987328,515864000,-1105261049,2042572117,1049175561,78383612,1950366784,1048585739,1946159480,-1422216189,654276072,234833350,118365958,167517835,1946173312,-1393325175,-76214980,-1581328757,730578697,1017956659,-1978108635,973732646,1175483684,-1393325226,74714428,-135550399,-1427903650,1963801665,-2009708067,-1993635314,-167117802,-16159226,326377230,-12204506,730577444,638488040,234833350,-370213399,-1910575363,-1171480546,1048651993,-16774797,113706613,-63117,-224073441,855671230,-1610182967,158973740,-1574518734,-2044327560,168392454,650868160,167526025,-33110490,485031689,624733689,-2010747531,-401999066,222099727,1034757236,91508297,1970170173,-117577642,1965571244,-118101938,125118780,748691086,-1392592919,1114901820,510929212,1948925098,1967078404,113649158,-402585090,-478807849,-12204506,-121247731,230218219,2105550336,41225727,-391397325,1034811571,91508548],62,[1970234429,-123344827,1047792956,-1408654913,1963801770,117319418,-2094659209,-16157890,-953809035,619270,1048585983,1963002366,-1088485865,2042497535,24936457,-33262278,-1207339002,567093504,-893757245,-239277784,749668038,8502784,1022907112,-1947503603,703447022,-175439691,-481882742,1963125555,-1977177072,-1002813659,-864025228,-490456544,-117202962,1195842955,-1394903650,-1166799556,1979196136,-132781871,385278975,-1192547153,-1396100266,-1586229956,1962412776,-202686205,125058364,-1854665412,-1393169492,-1988805316,1022880488,1602384909,343189235,234847360,1017953396,-390630387,-160040997,418119600,-137238356,-1070404235,1438584555,687978541,263463373,567138187,749668086,-167611137,1958742736,-352524029,-1946705176,-2115403314,-2146555904,-2146530816,-1978759168,730578731,229680371,-316413526,-617477449,1947024556,-142481244,808193140,-403258490,-1014578430,-1910576405,-1976786914,520711206,-482688974,-922835341,512664299,866200736,-22263,-1064422540,-919349106,-108281461,-1951468983,-1186576649,-1510801399,1962884483,-952792296,922746629,748691086,1963801772,3965179,-1993997452,512672565,116862112,-63181,-768347276,154474121,154605193,-1090486552,196673629,-232738816,1090614702,-150214269,243873497,-1813500587,1949973750,-158537695,125110844,1022789096,-149720006,-16174330,-387287553,521011261,-383207238,1572859934,244004352,-397333163,207222370,87696928,132842101,975577132,1204843781,1273555170,1998601462,1947024582,-163518457,-109769412,787888616,785456779,567099060,512630467,-768407245,-851640136,521499169,785490742,378263691,243992885,12060983,-1021194942,126540427,-115392468,9496771,512627314,108342432,158205638,113689345,-1023407762,1006665888,-1173786110,1323827330,-197269237,748691086,158211722,1589255950,-383194327,1474883450,855750656,91556978,567083442,-841862461,243974945,-922091392,-1070407307,-628481587,-399947334,1153043222,1977289257,691976707,-401929751,28835874,1963618862,-1021195005,567134462,-2146530621,1976109568,-850086738,-1160213983,-873780909,-1409262146,1866211340,229448565,1849434144,-58718603,-1022462688,1969645117,540847112,-1057094795,675986115,503759865,-1064384372,113760398,852097,730400454,-1979267200,-401800917,-1712848890,-888725760,-402619970,222098799,767244660,17492015,110117867,-1090056617,716451014,-1952964147,65458672,13009392,-1176925401,-1527578621,-1951784784,-1295348797,-2030897564,766743236,-1174331671,1340614436,-3676150,-1155058246,-1326960851,1916171264,-1019565003,-952499084,-706204555,-1188597248,1015023468,-1341426675,-1947928988,12773576,-997583758,-939327308,1963801772,-852773879,1975519777,364561153,168093735,-2118207765,-187045888,309595452,-398837061,518717556,-852708208,-382029023,1471807656,165734439,872410856,661174985,-398837061,1718878271,-896846990,1017958963,975336461,-1289325117,6219822,-192274574,1947024556,1975728656,5171220,-729149582,1963801772,-852642808,1958742561,659077681,-351693336,159574198,-1984296268,-400437973,-1950420365,222068779,501748852,-1978699264,-1019564812,-75493772,1308915002,985858226,-92931641,-1979710488,283689940,-1964019200,649440,181732466,17621130,738495171,1022980656,-193792758,106414918,-960559346,-1211790804,2746384,-1968520310,2222273,-1968520310,1697990,1966799744,-1439780861,216580746,-1430244608,-399718726,1594296591,-2046110525,808455620,41234492,12044074,1351795627,1476970216,1377747858,777081680,748691086,175586944,-402230016,719847433,1482381568,-2134696102,665150,649729908,1023457290,-608558643,-1962184155,-2030063400,413276231,521061120,-2131957271,675646,1048589940,1946159694,172997143,-851639880,856519201,-1949748270,1107474648,283845069,856313786,-851659575,639744545,-661927822,1200029616,1679896,272531651,225771310,784545419,772880009,772802246,-1947388929,-1288781002,779075371,-167209240,594837703,1963050998,32303344,-1074614296,12070105,-1155412695,-625070695,356420396,109766702,-402486295,-1070398536,-1557349470,-1130222401,288787244,-1019836114,46196782,-1947663500,38856961,-1180450765,749904428,-1573991262,-878563640,751084334,-1573992030,279063729,779068206,-1557284701,-1734136296,760587053,1210914211,-1574125150,-1281217009,8502829,-315413581,-399609921,1198655495,1954596854,-871971323,-940179154,151680001,153925422,-349390546,-2134378787,117310581,-1588187982,1874734803,-1077531858,-956093000,-2010270301,1093514254,1049142515,113716663,11447,-1599083682,-1314771252,-790573012,784704224,-1607892038,-1073075022,37487732,-1813445770,766754283,544538940,70037664,-969231295,-1090387642,-945082952,2930438,71747072,4638210,110159872,33652352,1048581493,1966747065,72253454,767213314,18118,-1962510872,1031799422,-1173064448,2105550818,-1435157762,33572550,100945536,-1173988888,-1180621076,-2147467988,279549044,-1273728000,505531732,748691086,1973675058,28843785,857853230,8503021,1874799539,118614062,1963050998,-1221719563,147191596,-2146667264,2928958,113640820,1443114699,-1104227423,-970248593,53352639,773170119,773066376,-2002455743,1580078910,552125835,-406853628,-402384152,-1679228835,34793472,751056523,1978203955,646298351,-385454616,1048634526,1962945713,773372507,-402234648,-608506046,61860133,785621334,724463550,773373894,363054851,336496686,-1527561938,773275272,-389706914,1726481351,63039719,749813376,856388864,750494400,-1574125661,914959548,213855939,773045548,-1962631448,-1020390090,785137280,-352160512,-1947389056,-1288781002,779075371,-167363864,-344686393,1963050998,-7280400,-1207935809,567093504,-2144462687,41171708,1076641968,-1275044702,8972305,-264836964,-385649507,-1070399660,750847622,192200714,-1090515783,1438526872,849670957,784835264,773144203,-399681858,1048639006,1962945713,386332167,158597678,-399632198,1894253963,5368046,749813376,-401967872,91357452,750454470,-1321304064,225706028,-167655704,-13758458,-320273548,846076,113641333,-352310084,-12260954,116789940,1963077143,-1008465405,-1172655024,567094613,6077016,-1073077811,-1358510397,414842924,1023457326,-260955699,512350347,12070508,-1994273449,-1993421546,-1204891890,567100416,-2004819328,1949199894,-935428083,108265518,-383182918,512426573,244002412,378219709,-903140161,1088949877,-901873663,1702166574,750587531,-1575055842,-851463124,1433542433,1373882507,778976896,-2146994944,3066686,-779412620,750730891,-1912202576,-231955962,91555758,749668094,-1949226175,-1089600566,-1089566420,-1123140820,-401837524,1048576235,1962946250,-2138051824,3042878,1048577908,1946168495,1813941121,-851528658,1048625953,1962945724,750231800,1946284776,-1088517322,-1122092244,-402033364,41156770,-617364487,-1575055842,436717356,117382912,113650879,-1610600761,-466473271,750716419,20776306,-396135424,-730529674,784940672,-1957202944,-1959916514,-1959866610,-2144416490,3065150,750006644,-506453555,-506338864,-506338863,-838144304,-852839343,-1125547743,-773224953,-790179615,-790179610,-2132356890,-703987499,-1202063990,567105281,567099060,751044351,750520062,512476152,-420991476,767081215,567099828,751044295,-387252224,1345106336,1476396776,749798970,-905525565,1048576046,1946168507,8448259,-402572056,376767238,778976896,-2146470656,2928958,1948661690,-955857317,28836142,-952205251,74776622,-919389004,-852641606,639744545,212024946,-1157183954,-661978836,-851181384,236357665,-2134706642,-1214238092,1963729964,785096713,784860682,544872564,477366440,843317688,550142198,772675208,216736205,113669611,-2147209525,70173966,784809600,-400722688,410321538,778976896,-1173261056,-135780773,-1090074878,-33554388,-1020343802,772546187,243779891,-203215681,784926462,784809600,861238528,512630482,1085549730,-1172364851,527574508,-747321301,772671222,-166431616,539889158,1048578677,1962946245,1014253887,-399924550,117310114,1048587452,1946168507,203328276,-851528658,767080993,567099828,750454470,-66983680,-779627981,-851312200,-1354858463,74711084,567099572,2047616195,136597520,1479461026,-878574556,-989460434,785096750,-2134654966,-13782210,213847157,766754092,-402599192,-1070404432,772736646,58048522,-1962901527,-1087523530,12070165,-1591620311,-58708552,-1342016454,-888239552,-1572852690,-1214239467,388401709,33695022,326418442,259376186,785137280,-33000448,841879558,872868800,-792452606,-872019224,749838894,-523181872,-2144418398,3065918,-878566283,1976109614,1958742557,-1089565927,-1340873940,-13433318,748816014,1963437810,1049186053,1455107263,-1321304019,57933868,-1104307781,1049308438,146353589,1060940800,126485109,24387644,-236829782,1015022513,-1340967904,1017948718,-1979550401,1948269575,-498882047,-1430244623,71759555,-1960676094,96633813,-851640136,-1961463263,1140898008,1051992525,-1024056883,-163482240,1946420294,89557819,1950023296,-2143243774,-1729609494,-2083157007,2122974658,115834884,1963392896,41323286,989756544,1187382901,99287552,16795334,-2141263026,91554559,18118,-851725117,-400133599,-91495090,-930365389,1336865353,-970152544,973209670,91553605,4638378,72253441,3991558,4638403,75401728,1946470390,4638451,41323266,1946172544,775716896,2088770420,91503358,16795334,-2032455090,-851725284,1914471969,-453711868,-366220861,-2147320183,-1207172794,146353727,-2035617024,-997807420,-1426914383,-1012219854,415125585,767082286,749735562,2088823178,91568641,-1975440211,25002184,-1979157190,742868741,988318273,-400525847,460587040,-1946205045,575733581,259348673,74788412,132899850,1966012800,1491929602,1973863257,-8617810,-341281792,1364336373,521031763,-2010331461,-1143764201,-880082943,567099572,1515805528,1397801759,45819056,1343351552,149622192,-349917104,-1070379005,113491,-91531439,117440441,-1359870178,1239021319,-851397559,990474785,1594193345,-1017619623,109977358,-323343200,1048585765,1946159735,113649161,-1174402441,-202823439,-1547684893,-694014253,785883694,1469905034,-391329485,326494855,-160161732,-227276484,785843846,-361447414,-402593047,-1019548193,-813693579,1021045632,-385649395,104464592,58010788,-2147429911,326449724,-1409220888,-1996424472,-970009794,3069190,-1996454423,-970009794,3069190,1978000104,-1331671016,-398392276,984613079,1476449000,785596041,785712838,1965964288,-704184823,-720976338,1060962094,-813694091,1965702146,47153189,1048577972,1946169046,-1342000126,-718919105,-2041417170,-2046172191,9562337,-136126074,-1998003834,-2145749531,-940178225,-1992526590,-13708482,-970009850,-13708026,785778374,6940672,-316282708,1961472744,1947024424,-1543095772,975074348,1008366787,-964266694,-350159036,694663696,-371004951,-13440971,-107126962,787173059,-2130587776,-394264371,1011280243,-387484659,-521666525,1364657900,884934414,375044,125153010,-754974280,1508379616,11536223,-123904086,-29250877,-1020340986,1364678150,12079952,650153712,-115072,-133663491,1599690843,-1195178146,-1064386560,-2128150733,1957319997,8389898,1928331325,652274669,839015818,-773598721,2143519715,-8330367,637535935,843517322,1976110061,-339541244,1190300631,125085427,-947652349,-2132481277,91504444,1965046912,109850351,-1993462351,-114446530,-4482325,-850873089,-850873311,-1202695391,773727522,748691086,-855470406],63,[-1898279903,-1269162046,-1910387371,8436442,567089844,186425638,1526738083,-754722164,136841,-1907697012,378094298,-628228095,268499841,-617414030,-472709967,-762389876,-1070341237,785446736,766588671,-1355350226,-876442067,1631717901,543712116,1701603686,1936289056,1735289203,220465677,1936607498,544502373,1802725732,1953068832,1633820776,543712116,1701603686,1851853325,1919950948,544437093,544829025,544826731,1852139639,1634038304,168655204,1684095524,1836016416,1684955501,544370464,1701603686,1835101728,604638565,1819309380,1952539497,1768300645,1847616876,543518049,1176531567,543517801,544501614,1853189990,604638564,1970499145,1667851878,1953391977,1936286752,1886593131,224748385,1968120842,1718558836,1986946336,1852797545,1953391981,1634759456,168650083,1818838564,1919098981,1769234789,1696624239,1919906418,1176766989,543517801,1852727651,1646294127,1868767333,1684367728,1953394464,1953046639,1718379891,1126435341,1702129263,1864397934,1701060710,1852404851,1869182049,1869357166,1646294131,1919903333,1868767333,168655216,1766203428,1932027244,1868767273,1684367728,539232781,1701603654,539587368,2036473892,544433524,1701147238,1227098637,1818326638,1679844457,1702259058,1701868320,1768319331,1769234787,168652399,1920226084,543517545,1701519457,1752637561,1914728037,2036621669,773860896,606088736,1635151433,543451500,1634886000,1702126957,604638578,1299084627,1968467567,1684363109,1182099540,1632856434,1225395572,1818326638,1679844457,610628705,1920103747,544501349,1702125924,544434464,1158286628,1919251566,2003136032,1952539680,606091877,1850280461,1768710518,1769218148,1126458733,1701999221,1948284014,543518057,606106473,1850018317,544367988,544695662,1701669236,1092886586,2032166258,1931507055,543519349,1311725864,606093097,1229208608,538984018,1112089632,1699749965,1852797810,1126198369,1970302319,544367988,542330692,1936876886,544108393,1867915300,1701672300,544106784,1986622052,539238501,606106473,1935763488,544173600,1700946284,1850287212,1768710518,1768169572,1952671090,226062959,1851073546,1701601889,544175136,1634038371,1679844724,1667592809,2037542772,1227098637,1818326638,1881171049,745043041,1953459744,1919509536,1869898597,221018482,544370442,1701996900,1919906915,1869488249,1835343988,226063472,1967989770,1931506803,1768121712,1327528294,1919885390,1179012896,539232781,1701996868,1919906915,1718558841,1310990368,1632641135,606103668,1213481296,1330794557,1028935757,1635151433,543451500,1986622052,1852383333,1634038560,543712114,1752457584,1227098637,1818326638,1679844457,1667855973,604638565,1700946252,1869488236,1868963956,224685685,2035491850,2019652718,1920099616,168653423,1329990948,1633886290,1953459822,543515168,1953719662,168649829,1953384740,1701671525,1952541028,1768300645,1696621932,1919906418,1920295968,543649385,1701865840,1126435341,1869508193,1868832884,1852400160,544830049,1684104562,1919295603,1629515119,1986356256,224748393,1718559754,604638566,168652399,1163018788,1763724097,1445208179,1179210309,1936269401,1128604704,1763725128,1227104371,1818326638,1881171049,543716449,1713402479,543517801,1701667182,1227098637,1818326638,1847616617,1700949365,1718558834,1918988320,1952804193,225669733,1917133834,544370546,1953067639,543649385,1679847284,1667855973,604638565,532488,844831492,407585866,1343807828,-2092035693,241194513,1276053319,255987467,196960015,1159322148,-112718077,251613454,1330512640,169187924,1330795077,1447382098,371739717,1230521605,367678547,1229194240,167379282,1313165831,21318977,1375997106,-1308537275,1380255244,21320513,1141115965,1023495237,1498678540,-285129392,1163002892,17039437,1347371781,449577305,1430343686,520111443,1094976787,939541844,1230243096,-838843059,1163265048,240582738,1280267780,51234817,-1509866429,1212352018,22169924,1292047014,316211524,1145785606,-654224823,1146225426,101912065,1229213010,319684946,1163018758,-1845474495,1163265815,1497778514,68667136,5522771,1342640143,1347243858,268042324,1413566469,262144072,1230521605,298385492,1414808325,301400409,1212368133,391708751,1414481669,378929231,1229476614,1442862150,1179190038,68505600,5394246,1124340840,1392530252,58720274,223234391,1329876553,873303,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1459847168,1225608777,1464812622,3411,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1465662019,1329876553,21335,0,0,0,0,0,0,0,0,0,0,0,0,0,1124073472,1313429306,1297040174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,76611584,101385538,42163247,73663810,67110210,2,0,0,16776960,0,809369600,976236602,959329330,808976435,0,1230438400,538976334,1061101600,63,-620754944,33612610,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1230439168,538976334,1329799200,8269,0,0,191835457,318963780,0,0,0,0,0,0,0,0,0,0,0,0,0,138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-419430400,16777484,34400000,33554688,-1993754368,-416695253,168617740,2690310,1630276608,2906413,-415453184,-1341729012,15877692,0,0,0,12066574,-2011050701,856000022,855750866,1370759629,512303565,-1014102647,-1289829322,109848075,-1993998288,-1275056610,-1977496295,-854674224,93037089,-759692111,250139392,-1547500709,-270006905,-1962636540,1418396252,272928262,1007574158,-1341688317,79227137,37551083,-1993411212,772099614,89130636,89301550,1728497198,12058629,1914817853,1403203295,-1193768187,567100416,1954595574,-352145404,113716939,1381,1376187950,1618280965,1312212270,184847109,772830656,92872334,771763361,184902051,-62556992,-13385586,847249337,1957622464,-385175547,1974337694,-544516108,-1324366973,116118276,567101620,57891103,-1912569879,1638084288,-1047768827,992922371,1493534494,-164402057,-1527513293,515448590,1394510592,90749445,-857203194,-851463165,63891489,1316095775,1962942013,1950253849,91553797,90638022,90743295,1952075069,1297759496,-1024916620,91005185,-523041359,91227691,-167422045,33903110,1053043572,-1960442546,92578565,38112038,-385526365,145752250,196084459,512437840,1760036179,-851528701,-1746315231,-4501501,1219763967,1478435277,-2097147899,-697167365,-763903173,90652288,51934464,1912959494,2009283525,1913007041,1946551045,990147077,-1962772797,-661971261,90381961,567101620,-1549569505,268764517,1732149248,192151557,90375683,89589291,-1560276947,-2069691051,-2029634811,53114629,990205702,1980073734,1732149295,628359173,371970187,369296739,372966743,360121735,721782689,-351971578,-2117432118,989878722,-338267198,-12129829,91231883,-754667182,212949218,-930354989,89333387,1107343390,-1960894003,-2130356450,1913651451,266386179,89595433,-754667181,-1949594653,503665438,92544654,-397290957,1068761723,2112365005,991910146,192240584,92544513,89603715,-1950321408,-1593486066,-1056766602,-1593483357,1570964856,2080818181,89760517,-1056718708,855989155,-2146006071,1394510597,12066309,522308930,-1175911565,1846971390,1757041157,1882373,1394510638,417865221,-851463166,35317793,-562931193,-1090517063,-1959918232,-2096802506,57999610,637586921,-661905979,-661731837,-972879989,-947714167,-471709180,-1175773434,788424681,89261814,772568066,89011909,-2069680467,-1153307899,1219821567,-620027443,-1993417100,-1274715362,773967176,84239779,-1557266416,-343734908,244002320,-1053096569,-936703881,41405243,-75376245,141758464,78758795,65790163,1358954424,1394510638,-1949748475,1107343569,-1959910963,1493521182,-2078372306,1372730117,-1274976536,-400437953,996016488,-385649210,-164692512,33903110,-1590812043,271385988,1537420800,113716741,16778585,914959950,-1557265059,-661781153,1223,1394510638,19261445,567099060,771827688,89261814,-385649662,-1959919271,-1106942698,-1590820863,-1073019551,-1907882636,773097944,1208313249,344578190,-850021294,784502305,92870281,922693210,-1893333663,771763206,90388107,-1993936381,771752502,89011909,1959089694,833798,6078289,-1527571318,-1414807501,505372249,175424854,-1979683649,-1415253188,-987799893,-2135358860,-201749760,784989860,93011514,-108395402,-13499669,-1960953298,-1979419131,839052249,13953243,-15436545,1962873460,309657364,168202022,110044672,-1070399476,110090382,110035080,508690570,-1994486226,8436229,567089844,-164734433,17125894,-986831244,772103478,89013956,274566182,478760526,242583846,1493615918,1569465861,1166616084,-1872434414,771782888,89732805,378416890,-1959918241,-83534554,-1030859234,-1014244722,12276683,911360,777241435,92872331,1526727400,777002691,184902049,1208448192,512350350,-1590820863,-1073019547,-1907882124,18778584,-1021356032,-16769560,-466479500,-107150199,-393213461,1962868750,-1661428458,-1895822104,-1460988348,918888214,1354959795,378154578,28837254,1512164659,186434392,83887426,1392853760,234946632,251657734,-234484986,396857,114409,53,1936607488,544502373,609439556,1702063689,1092646002,-1275066850,50728511,0],184,[1024,0],185,[1024,0],186,[1024,0],187,[1024,0],200,[1,-351229355,1,808465694,1,959787056,1,692267040,1,1498435395,1,1212631378,1,1226842196,1,824200514,1,724711481,1,-86470976,1,-1560261471,1,1319174400,1,16950016,1,4982471,1,244056662,1,1622671438,1,3449607,1,3542668,1,6555335,1,244056454,1,113705062,1,65470724,1,17174156,1,4241659,1,113694862,1,-973078412,1,29958,1,4392646,1,1996932608,1,632881152,1,15919104,1,-102627981,1,-1191133207,1,-2135293951,1,302036992,1,57873357,1,-1207914519,1,332207104,1,-1511455885,1,1812383488,1,-1593835520,1,876413042,1,-955878126,1,-1711248378,1,606200833,1,-400431362,1,124911796,1,-854589256,1,-1593085165,1,-1103298452,1,-336825855,1,28938357,1,8436224,1,-854523720,1,-1201180141,1,332204288,1,12083314,1,734039752,1,251705563,1,1383207885,1,7669502,1,-1342041158,1,565898752,1,254077955,1,108269372,1,7079623,1,330957220,1,-285233150,1,-1174404679,1,-1070923647,1,1081217997,1,-854523720,1,-1593085165,1,-1103298452,1,-336891391,1,12095535,1,1913900297,1,1963392551,1,-2114289408,1,1109226240,1,264099051,1,-1950340352,1,440816,1,771798928,1,23626890,1,281874100,1,-101391802,1,203547898,1,-81664511,1,-889149976,1,825243441,1,1381042701,1,16824824,1,-301594648,1,-335150104,1,57934372,1,1526330082,1,-1070873767,1,-939861874,1,-419363834,1,101616643,1,2013710081,1,-1946025728,1,-83854834,1,1358955449,1,-1070869973,1,259134413,1,721551800,1,-1144877358,1,28933120,1,1494469888,1,-58717581,1,-502631296,1,-1878594594,1,8126698,1,734014208,1,-1189884462,1,-1169096701,1,-1070923648,1,309466061,1,721551800,1,-1144811813,1,-2135262208,1,112896,1,1918440397,1,2113839368,1,1957319997,1,-841489717,1,620941080,1,-14022654,1,68810320,1,4241438,1,646633614,1,-967835529,1,30470,1,704997864,1,113700544,1,-402390921,1,-1070987938,1,1996932846,1,1407715328,1,-289396219,1,7800518,1,88664076,1,-1326530518,1,-99949049,1,537666020,1,1492853222,1,7808648,1,-92224737,1,-855280768,1,182848,1,1977879291,1,708889865,1,-2114289436,1,-58658953,1,-385649400,1,1364394266,1,1443241554,1,7006295,1,-7804848,1,-1912586056,1,646600920,1,-58720140,1,1583346945,1,1499078407,1,182875,1,55378744,1,56623958,1,57803626,1,58721145,1,69665584,1,81593551,1,54002930,1,84346105,1,85722389,1,86639907,1,113640753,1,1358954612,1,-897521014,1,-792003071,1,1997965538,1,-2133489152,1,95486434,1,-703929646,1,4396680,1,-1202666663,1,-661782464,1,33325144,1,1441465205,1,-2132115312,1,1929968256,1,-4003793,1,113691134,1,-2013265854,1,-2013248498,1,-1577040594,1,1990197318,1,4694528,1,851741264,1,-1948200476,1,2768368,1,772109144,1,43820287,1,7603910,1,-1023365119,1,-301710360,1,-335265816,1,108266020,1,7603910,1,-622214395,1,7643136,1,7603910,1,1202766592,1,4327110,1,31844616,1,113658800,1,-385220542,1,113639899,1,-385548222,1,113639876,1,-351928254,1,1107740172,1,99288832,1,4327110,1,4497412,1,1151516708,1,27715840,1,726861342,1,-992440640,1,-1207892962,1,-661782464,1,-2139035008,1,796068090,1,-385934360,1,661783519,1,-1960388605,1,142599,1,2484362,1,-773271293,1,-1978594072,1,2005542600,1,-1966146046,1,721450262,1,520575936,1,-973077814,1,117470214,1,-1070987340,1,-919875029,1,854256633,1,20054529,1,720896,1,2667532,1,1996488704,1,24578049,1,84606976,1,2667532,1,838860800,1,8390145,1,84607232,1,2667532,1,838860800,1,20055041,1,84606976,1,2667532,1,-973078528,1,201343494,1,4392646,1,1107968,1,113642866,1,-972292030,1,536888070,1,-1023409688,1,434683946,1,-1023315199,1,-1900008674,1,69125336,1,887627521,1,56062467,1,114648,1,1912627176,1,48973,1,1912625128,1,180037,1,1912623080,1,311101,1,1912621032,1,245557,1,1912618984,1,442157,1,1912616936,1,376613,1,1912614888,1,507677,1,1912612840,1,573205,1,-1576957402,1,-919928714,1,-335359000,1,158663336,1,113702626,1,-116981644,1,45476035,1,1963074796,1,-974601231,1,-402165247,1,-1977220441,1,-389812735,1,1802633241,1,4327110,1,-347623195,1,780392,1,113663346,1,-1327103934,1,-1604654261,1,-2143551418,1,113689589,1,-351600574,1,1107740221,1,113643008,1,-1342111674,1,-968955065,1,251675142,1,4589254,1,-347361279,1,1107740208,1,451608576,1,4327110,1,-971773183,1,-536854010,1,113642731,1,-337444798,1,1107740165,1,45147136,1,1912612840,1,-971576543,1,151024646,1,22538435,1,61928818,1,1912607720,1,-435965939,1,606200842,1,-400431393,1,1005060522,1,1119798016,1,35383296,1,35449070,1,-389469202,1,619446796,1,1947024399,1,-956833271,1,-2147453946,1,-1174617095,1,-387448826,1,-487674879,1,32434425,1,1946265836,1,1946600966,1,-1007083520,1,167802016,1,-1023314496,1,-1912586056,1,-1950340160,1,1107740408,1,-1070988544,1,1929358312,1,309539,1,1912654824,1,28174368,1,1166550764,1,-1310177470,1,-387063295,1,225575096,1,-335439128,1,259261096,1,7603910,1,449051135,1,1778788102,1,637957894,1,4333194,1,254067594,1,707847040,1,-754732545,1,-1476448533,1,536872419,1,8396864,1,272629792,1,67109392,1,285212736,1,537002251,1,45813792,1,1929985030,1,-1562956189,1,-1144848268,1,-930413045,1,1416825404,1,1956828974,1,148996096,1,1963522432,1,1107740202,1,-1070985984,1,1929321448,1,4122654,1,552081778,1,-930419711,1,1912615912,1,18212878,1,1946265836,1,1946600966,1,-1963384832,1,364626881,1,1929526278,1,-1562956269,1,-1144848268,1,54265367,1,-684849549,1,-1023380318,1,7603910,1,726778811,1,15657161,1,1963043052,1,-956702200,1,-2147453946,1,1354979833,1,1006651040,1,41048193,1,-95304711,1,1481641190,1,-1064563738,1,-1059912527,1,-266016630,1,41140995,1,-430914050,1,-423327226,1,616925702,1,-1602034161,1,-523239354,1,-527775490,1,-1605304400,1,-449052606,1,-432273548,1,-346553484,1,79190033,1,-14003454,1,4595338,1,1524889426,1,-430946213,1,-423327225,1,1482291975,1,-1017528061,1,105993211,1,-1070916010,1,918870158,1,706674948,1,1552557823,1,1109821961,1,83656704,1,-1977219467,1,166398556,1,1977875584,1,1552557572,1,-389469429,1,619446340,1,1948269600,1,1274339850,1,113701237,1,-394264460,1,619446307,1,1946552322,1,3205120,1,1592705074,1,-1017423609,1,-434065328,1,-435703776,1,203547658,1,1478616608,1,52476623,1,-1595659696,1,-805109641,1,-253181096,1,-389856513,1,-1019019272,1,1124071656,1,-792381,1,-370650900,1,35974399,1,-1978239656,1,-2147466458,1,74784996,1,-388962096,1,78709540,1,-466951982,1,818149827,1,909193016,1,-13486033,529,-1],201,[1023,-1,1,-905969665],246,[-394358807,-389321817,1573610754,1949288424,-382301427,776243716,41221692,12844348,0,-1808911616,1534289933,1712675089,-1894367689,-1240404719,202569744,890293806,756113169,1343440942,455030063,1477574189,-1860440034,-1104247518,1393016327,773014302,-1979711457,-1676583138,-1557226194,-550571218,1477617974,-1205716718,-81602542,17825295,-653261808,809305108,6135869,0,1061005568,69508644,1816351296,-834572991,-413978815,324871762,692466502,-782758568,-1824010937,391129681,-1524012972,472494377,-1770094491,-2022641283,209325688,-194870157,-847598215,1026264186,-400852450,-383379672,187234345,1193443369,304483625,-1390709466,-2106896021,-94004117,307664981,-1740324777,927247428,1459701761,-1274967295,-452863743,-117312511,369235201,1342315010,1828872706,-1459452414,-553473534,973284098,1292059395,1761830147,1426287107,1319817044,-750588220,248402950,1426259,-984202925,1095716034,1162200004,1325450704,-1076736180,-984395956,-733065285,1095060633,1381208786,-607237812,483675721,499600979,516702788,1208800079,1092002898,1286851660,1157677267,-984332980,-1051442775,-2033366652,1414743621,1178971346,-1378595255,1314080325,1178971847,-1345568188,9946693,-1580903604,1384236110,-1513794751,-1496037052,-766553518,-724807001,1490408018,-967898160,-237612765,-2100146432,-984428082,534268175,-816558336,1411403657,1397721551,9290325,446978117,1431326208,-1949923884,-766225586,97799896,1292947534,1263465168,-559654587,-649789440,1129251017,-893037503,1313428048,1229757908,1352586323,1159451471,1313442004,1095741637,1397341380,-951086124,616779530,1158860357,27546694,2475599,-766553009,1196574145,-1001407035,-1539028493,1480916995,-683310124,-741060716,-834318336,-1663806022,-271411762,430199875,1330205776,-968443698,1230110941,1334957134,1335412043,1162154451,1163073483,1163052756,-942389933,-733066929,550389212,-833290240,1431586186,1166986834,1166525505,1380930643,-851079995,1431520655,1235797325,-1537980345,147082754,-850047419,1145979307,1514753359,1124121029,-834321070,-800107320,-801024112,-984202844,-1471983426,-800762670,80627663,1225249361,1381239246,1381241764,-1538830775,1128354006,1327014981,-993767851,-884782764,1230132257,1207968455,1389219397,1386401359,-1547286961,-827833791,-834548529,1230176269,1406650190,1090572498,1379996876,-623750064,1413761280,1229037768,1229493972,1169278284,1387447374,-1211804599,-254652672,-1426063360,-1427460631,-554913813,-1477124883,-1108951335,15252711,2088532345,1011241087,2071603250,27522,1681615789,1722313553,1817404163,1702126368,1662608146,1663591233,1667916849,1669948239,1706301655,1480936960,1769414740,1970235508,1329995892,2035482706,2019652718,1920099616,1375761007,1381323845,1769414734,1970235508,1330061428,4347219,544503119,1142974063,4281409,1701604425,543973735,1668183398,1852795252,1818321696,1984888940,1818653285,1325430639,1864397941,1701650534,2037542765,1684952320,1852401253,1814062181,543518313,1651340654,1392538213,1668506229,1953524082,1953853216,543584032,1735287154,1967390821,1667853424,543519841,1768318276,1769236846,1140878959,1936291433,544108393,2048948578,7303781,1701604425,543973735,1701996900,1409315939,543518841,1836280173,1751348321,1953844992,543584032,1769108595,1931503470,1701011824,1920226048,543649385,544173940,1735290732,1920226048,543649385,1836216166,543255669,544173940,1886220131,7890284,661545283,1868767348,1852404846,1426089333,1717920878,1684369001,1702065440,1969627250,1769235310,1308651119,1163010159,1162696019,1397051904,541412693,1752459639,544503151,1869771365,1851064434,1852404336,1818386804,1919230053,7499634,1936943437,543649385,1919250543,6581857,1701734732,1718968864,544367974,1919252079,2003790950,1986348032,543515497,1701669204,7632239,1769366852,1176528227,1953264993,1380926976,1953060640,1953853288,1480936992,1968111700,1718558836,1885425696,1056993893,1229477632,1998603596,1869116521,1461744757,4476485,1145980247,1953068832,1953853288,1229477664,1174422860,1145849161,1702260512,1869375090,1850278007,1852990836,1696623713,1919906418,1684095488,1818846752,1970151525,1919246957,1818838528,1869488229,1868963956,6581877,543449410,1701603686,1685024032,1766195301,1629513068,1634038380,1864399204,7234928,1698955327,1701013878,1328498976,1920091424,1174434415,543517801,1701997665,544826465,1936291941,1056994164,1140866816,543912809,1819047270,1886275840,1881175157,544502625,6581861,543449410,1868785010,1847616626,1700949365,1631715442,1768300644,1847616876,6647137,1766064191,1952671090,1635021600,1701668212,1763734638,1768300654,1409312108,1830842223,544829025,1701603686,115,270451456,1338462720,1338462848,-889133952,-1,-1,-1,-1,-1,1342177281,124911672,118489086,1034,0,0,0,0,0,1792,2098951,0,0,404226304,0,65616,117899264,0,16777216,16842752,16843009,16843009,16843009,16843009,16843009,16843009,544106784,-9744640,1916928013,7037285,50332859,126501852,1974549571,440583,-236201725,24412732,1125092035,1396912010,-770975349,74766983,-633611641,1526730937,-654055820,-1246113813,9562376,512460493,-947257298,-1057045726,1335888244,-1296037373,-380799725,1035085501,-1187401031,-1296484686,884128053,-1187794247,-1296482638,1085454647,-1187007815,-1296485710,984791363,512434923,512295735,45219886,-1190415687,-1296498254,313702666,-1189825863,-1296496974,229816598,916635698,6267397,-1576770910,512426080,512294958,-1070464185,-1576770142,-947256213,-1057045726,512296052,213451593,1159629576,632416515,-1966962087,2663114,54730379,55254665,512481927,-947256505,-1057045726,512297588,-628685996,55975561,55385739,-628630773,1946374075,1963401739,-2028995065,108259802,126402610,149475722,62176036,-1031108659,141771836,108212796,108142396,321661104,-1976643446,-1073069305,1129052277,-227161346,1193184083,-561553917,780717398,1060898698,-1151662475,-722795596,1534246632,1006632634,1971965402,1978591491,-1021130870,57983230,-1336108568,586279167,-1966253648,1872937010,1010558976,-1155294488,-1930950867,2662514,57999916,-852627736,-17525,3022473,167984800,-1958120256,1392721694,1516004840,24635474,41036464,-1394073424,679798818,839807834,54436544,-1070419733,-352108894,1092520725,1926890243,-105229583,1524251647,512354419,-140508353,1958742529,766044586,1915245032,99215522,-922828546,-392390284,141756205,1965462504,-25761533,-1979434776,1965046791,1542514691,20047954,512335194,-1932721341,1877541746,-397323717,-1326957074,-1665136123,55121545,1912664296,1973198089,129034499,-1672364022,447604819,1364827483,-689437837,1386043928,-1604696204,-1073085333,512428149,512295690,512426799,-2023881896,1398363870,-397158141,-1990501611,-2029823970,1497336026,1128485722,1128470409,1224784058,-1958131383,126397682,-1974910397,1975847617,1519242738,-1962926360,-1996166882,-402435554,-1899158711,55713419,82386569,-1946232599,-2030030818,-1963029798,1124567770,24446730,1128481731,-1073084534,540807284,188544371,-35065486,83486724,-2025591573,-350778918,47828,1008170066,1511224364,1376134120,742137204,-1343743628,41216547,-88462276,-402426625,125044236,57945148,-1979882519,-2029831394,-2023859494,-1957472546,-1962921954,1124567755,1268713226,1133868190,991923011,-1948677158,-2005600993,-343575563,-1564462366,-56491267,-1181758206,-1195769541,168266240,-1155500608,-1014365888,-930430678,-988100726,-1212422006,-1950338560,-1958565126,-1958565126,1019456250,-385649374,540803123,-56620684,-1967126014,1127183367,39118928,1949969496,1967799302,-1576947704,-39714052,1968516098,126505132,1951973386,1946630826,126505178,36497475,172223723,1267890368,-1850720452,58020178,-1174347031,-756546709,606726158,787022707,1589269249,2156555,-253215115,191019523,-1342171672,-352094839,1706725387,583691,-1917835659,11397465,-1406209397,24494090,-389510461,-1053159787,1111750261,1330113259,1330905120,4347136,243263579,-1148138157,1093402883,-930430974,-654114635,1528269614,1726501699,-1949791730,615263986,-385649281,977469867,-1957661247,1118580466,-495337462,675070346,-225763980,-784552914,-801368716,921178484,1949187086,365422595,57802928,1476492009,-1406209397,-1073049139,602473337,207247616,-5222272,838947304,50176704,21555288,1543418601,-1406209397,2042628674,-1913961737,-1832038325,-1978921798,787647432,1958742700,-1053146601,351007605,-1448367476,-1579898714,-1986096246,9293198,49004594,-39714384,1515804674,1968218428,16443395,1974549592,16050181,-650319440,-957807756,-437760000,-393236480,1347944674,-1963020823,1949187079,1916419086,9496835,57880636,-1610577431,-1073085699,1515784074,1659437945,1009218814,-385649362,246480473,1375776232,-402396952,-2023882499,-628664610,-1679244406,1539803648,-385837592,1364393471,535299978,14674013,-1605150119,37487355,512432757,-947256157,45137930,-1014362507,263453578,-931984836,-873787132,80269392,6088731,-402349125,57806415,1476698043,-402159024,1129840714,-193607426,-38934181,1107520186,-1406209397,58031908,1107323881,-225769670,-344609746,1006661609,-385649626,-397148731,-396688885,1211894999,41225136,199756976,-397323776,-380039975,984678236,1118501515,180456009,-1023314747,-1679222862,1536413178,-1563886005,1515782909,-401825560,-398196770,-253227879,1022653217,1007186746,1022128944,-370641874,126549299,175317052,108267836,41159228,-1605361488,-1057094915,-922877324,1274978281,540805002,154990964,171767156,-1018957452,966943920,701687811,-417311256,991332690,50044931,159115344,703091544,72792848,1532380648,-397190822,512295837,45810485,-388234496,511048051,1263720707,-1974782070,1396917015,53812875,1515969083,-1956977291,1159629283,-2024099581,-402083366,-1957486877,1577268510,1398201991,3022475,1457424222,-870322712,1963793128,-104404733,-1041693838,250125561,2018745609,1894659,1583188712,-1168712057,126484481,58052412,1376834792,-388331693,669734598,-396553496,1364940209,-2130658990,-695537270,126522573,28364604,-806875531,-186100984,1435756636,1533874920,-930459055,-1978877208,-397717016,57933995,-386316311,-1595402623,-1957473536,-1996203490,-1962922466,1577270046,-1252598137,-2036379262,-997830460,1355056799,-806763386,1367520612,-873905429,-116200968,7727299,-1781706517,-384867351,-1073085739,-1975260299,118113031,-1958485900,378094359,116785198,1962869878,1538282278,-2028156184,1450240218,-1058513488,334191388,-1679255859,1160153373,1126074627,1007127043,1136620858,977012618,-390419598,-1535880690,-1418559188,-1569502660,-1073552334,-1748111221,632618798,126501632,24263228,1948269763,1007186676,-1057032912,180603134,1023112384,1014133259,-1610189538,-1073085696,1947221187,-1572646852,472646400,-181651085,-29620365,126491509,-31553213,-1979664638,35555800,-1576882173,79364865,-1073063936,1124567747,-31553213,1066027778,938009067,-31552768,-23860478,-1564421952,1364329217,-2029845830,-387413286,-628665069,512318041,-1151859970,-1073086460,1913208003,-9836285,-17485764,-1010237760,1006829728,1008169743,-1961659891,1963131422,1128481546,-1975314550,-371554505,27284586,50045443,292816956,50470539,77799049,50601611,77930121,50510787,-1303077399,45267203],247,[-1190874439,988285106,129939743,753234513,-1966568895,-16389912,259385916,-385941784,-797827295,-393592532,-1963003160,1925262021,1589706435,-1151934841,11862880,394844419,1976106563,126508025,-1468715972,-335622424,-20322123,2031006696,-385502565,126547834,378220092,58000201,1274983145,1023323880,1006793742,35031821,-385649405,-1070399841,1258487970,-402652998,24313491,1352618947,991533243,-1977912614,64654078,64685018,1490748378,-1976554338,50378448,1541048282,-1638345237,58049371,1008499945,1007121422,-385649651,1978151075,250132764,61939435,-400817432,1398407061,773753683,-561553920,-1618104234,-2041527162,82530756,-8656815,1006829728,1960478477,1947090108,-155260669,-1957438841,1577254430,-396960121,1396899921,3022475,1935399483,-112203773,1189610354,1225618425,1034030512,-51881213,-1009153262,-1545008974,1972948470,-385894666,-477366790,54861449,62033212,-1947663500,512318454,-390397906,-561553906,-1319391146,-1325208774,-1979665152,-1966241087,-1326953496,1958742781,1959082686,574374842,-1057035916,-1943212940,-985995403,-259340782,72933355,-401282301,1609049564,378136348,-1605237957,-397409541,1582826885,-1974018425,50045160,-980761286,635962996,50044940,1006937018,-1174179323,1012073631,-1959693053,1392812830,-1961391293,989868062,-1961790502,990075934,292772570,990063803,-1341492262,384231514,870898311,383707156,1457424222,1515372264,-1489190053,417870453,468510973,-27268983,225759755,-1963438104,1540459253,334037874,1293322751,-1596296701,-1073085617,-780877174,-1979701088,-170989104,-1978866200,1021872647,-402295667,1267276722,-906048886,58049930,-386090519,742194714,-286546059,167989152,856192448,55419840,-17471767,2663104,1954758528,-34084846,-771027851,1944588404,-1564462338,-389872817,-92930921,-1070462997,-33337438,55026112,-1962922333,1963150110,4161765,-1014824075,401163012,208726041,-1073030539,-1528233099,-182392323,1375734458,-1645731980,1591379965,1951850119,-388331754,-1960043738,1946370326,-40638456,-504822924,-1965389836,1975716551,-42866429,54599305,1526939298,54468233,-170137255,-1979437848,1965833223,-65411069,91523388,-853874200,-756526261,427055953,1979451112,238863105,-857144459,1947024637,-69146365,50470539,-402540861,-1073021399,-454494604,1973501179,1976499954,-388895762,65732970,1261542376,1979436776,421390339,1072235381,1977039873,661383427,58052156,1006676969,-385649198,1012072612,1013806124,-385649349,-396820201,-397212759,259262371,-396541464,130421442,-1558279392,-855114236,-1558279271,971526916,-401771492,58196273,-402640407,65750401,-1979700832,1958805224,471787555,1726482292,-351827387,996730883,-1073065125,117575284,-33262603,1925528264,412739587,316598363,-9705125,851024589,-383874304,-388431100,126491624,715135093,-387413504,-12829902,-986051468,1827144562,-385650152,237764743,-789119885,-397380885,-236389625,1011898378,1241609426,-1073035638,65602424,47616,463923283,-1628959372,-385648640,-286785515,-1610355900,-662044631,125092094,2095579319,1541048145,689545704,-768845749,-1189907373,512426034,-654113559,-1977913368,-402426617,-789169474,275956226,427081982,-1978140952,2043215554,911619,-393559810,417865904,1976434199,-1998038023,-21173766,-1070425139,-397323693,1515793542,-125124558,512350346,-1017445143,-1614794157,-2041527162,719972548,-488045708,783897586,-1241337344,-1999043587,1526771767,-399907095,-1073074637,1954888899,866314499,-2061954584,58008380,-399496983,1944591664,578480128,1380926696,480766035,57891162,1360610793,-402606766,-1336209083,-57415421,1684361791,1919295599,1931505007,1953653108,-1975320563,1975519751,-225253117,-227204548,1526766569,-854791333,54173852,57982986,1509061609,-401272645,512452107,-389872829,-1152176236,-521600522,1948466176,482273522,1360366777,11543100,1604517808,-388008700,126488795,175451196,1604501554,-107091964,1877476587,-397198568,-1017442000,73375827,175423498,216547248,-400510954,48764423,57891100,1360568809,983744562,738706947,1398528647,-1337241006,54108800,-386310424,126493349,1965571147,11879200,1290323454,-385649159,574419432,1172898677,1948794111,1965636843,1976434409,-114169627,742131572,-907476108,-561553679,1007127126,-385649620,28376881,-402347614,-1449131934,1959329284,-14685949,84797523,-1930951819,-397714670,-2023819013,126506718,-1955320772,-320320677,1539312376,183042932,738707199,-1957493013,218324510,983744562,-561553917,-402330794,-399763550,-2023874280,-1974315298,1949056007,54173706,57982986,218139625,1386397746,425912324,-1947663500,78243886,-398953136,-259327845,574417034,983567988,-1967126013,-1241352976,1261221178,1477424872,-930479356,168055456,-1023314496,-628637302,1578551995,1381424775,-386207511,1348008035,-1682373316,57889046,-380438039,-397716739,125106255,57945148,1593729257,1263984263,1962426088,-9705213,54173786,-628637686,904463220,-379891177,1659436450,1975519994,126501653,-1308161469,-385649404,-1958481714,378094359,149422903,1971600632,-11540003,-417933848,-402651927,1260918478,-1320025930,363194369,-1293378099,-1564462591,512296104,512426834,-1973877934,824084743,1944468483,-381893887,-382962318,209047690,1006828448,1975683587,282519811,-445445060,-1241284421,-1965423872,931802821,-713832902,389986641,-842626479,1954495646,1917926500,1023288429,-1603832710,53215995,1038680949,-4191504,2030347062,1173763,77936383,149488506,-1623785728,-1590231292,-1979513852,1374194378,1360536505,53550731,-1224776727,1927687168,1929591860,-805225424,986067664,1945144006,-270604029,53550729,-336120088,1399187680,-1186187288,2142659881,-397227541,1398428595,-350539335,1019579070,-1023315356,79319633,453229412,51505235,1994982260,-1558279169,-927378684,1503456037,-56442486,50044930,225822010,678691388,58000444,1929412585,-1963947463,1946696901,1019644462,-1973980152,1946434757,1019644518,-385649405,1702096764,-1258050885,64553728,260714201,797584963,-1558279334,-389852924,635982604,512318284,-1990523743,1493475102,1264248922,-1152190488,-56622186,46190594,316181187,-1966921017,529215224,-980753409,1274472528,50045528,-747371460,-1558279845,-388895996,1515803287,-352083781,1642617805,1248192587,1531652328,77930121,-1558279845,1407576836,1357437575,1172855626,1246357579,-397657111,58062387,1945036009,1355606275,1914064616,14412035,57876540,-839483415,1975582367,23783683,-381892354,-365111948,-1343683723,1965177856,221112579,58053436,1006759145,-385649370,-717487919,-387445643,2662645,38004819,-734215333,-655880843,512447477,-135789753,1019435850,-399608358,-1679231545,591144980,-1192751755,1088967429,1541048102,-402652183,-2081939719,-2024593132,1977289690,-153229053,1531678184,1976581315,33614083,58054716,1007717353,-385649208,-600032304,1290339189,1977498670,318368003,58054204,1007644905,-385649275,-616814024,-1528233099,1976646715,41871619,-386047768,-1020718034,1575517622,1377733629,-689417469,-389850269,-2024596076,-1558279718,21096452,-1343749260,-1966908598,1918974983,1937456377,-1017174795,57943612,-1158255383,417857536,-1709835,963923772,880101436,-1975319115,-2758649,-2028655896,1007317978,743273274,-347508176,1934048262,53947459,64685019,182125531,-2015851837,1976434394,-309532207,-187307957,611572359,57817148,-1175622679,55642064,60584667,60322523,1502900955,808190133,-654063478,-705963385,-2025154072,-1975270438,1015098375,1393456391,1022663400,57957160,-1337335575,-805260025,1372097216,-1963686168,1929723073,-58464222,739463656,-2025220888,-1558279206,-561553916,-628665514,-2029754904,-561553702,-400430250,-2023817474,-1014343970,192023612,-1580393668,-402427053,-1168420741,-1336796715,78160385,-855590471,785974176,-822204417,-2055935428,-2123092676,725403390,1019412853,-1610910487,-20734389,1505759936,-16464606,-118964198,-1240470711,-65869734,-145714456,-1558279725,434723076,50045180,-922875844,-922826498,1355123395,1481668328,1970945114,1250552067,58030908,-1186437399,1011967244,184776006,1346159578,-635239563,1966881987,-1009110269,91566652,-738731469,601094083,-1009518630,-806757845,6529096,-1343749141,-1967063501,-1967115560,1233447416,1375743720,1593717224,-1957241209,-360425,-1125579915,129699572,922702693,-1605237936,1011876603,-402426621,-2024272649,77839322,-211687221,1006633145,1007711003,-401837551,44102483,-792720893,-2016900400,1227738,-628631293,-2496317,303097938,113436903,1457424222,-1017440375,-378220484,477417788,1393687016,1158804968,1192358376,125098636,-418256408,-1996055576,-1023193066,-402525208,-628686368,-628680823,675022730,854131572,-219027211,-1977925656,1965636615,-182195965,739359208,-907481365,50044929,-1991196662,-2029825506,186616794,-385649189,126544756,57944124,-402600215,512357051,-628686031,55713419,672237032,1397801010,-2135893369,-402441822,-628679952,1457424222,1342372768,-90445742,55713417,824084827,1105745923,-402345727,-121958345,-1948515329,1207560419,1342372768,55713419,691799946,1005065076,-1957483503,-402444002,-349433550,-459122511,-1073063933,-73249164,47874,-1075258365,572231,-477373437,-33311910,-225752381,2025851564,1246382838,33749920,-1595372861,-930479132,1681704194,1424556914,-1014345485,-423952203,-1965489405,14674120,1360840121,-191239855,55713419,1408367336,53550731,688966120,512316080,2090861361,1342440451,-930428720,1477416680,-789133174,-661995266,-603717705,-1168907381,-1628961926,512318208,512426874,512295908,-880082052,-1174176069,-2031615002,-1963423232,-467760680,1344178947,512312068,-947256240,1302512394,824085252,-107943933,-242358197,703136628,-41031446,750391669,-1558279421,1926904580,142403590,-1962350872,-1979483618,1137937143,1125091907,1094791050,2059092289,3139587,-477373817,72359563,1344178507,180849156,72196803,609441883,59554567,11913354,-51848957,-1950131204,126397682,-1974910397,1975585477,-1957444622,1124085278,1968954123,-385043724,-404166194,-2135895793,167983522,-372733433,2117867867,-1645673612,126501865,1971534915,212134147,58040380,1010282473,-385649246,-2115422016,74836201,-370353529,1642659129,-1477946876,-873976817,-389850624,-1007747088,1392503784,1258336848,1961933544,260892679,11593772,1592822360,-1604919673,-1073086370,-628683915,853182444,1959142082,-373072914,591194420,-1763165068,-57546504,2112378997,-1228502496,181466624,-385648192,-796200525,256436306,7137324,-997810342,1405388368,46303826,-1328510272,-997810412,-372996528,1357389832,5040368,253814864,4515884,-397257896,854073543,2042628666,-244193021,394811971,787006299,867756032,738208162,83653390,-19859940,-1564343616,-389873622,451473427,-1662495752,1541048140,-1073035638,-268310333,-386397976,57999339,1274098409,-1963986200,2145960898,-387429387,1503841775,1374352104,-1960306200,1258502942,1961875176,245950478,532932652,-1070464334,-1155426584,512360447,1978138670,-1341819632,7315969,260725339,1127189059,-1056258678,1038680949,-527374103,132645749,260722957,1127189059,-561553839,1004177238,57891290,1592336105,1398201991,-1982167215,-402437858,-1973729878,1946762247,-400510971,417860595,33012480,-402651672,-1746203469,-1073084534,-389873291,-347924631,33012211,-1070399562,839056546,73310912,-349734424,-29146874,-1965067058,-1950348793,-696997127,678562620,-796254148,574371954,-56620427],248,[-1576979454,581960444,276118076,-805110624,-804818216,-1560468272,984613628,58310666,-1979695895,1949187280,22538249,-1070463885,1587550443,1958742532,1975582223,-1960792053,-29250823,-1023314482,1587675568,1019382276,1007120907,-385649888,-108330697,-1602032726,-657456388,-657439886,1383323856,-650377334,-1514450605,-814394592,-1393456311,-948613828,-1393456311,-1082833604,-1393456311,-1217048004,-1393456311,-1351271876,-27568040,-20513082,-339280186,-1973724883,-13244153,201522336,50110978,-1597784014,67896060,-791612437,126543730,58033212,1023402472,-402426481,126549989,126533886,-1975319179,1132405767,58040636,1011087592,-1979025999,-381926649,24424880,1381061451,918266829,-1310160383,1136787008,-745867382,168266286,-1611500352,-193356221,973572654,-2014808635,1959804122,-1965999102,-1973855551,-1609796144,-1073085346,1587675312,1008069380,839349595,73310912,1587551723,-1329591804,73310975,548408692,1101724043,58052350,-1979341591,772205506,-1975318646,-1954601776,-29250823,-385649202,-1039530611,-1472403079,-1070463627,1527013026,-385981207,24251839,1915763907,-180732677,-1998042173,1347506925,1492001256,1361163705,58002236,1010983145,-385649396,512442979,334037762,-1604691633,1337066240,108268348,1219628092,649073781,1101724043,-1066086658,-108281206,-822197846,27309684,-1308345341,-1308200448,-1308462047,1007127075,-402426592,126501714,1958742595,-1426486486,1959722561,50438287,-361626564,-1952560737,1100983537,1006925214,1007186990,1006924868,-1294764731,-1966085376,1958742722,-1426486519,1976499777,512475905,-1360461058,-403576579,32893009,1364286041,1944592616,-1963488757,-561553709,-633646250,15270770,120437742,1499002600,1577704891,-2024350073,1478396890,-1393390845,1101724043,1977236290,-1982231564,-1023191010,-402640152,-1910627133,-1979494370,-286712057,1501432,615639122,738941416,1526496744,1342606854,-1426420989,2062074631,82334708,1541048064,1806547395,-127276975,-1530005896,1006937760,-387091056,-394766165,-1186430232,12226944,1077602560,1358957241,-712313462,742143348,-397276300,-292885132,1952107146,184608806,-312022996,-396878476,1378618102,1961715944,-457774845,58053131,-2014491927,-561553702,1373275990,1525107944,1189630290,1524206567,-628630981,753468275,1482250989,367743571,57923843,-2014503191,-105163814,1541028863,283706227,395006701,-628633077,-1978895270,118113031,-2019669089,1372943834,1493181672,-1957536934,-771013865,-628681612,1457424222,-1992041849,64653079,1541048281,-1246108437,222056712,1034076210,807308035,-1975301376,118113031,1136853365,-398256245,-1073026181,-930419596,167984544,1958841024,1017498971,-401050201,-1992496285,1558766709,1963867371,-1394060579,1976699884,1009380106,1389131022,1408016104,-1612280600,229678665,2028486514,603765512,1466558546,1096869979,1364417369,1531007464,-1544860838,1701080661,1701734758,1768693860,2123118,-361427652,-329127854,1138394963,260719427,-1339061693,603437838,-31552685,-2008329470,260590383,1527220299,54370499,-126566390,-385922583,-398325326,-398390866,-397211222,-1606088282,-1073085347,1860764532,512447459,-628685990,56368779,57989691,1541627113,808191882,1240007539,1912749283,-482154237,-33268574,73245376,-1008036120,168266286,-386370368,-347930621,-997810189,-372996528,158598937,1408402664,-347666712,-759475424,1453713444,1510793704,-1880554637,-1975299575,1157687303,-1073084534,-454499211,203327814,1067378688,1632813915,1836016750,1836412448,544367970,1684366707,858597408,943077170,544175136,909586995,-1325389513,-1325208803,-2029996774,773753818,1511950592,-19233020,216550341,1008170218,-401902302,-1073026557,574360692,-1589840523,-851698316,-1073027979,-1975315083,118113031,58053002,1138925033,-1992091765,-402367978,-1891833385,-397342859,-346428399,1971600601,48779527,-823436820,440189322,225707914,-1552633540,-1586122180,-1653223938,1954692291,1971534998,1959657108,-375527181,-628643724,3022475,1511951187,773753092,1373275904,1494341608,-377362357,1948592826,139520008,2042252076,-561553883,773753174,-1018012928,-1465888609,78225924,1352638040,-1465728974,-1013032956,-1979524120,260719367,1513065027,-689418159,-259368958,-1975314550,797590287,180521563,-1023314490,19711626,-1070401166,-1057045958,-822152845,-242496770,121258412,1956529055,1927935452,1039657023,-51902229,-402396355,803752622,42592256,1361647545,1396901770,1526770664,-1975316598,911407,-388461997,-1017511333,-1779957328,53263104,1124567123,-1017440375,-1977436853,-5155851,-33060285,1958742721,1959148040,1975859716,1965178095,-390993917,1019578963,-32672468,1959395009,126503687,-176938948,-561553829,-628669610,-1259814518,53263103,512447152,512295692,61867171,-402457694,800734743,-1982186749,1526926366,-1686829174,-385871686,-398204638,-320274542,1048373249,-822163714,-242514572,81389740,58002748,1090889192,-1073025813,-1638399253,512446623,-628685988,53419659,-930426634,-654049355,1926904643,790530319,-628669693,1489215064,-1013005178,247111256,-385649408,-1069883190,-625389409,512446758,512295690,12256047,512447232,-1152187556,378209038,-633666804,1948723897,10283267,-1996234053,-1962652130,-1996269026,-1962652898,-1962715106,990137110,-1977912102,1128481543,323348560,1963146328,7464965,-796213198,-637337418,512482795,394986574,512479755,427033434,512350855,1128465486,1128470411,-637281657,72031881,-1209279865,1544981337,1977236227,7137539,1346570122,-118996157,1125091858,1480798090,1020855123,-1981975293,1526936350,11865994,-654059261,-1948612797,-2029833442,1960459226,667269572,180367953,-1639735545,1134499722,-1623749986,24485443,-1949594685,990064414,1926859738,-2023859213,-633645346,1457424222,1943636819,1482185187,-1018080685,-620012710,-1974732428,260721455,529156947,-654114633,-779422326,-1949594805,-402444514,-2007286624,797459215,-380905077,1397882592,77799051,1457424222,1592828136,-396960121,126499821,-1558279341,117592836,1929383866,-545724157,1526586344,1577076968,-396960121,-1957494721,-2029834978,977114,-1157624856,-2023876806,-380414242,1583087111,-1974018425,260719367,-1976595901,-20709672,-1023314485,-1951600245,1111599866,-1830227477,-1558279365,-388331772,-628686816,-1974278795,1255246581,512429962,-633666769,-1070462347,-654055286,53419657,-288504997,51125899,1261406795,994774922,-1980860966,-1023210466,1360756665,855619560,-1963947328,-1010824697,1360756665,1979706856,-413800189,-1961391293,-389829390,250150190,756976630,1494714371,-386043159,-739711489,-135780348,-873966859,-85447676,80013549,-561553879,-320318634,-402295567,65795553,1526708712,-402651672,548468181,-389903792,-393544468,-20578728,-1950583603,-2013057762,-838974713,-1343489675,838902760,-561553728,-1329034666,126505811,57853242,-1313159798,1374179584,1398495741,1127189059,-578142326,-654114635,-1461138549,-388461828,-396689673,-387318003,6744316,-225750438,-339400020,-1965389892,6088711,-838941186,-1729559691,-1243065882,-997828607,-561553762,695581014,986250833,1912648967,-930430207,-1054210166,-393559494,-359992462,-16717629,-1897331851,1137740529,55779211,-2010150182,-561553865,-397717162,-1092033257,-2007279297,-628636881,688120296,-1974379943,15254506,-318510875,-1326382360,376721409,-185341864,58048522,1357260521,738442728,-387126040,-1276626435,-1957483517,1577362206,-396960121,-1545016103,-397203197,-628621744,1364745049,1365575609,1360756665,1156076112,-1973921026,-1966539032,-1341703480,-1952288000,-1073042190,-1720400502,-1975318646,1066025775,11918730,-1054156541,1381099658,1457424222,-1958539382,1381194519,-1393390767,510986042,1959394882,-838974708,1515908981,-1070441895,1515871171,717589081,-20905273,1515832256,-838974629,-437530507,671293928,-401827864,1381185889,-1958487417,1545505559,1926904579,807308050,1943681792,-397190390,1398537006,1530511080,1457424222,738390504,183768552,-385649216,-1974409909,6744071,-335222702,-41228205,1499191943,1592298072,1398201991,1583679419,-1974018425,1958742721,705137296,-385649723,-1057037029,41075002,-846544502,11913726,394937170,-1975547325,-1965489190,-628663576,-1958539382,-1965390049,1975519937,-225721599,1107789996,1959394883,1976434420,-5061647,125053244,738357736,-386689560,-1020722582,1961858792,452867,-386067736,378272636,512426844,-873921745,-1615540753,-2041527162,635982788,-385649660,1482364893,1369359494,317411487,1336066098,-443291389,-389480935,145761123,154941675,548409461,-385889560,119808846,-1638337419,540853081,698359922,-387413504,-973200582,-838988940,58049850,1946186472,1962884105,-390005243,-1638391001,1481678681,578611358,-390738493,1031013308,1930933992,1397903859,604321440,87466696,1528351976,1805670746,1958742532,822798595,168095648,-1157139264,-380432664,1364394221,120437586,1515127528,1527623769,554887363,583854275,-126566390,130419691,57337856,1963062971,-1330197241,-13768691,1946377192,-1010814461,-1394032590,-1010814430,1587591117,1975519744,-991378687,-402426369,-1863777828,854583297,548399187,-1326964364,1975519999,45109264,-1946579992,1510157598,-790030455,2078822649,-796239623,-1141093656,512294918,61867171,1526922146,512447427,11862794,-654059261,-1020647760,-5187446,-125122790,-603781518,-1023315109,2891403,512314187,129631045,-623580928,53419577,1381099891,-100210605,962157147,1929588510,1977871322,807308246,24766464,-1576770398,1034027838,1124567043,-1992095864,-855418850,807308206,-1345500416,54206089,168060320,840398272,73245376,-1258005342,56671002,130461901,-838974716,129693813,768768,842516200,55550656,-125118326,55385737,55975561,50994827,168061856,-1996196416,839069470,8186048,56106635,56237705,56368777,168060320,-402426432,916460980,1963009029,87466499,740199257,-1991554304,1124287774,-1951281853,51297251,51125897,-386403352,-1070405942,-661981046,58465929,-1996206686,-1996233698,-1996206050,-1576830434,1364394809,54206091,-1009108029,-50623650,-1957255634,-1979025953,1916419079,485081857,-642586143,512481927,292814896,1390992007,1256739810,1524206556,199820146,512314339,-628685986,-16943677,1963584448,58039543,-1660248088,54730377,-1996288325,-1157428194,-1957036276,1392520734,583240348,1958805191,1411287308,1126075139,1444841731,-34215933,120765341,350815092,-633214502,-1336930384,-47585186,-398457768,-320209629,1444842493,-1160049917,57999377,-1948695063,-1996270570,-1023398378,-1564462408,-389872522,1397885128,-402362693,512439819,-2023881894,1827165918,937971948,-1377293057,-393586680,988569320,-385649467,-2023827192,-628664610,1511951187,1977236227,1583045139,1381424775,1530254056,-402362694,-1017432629,-1327405335,54108673,1963488232,966939635,-1963095549,1229539801,1236070795,-126304246,-637318839,512481927,-633666724,-1951599989,1117760249,-1639866466,-1958088587,1545505241,126507779,-1217057732,-337648920,-997828426,-1966908514,1916877831,-178569991,-34674237,742194036,-68679308,-1058518048,-387025697,1949105810,739675112,1949056000,4712451,-542513077,-397511598,1949105786,3663944,-543561653,904463220,-561553704,-289713322,1943681792,921197357,1395094016,56106635,50336953,1943682009,-1982167271,1526925854,2891401,-392762533,-770968848,-1729559691,803849184,739675133,169224960,-1950684413,-1950209085,-1295137840,-383874221,1541081860,1311769027,-47128272,1529868591,456142896,1444842288,4909056,-339541644,-352210940],249,[-1560301566,-1057095568,-1224645144,780289,199813237,6219807,-1597784014,-1019608996,125040756,-1070409590,-31525399,519104963,973101984,-1327270717,1958951425,-372506915,698359518,1959213568,-372769071,512433874,28770395,5774985,-1960917527,-402631138,-1233846263,-1979700832,-1329206280,1959213569,-372244823,1537220266,-1594324480,-662044580,-1770862806,-397360898,1486880921,985923072,1942748867,1925659149,-1342016247,-1563886079,-27787176,-385649208,-555220989,1537262366,-1596421632,-125173668,-244137174,-397360898,1486880895,1925396992,2026322448,649475,-5242251,1487061246,-922855424,-1142304908,1528728350,6135808,-980752246,41141050,-952444790,-125173133,12044170,-1057045718,1342206650,-637281657,-2008873080,-922860793,-628622987,-1564462504,1503789144,5939712,1358900201,-1258276888,-1966568959,-1426420795,-1393390774,-930420342,1976106584,-347028735,28659946,-1979705368,-1949988152,-1958565126,-376787726,-27735926,1357018312,-1168905237,11993204,-637285378,-628684918,-1010818469,7649875,-872546121,126409219,-1017390457,1105766093,1444842241,1478396160,2727936,518766846,216547248,-400510726,-1070401017,-855627870,18802855,5643915,5774985,1520617354,81913856,91540478,-1343749712,588048639,-400342552,149429156,590932003,58048522,1344042984,5643915,2696842,507167998,309657688,5848634,1049101427,1043988569,108396634,646506378,-396885926,275906607,65583988,-107354110,-402541589,-1377044077,1962476348,-155454207,993837825,-118883467,-29144100,787642569,-160102598,848608195,-320336207,-385648129,844103687,7512768,849525592,-655881039,-385648129,-1974468576,-792720703,852003520,-1142388032,-654101842,1125616174,1480034862,1444842322,-1073036544,-1071512637,1444842435,33521664,-872543371,1979635688,691964423,479258624,-1007034647,84279821,470551299,236920349,168369023,100798984,235733765,889133951,885666902,867119929,891630855,872494413,854799479,233321409,1489532157,-138674507,-113121279,222037896,171708788,-980810123,-311099844,1976434243,852360936,-1157134144,-1597832714,-1073086350,1642609268,-628666114,-2030041146,-389808422,698352425,1959209472,1354825227,1476457960,-143275778,5643915,1493056488,-1070413686,1118501515,-91504246,-1010814294,-1073083728,39512259,-1258162246,5808382,28820282,1962944928,1478396691,166220288,698374910,-1610255360,-922877862,-402629982,-980811204,276086818,-34674606,-1224116902,-1597768191,-454361047,-21964153,-259340758,1007127115,168326176,-33065536,1258517710,-968626197,-628686841,-1219490384,461170689,-51901008,32947191,851704152,33006272,1979557864,-339476988,-352079625,-20477219,83371208,-1967063544,2728168,41141562,-980752246,167801504,1975880384,1959213580,-386364923,-1070458058,1959209667,1352683771,1370112,1492626152,-243939074,7512259,1923272950,-1010814464,1444842323,1923108864,1958742528,256003,-1597809832,-1019609000,-1152184203,134086746,973089184,-2013105401,1352686343,-389510656,275906959,844160116,-47650624,-420953090,-872523775,28820478,-1605114901,-952500183,11996021,973102496,-33524285,-389546301,1398472713,840609256,-1329374272,1959213569,-338690556,-872525036,698355316,-386364928,74841296,1457424222,445179995,973101216,-1609927229,-922877862,1520567156,21161984,-55646125,-1006759563,99090871,-561553918,33286230,1541860187,840586728,-1847016512,-1609861636,-1019608997,-1006762892,698413291,-1594324480,-930480048,438495313,1958742617,1958820364,-389546488,-1070458326,1959788227,-387585036,28770452,1394219496,-402632544,-27590227,2728135,-952450818,1105784181,-1213893124,-339476991,1879492322,149618688,-400955928,259129674,1946173672,-386798829,1005066710,-402164991,74711089,-1070403093,-1564462397,149618800,-400966168,259195170,1946167016,-386798613,333978030,-402165247,-596377577,48820715,-1949046016,-402631138,-864683324,-1763114569,1444842490,-85989376,698400373,-369587712,-872482150,-1041758860,-17337093,-1605254205,-952500134,1743264370,1501209,1118501515,1457424222,-2023829506,74733278,-538195970,-1073036455,548405877,4581571,-74782640,576198004,1022457024,-1595050976,-1053163440,-1047861644,1489223714,698401785,1959213568,-389546471,-28114748,12314831,-1597505957,-1057095639,-344602822,1352716286,11003904,-397323325,1348010148,-1696022134,-930457600,-33543776,986185408,-1964542521,1405311937,704666784,1949266627,1528728354,-561553920,-1014344874,-1610589278,1554120797,-94705664,-561553829,1528727894,-1219273984,419031041,-385765285,512490246,-872546218,-1410858124,-100734952,-1010041253,-76402628,309475900,-210616004,175266620,-344825540,41057084,-1071463431,28791747,-1979700832,1709724136,-12822248,-939653004,-243937794,1398522715,-1528299081,-373073128,1240012867,2662936,54992523,-1021130998,-628637442,334227572,1946285755,1134361057,-388860439,57989500,1540977385,55121545,1926461672,-633542397,1128520075,1128470411,-388331693,-1973735858,1946762247,-400510971,-1125583721,33012712,-387405336,512490335,-872546218,-872543884,904398196,-17337094,401664195,1020371177,-385649654,-1957432213,-1979389666,1539508935,141888176,-401756080,-1017580457,-1326165272,-196220915,1271073456,1977073384,-1880571135,1538862326,-927968969,-1070464277,-1979516254,-390869745,57931721,852508649,-1561818432,-1975320434,1915632647,1007514690,1006924602,-402296016,863172523,-1252923254,9353983,-973176820,1118501515,1007127107,1006924602,-387091664,-395053173,-462148036,658294154,-169278606,-1901962801,1007127040,-1172409562,-1236125693,1948597250,1019674244,-1023314652,557631230,146209140,-210492612,616663640,-1227847041,532370176,-1965423869,-1974772937,50045638,-1596517656,-922877127,2062091125,-385648639,126484496,58009644,738250217,-385649357,-1070464826,1392720290,168054176,72000192,512433780,2126119804,-1982201085,-2029761762,771221978,168053408,841249984,72000192,56237707,72031881,56106635,-399647511,851705604,-1963947328,-2023859760,1539528414,1457424222,946518610,-411772357,991550138,1232362202,1457424222,-73379501,-1595373054,-989724530,-930430722,1090565457,512442689,55771996,-397190695,-1990513639,-1962714082,1511950809,130435843,1977236224,931683064,394877507,31320131,1531107975,1116137667,113641707,-385875121,1088948856,-1157138974,512294918,-1017445213,-98661549,-561553918,1391495766,9353809,179106443,-2026015552,-805174054,-389510440,-1047858237,-1975316598,-28228817,1408595400,1342213792,686348935,512317655,73072821,1507381250,1261406283,-922873976,512488821,149618869,852953832,9347776,168058016,185103552,-385649198,1498021983,-1631287720,-2023826809,-2024581410,-1967063334,1007127280,1015575596,1007121449,-385649571,-1662464448,1377733077,512318211,11666170,1393027922,1355056799,512476294,-1343683750,49979436,57982986,1489903849,-1952529274,-385649205,120204117,-1729559691,637440,-1597105687,126354171,-1227847101,-997828608,-385649250,260571338,-399538109,-1975320365,-218765112,512312131,260571953,49979459,-1047867184,1352601458,872701088,-1245148661,1939757056,1100962052,-1626371938,797459280,712697923,-922837416,1352653429,-896864630,-637281657,-806812813,-220403470,56368777,509515,-126494149,-1975402446,824085488,-2028500477,64685018,1272612825,1125615947,1922979907,-1964471738,1124567752,395008950,-2023865533,995120862,-385649958,501808975,1490682666,-880031490,-73342091,63671042,1912876251,182125320,51082432,2059406043,190723,56219907,-1948612647,-1023192546,1539316473,1124567747,-1979665071,1507394504,-1621995069,9353808,-1968377205,-1949958424,1128443122,-838989944,-1638337163,-389850790,1793645658,-215947223,-1948612805,-352017634,54173706,292864010,1406830426,983744562,-1665073661,170887762,-385649171,-1958488737,-1977292001,45175765,1011025802,-385649316,540803485,-1040316811,-327823874,-1326806437,30861404,854622952,-1966044480,30075120,126546058,1965112387,24111363,1383342908,58009148,-33464087,-385649203,725352750,-646707024,1124567627,1433677372,58023740,1006712809,983331932,1018590471,1008235556,-1968278230,37503941,126485618,548414524,-838989195,851362558,1125123264,-972897538,-1023479670,-838991695,126509428,1949187139,1948466206,1965833453,214338083,-336557504,1007127265,1949216803,-10098429,-29163087,1959657153,1124567606,-210492612,1005894226,-1963488686,1952333011,121291521,977533813,1140225287,-243988678,751143491,1525314052,-18314662,65749958,-1973757305,-1023521850,477431844,-980759810,343195658,757860234,-29620620,145754741,-972946428,-838930294,1702141275,48779857,1364810459,-1964340653,1019282117,-385650151,-963980253,1558741004,-361240517,-655864997,292878802,1006844578,1007121467,-385649620,-991376536,-628663854,1385976667,-987101302,-1979664829,52399056,180718298,-385649472,116129453,-402621464,-1654919385,1491665780,-402426882,-2023821337,484988638,65625068,1575535576,-1966211584,82330375,-1312101393,-1325012224,1476520705,1172884990,1956469504,1860719056,662694106,-1957473959,-1979407586,-1979665943,-980791099,57982986,-387145240,512485860,173540515,-385649216,120258398,548464778,-838941186,1340670837,-290330369,-1974405909,-1329591610,-402426837,-1017581917,53812873,-387453720,-628633073,-1627363608,1151311428,50886046,-1981576231,-1962719970,1392520734,53812875,686510675,-1981217932,-388331574,1735721023,512353163,378209093,378077230,1128465498,1128470411,512302987,-628686802,1406782696,1529316584,-1313273484,1374259712,-1949205015,-1996203490,1526738462,1877563737,310225,-1975264253,-2101787897,1975597568,1227015,-286533373,973124025,-1023314751,112793401,66614272,-1159992359,803799070,121301194,-781326261,1927828852,1827165145,-398625571,-1947716854,-1558279192,394937092,-1959294397,540847346,-2008938123,394808119,-401605045,1264314588,1959869160,1950039074,-267851771,753421100,-399724335,-1158943313,-1461181776,-390403859,-1595399504,-388502547,-1947603353,1403571670,-2014776694,1007252481,-401640390,-143064706,844879498,-839077696,-963984469,-922828246,91423292,1642704077,1912945865,-916788989,-1974381991,-1159165240,-2023866724,-1974249762,1918974983,1937456134,1361062914,-225711990,1111731246,1968817466,1976172053,787647458,2025851564,452867,173693787,-1073036352,-225711240,-1073042386,2040414879,1540197109,787647315,1975519916,-922818122,1145198923,1380144127,1347223118,1140666708,-63876287,-1856472320,-1118263464,1403637080,-997810350,-1161525680,-637337554,120258480,-796213246,11971277,54440379,394931930,931802691,-1631287720,12048522,-1976641021,-1976679657,1524270903,1457424222,18371,0,0,0,0,0,-402653184,-397158383,126544268,1333051402,1125616195,-628473974,-1070411638,-402194526,-2036334885,-997830460,-1241190215,-20775413,-1974635318,1914715143,1949187110,-1426486488,-822197439,-2040993419,-2036359484,-997830460,-257888118,1958804996,-997828602,-373072994,-347879384,-1576947510,-964032769,-277607620,-344849604,548465780,1101724043,-353644802,-108322640,-822197846,-1158941067,-29161590,2062074826,-1596421409,-1019607841,-370605197,50378695,-1948612645,50651166,-1608545318,-1057094346,126540660,-713768950,3062355,126540291,91425084,-1058415411,126507975,-1007042550,-818550709,58008380,-389075224,-2023825622,-397191458,58064811,-1983407127],250,[-1023088354,1360304313,-1965613848,1965833223,-1847045287,168266472,-385649216,-1958492292,604473887,1006744287,-1307216823,1951349762,1006940687,-1308003246,1950432264,-950736637,-1343729061,591146221,-790101131,-556996402,753770984,-1073036662,1038680949,-1293397817,-1973856002,-371339823,-1444413309,1007127294,1963242114,-827987879,28476732,1329352052,1228677236,1810380660,1743274477,1676169453,1609060589,1541948909,1474842349,145900781,2028481771,-313726770,-313989035,-314251180,-314513328,-314775467,-352144812,-832706543,1122841064,1307389416,-397729614,602459727,535314925,-1974316051,1965243399,-834803709,182335976,-385649216,-556939600,-1974775116,-836114224,-974584972,-561553722,-1614640554,-2041527162,-1662495804,-385649410,-1973762411,-855032634,-385649697,-1185692029,-654114770,11548552,-40769189,1975519827,87465994,57934116,-402438423,359988843,82386569,1929556051,-42866429,1357504717,52750534,834294619,-1998978304,-1963423225,-383874600,117594884,1526728646,65796547,-1614794227,-39851952,-1638340147,343167135,741083018,209043466,-389179672,1481829482,1352661406,-1070444385,1424490930,-383874049,3258628,-1638344445,-2145075174,916586764,-1617012731,-1564468656,126485743,58310666,1476450537,-402426722,-1070404777,-369218328,1122551557,1273679357,-1295169816,58063232,1946515944,-334436328,-1303364564,-402229870,-335950545,-335484920,-1296037311,-1974427902,-1576000318,-1638398878,-1057075041,838885282,-19011392,-1957454248,-1979389666,-2145101049,350815093,1676170205,73572577,57982986,-1962640920,-1996269538,-1962474466,1392521246,82386571,167823080,-385648192,1307115542,73572549,57982986,1527030504,1654833202,-20387580,190555,-1595349013,1979464704,437119235,535423949,807308229,-390067712,1189675011,-397369600,-63176573,921240437,-845260774,-989795860,616799832,73638432,58039896,-389746199,1671490167,73703940,838904808,-51255104,-1988098106,-402331362,-1073086389,-305286280,-1597713431,-1073085340,686293876,-953686012,512312131,1525154648,-1564462358,1139279158,82813182,57982986,-372508183,-628636220,53419659,-633611641,485005426,-1564462358,-337050314,-1957538839,-1174083298,-637337554,1532626826,1394505155,649744465,173101635,1498989504,-260454146,1532609371,742131594,-454494347,126505419,58008380,-389293336,-2023826474,-1168943394,-112049362,683271167,81764417,916504555,2025851397,1093188044,-543113166,850324228,-1964471616,-63838011,-1610610746,-973208353,-277625558,916635698,-376051707,3153547,509515,1539562473,-1631287720,-1622060461,-2041527162,-383874108,-402214908,-473104379,-1614550039,-2041527162,-628665660,50343611,-2029548838,154950362,-890698893,-997828608,-561553762,-454468778,1381192186,82386571,-823654224,-370881025,1532674996,820560729,-368777013,-369039324,512447272,-1152187159,512294912,1583023337,-396960121,-1974281454,1965833223,-888543221,1543228904,126533682,-739749729,-1638389271,1457424222,-1014345569,58048522,1405888233,-2015229976,-1638376998,678711455,1021843176,-2011991037,-906083577,-1638339467,512318297,-380566295,-1638342093,3022475,54992521,-1022957221,1946118888,-1020204797,-439495189,1392513768,48759221,851663616,1124567232,-109720066,-383874109,3389956,1489230339,-1013005178,1979385832,-1023743741,57871024,-839249175,-1024529946,1979380712,-1025054461,57871536,-839254295,-1025840665,1979375592,-1026365181,57872048,-839259415,-1027151384,1978335208,-903878397,1206435890,-381504772,591184626,753446261,-385554214,1405258284,1543176424,-1178400886,844180972,-64689728,-1177149720,549066395,-1977912020,-1189614634,-397339496,1374224332,521922802,294304082,-259342286,1364250762,-22681517,1810432883,1965046978,-20513274,1022260686,-1978436318,1019382504,1975880236,-1963619831,-25040683,-138718350,-1962953471,1019644616,1958840866,1393376302,1012619636,-1977322230,1019382472,1958840876,9037827,-27924397,1009152603,-1978895091,1948269762,-1339278315,168784909,973829312,974025926,-401967934,-397213597,1935408687,574378930,540804212,552084853,1008759550,1022850080,1008235564,-855345907,-1961855775,-1979389666,-401428280,-489816611,1539425257,-1157625914,-1031142922,125050924,1726480565,-389850144,1352652087,1489578728,1934663582,600107011,57843288,1529070824,1958742723,1124567291,-193606146,-389682343,1621229638,1958804992,-1046550269,45240659,1543161576,855391208,6333120,-386131223,-1073086426,-1057093772,2112422773,-1563885887,1364394080,28491826,1543151336,855387880,6333120,-87234213,1392030952,-927340469,-1341950630,-397229311,-399710330,1263665195,1976084200,844781829,1944634304,417869031,-628664064,512350467,-628685052,-930486197,636027764,-5219647,-796399421,-602806189,-1009088678,-1962079303,-2030030818,1478396890,1977236227,398181121,46369378,-1965520191,-1979706169,-1393390600,841925930,1991987207,46369377,-1965520187,-1979706169,841898232,-1950285305,-29185286,-1325238839,1976434187,-351423044,218872248,3153547,512481927,-633666728,1992011636,46369377,-1965520187,-1979706169,-1393390600,841924906,398151687,46369378,-1965520191,-1979706169,841898232,-1950023161,-29185286,-1325238839,1976434187,-351423043,512447417,-947257298,-27540702,-1023314752,1688227999,1958742532,-923408125,-1966891432,1967143943,-944904189,-1979711303,1020365557,-1977649942,-1664140281,-1729625227,-429070137,-679548888,-429594542,-680073172,702963176,-1957454503,1946500382,47875,-774306913,-690905378,87891593,87498377,512478091,57935163,50331835,991857114,958302469,1541048069,-339725629,1342418946,1493148904,1392520936,1929586920,41936902,1526879720,-953030461,1409256680,-1157425944,175374335,-402495256,-662044133,132645047,-1329374435,-1974316797,216550352,-401902393,1009575390,-402426836,-1031088386,46262355,820577139,1499093960,-1949896727,-1979369698,-1967052093,449284824,1945668293,717238981,450398915,-1966921017,-1950090760,-1979369186,-1966986557,449284824,-336033082,512447454,-628685511,87629449,-253181093,-1957604353,1577400094,-1990795641,1493514014,-488062117,-397258242,-387259030,1994981101,1952013055,-446896045,-447158228,-385649342,1340604512,-397195547,-1041759651,39315711,1946131688,-5642237,1927828291,-402426881,1396965295,1510055144,-397323687,1397752027,1776867975,-396862718,-119013161,1230657792,-1056258678,-1017388171,-397192623,512426053,512296253,512427319,512296251,1515914553,-1957444775,1392851230,-388331694,-1990459430,-2029700834,-3086118,958302555,924748549,-880062203,1543487976,87498377,-1209480309,-842834945,30402744,-385928216,250085833,-402426881,1397948200,-2013338392,1240579034,96142195,-561553846,1943681878,-48330476,512318214,-709163273,-115439287,-338000122,-561553898,-115439274,1238743814,116858505,512350855,1515915005,-81884845,13887494,99111514,-381593344,-964034016,-657407990,-1031081846,-796206896,-216101949,116760582,-216102461,116761094,-216101949,16482566,-2130087392,-1994391317,-1022954722,542163841,116596361,-216101949,16482566,-2130087392,-1994411797,-1022954722,536920961,116596361,-1967027517,-771730162,-1979255538,-1023315256,116590335,-1967027517,-771730162,-1979255546,-1023315256,116592383,-1077506877,-946948096,116596363,-1979217370,570881302,1427016386,1927991808,-337063420,-1010397448,12568204,-1949856072,-1962478818,116760809,572969206,-166819321,-183623162,650185222,-846526584,-1950103922,-1612000791,45210251,-754720045,-489487183,-2130414690,-1994391358,-1962478826,-154498347,16798982,128980084,-2135898078,-173872942,-754732794,-216661526,61915910,-922564574,-388841296,-1324943966,32166658,-1022954730,-956282720,1678064390,1946565632,1008497426,-971476476,33576198,87885511,-960298848,16798982,87885511,-960298688,21766,1929657539,1426519567,208929024,-654966492,-133761374,-983701053,1437664036,-157097482,-1597769722,-1073086379,-318051468,-2135218312,17204226,-1157401600,-885325504,1258517151,-167064693,-92205960,74580168,-1023359046,-768359522,-1614203965,-963843861,-1900543809,198413255,-1955826478,637989662,-174051446,-153056762,1427016400,-165770752,-1964498426,184230652,1081363183,-858601262,512487283,-2010773773,-217645265,-182024186,-775255290,-152448535,16798982,-494860683,116064259,516737,-1411126831,116826364,116604555,1049209587,-1679096077,116596363,-2010150874,-1912146650,2145960902,-48888834,-82429178,722039302,1040644886,116987647,-149487810,-1008475642,-811341741,-397163685,-1017439961,1899921654,57933824,-1023084055,-1979700832,-754980656,323049,263454720,1218580685,1009300480,-1274187262,1963408464,185383175,6819465,2696840,-1982100230,503533598,-1912602438,270436826,1295301381,7085705,-1990769477,-1946128354,-1946128882,520122894,-1157614872,12124696,-1178497536,-1943666566,637534863,1284769735,-536558717,-1898214159,-515315517,-855526149,108521495,-397632581,1676226271,1290649138,-1190767685,-61669366,126397486,1975519811,-1014801418,-1007689712,788479695,1422591744,1226859880,1344294210,1869836901,543973742,1886220099,1919251573,1935753760,234840937,1936876886,544108393,825110851,1866670128,1769109872,544499815,541934153,1886547779,943272224,917297,1093481778,942502512,1397312561,1375739988,872021,1145130828,1095958562,2245974,1414418243,573308941,827609164,860730,1313821268,1381236749,222709327,1497713408,1129512992,1313162578,808202272,864300,1377718428,-1912602438,270438106,171632645,6952584,378063614,525992030,1456446808,167796384,-1609468480,-1073086358,28576373,11540173,-922877324,1587594078,1958742528,-1564462584,61866078,-1604888893,-1073086358,11826293,-1073080627,1583285108,-58698813,-2147126725,1014121980,3022475,1977289539,1312078611,976100017,1124889639,-906051330,-1070402443,852749147,-1948200732,-1618268456,512295171,251527275,-389021590,244072708,-521469843,751076944,-166677701,106150883,133617667,-864790273,7020169,7151244,6950654,-28111637,-1576569400,548405354,-987843861,-1979684066,117382919,-1073086357,-1602682252,-879958990,7216778,74637114,2133116158,6956680,-2005549046,293071195,539897886,589439250,639968279,421015858,337580816,756100886,1364405269,1315749462,788270769,1960852140,-906082807,-1070402443,-1406270741,-1017423522,508037959,474815819,169615184,41092724,307364214,240090963,209126773,471670303,168496141,1381061532,1946631248,1963801677,1862727178,57999104,-402617368,74711596,963968828,578030652,-1186035781,-29163512,773617865,-160102598,-645144112,1364126137,-508035282,1444842287,250135296,-401675516,250085438,-519182336,619185131,1499093001,1354997083,4800138,5119626,-1275067975,1477496073,1911051203,-1579008,-397163685,146014312,-1017442099,-1962937368,-1010005272,5643915,5643913,1307071388,-1013097728,-33532000,-1974418488,704653582,-33532146,-1979664959,-1979692738,-1342157026,-855002080,1444317968,-17660416,-1261764914,1477496066,367547331,1228835328,1327401472,688818688,-1342130944,-855002080,1380997904,-226045045,-889270530,4800138,281871028,1405311066,-1979666094,-386692369,112459803,267063501,11620947,-141890678,-1275065624,-401552121,1532624924,1173699,2692746,-822162690,28364286,5193354,4825283,1252000747,17229824,646586485,-58720184,1377268743,-2146959174,41026300,-466426160,-1910578441,72262618,-1664919009,-1169141165,11796480,-997582899],251,[-2144803712,225716476,1963508982,1946265612,-350703091,-350506490,-384191998,1347991482,1575554364,1532647439,-1824734307,-1791205260,-583252364,-471316876,1958742734,1019805240,-1171098870,-487194608,-1031679862,-397277613,-399712862,-397162799,260757580,1913649536,1125101826,1599813515,-67062445,763929843,1543205608,-1075713597,49020848,104464560,1906442353,-402426880,-1863843746,-1101806658,179897939,1455816192,149440176,-578137637,-1410858825,-400510956,1582947067,-1392750250,91537418,-352316440,-401755915,1582947047,-32455037,1540257225,1012318443,-1342016243,-623777765,-1605319842,121372744,71042164,-1070464397,-1017593846,-1230123693,-1979665896,-1275049666,-1609511678,-1073086351,512365429,243925071,11862057,281872820,1543376360,-402148413,158728128,167791776,-1291684416,106151536,698353077,-1339540480,-1258130383,-1974251510,-402633186,1448804407,-61798735,-1665135956,839021910,2484416,24485214,-906077874,384362613,-964469248,-1057073136,41040444,-838979408,-1343699083,851663869,-1073065024,548406901,5185162,41225532,-1185866832,162791425,-1023536947,281871028,-1966908583,-1258272498,1210485248,29685248,-847248524,83656832,-973207182,1913060480,1371930114,208940092,1506632168,-397285238,1081392476,752627176,359935036,181226984,-1342016320,-444573312,1374161411,1958559720,-602871773,1949056044,-852432884,1372097113,1958554600,-604182513,-853481428,-346427254,-1101666042,-1963881895,-1979700954,176104645,839546048,181799634,-337218095,687636507,-25162636,-2133167356,208798969,-25111573,-2133953784,-915207943,-1073032822,1048584308,1946615880,1007071580,1951446018,-30886870,1976106697,-2134509908,-906093195,45160939,1948843136,-2134510071,-1040315020,-906098197,1971373558,-2000028158,-1593824986,243793992,378077256,-1053163447,129505908,4956928,1302578310,1327925248,-29693952,1336017780,7268352,-1275049312,-1022309115,2688570,646591604,1346109512,675022708,-1729559692,133988541,1353712757,-192930581,133988354,-855768459,2728528,4728456,4785863,770179072,1405310976,-1292051736,691961895,41166848,414601138,5193354,-1979711303,-855198527,47632,4800138,281871028,-1185738773,243859456,1218445385,-855591936,-574756848,-386348568,-1645676662,-389850116,1534393764,1371406513,1212055552,58000896,-1967319319,-397322708,1081392084,125054012,1506527720,1498540170,-108375215,-8331894,-2146929408,57805051,-1273967744,1527827723,1958456296,-1146755069,747134553,-28964748,83460289,113687922,-1023410097,-3973543,-16757450,1006652214,-401574868,540855166,-1973872525,1978159560,-399739717,1009572422,-401378260,272419686,-1662450830,-393586244,-1151670191,736629108,1340615898,1930443979,-1973790231,1498501840,-2131654054,243863526,-980811701,270852304,-444546550,-790245369,-790245147,281147109,-847248524,1408109184,12048522,1302466340,1311672320,1328449536,-854871040,-3974384,1006655030,-400526292,-1073034502,440163188,646600563,-469106575,423363700,-1973793933,-504868144,-394562374,1009572274,-401050580,-1073034542,646591348,-533069783,-1973802126,-1041739024,-10783558,-402626506,1009572238,-400985044,-1073034578,41222320,173613232,-1578610200,-349342534,-1143609085,752446952,1019908584,1509061408,169928064,1372097256,1958380520,-648746993,-898045908,-646766532,1372097113,-444575399,1745783055,28596480,-1990586163,-2046798314,-19988750,1049252810,45350985,-1017442099,-352276400,548425731,1347637660,1492794856,1745783643,1913058816,41221888,-401996619,281870772,-1017602727,0,-1,-1,-1,-907502512,1397454075,-963882415,-1912602433,922691271,-14286724,637566518,8128199,-1943644936,-1912570354,42053830,-1291816442,1228835459,112896,281872820,12568204,650612224,8259215,2080804646,1522961920,1486707545,-1178736445,-385853792,-1259800974,6678713,1450569226,-385160694,646598772,-499515351,-109033358,-1606192358,-1073086351,-109050508,1396142873,-822152822,1049283326,45350985,146018509,1348145357,1018787816,-1341885396,-402134272,-399714238,-397358746,1479137338,1951973386,-372995582,-1863715310,387258,702031336,-668931901,-919410648,-669456302,-919934932,954778457,1955937465,-670504952,-339725603,-1188435963,883097520,882950912,1958742528,-920917968,695405116,448419411,-466464170,-259268399,498401070,1532937046,1062614211,1280722518,1918266198,-2141816746,-1873377194,-1171920554,-1979697733,509447,-1946837015,-385861858,966790854,-175314688,281871540,1961101904,975079692,1009682432,1058441472,-997566464,-789133058,-1946848279,-385861090,1017122458,-178198272,-33538400,-178722368,-33538656,-179246656,-33537888,-179770944,-33538144,-180295232,180913384,1007842496,-1269533948,1102795520,-1965554944,669604615,28988405,16890114,-100659269,254078190,-102644934,-1020130333,-28253814,-338152761,1962871532,-1143502310,79233089,-722053120,-388963838,663224947,-17309117,-68651574,4300891,-369827351,552122719,1955937464,-688855032,-339725603,-1206786043,1168310192,1168163584,1958742528,-939267874,-680328132,242483624,-922873676,1085538932,-385822488,-1152125780,-1073086394,-1975320204,509447,-191174309,1448431772,12197463,-1898279424,-1593503714,-1005977498,251595124,57999462,-1610602520,-1073086412,921174900,4562944,57982986,520120808,1482514015,113692573,-1593835419,-1073020826,-95283084,6620918,-1173916161,619446369,113766140,102,1405311739,78926417,173019341,-1995672348,-2013251042,-1996473298,1476411158,838874784,169440452,908495076,-1995344896,-2013251810,-1996474066,-1342161642,3515135,-1017423526,4635475,1962950528,-401558521,126353425,4161603,1085540213,-2013264664,1388534535,-335412806,-922827742,1522829976,649411,-1174023240,-346947580,1712753464,1962019328,1694942727,-236192000,-958469949,1915091587,-1075293678,1911041237,189946314,1510438354,-369148951,-790054893,1227519,-147530568,1694955249,141950720,4438608,1492039344,-301972806,1978582154,6404615,-301789972,1712752986,1694942720,180551680,1497451866,420501776,1494243674,1494243600,1499082000,1297757200,1158699329,1494243674,1494243600,1494243600,1666866448,1497451866,1499102224,1494243600,1494243600,-1441769200,1851437402,-1424991909,1499197531,1813010704,1980782940,571496796,-1675463230,512316240,394790121,-970079357,1128464391,-968675448,-2008875001,130433807,-1655153920,-1365710397,-2134680744,41255162,1489175218,1503577222,1522752346,-2084349605,126496451,-1950101258,-2096830178,-1950143549,-2096830178,-1950141757,-1979389666,-1023398009,-967747754,-1526382842,-1090195266,146343232,-492504064,1583307261,-1152298045,145818944,1965047680,-906083571,1556018805,88653573,1421742315,88129285,-1493432143,-906090635,92993909,158598202,427147274,1963001078,-1962636780,-2012944098,-1157615225,250108404,-339725824,1509866247,-117439256,1405311833,3022475,1960512323,-1144825086,1129514323,126486705,1140119016,-160052738,-873976144,-1014801420,-163270647,393535751,133583024,-1341098720,-2146961854,1102055797,1967130614,1531817986,787785192,172165002,-1007323712,1970226720,-13736850,1394606093,1886415211,-13736859,12124173,1376684032,-387272699,-471204163,89308158,130418570,1975519744,-213456891,-487997430,1376684286,-341579515,-1963013912,-1325389522,-387076096,-1209401711,-2041554690,-196810556,5705354,512477694,-1886911255,-1427570638,-997828354,-1963439639,-1325374930,-23861248,1659399600,-22025986,-2013240416,-25106169,-997830568,-385874968,1793654401,6536181,58002748,1006953705,-1023315168,-397211650,-27525491,-17533760,-385402680,-2041051963,6464196,6398147,57982986,-2136151831,41286626,1369571762,-1564410363,-896924336,-2139037312,452264425,-2132705079,1947255542,550076419,167796896,-1325239104,1976109569,1594291721,41221888,243810481,-4913848,-756520784,-400061699,-990446034,-166955775,58032577,-1342165016,-400561153,820510771,-1946651906,-167450338,-2130693753,300419701,-972721407,348166,1638007216,-35133440,-385808442,1069284794,1161477,365757364,89373635,1392513465,365757108,48825203,1587567361,1975519744,-1522565114,-373037451,1637919785,1958804992,-1564462581,1621229665,-439490304,82386571,3246070,-387287679,535298107,1407380225,939549115,-1962052313,-167450338,-2130693753,-1023314597,-1263801879,-1840897,-997830568,-385874968,652803405,-33060864,-401902399,260635997,-44570429,1404768138,-33508091,260587977,365757364,-956480280,-389873401,260767037,1404764341,-1009188091,-1628962380,256255,-1594026775,19662160,-1144848013,126485841,167774150,-1023314752,1929382632,1342621191,-1073086459,-3938109,-1040316534,-1996686104,-51386353,57937722,-2134654966,-579534785,190544,1404814168,16824581,365757108,1403000178,-53745659,-823654520,17286908,1962526974,-2134640639,91555068,1877547186,-1423578709,738545824,-373286399,243796115,1525220689,1594279657,-1991049216,-1962586850,-1996271594,-1962587370,721880078,1225689547,-397258491,1499135652,6332507,1946599434,-1262318078,118869251,-1174369816,12124165,-42645248,-386239158,-1094516618,-1937046189,1621098506,-1665136128,1343059281,55988563,-434706215,1482381662,74776892,957579,1958742534,211061518,1959329280,1343654660,-1262318077,118869250,-1655106958,512428917,-654114768,1478396227,-444536573,-804919216,83656792,414319989,-374688279,-397694357,91599347,-352295776,-1041700861,74825738,48955824,1688338608,-840922624,-607272171,-134091783,-1952648309,-1979407090,-1564396861,-947256153,-578100174,1939734322,767755015,48955649,-469056725,-2143482504,-1961528832,46433246,85417449,192479360,-997990773,501213442,-1577025531,-1514470234,-2146467836,-13443445,-1014969472,54068934,-641275776,-388330669,82314986,1579059653,-400510716,-396636389,393523552,684732904,1389996008,742131594,1290274165,-386798671,-1993748450,235092766,1348331960,55588607,73283327,991857611,-397163773,1815872782,1279003252,1899759220,1362887284,640074587,640034342,640034342,640034342,640034342,640034342,623257126,606348581,589505316,572662306,539042081,522133536,505290527,488447262,471604253,437984027,421075482,404232473,387389208,370546199,353703190,320082964,303239955,286331410,269488145,252645136,219024910,202181901,185273356,168430091,151587082,117966856,101058311,84215302,67372037,50529027,16908802,257,-65536,-16843009,-33686019,-67306244,-84214789,-101057798,-117901063,-134744073,-168364298,-185272843,-202115852,-218959117,-235802127,-269422352,-286330897,-303173906,-320017171,-336860181,-370480406,-387388951,-404232216,-421075225,-454695451,-471538460,-488447005,-505290270,-166993695,-621346183,1030805291,-397198732,1939610768,208332803,259576331,1915222659,57908509,1527528936,-2095730199,243129082,-2094611837,293395194,-1174400024,233373658,57908480,1527520744,471853251,-770968597,-150832740,244186,-1031675181,-628662222,-1659034136,-320273544,485287948,1913181417,-1878151159,-956624919,126484487,-1996905240,108380935,-393213264,1515778153,-2134663845,27198,1394479732,7020229,1526742912,-972720865,27142,1605333737,-306255522,-2007297931,-1157322954,113643520,-385613061,113710376,1189,-2007297853,-1157322954,113643520,-385613061,113710352,1189,-304718653,-419508547,-1264165029,1885290806,1640981257,-864611964,2051237419,-1080764955],252,[1818913110,935134639,1199926534,-978565349,426143783,-1223206686,1340109649,309237645,-1546094845,-687194768,-858949085,-858993460,32076,0,33024,0,33824,0,34632,0,35450,1073741824,36380,1342177280,37187,603979776,38004,-1769996288,38936,-1138753536,39742,1797783552,40558,49872896,41493,1136082944,42298,-727379968,43112,-2065225216,44049,-434047872,44853,1604923808,45667,466206468,46606,-1564725563,1073789233,191576694,-402604962,-954006391,1644216330,2028717484,2055258925,-685328617,-1399798184,-2038943122,1471531527,1746288394,-308097751,-1038364980,344313939,1498505536,430363652,1873131920,537974565,-879810572,-1811228082,1060731128,-1190339071,-1895311562,1733288225,-221655804,-2128354231,1870413893,1891035004,-978474965,1290070813,924389942,-534974907,-2065738045,1813180790,319526458,118945050,-1748075575,1222441024,-1111352645,227146608,1989759157,65302,0,82935808,-1710981067,612571639,1971536739,-1450930739,75662207,-2130706432,-2092060446,-2096008694,2134181108,-2144243176,625304878,1682186531,-2147471316,-1921080122,2051014659,5960464,1316134912,2328,-388717296,-402653184,1525878,199491584,596,1000000000,0,390625,-1769996288,152,256000000,0,-1609612736,655360390,-400093184,167797763,256,-7307264,-1,-32769,-1,1006632959,125909162,1952024700,1999017952,2048794052,2086883422,2121661978,-2144243176,-2130706432,517470981,-1725536890,590633095,-1520574073,1225776006,-1277754749,33117,1644462464,1350468405,2038320164,8366761,193003520,-2089923004,-42065159,-1631386813,294,858927408,926299444,1111570744,1178944579,-1146471494,1927840056,78028810,1014204476,1265788988,77805311,77936383,-1978638104,-2117828382,-162520204,-2147178746,839926760,300345572,1348098904,-1157322520,-1914150377,-768386286,854186634,79987466,77932160,-385649536,-466478959,78063240,-1089340951,865076387,-945029952,-1014956027,1964552168,-1528895229,-945029949,-1014956027,-844358935,-1523154759,914391044,-377486159,-1160969334,1525275015,-2017735420,71821785,870890701,85715225,-1310074489,-1984049915,-385572066,-1093859221,-796157870,1510534888,-2017473085,163047897,-645414707,-2129793559,1971323131,-389952237,-768407341,-393183045,1273496581,138799386,55827447,1476686042,-855533079,146139330,-1556676774,-1523122428,145352708,-353805733,1388546819,1918561015,-371684603,-1009974922,143779923,-1556676774,-1523122428,142993412,1391024731,1977289481,-1489598452,-83442172,770245634,-1558279919,47108,-1845189213,58310667,201326522,-955876901,-16472826,-1556154369,-371684604,-645463766,-2028415000,-397163559,-2091181499,-1950153533,-1962630378,-1023105778,434656156,-1014801638,-389833468,512343723,1743324323,-1096685558,77799049,-854956567,-1961391164,-385875297,-10615987,-16473290,-16472778,-2017079834,413198553,-389817977,57939812,-1012689943,-840377721,-1245695488,-1144599144,-930478938,11874184,-802191293,1942474192,18933763,-645208694,-401591319,861142674,-1558279717,-1987987708,-972774114,67304198,1528038632,50005702,-1047805180,1939006199,-718935805,78363587,-379275334,-1413808122,1689893380,77838930,1914107880,77576707,852331203,-2029458451,50045146,-53965928,-74714485,-695491341,-389816437,-242497482,738065291,-1527561782,-812918133,-1664877503,-389833399,58005180,-844960791,-385648440,-1549724029,1958742788,2030153734,-1006653438,-619986893,1539568501,-661940029,50005702,-1558279934,113689348,-1023147269,-369113880,-909246489,-1242998181,103147523,199842395,309516,-1660974871,-1656547446,1127713436,-1656549493,-1013103716,120109907,1528170216,1361491641,855619048,-1563767360,-1262812367,537380356,-968685814,1793667079,-1597256437,166397093,-437728051,-167218153,450941136,-1019382592,914410957,864027815,-1948387621,-1950213181,449022672,-1010267455,2014708712,-389100038,58201551,-401025559,-806873086,402450712,-1037319285,124784244,-1070463112,2026094846,-1071973895,1977236419,-371510523,-1031077850,77799049,-739714293,-1869573895,113706617,-64347,12238859,-1174177536,1056440319,-628423517,77799049,-516248125,38146420,-1732182524,-180621309,-695472267,986855913,1963129606,1965832937,-796244251,-1912194388,33846272,182250434,-1743752000,9420689,1955702515,-1963982074,-1949766718,-1950131242,1261341683,-1091830780,780923787,-369360036,984416269,1175549153,-268199764,1005585325,-1947240978,-749475362,50005562,742058357,-1404639883,9307706,-1073029259,-1852305804,-218067009,74748326,-789843965,-1949267027,-754587170,-1021962008,168076705,-2131397404,-2147179210,11589581,-1576755550,-1298135894,1958742532,77963746,-663428086,78716555,77926016,-1324449664,-863338492,-1482502358,1931637764,-154958318,78095065,78003848,1877496144,-2141693675,1601387001,568916051,78094357,-1144835493,-1430387554,309508,511245560,1124536749,1945756227,78035730,880019454,79252299,1260376320,-369434037,430772713,-498908409,-166038535,-1191181929,1263206404,-85846025,-16776007,1124496647,1962467907,217377224,-1609724439,-2145123161,77932160,-1526331265,512344836,378078373,-1581054813,-469105499,914419828,176161957,-1578142465,-469105499,-919347084,77805195,-1979406430,1942956748,-2032536051,-1507948065,-1814067708,-527772025,-1264786638,180619904,-1964756260,1959332860,435782470,-1986194830,-1979407562,621061926,-1005944705,-1023105630,1913190784,50719004,854821520,149520603,1948239094,550273232,-863974421,-352067040,-607062002,-590292271,1964033270,-1644961043,-869653127,-233053814,-1021651317,796121226,78059254,-755510026,-989932554,1967268213,1975778846,50785050,1943540438,-1509491188,-804686844,-790965797,287631836,-385046039,635964520,-1314864365,78094852,-166942743,-16472570,116846708,1962869938,-1323398171,-185341948,78716553,-133913413,-1156341272,-386399056,922686362,1592263846,-1509519595,4241668,1359539025,78298104,-1961658392,149718012,-1107103869,79234224,-1510736640,-1190889282,-1430585340,-1375930364,1128466201,276036066,-1962933063,78299124,-1952058372,82573542,-116865917,-402350405,-497478856,-1526270282,158629892,77989631,132712821,77511436,-384622616,-1796730831,-2012777198,-385571042,-16118784,2062091125,-195565550,-768345461,-208929142,549052298,780883200,-1516239709,-337147388,-674105339,1465308881,-266601173,1583285363,-998046485,-772409340,-489434670,2044398564,-1509491190,1560835332,-787765783,-1965829678,-1965651230,1574931187,319819241,1364677625,-397397972,-1739058608,512433785,-75430749,426970317,-472790133,-654056495,-670833711,512297848,1223361699,-351767984,619204659,-954930430,293894,2114373412,-1147898876,-2081946498,-401180397,-10874308,-16473290,-402348746,1515913867,-335688472,31975443,-401464344,-396750098,-622329225,-51451903,-1017421991,-1070409267,-855635479,-972967718,134413062,78120646,632602113,-1946209450,-134771761,-2031595311,-1073063919,113640821,-1979579653,1965440007,-1341658877,1956392252,1948990469,-68662527,-402230280,-169214147,1638120959,-225717709,8796718,-2130021376,1952554237,-269923036,-1662156289,786813281,1781573375,1784638027,1785162335,1785948781,1782606400,-1662468046,4319232,1090530793,1374222197,1370454289,1223186259,1499160321,-385899543,-512429172,1140841449,199875563,12380160,838862313,11987136,-401771107,568857389,1392867857,1527967208,-193533501,72681158,-1534465793,-471214965,1979648520,283699205,-1499413511,1975519748,-154957304,283437264,-454507527,343039487,-1957490453,-2496481,141712731,-1514186925,-1017802748,19710206,-3868989,57991818,-1977561984,-51516970,1048616720,1963459323,149528068,1465097728,1593859304,-1946799269,-133895978,758911858,-688454539,725353963,-389873292,24311794,-855998013,-1174048244,-269778945,702544,-2141527305,-164482838,-538193917,1465057548,484968309,-1878660352,4647056,-164406433,-1108814197,-389856269,-109572008,1956409321,273606705,58021499,-845382679,-402294321,1223360575,-73268048,-1524725246,-1491171324,-1558803708,-1574532604,1087143940,-377435264,501747157,1965388560,-1672812285,58314957,-1342173464,50045448,-1616658381,77701892,-1957276989,-402349290,1516109955,267577539,512427385,-842857309,-385649199,-1499423720,1922055172,-385649615,-1516200954,2025851396,-1677924093,-1157627718,-1964474368,114026747,-1173238296,-2135228416,283961488,-538377356,-2147435621,-1516229141,-1665136124,2133067129,-1174100574,12255232,-77076352,1006937760,-1660521072,-1209410696,115861659,2040388235,-1982073086,-972774626,33749766,853226435,78102244,-31546,312976,91869707,80141047,-1965127040,-958952718,67304198,-855094295,78029014,175423498,168080032,-385583680,-1950150920,-402345698,922743002,512296102,1458046129,-1544516847,2025522342,78816004,-1962628163,1958742784,48940,9162635,-1957485577,-2116090914,50632643,1107391239,24363267,-1962440382,-8168502,1191474182,-1948521657,-1615113279,1526761732,1946615427,-347716092,77446846,506365,-507508052,-2147126021,537173518,168076704,-1509519424,-1156614140,79234206,1125634304,-369434045,117312537,-143326042,-402137623,74714739,58064650,-401710871,244052026,-315489115,-1979407455,1381061629,-487108527,-145175925,1942488035,-628407807,-487106470,24365059,1524237122,65205848,-787647528,-19279397,1963238918,126937347,158990090,77989630,-2081880203,-774778617,-1965716781,-1965061389,200075745,145773507,296747634,-930420598,1223203921,1958742530,-1660126974,192630873,2035814404,-1660294374,69659481,259610631,200730704,48269912,35028705,34401256,986054341,1912845800,-18314740,-352145211,-1245380092,-20382205,-1672455224,1307101490,805815808,-398261899,-2142568216,-93048769,1949187968,1486701313,1352412020,-1274167320,-1274905787,1126664260,130456920,-972719829,-654955257,-989974604,-93124052,-2042414588,1124567492,509507,-1262757497,-838941948,512300665,130417490,130433838,1975909936,-919387144,-838984981,130419829,1377732910,-919387389,-906097941,130418293,61948716,75566729,-1123699517,-639081995,-1769263361,1162149888,77805195,-1057083472,-93064661,126415363,-1556707005,1976368644,-4790051,-1023408186,-1107099207,116064262,-1107032903,-1279328252,1958476804,-1558803614,-964012540,-522984398,-684793722,-1964846166,-294302003,-1157626426,-27720525,809468105,-498924683,-370621448,1366784780,77577811,-1190876225,-201588732,58058917,78756691,1527643624,-1090212930,79234207,-1510736896,-823655564,-1508996596,-1192656892,-386344458,1499136858,-1335777602,-13703159,1345302608,1354825304,1929417960,10742007,1963715416,822593033,805815875,126354155,-922855357,-1101932683,-1547762529,178436,1504048124,1364404715,-401663768,1532625777,1947048424,-1524725493,-1558804220,208922628,-1293418064,-1524725501,-1558804220,-1336190716,1642904067,1358874600,1592283731,800087309,-1057073072,236447824,53409651,771752086,171538,-398113467,-2024272584,126376917,-922855357,1111674485,78965387,1375646697,506198,-133914689,413937404,-102611195,1371756894,-1090517063,-50854753,84978734,1509548615,860967875,45832191,78028894,-1073031378,-1738601356,-1957169109,-281876272,1723590891,210298976,1930243560,199682054,-396931233,527567792,-396330309,1491602574,153901308],253,[2146876240,-401838616,125177175,1477163496,1481687294,-1073063079,1532582083,-1144799222,797574324,646586545,-990509949,973960224,1965732329,80016903,-376831371,-1075310712,-1120766734,976118181,1946157190,-1661107959,1294365793,-310251285,-439262820,1638334254,1970304368,2037414256,2037414256,2037413232,1013988464,130435952,-2094626256,281343492,-968162188,-990501881,1258648836,-315478136,-339735869,805815814,1976106563,-1981234184,805816061,1976106563,-1262763019,537380356,180480083,175742043,1395460038,1527573736,-968687348,-1013108729,-571942707,1124627967,-1157625914,-389872460,309922504,856096953,75736000,75566729,-369271064,2028601137,176285948,1625883513,-1023314529,-805001568,113660136,-801110874,-1157323242,166200491,309517,221767761,78321291,78454411,1526184936,-162797477,77991678,-502631335,-1073456925,77989376,170912195,1462091455,-972773185,753402117,-385649398,125432118,175505162,168006633,-385649153,-620099059,1048585849,1922630822,-1628575485,922702674,922682531,854066341,-396731647,1038617434,1952078603,-1630410493,168076704,-1089898048,609710532,77963903,-880782765,922721407,922682533,48759971,-396666367,477432618,-768388270,-393215813,1515916062,1520242297,-1875055781,12309043,-149755519,1393457565,19916882,-974601590,-799319550,-1559851048,-1526296828,645963524,-1635842907,-1329658765,1381193597,1510020584,-83629989,1408271849,16771154,78780041,77792967,113704960,-2130705243,78786257,1532626803,-555199917,-1308166150,1962934020,-396666347,-1914172383,-87300086,384326490,176351244,1532679915,-1508996413,-1192656892,-638174861,77904796,100234,231304,211599370,25659520,42452480,-1667385344,585630585,-387108352,2040332306,2549763,77465286,57908480,-1023296023,-386378927,1499138426,1405351650,-2096848965,74645807,-135576765,-1152138405,134087839,-347929739,-1966908423,-2147178994,1098094825,-1952654858,-1962630378,168076574,512269531,113640615,-2137520986,-1667399477,-360511879,14385153,-922030798,-338688396,-85796143,91856797,-33393342,91463107,-1444289486,175742465,-738798857,-2147368317,-1312620333,-1509021032,-1427376124,2114479848,47697,-394198853,158665150,77797001,77928073,78028995,1352171564,77989574,186378368,-396265797,1532625432,-401927960,-2017785476,34269281,-1847043238,-18326795,-119937014,451435354,-2144224268,-378398534,-185992803,-1805850212,1356891807,48955824,1436729394,-997828604,47774,72556169,-370670732,991857091,-1817384957,-477374603,72562315,-847956167,44534354,-2091757568,-2013920061,2021720063,178497,-1074557956,-1510800221,-162310565,-16493306,1455296373,82805508,-218103111,1958752933,-263460861,77839967,-67108167,-1956731405,42765076,80118528,-263591850,-1014814741,1125092100,344677955,72681206,-1962510849,-352037354,1892745988,1377077557,1128470411,-1511500968,710499313,-249567035,378080116,-779419602,2095698823,-1981576294,-1962719970,-2147271906,158673983,-386509336,-1813381310,-1700206189,1465275217,-1153846702,-1514208098,78036484,-1185736213,-772276220,-498908393,133585914,-30837440,-30772212,-165251894,561577733,746643573,-2145749496,360057066,-1190878018,-201523193,-1641643868,-1091887100,-350220416,1583307474,58087771,-385583895,1049233088,79234214,2027620864,-2146339551,393349359,-225780086,-466430838,192211938,-774582024,-19672878,-371296817,1049101985,-2081880922,-350172156,-1505851148,75032836,190547,770229083,67812096,-397210389,-1017446398,-1157619736,1048577123,2013332648,-971868921,33859590,-1330675224,-1349916659,-2065167696,184337327,1644412671,116787828,2038432935,1644936707,1913027560,77577992,-352320327,80118537,-1190878273,-1523711998,-389808926,-397211379,-1226307711,99113975,-379889152,-1976633427,-152528889,776163336,-1549596789,46367492,-1559786706,-1014823771,1499092994,1360819272,-2024583086,-142350119,-1959898277,-1618268649,-353894398,-1014801423,-1008801020,1944637523,17426691,-396315973,803735254,1527345671,1274749928,-1020983354,-1257901080,-1258130672,96331783,82314100,1064852474,-989671286,75630122,-654965383,855294696,11659465,75577087,-119871406,-2130276518,-2127102204,180367876,-402230078,971569843,-2130276360,-2127102204,75603972,-1979550999,75604176,41205770,-259340034,-930430462,-1070463880,293193866,1397903696,1527097832,-27764390,-1963886400,717392609,2042954433,75669527,-956671256,512306695,843252562,717654729,161606085,1376027296,75577087,-1037384406,58245378,-386255128,922681383,1374160001,75669752,75564687,1515765770,512427893,1743323986,-20839935,-402425656,1542060559,46500353,-20895038,753437376,83656451,-1597470205,1076102275,-930479499,83814595,41027508,-924315468,1962498820,-397389047,1532688651,1352459914,75568779,178058762,-33393454,-1645083958,116787572,1963197571,718208514,1357286132,1323893624,1347441408,1476714984,-143276802,-402341912,1347946382,-771750983,78047460,-997584782,1622326168,1810421763,106293253,1857752811,-1731949984,1407768579,100198405,293100376,-1040295592,1347637329,1476697576,839052123,-1596131612,-536738686,-1073036034,116787572,1963197571,-1966277118,1489580780,75577087,-2110879664,-144775164,2128874072,-389772795,-1554450113,-1073085311,-1974793099,1949187079,512312065,-1655176366,-1006496398,75638410,-469056470,116787572,1963197571,180420098,-162862912,1206507915,-153056768,62144708,-466484619,-1996192861,-1979416306,78953440,-165673018,57936068,1395328966,1526970088,130418809,-488090835,-968664315,-773312505,75735299,75566731,-1276574856,6875645,-130291629,-2013039525,130433839,78887680,1379830595,-2129229053,75669508,-81009614,1131739179,540805002,708634228,28631668,-397388981,-466425110,-160158404,-227267780,-294378436,376778812,-355145661,-347402125,126372611,1961101912,46433272,173585387,1543206116,-1020983354,-1979415647,-804866612,-2129228824,1393259268,-213522350,-379928526,-963969473,58197292,1391994600,1492507368,1975519824,-922858751,350750328,509688,75564687,-385918487,1836319467,-1549726599,762628,-1576753760,195100685,653733376,-125083029,-1607546230,653681261,-939393013,892974,1797715502,851968610,378220224,-687644050,1881049646,-1562832286,-2135948121,-1996183902,-2013263082,-1342173922,50045444,16497641,-1279590400,2144516,1128466179,-31130910,-352318557,186026913,220105216,-1329581312,78029440,78063240,1408995305,77511505,8390529,1929380793,-12369138,-502762233,-1509490952,1495257348,116793460,1979647134,-1624866811,-1514406396,-1979217404,603980455,-2132508545,663281674,-1869560997,-74913392,-2132745088,477331652,309674652,1975778973,-607061741,77989630,-376436107,1973287786,-18710525,77839958,1178997897,78069386,-2139102335,478732042,-242498722,-1962625816,166220238,-2146864638,-1207654850,132845433,78003840,-402228840,-806878720,75938564,1493455336,76463953,-402356549,-2034564043,73263108,-402522648,-2034563918,70576132,-1157497880,-974650220,-2096925951,1474823403,74799364,-856964610,1978198411,-1009939708,77932160,8841343,-973036056,2131014150,-387144728,468385924,-1516114587,2013036548,180552051,604600768,77963903,1350414520,-1610589208,-1073085274,109053300,-402520922,-1314848671,-2097381372,29685404,1084752501,4843676,-1157008227,937975858,-330766334,77999744,-402427134,65536256,78029041,192115772,-1156588614,-1897364663,-1157174286,-957849036,91594234,77936256,1673249664,33613922,-386856728,115929543,-334960640,-402449943,-1528298579,33614071,-1023163416,-379571525,-256376354,-1523122237,-1556676860,-11081724,922704730,922682531,-102234971,-13834239,300505691,77963758,158973962,1467855039,-1516077276,-2114158588,968821874,-768387205,-394198853,-1564807696,2131344176,2013389288,2067971898,-1556676777,-1523122428,-1277707772,-394175045,1515973733,77805311,77936383,-1157520408,837313097,-10855430,-16473290,-402348746,1515913616,-1142051864,115958354,266058490,-377402949,-1833243611,-2147042550,-387176215,222081111,602407797,126496433,1975519811,-1614822418,309508,-67108680,-1195136013,-1549598720,77964036,-411506493,-1549726087,1958742788,2030153760,-1009191396,-1499409203,1958742532,77963280,125091850,91816368,214161654,-73350399,-33014782,-20382008,-236403768,1393324799,-396268869,-303562546,868441066,-2147435566,-1007964952,-1140860952,292708394,-840431381,1614461951,-1410857102,-260708352,-1523122237,-1556676860,-83442172,-1662515198,-277813248,115891034,79283185,1125634304,-1006968253,-788527943,-498382049,-1887386630,-501219326,-1329872127,150568964,-1185864078,-1430585337,-1977120252,-2013265529,-136166649,126402610,149520473,1948312704,-1440347943,-2955004,259311882,-1209468847,-2013898241,1963982850,-1010834759,-1090216002,-1174666069,92995588,-24868443,-1007164673,-1190888257,116064258,-1190889281,788267012,1135282059,-1946623421,-1018475553,-352015425,77578218,-1413487125,309508,-201531769,-1008826459,-1151904943,-1413544801,309508,1610607080,1371756891,-1413785773,77577988,378137579,512296099,-1950153563,-1962630378,-1023105762,1929301992,9038143,1408096232,851675735,2013570310,2027620924,77963536,1064485675,-1549715595,-339596540,734235408,1912907014,-1960413906,-1559876670,1965322756,-339725796,1206632522,-1863474200,839355280,2030347526,-1524200941,2028210692,167882758,-1339233344,669776383,178513,-1516183929,2042628612,-34109694,-502893145,-352276229,-1341754611,-339736063,184528901,1599732160,-1313094821,-313071612,92967056,41486130,-1185827861,-991231996,-396230725,-1746338062,-972327425,33749766,77792967,784564224,38443,43915822,166249216,-1610057474,-1073085275,-1581052296,-1073019741,-389869192,142147060,914412237,-1015020379,1023714209,175472640,-397159475,-379851301,519569382,-1144847197,870843513,77053696,-1207957319,-201588736,75014827,-1023104350,1929230312,-22877949,-1618274421,-1178402814,-1511522300,-385649923,45743766,-24057600,-2030041927,77577211,1929220072,-25106173,45735815,77840128,1944714119,309758,-402350145,57867636,-1174510103,-1547763710,-27465468,1929208808,-14817021,-385954327,79297880,-1190956288,-1084424190,905905317,-85831857,-1413495979,309508,971510251,77578237,1929381049,77840134,1476395705,1195836815,-1018103070,2046631912,-707935487,-1259797646,-199497229,-1158021120,-628228000,-762396018,1688387634,-1148078844,-1699086336,787647238,1124567212,1976434242,118406388,-1141239091,-470351808,-1020535924,-167771973,108392644,-523041615,-1991518069,-1962922978,-853349917,-157143888,12040961,842663878,49914560,-1577056606,1705116779,2662916,-1996288325,-1157428194,512295802,512426978,-1991573460,1258490398,118405971,-543030096,512316164,-543161120,46202372,-1227846976,1524237056,512481927,394790112,1127712835,-1190862944,-1073086412,-628683148,-628631293,1128470409,-227161858,-654058873,-922856637,-1962592606,-1962614754,3390231,512350723,1130038500,3153545,54861449,616729178,-1966044418,-1966921022,449219288,1945668295,-1385633533,-338492495,37537674,12256114,717392386,-1965520189,-1966662970,-385649672,512339274,-628686070,2891401,53419657,512353163,512426821,-628686800,732773864,1397443546,-444536741,-394273605,-1729561729,-1013978708,1954103840,1713402725,6645106,-257562604,-11351757,-385580746,-133528,466206467,46606],254,[825242929,540160309,1380994883,1112088622,959520845,-522768072,1260446078,1263476802,437512205,250149770,-1964275174,-1074070321,-38796032,179315174,1639588070,1288485632,-1014365516,-288912658,572580938,-319130428,-287161686,327914,-83886336,1939789236,2068477260,-1622771384,-321780303,1085292403,963764432,1990124594,2050127924,95526704,695397586,628155600,-100663368,-611526514,-1047739506,-762523250,-326376821,-24382069,-952957069,-336066699,1959201763,-1595476991,-658865178,-1057034749,-1326532430,-1335630199,-1335761243,-1939806719,-1898934584,12319960,-535380768,1964514281,-436031276,-435900320,-430657528,-423523773,-431968191,-294845,1105463156,-236791798,734235380,-1337858359,-1874598336,574743696,-503089960,61928690,233201894,-661979216,146405514,47616,-1326558994,-527766527,1960328172,-498928639,1958805231,-1898213663,-419450685,31870977,199645360,-393609040,-430962458,-434982902,-431902655,149180427,24383524,-431836940,-431771637,34847243,-1947336272,-1190890978,-75423744,376705588,-371189572,309593329,78698634,-919904026,-662241566,-1070860565,512338931,12190834,1096452,-13909362,-1951771208,92874440,-1960439888,1975595781,536918289,-1031689229,-1014823936,-1593933808,512350837,817366035,-1127182848,330301696,145760486,162537958,-5234202,-1189207578,-13959136,599312270,-930305025,-1074273621,521011264,62838924,280596735,1195877632,505412578,254042852,-1380917110,-460299802,-771444382,183510208,-1545327932,-1716517872,99116006,-1426358248,-75491212,-385649307,951123439,-1869585946,-14393116,117310581,278987794,816861188,704909475,-1341075996,68199200,281928746,68199256,175452196,-956284737,-369145083,809238688,-989984652,41230396,-528088140,-840684976,-1152362480,-1195724800,134265091,-58719824,-1224117200,64535224,-922869579,1916699118,-1911409660,-1912113981,63432923,1347962485,281870516,-344973128,-239,-1,-1,-369098753,-13953639,-218093383,-2142218069,-1162202884,-1174178813,146015194,585943339,-503024188,722070521,-1004344119,-102624908,113647135,-1174011883,-605552382,-1324946666,1978454531,11819223,12193997,735743680,1393003483,-1437254309,921175413,-2130384106,-2130673470,2093482234,113647588,-1341848555,-467540480,1975519777,-419450853,69329953,-1575914239,737870955,-486612279,1799258366,158597124,-1862729794,-99201304,352765684,-22019580,279978470,381240294,-423523840,1795618368,74776836,-655624222,-5239631,113656038,-1342176149,-165550338,17066758,-136134027,568786864,1139160752,1088815280,-1716502298,278946790,1946231812,306085937,712245508,-485067800,-431378402,-1426358175,-927984267,1219518950,-919903770,1625620194,175374396,-1105873688,-393155508,723391947,-1178562880,521011208,-1862339650,-1526718273,-69056697,134661919,-940024064,1409291270,1644611583,-2131361792,17044030,113707637,-113508240,568786608,-1207824198,-1326557867,-1002771455,-789101451,-335433490,980796474,-1174404677,280560149,126365184,-952439664,-331210379,460702522,-488386230,571884,-1974861392,28372704,1975794412,-488583162,-1106777102,-393152241,-320334529,1048649237,305397874,-1612119179,1095680,512436459,-343736301,-754667248,-1144288277,-611449856,-1014905970,1364329472,12144723,30402592,89672821,-1152385008,62455818,-137219328,818577651,-1175002542,-396886013,-85846818,-1107294279,-1976639462,-806861308,1492640276,1946161213,1515805609,179352802,-468402712,1963009032,113647411,-385679339,-393544090,-1477964368,-401952748,-2091379550,-628357436,329457183,355895296,449767424,2062075274,-117129708,345106576,-1899495238,-1948570662,1029395207,108374613,-351000344,-1031696379,-92209024,-478349824,-1265630741,-1898239228,330229978,-2098723980,12747009,1976368642,278929388,1946231808,606200894,-1272846657,-841709056,-3869165,-222683019,-300109821,-18691797,-768344350,378012085,-51904450,-1257803256,150333474,1388185459,417894636,-1173573612,-957479950,27398,-1996480834,-1996481994,-1996481482,-2097119178,914956486,2025783426,-1207493120,-1414851564,-1425997384,606201003,-2094930180,427032829,-402652486,163451910,-236416792,-855591917,1006403606,250345333,306086032,108265728,-402652742,278926310,1963009024,-94377725,1235280938,-1122972416,-1097795165,-1959919616,-1431306154,535568110,91597372,1174951049,-2126166714,1979296253,48101,-335283526,108394664,66586567,-88456381,-123147262,130483829,1128465144,61982347,-1022703406,-1174400606,-1863581183,262705296,243271029,-468713455,-433058719,-422632351,-427773855,-65417824,-1070858453,92931464,1299563570,-997538562,-645139851,-1430723631,-11158870,1642376179,1642475532,-422632304,-1946333343,-1395946505,628474930,-492125558,1961108214,-2032104938,1977885426,-338392572,1950874848,28987358,-455677184,-1329585054,1388575744,651856976,1390216,-939459967,-35123844,-116736488,314960016,-1161602472,-337116926,-660718,737935359,-942108992,-956270586,2047773935,309504,-855591855,-1206947309,-768933375,12305038,113020,1935217613,-840572412,2080434712,-65536,268287,-1073643517,805330944,201332736,1377762048,1397839702,-91491701,283698897,185895699,169047250,-32082716,-29002548,-26577716,-385649204,1499136131,526016095,-2082436401,-2135948350,-1311470866,-2117938684,-1090515230,-100407511,776082571,-301906550,92941898,63079406,522503306,-1337308434,1240198656,79856464,1122894768,-399460542,141819976,-2134799783,-1360297780,-400509110,-260767688,1493559939,-336674422,79856541,1122894256,-400509118,-613089248,-402540726,-747306984,-1960909696,2112482324,-2095805441,-1964243518,-370392352,1569390448,-322360452,-954015606,141870906,-872483358,-16060555,1381123523,539906639,1397051944,541412693,1176641597,1260397105,220813637,-246,-1,519831551,304474195,175432714,510971134,729074942,-1862587157,438209530,471743232,-1946979328,1959943,1711753,-1946544917,989862430,-1962927074,526121735,-1610612022,526057495,994264015,1962967582,-2145481980,978502400,490227269,1082144298,67637280,-15007486,-256,-226,2147426303,85398015,353965074,454037257,33491485,117834771,202050056,-1,51911196,219021846,-1,-14614529,1633705822,1701077858,-39066,-8061065,-9109645,-8978571,842079231,909456435,809056311,151534893,1919252337,1769306484,1566273647,1935802125,1751606884,996961130,1560240167,1986230394,745369186,721366830,469704959,606289953,707157541,727656744,1464926216,1498698309,1347373397,-15893125,1178882881,1263159367,2116172364,1482325247,1312970307,1061043277,553582847,1448432895,1515804759,1750948955,1818978921,1886350957,959985521,909456429,858927403,1212624432,-11796663,1347419981,-11316655,-67108865,1381061456,102651734,281405692,-464494364,216042081,-2040404352,1482811104,-12787574,2062091125,243213314,-394346745,-234878791,1959037614,8775939,-394268799,-2035971538,1971366120,284983377,638060403,-2132213737,386332160,1702167552,578114108,1509110,-161843960,536876806,116788597,1946353687,1378924557,-167651607,50337542,646247284,1299513368,1582600,1517104,1098207804,-380501832,-58719817,-166038768,388374740,1975008256,1679404,646447284,3932185,-1578557580,550827521,-352315354,1937783828,403109392,393480192,91505980,1582720,548469495,520560870,1499094623,-154183589,134223622,-1847000203,386332160,863241216,796218172,7472839,1542066740,1391460576,1263620175,1212632396,303108169,370480147,504961047,572596255,639968291,791555372,1009922352,-1341819591,18999584,-1175812161,-1359871990,-276753803,429976200,-167070720,-1564015644,-1981087719,1640134,1751296,91598578,-186056528,1912749056,1930312716,1992589320,-454491984,1933261824,-10360573,-109885636,-370581573,116785435,1946419223,1967537240,-2145481960,438208768,471763200,1896269312,466452480,-1326858197,1967471616,403603489,548407296,1048584422,1946615881,64535047,-301963872,1574646,-369527544,926744340,12060277,8513906,1021873851,-1149865413,-1125521208,1934048256,386332204,1517552384,91557692,-351338312,1966554208,-434065399,-385495776,993853148,1438320242,9562601,-337044549,386332224,544546816,1509110,1008760067,1007383626,739013710,-378094777,767062507,-1205671094,501960235,1509110,752907523,-378946746,993790955,11535474,-507836437,784924392,1962884311,-229345,116791924,1950351383,386332192,259261184,359809340,293034556,233512964,1023303401,1007055457,738359162,471763744,-386692352,507247715,326369306,512296073,1021902876,775630078,-1327461673,-1330713856,-1155471840,1642332288,-419683248,4766049,34406114,1220108774,1274995200,-430380171,-32315039,825242400,808847885,-16118479,1364458495,1431787038,-387151022,484969971,310016,-2013135384,-1979695066,-2147466970,1526006268,526278493,46816089,-2131719680,2130722598,661971978,1937034494,4261574,83525632,-855764109,-855742092,-1779891339,1959591424,1959591527,1090963047,-1161625344,-1594227726,78708799,547938514,1084755061,-2136471947,-1057094028,-1057046274,-957478900,15878,4261574,-301724672,36366587,1006650016,-2147060544,536887566,-402410301,29032775,23914496,-402652229,-1597832858,-1329397695,28895302,921429684,-169131344,4132480,-397758336,1303642534,129705195,21030912,-402650693,263913786,20244480,-385871429,243269803,-1333788609,25225290,141804980,4261574,-1023365111,-896904880,-523107920,1074185978,109379328,829751359,4138624,1057360112,280034048,-1039474478,-1169028084,1525548018,4130550,-1156418432,-538443756,1961101824,-490132728,-338886914,-396755978,-1973944097,1912649468,-302989749,-1796712816,23497216,-456071984,168092800,8775906,1968045952,-10295037,2028529034,23497216,-1979682072,7203041,-402651205,163250322,9234432,-402650181,230359174,8448000,21227614,1961379186,-62950911,-1409269058,997507108,695550012,-1260334932,-802917884,-1260334880,-803442160,1913173216,-790573034,1912911072,-1260335090,-804752893,1912780000,136360962,-402636506,-389873288,-389873361,-466484880,-1169075517,-919403532,1950394604,-2131107316,-2147466994,-111650215,-322358333,74809512,-336856606,-172833654,-1017488914,-1900008674,2016855512,-1964257024,-982376672,1359065283,-1059927414,1040614489,135492864,-1275052538,-5380089,-1461132662,7792895,263465330,-1962959128,-6690590,-1796676214,6482175,1227676,1375712744,167913145,-502893340,-338886914,-1013097997,216463953,199645264,78758028,-393559853,-1023152092,-973208973,-1979390384,-1979390268,-435215163,719751809,1357435328,-402651461,-863305870,1222693720,-1979324848,-83499324,-1056745383,-436031399,518570762,-1273728512,-14292984,1912621800,4366346,1614569508,-1007156620,4263552,-71042752,45306195,116836659,1971322942,-17309172,-2131528245,-2147466994,645963001,-1652621250,-71083175,-51884002,1041137674,548438016,525869286,1119878351,1397903616,-919402573,-335285062,209027240,243333602,-109051839,-1017554341,1967171820,1091469319,-269803520,92859458,702791,-330629406,108269736,-898249730,1515971563,1168163673,-1597687296,175374407,-402650949,-997523794,-1054162690,-805306429,134358274,-162463958,519767065,1397839442,-1962246424,2019330802,1418454737,1959922440,1961101836,1959591438,1959591487,1582914344,1355751258,-919911698],255,[-1461679380,-502368896,1976303351,30179569,-335944576,1108193299,-301158162,1418416216,-1964228088,-119242528,-2134734246,-974436108,-1337834928,-390533624,-42645501,-336720720,-35,-839844609,972156657,402103538,955422450,-1175227149,1324608755,519319538,1962350836,117242866,1397838366,-1974446250,-773573948,1039174624,74580000,21358936,-1207314712,1049344000,-410976240,-8191952,-1274907344,1489014448,4793994,1168441134,-16,170731576,471402015,117835522,0,173690993,471402015,117835522,0,170731576,1885603455,117833986,0,257052769,421070361,202050818,0,268437504,1073758208,1347430440,1347430440,690825260,689843754,-1291594566,822051584,128976501,-1006717774,1235411082,1662421248,1380982272,-1979399549,727379651,-975663424,1476424734,-2147479367,275907324,-58664701,50950660,133988569,-654114190,-1964756400,-29167932,-301495612,-203273661,-13426856,5127817,6424262,536918272,1912929408,133988363,-1070398348,146081259,-217636680,1611057067,-1610217728,-466485175,378269835,-1031602077,-2071319036,-1561399052,-1976696731,854649988,4891620,976513,-460551378,1276021232,571648,503337151,-205507833,816857771,4800128,-1342016250,1721953855,1532911360,119495257,-1995787057,-402628594,-303366142,6493835,1122944138,1257162122,-1057045366,-1047903506,-812989458,-506335950,1418326411,1648244816,-1962576640,190658,2095628267,63474432,-788509170,-401689351,-1564213310,243990626,1352138828,1319363063,-775386368,-401820423,-782499926,1346866147,-335556632,853510796,-1948003841,244011095,1583284320,525883483,378261255,-1031602077,6725637,242614026,-478093276,-289207777,-385849694,-551223461,-210506800,-269803508,4859530,-1979692640,1593860670,1139366238,-661957633,653706378,-13500342,-523123965,-661994661,1912929408,133988360,-253164684,-1047833855,1946171368,-1963982031,-387765530,-184352654,-855704317,-1336347275,7202848,-872481533,-1930889355,1228832775,125044480,-1174379104,-370277416,-561316121,1048632555,1912733769,1228832792,293012224,64666194,145288272,632355700,1492048050,-8263590,5113347,-259262325,-956378837,-315440386,4861579,-1014305533,4859638,520536067,-1023345792,1465305738,1583326707,1472891587,-1017140237,-2133292291,141690108,1946680448,27715843,-389903533,544538516,-427102165,-806821078,737487871,1976368893,548428021,738183912,1976303357,-10819081,-303309174,1912929408,133988360,-1461124236,1763330,378270603,-1031602077,-333511162,-76217944,27847930,-374473868,-812974553,-242488014,1150019281,-472173744,1277035270,-386211328,-670826801,83656899,-58718094,-385649657,-477494862,-773303984,1509657599,1662421851,113410816,1963043052,-1460864261,-1946455039,-486822973,-36050456,1912929408,133988360,2145977204,-397324287,-74711136,378231641,-1031602077,27847686,-319095947,-76283480,-72694902,-370679225,837352871,76162560,-523058142,-1059926390,1358796521,2025552,-1004345134,1527548454,1971373046,584381965,650185420,-380107640,-1053622921,1347679723,-2142099280,-487129374,29554266,328564,1492159264,-1061432949,50510082,4800128,-1157205498,62456192,-739630585,-1963850774,-792122633,-20118840,-1963428401,1542247139,-1948742973,40495297,-785647477,16892545,-422517040,4800128,-805014778,115855842,-789763553,1961087203,-1262253523,-1947929008,-1963981833,-387765530,-293535616,-276750416,-855760976,-947195531,-2130671384,-31477521,-369789493,-561316645,-1963070229,-389903400,-125107697,-1031679701,-422575871,1048635088,1929773129,-773664763,520505319,-947786454,-472907536,779412432,1354023818,-141826826,-427102165,568910634,1357807872,1357873440,1976368672,-389575951,-276758487,-872538032,-369298059,-561316741,-896865301,-1527556266,-964600225,-947838976,1465262080,-1527526774,-1966907809,-1426892854,13074783,-896903392,-1017140493,-397410124,-125107836,1937783896,-93405690,739240718,-164946304,918937230,-628359044,-523152865,-523116335,1048637443,520486985,1448553586,-156498762,376799427,-2010731350,-2095054971,-822194233,1600056437,-370941369,841415675,648849925,536839474,-745873173,-773265455,-1235855616,-555176956,-154983680,125075650,639971878,637617458,-2010765944,-391380667,-1021116219,1954595574,-1523440118,841359360,639631749,536913288,25528358,1355252512,-1049243906,1195859806,-1662404638,14084347,-326897525,-2131981560,100682046,443686662,76154038,1157645960,536904842,1157645960,-28260733,-336890418,-422473705,-1998060362,13009152,8513568,531689089,-294269186,-1862635841,-310180082,-51016952,521535664,1442873530,571735,1583326963,-1057087884,1242089347,3992949,-1070919052,1053087886,-1064566660,74761995,-756318032,-385301373,-478086377,1371769347,-805305415,182505696,-1963400488,1388534267,-768912559,-1962933831,198779864,-773795373,601394145,-774698023,-1947438111,1515805634,-1977316669,12124484,-2063551808,24443073,-774713095,1944703465,5671154,1352778565,-661957888,653706378,-523173814,-13967151,-1017396477,62148688,6438538,1012404429,1012036616,1012364301,1012364298,-1269140473,112906,-1023536947,4855354,11678581,1964572288,-855460822,4825104,108135484,11994940,146015861,-58060595,721813944,-1978091831,-33535466,1477496266,-17149207,-352144186,16417012,-889260172,11727851,-25104405,-337087208,-402476100,-605355402,84214531,67306243,378208436,-1031602077,78179334,44596853,-2115435659,-1961839616,-1979686122,-331157820,-28645238,-289109308,-443880382,4791946,-1976631510,737645727,1310624707,736874752,721582531,-2147241536,67127614,1048586866,1946615881,-165105117,48794354,719096557,1228833023,74778112,-456129359,-729095213,-288296822,317451984,4863734,-729091958,-393551662,-13443958,28632019,1662421842,130188032,1583307502,522133279,-12537,-1,-400622593,329318931,-3203328,-400622593,278987271,-3203328,-2034959873,1342177994,-1062706460,-2014772363,4241920,364829326,1084788985,633209973,11833593,-855619168,21424144,-1595539280,806117860,-819699226,512451046,737935379,-1898279214,1073789378,-1393297877,-1071357212,-1031728523,-343735296,-1092193008,-393152203,-184942320,434690700,34847239,-1326579536,13690920,-1952097608,-1982125112,-1953460217,1958820615,-398086137,99287226,-1276619856,-399921152,-184942418,12177240,46150176,-69057785,834912266,168636720,825242144,1330776589,822742349,221327416,1380012042,542725193,1128613955,221388875,1380012042,542725193,1128613955,221323339,1061109514,168640319,1642352891,-789127030,-461357020,-423359809,-434065311,-1194371040,-1064435648,1200284714,-754339582,1372097504,-754973511,1506804712,1962903272,-313006074,1385174251,1728497446,637534976,6889100,1730084646,1354979840,-388889423,1476396008,-1878782172,658510887,11996852,-1128066867,2013493251,-387020030,-400687076,278921383,1963009024,-1984890353,-2052037658,362832358,-194976256,-1976646881,-397392380,1012465610,-1007454966,-400622948,-167116677,112399476,-503307800,1976499966,306086133,41222400,28558315,-503312920,1976237822,-486612235,-1013112834,1139193520,-435866696,-423327166,-1973296062,-436007712,-490132639,1976303358,-423326982,145802081,1454989798,-1325473239,-1335761208,-1335761336,-970856707,289542,-154588165,33843974,-136183179,-662019868,1642514608,1085821123,1490587136,-61,-1,-1,65535,0,-2122448896,-1715633755,-8487295,-406585381,-26444033,947715838,940572688,947715708,2084044816,2097086008,269515832,2097052728,31800,406600728,-65536,-406600729,1006698495,1715618406,-1006698436,-1715618407,118489027,-859013873,1715239116,406611558,859773054,1882206271,1669325040,1734566783,1520025830,1021830972,-528443046,-520552712,235012224,239009342,1008205826,2115508350,1717966908,6710886,-612433818,454786011,1665007643,946629688,30924,2122186752,1008205950,1014896766,1008271128,404232318,404226072,1014896664,402653208,403504652,805306368,811662944,0,-20922176,603979776,610729830,402653184,-33220,-16777216,406617855,0,0,2016411648,3158136,1819017264,108,1819017216,1828613374,2083520620,-133400384,-973078480,1714428108,1815609542,-857967048,1616904310,192,806879232,811622496,811597848,806885400,1711276128,1715273532,805306368,808516656,0,805306368,24624,64512,0,805306368,201719856,-1067438056,-964951936,-420028722,1882194044,808464432,-864550660,-866109428,-864550660,-871614452,1008468088,218025068,-1057226722,-871625480,1614282872,-858982208,-855900040,808458252,-864550864,-859014964,-864550792,403471564,805306480,805306416,805306416,805306416,806903856,811647072,24,-67108612,811597824,806882328,-864550816,3151884,-964952016,-1059135778,2016411768,-855847732,1727791308,1717992550,1715208444,1723908288,1828192316,1818650214,1660813560,1651013736,1660813566,1617459304,1715208432,1724825792,-859045826,-858981172,813170892,808464432,203292792,-859042804,1726349432,1718384748,1626341606,1717723232,-289013506,-958988546,-423231290,-959521034,1815609542,1824966342,1727791160,1616936038,-864550672,2027736268,1727791132,1718385766,-864550682,-870551328,-1258553224,808464432,-859045768,-858993460,-859045636,2026687692,-960102352,-285288762,-960102202,1815623788,-859045690,808483020,-956432264,1714559116,1618477310,1616928864,1623195768,101455920,410517506,404232216,940572792,50796,0,0,808517376,24,0,-864285576,1625292918,1717992544,220,-859779976,203161720,-859014132,118,-1057174408,1815609464,1616965728,240,2093796470,1625356300,1717991020,3145958,808464496,786552,-871625716,1625323724,1819831398,812646630,808464432,120,-687931700,198,-858993416,204,-858993544,120,2087085788,61536,2093796470,7692,1617327836,240,209240188,806355192,875573372,24,-858993460,118,2026687692,48,-16853306,108,1815637190,198,2093796556,63500,1680906492,807141628,808509488,404226076,404226072,819986456,808459312,-596246304,0,268435456,-960074696,519766270,184280808,-33065756,-82414388,-1594175713,113639536,-1962934160,-1962906098,-352293866,378141418,243859564,113639534,-352321424,-38,1344207871,-72488878,7079679,117376117,1048772718,1964507246,1816035605,1962979328,-1547687155,1822621806,1879492096,251527424,192217152,4138624,-1173573392,-840039438,-434065380,525883936,-49,-1509949441,602507262,603923455,1476338687,1711219695,1106791920,971790840,788027879,15717096,1860628992,1275022334,-940530433,503316719,820531282,-435441413,551850016,-1005920118,-4979595,568593131,568771594,551952560,7022216,-820028840,-1,-805306369,1397759739,1354256977,-2133291520,16777278,113663860,-1275002880,-1978610417,-400968244,-1269759915,1494273283,-1261292718,-1273967358,168873224,-1342016064,-768388576,399369266,633665114,-1023532683,-545928646,-494218702,2353234,986119770,1523611118,281871028,1734,1510664960,281871028,1734,1532582655,869211992,-1327222062,840420618,-854740764,-963984617,-1963348760,-106436414,-1276628816,-400510727,-3933778,14703594,791753200,942618672,687800114]]},"ibm5160.panel":null,"ibm5160.chipset":{"0":[109,240,109,240],"1":[12,0,null,0,[[false,[0,0],[255,255],[0,0],[255,255],88,null,null],[true,[0,0],[0,0],[0,0],[0,0],65,null,null],[true,[79,78],[255,1],[79,80],[255,1],70,0,null],[true,[16,82],[255,1],[16,84],[255,1],71,0,null]]],"2":[[[0,[19,8,null,9],4,188,0,0,7,11]]],"3":[182,[[[0,0],[0,140],[0,140],[0,0],0,6,48,2,2,true,false,true,195272478],[[18,0],[18,0],[18,0],[121,0],0,4,16,1,1,true,true,true,195272478],[[51,5],[51,5],[51,5],[0,0],0,6,48,2,2,false,false,true,195272478]]],"4":[3,72,null,153,128]},"ibm5160.romHDC":null,"ibm5160.romBASIC":null,"ibm5160.romBIOS":null,"ibm5160.ramLow":null,"ibm5160.keyboard":{"0":[true,true]},"ibm5160.videoCGA":{"0":[false,41,null,null,15,[97,80,82,15,25,6,25,25,2,13,11,12,0,0,0,0]],"1":[true,30,63,9,15,[56,40,45,10,127,6,100,112,2,1,6,7,0,0,0,0]],"2":[2,3,6]},"ibm5160.com1":{"0":[0,0,48,0,1,3,0,96,48,[]]},"ibm5160.com2":{"0":[0,0,48,0,1,3,0,96,48,[]]},"ibm5160.mouse":{"0":[false,-1,-1,0,0,false,false,0]},"ibm5160.fdcNEC":{"0":[0,0,128,[0,0,0,0,0,8,2,42,255],0,0,12,[[0,true,0,2,0,8,9,512,512,102,"PC-DOS 2.00 (Disk 1)","/disks/pc/dos/ibm/2.00/PCDOS200-DISK1.json"],[192,true,0,2,0,null,null,null,null,102,"PC-DOS 2.00 (Disk 2)","/disks/pc/dos/ibm/2.00/PCDOS200-DISK2.json"],[192,true,0,2,0,null,null,null,null,102,null,""],[192,true,0,2,0,null,null,null,null,102,null,""]],[["PC-DOS 2.00 (Disk 1)","/disks/pc/dos/ibm/2.00/PCDOS200-DISK1.json",[["/disks/pc/dos/ibm/2.00/PCDOS200-DISK1.json",1517270209]]],["PC-DOS 2.00 (Disk 2)","/disks/pc/dos/ibm/2.00/PCDOS200-DISK2.json",[["/disks/pc/dos/ibm/2.00/PCDOS200-DISK2.json",-1667401150]]]]]},"ibm5160.hdcXT":{"0":[12,13,[0,2,9,8,1,0,1,50,2,1,50,0,0,11],0,0,null,3,0,-1,[[0,0,false,[1,50,4,1,50,0,0,11],null,2,null,8,10,null,512,512,[["/disks/pc/fixed/win101/10mb.json",-1212644243]]]]]},"ibm5160.debugger":{"0":[61542,61440,1044582],"1":[0,0,0],"2":["d",false,0]}}
Compaq Enhanced Color Graphics Board (EGA) --- The Compaq [EGA ROM BIOS](000412-001B/compaq-ega.json) in [000412-001B](000412-001B/) comes from [bitsavers](http://bitsavers.trailing-edge.com/pdf/compaq/firmware/000412-001B_EGA/). cd 000412-001B filedump --file=http://bitsavers.trailing-edge.com/pdf/compaq/firmware/000412-001B_EGA/108281-001.bin --output=compaq-ega.json
AA E8 05 F4 E8 02 03 DF 8B 33 8E E8 00 D9 9C 42 45 73 E9 00 C4 40 26 3F 75 B8 F0 C0 65 8C 0A 89 08 B8 00 D8 E4 ED 03 CC BA 03 03 CC B3 B7 F7 02 74 BA 03 07 CB B7 A2 00 26 00 1E 00 3E 00 16 00 4D E8 02 03 8A 49 E8 02 B7 80 89 F9 8B 8B 2E BC 01 EF 09 C6 F0 71 33 0B 74 2E BE 01 EE 01 86 E8 56 FB 75 80 89 06 55 52 D2 03 C4 86 E8 01 DC 5A D2 07 B4 0B 74 86 E8 01 ED C8 00 8E E8 04 BA 46 06 C3 BA 46 FC FC FC A8 74 B0 EE 02 B0 EE E8 B0 EE C3 03 D2 06 00 74 F6 89 04 12 07 0E 06 00 74 B6 8A 80 04 10 20 10 20 10 20 10 20 00 0E 0F 0F 00 07 08 C0 00 00 00 00 00 00 01 C0 00 00 00 00 08 E8 00 00 00 00 00 00 01 E8 00 00 00 00 00 01 C0 00 00 00 00 00 00 00 00 00 00 00 01 E8 00 00 00 00 00 00 00 00 00 00 E0 00 00 07 08 0E 00 00 01 00 00 01 02 01 04 01 05 05 06 06 06 08 08 07 07 07 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 10 5D 5D 5D 5D 5D 5D 5D 5D 5E 5E 5E 5E 5E 5D 5D 5E 5E 5D 5D 5D 5D 5D 5D 5D 5D 5D 5D 5D 5E 04 14 06 16 0C 1C 0E 1E 2A 3F 52 16 00 C2 32 EE 58 53 DA E3 00 C3 8A 49 8A 10 80 CF DF 1E 00 D1 5B E8 05 DE 72 E8 04 1D B8 72 E8 05 13 49 B2 D0 D0 D0 D0 E8 FF FB C3 84 B0 EE E4 D4 E8 00 03 CC BA 03 17 75 80 01 FC F5 08 10 0F B4 F9 C4 C3 B0 EE EC E0 5A FA 00 FD FD FD EC FD FD FD FB C4 4A FC 58 1E BA 00 07 8C 3D E8 08 D8 16 5F 4D 36 5F FE 00 8E B8 E8 D8 10 FC FA FC FC 26 05 75 47 F0 16 5F 8B E6 3B E6 77 72 26 1E 5F 1E 5F 0D 70 85 8C 8E 8D 64 33 8E 8D 6A BF 00 AB 36 5F 7C A5 8D 6C BF 01 AB 40 8E 92 3E 00 92 07 C3 BA 00 05 BA 03 0F 42 05 EC 8A D0 D0 D0 0A B3 80 C0 FC 75 8A B0 EE EC 24 8A F6 40 0C 51 06 00 74 80 04 C7 75 B3 B9 C8 D9 20 74 81 80 81 00 72 80 02 0B EB 8A E8 00 E4 0F 1F 81 00 55 C3 BA 00 06 FC 16 00 C2 BF 03 1F 36 05 02 FF 63 01 E8 00 2A E4 03 E8 00 D5 64 2C D0 32 D0 72 8A D0 73 B3 E8 00 D0 D0 9D 09 C3 C7 7D 32 FE E2 8A 1F 53 AC D8 8A FB FA A8 74 87 32 EE AC C3 81 4A D7 90 EC 08 F8 A8 75 BA 03 8A 87 32 EE 8A 8A E8 5A 87 F6 10 01 5A C3 84 B0 EE C8 00 F8 19 CE B0 EE FA 00 FD FD FD FC A8 F8 01 C3 53 52 E8 03 BA 00 24 B1 D2 98 D8 8A B2 BB 04 ED E0 E4 B1 D2 8A E3 BA 00 80 03 E8 E8 00 FB E0 E4 B1 D2 8A E3 BA 00 10 03 E8 E8 00 FB 5A 5B C3 ED 85 B0 EE 84 B0 EE A9 C3 ED A3 32 BA 00 BA 00 C3 53 52 CA D9 B9 01 C5 5A 5B C3 A8 A8 80 A8 A8 80 80 80 08 15 08 08 25 08 15 08 08 25 08 15 08 08 25 06 03 FC FF BA 00 0A BA 03 02 0F BA 03 05 08 F1 B4 B9 A0 D9 C1 01 8B B0 F3 33 B0 AA 00 0F D3 BE 00 01 8B AC C0 2D C8 E2 B0 24 E8 50 F6 FF CB FE 75 AA F8 FE 75 B0 24 E8 50 F6 FE 74 FE 4E 0C 0C E8 FE EB F8 1F 33 F6 3C 73 BF 00 DB 04 BA 03 07 01 6D 8A FE 75 FE D0 E2 B0 EB 32 03 2E 87 08 BA 00 02 8B 63 83 06 32 E8 51 D8 D6 A8 75 E8 51 F4 ED 20 58 8D 8B 8B EC 08 0B 93 73 E2 B0 EB 8B FA 43 B0 EE C0 40 EE 87 EC 08 FB EC 08 FB CA C4 8B EC 08 FB A8 74 E8 51 1A BA C0 0C 72 F8 06 21 FD F9 3B 72 3B F5 BA 00 03 B9 00 36 00 C6 E8 51 D8 D6 A8 74 E8 51 F4 ED 2C 03 8B 8B EC 01 0E 09 73 E2 EB E8 50 D8 D6 A8 75 A8 74 E8 50 F0 E9 30 9D F9 BA 00 08 8B 63 83 06 03 BA 03 0F DA 90 EC 08 F8 DA 32 8A EE E0 DA A8 75 EC 24 3C 75 80 10 DA F2 C0 B4 B0 E8 4F 20 B4 B0 32 B3 B9 00 AD BA 00 09 8B B9 00 C0 B4 87 FB FA A8 74 87 B0 EE C4 8A 87 EC 01 FB FB 30 30 0C C4 E2 F8 1D 80 02 90 E4 B1 D2 D0 D0 B1 D2 0A 0A E8 FC C3 BA 00 36 BA 00 C0 EE C3 84 B0 EE 99 BA 03 01 B0 B9 02 EE FD EE B0 EE 00 EB EE C7 B0 EE FD BA 03 3C 75 E2 4A 01 42 3F FD EE FD C7 B0 EE FD BA 03 3C 75 E2 4A 00 42 00 FD EE FD C7 B0 EE C9 B9 00 3C 75 E2 BA 03 00 BA 03 03 EC 00 16 F9 03 BA 03 C0 C8 FE 42 E2 F8 06 40 35 F9 04 05 06 07 00 18 00 09 00 63 27 90 A0 1F C7 07 00 00 8E 14 96 A3 00 02 04 06 10 12 14 16 08 0F 00 00 00 0E FF 18 00 09 00 63 27 90 A0 1F C7 07 00 00 8E 14 96 A3 00 02 04 06 10 12 14 16 08 0F 00 00 00 0E FF 18 00 01 00 63 4F 82 81 1F C7 07 00 00 8E 28 96 A3 00 02 04 06 10 12 14 16 08 0F 00 00 00 0E FF 18 00 01 00 63 4F 82 81 1F C7 07 00 00 8E 28 96 A3 00 02 04 06 10 12 14 16 08 0F 00 00 00 0E FF 18 00 09 00 63 27 90 80 1F C1 00 00 00 8E 14 96 A2 00 15 02 06 10 12 14 16 01 03 00 00 00 0F FF 18 00 09 00 63 27 90 80 1F C1 00 00 00 8E 14 96 A2 00 15 02 06 10 12 14 16 01 03 00 00 00 0F FF 18 00 01 00 63 4F 82 80 1F C1 00 00 00 8E 28 96 C2 00 17 17 17 17 17 17 17 01 01 00 00 00 0D FF 18 00 00 00 A6 4F 82 81 1F 4D 0C 00 00 85 28 63 A3 00 08 08 08 10 18 18 18 0E 0F 00 00 00 0A FF 18 00 21 00 63 4F 82 81 1F 40 00 00 00 8E 28 96 E3 00 02 04 14 38 3A 3C 3E 01 0F 00 00 00 05 FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 18 00 00 00 23 27 37 15 11 47 07 00 00 24 14 E0 A3 00 02 04 06 10 12 14 16 08 0F 00 00 00 0E FF 00 00 29 00 62 4F 82 81 1F 40 00 00 00 8E 28 96 E3 00 00 00 00 00 00 00 00 01 0F 00 0F 00 05 FF 00 00 29 00 63 4F 82 81 1F 40 00 00 00 8E 28 96 E3 00 00 00 00 00 00 00 00 01 0F 00 0F 00 05 FF 18 00 09 00 63 27 90 80 1F C0 00 00 00 8E 14 96 E3 00 02 04 06 10 12 14 16 01 0F 00 00 00 05 FF 18 00 01 00 63 4F 82 80 1F C0 00 00 00 8E 28 96 E3 00 02 04 06 10 12 14 16 01 0F 00 00 00 05 FF 18 00 05 00 A2 4F 1A E0 1F 00 00 00 00 2E 14 5E 8B 00 00 18 00 00 00 00 00 0B 05 00 00 00 07 FF 18 00 05 00 A7 4F 17 BA 1F 00 00 00 00 2B 14 5F 8B 00 00 04 00 00 00 04 00 01 05 00 00 00 07 FF 18 00 01 00 A2 4F 82 80 1F 40 00 00 00 85 28 63 E3 00 00 18 00 00 00 00 00 0B 05 00 00 00 05 FF 18 00 01 00 A3 4F 82 80 1F 40 00 00 00 85 28 63 E3 00 02 04 14 38 3A 3C 3E 01 0F 00 00 00 05 FF 18 00 09 00 A3 27 90 A0 1F 4D 0C 00 00 85 14 63 A3 00 02 04 14 38 3A 3C 3E 08 0F 00 00 00 0E FF 18 00 09 00 A3 27 90 A0 1F 4D 0C 00 00 85 14 63 A3 00 02 04 14 38 3A 3C 3E 08 0F 00 00 00 0E FF 18 00 01 00 A3 4F 82 81 1F 4D 0C 00 00 85 28 63 A3 00 02 04 14 38 3A 3C 3E 08 0F 00 00 00 0E FF 18 00 01 00 A3 4F 82 81 1F 4D 0C 00 00 85 28 63 A3 00 02 04 14 38 3A 3C 3E 08 0F 00 00 00 0E FF 18 00 08 00 67 27 90 A0 1F 4F 0E 00 00 8E 14 96 A3 00 02 04 14 38 3A 3C 3E 0C 0F 00 00 00 0E FF 18 00 00 00 67 4F 82 81 1F 4F 0E 00 00 8E 28 96 A3 00 02 04 14 38 3A 3C 3E 0C 0F 00 00 00 0E FF 18 00 00 00 66 4F 82 81 1F 4F 0E 00 00 8E 28 96 A3 00 08 08 08 10 18 18 18 0E 0F 00 00 00 0A FF 1D 00 01 00 E3 4F 82 80 3E 40 00 00 00 8C 28 E7 C3 00 3F 3F 3F 3F 3F 3F 3F 01 0F 00 00 00 05 FF 1D 00 01 00 E3 4F 82 80 3E 40 00 00 00 8C 28 E7 E3 00 02 04 14 38 3A 3C 3E 01 0F 00 00 00 05 FF 18 00 01 00 63 4F 82 80 1F 41 00 00 00 8E 28 96 A3 00 02 04 06 08 0A 0C 0E 41 0F 00 00 00 05 FF 10 2F 3F 3F 3F 3F 2F 10 00 00 00 00 27 37 3F 3F 3F 3F 37 27 1F 1F 1F 1F 31 3A 3F 3F 3F 3F 3A 31 2D 2D 2D 2D 07 15 1C 1C 1C 1C 15 07 00 00 00 00 11 18 1C 1C 1C 1C 18 11 0E 0E 0E 0E 16 1A 1C 1C 1C 1C 1A 16 14 14 14 14 04 0C 10 10 10 10 0C 04 00 00 00 00 0A 0E 10 10 10 10 0E 0A 08 08 08 08 0C 0F 10 10 10 10 0F 0C 0B 0B 0B 0B 01 03 05 07 01 03 05 07 39 3B 3D 3F 39 3B 3D 3F 01 03 05 07 01 03 05 07 39 3B 3D 3F 39 3B 3D 3F 01 03 05 07 09 0B 0D 0F 11 13 15 17 19 1B 1D 1F 21 23 25 27 29 2B 2D 2F 31 33 35 37 39 3B 3D 3F 00 00 00 00 07 07 07 07 00 00 00 00 3F 3F 3F 3F 00 00 00 00 07 07 07 07 00 00 00 00 3F 3F 3F 3F 01 03 05 07 39 3B 3D 3F 05 0B 11 18 20 28 32 3F 80 BF 04 1D 05 FC 73 FB 56 40 8E 06 57 51 8B FC 00 80 49 07 08 00 72 BF A0 C4 F0 C4 E6 00 E6 FF 40 5A 5B 5D 5E 58 02 58 42 90 12 14 15 15 15 15 16 16 18 19 1A 1B 1D 1D 1E 14 1F 22 25 26 2D 2D 2D 2D 2D 2D 27 28 29 2D E0 7F E4 3C 76 C6 84 18 06 00 00 0E 00 33 8E 8D 7A A3 01 0E 01 C3 0E 00 E1 8A 89 F6 01 1E D8 FF 16 00 E2 2E 97 14 16 00 F2 EE D6 EA 4F 1E 00 FB EF FB EF D7 D9 E3 E3 FB D7 DD E3 E3 E3 DF D3 E3 0A 75 8A 80 07 C6 F2 C6 74 8B 10 80 30 EB EB EB EB FF 8A 86 80 7F CC C5 74 E8 01 0E 00 D4 8A 80 07 C3 80 20 D3 16 00 33 A3 00 62 8D 50 B9 00 07 AB E8 45 16 00 C2 FA BA 03 20 FB 16 00 C2 EC 1E 00 FF FB 73 2E 87 14 65 2E 87 14 66 32 89 10 C3 06 53 A2 00 6D 8C 26 37 C4 04 C3 86 D1 D1 03 33 8E AC A3 00 26 84 AC A3 00 26 4C 8E E8 48 0D E8 48 5C 8E F6 87 80 39 00 80 49 07 08 00 7C BF A0 C7 79 40 26 00 D8 C8 3E 00 20 80 49 07 09 3E 00 76 33 F3 8B 86 E8 00 D1 5A 58 1F C3 EA EA E2 80 FD CA D8 FF 16 00 F2 E2 80 0F E5 D3 ED 0A 9E 88 88 86 2E AF 14 2E 00 90 87 24 0A 49 88 10 4A 88 11 62 88 05 C3 01 07 20 20 20 30 00 00 20 30 20 20 08 08 08 08 08 08 08 0B 08 08 08 0B 08 08 08 0B 08 08 08 08 80 00 00 80 00 00 00 00 28 29 2E 29 30 30 30 30 06 00 F9 03 66 8B 8B 85 8B 63 89 60 F6 20 05 00 EB 0A 74 80 20 2F 06 00 75 3A 76 8A 8A FE EB 80 03 17 C0 E6 C4 3A 73 FE 80 03 02 C0 4B E8 44 CA D6 0A E5 B0 8A EF 46 F8 90 DF FF E3 97 00 EB 1E 00 09 CA 16 00 57 F8 90 DF FF E3 97 00 0E 00 4E 89 00 C3 CB E6 E2 E3 0C D3 2D E3 CC E6 25 C0 15 E2 E6 C3 FB 72 FE 8A 8A 2A EB 8A FE 74 8A FE D0 FE C3 4A F6 32 03 8B 4E D1 03 8A 8A B0 EF 0E E1 C3 C3 D8 07 D8 02 D8 1E 00 4C 32 F7 A3 00 16 00 FA 76 80 07 02 E8 16 00 C8 E0 0D EF E5 0C FB E3 8F 00 9D F8 00 90 1E 00 39 8E 8A 4A 3A 72 8A FE 80 01 DC 0C CA F5 D1 DE DA 04 F5 D1 C6 C2 3E 00 76 80 49 07 6F 0C 3E 00 72 E9 00 C3 EB EA E5 00 E5 F8 C5 E3 ED C1 E0 C6 8B F6 85 79 F7 F7 D1 03 96 06 00 74 E8 41 06 84 74 3A 73 2A 8A F3 03 03 FE 75 8A 8A B0 8A F3 03 FE 75 1F 87 80 49 06 04 E1 E2 50 52 8A 32 98 40 F7 03 03 97 F0 BA 01 E2 F6 10 D8 DD C7 20 3E 00 74 47 C7 1F 5A 8B 84 74 3A 73 2A 50 E6 E6 C6 F0 FB CA A4 F0 FB F6 20 F7 20 CA A4 C5 DD CE E0 8A D0 D0 58 C4 FB CA AA FB F7 20 CA AA DD CE EA F9 52 EB E5 00 3E 00 75 D1 D1 D1 8B 2A 8A 98 A0 00 E5 C2 F7 5A ED 3E 00 75 2B D1 D1 D1 03 03 03 97 F0 26 00 E5 8A B6 80 49 13 06 E2 E2 E2 EA F6 04 D8 DD C7 84 74 3A 73 2A 50 3E 00 74 52 CE B8 01 BA 03 02 EF A0 00 E3 8C 8E 8B F3 03 03 48 F5 58 D8 85 F6 96 DA 3E 00 74 BA 03 05 EF C4 32 B0 B4 EF 8A B0 F3 EB 8B 8A F3 03 4E F5 22 02 E7 8A 5F FF AA FD 75 B0 B4 EF 0A 06 00 74 E8 3F C3 53 52 01 3A 76 8A A1 00 FF E3 F0 59 58 00 C7 26 00 FC 76 80 07 0B 51 67 E8 00 C5 32 E8 3E C3 51 04 C3 75 86 8B D1 0B B4 86 D1 D0 D1 E2 86 AA F6 20 F7 E0 E3 83 50 D2 33 8E C5 7C 8C B5 B1 EB E8 3E C3 1E 00 77 51 13 22 F9 D2 04 AD 01 D0 80 01 D0 E2 8A AA CF 1C C6 01 E0 CE B0 B4 EF 04 D0 03 E2 B0 B4 EF B5 33 8B 33 8E C5 0C 8B 86 86 E8 00 11 DA F3 DA 09 E5 49 72 02 32 41 E1 FF E1 46 F8 90 8B 85 41 E1 FF E1 FC 0E 00 16 1F C3 06 00 74 8B 63 83 06 A8 75 FA A8 74 26 05 C3 51 55 D1 F6 EA D5 F4 C6 DF 8B 8B 8B F3 74 03 FE 75 32 5E FB EB 5E C6 CD F1 FB 8A 5D 59 C3 C7 26 00 FC 76 80 07 05 77 EB 8B 8B E8 3D DE CD E3 1E 00 16 00 C2 F6 04 0F F0 A8 75 FA A8 74 8B AB E2 F8 90 C7 26 00 FC 76 80 07 05 2F EB 8B E8 3C CD 1E 00 16 00 C2 F6 04 0F F8 A8 75 FA A8 74 8A AA 47 E7 C3 D3 FA E9 FC 74 80 07 02 FF E8 3C 8B 85 87 8B 33 80 13 10 EA E5 80 7F FB 72 E9 00 DE 36 01 E4 E1 F0 DA F1 EE 56 04 8A 8A D0 72 8A 8A D0 72 8A AB C9 EB CD 06 C7 01 DC 5F C7 4D D0 F4 8E C5 0C A8 74 33 8E C5 7C 24 F6 03 80 03 56 8A AC FB 74 53 08 F8 E0 E0 E7 02 C2 CB F2 86 0A 74 26 05 89 EB 0A 74 26 05 88 81 00 80 80 03 C7 FE 75 5F 5B 80 06 01 4D AC 82 8A 8B 4A B7 22 86 8E C5 0C F6 03 52 ED 25 8A BA 03 02 8A 33 86 26 35 FA CC F7 D3 8A BA 03 02 EB BA 03 02 E7 BA 03 03 18 56 33 86 8A 0A 74 26 05 26 05 FA CC EF D3 5E 5A 75 8A BA 03 02 BA 03 E4 03 C3 06 00 F9 2B 2E 00 26 00 FC 74 77 80 03 3F FF 0F 79 8A E8 00 11 FF EB E8 00 C3 FF 1E 61 80 0F 59 CC 81 B5 E8 00 FC 77 B5 E8 00 43 51 EB 80 06 23 FF 17 35 32 E8 00 00 BB B5 E8 00 6D EB E8 00 65 EB 0A 75 E8 00 C9 37 B5 E8 00 03 11 F8 90 66 24 80 1F C3 66 C3 E3 B1 D2 A0 00 DF C3 66 C5 A8 C4 04 34 90 36 00 7C C5 8A 32 B1 D3 03 80 0F FF C3 03 8A C3 06 E8 D4 F6 E2 F2 01 03 C6 F6 20 03 C6 80 10 C5 BA 03 EA 90 EC 08 F8 EA 24 0A E8 39 C3 FE B0 EE FE 75 C3 56 93 90 EC 08 F8 BA 03 E8 39 FC 75 FE E8 40 C4 20 86 FB C3 C7 FF 1E 00 FB 75 E8 01 88 F8 80 07 14 FB 77 8B 86 98 26 00 D7 F8 C7 E3 CF 80 07 54 E3 0F 8A 22 F6 86 B0 BA 03 0A 74 B0 B4 EF 02 E1 C4 EF 8A EB B0 8A BA 03 F6 26 1D D3 02 E1 26 1D 02 E5 B0 32 BA 03 B0 FE EF 14 22 D2 0A 74 26 05 06 22 0A AA C3 C7 FF 1E 00 FB 75 E8 00 8A EB 80 07 0D FA C7 F7 4C 8B 8B 8A E8 00 FC 72 D2 B0 32 BA 03 04 DF 26 2D EB ED E7 FD C8 EE C7 09 8A F6 22 D2 88 10 C3 FC 77 74 D1 73 81 00 D1 D1 D1 D1 03 D1 D1 03 B7 80 06 04 D1 E7 DF D3 D1 EA EA EA FA D1 E1 D2 C3 F9 06 E2 FA E2 E2 FA 00 0E 00 F9 ED CE E6 94 00 0D 19 41 0A 41 08 31 07 0B 84 B9 01 D1 F8 B9 00 57 E8 FB 5F FE 3A 4A 72 32 FE 3A 84 76 FE EB 84 74 FE EB 32 EB 3A 84 73 FE 8A 62 E8 F6 C3 57 8A 62 E8 F6 00 3E 00 76 80 49 07 0A 3E 00 7D 8A 11 5F B8 06 C9 16 00 CA 0D F8 00 06 00 F9 22 1C 72 8B 8B 63 1E 1F 26 3E 00 C4 04 D1 93 FF 54 F8 90 1F 1F 1F 20 22 22 22 20 20 20 22 22 22 22 22 22 21 22 21 21 22 21 22 22 22 22 22 22 C4 83 06 90 EC 08 F8 BA 03 51 E8 3E 20 FB 90 C4 31 83 06 90 EC 08 F8 BA 03 31 E8 3D C3 00 10 EA C5 BA 03 ED EA 90 EC 08 F8 EA E8 37 DB FE FE FE 74 87 EC 08 E8 EA E8 36 C3 FE FE 74 FE 75 B0 EE EB B0 EE EA 90 EC 08 F8 EA 31 E8 36 CC 99 FB 90 03 E0 08 C8 40 8E A0 00 D5 98 C4 E8 E8 D8 C2 EC C0 B4 2E 87 09 F7 C1 95 C3 E0 C2 8B FB FA A8 74 8A BA 03 42 8A 4A DA 87 B0 EE 88 05 90 31 C2 FB FA A8 74 8A BA 03 42 FB 46 C3 D8 C0 FE 00 10 F2 C6 BA 03 ED F2 90 EC 08 F8 F2 C4 42 4A FE FE FE 74 87 EC 08 E8 F2 C4 42 4A FE FE 74 87 EC CD EA F2 20 FB BE F2 87 B0 EE F2 90 EC 08 F8 F2 31 42 AA C3 66 8B 02 C4 40 8E F6 89 02 03 E7 50 C2 FB FA A8 74 8A BA 03 EB EB BA 03 E8 3E 90 E0 9D BB 00 C3 C8 8A EE 00 00 C4 C9 AC D8 8A AC C3 F6 89 02 03 9B E8 3D D8 83 C3 D8 FF FB 73 D1 2E 97 21 90 21 21 C2 FB FA A8 74 B0 BA 03 42 4A 7F 07 E4 C4 FB 90 C2 8B FB FA A8 74 B0 BA 03 42 F6 24 4A 07 E8 E0 C8 E4 DA 87 B0 EE C4 FB 90 E0 C2 FB FA A8 74 8A BA 03 BA 03 00 00 88 01 00 88 03 00 88 02 C3 DB C3 FE E0 CD BA 03 C4 EB EB FE BA 03 AA 00 AA 00 AA E5 C5 C3 C6 EE 90 C6 EC 46 C3 C2 8B EC C0 B0 EE EC 8A 87 EC DA 30 42 24 B1 D2 8A F6 80 80 E1 EC 46 C3 E0 6B BA 03 C4 EB EB BA 03 EC D8 00 8A EB EC C3 E8 3C C8 86 EE C4 C9 E8 3C C4 CF 4D C3 00 30 04 2E C3 03 18 06 00 75 32 B1 D3 D2 80 02 72 09 90 DF 75 BA 03 E3 03 F8 90 D9 C0 D8 16 00 FF 3A 16 01 CF 32 07 16 3F CF 28 16 4E CF 20 16 52 CF 18 16 4D CF 10 16 2E CF 08 16 3E CF 14 D9 46 89 08 85 89 02 84 88 00 C3 07 D2 DA C0 0D 4E 89 7C 8C 7E EB FE 75 06 4E 89 0C 8C 0E 07 4E EB FE 75 8D 4C B9 00 18 C8 09 36 4E 08 EB FE 75 8D 08 B9 00 36 01 0E 01 89 85 8A 04 FF 46 0A 74 B0 80 03 05 8A DC FE 26 84 32 26 1E 00 8B 50 3A 76 8A 26 97 00 C3 0E 2B A0 00 16 00 C7 8B 58 53 8A 33 C5 08 5E 8B 02 56 0A 74 8D 08 BB 00 04 0B FC 75 8D 08 EB 8D 4C BB 00 C8 0B FC 75 8D 4C EB 8D 7A BB 00 C8 06 5B E9 00 FB 5E B9 01 D2 1F 57 CB 5F 8B 0B 74 53 0B 59 C4 A8 8B 63 58 79 E8 33 CD CD CD FE 8A 75 B8 00 FB 74 8A 05 DB 0A 0E FE 74 B8 00 DF FF 2F EB E8 F0 16 00 C2 FA BA 03 20 FB FF 1E 00 97 00 36 00 08 36 00 97 00 C3 53 A3 00 C8 E0 09 42 24 0A EE 03 8C C4 A8 26 37 5B 86 D1 D1 03 8A 1C 01 F6 13 74 D1 8E 99 0E 00 F1 FF 74 8A FE A2 00 C0 F7 48 16 00 E0 12 E8 34 FB 75 B0 8A EF 4A 8A 84 FE F6 D1 A3 00 00 FB 74 80 20 4E EB 80 07 09 FF E3 FF 66 F9 90 25 26 26 26 26 26 26 87 8A 80 02 01 EC 60 05 E8 46 88 10 88 8A 80 F0 04 EC 0F 46 F8 90 C0 C0 06 2D A3 00 8C 16 C3 03 4D 26 00 C4 75 8A 89 8A 88 BA 10 C4 74 0A 74 04 B2 98 E0 F8 01 E7 CC F4 F4 F6 F7 23 2E 8D 26 EC D9 3E 00 1E 00 46 12 F8 90 80 00 10 00 10 02 16 26 00 03 E0 E4 0A 88 89 C7 10 00 C3 02 11 01 03 E0 06 E8 EE 46 12 F8 90 02 18 01 26 00 01 E0 E4 0A 88 89 C7 10 00 C3 02 16 26 00 00 E0 E4 0A 88 87 C7 10 00 C3 46 12 F8 90 02 18 05 E0 E0 C4 B0 EE EC DF C4 C7 10 00 C3 03 32 FB F3 FB E6 00 E6 B4 00 02 CD E3 C4 08 AC E8 00 E2 5A 46 01 08 7E B4 E8 30 C3 0D 47 15 0A 11 08 0D 07 02 37 0E 95 EB 8A 32 D1 8B 50 D1 86 3C 75 32 B4 E8 30 3C 75 84 74 FE B4 E8 30 3C 75 EB 8B 04 46 02 04 26 93 01 B4 E8 30 DF FF E3 97 00 EB DF C2 16 00 04 D2 06 02 2F C3 C6 36 00 F2 CE 02 1F 80 49 03 0D 3E 00 74 8A 32 EB B4 E8 30 DF FC 52 56 55 B4 B0 33 8A 4A FE E8 EE 5D 5E 5A 86 C3 3E 00 C4 10 C4 02 C0 33 E3 0F C3 8A 32 8B 83 04 F2 74 86 8B 26 0D ED C7 F2 75 2B 83 06 C7 E8 8A EB A0 00 D1 8B 26 59 A0 00 07 C0 E8 E8 E8 FB 74 24 32 74 86 EB BB FF 5E B8 00 46 F8 90 DB 03 24 FC 7E 8D D0 AB C8 B9 00 36 00 A5 03 8D 84 F3 26 45 B8 1A 39 8B AB 1E 00 FF 8A ED 32 04 80 00 7F 2E 87 2D E0 0F 8A B1 D2 79 B0 F6 89 10 0B C8 06 00 75 FE AA 03 C4 EE EC D8 E8 E8 F8 E0 EC E3 03 04 0B 86 AB D8 0F 26 00 87 8A F6 24 B1 D2 0A 8B 63 83 06 BA 03 30 42 24 D0 D0 0A 8A AA D5 C0 03 F3 8A 24 B1 D2 AA C0 DF 02 01 06 36 00 5C 8C 0B 74 0C C4 08 C1 CB 02 04 5C 8C 0B 74 0C C5 10 5C 8C 0B 74 0C C4 02 C3 C9 CB 02 20 1F 32 B9 00 AA 46 1B F8 90 3C 72 74 E9 01 E1 00 05 C0 80 BB 00 E9 D3 D1 83 00 E9 03 C3 E9 03 E1 00 05 C0 5E 8B 83 20 E9 03 41 26 3F C4 EC 8B 63 EC 8B BA 03 AA C0 EC 32 B5 BA 03 C4 42 AA C4 FE 75 BA 03 AA E4 19 D6 C4 42 AA C4 FE 75 83 06 E4 C0 B5 FB FA A8 74 87 8A EE EC AA C4 CD 10 F2 A8 75 87 B0 EE D6 D9 30 04 F2 87 8A EE 42 AA 87 FE FE 75 83 06 F2 E4 CE B5 8A EE EC 4A C4 CD F3 C6 BA 03 02 42 8A B0 EE B0 EE EC B0 EE CE B0 EE EC E0 04 4A 05 42 50 01 1E 00 8E A2 FF B0 EE EC 32 B5 8A EE FF AA C4 CD F3 EE 4A 05 58 EE B0 EE 8A EE C4 B0 EE 58 4A 02 42 C4 4A 8A 20 8B 26 47 EE CE 26 47 EE D6 C2 EC C0 26 47 EE E9 4D 89 02 1E 10 24 AA 0F 8D 49 F3 B9 00 36 00 A4 36 00 02 F3 33 8E BE 00 02 F3 BE 00 02 F3 BE 00 02 F3 BE 01 02 F3 1F D0 72 E9 01 89 04 C7 ED BA 03 AA C7 32 EE C9 B9 01 AA 00 AA 00 AA F4 8D 81 07 75 33 E9 01 06 07 E9 03 FC 8B 83 42 B8 A0 C0 C4 B0 B4 EF CE B0 B4 EF 05 00 BA 03 02 B4 B5 42 C4 AC A2 FF E4 CD F2 0F A0 FF 8B 83 04 BF 00 8A B4 B0 EF C4 86 EF C4 C4 75 BA 03 EE C4 B0 8A EF 54 B0 32 EF E4 19 86 EF C4 C4 CD F4 C2 BF 03 E4 10 90 EC 08 F8 FA C4 AC FE FE 74 87 EC 08 EC D7 20 87 EB B4 B5 87 EC FA C4 FB EE FA C4 CD EF EA 8B BA 03 E4 09 86 EF C4 C4 CD F4 37 C4 AC 8B AC BA 03 EE D7 C2 EC C0 AC D0 73 51 77 AC 80 10 CF 08 10 B9 00 3E 00 A5 07 8D 84 F3 8D A8 B9 00 A5 33 8E BF 00 02 F3 BF 00 02 F3 BF 00 02 F3 BF 01 02 F3 07 D0 73 8B 04 BA 03 EE C8 32 EE C9 B9 01 EE 00 EE 00 EE F4 1C 89 10 5E F8 0F 0F 03 01 7F 7F 7F 0F 0F 0F 88 88 01 01 00 00 00 04 12 31 00 C3 C3 C3 2D 2D 2D 2D 2D 2D 08 0E E4 F0 E6 2F 2E A4 2D C3 90 90 C3 1D 46 00 C7 02 00 89 24 D0 D0 34 04 32 89 00 C3 C3 06 00 F9 01 C3 0D DB 05 21 EB E8 2A C3 53 52 BB 00 DB 01 06 01 01 41 B4 CD 8A 51 03 10 52 D2 34 72 B4 CD B4 CD E8 00 13 C2 D5 ED D2 C6 36 00 DE 12 1A 5A 02 10 88 00 1F 59 58 B0 E8 00 16 0A 33 84 75 B0 B4 CD F6 01 01 5A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 81 81 BD 81 7E 00 00 00 FF FF C3 FF 7E 00 00 00 00 FE FE 7C 10 00 00 00 00 38 FE 38 00 00 00 00 18 3C E7 18 3C 00 00 00 18 7E FF 18 3C 00 00 00 00 00 3C 18 00 00 00 FF FF FF C3 E7 FF FF FF 00 00 3C 42 66 00 00 00 FF FF C3 BD 99 FF FF FF 00 0E 32 CC CC 78 00 00 00 66 66 3C 7E 18 00 00 00 33 30 30 70 E0 00 00 00 63 63 63 67 E6 00 00 00 18 DB E7 DB 18 00 00 80 E0 F8 F8 E0 80 00 00 02 0E 3E 3E 0E 02 00 00 00 3C 18 18 3C 00 00 00 00 66 66 66 00 66 00 00 00 DB DB 1B 1B 1B 00 00 7C 60 6C C6 38 C6 00 00 00 00 00 00 FE FE 00 00 00 3C 18 18 3C 7E 00 00 00 3C 18 18 18 18 00 00 00 18 18 18 7E 18 00 00 00 00 18 FE 18 00 00 00 00 00 30 FE 30 00 00 00 00 00 00 C0 FE 00 00 00 00 00 28 FE 28 00 00 00 00 00 38 7C FE 00 00 00 00 00 FE 7C 38 00 00 00 00 00 00 00 00 00 00 00 00 3C 3C 18 00 18 00 00 66 66 00 00 00 00 00 00 00 6C FE 6C FE 6C 00 00 18 C6 C0 06 86 7C 18 00 00 00 C6 18 60 86 00 00 00 6C 38 DC CC 76 00 00 30 30 00 00 00 00 00 00 00 18 30 30 30 0C 00 00 00 18 0C 0C 0C 30 00 00 00 00 66 FF 66 00 00 00 00 00 18 7E 18 00 00 00 00 00 00 00 18 18 00 00 00 00 00 FE 00 00 00 00 00 00 00 00 00 18 00 00 00 00 06 18 60 80 00 00 00 6C C6 D6 C6 38 00 00 00 38 18 18 18 7E 00 00 00 C6 0C 30 C0 FE 00 00 00 C6 06 06 06 7C 00 00 00 1C 6C FE 0C 1E 00 00 00 C0 C0 06 06 7C 00 00 00 60 C0 C6 C6 7C 00 00 00 C6 06 18 30 30 00 00 00 C6 C6 C6 C6 7C 00 00 00 C6 C6 06 06 78 00 00 00 00 18 00 18 00 00 00 00 00 18 00 18 30 00 00 00 06 18 60 18 06 00 00 00 00 7E 00 00 00 00 00 00 60 18 06 18 60 00 00 00 C6 0C 18 00 18 00 00 00 7C C6 DE DC 7C 00 00 00 38 C6 FE C6 C6 00 00 00 66 66 66 66 FC 00 00 00 66 C0 C0 C2 3C 00 00 00 6C 66 66 66 F8 00 00 00 66 68 68 62 FE 00 00 00 66 68 68 60 F0 00 00 00 66 C0 DE C6 3A 00 00 00 C6 C6 C6 C6 C6 00 00 00 18 18 18 18 3C 00 00 00 0C 0C 0C CC 78 00 00 00 66 6C 78 66 E6 00 00 00 60 60 60 62 FE 00 00 00 EE FE C6 C6 C6 00 00 00 E6 FE CE C6 C6 00 00 00 C6 C6 C6 C6 7C 00 00 00 66 66 60 60 F0 00 00 00 C6 C6 C6 D6 7C 0E 00 00 66 66 6C 66 E6 00 00 00 C6 60 0C C6 7C 00 00 00 7E 18 18 18 3C 00 00 00 C6 C6 C6 C6 7C 00 00 00 C6 C6 C6 6C 10 00 00 00 C6 C6 D6 FE 6C 00 00 00 C6 7C 38 6C C6 00 00 00 66 66 18 18 3C 00 00 00 C6 0C 30 C2 FE 00 00 00 30 30 30 30 3C 00 00 00 80 E0 38 0E 02 00 00 00 0C 0C 0C 0C 3C 00 00 38 C6 00 00 00 00 00 00 00 00 00 00 00 00 FF 00 30 00 00 00 00 00 00 00 00 00 78 7C CC 76 00 00 00 60 78 66 66 7C 00 00 00 00 7C C0 C0 7C 00 00 00 0C 3C CC CC 76 00 00 00 00 7C FE C0 7C 00 00 00 6C 60 60 60 F0 00 00 00 00 76 CC CC 7C CC 00 00 60 6C 66 66 E6 00 00 00 18 38 18 18 3C 00 00 00 06 0E 06 06 06 66 00 00 60 66 78 6C E6 00 00 00 18 18 18 18 3C 00 00 00 00 EC D6 D6 C6 00 00 00 00 DC 66 66 66 00 00 00 00 7C C6 C6 7C 00 00 00 00 DC 66 66 7C 60 00 00 00 76 CC CC 7C 0C 00 00 00 DC 66 60 F0 00 00 00 00 7C 60 0C 7C 00 00 00 30 FC 30 30 1C 00 00 00 00 CC CC CC 76 00 00 00 00 66 66 66 18 00 00 00 00 C6 D6 D6 6C 00 00 00 00 C6 38 38 C6 00 00 00 00 C6 C6 C6 7E 0C 00 00 00 FE 18 60 FE 00 00 00 18 18 18 18 0E 00 00 00 18 18 18 18 18 00 00 00 18 18 18 18 70 00 00 00 DC 00 00 00 00 00 00 00 00 38 C6 C6 00 00 00 00 66 C0 C0 66 0C 7C 00 00 00 CC CC CC 76 00 00 0C 30 7C FE C0 7C 00 00 10 6C 78 7C CC 76 00 00 00 00 78 7C CC 76 00 00 60 18 78 7C CC 76 00 00 38 38 78 7C CC 76 00 00 00 00 66 60 3C 06 00 00 10 6C 7C FE C0 7C 00 00 00 00 7C FE C0 7C 00 00 60 18 7C FE C0 7C 00 00 00 00 38 18 18 3C 00 00 18 66 38 18 18 3C 00 00 60 18 38 18 18 3C 00 00 C6 10 6C C6 C6 C6 00 00 6C 00 6C C6 C6 C6 00 00 30 00 66 7C 60 FE 00 00 00 00 CC 36 D8 6E 00 00 00 6C CC CC CC CE 00 00 10 6C 7C C6 C6 7C 00 00 00 00 7C C6 C6 7C 00 00 60 18 7C C6 C6 7C 00 00 30 CC CC CC CC 76 00 00 60 18 CC CC CC 76 00 00 00 00 C6 C6 C6 7E 0C 00 C6 7C C6 C6 C6 7C 00 00 C6 C6 C6 C6 C6 7C 00 00 18 3C 60 60 3C 18 00 00 38 64 F0 60 60 FC 00 00 00 66 18 18 18 18 00 00 F8 CC C4 DE CC C6 00 00 0E 18 18 18 18 18 70 00 18 60 78 7C CC 76 00 00 0C 30 38 18 18 3C 00 00 18 60 7C C6 C6 7C 00 00 18 60 CC CC CC 76 00 00 00 DC DC 66 66 66 00 00 DC C6 F6 DE C6 C6 00 00 3C 6C 00 00 00 00 00 00 38 6C 00 00 00 00 00 00 00 30 30 60 C6 7C 00 00 00 00 00 C0 C0 00 00 00 00 00 00 06 06 00 00 00 C0 C2 CC 30 DC 0C 3E 00 C0 C2 CC 30 CE 3E 06 00 00 18 18 18 3C 18 00 00 00 00 36 D8 36 00 00 00 00 00 D8 36 D8 00 00 00 44 44 44 44 44 44 44 44 AA AA AA AA AA AA AA AA 77 77 77 77 77 77 77 77 18 18 18 18 18 18 18 18 18 18 18 F8 18 18 18 18 18 18 F8 F8 18 18 18 18 36 36 36 F6 36 36 36 36 00 00 00 FE 36 36 36 36 00 00 F8 F8 18 18 18 18 36 36 F6 F6 36 36 36 36 36 36 36 36 36 36 36 36 00 00 FE F6 36 36 36 36 36 36 F6 FE 00 00 00 00 36 36 36 FE 00 00 00 00 18 18 F8 F8 00 00 00 00 00 00 00 F8 18 18 18 18 18 18 18 1F 00 00 00 00 18 18 18 FF 00 00 00 00 00 00 00 FF 18 18 18 18 18 18 18 1F 18 18 18 18 00 00 00 FF 00 00 00 00 18 18 18 FF 18 18 18 18 18 18 1F 1F 18 18 18 18 36 36 36 37 36 36 36 36 36 36 37 3F 00 00 00 00 00 00 3F 37 36 36 36 36 36 36 F7 FF 00 00 00 00 00 00 FF F7 36 36 36 36 36 36 37 37 36 36 36 36 00 00 FF FF 00 00 00 00 36 36 F7 F7 36 36 36 36 18 18 FF FF 00 00 00 00 36 36 36 FF 00 00 00 00 00 00 FF FF 18 18 18 18 00 00 00 FF 36 36 36 36 36 36 36 3F 00 00 00 00 18 18 1F 1F 00 00 00 00 00 00 1F 1F 18 18 18 18 00 00 00 3F 36 36 36 36 36 36 36 FF 36 36 36 36 18 18 FF FF 18 18 18 18 18 18 18 F8 00 00 00 00 00 00 00 1F 18 18 18 18 FF FF FF FF FF FF FF FF 00 00 00 FF FF FF FF FF F0 F0 F0 F0 F0 F0 F0 F0 0F 0F 0F 0F 0F 0F 0F 0F FF FF FF 00 00 00 00 00 00 00 76 D8 D8 76 00 00 00 CC CC CC C6 CC 00 00 00 C6 C0 C0 C0 C0 00 00 00 00 6C 6C 6C 6C 00 00 00 FE 60 18 60 FE 00 00 00 00 7E D8 D8 70 00 00 00 00 66 66 7C 60 00 00 00 00 DC 18 18 18 00 00 00 7E 3C 66 3C 7E 00 00 00 38 C6 FE C6 38 00 00 00 6C C6 6C 6C EE 00 00 00 30 0C 66 66 3C 00 00 00 00 7E DB 7E 00 00 00 00 03 7E DB 7E C0 00 00 00 30 60 60 60 1C 00 00 00 7C C6 C6 C6 C6 00 00 00 00 00 FE 00 00 00 00 00 00 18 18 00 FF 00 00 00 30 0C 0C 30 7E 00 00 00 0C 30 30 0C 7E 00 00 00 1B 18 18 18 18 18 18 18 18 18 18 D8 70 00 00 00 00 18 7E 18 00 00 00 00 00 76 00 DC 00 00 00 38 6C 00 00 00 00 00 00 00 00 00 18 00 00 00 00 00 00 00 00 00 00 00 00 0F 0C 0C EC 6C 1C 00 00 D8 6C 6C 00 00 00 00 00 70 30 C8 00 00 00 00 00 00 00 7C 7C 7C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 66 66 00 00 00 30 00 66 C3 DB C3 3C 00 00 00 C3 FF DB C3 C3 00 00 54 00 DB 18 18 18 3C 00 00 00 C3 C3 C3 C3 3C 00 00 57 00 C3 C3 DB FF 66 00 00 00 C3 66 18 3C C3 00 00 59 00 C3 66 18 18 3C 00 00 00 FF 86 18 60 C3 00 00 6D 00 00 E6 DB DB DB 00 00 00 00 00 C3 C3 3C 00 00 77 00 00 C3 C3 DB 66 00 00 00 00 00 66 18 66 00 00 91 00 00 6E 1B D8 77 00 00 00 18 C3 C0 C3 18 00 00 9D 00 66 18 18 18 18 00 00 00 66 7C 66 66 66 00 00 AB C0 C2 CC 30 CE 06 1F 00 00 C0 C6 18 66 96 06 00 00 00 00 00 00 00 00 00 00 81 81 BD 81 00 00 00 FF FF C3 FF 00 00 00 6C FE FE 38 00 00 00 10 7C 7C 10 00 00 00 3C E7 E7 18 00 00 00 3C FF 7E 18 00 00 00 00 18 3C 00 00 00 FF FF E7 C3 FF FF FF 00 00 66 42 3C 00 00 FF FF 99 BD C3 FF FF 00 0E 32 CC CC 00 00 00 66 66 18 18 00 00 00 33 30 30 F0 00 00 00 63 63 63 E7 C0 00 00 18 3C 3C 18 00 00 00 C0 F8 F8 C0 00 00 00 06 3E 3E 06 00 00 00 3C 18 18 3C 00 00 00 66 66 66 66 00 00 00 DB DB 1B 1B 00 00 7C 60 6C C6 38 C6 00 00 00 00 00 FE 00 00 00 3C 18 18 3C 7E 00 00 3C 18 18 18 00 00 00 18 18 18 3C 00 00 00 00 0C 0C 00 00 00 00 00 60 60 00 00 00 00 00 C0 C0 00 00 00 00 00 6C 6C 00 00 00 00 10 38 7C FE 00 00 00 FE 7C 38 10 00 00 00 00 00 00 00 00 00 00 3C 3C 18 18 00 00 66 66 00 00 00 00 00 00 6C 6C 6C 6C 00 00 18 C6 C0 06 C6 18 00 00 00 C6 18 66 00 00 00 6C 38 DC CC 00 00 30 30 00 00 00 00 00 00 18 30 30 18 00 00 00 18 0C 0C 18 00 00 00 00 3C 3C 00 00 00 00 00 18 18 00 00 00 00 00 00 00 18 30 00 00 00 00 00 00 00 00 00 00 00 00 18 00 00 00 06 18 60 80 00 00 00 C6 DE E6 C6 00 00 00 38 18 18 18 00 00 00 C6 0C 30 C6 00 00 00 C6 06 06 C6 00 00 00 1C 6C FE 0C 00 00 00 C0 C0 06 C6 00 00 00 60 C0 C6 C6 00 00 00 C6 0C 30 30 00 00 00 C6 C6 C6 C6 00 00 00 C6 C6 06 0C 00 00 00 18 00 00 18 00 00 00 18 00 00 18 00 00 00 0C 30 30 0C 00 00 00 00 7E 00 00 00 00 00 30 0C 0C 30 00 00 00 C6 0C 18 18 00 00 00 C6 DE DE C0 00 00 00 38 C6 FE C6 00 00 00 66 66 66 66 00 00 00 66 C0 C0 66 00 00 00 6C 66 66 6C 00 00 00 66 68 68 66 00 00 00 66 68 68 60 00 00 00 66 C0 DE 66 00 00 00 C6 C6 C6 C6 00 00 00 18 18 18 18 00 00 00 0C 0C 0C CC 00 00 00 66 6C 6C 66 00 00 00 60 60 60 66 00 00 00 EE FE C6 C6 00 00 00 E6 FE CE C6 00 00 00 6C C6 C6 6C 00 00 00 66 66 60 60 00 00 00 C6 C6 D6 7C 0E 00 00 66 66 6C 66 00 00 00 C6 60 0C C6 00 00 00 7E 18 18 18 00 00 00 C6 C6 C6 C6 00 00 00 C6 C6 C6 38 00 00 00 C6 C6 D6 7C 00 00 00 C6 38 38 C6 00 00 00 66 66 18 18 00 00 00 C6 18 60 C6 00 00 00 30 30 30 30 00 00 00 C0 70 1C 06 00 00 00 0C 0C 0C 0C 00 00 38 C6 00 00 00 00 00 00 00 00 00 00 00 00 30 00 00 00 00 00 00 00 00 78 7C CC 00 00 00 60 78 66 66 00 00 00 00 7C C0 C6 00 00 00 0C 3C CC CC 00 00 00 00 7C FE C6 00 00 00 6C 60 60 60 00 00 00 00 76 CC 7C CC 00 00 60 6C 66 66 00 00 00 18 38 18 18 00 00 00 06 0E 06 06 66 00 00 60 66 78 66 00 00 00 18 18 18 18 00 00 00 00 EC D6 D6 00 00 00 00 DC 66 66 00 00 00 00 7C C6 C6 00 00 00 00 DC 66 7C 60 00 00 00 76 CC 7C 0C 00 00 00 DC 66 60 00 00 00 00 7C 70 C6 00 00 00 30 FC 30 36 00 00 00 00 CC CC CC 00 00 00 00 66 66 3C 00 00 00 00 C6 D6 FE 00 00 00 00 C6 38 6C 00 00 00 00 C6 C6 7E 0C 00 00 00 FE 18 66 00 00 00 18 18 18 18 00 00 00 18 18 18 18 00 00 00 18 18 18 18 00 00 00 DC 00 00 00 00 00 00 00 38 C6 FE 00 00 00 66 C0 C2 3C 06 00 00 CC CC CC CC 00 00 0C 30 7C FE C6 00 00 10 6C 78 7C CC 00 00 00 CC 78 7C CC 00 00 60 18 78 7C CC 00 00 38 38 78 7C CC 00 00 00 00 66 66 0C 3C 00 10 6C 7C FE C6 00 00 00 CC 7C FE C6 00 00 60 18 7C FE C6 00 00 00 66 38 18 18 00 00 18 66 38 18 18 00 00 60 18 38 18 18 00 00 C6 10 6C C6 C6 00 00 6C 00 6C C6 C6 00 00 30 00 66 7C 66 00 00 00 00 76 7E D8 00 00 00 6C CC CC CC 00 00 10 6C 7C C6 C6 00 00 00 C6 7C C6 C6 00 00 60 18 7C C6 C6 00 00 30 CC CC CC CC 00 00 60 18 CC CC CC 00 00 00 C6 C6 C6 7E 0C 00 C6 38 C6 C6 6C 00 00 C6 00 C6 C6 C6 00 00 18 3C 60 66 18 00 00 38 64 F0 60 E6 00 00 00 66 18 18 18 00 00 F8 CC C4 DE CC 00 00 0E 18 18 18 18 D8 00 18 60 78 7C CC 00 00 0C 30 38 18 18 00 00 18 60 7C C6 C6 00 00 18 60 CC CC CC 00 00 00 DC DC 66 66 00 00 DC C6 F6 DE C6 00 00 3C 6C 00 00 00 00 00 38 6C 00 00 00 00 00 00 30 30 60 C6 00 00 00 00 00 C0 C0 00 00 00 00 00 06 06 00 00 C0 C6 D8 60 86 18 00 C0 C6 D8 66 9E 06 00 00 18 18 3C 3C 00 00 00 00 6C 6C 00 00 00 00 00 6C 6C 00 00 00 44 44 44 44 44 44 44 AA AA AA AA AA AA AA 77 77 77 77 77 77 77 18 18 18 18 18 18 18 18 18 18 F8 18 18 18 18 18 F8 F8 18 18 18 36 36 36 F6 36 36 36 00 00 00 FE 36 36 36 00 00 F8 F8 18 18 18 36 36 F6 F6 36 36 36 36 36 36 36 36 36 36 00 00 FE F6 36 36 36 36 36 F6 FE 00 00 00 36 36 36 FE 00 00 00 18 18 F8 F8 00 00 00 00 00 00 F8 18 18 18 18 18 18 1F 00 00 00 18 18 18 FF 00 00 00 00 00 00 FF 18 18 18 18 18 18 1F 18 18 18 00 00 00 FF 00 00 00 18 18 18 FF 18 18 18 18 18 1F 1F 18 18 18 36 36 36 37 36 36 36 36 36 37 3F 00 00 00 00 00 3F 37 36 36 36 36 36 F7 FF 00 00 00 00 00 FF F7 36 36 36 36 36 37 37 36 36 36 00 00 FF FF 00 00 00 36 36 F7 F7 36 36 36 18 18 FF FF 00 00 00 36 36 36 FF 00 00 00 00 00 FF FF 18 18 18 00 00 00 FF 36 36 36 36 36 36 3F 00 00 00 18 18 1F 1F 00 00 00 00 00 1F 1F 18 18 18 00 00 00 3F 36 36 36 36 36 36 FF 36 36 36 18 18 FF FF 18 18 18 18 18 18 F8 00 00 00 00 00 00 1F 18 18 18 FF FF FF FF FF FF FF 00 00 00 FF FF FF FF F0 F0 F0 F0 F0 F0 F0 0F 0F 0F 0F 0F 0F 0F FF FF FF 00 00 00 00 00 00 76 D8 DC 00 00 00 00 C6 C6 FC C0 00 00 C6 C0 C0 C0 00 00 00 00 6C 6C 6C 00 00 00 C6 30 30 C6 00 00 00 00 7E D8 D8 00 00 00 00 66 66 60 C0 00 00 00 DC 18 18 00 00 00 18 66 66 18 00 00 00 6C C6 C6 6C 00 00 00 6C C6 6C 6C 00 00 00 30 0C 66 66 00 00 00 00 7E DB 00 00 00 00 06 DB F3 60 00 00 00 30 60 60 30 00 00 00 7C C6 C6 C6 00 00 00 FE 00 00 FE 00 00 00 18 7E 18 00 00 00 00 18 06 18 00 00 00 00 18 60 18 00 00 00 00 1B 18 18 18 18 18 18 18 18 18 D8 00 00 00 18 00 00 18 00 00 00 00 DC 76 00 00 00 38 6C 00 00 00 00 00 00 00 00 18 00 00 00 00 00 00 18 00 00 00 0F 0C 0C EC 3C 00 00 D8 6C 6C 00 00 00 00 70 30 C8 00 00 00 00 00 00 7C 7C 7C 00 00 00 00 00 00 00 00 00 00 00 24 FF 24 00 00 22 63 63 00 00 00 00 00 00 00 18 FF 18 00 00 2D 00 00 00 00 00 00 00 00 C3 FF C3 C3 C3 00 54 00 DB 18 18 18 00 00 00 C3 C3 C3 66 18 00 57 00 C3 C3 DB 66 00 00 00 C3 66 18 66 C3 00 59 00 C3 66 18 18 00 00 00 FF 86 18 61 FF 00 6D 00 00 E6 DB DB 00 00 00 00 00 C3 66 18 00 77 00 00 C3 DB FF 00 00 00 00 6E 1B D8 77 00 9B 18 7E C0 C3 18 00 00 00 C3 3C FF FF 18 00 9E FC 66 62 6F 66 00 00 00 18 18 18 18 FF 00 F6 00 18 00 00 18 00 00 00 00 00 00 00 81 81 99 7E FF FF E7 7E FE FE 38 00 38 FE 38 00 7C FE 7C 7C 10 7C 7C 7C 00 3C 18 00 FF C3 E7 FF 3C 42 66 00 C3 BD 99 FF 07 7D CC 78 66 66 18 18 33 30 70 E0 63 63 67 C0 5A E7 3C 99 E0 FE E0 00 0E FE 0E 00 3C 18 7E 18 66 66 00 00 DB 7B 1B 00 63 6C 38 78 00 00 7E 00 3C 18 3C FF 3C 18 18 00 18 18 3C 00 18 FE 18 00 30 FE 30 00 00 C0 FE 00 24 FF 24 00 18 7E FF 00 FF 7E 18 00 00 00 00 00 78 30 00 00 6C 00 00 00 6C 6C 6C 00 7C 78 F8 00 C6 18 66 00 6C 76 CC 00 60 00 00 00 30 60 30 00 30 18 30 00 66 FF 66 00 30 FC 30 00 00 00 30 60 00 FC 00 00 00 00 30 00 0C 30 C0 00 C6 DE E6 00 70 30 30 00 CC 38 CC 00 CC 38 CC 00 3C CC 0C 00 C0 0C CC 00 60 F8 CC 00 CC 18 30 00 CC 78 CC 00 CC 7C 18 00 30 00 30 00 30 00 30 60 30 C0 30 00 00 00 FC 00 30 0C 30 00 CC 18 00 00 C6 DE C0 00 78 CC CC 00 66 7C 66 00 66 C0 66 00 6C 66 6C 00 62 78 62 00 62 78 60 00 66 C0 66 00 CC FC CC 00 30 30 30 00 0C 0C CC 00 66 78 66 00 60 60 66 00 EE FE C6 00 E6 DE C6 00 6C C6 6C 00 66 7C 60 00 CC CC 78 00 66 7C 66 00 CC 70 CC 00 B4 30 30 00 CC CC CC 00 CC CC 78 00 C6 D6 EE 00 C6 38 6C 00 CC 78 30 00 C6 18 66 00 60 60 60 00 60 18 06 00 18 18 18 00 38 C6 00 00 00 00 00 FF 30 00 00 00 00 0C CC 00 60 7C 66 00 00 CC CC 00 0C 7C CC 00 00 CC C0 00 6C F0 60 00 00 CC 7C F8 60 76 66 00 00 30 30 00 00 0C CC 78 60 6C 6C 00 30 30 30 00 00 FE D6 00 00 CC CC 00 00 CC CC 00 00 66 7C F0 00 CC 7C 1E 00 76 60 00 00 C0 0C 00 30 30 34 00 00 CC CC 00 00 CC 78 00 00 D6 FE 00 00 6C 6C 00 00 CC 7C F8 00 98 64 00 30 E0 30 00 18 00 18 00 30 1C 30 00 DC 00 00 00 10 6C C6 00 CC CC 18 78 CC CC CC 00 00 CC C0 00 C3 06 66 00 00 0C CC 00 00 0C CC 00 30 0C CC 00 00 C0 78 38 C3 66 60 00 00 CC C0 00 00 CC C0 00 00 30 30 00 C6 18 18 00 00 30 30 00 38 C6 C6 00 30 78 FC 00 00 60 60 00 00 0C CC 00 6C FE CC 00 CC 78 CC 00 CC 78 CC 00 E0 78 CC 00 CC CC CC 00 E0 CC CC 00 CC CC 7C F8 18 66 3C 00 00 CC CC 00 18 C0 7E 18 6C F0 E6 00 CC FC FC 30 CC FA CF C7 1B 3C 18 70 00 0C CC 00 00 30 30 00 1C 78 CC 00 1C CC CC 00 F8 F8 CC 00 00 EC DC 00 6C 3E 7E 00 6C 38 7C 00 00 60 CC 00 00 FC C0 00 00 FC 0C 00 C6 DE 66 0F C6 DB 6F 03 18 18 18 00 33 CC 33 00 CC 33 CC 00 88 88 88 88 AA AA AA AA 77 EE 77 EE 18 18 18 18 18 18 18 18 18 18 18 18 36 36 36 36 00 00 36 36 00 18 18 18 36 06 36 36 36 36 36 36 00 06 36 36 36 06 00 00 36 36 00 00 18 18 00 00 00 00 18 18 18 18 00 00 18 18 00 00 00 00 18 18 18 18 18 18 00 00 00 00 18 18 18 18 18 18 18 18 36 36 36 36 36 30 00 00 00 30 36 36 36 00 00 00 00 00 36 36 36 30 36 36 00 00 00 00 36 00 36 36 18 00 00 00 36 36 00 00 00 00 18 18 00 00 36 36 36 36 00 00 18 18 00 00 00 18 18 18 00 00 36 36 36 36 36 36 18 18 18 18 18 18 00 00 00 00 18 18 FF FF FF FF 00 00 FF FF F0 F0 F0 F0 0F 0F 0F 0F FF FF 00 00 00 DC DC 00 78 F8 F8 C0 FC C0 C0 00 FE 6C 6C 00 CC 30 CC 00 00 D8 D8 00 66 66 7C C0 76 18 18 00 30 CC 78 FC 6C FE 6C 00 6C C6 6C 00 30 7C CC 00 00 DB 7E 00 0C DB 7E C0 60 F8 60 00 CC CC CC 00 FC FC FC 00 30 30 00 00 30 30 00 00 30 30 00 00 1B 18 18 18 18 18 D8 70 30 FC 30 00 76 00 DC 00 6C 38 00 00 00 18 00 00 00 00 00 00 0C 0C 6C 1C 6C 6C 00 00 18 60 00 00 00 3C 3C 00 00 00 00 00 07 8A 87 F6 08 09 CA D2 00 EB 80 60 E9 05 ED C5 BA 03 06 42 24 B1 D2 98 2E 8F 59 5A E9 02 E9 C5 8B 33 D1 D1 D1 D1 D1 D1 D1 D1 53 1E 00 DB 75 B8 00 13 36 00 D1 C0 09 3D 00 03 07 C3 C4 EE FA 03 01 86 EE 81 C0 74 4A 90 F8 C7 8B F7 4C 8B D1 8B 50 A1 00 E7 FF C3 E0 C2 C3 DC C7 8A 8B F7 4C 8B D1 8B 50 A1 00 E7 ED F9 74 77 D1 73 81 00 80 80 E0 E0 E0 E0 D0 E0 E0 C2 FF F9 75 D1 D1 D1 D1 D1 80 06 02 E3 C3 F0 D9 90 50 C0 D8 9C 1E 00 C3 50 16 00 06 00 75 83 06 B0 BA 03 EB 83 04 65 0C EE 65 58 C3 50 16 00 06 00 75 83 06 32 BA 03 EB 83 04 65 24 EE 65 58 C3 52 C4 B0 EE EC 20 E0 01 EF 58 90 52 C4 B0 EE EC DF E0 01 EF 58 90 3C 77 74 3C 77 F6 89 10 0B E8 03 1C 04 EB 8A 88 80 0F FB 74 80 03 12 13 0E 0F 0A 10 04 02 02 09 C3 BA 00 00 BA 00 8A EC C4 C3 EB 2B 3D F6 90 E1 8B E8 FF FB F4 90 12 B8 34 F3 D8 BA 00 B6 BA 00 C3 8A EE BA 00 24 0C EE CB BA 00 24 EE 90 06 1E 00 E3 E8 00 1F 90 36 2E 3E 3E 10 07 62 2C 03 5C FF 06 00 75 8D 4C B5 8A 88 80 0F F9 74 80 03 19 36 4E 08 11 06 00 75 8D 4C 8D 4C B5 E8 02 D1 E8 00 CD F6 01 39 85 8A 84 FE 8B 60 E8 CB 27 36 4E 13 10 0F 0C 36 3F 10 04 36 2E C9 D9 36 01 0E 01 81 C3 04 02 5B 74 0A 74 FE 3A 75 FE 3A 75 FE C3 43 74 E8 00 02 42 FE EE B0 EE EC C8 4A 49 C3 25 74 B0 EE EC A8 74 42 BF 4A 12 42 FE 8A 4A 18 42 C4 4A 90 52 B8 00 D8 16 00 C2 EC 40 5A C3 11 42 24 EE C3 11 42 0C EE C3 06 52 FD DB C9 C1 89 0C 26 0E 01 00 33 0E 57 E8 01 5F FF 03 5B 5A 07 C3 06 52 00 53 C4 08 C3 DF 57 DF 8A 0B FD 74 43 E8 F2 C9 8A 0A C9 0E 00 8A 89 85 8A 26 4D 26 55 26 75 26 7D 8B 81 00 75 0A 75 33 8E 26 36 01 8C 0E 8B E8 00 CC 5B 26 5F 26 7F 8C 0B 74 8B 26 6F 80 FF 3B 3A 75 33 26 0D 0E 00 2B E9 8A 01 D2 C5 03 00 8B 0A 75 33 8E 26 36 01 8C 0E 8B E8 00 CC 5A 07 C3 06 52 C4 0C C3 DF 74 8B 26 6F 80 FF 27 3A 75 26 0D C9 0E 00 8B 01 0E 00 C4 03 C9 D9 36 01 06 01 5A 07 C3 B8 A0 C0 C3 87 B1 D3 D2 D0 D0 86 B1 D3 B1 D3 03 8B 87 86 FE 80 1F C3 FF 20 2B 0B 74 49 ED 87 8B F3 03 87 E2 58 90 B8 A0 C0 C3 B1 D3 D2 D0 D0 86 B1 D3 8B FE 80 1F C7 20 DF F7 0A 74 32 8B B1 D3 03 32 32 8A F3 8A F3 EB 58 90 51 CA C4 B0 B4 EF 04 06 BA 03 05 00 B0 B4 EF 04 02 8A 83 06 BA 03 C0 8A 59 C3 51 CA C4 B0 B4 EF 04 02 BA 03 05 10 B0 B4 F6 87 02 02 0A B0 B4 EF D1 C2 EC C0 B0 EE D1 58 00 51 8B BA 03 04 B4 B0 EF 01 6F BA 03 EE C4 B4 B0 EF D3 85 B9 00 E4 55 E8 FD 39 83 10 E8 FD 13 C2 FB FA A8 75 FB FA A8 74 BA 03 10 AC 46 12 E8 FA 13 E8 FA BA 03 09 32 E8 01 D3 C2 32 EE EC C0 B4 32 E8 FA EB FB 59 C3 52 1E D8 D9 06 00 75 1E D8 C2 83 1E EC C0 B9 00 E4 DD 46 B4 E8 FA CC DF FB C6 B0 EE E8 00 29 1F 5A C3 A0 00 16 00 40 00 0F 98 E0 D8 8B 04 8C 8E 2E 97 02 C3 06 2E 00 85 8A A0 00 16 00 36 00 7C C5 10 74 8C 0B 74 8B 8A 14 F9 74 43 C8 F3 AC C0 09 02 20 CC 14 83 06 BA 03 C6 AD C0 28 C8 8A 1E C5 AC FC 74 E8 F9 41 FE FE 75 AC C4 65 FE E8 00 1F D5 0B 74 8A AD E8 34 51 07 C3 AC 45 FE E2 FB 90 AC 39 E8 00 C4 F5 C3 C3 DF 0A DC E3 32 26 01 90 8A BA 03 C5 BA 03 E8 00 C4 74 E8 01 59 FE FE 75 C3 8A BA 03 C5 BA 03 8A AC F8 86 F6 06 03 FB E8 01 C5 C9 DD 90 8A B1 B5 BF 00 C8 8A EE C9 8A 8A 10 5C F6 06 03 CD E8 01 C5 4F DE 08 BA 03 C5 BA 03 04 7C 8A 08 C4 74 E8 00 DF FE 46 75 BF 00 C8 8A EE C9 8A 8A F8 5C F6 06 03 83 E8 00 C5 4F DE C9 8D C8 B0 EE C9 B9 00 36 11 8A 8A E8 00 F6 C8 B0 EE C9 B9 00 36 11 E8 00 C4 74 E8 00 77 E2 C3 90 8A 24 80 DE EB FF 0A 78 8A 80 03 8A 88 D0 D0 8A 80 03 8A 88 D0 D0 8A 2E 87 02 DA C3 56 33 33 50 CD 98 E2 F8 F2 0A 8A 98 E2 F8 F2 29 8A 98 E2 C7 D6 E0 D2 58 C2 FA DA 5E C3 EE 00 C7 EB 8A EE C3 FF FF FF FF FF FF FF FF FF FF 11 4E 52 01 00 00 00 00 6F 79 69 68 20 4F 50 51 43 6D 75 65 20 6F 70 72 74 6F 2C 31 38 2C 31 38 2C 31 38 2C 31 38 2C 31 38 2C 31 38 2C 31 38 20 52 53 50 41 4E 42 44 43 43 42 41 4C 00 34 20 35 4F 50 51 FF FF 30 2F 38 38 FF AB FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
55 30 76 E8 00 DA 73 E9 00 E8 C0 D8 EA E8 04 49 4D 9D 03 C8 FA 1E 00 80 CF 08 00 8E BB F0 06 01 1E 01 40 8E 32 0B 75 80 01 D4 B0 80 10 60 F9 C5 00 0A B4 B0 80 02 FB 49 88 89 88 87 88 88 89 63 E8 03 B7 E8 02 16 00 0B E8 03 26 00 98 F0 DD 8A 59 D0 73 8B 0C E8 04 F6 ED 05 8A 61 8B B8 1A DF C8 80 07 05 0E 00 E8 00 0A 74 E8 01 D6 BF E8 01 0A 74 E8 01 ED 05 D6 AB 33 8C 05 06 D8 92 CB E8 B0 EE FA E8 FA FC FC EC 08 0C 16 BA 01 01 BA 46 0E FB B6 32 F6 89 01 0B 06 00 74 B6 EB F6 87 02 02 07 D6 F2 C3 10 20 10 30 10 20 10 30 0F 0F 0F 10 08 F4 00 00 00 00 00 00 00 9C 00 00 00 00 00 F4 00 00 00 00 00 00 00 B6 00 00 00 00 00 1A E0 00 00 00 00 00 00 00 00 00 00 00 1A E0 00 00 00 00 00 00 00 00 00 00 00 FF 0F 00 00 02 FF 00 3F 10 08 00 00 00 02 00 04 00 02 00 01 05 00 01 00 02 06 0C 0C 0C 0C 0C 0C 0C 8C 4C 0C 0C 0C 0C 0C 0C 8C 4C 8C 4C 4C 4C 4C 4C 4C 4C 8C 4C 4C 34 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 1E 00 10 02 12 08 18 0A 1A 00 15 50 8B 63 83 06 C0 5A C3 8B 81 0F 8B 2E BF 01 1E 00 E3 0A 88 10 E8 54 C3 78 E8 03 22 65 72 E8 04 18 76 72 A0 00 07 E8 E8 E8 D2 B9 E8 02 BA 00 01 32 BA 03 22 75 80 02 B4 E8 00 03 CC 80 03 73 B0 E8 02 03 8A 98 50 0F 42 8A B0 EE EB FD FD FD FC FD FD FD FC 86 EE 80 5A C3 06 84 B0 EE C8 00 75 8E 8B 70 EB 8D 7A 8B B8 C0 C0 00 8E B9 00 AC FC FC FC 3A FB 24 E2 8B 70 26 1E 5F 1E 5F 0D 18 8A E5 3A E5 76 B0 E8 01 C8 D8 16 01 DB C3 36 5F 40 A5 8D 6E BF 00 AB 36 5F 0C A5 BB 00 C3 8D A8 AB AB 1F 1E 84 B0 EE CE B0 EE B0 EE 4A E0 E4 E4 FC E0 50 E4 80 C0 40 F8 0B 42 4A F9 E0 C7 75 B3 F6 89 01 26 CC F6 80 19 52 00 8E E8 00 12 C1 00 F9 D0 EF CC B0 EF 05 C3 E2 32 B0 EF C3 3E 00 AA 1E 84 B0 EE 8B 63 83 06 C8 0E 8D C2 B4 32 B3 B9 00 3D 73 32 B9 00 33 D0 B3 E8 00 D0 C5 E8 13 C5 E8 02 60 19 9C ED D4 73 8A 0A E8 00 ED C7 CE C4 C3 52 8A AC F8 90 EC 08 F8 D7 C0 42 86 E8 5A 87 FB FA A8 75 EC 01 FB C2 EC D0 D7 C0 42 F8 D8 5E 4A D7 C2 74 F9 5B BA 00 0B 8C 3D C0 74 BA 03 09 42 EB EC FD FD FD FB 80 74 F9 50 51 50 10 58 84 EE F0 04 E8 8B 2E 87 05 B0 32 8A 80 60 05 EC CC 0F FA A8 74 BA 03 46 E2 8A 80 0C 02 EC CC 0F FA A8 74 BA 03 2A E2 F9 59 58 33 BA 00 05 BA 00 00 E8 02 33 E8 02 C0 85 EE 84 EE 50 51 8B E8 52 00 E8 52 59 58 80 A8 A8 A8 A8 A8 80 80 08 08 08 1B 08 08 08 08 1B 08 08 08 08 1B 08 1E E8 52 BB FF 84 B0 EE C4 B0 B4 EF CE B4 B0 E8 50 02 00 8E 8E BF 00 CB 00 AA FF FF B0 24 E8 50 01 BF 00 CB FE 75 FE AA F6 FF 0F BA 33 33 8B AC C0 16 E2 AC C0 0E 00 0F A0 33 AC C0 0E C8 E8 00 A0 BA F9 01 07 C3 FF D0 10 03 04 32 B9 00 CE B4 B0 E8 50 3C C7 0A C3 E0 F1 0F 09 FF DF 8A EB C3 84 B0 EE 36 00 C6 B9 00 A4 8B 8B EC 08 10 AA 73 E2 B0 EB E8 51 D8 D6 A8 74 E8 51 F4 ED 20 41 CA BA 00 30 33 BA 00 FB CA A8 75 FA A8 74 87 8A EE D1 A8 75 EC 08 FB 48 B9 BA C2 E8 00 03 EB B0 E8 FD C3 C1 03 C2 C3 84 B0 EE 14 8B 63 83 06 18 8B 8B EC 01 0E 1E 73 E2 EB E8 51 D8 D6 A8 75 E8 51 F4 ED 17 EE 8B 8B EC 08 CF 01 0D F0 73 E2 B0 E8 FD C3 84 B0 EE 1E 00 C3 B9 00 C0 B4 87 FB FA A8 74 87 B0 EE C4 8A 87 EC 01 FB FB 30 00 5D C4 E2 8B BA 03 0F 3F 26 B0 EE 09 DB FF 0F 50 E8 4F 84 B0 EE DE 03 BA 03 0F DA 90 EC 08 F8 DA 32 8A EE E0 DA A8 75 EC 24 3C 75 80 10 DA EB B2 EB B2 80 30 04 EC E4 E4 04 E8 C4 C2 EA F9 FA 43 B0 EE 40 32 EE FB BA 00 04 E8 4F C8 B0 EE 00 FD 42 E2 4A 42 3F EB EE 00 BA 03 01 B9 02 C9 EC 00 69 F9 B0 EE B0 B9 02 E2 BA 03 00 B9 02 C9 EC 3F 49 F9 B0 EE B0 B9 02 E2 BA 03 FF BA 03 03 EC 3F 29 F9 C7 B0 EE C9 B9 00 3C 75 E2 B9 00 C8 32 FE EE C0 EE FD EB B0 E8 FC C3 08 01 02 03 28 08 08 03 02 2D 28 2B BF 00 06 00 00 9C 8F 1F B9 FF 01 03 05 07 11 13 15 17 00 00 00 00 10 00 28 08 08 03 02 2D 28 2B BF 00 06 00 00 9C 8F 1F B9 FF 01 03 05 07 11 13 15 17 00 00 00 00 10 00 50 08 10 03 02 5F 50 55 BF 00 06 00 00 9C 8F 1F B9 FF 01 03 05 07 11 13 15 17 00 00 00 00 10 00 50 08 10 03 02 5F 50 55 BF 00 06 00 00 9C 8F 1F B9 FF 01 03 05 07 11 13 15 17 00 00 00 00 10 00 28 08 40 03 02 2D 28 2B BF 00 00 00 00 9C 8F 00 B9 FF 13 17 04 07 11 13 15 17 00 00 00 00 30 00 28 08 40 03 02 2D 28 2B BF 00 00 00 00 9C 8F 00 B9 FF 13 17 04 07 11 13 15 17 00 00 00 00 30 00 50 08 40 01 06 5F 50 54 BF 00 00 00 00 9C 8F 00 B9 FF 17 17 17 17 17 17 17 17 00 00 00 00 00 00 50 0E 10 03 03 5F 50 55 BF 00 0B 00 00 83 5D 0D BA FF 08 08 08 08 18 18 18 18 00 08 00 00 10 00 50 10 7D 0F 06 5F 50 55 BF 00 00 00 00 9C 8F 1F B9 FF 01 03 05 07 39 3B 3D 3F 00 00 00 00 00 0F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 28 08 40 00 03 37 2D 31 04 00 06 00 00 E1 C7 08 F0 FF 01 03 05 07 11 13 15 17 00 00 00 00 10 00 50 00 00 0F 06 5F 50 55 BF 00 00 00 00 9C 8F 1F B9 FF 00 00 00 00 00 00 00 3F 00 00 00 00 08 0F 50 00 00 0F 06 5F 50 55 BF 00 00 00 00 9C 8F 1F B9 FF 00 00 00 00 00 00 00 3F 00 00 00 00 08 0F 28 08 20 0F 06 2D 28 2B BF 00 00 00 00 9C 8F 00 B9 FF 01 03 05 07 11 13 15 17 00 00 00 00 00 0F 50 08 40 0F 06 5F 50 54 BF 00 00 00 00 9C 8F 00 B9 FF 01 03 05 07 11 13 15 17 00 00 00 00 00 0F 50 0E 80 0F 00 60 56 50 70 00 00 00 00 5E 5D 00 6E FF 08 00 18 00 08 00 18 00 00 00 00 00 10 0F 50 0E 80 0F 00 5B 53 50 6C 00 00 00 00 5E 5D 0F 0A FF 01 00 07 00 01 00 07 00 00 00 00 00 10 0F 50 0E 80 0F 06 5F 50 54 BF 00 00 00 00 83 5D 0F BA FF 08 00 18 00 08 00 18 00 00 00 00 00 00 05 50 0E 80 0F 06 5F 50 54 BF 00 00 00 00 83 5D 0F BA FF 01 03 05 07 39 3B 3D 3F 00 00 00 00 00 0F 28 0E 08 03 02 2D 28 2B BF 00 0B 00 00 83 5D 1F BA FF 01 03 05 07 39 3B 3D 3F 00 00 00 00 10 00 28 0E 08 03 02 2D 28 2B BF 00 0B 00 00 83 5D 1F BA FF 01 03 05 07 39 3B 3D 3F 00 00 00 00 10 00 50 0E 10 03 02 5F 50 55 BF 00 0B 00 00 83 5D 1F BA FF 01 03 05 07 39 3B 3D 3F 00 00 00 00 10 00 50 0E 10 03 02 5F 50 55 BF 00 0B 00 00 83 5D 1F BA FF 01 03 05 07 39 3B 3D 3F 00 00 00 00 10 00 28 10 08 03 02 2D 28 2B BF 00 0D 00 00 9C 8F 1F B9 FF 01 03 05 07 39 3B 3D 3F 00 08 00 00 10 00 50 10 10 03 02 5F 50 55 BF 00 0D 00 00 9C 8F 1F B9 FF 01 03 05 07 39 3B 3D 3F 00 08 00 00 10 00 50 10 10 03 02 5F 50 55 BF 00 0D 00 00 9C 8F 0F B9 FF 08 08 08 08 18 18 18 18 00 08 00 00 10 00 50 10 A0 0F 06 5F 50 54 0B 00 00 00 00 EA DF 00 04 FF 3F 3F 3F 3F 3F 3F 3F 3F 00 00 00 00 00 01 50 10 A0 0F 06 5F 50 54 0B 00 00 00 00 EA DF 00 04 FF 01 03 05 07 39 3B 3D 3F 00 00 00 00 00 0F 28 08 FA 0F 0E 5F 50 54 BF 00 00 00 00 9C 8F 40 B9 FF 01 03 05 07 09 0B 0D 0F 00 00 00 00 40 0F 00 1F 3F 3F 3F 3F 3F 1F 00 00 00 00 1F 2F 3F 3F 3F 3F 3F 2F 1F 1F 1F 1F 2D 36 3F 3F 3F 3F 3F 36 2D 2D 2D 2D 00 0E 1C 1C 1C 1C 1C 0E 00 00 00 00 0E 15 1C 1C 1C 1C 1C 15 0E 0E 0E 0E 14 18 1C 1C 1C 1C 1C 18 14 14 14 14 00 08 10 10 10 10 10 08 00 00 00 00 08 0C 10 10 10 10 10 0C 08 08 08 08 0B 0D 10 10 10 10 10 0D 0B 0B 0B 0B 00 02 04 14 00 02 04 14 38 3A 3C 3E 38 3A 3C 3E 00 02 04 14 00 02 04 14 38 3A 3C 3E 38 3A 3C 3E 00 02 04 06 08 0A 0C 0E 10 12 14 16 18 1A 1C 1E 20 22 24 26 28 2A 2C 2E 30 32 34 36 38 3A 3C 3E 00 00 00 00 07 07 07 07 00 00 00 00 3F 3F 3F 3F 00 00 00 00 07 07 07 07 00 00 00 00 3F 3F 3F 3F 00 02 04 14 38 3A 3C 3E 00 08 0E 14 1C 24 2D 38 50 FC 75 B4 EB 80 1D 40 1E BE 00 DE 55 53 52 EC BF B0 3E 00 74 BF B8 03 00 86 8B 86 81 FF D1 2E 94 12 59 5F 07 1F 72 CF CD CF 7C E6 58 76 E8 EA 32 30 8E E6 2E DE 32 D4 84 6C 28 B4 48 A4 16 18 1A 1A 1A 1A A8 22 50 28 8A 24 80 80 13 21 06 00 C7 85 08 80 87 08 C0 D8 06 4E 0C 8C 0E F9 8A 87 80 F7 2E 00 C5 74 8A 32 8B 10 80 CF 0A 8A 89 10 8A D0 22 D0 EB 8B 10 8A D0 22 D0 8A 8A D0 D0 32 F6 8A D0 D0 D0 0A F6 80 08 DB 86 F0 E6 FE 32 F6 08 16 1E 00 E3 D0 D0 D0 D0 32 2E 87 14 E1 0A F6 01 03 02 88 87 BA 03 D8 E3 80 19 E3 2A 89 63 93 C0 4E A2 00 3E 00 08 1E F3 93 4E 8B 63 83 06 EC C0 B0 EE 8B 63 83 06 8A 49 32 80 08 10 8A D6 A2 00 8A DE A2 00 E4 46 F8 1E 50 52 49 E8 44 D9 C5 26 7F 8C 98 C4 E8 E8 F0 C0 C1 26 4A AC A2 00 26 85 AD A3 00 C3 4C E8 44 D4 8B 0F D9 06 00 75 BF B0 3E 00 74 BF B8 03 00 8E E8 42 F7 4C D1 8B 8B 4E B8 07 3E 00 74 80 49 03 02 C0 AB CB CD BC E8 43 5B 07 F8 D0 D0 80 02 E1 0A 8A 32 8A 88 8A 80 F0 E6 D0 D0 D0 2E 97 14 16 00 F3 0A C6 88 89 C3 A0 00 80 06 00 46 A1 00 46 A0 00 46 F8 03 03 20 20 20 20 00 00 00 20 20 20 09 09 09 09 09 09 09 0B 09 09 09 0B 09 09 09 0B 09 09 09 09 80 80 00 80 80 00 00 00 2C 2D 2A 1E 30 30 30 3F F6 87 08 74 EB 90 D1 1E 00 36 00 0E 00 C6 74 BA 1E 38 D2 34 FA 73 F6 87 01 28 F2 08 F2 D3 CA 1C FA 76 32 8A 80 02 E2 09 C0 FE 72 FE E8 00 18 8B 8B B0 8A EF 0B E1 89 10 C3 8A 32 D1 89 50 D1 3A 62 75 8B 8B 63 E8 00 C3 8A 32 D1 8B 50 8B 60 89 02 56 F8 FE 8A 0A 3A 77 3A 74 8A FE 3A 74 0A 75 8A 2A 8A 80 0D 02 C8 D0 F2 F4 0C D3 C8 06 F3 C6 EE C3 A1 00 E5 ED C1 0E 00 E9 C1 CC E0 0F B0 8A EF F9 8A B0 3A 76 8A 88 62 A1 00 FF E3 4E 8A 49 80 03 05 FA 75 D1 8B 63 8B 8A B0 FA 8A B0 EF D1 8B 50 E8 FF C3 FD 8A 62 E8 02 C7 1E 00 D3 04 D3 CA E4 F6 79 87 2A 2A F6 F6 EB 2A 2A FE FE 80 49 03 15 3E 00 72 74 80 49 0D 03 FB F9 8B 2B 81 FF D1 8B 8A F6 32 03 D1 03 97 F0 E3 F6 04 D8 DD E0 C7 F6 87 04 03 0E 1E 1F C0 14 C6 10 F0 CA A5 F5 FD CE F4 F0 E7 20 CA AB FD CE F6 E9 01 3E 00 74 D0 D0 BD 00 97 C5 ED BA 01 E2 C1 C6 8B 98 40 F7 85 79 F7 F7 81 F0 80 49 06 01 03 06 96 53 DF C0 30 C6 2C F0 D0 D0 8B 8B 8B 8A F3 8B 8B 81 00 81 00 8A F3 03 03 FE 75 58 F0 E6 E6 8A 8B 8A F3 8B 81 00 8A F3 03 FE 75 E9 00 8B 81 FF 80 49 13 06 E5 E5 E5 F8 EC C4 99 85 F6 03 52 E5 32 80 49 13 0A CA E1 E1 E1 CA C1 C6 8B F6 85 F7 5A DE 00 3E 00 75 D1 D1 D1 2B 85 79 F7 F7 03 96 C0 37 C3 33 D8 80 49 13 10 BA 03 05 EF C4 B8 0F 5A 85 F6 1E C1 D9 CA A4 F5 FD 75 1F 8A A0 00 E3 8A 80 49 13 1A CE B8 00 BA 03 ED 02 0F 57 CB 00 AA 0D CA C7 AA FD 75 EB B0 8A EF CB B0 F3 03 4E D4 02 0F EB F6 87 04 03 28 F8 50 51 E8 3E D8 02 D8 4C 32 F7 8B 5A 5B C3 8E 8A 49 80 03 07 FC 72 77 E8 3E E6 E9 00 FF 7E E8 00 8B F6 02 16 C4 D0 E0 D0 08 E1 E2 D0 E2 F8 E1 81 00 80 80 D9 05 C6 EB 58 DB DB 1E 00 DA 80 80 50 38 8A 8B 4A E8 00 3C 75 8A 32 B9 00 3C F5 D2 FC F5 D2 F2 C2 FE 74 81 38 EB BA 03 05 08 8A F6 AA F3 F7 05 00 58 00 D2 DA F6 DE 36 01 FC C4 E1 58 73 8E 8B 0B 74 86 E8 00 02 C5 ED 81 FE 03 89 10 C3 5A 0E 00 81 FE 2B 8B 8B 85 06 07 52 F6 87 04 12 16 00 C2 EC 01 FB EC 01 FB 8B FB 53 52 8A 32 8B 8A 8A 8B 8B 56 F0 FB CD A6 0E C5 CA F0 C0 8B F9 0A 2B 8B F6 8B F8 E6 5A 5B 8E 8A 49 80 03 0A FC 74 E8 00 30 F3 E9 08 8B 8B 8A 8A 87 8B 63 83 06 C3 74 8B EC 01 FB EC 01 FB C6 FB E8 C3 8E 8A 49 80 03 0A FC 74 E8 00 2B E9 C2 8B 8A 87 8B 63 83 06 C3 74 8A EC 01 FB EC 01 FB C7 FB E2 F8 8B 8B 8B 80 13 05 FC 77 32 50 A6 58 0E 00 F7 D6 F6 FB 74 8A 80 80 E2 80 07 46 B5 8E C5 0C 32 F6 03 8B 8A 8A 57 B1 AC D0 C3 E2 02 C7 E3 E2 02 E7 FE 75 FE 74 81 38 EB 5E 83 08 75 E9 00 DE 36 01 80 0A F6 DE 36 00 7F E1 F0 E2 53 57 F1 80 06 22 B3 8A D1 D1 D0 73 0A FE 75 5B C4 ED 03 33 26 05 0A ED 03 32 26 05 F7 20 F7 75 83 50 CE BE 5E 47 FB 74 47 75 E9 00 E3 1E 00 0F D7 FA DE 36 01 E1 F0 0A 75 57 E2 C4 B0 EF E1 D2 D3 88 03 FE 75 86 5F E7 C4 B0 EF 10 C4 B0 8A EF CE B0 B4 EF 57 D2 DA E1 ED 03 8A AC 88 03 FE 75 86 5F 47 4D A4 E2 C4 B0 EF CE 32 B0 EF F6 87 08 75 8B 63 8A 49 80 07 1D 1D FC 77 0A 75 E8 00 CC 9E B5 E8 00 03 78 F8 0A 75 E8 00 FC 74 8A E8 00 00 E2 80 0F 4A 11 D8 EB E8 00 3E FC 74 0A 75 E8 00 C9 5A B5 E8 00 11 B6 E8 00 1E 2C E8 00 16 FF 0F 12 32 E8 00 01 98 EB E8 00 C3 A0 00 E0 E3 0A A2 00 80 01 05 E3 66 24 0A A2 00 36 00 7C C5 C3 C5 A8 C4 04 34 D1 F6 06 E2 D6 E3 32 83 23 DA 0F B1 8A 8A 32 D3 03 B4 B1 83 24 C5 75 83 03 E5 83 06 C0 87 FB FA A8 74 87 AC EF C5 F6 E8 40 C4 20 FB C9 DF 8D 06 FB FA A8 74 93 C0 91 D4 80 11 02 CC 9A 86 B0 EE C4 91 8E 33 8A 49 80 13 08 32 26 05 C3 FB 72 80 10 0F FA C7 F7 4C 8B 8B 86 8A E8 00 FC 72 D2 B5 98 C8 CD D7 E7 08 CE EF FF 12 03 18 B0 8A BA 03 26 05 14 02 E5 C4 EF D3 20 F6 B0 8A EF 88 B0 8A EF 03 E4 CE EF 08 CC EB 98 C3 E0 E4 05 30 EB 26 3D C7 F8 8E 33 8A 49 80 13 08 90 26 05 46 FB 72 8B 8A 98 26 00 D7 F8 E3 34 80 07 21 E3 03 FF CE B4 E8 38 8A 22 D2 D0 0A FE 79 8A EB 26 05 D7 C7 E8 46 F8 80 0D 0A 0A EA 04 C7 20 E2 E2 E2 E2 FA E2 E2 FA FE FC 73 D1 D0 8A F6 8B D1 D1 D1 03 F6 80 07 C7 8B B1 D3 03 D1 D1 03 C3 8A 62 8A 32 87 D1 8B 50 3C 77 74 3C 74 3C 74 3C 75 BB 03 F4 E8 39 C3 01 52 1E 74 1F 5A C2 16 00 22 D2 C6 36 00 18 CE 1D D2 17 CA 0C D2 08 36 00 0B C6 3E 00 6A F8 52 1E 3E 00 5E B7 80 49 03 07 3E 00 75 8A 62 E8 F9 7E 1F 5A 01 33 8A 4A FE E8 F7 C3 F6 87 08 75 3C F5 1C F2 16 00 06 07 C4 A8 26 7D 98 E0 2E 97 1F C3 8C AA C6 2C B2 B2 B2 5E 86 A0 B2 B2 B2 B2 B2 B2 10 B2 46 7C B2 E4 B2 10 3A 40 48 78 86 93 C2 FB FA A8 74 93 C0 E8 37 1E B0 EE C3 86 B4 93 C2 FB FA A8 74 93 C0 E8 37 FE FB B4 B1 8B 83 06 C0 32 87 FB FA A8 74 87 AC 0E E8 3D C4 C5 C9 20 EA A8 75 87 AC F6 E8 3D C4 C9 0A CD EF 20 FB C3 20 87 FB FA A8 74 87 B4 AC CE FE E8 3D C3 B1 D2 24 8A B8 00 D8 49 E8 37 86 D1 D1 8B 83 06 BA 03 30 8A 27 24 0A E8 36 8A 83 06 DA 90 EC 08 F8 C4 C0 EE EC E0 87 EC DA 20 FB 66 C3 B4 83 06 90 EC 08 F8 C4 C0 EE EC 88 05 8C 8E 8B B4 B1 8B 83 06 C0 32 87 FB FA A8 74 87 8A EE EC AA C4 C5 C9 25 F2 A8 75 87 8A EE EC AA C4 C9 0F F2 FE 75 87 B0 EE EB 87 EC F2 20 87 FB FA A8 74 87 B0 EE EC FB 8A 01 5E 86 B9 00 D9 06 00 74 E8 3D 83 06 90 EC 08 F8 C4 C8 EE 00 00 C9 58 04 C3 8A E8 36 40 8E BA 03 C4 EB EB FE BA 03 8A AC F8 86 26 06 00 74 E8 3D D2 E2 E8 36 8A 32 83 02 07 E3 FF 8E C3 92 B2 83 06 90 EC 08 F8 30 C0 EE EC 24 B1 D2 0A EE C3 83 06 DA 90 EC 08 F8 30 C0 EE EC D0 80 B1 D2 D0 8A D2 87 EC DA 34 8A EE C3 8A 83 06 90 EC 08 F8 C4 C7 EE C9 EB EB EC 46 EB EC 46 EB EC 46 FB 8C 8E 8B 8A E8 35 C7 8A EE 00 00 C4 C9 EC EB EC EB EC E2 E8 35 BA 03 C3 BA 03 88 04 83 06 DA BA 03 34 42 4A E0 DA 87 B0 EE EC 80 07 E8 C8 D1 E1 D0 D2 89 04 8A E8 35 C7 8A EE 00 00 C9 FA 8A EB EC F8 00 86 FB 72 BA 03 C4 86 BA 03 9E FE E2 E8 35 C3 3C 72 74 F8 3C 74 F6 87 08 F3 E4 04 E0 E8 FC 74 E9 01 E8 36 08 C4 8A B0 EF C3 8C 33 8E C4 7C 0A 74 C4 0C FE 74 0E 8D 4C FE 74 8D 7A FE 74 8D 7A FE 74 8D 4C FE 74 8D 08 FE 74 8D 08 FE 75 8E 8C 0A 56 A1 00 46 A0 00 46 F8 1E 33 8E 0A 75 C4 08 0E 00 06 00 7D C8 12 C4 08 0E 01 06 01 8B 02 2D C8 09 36 3F 0E EB FE 75 8D 7A B9 00 0B C8 49 36 2E 10 89 0C 8C 0E 26 0E 00 5E 32 8A 00 DB 0C 19 FB 77 2E 87 23 C8 A2 00 FF 8A 62 26 97 00 F0 07 F0 89 50 F8 00 19 50 49 8B 63 E8 37 D8 50 1E E3 FF 76 8B 04 4E 8B 00 C0 49 36 2E 10 3C 75 80 07 2D 3E 3E 27 36 3F 0E FE 75 80 07 17 3E 4D 11 36 4E 08 FE 74 1F 58 88 8A 8A 04 00 33 0E 53 E8 36 5B CB FF 05 E8 37 1F 1E 00 16 00 E8 37 A4 FE 8A FE 5B CF F8 22 10 80 04 11 46 0A 74 B8 00 CB 03 08 8A B4 E8 00 03 44 8B 63 83 06 EC C0 B0 EE 32 8A 62 8B 50 3A 84 76 8A 84 89 50 F8 50 98 85 FE 8A B0 EE EC E0 C4 E8 F0 D9 1E 00 C5 58 98 C4 E8 E8 F0 44 B4 40 44 80 02 E8 D9 8B 85 F7 80 FF 02 C7 C8 84 FE 98 E1 8B 63 8A B0 EF 66 80 07 05 14 E1 A1 00 1E 00 C3 E3 E0 4C C3 80 10 27 FB 74 80 30 FB 73 32 D1 2E A7 25 C3 B2 10 2C 44 62 7E 86 A0 00 E0 E4 B1 D2 24 B1 D2 89 04 46 A0 00 E0 E4 B1 D2 24 89 02 C3 33 8E 8D 7E 26 14 26 0E 00 3C 73 8A 87 F6 08 44 3E 00 1E 00 01 F6 02 08 C0 30 02 0F D1 8B B4 22 D0 0A 80 80 D4 D2 DA 8B 06 22 0B 88 89 88 88 C7 10 00 C3 00 01 01 0B 0B 3C 73 8A 89 B1 D2 80 F7 E0 26 00 46 12 F8 3C 73 34 B1 D2 0C BA 46 C7 10 00 C3 3C 77 34 8A 89 B1 D2 80 FD E0 26 00 46 12 F8 3C 73 8A 87 B1 D2 80 FE E0 26 00 46 12 F8 C7 10 00 C3 3C 73 B1 D2 8A BA 03 01 42 24 0A EE 46 12 F8 3C 77 86 8B 86 81 FF D1 FF 50 B4 E8 30 0C 76 26 51 14 59 F7 F6 10 75 8A 05 02 B0 F8 3C 77 74 3C 74 3C 74 3C 74 75 B4 E8 30 64 DF FF E3 97 00 EB DF 0D 08 D2 02 7A C3 08 0C D2 42 CA 02 6A C3 0A 36 35 5E F6 10 74 93 AC B9 00 09 4E 8A 32 D1 8B 50 D1 86 FE 3A 4A 72 32 EB B4 E8 30 FE 3A 84 76 FE B4 E8 30 3E 00 76 80 49 07 06 DF FF 09 08 06 8A 8A 53 06 57 1E 06 01 C9 16 00 CA 98 1F 5F 07 5B FB C4 A8 26 7D 26 7D 0A 74 81 0F 8B 26 0D ED DF C7 FC AF 10 E0 FB 8A 32 83 04 AF 36 FB EF 8B D1 A2 00 2E 8A 98 E0 D8 8B 04 49 24 FE D0 D0 D0 80 00 06 01 C3 07 FB 03 FF 89 04 1A 89 10 C3 0B 74 E9 01 8B 06 06 01 8C AB 0F 8D 49 F3 B9 00 36 00 A4 FE FD 00 E8 2F C3 8A 49 32 2E 87 2C E4 01 D4 24 AB 8A 01 8A 24 AA C4 04 F8 14 02 06 00 75 FE F6 88 01 02 C8 B0 BA 03 42 8A D0 D0 8A 8A D0 81 03 25 04 C3 C4 8B B4 22 89 A0 00 E8 D0 01 04 E0 E0 16 00 C2 EC C0 B0 EE EC 08 E0 E0 E0 C4 8A 32 B9 00 AA C2 60 05 E8 32 3A 74 0C 1E C5 A8 C4 04 C1 CB 02 02 5C 8C 0B 74 0C C4 0C C1 CB 02 08 74 C4 0A C1 CB 02 10 5C 8C 8C 3B 74 0C 07 AA C0 0D F3 C7 10 00 C3 FC 01 05 25 FB 81 07 75 33 E9 03 01 D1 83 00 E9 D3 D1 73 83 0C 66 81 07 75 33 E9 03 FB C7 D0 72 E9 01 89 BA 03 AA 16 00 AA F2 CE EC BA 03 AA E4 05 C4 8A EE EC FE 4A CD F3 CC EC 32 B5 8B 8A EE EC FE 4A CD F3 C2 32 BE 03 10 90 EC 08 F8 F2 C4 42 4A FE FE 74 87 EC 08 EA D6 20 87 EB B4 B5 87 EC F2 C4 FB EC 4A F2 C4 CD ED EA 8B 32 BA 03 09 C4 42 AA FE FE 75 8B AB C4 B0 EE EC E0 0F 4A 04 42 50 06 BA 03 06 42 8A B0 EE B0 EE EC B0 EE B8 A0 D8 FF 4A 04 42 50 E4 04 C4 A0 FF FE FE 75 58 1F B0 EE 42 4A 06 42 C4 BA 03 04 42 EE B0 EE 8A EE 26 47 EE D6 8A 21 BA 03 8A 22 8B 83 06 BA 03 8A 23 D0 73 26 7F 51 A0 00 30 B9 00 36 00 A5 07 8D 84 F3 8D A8 B9 00 A5 C9 D9 14 B9 00 A5 74 B9 00 A5 7C B9 00 A5 0C B9 00 A5 59 E9 03 B6 26 7F BA 03 AB C6 EC BA 03 C0 BA 03 00 EC EB EC EB EC E2 E9 01 E1 00 05 C0 85 1E 1F D0 72 E9 00 37 C6 06 00 8E BA 03 04 06 BA 03 06 04 B0 B4 EF C4 B0 EE 01 04 8A EE 26 FF D0 FE 75 B0 EE FF 07 37 C6 4A 04 AC E8 00 01 FE AC C4 86 FE 4F F5 C2 AC BA 03 00 E5 8B 36 11 E4 32 B5 AC C4 86 FE FE 75 83 06 C0 32 B5 FB FA A8 74 87 8A EE EE C4 CD 10 FA A8 75 87 B0 EE D7 DB 30 04 FA 87 8A EE AC 87 FE FE 75 83 06 FA CE 32 B5 AC C4 86 FE FE 75 8B BA 03 EE D7 EE CE AC 8B 83 06 BA 03 EE E9 52 8B 02 26 26 00 26 06 00 0F 8D 49 F3 B9 00 3E 00 A4 3E 00 02 F3 06 C9 C1 14 B9 00 A5 74 B9 00 A5 7C B9 00 A5 0C B9 00 A5 59 E9 21 77 AD C6 AC BA 03 C0 BA 03 00 AC EB AC EB AC E2 B8 00 46 89 04 C3 0F 0F 03 7F 7F 7F 0F 7F 01 FF 88 88 01 88 00 00 08 12 31 01 F9 F9 F9 3C 3E 40 42 62 6E 3C 77 32 8B D1 E8 00 FF 1C F9 C3 C3 F8 72 C7 04 00 46 00 A0 00 02 E8 E8 01 05 E4 46 F8 F8 F6 87 08 75 F8 72 0A 74 E8 2A 04 44 F8 50 51 1E 40 8E B0 86 00 3C 74 FB 0F 10 EC B4 CD 59 33 E8 00 20 02 10 08 10 30 72 FE 3A 72 32 FE 3A 84 76 E8 00 C9 B4 CD FA 0E 01 5A 5B CF 0D 04 72 B0 52 D2 C0 02 20 00 17 C4 74 F9 C3 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7E A5 81 99 81 00 00 00 7E DB FF E7 FF 00 00 00 00 6C FE FE 38 00 00 00 00 10 7C 7C 10 00 00 00 00 3C E7 E7 18 00 00 00 00 3C FF 7E 18 00 00 00 00 00 18 3C 00 00 00 FF FF FF E7 C3 FF FF FF 00 00 00 66 42 3C 00 00 FF FF FF 99 BD C3 FF FF 00 1E 1A 78 CC CC 00 00 00 3C 66 66 18 18 00 00 00 3F 3F 30 30 F0 00 00 00 7F 7F 63 63 E7 C0 00 00 00 18 3C 3C 18 00 00 00 C0 F0 FE F0 C0 00 00 00 06 1E FE 1E 06 00 00 00 18 7E 18 7E 18 00 00 00 66 66 66 66 66 00 00 00 7F DB 7B 1B 1B 00 00 00 C6 38 C6 6C 0C 7C 00 00 00 00 00 FE FE 00 00 00 18 7E 18 7E 18 00 00 00 18 7E 18 18 18 00 00 00 18 18 18 18 3C 00 00 00 00 00 0C 0C 00 00 00 00 00 00 60 60 00 00 00 00 00 00 C0 C0 00 00 00 00 00 00 6C 6C 00 00 00 00 00 10 38 7C FE 00 00 00 00 FE 7C 38 10 00 00 00 00 00 00 00 00 00 00 00 18 3C 18 18 18 00 00 00 66 24 00 00 00 00 00 00 00 6C 6C 6C 6C 00 00 18 7C C2 7C 06 C6 18 00 00 00 C2 0C 30 C6 00 00 00 38 6C 76 CC CC 00 00 00 30 60 00 00 00 00 00 00 0C 30 30 30 18 00 00 00 30 0C 0C 0C 18 00 00 00 00 00 3C 3C 00 00 00 00 00 00 18 18 00 00 00 00 00 00 00 00 18 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 18 00 00 00 00 02 0C 30 C0 00 00 00 38 C6 D6 C6 6C 00 00 00 18 78 18 18 18 00 00 00 7C 06 18 60 C6 00 00 00 7C 06 3C 06 C6 00 00 00 0C 3C CC 0C 0C 00 00 00 FE C0 FC 06 C6 00 00 00 38 C0 FC C6 C6 00 00 00 FE 06 0C 30 30 00 00 00 7C C6 7C C6 C6 00 00 00 7C C6 7E 06 0C 00 00 00 00 18 00 00 18 00 00 00 00 18 00 00 18 00 00 00 00 0C 30 30 0C 00 00 00 00 00 00 7E 00 00 00 00 00 30 0C 0C 30 00 00 00 7C C6 18 18 18 00 00 00 00 C6 DE DE C0 00 00 00 10 6C C6 C6 C6 00 00 00 FC 66 7C 66 66 00 00 00 3C C2 C0 C0 66 00 00 00 F8 66 66 66 6C 00 00 00 FE 62 78 60 66 00 00 00 FE 62 78 60 60 00 00 00 3C C2 C0 C6 66 00 00 00 C6 C6 FE C6 C6 00 00 00 3C 18 18 18 18 00 00 00 1E 0C 0C CC CC 00 00 00 E6 66 78 6C 66 00 00 00 F0 60 60 60 66 00 00 00 C6 FE D6 C6 C6 00 00 00 C6 F6 DE C6 C6 00 00 00 7C C6 C6 C6 C6 00 00 00 FC 66 7C 60 60 00 00 00 7C C6 C6 C6 DE 0C 00 00 FC 66 7C 66 66 00 00 00 7C C6 38 06 C6 00 00 00 7E 5A 18 18 18 00 00 00 C6 C6 C6 C6 C6 00 00 00 C6 C6 C6 C6 38 00 00 00 C6 C6 D6 D6 EE 00 00 00 C6 6C 38 7C C6 00 00 00 66 66 3C 18 18 00 00 00 FE 86 18 60 C6 00 00 00 3C 30 30 30 30 00 00 00 00 C0 70 1C 06 00 00 00 3C 0C 0C 0C 0C 00 00 10 6C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 30 18 00 00 00 00 00 00 00 00 00 0C CC CC 00 00 00 E0 60 6C 66 66 00 00 00 00 00 C6 C0 C6 00 00 00 1C 0C 6C CC CC 00 00 00 00 00 C6 C0 C6 00 00 00 38 64 F0 60 60 00 00 00 00 00 CC CC CC 0C 78 00 E0 60 76 66 66 00 00 00 18 00 18 18 18 00 00 00 06 00 06 06 06 66 3C 00 E0 60 6C 78 66 00 00 00 38 18 18 18 18 00 00 00 00 00 FE D6 D6 00 00 00 00 00 66 66 66 00 00 00 00 00 C6 C6 C6 00 00 00 00 00 66 66 66 60 F0 00 00 00 CC CC CC 0C 1E 00 00 00 76 60 60 00 00 00 00 00 C6 38 C6 00 00 00 10 30 30 30 36 00 00 00 00 00 CC CC CC 00 00 00 00 00 66 66 3C 00 00 00 00 00 C6 D6 FE 00 00 00 00 00 6C 38 6C 00 00 00 00 00 C6 C6 C6 06 F8 00 00 00 CC 30 C6 00 00 00 0E 18 70 18 18 00 00 00 18 18 00 18 18 00 00 00 70 18 0E 18 18 00 00 00 76 00 00 00 00 00 00 00 00 10 6C C6 FE 00 00 00 3C C2 C0 C2 3C 06 00 00 CC 00 CC CC CC 00 00 00 18 00 C6 C0 C6 00 00 00 38 00 0C CC CC 00 00 00 CC 00 0C CC CC 00 00 00 30 00 0C CC CC 00 00 00 6C 00 0C CC CC 00 00 00 00 3C 60 66 0C 3C 00 00 38 00 C6 C0 C6 00 00 00 C6 00 C6 C0 C6 00 00 00 30 00 C6 C0 C6 00 00 00 66 00 18 18 18 00 00 00 3C 00 18 18 18 00 00 00 30 00 18 18 18 00 00 00 00 38 C6 FE C6 00 00 38 38 38 C6 FE C6 00 00 18 60 FE 60 60 66 00 00 00 00 00 76 7E D8 00 00 00 3E CC FE CC CC 00 00 00 38 00 C6 C6 C6 00 00 00 C6 00 C6 C6 C6 00 00 00 30 00 C6 C6 C6 00 00 00 78 00 CC CC CC 00 00 00 30 00 CC CC CC 00 00 00 C6 00 C6 C6 C6 06 78 00 00 C6 C6 C6 C6 00 00 00 00 C6 C6 C6 C6 00 00 00 18 66 60 66 18 00 00 00 6C 60 60 60 E6 00 00 00 66 3C 7E 7E 18 00 00 00 CC F8 CC CC CC 00 00 00 1B 18 7E 18 18 D8 00 00 30 00 0C CC CC 00 00 00 18 00 18 18 18 00 00 00 30 00 C6 C6 C6 00 00 00 30 00 CC CC CC 00 00 00 76 00 66 66 66 00 00 76 00 E6 FE CE C6 00 00 00 6C 3E 7E 00 00 00 00 00 6C 38 7C 00 00 00 00 00 30 00 30 C0 C6 00 00 00 00 00 FE C0 C0 00 00 00 00 00 FE 06 06 00 00 00 C0 C6 18 60 86 18 00 00 C0 C6 18 66 9E 06 00 00 18 00 18 3C 3C 00 00 00 00 00 6C 6C 00 00 00 00 00 00 6C 6C 00 00 00 11 11 11 11 11 11 11 11 55 55 55 55 55 55 55 55 DD DD DD DD DD DD DD DD 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 36 36 36 36 36 36 36 36 00 00 00 00 36 36 36 36 00 00 00 18 18 18 18 18 36 36 36 06 36 36 36 36 36 36 36 36 36 36 36 36 00 00 00 06 36 36 36 36 36 36 36 06 00 00 00 00 36 36 36 36 00 00 00 00 18 18 18 18 00 00 00 00 00 00 00 00 18 18 18 18 18 18 18 18 00 00 00 00 18 18 18 18 00 00 00 00 00 00 00 00 18 18 18 18 18 18 18 18 18 18 18 18 00 00 00 00 00 00 00 00 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 36 36 36 36 36 36 36 36 36 36 36 30 00 00 00 00 00 00 00 30 36 36 36 36 36 36 36 00 00 00 00 00 00 00 00 00 36 36 36 36 36 36 36 30 36 36 36 36 00 00 00 00 00 00 00 00 36 36 36 00 36 36 36 36 18 18 18 00 00 00 00 00 36 36 36 36 00 00 00 00 00 00 00 00 18 18 18 18 00 00 00 00 36 36 36 36 36 36 36 36 00 00 00 00 18 18 18 18 00 00 00 00 00 00 00 18 18 18 18 18 00 00 00 00 36 36 36 36 36 36 36 36 36 36 36 36 18 18 18 18 18 18 18 18 18 18 18 18 00 00 00 00 00 00 00 00 18 18 18 18 FF FF FF FF FF FF FF FF 00 00 00 00 FF FF FF FF F0 F0 F0 F0 F0 F0 F0 F0 0F 0F 0F 0F 0F 0F 0F 0F FF FF FF FF 00 00 00 00 00 00 00 DC D8 DC 00 00 00 78 CC D8 C6 C6 00 00 00 FE C6 C0 C0 C0 00 00 00 00 FE 6C 6C 6C 00 00 00 00 C6 30 30 C6 00 00 00 00 00 D8 D8 D8 00 00 00 00 66 66 66 60 C0 00 00 00 76 18 18 18 00 00 00 00 18 66 66 18 00 00 00 00 6C C6 C6 6C 00 00 00 38 C6 C6 6C 6C 00 00 00 1E 18 3E 66 66 00 00 00 00 00 DB DB 00 00 00 00 00 06 DB F3 60 00 00 00 1C 60 7C 60 30 00 00 00 00 C6 C6 C6 C6 00 00 00 00 FE 00 00 FE 00 00 00 00 18 7E 18 00 00 00 00 00 18 06 18 00 00 00 00 00 18 60 18 00 00 00 00 0E 1B 18 18 18 18 18 18 18 18 18 D8 D8 00 00 00 00 18 00 00 18 00 00 00 00 00 DC 76 00 00 00 00 6C 38 00 00 00 00 00 00 00 00 00 18 00 00 00 00 00 00 00 18 00 00 00 00 0C 0C 0C 6C 3C 00 00 00 6C 6C 6C 00 00 00 00 00 D8 60 F8 00 00 00 00 00 00 7C 7C 7C 7C 00 00 00 00 00 00 00 00 00 00 1D 00 00 24 FF 24 00 00 00 00 3C C3 DB C3 66 00 00 4D 00 E7 FF C3 C3 C3 00 00 00 FF 99 18 18 18 00 00 56 00 C3 C3 C3 66 18 00 00 00 C3 C3 C3 DB 66 00 00 58 00 C3 3C 18 66 C3 00 00 00 C3 C3 3C 18 18 00 00 5A 00 C3 0C 30 C1 FF 00 00 00 00 00 FF DB DB 00 00 76 00 00 C3 C3 66 18 00 00 00 00 00 C3 DB FF 00 00 78 00 00 C3 3C 3C C3 00 00 00 00 00 3B 7E DC 00 00 9B 18 7E C0 C0 7E 18 00 00 00 C3 3C FF FF 18 00 00 9E FC 66 62 6F 66 F3 00 00 00 C0 C6 18 60 9B 0C 00 AC C0 C2 CC 30 CE 3E 06 00 00 00 00 00 00 00 00 00 7E A5 81 99 7E 00 00 7E DB FF E7 7E 00 00 00 FE FE 7C 10 00 00 00 38 FE 38 00 00 00 18 3C E7 18 3C 00 00 18 7E FF 18 3C 00 00 00 00 3C 18 00 00 FF FF FF C3 E7 FF FF 00 00 3C 42 66 00 00 FF FF C3 BD 99 FF FF 00 1E 1A 78 CC 78 00 00 3C 66 3C 7E 18 00 00 3F 3F 30 70 E0 00 00 7F 7F 63 67 E6 00 00 18 DB E7 DB 18 00 00 80 E0 FE E0 80 00 00 02 0E FE 0E 02 00 00 18 7E 18 7E 18 00 00 66 66 66 00 66 00 00 7F DB 7B 1B 1B 00 00 C6 38 C6 6C 0C 7C 00 00 00 00 FE FE 00 00 18 7E 18 7E 18 00 00 18 7E 18 18 18 00 00 18 18 18 7E 18 00 00 00 18 FE 18 00 00 00 00 30 FE 30 00 00 00 00 00 C0 FE 00 00 00 00 28 FE 28 00 00 00 00 38 7C FE 00 00 00 00 FE 7C 38 00 00 00 00 00 00 00 00 00 00 18 3C 18 00 18 00 00 66 24 00 00 00 00 00 6C FE 6C FE 6C 00 18 7C C2 7C 86 7C 18 00 00 C2 0C 30 C6 00 00 38 6C 76 CC 76 00 00 30 60 00 00 00 00 00 0C 30 30 30 0C 00 00 30 0C 0C 0C 30 00 00 00 66 FF 66 00 00 00 00 18 7E 18 00 00 00 00 00 00 18 18 00 00 00 00 FE 00 00 00 00 00 00 00 00 18 00 00 02 0C 30 C0 00 00 00 7C CE F6 C6 7C 00 00 18 78 18 18 7E 00 00 7C 06 18 60 FE 00 00 7C 06 3C 06 7C 00 00 0C 3C CC 0C 1E 00 00 FE C0 FC 06 7C 00 00 38 C0 FC C6 7C 00 00 FE 06 18 30 30 00 00 7C C6 7C C6 7C 00 00 7C C6 7E 06 78 00 00 00 18 00 18 00 00 00 00 18 00 18 30 00 00 06 18 60 18 06 00 00 00 00 00 7E 00 00 00 60 18 06 18 60 00 00 7C C6 18 00 18 00 00 7C C6 DE DC 7C 00 00 10 6C C6 C6 C6 00 00 FC 66 7C 66 FC 00 00 3C C2 C0 C2 3C 00 00 F8 66 66 66 F8 00 00 FE 62 78 62 FE 00 00 FE 62 78 60 F0 00 00 3C C2 C0 C6 3A 00 00 C6 C6 FE C6 C6 00 00 3C 18 18 18 3C 00 00 1E 0C 0C CC 78 00 00 E6 6C 78 6C E6 00 00 F0 60 60 62 FE 00 00 C6 FE D6 C6 C6 00 00 C6 F6 DE C6 C6 00 00 38 C6 C6 C6 38 00 00 FC 66 7C 60 F0 00 00 7C C6 C6 DE 0C 00 00 FC 66 7C 66 E6 00 00 7C C6 38 C6 7C 00 00 7E 5A 18 18 3C 00 00 C6 C6 C6 C6 7C 00 00 C6 C6 C6 6C 10 00 00 C6 C6 D6 FE 6C 00 00 C6 6C 38 6C C6 00 00 66 66 3C 18 3C 00 00 FE 8C 30 C2 FE 00 00 3C 30 30 30 3C 00 00 80 E0 38 0E 02 00 00 3C 0C 0C 0C 3C 00 10 6C 00 00 00 00 00 00 00 00 00 00 00 FF 30 18 00 00 00 00 00 00 00 00 0C CC 76 00 00 E0 60 6C 66 7C 00 00 00 00 C6 C0 7C 00 00 1C 0C 6C CC 76 00 00 00 00 C6 C0 7C 00 00 38 64 F0 60 F0 00 00 00 00 CC CC 0C 78 00 E0 60 76 66 E6 00 00 18 00 18 18 3C 00 00 06 00 06 06 66 3C 00 E0 60 6C 6C E6 00 00 38 18 18 18 3C 00 00 00 00 FE D6 C6 00 00 00 00 66 66 66 00 00 00 00 C6 C6 7C 00 00 00 00 66 66 60 F0 00 00 00 CC CC 0C 1E 00 00 00 76 60 F0 00 00 00 00 C6 1C 7C 00 00 10 30 30 30 1C 00 00 00 00 CC CC 76 00 00 00 00 66 66 18 00 00 00 00 C6 D6 6C 00 00 00 00 6C 38 C6 00 00 00 00 C6 C6 06 F8 00 00 00 CC 30 FE 00 00 0E 18 70 18 0E 00 00 18 18 00 18 18 00 00 70 18 0E 18 70 00 00 76 00 00 00 00 00 00 00 10 6C C6 00 00 00 3C C2 C0 66 0C 7C 00 CC 00 CC CC 76 00 00 18 00 C6 C0 7C 00 00 38 00 0C CC 76 00 00 CC 00 0C CC 76 00 00 30 00 0C CC 76 00 00 6C 00 0C CC 76 00 00 00 3C 60 3C 06 00 00 38 00 C6 C0 7C 00 00 CC 00 C6 C0 7C 00 00 30 00 C6 C0 7C 00 00 66 00 18 18 3C 00 00 3C 00 18 18 3C 00 00 30 00 18 18 3C 00 00 C6 38 C6 FE C6 00 38 38 38 C6 FE C6 00 18 60 FE 60 60 FE 00 00 00 CC 36 D8 6E 00 00 3E CC FE CC CE 00 00 38 00 C6 C6 7C 00 00 C6 00 C6 C6 7C 00 00 30 00 C6 C6 7C 00 00 78 00 CC CC 76 00 00 30 00 CC CC 76 00 00 C6 00 C6 C6 06 78 00 C6 6C C6 C6 38 00 00 C6 C6 C6 C6 7C 00 00 18 66 60 3C 18 00 00 6C 60 60 60 FC 00 00 66 3C 7E 7E 18 00 00 CC F8 CC CC C6 00 00 1B 18 7E 18 18 70 00 30 00 0C CC 76 00 00 18 00 18 18 3C 00 00 30 00 C6 C6 7C 00 00 30 00 CC CC 76 00 00 76 00 66 66 66 00 76 00 E6 FE CE C6 00 00 6C 3E 7E 00 00 00 00 6C 38 7C 00 00 00 00 30 00 30 C6 7C 00 00 00 00 FE C0 00 00 00 00 00 FE 06 00 00 00 C0 CC 30 DC 0C 3E 00 C0 CC 30 CE 3E 06 00 18 00 18 3C 18 00 00 00 36 D8 36 00 00 00 00 D8 36 D8 00 00 11 11 11 11 11 11 11 55 55 55 55 55 55 55 DD DD DD DD DD DD DD 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 36 36 36 36 36 36 36 00 00 00 00 36 36 36 00 00 00 18 18 18 18 36 36 36 06 36 36 36 36 36 36 36 36 36 36 00 00 00 06 36 36 36 36 36 36 06 00 00 00 36 36 36 36 00 00 00 18 18 18 18 00 00 00 00 00 00 00 18 18 18 18 18 18 18 00 00 00 18 18 18 18 00 00 00 00 00 00 00 18 18 18 18 18 18 18 18 18 18 00 00 00 00 00 00 00 18 18 18 18 18 18 18 18 18 18 18 18 18 18 36 36 36 36 36 36 36 36 36 36 30 00 00 00 00 00 00 30 36 36 36 36 36 36 00 00 00 00 00 00 00 00 36 36 36 36 36 36 30 36 36 36 00 00 00 00 00 00 00 36 36 36 00 36 36 36 18 18 18 00 00 00 00 36 36 36 36 00 00 00 00 00 00 00 18 18 18 00 00 00 00 36 36 36 36 36 36 36 00 00 00 18 18 18 18 00 00 00 00 00 00 18 18 18 18 00 00 00 00 36 36 36 36 36 36 36 36 36 36 18 18 18 18 18 18 18 18 18 18 18 00 00 00 00 00 00 00 18 18 18 FF FF FF FF FF FF FF 00 00 00 00 FF FF FF F0 F0 F0 F0 F0 F0 F0 0F 0F 0F 0F 0F 0F 0F FF FF FF FF 00 00 00 00 00 00 DC D8 76 00 00 00 7C FC C6 C0 40 00 FE C6 C0 C0 C0 00 00 00 FE 6C 6C 6C 00 00 FE 60 18 60 FE 00 00 00 00 D8 D8 70 00 00 00 66 66 7C 60 00 00 00 76 18 18 18 00 00 7E 3C 66 3C 7E 00 00 38 C6 FE C6 38 00 00 38 C6 C6 6C EE 00 00 1E 18 3E 66 3C 00 00 00 00 DB 7E 00 00 00 03 7E DB 7E C0 00 00 1C 60 7C 60 1C 00 00 00 C6 C6 C6 C6 00 00 00 00 FE 00 00 00 00 00 18 18 00 FF 00 00 30 0C 0C 30 7E 00 00 0C 30 30 0C 7E 00 00 0E 1B 18 18 18 18 18 18 18 18 D8 70 00 00 00 18 7E 18 00 00 00 00 76 00 DC 00 00 00 6C 38 00 00 00 00 00 00 00 18 00 00 00 00 00 00 00 00 00 00 00 0C 0C 0C 6C 1C 00 00 6C 6C 6C 00 00 00 00 D8 60 F8 00 00 00 00 00 7C 7C 7C 00 00 00 00 00 00 00 00 00 1D 00 00 66 66 00 00 00 00 63 22 00 00 00 00 2B 00 18 18 18 18 00 00 00 00 00 FF 00 00 00 4D 00 E7 DB C3 C3 00 00 00 FF 99 18 18 3C 00 56 00 C3 C3 C3 3C 00 00 00 C3 C3 DB FF 66 00 58 00 C3 3C 3C C3 00 00 00 C3 C3 3C 18 3C 00 5A 00 C3 0C 30 C3 00 00 00 00 00 FF DB DB 00 76 00 00 C3 C3 3C 00 00 00 00 00 C3 DB 66 00 91 00 00 3B 7E DC 00 00 00 18 C3 C0 7E 18 00 9D 00 66 18 18 18 00 00 00 66 7C 66 66 F3 00 F1 00 18 FF 18 00 00 00 00 18 00 FF 00 18 00 00 00 00 00 00 7E A5 BD 81 7E DB C3 FF 6C FE 7C 10 10 7C 7C 10 38 38 FE 38 10 38 FE 38 00 18 3C 00 FF E7 C3 FF 00 66 42 3C FF 99 BD C3 0F 0F CC CC 3C 66 3C 7E 3F 3F 30 F0 7F 7F 63 E6 99 3C E7 5A 80 F8 F8 80 02 3E 3E 02 18 7E 18 3C 66 66 66 66 7F DB 1B 1B 3E 38 6C CC 00 00 7E 7E 18 7E 7E 18 18 7E 18 18 18 18 7E 18 00 0C 0C 00 00 60 60 00 00 C0 C0 00 00 66 66 00 00 3C FF 00 00 FF 3C 00 00 00 00 00 30 78 30 30 6C 6C 00 00 6C FE FE 6C 30 C0 0C 30 00 CC 30 C6 38 38 DC 76 60 C0 00 00 18 60 60 18 60 18 18 60 00 3C 3C 00 00 30 30 00 00 00 00 30 00 00 00 00 00 00 00 30 06 18 60 80 7C CE F6 7C 30 30 30 FC 78 0C 60 FC 78 0C 0C 78 1C 6C FE 1E FC F8 0C 78 38 C0 CC 78 FC 0C 30 30 78 CC CC 78 78 CC 0C 70 00 30 00 30 00 30 00 30 18 60 60 18 00 FC 00 00 60 18 18 60 78 0C 30 30 7C DE DE 78 30 CC FC CC FC 66 66 FC 3C C0 C0 3C F8 66 66 F8 FE 68 68 FE FE 68 68 F0 3C C0 CE 3E CC CC CC CC 78 30 30 78 1E 0C CC 78 E6 6C 6C E6 F0 60 62 FE C6 FE D6 C6 C6 F6 CE C6 38 C6 C6 38 FC 66 60 F0 78 CC DC 1C FC 66 6C E6 78 E0 1C 78 FC 30 30 78 CC CC CC FC CC CC CC 30 C6 C6 FE C6 C6 6C 38 C6 CC CC 30 78 FE 8C 32 FE 78 60 60 78 C0 30 0C 02 78 18 18 78 10 6C 00 00 00 00 00 00 30 18 00 00 00 78 7C 76 E0 60 66 DC 00 78 C0 78 1C 0C CC 76 00 78 FC 78 38 60 60 F0 00 76 CC 0C E0 6C 66 E6 30 70 30 78 0C 0C 0C CC E0 66 78 E6 70 30 30 78 00 CC FE C6 00 F8 CC CC 00 78 CC 78 00 DC 66 60 00 76 CC 0C 00 DC 66 F0 00 7C 78 F8 10 7C 30 18 00 CC CC 76 00 CC CC 30 00 C6 FE 6C 00 C6 38 C6 00 CC CC 0C 00 FC 30 FC 1C 30 30 1C 18 18 18 18 E0 30 30 E0 76 00 00 00 00 38 C6 FE 78 C0 78 0C 00 00 CC 7E 1C 78 FC 78 7E 3C 3E 3F CC 78 7C 7E E0 78 7C 7E 30 78 7C 7E 00 78 C0 0C 7E 3C 7E 3C CC 78 FC 78 E0 78 FC 78 CC 70 30 78 7C 38 18 3C E0 70 30 78 C6 6C FE C6 30 00 CC CC 1C FC 78 FC 00 7F 7F 7F 3E CC CC CE 78 00 CC 78 00 00 CC 78 00 00 CC 78 78 00 CC 7E 00 00 CC 7E 00 00 CC 0C C3 3C 66 18 CC CC CC 78 18 7E C0 18 38 64 60 FC CC 78 30 30 F8 CC C6 C6 0E 18 18 D8 1C 78 7C 7E 38 70 30 78 00 00 CC 78 00 00 CC 7E 00 00 CC CC FC CC FC CC 3C 6C 00 00 38 6C 00 00 30 30 C0 78 00 00 C0 00 00 00 0C 00 C3 CC 33 CC C3 CC 37 CF 18 00 18 18 00 66 66 00 00 66 66 00 22 22 22 22 55 55 55 55 DB DB DB DB 18 18 18 18 18 18 F8 18 18 F8 F8 18 36 36 F6 36 00 00 FE 36 00 F8 F8 18 36 F6 F6 36 36 36 36 36 00 FE F6 36 36 F6 FE 00 36 36 FE 00 18 F8 F8 00 00 00 F8 18 18 18 1F 00 18 18 FF 00 00 00 FF 18 18 18 1F 18 00 00 FF 00 18 18 FF 18 18 1F 1F 18 36 36 37 36 36 37 3F 00 00 3F 37 36 36 F7 FF 00 00 FF F7 36 36 37 37 36 00 FF FF 00 36 F7 F7 36 18 FF FF 00 36 36 FF 00 00 FF FF 18 00 00 FF 36 36 36 3F 00 18 1F 1F 00 00 1F 1F 18 00 00 3F 36 36 36 FF 36 18 FF FF 18 18 18 F8 00 00 00 1F 18 FF FF FF FF 00 00 FF FF F0 F0 F0 F0 0F 0F 0F 0F FF FF 00 00 00 76 C8 76 00 CC CC C0 00 CC C0 C0 00 6C 6C 6C FC 60 60 FC 00 7E D8 70 00 66 66 60 00 DC 18 18 FC 78 CC 30 38 C6 C6 38 38 C6 6C EE 1C 18 CC 78 00 7E DB 00 06 7E DB 60 38 C0 C0 38 78 CC CC CC 00 00 00 00 30 FC 30 FC 60 18 60 FC 18 60 18 FC 0E 1B 18 18 18 18 18 D8 30 00 00 30 00 DC 76 00 38 6C 00 00 00 00 18 00 00 00 18 00 0F 0C EC 3C 78 6C 6C 00 70 30 78 00 00 3C 3C 00 00 00 00 00 B8 00 0E 00 C1 74 8B 33 B8 40 40 E1 8A B1 D2 FE 52 CE B0 EE EC 0C 02 E8 93 8A 58 93 3A 76 8A 8A 98 CA D2 C8 C8 C8 C8 E0 D2 E0 D2 8B 4C 0B 5B 05 07 EB F7 4C 8B 0B 74 48 07 76 B8 00 86 FA 81 C0 74 42 C4 FB FA 03 01 C3 8B 8A 98 D8 26 00 D0 E3 9F 00 4A F6 32 03 D1 03 97 8A 8A 98 CB D8 26 00 F0 E3 9F 00 85 F6 32 80 0D 0F 0B E8 07 F6 20 F5 D1 D1 D1 D1 8B D1 D1 03 32 80 13 0A E0 E0 E3 E3 E3 F9 73 D1 03 03 87 C3 1E 33 8E 58 FF 40 1F 52 8B 63 F6 87 08 0C C2 EC 20 C0 EE 0C C2 A0 00 08 A2 00 5A 52 8B 63 F6 87 08 0C C2 EC C0 C0 EE 0C C2 A0 00 F7 A2 00 5A 50 BA 03 01 42 0C 8A B0 4A 5A C3 50 BA 03 01 42 24 8A B0 4A 5A C3 53 07 2D 04 03 35 06 00 74 D0 3C F5 00 17 23 1E 00 E3 80 09 05 FB 75 04 EB 3C 72 3C 77 04 EB 04 5B FA 43 B0 EE 40 EC E0 86 FB E8 FF C3 AE C3 E8 FF D8 EE 73 E2 C3 BA 00 28 F7 8B FA 43 B0 EE 42 8B EE C4 FB 61 EC FE 03 E8 FF 61 EC FC C3 1E C4 A8 E8 BA 04 07 C3 8D 08 8D 08 B5 3C 77 74 3C 77 33 F6 89 10 30 36 3F 0E 0E 00 E1 80 09 1E F9 74 8D 7A B5 EB F6 89 10 0A 36 3F 3E 4D 0E A2 E8 00 FE E8 02 C4 74 A1 00 26 00 C4 0E 00 9E EB 8D 7A 3C 74 3C 72 8D 4C 3C 76 8D 08 33 8E 89 0C 8C 0E E8 01 08 02 E8 00 12 F6 0E CB D3 08 CA F3 02 CE E8 00 18 54 B0 EE EC C8 4A 03 42 FE EE E8 00 E8 00 21 09 42 4A 80 17 24 EE B0 EE EC C0 E0 B0 EE 8A EE C3 50 1E 40 8E 8B 63 83 06 A8 1F 58 B0 EE EC 7F 4A B0 EE EC 80 4A 1E 53 8A 32 33 8E 26 36 01 8C 0E B9 01 D2 1F 53 18 5B 0B 74 E8 01 5B 1F 1E 53 B4 06 26 7F 8C 0B 74 8B 26 6F 80 FF 4C 3A 75 33 26 4D FE 88 84 26 0D 0E 00 E9 8A 01 8B 04 C5 06 8B 02 D9 FF 01 12 DB 0E C9 C1 89 0C 26 1E 01 CF A4 80 01 07 C4 10 C4 06 C3 DF 46 DF 8A 07 FD 74 43 E8 F2 C9 8A 3B 85 75 8A 26 4D 33 26 75 BF 01 D9 DB 0E C9 C1 89 0C 26 1E 01 CF 4E 80 02 5B 1F 1E 53 26 7F 8C 0B F8 32 DF 8A 07 FD 74 43 E8 F2 8A FE 88 84 26 4D 89 85 26 75 33 8E 89 0C 8C 0E F9 5B 1F 50 00 8E 8A 98 D9 02 C8 C4 E8 D4 C4 0D E0 05 E2 C2 F8 D9 DF CB E3 FE 32 B8 00 C3 C9 10 32 41 CA CB A4 F8 CA F4 C3 50 00 8E 8A 98 02 C8 C4 E8 D4 C4 0D E0 D0 CF E7 FE B3 2A 87 AC C0 18 E4 FA 05 E0 F8 C0 ED CF A4 CB AA E3 C3 50 8A BA 03 02 04 B0 B4 EF CE B0 B4 EF 06 04 B0 B4 EF D1 C2 EC C0 32 EE D1 58 50 8A BA 03 02 03 B0 B4 EF CE B0 B4 EF 06 0E 06 00 74 B4 EF 04 00 8A 83 06 BA 03 20 8A 59 C3 56 52 DA C4 B9 00 01 00 B4 E8 01 C2 AC BA 03 03 00 8B E8 FD 19 32 E8 01 1E E8 FD C6 FA 5A 74 83 06 90 EC 08 F8 90 EC 08 F8 C0 B0 EE EE B4 AC 6E B4 AC 68 FB CE B9 00 E4 12 8B 83 06 C0 FA BA 03 14 C0 48 E8 FA 5A 5E 51 56 8C 8E F6 89 08 30 8E 83 06 C6 FA BA 03 10 32 E8 00 AC 11 14 FE E8 00 BA 03 FF 1F 08 E8 00 5E 59 1E 49 8A 89 B1 B5 E8 FB D1 8B 2E B7 02 C8 D8 FF 3E 1F 1E 8A 89 A1 00 E0 49 8B 63 C5 A8 C4 04 74 C5 0A DB DE 66 DE 4F 80 FF 5C 3A 75 FC 0A 74 79 B4 FE B0 EF C2 EC C0 83 03 0B 74 8A AD E0 56 34 80 10 0D 74 E8 00 C4 C9 EE FE E8 F9 CC 30 5E 8A AD C0 0A C8 8A C5 E8 00 1F FA E8 F9 C4 F8 C3 FA E8 F9 06 FE E2 FB 8C 0B 74 8A 80 1F FF 88 C3 FC E2 C8 8A EE C9 AC F2 F6 06 03 22 E8 01 C5 C9 E2 FC E2 C8 8A EE C9 AC D8 8A AC C3 C4 74 E8 00 32 FE FE 75 C3 FC E2 09 20 08 BA 03 C5 BA 03 04 7C 8A 08 C4 74 E8 00 04 FE 46 75 BF 00 C8 8A EE C9 8A 8A F8 5C F6 06 03 A8 E8 00 C5 4F DE 08 BA 03 C5 BA 03 04 7C 8A F0 C4 74 E8 00 BA FE 46 75 FE 75 BA 03 10 BA 03 10 8D DC AC F8 D8 98 E2 BA 03 00 BA 03 10 8D CC AC 10 F6 06 03 40 E8 00 EF C3 52 D8 21 E3 D0 32 2E 87 02 D8 E3 2E 97 02 E8 E8 D8 E3 2E B7 02 E8 E8 D8 8A 88 8B 5A 52 57 F6 FF BA 4C F7 03 13 BA 97 C7 F7 03 13 BA 1C C3 F7 03 13 D1 83 00 8A 8A 8A 5F 5A FA EB 8A EE 00 C3 FB FF FF FF FF FF FF FF FF FF FF EC 7A 7A 80 FF FF FF FF 43 70 72 67 74 43 4D 41 20 6F 70 74 72 43 72 6F 61 69 6E 20 39 32 20 39 33 20 39 34 20 39 35 20 39 36 20 39 37 20 39 38 00 57 2A 4E 2A 50 2A 4A 2A 41 2A 4C 2A 56 43 30 43 4D 41 20 FF FF 35 31 2F 38 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
{"data":[
-399463851,-303561389,46589952,-622263437,-393504768,-661733325,1075758330,1112117248,-2144975539,141938495,-1896873800,-261768256,17434252,17309321,-1912586056,199504600,
-2147256851,-726007348,-2147241981,1622347980,-973604425,175374338,-1341934406,46891015,1235418039,-1993963520,-2028042240,-2009167872,1662421248,9168896,1912887528,53471342,
-402479640,378143218,-85458871,60418049,8988288,-259286791,-1976640117,-805222980,201815023,72607984,-317997005,-1976695436,-1962848834,436320488,-2048335994,133922902,
243271029,-402259831,173146182,-402426670,-695860811,-402542360,173670861,-402164526,-318045787,-695859852,-1946051352,100664776,1994971278,-390411516,-300502970,-1342111046,
-1161564672,28311810,1189657326,-1007808848,-768474186,8980214,-167021567,67143942,129372788,116788971,1946288263,-1979206142,83001558,537923779,537923616,537923632,
537923616,235864112,252645135,117964816,-1073739502,0,0,0,-1073741432,0,0,-402650862,0,0,0,-402652766,
0,0,30146586,49152,0,0,0,0,1703936,-402652724,0,0,0,0,0,1040639,
117440512,251594754,4128768,524560,16777216,16908800,17040384,84018432,100730368,134219269,117442561,117835522,287969578,287969578,287969578,296358186,
287969642,287969578,287969578,296358186,296358250,292163946,292163946,292163946,296358250,292163946,1568149586,1568169336,1568169336,1568169336,1584946552,1584946808,
1584946808,1568169336,1584946808,1568169336,1568169336,1568169336,1568169336,1568169336,1573019000,336593920,370279938,471337992,505024010,1058351616,378229328,-1031602077,
-289394170,1405311066,-478029173,-1014300657,901745198,270436865,-807174144,512286474,-1645740016,-389850284,-806877782,-400395773,494011478,1912926440,94955544,1235227506,
-804802048,-790048536,-388837144,-320274503,-2068135166,-301879296,-725949390,2222083,-864025739,62175746,1962940136,30179331,-184288128,279971955,-1274937112,-997525245,
263213251,-1964227858,-296046368,-50271238,-33686019,-34800387,-33686019,-2030306051,-2142572860,-1017619716,-2068183522,-301486080,4049036,-1912048152,1981189080,-1925059745,
-1956675530,-1073694466,12107918,-1176989976,-201588720,-1960741466,643790358,1608916619,1608916539,410127735,-450983386,-451003809,-1341295009,25421936,-661731188,22025869,
-1014047949,1601189517,-1526710081,1949732267,8175455,915254181,213868402,-1146379007,-1014104000,-1472295534,-1416451328,516103943,-1342143302,-826610171,-300961789,-301617086,
-527807764,-456071984,-536150832,-461352781,-1057193792,-125157259,1122896816,-115062036,-940121974,-1291029184,-1996032431,645136640,-167457664,427131079,12145331,-388395320,
309592096,8438145,-805242495,-863965326,-284446718,-1014364693,838918376,-284184348,1048691487,-1437270016,-2068177213,-301551616,1662422012,113410816,235129023,-1623814881,
839037957,-1184648193,1038614529,841642752,244196,-805293080,-396053547,-791674836,-388971214,-980806798,41150672,434659507,-305095680,1939723472,180587017,8120519,
-939594446,-997536030,1381221151,-1395094868,-84150134,1946724588,852985849,-1404899648,1206436742,-678999462,-1460864261,-319195896,-76217944,-335297862,-678965110,1122943026,
-661981046,1247421928,-1024010361,-117345264,-1161602214,196083844,1036553454,1962459136,63879705,1122896304,-335483910,-33686019,-67305987,1962442920,1355020545,1347572051,
1476612584,-301955910,78770212,-1952913198,-2020987176,-1329920625,-1964166652,1625587936,-321780303,266587274,-1476330822,-1174178688,1189610472,-1963204096,216301792,-321781071,
266587274,-1476330822,-1174178800,719848424,-100933120,1482381658,-1158859837,95420549,8698606,-387055440,868418282,48556269,-2051358670,-2068124160,1355017728,-1957539501,
1387587786,-402587463,1499091616,-2134681509,-1465341784,-1465341824,-2139051864,142639232,135596040,134748936,134744101,453511189,136644616,135596040,134748936,-402252251,
-1141091874,-2068119553,-301289472,-1341930310,-284183550,-1274818886,-402083835,45371596,-1902116679,-1077834023,-880082943,-1426915152,-5177549,604025002,1353639951,-1090518594,
-880082943,1975582380,-1429668307,-5179678,-1779953884,871773008,-1395946497,376815870,-1392975190,242598142,254017712,860912616,-1057051402,-922874252,845902,-1159159796,
32242174,-1021376520,-789119181,57872444,838862015,309723,-1274818886,-402542585,1015697480,175491070,-523189250,263254498,-13497877,-1976639741,-1022817913,-1342143302,
915140098,-964493213,3324166,-1957593112,-321483816,276105384,1934722536,-1326587148,-396825824,-661958296,-1460873589,-401902584,-193769106,548466146,-896843285,4438778,
871248048,4242112,-897057810,1963501804,-1460864261,-2013563896,-289109302,-1460874869,-319064824,-76281688,-1185864728,-1027950054,846016,-336067726,-400445434,-1007026691,
57852219,-1007304133,-1342143302,915140099,-695533469,1122898352,-293657364,-1342065590,1334241320,-2097146695,-504887610,-1948742832,27847894,-404222348,-487296176,-399709203,
-661958452,-1460873589,-401705727,-193769262,401337826,-1957644312,-321483816,-814413656,192151976,1934670312,-1326849296,-332141776,-76281688,-322358278,-76217944,1946265836,
145288443,27788917,-253560971,-1193674757,-1195703960,1925724929,2009807623,116127747,1458057648,-1161561603,145752196,1662946286,113476352,-1174404167,263455680,-1460872569,
-84184056,850451079,-289109266,-628629366,1963043052,807730171,1517617212,-502217600,-1158509603,263455680,-1108852816,-299847602,-609220172,263454514,-402632519,-2068164796,
-301355008,62512779,62962176,-628682828,1946724588,-628622597,-1964100944,-527765820,-1460872569,-67406591,809250852,-998241163,-119676400,-2135810581,-1867382037,-1322195840,
-789786108,-1310404380,183030276,-389936444,-1007027031,4438778,-1158793552,-1070464960,-1006899474,-1342143302,870903300,63486543,-1326579280,50182400,-35459518,-1337790902,
15461951,-301929490,-1341929542,-38146559,63552002,1962949868,1257890409,1122894256,-38191184,-35459582,-1341929542,-38146560,63552002,1967078636,1257890377,1122894000,
-38207312,-35459582,-1341929542,-910496001,243971,1967078636,-1158028759,11535303,63552238,-335543367,376766524,62519778,63486464,-922828750,1119944430,-117579026,
1085277931,-100928280,84411587,117573121,405274627,151519240,1661075459,-1876416723,532652075,117884672,0,344952476,-1548118497,33620223,100992003,303108103,
370480147,251660311,0,235929600,405339904,151519240,1661075459,-1876416723,532652075,117884672,0,344952476,-1548118497,33620223,100992003,303108103,
370480147,251660311,0,235929600,407961344,17825800,1661075459,-2108666017,532644181,117884672,0,680496796,-1548118497,33620223,100992003,303108103,
370480147,251660311,0,235929600,407961344,17825800,1661075459,-2108666017,532644181,117884672,0,680496796,-1548118497,33620223,100992003,303108103,
370480147,251660311,0,235929600,405339904,155189256,1661075459,-1876416723,532643883,49408,0,344952476,-1564895744,353566975,100925975,303108103,
370480147,50331927,0,254803968,405339904,155189256,1661075459,-1876416723,532643883,49408,0,344952476,-1564895744,353566975,100925975,303108103,
370480147,50331927,0,254803968,407961344,20971528,1661337601,-2108666017,532643924,49408,0,680496796,-1028024832,387383551,387389207,387389207,
387389207,16777495,0,218103808,407961344,1048590,-1509752829,-2108666017,532644181,202067200,0,677217667,-1548066035,134742271,134744072,404230152,
404232216,251661848,8,168820736,407961344,561840144,1661337615,-2108666017,532644181,16384,0,680496796,-474376673,33620223,335873027,976828423,
1044200507,251658559,0,83886080,65295,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,405274624,4194312,587399168,925706039,285480241,117851904,0,348595425,-1544495096,33620223,100992003,303108103,
370480147,251660311,0,235929600,5308160,687865856,1644560399,-2108666017,532644181,16384,0,680496796,-474376673,255,0,0,
0,251658559,251658240,84410368,5308175,687865856,1661337615,-2108666017,532644181,16384,0,680496796,-474376673,255,0,0,
0,251658559,251658240,84410368,405339919,153092104,1661337615,-1876416723,532643883,49152,0,344952476,-474376704,33620223,100992003,303108103,
370480147,251658519,0,83886080,407961359,20971528,1661337615,-2108666017,532643924,49152,0,680496796,-474376704,33620223,100992003,303108103,
370480147,251658519,0,83886080,407961359,92274702,-1577058289,441864032,527491152,0,0,341651038,-1955701248,524543,1579008,524288,
1572864,83888896,0,118489088,407961359,92274702,-1493172209,391335771,527219280,0,0,341650270,-1962254577,65791,459776,65536,
459776,83886336,0,118489088,407961359,25165838,-1576665073,-2108666017,532643924,16384,0,677217667,-474324209,524543,1579008,524288,
1572864,83888896,0,83886080,407961349,25165838,-1559887857,-2108666017,532643924,16384,0,677217667,-474324209,33620223,335873027,976828423,
1044200507,251658559,0,83886080,405339919,151519246,-1560150013,-1876416723,532652075,202067200,0,341673347,-1548066017,33620223,335873027,976828423,
1044200507,251660351,0,235929600,405339904,151519246,-1560150013,-1876416723,532652075,202067200,0,341673347,-1548066017,33620223,335873027,976828423,
1044200507,251660351,0,235929600,407961344,17825806,-1560150013,-2108666017,532644181,202067200,0,677217667,-1548066017,33620223,335873027,976828423,
1044200507,251660351,0,235929600,407961344,17825806,-1560150013,-2108666017,532644181,202067200,0,677217667,-1548066017,33620223,335873027,976828423,
1044200507,251660351,0,235929600,405339904,134742032,1728184323,-1876416723,532652075,235753216,0,344952476,-1548118497,33620223,335873027,976828423,
1044200507,251661375,8,235929600,407961344,1048592,1728184323,-2108666017,532644181,235753216,0,680496796,-1548118497,33620223,335873027,976828423,
1044200507,251661375,8,235929600,407961344,1048592,1711407107,-2108666017,532644181,235753216,0,680496796,-1548118513,134742271,134744072,404230152,
404232216,251661848,8,168820736,491847424,27262992,-486146033,-2108666017,1040941140,16384,0,685739242,-1023088896,1061093631,1061109567,1061109567,
1061109567,251658559,0,83886080,491847425,27262992,-486146033,-2108666017,1040941140,16384,0,685739242,-486217984,33620223,335873027,976828423,
1044200507,251658559,0,83886080,405339919,33161224,1661861903,-2108666017,532643924,16640,0,680496796,-1548118464,33620223,100992003,168364039,
235736075,251674895,0,88080384,268500751,1061105439,1061109567,792674111,4127,0,656343040,1061107503,1061109567,926891839,522135343,522133279,
825040671,1061108278,1061109567,977223487,757936438,757935405,117452077,471602446,471604252,354163740,1806,0,286130176,471603221,471604252,404495388,
235802901,235802126,370413070,471603736,471604252,438049820,336860696,336860180,67114004,269487112,269488144,202379280,1032,0,168296448,269487628,
269488144,235933712,134744588,134744072,202049544,269487885,269488144,252710928,185273357,185273099,16780043,84148994,16779028,84148994,959973140,1027357498,
959987518,1027357498,16793406,84148994,16779028,84148994,959973140,1027357498,959987518,1027357498,16793406,84148994,151521030,218893066,286265102,353637138,
421009174,488381210,555753246,623125282,690497318,757869354,825241390,892613426,959985462,1027357498,16190,0,117899264,117901063,1799,0,
1061093376,1061109567,16191,0,117899264,117901063,1799,0,1061093376,1061109567,16793407,84148994,959973140,1027357498,83902270,286133000,
538712084,841820196,-2142224584,74825724,99294644,1931345024,1444870976,-1912586050,1465190110,-1957539501,12582124,1228832944,141821696,1924661439,-1610563837,-259275642,
-427703162,-422510337,1586822958,1532582418,1577540959,41048095,1120753871,312119503,357176512,365434216,370283978,409867792,437131718,487988166,511188416,521933914,
620896898,751707742,751971536,751971538,660745426,688531420,-527815456,-461340892,1980972160,-2079930847,113711104,524421,8851072,-1900006648,839290328,17605454,
17698444,243975161,-511704953,-1993438473,270437120,-788821504,-788847889,-1965585681,-790376231,-151309597,-790787369,-790376221,-153154845,149127379,-1451894006,-427757430,
851901959,147257074,512431732,-478150640,-789852112,-789851925,788476651,343181194,176152960,29750988,-169344140,-2029090816,64272896,-478095222,432242695,706798464,
1662421459,-1070361856,-1577038173,1049428066,146341968,-217637376,199791531,1662421829,113410816,-1061491462,-299847677,1226738427,-2130759168,275974395,-1333294546,6660628,
-1199076818,6726164,102679544,-1571663024,937951305,651791428,-1004128315,-1014233985,-775649640,65589736,-1900006416,-1557746495,648806474,-1409252190,8758054,1285760685,
-389837312,-672643048,1217062979,-1911595893,-2029586727,964001792,-2135949121,117459262,12519540,-1090290504,-946954240,1078084584,4990711,-930359087,5127819,-2147016520,
117459262,1048578420,1979908169,-205507838,-2033480789,11069645,1514380264,520575067,-355417096,-494867760,-35553278,-661992950,378208050,-225836920,-2131697024,-439349274,
-305081392,2023164462,-2011789292,787711488,346074890,8990344,-2019520317,176169984,-2013247226,1252069446,289835008,-2013240672,-1007155898,117637379,134809609,134809609,
134809609,185272329,134809609,185272329,134809609,185272329,134809609,134809609,8421504,-2139095040,128,0,690825260,689843754,808464432,809447472,
8849142,57997576,-1953464341,-2061595695,1664518912,1611565312,1959922176,1073643607,-956935561,-1174047712,1223368192,62193281,116802164,1962999943,1995586107,-2131589630,
158664954,-25113858,-33393400,150700238,146219636,192075578,1947138944,974042903,-1978567721,5695686,-1031081846,1307099390,5826560,-1958487576,-1328116790,-270169590,
-511046736,273058287,-544553992,-472776910,5281673,507177937,158662754,378260107,1172832355,-1866205184,-13443190,-1752439855,243990608,1317601376,5671170,-470367240,
-456067082,-63257346,-1866268652,-443887478,343204138,-1003830390,-134814670,-989928240,1375290,-802504450,1252102339,853931520,-1950284819,-788509170,-1967062039,-1327461684,
246476559,-1007689334,-661994503,977298408,-1979549992,1646168280,5021952,-470286542,-1979691357,-2147464938,91620346,1963457152,-1947676414,-1962908906,-1327461688,-1963984371,
-284380955,-1948003845,-402632561,-1007091812,512397565,971505762,-1966633470,973097502,-1979419949,-2134180141,-587857436,-897119111,-785713878,-621355274,-181795605,-956378838,
1048625918,1979908169,1228832789,1869743872,1048579188,1913454665,16509187,-343161863,-444470741,-439287553,-980748149,-315431946,-523124477,-1952987645,-2048657680,-150701578,
-773982248,-1765342240,8849142,-402426876,102645990,1958773791,1942370836,-1963972080,61207498,-16972811,-1963690546,-1327002896,-204830176,-16972885,536245710,-2147383319,
100682046,-506461068,1354621648,-1969794560,-1729285435,-150912838,62981090,-259287098,21019288,-158997769,-654897031,-947790345,1048584432,1946550345,-956086527,1519787782,
-2065724589,976254144,707556294,-422555408,-963909936,-74714997,-1527526774,-74714997,536934017,536934273,-1527526774,-586955517,-529150210,-789542312,1491521766,-74726262,
-1426863478,-142476405,-896917504,-586962189,-361378050,1375795689,-444470389,1048576255,1964179529,-773467898,-1947872795,-1964233992,-1600546620,-436862843,-145571325,-315467035,
4800128,722105619,-773729846,65130977,62981066,-259287098,8726262,-1973754377,-2147436834,318785854,-489617803,-489561391,-158995925,-654900103,-956047881,1958773910,
1942174263,1356343859,4800128,1376810003,-1207710022,-1158741755,45614020,-1604653297,-470417275,-1899918306,-204829735,66388900,-176862979,-662022113,-167737952,-628451613,
4800128,-1172671469,95945678,-994382080,-1326632445,-284183550,-1328838057,-341118208,-1966437619,61535175,-176861443,45097707,-1963989110,-5218357,-50091277,-1328253618,
-284183550,116787947,1946419335,1057024003,1397801976,-639085999,1993882173,-1579644414,-13500340,-259267593,1482381658,-946995005,4793994,1979972736,133988359,1366756210,
-398573592,-974585626,-385928704,-1008189866,76239104,1963115510,-1950054890,199283152,-2046249776,-790441503,-488451632,-1428060424,536934017,-528418944,-2096765991,-756330298,
-1898237096,2082391515,-1243968512,-343887488,1041295440,512476042,2011693130,322720000,-108387723,79286834,20753664,-2133667595,-789249540,-1963793710,-805393726,-964617100,
-521469640,-1341927750,-284642299,-789183350,-487390294,-1274695433,-1252462848,-1949158656,-1896467494,204916190,-2030269695,-387873084,292749400,-208938354,158652939,1239999878,
33714688,1106064069,-73343,1183441155,-1866205168,-2062644390,-511622912,-517210114,244055179,369492101,-1018028281,8849142,-1961724924,-2097126634,-1460926782,-84183807,
1946265836,93005563,1364444155,-779463342,-359926222,-192227958,-544487797,-1947169962,-204633093,51279014,1976237765,1589654256,-335938677,-970236406,-235483765,-1963394165,
1499094502,-946945189,4793994,1979972736,133988362,2011694452,-1959728384,-387347469,-561300256,-477442677,8855178,6493835,-167329149,259261635,-1460866933,-84183807,
1946265836,-1413051397,-118955269,-946958141,4793994,1979972736,133988362,803734900,-1960056064,1016785129,512413067,378208391,-1031602077,79951366,-125169804,1963043052,
-1460864261,-1963232255,1207675591,-1007097886,-91499637,-58660469,-2147126253,41355260,-397344974,-1957151618,-2030009074,869698551,335249654,-360050572,-2139036288,-75464734,
-381259257,-561119051,17577669,-503913422,-628363261,-292884086,78730839,-1966044500,1927467203,-1966634494,1927467235,-1410889214,-344602114,108318206,20498305,1600052459,
1292420995,-68562827,-975270400,-1476326346,856323200,-975270154,604011574,65140351,65175792,-1973987757,-75453199,1394766854,-125171533,-523116335,41150416,-872496630,
-2040794507,1961691844,87238147,-351958746,1961691658,87172611,-2130343898,-2145386249,58032375,-28260477,1606317518,-2142807202,24381179,-1401598649,-1979676183,1243515875,
-2146453760,41226748,-685637193,-561055098,17577669,-268181002,1978468946,-494250203,-1341930310,-510988542,-746139085,53839910,1976368890,1607698167,-994383990,-285036541,
-994438933,-1979535357,-826609689,-1274826749,1465315096,-628698573,-318054006,-1977220236,-2010731515,-17169659,-2031127092,1197367251,-1535816358,-994385270,-285036541,839110330,
-284970780,116785347,-116916089,780872565,646578275,-58720183,1998418951,66879517,-16105609,2045251445,-389248512,297074846,-352256536,7923715,-16071688,1642602101,
268206080,-863348364,-1258257944,14739456,1997536384,-401492662,1139474646,-352300568,117211198,-16112780,904402805,-389467648,11862106,-1258243608,11855889,-352293400,
2943006,-352295448,1979648534,1239055,938002738,-402541312,65732758,-134213144,1721798851,-2132794368,-1022746653,-1023383902,-1325276288,-1595682299,-551288730,1721942794,
-1472805632,75285504,-1866255163,11024069,-989561660,852593204,-754535946,-2133457950,-13496349,52675459,-1022391590,-393607503,-164440950,-234626349,61931956,-165362045,
58007749,-2147236221,-981266203,62962182,-319100281,-76281688,615312007,-389739793,-2115487288,-1329267136,-17043936,-1008634423,-1828301171,145288442,-1164706956,-393149504,
-58705496,-33393391,1079699660,548455558,-71006482,-946945135,512425779,-75497399,-402098925,-2010775230,-2134640635,343017467,1997601664,-2030400753,653760711,-678756276,
-947455861,-538385526,133988352,-472753294,-58716235,-1258130159,-930441215,-671691486,145811334,-284963142,309657354,414450608,-1979535121,63224545,92940015,45094123,
-994384502,-738791677,-165863386,-1979535149,-2010714143,-1979535331,61927397,-826612686,145813251,-336605954,-1021143020,-469049134,807798132,637987589,-955630302,-1866205014,
-13383794,4791946,1964243840,10020872,-351958490,133922893,-91550350,-140982390,-1962914778,-1963422761,3991779,1913126016,-1327246808,301760515,28639861,-826605774,
-402344957,-1977206620,-756342227,182964461,2043215613,-339244306,92939785,-954017802,1183377618,-1866205168,1997405312,-787844086,-2130414614,-786431801,-773664286,65196514,
-773664262,-1208351774,117211390,-774830989,-544544816,-779365386,-355341615,-100406575,-511651338,-1010314745,112327051,-100408621,-489561391,12843523,6426250,-315426422,
-422457721,5280907,427232572,171721076,138166644,121385332,-2068116619,32815363,-130443800,113091,-400664750,1595931488,985857626,1912621590,-19779038,-2076820794,
-31951360,-2078413874,-32017198,839707594,973663186,1929413686,-1966670325,-402628034,-1007094168,-1977723054,-402628034,12056156,4800128,-2146994685,117459262,1049234037,
1776812130,293505785,-1202036961,-919403007,4855434,-102184194,12843254,8849142,578156808,1928666172,-1947038948,503341846,638000902,11026116,75351078,-1813982824,
1217920814,-1866205153,530325376,538714040,578822784,542253696,546447480,578822784,578822784,578822784,578822396,558768426,565322368,568205952,571351560,575021590,
-2087467898,-84212030,1946724588,-1061514247,924248067,-1338126360,-1006899680,833930374,113410963,-1460864261,-1812368376,-402407238,-1310181640,-1866204355,280035508,-981210485,
62962182,-360190670,-1460864261,-2013694968,-706171670,1032775734,-973159170,544524798,-1460868473,-2014808824,-1108824854,1031202870,-906050306,-838989196,548466549,-991167506,
-2014437200,-319095830,-109836120,833940103,915859628,1307102462,-1866204355,-523107407,-930478044,-1912586056,4825304,-1741185560,-388905850,-661919535,-335101309,-1274822470,
-2020987344,-148633275,1575534858,1024911414,-527789885,-1962491261,-319095846,-109836120,-1061501814,-331158013,-2025135990,-628626214,-68280144,-1023056248,-1031589452,-319096058,
-109836120,-1061501814,-331158013,88508667,-661876541,-24395634,280035508,-964431221,62962182,-225972942,-1460864261,-2013694968,-289109262,-1437930430,-973159170,628410878,
-1460866425,-2014808824,-289109262,-1437930430,-906050306,-226029708,1976434412,-1326282774,-335811040,-299847489,-84151673,1946724588,-1326282759,-331157967,-1866204246,-1962842486,
-662044082,-83443069,145288442,-1014302348,-301741894,15401195,-1979463238,15462084,-336673398,-289306112,-527776773,-1170837016,-997588024,-352261138,-1161495040,-290716727,
-290717461,-290717461,1776870882,-661994698,-75235534,-788040958,-1744883997,-1866260128,562176356,-83443069,145288442,816904564,-301743942,608889922,-771247745,-289142044,
-1031552005,-69563642,145288442,816904564,-301743942,-789124030,-1320517596,-790048249,-758609184,-321222684,884005511,-289109266,-527776773,-83443069,145288442,-997525132,
-301742150,-352073286,-335484160,-352237944,1183378432,-335484157,-83736952,-611544893,-24394866,-1209474934,63420981,-336673654,-33494272,63552196,15444716,15444716,
-438129940,-1019891736,-301742406,-960851773,1183378435,-1031552252,-321221882,-1341931334,-331157964,-2015327670,-628626214,1122906288,-1317002004,-1964453369,-2133723448,-506429215,
1183444178,-527777020,-1170909720,-997588025,-352261138,63552000,-661984006,-1964244757,-335483912,-386153594,-927318968,-289110525,-910506874,1014294531,-807222018,-1019922456,
809238723,645137522,54313976,-466481036,-523041615,-58660654,-378440702,-1008205560,-1173850826,-477494332,-118553680,-645099325,-661733325,8132292,980745994,17569476,
846516222,378341134,-805421308,378349684,-805417422,378347636,-805416398,378345588,-805417724,378343540,-805425728,378341492,-805421632,-645000075,-1995815284,-2053044138,
38177024,-2013231968,-1007157178,-768407778,-1073030514,1321471349,2081327368,2114358272,-25302272,101873096,-1995944252,-1946088434,117509638,-352170357,1976106541,70683913,
964927,-922871573,915212661,146361906,-32773376,-1924565560,-1188184010,914948112,244056332,-1993998066,-1979677426,-13499298,167790218,-1341360933,66813977,-1976695433,
-31219065,-2069748024,654258688,6430346,1352108838,1995454976,653298183,5281673,234931192,-1605358823,378208329,-1142423453,1490586423,-1977724080,-973130781,1586169974,
38701828,167794315,-1924565824,-1154629578,71041040,-58717323,-1926400761,-348274626,70683943,965439,192268542,1963457664,71208215,-1928205491,-1152503242,-922877944,
1528759924,8776024,1586166666,16824580,521065011,-1008183469,-1956946122,1962871755,-1551611,-1004578506,-1962891234,1476420374,-29921816,-20084019,-805413939,578156682,
-2147479368,292816123,168117898,-1207274277,-872546290,146277236,-1260418560,3205375,1541932011,1662422000,113410816,-1061491462,-299847677,-1962986757,-1962909154,973099159,
1979745334,-2076800504,1352108288,-1866205184,-1550298288,-922877819,162586762,619463406,-289142048,-1930421784,-1474378535,935667200,-2036835496,-773271100,-2081422360,-1263788858,
-644988927,-2062644327,-2131626240,41222143,-922826870,-33520478,-503867200,1662421832,-1327461888,-75436270,-1341819641,-270431724,-1979692383,-33520610,-773589309,5022688,
-75497277,-2144898032,1316233467,-2144277632,158533627,-472776910,547880750,-1866204891,634004844,637412838,641213980,-2019547584,-2132768256,28377828,1613032658,-388889167,
-2012985719,-2002775994,-2132768256,78770404,254078162,-134068599,-1070362429,109953166,-1557779146,-1943666668,-1023404530,1299383100,8857226,1963508982,-1992390076,-2011264512,
268548608,1946338550,1958742536,-1308490704,-523134961,28637323,-858724574,-192875510,-137038208,786047954,633376139,-653530078,8994440,8920712,303056583,-1866205184,
98304,724993,37490699,646583923,61931657,-461315886,-1998583049,-956266202,1183814,37536760,20189555,-523107407,-390461940,1187507782,-134213104,37523651,
20191351,8988298,-523107919,184411264,-1993963296,273073920,-1007157230,376635964,8857226,-523108175,184476800,-2027517728,273073920,-1007157230,303056583,-1866205184,
410190396,-523106895,-994385782,-301879293,-551228350,-940653558,1183814,54313976,-75091337,-75041909,16770689,-1258297647,45350992,-483341336,142001164,-397300698,
-497483756,1190550263,141885712,-1274708342,816769026,222086136,359942007,292817468,225708092,41158460,246691701,-349137944,853510756,-1948003841,-788508521,1021282027,
839415053,-402475822,1019424888,-2079558392,-29199150,-402475830,1019424872,-348752630,73304885,34621174,647169140,28939180,-402017280,-544591796,-472776910,5281675,
-544805935,372949758,74580042,116118066,770179764,-956382416,8664634,-822152586,501744308,1228832816,225837824,4800128,-1979288569,-335596833,-402082807,-544591868,
1381235850,1431787014,-1341737954,-1966525695,-33535466,-289478454,1583308063,-2040833529,1053082619,-1004142424,-1004138371,-1073085827,-478071948,-1014296817,839748134,-2082501651,
-218364729,-2045741905,654019552,-315486838,-234567805,724989359,116360187,-388905077,-352286046,9084974,-1948200552,1502291672,4825092,-1057093852,-388962096,-75437872,
604402688,1958949377,-335837689,-17661,-1207673207,1183383578,-1866205168,57989899,-67033879,-1928954229,-1425949690,-1179924340,915210255,-1510801335,-1929378887,-218069962,
1174283940,436254973,-1959839768,512404419,-13500343,-1517843922,82063916,13926401,782991140,750356362,254075018,-1312519510,2046349828,-167596012,268470534,-922875019,
8914678,-33393407,61909704,-301742918,-661984190,-388962096,-527763318,-478024496,69534467,-2034038012,-661935164,639766452,-2019557239,-152532480,-1325325104,182505988,
1662421984,113410816,62962412,1122906288,-804772628,182505696,-1429959968,-1070410358,-218102855,616729258,-771378848,-1070421272,41213754,102629644,11024069,-1945871164,
1959463873,-1006498814,-1047787428,41208587,1556349964,197233676,201487563,276088072,-1945477948,1959463873,-1005581310,-1014234532,-885274228,537657972,850009863,899520,
1187490547,-134210800,1023185091,1946513921,33220901,516481,-1070398091,-1157398807,-372178943,-788475005,13861865,57928145,-385039485,-511638684,91553799,1558822963,
-2080666877,-372236089,1089012594,1065952769,-335297350,1662421930,-1951732736,63879922,-1061508372,850062339,-1174030876,-997588028,-1427356946,-28654338,-1158449715,-1427373108,
431350834,-997534069,-1427356946,-28654338,-2081196595,-466483518,-1258045250,-319096048,-109836120,-997526905,1256997614,-20644182,-2028964659,145288434,-695735691,-2014437200,
-1260721194,-2029734608,-225973006,-68238198,1252715586,-989924729,-311046658,-1962481021,-1159449870,162857934,1122944138,-28661012,1976434372,-1413051405,-1341930310,-331158014,
263250058,78662382,1357660910,-1158805840,112198606,-1964227858,-301682464,-301617078,-1336873918,-1205932543,-661741568,1258291106,1122895024,-466464532,-997587787,-24338,
-20644182,1492350413,-1337319442,1113124357,112216814,-997571858,63224558,1122895024,-1337266600,-1975325182,642444996,-299874422,-1977166197,-1158799033,-1977220146,-1947327929,
113411030,62962412,591890982,1944703214,2139694669,-1608625918,807665680,1030570,4798093,129607155,-2076799744,-1918569728,-1191139274,-1510801406,-644953805,-1191177026,
-1510801406,-1191152450,-1510801406,-1191150402,-1510801406,-1191113538,-1510801406,-372221665,-1243020430,2139694593,63420932,-960844819,-1163203581,-1070464057,63552238,-335478599,
-335483990,-335483990,-369827158,-511639156,91553799,-2065055693,520494593,1927925767,16509187,-964479093,12060226,-1161785696,78644164,-1158740300,112198606,-1326512972,
-285166587,-1341930310,28634626,-1975384907,648867524,-788529246,1976434404,-300961550,134217632,-964479093,79645188,-393565184,28311732,-1396375825,-2031106938,1338310340,
-1027934859,-1158763517,11535300,-1947212406,296760916,854582322,-1407601180,-2031106938,-20644156,-2081131059,-1061222718,-1243336189,-319096048,-109836120,-997524857,-17912594,
1959657156,-319125744,-327874392,548460423,-338196498,-1255099172,-319125756,-997524857,-290653202,-989922681,-277492226,-1962481021,63879930,162915378,-272333140,-989936506,
-193606146,-994429045,-1947292669,-1158763305,-290716722,-1031546997,-1061491706,-789664765,1364358121,-1409124469,270958630,136761088,-1191178234,1049427983,-1510801335,-1929377863,
-218069954,-1472295516,178432,856073715,-1077834039,45678612,-1079643392,45678708,-1079643392,45678716,-1079643392,45678860,128316160,1944703065,74943265,63355565,
-927273300,-289394173,-1190934086,-290717440,-290717461,-290717461,481883362,273058048,-133931383,252645315,16974607,2139062143,252673919,251727743,-2004317953,16843144,
136,67633152,825299474,-1007091711,-1007041543,754330868,754593016,757476634,242681148,-259267534,803792593,-1526780416,-1007080236,-1866231613,494060536,280263,
38192896,-1986002944,-788716544,887673064,839126017,4622820,-1007107080,8849142,24508680,225625080,91544330,-349560344,709158916,1397801976,-1155640751,-611450816,
109445552,20709632,-1258602124,-1978610417,62149100,1381568717,887673395,-1272942080,-1273967358,-401552120,326238256,-717569282,-768414350,909821694,-562691964,436212456,
45374153,-1996877619,520159246,1482381658,-401755953,376569860,861014704,1975551186,-1272926206,-166212352,24379844,12802809,0,0,0,0,
0,0,0,0,-2122448896,-1115586139,2122416537,0,-8519680,-1006632997,2130706407,0,0,-16843156,272137470,0,
0,-25413616,1063036,0,402653184,-404276164,1008212199,0,402653184,-33220,1008212094,0,0,1008205824,6204,0,
-1,-1008205825,-6205,-1,0,1113996288,3958338,0,-1,-1113996289,-3958339,-1,236847104,-864538086,2026687692,0,
1715208192,1013343846,404258328,0,859766784,808464447,-521113552,0,1669267456,1667457919,-421042333,192,402653184,-415442152,404282172,0,
-524255232,-117507856,-2134843152,0,235274752,1056849438,33951262,0,1008205824,404232318,1588350,0,1717960704,1717986918,1717960806,0,
-612433920,461102043,454761243,0,1623620608,-960074696,-972277652,124,0,0,-16843010,0,1008205824,404232318,2115517566,0,
1008205824,404232318,404232216,0,404226048,404232216,406617624,0,0,-32761856,6156,0,0,-27250688,12384,0,
0,-1061158912,65216,0,0,-26466304,10348,0,0,2084059152,16711292,0,0,2088566526,1062968,0,
0,0,0,0,1008205824,404241468,404226072,0,1717986816,36,0,0,1811939328,1819082348,1819082348,0,
-964945896,108839106,2093385222,6168,0,403490498,-2033819600,0,1815609344,-596232084,1993133260,0,808464384,96,0,0,
403439616,808464432,202911792,0,405798912,202116108,806882316,0,0,-12818944,26172,0,0,2115508224,6168,0,
0,0,404232192,48,0,-33554432,0,0,0,0,404226048,0,0,403441154,-2134876112,0,
1815609344,-690567482,946652870,0,941096960,404232312,2115508248,0,-964952064,806882310,-20529056,0,-964952064,104596998,2093352454,0,
470548480,-20157380,504105996,0,-1057095680,117227712,2093352454,0,1614282752,-956514112,2093401798,0,-956432384,403441158,808464432,0,
-964952064,-964901178,2093401798,0,-964952064,108971718,2014053894,0,0,6168,1579008,0,0,6168,806885376,0,
100663296,1613764620,101455920,0,0,32256,126,0,1610612736,101455920,1613764620,0,-964952064,404229318,404226072,0,
2080374784,-555825466,2093014238,0,940572672,-20527508,-960051514,0,1727791104,1719428710,-60397978,0,1715208192,-1061109566,1013367488,0,
1828192256,1717986918,-127113626,0,1727922176,1752721506,-26844576,0,1727922176,1752721506,-262119328,0,1715208192,-557793086,979814086,0,
-960102400,-956381498,-960051514,0,406585344,404232216,1008211992,0,203292672,202116108,2026687692,0,1726349312,2021157990,-429496724,0,
1626341376,1616928864,-26844576,0,-289013760,-958988546,-960051514,0,-423231488,-824246538,-960051514,0,-964952064,-960051514,2093401798,0,
1727791104,1618765414,-262119328,0,-964952064,-960051514,2094978758,3596,1727791104,1820092006,-429496730,0,-964952064,205021382,2093401606,0,
2122186752,404232282,1008211992,0,-960102400,-960051514,2093401798,0,-960102400,-960051514,272133318,0,-960102400,-690567482,1827602134,0,
-960102400,943225964,-960074628,0,1717960704,406611558,1008211992,0,-956432384,806882438,-20528544,0,809238528,808464432,1009791024,0,
-2147483648,946921664,33951260,0,205258752,202116108,1007422476,0,-965986288,0,0,0,0,0,0,65280,
1585200,0,0,0,0,2081191936,1993133260,0,1625292800,1718384736,2087085670,0,0,-1060733952,2093400256,0,
203161600,-865321972,1993133260,0,0,-20546560,2093400256,0,1815609344,1626366052,-262119328,0,0,-859015680,2093796556,7916556,
1625292800,1719037024,-429496730,0,404226048,404240384,1008211992,0,101056512,101060096,101058054,3958374,1625292800,2020370016,-429495176,0,
406323200,404232216,1008211992,0,0,-687936512,-958998826,0,0,1718017024,1717986918,0,0,-960070656,2093401798,0,
0,1718017024,2087085670,15753312,0,-859015680,2093796556,1969164,0,1719065600,-262119328,0,0,1623620608,2093354040,0,
806354944,808516656,473313328,0,0,-858993664,1993133260,0,0,1717986816,406611558,0,0,-691616256,1828640470,0,
0,946652672,-965986248,0,0,-960051712,2126956230,16256006,0,416087552,-20553680,0,403570688,409999384,236460056,0,
404226048,402659352,404232216,0,409993216,403576856,1880627224,0,-596246528,0,0,0,0,-965986288,16697030,0,
1715208192,-1061109566,205285058,31750,13369344,-858993664,1993133260,0,806882304,-20546560,2093400256,0,1815613440,2081191936,1993133260,0,
13369344,2081191936,1993133260,0,405823488,2081191936,1993133260,0,946616320,2081191936,1993133260,0,0,1616930364,101465190,60,
1815613440,-20546560,2093400256,0,12976128,-20546560,2093400256,0,405823488,-20546560,2093400256,0,6684672,404240384,1008211992,0,
1715214336,404240384,1008211992,0,405823488,404240384,1008211992,0,268486144,-960074696,-960051458,0,3697720,-960074696,-960051458,0,
6303768,2086692606,-26845088,0,0,913755136,1859704958,0,1816002560,-855716660,-825439028,0,1815613440,-960070656,2093401798,0,
12976128,-960070656,2093401798,0,405823488,-960070656,2093401798,0,-864538624,-858993664,1993133260,0,405823488,-858993664,1993133260,0,
12976128,-960051712,2126956230,7867398,2080425472,-960051514,2093401798,0,-973027840,-960051514,2093401798,0,1008211968,1616928870,404241510,0,
1684813824,1616965728,-52010912,0,1717960704,410916924,404232318,0,-858982400,-557005576,-959656756,0,404426240,410916888,404232216,28888,
1613764608,2081191936,1993133260,0,806882304,404240384,1008211992,0,1613764608,-960070656,2093401798,0,1613764608,-858993664,1993133260,0,
-596246528,1718017024,1717986918,0,-973022090,-553715994,-960051506,0,1819032576,8257598,0,0,1819031552,8126520,0,0,
808452096,1613770752,2093401792,0,0,-1057095680,12632256,0,0,117309440,394758,0,-1027555328,806931654,210164832,15896,
-1027555328,806931654,1050594918,1542,404226048,404232192,406600764,0,0,-663996928,13932,0,0,913102848,55404,0,
1141982225,1141982225,1141982225,1141982225,-1437226411,-1437226411,-1437226411,-1437226411,2011002845,2011002845,2011002845,2011002845,404232216,404232216,404232216,404232216,
404232216,-132638696,404232216,404232216,404232216,-132581352,404232216,404232216,909522486,-164219338,909522486,909522486,0,-33554432,909522486,909522486,
0,-132581376,404232216,404232216,909522486,-167315914,909522486,909522486,909522486,909522486,909522486,909522486,0,-167313920,909522486,909522486,
909522486,-33098186,0,0,909522486,-30001610,0,0,404232216,-132581352,0,0,0,-134217728,404232216,404232216,
404232216,521672728,0,0,404232216,-15198184,0,0,0,-16777216,404232216,404232216,404232216,521672728,404232216,404232216,
0,-16777216,0,0,404232216,-15198184,404232216,404232216,404232216,521674520,404232216,404232216,909522486,926299702,909522486,909522486,
909522486,1060124470,0,0,0,925908736,909522486,909522486,909522486,-16713930,0,0,0,-150929664,909522486,909522486,
909522486,925906742,909522486,909522486,0,-16711936,0,0,909522486,-150931658,909522486,909522486,404232216,-16711912,0,0,
909522486,-13224394,0,0,0,-16711936,404232216,404232216,0,-16777216,909522486,909522486,909522486,1060517430,0,0,
404232216,521674520,0,0,0,521674496,404232216,404232216,0,1056964608,909522486,909522486,909522486,-13224394,909522486,909522486,
404232216,-15139048,404232216,404232216,404232216,-132638696,0,0,0,520093696,404232216,404232216,-1,-1,-1,-1,
0,-16777216,-1,-1,-252645136,-252645136,-252645136,-252645136,252645135,252645135,252645135,252645135,-1,16777215,0,0,
0,-656640512,1994184920,0,-864550912,-858207028,-859388218,0,-956432384,-1061109562,-1061109568,0,0,1819045118,1819044972,0,
-33554432,405823686,-20553680,0,0,-656900608,1893259480,0,0,1717986918,1616936038,192,0,404282486,404232216,0,
2113929216,1717976088,2115517542,0,939524096,-20527508,946652870,0,1815609344,1824966342,-294884244,0,807272448,1715342360,1013343846,0,
0,-606372352,32475,0,50331648,-606372346,-1067417869,0,807141376,1618763872,472932448,0,2080374784,-960051514,-960051514,0,
0,-33554178,16646144,0,0,410916888,-16777192,0,805306368,201722904,2113941528,0,201326592,811610136,2113932312,0,
453902336,404232219,404232216,404232216,404232216,404232216,1893259480,0,0,2113935384,1579008,0,0,14448128,56438,0,
1819031552,56,0,0,0,402653184,24,0,0,0,24,0,202116864,-334754804,473721964,0,
1819072512,7105644,0,0,819490816,16304224,0,0,0,2088533116,8158332,0,0,0,0,0,
29,1713635328,2385663,0,12288,-1010604484,-1010574373,15462,5046272,-1588480,-1010574337,12829635,1409286144,-604045312,404232345,1008211992,
0,-1023410090,-1010580541,1013367747,24,22272,-1010580541,-2368573,26214,5767168,1724105472,1008212028,12829542,1493172224,-1010630656,406611651,
1008211992,0,-16777126,403474115,-1010737104,255,27904,-436207616,-606348289,56283,7733248,0,-1010580541,1588326,1996488704,0,
-1010580736,1728043995,0,120,1724055552,1715214396,195,37120,1845493760,-662824133,30684,10158080,-1015146472,-1010777920,1579134,-1660944384,
1724055552,419371068,404232447,0,1727791262,1717730406,1717986927,243,-1073698048,-859389248,-832557032,520881819,11272192,-960315200,1714428108,104765134,
6,0,0,0,0,-2119859842,-2120630911,126,-8519680,-1006632997,8323047,0,-16880640,947715838,16,268435456,
2097052728,4152,0,-415482856,404285415,60,1008205824,2130706302,3938328,0,402653184,1588284,0,-1,-1010571265,-25,
65535,1715208192,1013334594,0,-1,-1111647805,-15463,65535,840568350,-858993544,120,1715208192,406611558,1579134,0,809448255,
-261083088,224,1669267456,1667457919,-1058609305,0,1020991512,417021159,24,-1065353216,-117507872,8437984,0,1041106434,101596926,2,
1008205824,404232318,1588350,0,1717986918,1711302246,102,-612433920,461102043,1776411,2080374784,1815634118,946652870,8177164,0,0,
16711422,0,410926104,1014896664,32280,1008205824,404232318,1579032,0,404232216,1014896664,24,0,217975832,24,0,
1613758464,3170558,0,0,-1061109760,254,0,1814560768,2649342,0,268435456,2088515640,65278,0,2097085952,272119932,
0,0,0,0,0,1010580504,402659352,24,1717986816,36,0,0,1828613228,1828613228,108,-964945896,
108839106,410830470,24,-960364544,1714427916,198,1815609344,-596232084,7785676,805306368,6303792,0,0,403439616,808464432,792624,
0,202119216,403442700,48,0,1023360102,102,0,404226048,1579134,0,0,0,806885400,0,0,
254,0,0,0,1579008,0,403441154,-2134876112,0,-964952064,-420028722,8177350,0,410531864,404232216,126,
-964952064,806882310,16696928,0,101107324,-972683716,124,470548480,-20157380,1969164,0,-1061109506,-972683524,124,1614282752,-956514112,
8177350,0,201770750,808464408,48,-964952064,-964901178,8177350,0,-960051588,201721470,120,402653184,24,6168,0,
1579008,404226048,48,201719808,811610136,396312,0,2113929216,8257536,0,811597824,201722904,6303768,0,214353532,402659352,
24,-964952064,-555819322,8175836,0,-965986288,-960037178,198,1727791104,1719428710,16541286,0,-1061001668,1724039360,60,1828192256,
1717986918,16280678,0,1751279358,1717725304,254,1727922176,1752721506,15753312,0,-1061001668,1724309184,58,-960102400,-956381498,13027014,
0,404232252,404232216,60,203292672,202116108,7916748,0,1819043558,1718381688,230,1626341376,1616928864,16672354,0,-16847162,
-960051498,198,-423231488,-824246538,13027014,0,-960074696,1824966342,56,1727791104,1618765414,15753312,0,-960051588,2094978758,3596,
1727791104,1820092006,15099494,0,1623639676,-960099272,124,2122186752,404232282,3938328,0,-960051514,-960051514,124,-960102400,-960051514,
1063020,0,-960051514,2097075926,108,-960102400,943208556,13026924,0,1717986918,404232252,60,-956432384,1613764748,16697026,0,
808464444,808464432,60,-1065353216,473460960,132622,0,202116156,202116108,60,-965986288,0,0,0,0,0,
16711680,1585200,0,0,0,2013265920,-859014132,118,1625292800,1718384736,8152678,0,2080374784,-960446266,124,203161600,
-865321972,7785676,0,2080374784,-960430394,124,1815609344,1626366052,15753312,0,1979711488,2093796556,7916556,1625292800,1719037024,15099494,
0,939530264,404232216,60,101056512,101060096,1717962246,60,1717592288,1718384748,230,406323200,404232216,3938328,0,-335544320,
-690563330,198,0,1718017024,6710886,0,2080374784,-960051514,124,0,1718017024,1616936038,240,1979711488,2093796556,1969164,
0,1719065600,15753312,0,2080374784,-971214650,124,806354944,808516656,1848880,0,-872415232,-858993460,118,0,1717986816,
1588326,0,-973078528,-19474746,108,0,946652672,13003832,0,-973078528,2126956230,16256006,0,416087552,16672304,0,
404232206,404232304,14,404226048,402659352,1579032,0,404232304,404232206,112,-596246528,0,0,0,940572672,-20527508,
0,1715208192,-1027555134,101465190,124,-872362804,-858993460,118,806882304,-20546560,8177344,268435456,2013293624,-859014132,118,-859045888,
2081191936,7785676,1610612736,2013272112,-859014132,118,946616320,2081191936,7785676,0,1715208192,205284960,15366,1815613440,-20546560,8177344,
0,2080427212,-960430394,124,405823488,-20546560,8177344,0,939550310,404232216,60,1715214336,404240384,3938328,1610612736,939530288,
404232216,60,281462272,-960074696,13027070,1815609344,1815609400,-956381498,198,6303768,2086692606,16672352,0,1993080832,-656900554,110,
1816002560,-855716660,13552844,268435456,2080402488,-960051514,124,-960102400,-960070656,8177350,1610612736,2080380976,-960051514,124,-864538624,-858993664,
7785676,1610612736,-872409040,-858993460,118,-960102400,-960051712,201752262,-973078408,-965986106,1824966342,56,13026816,-960051514,8177350,402653184,
1617312792,406611552,24,1684813824,1616965728,16574048,0,406611558,410916990,24,-858982400,-557005576,13028556,234881024,404232219,404232318,
7395352,1613764608,2081191936,7785676,201326592,939536408,404232216,60,1613764608,-960070656,8177350,402653184,-872390608,-858993460,118,-596246528,
1718017024,6710886,-596246528,-152648192,-959521026,198,1819032576,8257598,0,939524096,3697772,124,0,808452096,1613770752,8177350,
0,0,-1061109506,0,0,117309440,1542,-1073741824,-657668416,-2032377808,4069388,-960446464,1714477260,104767182,6,402659352,
1010580504,24,0,1826122806,54,0,1826095104,14183478,0,1141982225,1141982225,1141982225,-1437252591,-1437226411,-1437226411,-1437226411,
2011002845,2011002845,2011002845,404256733,404232216,404232216,404232216,404232216,-132638696,404232216,404232216,-132638696,404289560,404232216,909522486,-164219338,
909522486,13878,0,909573632,909522486,0,-132581376,404232216,909514776,-164219338,909571590,909522486,909522486,909522486,909522486,13878,
-33554432,909571590,909522486,909522486,-33098186,0,909508608,909522486,65078,0,404232216,-132581352,0,0,0,404289536,
404232216,404232216,521672728,0,404226048,404232216,65304,0,0,-16777216,404232216,404232216,404232216,404234008,404232216,0,
-16777216,0,404226048,404232216,404291352,404232216,404232216,521674520,404232216,909514776,909522486,909522742,909522486,909522486,1060124470,0,
0,1056964608,909522736,909522486,909522486,-16713930,0,0,-16777216,909571840,909522486,909522486,925906742,909522486,13878,-16777216,
65280,0,909522486,-150931658,909522486,404239926,-15198184,65280,0,909522486,-13224394,0,0,-16777216,404291328,404232216,
0,-16777216,909522486,909522486,909522486,16182,0,404232216,521674520,0,0,520093696,404234008,404232216,0,1056964608,
909522486,909522486,909522486,909573942,909522486,404232216,-15139048,404232216,404232216,404232216,63512,0,0,520093696,404232216,-59368,
-1,-1,-1,0,-16777216,-1,-252641281,-252645136,-252645136,-252645136,252645135,252645135,252645135,-61681,-1,255,
0,0,-656640512,7789784,0,-964952064,-54081796,4243648,-956432384,-1061109562,12632256,0,1828585472,1819044972,108,-956432384,
806891616,16696928,0,2113929216,-656877352,112,0,1717986918,-1067425668,0,-596246528,404232216,24,410910720,1717986876,8263740,
0,-960074696,1824966398,56,1815609344,1824966342,15625324,0,202911774,1717986878,60,0,-606372352,126,0,-612497917,
1618932699,192,807141376,1618763872,1847392,0,-960070656,-960051514,198,-33554432,16646144,65024,0,2115508224,6168,255,
405798912,403441164,8257584,0,1613764620,792624,126,453902336,404232219,404232216,404232216,404232216,-656926696,112,402653184,8257560,
6168,0,-596246528,14448128,0,1819031552,56,0,0,0,6168,0,0,402653184,0,251658240,
202116108,1013771276,28,1819072512,7105644,0,1879048192,-933220136,248,0,0,2088533116,31868,0,0,0,
0,29,-10083328,9318,570425344,1667457792,34,0,2818048,404226048,404291352,24,11520,0,255,0,
-1023410099,-1008992281,-1010580541,1409286144,-604045312,404232345,3938328,5636096,-1010580736,1724105667,6204,22272,-1010580541,1728043995,102,-1023410088,
406611651,-1010604484,1493172224,-1010630656,406611651,3938328,5898240,-2033975552,1630541836,65475,27904,-436207616,-606348289,219,118,-1010630656,
406611651,1996488704,0,-607927552,6750171,9502720,1845493760,-662824133,30684,402692864,-1060930024,410960832,24,-1023410019,-15188890,404291352,
-1644167168,1718025216,1868980860,15951462,15794176,404232192,404232447,65280,62976,6168,402653439,24,0,0,-2122448896,-1715633755,
-8487295,-406585381,-26444033,947715838,940572688,947715708,2084044816,2097086008,269515832,2097052728,31800,406600728,-65536,-406600729,1006698495,1715618406,
-1006698436,-1715618407,118489027,-859013873,1715239116,406611558,859773054,1882206271,1669325040,1734566783,1520025830,1021830972,-528443046,-520552712,235012224,239009342,
1008205826,2115508350,1717966908,6710886,-612433818,454786011,1665007643,946629688,30924,2122186752,1008205950,1014896766,1008271128,404232318,404226072,1014896664,
402653208,403504652,805306368,811662944,0,-20922176,603979776,610729830,402653184,-33220,-16777216,406617855,0,0,2016411648,3158136,
1819017264,108,1819017216,1828613374,2083520620,-133400384,-973078480,1714428108,1815609542,-857967048,1616904310,192,806879232,811622496,811597848,806885400,
1711276128,1715273532,805306368,808516656,0,805306368,24624,64512,0,805306368,201719856,-1067438056,-964951936,-420028722,1882194044,808464432,
-864550660,-866109428,-864550660,-871614452,1008468088,218025068,-1057226722,-871625480,1614282872,-858982208,-855900040,808458252,-864550864,-859014964,-864550792,403471564,
805306480,805306416,805306416,805306416,806903856,811647072,24,-67108612,811597824,806882328,-864550816,3151884,-964952016,-1059135778,2016411768,-855847732,
1727791308,1717992550,1715208444,1723908288,1828192316,1818650214,1660813560,1651013736,1660813566,1617459304,1715208432,1724825792,-859045826,-858981172,813170892,808464432,
203292792,-859042804,1726349432,1718384748,1626341606,1717723232,-289013506,-958988546,-423231290,-959521034,1815609542,1824966342,1727791160,1616936038,-864550672,2027736268,
1727791132,1718385766,-864550682,-870551328,-1258553224,808464432,-859045768,-858993460,-859045636,2026687692,-960102352,-285288762,-960102202,1815623788,-859045690,808483020,
-956432264,1714559116,1618477310,1616928864,1623195768,101455920,410517506,404232216,940572792,50796,0,0,808517376,24,0,-864285576,
1625292918,1717992544,220,-859779976,203161720,-859014132,118,-1057174408,1815609464,1616965728,240,2093796470,1625356300,1717991020,3145958,808464496,
786552,-871625716,1625323724,1819831398,812646630,808464432,120,-687931700,198,-858993416,204,-858993544,120,2087085788,61536,2093796470,
7692,1617327836,240,209240188,806355192,875573372,24,-858993460,118,2026687692,48,-16853306,108,1815637190,198,2093796556,
63500,1680906492,807141628,808509488,404226076,404226072,819986456,808459312,-596246304,0,268435456,-960074696,-864550658,410569920,-872384500,-858993664,
1835134,-1057174408,-1015152520,1715340860,13369407,-864285576,14680190,-864285576,808452222,-864285576,126,2025898104,-1015138292,1618896444,13369404,-1057174408,
14680184,-1057174408,13369464,808464496,-964951944,404232248,14680124,808464496,952500344,-956381588,808452294,-53708800,1835212,1618501884,252,-864088961,
1816002687,-858980660,-864550706,-859015168,-872415112,-859015168,-536870792,-859015168,-864550792,-858993664,-536870786,-858993664,-872415106,2093796352,415496204,1013343804,
13369368,-858993460,404226168,2126561406,1815615512,-429854620,-859045636,-63898504,-856149968,-809043252,453953478,404241432,1863896,-864285576,3670142,808464496,
469762168,-859015168,469762168,-858993664,-134217602,-858982400,16515276,-587404084,1815871692,2113945196,1815609344,2080389228,3145728,-859807696,120,-1061094400,
0,202177536,-960299008,1714675404,-960294964,1865931724,404227023,404232192,855638040,862375014,-872415232,-865717402,-2011037696,-2011002846,-1437235166,-1437226411,
2010884693,2010902235,404287195,404232216,404232216,418912280,404232216,418912504,909514776,922105398,13878,922615808,13878,418912504,909514776,922093302,
909522486,909522486,13878,922093310,909522486,16647926,909508608,16660022,404226048,16259320,0,418906112,404232216,2037784,404226048,16717848,
0,419364864,404232216,404690968,6168,16711680,404226048,419371032,404232216,404690975,909514776,909588022,909522486,4141111,0,909586495,
909522486,16711927,0,922157311,909522486,909586487,13878,16711935,909508608,922157303,404239926,16711935,909508608,16725558,0,419365119,
6168,922681344,909522486,4142646,404226048,2037791,0,404690975,6168,910098432,909522486,922695222,404239926,419371263,404232216,16259096,
0,404684800,-59368,-1,65535,-65536,-252641281,-252645136,252702960,252645135,-61681,65535,0,-590816138,2013266038,-120784692,
-67059520,-1061109556,-33554240,1819044972,-855900052,-866111392,252,-656877442,1711276144,2087085670,1979760736,404232412,821821464,2026687608,1815673904,1824980678,
1815609400,1819068102,807141614,-859014120,120,2128337790,201719808,2128337790,1614332000,1623259328,-864550856,-858993460,-67108660,-67044352,808452096,3158268,
811598076,6303768,806879484,1585248,453902588,404232219,404232216,-669509608,808480984,805370880,1979711536,-596246308,1815609344,14444,0,1579008,
0,1572864,202309632,1827408908,1819810876,7105644,409993216,7888944,0,1010580540,0,0,129499136,-2029090304,146929152,-896857740,
12112435,-2143229120,-376807199,-305003087,-1168980482,112198606,619463406,-771575540,781424872,1493929866,-382051693,-376831370,-1952922230,-774753334,-775368248,-775368248,
-774712864,1406325216,4988555,1968954123,505861,922162155,-779419572,158646283,474440,129500022,-997801216,-92147974,24380352,-289110462,-1057324549,1241609219,
-125071165,-1952921718,1277622232,-774862080,1352633315,4890880,-13441034,-523123965,-1013464573,-947200886,-1949594984,1277622232,-772764928,1352633315,8757504,-315430922,
1947072896,-787777777,-2130218008,-2145386250,-523140875,-523116335,-796139311,-523116335,-13450749,1964243328,-773795574,-773598752,-2132553245,41092857,-1023155247,-645402621,
1344180419,-661733325,520068184,-1021378496,378228818,116785251,1963458695,113410828,-1172262676,-336723008,79856396,201352608,1705176584,-1017489408,378228818,116785251,
1963458695,113410828,-1161809172,-336723008,79856396,604005792,1705176823,-1017489408,-994422192,-301879293,537717826,28369034,1482354506,1381011651,-1341930310,-331158015,
-527769820,-280362576,-1866246054,1996962899,1006924845,-164268285,268470534,-389018764,485819196,-350813184,-2011264477,266567680,1946811264,66813957,319033973,255594219,
272370290,33817719,151257835,-1157971109,11534403,4242158,-320828692,-1006910330,738192360,-156353085,-504852285,-388461569,-76283922,-1866205982,-1207954758,-201903064,
-1157965685,-1229979581,4373230,-1964063861,-1157894460,619446369,-301789954,-1157641240,619446369,-1866207490,516163102,434634920,-1070166597,-1069642451,1007727933,1952610055,
1996700716,-151047332,268470534,915222645,246759172,8916618,-2146442880,510921209,1946417536,842435865,-351750834,-1996032495,175443968,1057240717,1292123789,-1410855243,
14608386,-402584600,-990510378,-1590070271,646578309,-989986684,6295179,-338972184,842435879,1947417678,1913601040,70683916,1980775487,-1070166780,-1899416787,204900825,
235834369,26142721,147005191,131588,1946178024,1962281490,986447374,-32999981,1978874570,-1009844734,1946171880,6219800,1122894512,-288817428,-301748150,-922817470,
1407732462,468239104,-1340640256,-331158007,1954588746,-1088142835,414206702,-1867496722,-1866249490,-390442416,-300502970,-1342111046,-335876608,-33690624,-33686019,27851772,
-301879140,-1337530182,1520299534,296797016,619463406,-1018499457,1122898352,-293597972,102679370,-41266605,-919348430,-1993948786,637602870,17698444,855703737,1461653202,
18409555,-16031909,1474823028,123427329,102679327,11817555,-1004121338,-1014232961,1467277067,-1977163893,-41940113,1129084159,-227153862,-1977169613,-906098099,8654472,
-1995601370,-1979677426,1300899561,1435182593,1975854596,2106271238,-2116449534,1963000063,1977289234,-1899416818,914958017,-1943666420,-1962865122,10807503,1526844544,1606690311,
2143561232,197364742,-1958316833,1871324895,-163833,977484660,871527912,227157705,8719931,-376820875,21858854,-987311565,12518261,182029057,856585691,650219209,
17577609,236882982,-389051647,-864026546,123427330,102679327,-1004121517,-1014231937,1962467083,652184370,-2146996342,661979133,1978153539,227157746,243845630,-1960443772,
243859789,-1004142459,-919403659,915003790,109838604,1526268174,-1021376677,-1610565552,-1014316914,-1311144040,-758590718,-790048572,-1312520492,-1310665971,65196805,-2013754430,
-2133852455,-939647001,-550887245,1106063945,-164446158,-812987769,-880106253,-897078541,-1017580830,-1610565552,-1014316914,-754798184,-792407352,-2032873240,-754077244,-19887136,
535265487,548653054,-142090454,1958742700,-1947979240,-754601478,855114720,-1964166464,-1968901169,-341118005,-1866245917,-896904880,-1341930310,-284904446,112460976,63879919,
11797936,-1274629905,78704388,-1964047692,113411025,62962412,-1964064718,-1017620015,-896904880,-994383734,-1274892285,78704387,-1158741324,95421390,-1326509900,-2146520058,
41224189,-1326511436,-285166588,-1031548534,-1061491706,-299847677,1482281354,1364590787,-1160082606,79233988,-1342065664,28634880,-1174316568,-290716734,-1274821446,-285167613,
-1981230197,1686013,1072227378,-48699391,-2080558104,-319158590,-1274822470,281445168,-91821908,-1405963194,-1258651672,2045291571,-826606598,637187,266921010,-2083288319,
-1070463294,-1158874386,884212672,1508425778,1499134970,1381090142,-661905834,116840846,1963458697,-661774800,-2096708989,-319152442,-1190936390,-466485232,1174461928,-401492820,
-855705048,-83828760,-1341929798,-400560385,703070216,1516117760,-1608596647,378142793,1085341833,602407093,-523134725,-1959864181,-1946029897,785944264,36345855,102679327,
8990346,-1979677279,4825312,6493835,11024069,-989561660,1959071860,198937610,-1956219682,340757214,1962932608,-935705764,-1392708747,158646282,548668025,347131134,
113411055,62962412,-1392261501,678739979,-1968322422,-984211744,-58676172,-401771504,1105787272,-20644352,-1393658423,2045297918,-389218567,526254128,195941770,-1979026240,
-393564728,1374172357,-1021376768,1508420858,-490406151,-1866204168,1307094266,452857,-169687810,-1014184965,175431435,-478094198,654258719,-1866268280,-1159558404,-980810808,
63552238,15919276,1946600694,19064835,-33465880,1976172229,-1963146270,63486690,-1158756982,-1968438327,-125129512,-154958164,57935556,-402588696,-973209294,-579483138,
-1963159357,-1257655838,573216,-1979463494,-910496059,-1979414013,1552552060,113571336,-840432780,17098752,1330038270,146792053,63486464,-1158756982,76153801,-1963426678,
-990508964,-402426874,-538443608,1187380736,-1075940017,-927334392,-289043965,-1979463238,-126055932,-152019830,57935556,-402619416,-973209414,-562737338,-1921660418,-1341929286,
-910496240,1095939,301610637,-1963423060,10021080,-927271198,-301944829,-1190934086,915210256,-391376406,-990511088,-402426874,2011693120,-1007689216,-1974300477,-2145311528,
-338632989,170852146,-1979554681,65241304,1956088366,-790048766,-2133292312,-1976695837,-805145417,-1964453656,-2020987176,-628424076,1448264538,871773015,-843427585,-487090100,
-233572349,-1969812806,-487089977,-233572349,-1977865798,-487089981,-703346941,-763109167,-1031120896,-628426102,-1017487777,15462138,-336672886,-289175040,-15365,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1311904266,23876146,16711935,16711935,
2037411651,1751607666,1329799284,1363234893,1836008224,1702131056,1866670194,1919905906,1869182049,824192110,741488697,943272224,824192051,741619769,943272224,824192053,
741750841,943272224,1375739959,1344951127,1311392078,1143620176,1126843210,1093288513,2772044,541143382,1329804592,1363234893,-224,791687679,942618418,-1962934473,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]
}{"data":[
820532650,-386632187,-637402904,-371231997,-399310709,-655834994,-388371968,1229063324,-1653387963,-939523095,507574980,-2143354842,146329461,-1900019472,-259212443,25757194,
28843528,-1898430464,200094436,-2134084349,-738000454,-2134069245,1622610099,-989660681,179961972,-1341672445,45580491,1224801186,-1996453850,-2030008290,-2013231042,1660979478,
65595469,-402409726,373883530,184680680,58779831,16328329,-259286901,-1967334098,-789620479,-1949928695,-395244304,-167050189,86961524,1627491006,-1207858194,-538436986,
-2130982826,92276597,396937,5433429,1946356434,25618628,-1090398488,22735068,1946618578,17557684,92728692,-1425942808,-1933036563,109970688,-1845176088,-398013510,
-289165306,-398001478,-50529540,-324469508,212863092,-1174268178,32375216,1185987304,-71102738,852669955,-1996425722,200671604,263817,-1241025518,-167318770,41191168,
126485174,-234563968,270582544,270540816,270544912,270540816,252588032,252645135,134680576,12645384,0,0,0,12622849,0,0,
15266824,0,0,0,15250945,0,0,-536798720,192,0,0,0,0,436207616,15261697,0,
0,0,0,0,251723744,458752,-15859192,1056964608,134221825,65536,33619970,67174404,33882117,17170438,525574,459016,
101122567,202443793,202443793,202443793,-1945039855,202460177,202443793,202443793,-1945039855,-1945023471,1276202001,1276202001,1276202001,-1945023471,1276202001,-732089328,
-732048291,-732048291,-732048291,-731982755,-731982754,-731982754,-732048291,-731982754,-732048291,-732048291,-732048291,-732048291,-732048291,509531229,269746180,303432198,
404490252,438176270,356450346,-1961471918,-2084412672,-1058142670,-1017947560,-2115793958,-1950150912,-1085722998,504365450,-472973184,-2011297057,-388952064,-1008184229,-388073467,
585630578,1914529028,74639544,1980045544,-1605799405,131072178,-388962096,-756487984,-386156033,-1165753661,32374960,-1160498460,570426344,-2134084349,-1274871110,7727127,
-872348800,66420988,-1341099256,45410319,-1966865415,1353750723,1122766830,-1336243488,-352260358,-33686019,-51577347,-33686019,-50594307,-297105724,1515749628,112902942,
-1341684736,-935465332,1963458792,-1961455912,-347246497,2053082422,-1207923714,-1061633906,-1898446616,16562448,-50549510,-64553732,-76203515,-487578553,1885309718,518399627,
518414139,225599351,-1977739226,975103327,1980622175,-393891728,-930217588,375707789,-611450573,912966541,1073766335,-1925798485,-1082364321,-1416822619,1606366828,-1515516927,
9354048,-1925266542,-1416452096,532916999,-2080366918,-289755131,-1341141501,-1341788606,1250619116,-456073008,-66394928,1350623411,-2130910016,1082835061,200210608,1243890412,
-520685174,1963771712,-167333039,24414464,-872143232,-2139752761,1387862451,-1898381112,7661600,-1048571263,-117440383,-276770702,-1341404158,92991467,-503266328,-1341181212,
-1014894817,5586432,515549891,-1341750272,-1961431300,-2084412672,-939325761,-1925837281,-1274887675,-1285344513,15251713,1932147968,-1190972700,855638248,-1285238571,13690924,
-976170958,327870578,-395065904,1625817779,-1664083712,-727847472,-1966902519,-394458425,-302120910,-829765662,-1017920481,-1965534548,-117724022,-324497158,-125368204,-1058089166,
-2034023764,1514858625,-74414121,-1475806484,-324504072,-71696011,-326450685,-684535673,1116389614,-655820662,1250385498,-1039083530,-111512575,-1165730877,200147120,1023446216,
1947844856,61913806,1123682798,-318903552,-33686019,-72811012,1946255608,1347680707,1357402450,1488588803,-299596800,80933041,-1948718952,-2018365814,-1341913669,-1965018387,
1622245604,-326498862,263900387,-1467942400,-1159171069,1174406120,-1964973317,212959460,-326499630,263900387,-1475282432,-1159171069,704644072,-111484165,1489197403,-1165675539,
99483824,11582084,-391577362,871170755,36890787,-2063548230,-2080313670,1347677891,-1949675182,1387915481,-389742591,1499157082,-2136450877,-1467963224,-1465341784,-2139051904,
134774912,134744085,136649480,135596040,453511176,134744101,134744085,136649480,-402448890,-1140894980,-2080309318,-289755126,-1341996029,-272976881,-1274687997,-386813944,
45699252,-1898381152,-1090416959,-877657973,-1439497997,-5570640,605007872,1354688723,-1090453248,-877920117,1965948608,-1427964216,-14354768,-1169158168,872362998,-1392604213,
380289141,-1392581896,246464629,266862628,871800912,-1066095362,-934408450,845836,-1157717784,33094123,-1020066017,-801308682,62853235,853214208,12237060,-1274556925,
-395464703,1023299722,184469365,-522009648,267121072,-16578254,-1970806994,-1011160312,-1342012416,912518795,-972685181,15251762,-1948736431,-324498474,283641973,1945414225,
-1340022035,-393352360,-661958261,-1475815700,-392989685,-186494605,552332720,-889568885,11582019,868233454,15645248,-890438777,1979426824,-1475806484,-2016774917,-292844860,
-1475816980,-324504069,-68679564,-1189459887,-1027556678,7530508,-351927304,-386027487,-1019478535,54247794,-1011170571,-1341946880,335605433,1660980022,115901382,-1948772271,
-324498474,250085748,1945378385,-349379859,1368123395,-689121141,1963894785,1366550537,-303303454,-296740888,-1948873768,141946024,24432552,-263189016,-488016912,-392318928,
-1011155463,-1341619200,509865611,-1023016829,12237059,-1274036221,-74414118,-1475806484,-2015726344,-292900814,-1964981010,-324499494,-68419211,809302820,1568669813,-488979440,
-1161786382,263193524,642727912,-290148320,-617477712,263847859,-391294976,-2080354374,-292835319,50388665,62175936,-621080697,-324497158,-125368204,854514352,-292910396,
-622010233,1979426817,607186171,1963736112,283279556,-350364936,-352144768,-2132495728,80883889,-456069936,80929969,-1005918198,-352533784,-88409661,-1338621184,1073802938,
-286379328,-1165689917,82706608,1337649305,-1342060541,12185264,1122958594,1257169661,1072579248,-286528768,-1161363218,32375728,45791741,-331560701,1776418933,-1342047926,
-1337987518,49199613,-1161305347,15598512,45791741,-331560701,1239564149,-1342113462,-1342116286,49199613,-1161305347,-1178704,62503625,-331611392,702693237,-956040774,
-289755136,-1190934269,1006633196,-486968042,12237059,851494915,-285278520,-287129534,-351863304,-399134656,-1023083271,17172485,50332167,134227992,50333705,757531235,
731916432,13090591,1543,-1668415488,529960724,-16729693,50594050,118490374,320082194,386405654,15,0,16715790,134227992,50333705,757531235,
731916432,13090591,1543,-1668415488,529960724,-16729693,50594050,118490374,320082194,386405654,15,0,16715790,134238232,50335745,1599013475,
1434538114,13090591,1543,-1668415488,529960744,-16729693,50594050,118490374,320082194,386405654,15,0,16715790,134238232,50335745,1599013475,
1434538114,13090591,1543,-1668415488,529960744,-16729693,50594050,118490374,320082194,386405654,15,0,16715790,134227992,50348041,757531235,
729819280,12697375,0,-1668415488,9867028,-16729694,386011925,118490118,320082194,385946902,3,0,16723983,134227992,50348041,757531235,
729819280,12697375,0,-1668415488,9867028,-16729694,386011925,118490118,320082194,385946902,3,0,16723983,134238232,16793601,1599014499,
1417695362,12697375,0,-1668415488,9867048,-16729662,387389207,387389207,387389207,385947415,1,0,16711693,234901528,50335744,1599013798,
1434538114,5095199,2828,-2088435712,224615720,-16729437,134744072,135268360,404232216,403576856,134217743,0,16715786,268455960,251690273,1599014499,
1434538114,4243231,0,-1668415488,529960744,-16729629,50594050,121111828,993802554,1057045822,15,0,268369925,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,134227992,16384,925303587,
823471415,4654097,1543,-517734400,148948756,-16715613,50594050,118490374,320082194,386405654,15,0,16715790,20480,251658281,1599014498,
1434538114,4243231,0,-1668415488,529960744,-16729629,0,0,0,1057030144,15,15,268371973,20480,251658281,1599014499,
1434538114,4243231,0,-1668415488,529960744,-16729629,0,0,0,1057030144,15,15,268371973,134227992,251666441,757532259,
729819280,12631839,0,-1668415488,9867028,-16729629,50594050,118490374,320082194,385946902,15,0,268369925,134238232,251674625,1599014499,
1417695362,12631839,0,-1668415488,9867048,-16729629,50594050,118490374,320082194,385946902,15,0,268369925,234901528,251691013,1615790242,
1356879386,28703,0,1580072960,6184212,-16748917,1574912,6144,2048,727040,5,0,268374023,234901528,251691013,1531904167,
1354388247,27679,0,1579876352,257907988,-16774517,262400,1792,262400,67328,5,0,268374023,234901528,251691009,1599014562,
1417695362,4243231,0,-2088435712,258170152,-16729373,1574912,6144,2048,727040,5,0,100597765,234901528,251691009,1599014563,
1417695362,4243231,0,-2088435712,258170152,-16729373,50594050,121111828,993802554,1057045822,15,0,268369925,234891288,50333705,757531299,
731916432,5095199,2828,-2088435712,526605588,-16729437,50594050,121111828,993802554,1057504574,15,0,16715790,234891288,50333705,757531299,
731916432,5095199,2828,-2088435712,526605588,-16729437,50594050,121111828,993802554,1057504574,15,0,16715790,234901528,50335745,1599013539,
1434538114,5095199,2828,-2088435712,526605608,-16729437,50594050,121111828,993802554,1057504574,15,0,16715790,234901528,50335745,1599013539,
1434538114,5095199,2828,-2088435712,526605608,-16729437,50594050,121111828,993802554,1057504574,15,0,16715790,268445720,50333704,757531239,
731916432,5226271,3342,-1668415488,529960724,-16729693,50594050,121111828,993802554,1057766718,134217743,0,16715790,268455960,50335744,1599013479,
1434538114,5226271,3342,-1668415488,529960744,-16729693,50594050,121111828,993802554,1057766718,134217743,0,16715790,268455960,50335744,1599013478,
1434538114,5226271,3342,-1668415488,261525288,-16729693,134744072,135268360,404232216,403576856,134217743,0,16715786,268455965,251699201,1599014627,
1417695362,4197182,0,-359923712,15195944,-16775997,1061109567,1061109567,1061109567,1057046335,15,0,33488901,268455965,251699201,1599014627,
1417695362,4197182,0,-359923712,15195944,-16775965,50594050,121111828,993802554,1057045822,15,0,268369925,134227992,251722241,1599016547,
1417695362,4308767,0,-1668415488,1083608872,-16729693,50594050,117966086,185338122,255921422,15,0,268386309,523173904,1061109567,1061109567,
521158447,0,0,792141607,1061109567,1061109567,791101239,522133279,522133279,909782321,1061109567,1061109567,909197114,757935405,757935405,236257287,
471604252,471604252,235346965,0,0,353898001,471604252,471604252,353442840,235802126,235802126,404362262,471604252,471604252,404102170,336860180,
336860180,135004164,269488144,269488144,134483980,0,0,202246154,269488144,269488144,201986062,134744072,134744072,219089676,269488144,269488144,
218894351,185273099,185273099,33751041,336004101,33751041,336004101,976959545,1044331581,976959545,1044331581,33751041,336004101,33751041,336004101,976959545,
1044331581,976959545,1044331581,33751041,101123077,168495113,235867149,303239185,370611221,437983257,505355293,572727329,640099365,707471401,774843437,842215473,
909587509,976959545,1044331581,0,0,117901063,117901063,0,0,1061109567,1061109567,0,0,117901063,117901063,0,
0,1061109567,1061109567,33751041,336004101,976959545,1044331581,134938629,337120785,606608416,943664434,-54570880,-1273137916,-2130908411,1090198899,-1103094186,
-570031986,1397839191,-319008117,-1333739776,474697,-1090489336,62896242,-2033975136,-2033939472,-16743962,788517350,307926080,1599953243,525862750,-816287230,-812593854,
-434865134,1981110293,-367663083,806760982,-434532840,-568644070,-736284131,1813283870,-1272829921,-1540995035,405607981,439163437,439163437,573089831,674058281,612338400,
-2143518492,566629238,1574532,-2063546618,-2146564096,137594624,-661798770,1319306874,-1945236479,-104657407,-2030007794,-141917983,16133769,1948173569,855608024,268471062,
-819035934,-1978398057,268470550,-789673230,-789962026,-1960907953,-1963257856,586928367,-1965567761,-790394151,855363811,-1965164841,-790376221,182440163,-2132543789,-613087222,
-260012406,-20519417,-154782990,378210420,8396304,-789847248,-789851925,855625963,-2021249398,-511765376,-154858804,65536372,-2012347903,-1160476928,-662699126,-2134646009,
-484435584,-1995035949,-1825348864,1308672163,9282146,12140112,503777280,-1813449813,-1961472443,-2084412672,-323352838,-1340030973,-1961431301,-2084412672,-1977743636,855591168,
141787387,-1970859986,-1570384364,-1970864082,-1570316780,-460783566,-121420272,1347624454,1224757922,1150085229,-986195674,2130978500,-1736012605,-388905775,-265033725,-1045643122,
1241523875,-1568363482,648216748,-1389984512,9347916,1279837160,1156114445,-1956850616,-638185586,8390279,-1090489031,1045016704,1946681351,-1199784192,10486719,-394686777,
-148487616,-774353920,-1958835256,-1205842432,1044973440,1946746887,1224769598,36897654,-1416904461,-840381562,-388908032,1532511066,-121436385,-789917462,41976034,181068285,
855608024,-2013230570,-2132636942,-435163008,-791424795,772460781,344496030,8787592,179303214,-2010200556,-1013937920,2400391,105480202,1175453832,8954186,-1604172271,
1174732936,50460867,538968839,538976288,8240,2097152,538976304,151527456,151521544,151521544,151521544,151522059,151521544,151522059,151521544,151522059,
151521544,-2139092728,32768,-2147450752,0,740818944,707669289,808459817,808464432,-167362768,150570752,-345607165,-779382645,9117317,8992355,16125536,
1946535456,518765056,-764135414,-98552704,-167349457,24479488,-227137478,-225834870,-890514434,-100459392,851473943,-2134603034,-495779270,-1065350658,1912798723,-397672768,
407109864,-1948873782,-1964658678,193654704,-1991843345,-1013968648,855608031,-1986539037,-773107712,1644182046,-1949666039,1660979990,16312407,-1965046896,-773639425,1342213015,
1610648334,42568014,-121416192,-1964572981,987957986,986937100,-1964805075,988217036,180384805,-1964870379,-1966920986,225607931,-930479362,-232075126,210433259,-931867650,
-201455990,-285292848,-1588935741,-449707786,-1047794429,13700686,-1047860989,-525284214,-1341255697,-272397599,-1965491773,987279367,-1965525502,1644202014,3318092,-475791369,
-1978249728,-2131080960,92275574,1963129351,-1961438744,-1949801728,-1341289760,-1964639505,-268718068,-1953508893,-392343552,-1023344648,-1977680496,-398892544,-947256690,3808842,
76206962,-897526786,-153295871,-2016773876,718351093,-153422114,720759556,-20567343,-2143355198,58083584,1044977024,1919877127,-2143390708,225593600,-83885079,-1947469373,
-2115687446,-773456128,-1966765064,854456035,-773848127,-1752497210,-477761290,83359353,-573449993,-946413565,-2029980154,65537140,503713345,-1066131580,-965536710,-259387350,
-1526478093,-33622781,-192229771,-407834486,-890036086,-33641725,-165687691,25225607,409161,-790531068,-1118777118,-1752563630,-308755150,33012288,-1056710141,-1947154793,
1073846458,-2047412254,-136808176,-2117601315,-2143358944,108284160,63373639,-1772485089,-544975989,809156724,741000819,-790171568,-1949904666,-1946448912,-207320374,-1946448912,
2130422,2130423,-207320374,64816069,1977679566,-254781302,-430381360,-1946449212,-206927158,-2114483205,-1966473184,64877482,1978334926,5433849,-2115662869,-2143355136,
326453504,-439286063,-443816495,-326436822,-1717517160,-152730368,1391920066,854451546,1224769598,170595189,-506344751,-519839279,-1056716285,-1947154793,-2063534554,1519056869,
8445622,1261129,-773688058,-773664286,-2047464470,-136808188,63436765,-1066101116,-1015859398,-665832662,1224769598,273814388,62438094,-273021695,-1207778301,1520439279,
-152861440,-1047650676,-889988725,-184310781,1979055432,-1965547688,16162949,-1965366378,1224769598,448402292,-1207579133,-1161559825,-307231950,267322036,-877635702,-1427439373,
-896922229,-1442592781,1979055438,-1341986014,-276133145,-1325413537,66974634,-726643083,267322036,-167318774,74745600,675218408,1347680451,-402566830,-663339462,-660536694,
855591936,-1947142173,1532516953,-1899511040,1224772134,58097916,-66648192,2001826315,1055451239,-372906496,-1572814,-389841346,-1962672047,41285315,-997517690,-536096559,
143052980,-489627183,-488451887,-508888954,2130422,-2132770569,92527075,-338508208,-611428301,511499205,-625672052,-2132049743,943608040,-1960932669,-394835456,1007878225,
-1963363038,-1190907182,1006698669,-763300400,-170853375,-225783070,-19938646,-2117700580,-337627135,61913806,149882292,-154105340,-203249149,95745968,1488257263,-762642381,
-158410189,906813125,-58326645,-504839034,1930516480,-1946972454,1946749914,-397834523,33685618,-314456782,-16809503,-1991900191,-1013968648,243620491,-2115960767,736231167,
-1961980932,102139136,1388513055,-2029980154,311100532,8590947,-324484602,-67501707,24439976,-1962542298,1397881795,-1965993387,-1947585802,-1963685163,-1948283962,-259303797,
-839648373,235120244,-898251266,-1067519950,-102003717,734399070,-151942195,-125137925,1515841117,-1899537469,1224772134,58097916,-66647424,-394824699,814416107,-370609269,
-1948383171,-1964799027,-2030007778,1660979990,116818882,1947190020,-324498448,-67501707,24439976,-961807477,-386335774,-1899510896,1224772134,58097916,-66647424,-399543291,
730530027,-1036195352,-1977709619,-1961457920,-2084412672,-1023146250,-1963428849,24505512,-324469766,-74841740,-79181910,-121380121,-1946514477,-2130932759,92279668,1996684295,
1357394687,1485547068,8851077,-701237365,-82577792,-1964346352,-2139062043,-2130976129,1189676914,-1898007296,201442614,-153013532,-1948646416,-1964078351,-1325115562,-796218230,
-495795248,-947256694,-495787056,-408223094,1978400457,1946615501,939622855,1583344604,139297735,-369855024,-557514610,27801100,171147380,-557451634,2373244,-519864330,
-503058304,1468683094,-2130972244,575866484,-1963412728,-773795360,1929564391,-20247870,1535538674,-311114742,855966502,99296905,-311162358,839189286,92350088,545322752,
1963194240,1358857159,-1101017483,1199595099,1946286854,1974224717,9103746,508224395,253886647,-91302010,906813125,-519896586,183365714,1468691749,-1006378310,-276123646,
-762912461,-2009738458,-20184070,-2032962057,-407216246,-1341996029,280686571,-1341996029,-272987417,-1341927933,-279530472,-762947789,-519382390,52882804,-1406760443,66750469,
1978662604,1600030419,1299531610,-491084662,-1341996029,-838602822,-1341967644,-167317565,150570752,-1959889621,-1977195776,-2130949888,494339956,-66904704,184514367,-394693361,
-857210742,-1257136640,15460607,2013266920,184547523,-396266210,-66125696,-1966312359,11921537,-503316248,259490044,300436149,-347875328,15460433,-66699648,184513571,
-399149801,-907542478,-1258268160,11921595,-1241509400,15460461,738205416,15460453,-9103862,301993960,-399035703,31981749,-352086016,16312337,-1603878000,-528482268,
180609823,12821094,28410083,-476052014,618620416,-1570370877,916979909,2080637124,-1013922508,-1476344522,80069756,-785238902,114554545,-696196605,855630607,587432899,
264493706,-1964461818,855018196,66245602,-1325157375,620135366,1963181344,58753990,-2084182768,-1073543494,-74414102,-1475806484,-2014677768,-284513244,-163985944,1090447555,
552518832,-915014658,-1923686461,-74447213,-1475806484,-1816496904,-1847017469,-2130914247,50205045,-1707029272,-1340045628,-990122362,-1899523645,-1977732097,-2131015424,149427061,
646459905,-1015020040,1913977607,276267259,-91877493,-148453480,-1948824576,-2033742856,-389051677,-66649984,-756845996,-1735740145,-839464926,-407840890,-838661958,-9113846,
62132912,-1342039825,-1161524511,646579183,347080171,-440794486,-269040637,538825510,-1341983021,-282686751,-1342011363,-273642779,-457571534,-273625597,-856749826,-1742542060,
-536165422,86434932,-351916027,1024075298,-121387094,872386247,1224772126,326467835,-1879045912,99296906,-83409280,-1946521075,-1728607545,9119308,-125118581,872473576,
124944636,-474996270,-4586702,-1274753533,942074079,585861677,-790113555,-20444419,-1966638610,646638345,-685636106,-393689134,-121420272,225935612,181471860,75623027,
550618880,-489561391,-503061807,-489555247,-88612349,-66650496,-774802684,-1965043481,-1949174061,-773139990,66769386,-2132674863,-943519790,-1324971015,66769890,-773664286,
-1023409158,1644202510,854428409,-773421106,1342213012,1998142477,1007318081,1007187009,1007121457,-1148947189,-201260103,972613841,16827321,518541911,526349563,-1036363010,
7476810,-755097038,914671162,419299446,495242987,402575988,204655339,138072811,7550596,-964031490,15220322,-121410826,512381527,15220322,-1224712458,1224769598,
125830006,474697,-1975618294,-394436096,2115107210,1522016095,868811014,1241549334,-401735990,-1023346696,-2029980154,1965164793,-177062884,-225764213,1971811,119932447,
-1476344770,2097424068,-527197999,-1756090625,-1013964808,-1440773089,740345375,-1306349022,1579201058,-1608481248,-1306349022,-1306349022,-1306349022,-1306390495,2082555425,-467553758,
270709282,1075984930,2015512610,-1820096828,-74399226,-1475806484,-1816496904,-397295613,507394024,-285495264,-2033925232,-1820085199,-74399226,-1475806484,-1816496904,-399392765,
-29542424,-1275003965,-1947553520,112886725,854441987,-74414102,-1475806484,-2014677768,238529768,1040115931,-973159170,545769844,-1475810580,-2014677528,-164188952,1040115907,
-915094274,-847967490,552529840,-1011811349,-2014699282,-85132400,1962453000,-1271822358,-835277592,-392560948,-1013957125,-757026557,-1966595064,9353280,1224792224,932767957,
-773290300,-1948724760,116163522,62175936,-1970851794,620177161,-392885567,-1965017405,109806530,-1862608133,141880488,-994379638,-297615357,-531960694,-326662182,552524464,
1711668104,-1271807088,117146562,-324497158,-125171596,-1073494854,-319033790,96700486,-1899983656,-1275032578,-1947029232,112886726,854441987,-74414094,-1475806484,-2014153480,
-297628988,-1426133942,-973159170,629655924,-1475808532,-2014153240,-297628988,-1426133942,-915094274,-219410553,1978334925,-1340045326,-339808517,-326662158,552530608,-74414094,
-1475806484,-2014153480,-297619407,-71045974,25922150,-2033951230,9353536,109697526,1946353666,1028712679,117146562,-324497158,-125171596,-939277126,15462123,-922550086,
71194856,-1964981360,918284445,-1899806720,59423432,-352271122,-20649216,61651657,-1400206632,-2033977172,109651702,1946353666,1038674075,-489106883,918808707,855608024,
41124859,-483522607,-1910374505,-1843281008,-2084392415,-1862662405,141880488,817559728,-297615357,612363338,-756764409,-285537596,-2084387952,-621082997,-324497158,-122681228,
-1073532742,-319361470,-2142580700,-756502265,-1966550816,-2015702300,-625939321,-1966852882,-1013911813,-2084402464,-1862662405,141880488,-994379638,-289749245,-352270077,-326571264,
-352303615,1174662280,-326571264,-71088638,-1899787045,-1964995586,901441741,-1966815485,15462123,-994443010,-324351741,-324343040,-324343040,-389684507,-1161415229,-1013971986,
65845958,79923270,109806530,-1161766164,888013744,1250575084,-622010233,-1338996774,-333124030,131236017,-923342710,-511651456,-756231967,79923526,-395605280,-956090950,
-286553404,12189931,-85145341,-352285992,-118756214,-2034040596,1916599272,59161288,-2033924882,65583817,-20668868,-397548849,-1023396413,1912880176,-121408466,1947745283,
-2029980154,-214824843,80995505,-394207022,1953692674,26274057,913696991,-1006434118,-1341945117,-1013911560,868256985,-1005154600,184515584,-1005161414,-19985407,235369522,
1279233302,1948843727,2051968278,1948319439,2052230422,1947795151,1280150806,1947270863,137268502,1946746575,138317078,1964310223,-1941532967,1443367561,9019781,-1601944062,
1174405256,503838915,-1898302510,1963788992,143246414,9178748,15402622,-931824130,-1001516538,235669641,101581196,-1957822201,771621611,160286837,1069102668,-350745088,
1963589320,2051968310,15448328,-931853314,906512781,268447417,201427254,234982414,243607177,1577320586,-1975110913,-613154806,427822256,1996880643,-2015613302,-937024514,
3318404,-1977680090,646668800,3839824,126546038,-1986531290,-121417728,422248462,1224757408,1660979990,931915975,1347672152,-483189110,1980301253,76254046,-1957278206,
-1066139638,906512781,268447419,1963670532,125141244,1040723341,663568107,1069233740,-20443648,-2130938613,395118453,1307262540,913969549,134237883,1946615496,1491672923,
-1963227136,79268446,869400577,1398214175,912255179,-888448117,89390964,928638987,514334660,375586955,-394723240,-1540147224,-1966211379,1543438029,-126496886,268444344,
74744059,1174737290,1946815195,16693262,62442356,-1965094912,-399526657,65536235,-1961474832,-2084412672,-323352838,-1340030973,855633659,1644202526,1342213015,-2080359882,
-1976142328,-1986558976,-121417728,-1734127533,-20413184,-1341551904,-333124030,-990978038,-259201021,514382276,-986251226,-1736026021,-388905775,-259332093,-1274985444,1142112502,
47284340,-644224882,-2063561970,-2130708495,42663796,-928856066,-20937728,-515335945,1660979990,-1340962080,1714745320,125141243,344589744,-1588928017,511967370,-1007288066,
-526130223,-1023390720,276070651,-81778816,-2132052914,-83414912,855601929,788517347,637118310,-1306147952,740692006,1646674982,-2044297690,9085063,-469573504,-756240127,
-1325063072,-1991847192,1175454856,9085064,-453975936,-756240124,-1991891953,-1013972232,-1900006464,2116914438,335554211,236332684,1006829763,-1977191603,-154892544,1149896821,
9059977,12197512,-154926832,134873716,805617780,261620402,-1946627616,585610241,183816396,-2131328780,-769403657,-1953637842,585893414,-2009199655,-2011264768,-951678976,
16257042,8438672,17826048,185600768,1930836994,-1996453338,-757026557,-150306588,646570120,1175453895,-121433600,1930509314,-1325190143,201773792,1190050536,269666118,
-1013972744,1998076930,-1977207807,-1325299456,-2132487456,-527893238,13051529,302007824,1006827715,-1977191658,-1325365504,-2132487456,-527892982,13051527,302007824,-951650109,
16257042,1006814096,-1325042920,-1964977440,61913796,1122763246,180626655,1175514823,-121433600,1999780867,-1946974469,-2115598597,-773390592,1342242740,-389172222,214184163,
648836616,335565288,-145073694,268564038,-1971423992,48760244,-121393104,2001157133,1007318037,1007186961,1007121421,1966568450,-392842226,1686778091,-3023054,-1756306549,
-343539503,225828668,-759953358,2049966824,141935420,-764146556,-894156034,1781531368,175489852,898316011,-163160572,1946423298,-1399614682,11843841,1311771112,855608031,
-1952984605,-773107712,-20805921,1241528854,852652548,-1274877178,818145327,976682694,1995604992,-1274872114,813754399,212553,-2143390195,125061376,-550369654,162856939,
103811304,-1963160865,106320722,515135317,20121264,374000010,-890765058,526227694,123363166,-71083130,-1476344770,2098210500,2097292996,1949502144,252674531,646613955,
-309654222,-955981949,-1351287566,-527757178,-1978795226,-2084097299,-1351285518,-75286997,-1949831418,-1567960600,782237931,-1731098112,-668540789,77630297,604457216,-790036800,
-790048536,7635195,20055588,126272372,62651371,-1990262785,436208824,284723526,198951824,-383486973,-1954676228,114296461,-1933049429,251702201,1224772918,-1190923355,
914620557,-1541013261,-38207931,-398917606,-1012191349,1224772126,780808959,741509101,25224196,612357120,-1970820306,-1965031123,-1433787377,80921777,347142265,109642486,
1963655184,-167313720,24479744,-928382210,-1161515005,1122763758,-790066472,-1963405080,-789804320,50561507,67839236,-995376250,-1274049576,-1996479962,9085063,-802887434,
80871857,-527704054,8590947,-323304954,-1338982397,-333124030,-523237168,-527769590,-1965701974,-1190972736,-1433796365,1622262308,-391510574,987706048,201421826,-986309114,
-1000560640,-1056242548,34392948,1544028868,197889217,201618434,210551900,-881540853,147128844,-1000573936,-1056241012,34392948,1543639236,-1932948285,1946303435,119475232,
-1061574094,-206959360,270255942,-1013972744,24312892,636028276,-2115896575,1963263744,-377474112,16778171,-2083270167,-377290543,-773205248,-2084343037,1711475945,117473761,
868250885,59500894,-954139773,1912852713,19327297,-1161524929,-1433730068,15472227,-222647669,-324350461,65845952,-457856462,-1006434886,-297628988,-20648790,-847951106,
-872156230,853863594,-1948863207,-297628988,-20648790,-847951106,-1039731837,-1094700316,284885941,-324497158,-125368204,-990973302,1252672236,-20054332,-2014153712,141946024,
-693048697,-2016010002,-1271862311,-2014137084,-225776505,-79510290,1250421930,-989924610,-310129291,-1947014650,-1160891676,160039861,1122813166,-20665782,1978924749,-1413837882,
-1341996029,-326439358,267313328,82725552,1353728748,-1160902930,116261808,-1965014292,-297095164,-297619451,-1342051248,-1207898594,-660430706,1253113855,1122764014,-457879502,
-991034230,-5594881,-20054332,1492022771,-1341841590,1122954840,116279984,-991018358,61913796,1113064686,-1341985206,-1966805438,646639178,-292862176,-1975003610,-1160896018,
-1975057626,-1948900626,116163522,52869824,602835527,1934479593,2130847369,-1609543394,816447524,9287951,15939145,117482937,-2080338634,-1925778524,-1191008256,-1523384077,
-641807986,-1191046144,-1514274573,-1191021568,-1514274573,-1191019520,-1514274573,-1191048191,-1524694797,-378381872,-1241447447,2130978441,65911495,-972837958,-1161302870,-1058143438,
62503625,-324403199,-324343040,-324343040,-376577292,-519634559,87228533,-2063482647,520560134,1912852713,9169404,-968738941,10487480,-1161523520,78906288,-1160902929,
112460720,-1341848337,-272976896,-1341996029,28700340,-1966865342,648212140,-790298625,1978859213,-291459057,126615551,-972802173,67127999,-390812534,32440496,-1400439100,
-2033924881,1333132996,-1039927878,-1161515794,9044912,-1957370385,288503472,853861615,-1400457959,-2033924881,-20054332,-2084407820,-1073543489,-1257229596,-85132400,1962453000,
-1966831622,-285282644,-847985410,-85192569,1978443784,-1340045353,-672403833,817224628,-85195641,-1966831622,-1393627397,-20674566,1978662605,109806570,-838600006,-1257688348,
-990925690,-20674876,1978990285,-1161524425,-292879444,-289744980,-1393635837,-2084402217,-1161820436,-288357460,1381099891,44862327,638592640,638058703,12125712,-1925312768,
-207271680,9287943,15941252,1051239565,33554617,104068005,-1044395634,-1191046144,-1514209037,-1191021568,-1514209037,-1191019520,-1514209037,-1191048191,-1526267661,-378316336,
1996759435,-972837446,-1161253650,-1058143438,62503625,-1393688575,-1393628416,-1393628416,-1206066444,1175453833,83396958,252691215,50401027,2139062143,252673919,17792783,
-2004287608,16877569,34816,134479872,825299474,-104660736,-104597053,1043151917,1110261805,1848468013,1997421576,-1947192604,-399519258,-6029266,-104653779,-1013922928,
1914566851,67159878,1174536391,-1601634304,47185956,-399185712,87163140,1174463625,-121374525,-2029980154,1963002105,1913518275,1946487515,720103457,1143604456,1347680451,
515592530,-1898233856,-2046382079,1006698497,-72059839,277483469,-1274811311,1498598672,-399232046,548667506,280232653,283642061,1913860096,987102914,852652781,976682694,
1994294272,1763346,-1274885798,-91697904,18812416,1532516953,233361328,1914045440,1379119114,-1066020220,548668080,401998029,1946272769,-1023346342,0,0,
0,0,0,0,0,0,2122383360,-2118277759,-2122409599,0,2130640896,-3941377,-8460289,0,0,-16880386,
940637820,0,0,2097025080,268467256,0,1572864,-404276164,406644504,0,1572864,-50050,406617624,0,0,406585344,
15384,0,-1,-406585345,-15385,-1,0,1715601468,1006649958,0,-1,-1715601469,-1006649959,-1,504233984,2026641970,
-864498484,0,1013317632,1715234406,404232318,0,1060306944,808468272,-253742992,0,2137194496,1667465059,-404331673,49152,1572864,1021778139,
404241627,0,-1059061632,-17239816,-1065291552,0,101580802,-29483458,100802062,0,406585344,404258328,402685500,0,1717960704,1717986918,
1717986816,0,2145058816,2065423323,454761243,0,-966786948,-960087956,214330424,31744,0,0,-16843010,0,406585344,404258328,
410943036,0,406585344,404258328,404232216,0,404226048,404232216,1008212094,0,0,217972760,3096,0,0,1627258928,
24624,0,0,-1061158912,49406,0,0,1828585512,27688,0,0,947654712,-33522434,0,0,2088566526,
268449848,0,0,0,0,0,406585344,404241468,404232192,0,1717960806,9216,0,0,7077888,1819045118,
1819045118,0,2093357080,2080817856,-964950394,6168,0,202949318,-964284320,0,946601984,1994157112,-864629556,0,808452144,24576,
0,0,202899456,808464432,403451952,0,806879232,202116108,405801996,0,0,1023344742,15462,0,0,410910744,
6168,0,0,0,404226072,12288,0,16646144,0,0,0,0,404226048,0,0,202899974,
-1065340832,0,946601984,-690567482,1815660230,0,406323200,404256792,410916888,0,2093350912,405800460,-956407616,0,2093350912,1007027718,
-964950522,0,203161600,-855753620,203295756,0,-20971520,-66666304,-964950522,0,945815552,-54083392,-964901178,0,-20578304,202900998,
808464432,0,2093350912,2093401798,-964901178,0,2093350912,2114373318,209192454,0,0,6168,402653208,0,0,6168,
405798936,0,393216,811600920,201732120,0,0,126,32256,0,6291456,201732120,811600920,0,2093350912,404276748,
404232192,0,8126464,-555825466,-1065558308,0,272105472,-956404538,-960051514,0,-60424192,2087085670,1727817318,0,1013317632,-1061109056,
1715257538,0,-127139840,1717986918,1828218470,0,-26869760,2020106856,1727946850,0,-26869760,2020106856,1626366048,0,1013317632,-1059142976,
1715128006,0,-960102400,-20527418,-960051514,0,1008205824,404232216,406591512,0,504102912,202116108,-864498484,0,-429522944,2021156460,
1726377062,0,-262144000,1616928864,1727946850,0,-957480960,-691601666,-960051514,0,-958005248,-556861698,-960051514,0,2093350912,-960051514,
-964901178,0,-60424192,2086692454,1626366048,0,2093350912,-960051514,-562247978,3086,-60424192,2087478886,1726375526,0,2093350912,940361312,
-964950330,0,2122186752,404249112,406591512,0,-960102400,-960051514,-964901178,0,-960102400,-960051514,940623468,0,-960102400,-690567482,
-294856962,0,-960102400,943221884,-960070548,0,1717960704,1008232038,406591512,0,-20578304,405833228,-956407614,0,1009778688,808464432,
809250864,0,8388608,1882767584,100801550,0,1007419392,202116108,205261836,0,1824919608,0,0,0,0,0,
0,255,402665520,0,0,0,0,209453176,-864629556,0,-530579456,1818648696,1719428710,0,0,-960495492,
-964902720,0,470548480,1825311804,-864629556,0,0,-956432260,-964902720,0,946601984,-262118304,1626366048,0,0,-859045770,
-864236340,2013269196,-530579456,1986420844,1726375526,0,404226048,404226104,406591512,0,101056512,101056526,101058054,1006659174,-530579456,1819828326,
1726380140,0,941096960,404232216,406591512,0,0,-19529492,-691611946,0,0,1717960924,1717986918,0,0,-960102276,
-964901178,0,0,1717960924,1719428710,-268410784,0,-859045770,-864236340,503319564,0,1986396380,1626366048,0,0,-966786948,
-964937716,0,271581184,808464636,907817008,0,0,-859045684,-864629556,0,0,1717960806,1008232038,0,0,-959053626,
-26421546,0,0,1815609542,1824929848,0,0,-960102202,-964770106,-134216180,0,-870842114,-956420000,0,236453888,1880627224,
403576856,0,404226048,1579032,404232216,0,1880621056,236460056,409999384,0,1994129408,0,0,0,0,1824919608,
-33503546,0,1013317632,-1061109056,1007469158,1660,-872415232,-859045684,-864629556,0,405798924,-956432260,-964902720,0,946602000,209453176,
-864629556,0,-872415232,209453176,-864629556,0,806879328,209453176,-864629556,0,1815609400,209453176,-864629556,0,0,1616919654,
201745980,15360,946602000,-956432260,-964902720,0,-973078528,-956432260,-964902720,0,806879328,-956432260,-964902720,0,1711276032,404226104,
406591512,0,1013317656,404226104,406591512,0,806879328,404226104,406591512,0,1048774,-960087956,-960037178,0,939538540,-960087956,
-960037178,0,1610618928,1618804326,1727946848,0,0,1983250636,-663847208,0,1047265280,-20132660,-858862388,0,946602000,-960102276,
-964901178,0,-973078528,-960102276,-964901178,0,806879328,-960102276,-964901178,0,2026635312,-859045684,-864629556,0,806879328,-859045684,
-864629556,0,-973078528,-960102202,-964770106,2013267468,8126662,-960051514,-964901178,0,12976326,-960051514,-964901178,0,406585368,1616930400,
404252220,0,1818492984,1616929008,-419667872,0,1717960704,2115517464,404258328,0,-859045640,-857802556,-859386676,0,454557710,2115508248,
404232216,55408,811597848,209453176,-864629556,0,405798924,404226104,406591512,0,811597848,-960102276,-964901178,0,811597848,-859045684,
-864629556,0,1994129408,1717960924,1717986918,0,13006556,-18946314,-960049466,0,1819017276,2113945088,0,0,1819017272,2080389120,
0,0,808452096,811597872,-964902714,0,0,-20971520,-1073692480,0,0,-33161216,100664838,0,-1061027648,405849804,
-2046009124,6206,-1061027648,405849804,-1640077618,1542,404226048,404226072,1008221244,0,0,1826095158,27702,0,0,1815478488,
27864,0,289673540,289673540,289673540,289673540,1437226410,1437226410,1437226410,1437226410,-579347081,-579347081,-579347081,-579347081,404232216,404232216,
404232216,404232216,404232216,418912280,404232216,404232216,404232216,418912504,404232216,404232216,909522486,922105398,909522486,909522486,0,16646144,
909522486,909522486,0,418906360,404232216,404232216,909522486,116799222,909522486,909522486,909522486,909522486,909522486,909522486,0,116785406,
909522486,909522486,909522486,117323510,0,0,909522486,922629686,0,0,404232216,418912504,0,0,0,16252928,
404232216,404232216,404232216,404690968,0,0,404232216,419371032,0,0,0,16711680,404232216,404232216,404232216,404690968,
404232216,404232216,0,16711680,0,0,404232216,419371032,404232216,404232216,404232216,404690975,404232216,404232216,909522486,909588022,
909522486,909522486,909522486,809449015,0,0,0,808910911,909522486,909522486,909522486,16725751,0,0,0,16187647,
909522486,909522486,909522486,808924727,909522486,909522486,0,16711935,0,0,909522486,16201463,909522486,909522486,404232216,16718079,
0,0,909522486,922695222,0,0,0,16711935,404232216,404232216,0,16711680,909522486,909522486,909522486,910112310,
0,0,404232216,404690975,0,0,0,404684831,404232216,404232216,0,4128768,909522486,909522486,909522486,922695222,
909522486,909522486,404232216,419371263,404232216,404232216,404232216,418912280,0,0,0,2031616,404232216,404232216,-1,-1,
-1,-1,0,16711680,-1,-1,-252645136,-252645136,-252645136,-252645136,252645135,252645135,252645135,252645135,-1,-16711681,
0,0,0,-589823882,-596191016,0,2026635264,-657666868,-959658298,0,-20578304,-1061108032,-1061109568,0,0,1819082348,
1819044972,0,16646144,806930016,-956420000,0,0,-656932738,-663693096,0,0,1717986918,1616930428,49152,0,404256476,
404232216,0,8257536,1717966908,410936892,0,3670016,-956404538,1815660230,0,946601984,-965949754,1827564652,0,506462208,1046878220,
1715234406,0,0,-606404482,56190,0,196608,-606402946,1623257982,0,472907776,2086690912,807166048,0,8126464,-960051514,
-960051514,0,0,16711168,-33554432,0,0,2115508248,16717824,0,3145728,101455884,8263728,0,786432,1613764656,
8263692,0,236650496,404232984,404232216,404232216,404232216,404232216,-663693096,0,0,8263704,402653208,0,0,-603979658,
30428,0,1819017272,14336,0,0,0,1572864,6144,0,0,0,6144,0,202113039,216796172,
1008495724,0,1819017432,1811967084,0,0,-667942800,-134192952,0,0,0,2088533116,2080406652,0,0,0,
0,0,7424,610664448,604045158,0,48,-1010615194,-1010574373,26172,1291845632,-402718525,-1010565157,-1023360061,5505024,-2424832,
404265240,406591512,0,12801536,-1010580541,1715258307,6144,87,-1010580541,-603995173,26214,1476395008,-1016725309,406600728,-1023383869,5832704,
-1010630656,1008255846,406591512,0,16734720,202949510,-1044172704,65280,109,15073280,-606339109,56283,1979711488,0,-1010580541,402679356,
7798784,0,-1010630461,-10036261,0,30720,-1016725504,1013333016,49920,145,7208960,2128100123,56439,-1694498816,2126714904,-1060912960,
402685464,10289152,-1016725504,-15188968,404291352,0,-60383744,1650878076,1717989222,62208,12583083,-959659838,1624119344,203397894,-1409286144,-1027161920,
812043288,1040633494,1536,0,0,0,0,-1518240127,-1719565891,32256,2130640896,-3941377,2113988607,0,-16908180,2084110078,
4096,1048576,-25413508,14352,0,1021777980,404285415,15360,406585344,-8487169,1006639128,0,1572864,402668604,0,-1,
-1010565145,-6145,65535,1013317632,1715225154,0,-1,-1111637095,-26173,65535,439492110,-859014964,30720,1013317632,1008232038,402685464,
0,1060126515,1894789168,57344,2137194496,1667465059,-423598105,0,-616818664,-619124932,6144,-2134900736,-17243912,-2147426112,0,238944774,
235339326,512,406585344,404258328,402685500,0,1717986918,6710886,26112,2145058816,2065423323,452991771,8126464,946652768,1815660230,2080378054,
0,0,-33489154,0,2115508284,2117867544,6270,406585344,404258328,402659352,0,404232216,2117867544,6144,0,-32761844,
6144,0,811597824,805371488,0,0,-1061158720,65024,0,678166528,671153772,0,1048576,2088515640,65278,0,
-25427714,940604472,0,0,0,0,0,1010571324,1579032,6144,1717960806,9216,0,0,-26448788,-26448788,
27648,2093357080,2080817856,2081982150,6144,-1027211264,811994136,50688,946601984,1994157112,1979763916,3145728,1610625072,0,0,202899456,
808464432,201338904,0,202125336,202902540,12288,0,-12818884,26112,0,404226048,402685464,0,0,0,405805080,
0,0,65024,0,0,0,402653208,0,202899974,-1065340832,0,2093350912,-152645922,2080425670,0,2014844984,
404232216,32256,2093350912,405800460,-33529658,0,101088454,113654790,31744,203161600,-855753620,503319564,0,-1061093696,113703942,31744,
945815552,-54083392,2080425670,0,101514950,808458288,12288,2093350912,2093401798,2080425670,0,-960070458,101481990,30720,1572864,6144,
6168,0,402653208,404226048,12288,101449728,1613764656,100669452,0,8257536,2113929216,0,1613758464,101455884,1610618928,0,
-972260154,1579032,6144,2093350912,-555825442,2080431296,0,1824919608,-960051458,50688,-60424192,2087085670,-67082650,0,-1027589018,-1033453376,
15360,-127139840,1717986918,-134191508,0,1651048038,1650882664,65024,-26869760,2020106856,-268410784,0,-1027589018,-966344482,14848,-960102400,
-20527418,-973027642,0,404241432,404232216,15360,504102912,202116108,2013318348,0,1819076198,1818654828,58880,-262144000,1616928864,-33529242,
0,-16857362,-960047418,50688,-958005248,-556861698,-973027642,0,-960087956,-965949754,14336,-60424192,2086692454,-268410784,0,-960070458,
-562247978,3086,-60424192,2087478886,-436181402,0,-966755130,-960088052,31744,2122186752,404249112,1006639128,0,-960051514,-960051514,31744,
-960102400,-960051514,268463160,0,-960051514,-25372970,27648,-960102400,943221816,-973050682,0,1717986918,404241432,15360,-20578304,811633688,
-33504570,0,808467504,808464432,15360,-2134900736,941416560,33558022,0,202128396,202116108,15360,1824919608,0,0,0,
0,0,-16777216,402665520,0,0,0,7864320,-859042692,30208,-530579456,1818648696,2080400998,0,8126464,-1060714816,
31744,470548480,1825311804,1979763916,0,8126464,-1060714754,31744,946601984,-262118304,-268410784,0,7733248,-864236340,2013269196,-530579456,
1986420844,-436181402,0,3676184,404232216,15360,101056512,101056526,1717962246,15360,1617354848,1818651768,58880,941096960,404232216,1006639128,
0,15466496,-690553130,50688,0,1717960924,1711302246,0,8126464,-960051514,31744,0,1717960924,1616930428,61440,7733248,
-864236340,503319564,0,1986396380,-268410784,0,8126464,482788976,31744,271581184,808464636,469774390,0,13369344,-858993460,30208,
0,1717960806,402679356,0,12976128,-687946026,27648,0,1815609542,-973064084,0,12976128,-964770106,-134216180,0,-870842114,
-33542042,0,404229656,404254744,3584,404226048,1579032,402659352,0,404254744,404229656,28672,1994129408,0,0,0,
272105472,-956404538,0,1013317632,-1060977984,201745980,31744,13421772,-858993460,30208,405798924,-956432260,2080424134,1048576,7878764,-859042692,
30208,-859045888,209453176,1979763916,6291456,7876632,-859042692,30208,1815609400,209453176,1979763916,0,1013317632,1007444070,1596,946602000,
-956432260,2080424134,0,8178892,-1060714754,31744,806879328,-956432260,2080424134,0,3696230,404232216,15360,1013317656,404226104,1006639128,
6291456,3682328,404232216,15360,-972029754,-960087956,-973013306,946601984,946616320,-20527418,50688,1610618928,1618804326,-33529754,0,-864681984,
-656918914,28160,1047265280,-20132660,-838808372,1048576,8140908,-960051514,31744,-960102400,-960102276,2080425670,6291456,8138776,-960051514,31744,
2026635312,-859045684,1979763916,6291456,13381656,-858993460,30208,-960102400,-960102202,101500542,13006848,1824966200,-965949754,14336,-973078330,-960051514,
2080425670,1572864,1717573692,1008230502,6144,1818492984,1616929008,-67084058,0,1008232038,2115534360,6144,-859045640,-857802556,-973026100,917504,
404232984,404258328,1879054552,811597848,209453176,1979763916,786432,3676208,404232216,15360,811597848,-960102276,2080425670,1572864,13381728,-858993460,
30208,1994129408,1717960924,1711302246,1994129408,-420085562,-825819426,50688,1819017276,2113945088,0,3670016,939551852,31744,0,808452096,
811597872,2080425670,0,0,-1061093696,0,0,-33161216,1542,12582912,-858210106,-595185568,1040190488,-1060765504,812043480,1040633502,
1536,1579032,1010571324,6144,0,-663996820,13824,0,-664010752,-671074708,0,289673540,289673540,289673540,1437208900,1437226410,
1437226410,1437226410,-579347081,-579347081,-579347081,404282743,404232216,404232216,404232216,404232216,418912280,404232216,404232216,418912280,404232440,404232216,
909522486,922105398,909522486,13878,0,909508862,909522486,0,418906360,404232216,909514776,922105398,909510390,909522486,909522486,909522486,
909522486,13878,16646144,909510390,909522486,909522486,117323510,0,909508608,909522486,14078,0,404232216,418912504,0,0,
0,404226296,404232216,404232216,404690968,0,404226048,404232216,6399,0,0,16711680,404232216,404232216,404232216,404232223,
404232216,0,16711680,0,404226048,404232216,404232447,404232216,404232216,404690975,404232216,909514776,909522486,909522487,909522486,909522486,
809449015,0,0,4128768,909520951,909522486,909522486,16725751,0,0,16711680,909508855,909522486,909522486,808924727,909522486,
13878,16711680,255,0,909522486,16201463,909522486,404239926,419371032,255,0,909522486,922695222,0,0,16711680,
404226303,404232216,0,16711680,909522486,909522486,909522486,13887,0,404232216,404690975,0,0,2031616,404232223,404232216,
0,4128768,909522486,909522486,909522486,909522687,909522486,404232216,419371263,404232216,404232216,404232216,6392,0,0,2031616,
404232216,-59368,-1,-1,-1,0,16711680,-1,-252641281,-252645136,-252645136,-252645136,252645135,252645135,252645135,-61681,
-1,65280,0,0,-589823882,1979767004,0,2093350912,-956498746,1073791168,-20578304,-1061108032,-1073692480,0,-26476544,1819044972,
27648,-20578304,405823536,-33529658,0,8257536,-656877352,28672,0,1717986918,1623227488,0,1994129408,404232216,6144,2115502080,
1717976166,2113944600,0,-960087956,-965935418,14336,946601984,-965949754,-301962132,0,403447344,1717976678,15360,0,-606404482,32256,
0,2128282374,2120276979,49152,472907776,2086690912,469786672,0,-960102276,-960051514,50688,16646144,-33554432,254,0,410910744,
6168,65280,806879232,202902534,2113941504,0,811600920,201338904,32256,236650496,404232984,404232216,404232216,404232216,-656926696,28672,
1572864,2113935360,6168,0,1994129408,-603979658,0,1819017272,14336,0,0,0,6168,0,0,1572864,
0,983040,202116108,1815874796,7168,1819017432,1811967084,0,7340032,1623775280,63488,0,0,2088533116,31868,0,
0,0,0,7424,1727987748,26148,2228224,1667432547,8704,0,721420288,404226048,404232447,6144,45,0,
65280,0,12799232,-607918081,-1010580541,5505024,-2424832,404265240,1006639128,1442840576,-1010630461,-1016675389,15384,87,-1010580541,-10036261,
26112,12802048,1008255846,-1010615194,5832704,-1010630656,1008255846,1006639128,1509949440,-1014628097,811666456,50175,109,15073280,-606339109,56064,
30208,-1010630656,1008255846,7798784,0,-1009057597,1711332351,-1862270976,7208960,2128100123,56439,1573019,-1010820994,2115551427,6144,12819712,
419391036,404232447,10354688,1717960956,1718582370,-218077594,-251658240,404226072,404291352,255,246,6168,1638144,6144,0,0,
2122383360,-1114004095,2130674046,-1008215041,1828650878,2084110078,272109568,2084076798,947654656,-25413378,269498492,-25413508,14460,1008212028,-65536,-1008212029,
3997695,1114007106,-3982336,-1114007107,252167167,-859041923,1013369976,1008232038,1060339224,812662576,2137256160,1667727203,-1722095936,-415482649,-2132780391,-119473922,
34504704,1041121022,406585856,410943000,1717976088,1711302246,2145084928,454810491,1046682368,1815623788,52344,2122186752,406617600,2117893656,406591743,404258328,
404232192,2117867544,1579008,202902782,3145728,1613783294,0,-1057046336,2359296,1713661695,1572864,-50050,16711680,1008271230,0,0,
813170688,805337136,1819029504,27648,1819017216,-26411412,813460480,217628792,12988416,812043288,946652672,-590595978,1616934400,49152,405798912,1613783136,
1613764608,405805080,6709248,1013333247,3145728,808464636,0,3145728,12384,252,0,3145728,101462016,1623201840,2093383680,-152645922,
812678144,808464432,2026699776,1623985208,2026699776,214699064,473724928,-32740148,-54518272,214759436,945846272,-858996488,-53708800,808455192,2026647552,-858993544,
2026665984,202951804,3174400,3158016,3158016,3158016,405811296,1613783232,6144,16579584,1613758464,405805068,2026659840,805309464,2093363200,-557785378,
813201408,-53687092,-60371968,1717986940,1013382144,-1067007808,-127124480,1718380134,-27068416,1751279736,-27066880,1751148664,1013379072,-832126784,-859030016,-858993412,
2016463872,808464432,504133632,-859042804,-429492224,1818651768,-262085120,1650876512,-957415936,-691601666,-957954560,-825821474,946652672,-965949754,-60409856,1616930428,
2026696704,-596063028,-60417024,1818650236,2026694144,483188848,-55281664,808464432,-859015168,-858993460,-858981376,-864498484,-960090112,-17905962,-960051712,946629688,
-858995200,808504440,-20547584,845581336,2019622400,1616928864,-1067419648,201732120,2014839296,404232216,272136192,27846,0,0,808452351,6144,
0,2093774860,-530549248,1717985404,56320,-1060341556,470579200,-859042692,30208,-54495028,946632704,1616929008,61440,-864258356,-530576136,1717988470,
805365248,808480816,201357312,214699020,-530527112,2020370028,1882252800,808464432,30720,-19477250,50688,-858982196,52224,-859014964,30720,1719458918,
24816,-864258356,3102,1717623926,61440,2014084288,271644672,808746032,6144,-858993460,30208,-864498484,12288,-16857386,27648,946652780,
50688,-864236340,3320,811924632,472972288,808464608,404233216,404232192,-533719040,808464412,1994186752,0,1048576,-960087956,2026700288,2014888140,
13372536,-859045684,469794304,-54495028,2126739456,1046887430,-872399104,2093774860,-536838656,2093774860,808484352,2093774860,32256,-1065846592,2126711864,2120236134,
-872399872,-54495028,-536840192,-54495028,-872384512,808480816,2093381632,404240408,-536855552,808480816,-969377792,-20550458,808502784,-855900040,469814272,2019621984,
64512,2144108300,1047297792,-858993410,2026688000,-859045768,13400064,-859045768,14710784,-859045768,2026665984,-859045684,14712320,-859045684,13401600,-864288564,
-1021833992,1715223654,-872409088,-858993460,404256768,-1065451840,946608152,1625711856,-858981376,821852412,-120836048,-959460102,236701383,404232252,469817456,2093774860,
939556352,808480816,1865728,-859045768,1865728,-859045684,16285184,-859045640,-67056640,-52638484,1013763072,8285246,946601984,8154168,805306368,-1060360096,
30720,-1061158660,0,202113276,-1010434048,862375134,-1010381809,930073819,404279043,404226072,3348480,1714644684,13369344,1724671539,579338240,579347080,
1437213320,1437226410,-612936278,-612901906,404282350,404232216,404232216,-132638696,404232216,-132581352,909514776,-164219338,13878,-30015488,13878,-132581352,
909514776,-164170234,909522486,909522486,13878,-164168186,909522486,-33491450,909508608,-33540554,404226048,-134154216,0,-132644864,404232216,520099864,
404226048,-16771048,0,-15204352,404232216,521672728,6168,-16777216,404226048,-15198184,404232216,521674520,909514776,926299702,909522486,1056978736,
0,926302000,909522486,-16713984,0,-147390720,909522486,926299952,13878,-16711936,909508608,-147392768,404239926,-16711936,909508608,-16763338,
0,-15139072,6168,-13238272,909522486,1056978486,404226048,520101656,0,521674520,6168,1060503552,909522486,-13224394,404239926,-15139048,
404232216,-134211560,0,521666560,-59368,-1,65535,-65536,-252641281,-252645136,252702960,252645135,-61681,65535,0,-925075748,
7894528,-856109832,16564416,-1061106496,16695296,1819044972,-53711872,1624006704,64512,-656900392,6713344,1719428710,7758016,404282392,-63956992,-864519988,
946614524,-965949698,946616320,1819068102,472968704,-859039620,30720,-612466981,101449728,-612466981,945840320,-1067400968,2026649600,-858993460,16567296,16515324,
808452096,805370928,1613822976,1610618928,405863424,402677808,236715008,404232984,404232216,416815128,808507504,3145980,7745536,1994185728,946601984,27704,
0,402653208,0,402653184,252444672,-328463348,2020359196,1811967084,1880621056,2013278304,0,1010580540,0,0,-1207500800,243728522,
-1056440074,-1949666295,-1207946286,1082147051,-1964383904,-756174587,1387986629,-1341731325,-333124030,47320241,-1825642344,1482263183,988386138,-1964411390,-1735685435,-758003149,
-925775663,-925775663,-757997359,-766254895,1275104030,1534397403,117441976,-147395821,-1949217792,1946749888,117459005,-1207470589,-2033975101,-2114258194,1946271747,-991018362,
-88015999,21627764,-1946631280,-1735685433,642570487,-791609205,-1622088821,1241514145,855635687,-773848125,-1748827198,-1966634276,-880043894,642570487,-254738293,-1622088821,
-2063597407,854456039,225739001,198250359,125954163,545322496,-773786240,-773795360,-1949249056,-773795360,855573442,326467833,-523171119,-472784687,-478092335,1929574662,
63164899,-2015820816,508609424,-1898433600,-14788452,532889600,-1961471408,-167353600,141920000,-1039790973,549121200,-286539773,-1039922045,827493,-1570436882,1522729048,
-1961471408,-167353600,141920000,-1039790973,-1061491662,-286539773,-1039922045,2400357,-1570375698,1522729048,-1161539502,32375728,203440876,-1342076192,1515735791,1347601296,
61913796,1122763246,-1965021985,1257222145,-1013949864,125260604,71052660,905315191,1050249,-790072309,-182699005,401276932,512238474,-485556096,158630139,-83688064,
68384018,1007676174,1007710730,67270404,67758850,-88450109,-1342160128,1073802938,-521343862,-71072060,-13899541,-1359559875,-387857520,-655818869,1945890559,-1013914892,
12106258,-135059404,-88437800,-1330232576,1107357370,-292910141,-71645970,-333160192,65994252,-4527925,-333160192,-1013908242,-1004659194,-387733504,67156712,-1013971169,
137268534,138317118,1007138064,1949071202,2002533379,-167365633,276138240,910962829,243941301,8392328,-2131107569,511707508,1947859203,2051968310,-351161080,-1996425722,
177016949,1066219084,1303723596,-1576923416,15263953,-389153280,-1006566666,-1585089479,646185098,-997523202,15208032,-349724981,2051968310,1947221011,1913404431,1279233334,
1979989008,137268534,-1898368055,201427254,234982414,29616257,33687556,7661659,-160165366,-885387522,150918005,-210384326,-826080514,7661635,1409292520,-297619454,
-923865858,65948336,-20430100,-397808054,-400228157,565182580,1122765294,-2139862360,616503106,-1340936630,-318837182,-531971958,-297619432,-297104700,1347601296,1073749688,
-1961455912,-2084412672,-1472198932,1489182554,-297619439,2146364452,-1341044029,-334696894,1254326510,1397890566,853248765,-1899940919,906765961,-1945239258,-1191178751,-770834125,
1407721303,1532958721,1946356735,22734939,532896519,1397890566,106148864,2131240644,199199939,-1948289961,1863001738,-9142019,988302403,868840946,1292510858,-2012283191,
646611968,243600777,-383385462,19302989,69634901,103204213,42699645,-16721535,302645621,238279541,-1054422642,201427254,504243852,-806878837,-2134072320,119931227,
270976095,109888639,-545996021,-551139701,125864559,1950088703,-394968262,-920194509,990808589,1965786368,646613737,869420289,1963140805,25935616,-613033718,-913437133,
-1992900314,646712321,25894414,1308676072,39485644,532896519,1397890566,2131502788,199199939,848033908,-1972379866,-33618048,1127904295,-232331147,-20346355,-2080339954,
1291921035,-2063562482,1963140804,-1898368055,201427254,234982406,1527249242,1354244035,-1900019552,-1735947581,47438257,-992950062,-729356080,231982257,97771697,-1031020029,
-645465977,-880746498,-20716769,-1205849345,-1022689237,273271156,1099379437,-873215349,-125328381,-195507486,1354285968,-1900019552,-1733195069,-925760813,-388971312,-994978682,
-527757869,-813641474,-20453601,719303456,-1408595977,405979252,-89004917,-536672813,-1070401486,-806097526,-873225078,-480728341,1347535760,-1161524534,45351856,-1341913873,
-272976890,-1341796861,-273632256,82773684,-1274892284,-779882614,-323304954,851492867,-782635382,1347508419,-1161524534,45351856,-1341914129,-272976894,-1341796861,-273632240,
251004596,132743,-1274383358,78966704,-1966014225,116163522,61913792,-1966006034,-1023387304,1384863313,-1006380358,11843844,15663536,-395332607,-1039990342,-1161515794,
61866932,-1949105937,-38147963,853809408,32041045,-398909699,-971965053,1526594280,-2084408301,-1862662405,141946024,-1862600453,141880488,-1073481542,-290672624,-1273827770,
1861922024,-1394035693,-71669510,-1190539773,-454557646,-1949101567,103973826,-85147410,62175936,-1058532302,-387233542,1515846395,1364352707,-1931979234,-167342375,141920512,
-1898434530,109282242,-85146082,62503616,853807104,4647133,300461236,-20179718,16509151,61913798,535363566,-399964160,1582956575,513825219,-1978251008,-1321170688,
-401623808,-773784680,780897240,42776324,-668022642,1040383895,503717827,-1996453330,9085317,1224794272,1660979990,-1476344522,80069756,-982223856,-620033396,1720442484,
1326767754,-9142023,986209347,-55806477,1946749632,-1272940286,-1340801332,-1039732861,-1073484614,61703110,1948781504,-1383429432,1455808542,-2130955092,233312372,-398363399,
-989986562,-290666123,-395968828,-857146882,1579102208,-1391752491,176865396,-1964455763,-397294284,532873223,-398067028,-991757826,-1013909253,-398853460,100727272,-487194940,
-1933313085,1946815455,-2132571428,-14278862,-1013938175,-491062134,-1966749693,-922489158,-234836760,108328644,570491880,33482841,-915028482,-58006845,-939269446,-289764667,
-1400190717,-1963403092,-1007244154,1946403846,15263995,-20631039,1977482953,-58014832,162914993,134226111,59423432,-1161181714,76153738,-1973650416,-1006237450,-389188605,
67174632,1179647685,-1089964578,-939327302,-289764667,-1979397885,-125138308,-154903544,65537652,-387995648,-985267970,-557887627,-1161295872,-974257270,59423433,2096628874,
-252278180,1946403846,15263875,-20596224,1977501263,1972240073,61913800,-1161228050,268436409,-602829514,-125129590,-1744774936,-1161239818,15598512,62503625,-1925836800,
-1394029551,-154923008,65537652,-394838016,-272432926,1384825744,562092068,-789847074,772420351,42633080,-486287232,-1752682870,-389020976,-662640502,780854019,47232904,
-393549616,-1970808786,-1948612606,1381391043,-164407501,-1160904880,-136164200,334627832,-1752516086,-136132712,334627832,478853673,-136133736,332792775,-2083335712,-1966997416,
-1965389062,1522753374,-352257298,-286553401,-1007812470,-1085,-1,-1,-1,-1,-334364673,2052225614,-16744447,-16711936,1131413248,1919512697,
1948280680,1297105743,541278545,1886744429,1914729573,1919959919,1635020658,1848404335,959979569,540095020,858536248,959979569,540095532,892090680,959979569,540096044,
925645112,959979569,5388320,709908307,709774913,709120066,709052995,708919618,704662604,1126192692,1129263157,1095847248,-57089,892337968,792211768,-5555969,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]
}Compaq Video Graphics Controller (VGA) --- This is the Compaq Video Graphics Controller Board, one of the earliest VGA boards Compaq released for its DeskPro 386 line.  It was featured in the February 16, 1988 of PC Magazine (p.188). At that time, it retailed for $599, and it was described as "the sharpest, fastest IBM-standard video board you can slide into your PC." The article goes on to say: > The Compaq [Video Graphics Controller Board] is the first truly hardware-compatible VGA board with register-level support for all 17 video modes. It's also the first video board from a major manufacturer that uses a full 16-bit interface.... > Per the VGA standard, Compaq's board offers 640- by 480-pixel all-points-addressable graphics resolution in 16 colors, as well as 256 colors from a palette of 262,144 at 320- by 200-pixel resolution. > Based on a Paradise Systems VLSI VGA chip and an Inmos DAC, the board includes 256K RAM soldered to it. Relying on surface-mounted components for just about everything except its BIOS and the aforementioned chips, the entire board is just 9 inches long and XT height. Although it will function in an 8-bit expansion slot, it achieves its top speed only when its 16-bit interface is put into play. > The card-retaining bracket of the board holds only the female DB-15 of the IBM VGA system. This connector, coupled with the analog output of the board, means that the [board] will function only with VGA-style monitors. > An extra edge connector at the top of the board matches the video expansion available on the IBM PS/2 Display Adapter card, electrically but not physically compatible with the VGA Feature Connector of PS/2 computers. > To your system, the board looks like an EGA adapter--that is, you run the appropriate setup procedure for setting CMOS memory as if it were an EGA card. The two jumpers on the board (its only hardware adjustments) alter its base address for matchng unusual systems and ordinarily require no change. > In testing, the Compaq Board proved itself functionally compatible with the IBM PS/2 Display Adapter but faster, because of its 16-bit interface. On an ordinary AT, it nearly achieved the display speeds of the internal VGA system of a stock PS/2 (which has a clock speed advantage over the AT). > Although Compaq claims that this board is designed specifically for its own machines, particularly the DeskPro 386/20, it works great with non-Compaq machines as well. In fact, with this board, Compaq gives you a way of getting the sharpest and fastest graphics without abandoning your commitment to the PC standard. As such, this board is in perfect accord with the Compaq philosophy, and it may be the best way available for mating a VGA-style monitor and VGA graphics to your AT. A copy of the board's [VGA ROM BIOS](109360-001/1988-05-18.json) was created by [dumping](/devices/pc/bios/compaq/deskpro386/#dumping-the-roms) the contents of each EPROM chip to a *.hex* file, and then merging the *.hex* files with the following [FileDump](/modules/filedump/) command: cd 109360-001 filedump --file=109793-002.hex --merge=109794-002.hex --output=1988-05-18.json For a more human-readable dump, use the `--comments` option: filedump --file=109793-002.hex --merge=109794-002.hex --output=1988-05-18.dump --comments And for those who want a binary file, the FileDump API can be used to recreate binary data from JSON data: > [http://www.pcjs.org/api/v1/dump?file=http://www.pcjs.org/devices/pc/video/compaq/vga/109360-001/1988-05-18.json&format=rom](http://www.pcjs.org/api/v1/dump?file=http://www.pcjs.org/devices/pc/video/compaq/vga/109360-001/1988-05-18.json&format=rom) The Compaq VGA ROM BIOS concludes with the usual copyright string and author initials: Copyright COMPAQ Computer Corporation, 1982, 1983, 1984, 1985, 1986, 1987, 1988 RWS*PNA*NPB*DJC*CAB*ALL* V4C 05COMPAQ 05/18/88 Four of the authors -- **RWS**, **NPB**, **DJC**, and **CAB** -- are also listed as authors of the [DeskPro 386 ROM BIOS](/devices/pc/bios/compaq/deskpro386/). An older version of the VGA ROM BIOS, [1987-10-27.json](109360-001/1987-10-27.json), is also available online. It comes from an [earlier revision](http://bitsavers.trailing-edge.com/pdf/compaq/firmware/109360-001_VGA/) of the same board, with the same part number (109360-001). cd 109360-001 filedump --file=http://bitsavers.trailing-edge.com/pdf/compaq/firmware/109360-001_VGA/109328-002.BIN --merge=http://bitsavers.trailing-edge.com/pdf/compaq/firmware/109360-001_VGA/109327-002.BIN --output=1987-10-27.json
<?xml version="1.0" encoding="UTF-8"?> <video id="videoVGA" model="vga" screenwidth="640" screenheight="480" scale="true" autolock="true" pos="center" padding="8px"> <menu> <title>VGA Color Display</title> <control type="container" pos="right"> <control type="led" label="Caps" binding="caps-lock" padleft="8px"/> <control type="led" label="Num" binding="num-lock" padleft="8px"/> <control type="led" label="Scroll" binding="scroll-lock" padleft="8px"/> <control type="button" binding="fullScreen" padleft="8px">Full Screen</control> </control> </menu> </video>
<?xml version="1.0" encoding="UTF-8"?> <video id="videoCGA" screenwidth="960" screenheight="480" scale="true" charset="/devices/pc/video/ibm/cga/ibm-cga.json" touchscreen="true" pos="center" padding="8px"> <menu> <title>Color Display</title> <control type="container" pos="right"> <control type="led" label="Caps" binding="caps-lock" padleft="8px"/> <control type="led" label="Num" binding="num-lock" padleft="8px"/> <control type="led" label="Scroll" binding="scroll-lock" padleft="8px"/> </control> </menu> </video>
<?xml version="1.0" encoding="UTF-8"?> <video id="videoCGA" screenwidth="960" screenheight="480" scale="true" charset="/devices/pc/video/ibm/cga/ibm-cga.json" pos="center" padding="8px"> <menu> <title>Color Display</title> <control type="container" pos="right"> <control type="led" label="Caps" binding="caps-lock" padleft="8px"/> <control type="led" label="Num" binding="num-lock" padleft="8px"/> <control type="led" label="Scroll" binding="scroll-lock" padleft="8px"/> </control> </menu> </video>
<?xml version="1.0" encoding="UTF-8"?> <video id="videoCGA" model="cga" screenwidth="960" screenheight="480" scale="true" charset="/devices/pc/video/ibm/cga/ibm-cga.json" pos="center" padding="8px"> <menu> <title>Color Display</title> </menu> </video>
<?xml version="1.0" encoding="UTF-8"?> <video id="videoCGA" screenwidth="960" screenheight="480" scale="true" autolock="true" charset="/devices/pc/video/ibm/cga/ibm-cga.json" padding="8px"> <menu> <title>Color Display</title> <control type="container" pos="right"> <control type="led" label="Caps" binding="caps-lock" padleft="8px"/> <control type="led" label="Num" binding="num-lock" padleft="8px"/> <control type="led" label="Scroll" binding="scroll-lock" padleft="8px"/> <control type="button" binding="lockPointer" padleft="8px">Lock Pointer</control> <control type="button" binding="fullScreen" padleft="8px">Full Screen</control> </control> </menu> </video>
[0,0,0,0,0,0,0,0,0,0,126,129,165,129,129,189,0,0,126,255,219,255,255,195,0,0,0,54,127,127,127,127,0,0,0,8,28,62,127,62,0,0, 24,60,60,231,231,231,0,0,24,60,126,255,255,126,0,0,0,0,0,24,60,60,255,255,255,255,255,231,195,195,0,0,0,0,60,102,66,66,255, 255,255,255,195,153,189,189,0,0,15,7,13,25,60,102,0,0,60,102,102,102,60,24,0,0,63,51,63,48,48,48,0,0,127,99,127,99,99,99, 0,0,24,24,219,60,231,60,0,0,64,96,112,124,127,124,0,0,1,3,7,31,127,31,0,0,24,60,126,24,24,24,0,0,51,51,51,51,51,51,0,0,127, 219,219,219,123,27,0,62,99,48,28,54,99,99,0,0,0,0,0,0,0,0,0,0,24,60,126,24,24,24,0,0,24,60,126,24,24,24,0,0,24,24,24,24,24, 24,0,0,0,0,12,6,127,6,0,0,0,0,24,48,127,48,0,0,0,0,0,96,96,96,0,0,0,0,36,102,255,102,0,0,0,8,28,28,62,62,0,0,0,127,127,62, 62,28,0,0,0,0,0,0,0,0,0,0,24,60,60,60,24,24,0,99,99,99,34,0,0,0,0,0,54,54,127,54,54,54,12,12,62,99,97,96,62,3,0,0,0,0,97, 99,6,12,0,0,28,54,54,28,59,110,0,48,48,48,96,0,0,0,0,0,12,24,48,48,48,48,0,0,24,12,6,6,6,6,0,0,0,0,102,60,255,60,0,0,0,24, 24,24,255,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,1,3,6,12,24,48,0,0,62,99,103,111,123,115,0,0,12,28,60, 12,12,12,0,0,62,99,3,6,12,24,0,0,62,99,3,3,30,3,0,0,6,14,30,54,102,127,0,0,127,96,96,96,126,3,0,0,28,48,96,96,126,99,0,0, 127,99,3,6,12,24,0,0,62,99,99,99,62,99,0,0,62,99,99,99,63,3,0,0,0,24,24,0,0,0,0,0,0,24,24,0,0,0,0,0,6,12,24,48,96,48,0,0, 0,0,0,126,0,0,0,0,96,48,24,12,6,12,0,0,62,99,99,6,12,12,0,0,62,99,99,111,111,111,0,0,8,28,54,99,99,127,0,0,126,51,51,51,62, 51,0,0,30,51,97,96,96,96,0,0,124,54,51,51,51,51,0,0,127,51,49,52,60,52,0,0,127,51,49,52,60,52,0,0,30,51,97,96,96,111,0,0, 99,99,99,99,127,99,0,0,60,24,24,24,24,24,0,0,15,6,6,6,6,6,0,0,115,51,54,54,60,54,0,0,120,48,48,48,48,48,0,0,195,231,255,219, 195,195,0,0,99,115,123,127,111,103,0,0,28,54,99,99,99,99,0,0,126,51,51,51,62,48,0,0,62,99,99,99,99,107,0,0,126,51,51,51,62, 54,0,0,62,99,99,48,28,6,0,0,255,219,153,24,24,24,0,0,99,99,99,99,99,99,0,0,195,195,195,195,195,195,0,0,195,195,195,195,219, 219,0,0,195,195,102,60,24,60,0,0,195,195,195,102,60,24,0,0,255,195,134,12,24,48,0,0,60,48,48,48,48,48,0,0,64,96,112,56,28, 14,0,0,60,12,12,12,12,12,8,28,54,99,0,0,0,0,0,0,0,0,0,0,0,0,24,24,12,0,0,0,0,0,0,0,0,0,0,60,6,62,0,0,112,48,48,60,54,51,0, 0,0,0,0,62,99,96,0,0,14,6,6,30,54,102,0,0,0,0,0,62,99,127,0,0,28,54,50,48,124,48,0,0,0,0,0,59,102,102,0,0,112,48,48,54,59, 51,0,0,12,12,0,28,12,12,0,0,6,6,0,14,6,6,0,0,112,48,48,51,54,60,0,0,28,12,12,12,12,12,0,0,0,0,0,230,255,219,0,0,0,0,0,110, 51,51,0,0,0,0,0,62,99,99,0,0,0,0,0,110,51,51,0,0,0,0,0,59,102,102,0,0,0,0,0,110,59,51,0,0,0,0,0,62,99,56,0,0,8,24,24,126, 24,24,0,0,0,0,0,102,102,102,0,0,0,0,0,195,195,195,0,0,0,0,0,195,195,219,0,0,0,0,0,99,54,28,0,0,0,0,0,99,99,99,0,0,0,0,0,127, 102,12,0,0,14,24,24,24,112,24,0,0,24,24,24,24,0,24,0,0,112,24,24,24,14,24,0,0,59,110,0,0,0,0,0,0,0,0,8,28,54,99,0,0,30,51, 97,96,96,97,0,0,102,102,0,102,102,102,0,6,12,24,0,62,99,127,0,8,28,54,0,60,6,62,0,0,102,102,0,60,6,62,0,48,24,12,0,60,6,62, 0,28,54,28,0,60,6,62,0,0,0,0,60,102,96,102,0,8,28,54,0,62,99,127,0,0,102,102,0,62,99,127,0,48,24,12,0,62,99,127,0,0,102,102, 0,56,24,24,0,24,60,102,0,56,24,24,0,96,48,24,0,56,24,24,0,99,99,8,28,54,99,99,28,54,28,0,28,54,99,99,12,24,48,0,127,51,48, 62,0,0,0,0,110,59,27,126,0,0,31,54,102,102,127,102,0,8,28,54,0,62,99,99,0,0,99,99,0,62,99,99,0,48,24,12,0,62,99,99,0,24,60, 102,0,102,102,102,0,48,24,12,0,102,102,102,0,0,99,99,0,99,99,99,0,99,99,28,54,99,99,99,0,99,99,0,99,99,99,99,0,24,24,126, 195,192,192,195,0,28,54,50,48,120,48,48,0,0,195,102,60,24,255,24,0,252,102,102,124,98,102,111,0,14,27,24,24,24,126,24,0,12, 24,48,0,60,6,62,0,12,24,48,0,56,24,24,0,12,24,48,0,62,99,99,0,12,24,48,0,102,102,102,0,0,59,110,0,110,51,51,59,110,0,99,115, 123,127,111,0,60,108,108,62,0,126,0,0,56,108,108,56,0,124,0,0,0,24,24,0,24,24,48,0,0,0,0,0,0,127,96,0,0,0,0,0,0,127,3,0,96, 224,99,102,108,24,48,0,96,224,99,102,108,24,51,0,0,24,24,0,24,24,60,0,0,0,0,27,54,108,54,0,0,0,0,108,54,27,54,17,68,17,68, 17,68,17,68,85,170,85,170,85,170,85,170,221,119,221,119,221,119,221,119,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,248, 24,24,24,24,24,248,24,248,54,54,54,54,54,54,54,246,0,0,0,0,0,0,0,254,0,0,0,0,0,248,24,248,54,54,54,54,54,246,6,246,54,54, 54,54,54,54,54,54,0,0,0,0,0,254,6,246,54,54,54,54,54,246,6,254,54,54,54,54,54,54,54,254,24,24,24,24,24,248,24,248,0,0,0,0, 0,0,0,248,24,24,24,24,24,24,24,31,24,24,24,24,24,24,24,255,0,0,0,0,0,0,0,255,24,24,24,24,24,24,24,31,0,0,0,0,0,0,0,255,24, 24,24,24,24,24,24,255,24,24,24,24,24,31,24,31,54,54,54,54,54,54,54,55,54,54,54,54,54,55,48,63,0,0,0,0,0,63,48,55,54,54,54, 54,54,247,0,255,0,0,0,0,0,255,0,247,54,54,54,54,54,55,48,55,0,0,0,0,0,255,0,255,54,54,54,54,54,247,0,247,24,24,24,24,24,255, 0,255,54,54,54,54,54,54,54,255,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,255,54,54,54,54,54,54,54,63,24,24,24,24,24,31,24,31,0,0, 0,0,0,31,24,31,0,0,0,0,0,0,0,63,54,54,54,54,54,54,54,255,24,24,24,24,24,255,24,255,24,24,24,24,24,24,24,248,0,0,0,0,0,0,0, 31,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,255,240,240,240,240,240,240,240,240,15,15,15,15,15,15,15,15,255,255,255, 255,255,255,255,0,0,0,0,0,0,59,110,108,0,0,0,0,62,99,126,99,0,0,127,99,99,96,96,96,0,0,0,0,127,54,54,54,0,0,127,99,48,24, 12,24,0,0,0,0,0,63,108,108,0,0,0,0,51,51,51,51,0,0,0,0,59,110,12,12,0,0,126,24,60,102,102,102,0,0,28,54,99,99,127,99,0,0, 28,54,99,99,99,54,0,0,30,48,24,12,62,102,0,0,0,0,0,126,219,219,0,0,3,6,126,219,219,243,0,0,28,48,96,96,124,96,0,0,0,62,99, 99,99,99,0,0,0,127,0,0,127,0,0,0,24,24,24,255,24,24,0,0,48,24,12,6,12,24,0,0,12,24,48,96,48,24,0,0,14,27,27,24,24,24,24,24, 24,24,24,24,24,24,0,0,24,24,0,0,255,0,0,0,0,0,59,110,0,59,0,56,108,108,56,0,0,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,0,24,0,15,12, 12,12,12,12,236,0,216,108,108,108,108,108,0,0,112,216,48,96,200,248,0,0,0,0,0,62,62,62,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 153,129,126,0,0,0,0,0,231,255,126,0,0,0,0,0,62,28,8,0,0,0,0,0,28,8,0,0,0,0,0,0,24,24,60,0,0,0,0,0,24,24,60,0,0,0,0,0,24,0, 0,0,0,0,0,0,231,255,255,255,255,255,0,0,102,60,0,0,0,0,0,0,153,195,255,255,255,255,0,0,102,102,60,0,0,0,0,0,126,24,24,0,0, 0,0,0,112,240,224,0,0,0,0,0,103,231,230,192,0,0,0,0,219,24,24,0,0,0,0,0,112,96,64,0,0,0,0,0,7,3,1,0,0,0,0,0,126,60,24,0,0, 0,0,0,0,51,51,0,0,0,0,0,27,27,27,0,0,0,0,0,54,28,6,99,62,0,0,0,127,127,127,0,0,0,0,0,126,60,24,126,0,0,0,0,24,24,24,0,0,0, 0,0,126,60,24,0,0,0,0,0,12,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,36,0,0,0,0,0,0,0,127,127,0,0,0,0,0,0,28,8,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,0,0,0,0,0,0,0,127,54,54,0,0,0,0,0,67,99,62,12,12,0,0,0,24,51,99,0,0,0,0,0,102, 102,59,0,0,0,0,0,0,0,0,0,0,0,0,0,48,24,12,0,0,0,0,0,6,12,24,0,0,0,0,0,102,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,24,24,24,48,0,0, 0,0,0,0,0,0,0,0,0,0,0,24,24,0,0,0,0,0,96,64,0,0,0,0,0,0,99,99,62,0,0,0,0,0,12,12,63,0,0,0,0,0,48,99,127,0,0,0,0,0,3,99,62, 0,0,0,0,0,6,6,15,0,0,0,0,0,3,99,62,0,0,0,0,0,99,99,62,0,0,0,0,0,24,24,24,0,0,0,0,0,99,99,62,0,0,0,0,0,3,6,60,0,0,0,0,0,24, 24,0,0,0,0,0,0,24,24,48,0,0,0,0,0,24,12,6,0,0,0,0,0,126,0,0,0,0,0,0,0,24,48,96,0,0,0,0,0,0,12,12,0,0,0,0,0,110,96,62,0,0, 0,0,0,99,99,99,0,0,0,0,0,51,51,126,0,0,0,0,0,97,51,30,0,0,0,0,0,51,54,124,0,0,0,0,0,49,51,127,0,0,0,0,0,48,48,120,0,0,0,0, 0,99,51,29,0,0,0,0,0,99,99,99,0,0,0,0,0,24,24,60,0,0,0,0,0,102,102,60,0,0,0,0,0,54,51,115,0,0,0,0,0,49,51,127,0,0,0,0,0,195, 195,195,0,0,0,0,0,99,99,99,0,0,0,0,0,99,54,28,0,0,0,0,0,48,48,120,0,0,0,0,0,111,62,6,7,0,0,0,0,51,51,115,0,0,0,0,0,99,99, 62,0,0,0,0,0,24,24,60,0,0,0,0,0,99,99,62,0,0,0,0,0,102,60,24,0,0,0,0,0,255,102,102,0,0,0,0,0,102,195,195,0,0,0,0,0,24,24, 60,0,0,0,0,0,97,195,255,0,0,0,0,0,48,48,60,0,0,0,0,0,7,3,1,0,0,0,0,0,12,12,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0, 0,0,0,0,0,0,0,0,102,102,59,0,0,0,0,0,51,51,110,0,0,0,0,0,96,99,62,0,0,0,0,0,102,102,59,0,0,0,0,0,96,99,62,0,0,0,0,0,48,48, 120,0,0,0,0,0,102,62,6,102,60,0,0,0,51,51,115,0,0,0,0,0,12,12,30,0,0,0,0,0,6,6,102,102,60,0,0,0,54,51,115,0,0,0,0,0,12,12, 30,0,0,0,0,0,219,219,219,0,0,0,0,0,51,51,51,0,0,0,0,0,99,99,62,0,0,0,0,0,51,62,48,48,120,0,0,0,102,62,6,6,15,0,0,0,48,48, 120,0,0,0,0,0,14,99,62,0,0,0,0,0,24,27,14,0,0,0,0,0,102,102,59,0,0,0,0,0,102,60,24,0,0,0,0,0,219,255,102,0,0,0,0,0,28,54, 99,0,0,0,0,0,99,63,3,6,60,0,0,0,24,51,127,0,0,0,0,0,24,24,14,0,0,0,0,0,24,24,24,0,0,0,0,0,24,24,112,0,0,0,0,0,0,0,0,0,0,0, 0,0,99,127,0,0,0,0,0,0,51,30,6,3,62,0,0,0,102,102,59,0,0,0,0,0,96,99,62,0,0,0,0,0,102,102,59,0,0,0,0,0,102,102,59,0,0,0,0, 0,102,102,59,0,0,0,0,0,102,102,59,0,0,0,0,0,60,12,6,60,0,0,0,0,96,99,62,0,0,0,0,0,96,99,62,0,0,0,0,0,96,99,62,0,0,0,0,0,24, 24,60,0,0,0,0,0,24,24,60,0,0,0,0,0,24,24,60,0,0,0,0,0,127,99,99,0,0,0,0,0,127,99,99,0,0,0,0,0,48,51,127,0,0,0,0,0,216,220, 119,0,0,0,0,0,102,102,103,0,0,0,0,0,99,99,62,0,0,0,0,0,99,99,62,0,0,0,0,0,99,99,62,0,0,0,0,0,102,102,59,0,0,0,0,0,102,102, 59,0,0,0,0,0,99,63,3,6,60,0,0,0,99,54,28,0,0,0,0,0,99,99,62,0,0,0,0,0,126,24,24,0,0,0,0,0,48,115,126,0,0,0,0,0,255,24,24, 0,0,0,0,0,102,102,243,0,0,0,0,0,24,24,24,216,112,0,0,0,102,102,59,0,0,0,0,0,24,24,60,0,0,0,0,0,99,99,62,0,0,0,0,0,102,102, 59,0,0,0,0,0,51,51,51,0,0,0,0,0,103,99,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,99,62,0,0,0,0,0,96,96,0,0,0,0,0,0, 3,3,0,0,0,0,0,0,110,195,6,12,31,0,0,0,103,207,31,3,3,0,0,0,60,60,24,0,0,0,0,0,27,0,0,0,0,0,0,0,108,0,0,0,0,0,0,0,17,68,17, 68,17,68,0,0,85,170,85,170,85,170,0,0,221,119,221,119,221,119,0,0,24,24,24,24,24,24,0,0,24,24,24,24,24,24,0,0,24,24,24,24, 24,24,0,0,54,54,54,54,54,54,0,0,54,54,54,54,54,54,0,0,24,24,24,24,24,24,0,0,54,54,54,54,54,54,0,0,54,54,54,54,54,54,0,0,54, 54,54,54,54,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,24,24,24,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 24,24,24,24,24,24,0,0,24,24,24,24,24,24,0,0,0,0,0,0,0,0,0,0,24,24,24,24,24,24,0,0,24,24,24,24,24,24,0,0,54,54,54,54,54,54, 0,0,0,0,0,0,0,0,0,0,54,54,54,54,54,54,0,0,0,0,0,0,0,0,0,0,54,54,54,54,54,54,0,0,54,54,54,54,54,54,0,0,0,0,0,0,0,0,0,0,54, 54,54,54,54,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,24,24,24,24,0,0,54,54,54,54,54,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,24,24,24,24,24,24,0,0,54,54,54,54,54,54,0,0,54,54,54,54,54,54,0,0,24,24,24,24,24,24,0,0,0,0,0,0,0,0,0,0,24,24,24,24, 24,24,0,0,255,255,255,255,255,255,0,0,255,255,255,255,255,255,0,0,240,240,240,240,240,240,0,0,15,15,15,15,15,15,0,0,0,0,0, 0,0,0,0,0,108,110,59,0,0,0,0,0,99,126,96,96,32,0,0,0,96,96,96,0,0,0,0,0,54,54,54,0,0,0,0,0,48,99,127,0,0,0,0,0,108,108,56, 0,0,0,0,0,62,48,48,96,0,0,0,0,12,12,12,0,0,0,0,0,60,24,126,0,0,0,0,0,99,54,28,0,0,0,0,0,54,54,119,0,0,0,0,0,102,102,60,0, 0,0,0,0,126,0,0,0,0,0,0,0,126,96,192,0,0,0,0,0,96,48,28,0,0,0,0,0,99,99,99,0,0,0,0,0,0,127,0,0,0,0,0,0,24,0,255,0,0,0,0,0, 48,0,126,0,0,0,0,0,12,0,126,0,0,0,0,0,24,24,24,24,24,24,0,0,216,216,112,0,0,0,0,0,0,24,24,0,0,0,0,0,110,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,62,62,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,126,129,165,129,189,153,129,126,126,255,219,255,195,231,255,126,108,254,254,254,124,56,16,0,16,56, 124,254,124,56,16,0,56,124,56,254,254,214,16,56,16,16,56,124,254,124,16,56,0,0,24,60,60,24,0,0,255,255,231,195,195,231,255, 255,0,60,102,66,66,102,60,0,255,195,153,189,189,153,195,255,15,3,5,125,132,132,132,120,60,66,66,66,60,24,126,24,63,33,63, 32,32,96,224,192,63,33,63,33,35,103,230,192,24,219,60,231,231,60,219,24,128,224,248,254,248,224,128,0,2,14,62,254,62,14,2, 0,24,60,126,24,24,126,60,24,36,36,36,36,36,0,36,0,127,146,146,114,18,18,18,0,62,99,56,68,68,56,204,120,0,0,0,0,126,126,126, 0,24,60,126,24,126,60,24,255,16,56,124,84,16,16,16,0,16,16,16,84,124,56,16,0,0,24,12,254,12,24,0,0,0,48,96,254,96,48,0,0, 0,0,64,64,64,126,0,0,0,36,102,255,102,36,0,0,0,16,56,124,254,254,0,0,0,254,254,124,56,16,0,0,0,0,0,0,0,0,0,0,16,56,56,16, 16,0,16,0,36,36,36,0,0,0,0,0,36,36,126,36,126,36,36,0,24,62,64,60,2,124,24,0,0,98,100,8,16,38,70,0,48,72,48,86,136,136,118, 0,16,16,32,0,0,0,0,0,16,32,64,64,64,32,16,0,32,16,8,8,8,16,32,0,0,68,56,254,56,68,0,0,0,16,16,124,16,16,0,0,0,0,0,0,0,16, 16,32,0,0,0,126,0,0,0,0,0,0,0,0,0,16,16,0,0,2,4,8,16,32,64,0,60,66,70,74,82,98,60,0,16,48,80,16,16,16,124,0,60,66,2,12,48, 66,126,0,60,66,2,28,2,66,60,0,8,24,40,72,254,8,28,0,126,64,124,2,2,66,60,0,28,32,64,124,66,66,60,0,126,66,4,8,16,16,16,0, 60,66,66,60,66,66,60,0,60,66,66,62,2,4,56,0,0,16,16,0,0,16,16,0,0,16,16,0,0,16,16,32,8,16,32,64,32,16,8,0,0,0,126,0,0,126, 0,0,16,8,4,2,4,8,16,0,60,66,2,4,8,0,8,0,60,66,94,82,94,64,60,0,24,36,66,66,126,66,66,0,124,34,34,60,34,34,124,0,28,34,64, 64,64,34,28,0,120,36,34,34,34,36,120,0,126,34,40,56,40,34,126,0,126,34,40,56,40,32,112,0,28,34,64,64,78,34,30,0,66,66,66, 126,66,66,66,0,56,16,16,16,16,16,56,0,14,4,4,4,68,68,56,0,98,36,40,48,40,36,99,0,112,32,32,32,32,34,126,0,99,85,73,65,65, 65,65,0,98,82,74,70,66,66,66,0,24,36,66,66,66,36,24,0,124,34,34,60,32,32,112,0,60,66,66,66,74,60,3,0,124,34,34,60,40,36,114, 0,60,66,64,60,2,66,60,0,127,73,8,8,8,8,28,0,66,66,66,66,66,66,60,0,65,65,65,65,34,20,8,0,65,65,65,73,73,73,54,0,65,34,20, 8,20,34,65,0,65,34,20,8,8,8,28,0,127,66,4,8,16,33,127,0,120,64,64,64,64,64,120,0,128,64,32,16,8,4,2,0,120,8,8,8,8,8,120,0, 16,40,68,130,0,0,0,0,0,0,0,0,0,0,0,255,16,16,8,0,0,0,0,0,0,0,60,2,62,66,63,0,96,32,32,46,49,49,46,0,0,0,60,66,64,66,60,0, 6,2,2,58,70,70,59,0,0,0,60,66,126,64,60,0,12,18,16,56,16,16,56,0,0,0,61,66,66,62,2,124,96,32,44,50,34,34,98,0,16,0,48,16, 16,16,56,0,2,0,6,2,2,66,66,60,96,32,36,40,48,40,38,0,48,16,16,16,16,16,56,0,0,0,118,73,73,73,73,0,0,0,92,98,66,66,66,0,0, 0,60,66,66,66,60,0,0,0,108,50,50,44,32,112,0,0,54,76,76,52,4,14,0,0,108,50,34,32,112,0,0,0,62,64,60,2,124,0,16,16,124,16, 16,18,12,0,0,0,66,66,66,70,58,0,0,0,65,65,34,20,8,0,0,0,65,73,73,73,54,0,0,0,68,40,16,40,68,0,0,0,66,66,66,62,2,124,0,0,124, 8,16,32,124,0,12,16,16,96,16,16,12,0,16,16,16,0,16,16,16,0,48,8,8,6,8,8,48,0,50,76,0,0,0,0,0,0,0,8,20,34,65,65,127,0,60,66, 64,66,60,12,2,60,0,68,0,68,68,68,62,0,12,0,60,66,126,64,60,0,60,66,56,4,60,68,62,0,66,0,56,4,60,68,62,0,48,0,56,4,60,68,62, 0,16,0,56,4,60,68,62,0,0,0,60,64,64,60,6,28,60,66,60,66,126,64,60,0,66,0,60,66,126,64,60,0,48,0,60,66,126,64,60,0,36,0,24, 8,8,8,28,0,124,130,48,16,16,16,56,0,48,0,24,8,8,8,28,0,66,24,36,66,126,66,66,0,24,24,0,60,66,126,66,0,12,0,124,32,56,32,124, 0,0,0,51,12,63,68,59,0,31,36,68,127,68,68,71,0,24,36,0,60,66,66,60,0,0,66,0,60,66,66,60,0,32,16,0,60,66,66,60,0,24,36,0,66, 66,66,60,0,32,16,0,66,66,66,60,0,0,66,0,66,66,62,2,60,66,24,36,66,66,36,24,0,66,0,66,66,66,66,60,0,8,8,62,64,64,62,8,8,24, 36,32,112,32,66,124,0,68,40,124,16,124,16,16,0,248,76,120,68,79,68,69,230,28,18,16,124,16,16,144,96,12,0,56,4,60,68,62,0, 12,0,24,8,8,8,28,0,4,8,0,60,66,66,60,0,0,4,8,66,66,66,60,0,50,76,0,124,66,66,66,0,52,76,0,98,82,74,70,0,60,68,68,62,0,126, 0,0,56,68,68,56,0,124,0,0,16,0,16,32,64,66,60,0,0,0,0,126,64,64,0,0,0,0,0,126,2,2,0,0,66,196,72,246,41,67,140,31,66,196,74, 246,42,95,130,2,0,16,0,16,16,16,16,0,0,18,36,72,36,18,0,0,0,72,36,18,36,72,0,0,34,136,34,136,34,136,34,136,85,170,85,170, 85,170,85,170,219,119,219,238,219,119,219,238,16,16,16,16,16,16,16,16,16,16,16,16,240,16,16,16,16,16,240,16,240,16,16,16, 20,20,20,20,244,20,20,20,0,0,0,0,252,20,20,20,0,0,240,16,240,16,16,16,20,20,244,4,244,20,20,20,20,20,20,20,20,20,20,20,0, 0,252,4,244,20,20,20,20,20,244,4,252,0,0,0,20,20,20,20,252,0,0,0,16,16,240,16,240,0,0,0,0,0,0,0,240,16,16,16,16,16,16,16, 31,0,0,0,16,16,16,16,255,0,0,0,0,0,0,0,255,16,16,16,16,16,16,16,31,16,16,16,0,0,0,0,255,0,0,0,16,16,16,16,255,16,16,16,16, 16,31,16,31,16,16,16,20,20,20,20,23,20,20,20,20,20,23,16,31,0,0,0,0,0,31,16,23,20,20,20,20,20,247,0,255,0,0,0,0,0,255,0,247, 20,20,20,20,20,23,16,23,20,20,20,0,0,255,0,255,0,0,0,20,20,247,0,247,20,20,20,16,16,255,0,255,0,0,0,20,20,20,20,255,0,0,0, 0,0,255,0,255,16,16,16,0,0,0,0,255,20,20,20,20,20,20,20,31,0,0,0,16,16,31,16,31,0,0,0,0,0,31,16,31,16,16,16,0,0,0,0,31,20, 20,20,20,20,20,20,255,20,20,20,16,16,255,16,255,16,16,16,16,16,16,16,240,0,0,0,0,0,0,0,31,16,16,16,255,255,255,255,255,255, 255,255,0,0,0,0,255,255,255,255,240,240,240,240,240,240,240,240,15,15,15,15,15,15,15,15,255,255,255,255,0,0,0,0,0,0,49,74, 68,74,49,0,0,60,66,124,66,124,64,64,0,126,66,64,64,64,64,0,0,63,84,20,20,20,20,0,126,66,32,24,32,66,126,0,0,0,62,72,72,72, 48,0,0,68,68,68,122,64,64,128,0,51,76,8,8,8,8,0,124,16,56,68,68,56,16,124,24,36,66,126,66,36,24,0,24,36,66,66,36,36,102,0, 28,32,24,60,66,66,60,0,0,98,149,137,149,98,0,0,2,4,60,74,82,60,64,128,12,16,32,60,32,16,12,0,60,66,66,66,66,66,66,0,0,126, 0,126,0,126,0,0,16,16,124,16,16,0,124,0,16,8,4,8,16,0,126,0,8,16,32,16,8,0,126,0,12,18,18,16,16,16,16,16,16,16,16,16,16,144, 144,96,24,24,0,126,0,24,24,0,0,50,76,0,50,76,0,0,48,72,72,48,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,0,24,0,0,0,15,8,8,8,8,200,40, 24,120,68,68,68,68,0,0,0,48,72,16,32,120,0,0,0,0,0,60,60,60,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,126,129,165,129,189,153, 129,126,126,255,219,255,195,231,255,126,108,254,254,254,124,56,16,0,16,56,124,254,124,56,16,0,56,124,56,254,254,214,16,56, 16,16,56,124,254,124,16,56,0,0,24,60,60,24,0,0,255,255,231,195,195,231,255,255,0,60,102,66,66,102,60,0,255,195,153,189,189, 153,195,255,15,7,15,125,204,204,204,120,60,102,102,102,60,24,126,24,63,51,63,48,48,112,240,224,127,99,127,99,99,103,230,192, 24,219,60,231,231,60,219,24,128,224,248,254,248,224,128,0,2,14,62,254,62,14,2,0,24,60,126,24,24,126,60,24,102,102,102,102, 102,0,102,0,127,219,219,123,27,27,27,0,62,99,56,108,108,56,204,120,0,0,0,0,126,126,126,0,24,60,126,24,126,60,24,255,24,60, 126,24,24,24,24,0,24,24,24,24,126,60,24,0,0,24,12,254,12,24,0,0,0,48,96,254,96,48,0,0,0,0,192,192,192,254,0,0,0,36,102,255, 102,36,0,0,0,24,60,126,255,255,0,0,0,255,255,126,60,24,0,0,0,0,0,0,0,0,0,0,48,120,120,48,48,0,48,0,108,108,108,0,0,0,0,0, 108,108,254,108,254,108,108,0,48,124,192,120,12,248,48,0,0,198,204,24,48,102,198,0,56,108,56,118,220,204,118,0,96,96,192, 0,0,0,0,0,24,48,96,96,96,48,24,0,96,48,24,24,24,48,96,0,0,102,60,255,60,102,0,0,0,48,48,252,48,48,0,0,0,0,0,0,0,48,48,96, 0,0,0,252,0,0,0,0,0,0,0,0,0,48,48,0,6,12,24,48,96,192,128,0,124,198,206,222,246,230,124,0,48,112,48,48,48,48,252,0,120,204, 12,56,96,204,252,0,120,204,12,56,12,204,120,0,28,60,108,204,254,12,30,0,252,192,248,12,12,204,120,0,56,96,192,248,204,204, 120,0,252,204,12,24,48,48,48,0,120,204,204,120,204,204,120,0,120,204,204,124,12,24,112,0,0,48,48,0,0,48,48,0,0,48,48,0,0, 48,48,96,24,48,96,192,96,48,24,0,0,0,252,0,0,252,0,0,96,48,24,12,24,48,96,0,120,204,12,24,48,0,48,0,124,198,222,222,222,192, 120,0,48,120,204,204,252,204,204,0,252,102,102,124,102,102,252,0,60,102,192,192,192,102,60,0,248,108,102,102,102,108,248, 0,254,98,104,120,104,98,254,0,254,98,104,120,104,96,240,0,60,102,192,192,206,102,62,0,204,204,204,252,204,204,204,0,120,48, 48,48,48,48,120,0,30,12,12,12,204,204,120,0,230,102,108,120,108,102,230,0,240,96,96,96,98,102,254,0,198,238,254,254,214,198, 198,0,198,230,246,222,206,198,198,0,56,108,198,198,198,108,56,0,252,102,102,124,96,96,240,0,120,204,204,204,220,120,28,0, 252,102,102,124,108,102,230,0,120,204,96,48,24,204,120,0,252,180,48,48,48,48,120,0,204,204,204,204,204,204,252,0,204,204, 204,204,204,120,48,0,198,198,198,214,254,238,198,0,198,198,108,56,56,108,198,0,204,204,204,120,48,48,120,0,254,198,140,24, 50,102,254,0,120,96,96,96,96,96,120,0,192,96,48,24,12,6,2,0,120,24,24,24,24,24,120,0,16,56,108,198,0,0,0,0,0,0,0,0,0,0,0, 255,48,48,24,0,0,0,0,0,0,0,120,12,124,204,118,0,224,96,96,124,102,102,220,0,0,0,120,204,192,204,120,0,28,12,12,124,204,204, 118,0,0,0,120,204,252,192,120,0,56,108,96,240,96,96,240,0,0,0,118,204,204,124,12,248,224,96,108,118,102,102,230,0,48,0,112, 48,48,48,120,0,12,0,12,12,12,204,204,120,224,96,102,108,120,108,230,0,112,48,48,48,48,48,120,0,0,0,204,254,254,214,198,0, 0,0,248,204,204,204,204,0,0,0,120,204,204,204,120,0,0,0,220,102,102,124,96,240,0,0,118,204,204,124,12,30,0,0,220,118,102, 96,240,0,0,0,124,192,120,12,248,0,16,48,124,48,48,52,24,0,0,0,204,204,204,204,118,0,0,0,204,204,204,120,48,0,0,0,198,214, 254,254,108,0,0,0,198,108,56,108,198,0,0,0,204,204,204,124,12,248,0,0,252,152,48,100,252,0,28,48,48,224,48,48,28,0,24,24, 24,0,24,24,24,0,224,48,48,28,48,48,224,0,118,220,0,0,0,0,0,0,0,16,56,108,198,198,254,0,120,204,192,204,120,24,12,120,0,204, 0,204,204,204,126,0,28,0,120,204,252,192,120,0,126,195,60,6,62,102,63,0,204,0,120,12,124,204,126,0,224,0,120,12,124,204,126, 0,48,48,120,12,124,204,126,0,0,0,120,192,192,120,12,56,126,195,60,102,126,96,60,0,204,0,120,204,252,192,120,0,224,0,120,204, 252,192,120,0,204,0,112,48,48,48,120,0,124,198,56,24,24,24,60,0,224,0,112,48,48,48,120,0,198,56,108,198,254,198,198,0,48, 48,0,120,204,252,204,0,28,0,252,96,120,96,252,0,0,0,127,12,127,204,127,0,62,108,204,254,204,204,206,0,120,204,0,120,204,204, 120,0,0,204,0,120,204,204,120,0,0,224,0,120,204,204,120,0,120,204,0,204,204,204,126,0,0,224,0,204,204,204,126,0,0,204,0,204, 204,124,12,248,195,24,60,102,102,60,24,0,204,0,204,204,204,204,120,0,24,24,126,192,192,126,24,24,56,108,100,240,96,230,252, 0,204,204,120,252,48,252,48,48,248,204,204,250,198,207,198,199,14,27,24,60,24,24,216,112,28,0,120,12,124,204,126,0,56,0,112, 48,48,48,120,0,0,28,0,120,204,204,120,0,0,28,0,204,204,204,126,0,0,248,0,248,204,204,204,0,252,0,204,236,252,220,204,0,60, 108,108,62,0,126,0,0,56,108,108,56,0,124,0,0,48,0,48,96,192,204,120,0,0,0,0,252,192,192,0,0,0,0,0,252,12,12,0,0,195,198,204, 222,51,102,204,15,195,198,204,219,55,111,207,3,24,24,0,24,24,24,24,0,0,51,102,204,102,51,0,0,0,204,102,51,102,204,0,0,34, 136,34,136,34,136,34,136,85,170,85,170,85,170,85,170,219,119,219,238,219,119,219,238,24,24,24,24,24,24,24,24,24,24,24,24, 248,24,24,24,24,24,248,24,248,24,24,24,54,54,54,54,246,54,54,54,0,0,0,0,254,54,54,54,0,0,248,24,248,24,24,24,54,54,246,6, 246,54,54,54,54,54,54,54,54,54,54,54,0,0,254,6,246,54,54,54,54,54,246,6,254,0,0,0,54,54,54,54,254,0,0,0,24,24,248,24,248, 0,0,0,0,0,0,0,248,24,24,24,24,24,24,24,31,0,0,0,24,24,24,24,255,0,0,0,0,0,0,0,255,24,24,24,24,24,24,24,31,24,24,24,0,0,0, 0,255,0,0,0,24,24,24,24,255,24,24,24,24,24,31,24,31,24,24,24,54,54,54,54,55,54,54,54,54,54,55,48,63,0,0,0,0,0,63,48,55,54, 54,54,54,54,247,0,255,0,0,0,0,0,255,0,247,54,54,54,54,54,55,48,55,54,54,54,0,0,255,0,255,0,0,0,54,54,247,0,247,54,54,54,24, 24,255,0,255,0,0,0,54,54,54,54,255,0,0,0,0,0,255,0,255,24,24,24,0,0,0,0,255,54,54,54,54,54,54,54,63,0,0,0,24,24,31,24,31, 0,0,0,0,0,31,24,31,24,24,24,0,0,0,0,63,54,54,54,54,54,54,54,255,54,54,54,24,24,255,24,255,24,24,24,24,24,24,24,248,0,0,0, 0,0,0,0,31,24,24,24,255,255,255,255,255,255,255,255,0,0,0,0,255,255,255,255,240,240,240,240,240,240,240,240,15,15,15,15,15, 15,15,15,255,255,255,255,0,0,0,0,0,0,118,220,200,220,118,0,0,120,204,248,204,248,192,192,0,252,204,192,192,192,192,0,0,254, 108,108,108,108,108,0,252,204,96,48,96,204,252,0,0,0,126,216,216,216,112,0,0,102,102,102,102,124,96,192,0,118,220,24,24,24, 24,0,252,48,120,204,204,120,48,252,56,108,198,254,198,108,56,0,56,108,198,198,108,108,238,0,28,48,24,124,204,204,120,0,0, 0,126,219,219,126,0,0,6,12,126,219,219,126,96,192,56,96,192,248,192,96,56,0,120,204,204,204,204,204,204,0,0,252,0,252,0,252, 0,0,48,48,252,48,48,0,252,0,96,48,24,48,96,0,252,0,24,48,96,48,24,0,252,0,14,27,27,24,24,24,24,24,24,24,24,24,24,216,216, 112,48,48,0,252,0,48,48,0,0,118,220,0,118,220,0,0,56,108,108,56,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,0,24,0,0,0,15,12,12,12,236, 108,60,28,120,108,108,108,108,0,0,0,112,24,48,96,120,0,0,0,0,0,60,60,60,60,0,0,0,0,0,0,0,0,0,0]
<?xml version="1.0" encoding="UTF-8"?> <video id="videoCGA" screenwidth="960" screenheight="480" scale="true" charset="/devices/pc/video/ibm/cga/ibm-cga.json" pos="center" padding="8px"> <menu> <title>Color Display</title> <control type="container" pos="right"> <control type="led" label="Caps" binding="caps-lock" padleft="8px"/> <control type="led" label="Num" binding="num-lock" padleft="8px"/> <control type="led" label="Scroll" binding="scroll-lock" padleft="8px"/> </control> </menu> </video>
IBM EGA ROM --- To (re)build the JSON-encoded IBM EGA ROM with symbols, run the following command: filedump --file=static/ibm-ega.rom --format=bytes --decimal The symbol information in the MAP file will be automatically converted and appended to the dump of the ROM file. The PCjs server's [Dump API](http://www.pcjs.org/api/v1/dump?file=http://static.pcjs.org/devices/pc/video/ibm/ega/ibm-ega.rom&format=bytes&decimal=true) can be used as well: http://www.pcjs.org/api/v1/dump?file=http://static.pcjs.org/devices/pc/video/ibm/ega/ibm-ega.rom&format=bytes&decimal=true
<?xml version="1.0" encoding="UTF-8"?> <video id="videoEGA" model="ega" memory="0x20000" screenwidth="640" screenheight="350" autolock="true" pos="center" padding="8px"> <menu> <title>Enhanced Color Display</title> <control type="container" pos="right"> <control type="led" label="Caps" binding="caps-lock" padleft="8px"/> <control type="led" label="Num" binding="num-lock" padleft="8px"/> <control type="led" label="Scroll" binding="scroll-lock" padleft="8px"/> <control type="button" binding="fullScreen" padleft="8px">Full Screen</control> </control> </menu> </video>
<?xml version="1.0" encoding="UTF-8"?> <video id="videoEGA" model="ega" memory="0x20000" screenwidth="640" screenheight="350" width="640px" autolock="true" pos="center" padding="8px"> <menu> <title>Enhanced Color Display</title> <control type="container" pos="right"> <control type="led" label="Caps" binding="caps-lock" padleft="8px"/> <control type="led" label="Num" binding="num-lock" padleft="8px"/> <control type="led" label="Scroll" binding="scroll-lock" padleft="8px"/> <control type="button" binding="lockPointer" padleft="8px">Lock Pointer</control> </control> </menu> </video>
<?xml version="1.0" encoding="UTF-8"?> <video id="videoEGA" model="ega" memory="0x10000" screenwidth="640" screenheight="350" pos="center" padding="8px"> <menu> <title>Enhanced Color Display</title> <control type="container" pos="right"> <control type="led" label="Caps" binding="caps-lock" padleft="8px"/> <control type="led" label="Num" binding="num-lock" padleft="8px"/> <control type="led" label="Scroll" binding="scroll-lock" padleft="8px"/> </control> </menu> </video>
{"bytes":[
85,170,32,235,40,50,52,48,48,54,50,55,55,51,53,54,
32,40,67,41,67,79,80,89,82,73,71,72,84,32,73,66,
77,32,49,57,56,52,57,47,49,51,47,56,52,182,3,178,
218,236,178,186,236,178,192,176,0,238,43,210,142,218,250,199,
6,64,0,215,12,140,14,66,0,199,6,8,1,101,240,199,
6,10,1,0,240,199,6,168,4,12,1,140,14,170,4,199,
6,124,0,96,53,140,14,126,0,199,6,12,1,96,49,140,
14,14,1,251,198,6,135,4,4,232,31,0,136,30,136,4,
232,75,0,8,6,136,4,138,30,136,4,232,101,0,233,179,
1,203,238,80,88,236,36,16,208,232,195,182,3,178,194,176,
1,238,176,13,232,235,255,208,232,208,232,208,232,138,216,176,
9,232,222,255,208,232,208,232,10,216,176,5,232,211,255,208,
232,10,216,176,1,232,202,255,10,216,128,227,15,195,182,3,
178,186,176,1,238,178,218,238,178,194,236,36,96,208,232,138,
216,178,186,176,2,238,178,218,238,178,194,236,36,96,208,224,
10,195,195,42,255,128,227,15,209,227,82,182,3,138,230,90,
128,228,1,254,196,246,212,46,255,167,40,1,23,7,0,192,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,115,1,126,1,126,1,137,1,
148,1,168,1,188,1,199,1,199,1,210,1,221,1,241,1,
4,2,4,2,4,2,4,2,128,38,16,4,207,128,14,16,
4,16,184,1,0,205,16,195,128,38,16,4,207,128,14,16,
4,32,184,3,0,205,16,195,128,14,16,4,48,184,7,0,
205,16,195,32,38,135,4,232,206,255,232,235,255,195,32,38,
135,4,232,211,255,232,224,255,195,32,38,135,4,232,200,255,
232,213,255,195,182,3,178,194,176,0,238,246,212,8,38,135,
4,232,196,255,232,161,255,195,182,3,178,194,176,0,238,246,
212,8,38,135,4,232,176,255,232,157,255,195,32,38,135,4,
232,165,255,232,130,255,195,32,38,135,4,232,154,255,232,135,
255,195,32,38,135,4,232,143,255,232,124,255,195,182,3,178,
194,176,0,238,246,212,8,38,135,4,232,91,255,232,120,255,
195,182,3,178,194,176,0,238,246,212,8,38,135,4,232,87,
255,232,100,255,195,83,187,127,0,139,251,80,232,29,0,139,
240,88,80,232,32,0,88,80,232,17,0,59,199,88,117,3,
235,5,144,51,192,91,195,184,1,0,91,195,82,139,208,176,
14,238,66,236,90,195,80,82,139,208,180,14,176,127,232,212,
10,90,88,195,232,183,10,246,6,135,4,2,117,18,184,180,
3,232,177,255,61,1,0,116,3,233,187,0,180,48,235,16,
184,212,3,232,159,255,61,1,0,116,3,233,169,0,180,32,
80,187,0,176,186,184,3,185,0,16,176,1,128,252,48,116,
8,183,184,178,216,181,64,254,200,238,139,46,114,4,129,253,
52,18,142,195,116,7,142,219,232,68,0,117,46,88,80,184,
32,112,43,255,185,40,0,243,171,88,80,128,252,48,186,186,
3,116,2,178,218,180,8,43,201,236,34,196,117,4,226,249,
235,9,43,201,236,34,196,116,10,226,249,186,2,1,232,247,
3,235,6,177,3,210,236,117,222,88,235,59,185,0,64,252,
139,217,184,170,170,186,85,255,43,255,243,170,79,253,139,247,
139,203,172,50,196,117,30,138,194,170,226,246,34,228,116,19,
138,224,134,242,34,228,117,4,138,212,235,224,252,71,116,222,
79,235,217,176,0,252,195,131,236,10,139,236,232,223,9,176,
48,230,67,176,0,230,64,246,6,135,4,2,116,31,232,55,
254,199,70,2,94,1,199,70,4,153,141,199,70,6,98,184,
178,180,180,1,176,39,232,204,9,178,186,235,42,232,248,253,
232,71,11,115,17,178,212,180,1,176,20,232,183,9,199,70,
2,94,1,235,6,144,199,70,2,200,0,199,70,4,172,160,
199,70,6,96,196,178,218,184,0,5,205,16,43,201,236,168,
8,117,7,226,249,179,0,233,190,0,176,0,230,64,43,219,
51,201,236,168,8,116,7,226,249,179,1,233,170,0,43,201,
236,168,1,116,21,168,8,117,35,226,245,179,2,233,152,0,
179,3,233,147,0,179,4,233,142,0,168,8,117,242,236,168,
1,225,251,227,240,67,116,4,168,8,116,210,176,0,230,67,
59,94,2,116,4,179,5,235,111,228,64,138,224,144,228,64,
134,224,144,144,59,70,4,125,4,179,6,235,91,59,70,6,
126,4,179,7,235,82,184,219,9,187,15,0,185,80,0,205,
16,236,82,178,192,180,15,176,63,232,9,9,184,15,0,90,
80,82,178,192,180,50,232,252,8,90,88,43,201,236,168,48,
117,9,226,249,179,16,10,220,235,30,144,43,201,236,168,48,
116,8,226,249,179,32,10,220,235,14,254,196,128,252,48,116,
37,128,204,15,138,196,235,200,185,6,0,186,3,1,232,119,
2,131,196,10,176,54,230,67,42,192,230,64,144,144,230,64,
189,1,0,233,43,252,232,149,8,184,0,5,205,16,176,54,
230,67,42,192,230,64,144,144,230,64,131,196,10,189,0,0,
30,232,122,8,246,6,135,4,2,116,18,128,14,16,4,48,
184,15,0,128,14,135,4,96,184,15,0,235,13,128,38,16,
4,207,128,14,16,4,32,184,14,0,205,16,131,236,6,139,
236,184,0,160,142,216,142,192,199,70,2,0,0,199,70,4,
0,0,182,3,178,196,184,1,2,232,73,8,178,206,184,0,
4,232,65,8,82,178,218,236,178,192,184,0,50,232,53,8,
232,172,1,128,252,0,116,3,233,226,0,232,235,0,128,252,
0,116,3,233,215,0,90,178,196,184,2,2,232,22,8,178,
206,184,1,4,232,14,8,82,178,218,236,178,192,184,0,50,
232,2,8,199,70,4,0,0,232,116,1,128,252,0,116,3,
233,170,0,232,179,0,128,252,0,116,3,233,159,0,90,178,
196,184,4,2,232,222,7,82,178,206,184,2,4,232,213,7,
178,218,236,178,192,184,0,50,232,202,7,199,70,4,0,0,
232,60,1,128,252,0,116,3,235,115,144,232,123,0,128,252,
0,116,3,235,104,144,90,178,196,184,8,2,232,166,7,178,
206,184,3,4,232,158,7,82,178,218,236,178,192,184,0,50,
232,146,7,199,70,4,0,0,232,4,1,128,252,0,117,61,
232,70,0,128,252,0,117,53,85,189,0,0,94,90,232,93,
7,54,139,92,2,177,6,211,235,75,177,5,211,227,128,227,
96,128,38,135,4,159,8,30,135,4,128,14,135,4,4,138,
30,136,4,232,45,251,131,196,6,31,233,196,250,186,3,1,
232,245,0,85,189,1,0,235,195,187,0,160,142,219,142,195,
139,70,4,138,232,42,201,209,225,232,15,0,128,252,0,117,
9,139,70,4,1,70,2,184,0,0,195,85,252,43,255,43,
192,232,250,6,139,30,114,4,129,251,52,18,140,194,142,218,
116,98,129,251,33,67,116,92,136,5,138,5,50,196,117,64,
254,196,138,196,117,242,139,233,184,85,170,139,216,186,170,85,
243,171,79,79,253,139,247,139,205,173,51,195,117,34,139,194,
171,226,246,139,205,252,70,70,139,254,173,51,194,117,17,171,
226,248,253,78,78,139,205,173,11,192,117,4,226,249,235,17,
139,200,50,228,10,237,116,2,180,1,10,201,116,3,128,196,
2,93,252,195,80,82,182,3,178,196,184,15,2,232,149,6,
90,88,243,171,232,119,6,137,30,114,4,142,218,235,226,140,
218,43,219,142,194,43,255,184,85,170,139,200,38,137,5,176,
15,38,139,5,51,193,117,20,185,0,32,243,171,129,194,0,
4,131,195,16,128,254,176,117,218,235,1,144,128,254,160,116,
6,1,94,4,184,0,0,195,156,250,30,232,48,6,10,246,
116,11,179,6,232,73,6,226,254,254,206,117,245,179,1,232,
62,6,226,254,254,202,117,245,226,254,226,254,31,157,195,179,
14,239,16,87,17,134,17,157,17,164,18,14,21,176,21,210,
23,153,24,221,24,117,26,203,27,159,28,1,29,133,29,197,
29,152,31,191,32,24,33,40,24,8,0,8,11,3,0,3,
35,55,39,45,55,49,21,4,17,0,7,6,7,0,0,0,
0,225,36,199,20,8,224,240,163,255,0,1,2,3,4,5,
6,7,16,17,18,19,20,21,22,23,8,0,15,0,0,0,
0,0,0,16,14,0,255,40,24,8,0,8,11,3,0,3,
35,55,39,45,55,49,21,4,17,0,7,6,7,0,0,0,
0,225,36,199,20,8,224,240,163,255,0,1,2,3,4,5,
6,7,16,17,18,19,20,21,22,23,8,0,15,0,0,0,
0,0,0,16,14,0,255,80,24,8,0,16,1,3,0,3,
35,112,79,92,47,95,7,4,17,0,7,6,7,0,0,0,
0,225,36,199,40,8,224,240,163,255,0,1,2,3,4,5,
6,7,16,17,18,19,20,21,22,23,8,0,15,0,0,0,
0,0,0,16,14,0,255,80,24,8,0,16,1,3,0,3,
35,112,79,92,47,95,7,4,17,0,7,6,7,0,0,0,
0,225,36,199,40,8,224,240,163,255,0,1,2,3,4,5,
6,7,16,17,18,19,20,21,22,23,8,0,15,0,0,0,
0,0,0,16,14,0,255,40,24,8,0,64,11,3,0,2,
35,55,39,45,55,48,20,4,17,0,1,0,0,0,0,0,
0,225,36,199,20,0,224,240,162,255,0,19,21,23,2,4,
6,7,16,17,18,19,20,21,22,23,1,0,3,0,0,0,
0,0,0,48,15,0,255,40,24,8,0,64,11,3,0,2,
35,55,39,45,55,48,20,4,17,0,1,0,0,0,0,0,
0,225,36,199,20,0,224,240,162,255,0,19,21,23,2,4,
6,7,16,17,18,19,20,21,22,23,1,0,3,0,0,0,
0,0,0,48,15,0,255,80,24,8,0,64,1,1,0,6,
35,112,79,89,45,94,6,4,17,0,1,0,0,0,0,0,
0,224,35,199,40,0,223,239,194,255,0,23,23,23,23,23,
23,23,23,23,23,23,23,23,23,23,1,0,1,0,0,0,
0,0,0,0,13,0,255,80,24,14,0,16,0,3,0,3,
166,96,79,86,58,81,96,112,31,0,13,11,12,0,0,0,
0,94,46,93,40,13,94,110,163,255,0,8,8,8,8,8,
8,8,16,24,24,24,24,24,24,24,14,0,15,8,0,0,
0,0,0,16,10,0,255,40,24,8,0,64,0,0,0,3,
35,55,39,45,55,49,21,4,17,0,7,6,7,0,0,0,
0,225,36,199,20,8,224,240,163,255,0,1,2,3,4,5,
6,7,16,17,18,19,20,21,22,23,8,0,15,0,0,0,
0,0,0,16,14,0,255,40,24,8,0,64,0,0,0,3,
35,55,39,45,55,49,21,4,17,0,7,6,7,0,0,0,
0,225,36,199,20,8,224,240,163,255,0,1,2,3,4,5,
6,7,16,17,18,19,20,21,22,23,8,0,15,0,0,0,
0,0,0,16,14,0,255,40,24,8,0,64,0,0,0,3,
35,55,39,45,55,49,21,4,17,0,7,6,7,0,0,0,
0,225,36,199,20,8,224,240,163,255,0,1,2,3,4,5,
6,7,16,17,18,19,20,21,22,23,8,0,15,0,0,0,
0,0,0,16,14,0,255,80,24,8,0,16,1,4,0,7,
35,112,79,92,47,95,7,4,17,0,7,6,7,0,0,0,
0,225,36,199,40,8,224,240,163,255,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,
0,0,0,0,4,0,255,80,24,14,0,16,0,4,0,7,
166,96,79,86,58,81,96,112,31,0,13,11,12,0,0,0,
0,94,46,93,40,13,94,110,163,255,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,14,0,15,8,0,0,
0,0,0,0,4,0,255,40,24,8,0,32,11,15,0,6,
35,55,39,45,55,48,20,4,17,0,0,0,0,0,0,0,
0,225,36,199,20,0,224,240,227,255,0,1,2,3,4,5,
6,7,16,17,18,19,20,21,22,23,1,0,15,0,0,0,
0,0,0,0,5,15,255,80,24,8,0,64,1,15,0,6,
35,112,79,89,45,94,6,4,17,0,0,0,0,0,0,0,
0,224,35,199,40,0,223,239,227,255,0,1,2,3,4,5,
6,7,16,17,18,19,20,21,22,23,1,0,15,0,0,0,
0,0,0,0,5,15,255,80,24,14,0,128,5,15,0,0,
162,96,79,86,26,80,224,112,31,0,0,0,0,0,0,0,
0,94,46,93,20,13,94,110,139,255,0,8,0,0,24,24,
0,0,0,8,0,0,0,24,0,0,11,0,5,0,0,0,
0,0,0,16,7,15,255,80,24,14,0,128,5,15,0,0,
167,91,79,83,23,80,186,108,31,0,0,0,0,0,0,0,
0,94,43,93,20,15,95,10,139,255,0,1,0,0,4,7,
0,0,0,1,0,0,4,7,0,0,1,0,5,0,0,0,
0,0,0,16,7,15,255,80,24,14,0,128,1,15,0,6,
162,96,79,86,58,80,96,112,31,0,0,0,0,0,0,0,
0,94,46,93,40,13,94,110,227,255,0,8,0,0,24,24,
0,0,0,8,0,0,0,24,0,0,11,0,5,0,0,0,
0,0,0,0,5,15,255,80,24,14,0,128,1,15,0,6,
167,91,79,83,55,82,0,108,31,0,0,0,0,0,0,0,
0,94,43,93,40,15,95,10,227,255,0,1,2,3,4,5,
20,7,56,57,58,59,60,61,62,63,1,0,15,0,0,0,
0,0,0,0,5,15,255,40,24,14,0,8,11,3,0,3,
167,45,39,43,45,40,109,108,31,0,13,6,7,0,0,0,
0,94,43,93,20,15,94,10,163,255,0,1,2,3,4,5,
20,7,56,57,58,59,60,61,62,63,8,0,15,0,0,0,
0,0,0,16,14,0,255,40,24,14,0,8,11,3,0,3,
167,45,39,43,45,40,109,108,31,0,13,6,7,0,0,0,
0,94,43,93,20,15,94,10,163,255,0,1,2,3,4,5,
20,7,56,57,58,59,60,61,62,63,8,0,15,0,0,0,
0,0,0,16,14,0,255,80,24,14,0,16,1,3,0,3,
167,91,79,83,55,81,91,108,31,0,13,6,7,0,0,0,
0,94,43,93,40,15,94,10,163,255,0,1,2,3,4,5,
20,7,56,57,58,59,60,61,62,63,8,0,15,0,0,0,
0,0,0,16,14,0,255,80,24,14,0,16,1,3,0,3,
167,91,79,83,55,81,91,108,31,0,13,6,7,0,0,0,
0,94,43,93,40,15,94,10,163,255,0,1,2,3,4,5,
20,7,56,57,58,59,60,61,62,63,8,0,15,0,0,0,
0,0,0,16,14,0,255,251,252,85,6,30,82,81,83,86,
87,80,138,196,50,228,209,224,139,240,61,40,0,114,6,88,
205,66,233,169,20,232,6,0,88,46,255,164,239,6,80,43,
192,142,216,88,195,30,232,245,255,139,22,99,4,128,226,240,
128,202,10,31,195,134,196,238,66,134,196,238,74,195,238,195,
82,186,67,0,176,182,232,245,255,184,51,5,74,232,238,255,
138,196,232,233,255,186,97,0,236,138,224,12,3,232,222,255,
43,201,226,254,254,203,117,250,138,196,232,209,255,90,195,232,
172,255,196,30,168,4,38,196,31,195,81,82,232,240,255,138,
38,73,4,246,6,135,4,96,116,24,128,252,15,117,7,129,
195,64,4,235,51,144,128,252,16,117,7,129,195,128,4,235,
39,144,128,252,3,119,20,160,136,4,36,15,60,3,116,7,
60,9,116,3,235,5,144,129,195,192,4,138,14,73,4,42,
237,227,5,131,195,64,226,251,90,89,195,232,172,255,131,195,
5,182,3,178,196,184,1,0,250,232,89,255,38,138,7,254,
196,232,81,255,254,196,67,38,138,7,232,72,255,128,252,5,
114,242,38,138,7,67,178,194,238,178,196,184,3,0,232,52,
255,251,139,22,99,4,42,228,38,138,7,232,39,255,67,254,
196,128,252,25,114,242,38,139,71,241,134,224,163,96,4,139,
243,232,1,255,236,178,192,42,228,38,138,7,134,224,238,134,
224,238,67,254,196,128,252,20,114,239,176,0,238,30,6,196,
62,168,4,38,196,125,4,140,192,11,199,116,9,31,30,185,
16,0,243,164,70,164,7,31,178,204,176,0,238,178,202,176,
1,238,178,206,42,228,38,138,7,232,201,254,67,254,196,128,
252,9,114,242,195,160,135,4,168,128,117,57,186,0,184,160,
73,4,60,6,118,10,186,0,176,60,7,116,3,186,0,160,
187,32,7,60,4,114,6,60,7,116,2,43,219,142,194,139,
14,76,4,227,16,185,0,128,128,254,160,116,2,181,64,139,
195,43,255,243,171,195,232,30,15,195,80,30,232,95,254,160,
136,4,31,36,15,60,3,116,7,60,9,116,3,88,248,195,
88,249,195,250,199,6,12,1,96,49,140,14,14,1,251,128,
38,135,4,243,80,246,6,135,4,2,116,44,161,16,4,36,
48,60,48,116,72,198,6,132,4,24,199,6,133,4,8,0,
88,128,14,135,4,8,60,1,118,9,60,4,115,5,128,14,
135,4,4,205,66,233,166,18,161,16,4,36,48,60,48,117,
64,198,6,132,4,24,199,6,133,4,14,0,88,205,66,199,
6,96,4,12,11,128,14,135,4,8,233,129,18,88,80,182,
3,36,128,128,38,135,4,127,8,6,135,4,88,36,127,60,
15,116,2,176,7,162,73,4,178,180,137,22,99,4,235,28,
144,88,80,182,3,36,128,128,38,135,4,127,8,6,135,4,
88,36,127,162,73,4,178,212,137,22,99,4,199,6,78,4,
0,0,198,6,98,4,0,185,8,0,191,80,4,30,7,43,
192,243,171,232,228,253,38,138,7,42,228,163,74,4,38,138,
71,1,162,132,4,38,138,71,2,42,228,163,133,4,38,139,
71,3,163,76,4,43,219,176,1,138,38,73,4,128,252,7,
116,12,128,252,3,119,53,232,240,254,114,2,176,2,232,253,
14,232,74,253,138,38,73,4,128,252,7,116,3,235,29,144,
189,48,48,187,0,14,14,7,38,139,86,0,11,210,116,12,
185,1,0,69,232,31,15,131,197,14,235,234,232,204,253,232,
115,254,232,177,254,232,22,253,128,62,73,4,15,114,6,199,
6,12,1,48,34,128,62,73,4,7,119,9,116,75,128,62,
73,4,3,118,68,196,30,168,4,131,195,12,38,196,31,140,
192,11,195,116,50,190,7,0,38,138,0,60,255,116,122,58,
6,73,4,116,3,70,235,240,250,38,138,7,254,200,162,132,
4,38,139,71,1,163,133,4,38,139,71,3,163,12,1,38,
139,71,5,163,14,1,251,235,80,196,30,168,4,131,195,8,
38,196,31,140,192,11,195,116,64,190,11,0,38,138,0,60,
255,116,54,58,6,73,4,116,3,70,235,240,38,138,39,38,
138,71,1,38,139,79,2,38,139,87,4,38,139,111,6,38,
142,71,8,83,139,216,184,16,17,205,16,91,38,138,71,10,
60,255,116,5,254,200,162,132,4,232,98,252,128,62,73,4,
7,119,30,187,200,16,160,73,4,42,228,3,216,46,138,7,
162,101,4,176,48,128,62,73,4,6,117,2,176,63,162,102,
4,139,14,96,4,235,40,144,44,40,45,41,42,46,30,41,
128,253,0,117,4,254,193,235,10,254,193,58,14,133,4,114,
2,42,201,81,42,205,128,249,16,89,117,2,254,193,195,180,
10,137,14,96,4,246,6,135,4,8,117,51,138,197,36,96,
60,32,117,5,185,0,30,235,38,246,6,135,4,1,117,31,
128,62,73,4,3,119,21,232,128,253,115,16,128,253,4,118,
3,128,197,5,128,249,4,118,3,128,193,5,232,161,255,232,
3,0,233,105,16,139,22,99,4,138,197,232,215,251,254,196,
138,193,232,208,251,195,83,139,216,138,196,246,38,74,4,50,
255,3,195,209,224,91,195,232,3,0,233,65,16,138,207,50,
237,209,225,139,241,137,148,80,4,56,62,98,4,117,5,139,
194,232,1,0,195,232,206,255,139,200,3,14,78,4,209,249,
180,14,232,176,255,195,138,223,50,255,209,227,139,151,80,4,
139,14,96,4,95,94,91,88,88,31,7,93,207,160,73,4,
60,7,119,55,246,6,135,4,2,116,7,60,7,116,44,235,
5,144,60,6,118,37,205,66,95,94,131,196,6,31,7,93,
207,6,6,7,7,5,5,4,5,0,0,0,0,0,5,6,
4,4,4,4,6,6,4,7,4,7,4,139,22,99,4,131,
194,6,236,168,4,180,0,116,3,233,165,0,168,2,117,3,
233,168,0,180,16,139,22,99,4,138,196,238,66,80,236,138,
232,88,74,254,196,138,196,238,66,236,138,229,138,30,73,4,
42,255,46,138,159,193,17,43,195,139,30,78,4,209,235,43,
195,121,2,43,192,177,3,128,62,73,4,4,114,77,128,62,
73,4,7,116,70,128,62,73,4,6,119,40,117,2,209,232,
178,40,246,242,138,232,2,237,138,220,42,255,128,62,73,4,
6,117,4,177,4,208,228,211,227,138,212,138,240,208,238,208,
238,235,44,144,153,247,54,74,4,139,218,211,227,139,200,82,
153,247,54,133,4,90,138,240,235,21,144,246,54,74,4,138,
240,138,212,138,220,50,255,211,227,246,38,133,4,139,200,180,
1,82,139,22,99,4,131,194,7,238,90,95,94,131,196,6,
31,7,93,207,162,98,4,139,14,76,4,152,80,247,225,163,
78,4,139,200,138,30,73,4,128,251,7,119,2,209,249,180,
12,232,113,254,91,209,227,139,135,80,4,232,167,254,233,205,
14,80,138,230,42,229,254,196,58,224,88,117,2,42,192,195,
83,30,232,25,250,139,30,74,4,31,81,138,202,42,237,86,
87,243,164,95,94,3,243,3,251,89,226,238,91,195,83,30,
232,251,249,139,30,74,4,31,81,138,202,42,237,86,87,243,
164,95,94,43,243,43,251,89,226,238,91,195,82,182,3,178,
196,184,15,2,232,238,249,90,43,192,138,202,42,237,87,243,
170,95,138,198,82,182,3,178,196,180,2,232,215,249,90,176,
255,138,202,87,243,170,95,195,182,3,178,196,184,15,2,232,
195,249,195,30,232,167,249,138,247,42,255,80,82,139,195,247,
38,133,4,139,216,90,88,31,232,177,255,30,232,143,249,3,
62,74,4,31,75,117,241,232,206,255,195,30,232,127,249,138,
247,42,255,80,82,139,195,247,38,133,4,139,216,90,88,31,
232,137,255,30,232,103,249,43,62,74,4,31,75,117,241,232,
166,255,195,138,216,232,67,3,128,252,4,114,8,128,252,7,
116,3,233,191,0,83,139,193,232,55,0,116,49,3,240,138,
230,42,227,232,108,0,3,245,3,253,254,204,117,245,88,176,
32,232,103,0,3,253,254,203,117,247,232,33,249,128,62,73,
4,7,116,7,160,101,4,186,216,3,238,233,176,13,138,222,
235,220,246,6,135,4,4,116,18,82,182,3,178,218,80,236,
168,8,116,251,176,37,178,216,238,88,90,232,56,253,3,6,
78,4,139,248,139,240,43,209,254,198,254,194,50,237,139,46,
74,4,3,237,138,195,246,38,74,4,3,192,6,31,128,251,
0,195,138,202,86,87,243,165,95,94,195,138,202,87,243,171,
95,195,253,138,216,232,163,2,83,139,194,232,164,255,116,32,
43,240,138,230,42,227,232,217,255,43,245,43,253,254,204,117,
245,88,176,32,232,212,255,43,253,254,203,117,247,233,106,255,
138,222,235,237,138,216,139,193,232,44,2,139,248,43,209,129,
194,1,1,208,230,208,230,128,62,73,4,6,115,4,208,226,
209,231,6,31,42,237,208,227,208,227,116,45,138,195,180,80,
246,228,139,247,3,240,138,230,42,227,232,32,0,129,238,176,
31,129,239,176,31,254,204,117,241,138,199,232,40,0,129,239,
176,31,254,203,117,245,233,213,12,138,222,235,236,138,202,86,
87,243,164,95,94,129,198,0,32,129,199,0,32,86,87,138,
202,243,164,95,94,195,138,202,87,243,170,95,129,199,0,32,
87,138,202,243,170,95,195,80,30,232,2,248,138,38,135,4,
128,228,96,31,88,116,2,249,195,248,195,233,149,254,232,192,
253,138,38,73,4,128,252,7,118,241,128,252,13,115,23,233,
124,12,186,0,160,189,17,5,128,252,15,114,8,232,199,255,
115,3,189,1,5,195,82,232,232,255,142,194,90,138,216,139,
193,83,138,62,98,4,232,125,1,91,139,248,43,209,129,194,
1,1,42,228,138,195,82,247,38,133,4,247,38,74,4,139,
247,3,240,6,31,90,10,219,116,63,138,206,42,203,42,237,
30,232,138,247,80,82,139,193,247,38,133,4,139,200,90,88,
31,82,139,197,182,3,178,206,232,138,247,178,196,184,15,2,
232,130,247,90,232,73,253,82,77,139,197,182,3,178,206,232,
115,247,90,232,173,253,233,245,11,138,222,235,246,233,146,254,
232,30,253,138,38,73,4,128,252,3,118,241,128,252,7,116,
236,128,252,13,115,12,128,252,6,119,4,180,7,205,66,233,
204,11,253,138,216,82,232,73,255,142,194,90,139,194,254,196,
83,138,62,98,4,232,222,0,91,43,6,74,4,139,248,43,
209,129,194,1,1,42,228,138,195,82,247,38,133,4,247,38,
74,4,139,247,43,240,6,31,90,10,219,116,64,138,206,42,
203,42,237,30,232,231,246,80,82,139,193,247,38,133,4,139,
200,90,88,31,82,139,197,182,3,178,206,232,231,246,178,196,
184,15,2,232,223,246,90,232,196,252,82,77,139,197,182,3,
178,206,232,208,246,90,232,50,253,252,233,81,11,138,222,235,
245,138,207,50,237,139,241,209,230,139,132,80,4,51,219,227,
6,3,30,76,4,226,250,232,220,250,3,216,195,128,227,3,
138,195,81,185,3,0,208,224,208,224,10,216,226,248,138,251,
89,195,82,81,83,43,210,185,1,0,139,216,35,217,11,211,
209,224,209,225,139,216,35,217,11,211,209,225,115,236,139,194,
91,89,90,195,161,80,4,83,139,216,138,196,246,38,74,4,
209,224,209,224,42,255,3,195,91,195,83,138,223,42,255,209,
227,139,135,80,4,91,83,81,82,42,237,138,207,139,216,138,
196,246,38,74,4,247,38,133,4,42,255,3,195,139,30,76,
4,227,4,3,195,226,252,90,89,91,195,190,0,184,139,62,
16,4,129,231,48,0,131,255,48,117,3,190,0,176,142,198,
195,232,231,255,232,74,255,139,243,139,22,99,4,131,194,6,
246,6,135,4,4,6,31,116,11,236,168,1,117,251,250,236,
168,1,116,251,173,233,118,10,138,36,138,68,1,185,0,192,
178,0,133,193,248,116,1,249,208,210,209,233,209,233,115,242,
136,86,0,69,195,232,163,255,232,89,255,139,240,131,236,8,
139,236,128,62,73,4,6,6,31,114,26,182,4,138,4,136,
70,0,69,138,132,0,32,136,70,0,69,131,198,80,254,206,
117,235,235,23,144,209,230,182,4,232,172,255,129,198,0,32,
232,165,255,129,238,176,31,254,206,117,238,30,232,111,245,196,
62,12,1,31,131,237,8,139,245,252,176,0,22,31,186,128,
0,86,87,185,8,0,243,166,95,94,116,29,254,192,131,199,
8,74,117,237,60,0,116,17,232,67,245,196,62,124,0,140,
192,11,199,116,4,176,128,235,211,131,196,8,233,207,9,233,
47,255,138,38,73,4,128,252,7,116,244,128,252,3,118,239,
128,252,6,119,3,233,93,255,128,252,15,114,82,232,7,253,
114,77,235,10,128,252,13,115,70,176,0,233,160,9,186,0,
160,142,194,232,180,254,139,240,139,30,133,4,43,227,139,236,
83,36,1,138,200,176,5,210,224,180,7,182,3,178,206,232,
243,244,184,24,5,232,237,244,38,138,4,246,208,136,70,0,
69,3,54,74,4,75,117,240,91,184,16,5,235,50,144,186,
0,160,142,194,232,115,254,139,240,139,30,133,4,43,227,139,
236,182,3,178,206,184,8,5,232,186,244,83,38,138,4,246,
208,136,70,0,69,3,54,74,4,75,117,240,91,184,0,5,
232,162,244,196,62,12,1,43,235,139,245,252,176,0,22,31,
186,0,1,86,87,139,203,243,166,95,94,116,7,254,192,3,
251,74,117,239,3,227,233,5,9,232,98,244,138,38,73,4,
128,252,4,114,8,128,252,7,116,3,235,116,144,232,59,254,
138,227,80,81,232,154,253,139,251,89,91,139,22,99,4,131,
194,6,246,6,135,4,4,116,11,236,168,1,117,251,250,236,
168,1,116,251,139,195,171,251,226,232,233,193,8,232,30,244,
138,38,73,4,128,252,4,114,8,128,252,7,116,3,235,48,
144,232,247,253,80,81,232,88,253,139,251,89,91,139,22,99,
4,131,194,6,246,6,135,4,4,116,11,236,168,1,117,251,
250,236,168,1,116,251,138,195,170,251,71,226,231,233,126,8,
128,252,7,114,3,233,175,0,232,192,253,180,0,80,232,115,
253,139,248,88,60,128,115,6,197,54,12,1,235,6,44,128,
197,54,124,0,209,224,209,224,209,224,3,240,30,232,174,243,
128,62,73,4,6,31,114,44,87,86,182,4,172,246,195,128,
117,22,170,172,38,136,133,255,31,131,199,79,254,206,117,236,
94,95,71,226,227,233,38,8,38,50,5,170,172,38,50,133,
255,31,235,224,138,211,209,231,232,226,252,87,86,182,4,172,
232,239,252,35,195,246,194,128,116,7,38,50,37,38,50,69,
1,38,136,37,38,136,69,1,172,232,214,252,35,195,246,194,
128,116,10,38,50,165,0,32,38,50,133,1,32,38,136,165,
0,32,38,136,133,1,32,131,199,80,254,206,117,193,94,95,
71,71,226,183,233,199,7,128,252,15,114,14,232,24,251,114,
9,128,227,133,138,227,208,228,10,220,42,228,247,38,133,4,
80,232,198,252,139,248,139,46,133,4,186,0,160,142,194,197,
54,12,1,88,3,240,182,3,246,195,128,116,11,178,206,184,
24,3,232,0,243,235,30,144,87,178,196,184,15,2,232,244,
242,43,192,81,139,205,30,232,212,242,170,3,62,74,4,79,
226,248,31,89,95,178,196,180,2,138,195,232,215,242,87,83,
81,139,221,30,232,183,242,139,14,74,4,31,138,4,38,138,
37,38,136,5,70,3,249,75,117,242,89,91,43,245,95,71,
226,166,178,206,184,0,3,232,171,242,178,196,184,15,2,232,
163,242,233,41,7,128,62,99,4,180,116,9,246,6,135,4,
2,116,5,205,66,233,22,7,43,192,139,232,196,62,168,4,
131,199,4,38,196,61,140,192,11,199,116,1,69,232,32,3,
10,255,117,101,138,251,160,102,4,36,224,128,227,31,10,195,
162,102,4,138,223,128,231,8,208,231,138,232,128,229,239,10,
237,128,227,15,138,251,208,227,128,227,16,128,231,7,10,223,
160,73,4,60,3,118,14,180,0,138,195,232,193,2,11,237,
116,3,38,136,29,128,62,73,4,3,119,5,232,171,243,114,
7,180,17,138,195,232,167,2,11,237,116,4,38,136,93,16,
138,221,128,227,32,177,5,210,235,128,62,73,4,3,118,74,
160,102,4,36,223,128,227,1,116,2,12,32,162,102,4,36,
16,12,2,10,216,180,1,138,195,232,115,2,11,237,116,4,
38,136,93,1,254,195,254,195,180,2,138,195,232,96,2,11,
237,116,4,38,136,93,2,254,195,254,195,180,3,138,195,232,
77,2,11,237,116,4,38,136,93,3,232,90,2,233,62,6,
247,38,74,4,81,209,233,209,233,209,233,3,193,138,223,42,
255,139,203,139,30,76,4,227,4,3,195,226,252,89,139,216,
128,225,7,176,128,210,232,195,83,80,176,40,82,128,226,254,
246,226,90,246,194,1,116,3,5,0,32,139,240,88,139,209,
187,192,2,185,2,3,128,62,73,4,6,114,6,187,128,1,
185,3,7,34,234,211,234,3,242,138,247,42,201,208,200,2,
205,254,207,117,248,138,227,210,236,91,195,128,62,73,4,7,
119,42,82,186,0,184,142,194,90,80,80,232,170,255,210,232,
34,196,38,138,12,91,246,195,128,117,13,246,212,34,204,10,
193,38,136,4,88,233,166,5,50,193,235,245,128,62,73,4,
15,114,13,232,241,248,114,8,36,133,138,224,208,228,10,196,
80,139,194,232,74,255,182,3,178,206,180,8,232,246,240,82,
186,0,160,142,194,90,88,138,232,246,197,128,116,10,180,3,
176,24,232,224,240,235,18,144,178,196,180,2,176,255,232,212,
240,38,138,7,42,192,38,136,7,178,196,180,2,138,197,36,
15,232,193,240,38,138,7,176,255,38,136,7,232,182,240,178,
206,180,3,42,192,232,173,240,180,8,176,255,232,166,240,233,
44,5,80,82,186,0,160,142,194,90,88,139,194,232,224,254,
181,7,42,233,43,210,176,0,195,138,205,180,4,82,182,3,
178,206,232,128,240,90,38,138,39,210,236,128,228,1,195,128,
62,73,4,7,119,24,82,186,0,184,142,194,90,232,216,254,
38,138,4,34,196,210,224,138,206,210,192,233,224,4,128,62,
73,4,15,114,37,232,47,248,114,32,232,165,255,232,185,255,
10,212,208,228,10,212,176,2,232,174,255,208,228,208,228,10,
212,208,228,10,212,138,194,233,180,4,232,133,255,232,153,255,
138,200,210,228,10,212,254,192,60,3,118,241,138,194,233,157,
4,80,138,62,98,4,83,138,223,50,255,209,227,139,151,80,
4,91,60,13,116,92,60,10,116,92,60,8,116,76,60,7,
116,92,180,10,185,1,0,205,16,254,194,58,22,74,4,117,
53,42,210,58,54,132,4,117,43,232,33,244,160,73,4,60,
4,114,6,42,255,60,7,117,6,180,8,205,16,138,252,184,
1,6,43,201,138,54,132,4,138,22,74,4,254,202,205,16,
88,233,58,4,254,198,180,2,235,244,10,210,116,248,254,202,
235,244,42,210,235,240,58,54,132,4,117,232,235,187,179,2,
232,157,239,235,219,138,38,74,4,138,62,98,4,160,135,4,
36,128,10,6,73,4,95,94,89,89,90,31,7,93,207,80,
232,98,239,250,236,168,8,116,251,88,178,192,134,196,238,134,
196,238,176,32,238,251,195,232,6,0,178,192,176,32,238,195,
232,66,239,236,195,246,6,135,4,2,117,7,128,62,99,4,
180,116,51,138,224,10,228,117,48,43,237,196,62,168,4,131,
199,4,38,196,61,140,192,11,199,116,1,69,232,209,255,138,
227,138,199,232,169,255,232,190,255,11,237,116,9,138,199,42,
255,3,251,38,136,5,233,149,3,254,204,117,45,43,237,196,
62,168,4,131,199,4,38,196,61,140,192,11,199,116,1,69,
232,157,255,180,17,138,199,232,117,255,232,138,255,11,237,116,
213,131,199,17,38,136,61,233,100,3,254,204,117,64,30,6,
196,62,168,4,131,199,4,38,196,61,140,192,11,199,116,9,
31,30,139,242,185,17,0,243,164,7,31,139,218,232,96,255,
42,228,38,138,7,232,55,255,254,196,67,128,252,16,114,242,
254,196,38,138,7,232,39,255,232,60,255,233,32,3,254,204,
117,41,83,232,212,238,131,195,51,38,138,7,91,10,219,117,
10,128,38,101,4,223,36,247,235,12,144,254,203,117,7,128,
14,101,4,32,12,8,180,16,232,244,254,233,240,2,80,85,
83,81,82,6,232,71,238,160,73,4,80,60,7,116,7,198,
6,73,4,11,235,5,198,6,73,4,12,232,221,238,232,45,
238,88,162,73,4,7,90,89,91,93,88,10,192,116,23,14,
7,43,210,185,0,1,254,200,117,7,183,14,189,48,34,235,
5,183,8,189,96,49,6,31,82,186,0,160,142,194,90,81,
177,5,211,226,89,10,219,116,8,129,194,0,64,254,203,117,
248,138,199,42,228,139,250,139,245,227,13,81,139,200,243,164,
43,248,131,199,32,89,226,243,195,232,210,237,163,133,4,139,
22,99,4,128,62,73,4,7,117,5,180,20,232,214,237,254,
200,180,9,232,207,237,254,200,138,232,138,200,254,193,180,1,
205,16,138,30,73,4,184,94,1,128,251,3,119,8,232,57,
239,114,3,184,200,0,153,247,54,133,4,72,162,132,4,254,
192,42,228,247,38,133,4,72,139,22,99,4,180,18,232,148,
237,160,132,4,254,192,246,38,74,4,209,224,5,0,1,163,
76,4,232,1,239,233,6,2,60,16,115,55,60,3,115,23,
232,11,255,232,5,238,232,237,238,232,82,237,139,14,96,4,
180,1,205,16,233,231,1,117,23,182,3,178,196,184,1,0,
232,82,237,180,3,138,195,232,75,237,184,3,0,232,69,237,
233,203,1,60,32,115,38,44,16,60,2,119,243,80,83,232,
204,254,232,198,237,91,88,138,224,10,228,138,199,116,9,176,
8,128,252,1,117,2,176,14,42,228,233,44,255,60,48,115,
106,44,32,117,17,43,210,142,218,250,137,46,124,0,140,6,
126,0,251,233,136,1,82,43,210,142,218,90,60,3,119,243,
254,200,116,20,14,7,254,200,117,8,185,14,0,189,48,34,
235,6,185,8,0,189,96,49,250,137,46,12,1,140,6,14,
1,251,232,185,236,137,14,133,4,138,195,187,103,32,10,192,
117,5,138,194,235,9,144,60,3,118,2,176,2,46,215,254,
200,162,132,4,233,55,1,0,14,25,43,60,48,116,3,233,
44,1,139,14,133,4,138,22,132,4,128,255,7,119,240,128,
255,1,119,24,82,43,210,142,218,90,10,255,117,7,196,46,
124,0,235,26,144,196,46,12,1,235,19,144,128,239,2,138,
223,42,255,209,227,129,195,183,32,46,139,47,14,7,95,94,
91,88,88,31,88,88,207,48,34,96,49,96,53,48,48,128,
251,16,114,81,116,27,128,251,32,116,3,233,208,0,43,210,
142,218,250,199,6,20,0,167,33,140,14,22,0,251,233,189,
0,138,62,135,4,128,231,2,208,239,160,135,4,36,96,177,
5,210,232,138,216,138,14,136,4,138,233,128,225,15,208,237,
208,237,208,237,208,237,128,229,15,95,94,90,90,90,31,7,
93,207,233,137,0,233,134,0,60,4,115,249,227,247,83,138,
223,42,255,209,227,139,183,80,4,91,86,80,184,0,2,205,
16,88,81,83,80,134,224,38,138,70,0,69,60,13,116,61,
60,10,116,57,60,8,116,53,60,7,116,49,185,1,0,128,
252,2,114,5,38,138,94,0,69,180,9,205,16,254,194,58,
22,74,4,114,17,58,54,132,4,117,7,184,10,14,205,16,
254,206,254,198,42,210,184,0,2,205,16,235,14,180,14,205,
16,138,223,42,255,209,227,139,151,80,4,88,91,89,226,162,
90,60,1,116,9,60,3,116,5,184,0,2,205,16,95,94,
91,89,90,31,7,93,207,251,30,80,83,81,82,232,78,235,
128,62,0,5,1,116,99,198,6,0,5,1,180,15,205,16,
138,204,138,46,132,4,254,197,232,85,0,81,180,3,205,16,
89,82,51,210,180,2,205,16,180,8,205,16,10,192,117,2,
176,32,82,51,210,50,228,205,23,90,246,196,41,117,33,254,
194,58,202,117,223,50,210,138,226,82,232,35,0,90,254,198,
58,238,117,208,90,180,2,205,16,198,6,0,5,0,235,10,
90,180,2,205,16,198,6,0,5,255,90,89,91,88,31,207,
51,210,50,228,176,13,205,23,50,228,176,10,205,23,195,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
126,129,165,129,129,189,153,129,126,0,0,0,0,0,126,255,
219,255,255,195,231,255,126,0,0,0,0,0,0,108,254,254,
254,254,124,56,16,0,0,0,0,0,0,16,56,124,254,124,
56,16,0,0,0,0,0,0,24,60,60,231,231,231,24,24,
60,0,0,0,0,0,24,60,126,255,255,126,24,24,60,0,
0,0,0,0,0,0,0,24,60,60,24,0,0,0,0,0,
255,255,255,255,255,231,195,195,231,255,255,255,255,255,0,0,
0,0,60,102,66,66,102,60,0,0,0,0,255,255,255,255,
195,153,189,189,153,195,255,255,255,255,0,0,30,14,26,50,
120,204,204,204,120,0,0,0,0,0,60,102,102,102,60,24,
126,24,24,0,0,0,0,0,63,51,63,48,48,48,112,240,
224,0,0,0,0,0,127,99,127,99,99,99,103,231,230,192,
0,0,0,0,24,24,219,60,231,60,219,24,24,0,0,0,
0,0,128,192,224,248,254,248,224,192,128,0,0,0,0,0,
2,6,14,62,254,62,14,6,2,0,0,0,0,0,24,60,
126,24,24,24,126,60,24,0,0,0,0,0,102,102,102,102,
102,102,0,102,102,0,0,0,0,0,127,219,219,219,123,27,
27,27,27,0,0,0,0,124,198,96,56,108,198,198,108,56,
12,198,124,0,0,0,0,0,0,0,0,0,254,254,254,0,
0,0,0,0,24,60,126,24,24,24,126,60,24,126,0,0,
0,0,24,60,126,24,24,24,24,24,24,0,0,0,0,0,
24,24,24,24,24,24,126,60,24,0,0,0,0,0,0,0,
24,12,254,12,24,0,0,0,0,0,0,0,0,0,48,96,
254,96,48,0,0,0,0,0,0,0,0,0,0,192,192,192,
254,0,0,0,0,0,0,0,0,0,40,108,254,108,40,0,
0,0,0,0,0,0,0,16,56,56,124,124,254,254,0,0,
0,0,0,0,0,254,254,124,124,56,56,16,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
24,60,60,60,24,24,0,24,24,0,0,0,0,102,102,102,
36,0,0,0,0,0,0,0,0,0,0,0,108,108,254,108,
108,108,254,108,108,0,0,0,24,24,124,198,194,192,124,6,
134,198,124,24,24,0,0,0,0,0,194,198,12,24,48,102,
198,0,0,0,0,0,56,108,108,56,118,220,204,204,118,0,
0,0,0,48,48,48,96,0,0,0,0,0,0,0,0,0,
0,0,12,24,48,48,48,48,48,24,12,0,0,0,0,0,
48,24,12,12,12,12,12,24,48,0,0,0,0,0,0,0,
102,60,255,60,102,0,0,0,0,0,0,0,0,0,24,24,
126,24,24,0,0,0,0,0,0,0,0,0,0,0,0,0,
24,24,24,48,0,0,0,0,0,0,0,0,254,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,0,
0,0,0,0,2,6,12,24,48,96,192,128,0,0,0,0,
0,0,124,198,206,222,246,230,198,198,124,0,0,0,0,0,
24,56,120,24,24,24,24,24,126,0,0,0,0,0,124,198,
6,12,24,48,96,198,254,0,0,0,0,0,124,198,6,6,
60,6,6,198,124,0,0,0,0,0,12,28,60,108,204,254,
12,12,30,0,0,0,0,0,254,192,192,192,252,6,6,198,
124,0,0,0,0,0,56,96,192,192,252,198,198,198,124,0,
0,0,0,0,254,198,6,12,24,48,48,48,48,0,0,0,
0,0,124,198,198,198,124,198,198,198,124,0,0,0,0,0,
124,198,198,198,126,6,6,12,120,0,0,0,0,0,0,24,
24,0,0,0,24,24,0,0,0,0,0,0,0,24,24,0,
0,0,24,24,48,0,0,0,0,0,6,12,24,48,96,48,
24,12,6,0,0,0,0,0,0,0,0,126,0,0,126,0,
0,0,0,0,0,0,96,48,24,12,6,12,24,48,96,0,
0,0,0,0,124,198,198,12,24,24,0,24,24,0,0,0,
0,0,124,198,198,222,222,222,220,192,124,0,0,0,0,0,
16,56,108,198,198,254,198,198,198,0,0,0,0,0,252,102,
102,102,124,102,102,102,252,0,0,0,0,0,60,102,194,192,
192,192,194,102,60,0,0,0,0,0,248,108,102,102,102,102,
102,108,248,0,0,0,0,0,254,102,98,104,120,104,98,102,
254,0,0,0,0,0,254,102,98,104,120,104,96,96,240,0,
0,0,0,0,60,102,194,192,192,222,198,102,58,0,0,0,
0,0,198,198,198,198,254,198,198,198,198,0,0,0,0,0,
60,24,24,24,24,24,24,24,60,0,0,0,0,0,30,12,
12,12,12,12,204,204,120,0,0,0,0,0,230,102,108,108,
120,108,108,102,230,0,0,0,0,0,240,96,96,96,96,96,
98,102,254,0,0,0,0,0,198,238,254,254,214,198,198,198,
198,0,0,0,0,0,198,230,246,254,222,206,198,198,198,0,
0,0,0,0,56,108,198,198,198,198,198,108,56,0,0,0,
0,0,252,102,102,102,124,96,96,96,240,0,0,0,0,0,
124,198,198,198,198,214,222,124,12,14,0,0,0,0,252,102,
102,102,124,108,102,102,230,0,0,0,0,0,124,198,198,96,
56,12,198,198,124,0,0,0,0,0,126,126,90,24,24,24,
24,24,60,0,0,0,0,0,198,198,198,198,198,198,198,198,
124,0,0,0,0,0,198,198,198,198,198,198,108,56,16,0,
0,0,0,0,198,198,198,198,214,214,254,124,108,0,0,0,
0,0,198,198,108,56,56,56,108,198,198,0,0,0,0,0,
102,102,102,102,60,24,24,24,60,0,0,0,0,0,254,198,
140,24,48,96,194,198,254,0,0,0,0,0,60,48,48,48,
48,48,48,48,60,0,0,0,0,0,128,192,224,112,56,28,
14,6,2,0,0,0,0,0,60,12,12,12,12,12,12,12,
60,0,0,0,16,56,108,198,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,
48,48,24,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,120,12,124,204,204,118,0,0,0,0,0,224,96,
96,120,108,102,102,102,124,0,0,0,0,0,0,0,0,124,
198,192,192,198,124,0,0,0,0,0,28,12,12,60,108,204,
204,204,118,0,0,0,0,0,0,0,0,124,198,254,192,198,
124,0,0,0,0,0,56,108,100,96,240,96,96,96,240,0,
0,0,0,0,0,0,0,118,204,204,204,124,12,204,120,0,
0,0,224,96,96,108,118,102,102,102,230,0,0,0,0,0,
24,24,0,56,24,24,24,24,60,0,0,0,0,0,6,6,
0,14,6,6,6,6,102,102,60,0,0,0,224,96,96,102,
108,120,108,102,230,0,0,0,0,0,56,24,24,24,24,24,
24,24,60,0,0,0,0,0,0,0,0,236,254,214,214,214,
198,0,0,0,0,0,0,0,0,220,102,102,102,102,102,0,
0,0,0,0,0,0,0,124,198,198,198,198,124,0,0,0,
0,0,0,0,0,220,102,102,102,124,96,96,240,0,0,0,
0,0,0,118,204,204,204,124,12,12,30,0,0,0,0,0,
0,220,118,102,96,96,240,0,0,0,0,0,0,0,0,124,
198,112,28,198,124,0,0,0,0,0,16,48,48,252,48,48,
48,54,28,0,0,0,0,0,0,0,0,204,204,204,204,204,
118,0,0,0,0,0,0,0,0,102,102,102,102,60,24,0,
0,0,0,0,0,0,0,198,198,214,214,254,108,0,0,0,
0,0,0,0,0,198,108,56,56,108,198,0,0,0,0,0,
0,0,0,198,198,198,198,126,6,12,248,0,0,0,0,0,
0,254,204,24,48,102,254,0,0,0,0,0,14,24,24,24,
112,24,24,24,14,0,0,0,0,0,24,24,24,24,0,24,
24,24,24,0,0,0,0,0,112,24,24,24,14,24,24,24,
112,0,0,0,0,0,118,220,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,16,56,108,198,198,254,0,0,0,0,
0,0,60,102,194,192,192,194,102,60,12,6,124,0,0,0,
204,204,0,204,204,204,204,204,118,0,0,0,0,12,24,48,
0,124,198,254,192,198,124,0,0,0,0,16,56,108,0,120,
12,124,204,204,118,0,0,0,0,0,204,204,0,120,12,124,
204,204,118,0,0,0,0,96,48,24,0,120,12,124,204,204,
118,0,0,0,0,56,108,56,0,120,12,124,204,204,118,0,
0,0,0,0,0,0,60,102,96,102,60,12,6,60,0,0,
0,16,56,108,0,124,198,254,192,198,124,0,0,0,0,0,
204,204,0,124,198,254,192,198,124,0,0,0,0,96,48,24,
0,124,198,254,192,198,124,0,0,0,0,0,102,102,0,56,
24,24,24,24,60,0,0,0,0,24,60,102,0,56,24,24,
24,24,60,0,0,0,0,96,48,24,0,56,24,24,24,24,
60,0,0,0,0,198,198,16,56,108,198,198,254,198,198,0,
0,0,56,108,56,0,56,108,198,198,254,198,198,0,0,0,
24,48,96,0,254,102,96,124,96,102,254,0,0,0,0,0,
0,0,204,118,54,126,216,216,110,0,0,0,0,0,62,108,
204,204,254,204,204,204,206,0,0,0,0,16,56,108,0,124,
198,198,198,198,124,0,0,0,0,0,198,198,0,124,198,198,
198,198,124,0,0,0,0,96,48,24,0,124,198,198,198,198,
124,0,0,0,0,48,120,204,0,204,204,204,204,204,118,0,
0,0,0,96,48,24,0,204,204,204,204,204,118,0,0,0,
0,0,198,198,0,198,198,198,198,126,6,12,120,0,0,198,
198,56,108,198,198,198,198,108,56,0,0,0,0,198,198,0,
198,198,198,198,198,198,124,0,0,0,0,24,24,60,102,96,
96,102,60,24,24,0,0,0,0,56,108,100,96,240,96,96,
96,230,252,0,0,0,0,0,102,102,60,24,126,24,126,24,
24,0,0,0,0,248,204,204,248,196,204,222,204,204,198,0,
0,0,0,14,27,24,24,24,126,24,24,24,24,216,112,0,
0,24,48,96,0,120,12,124,204,204,118,0,0,0,0,12,
24,48,0,56,24,24,24,24,60,0,0,0,0,24,48,96,
0,124,198,198,198,198,124,0,0,0,0,24,48,96,0,204,
204,204,204,204,118,0,0,0,0,0,118,220,0,220,102,102,
102,102,102,0,0,0,118,220,0,198,230,246,254,222,206,198,
198,0,0,0,0,60,108,108,62,0,126,0,0,0,0,0,
0,0,0,56,108,108,56,0,124,0,0,0,0,0,0,0,
0,0,48,48,0,48,48,96,198,198,124,0,0,0,0,0,
0,0,0,0,254,192,192,192,0,0,0,0,0,0,0,0,
0,0,254,6,6,6,0,0,0,0,0,192,192,198,204,216,
48,96,220,134,12,24,62,0,0,192,192,198,204,216,48,102,
206,158,62,6,6,0,0,0,24,24,0,24,24,60,60,60,
24,0,0,0,0,0,0,0,54,108,216,108,54,0,0,0,
0,0,0,0,0,0,216,108,54,108,216,0,0,0,0,0,
17,68,17,68,17,68,17,68,17,68,17,68,17,68,85,170,
85,170,85,170,85,170,85,170,85,170,85,170,221,119,221,119,
221,119,221,119,221,119,221,119,221,119,24,24,24,24,24,24,
24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,248,
24,24,24,24,24,24,24,24,24,24,24,248,24,248,24,24,
24,24,24,24,54,54,54,54,54,54,54,246,54,54,54,54,
54,54,0,0,0,0,0,0,0,254,54,54,54,54,54,54,
0,0,0,0,0,248,24,248,24,24,24,24,24,24,54,54,
54,54,54,246,6,246,54,54,54,54,54,54,54,54,54,54,
54,54,54,54,54,54,54,54,54,54,0,0,0,0,0,254,
6,246,54,54,54,54,54,54,54,54,54,54,54,246,6,254,
0,0,0,0,0,0,54,54,54,54,54,54,54,254,0,0,
0,0,0,0,24,24,24,24,24,248,24,248,0,0,0,0,
0,0,0,0,0,0,0,0,0,248,24,24,24,24,24,24,
24,24,24,24,24,24,24,31,0,0,0,0,0,0,24,24,
24,24,24,24,24,255,0,0,0,0,0,0,0,0,0,0,
0,0,0,255,24,24,24,24,24,24,24,24,24,24,24,24,
24,31,24,24,24,24,24,24,0,0,0,0,0,0,0,255,
0,0,0,0,0,0,24,24,24,24,24,24,24,255,24,24,
24,24,24,24,24,24,24,24,24,31,24,31,24,24,24,24,
24,24,54,54,54,54,54,54,54,55,54,54,54,54,54,54,
54,54,54,54,54,55,48,63,0,0,0,0,0,0,0,0,
0,0,0,63,48,55,54,54,54,54,54,54,54,54,54,54,
54,247,0,255,0,0,0,0,0,0,0,0,0,0,0,255,
0,247,54,54,54,54,54,54,54,54,54,54,54,55,48,55,
54,54,54,54,54,54,0,0,0,0,0,255,0,255,0,0,
0,0,0,0,54,54,54,54,54,247,0,247,54,54,54,54,
54,54,24,24,24,24,24,255,0,255,0,0,0,0,0,0,
54,54,54,54,54,54,54,255,0,0,0,0,0,0,0,0,
0,0,0,255,0,255,24,24,24,24,24,24,0,0,0,0,
0,0,0,255,54,54,54,54,54,54,54,54,54,54,54,54,
54,63,0,0,0,0,0,0,24,24,24,24,24,31,24,31,
0,0,0,0,0,0,0,0,0,0,0,31,24,31,24,24,
24,24,24,24,0,0,0,0,0,0,0,63,54,54,54,54,
54,54,54,54,54,54,54,54,54,255,54,54,54,54,54,54,
24,24,24,24,24,255,24,255,24,24,24,24,24,24,24,24,
24,24,24,24,24,248,0,0,0,0,0,0,0,0,0,0,
0,0,0,31,24,24,24,24,24,24,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,255,
255,255,255,255,255,255,240,240,240,240,240,240,240,240,240,240,
240,240,240,240,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,255,255,255,255,255,255,255,0,0,0,0,0,0,0,
0,0,0,0,0,118,220,216,216,220,118,0,0,0,0,0,
0,0,124,198,252,198,198,252,192,192,64,0,0,0,254,198,
198,192,192,192,192,192,192,0,0,0,0,0,0,0,254,108,
108,108,108,108,108,0,0,0,0,0,254,198,96,48,24,48,
96,198,254,0,0,0,0,0,0,0,0,126,216,216,216,216,
112,0,0,0,0,0,0,0,102,102,102,102,124,96,96,192,
0,0,0,0,0,0,118,220,24,24,24,24,24,0,0,0,
0,0,126,24,60,102,102,102,60,24,126,0,0,0,0,0,
56,108,198,198,254,198,198,108,56,0,0,0,0,0,56,108,
198,198,198,108,108,108,238,0,0,0,0,0,30,48,24,12,
62,102,102,102,60,0,0,0,0,0,0,0,0,126,219,219,
126,0,0,0,0,0,0,0,3,6,126,219,219,243,126,96,
192,0,0,0,0,0,28,48,96,96,124,96,96,48,28,0,
0,0,0,0,0,124,198,198,198,198,198,198,198,0,0,0,
0,0,0,254,0,0,254,0,0,254,0,0,0,0,0,0,
0,24,24,126,24,24,0,0,255,0,0,0,0,0,48,24,
12,6,12,24,48,0,126,0,0,0,0,0,12,24,48,96,
48,24,12,0,126,0,0,0,0,0,14,27,27,24,24,24,
24,24,24,24,24,24,24,24,24,24,24,24,24,24,216,216,
112,0,0,0,0,0,0,24,24,0,126,0,24,24,0,0,
0,0,0,0,0,0,118,220,0,118,220,0,0,0,0,0,
0,56,108,108,56,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,24,24,0,0,0,0,0,0,0,0,0,0,
0,0,0,24,0,0,0,0,0,0,0,15,12,12,12,12,
12,236,108,60,28,0,0,0,0,216,108,108,108,108,108,0,
0,0,0,0,0,0,0,112,216,48,96,200,248,0,0,0,
0,0,0,0,0,0,0,0,124,124,124,124,124,124,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
29,0,0,0,0,36,102,255,102,36,0,0,0,0,0,34,
0,99,99,99,34,0,0,0,0,0,0,0,0,0,43,0,
0,0,24,24,24,255,24,24,24,0,0,0,0,45,0,0,
0,0,0,0,255,0,0,0,0,0,0,0,77,0,0,195,
231,255,219,195,195,195,195,195,0,0,0,84,0,0,255,219,
153,24,24,24,24,24,60,0,0,0,86,0,0,195,195,195,
195,195,195,102,60,24,0,0,0,87,0,0,195,195,195,195,
219,219,255,102,102,0,0,0,88,0,0,195,195,102,60,24,
60,102,195,195,0,0,0,89,0,0,195,195,195,102,60,24,
24,24,60,0,0,0,90,0,0,255,195,134,12,24,48,97,
195,255,0,0,0,109,0,0,0,0,0,230,255,219,219,219,
219,0,0,0,118,0,0,0,0,0,195,195,195,102,60,24,
0,0,0,119,0,0,0,0,0,195,195,219,219,255,102,0,
0,0,145,0,0,0,0,110,59,27,126,216,220,119,0,0,
0,155,0,24,24,126,195,192,192,195,126,24,24,0,0,0,
157,0,0,195,102,60,24,255,24,255,24,24,0,0,0,158,
0,252,102,102,124,98,102,111,102,102,243,0,0,0,241,0,
0,24,24,24,255,24,24,24,0,255,0,0,0,246,0,0,
24,24,0,0,255,0,0,24,24,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,126,129,165,129,189,153,129,126,
126,255,219,255,195,231,255,126,108,254,254,254,124,56,16,0,
16,56,124,254,124,56,16,0,56,124,56,254,254,124,56,124,
16,16,56,124,254,124,56,124,0,0,24,60,60,24,0,0,
255,255,231,195,195,231,255,255,0,60,102,66,66,102,60,0,
255,195,153,189,189,153,195,255,15,7,15,125,204,204,204,120,
60,102,102,102,60,24,126,24,63,51,63,48,48,112,240,224,
127,99,127,99,99,103,230,192,153,90,60,231,231,60,90,153,
128,224,248,254,248,224,128,0,2,14,62,254,62,14,2,0,
24,60,126,24,24,126,60,24,102,102,102,102,102,0,102,0,
127,219,219,123,27,27,27,0,62,99,56,108,108,56,204,120,
0,0,0,0,126,126,126,0,24,60,126,24,126,60,24,255,
24,60,126,24,24,24,24,0,24,24,24,24,126,60,24,0,
0,24,12,254,12,24,0,0,0,48,96,254,96,48,0,0,
0,0,192,192,192,254,0,0,0,36,102,255,102,36,0,0,
0,24,60,126,255,255,0,0,0,255,255,126,60,24,0,0,
0,0,0,0,0,0,0,0,48,120,120,48,48,0,48,0,
108,108,108,0,0,0,0,0,108,108,254,108,254,108,108,0,
48,124,192,120,12,248,48,0,0,198,204,24,48,102,198,0,
56,108,56,118,220,204,118,0,96,96,192,0,0,0,0,0,
24,48,96,96,96,48,24,0,96,48,24,24,24,48,96,0,
0,102,60,255,60,102,0,0,0,48,48,252,48,48,0,0,
0,0,0,0,0,48,48,96,0,0,0,252,0,0,0,0,
0,0,0,0,0,48,48,0,6,12,24,48,96,192,128,0,
124,198,206,222,246,230,124,0,48,112,48,48,48,48,252,0,
120,204,12,56,96,204,252,0,120,204,12,56,12,204,120,0,
28,60,108,204,254,12,30,0,252,192,248,12,12,204,120,0,
56,96,192,248,204,204,120,0,252,204,12,24,48,48,48,0,
120,204,204,120,204,204,120,0,120,204,204,124,12,24,112,0,
0,48,48,0,0,48,48,0,0,48,48,0,0,48,48,96,
24,48,96,192,96,48,24,0,0,0,252,0,0,252,0,0,
96,48,24,12,24,48,96,0,120,204,12,24,48,0,48,0,
124,198,222,222,222,192,120,0,48,120,204,204,252,204,204,0,
252,102,102,124,102,102,252,0,60,102,192,192,192,102,60,0,
248,108,102,102,102,108,248,0,254,98,104,120,104,98,254,0,
254,98,104,120,104,96,240,0,60,102,192,192,206,102,62,0,
204,204,204,252,204,204,204,0,120,48,48,48,48,48,120,0,
30,12,12,12,204,204,120,0,230,102,108,120,108,102,230,0,
240,96,96,96,98,102,254,0,198,238,254,254,214,198,198,0,
198,230,246,222,206,198,198,0,56,108,198,198,198,108,56,0,
252,102,102,124,96,96,240,0,120,204,204,204,220,120,28,0,
252,102,102,124,108,102,230,0,120,204,224,112,28,204,120,0,
252,180,48,48,48,48,120,0,204,204,204,204,204,204,252,0,
204,204,204,204,204,120,48,0,198,198,198,214,254,238,198,0,
198,198,108,56,56,108,198,0,204,204,204,120,48,48,120,0,
254,198,140,24,50,102,254,0,120,96,96,96,96,96,120,0,
192,96,48,24,12,6,2,0,120,24,24,24,24,24,120,0,
16,56,108,198,0,0,0,0,0,0,0,0,0,0,0,255,
48,48,24,0,0,0,0,0,0,0,120,12,124,204,118,0,
224,96,96,124,102,102,220,0,0,0,120,204,192,204,120,0,
28,12,12,124,204,204,118,0,0,0,120,204,252,192,120,0,
56,108,96,240,96,96,240,0,0,0,118,204,204,124,12,248,
224,96,108,118,102,102,230,0,48,0,112,48,48,48,120,0,
12,0,12,12,12,204,204,120,224,96,102,108,120,108,230,0,
112,48,48,48,48,48,120,0,0,0,204,254,254,214,198,0,
0,0,248,204,204,204,204,0,0,0,120,204,204,204,120,0,
0,0,220,102,102,124,96,240,0,0,118,204,204,124,12,30,
0,0,220,118,102,96,240,0,0,0,124,192,120,12,248,0,
16,48,124,48,48,52,24,0,0,0,204,204,204,204,118,0,
0,0,204,204,204,120,48,0,0,0,198,214,254,254,108,0,
0,0,198,108,56,108,198,0,0,0,204,204,204,124,12,248,
0,0,252,152,48,100,252,0,28,48,48,224,48,48,28,0,
24,24,24,0,24,24,24,0,224,48,48,28,48,48,224,0,
118,220,0,0,0,0,0,0,0,16,56,108,198,198,254,0,
120,204,192,204,120,24,12,120,0,204,0,204,204,204,126,0,
28,0,120,204,252,192,120,0,126,195,60,6,62,102,63,0,
204,0,120,12,124,204,126,0,224,0,120,12,124,204,126,0,
48,48,120,12,124,204,126,0,0,0,120,192,192,120,12,56,
126,195,60,102,126,96,60,0,204,0,120,204,252,192,120,0,
224,0,120,204,252,192,120,0,204,0,112,48,48,48,120,0,
124,198,56,24,24,24,60,0,224,0,112,48,48,48,120,0,
198,56,108,198,254,198,198,0,48,48,0,120,204,252,204,0,
28,0,252,96,120,96,252,0,0,0,127,12,127,204,127,0,
62,108,204,254,204,204,206,0,120,204,0,120,204,204,120,0,
0,204,0,120,204,204,120,0,0,224,0,120,204,204,120,0,
120,204,0,204,204,204,126,0,0,224,0,204,204,204,126,0,
0,204,0,204,204,124,12,248,195,24,60,102,102,60,24,0,
204,0,204,204,204,204,120,0,24,24,126,192,192,126,24,24,
56,108,100,240,96,230,252,0,204,204,120,252,48,252,48,48,
248,204,204,250,198,207,198,199,14,27,24,60,24,24,216,112,
28,0,120,12,124,204,126,0,56,0,112,48,48,48,120,0,
0,28,0,120,204,204,120,0,0,28,0,204,204,204,126,0,
0,248,0,248,204,204,204,0,252,0,204,236,252,220,204,0,
60,108,108,62,0,126,0,0,56,108,108,56,0,124,0,0,
48,0,48,96,192,204,120,0,0,0,0,252,192,192,0,0,
0,0,0,252,12,12,0,0,195,198,204,222,51,102,204,15,
195,198,204,219,55,111,207,3,24,24,0,24,24,24,24,0,
0,51,102,204,102,51,0,0,0,204,102,51,102,204,0,0,
34,136,34,136,34,136,34,136,85,170,85,170,85,170,85,170,
219,119,219,238,219,119,219,238,24,24,24,24,24,24,24,24,
24,24,24,24,248,24,24,24,24,24,248,24,248,24,24,24,
54,54,54,54,246,54,54,54,0,0,0,0,254,54,54,54,
0,0,248,24,248,24,24,24,54,54,246,6,246,54,54,54,
54,54,54,54,54,54,54,54,0,0,254,6,246,54,54,54,
54,54,246,6,254,0,0,0,54,54,54,54,254,0,0,0,
24,24,248,24,248,0,0,0,0,0,0,0,248,24,24,24,
24,24,24,24,31,0,0,0,24,24,24,24,255,0,0,0,
0,0,0,0,255,24,24,24,24,24,24,24,31,24,24,24,
0,0,0,0,255,0,0,0,24,24,24,24,255,24,24,24,
24,24,31,24,31,24,24,24,54,54,54,54,55,54,54,54,
54,54,55,48,63,0,0,0,0,0,63,48,55,54,54,54,
54,54,247,0,255,0,0,0,0,0,255,0,247,54,54,54,
54,54,55,48,55,54,54,54,0,0,255,0,255,0,0,0,
54,54,247,0,247,54,54,54,24,24,255,0,255,0,0,0,
54,54,54,54,255,0,0,0,0,0,255,0,255,24,24,24,
0,0,0,0,255,54,54,54,54,54,54,54,63,0,0,0,
24,24,31,24,31,0,0,0,0,0,31,24,31,24,24,24,
0,0,0,0,63,54,54,54,54,54,54,54,255,54,54,54,
24,24,255,24,255,24,24,24,24,24,24,24,248,0,0,0,
0,0,0,0,31,24,24,24,255,255,255,255,255,255,255,255,
0,0,0,0,255,255,255,255,240,240,240,240,240,240,240,240,
15,15,15,15,15,15,15,15,255,255,255,255,0,0,0,0,
0,0,118,220,200,220,118,0,0,120,204,248,204,248,192,192,
0,252,204,192,192,192,192,0,0,254,108,108,108,108,108,0,
252,204,96,48,96,204,252,0,0,0,126,216,216,216,112,0,
0,102,102,102,102,124,96,192,0,118,220,24,24,24,24,0,
252,48,120,204,204,120,48,252,56,108,198,254,198,108,56,0,
56,108,198,198,108,108,238,0,28,48,24,124,204,204,120,0,
0,0,126,219,219,126,0,0,6,12,126,219,219,126,96,192,
56,96,192,248,192,96,56,0,120,204,204,204,204,204,204,0,
0,252,0,252,0,252,0,0,48,48,252,48,48,0,252,0,
96,48,24,48,96,0,252,0,24,48,96,48,24,0,252,0,
14,27,27,24,24,24,24,24,24,24,24,24,24,216,216,112,
48,48,0,252,0,48,48,0,0,118,220,0,118,220,0,0,
56,108,108,56,0,0,0,0,0,0,0,24,24,0,0,0,
0,0,0,0,24,0,0,0,15,12,12,12,236,108,60,28,
120,108,108,108,108,0,0,0,112,24,48,96,120,0,0,0,
0,0,60,60,60,60,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70]
,"symbols":{"VIDEO_SETUP":{"o":3},"POR_1":{"o":146},"RD_SWS":{"o":155},"F_BTS":{"o":206},"MK_ENV":{"o":243},"ENV_X":{"o":328,"c":"SET 40x25 COLOR ALPHA"}}} 0003 @ VIDEO_SETUP
0092 @ POR_1
009B @ RD_SWS
00CE @ F_BTS
00F3 @ MK_ENV
0148 @ ENV_X ; SET 40x25 COLOR ALPHA
0D20 @ BEEP
<?xml version="1.0" encoding="UTF-8"?> <video id="videoMDA" model="mda" screenwidth="720" screenheight="350" scale="true" charset="/devices/pc/video/ibm/mda/ibm-mda.json" pos="center" padding="8px"> <menu> <title>Monochrome Display</title> <control type="container" pos="right"> <control type="led" label="Caps" binding="caps-lock" padleft="8px"/> <control type="led" label="Num" binding="num-lock" padleft="8px"/> <control type="led" label="Scroll" binding="scroll-lock" padleft="8px"/> </control> </menu> </video>
[0,0,0,0,0,0,0,0,0,0,126,129,165,129,129,189,0,0,126,255,219,255,255,195,0,0,0,54,127,127,127,127,0,0,0,8,28,62,127,62,0,0, 24,60,60,231,231,231,0,0,24,60,126,255,255,126,0,0,0,0,0,24,60,60,255,255,255,255,255,231,195,195,0,0,0,0,60,102,66,66,255, 255,255,255,195,153,189,189,0,0,15,7,13,25,60,102,0,0,60,102,102,102,60,24,0,0,63,51,63,48,48,48,0,0,127,99,127,99,99,99, 0,0,24,24,219,60,231,60,0,0,64,96,112,124,127,124,0,0,1,3,7,31,127,31,0,0,24,60,126,24,24,24,0,0,51,51,51,51,51,51,0,0,127, 219,219,219,123,27,0,62,99,48,28,54,99,99,0,0,0,0,0,0,0,0,0,0,24,60,126,24,24,24,0,0,24,60,126,24,24,24,0,0,24,24,24,24,24, 24,0,0,0,0,12,6,127,6,0,0,0,0,24,48,127,48,0,0,0,0,0,96,96,96,0,0,0,0,36,102,255,102,0,0,0,8,28,28,62,62,0,0,0,127,127,62, 62,28,0,0,0,0,0,0,0,0,0,0,24,60,60,60,24,24,0,99,99,99,34,0,0,0,0,0,54,54,127,54,54,54,12,12,62,99,97,96,62,3,0,0,0,0,97, 99,6,12,0,0,28,54,54,28,59,110,0,48,48,48,96,0,0,0,0,0,12,24,48,48,48,48,0,0,24,12,6,6,6,6,0,0,0,0,102,60,255,60,0,0,0,24, 24,24,255,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,1,3,6,12,24,48,0,0,62,99,103,111,123,115,0,0,12,28,60, 12,12,12,0,0,62,99,3,6,12,24,0,0,62,99,3,3,30,3,0,0,6,14,30,54,102,127,0,0,127,96,96,96,126,3,0,0,28,48,96,96,126,99,0,0, 127,99,3,6,12,24,0,0,62,99,99,99,62,99,0,0,62,99,99,99,63,3,0,0,0,24,24,0,0,0,0,0,0,24,24,0,0,0,0,0,6,12,24,48,96,48,0,0, 0,0,0,126,0,0,0,0,96,48,24,12,6,12,0,0,62,99,99,6,12,12,0,0,62,99,99,111,111,111,0,0,8,28,54,99,99,127,0,0,126,51,51,51,62, 51,0,0,30,51,97,96,96,96,0,0,124,54,51,51,51,51,0,0,127,51,49,52,60,52,0,0,127,51,49,52,60,52,0,0,30,51,97,96,96,111,0,0, 99,99,99,99,127,99,0,0,60,24,24,24,24,24,0,0,15,6,6,6,6,6,0,0,115,51,54,54,60,54,0,0,120,48,48,48,48,48,0,0,195,231,255,219, 195,195,0,0,99,115,123,127,111,103,0,0,28,54,99,99,99,99,0,0,126,51,51,51,62,48,0,0,62,99,99,99,99,107,0,0,126,51,51,51,62, 54,0,0,62,99,99,48,28,6,0,0,255,219,153,24,24,24,0,0,99,99,99,99,99,99,0,0,195,195,195,195,195,195,0,0,195,195,195,195,219, 219,0,0,195,195,102,60,24,60,0,0,195,195,195,102,60,24,0,0,255,195,134,12,24,48,0,0,60,48,48,48,48,48,0,0,64,96,112,56,28, 14,0,0,60,12,12,12,12,12,8,28,54,99,0,0,0,0,0,0,0,0,0,0,0,0,24,24,12,0,0,0,0,0,0,0,0,0,0,60,6,62,0,0,112,48,48,60,54,51,0, 0,0,0,0,62,99,96,0,0,14,6,6,30,54,102,0,0,0,0,0,62,99,127,0,0,28,54,50,48,124,48,0,0,0,0,0,59,102,102,0,0,112,48,48,54,59, 51,0,0,12,12,0,28,12,12,0,0,6,6,0,14,6,6,0,0,112,48,48,51,54,60,0,0,28,12,12,12,12,12,0,0,0,0,0,230,255,219,0,0,0,0,0,110, 51,51,0,0,0,0,0,62,99,99,0,0,0,0,0,110,51,51,0,0,0,0,0,59,102,102,0,0,0,0,0,110,59,51,0,0,0,0,0,62,99,56,0,0,8,24,24,126, 24,24,0,0,0,0,0,102,102,102,0,0,0,0,0,195,195,195,0,0,0,0,0,195,195,219,0,0,0,0,0,99,54,28,0,0,0,0,0,99,99,99,0,0,0,0,0,127, 102,12,0,0,14,24,24,24,112,24,0,0,24,24,24,24,0,24,0,0,112,24,24,24,14,24,0,0,59,110,0,0,0,0,0,0,0,0,8,28,54,99,0,0,30,51, 97,96,96,97,0,0,102,102,0,102,102,102,0,6,12,24,0,62,99,127,0,8,28,54,0,60,6,62,0,0,102,102,0,60,6,62,0,48,24,12,0,60,6,62, 0,28,54,28,0,60,6,62,0,0,0,0,60,102,96,102,0,8,28,54,0,62,99,127,0,0,102,102,0,62,99,127,0,48,24,12,0,62,99,127,0,0,102,102, 0,56,24,24,0,24,60,102,0,56,24,24,0,96,48,24,0,56,24,24,0,99,99,8,28,54,99,99,28,54,28,0,28,54,99,99,12,24,48,0,127,51,48, 62,0,0,0,0,110,59,27,126,0,0,31,54,102,102,127,102,0,8,28,54,0,62,99,99,0,0,99,99,0,62,99,99,0,48,24,12,0,62,99,99,0,24,60, 102,0,102,102,102,0,48,24,12,0,102,102,102,0,0,99,99,0,99,99,99,0,99,99,28,54,99,99,99,0,99,99,0,99,99,99,99,0,24,24,126, 195,192,192,195,0,28,54,50,48,120,48,48,0,0,195,102,60,24,255,24,0,252,102,102,124,98,102,111,0,14,27,24,24,24,126,24,0,12, 24,48,0,60,6,62,0,12,24,48,0,56,24,24,0,12,24,48,0,62,99,99,0,12,24,48,0,102,102,102,0,0,59,110,0,110,51,51,59,110,0,99,115, 123,127,111,0,60,108,108,62,0,126,0,0,56,108,108,56,0,124,0,0,0,24,24,0,24,24,48,0,0,0,0,0,0,127,96,0,0,0,0,0,0,127,3,0,96, 224,99,102,108,24,48,0,96,224,99,102,108,24,51,0,0,24,24,0,24,24,60,0,0,0,0,27,54,108,54,0,0,0,0,108,54,27,54,17,68,17,68, 17,68,17,68,85,170,85,170,85,170,85,170,221,119,221,119,221,119,221,119,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,248, 24,24,24,24,24,248,24,248,54,54,54,54,54,54,54,246,0,0,0,0,0,0,0,254,0,0,0,0,0,248,24,248,54,54,54,54,54,246,6,246,54,54, 54,54,54,54,54,54,0,0,0,0,0,254,6,246,54,54,54,54,54,246,6,254,54,54,54,54,54,54,54,254,24,24,24,24,24,248,24,248,0,0,0,0, 0,0,0,248,24,24,24,24,24,24,24,31,24,24,24,24,24,24,24,255,0,0,0,0,0,0,0,255,24,24,24,24,24,24,24,31,0,0,0,0,0,0,0,255,24, 24,24,24,24,24,24,255,24,24,24,24,24,31,24,31,54,54,54,54,54,54,54,55,54,54,54,54,54,55,48,63,0,0,0,0,0,63,48,55,54,54,54, 54,54,247,0,255,0,0,0,0,0,255,0,247,54,54,54,54,54,55,48,55,0,0,0,0,0,255,0,255,54,54,54,54,54,247,0,247,24,24,24,24,24,255, 0,255,54,54,54,54,54,54,54,255,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,255,54,54,54,54,54,54,54,63,24,24,24,24,24,31,24,31,0,0, 0,0,0,31,24,31,0,0,0,0,0,0,0,63,54,54,54,54,54,54,54,255,24,24,24,24,24,255,24,255,24,24,24,24,24,24,24,248,0,0,0,0,0,0,0, 31,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,255,240,240,240,240,240,240,240,240,15,15,15,15,15,15,15,15,255,255,255, 255,255,255,255,0,0,0,0,0,0,59,110,108,0,0,0,0,62,99,126,99,0,0,127,99,99,96,96,96,0,0,0,0,127,54,54,54,0,0,127,99,48,24, 12,24,0,0,0,0,0,63,108,108,0,0,0,0,51,51,51,51,0,0,0,0,59,110,12,12,0,0,126,24,60,102,102,102,0,0,28,54,99,99,127,99,0,0, 28,54,99,99,99,54,0,0,30,48,24,12,62,102,0,0,0,0,0,126,219,219,0,0,3,6,126,219,219,243,0,0,28,48,96,96,124,96,0,0,0,62,99, 99,99,99,0,0,0,127,0,0,127,0,0,0,24,24,24,255,24,24,0,0,48,24,12,6,12,24,0,0,12,24,48,96,48,24,0,0,14,27,27,24,24,24,24,24, 24,24,24,24,24,24,0,0,24,24,0,0,255,0,0,0,0,0,59,110,0,59,0,56,108,108,56,0,0,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,0,24,0,15,12, 12,12,12,12,236,0,216,108,108,108,108,108,0,0,112,216,48,96,200,248,0,0,0,0,0,62,62,62,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 153,129,126,0,0,0,0,0,231,255,126,0,0,0,0,0,62,28,8,0,0,0,0,0,28,8,0,0,0,0,0,0,24,24,60,0,0,0,0,0,24,24,60,0,0,0,0,0,24,0, 0,0,0,0,0,0,231,255,255,255,255,255,0,0,102,60,0,0,0,0,0,0,153,195,255,255,255,255,0,0,102,102,60,0,0,0,0,0,126,24,24,0,0, 0,0,0,112,240,224,0,0,0,0,0,103,231,230,192,0,0,0,0,219,24,24,0,0,0,0,0,112,96,64,0,0,0,0,0,7,3,1,0,0,0,0,0,126,60,24,0,0, 0,0,0,0,51,51,0,0,0,0,0,27,27,27,0,0,0,0,0,54,28,6,99,62,0,0,0,127,127,127,0,0,0,0,0,126,60,24,126,0,0,0,0,24,24,24,0,0,0, 0,0,126,60,24,0,0,0,0,0,12,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,36,0,0,0,0,0,0,0,127,127,0,0,0,0,0,0,28,8,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,0,0,0,0,0,0,0,127,54,54,0,0,0,0,0,67,99,62,12,12,0,0,0,24,51,99,0,0,0,0,0,102, 102,59,0,0,0,0,0,0,0,0,0,0,0,0,0,48,24,12,0,0,0,0,0,6,12,24,0,0,0,0,0,102,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,24,24,24,48,0,0, 0,0,0,0,0,0,0,0,0,0,0,24,24,0,0,0,0,0,96,64,0,0,0,0,0,0,99,99,62,0,0,0,0,0,12,12,63,0,0,0,0,0,48,99,127,0,0,0,0,0,3,99,62, 0,0,0,0,0,6,6,15,0,0,0,0,0,3,99,62,0,0,0,0,0,99,99,62,0,0,0,0,0,24,24,24,0,0,0,0,0,99,99,62,0,0,0,0,0,3,6,60,0,0,0,0,0,24, 24,0,0,0,0,0,0,24,24,48,0,0,0,0,0,24,12,6,0,0,0,0,0,126,0,0,0,0,0,0,0,24,48,96,0,0,0,0,0,0,12,12,0,0,0,0,0,110,96,62,0,0, 0,0,0,99,99,99,0,0,0,0,0,51,51,126,0,0,0,0,0,97,51,30,0,0,0,0,0,51,54,124,0,0,0,0,0,49,51,127,0,0,0,0,0,48,48,120,0,0,0,0, 0,99,51,29,0,0,0,0,0,99,99,99,0,0,0,0,0,24,24,60,0,0,0,0,0,102,102,60,0,0,0,0,0,54,51,115,0,0,0,0,0,49,51,127,0,0,0,0,0,195, 195,195,0,0,0,0,0,99,99,99,0,0,0,0,0,99,54,28,0,0,0,0,0,48,48,120,0,0,0,0,0,111,62,6,7,0,0,0,0,51,51,115,0,0,0,0,0,99,99, 62,0,0,0,0,0,24,24,60,0,0,0,0,0,99,99,62,0,0,0,0,0,102,60,24,0,0,0,0,0,255,102,102,0,0,0,0,0,102,195,195,0,0,0,0,0,24,24, 60,0,0,0,0,0,97,195,255,0,0,0,0,0,48,48,60,0,0,0,0,0,7,3,1,0,0,0,0,0,12,12,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0, 0,0,0,0,0,0,0,0,102,102,59,0,0,0,0,0,51,51,110,0,0,0,0,0,96,99,62,0,0,0,0,0,102,102,59,0,0,0,0,0,96,99,62,0,0,0,0,0,48,48, 120,0,0,0,0,0,102,62,6,102,60,0,0,0,51,51,115,0,0,0,0,0,12,12,30,0,0,0,0,0,6,6,102,102,60,0,0,0,54,51,115,0,0,0,0,0,12,12, 30,0,0,0,0,0,219,219,219,0,0,0,0,0,51,51,51,0,0,0,0,0,99,99,62,0,0,0,0,0,51,62,48,48,120,0,0,0,102,62,6,6,15,0,0,0,48,48, 120,0,0,0,0,0,14,99,62,0,0,0,0,0,24,27,14,0,0,0,0,0,102,102,59,0,0,0,0,0,102,60,24,0,0,0,0,0,219,255,102,0,0,0,0,0,28,54, 99,0,0,0,0,0,99,63,3,6,60,0,0,0,24,51,127,0,0,0,0,0,24,24,14,0,0,0,0,0,24,24,24,0,0,0,0,0,24,24,112,0,0,0,0,0,0,0,0,0,0,0, 0,0,99,127,0,0,0,0,0,0,51,30,6,3,62,0,0,0,102,102,59,0,0,0,0,0,96,99,62,0,0,0,0,0,102,102,59,0,0,0,0,0,102,102,59,0,0,0,0, 0,102,102,59,0,0,0,0,0,102,102,59,0,0,0,0,0,60,12,6,60,0,0,0,0,96,99,62,0,0,0,0,0,96,99,62,0,0,0,0,0,96,99,62,0,0,0,0,0,24, 24,60,0,0,0,0,0,24,24,60,0,0,0,0,0,24,24,60,0,0,0,0,0,127,99,99,0,0,0,0,0,127,99,99,0,0,0,0,0,48,51,127,0,0,0,0,0,216,220, 119,0,0,0,0,0,102,102,103,0,0,0,0,0,99,99,62,0,0,0,0,0,99,99,62,0,0,0,0,0,99,99,62,0,0,0,0,0,102,102,59,0,0,0,0,0,102,102, 59,0,0,0,0,0,99,63,3,6,60,0,0,0,99,54,28,0,0,0,0,0,99,99,62,0,0,0,0,0,126,24,24,0,0,0,0,0,48,115,126,0,0,0,0,0,255,24,24, 0,0,0,0,0,102,102,243,0,0,0,0,0,24,24,24,216,112,0,0,0,102,102,59,0,0,0,0,0,24,24,60,0,0,0,0,0,99,99,62,0,0,0,0,0,102,102, 59,0,0,0,0,0,51,51,51,0,0,0,0,0,103,99,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,99,62,0,0,0,0,0,96,96,0,0,0,0,0,0, 3,3,0,0,0,0,0,0,110,195,6,12,31,0,0,0,103,207,31,3,3,0,0,0,60,60,24,0,0,0,0,0,27,0,0,0,0,0,0,0,108,0,0,0,0,0,0,0,17,68,17, 68,17,68,0,0,85,170,85,170,85,170,0,0,221,119,221,119,221,119,0,0,24,24,24,24,24,24,0,0,24,24,24,24,24,24,0,0,24,24,24,24, 24,24,0,0,54,54,54,54,54,54,0,0,54,54,54,54,54,54,0,0,24,24,24,24,24,24,0,0,54,54,54,54,54,54,0,0,54,54,54,54,54,54,0,0,54, 54,54,54,54,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,24,24,24,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 24,24,24,24,24,24,0,0,24,24,24,24,24,24,0,0,0,0,0,0,0,0,0,0,24,24,24,24,24,24,0,0,24,24,24,24,24,24,0,0,54,54,54,54,54,54, 0,0,0,0,0,0,0,0,0,0,54,54,54,54,54,54,0,0,0,0,0,0,0,0,0,0,54,54,54,54,54,54,0,0,54,54,54,54,54,54,0,0,0,0,0,0,0,0,0,0,54, 54,54,54,54,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,24,24,24,24,0,0,54,54,54,54,54,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,24,24,24,24,24,24,0,0,54,54,54,54,54,54,0,0,54,54,54,54,54,54,0,0,24,24,24,24,24,24,0,0,0,0,0,0,0,0,0,0,24,24,24,24, 24,24,0,0,255,255,255,255,255,255,0,0,255,255,255,255,255,255,0,0,240,240,240,240,240,240,0,0,15,15,15,15,15,15,0,0,0,0,0, 0,0,0,0,0,108,110,59,0,0,0,0,0,99,126,96,96,32,0,0,0,96,96,96,0,0,0,0,0,54,54,54,0,0,0,0,0,48,99,127,0,0,0,0,0,108,108,56, 0,0,0,0,0,62,48,48,96,0,0,0,0,12,12,12,0,0,0,0,0,60,24,126,0,0,0,0,0,99,54,28,0,0,0,0,0,54,54,119,0,0,0,0,0,102,102,60,0, 0,0,0,0,126,0,0,0,0,0,0,0,126,96,192,0,0,0,0,0,96,48,28,0,0,0,0,0,99,99,99,0,0,0,0,0,0,127,0,0,0,0,0,0,24,0,255,0,0,0,0,0, 48,0,126,0,0,0,0,0,12,0,126,0,0,0,0,0,24,24,24,24,24,24,0,0,216,216,112,0,0,0,0,0,0,24,24,0,0,0,0,0,110,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,62,62,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,126,129,165,129,189,153,129,126,126,255,219,255,195,231,255,126,108,254,254,254,124,56,16,0,16,56, 124,254,124,56,16,0,56,124,56,254,254,214,16,56,16,16,56,124,254,124,16,56,0,0,24,60,60,24,0,0,255,255,231,195,195,231,255, 255,0,60,102,66,66,102,60,0,255,195,153,189,189,153,195,255,15,3,5,125,132,132,132,120,60,66,66,66,60,24,126,24,63,33,63, 32,32,96,224,192,63,33,63,33,35,103,230,192,24,219,60,231,231,60,219,24,128,224,248,254,248,224,128,0,2,14,62,254,62,14,2, 0,24,60,126,24,24,126,60,24,36,36,36,36,36,0,36,0,127,146,146,114,18,18,18,0,62,99,56,68,68,56,204,120,0,0,0,0,126,126,126, 0,24,60,126,24,126,60,24,255,16,56,124,84,16,16,16,0,16,16,16,84,124,56,16,0,0,24,12,254,12,24,0,0,0,48,96,254,96,48,0,0, 0,0,64,64,64,126,0,0,0,36,102,255,102,36,0,0,0,16,56,124,254,254,0,0,0,254,254,124,56,16,0,0,0,0,0,0,0,0,0,0,16,56,56,16, 16,0,16,0,36,36,36,0,0,0,0,0,36,36,126,36,126,36,36,0,24,62,64,60,2,124,24,0,0,98,100,8,16,38,70,0,48,72,48,86,136,136,118, 0,16,16,32,0,0,0,0,0,16,32,64,64,64,32,16,0,32,16,8,8,8,16,32,0,0,68,56,254,56,68,0,0,0,16,16,124,16,16,0,0,0,0,0,0,0,16, 16,32,0,0,0,126,0,0,0,0,0,0,0,0,0,16,16,0,0,2,4,8,16,32,64,0,60,66,70,74,82,98,60,0,16,48,80,16,16,16,124,0,60,66,2,12,48, 66,126,0,60,66,2,28,2,66,60,0,8,24,40,72,254,8,28,0,126,64,124,2,2,66,60,0,28,32,64,124,66,66,60,0,126,66,4,8,16,16,16,0, 60,66,66,60,66,66,60,0,60,66,66,62,2,4,56,0,0,16,16,0,0,16,16,0,0,16,16,0,0,16,16,32,8,16,32,64,32,16,8,0,0,0,126,0,0,126, 0,0,16,8,4,2,4,8,16,0,60,66,2,4,8,0,8,0,60,66,94,82,94,64,60,0,24,36,66,66,126,66,66,0,124,34,34,60,34,34,124,0,28,34,64, 64,64,34,28,0,120,36,34,34,34,36,120,0,126,34,40,56,40,34,126,0,126,34,40,56,40,32,112,0,28,34,64,64,78,34,30,0,66,66,66, 126,66,66,66,0,56,16,16,16,16,16,56,0,14,4,4,4,68,68,56,0,98,36,40,48,40,36,99,0,112,32,32,32,32,34,126,0,99,85,73,65,65, 65,65,0,98,82,74,70,66,66,66,0,24,36,66,66,66,36,24,0,124,34,34,60,32,32,112,0,60,66,66,66,74,60,3,0,124,34,34,60,40,36,114, 0,60,66,64,60,2,66,60,0,127,73,8,8,8,8,28,0,66,66,66,66,66,66,60,0,65,65,65,65,34,20,8,0,65,65,65,73,73,73,54,0,65,34,20, 8,20,34,65,0,65,34,20,8,8,8,28,0,127,66,4,8,16,33,127,0,120,64,64,64,64,64,120,0,128,64,32,16,8,4,2,0,120,8,8,8,8,8,120,0, 16,40,68,130,0,0,0,0,0,0,0,0,0,0,0,255,16,16,8,0,0,0,0,0,0,0,60,2,62,66,63,0,96,32,32,46,49,49,46,0,0,0,60,66,64,66,60,0, 6,2,2,58,70,70,59,0,0,0,60,66,126,64,60,0,12,18,16,56,16,16,56,0,0,0,61,66,66,62,2,124,96,32,44,50,34,34,98,0,16,0,48,16, 16,16,56,0,2,0,6,2,2,66,66,60,96,32,36,40,48,40,38,0,48,16,16,16,16,16,56,0,0,0,118,73,73,73,73,0,0,0,92,98,66,66,66,0,0, 0,60,66,66,66,60,0,0,0,108,50,50,44,32,112,0,0,54,76,76,52,4,14,0,0,108,50,34,32,112,0,0,0,62,64,60,2,124,0,16,16,124,16, 16,18,12,0,0,0,66,66,66,70,58,0,0,0,65,65,34,20,8,0,0,0,65,73,73,73,54,0,0,0,68,40,16,40,68,0,0,0,66,66,66,62,2,124,0,0,124, 8,16,32,124,0,12,16,16,96,16,16,12,0,16,16,16,0,16,16,16,0,48,8,8,6,8,8,48,0,50,76,0,0,0,0,0,0,0,8,20,34,65,65,127,0,60,66, 64,66,60,12,2,60,0,68,0,68,68,68,62,0,12,0,60,66,126,64,60,0,60,66,56,4,60,68,62,0,66,0,56,4,60,68,62,0,48,0,56,4,60,68,62, 0,16,0,56,4,60,68,62,0,0,0,60,64,64,60,6,28,60,66,60,66,126,64,60,0,66,0,60,66,126,64,60,0,48,0,60,66,126,64,60,0,36,0,24, 8,8,8,28,0,124,130,48,16,16,16,56,0,48,0,24,8,8,8,28,0,66,24,36,66,126,66,66,0,24,24,0,60,66,126,66,0,12,0,124,32,56,32,124, 0,0,0,51,12,63,68,59,0,31,36,68,127,68,68,71,0,24,36,0,60,66,66,60,0,0,66,0,60,66,66,60,0,32,16,0,60,66,66,60,0,24,36,0,66, 66,66,60,0,32,16,0,66,66,66,60,0,0,66,0,66,66,62,2,60,66,24,36,66,66,36,24,0,66,0,66,66,66,66,60,0,8,8,62,64,64,62,8,8,24, 36,32,112,32,66,124,0,68,40,124,16,124,16,16,0,248,76,120,68,79,68,69,230,28,18,16,124,16,16,144,96,12,0,56,4,60,68,62,0, 12,0,24,8,8,8,28,0,4,8,0,60,66,66,60,0,0,4,8,66,66,66,60,0,50,76,0,124,66,66,66,0,52,76,0,98,82,74,70,0,60,68,68,62,0,126, 0,0,56,68,68,56,0,124,0,0,16,0,16,32,64,66,60,0,0,0,0,126,64,64,0,0,0,0,0,126,2,2,0,0,66,196,72,246,41,67,140,31,66,196,74, 246,42,95,130,2,0,16,0,16,16,16,16,0,0,18,36,72,36,18,0,0,0,72,36,18,36,72,0,0,34,136,34,136,34,136,34,136,85,170,85,170, 85,170,85,170,219,119,219,238,219,119,219,238,16,16,16,16,16,16,16,16,16,16,16,16,240,16,16,16,16,16,240,16,240,16,16,16, 20,20,20,20,244,20,20,20,0,0,0,0,252,20,20,20,0,0,240,16,240,16,16,16,20,20,244,4,244,20,20,20,20,20,20,20,20,20,20,20,0, 0,252,4,244,20,20,20,20,20,244,4,252,0,0,0,20,20,20,20,252,0,0,0,16,16,240,16,240,0,0,0,0,0,0,0,240,16,16,16,16,16,16,16, 31,0,0,0,16,16,16,16,255,0,0,0,0,0,0,0,255,16,16,16,16,16,16,16,31,16,16,16,0,0,0,0,255,0,0,0,16,16,16,16,255,16,16,16,16, 16,31,16,31,16,16,16,20,20,20,20,23,20,20,20,20,20,23,16,31,0,0,0,0,0,31,16,23,20,20,20,20,20,247,0,255,0,0,0,0,0,255,0,247, 20,20,20,20,20,23,16,23,20,20,20,0,0,255,0,255,0,0,0,20,20,247,0,247,20,20,20,16,16,255,0,255,0,0,0,20,20,20,20,255,0,0,0, 0,0,255,0,255,16,16,16,0,0,0,0,255,20,20,20,20,20,20,20,31,0,0,0,16,16,31,16,31,0,0,0,0,0,31,16,31,16,16,16,0,0,0,0,31,20, 20,20,20,20,20,20,255,20,20,20,16,16,255,16,255,16,16,16,16,16,16,16,240,0,0,0,0,0,0,0,31,16,16,16,255,255,255,255,255,255, 255,255,0,0,0,0,255,255,255,255,240,240,240,240,240,240,240,240,15,15,15,15,15,15,15,15,255,255,255,255,0,0,0,0,0,0,49,74, 68,74,49,0,0,60,66,124,66,124,64,64,0,126,66,64,64,64,64,0,0,63,84,20,20,20,20,0,126,66,32,24,32,66,126,0,0,0,62,72,72,72, 48,0,0,68,68,68,122,64,64,128,0,51,76,8,8,8,8,0,124,16,56,68,68,56,16,124,24,36,66,126,66,36,24,0,24,36,66,66,36,36,102,0, 28,32,24,60,66,66,60,0,0,98,149,137,149,98,0,0,2,4,60,74,82,60,64,128,12,16,32,60,32,16,12,0,60,66,66,66,66,66,66,0,0,126, 0,126,0,126,0,0,16,16,124,16,16,0,124,0,16,8,4,8,16,0,126,0,8,16,32,16,8,0,126,0,12,18,18,16,16,16,16,16,16,16,16,16,16,144, 144,96,24,24,0,126,0,24,24,0,0,50,76,0,50,76,0,0,48,72,72,48,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,0,24,0,0,0,15,8,8,8,8,200,40, 24,120,68,68,68,68,0,0,0,48,72,16,32,120,0,0,0,0,0,60,60,60,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,126,129,165,129,189,153, 129,126,126,255,219,255,195,231,255,126,108,254,254,254,124,56,16,0,16,56,124,254,124,56,16,0,56,124,56,254,254,214,16,56, 16,16,56,124,254,124,16,56,0,0,24,60,60,24,0,0,255,255,231,195,195,231,255,255,0,60,102,66,66,102,60,0,255,195,153,189,189, 153,195,255,15,7,15,125,204,204,204,120,60,102,102,102,60,24,126,24,63,51,63,48,48,112,240,224,127,99,127,99,99,103,230,192, 24,219,60,231,231,60,219,24,128,224,248,254,248,224,128,0,2,14,62,254,62,14,2,0,24,60,126,24,24,126,60,24,102,102,102,102, 102,0,102,0,127,219,219,123,27,27,27,0,62,99,56,108,108,56,204,120,0,0,0,0,126,126,126,0,24,60,126,24,126,60,24,255,24,60, 126,24,24,24,24,0,24,24,24,24,126,60,24,0,0,24,12,254,12,24,0,0,0,48,96,254,96,48,0,0,0,0,192,192,192,254,0,0,0,36,102,255, 102,36,0,0,0,24,60,126,255,255,0,0,0,255,255,126,60,24,0,0,0,0,0,0,0,0,0,0,48,120,120,48,48,0,48,0,108,108,108,0,0,0,0,0, 108,108,254,108,254,108,108,0,48,124,192,120,12,248,48,0,0,198,204,24,48,102,198,0,56,108,56,118,220,204,118,0,96,96,192, 0,0,0,0,0,24,48,96,96,96,48,24,0,96,48,24,24,24,48,96,0,0,102,60,255,60,102,0,0,0,48,48,252,48,48,0,0,0,0,0,0,0,48,48,96, 0,0,0,252,0,0,0,0,0,0,0,0,0,48,48,0,6,12,24,48,96,192,128,0,124,198,206,222,246,230,124,0,48,112,48,48,48,48,252,0,120,204, 12,56,96,204,252,0,120,204,12,56,12,204,120,0,28,60,108,204,254,12,30,0,252,192,248,12,12,204,120,0,56,96,192,248,204,204, 120,0,252,204,12,24,48,48,48,0,120,204,204,120,204,204,120,0,120,204,204,124,12,24,112,0,0,48,48,0,0,48,48,0,0,48,48,0,0, 48,48,96,24,48,96,192,96,48,24,0,0,0,252,0,0,252,0,0,96,48,24,12,24,48,96,0,120,204,12,24,48,0,48,0,124,198,222,222,222,192, 120,0,48,120,204,204,252,204,204,0,252,102,102,124,102,102,252,0,60,102,192,192,192,102,60,0,248,108,102,102,102,108,248, 0,254,98,104,120,104,98,254,0,254,98,104,120,104,96,240,0,60,102,192,192,206,102,62,0,204,204,204,252,204,204,204,0,120,48, 48,48,48,48,120,0,30,12,12,12,204,204,120,0,230,102,108,120,108,102,230,0,240,96,96,96,98,102,254,0,198,238,254,254,214,198, 198,0,198,230,246,222,206,198,198,0,56,108,198,198,198,108,56,0,252,102,102,124,96,96,240,0,120,204,204,204,220,120,28,0, 252,102,102,124,108,102,230,0,120,204,96,48,24,204,120,0,252,180,48,48,48,48,120,0,204,204,204,204,204,204,252,0,204,204, 204,204,204,120,48,0,198,198,198,214,254,238,198,0,198,198,108,56,56,108,198,0,204,204,204,120,48,48,120,0,254,198,140,24, 50,102,254,0,120,96,96,96,96,96,120,0,192,96,48,24,12,6,2,0,120,24,24,24,24,24,120,0,16,56,108,198,0,0,0,0,0,0,0,0,0,0,0, 255,48,48,24,0,0,0,0,0,0,0,120,12,124,204,118,0,224,96,96,124,102,102,220,0,0,0,120,204,192,204,120,0,28,12,12,124,204,204, 118,0,0,0,120,204,252,192,120,0,56,108,96,240,96,96,240,0,0,0,118,204,204,124,12,248,224,96,108,118,102,102,230,0,48,0,112, 48,48,48,120,0,12,0,12,12,12,204,204,120,224,96,102,108,120,108,230,0,112,48,48,48,48,48,120,0,0,0,204,254,254,214,198,0, 0,0,248,204,204,204,204,0,0,0,120,204,204,204,120,0,0,0,220,102,102,124,96,240,0,0,118,204,204,124,12,30,0,0,220,118,102, 96,240,0,0,0,124,192,120,12,248,0,16,48,124,48,48,52,24,0,0,0,204,204,204,204,118,0,0,0,204,204,204,120,48,0,0,0,198,214, 254,254,108,0,0,0,198,108,56,108,198,0,0,0,204,204,204,124,12,248,0,0,252,152,48,100,252,0,28,48,48,224,48,48,28,0,24,24, 24,0,24,24,24,0,224,48,48,28,48,48,224,0,118,220,0,0,0,0,0,0,0,16,56,108,198,198,254,0,120,204,192,204,120,24,12,120,0,204, 0,204,204,204,126,0,28,0,120,204,252,192,120,0,126,195,60,6,62,102,63,0,204,0,120,12,124,204,126,0,224,0,120,12,124,204,126, 0,48,48,120,12,124,204,126,0,0,0,120,192,192,120,12,56,126,195,60,102,126,96,60,0,204,0,120,204,252,192,120,0,224,0,120,204, 252,192,120,0,204,0,112,48,48,48,120,0,124,198,56,24,24,24,60,0,224,0,112,48,48,48,120,0,198,56,108,198,254,198,198,0,48, 48,0,120,204,252,204,0,28,0,252,96,120,96,252,0,0,0,127,12,127,204,127,0,62,108,204,254,204,204,206,0,120,204,0,120,204,204, 120,0,0,204,0,120,204,204,120,0,0,224,0,120,204,204,120,0,120,204,0,204,204,204,126,0,0,224,0,204,204,204,126,0,0,204,0,204, 204,124,12,248,195,24,60,102,102,60,24,0,204,0,204,204,204,204,120,0,24,24,126,192,192,126,24,24,56,108,100,240,96,230,252, 0,204,204,120,252,48,252,48,48,248,204,204,250,198,207,198,199,14,27,24,60,24,24,216,112,28,0,120,12,124,204,126,0,56,0,112, 48,48,48,120,0,0,28,0,120,204,204,120,0,0,28,0,204,204,204,126,0,0,248,0,248,204,204,204,0,252,0,204,236,252,220,204,0,60, 108,108,62,0,126,0,0,56,108,108,56,0,124,0,0,48,0,48,96,192,204,120,0,0,0,0,252,192,192,0,0,0,0,0,252,12,12,0,0,195,198,204, 222,51,102,204,15,195,198,204,219,55,111,207,3,24,24,0,24,24,24,24,0,0,51,102,204,102,51,0,0,0,204,102,51,102,204,0,0,34, 136,34,136,34,136,34,136,85,170,85,170,85,170,85,170,219,119,219,238,219,119,219,238,24,24,24,24,24,24,24,24,24,24,24,24, 248,24,24,24,24,24,248,24,248,24,24,24,54,54,54,54,246,54,54,54,0,0,0,0,254,54,54,54,0,0,248,24,248,24,24,24,54,54,246,6, 246,54,54,54,54,54,54,54,54,54,54,54,0,0,254,6,246,54,54,54,54,54,246,6,254,0,0,0,54,54,54,54,254,0,0,0,24,24,248,24,248, 0,0,0,0,0,0,0,248,24,24,24,24,24,24,24,31,0,0,0,24,24,24,24,255,0,0,0,0,0,0,0,255,24,24,24,24,24,24,24,31,24,24,24,0,0,0, 0,255,0,0,0,24,24,24,24,255,24,24,24,24,24,31,24,31,24,24,24,54,54,54,54,55,54,54,54,54,54,55,48,63,0,0,0,0,0,63,48,55,54, 54,54,54,54,247,0,255,0,0,0,0,0,255,0,247,54,54,54,54,54,55,48,55,54,54,54,0,0,255,0,255,0,0,0,54,54,247,0,247,54,54,54,24, 24,255,0,255,0,0,0,54,54,54,54,255,0,0,0,0,0,255,0,255,24,24,24,0,0,0,0,255,54,54,54,54,54,54,54,63,0,0,0,24,24,31,24,31, 0,0,0,0,0,31,24,31,24,24,24,0,0,0,0,63,54,54,54,54,54,54,54,255,54,54,54,24,24,255,24,255,24,24,24,24,24,24,24,248,0,0,0, 0,0,0,0,31,24,24,24,255,255,255,255,255,255,255,255,0,0,0,0,255,255,255,255,240,240,240,240,240,240,240,240,15,15,15,15,15, 15,15,15,255,255,255,255,0,0,0,0,0,0,118,220,200,220,118,0,0,120,204,248,204,248,192,192,0,252,204,192,192,192,192,0,0,254, 108,108,108,108,108,0,252,204,96,48,96,204,252,0,0,0,126,216,216,216,112,0,0,102,102,102,102,124,96,192,0,118,220,24,24,24, 24,0,252,48,120,204,204,120,48,252,56,108,198,254,198,108,56,0,56,108,198,198,108,108,238,0,28,48,24,124,204,204,120,0,0, 0,126,219,219,126,0,0,6,12,126,219,219,126,96,192,56,96,192,248,192,96,56,0,120,204,204,204,204,204,204,0,0,252,0,252,0,252, 0,0,48,48,252,48,48,0,252,0,96,48,24,48,96,0,252,0,24,48,96,48,24,0,252,0,14,27,27,24,24,24,24,24,24,24,24,24,24,216,216, 112,48,48,0,252,0,48,48,0,0,118,220,0,118,220,0,0,56,108,108,56,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,0,24,0,0,0,15,12,12,12,236, 108,60,28,120,108,108,108,108,0,0,0,112,24,48,96,120,0,0,0,0,0,60,60,60,60,0,0,0,0,0,0,0,0,0,0]
<?xml version="1.0" encoding="UTF-8"?> <video id="videoMDA" screenwidth="720" screenheight="350" scale="true" charset="/devices/pc/video/ibm/mda/ibm-mda.json" pos="center" padding="8px"> <menu> <title>Monochrome Display</title> <control type="container" pos="right"> <control type="led" label="Caps" binding="caps-lock" padleft="8px"/> <control type="led" label="Num" binding="num-lock" padleft="8px"/> <control type="led" label="Scroll" binding="scroll-lock" padleft="8px"/> </control> </menu> </video>
<?xml version="1.0" encoding="UTF-8"?> <video id="videoVGA" model="vga" screenwidth="640" screenheight="480" scale="true" autolock="true" pos="center" padding="8px"> <menu> <title>VGA Color Display</title> <control type="container" pos="right"> <control type="led" label="Caps" binding="caps-lock" padleft="8px"/> <control type="led" label="Num" binding="num-lock" padleft="8px"/> <control type="led" label="Scroll" binding="scroll-lock" padleft="8px"/> <control type="button" binding="fullScreen" padleft="8px">Full Screen</control> </control> </menu> </video>
[85,170,48,235,54,55,52,48,48,56,50,50,50,53,53,52,32,40,67,41,67,79,80,89,82,73,71,72,84,32,73,66,77,32,67,111,114,112,46, 32,49,57,56,52,44,32,49,57,56,54,32,49,48,47,50,55,47,56,54,85,46,142,30,28,7,184,1,18,179,50,205,16,250,199,6,64,0,225,6, 140,14,66,0,199,6,180,1,228,6,140,14,182,1,199,6,8,1,101,240,199,6,10,1,0,240,199,6,168,4,198,5,140,14,170,4,199,6,124,0, 141,59,140,14,126,0,199,6,12,1,141,55,140,14,14,1,251,198,6,137,4,17,198,6,135,4,96,232,107,0,250,186,232,70,184,22,0,239, 186,2,1,184,1,0,239,186,232,70,184,14,0,239,186,232,74,51,192,239,251,14,7,191,180,3,187,2,22,246,6,135,4,2,117,6,191,212, 3,187,66,22,137,62,99,4,232,89,16,50,192,238,232,115,4,51,237,232,12,1,232,250,1,232,133,2,246,6,137,4,1,117,3,232,215,3, 232,124,4,36,240,162,136,4,232,87,0,232,64,2,131,253,2,114,2,91,203,93,203,183,0,186,204,3,236,36,254,186,194,3,238,178,212, 232,165,1,117,11,176,3,183,32,128,14,135,4,2,235,26,186,204,3,236,12,1,186,194,3,238,178,180,232,137,1,117,27,176,7,183,48, 128,38,135,4,253,128,38,137,4,254,128,38,16,4,207,8,62,16,4,180,0,205,66,195,246,6,137,4,1,116,24,128,14,135,4,2,246,6,135, 4,8,117,12,246,6,137,4,4,117,5,128,38,135,4,253,246,6,135,4,2,117,7,187,9,32,176,3,235,5,187,11,48,176,7,128,38,16,4,207, 8,62,16,4,128,38,136,4,240,8,30,136,4,138,30,135,4,128,38,135,4,247,138,62,137,4,128,38,137,4,254,180,0,205,16,128,231,1, 8,62,137,4,246,195,8,116,51,246,6,137,4,1,117,44,176,7,187,3,48,246,6,135,4,2,116,5,176,3,187,5,32,128,38,16,4,207,8,62,16, 4,128,38,136,4,240,8,30,136,4,128,14,135,4,8,180,0,205,16,195,139,22,99,4,128,194,6,187,1,0,176,48,230,67,176,0,230,64,180, 2,51,201,236,168,8,116,5,226,249,233,165,0,250,236,168,8,117,5,226,249,233,154,0,254,204,117,229,176,0,230,64,51,201,236, 168,9,224,251,227,24,185,255,255,236,168,1,225,251,227,14,236,168,8,117,11,168,1,224,247,227,3,67,117,232,235,111,176,0,230, 67,228,64,138,224,235,0,228,64,134,224,251,129,251,154,1,119,90,129,251,134,1,114,84,61,140,110,114,79,61,29,135,119,74,252, 184,0,160,142,192,51,255,185,40,0,184,255,255,243,171,183,15,179,192,236,134,218,176,50,238,138,199,238,134,211,51,201,236, 168,48,117,4,226,249,235,32,51,201,236,168,48,116,4,226,249,235,21,128,199,16,128,255,63,117,215,176,54,230,67,42,192,230, 64,235,0,230,64,195,251,186,3,1,232,223,2,189,2,0,235,231,176,15,238,179,255,66,236,80,176,26,238,235,0,236,60,26,117,8,176, 37,238,235,0,236,138,216,88,238,128,251,37,195,184,0,160,142,192,187,0,128,190,0,0,232,12,0,116,9,186,3,1,232,164,2,189,2, 0,195,252,184,170,170,139,203,51,255,243,171,139,203,51,255,243,175,117,15,184,85,85,139,203,51,255,243,171,139,203,51,255, 243,175,156,139,198,139,203,51,255,243,171,157,195,184,0,198,142,192,190,212,3,38,138,36,38,198,4,40,186,212,3,30,31,236, 38,136,36,60,40,195,183,7,246,6,135,4,2,117,2,183,8,179,0,246,6,137,4,1,117,18,179,1,246,6,135,4,2,116,9,179,2,232,195,255, 117,2,179,6,232,252,6,162,138,4,195,180,26,232,125,0,232,142,0,117,10,180,37,232,115,0,232,132,0,116,9,186,3,1,232,18,2,189, 2,0,186,198,3,176,0,238,180,0,232,90,0,180,0,232,233,14,190,84,4,185,1,0,232,114,0,116,32,190,80,4,185,1,0,232,103,0,116, 37,128,14,135,4,8,128,14,137,4,6,190,88,4,185,5,0,232,82,0,235,30,128,38,137,4,251,190,40,4,185,5,0,232,66,0,235,14,128,14, 137,4,6,190,60,4,185,5,0,232,50,0,116,9,186,3,1,232,174,1,131,197,1,195,186,200,3,176,0,238,185,0,3,186,201,3,138,196,238, 235,0,226,251,195,186,199,3,238,185,0,3,186,201,3,236,58,196,117,2,226,249,195,46,138,4,46,138,100,1,46,138,92,2,81,232,81, 0,89,131,198,4,46,58,68,255,117,2,226,229,195,20,20,20,16,45,20,20,0,20,45,20,0,20,20,45,0,45,45,45,0,4,18,4,16,30,18,4,0, 4,45,4,0,4,22,21,0,0,0,0,16,4,18,4,16,18,18,18,16,4,4,4,16,16,4,4,0,4,16,4,0,4,4,16,0,16,16,16,0,80,139,22,99,4,128,194,6, 138,250,51,201,250,236,168,8,224,251,51,201,236,168,8,225,251,176,0,186,200,3,238,88,186,201,3,238,235,0,138,196,238,235, 0,138,195,238,138,215,51,201,236,168,1,224,251,178,194,235,0,236,36,16,80,176,0,186,200,3,238,235,0,186,201,3,238,235,0,238, 235,0,238,251,88,195,191,0,184,186,216,3,187,0,32,246,6,135,4,2,117,9,191,0,176,186,184,3,187,0,8,142,199,160,101,4,36,247, 238,190,32,7,232,9,254,116,9,186,2,1,232,161,0,189,2,0,184,32,112,51,255,185,40,0,243,171,128,194,2,180,8,128,250,218,116, 2,180,1,51,201,236,34,196,117,4,226,249,235,9,43,201,236,34,196,116,11,226,249,186,2,1,232,110,0,189,2,0,177,3,210,236,117, 221,186,216,3,185,40,0,246,6,135,4,2,117,3,186,184,3,184,32,7,51,255,243,171,160,101,4,238,195,236,185,20,0,178,192,180,0, 187,101,22,138,196,238,254,196,46,138,7,238,67,226,244,176,20,238,50,192,238,176,32,238,195,139,22,99,4,128,194,6,179,194, 176,1,238,235,0,134,218,236,36,96,208,232,138,224,134,211,176,2,238,235,0,134,218,236,36,96,208,224,10,196,195,156,250,11, 237,116,2,51,210,10,246,116,20,179,5,185,51,5,232,226,0,51,201,226,254,254,206,117,240,51,201,226,254,10,210,116,16,179,1, 185,51,5,232,202,0,51,201,226,254,254,202,117,240,157,195,66,19,0,192,0,0,0,0,0,0,0,0,0,0,0,0,226,5,0,192,0,0,0,0,0,0,0,0, 26,0,211,10,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,251,30,80,83,81,82,46,142,30,28,7,128,62,0,5,1,116,99,198,6,0,5, 1,180,15,205,16,138,204,138,46,132,4,254,197,232,85,0,81,180,3,205,16,89,82,51,210,180,2,205,16,180,8,205,16,10,192,117,2, 176,32,82,51,210,50,228,205,23,90,246,196,41,117,33,254,194,58,202,117,223,50,210,138,226,82,232,35,0,90,254,198,58,238,117, 208,90,180,2,205,16,198,6,0,5,0,235,10,90,180,2,205,16,198,6,0,5,255,90,89,91,88,31,207,51,210,50,228,176,13,205,23,50,228, 176,10,205,23,195,176,182,230,67,138,193,230,66,138,197,230,66,228,97,138,224,12,3,230,97,51,201,226,254,254,203,117,248, 138,196,230,97,195,130,26,152,30,47,31,120,31,143,31,168,31,211,31,167,34,253,36,37,39,138,41,59,42,69,50,3,51,254,51,20, 8,180,43,89,53,46,8,163,52,19,7,19,7,19,7,19,7,19,7,19,7,45,10,252,10,161,12,205,109,207,251,252,85,6,30,82,81,83,86,87,80, 138,196,152,209,224,139,240,88,131,254,58,115,10,46,142,30,28,7,46,255,164,167,6,95,94,91,89,90,31,7,93,205,66,207,235,0, 95,94,91,89,90,31,7,93,207,0,0,0,160,0,184,30,46,142,30,28,7,139,22,99,4,128,194,6,31,195,46,142,30,28,7,196,30,168,4,38, 196,31,195,86,139,240,209,238,209,238,209,238,209,238,209,238,209,238,209,238,209,238,209,230,129,254,40,0,115,45,46,255, 164,94,7,134,7,134,7,134,7,134,7,174,7,174,7,174,7,134,7,166,7,174,7,174,7,174,7,174,7,174,7,174,7,170,7,170,7,162,7,162, 7,174,7,246,6,137,4,16,117,25,160,136,4,36,15,60,3,116,20,60,9,116,16,128,252,7,116,11,235,13,144,176,3,235,10,176,2,235, 6,176,1,235,2,176,0,94,195,246,6,135,4,128,117,57,186,0,184,160,73,4,60,6,118,10,186,0,176,60,7,116,3,186,0,160,142,194,187, 32,7,60,4,114,6,60,7,116,2,43,219,139,14,76,4,227,16,185,0,128,128,254,160,116,2,181,64,139,195,43,255,243,171,195,139,243, 131,198,35,30,6,196,62,168,4,38,196,125,4,140,192,11,199,116,9,31,30,185,16,0,243,164,70,164,7,31,195,138,38,74,4,138,62, 98,4,160,135,4,36,128,10,6,73,4,95,94,89,89,90,31,7,93,207,128,251,16,116,61,128,251,32,116,113,128,251,48,117,3,235,121, 144,128,251,49,117,3,233,13,1,128,251,50,117,3,233,27,1,128,251,51,117,3,233,40,1,128,251,52,117,3,233,54,1,128,251,53,117, 3,233,73,1,128,251,54,117,55,233,171,1,138,62,135,4,128,231,2,208,239,160,135,4,36,96,208,232,208,232,208,232,208,232,208, 232,138,216,138,14,136,4,138,233,128,225,15,208,237,208,237,208,237,208,237,95,94,90,90,90,31,7,93,207,50,192,233,106,254, 250,199,6,20,0,252,5,140,14,22,0,251,233,91,254,246,6,135,4,8,117,229,246,6,137,4,1,117,78,60,0,117,15,246,6,135,4,2,117, 211,176,8,187,0,239,235,40,144,254,200,117,17,176,9,187,0,239,246,6,135,4,2,116,23,176,11,235,19,144,254,200,117,178,176, 9,187,16,239,246,6,135,4,2,116,2,176,11,32,62,137,4,8,30,137,4,128,38,136,4,240,8,6,136,4,235,61,144,60,0,117,16,176,8,187, 128,239,246,6,135,4,2,116,220,176,11,235,216,254,200,117,16,176,9,187,0,111,246,6,135,4,2,116,200,176,11,235,196,254,200, 117,143,176,9,187,16,111,246,6,135,4,2,116,180,176,11,235,176,176,18,233,190,253,60,1,117,7,128,14,137,4,8,235,240,60,0,117, 72,128,38,137,4,247,235,229,186,232,70,60,0,117,5,176,14,238,235,217,60,1,117,49,50,192,238,235,208,60,1,117,7,128,38,137, 4,253,235,197,60,0,117,29,128,14,137,4,2,235,186,60,1,117,7,128,14,135,4,1,235,175,60,0,117,7,128,38,135,4,254,235,164,50, 192,233,98,253,10,192,117,23,246,6,137,4,64,117,240,12,128,205,66,246,6,137,4,64,116,229,232,43,0,235,132,60,1,116,220,246, 6,137,4,64,116,213,60,2,117,6,232,23,0,233,111,255,60,3,117,199,250,139,218,232,246,3,186,232,70,176,14,238,251,233,91,255, 250,139,218,232,161,3,250,196,30,8,1,137,30,180,1,140,6,182,1,199,6,8,1,228,6,140,14,10,1,251,186,232,70,176,6,238,251,195, 180,32,60,1,116,6,180,0,60,0,117,3,232,80,8,233,35,255,60,0,116,6,60,1,116,22,235,28,160,138,4,232,89,0,232,118,0,95,94,89, 89,90,31,7,93,176,26,207,232,14,0,162,138,4,176,26,95,94,91,89,90,31,7,93,207,139,211,134,251,139,195,232,34,0,187,0,0,38, 138,12,50,237,131,198,4,38,59,0,116,13,38,59,16,116,8,131,195,2,226,241,176,255,195,208,235,138,195,195,196,54,168,4,38,196, 180,16,0,38,196,180,2,0,195,232,238,255,38,58,4,114,4,187,255,255,195,131,198,4,50,228,209,224,3,240,38,139,28,128,251,0, 117,2,134,223,195,128,255,0,116,23,160,16,4,36,48,60,48,116,7,246,195,1,117,7,235,7,246,195,1,117,2,134,223,195,16,1,8,0, 0,0,0,1,0,2,2,1,0,4,4,1,0,5,2,5,0,6,1,6,5,6,0,8,1,8,0,7,2,7,6,7,50,192,233,23,252,11,219,117,247,38,199,5,145,12,71,71,38, 140,13,71,71,190,73,4,185,30,0,243,164,190,132,4,138,4,254,192,38,136,5,70,71,185,2,0,243,164,160,138,4,6,232,106,255,7,38, 136,29,71,38,136,61,160,73,4,50,228,139,240,209,230,129,198,85,12,46,139,28,71,38,137,29,71,141,54,125,12,3,240,46,138,28, 71,38,136,29,134,196,232,227,251,71,38,136,5,186,196,3,176,3,238,66,236,138,224,80,128,228,16,208,236,208,236,36,3,10,196, 71,38,136,5,88,128,228,32,208,236,208,236,208,236,36,12,208,232,208,232,10,196,71,38,136,5,176,16,232,142,251,232,180,31, 232,212,31,128,228,8,208,228,208,228,160,135,4,36,1,52,1,177,4,210,224,10,196,138,38,137,4,128,228,15,10,196,71,38,136,5, 50,192,71,38,136,5,71,38,136,5,71,38,136,5,160,135,4,36,96,177,5,210,232,71,38,136,5,6,50,201,196,30,168,4,6,38,196,119,4, 140,192,11,198,116,3,128,201,2,7,6,38,196,119,8,140,192,11,198,116,3,128,201,4,7,6,38,196,119,12,140,192,11,198,116,3,128, 201,8,7,38,196,119,16,140,192,11,198,116,47,6,139,222,38,196,119,6,140,192,11,198,116,3,128,201,1,7,6,38,196,119,10,140,192, 11,198,116,3,128,201,16,7,38,196,119,2,140,192,140,203,59,195,116,3,128,201,32,7,71,38,136,13,71,185,13,0,50,192,243,170, 176,27,233,190,250,16,0,16,0,16,0,16,0,4,0,4,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,16,0,0,0,16,0,2,0,16,0,0,1,8,8,8,8,1,1,1, 8,0,0,0,0,0,8,4,2,2,1,1,1,255,224,15,0,0,0,0,7,2,8,255,14,0,0,63,0,60,0,117,2,235,18,60,1,117,2,235,88,60,2,117,79,233,169, 0,176,28,233,90,250,184,32,0,51,210,247,193,7,0,116,60,247,193,1,0,116,6,5,70,0,131,210,0,247,193,2,0,116,6,5,58,0,131,210, 0,247,193,4,0,116,6,5,3,3,131,210,0,187,64,0,247,243,131,250,0,116,1,64,139,216,95,94,88,176,28,89,90,31,7,93,207,176,0,233, 14,250,139,211,131,194,32,247,193,1,0,116,28,81,83,38,137,23,139,218,131,194,70,82,139,62,99,4,30,46,142,30,30,7,232,4,2, 31,90,91,89,247,193,2,0,116,18,81,83,38,137,87,2,139,218,131,194,58,82,232,91,0,90,91,89,247,193,4,0,116,182,38,137,87,4, 139,218,139,62,99,4,232,237,1,232,20,30,233,87,255,247,193,1,0,116,17,81,83,38,139,31,30,46,142,30,30,7,232,76,3,31,91,89, 247,193,2,0,116,11,81,83,38,139,95,2,232,94,0,91,89,247,193,4,0,116,14,38,139,95,4,139,62,99,4,232,79,3,233,27,255,233,100, 255,6,139,251,160,16,4,36,48,38,136,5,71,141,54,73,4,185,30,0,243,164,141,54,132,4,185,7,0,243,164,141,54,168,4,250,232,110, 0,141,54,20,0,232,103,0,141,54,116,0,232,96,0,141,54,124,0,232,89,0,141,54,12,1,232,82,0,251,7,195,38,138,7,128,38,16,4,207, 8,6,16,4,6,140,216,6,31,139,243,142,192,70,141,62,73,4,185,30,0,243,164,141,62,132,4,185,7,0,243,164,141,62,168,4,250,232, 31,0,141,62,20,0,232,24,0,141,62,116,0,232,17,0,141,62,124,0,232,10,0,141,62,12,1,232,3,0,251,7,195,185,4,0,243,164,195,85, 80,80,189,184,18,37,15,0,209,224,3,232,46,139,110,0,88,134,196,50,228,209,224,3,232,46,139,110,0,129,237,66,19,3,221,88,93, 195,60,0,116,19,60,2,116,22,189,141,63,183,14,128,252,7,117,20,128,203,128,235,15,189,141,55,183,8,235,8,189,186,78,183,16, 128,203,128,185,0,1,186,0,0,14,31,195,0,64,128,192,32,96,160,224,81,177,5,211,226,89,142,192,139,250,139,243,129,230,7,0, 46,138,180,140,14,50,210,3,250,139,245,139,234,138,199,42,228,227,13,81,139,200,243,164,43,248,131,199,32,89,226,243,246, 195,128,116,30,138,20,10,210,116,24,50,246,81,177,5,211,226,89,3,213,139,250,70,139,200,243,164,43,248,131,199,32,235,226, 195,86,134,196,50,228,139,240,46,138,132,7,15,139,240,209,230,46,139,132,255,14,94,195,255,255,141,55,141,63,186,78,0,0,0, 0,1,1,1,0,3,1,1,1,1,1,1,2,2,3,3,1,80,86,134,196,50,228,139,240,46,128,188,7,15,0,94,88,195,232,199,0,232,87,0,232,235,0,139, 215,128,194,6,131,195,35,189,1,0,232,249,31,195,232,12,0,185,0,1,51,255,131,195,3,232,166,31,195,139,215,128,194,6,236,178, 192,176,20,156,250,238,66,236,157,38,136,71,65,186,199,3,236,36,1,38,136,7,134,196,186,200,3,236,10,228,116,2,254,200,38, 136,71,1,186,198,3,236,38,136,71,2,195,83,186,196,3,131,195,5,185,4,0,176,1,232,18,1,91,178,204,236,38,136,71,9,178,202,236, 38,136,71,4,139,215,83,131,195,10,185,25,0,50,192,232,245,0,91,139,215,128,194,6,156,250,236,82,178,192,176,16,238,66,236, 38,136,71,51,90,236,82,178,192,176,18,238,66,236,38,136,71,53,90,236,178,192,176,19,238,66,236,157,38,136,71,54,83,178,206, 131,195,55,185,9,0,50,192,232,182,0,91,195,38,137,127,64,186,196,3,236,38,136,7,186,212,3,236,38,136,71,1,186,206,3,236,38, 136,71,2,139,215,128,194,6,236,186,192,3,236,38,136,71,3,195,186,196,3,176,2,156,250,238,66,236,74,80,184,2,15,239,176,4, 238,66,236,74,80,184,4,7,239,178,206,176,6,238,66,236,74,80,184,6,4,239,176,5,238,66,236,74,80,184,5,1,239,176,4,238,66,236, 74,80,190,255,255,198,4,0,184,4,0,239,138,4,38,136,71,66,184,4,1,239,138,4,38,136,71,67,184,4,2,239,138,4,38,136,71,68,184, 4,3,239,138,4,38,136,71,69,88,134,196,176,4,239,88,134,196,176,5,239,88,134,196,176,6,239,178,196,88,134,196,176,4,239,88, 134,196,176,2,239,157,195,156,250,238,66,80,236,38,136,7,88,157,74,254,192,67,73,117,238,195,232,252,0,38,139,127,64,232, 96,0,139,215,128,194,6,38,138,71,4,238,83,131,195,35,185,16,0,51,255,189,1,0,232,49,30,91,232,176,0,195,38,138,71,2,186,198, 3,238,87,185,0,1,51,255,83,131,195,3,186,0,0,232,214,29,91,95,232,1,0,195,139,215,128,194,6,236,178,192,38,138,39,176,20, 239,38,138,71,1,38,138,39,10,228,116,6,186,199,3,238,235,4,186,200,3,238,195,186,196,3,184,0,1,156,250,239,83,131,195,5,185, 4,0,176,1,232,197,0,91,178,194,38,138,71,9,238,178,196,184,0,3,239,157,139,215,176,17,50,228,239,83,131,195,10,185,25,0,50, 192,232,163,0,91,139,215,128,194,6,82,156,250,236,178,192,176,16,238,38,138,71,51,238,176,18,238,38,138,71,53,238,176,19, 238,38,138,71,54,238,157,83,178,206,131,195,55,185,9,0,50,192,232,112,0,91,90,195,186,196,3,38,138,7,238,186,212,3,38,138, 71,1,238,186,206,3,38,138,71,2,238,38,139,87,64,128,194,6,236,186,192,3,38,138,71,3,238,195,186,196,3,184,4,7,239,178,206, 184,6,4,239,184,5,0,239,190,255,255,178,196,184,2,0,239,38,138,71,66,136,4,184,2,1,239,38,138,71,67,136,4,184,2,2,239,38, 138,71,68,136,4,184,2,4,239,38,138,71,69,136,4,184,2,15,239,138,4,195,38,138,39,239,254,192,67,73,117,246,195,80,82,186,196, 3,184,2,4,239,184,4,7,239,178,206,184,5,0,239,184,6,4,239,184,4,2,239,139,209,128,226,240,128,202,10,236,178,192,176,0,238, 90,88,195,80,82,186,196,3,184,2,3,239,184,4,3,239,178,206,184,5,16,239,176,6,180,10,129,249,180,3,116,2,180,14,239,184,4, 0,239,90,88,195,186,196,3,176,3,138,227,239,195,38,138,0,60,255,116,7,58,196,116,5,70,235,242,249,195,248,195,186,196,3,176, 1,238,66,236,80,37,223,32,10,224,74,176,1,239,88,134,196,195,1,0,1,0,1,0,1,0,2,0,2,0,2,0,1,0,3,0,0,0,0,0,0,0,0,0,3,0,3,0, 3,0,3,0,3,0,3,0,4,0,192,18,232,18,10,19,28,19,66,19,130,19,194,19,2,20,66,20,130,20,194,20,0,0,0,0,130,21,194,21,2,22,66, 22,130,22,194,22,0,0,0,0,0,0,0,0,66,26,2,24,66,24,130,24,194,24,0,0,0,0,0,0,2,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,130,23,194,23, 2,25,2,25,66,25,66,25,0,0,0,0,0,0,130,25,66,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,194,25, 2,26,40,24,8,0,8,9,3,0,2,99,45,39,40,144,43,160,191,31,0,199,6,7,0,0,0,0,156,142,143,20,31,150,185,163,255,0,1,2,3,4,5,6, 7,16,17,18,19,20,21,22,23,8,0,15,0,0,0,0,0,0,16,14,0,255,40,24,8,0,8,9,3,0,2,99,45,39,40,144,43,160,191,31,0,199,6,7,0,0, 0,0,156,142,143,20,31,150,185,163,255,0,1,2,3,4,5,6,7,16,17,18,19,20,21,22,23,8,0,15,0,0,0,0,0,0,16,14,0,255,80,24,8,0,16, 1,3,0,2,99,95,79,80,130,85,129,191,31,0,199,6,7,0,0,0,0,156,142,143,40,31,150,185,163,255,0,1,2,3,4,5,6,7,16,17,18,19,20, 21,22,23,8,0,15,0,0,0,0,0,0,16,14,0,255,80,24,8,0,16,1,3,0,2,99,95,79,80,130,85,129,191,31,0,199,6,7,0,0,0,0,156,142,143, 40,31,150,185,163,255,0,1,2,3,4,5,6,7,16,17,18,19,20,21,22,23,8,0,15,0,0,0,0,0,0,16,14,0,255,40,24,8,0,64,9,3,0,2,99,45,39, 40,144,43,128,191,31,0,193,0,0,0,0,0,0,156,142,143,20,0,150,185,162,255,0,19,21,23,2,4,6,7,16,17,18,19,20,21,22,23,1,0,3, 0,0,0,0,0,0,48,15,0,255,40,24,8,0,64,9,3,0,2,99,45,39,40,144,43,128,191,31,0,193,0,0,0,0,0,0,156,142,143,20,0,150,185,162, 255,0,19,21,23,2,4,6,7,16,17,18,19,20,21,22,23,1,0,3,0,0,0,0,0,0,48,15,0,255,80,24,8,0,64,1,1,0,6,99,95,79,80,130,84,128, 191,31,0,193,0,0,0,0,0,0,156,142,143,40,0,150,185,194,255,0,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,1,0,1,0,0,0,0,0, 0,0,13,0,255,80,24,14,0,16,0,3,0,3,166,95,79,80,130,85,129,191,31,0,77,11,12,0,0,0,0,131,133,93,40,13,99,186,163,255,0,8, 8,8,8,8,8,8,16,24,24,24,24,24,24,24,14,0,15,8,0,0,0,0,0,16,10,0,255,80,24,16,0,125,33,15,0,6,99,95,79,80,130,85,129,191,31, 0,64,0,0,0,0,0,0,156,142,143,40,31,150,185,227,255,0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63,1,0,15,0,0,0,0,0,0,0,5,15,255, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,40,24,8,0,64,0,0,0,3,35,55,39,45,55,49,21,4,17,0,71,6,7,0,0,0,0,225,36,199,20,8,224,240,163,255,0,1,2,3,4,5,6,7,16, 17,18,19,20,21,22,23,8,0,15,0,0,0,0,0,0,16,14,0,255,80,0,0,0,0,41,15,0,6,98,95,79,80,130,85,129,191,31,0,64,0,0,0,0,0,0,156, 142,143,40,31,150,185,227,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,1,0,15,0,0,0,15,0,0,8,5,15,255,80,0,0,0,0,41,15,0,6,99,95, 79,80,130,85,129,191,31,0,64,0,0,0,0,0,0,156,142,143,40,31,150,185,227,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,1,0,15,0,0,0, 15,0,0,8,5,15,255,40,24,8,0,32,9,15,0,6,99,45,39,40,144,43,128,191,31,0,192,0,0,0,0,0,0,156,142,143,20,0,150,185,227,255, 0,1,2,3,4,5,6,7,16,17,18,19,20,21,22,23,1,0,15,0,0,0,0,0,0,0,5,15,255,80,24,8,0,64,1,15,0,6,99,95,79,80,130,84,128,191,31, 0,192,0,0,0,0,0,0,156,142,143,40,0,150,185,227,255,0,1,2,3,4,5,6,7,16,17,18,19,20,21,22,23,1,0,15,0,0,0,0,0,0,0,5,15,255, 80,24,14,0,128,5,15,0,0,162,96,79,86,26,80,224,112,31,0,0,0,0,0,0,0,0,94,46,93,20,0,94,110,139,255,0,8,0,0,24,24,0,0,0,8, 0,0,0,24,0,0,11,0,5,0,0,0,0,0,0,16,7,15,255,80,24,14,0,128,5,15,0,0,167,91,79,83,23,80,186,108,31,0,0,0,0,0,0,0,0,94,43,93, 20,15,95,10,139,255,0,1,0,0,4,7,0,0,0,1,0,0,4,7,0,0,1,0,5,0,0,0,0,0,0,16,7,15,255,80,24,14,0,128,1,15,0,6,162,95,79,80,130, 84,128,191,31,0,64,0,0,0,0,0,0,131,133,93,40,15,99,186,227,255,0,8,0,0,24,24,0,0,0,8,0,0,0,24,0,0,11,0,5,0,0,0,0,0,0,0,5, 5,255,80,24,14,0,128,1,15,0,6,163,95,79,80,130,84,128,191,31,0,64,0,0,0,0,0,0,131,133,93,40,15,99,186,227,255,0,1,2,3,4,5, 20,7,56,57,58,59,60,61,62,63,1,0,15,0,0,0,0,0,0,0,5,15,255,40,24,14,0,8,9,3,0,2,163,45,39,40,144,43,160,191,31,0,77,11,12, 0,0,0,0,131,133,93,20,31,99,186,163,255,0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63,8,0,15,0,0,0,0,0,0,16,14,0,255,40,24,14, 0,8,9,3,0,2,163,45,39,40,144,43,160,191,31,0,77,11,12,0,0,0,0,131,133,93,20,31,99,186,163,255,0,1,2,3,4,5,20,7,56,57,58,59, 60,61,62,63,8,0,15,0,0,0,0,0,0,16,14,0,255,80,24,14,0,16,1,3,0,2,163,95,79,80,130,85,129,191,31,0,77,11,12,0,0,0,0,131,133, 93,40,31,99,186,163,255,0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63,8,0,15,0,0,0,0,0,0,16,14,0,255,80,24,14,0,16,1,3,0,2,163, 95,79,80,130,85,129,191,31,0,77,11,12,0,0,0,0,131,133,93,40,31,99,186,163,255,0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63,8, 0,15,0,0,0,0,0,0,16,14,0,255,40,24,16,0,8,8,3,0,2,103,45,39,40,144,43,160,191,31,0,79,13,14,0,0,0,0,156,142,143,20,31,150, 185,163,255,0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63,12,0,15,8,0,0,0,0,0,16,14,0,255,80,24,16,0,16,0,3,0,2,103,95,79,80,130, 85,129,191,31,0,79,13,14,0,0,0,0,156,142,143,40,31,150,185,163,255,0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63,12,0,15,8,0,0, 0,0,0,16,14,0,255,80,24,16,0,16,0,3,0,2,102,95,79,80,130,85,129,191,31,0,79,13,14,0,0,0,0,156,142,143,40,15,150,185,163,255, 0,8,8,8,8,8,8,8,16,24,24,24,24,24,24,24,14,0,15,8,0,0,0,0,0,16,10,0,255,80,29,16,0,160,1,15,0,6,227,95,79,80,130,84,128,11, 62,0,64,0,0,0,0,0,0,234,140,223,40,0,231,4,195,255,0,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,1,0,15,0,0,0,0,0,0,0,5, 1,255,80,29,16,0,160,1,15,0,6,227,95,79,80,130,84,128,11,62,0,64,0,0,0,0,0,0,234,140,223,40,0,231,4,227,255,0,1,2,3,4,5,20, 7,56,57,58,59,60,61,62,63,1,0,15,0,0,0,0,0,0,0,5,15,255,40,24,8,0,32,1,15,0,14,99,95,79,80,130,84,128,191,31,0,65,0,0,0,0, 0,0,156,142,143,40,64,150,185,163,255,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,65,0,15,0,0,0,0,0,0,64,5,15,255,80,36,127,60, 19,88,119,24,80,36,128,128,38,135,4,127,8,6,135,4,88,36,127,58,6,73,4,117,6,233,150,0,233,110,236,246,6,137,4,1,117,3,233, 137,0,138,30,136,4,129,227,15,0,46,138,159,136,30,138,251,139,22,99,4,60,7,116,57,60,15,116,53,129,250,212,3,116,104,138, 38,16,4,128,228,48,128,252,48,116,31,128,38,135,4,253,186,212,3,128,251,255,144,116,78,138,62,137,4,208,231,245,128,211,0, 128,38,137,4,127,235,48,176,7,235,57,129,250,180,3,116,51,138,38,16,4,128,228,48,128,252,48,117,37,128,14,135,4,2,186,180, 3,128,251,255,144,116,25,128,231,128,128,38,137,4,127,8,62,137,4,128,38,136,4,240,8,30,136,4,235,2,176,0,250,199,6,12,1,141, 55,140,14,14,1,251,128,38,135,4,243,162,73,4,138,38,16,4,128,228,48,128,252,48,117,101,246,6,135,4,2,116,23,186,180,3,60, 15,116,115,60,7,116,111,198,6,73,4,7,128,38,135,4,127,235,99,198,6,132,4,24,199,6,133,4,14,0,160,73,4,180,0,205,66,199,6, 96,4,12,11,128,14,135,4,8,233,125,235,198,6,132,4,24,199,6,133,4,8,0,160,73,4,180,0,128,14,135,4,8,60,1,118,9,60,4,115,5, 128,14,135,4,4,205,66,233,86,235,246,6,135,4,2,117,210,186,212,3,60,15,116,4,60,7,117,10,198,6,73,4,0,128,38,135,4,127,137, 22,99,4,199,6,78,4,0,0,198,6,98,4,0,185,8,0,191,80,4,30,7,43,192,243,171,138,38,73,4,232,67,235,232,51,235,232,53,242,38, 138,7,42,228,163,74,4,38,138,71,1,162,132,4,38,138,71,2,163,133,4,38,139,71,3,163,76,4,38,139,71,20,134,196,163,96,4,139, 62,99,4,232,249,244,50,192,238,250,236,186,192,3,176,20,238,50,192,238,251,180,32,232,56,246,80,246,6,137,4,8,117,41,185, 22,0,51,255,189,1,0,83,131,195,35,232,201,234,232,181,18,91,232,147,235,138,38,73,4,232,215,234,138,216,160,137,4,36,6,208, 232,232,223,17,232,60,235,88,232,0,246,138,38,73,4,232,154,242,116,79,199,6,96,4,0,0,232,92,242,187,12,1,250,137,7,140,79, 2,251,196,30,168,4,38,196,95,12,140,192,11,195,116,43,190,7,0,138,38,73,4,232,186,245,114,31,38,138,7,254,200,162,132,4,38, 139,71,1,163,133,4,250,38,139,71,3,163,12,1,38,139,71,5,163,14,1,251,233,242,0,139,14,99,4,232,51,245,138,38,73,4,232,94, 234,179,0,232,120,241,184,0,160,232,169,241,46,142,30,28,7,196,30,168,4,38,196,95,8,140,192,11,195,116,68,190,11,0,138,38, 73,4,232,96,245,114,56,38,138,39,38,138,71,1,38,139,79,2,38,139,87,4,38,139,111,6,38,142,95,8,6,83,139,216,184,0,160,232, 105,241,232,190,25,91,7,38,138,71,10,60,255,116,10,254,200,46,142,30,28,7,162,132,4,196,30,168,4,38,196,95,16,140,192,11, 195,116,104,38,196,95,6,140,192,11,195,116,94,190,7,0,138,38,73,4,232,4,245,114,82,138,38,133,4,38,58,39,117,73,38,138,39, 38,138,71,1,185,0,1,186,0,0,38,139,111,3,38,142,95,5,6,83,139,216,128,227,127,184,0,160,232,3,241,91,7,176,3,186,196,3,238, 66,236,74,36,19,138,200,38,138,71,1,208,224,208,224,138,224,208,228,36,12,128,228,32,10,224,10,225,176,3,239,46,142,30,28, 7,139,14,99,4,232,116,244,46,142,30,28,7,196,30,168,4,38,196,95,16,140,192,11,195,117,3,235,119,144,38,196,95,10,140,192, 11,195,116,108,190,20,0,138,38,73,4,232,122,244,114,96,38,139,79,4,227,27,6,83,38,139,127,6,38,196,95,8,51,237,232,29,233, 246,6,137,4,8,117,3,232,2,17,91,7,38,139,79,12,227,31,6,83,38,139,127,14,38,196,95,16,138,22,137,4,128,226,6,208,234,246, 6,137,4,8,117,3,232,159,16,91,7,38,138,7,10,192,116,19,120,8,138,38,133,4,254,204,235,2,180,31,176,20,139,22,99,4,239,46, 142,30,28,7,232,22,13,128,62,73,4,7,119,30,187,128,30,160,73,4,42,228,3,216,46,138,7,162,101,4,176,48,128,62,73,4,6,117,2, 176,63,162,102,4,233,147,232,44,40,45,41,42,46,30,41,255,255,255,255,255,255,139,139,139,11,72,72,255,255,255,255,232,3,0, 233,117,232,137,14,96,4,246,6,135,4,8,117,35,138,197,36,96,60,32,117,5,185,0,30,235,22,246,6,135,4,1,117,15,138,38,73,4,232, 87,240,117,6,160,133,4,232,6,0,176,10,232,137,0,195,247,193,224,224,117,86,138,208,254,202,138,242,254,206,58,205,114,18, 138,229,10,225,58,224,115,21,58,202,116,62,58,238,116,58,235,11,128,249,0,116,51,138,234,134,205,235,45,128,249,3,118,40, 138,229,128,196,2,58,225,114,16,42,233,2,234,138,202,60,14,124,21,129,233,1,1,235,15,128,253,2,119,4,138,202,235,6,138,232, 208,237,138,202,195,232,3,0,233,222,231,138,207,50,237,209,225,139,241,137,148,80,4,56,62,98,4,117,5,139,194,232,1,0,195, 232,23,0,139,200,3,14,78,4,209,249,176,14,139,22,99,4,138,229,239,254,192,138,225,239,195,83,139,216,138,196,246,38,74,4, 50,255,3,195,209,224,91,195,138,223,50,255,209,227,139,151,80,4,139,14,96,4,95,94,91,88,88,31,7,93,207,246,6,135,4,8,117, 5,43,192,233,120,231,180,4,205,66,95,94,131,196,6,31,7,93,207,162,98,4,139,14,76,4,152,80,247,225,163,78,4,139,200,128,62, 73,4,7,119,2,209,249,176,12,232,148,255,91,209,227,139,135,80,4,232,125,255,233,64,231,232,3,0,233,58,231,232,18,5,138,38, 73,4,139,240,209,238,209,238,209,238,209,238,209,238,209,238,209,238,209,238,209,230,46,139,180,144,18,209,230,129,254,10, 0,115,5,46,255,148,7,32,195,6,32,17,32,167,32,47,33,247,33,138,216,232,9,10,139,193,232,81,0,232,1,0,195,83,50,237,128,251, 0,116,49,3,240,138,230,42,227,232,44,0,3,245,3,253,254,204,117,245,88,176,32,232,39,0,3,253,254,203,117,247,46,142,30,28, 7,128,62,73,4,7,116,7,160,101,4,186,216,3,238,195,138,222,235,220,138,202,86,87,243,165,95,94,195,138,202,87,243,171,95,195, 246,6,135,4,4,116,18,82,182,3,178,218,80,236,168,8,116,251,176,37,178,216,238,88,90,232,223,254,3,6,78,4,139,248,139,240, 43,209,254,198,254,194,139,46,74,4,3,237,138,195,246,38,74,4,3,192,6,31,195,138,216,232,115,9,139,193,232,20,5,139,248,43, 209,129,194,1,1,208,230,208,230,128,62,73,4,6,115,4,208,226,209,231,232,1,0,195,6,31,50,237,208,227,208,227,116,43,138,195, 180,80,246,228,139,247,3,240,138,230,42,227,232,30,0,129,238,176,31,129,239,176,31,254,204,117,241,138,199,232,38,0,129,239, 176,31,254,203,117,245,195,138,222,235,238,138,202,86,87,243,164,95,94,129,198,0,32,129,199,0,32,86,87,138,202,243,164,95, 94,195,138,202,87,243,170,95,129,199,0,32,87,138,202,243,170,95,195,138,216,184,0,160,142,192,139,193,83,138,62,98,4,232, 57,5,91,139,248,43,209,129,194,1,1,139,46,133,4,139,14,74,4,232,1,0,195,6,31,138,195,42,228,82,247,229,247,225,139,247,3, 240,90,139,193,10,219,116,47,80,138,206,42,203,50,237,82,139,193,247,229,139,200,186,206,3,184,5,1,239,178,196,184,2,15,239, 90,88,232,19,0,82,80,186,206,3,184,5,0,239,88,90,232,24,0,195,138,222,235,248,81,138,202,50,237,86,87,243,164,95,94,3,240, 3,248,89,226,238,195,138,247,42,255,80,82,139,195,247,229,139,216,90,88,80,232,14,0,88,3,248,75,117,246,186,196,3,184,2,15, 239,195,82,186,196,3,184,2,15,239,90,43,192,138,202,50,237,87,243,170,95,138,230,82,186,196,3,176,2,239,90,176,255,138,202, 87,243,170,95,195,138,216,184,0,160,142,192,139,193,83,82,232,216,4,90,91,139,248,43,209,129,194,1,1,139,46,133,4,139,14, 74,4,232,1,0,195,6,31,138,195,42,228,82,247,229,247,225,209,224,209,224,209,224,139,247,3,240,90,139,193,10,219,116,23,80, 138,206,42,203,50,237,82,139,193,247,229,139,200,90,88,232,8,0,232,38,0,195,138,222,235,248,80,209,224,209,224,209,224,81, 138,202,50,237,209,225,209,225,209,225,86,87,243,164,95,94,3,240,3,248,89,226,232,88,195,138,247,42,255,80,82,139,195,247, 229,139,216,90,88,232,14,0,80,209,224,209,224,209,224,3,248,75,88,117,240,195,80,43,192,138,202,50,237,209,225,209,225,209, 225,138,198,87,243,170,95,88,195,232,3,0,233,102,228,232,62,2,138,38,73,4,139,240,209,238,209,238,209,238,209,238,209,238, 209,238,209,238,209,238,209,230,46,139,180,144,18,209,230,129,254,10,0,115,5,46,255,148,219,34,195,218,34,229,34,49,35,150, 35,64,36,253,138,216,232,52,7,139,194,232,124,253,232,1,0,195,83,50,237,128,251,0,116,49,43,240,138,230,42,227,232,87,253, 43,245,43,253,254,204,117,245,88,176,32,232,82,253,43,253,254,203,117,247,46,142,30,28,7,128,62,73,4,7,116,7,160,101,4,186, 216,3,238,195,138,222,235,220,253,138,216,232,232,6,139,194,232,137,2,139,248,43,209,129,194,1,1,208,230,208,230,128,62,73, 4,6,115,5,208,226,209,231,71,232,1,0,195,6,31,50,237,129,199,240,0,208,227,208,227,116,44,138,195,180,80,246,228,139,247, 43,240,138,230,42,227,232,142,253,129,238,80,32,129,239,80,32,254,204,117,241,138,199,232,150,253,129,239,80,32,254,203,117, 245,252,195,138,222,235,237,253,138,216,184,0,160,142,192,139,194,254,196,83,138,62,98,4,232,207,2,91,43,6,74,4,139,248,43, 209,129,194,1,1,139,46,133,4,139,14,74,4,232,1,0,195,6,31,138,195,42,228,82,247,229,247,225,139,247,43,240,90,139,193,10, 219,116,48,80,138,206,42,203,50,237,82,139,193,247,229,139,200,186,206,3,184,5,1,239,178,196,184,2,15,239,90,88,232,20,0, 82,80,186,206,3,184,5,0,239,88,90,232,25,0,252,195,138,222,235,247,81,138,202,50,237,86,87,243,164,95,94,43,240,43,248,89, 226,238,195,138,247,42,255,80,82,139,195,247,229,139,216,90,88,80,232,159,253,88,43,248,75,117,246,186,196,3,184,2,15,239, 195,253,138,216,184,0,160,142,192,139,194,254,196,83,82,232,140,2,90,139,30,74,4,209,227,209,227,209,227,43,195,5,7,0,91, 139,248,43,209,129,194,1,1,139,46,133,4,139,14,74,4,232,1,0,195,6,31,138,195,42,228,82,247,229,247,225,209,224,209,224,209, 224,139,247,43,240,90,139,193,10,219,116,24,80,138,206,42,203,50,237,82,139,193,247,229,139,200,90,88,232,9,0,232,39,0,252, 195,138,222,235,247,80,209,224,209,224,209,224,81,138,202,50,237,209,225,209,225,209,225,86,87,243,164,95,94,43,240,43,248, 89,226,232,88,195,138,247,42,255,80,82,139,195,247,229,139,216,90,88,232,178,253,80,209,224,209,224,209,224,43,248,75,88, 117,240,195,80,138,230,42,229,254,196,58,224,88,117,2,42,192,195,232,3,0,233,16,226,160,73,4,50,228,209,224,139,240,46,139, 180,144,18,209,230,129,254,10,0,115,5,46,255,148,31,37,195,30,37,41,37,121,37,45,38,177,38,232,243,4,50,237,138,207,139,249, 209,231,139,133,80,4,139,30,76,4,139,22,74,4,232,31,0,139,247,139,22,99,4,131,194,6,246,6,135,4,4,6,31,116,11,236,168,1,117, 251,250,236,168,1,116,251,173,195,51,255,227,4,3,251,226,252,139,200,138,196,246,226,50,237,3,193,209,224,3,248,195,232,163, 4,161,80,4,232,67,0,139,240,138,38,73,4,6,31,131,236,8,139,236,232,70,0,46,142,30,28,7,30,196,62,12,1,184,0,0,186,128,0,187, 8,0,232,92,4,31,114,22,196,62,124,0,140,192,11,199,116,12,184,128,0,186,128,0,187,8,0,232,67,4,131,196,8,195,83,139,216,138, 196,246,38,74,4,209,224,209,224,42,255,3,195,91,195,128,252,6,117,25,182,4,138,4,136,70,0,69,138,132,0,32,136,70,0,69,131, 198,80,254,206,117,235,235,22,209,230,182,4,232,19,0,129,198,0,32,232,12,0,129,238,176,31,254,206,117,238,131,237,8,195,138, 36,138,68,1,185,0,192,178,0,133,193,248,116,1,249,208,210,209,233,209,233,115,242,136,86,0,69,195,186,0,160,142,194,139,243, 209,238,209,238,209,238,209,238,209,238,209,238,209,238,209,238,209,230,139,132,80,4,232,44,0,139,240,139,30,133,4,43,227, 139,236,186,206,3,184,5,8,239,139,14,74,4,232,57,0,184,5,0,239,196,62,12,1,184,0,0,186,0,1,232,142,3,3,227,195,83,81,82,42, 237,138,207,139,216,138,196,246,38,74,4,247,38,133,4,42,255,3,195,139,30,76,4,227,4,3,195,226,252,90,89,91,195,83,38,138, 4,246,208,136,70,0,69,3,241,75,117,242,91,43,235,195,186,0,160,142,194,161,80,4,232,33,0,139,240,139,30,133,4,43,227,139, 236,139,22,74,4,232,40,0,196,62,12,1,184,0,0,186,0,1,232,42,3,3,227,195,139,216,138,196,246,38,74,4,247,38,133,4,2,195,128, 212,0,209,224,209,224,209,224,195,83,83,183,128,42,228,185,8,0,38,138,4,60,0,116,2,10,231,208,207,70,226,242,136,102,0,69, 131,238,8,139,202,209,225,209,225,209,225,3,241,91,75,117,213,91,43,235,195,232,3,0,233,232,223,138,38,73,4,128,252,17,117, 6,128,227,128,128,203,63,139,240,209,238,209,238,209,238,209,238,209,238,209,238,209,238,209,238,209,230,46,139,180,144,18, 209,230,129,254,10,0,115,5,46,255,148,97,39,195,96,39,107,39,171,39,154,40,50,41,232,177,2,138,227,80,81,50,237,138,207,139, 249,209,231,139,133,80,4,139,30,76,4,139,22,74,4,232,217,253,89,91,139,22,99,4,131,194,6,246,6,135,4,4,116,11,236,168,1,117, 251,250,236,168,1,116,251,139,195,171,251,226,232,195,232,113,2,138,54,73,4,50,228,80,161,80,4,232,10,254,139,248,88,60,128, 115,6,197,54,12,1,235,6,44,128,197,54,124,0,128,254,6,114,5,232,6,0,235,3,232,51,0,195,209,224,209,224,209,224,3,240,87,86, 182,4,172,246,195,128,117,20,170,172,38,136,133,255,31,131,199,79,254,206,117,236,94,95,71,226,227,195,38,50,5,170,172,38, 50,133,255,31,235,226,209,224,209,224,209,224,3,240,138,211,209,231,128,227,3,138,195,81,185,3,0,208,224,208,224,10,216,226, 248,138,251,89,87,86,182,4,172,232,66,0,35,195,246,194,128,116,7,38,50,37,38,50,69,1,38,136,37,38,136,69,1,172,232,41,0,35, 195,246,194,128,116,10,38,50,165,0,32,38,50,133,1,32,38,136,165,0,32,38,136,133,1,32,131,199,80,254,206,117,193,94,95,71, 71,226,183,195,82,81,83,43,210,185,1,0,139,216,35,217,11,211,209,224,209,225,139,216,35,217,11,211,209,225,115,236,139,194, 91,89,90,195,50,228,247,38,133,4,80,139,243,209,238,209,238,209,238,209,238,209,238,209,238,209,238,209,238,209,230,139,132, 80,4,232,189,253,139,248,186,0,160,142,194,139,46,74,4,139,22,133,4,197,54,12,1,88,3,240,232,1,0,195,246,195,128,116,11,82, 186,206,3,184,3,24,239,90,235,23,87,82,186,196,3,184,2,15,239,90,43,192,81,139,202,170,3,253,79,226,250,89,95,82,186,196, 3,138,227,176,2,239,90,87,83,81,139,218,139,205,138,4,38,138,37,38,136,5,70,3,249,75,117,242,89,91,43,242,95,71,226,178,186, 206,3,184,3,0,239,178,196,184,2,15,239,195,246,38,133,4,80,83,161,80,4,232,159,253,139,248,186,0,160,142,194,91,88,139,22, 133,4,139,46,74,4,197,54,12,1,3,240,83,81,87,86,232,10,0,94,95,131,199,8,89,91,226,240,195,82,85,209,229,209,229,209,229, 252,172,138,224,87,185,8,0,138,195,208,228,114,2,138,199,170,226,245,95,3,253,74,117,232,93,90,195,232,3,0,233,131,221,138, 38,73,4,139,240,209,238,209,238,209,238,209,238,209,238,209,238,209,238,209,238,209,230,46,139,180,144,18,209,230,129,254, 10,0,115,5,46,255,148,187,41,195,186,41,197,41,171,39,154,40,50,41,232,87,0,80,81,50,237,138,207,139,249,209,231,139,133, 80,4,139,30,76,4,139,22,74,4,232,129,251,89,91,139,22,99,4,131,194,6,246,6,135,4,4,116,11,236,168,1,117,251,250,236,168,1, 116,251,138,195,170,251,71,226,231,195,252,22,31,139,245,86,87,139,203,243,166,95,94,116,10,64,3,251,74,117,240,43,192,248, 195,249,195,190,0,184,139,62,16,4,129,231,48,0,131,255,48,117,3,190,0,176,142,198,195,102,38,133,75,20,14,128,62,99,4,180, 116,9,246,6,135,4,8,116,5,205,66,233,197,220,51,237,196,62,168,4,131,199,4,38,196,61,140,192,11,199,116,1,69,232,19,1,10, 255,117,85,138,251,160,102,4,36,224,128,227,31,10,195,162,102,4,138,223,138,232,128,227,15,138,251,208,227,128,227,16,128, 231,7,10,223,128,62,73,4,3,118,17,180,0,138,195,232,138,220,232,149,0,11,237,116,3,38,136,29,180,17,138,195,232,121,220,232, 132,0,11,237,116,4,38,136,93,16,138,221,128,227,32,177,5,210,235,128,62,73,4,3,118,83,160,102,4,36,223,128,227,1,116,2,12, 32,162,102,4,36,16,12,2,10,216,180,1,138,195,232,66,220,232,77,0,11,237,116,4,38,136,93,1,254,195,254,195,180,2,138,195,232, 44,220,232,55,0,11,237,116,4,38,136,93,2,254,195,254,195,180,3,138,195,232,22,220,232,33,0,11,237,116,4,38,136,93,3,232,84, 0,233,246,219,81,51,201,180,5,236,168,8,117,7,226,249,254,204,117,245,249,89,195,82,83,139,216,232,230,255,156,250,236,178, 192,139,195,134,196,238,134,196,238,176,32,238,157,91,90,195,82,83,139,216,232,203,255,156,250,236,82,139,195,178,192,238, 66,235,0,236,138,224,90,236,235,0,178,192,176,32,238,157,91,90,195,232,6,0,178,192,176,32,238,195,232,168,219,236,195,195, 43,253,43,45,44,103,44,19,7,19,7,19,7,155,44,168,44,181,44,19,7,19,7,19,7,19,7,19,7,19,7,194,44,19,7,218,44,247,44,19,7,58, 45,19,7,78,45,98,45,107,45,124,45,169,45,152,139,240,209,230,131,254,56,115,60,46,255,164,124,43,128,62,73,4,19,116,48,51, 237,196,62,168,4,131,199,4,38,196,61,140,192,11,199,116,1,69,232,151,255,138,227,138,199,232,59,219,232,70,255,232,129,255, 11,237,116,9,138,199,42,255,3,251,38,136,5,233,22,219,51,237,196,62,168,4,131,199,4,38,196,61,140,192,11,199,116,1,69,232, 100,255,180,17,138,199,232,8,219,232,19,255,232,78,255,11,237,116,6,131,199,17,38,136,61,233,230,218,128,62,73,4,19,116,48, 30,6,196,62,168,4,131,199,4,38,196,61,140,192,11,199,116,9,31,30,139,242,185,17,0,243,164,7,31,139,218,191,0,0,185,17,0,51, 237,232,196,218,232,176,2,232,10,255,233,172,218,250,232,12,255,186,192,3,176,16,238,66,236,251,10,219,117,10,128,38,101, 4,223,36,247,235,12,144,254,203,117,7,128,14,101,4,32,12,8,180,16,232,144,218,232,155,254,232,214,254,233,120,218,138,195, 232,130,218,232,168,254,138,252,233,203,0,176,17,232,117,218,232,155,254,138,252,233,190,0,139,218,232,104,218,51,237,232, 125,2,233,81,218,246,6,137,4,6,116,3,232,36,1,82,232,82,218,232,74,254,90,232,93,1,233,57,218,139,251,139,218,180,32,232, 151,229,138,22,137,4,128,226,6,208,234,80,232,227,1,88,232,134,229,233,28,218,176,16,232,38,218,232,76,254,10,219,117,24, 138,196,12,128,10,255,117,2,36,127,180,16,232,16,218,232,27,254,232,86,254,233,248,217,138,199,246,196,128,117,8,36,3,208, 224,208,224,235,2,36,15,180,20,232,241,217,232,252,253,232,55,254,233,217,217,232,229,217,232,221,253,232,135,0,95,94,91, 88,88,138,208,31,7,93,207,139,251,139,218,180,32,232,35,229,80,232,157,1,88,232,27,229,233,177,217,186,198,3,139,195,238, 233,168,217,186,198,3,236,50,228,139,216,95,94,88,89,90,31,7,93,207,232,163,217,176,16,232,199,253,138,220,128,227,128,177, 7,210,235,176,20,232,144,217,232,182,253,138,252,10,219,117,9,128,231,12,208,239,208,239,235,207,128,231,15,235,202,180,32, 232,204,228,80,232,7,0,88,232,196,228,233,90,217,81,83,232,12,0,232,47,0,232,112,0,91,67,89,226,240,195,186,199,3,138,195, 238,186,201,3,156,235,0,250,236,235,0,36,63,138,224,236,235,0,36,63,138,232,236,157,36,63,138,200,138,244,50,210,195,83,138, 198,80,138,197,80,138,193,37,63,0,51,219,51,201,46,247,38,57,42,3,216,19,202,88,37,63,0,46,247,38,55,42,3,216,19,202,88,37, 63,0,46,247,38,53,42,3,216,19,202,3,219,19,201,129,195,0,128,131,209,0,138,241,138,233,91,195,82,138,195,186,200,3,238,186, 201,3,88,138,196,156,250,238,235,0,138,197,238,235,0,138,193,238,157,139,208,195,80,186,198,3,236,60,255,116,3,176,255,238, 128,251,0,185,64,0,116,24,88,80,128,252,15,116,5,128,252,7,117,6,190,177,48,235,87,144,190,177,47,235,59,144,88,80,128,252, 19,116,6,190,49,48,235,46,144,88,80,187,32,0,232,102,3,190,17,49,185,16,0,187,16,0,232,249,0,190,241,48,185,16,0,187,0,0, 88,80,168,3,116,32,131,198,16,232,228,0,88,235,27,144,88,80,168,3,116,16,131,198,64,185,64,0,187,0,0,232,206,0,88,235,5,144, 88,232,140,0,195,139,194,81,38,138,55,67,38,138,47,67,38,138,15,67,83,139,223,80,169,3,0,116,3,232,2,255,232,67,255,88,91, 89,71,226,222,195,81,83,139,223,232,203,254,91,71,38,136,55,67,38,136,47,67,38,136,15,67,89,226,232,195,82,236,139,199,134, 224,128,252,16,116,15,127,28,38,138,7,90,82,232,10,252,254,196,67,226,236,11,237,116,1,67,254,196,38,138,7,90,232,247,251, 195,90,195,139,251,42,219,138,195,232,6,252,38,136,37,254,195,71,128,251,16,114,240,11,237,116,1,71,176,17,232,241,251,38, 136,37,195,179,0,81,183,3,46,138,36,70,176,0,246,196,4,116,2,4,42,246,196,32,116,2,4,21,80,208,228,254,207,117,233,88,138, 200,88,138,232,88,138,240,86,83,50,255,232,166,254,91,94,254,195,89,58,217,124,201,195,3,203,81,46,138,12,138,233,138,241, 86,83,232,141,254,91,94,70,67,89,59,217,124,234,195,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26, 27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,5,17,28, 8,11,37,40,2,7,27,32,15,20,40,44,12,17,37,42,20,30,50,54,15,19,39,44,27,32,52,57,6,11,31,36,19,24,44,48,9,13,33,38,21,26, 46,51,19,23,43,48,31,36,56,61,14,24,45,50,32,36,56,63,0,1,2,3,4,5,20,7,0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63,56,57,58, 59,60,61,62,63,0,1,2,3,4,5,20,7,0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63,56,57,58,59,60,61,62,63,0,5,17,28,8,11,20,40,0,5, 17,28,8,11,20,40,14,24,45,50,32,36,56,63,14,24,45,50,32,36,56,63,0,5,17,28,8,11,20,40,0,5,17,28,8,11,20,40,14,24,45,50,32, 36,56,63,14,24,45,50,32,36,56,63,0,0,0,0,0,0,0,0,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,63,63,63,63,63,63,63,63,0,0,0,0,0,0,0,0, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,63,63,63,63,63,63,63,63,0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63,0,5,17,28,8,11,20,40,14, 24,45,50,32,36,56,63,0,5,8,11,14,17,20,24,28,32,36,40,45,50,56,63,0,16,31,47,63,63,63,63,63,63,63,63,63,47,31,16,0,0,0,0, 0,0,0,0,31,39,47,55,63,63,63,63,63,63,63,63,63,55,47,39,31,31,31,31,31,31,31,31,45,49,54,58,63,63,63,63,63,63,63,63,63,58, 54,49,45,45,45,45,45,45,45,45,0,7,14,21,28,28,28,28,28,28,28,28,28,21,14,7,0,0,0,0,0,0,0,0,14,17,21,24,28,28,28,28,28,28, 28,28,28,24,21,17,14,14,14,14,14,14,14,14,20,22,24,26,28,28,28,28,28,28,28,28,28,26,24,22,20,20,20,20,20,20,20,20,0,4,8,12, 16,16,16,16,16,16,16,16,16,12,8,4,0,0,0,0,0,0,0,0,8,10,12,14,16,16,16,16,16,16,16,16,16,14,12,10,8,8,8,8,8,8,8,8,11,12,13, 15,16,16,16,16,16,16,16,16,16,15,13,12,11,11,11,11,11,11,11,11,139,235,185,9,0,190,33,49,81,187,0,0,83,46,138,48,128,195, 8,128,251,24,124,3,128,235,24,46,138,8,128,195,8,128,251,24,124,3,128,235,24,46,138,40,86,80,139,221,168,3,116,3,232,192, 251,232,1,252,88,94,69,91,254,195,128,251,24,124,199,131,198,24,89,226,189,195,138,38,73,4,139,240,81,177,8,211,238,89,209, 230,46,139,180,144,18,209,230,129,254,10,0,115,5,46,255,164,104,50,233,171,212,19,7,19,7,114,50,154,50,235,50,46,142,6,32, 7,80,80,232,23,1,210,232,34,196,38,138,12,91,246,195,128,117,13,246,212,34,204,10,193,38,136,4,88,233,125,212,50,193,235, 245,80,139,194,232,54,1,186,206,3,138,224,176,8,239,46,142,6,30,7,88,138,232,246,197,128,116,6,184,3,24,239,235,14,178,196, 184,2,255,239,38,138,7,42,192,38,136,7,178,196,176,2,138,229,128,228,15,239,38,138,39,180,255,38,136,39,239,178,206,184,3, 0,239,184,8,255,239,134,224,233,40,212,80,139,194,187,64,1,247,227,3,193,139,240,88,46,142,6,30,7,38,136,4,233,16,212,138, 38,73,4,139,240,81,177,8,211,238,89,209,230,46,139,180,144,18,209,230,129,254,10,0,115,5,46,255,164,38,51,233,237,211,19, 7,19,7,48,51,70,51,123,51,46,142,6,32,7,232,91,0,38,138,4,34,196,210,224,138,206,210,192,233,205,211,46,142,6,30,7,139,194, 232,134,0,181,7,42,233,43,210,180,0,138,205,176,4,82,186,206,3,239,90,38,138,7,210,232,36,1,138,204,210,224,10,208,254,196, 128,252,3,118,226,138,194,233,152,211,80,139,194,187,64,1,247,227,3,193,139,248,88,46,142,6,30,7,38,138,5,233,128,211,83, 80,176,40,82,128,226,254,246,226,90,246,194,1,116,3,5,0,32,139,240,88,139,209,187,192,2,185,2,3,128,62,73,4,6,114,6,187,128, 1,185,3,7,34,234,211,234,3,242,138,247,42,201,208,200,2,205,254,207,117,248,138,227,210,236,91,195,247,38,74,4,81,209,233, 209,233,209,233,3,193,138,223,42,255,139,203,139,30,76,4,227,4,3,195,226,252,89,139,216,128,225,7,176,128,210,232,195,138, 62,98,4,139,243,177,8,211,238,209,230,139,148,80,4,232,3,0,233,255,210,80,60,13,118,95,30,83,82,185,1,0,232,110,245,90,91, 31,254,194,58,22,74,4,117,70,50,210,58,54,132,4,117,60,232,253,234,138,38,73,4,232,220,218,116,4,180,0,235,7,30,83,232,185, 240,91,31,138,30,98,4,136,62,98,4,83,138,252,176,1,43,201,138,54,132,4,138,22,74,4,254,202,30,232,112,235,31,91,136,30,98, 4,88,195,254,198,232,191,234,235,247,116,19,60,10,116,19,60,7,116,23,60,8,117,147,10,210,116,233,74,235,230,50,210,235,226, 58,54,132,4,117,218,235,156,185,51,5,179,1,232,229,209,235,204,60,4,115,75,227,73,139,243,81,177,8,211,238,89,209,230,255, 180,80,4,86,80,81,82,232,119,234,90,89,88,94,81,83,80,134,224,38,138,70,0,69,60,8,116,12,60,13,116,8,60,10,116,4,60,7,117, 25,86,82,6,85,30,232,48,255,31,93,7,90,94,139,148,80,4,88,91,89,235,77,233,30,210,185,1,0,128,252,2,114,5,38,138,94,0,69, 86,82,6,85,30,232,33,242,31,93,7,90,94,88,91,89,254,194,58,22,74,4,114,37,138,22,132,4,254,194,254,198,58,242,178,0,114,23, 254,206,80,83,81,82,86,6,85,30,176,10,232,221,254,31,93,7,94,90,89,91,88,86,80,81,82,232,239,233,90,89,88,94,226,10,90,168, 1,117,161,232,225,233,235,156,233,105,255,60,0,117,4,6,31,235,103,60,1,117,2,235,97,60,2,117,2,235,91,60,3,117,3,235,93,144, 60,4,117,4,254,200,235,76,60,16,117,5,6,31,235,82,144,60,17,117,3,235,75,144,60,18,117,3,235,68,144,60,20,117,4,254,200,235, 59,60,32,117,3,233,151,0,60,33,117,3,233,164,0,60,34,117,3,233,157,0,60,35,117,3,233,150,0,60,36,117,3,233,143,0,60,48,117, 3,233,227,0,233,75,209,138,224,232,20,0,233,67,209,232,140,220,233,61,209,138,224,128,236,16,232,3,0,233,50,209,30,81,46, 142,30,28,7,139,14,99,4,232,29,220,89,31,128,252,0,116,33,183,14,189,141,63,128,252,1,116,15,183,8,189,141,55,128,252,2,116, 5,183,16,189,186,78,186,0,0,185,0,1,14,31,80,128,227,127,184,0,160,232,115,216,88,168,16,116,3,232,195,0,46,142,30,28,7,139, 14,99,4,232,3,220,232,54,245,195,44,32,46,142,30,28,7,250,137,46,124,0,140,6,126,0,251,233,198,208,44,32,46,142,30,28,7,254, 200,116,32,14,7,254,200,117,8,185,14,0,189,141,63,235,18,254,200,117,8,185,8,0,189,141,55,235,6,185,16,0,189,186,78,250,137, 46,12,1,140,6,14,1,251,137,14,133,4,138,195,187,164,54,10,192,117,5,138,194,235,9,144,60,3,118,2,176,2,46,215,254,200,162, 132,4,233,111,208,0,14,25,43,139,14,133,4,138,22,132,4,128,255,7,119,236,128,255,1,119,23,46,142,30,28,7,10,255,117,7,196, 46,124,0,235,26,144,196,46,12,1,235,19,144,128,239,2,138,223,42,255,209,227,129,195,129,55,46,139,47,14,7,95,94,91,88,88, 31,88,88,207,46,142,30,28,7,138,199,50,228,163,133,4,254,200,139,22,99,4,138,224,176,20,128,62,73,4,7,117,1,239,80,176,9, 238,66,236,36,224,10,224,74,176,9,239,88,138,204,254,204,138,236,128,249,13,124,4,129,233,1,1,137,14,96,4,176,10,232,41,232, 138,38,73,4,232,6,208,138,216,184,200,0,128,251,0,116,11,184,94,1,128,251,1,116,3,184,144,1,153,247,54,133,4,72,162,132,4, 254,192,42,228,247,38,133,4,128,251,0,117,2,209,224,72,139,22,99,4,138,224,176,18,239,160,132,4,254,192,246,38,74,4,209,224, 5,0,1,163,76,4,195,141,63,141,55,141,59,141,77,186,78,186,94,0,0,0,0,0,0,0,0,126,129,165,129,189,153,129,126,126,255,219, 255,195,231,255,126,108,254,254,254,124,56,16,0,16,56,124,254,124,56,16,0,56,124,56,254,254,124,56,124,16,16,56,124,254,124, 56,124,0,0,24,60,60,24,0,0,255,255,231,195,195,231,255,255,0,60,102,66,66,102,60,0,255,195,153,189,189,153,195,255,15,7,15, 125,204,204,204,120,60,102,102,102,60,24,126,24,63,51,63,48,48,112,240,224,127,99,127,99,99,103,230,192,153,90,60,231,231, 60,90,153,128,224,248,254,248,224,128,0,2,14,62,254,62,14,2,0,24,60,126,24,24,126,60,24,102,102,102,102,102,0,102,0,127,219, 219,123,27,27,27,0,62,99,56,108,108,56,204,120,0,0,0,0,126,126,126,0,24,60,126,24,126,60,24,255,24,60,126,24,24,24,24,0,24, 24,24,24,126,60,24,0,0,24,12,254,12,24,0,0,0,48,96,254,96,48,0,0,0,0,192,192,192,254,0,0,0,36,102,255,102,36,0,0,0,24,60, 126,255,255,0,0,0,255,255,126,60,24,0,0,0,0,0,0,0,0,0,0,48,120,120,48,48,0,48,0,108,108,108,0,0,0,0,0,108,108,254,108,254, 108,108,0,48,124,192,120,12,248,48,0,0,198,204,24,48,102,198,0,56,108,56,118,220,204,118,0,96,96,192,0,0,0,0,0,24,48,96,96, 96,48,24,0,96,48,24,24,24,48,96,0,0,102,60,255,60,102,0,0,0,48,48,252,48,48,0,0,0,0,0,0,0,48,48,96,0,0,0,252,0,0,0,0,0,0, 0,0,0,48,48,0,6,12,24,48,96,192,128,0,124,198,206,222,246,230,124,0,48,112,48,48,48,48,252,0,120,204,12,56,96,204,252,0,120, 204,12,56,12,204,120,0,28,60,108,204,254,12,30,0,252,192,248,12,12,204,120,0,56,96,192,248,204,204,120,0,252,204,12,24,48, 48,48,0,120,204,204,120,204,204,120,0,120,204,204,124,12,24,112,0,0,48,48,0,0,48,48,0,0,48,48,0,0,48,48,96,24,48,96,192,96, 48,24,0,0,0,252,0,0,252,0,0,96,48,24,12,24,48,96,0,120,204,12,24,48,0,48,0,124,198,222,222,222,192,120,0,48,120,204,204,252, 204,204,0,252,102,102,124,102,102,252,0,60,102,192,192,192,102,60,0,248,108,102,102,102,108,248,0,254,98,104,120,104,98,254, 0,254,98,104,120,104,96,240,0,60,102,192,192,206,102,62,0,204,204,204,252,204,204,204,0,120,48,48,48,48,48,120,0,30,12,12, 12,204,204,120,0,230,102,108,120,108,102,230,0,240,96,96,96,98,102,254,0,198,238,254,254,214,198,198,0,198,230,246,222,206, 198,198,0,56,108,198,198,198,108,56,0,252,102,102,124,96,96,240,0,120,204,204,204,220,120,28,0,252,102,102,124,108,102,230, 0,120,204,224,112,28,204,120,0,252,180,48,48,48,48,120,0,204,204,204,204,204,204,252,0,204,204,204,204,204,120,48,0,198,198, 198,214,254,238,198,0,198,198,108,56,56,108,198,0,204,204,204,120,48,48,120,0,254,198,140,24,50,102,254,0,120,96,96,96,96, 96,120,0,192,96,48,24,12,6,2,0,120,24,24,24,24,24,120,0,16,56,108,198,0,0,0,0,0,0,0,0,0,0,0,255,48,48,24,0,0,0,0,0,0,0,120, 12,124,204,118,0,224,96,96,124,102,102,220,0,0,0,120,204,192,204,120,0,28,12,12,124,204,204,118,0,0,0,120,204,252,192,120, 0,56,108,96,240,96,96,240,0,0,0,118,204,204,124,12,248,224,96,108,118,102,102,230,0,48,0,112,48,48,48,120,0,12,0,12,12,12, 204,204,120,224,96,102,108,120,108,230,0,112,48,48,48,48,48,120,0,0,0,204,254,254,214,198,0,0,0,248,204,204,204,204,0,0,0, 120,204,204,204,120,0,0,0,220,102,102,124,96,240,0,0,118,204,204,124,12,30,0,0,220,118,102,96,240,0,0,0,124,192,120,12,248, 0,16,48,124,48,48,52,24,0,0,0,204,204,204,204,118,0,0,0,204,204,204,120,48,0,0,0,198,214,254,254,108,0,0,0,198,108,56,108, 198,0,0,0,204,204,204,124,12,248,0,0,252,152,48,100,252,0,28,48,48,224,48,48,28,0,24,24,24,0,24,24,24,0,224,48,48,28,48,48, 224,0,118,220,0,0,0,0,0,0,0,16,56,108,198,198,254,0,120,204,192,204,120,24,12,120,0,204,0,204,204,204,126,0,28,0,120,204, 252,192,120,0,126,195,60,6,62,102,63,0,204,0,120,12,124,204,126,0,224,0,120,12,124,204,126,0,48,48,120,12,124,204,126,0,0, 0,120,192,192,120,12,56,126,195,60,102,126,96,60,0,204,0,120,204,252,192,120,0,224,0,120,204,252,192,120,0,204,0,112,48,48, 48,120,0,124,198,56,24,24,24,60,0,224,0,112,48,48,48,120,0,198,56,108,198,254,198,198,0,48,48,0,120,204,252,204,0,28,0,252, 96,120,96,252,0,0,0,127,12,127,204,127,0,62,108,204,254,204,204,206,0,120,204,0,120,204,204,120,0,0,204,0,120,204,204,120, 0,0,224,0,120,204,204,120,0,120,204,0,204,204,204,126,0,0,224,0,204,204,204,126,0,0,204,0,204,204,124,12,248,195,24,60,102, 102,60,24,0,204,0,204,204,204,204,120,0,24,24,126,192,192,126,24,24,56,108,100,240,96,230,252,0,204,204,120,252,48,252,48, 48,248,204,204,250,198,207,198,199,14,27,24,60,24,24,216,112,28,0,120,12,124,204,126,0,56,0,112,48,48,48,120,0,0,28,0,120, 204,204,120,0,0,28,0,204,204,204,126,0,0,248,0,248,204,204,204,0,252,0,204,236,252,220,204,0,60,108,108,62,0,126,0,0,56,108, 108,56,0,124,0,0,48,0,48,96,192,204,120,0,0,0,0,252,192,192,0,0,0,0,0,252,12,12,0,0,195,198,204,222,51,102,204,15,195,198, 204,219,55,111,207,3,24,24,0,24,24,24,24,0,0,51,102,204,102,51,0,0,0,204,102,51,102,204,0,0,34,136,34,136,34,136,34,136,85, 170,85,170,85,170,85,170,219,119,219,238,219,119,219,238,24,24,24,24,24,24,24,24,24,24,24,24,248,24,24,24,24,24,248,24,248, 24,24,24,54,54,54,54,246,54,54,54,0,0,0,0,254,54,54,54,0,0,248,24,248,24,24,24,54,54,246,6,246,54,54,54,54,54,54,54,54,54, 54,54,0,0,254,6,246,54,54,54,54,54,246,6,254,0,0,0,54,54,54,54,254,0,0,0,24,24,248,24,248,0,0,0,0,0,0,0,248,24,24,24,24,24, 24,24,31,0,0,0,24,24,24,24,255,0,0,0,0,0,0,0,255,24,24,24,24,24,24,24,31,24,24,24,0,0,0,0,255,0,0,0,24,24,24,24,255,24,24, 24,24,24,31,24,31,24,24,24,54,54,54,54,55,54,54,54,54,54,55,48,63,0,0,0,0,0,63,48,55,54,54,54,54,54,247,0,255,0,0,0,0,0,255, 0,247,54,54,54,54,54,55,48,55,54,54,54,0,0,255,0,255,0,0,0,54,54,247,0,247,54,54,54,24,24,255,0,255,0,0,0,54,54,54,54,255, 0,0,0,0,0,255,0,255,24,24,24,0,0,0,0,255,54,54,54,54,54,54,54,63,0,0,0,24,24,31,24,31,0,0,0,0,0,31,24,31,24,24,24,0,0,0,0, 63,54,54,54,54,54,54,54,255,54,54,54,24,24,255,24,255,24,24,24,24,24,24,24,248,0,0,0,0,0,0,0,31,24,24,24,255,255,255,255, 255,255,255,255,0,0,0,0,255,255,255,255,240,240,240,240,240,240,240,240,15,15,15,15,15,15,15,15,255,255,255,255,0,0,0,0,0, 0,118,220,200,220,118,0,0,120,204,248,204,248,192,192,0,252,204,192,192,192,192,0,0,254,108,108,108,108,108,0,252,204,96, 48,96,204,252,0,0,0,126,216,216,216,112,0,0,102,102,102,102,124,96,192,0,118,220,24,24,24,24,0,252,48,120,204,204,120,48, 252,56,108,198,254,198,108,56,0,56,108,198,198,108,108,238,0,28,48,24,124,204,204,120,0,0,0,126,219,219,126,0,0,6,12,126, 219,219,126,96,192,56,96,192,248,192,96,56,0,120,204,204,204,204,204,204,0,0,252,0,252,0,252,0,0,48,48,252,48,48,0,252,0, 96,48,24,48,96,0,252,0,24,48,96,48,24,0,252,0,14,27,27,24,24,24,24,24,24,24,24,24,24,216,216,112,48,48,0,252,0,48,48,0,0, 118,220,0,118,220,0,0,56,108,108,56,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,0,24,0,0,0,15,12,12,12,236,108,60,28,120,108,108,108, 108,0,0,0,112,24,48,96,120,0,0,0,0,0,60,60,60,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,126,129,165,129,129, 189,153,129,126,0,0,0,0,0,126,255,219,255,255,195,231,255,126,0,0,0,0,0,0,108,254,254,254,254,124,56,16,0,0,0,0,0,0,16,56, 124,254,124,56,16,0,0,0,0,0,0,24,60,60,231,231,231,24,24,60,0,0,0,0,0,24,60,126,255,255,126,24,24,60,0,0,0,0,0,0,0,0,24,60, 60,24,0,0,0,0,0,255,255,255,255,255,231,195,195,231,255,255,255,255,255,0,0,0,0,60,102,66,66,102,60,0,0,0,0,255,255,255,255, 195,153,189,189,153,195,255,255,255,255,0,0,30,14,26,50,120,204,204,204,120,0,0,0,0,0,60,102,102,102,60,24,126,24,24,0,0, 0,0,0,63,51,63,48,48,48,112,240,224,0,0,0,0,0,127,99,127,99,99,99,103,231,230,192,0,0,0,0,24,24,219,60,231,60,219,24,24,0, 0,0,0,0,128,192,224,248,254,248,224,192,128,0,0,0,0,0,2,6,14,62,254,62,14,6,2,0,0,0,0,0,24,60,126,24,24,24,126,60,24,0,0, 0,0,0,102,102,102,102,102,102,0,102,102,0,0,0,0,0,127,219,219,219,123,27,27,27,27,0,0,0,0,124,198,96,56,108,198,198,108,56, 12,198,124,0,0,0,0,0,0,0,0,0,254,254,254,0,0,0,0,0,24,60,126,24,24,24,126,60,24,126,0,0,0,0,24,60,126,24,24,24,24,24,24,0, 0,0,0,0,24,24,24,24,24,24,126,60,24,0,0,0,0,0,0,0,24,12,254,12,24,0,0,0,0,0,0,0,0,0,48,96,254,96,48,0,0,0,0,0,0,0,0,0,0,192, 192,192,254,0,0,0,0,0,0,0,0,0,40,108,254,108,40,0,0,0,0,0,0,0,0,16,56,56,124,124,254,254,0,0,0,0,0,0,0,254,254,124,124,56, 56,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,60,60,60,24,24,0,24,24,0,0,0,0,102,102,102,36,0,0,0,0,0,0,0,0,0,0,0,108, 108,254,108,108,108,254,108,108,0,0,0,24,24,124,198,194,192,124,6,134,198,124,24,24,0,0,0,0,0,194,198,12,24,48,102,198,0, 0,0,0,0,56,108,108,56,118,220,204,204,118,0,0,0,0,48,48,48,96,0,0,0,0,0,0,0,0,0,0,0,12,24,48,48,48,48,48,24,12,0,0,0,0,0, 48,24,12,12,12,12,12,24,48,0,0,0,0,0,0,0,102,60,255,60,102,0,0,0,0,0,0,0,0,0,24,24,126,24,24,0,0,0,0,0,0,0,0,0,0,0,0,0,24, 24,24,48,0,0,0,0,0,0,0,0,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,0,0,0,0,0,2,6,12,24,48,96,192,128,0,0,0,0,0,0,124,198, 206,222,246,230,198,198,124,0,0,0,0,0,24,56,120,24,24,24,24,24,126,0,0,0,0,0,124,198,6,12,24,48,96,198,254,0,0,0,0,0,124, 198,6,6,60,6,6,198,124,0,0,0,0,0,12,28,60,108,204,254,12,12,30,0,0,0,0,0,254,192,192,192,252,6,6,198,124,0,0,0,0,0,56,96, 192,192,252,198,198,198,124,0,0,0,0,0,254,198,6,12,24,48,48,48,48,0,0,0,0,0,124,198,198,198,124,198,198,198,124,0,0,0,0,0, 124,198,198,198,126,6,6,12,120,0,0,0,0,0,0,24,24,0,0,0,24,24,0,0,0,0,0,0,0,24,24,0,0,0,24,24,48,0,0,0,0,0,6,12,24,48,96,48, 24,12,6,0,0,0,0,0,0,0,0,126,0,0,126,0,0,0,0,0,0,0,96,48,24,12,6,12,24,48,96,0,0,0,0,0,124,198,198,12,24,24,0,24,24,0,0,0, 0,0,124,198,198,222,222,222,220,192,124,0,0,0,0,0,16,56,108,198,198,254,198,198,198,0,0,0,0,0,252,102,102,102,124,102,102, 102,252,0,0,0,0,0,60,102,194,192,192,192,194,102,60,0,0,0,0,0,248,108,102,102,102,102,102,108,248,0,0,0,0,0,254,102,98,104, 120,104,98,102,254,0,0,0,0,0,254,102,98,104,120,104,96,96,240,0,0,0,0,0,60,102,194,192,192,222,198,102,58,0,0,0,0,0,198,198, 198,198,254,198,198,198,198,0,0,0,0,0,60,24,24,24,24,24,24,24,60,0,0,0,0,0,30,12,12,12,12,12,204,204,120,0,0,0,0,0,230,102, 108,108,120,108,108,102,230,0,0,0,0,0,240,96,96,96,96,96,98,102,254,0,0,0,0,0,198,238,254,254,214,198,198,198,198,0,0,0,0, 0,198,230,246,254,222,206,198,198,198,0,0,0,0,0,56,108,198,198,198,198,198,108,56,0,0,0,0,0,252,102,102,102,124,96,96,96, 240,0,0,0,0,0,124,198,198,198,198,214,222,124,12,14,0,0,0,0,252,102,102,102,124,108,102,102,230,0,0,0,0,0,124,198,198,96, 56,12,198,198,124,0,0,0,0,0,126,126,90,24,24,24,24,24,60,0,0,0,0,0,198,198,198,198,198,198,198,198,124,0,0,0,0,0,198,198, 198,198,198,198,108,56,16,0,0,0,0,0,198,198,198,198,214,214,254,124,108,0,0,0,0,0,198,198,108,56,56,56,108,198,198,0,0,0, 0,0,102,102,102,102,60,24,24,24,60,0,0,0,0,0,254,198,140,24,48,96,194,198,254,0,0,0,0,0,60,48,48,48,48,48,48,48,60,0,0,0, 0,0,128,192,224,112,56,28,14,6,2,0,0,0,0,0,60,12,12,12,12,12,12,12,60,0,0,0,16,56,108,198,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,255,0,48,48,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,12,124,204,204,118,0,0,0,0,0,224,96,96,120,108,102,102,102, 124,0,0,0,0,0,0,0,0,124,198,192,192,198,124,0,0,0,0,0,28,12,12,60,108,204,204,204,118,0,0,0,0,0,0,0,0,124,198,254,192,198, 124,0,0,0,0,0,56,108,100,96,240,96,96,96,240,0,0,0,0,0,0,0,0,118,204,204,204,124,12,204,120,0,0,0,224,96,96,108,118,102,102, 102,230,0,0,0,0,0,24,24,0,56,24,24,24,24,60,0,0,0,0,0,6,6,0,14,6,6,6,6,102,102,60,0,0,0,224,96,96,102,108,120,108,102,230, 0,0,0,0,0,56,24,24,24,24,24,24,24,60,0,0,0,0,0,0,0,0,236,254,214,214,214,198,0,0,0,0,0,0,0,0,220,102,102,102,102,102,0,0, 0,0,0,0,0,0,124,198,198,198,198,124,0,0,0,0,0,0,0,0,220,102,102,102,124,96,96,240,0,0,0,0,0,0,118,204,204,204,124,12,12,30, 0,0,0,0,0,0,220,118,102,96,96,240,0,0,0,0,0,0,0,0,124,198,112,28,198,124,0,0,0,0,0,16,48,48,252,48,48,48,54,28,0,0,0,0,0, 0,0,0,204,204,204,204,204,118,0,0,0,0,0,0,0,0,102,102,102,102,60,24,0,0,0,0,0,0,0,0,198,198,214,214,254,108,0,0,0,0,0,0,0, 0,198,108,56,56,108,198,0,0,0,0,0,0,0,0,198,198,198,198,126,6,12,248,0,0,0,0,0,0,254,204,24,48,102,254,0,0,0,0,0,14,24,24, 24,112,24,24,24,14,0,0,0,0,0,24,24,24,24,0,24,24,24,24,0,0,0,0,0,112,24,24,24,14,24,24,24,112,0,0,0,0,0,118,220,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,16,56,108,198,198,254,0,0,0,0,0,0,60,102,194,192,192,194,102,60,12,6,124,0,0,0,204,204,0,204,204,204,204, 204,118,0,0,0,0,12,24,48,0,124,198,254,192,198,124,0,0,0,0,16,56,108,0,120,12,124,204,204,118,0,0,0,0,0,204,204,0,120,12, 124,204,204,118,0,0,0,0,96,48,24,0,120,12,124,204,204,118,0,0,0,0,56,108,56,0,120,12,124,204,204,118,0,0,0,0,0,0,0,60,102, 96,102,60,12,6,60,0,0,0,16,56,108,0,124,198,254,192,198,124,0,0,0,0,0,204,204,0,124,198,254,192,198,124,0,0,0,0,96,48,24, 0,124,198,254,192,198,124,0,0,0,0,0,102,102,0,56,24,24,24,24,60,0,0,0,0,24,60,102,0,56,24,24,24,24,60,0,0,0,0,96,48,24,0, 56,24,24,24,24,60,0,0,0,0,198,198,16,56,108,198,198,254,198,198,0,0,0,56,108,56,0,56,108,198,198,254,198,198,0,0,0,24,48, 96,0,254,102,96,124,96,102,254,0,0,0,0,0,0,0,204,118,54,126,216,216,110,0,0,0,0,0,62,108,204,204,254,204,204,204,206,0,0, 0,0,16,56,108,0,124,198,198,198,198,124,0,0,0,0,0,198,198,0,124,198,198,198,198,124,0,0,0,0,96,48,24,0,124,198,198,198,198, 124,0,0,0,0,48,120,204,0,204,204,204,204,204,118,0,0,0,0,96,48,24,0,204,204,204,204,204,118,0,0,0,0,0,198,198,0,198,198,198, 198,126,6,12,120,0,0,198,198,56,108,198,198,198,198,108,56,0,0,0,0,198,198,0,198,198,198,198,198,198,124,0,0,0,0,24,24,60, 102,96,96,102,60,24,24,0,0,0,0,56,108,100,96,240,96,96,96,230,252,0,0,0,0,0,102,102,60,24,126,24,126,24,24,0,0,0,0,248,204, 204,248,196,204,222,204,204,198,0,0,0,0,14,27,24,24,24,126,24,24,24,24,216,112,0,0,24,48,96,0,120,12,124,204,204,118,0,0, 0,0,12,24,48,0,56,24,24,24,24,60,0,0,0,0,24,48,96,0,124,198,198,198,198,124,0,0,0,0,24,48,96,0,204,204,204,204,204,118,0, 0,0,0,0,118,220,0,220,102,102,102,102,102,0,0,0,118,220,0,198,230,246,254,222,206,198,198,0,0,0,0,60,108,108,62,0,126,0,0, 0,0,0,0,0,0,56,108,108,56,0,124,0,0,0,0,0,0,0,0,0,48,48,0,48,48,96,198,198,124,0,0,0,0,0,0,0,0,0,254,192,192,192,0,0,0,0, 0,0,0,0,0,0,254,6,6,6,0,0,0,0,0,192,192,198,204,216,48,96,220,134,12,24,62,0,0,192,192,198,204,216,48,102,206,158,62,6,6, 0,0,0,24,24,0,24,24,60,60,60,24,0,0,0,0,0,0,0,54,108,216,108,54,0,0,0,0,0,0,0,0,0,216,108,54,108,216,0,0,0,0,0,17,68,17,68, 17,68,17,68,17,68,17,68,17,68,85,170,85,170,85,170,85,170,85,170,85,170,85,170,221,119,221,119,221,119,221,119,221,119,221, 119,221,119,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,248,24,24,24,24,24,24,24,24,24,24,24,248,24,248, 24,24,24,24,24,24,54,54,54,54,54,54,54,246,54,54,54,54,54,54,0,0,0,0,0,0,0,254,54,54,54,54,54,54,0,0,0,0,0,248,24,248,24, 24,24,24,24,24,54,54,54,54,54,246,6,246,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,0,0,0,0,0,254,6,246,54, 54,54,54,54,54,54,54,54,54,54,246,6,254,0,0,0,0,0,0,54,54,54,54,54,54,54,254,0,0,0,0,0,0,24,24,24,24,24,248,24,248,0,0,0, 0,0,0,0,0,0,0,0,0,0,248,24,24,24,24,24,24,24,24,24,24,24,24,24,31,0,0,0,0,0,0,24,24,24,24,24,24,24,255,0,0,0,0,0,0,0,0,0, 0,0,0,0,255,24,24,24,24,24,24,24,24,24,24,24,24,24,31,24,24,24,24,24,24,0,0,0,0,0,0,0,255,0,0,0,0,0,0,24,24,24,24,24,24,24, 255,24,24,24,24,24,24,24,24,24,24,24,31,24,31,24,24,24,24,24,24,54,54,54,54,54,54,54,55,54,54,54,54,54,54,54,54,54,54,54, 55,48,63,0,0,0,0,0,0,0,0,0,0,0,63,48,55,54,54,54,54,54,54,54,54,54,54,54,247,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,247,54,54, 54,54,54,54,54,54,54,54,54,55,48,55,54,54,54,54,54,54,0,0,0,0,0,255,0,255,0,0,0,0,0,0,54,54,54,54,54,247,0,247,54,54,54,54, 54,54,24,24,24,24,24,255,0,255,0,0,0,0,0,0,54,54,54,54,54,54,54,255,0,0,0,0,0,0,0,0,0,0,0,255,0,255,24,24,24,24,24,24,0,0, 0,0,0,0,0,255,54,54,54,54,54,54,54,54,54,54,54,54,54,63,0,0,0,0,0,0,24,24,24,24,24,31,24,31,0,0,0,0,0,0,0,0,0,0,0,31,24,31, 24,24,24,24,24,24,0,0,0,0,0,0,0,63,54,54,54,54,54,54,54,54,54,54,54,54,54,255,54,54,54,54,54,54,24,24,24,24,24,255,24,255, 24,24,24,24,24,24,24,24,24,24,24,24,24,248,0,0,0,0,0,0,0,0,0,0,0,0,0,31,24,24,24,24,24,24,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,0,0,0,0,0,0,0,255,255,255,255,255,255,255,240,240,240,240,240,240,240,240,240,240,240,240,240,240, 15,15,15,15,15,15,15,15,15,15,15,15,15,15,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,118,220,216,216,220,118,0,0, 0,0,0,0,0,124,198,252,198,198,252,192,192,64,0,0,0,254,198,198,192,192,192,192,192,192,0,0,0,0,0,0,0,254,108,108,108,108, 108,108,0,0,0,0,0,254,198,96,48,24,48,96,198,254,0,0,0,0,0,0,0,0,126,216,216,216,216,112,0,0,0,0,0,0,0,102,102,102,102,124, 96,96,192,0,0,0,0,0,0,118,220,24,24,24,24,24,0,0,0,0,0,126,24,60,102,102,102,60,24,126,0,0,0,0,0,56,108,198,198,254,198,198, 108,56,0,0,0,0,0,56,108,198,198,198,108,108,108,238,0,0,0,0,0,30,48,24,12,62,102,102,102,60,0,0,0,0,0,0,0,0,126,219,219,126, 0,0,0,0,0,0,0,3,6,126,219,219,243,126,96,192,0,0,0,0,0,28,48,96,96,124,96,96,48,28,0,0,0,0,0,0,124,198,198,198,198,198,198, 198,0,0,0,0,0,0,254,0,0,254,0,0,254,0,0,0,0,0,0,0,24,24,126,24,24,0,0,255,0,0,0,0,0,48,24,12,6,12,24,48,0,126,0,0,0,0,0,12, 24,48,96,48,24,12,0,126,0,0,0,0,0,14,27,27,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,216,216,112,0,0,0,0,0,0,24, 24,0,126,0,24,24,0,0,0,0,0,0,0,0,118,220,0,118,220,0,0,0,0,0,0,56,108,108,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,0,0,0,0, 0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,15,12,12,12,12,12,236,108,60,28,0,0,0,0,216,108,108,108,108,108,0,0,0,0,0,0,0,0,112,216, 48,96,200,248,0,0,0,0,0,0,0,0,0,0,0,124,124,124,124,124,124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,0,0,0,0,36,102,255,102, 36,0,0,0,0,0,34,0,99,99,99,34,0,0,0,0,0,0,0,0,0,43,0,0,0,24,24,24,255,24,24,24,0,0,0,0,45,0,0,0,0,0,0,255,0,0,0,0,0,0,0,77, 0,0,195,231,255,219,195,195,195,195,195,0,0,0,84,0,0,255,219,153,24,24,24,24,24,60,0,0,0,86,0,0,195,195,195,195,195,195,102, 60,24,0,0,0,87,0,0,195,195,195,195,219,219,255,102,102,0,0,0,88,0,0,195,195,102,60,24,60,102,195,195,0,0,0,89,0,0,195,195, 195,102,60,24,24,24,60,0,0,0,90,0,0,255,195,134,12,24,48,97,195,255,0,0,0,109,0,0,0,0,0,230,255,219,219,219,219,0,0,0,118, 0,0,0,0,0,195,195,195,102,60,24,0,0,0,119,0,0,0,0,0,195,195,219,219,255,102,0,0,0,145,0,0,0,0,110,59,27,126,216,220,119,0, 0,0,155,0,24,24,126,195,192,192,195,126,24,24,0,0,0,157,0,0,195,102,60,24,255,24,255,24,24,0,0,0,158,0,252,102,102,124,98, 102,111,102,102,243,0,0,0,241,0,0,24,24,24,255,24,24,24,0,255,0,0,0,246,0,0,24,24,0,0,255,0,0,24,24,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,126,129,165,129,129,189,153,129,129,126,0,0,0,0,0,0,126,255,219,255,255,195,231,255,255,126,0,0,0,0, 0,0,0,0,108,254,254,254,254,124,56,16,0,0,0,0,0,0,0,0,16,56,124,254,124,56,16,0,0,0,0,0,0,0,0,24,60,60,231,231,231,24,24, 60,0,0,0,0,0,0,0,24,60,126,255,255,126,24,24,60,0,0,0,0,0,0,0,0,0,0,24,60,60,24,0,0,0,0,0,0,255,255,255,255,255,255,231,195, 195,231,255,255,255,255,255,255,0,0,0,0,0,60,102,66,66,102,60,0,0,0,0,0,255,255,255,255,255,195,153,189,189,153,195,255,255, 255,255,255,0,0,30,14,26,50,120,204,204,204,204,120,0,0,0,0,0,0,60,102,102,102,102,60,24,126,24,24,0,0,0,0,0,0,63,51,63,48, 48,48,48,112,240,224,0,0,0,0,0,0,127,99,127,99,99,99,99,103,231,230,192,0,0,0,0,0,0,24,24,219,60,231,60,219,24,24,0,0,0,0, 0,128,192,224,240,248,254,248,240,224,192,128,0,0,0,0,0,2,6,14,30,62,254,62,30,14,6,2,0,0,0,0,0,0,24,60,126,24,24,24,126, 60,24,0,0,0,0,0,0,0,102,102,102,102,102,102,102,0,102,102,0,0,0,0,0,0,127,219,219,219,123,27,27,27,27,27,0,0,0,0,0,124,198, 96,56,108,198,198,108,56,12,198,124,0,0,0,0,0,0,0,0,0,0,0,254,254,254,254,0,0,0,0,0,0,24,60,126,24,24,24,126,60,24,126,0, 0,0,0,0,0,24,60,126,24,24,24,24,24,24,24,0,0,0,0,0,0,24,24,24,24,24,24,24,126,60,24,0,0,0,0,0,0,0,0,0,24,12,254,12,24,0,0, 0,0,0,0,0,0,0,0,0,48,96,254,96,48,0,0,0,0,0,0,0,0,0,0,0,0,192,192,192,254,0,0,0,0,0,0,0,0,0,0,0,40,108,254,108,40,0,0,0,0, 0,0,0,0,0,0,16,56,56,124,124,254,254,0,0,0,0,0,0,0,0,0,254,254,124,124,56,56,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,24,60,60,60,24,24,24,0,24,24,0,0,0,0,0,102,102,102,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,108,254,108,108,108,254,108,108, 0,0,0,0,24,24,124,198,194,192,124,6,6,134,198,124,24,24,0,0,0,0,0,0,194,198,12,24,48,96,198,134,0,0,0,0,0,0,56,108,108,56, 118,220,204,204,204,118,0,0,0,0,0,48,48,48,96,0,0,0,0,0,0,0,0,0,0,0,0,0,12,24,48,48,48,48,48,48,24,12,0,0,0,0,0,0,48,24,12, 12,12,12,12,12,24,48,0,0,0,0,0,0,0,0,0,102,60,255,60,102,0,0,0,0,0,0,0,0,0,0,0,24,24,126,24,24,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,24,24,24,48,0,0,0,0,0,0,0,0,0,0,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,0,0,2,6,12,24,48,96,192,128, 0,0,0,0,0,0,56,108,198,198,214,214,198,198,108,56,0,0,0,0,0,0,24,56,120,24,24,24,24,24,24,126,0,0,0,0,0,0,124,198,6,12,24, 48,96,192,198,254,0,0,0,0,0,0,124,198,6,6,60,6,6,6,198,124,0,0,0,0,0,0,12,28,60,108,204,254,12,12,12,30,0,0,0,0,0,0,254,192, 192,192,252,6,6,6,198,124,0,0,0,0,0,0,56,96,192,192,252,198,198,198,198,124,0,0,0,0,0,0,254,198,6,6,12,24,48,48,48,48,0,0, 0,0,0,0,124,198,198,198,124,198,198,198,198,124,0,0,0,0,0,0,124,198,198,198,126,6,6,6,12,120,0,0,0,0,0,0,0,0,24,24,0,0,0, 24,24,0,0,0,0,0,0,0,0,0,24,24,0,0,0,24,24,48,0,0,0,0,0,0,0,6,12,24,48,96,48,24,12,6,0,0,0,0,0,0,0,0,0,126,0,0,126,0,0,0,0, 0,0,0,0,0,0,96,48,24,12,6,12,24,48,96,0,0,0,0,0,0,124,198,198,12,24,24,24,0,24,24,0,0,0,0,0,0,0,124,198,198,222,222,222,220, 192,124,0,0,0,0,0,0,16,56,108,198,198,254,198,198,198,198,0,0,0,0,0,0,252,102,102,102,124,102,102,102,102,252,0,0,0,0,0,0, 60,102,194,192,192,192,192,194,102,60,0,0,0,0,0,0,248,108,102,102,102,102,102,102,108,248,0,0,0,0,0,0,254,102,98,104,120, 104,96,98,102,254,0,0,0,0,0,0,254,102,98,104,120,104,96,96,96,240,0,0,0,0,0,0,60,102,194,192,192,222,198,198,102,58,0,0,0, 0,0,0,198,198,198,198,254,198,198,198,198,198,0,0,0,0,0,0,60,24,24,24,24,24,24,24,24,60,0,0,0,0,0,0,30,12,12,12,12,12,204, 204,204,120,0,0,0,0,0,0,230,102,102,108,120,120,108,102,102,230,0,0,0,0,0,0,240,96,96,96,96,96,96,98,102,254,0,0,0,0,0,0, 198,238,254,254,214,198,198,198,198,198,0,0,0,0,0,0,198,230,246,254,222,206,198,198,198,198,0,0,0,0,0,0,124,198,198,198,198, 198,198,198,198,124,0,0,0,0,0,0,252,102,102,102,124,96,96,96,96,240,0,0,0,0,0,0,124,198,198,198,198,198,198,214,222,124,12, 14,0,0,0,0,252,102,102,102,124,108,102,102,102,230,0,0,0,0,0,0,124,198,198,96,56,12,6,198,198,124,0,0,0,0,0,0,126,126,90, 24,24,24,24,24,24,60,0,0,0,0,0,0,198,198,198,198,198,198,198,198,198,124,0,0,0,0,0,0,198,198,198,198,198,198,198,108,56,16, 0,0,0,0,0,0,198,198,198,198,214,214,214,254,238,108,0,0,0,0,0,0,198,198,108,124,56,56,124,108,198,198,0,0,0,0,0,0,102,102, 102,102,60,24,24,24,24,60,0,0,0,0,0,0,254,198,134,12,24,48,96,194,198,254,0,0,0,0,0,0,60,48,48,48,48,48,48,48,48,60,0,0,0, 0,0,0,0,128,192,224,112,56,28,14,6,2,0,0,0,0,0,0,60,12,12,12,12,12,12,12,12,60,0,0,0,0,16,56,108,198,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,48,48,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,12,124,204,204,204,118,0,0,0,0,0,0, 224,96,96,120,108,102,102,102,102,124,0,0,0,0,0,0,0,0,0,124,198,192,192,192,198,124,0,0,0,0,0,0,28,12,12,60,108,204,204,204, 204,118,0,0,0,0,0,0,0,0,0,124,198,254,192,192,198,124,0,0,0,0,0,0,56,108,100,96,240,96,96,96,96,240,0,0,0,0,0,0,0,0,0,118, 204,204,204,204,204,124,12,204,120,0,0,0,224,96,96,108,118,102,102,102,102,230,0,0,0,0,0,0,24,24,0,56,24,24,24,24,24,60,0, 0,0,0,0,0,6,6,0,14,6,6,6,6,6,6,102,102,60,0,0,0,224,96,96,102,108,120,120,108,102,230,0,0,0,0,0,0,56,24,24,24,24,24,24,24, 24,60,0,0,0,0,0,0,0,0,0,236,254,214,214,214,214,198,0,0,0,0,0,0,0,0,0,220,102,102,102,102,102,102,0,0,0,0,0,0,0,0,0,124,198, 198,198,198,198,124,0,0,0,0,0,0,0,0,0,220,102,102,102,102,102,124,96,96,240,0,0,0,0,0,0,118,204,204,204,204,204,124,12,12, 30,0,0,0,0,0,0,220,118,102,96,96,96,240,0,0,0,0,0,0,0,0,0,124,198,96,56,12,198,124,0,0,0,0,0,0,16,48,48,252,48,48,48,48,54, 28,0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,118,0,0,0,0,0,0,0,0,0,102,102,102,102,102,60,24,0,0,0,0,0,0,0,0,0,198,198,214, 214,214,254,108,0,0,0,0,0,0,0,0,0,198,108,56,56,56,108,198,0,0,0,0,0,0,0,0,0,198,198,198,198,198,198,126,6,12,248,0,0,0,0, 0,0,254,204,24,48,96,198,254,0,0,0,0,0,0,14,24,24,24,112,24,24,24,24,14,0,0,0,0,0,0,24,24,24,24,0,24,24,24,24,24,0,0,0,0, 0,0,112,24,24,24,14,24,24,24,24,112,0,0,0,0,0,0,118,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,56,108,198,198,198,254,0,0,0,0, 0,0,0,60,102,194,192,192,192,194,102,60,12,6,124,0,0,0,0,204,0,0,204,204,204,204,204,204,118,0,0,0,0,0,12,24,48,0,124,198, 254,192,192,198,124,0,0,0,0,0,16,56,108,0,120,12,124,204,204,204,118,0,0,0,0,0,0,204,0,0,120,12,124,204,204,204,118,0,0,0, 0,0,96,48,24,0,120,12,124,204,204,204,118,0,0,0,0,0,56,108,56,0,120,12,124,204,204,204,118,0,0,0,0,0,0,0,0,60,102,96,96,102, 60,12,6,60,0,0,0,0,16,56,108,0,124,198,254,192,192,198,124,0,0,0,0,0,0,198,0,0,124,198,254,192,192,198,124,0,0,0,0,0,96,48, 24,0,124,198,254,192,192,198,124,0,0,0,0,0,0,102,0,0,56,24,24,24,24,24,60,0,0,0,0,0,24,60,102,0,56,24,24,24,24,24,60,0,0, 0,0,0,96,48,24,0,56,24,24,24,24,24,60,0,0,0,0,0,198,0,16,56,108,198,198,254,198,198,198,0,0,0,0,56,108,56,0,56,108,198,198, 254,198,198,198,0,0,0,0,24,48,96,0,254,102,96,124,96,96,102,254,0,0,0,0,0,0,0,0,0,204,118,54,126,216,216,110,0,0,0,0,0,0, 62,108,204,204,254,204,204,204,204,206,0,0,0,0,0,16,56,108,0,124,198,198,198,198,198,124,0,0,0,0,0,0,198,0,0,124,198,198, 198,198,198,124,0,0,0,0,0,96,48,24,0,124,198,198,198,198,198,124,0,0,0,0,0,48,120,204,0,204,204,204,204,204,204,118,0,0,0, 0,0,96,48,24,0,204,204,204,204,204,204,118,0,0,0,0,0,0,198,0,0,198,198,198,198,198,198,126,6,12,120,0,0,198,0,124,198,198, 198,198,198,198,198,124,0,0,0,0,0,198,0,198,198,198,198,198,198,198,198,124,0,0,0,0,0,24,24,60,102,96,96,96,102,60,24,24, 0,0,0,0,0,56,108,100,96,240,96,96,96,96,230,252,0,0,0,0,0,0,102,102,60,24,126,24,126,24,24,24,0,0,0,0,0,248,204,204,248,196, 204,222,204,204,204,198,0,0,0,0,0,14,27,24,24,24,126,24,24,24,24,24,216,112,0,0,0,24,48,96,0,120,12,124,204,204,204,118,0, 0,0,0,0,12,24,48,0,56,24,24,24,24,24,60,0,0,0,0,0,24,48,96,0,124,198,198,198,198,198,124,0,0,0,0,0,24,48,96,0,204,204,204, 204,204,204,118,0,0,0,0,0,0,118,220,0,220,102,102,102,102,102,102,0,0,0,0,118,220,0,198,230,246,254,222,206,198,198,198,0, 0,0,0,0,60,108,108,62,0,126,0,0,0,0,0,0,0,0,0,0,56,108,108,56,0,124,0,0,0,0,0,0,0,0,0,0,0,48,48,0,48,48,96,192,198,198,124, 0,0,0,0,0,0,0,0,0,0,254,192,192,192,192,0,0,0,0,0,0,0,0,0,0,0,254,6,6,6,6,0,0,0,0,0,0,192,192,194,198,204,24,48,96,220,134, 12,24,62,0,0,0,192,192,194,198,204,24,48,102,206,158,62,6,6,0,0,0,0,24,24,0,24,24,24,60,60,60,24,0,0,0,0,0,0,0,0,0,54,108, 216,108,54,0,0,0,0,0,0,0,0,0,0,0,216,108,54,108,216,0,0,0,0,0,0,17,68,17,68,17,68,17,68,17,68,17,68,17,68,17,68,85,170,85, 170,85,170,85,170,85,170,85,170,85,170,85,170,221,119,221,119,221,119,221,119,221,119,221,119,221,119,221,119,24,24,24,24, 24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,248,24,24,24,24,24,24,24,24,24,24,24,24,24,248,24,248,24,24,24,24, 24,24,24,24,54,54,54,54,54,54,54,246,54,54,54,54,54,54,54,54,0,0,0,0,0,0,0,254,54,54,54,54,54,54,54,54,0,0,0,0,0,248,24,248, 24,24,24,24,24,24,24,24,54,54,54,54,54,246,6,246,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54, 0,0,0,0,0,254,6,246,54,54,54,54,54,54,54,54,54,54,54,54,54,246,6,254,0,0,0,0,0,0,0,0,54,54,54,54,54,54,54,254,0,0,0,0,0,0, 0,0,24,24,24,24,24,248,24,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,31,0,0,0,0,0, 0,0,0,24,24,24,24,24,24,24,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,31,24,24,24, 24,24,24,24,24,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,24,24,24,24,24,24,24,255,24,24,24,24,24,24,24,24,24,24,24,24,24,31,24,31, 24,24,24,24,24,24,24,24,54,54,54,54,54,54,54,55,54,54,54,54,54,54,54,54,54,54,54,54,54,55,48,63,0,0,0,0,0,0,0,0,0,0,0,0,0, 63,48,55,54,54,54,54,54,54,54,54,54,54,54,54,54,247,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,247,54,54,54,54,54,54,54,54,54, 54,54,54,54,55,48,55,54,54,54,54,54,54,54,54,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,54,54,54,54,54,247,0,247,54,54,54,54,54, 54,54,54,24,24,24,24,24,255,0,255,0,0,0,0,0,0,0,0,54,54,54,54,54,54,54,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,24,24,24,24, 24,24,24,24,0,0,0,0,0,0,0,255,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,63,0,0,0,0,0,0,0,0,24,24,24,24,24,31,24,31,0,0, 0,0,0,0,0,0,0,0,0,0,0,31,24,31,24,24,24,24,24,24,24,24,0,0,0,0,0,0,0,63,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,255, 54,54,54,54,54,54,54,54,24,24,24,24,24,255,24,255,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,248,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,31,24,24,24,24,24,24,24,24,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,255,255, 255,255,255,255,255,255,255,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,15,15,15,15,15,15,15,15,15,15, 15,15,15,15,15,15,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,118,220,216,216,216,220,118,0,0,0,0,0,0,120,204, 204,204,216,204,198,198,198,204,0,0,0,0,0,0,254,198,198,192,192,192,192,192,192,192,0,0,0,0,0,0,0,0,254,108,108,108,108,108, 108,108,0,0,0,0,0,0,0,254,198,96,48,24,48,96,198,254,0,0,0,0,0,0,0,0,0,126,216,216,216,216,216,112,0,0,0,0,0,0,0,0,102,102, 102,102,102,124,96,96,192,0,0,0,0,0,0,0,118,220,24,24,24,24,24,24,0,0,0,0,0,0,0,126,24,60,102,102,102,60,24,126,0,0,0,0,0, 0,0,56,108,198,198,254,198,198,108,56,0,0,0,0,0,0,56,108,198,198,198,108,108,108,108,238,0,0,0,0,0,0,30,48,24,12,62,102,102, 102,102,60,0,0,0,0,0,0,0,0,0,126,219,219,219,126,0,0,0,0,0,0,0,0,0,3,6,126,219,219,243,126,96,192,0,0,0,0,0,0,28,48,96,96, 124,96,96,96,48,28,0,0,0,0,0,0,0,124,198,198,198,198,198,198,198,198,0,0,0,0,0,0,0,0,254,0,0,254,0,0,254,0,0,0,0,0,0,0,0, 0,24,24,126,24,24,0,0,255,0,0,0,0,0,0,0,48,24,12,6,12,24,48,0,126,0,0,0,0,0,0,0,12,24,48,96,48,24,12,0,126,0,0,0,0,0,0,14, 27,27,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,216,216,216,112,0,0,0,0,0,0,0,0,24,24,0,126,0,24,24,0,0,0, 0,0,0,0,0,0,0,118,220,0,118,220,0,0,0,0,0,0,0,56,108,108,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,24,0,0,0,0,0,0,0,0,15,12,12,12,12,12,236,108,108,60,28,0,0,0,0,0,216,108,108,108,108,108,0,0,0,0,0,0,0,0,0,0,112, 216,48,96,200,248,0,0,0,0,0,0,0,0,0,0,0,0,0,124,124,124,124,124,124,124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,0,0, 0,0,0,36,102,255,102,36,0,0,0,0,0,0,48,0,0,60,102,195,195,219,219,195,195,102,60,0,0,0,0,77,0,0,195,231,255,255,219,195,195, 195,195,195,0,0,0,0,84,0,0,255,219,153,24,24,24,24,24,24,60,0,0,0,0,86,0,0,195,195,195,195,195,195,195,102,60,24,0,0,0,0, 87,0,0,195,195,195,195,195,219,219,255,102,102,0,0,0,0,88,0,0,195,195,102,60,24,24,60,102,195,195,0,0,0,0,89,0,0,195,195, 195,102,60,24,24,24,24,60,0,0,0,0,90,0,0,255,195,134,12,24,48,96,193,195,255,0,0,0,0,109,0,0,0,0,0,230,255,219,219,219,219, 219,0,0,0,0,118,0,0,0,0,0,195,195,195,195,102,60,24,0,0,0,0,119,0,0,0,0,0,195,195,195,219,219,255,102,0,0,0,0,120,0,0,0,0, 0,195,102,60,24,60,102,195,0,0,0,0,145,0,0,0,0,0,110,59,27,126,216,220,119,0,0,0,0,155,0,24,24,126,195,192,192,192,195,126, 24,24,0,0,0,0,157,0,0,195,102,60,24,255,24,255,24,24,24,0,0,0,0,158,0,252,102,102,124,98,102,111,102,102,102,243,0,0,0,0, 171,0,192,192,194,198,204,24,48,96,206,155,6,12,31,0,0,172,0,192,192,194,198,204,24,48,102,206,150,62,6,6,0,0,0,0,30]
;
; ROM BIOS for IBM VGA Adapter (aka IBM PS/2 Display Adapter)
; (C)COPYRIGHT IBM Corp. 1984, 1986 10/27/86
;
; Listing produced by NDISASM, 2015-May-19
; Additional post-processing performed by the PCjs TextOut module
; All post-processing, comments, etc copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
;
; This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
; at <http://jsmachines.net/> and <http://pcjs.org/>.
;
; PCjs is free software: you can redistribute it and/or modify it under the terms of the
; GNU General Public License as published by the Free Software Foundation, either version 3
; of the License, or (at your option) any later version.
;
; PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
; even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License along with PCjs. If not,
; see <http://www.gnu.org/licenses/gpl.html>.
;
db 0x55,0xAA
dw 0xEB30
db '674008222554 (C)COPYRIGHT IBM Corp. 1984, 1986 10/27/86'
push bp ; 0000003B 55
mov ds,[cs:0x71c] ; 0000003C 2E8E1E1C07
mov ax,0x1201 ; 00000041 B80112 '...'
mov bl,0x32 ; 00000044 B332 '.2'
int 0x10 ; 00000046 CD10 '..'
cli ; 00000048 FA '.'
mov word [0x40],0x6e1 ; 00000049 C7064000E106 '..@...'
mov [0x42],cs ; 0000004F 8C0E4200 '..B.'
mov word [0x1b4],0x6e4 ; 00000053 C706B401E406 '......'
mov [0x1b6],cs ; 00000059 8C0EB601 '....'
mov word [0x108],0xf065 ; 0000005D C706080165F0 '....e.'
mov word [0x10a],0xf000 ; 00000063 C7060A0100F0 '..',0x0A,'...'
mov word [0x4a8],0x5c6 ; 00000069 C706A804C605 '......'
mov [0x4aa],cs ; 0000006F 8C0EAA04 '....'
mov word [0x7c],0x3b8d ; 00000073 C7067C008D3B '..|..;'
mov [0x7e],cs ; 00000079 8C0E7E00 '..~.'
mov word [0x10c],font_8x8 ; 0000007D C7060C018D37 '.....7'
mov [0x10e],cs ; 00000083 8C0E0E01 '....'
sti ; 00000087 FB '.'
mov byte [0x489],0x11 ; 00000088 C606890411 '.....'
;
; Initialize the ROM BIOS Video Mode Options byte @40:0087 (default to color and 256Kb of RAM)
;
mov byte [0x487],0x60 ; 0000008D
;
; The x100 subroutine alternately enables port 0x3B? and 0x3D? decoding, verifying that there is
; no response on opposing ports 0x3D? and 0x3B?, respectively; otherwise, it assumes that another
; video card must exist and attempts to select co-existing settings for the VGA. For example, if
; there is an unexpected response on the color ports, the VGA ROM will default to mono operation.
;
call x100 ; 00000092
;
; From the "IBM Personal System/2 Model 50 and 60 Technical Reference: I/O Controllers, Video Subsystem", p.4-29:
;
; When in setup mode (I/O address hex 0094, bit 5 equals 0), the VGA responds to a single option select byte
; at I/O address hex 0102 and treats the LSB (bit 0) of that byte as the VGA sleep bit. When the LSB equals 0,
; the VGA does not respond to commands, addresses, or data, on the data bus. When the LSB equals 1, the VGA
; responds. If the VGA was set up and is generating video output when the LSB is set to 0, the output is still
; generated.
;
; The VGA responds only to address hex 0102 when in the setup mode. No other addresses are valid at that time.
; Conversely, the VGA ignores address hex 0102 when in the enabled mode (I/O address hex 0094, bit 5 equals 1),
; and decodes normal I/O and memory addresses.
;
cli ; 00000095 FA '.'
mov dx,0x46e8 ; 00000096 BAE846 '..F'
mov ax,0x16 ; 00000099 B81600 '...'
out dx,ax ; 0000009C EF '.'
mov dx,0x102 ; 0000009D BA0201 '...'
mov ax,0x1 ; 000000A0 B80100 '...'
out dx,ax ; 000000A3 EF '.'
mov dx,0x46e8 ; 000000A4 BAE846 '..F'
mov ax,0xe ; 000000A7 B80E00 '...'
out dx,ax ; 000000AA EF '.'
mov dx,0x4ae8 ; 000000AB BAE84A '..J'
xor ax,ax ; 000000AE 33C0 '3.'
out dx,ax ; 000000B0 EF '.'
sti ; 000000B1 FB '.'
push cs ; 000000B2 0E '.'
pop es ; 000000B3 07 '.'
;
; Default to mono settings
;
mov di,0x3b4 ; 000000B4 BFB403 '...'
mov bx,0x1602 ; 000000B7 BB0216 '...'
;
; Test bit 1 of ROM BIOS Video Mode Options byte @40:0087 (set if mono, clear if color)
;
test byte [0x487],0x2 ; 000000BA F606870402 '.....'
jnz xc7 ; 000000BF 7506 'u.'
;
; Choose color settings
;
mov di,0x3d4 ; 000000C1 BFD403 '...'
mov bx,0x1642 ; 000000C4 BB4216 '.B.'
;
; Set the CRTC base port address (0x3B4 for mono, 0x3D4 for color)
;
xc7: mov [0x463],di ; 000000C7 893E6304 '.>c.'
;
; Program the card for a default mode
;
call x1127 ; 000000CB E85910 '.Y.'
xor al,al ; 000000CE 32C0 '2.'
out dx,al ; 000000D0 EE '.'
call x547 ; 000000D1 E87304 '.s.'
xor bp,bp ; 000000D4 33ED '3.'
call x1e5 ; 000000D6 E80C01 '...'
call x2d6 ; 000000D9 E8FA01 '...'
call x364 ; 000000DC E88502 '...'
test byte [0x489],0x1 ; 000000DF F606890401 '.....'
jnz xe9 ; 000000E4 7503 'u.'
call x4c0 ; 000000E6 E8D703 '...'
xe9: call x568 ; 000000E9 E87C04 '.|.'
and al,0xf0 ; 000000EC 24F0 '$.'
mov [0x488],al ; 000000EE A28804 '...'
call x14b ; 000000F1 E85700 '.W.'
call x337 ; 000000F4 E84002 '.@.'
cmp bp,byte +0x2 ; 000000F7 83FD02 '...'
jc xfe ; 000000FA 7202 'r.'
pop bx ; 000000FC 5B '['
retf ; 000000FD CB '.'
xfe: pop bp ; 000000FE 5D ']'
retf ; 000000FF CB '.'
x100: mov bh,0x0 ; 00000100 B700 '..'
mov dx,0x3cc ; 00000102 BACC03 '...'
in al,dx ; 00000105 EC '.'
and al,0xfe ; 00000106 24FE '$.'
mov dx,0x3c2 ; 00000108 BAC203 '...'
out dx,al ; 0000010B EE '.'
mov dl,0xd4 ; 0000010C B2D4 '..'
call x2b6 ; 0000010E E8A501 '...'
jnz x11e ; 00000111 750B 'u.'
mov al,0x3 ; 00000113 B003 '..'
mov bh,0x20 ; 00000115 B720 '. '
or byte [0x487],0x2 ; 00000117 800E870402 '.....'
jmp short x138 ; 0000011C EB1A '..'
x11e: mov dx,0x3cc ; 0000011E BACC03 '...'
in al,dx ; 00000121 EC '.'
or al,0x1 ; 00000122 0C01 '..'
mov dx,0x3c2 ; 00000124 BAC203 '...'
out dx,al ; 00000127 EE '.'
mov dl,0xb4 ; 00000128 B2B4 '..'
call x2b6 ; 0000012A E88901 '...'
jnz x14a ; 0000012D 751B 'u.'
mov al,0x7 ; 0000012F B007 '..'
mov bh,0x30 ; 00000131 B730 '.0'
and byte [0x487],0xfd ; 00000133 80268704FD '.&...'
x138: and byte [0x489],0xfe ; 00000138 80268904FE '.&...'
and byte [0x410],0xcf ; 0000013D 80261004CF '.&...'
or [0x410],bh ; 00000142 083E1004 '.>..'
mov ah,0x0 ; 00000146 B400 '..'
int 0x42 ; 00000148 CD42 '.B'
x14a: ret ; 0000014A C3 '.'
x14b: test byte [0x489],0x1 ; 0000014B F606890401 '.....'
jz x16a ; 00000150 7418 't.'
or byte [0x487],0x2 ; 00000152 800E870402 '.....'
test byte [0x487],0x8 ; 00000157 F606870408 '.....'
jnz x16a ; 0000015C 750C 'u.'
test byte [0x489],0x4 ; 0000015E F606890404 '.....'
jnz x16a ; 00000163 7505 'u.'
and byte [0x487],0xfd ; 00000165 80268704FD '.&...'
x16a: test byte [0x487],0x2 ; 0000016A F606870402 '.....'
jnz x178 ; 0000016F 7507 'u.'
mov bx,0x2009 ; 00000171 BB0920 '.. '
mov al,0x3 ; 00000174 B003 '..'
jmp short x17d ; 00000176 EB05 '..'
x178: mov bx,0x300b ; 00000178 BB0B30 '..0'
mov al,0x7 ; 0000017B B007 '..'
x17d: and byte [0x410],0xcf ; 0000017D 80261004CF '.&...'
or [0x410],bh ; 00000182 083E1004 '.>..'
and byte [0x488],0xf0 ; 00000186 80268804F0 '.&...'
or [0x488],bl ; 0000018B 081E8804 '....'
mov bl,[0x487] ; 0000018F 8A1E8704 '....'
and byte [0x487],0xf7 ; 00000193 80268704F7 '.&...'
mov bh,[0x489] ; 00000198 8A3E8904 '.>..'
and byte [0x489],0xfe ; 0000019C 80268904FE '.&...'
mov ah,0x0 ; 000001A1 B400 '..'
int 0x10 ; 000001A3 CD10 '..'
and bh,0x1 ; 000001A5 80E701 '...'
or [0x489],bh ; 000001A8 083E8904 '.>..'
test bl,0x8 ; 000001AC F6C308 '...'
jz x1e4 ; 000001AF 7433 't3'
test byte [0x489],0x1 ; 000001B1 F606890401 '.....'
jnz x1e4 ; 000001B6 752C 'u,'
mov al,0x7 ; 000001B8 B007 '..'
mov bx,0x3003 ; 000001BA BB0330 '..0'
test byte [0x487],0x2 ; 000001BD F606870402 '.....'
jz x1c9 ; 000001C2 7405 't.'
mov al,0x3 ; 000001C4 B003 '..'
mov bx,0x2005 ; 000001C6 BB0520 '.. '
x1c9: and byte [0x410],0xcf ; 000001C9 80261004CF '.&...'
or [0x410],bh ; 000001CE 083E1004 '.>..'
and byte [0x488],0xf0 ; 000001D2 80268804F0 '.&...'
or [0x488],bl ; 000001D7 081E8804 '....'
or byte [0x487],0x8 ; 000001DB 800E870408 '.....'
mov ah,0x0 ; 000001E0 B400 '..'
int 0x10 ; 000001E2 CD10 '..'
x1e4: ret ; 000001E4 C3 '.'
x1e5: mov dx,[0x463] ; 000001E5 8B166304 '..c.'
add dl,0x6 ; 000001E9 80C206 '...'
mov bx,0x1 ; 000001EC BB0100 '...'
mov al,0x30 ; 000001EF B030 '.0'
out 0x43,al ; 000001F1 E643 '.C'
mov al,0x0 ; 000001F3 B000 '..'
out 0x40,al ; 000001F5 E640 '.@'
mov ah,0x2 ; 000001F7 B402 '..'
;
; Verify that VERT_RETRACE (bit 3) is clear occassionally...
;
x1f9: xor cx,cx ; 000001F9 33C9 '3.'
x1fb: in al,dx ; 000001FB EC '.'
test al,0x8 ; 000001FC A808 '..'
jz x205 ; 000001FE 7405 't.'
loop x1fb ; 00000200 E2F9 '..'
jmp x2aa ; 00000202 Error: VERT_RETRACE remained set
;
; Verify that VERT_RETRACE (bit 3) is also set occassionally...
;
x205: cli ; 00000205 FA '.'
x206: in al,dx ; 00000206 EC '.'
test al,0x8 ; 00000207 A808 '..'
jnz x210 ; 00000209 7505 'u.'
loop x206 ; 0000020B E2F9 '..'
jmp x2aa ; 0000020D E99A00 '...'
;
; And perform the two previous verifications a couple of times, just to be sure...
;
x210: dec ah ; 00000210 FECC '..'
jnz x1f9 ; 00000212 75E5 'u.'
mov al,0x0 ; 00000214 B000 '..'
out 0x40,al ; 00000216 E640 '.@'
xor cx,cx ; 00000218 33C9 '3.'
x21a: in al,dx ; 0000021A EC '.'
test al,0x9 ; 0000021B A809 '..'
loopne x21a ; 0000021D E0FB '..'
jcxz x239 ; 0000021F E318 '..'
x221: mov cx,0xffff ; 00000221 B9FFFF '...'
x224: in al,dx ; 00000224 EC '.'
test al,0x1 ; 00000225 A801 '..'
loope x224 ; 00000227 E1FB '..'
jcxz x239 ; 00000229 E30E '..'
x22b: in al,dx ; 0000022B EC '.'
test al,0x8 ; 0000022C A808 '..'
jnz x23b ; 0000022E 750B 'u.'
test al,0x1 ; 00000230 A801 '..'
loopne x22b ; 00000232 E0F7 '..'
jcxz x239 ; 00000234 E303 '..'
inc bx ; 00000236 43 'C'
jnz x221 ; 00000237 75E8 'u.'
x239: jmp short x2aa ; 00000239 EB6F '.o'
x23b: mov al,0x0 ; 0000023B B000 '..'
out 0x43,al ; 0000023D E643 '.C'
in al,0x40 ; 0000023F E440 '.@'
mov ah,al ; 00000241 8AE0 '..'
jmp short x245 ; 00000243 EB00 '..'
x245: in al,0x40 ; 00000245 E440 '.@'
xchg ah,al ; 00000247 86E0 '..'
sti ; 00000249 FB '.'
cmp bx,0x19a ; 0000024A 81FB9A01 '....'
ja x2aa ; 0000024E 775A 'wZ'
cmp bx,0x186 ; 00000250 81FB8601 '....'
jc x2aa ; 00000254 7254 'rT'
cmp ax,0x6e8c ; 00000256 3D8C6E '=.n'
jc x2aa ; 00000259 724F 'rO'
cmp ax,0x871d ; 0000025B 3D1D87 '=..'
ja x2aa ; 0000025E 774A 'wJ'
cld ; 00000260 FC '.'
mov ax,0xa000 ; 00000261 B800A0 '...'
mov es,ax ; 00000264 8EC0 '..'
xor di,di ; 00000266 33FF '3.'
mov cx,0x28 ; 00000268 B92800 '.(.'
mov ax,0xffff ; 0000026B B8FFFF '...'
rep stosw ; 0000026E F3AB '..'
mov bh,0xf ; 00000270 B70F '..'
mov bl,0xc0 ; 00000272 B3C0 '..'
x274: in al,dx ; 00000274 EC '.'
xchg bl,dl ; 00000275 86DA '..'
mov al,0x32 ; 00000277 B032 '.2'
out dx,al ; 00000279 EE '.'
mov al,bh ; 0000027A 8AC7 '..'
out dx,al ; 0000027C EE '.'
xchg dl,bl ; 0000027D 86D3 '..'
xor cx,cx ; 0000027F 33C9 '3.'
x281: in al,dx ; 00000281 EC '.'
test al,0x30 ; 00000282 A830 '.0'
jnz x28a ; 00000284 7504 'u.'
loop x281 ; 00000286 E2F9 '..'
jmp short x2aa ; 00000288 EB20 '. '
x28a: xor cx,cx ; 0000028A 33C9 '3.'
x28c: in al,dx ; 0000028C EC '.'
test al,0x30 ; 0000028D A830 '.0'
jz x295 ; 0000028F 7404 't.'
loop x28c ; 00000291 E2F9 '..'
jmp short x2aa ; 00000293 EB15 '..'
x295: add bh,0x10 ; 00000295 80C710 '...'
cmp bh,0x3f ; 00000298 80FF3F '..?'
jnz x274 ; 0000029B 75D7 'u.'
x29d: mov al,0x36 ; 0000029D B036 '.6'
out 0x43,al ; 0000029F E643 '.C'
sub al,al ; 000002A1 2AC0 '*.'
out 0x40,al ; 000002A3 E640 '.@'
jmp short x2a7 ; 000002A5 EB00 '..'
x2a7: out 0x40,al ; 000002A7 E640 '.@'
ret ; 000002A9 C3 '.'
x2aa: sti ; 000002AA FB '.'
mov dx,0x103 ; 000002AB BA0301 '...'
call beeps ; 000002AE E8DF02 '...'
mov bp,0x2 ; 000002B1 BD0200 '...'
jmp short x29d ; 000002B4 EBE7 '..'
x2b6: mov al,0xf ; 000002B6 B00F '..'
out dx,al ; 000002B8 EE '.'
mov bl,0xff ; 000002B9 B3FF '..'
inc dx ; 000002BB 42 'B'
in al,dx ; 000002BC EC '.'
push ax ; 000002BD 50 'P'
mov al,0x1a ; 000002BE B01A '..'
out dx,al ; 000002C0 EE '.'
jmp short x2c3 ; 000002C1 EB00 '..'
x2c3: in al,dx ; 000002C3 EC '.'
cmp al,0x1a ; 000002C4 3C1A '<.'
jnz x2d0 ; 000002C6 7508 'u.'
mov al,0x25 ; 000002C8 B025 '.%'
out dx,al ; 000002CA EE '.'
jmp short x2cd ; 000002CB EB00 '..'
x2cd: in al,dx ; 000002CD EC '.'
mov bl,al ; 000002CE 8AD8 '..'
x2d0: pop ax ; 000002D0 58 'X'
out dx,al ; 000002D1 EE '.'
cmp bl,0x25 ; 000002D2 80FB25 '..%'
ret ; 000002D5 C3 '.'
x2d6: mov ax,0xa000 ; 000002D6 B800A0 '...'
mov es,ax ; 000002D9 8EC0 '..'
mov bx,0x8000 ; 000002DB BB0080 '...'
mov si,0x0 ; 000002DE BE0000 '...'
call x2f0 ; 000002E1 E80C00 '...'
jz x2ef ; 000002E4 7409 't.'
mov dx,0x103 ; 000002E6 BA0301 '...'
call beeps ; 000002E9 E8A402 '...'
mov bp,0x2 ; 000002EC BD0200 '...'
x2ef: ret ; 000002EF C3 '.'
x2f0: cld ; 000002F0 FC '.'
mov ax,0xaaaa ; 000002F1 B8AAAA '...'
mov cx,bx ; 000002F4 8BCB '..'
xor di,di ; 000002F6 33FF '3.'
rep stosw ; 000002F8 F3AB '..'
mov cx,bx ; 000002FA 8BCB '..'
xor di,di ; 000002FC 33FF '3.'
repe scasw ; 000002FE F3AF '..'
jnz x311 ; 00000300 750F 'u.'
mov ax,0x5555 ; 00000302 B85555 '.UU'
mov cx,bx ; 00000305 8BCB '..'
xor di,di ; 00000307 33FF '3.'
rep stosw ; 00000309 F3AB '..'
mov cx,bx ; 0000030B 8BCB '..'
xor di,di ; 0000030D 33FF '3.'
repe scasw ; 0000030F F3AF '..'
x311: pushf ; 00000311 9C '.'
mov ax,si ; 00000312 8BC6 '..'
mov cx,bx ; 00000314 8BCB '..'
xor di,di ; 00000316 33FF '3.'
rep stosw ; 00000318 F3AB '..'
popf ; 0000031A 9D '.'
ret ; 0000031B C3 '.'
x31c: mov ax,0xc600 ; 0000031C B800C6 '...'
mov es,ax ; 0000031F 8EC0 '..'
mov si,0x3d4 ; 00000321 BED403 '...'
mov ah,[es:si] ; 00000324 268A24 '&.$'
mov byte [es:si],0x28 ; 00000327 26C60428 '&..('
mov dx,0x3d4 ; 0000032B BAD403 '...'
push ds ; 0000032E 1E '.'
pop ds ; 0000032F 1F '.'
in al,dx ; 00000330 EC '.'
mov [es:si],ah ; 00000331 268824 '&.$'
cmp al,0x28 ; 00000334 3C28 '<('
ret ; 00000336 C3 '.'
x337: mov bh,0x7 ; 00000337 B707 '..'
test byte [0x487],0x2 ; 00000339 F606870402 '.....'
jnz x342 ; 0000033E 7502 'u.'
mov bh,0x8 ; 00000340 B708 '..'
x342: mov bl,0x0 ; 00000342 B300 '..'
test byte [0x489],0x1 ; 00000344 F606890401 '.....'
jnz x35d ; 00000349 7512 'u.'
mov bl,0x1 ; 0000034B B301 '..'
test byte [0x487],0x2 ; 0000034D F606870402 '.....'
jz x35d ; 00000352 7409 't.'
mov bl,0x2 ; 00000354 B302 '..'
call x31c ; 00000356 E8C3FF '...'
jnz x35d ; 00000359 7502 'u.'
mov bl,0x6 ; 0000035B B306 '..'
x35d: call xa5c ; 0000035D E8FC06 '...'
mov [0x48a],al ; 00000360 A28A04 '...'
ret ; 00000363 C3 '.'
x364: mov ah,0x1a ; 00000364 B41A '..'
call x3e6 ; 00000366 E87D00 '.}.'
call x3fa ; 00000369 E88E00 '...'
jnz x378 ; 0000036C 750A 'u',0x0A
mov ah,0x25 ; 0000036E B425 '.%'
call x3e6 ; 00000370 E87300 '.s.'
call x3fa ; 00000373 E88400 '...'
jz x381 ; 00000376 7409 't.'
x378: mov dx,0x103 ; 00000378 BA0301 '...'
call beeps ; 0000037B E81202 '...'
mov bp,0x2 ; 0000037E BD0200 '...'
x381: mov dx,0x3c6 ; 00000381 BAC603 '...'
mov al,0x0 ; 00000384 B000 '..'
out dx,al ; 00000386 EE '.'
mov ah,0x0 ; 00000387 B400 '..'
call x3e6 ; 00000389 E85A00 '.Z.'
mov ah,0x0 ; 0000038C B400 '..'
call x127a ; 0000038E E8E90E '...'
mov si,x454 ; 00000391 BE5404 '.T.'
mov cx,0x1 ; 00000394 B90100 '...'
call x40c ; 00000397 E87200 '.r.'
jz x3bc ; 0000039A 7420 't '
mov si,x450 ; 0000039C BE5004 '.P.'
mov cx,0x1 ; 0000039F B90100 '...'
call x40c ; 000003A2 E86700 '.g.'
jz x3cc ; 000003A5 7425 't%'
;
; Set the "video subsystem inactive" (bit 3) in 0x40:0x87, and the
; "grayscale" (bit 1) and "monochrome monitor" (bit 2) in 0x40:0x89.
;
or byte [0x487],0x8 ; 000003A7 800E870408 '.....'
or byte [0x489],0x6 ; 000003AC 800E890406 '.....'
mov si,0x458 ; 000003B1 BE5804 '.X.'
mov cx,0x5 ; 000003B4 B90500 '...'
call x40c ; 000003B7 E85200 '.R.'
jmp short x3da ; 000003BA EB1E '..'
;
; Clear the "monochrome monitor" (bit 2) in 0x40:0x89.
;
x3bc: and byte [0x489],0xfb ; 000003BC 80268904FB '.&...'
mov si,x428 ; 000003C1 BE2804 '.(.'
mov cx,0x5 ; 000003C4 B90500 '...'
call x40c ; 000003C7 E84200 '.B.'
jmp short x3da ; 000003CA EB0E '..'
;
; Set the "grayscale" (bit 1) and "monochrome monitor" (bit 2) in 0x40:0x89.
;
x3cc: or byte [0x489],0x6 ; 000003CC 800E890406 '.....'
mov si,x43c ; 000003D1 BE3C04 '.<.'
mov cx,0x5 ; 000003D4 B90500 '...'
call x40c ; 000003D7 E83200 '.2.'
x3da: jz x3e5 ; 000003DA 7409 't.'
mov dx,0x103 ; 000003DC BA0301 '...'
call beeps ; 000003DF E8AE01 '...'
add bp,byte +0x1 ; 000003E2 83C501 '...'
x3e5: ret ; 000003E5 C3 '.'
x3e6: mov dx,0x3c8 ; 000003E6 BAC803 '...'
mov al,0x0 ; 000003E9 B000 '..'
out dx,al ; 000003EB EE '.'
mov cx,0x300 ; 000003EC B90003 '...'
mov dx,0x3c9 ; 000003EF BAC903 '...'
mov al,ah ; 000003F2 8AC4 '..'
x3f4: out dx,al ; 000003F4 EE '.'
jmp short x3f7 ; 000003F5 EB00 '..'
x3f7: loop x3f4 ; 000003F7 E2FB '..'
ret ; 000003F9 C3 '.'
x3fa: mov dx,0x3c7 ; 000003FA BAC703 '...'
out dx,al ; 000003FD EE '.'
mov cx,0x300 ; 000003FE B90003 '...'
mov dx,0x3c9 ; 00000401 BAC903 '...'
x404: in al,dx ; 00000404 EC '.'
cmp al,ah ; 00000405 3AC4 ':.'
jnz x40b ; 00000407 7502 'u.'
loop x404 ; 00000409 E2F9 '..'
x40b: ret ; 0000040B C3 '.'
x40c: mov al,[cs:si] ; 0000040C 2E8A04 '...'
mov ah,[cs:si+0x1] ; 0000040F 2E8A6401 '..d.'
mov bl,[cs:si+0x2] ; 00000413 2E8A5C02 '..\.'
push cx ; 00000417 51 'Q'
call x46c ; 00000418 E85100
pop cx ; 0000041B 59 'Y'
add si,byte +0x4 ; 0000041C 83C604 '...'
cmp al,[cs:si-0x1] ; 0000041F 2E3A44FF '.:D.'
jnz x427 ; 00000423 7502 'u.'
loop x40c ; 00000425 E2E5 '..'
x427: ret ; 00000427 C3 '.'
x428: db 0x14,0x14,0x14,0x10
db 0x2D,0x14,0x14,0x00
db 0x14,0x2D,0x14,0x00
db 0x14,0x14,0x2D,0x00
db 0x2D,0x2D,0x2D,0x00
x43c: db 0x04,0x12,0x04,0x10
db 0x1E,0x12,0x04,0x00
db 0x04,0x2D,0x04,0x00
db 0x04,0x16,0x15,0x00
db 0x00,0x00,0x00,0x10
x450: db 0x04,0x12,0x04,0x10
x454: db 0x12,0x12,0x12,0x10
db 0x04,0x04,0x04,0x10
db 0x10,0x04,0x04,0x00
db 0x04,0x10,0x04,0x00
db 0x04,0x04,0x10,0x00
db 0x10,0x10,0x10,0x00
x46c: push ax ; 0000046C 50
mov dx,[0x0463] ; 0000046D 8B166304
add dl,0x6 ; 00000471 80C206 '...'
mov bh,dl ; 00000474 8AFA '..'
xor cx,cx ; 00000476 33C9 '3.'
cli ; 00000478 FA '.'
x479: in al,dx ; 00000479 EC '.'
test al,0x8 ; 0000047A A808 '..'
loopne x479 ; 0000047C E0FB '..'
xor cx,cx ; 0000047E 33C9 '3.'
x480: in al,dx ; 00000480 EC '.'
test al,0x8 ; 00000481 A808 '..'
loope x480 ; 00000483 E1FB '..'
mov al,0x0 ; 00000485 B000 '..'
mov dx,0x3c8 ; 00000487 BAC803 '...'
out dx,al ; 0000048A EE '.'
pop ax ; 0000048B 58 'X'
mov dx,0x3c9 ; 0000048C BAC903 '...'
out dx,al ; 0000048F EE '.'
jmp $+2 ; 00000490 EB00 '..'
mov al,ah ; 00000492 8AC4 '..'
out dx,al ; 00000494 EE '.'
jmp $+2 ; 00000495 EB00 '..'
mov al,bl ; 00000497 8AC3 '..'
out dx,al ; 00000499 EE '.'
mov dl,bh ; 0000049A 8AD7 '..'
xor cx,cx ; 0000049C 33C9 '3.'
x49e: in al,dx ; 0000049E EC '.'
test al,0x1 ; 0000049F A801 '..'
loopne x49e ; 000004A1 E0FB '..'
mov dl,0xc2 ; 000004A3 B2C2 '..'
jmp $+2 ; 000004A5 EB00 '..'
in al,dx ; 000004A7 EC '.'
and al,0x10 ; 000004A8 2410 '$.'
push ax ; 000004AA 50 'P'
mov al,0x0 ; 000004AB B000 '..'
mov dx,0x3c8 ; 000004AD BAC803 '...'
out dx,al ; 000004B0 EE '.'
jmp $+2 ; 000004B1 EB00 '..'
mov dx,0x3c9 ; 000004B3 BAC903 '...'
out dx,al ; 000004B6 EE '.'
jmp $+2 ; 000004B7 EB00 '..'
out dx,al ; 000004B9 EE '.'
jmp $+2 ; 000004BA EB00 '..'
out dx,al ; 000004BC EE '.'
sti ; 000004BD FB '.'
pop ax ; 000004BE 58 'X'
ret ; 000004BF C3 '.'
x4c0: mov di,0xb800 ; 000004C0 BF00B8 '...'
mov dx,0x3d8 ; 000004C3 BAD803 '...'
mov bx,0x2000 ; 000004C6 BB0020 '.. '
test byte [0x487],0x2 ; 000004C9 F606870402 '.....'
jnz x4d9 ; 000004CE 7509 'u.'
mov di,0xb000 ; 000004D0 BF00B0 '...'
mov dx,0x3b8 ; 000004D3 BAB803 '...'
mov bx,0x800 ; 000004D6 BB0008 '...'
x4d9: mov es,di ; 000004D9 8EC7 '..'
mov al,[0x465] ; 000004DB A06504 '.e.'
and al,0xf7 ; 000004DE 24F7 '$.'
out dx,al ; 000004E0 EE '.'
mov si,0x720 ; 000004E1 BE2007 '. .'
call x2f0 ; 000004E4 E809FE '...'
jz x4f2 ; 000004E7 7409
mov dx,0x102 ; 000004E9 BA0201 '...'
call beeps ; 000004EC E8A100 '...'
mov bp,0x2 ; 000004EF BD0200 '...'
x4f2: mov ax,0x7020 ; 000004F2 B82070 '. p'
xor di,di ; 000004F5 33FF '3.'
mov cx,0x28 ; 000004F7 B92800 '.(.'
rep stosw ; 000004FA F3AB '..'
add dl,0x2 ; 000004FC 80C202 '...'
mov ah,0x8 ; 000004FF B408 '..'
cmp dl,0xda ; 00000501 80FADA '...'
jz x508 ; 00000504 7402 't.'
mov ah,0x1 ; 00000506 B401 '..'
x508: xor cx,cx ; 00000508 33C9 '3.'
x50a: in al,dx ; 0000050A EC '.'
and al,ah ; 0000050B 22C4 '".'
jnz x513 ; 0000050D 7504 'u.'
loop x50a ; 0000050F E2F9 '..'
jmp short x51c ; 00000511 EB09 '..'
x513: sub cx,cx ; 00000513 2BC9 '+.'
x515: in al,dx ; 00000515 EC '.'
and al,ah ; 00000516 22C4 '".'
jz x525 ; 00000518 740B 't.'
loop x515 ; 0000051A E2F9 '..'
x51c: mov dx,0x102 ; 0000051C BA0201 '...'
call beeps ; 0000051F E86E00 '.n.'
mov bp,0x2 ; 00000522 BD0200 '...'
x525: mov cl,0x3 ; 00000525 B103 '..'
shr ah,cl ; 00000527 D2EC '..'
jnz x508 ; 00000529 75DD 'u.'
mov dx,0x3d8 ; 0000052B BAD803 '...'
mov cx,0x28 ; 0000052E B92800 '.(.'
test byte [0x487],0x2 ; 00000531 F606870402 '.....'
jnz x53b ; 00000536 7503
mov dx,0x3b8 ; 00000538 BAB803 '...'
x53b: mov ax,0x720 ; 0000053B B82007 '. .'
xor di,di ; 0000053E 33FF '3.'
rep stosw ; 00000540 F3AB '..'
mov al,[0x465] ; 00000542 A06504 '.e.'
out dx,al ; 00000545 EE '.'
ret ; 00000546 C3 '.'
x547: in al,dx ; 00000547 EC '.'
mov cx,0x14 ; 00000548 B91400 '...'
mov dl,0xc0 ; 0000054B B2C0 '..'
mov ah,0x0 ; 0000054D B400 '..'
mov bx,0x1665 ; 0000054F BB6516 '.e.'
x552: mov al,ah ; 00000552 8AC4 '..'
out dx,al ; 00000554 EE '.'
inc ah ; 00000555 FEC4 '..'
mov al,[cs:bx] ; 00000557 2E8A07 '...'
out dx,al ; 0000055A EE '.'
inc bx ; 0000055B 43 'C'
loop x552 ; 0000055C E2F4 '..'
mov al,0x14 ; 0000055E B014 '..'
out dx,al ; 00000560 EE '.'
xor al,al ; 00000561 32C0 '2.'
out dx,al ; 00000563 EE '.'
mov al,0x20 ; 00000564 B020 '. '
out dx,al ; 00000566 EE '.'
ret ; 00000567 C3 '.'
x568: mov dx,[0x463] ; 00000568 8B166304 '..c.'
add dl,0x6 ; 0000056C 80C206 '...'
mov bl,0xc2 ; 0000056F B3C2 '..'
mov al,0x1 ; 00000571 B001 '..'
out dx,al ; 00000573 EE '.'
jmp short x576 ; 00000574 EB00 '..'
x576: xchg bl,dl ; 00000576 86DA '..'
in al,dx ; 00000578 EC '.'
and al,0x60 ; 00000579 2460 '$`'
shr al,1 ; 0000057B D0E8 '..'
mov ah,al ; 0000057D 8AE0 '..'
xchg dl,bl ; 0000057F 86D3 '..'
mov al,0x2 ; 00000581 B002 '..'
out dx,al ; 00000583 EE '.'
jmp short x586 ; 00000584 EB00 '..'
x586: xchg bl,dl ; 00000586 86DA '..'
in al,dx ; 00000588 EC '.'
and al,0x60 ; 00000589 2460 '$`'
shl al,1 ; 0000058B D0E0 '..'
or al,ah ; 0000058D 0AC4 0x0A,'.'
ret ; 0000058F C3 '.'
;
; (DH) = number of (long?) beeps
; (DL) = number of (short?) beeps
;
beeps: pushf ; 00000590 9C '.'
cli ; 00000591 FA '.'
or bp,bp ; 00000592 0BED '..'
jz x598 ; 00000594 7402 't.'
xor dx,dx ; 00000596 33D2 '3.'
x598: or dh,dh ; 00000598 0AF6 0x0A,'.'
jz x5b0 ; 0000059A 7414 't.'
x59c: mov bl,0x5 ; 0000059C B305 '..'
mov cx,0x533 ; 0000059E B93305 '.3.'
call beep ; 000005A1 E8E200 '...'
xor cx,cx ; 000005A4 33C9 '3.'
x5a6: loop x5a6 ; 000005A6 E2FE '..'
dec dh ; 000005A8 FECE '..'
jnz x59c ; 000005AA 75F0 'u.'
xor cx,cx ; 000005AC 33C9 '3.'
x5ae: loop x5ae ; 000005AE E2FE '..'
x5b0: or dl,dl ; 000005B0 0AD2 0x0A,'.'
jz x5c4 ; 000005B2 7410 't.'
x5b4: mov bl,0x1 ; 000005B4 B301 '..'
mov cx,0x533 ; 000005B6 B93305 '.3.'
call beep ; 000005B9 E8CA00 '...'
xor cx,cx ; 000005BC 33C9 '3.'
x5be: loop x5be ; 000005BE E2FE '..'
dec dl ; 000005C0 FECA '..'
jnz x5b4 ; 000005C2 75F0 'u.'
x5c4: popf ; 000005C4 9D '.'
ret ; 000005C5 C3 '.'
inc dx ; 000005C6 42 'B'
adc ax,[bx+si] ; 000005C7 1300 '..'
rol byte [bx+si],0x0 ; 000005C9 C00000 '...'
times 5 dw 0x0000 ; 000005CC - 000005D4
db 0xE2,0x05
add al,al ; 000005D8 00C0 '..'
times 4 dw 0x0000 ; 000005DA - 000005E0
sbb al,[bx+si] ; 000005E2 1A00 '..'
ror word [bp+si],cl ; 000005E4 D30A '.',0x0A
add al,al ; 000005E6 00C0 '..'
times 10 dw 0x0000 ; 000005E8 - 000005FA
sti ; 000005FC FB '.'
push ds ; 000005FD 1E '.'
push ax ; 000005FE 50 'P'
push bx ; 000005FF 53 'S'
push cx ; 00000600 51 'Q'
push dx ; 00000601 52 'R'
mov ds,[cs:0x71c] ; 00000602 2E8E1E1C07 '.....'
cmp byte [0x500],0x1 ; 00000607 803E000501 '.>...'
jz x671 ; 0000060C 7463 'tc'
mov byte [0x500],0x1 ; 0000060E C606000501 '.....'
mov ah,0xf ; 00000613 B40F '..'
int 0x10 ; 00000615 CD10 '..'
mov cl,ah ; 00000617 8ACC '..'
mov ch,[0x484] ; 00000619 8A2E8404 '....'
inc ch ; 0000061D FEC5 '..'
call x677 ; 0000061F E85500 '.U.'
push cx ; 00000622 51 'Q'
mov ah,0x3 ; 00000623 B403 '..'
int 0x10 ; 00000625 CD10 '..'
pop cx ; 00000627 59 'Y'
push dx ; 00000628 52 'R'
xor dx,dx ; 00000629 33D2 '3.'
x62b: mov ah,0x2 ; 0000062B B402 '..'
int 0x10 ; 0000062D CD10 '..'
mov ah,0x8 ; 0000062F B408 '..'
int 0x10 ; 00000631 CD10 '..'
or al,al ; 00000633 0AC0 0x0A,'.'
jnz x639 ; 00000635 7502 'u.'
mov al,0x20 ; 00000637 B020 '. '
x639: push dx ; 00000639 52 'R'
xor dx,dx ; 0000063A 33D2 '3.'
xor ah,ah ; 0000063C 32E4 '2.'
int 0x17 ; 0000063E CD17 '..'
pop dx ; 00000640 5A 'Z'
test ah,0x29 ; 00000641 F6C429 '..)'
jnz x667 ; 00000644 7521 'u!'
inc dl ; 00000646 FEC2 '..'
cmp cl,dl ; 00000648 3ACA ':.'
jnz x62b ; 0000064A 75DF 'u.'
xor dl,dl ; 0000064C 32D2 '2.'
mov ah,dl ; 0000064E 8AE2 '..'
push dx ; 00000650 52 'R'
call x677 ; 00000651 E82300 '.#.'
pop dx ; 00000654 5A 'Z'
inc dh ; 00000655 FEC6 '..'
cmp ch,dh ; 00000657 3AEE ':.'
jnz x62b ; 00000659 75D0 'u.'
pop dx ; 0000065B 5A 'Z'
mov ah,0x2 ; 0000065C B402 '..'
int 0x10 ; 0000065E CD10 '..'
mov byte [0x500],0x0 ; 00000660 C606000500 '.....'
jmp short x671 ; 00000665 EB0A '.',0x0A
x667: pop dx ; 00000667 5A 'Z'
mov ah,0x2 ; 00000668 B402 '..'
int 0x10 ; 0000066A CD10 '..'
mov byte [0x500],0xff ; 0000066C C6060005FF '.....'
x671: pop dx ; 00000671 5A 'Z'
pop cx ; 00000672 59 'Y'
pop bx ; 00000673 5B '['
pop ax ; 00000674 58 'X'
pop ds ; 00000675 1F '.'
iret ; 00000676 CF '.'
x677: xor dx,dx ; 00000677 33D2 '3.'
xor ah,ah ; 00000679 32E4 '2.'
mov al,0xd ; 0000067B B00D '.',0x0D
int 0x17 ; 0000067D CD17 '..'
xor ah,ah ; 0000067F 32E4 '2.'
mov al,0xa ; 00000681 B00A '.',0x0A
int 0x17 ; 00000683 CD17 '..'
ret ; 00000685 C3 '.'
beep: mov al,0xb6 ; 00000686 B0B6 '..'
out 0x43,al ; 00000688 E643 '.C'
mov al,cl ; 0000068A 8AC1 '..'
out 0x42,al ; 0000068C E642 '.B'
mov al,ch ; 0000068E 8AC5 '..'
out 0x42,al ; 00000690 E642 '.B'
in al,0x61 ; 00000692 E461 '.a'
mov ah,al ; 00000694 8AE0 '..'
or al,0x3 ; 00000696 0C03 '..'
out 0x61,al ; 00000698 E661 '.a'
x69a: xor cx,cx ; 0000069A 33C9 '3.'
x69c: loop x69c ; 0000069C E2FE '..'
dec bl ; 0000069E FECB '..'
jnz x69a ; 000006A0 75F8 'u.'
mov al,ah ; 000006A2 8AC4 '..'
out 0x61,al ; 000006A4 E661 '.a'
ret ; 000006A6 C3 '.'
db 0x82 ; 000006A7 82 '.'
sbb bl,[bx+si+0x2f1e] ; 000006A8 1A981E2F '.../'
pop ds ; 000006AC 1F '.'
db 0x78,0x1F
db 0x8F ; 000006AF 8F '.'
pop ds ; 000006B0 1F '.'
test al,0x1f ; 000006B1 A81F '..'
rcr word [bx],cl ; 000006B3 D31F '..'
cmpsw ; 000006B5 A7 '.'
and bh,ch ; 000006B6 22FD '".'
and al,0x25 ; 000006B8 2425 '$%'
daa ; 000006BA 27 0x27
mov ch,[bx+di] ; 000006BB 8A29 '.)'
cmp bp,[bp+si] ; 000006BD 3B2A ';*'
inc bp ; 000006BF 45 'E'
xor al,[bp+di] ; 000006C0 3203 '2.'
xor di,si ; 000006C2 33FE '3.'
xor dx,[si] ; 000006C4 3314 '3.'
or [si+0x592b],dh ; 000006C6 08B42B59 '..+Y'
xor ax,0x82e ; 000006CA 352E08 '5..'
mov [0x1334],ax ; 000006CD A33413 '.4.'
pop es ; 000006D0 07 '.'
adc ax,[bx] ; 000006D1 1307 '..'
adc ax,[bx] ; 000006D3 1307 '..'
adc ax,[bx] ; 000006D5 1307 '..'
adc ax,[bx] ; 000006D7 1307 '..'
adc ax,[bx] ; 000006D9 1307 '..'
sub ax,0xfc0a ; 000006DB 2D0AFC '-',0x0A,'.'
or ah,[bx+di+0xcd0c] ; 000006DE 0AA10CCD 0x0A,'...'
insw ; 000006E2 6D 'm'
iret ; 000006E3 CF '.'
sti ; 000006E4 FB '.'
cld ; 000006E5 FC '.'
push bp ; 000006E6 55 'U'
push es ; 000006E7 06 '.'
push ds ; 000006E8 1E '.'
push dx ; 000006E9 52 'R'
push cx ; 000006EA 51 'Q'
push bx ; 000006EB 53 'S'
push si ; 000006EC 56 'V'
push di ; 000006ED 57 'W'
push ax ; 000006EE 50 'P'
mov al,ah ; 000006EF 8AC4 '..'
cbw ; 000006F1 98 '.'
shl ax,1 ; 000006F2 D1E0 '..'
mov si,ax ; 000006F4 8BF0 '..'
pop ax ; 000006F6 58 'X'
cmp si,byte +0x3a ; 000006F7 83FE3A '..:'
jnc x706 ; 000006FA 730A 's',0x0A
mov ds,[cs:0x71c] ; 000006FC 2E8E1E1C07 '.....'
jmp near [cs:si+0x6a7] ; 00000701 2EFFA4A706 '.....'
x706: pop di ; 00000706 5F '_'
pop si ; 00000707 5E '^'
pop bx ; 00000708 5B '['
pop cx ; 00000709 59 'Y'
pop dx ; 0000070A 5A 'Z'
pop ds ; 0000070B 1F '.'
pop es ; 0000070C 07 '.'
pop bp ; 0000070D 5D ']'
int 0x42 ; 0000070E CD42 '.B'
iret ; 00000710 CF '.'
jmp short x713 ; 00000711 EB00 '..'
x713: pop di ; 00000713 5F '_'
pop si ; 00000714 5E '^'
pop bx ; 00000715 5B '['
pop cx ; 00000716 59 'Y'
pop dx ; 00000717 5A 'Z'
pop ds ; 00000718 1F '.'
pop es ; 00000719 07 '.'
pop bp ; 0000071A 5D ']'
iret ; 0000071B CF '.'
add [bx+si],al ; 0000071C 0000 '..'
add [bx+si+0xb800],ah ; 0000071E 00A000B8 '....'
x722: push ds ; 00000722 1E '.'
mov ds,[cs:0x71c] ; 00000723 2E8E1E1C07 '.....'
mov dx,[0x463] ; 00000728 8B166304 '..c.'
add dl,0x6 ; 0000072C 80C206 '...'
pop ds ; 0000072F 1F '.'
ret ; 00000730 C3 '.'
x731: mov ds,[cs:0x71c] ; 00000731 2E8E1E1C07 '.....'
les bx,[0x4a8] ; 00000736 C41EA804 '....'
les bx,[es:bx] ; 0000073A 26C41F '&..'
ret ; 0000073D C3 '.'
x73e: push si ; 0000073E 56 'V'
mov si,ax ; 0000073F 8BF0 '..'
shr si,1 ; 00000741 D1EE '..'
shr si,1 ; 00000743 D1EE '..'
shr si,1 ; 00000745 D1EE '..'
shr si,1 ; 00000747 D1EE '..'
shr si,1 ; 00000749 D1EE '..'
shr si,1 ; 0000074B D1EE '..'
shr si,1 ; 0000074D D1EE '..'
shr si,1 ; 0000074F D1EE '..'
shl si,1 ; 00000751 D1E6 '..'
cmp si,0x28 ; 00000753 81FE2800 '..(.'
jnc x786 ; 00000757 732D 's-'
jmp near [cs:si+0x75e] ; 00000759 2EFFA45E07 '...^.'
xchg al,[bx] ; 0000075E 8607 '..'
xchg al,[bx] ; 00000760 8607 '..'
xchg al,[bx] ; 00000762 8607 '..'
xchg al,[bx] ; 00000764 8607 '..'
scasb ; 00000766 AE '.'
pop es ; 00000767 07 '.'
scasb ; 00000768 AE '.'
pop es ; 00000769 07 '.'
scasb ; 0000076A AE '.'
pop es ; 0000076B 07 '.'
xchg al,[bx] ; 0000076C 8607 '..'
cmpsb ; 0000076E A6 '.'
pop es ; 0000076F 07 '.'
scasb ; 00000770 AE '.'
pop es ; 00000771 07 '.'
scasb ; 00000772 AE '.'
pop es ; 00000773 07 '.'
scasb ; 00000774 AE '.'
pop es ; 00000775 07 '.'
scasb ; 00000776 AE '.'
pop es ; 00000777 07 '.'
scasb ; 00000778 AE '.'
pop es ; 00000779 07 '.'
scasb ; 0000077A AE '.'
pop es ; 0000077B 07 '.'
stosb ; 0000077C AA '.'
pop es ; 0000077D 07 '.'
stosb ; 0000077E AA '.'
pop es ; 0000077F 07 '.'
mov [0xa207],al ; 00000780 A207A2 '...'
pop es ; 00000783 07 '.'
scasb ; 00000784 AE '.'
pop es ; 00000785 07 '.'
x786: test byte [0x489],0x10 ; 00000786 F606890410 '.....'
jnz x7a6 ; 0000078B 7519 'u.'
mov al,[0x488] ; 0000078D A08804 '...'
and al,0xf ; 00000790 240F '$.'
cmp al,0x3 ; 00000792 3C03 '<.'
jz x7aa ; 00000794 7414 't.'
cmp al,0x9 ; 00000796 3C09 '<.'
jz x7aa ; 00000798 7410 't.'
cmp ah,0x7 ; 0000079A 80FC07 '...'
jz x7aa ; 0000079D 740B 't.'
jmp short x7ae ; 0000079F EB0D '.',0x0D
nop ; 000007A1 90 '.'
mov al,0x3 ; 000007A2 B003 '..'
jmp short x7b0 ; 000007A4 EB0A '.',0x0A
x7a6: mov al,0x2 ; 000007A6 B002 '..'
jmp short x7b0 ; 000007A8 EB06 '..'
x7aa: mov al,0x1 ; 000007AA B001 '..'
jmp short x7b0 ; 000007AC EB02 '..'
x7ae: mov al,0x0 ; 000007AE B000 '..'
x7b0: pop si ; 000007B0 5E '^'
ret ; 000007B1 C3 '.'
x7b2: test byte [0x487],0x80 ; 000007B2 F606870480 '.....'
jnz x7f2 ; 000007B7 7539 'u9'
mov dx,0xb800 ; 000007B9 BA00B8 '...'
mov al,[0x449] ; 000007BC A04904 '.I.'
cmp al,0x6 ; 000007BF 3C06 '<.'
jna x7cd ; 000007C1 760A 'v',0x0A
mov dx,0xb000 ; 000007C3 BA00B0 '...'
cmp al,0x7 ; 000007C6 3C07 '<.'
jz x7cd ; 000007C8 7403 't.'
mov dx,0xa000 ; 000007CA BA00A0 '...'
x7cd: mov es,dx ; 000007CD 8EC2 '..'
mov bx,0x720 ; 000007CF BB2007 '. .'
cmp al,0x4 ; 000007D2 3C04 '<.'
jc x7dc ; 000007D4 7206 'r.'
cmp al,0x7 ; 000007D6 3C07 '<.'
jz x7dc ; 000007D8 7402 't.'
sub bx,bx ; 000007DA 2BDB '+.'
x7dc: mov cx,[0x44c] ; 000007DC 8B0E4C04 '..L.'
jcxz x7f2 ; 000007E0 E310 '..'
mov cx,0x8000 ; 000007E2 B90080 '...'
cmp dh,0xa0 ; 000007E5 80FEA0 '...'
jz x7ec ; 000007E8 7402 't.'
mov ch,0x40 ; 000007EA B540 '.@'
x7ec: mov ax,bx ; 000007EC 8BC3 '..'
sub di,di ; 000007EE 2BFF '+.'
rep stosw ; 000007F0 F3AB '..'
x7f2: ret ; 000007F2 C3 '.'
x7f3: mov si,bx ; 000007F3 8BF3 '..'
add si,byte +0x23 ; 000007F5 83C623 '..#'
push ds ; 000007F8 1E '.'
push es ; 000007F9 06 '.'
les di,[0x4a8] ; 000007FA C43EA804 '.>..'
les di,[es:di+0x4] ; 000007FE 26C47D04 '&.}.'
mov ax,es ; 00000802 8CC0 '..'
or ax,di ; 00000804 0BC7 '..'
jz x811 ; 00000806 7409 't.'
pop ds ; 00000808 1F '.'
push ds ; 00000809 1E '.'
mov cx,0x10 ; 0000080A B91000 '...'
rep movsb ; 0000080D F3A4 '..'
inc si ; 0000080F 46 'F'
movsb ; 00000810 A4 '.'
x811: pop es ; 00000811 07 '.'
pop ds ; 00000812 1F '.'
ret ; 00000813 C3 '.'
mov ah,[0x44a] ; 00000814 8A264A04 '.&J.'
mov bh,[0x462] ; 00000818 8A3E6204 '.>b.'
mov al,[0x487] ; 0000081C A08704 '...'
and al,0x80 ; 0000081F 2480 '$.'
or al,[0x449] ; 00000821 0A064904 0x0A,'.I.'
pop di ; 00000825 5F '_'
pop si ; 00000826 5E '^'
pop cx ; 00000827 59 'Y'
pop cx ; 00000828 59 'Y'
pop dx ; 00000829 5A 'Z'
pop ds ; 0000082A 1F '.'
pop es ; 0000082B 07 '.'
pop bp ; 0000082C 5D ']'
iret ; 0000082D CF '.'
cmp bl,0x10 ; 0000082E 80FB10 '...'
jz x870 ; 00000831 743D 't='
cmp bl,0x20 ; 00000833 80FB20 '.. '
jz x8a9 ; 00000836 7471 'tq'
cmp bl,0x30 ; 00000838 80FB30 '..0'
jnz x840 ; 0000083B 7503 'u.'
jmp short x8b8 ; 0000083D EB79 '.y'
nop ; 0000083F 90 '.'
x840: cmp bl,0x31 ; 00000840 80FB31 '..1'
jnz x848 ; 00000843 7503 'u.'
jmp x955 ; 00000845 E90D01 '.',0x0D,'.'
x848: cmp bl,0x32 ; 00000848 80FB32 '..2'
jnz x850 ; 0000084B 7503 'u.'
jmp x96b ; 0000084D E91B01 '...'
x850: cmp bl,0x33 ; 00000850 80FB33 '..3'
jnz x858 ; 00000853 7503 'u.'
jmp x980 ; 00000855 E92801 '.(.'
x858: cmp bl,0x34 ; 00000858 80FB34 '..4'
jnz x860 ; 0000085B 7503 'u.'
jmp x996 ; 0000085D E93601 '.6.'
x860: cmp bl,0x35 ; 00000860 80FB35 '..5'
jnz x868 ; 00000863 7503 'u.'
jmp x9b1 ; 00000865 E94901 '.I.'
x868: cmp bl,0x36 ; 00000868 80FB36 '..6'
jnz x8a4 ; 0000086B 7537 'u7'
db 0xE9,0xAB,0x01
x870: mov bh,[0x487] ; 00000870 8A3E8704 '.>..'
and bh,0x2 ; 00000874 80E702 '...'
shr bh,1 ; 00000877 D0EF '..'
mov al,[0x487] ; 00000879 A08704 '...'
and al,0x60 ; 0000087C 2460 '$`'
shr al,1 ; 0000087E D0E8 '..'
shr al,1 ; 00000880 D0E8 '..'
shr al,1 ; 00000882 D0E8 '..'
shr al,1 ; 00000884 D0E8 '..'
shr al,1 ; 00000886 D0E8 '..'
mov bl,al ; 00000888 8AD8 '..'
mov cl,[0x488] ; 0000088A 8A0E8804 '....'
mov ch,cl ; 0000088E 8AE9 '..'
and cl,0xf ; 00000890 80E10F '...'
shr ch,1 ; 00000893 D0ED '..'
shr ch,1 ; 00000895 D0ED '..'
shr ch,1 ; 00000897 D0ED '..'
shr ch,1 ; 00000899 D0ED '..'
pop di ; 0000089B 5F '_'
pop si ; 0000089C 5E '^'
pop dx ; 0000089D 5A 'Z'
pop dx ; 0000089E 5A 'Z'
pop dx ; 0000089F 5A 'Z'
pop ds ; 000008A0 1F '.'
pop es ; 000008A1 07 '.'
pop bp ; 000008A2 5D ']'
iret ; 000008A3 CF '.'
x8a4: xor al,al ; 000008A4 32C0 '2.'
jmp x713 ; 000008A6 E96AFE '.j.'
x8a9: cli ; 000008A9 FA '.'
mov word [0x14],0x5fc ; 000008AA C7061400FC05 '......'
mov [0x16],cs ; 000008B0 8C0E1600 '....'
sti ; 000008B4 FB '.'
jmp x713 ; 000008B5 E95BFE '.[.'
x8b8: test byte [0x487],0x8 ; 000008B8 F606870408 '.....'
jnz x8a4 ; 000008BD 75E5 'u.'
test byte [0x489],0x1 ; 000008BF F606890401 '.....'
jnz x914 ; 000008C4 754E 'uN'
cmp al,0x0 ; 000008C6 3C00 '<.'
jnz x8d9 ; 000008C8 750F 'u.'
test byte [0x487],0x2 ; 000008CA F606870402 '.....'
x8cf: jnz x8a4 ; 000008CF 75D3 'u.'
mov al,0x8 ; 000008D1 B008 '..'
mov bx,0xef00 ; 000008D3 BB00EF '...'
jmp short x900 ; 000008D6 EB28 '.('
nop ; 000008D8 90 '.'
x8d9: dec al ; 000008D9 FEC8 '..'
jnz x8ee ; 000008DB 7511 'u.'
mov al,0x9 ; 000008DD B009 '..'
mov bx,0xef00 ; 000008DF BB00EF '...'
test byte [0x487],0x2 ; 000008E2 F606870402 '.....'
jz x900 ; 000008E7 7417
mov al,0xb ; 000008E9 B00B '..'
jmp short x900 ; 000008EB EB13 '..'
nop ; 000008ED 90 '.'
x8ee: dec al ; 000008EE FEC8 '..'
jnz x8a4 ; 000008F0 75B2 'u.'
mov al,0x9 ; 000008F2 B009 '..'
mov bx,0xef10 ; 000008F4 BB10EF '...'
test byte [0x487],0x2 ; 000008F7 F606870402 '.....'
jz x900 ; 000008FC 7402
mov al,0xb ; 000008FE B00B '..'
x900: and [0x489],bh ; 00000900 203E8904 ' >..'
or [0x489],bl ; 00000904 081E8904 '....'
and byte [0x488],0xf0 ; 00000908 80268804F0 '.&...'
or [0x488],al ; 0000090D 08068804 '....'
jmp short x950 ; 00000911 EB3D '.='
nop ; 00000913 90 '.'
x914: cmp al,0x0 ; 00000914 3C00 '<.'
jnz x928 ; 00000916 7510 'u.'
mov al,0x8 ; 00000918 B008 '..'
mov bx,0xef80 ; 0000091A BB80EF '...'
test byte [0x487],0x2 ; 0000091D F606870402 '.....'
jz x900 ; 00000922 74DC
mov al,0xb ; 00000924 B00B '..'
jmp short x900 ; 00000926 EBD8 '..'
x928: dec al ; 00000928 FEC8 '..'
jnz x93c ; 0000092A 7510 'u.'
mov al,0x9 ; 0000092C B009 '..'
mov bx,0x6f00 ; 0000092E BB006F '..o'
test byte [0x487],0x2 ; 00000931 F606870402 '.....'
jz x900 ; 00000936 74C8
mov al,0xb ; 00000938 B00B '..'
jmp short x900 ; 0000093A EBC4 '..'
x93c: dec al ; 0000093C FEC8 '..'
jnz x8cf ; 0000093E 758F 'u.'
mov al,0x9 ; 00000940 B009 '..'
mov bx,0x6f10 ; 00000942 BB106F '..o'
test byte [0x487],0x2 ; 00000945 F606870402 '.....'
jz x900 ; 0000094A 74B4
mov al,0xb ; 0000094C B00B '..'
jmp short x900 ; 0000094E EBB0 '..'
x950: mov al,0x12 ; 00000950 B012 '..'
jmp x713 ; 00000952 E9BEFD '...'
x955: cmp al,0x1 ; 00000955 3C01 '<.'
jnz x960 ; 00000957 7507 'u.'
or byte [0x489],0x8 ; 00000959 800E890408 '.....'
jmp short x950 ; 0000095E EBF0 '..'
x960: cmp al,0x0 ; 00000960 3C00 '<.'
jnz x9ac ; 00000962 7548 'uH'
and byte [0x489],0xf7 ; 00000964 80268904F7 '.&...'
jmp short x950 ; 00000969 EBE5 '..'
x96b: mov dx,0x46e8 ; 0000096B BAE846 '..F'
cmp al,0x0 ; 0000096E 3C00 '<.'
jnz x977 ; 00000970 7505 'u.'
mov al,0xe ; 00000972 B00E '..'
out dx,al ; 00000974 EE '.'
jmp short x950 ; 00000975 EBD9 '..'
x977: cmp al,0x1 ; 00000977 3C01 '<.'
jnz x9ac ; 00000979 7531 'u1'
xor al,al ; 0000097B 32C0 '2.'
out dx,al ; 0000097D EE '.'
jmp short x950 ; 0000097E EBD0 '..'
x980: cmp al,0x1 ; 00000980 3C01 '<.'
jnz x98b ; 00000982 7507 'u.'
and byte [0x489],0xfd ; 00000984 80268904FD '.&...'
jmp short x950 ; 00000989 EBC5 '..'
x98b: cmp al,0x0 ; 0000098B 3C00 '<.'
jnz x9ac ; 0000098D 751D 'u.'
or byte [0x489],0x2 ; 0000098F 800E890402 '.....'
jmp short x950 ; 00000994 EBBA '..'
x996: cmp al,0x1 ; 00000996 3C01 '<.'
jnz x9a1 ; 00000998 7507 'u.'
or byte [0x487],0x1 ; 0000099A 800E870401 '.....'
jmp short x950 ; 0000099F EBAF '..'
x9a1: cmp al,0x0 ; 000009A1 3C00 '<.'
jnz x9ac ; 000009A3 7507 'u.'
and byte [0x487],0xfe ; 000009A5 80268704FE '.&...'
jmp short x950 ; 000009AA EBA4 '..'
x9ac: xor al,al ; 000009AC 32C0 '2.'
jmp x713 ; 000009AE E962FD '.b.'
x9b1: or al,al ; 000009B1 0AC0 0x0A,'.'
jnz x9cc ; 000009B3 7517 'u.'
test byte [0x489],0x40 ; 000009B5 F606890440 '....@'
jnz x9ac ; 000009BA 75F0 'u.'
or al,0x80 ; 000009BC 0C80 '..'
int 0x42 ; 000009BE CD42 '.B'
test byte [0x489],0x40 ; 000009C0 F606890440 '....@'
jz x9ac ; 000009C5 74E5 't.'
call x9f5 ; 000009C7 E82B00 '.+.'
jmp short x950 ; 000009CA EB84 '..'
x9cc: cmp al,0x1 ; 000009CC 3C01 '<.'
jz x9ac ; 000009CE 74DC 't.'
test byte [0x489],0x40 ; 000009D0 F606890440 '....@'
jz x9ac ; 000009D5 74D5 't.'
cmp al,0x2 ; 000009D7 3C02 '<.'
jnz x9e1 ; 000009D9 7506 'u.'
call x9f5 ; 000009DB E81700 '...'
jmp x950 ; 000009DE E96FFF '.o.'
x9e1: cmp al,0x3 ; 000009E1 3C03 '<.'
jnz x9ac ; 000009E3 75C7 'u.'
cli ; 000009E5 FA '.'
mov bx,dx ; 000009E6 8BDA '..'
call xde1 ; 000009E8 E8F603 '...'
mov dx,0x46e8 ; 000009EB BAE846 '..F'
mov al,0xe ; 000009EE B00E '..'
out dx,al ; 000009F0 EE '.'
sti ; 000009F1 FB '.'
jmp x950 ; 000009F2 E95BFF '.[.'
x9f5: cli ; 000009F5 FA '.'
mov bx,dx ; 000009F6 8BDA '..'
call xd9c ; 000009F8 E8A103 '...'
cli ; 000009FB FA '.'
les bx,[0x108] ; 000009FC C41E0801 '....'
mov [0x1b4],bx ; 00000A00 891EB401 '....'
mov [0x1b6],es ; 00000A04 8C06B601 '....'
mov word [0x108],0x6e4 ; 00000A08 C7060801E406 '......'
mov [0x10a],cs ; 00000A0E 8C0E0A01 '..',0x0A,'.'
sti ; 00000A12 FB '.'
mov dx,0x46e8 ; 00000A13 BAE846 '..F'
mov al,0x6 ; 00000A16 B006 '..'
out dx,al ; 00000A18 EE '.'
sti ; 00000A19 FB '.'
ret ; 00000A1A C3 '.'
mov ah,0x20 ; 00000A1B B420 '. '
cmp al,0x1 ; 00000A1D 3C01 '<.'
jz xa27 ; 00000A1F 7406 't.'
mov ah,0x0 ; 00000A21 B400 '..'
cmp al,0x0 ; 00000A23 3C00 '<.'
jnz xa2a ; 00000A25 7503 'u.'
xa27: call x127a ; 00000A27 E85008 '.P.'
xa2a: jmp x950 ; 00000A2A E923FF '.#.'
cmp al,0x0 ; 00000A2D 3C00 '<.'
jz xa37 ; 00000A2F 7406 't.'
cmp al,0x1 ; 00000A31 3C01 '<.'
jz xa4b ; 00000A33 7416 't.'
jmp short xa53 ; 00000A35 EB1C '..'
xa37: mov al,[0x48a] ; 00000A37 A08A04 '...'
call xa96 ; 00000A3A E85900 '.Y.'
call xab6 ; 00000A3D E87600 '.v.'
pop di ; 00000A40 5F '_'
pop si ; 00000A41 5E '^'
pop cx ; 00000A42 59 'Y'
pop cx ; 00000A43 59 'Y'
pop dx ; 00000A44 5A 'Z'
pop ds ; 00000A45 1F '.'
pop es ; 00000A46 07 '.'
pop bp ; 00000A47 5D ']'
mov al,0x1a ; 00000A48 B01A '..'
iret ; 00000A4A CF '.'
xa4b: call xa5c ; 00000A4B E80E00 '...'
mov [0x48a],al ; 00000A4E A28A04 '...'
mov al,0x1a ; 00000A51 B01A '..'
xa53: pop di ; 00000A53 5F '_'
pop si ; 00000A54 5E '^'
pop bx ; 00000A55 5B '['
pop cx ; 00000A56 59 'Y'
pop dx ; 00000A57 5A 'Z'
pop ds ; 00000A58 1F '.'
pop es ; 00000A59 07 '.'
pop bp ; 00000A5A 5D ']'
iret ; 00000A5B CF '.'
xa5c: mov dx,bx ; 00000A5C 8BD3 '..'
xchg bh,bl ; 00000A5E 86FB '..'
mov ax,bx ; 00000A60 8BC3 '..'
call xa87 ; 00000A62 E82200 '.".'
mov bx,0x0 ; 00000A65 BB0000 '...'
mov cl,[es:si] ; 00000A68 268A0C '&..'
xor ch,ch ; 00000A6B 32ED '2.'
add si,byte +0x4 ; 00000A6D 83C604 '...'
xa70: cmp ax,[es:bx+si] ; 00000A70 263B00 '&;.'
jz xa82 ; 00000A73 740D 't',0x0D
cmp dx,[es:bx+si] ; 00000A75 263B10 '&;.'
jz xa82 ; 00000A78 7408 't.'
add bx,byte +0x2 ; 00000A7A 83C302 '...'
loop xa70 ; 00000A7D E2F1 '..'
mov al,0xff ; 00000A7F B0FF '..'
ret ; 00000A81 C3 '.'
xa82: shr bl,1 ; 00000A82 D0EB '..'
mov al,bl ; 00000A84 8AC3 '..'
ret ; 00000A86 C3 '.'
xa87: les si,[0x4a8] ; 00000A87 C436A804 '.6..'
les si,[es:si+0x10] ; 00000A8B 26C4B41000 '&....'
les si,[es:si+0x2] ; 00000A90 26C4B40200 '&....'
ret ; 00000A95 C3 '.'
xa96: call xa87 ; 00000A96 E8EEFF '...'
cmp al,[es:si] ; 00000A99 263A04 '&:.'
jc xaa2 ; 00000A9C 7204 'r.'
mov bx,0xffff ; 00000A9E BBFFFF '...'
ret ; 00000AA1 C3 '.'
xaa2: add si,byte +0x4 ; 00000AA2 83C604 '...'
xor ah,ah ; 00000AA5 32E4 '2.'
shl ax,1 ; 00000AA7 D1E0 '..'
add si,ax ; 00000AA9 03F0 '..'
mov bx,[es:si] ; 00000AAB 268B1C '&..'
cmp bl,0x0 ; 00000AAE 80FB00 '...'
jnz xab5 ; 00000AB1 7502 'u.'
xchg bl,bh ; 00000AB3 86DF '..'
xab5: ret ; 00000AB5 C3 '.'
xab6: cmp bh,0x0 ; 00000AB6 80FF00 '...'
jz xad2 ; 00000AB9 7417 't.'
mov al,[0x410] ; 00000ABB A01004 '...'
and al,0x30 ; 00000ABE 2430 '$0'
cmp al,0x30 ; 00000AC0 3C30 '<0'
jz xacb ; 00000AC2 7407 't.'
test bl,0x1 ; 00000AC4 F6C301 '...'
jnz xad0 ; 00000AC7 7507 'u.'
jmp short xad2 ; 00000AC9 EB07 '..'
xacb: test bl,0x1 ; 00000ACB F6C301 '...'
jnz xad2 ; 00000ACE 7502 'u.'
xad0: xchg bl,bh ; 00000AD0 86DF '..'
xad2: ret ; 00000AD2 C3 '.'
adc [bx+di],al ; 00000AD3 1001 '..'
or [bx+si],al ; 00000AD5 0800 '..'
add [bx+si],al ; 00000AD7 0000 '..'
add [bx+di],al ; 00000AD9 0001 '..'
add [bp+si],al ; 00000ADB 0002 '..'
add al,[bx+di] ; 00000ADD 0201 '..'
add [si],al ; 00000ADF 0004 '..'
add al,0x1 ; 00000AE1 0401 '..'
add [di],al ; 00000AE3 0005 '..'
add al,[di] ; 00000AE5 0205 '..'
add [0x601],al ; 00000AE7 00060106 '....'
add ax,0x6 ; 00000AEB 050600 '...'
or [bx+di],al ; 00000AEE 0801 '..'
or [bx+si],al ; 00000AF0 0800 '..'
pop es ; 00000AF2 07 '.'
add al,[bx] ; 00000AF3 0207 '..'
push es ; 00000AF5 06 '.'
pop es ; 00000AF6 07 '.'
xaf7: xor al,al ; 00000AF7 32C0 '2.'
jmp x713 ; 00000AF9 E917FC '...'
or bx,bx ; 00000AFC 0BDB '..'
jnz xaf7 ; 00000AFE 75F7 'u.'
mov word [es:di],0xc91 ; 00000B00 26C705910C '&....'
inc di ; 00000B05 47 'G'
inc di ; 00000B06 47 'G'
mov [es:di],cs ; 00000B07 268C0D '&.',0x0D
inc di ; 00000B0A 47 'G'
inc di ; 00000B0B 47 'G'
mov si,0x449 ; 00000B0C BE4904 '.I.'
mov cx,0x1e ; 00000B0F B91E00 '...'
rep movsb ; 00000B12 F3A4 '..'
mov si,0x484 ; 00000B14 BE8404 '...'
mov al,[si] ; 00000B17 8A04 '..'
inc al ; 00000B19 FEC0 '..'
mov [es:di],al ; 00000B1B 268805 '&..'
inc si ; 00000B1E 46 'F'
inc di ; 00000B1F 47 'G'
mov cx,0x2 ; 00000B20 B90200 '...'
rep movsb ; 00000B23 F3A4 '..'
mov al,[0x48a] ; 00000B25 A08A04 '...'
push es ; 00000B28 06 '.'
call xa96 ; 00000B29 E86AFF '.j.'
pop es ; 00000B2C 07 '.'
mov [es:di],bl ; 00000B2D 26881D '&..'
inc di ; 00000B30 47 'G'
mov [es:di],bh ; 00000B31 26883D '&.='
mov al,[0x449] ; 00000B34 A04904 '.I.'
xor ah,ah ; 00000B37 32E4 '2.'
mov si,ax ; 00000B39 8BF0 '..'
shl si,1 ; 00000B3B D1E6 '..'
add si,0xc55 ; 00000B3D 81C6550C '..U.'
mov bx,[cs:si] ; 00000B41 2E8B1C '...'
inc di ; 00000B44 47 'G'
mov [es:di],bx ; 00000B45 26891D '&..'
inc di ; 00000B48 47 'G'
lea si,[0xc7d] ; 00000B49 8D367D0C '.6}.'
add si,ax ; 00000B4D 03F0 '..'
mov bl,[cs:si] ; 00000B4F 2E8A1C '...'
inc di ; 00000B52 47 'G'
mov [es:di],bl ; 00000B53 26881D '&..'
xchg al,ah ; 00000B56 86C4 '..'
call x73e ; 00000B58 E8E3FB '...'
inc di ; 00000B5B 47 'G'
mov [es:di],al ; 00000B5C 268805 '&..'
mov dx,0x3c4 ; 00000B5F BAC403 '...'
mov al,0x3 ; 00000B62 B003 '..'
out dx,al ; 00000B64 EE '.'
inc dx ; 00000B65 42 'B'
in al,dx ; 00000B66 EC '.'
mov ah,al ; 00000B67 8AE0 '..'
push ax ; 00000B69 50 'P'
and ah,0x10 ; 00000B6A 80E410 '...'
shr ah,1 ; 00000B6D D0EC '..'
shr ah,1 ; 00000B6F D0EC '..'
and al,0x3 ; 00000B71 2403 '$.'
or al,ah ; 00000B73 0AC4 0x0A,'.'
inc di ; 00000B75 47 'G'
mov [es:di],al ; 00000B76 268805 '&..'
pop ax ; 00000B79 58 'X'
and ah,0x20 ; 00000B7A 80E420 '.. '
shr ah,1 ; 00000B7D D0EC '..'
shr ah,1 ; 00000B7F D0EC '..'
shr ah,1 ; 00000B81 D0EC '..'
and al,0xc ; 00000B83 240C '$.'
shr al,1 ; 00000B85 D0E8 '..'
shr al,1 ; 00000B87 D0E8 '..'
or al,ah ; 00000B89 0AC4 0x0A,'.'
inc di ; 00000B8B 47 'G'
mov [es:di],al ; 00000B8C 268805 '&..'
mov al,0x10 ; 00000B8F B010 '..'
call x722 ; 00000B91 E88EFB '...'
call x2b4b ; 00000B94 E8B41F '...'
call x2b6e ; 00000B97 E8D41F '...'
and ah,0x8 ; 00000B9A 80E408 '...'
shl ah,1 ; 00000B9D D0E4 '..'
shl ah,1 ; 00000B9F D0E4 '..'
mov al,[0x487] ; 00000BA1 A08704 '...'
and al,0x1 ; 00000BA4 2401 '$.'
xor al,0x1 ; 00000BA6 3401 '4.'
mov cl,0x4 ; 00000BA8 B104 '..'
shl al,cl ; 00000BAA D2E0 '..'
or al,ah ; 00000BAC 0AC4 0x0A,'.'
mov ah,[0x489] ; 00000BAE 8A268904 '.&..'
and ah,0xf ; 00000BB2 80E40F '...'
or al,ah ; 00000BB5 0AC4 0x0A,'.'
inc di ; 00000BB7 47 'G'
mov [es:di],al ; 00000BB8 268805 '&..'
xor al,al ; 00000BBB 32C0 '2.'
inc di ; 00000BBD 47 'G'
mov [es:di],al ; 00000BBE 268805 '&..'
inc di ; 00000BC1 47 'G'
mov [es:di],al ; 00000BC2 268805 '&..'
inc di ; 00000BC5 47 'G'
mov [es:di],al ; 00000BC6 268805 '&..'
mov al,[0x487] ; 00000BC9 A08704 '...'
and al,0x60 ; 00000BCC 2460 '$`'
mov cl,0x5 ; 00000BCE B105 '..'
shr al,cl ; 00000BD0 D2E8 '..'
inc di ; 00000BD2 47 'G'
mov [es:di],al ; 00000BD3 268805 '&..'
push es ; 00000BD6 06 '.'
xor cl,cl ; 00000BD7 32C9 '2.'
les bx,[0x4a8] ; 00000BD9 C41EA804 '....'
push es ; 00000BDD 06 '.'
les si,[es:bx+0x4] ; 00000BDE 26C47704 '&.w.'
mov ax,es ; 00000BE2 8CC0 '..'
or ax,si ; 00000BE4 0BC6 '..'
jz xbeb ; 00000BE6 7403 't.'
or cl,0x2 ; 00000BE8 80C902 '...'
xbeb: pop es ; 00000BEB 07 '.'
push es ; 00000BEC 06 '.'
les si,[es:bx+0x8] ; 00000BED 26C47708 '&.w.'
mov ax,es ; 00000BF1 8CC0 '..'
or ax,si ; 00000BF3 0BC6 '..'
jz xbfa ; 00000BF5 7403 't.'
or cl,0x4 ; 00000BF7 80C904 '...'
xbfa: pop es ; 00000BFA 07 '.'
push es ; 00000BFB 06 '.'
les si,[es:bx+0xc] ; 00000BFC 26C4770C '&.w.'
mov ax,es ; 00000C00 8CC0 '..'
or ax,si ; 00000C02 0BC6 '..'
jz xc09 ; 00000C04 7403 't.'
or cl,0x8 ; 00000C06 80C908 '...'
xc09: pop es ; 00000C09 07 '.'
les si,[es:bx+0x10] ; 00000C0A 26C47710 '&.w.'
mov ax,es ; 00000C0E 8CC0 '..'
or ax,si ; 00000C10 0BC6 '..'
jz xc43 ; 00000C12 742F 't/'
push es ; 00000C14 06 '.'
mov bx,si ; 00000C15 8BDE '..'
les si,[es:bx+0x6] ; 00000C17 26C47706 '&.w.'
mov ax,es ; 00000C1B 8CC0 '..'
or ax,si ; 00000C1D 0BC6 '..'
jz xc24 ; 00000C1F 7403 't.'
or cl,0x1 ; 00000C21 80C901 '...'
xc24: pop es ; 00000C24 07 '.'
push es ; 00000C25 06 '.'
les si,[es:bx+0xa] ; 00000C26 26C4770A '&.w',0x0A
mov ax,es ; 00000C2A 8CC0 '..'
or ax,si ; 00000C2C 0BC6 '..'
jz xc33 ; 00000C2E 7403 't.'
or cl,0x10 ; 00000C30 80C910 '...'
xc33: pop es ; 00000C33 07 '.'
les si,[es:bx+0x2] ; 00000C34 26C47702 '&.w.'
mov ax,es ; 00000C38 8CC0 '..'
mov bx,cs ; 00000C3A 8CCB '..'
cmp ax,bx ; 00000C3C 3BC3 ';.'
jz xc43 ; 00000C3E 7403 't.'
or cl,0x20 ; 00000C40 80C920 '.. '
xc43: pop es ; 00000C43 07 '.'
inc di ; 00000C44 47 'G'
mov [es:di],cl ; 00000C45 26880D '&.',0x0D
inc di ; 00000C48 47 'G'
mov cx,0xd ; 00000C49 B90D00 '.',0x0D,'.'
xor al,al ; 00000C4C 32C0 '2.'
rep stosb ; 00000C4E F3AA '..'
mov al,0x1b ; 00000C50 B01B '..'
jmp x713 ; 00000C52 E9BEFA '...'
adc [bx+si],al ; 00000C55 1000 '..'
adc [bx+si],al ; 00000C57 1000 '..'
adc [bx+si],al ; 00000C59 1000 '..'
adc [bx+si],al ; 00000C5B 1000 '..'
add al,0x0 ; 00000C5D 0400 '..'
add al,0x0 ; 00000C5F 0400 '..'
add al,[bx+si] ; 00000C61 0200 '..'
times 6 dw 0x0000 ; 00000C63 - 00000C6D
adc [bx+si],al ; 00000C6F 1000 '..'
adc [bx+si],al ; 00000C71 1000 '..'
add [bx+si],al ; 00000C73 0000 '..'
adc [bx+si],al ; 00000C75 1000 '..'
add al,[bx+si] ; 00000C77 0200 '..'
adc [bx+si],al ; 00000C79 1000 '..'
add [bx+di],al ; 00000C7B 0001 '..'
or [bx+si],cl ; 00000C7D 0808 '..'
or [bx+si],cl ; 00000C7F 0808 '..'
add [bx+di],ax ; 00000C81 0101 '..'
add [bx+si],cx ; 00000C83 0108 '..'
add [bx+si],al ; 00000C85 0000 '..'
add [bx+si],al ; 00000C87 0000 '..'
add [bx+si],cl ; 00000C89 0008 '..'
add al,0x2 ; 00000C8B 0402 '..'
add al,[bx+di] ; 00000C8D 0201 '..'
add [bx+di],ax ; 00000C8F 0101 '..'
jmp ax ; 00000C91 FFE0 '..'
sldt [bx+si] ; 00000C93 0F0000 '...'
add [bx+si],al ; 00000C96 0000 '..'
pop es ; 00000C98 07 '.'
add cl,[bx+si] ; 00000C99 0208 '..'
dec word [0x0] ; 00000C9B FF0E0000 '....'
aas ; 00000C9F 3F '?'
add [si],bh ; 00000CA0 003C '.<'
add [di+0x2],dh ; 00000CA2 007502 '.u.'
jmp short xcb9 ; 00000CA5 EB12 '..'
cmp al,0x1 ; 00000CA7 3C01 '<.'
jnz xcad ; 00000CA9 7502 'u.'
jmp short xd05 ; 00000CAB EB58 '.X'
xcad: cmp al,0x2 ; 00000CAD 3C02 '<.'
jnz xd00 ; 00000CAF 754F 'uO'
jmp xd5d ; 00000CB1 E9A900 '...'
xcb4: mov al,0x1c ; 00000CB4 B01C '..'
jmp x713 ; 00000CB6 E95AFA '.Z.'
xcb9: mov ax,0x20 ; 00000CB9 B82000 '. .'
xor dx,dx ; 00000CBC 33D2 '3.'
test cx,0x7 ; 00000CBE F7C10700 '....'
jz xd00 ; 00000CC2 743C 't<'
test cx,0x1 ; 00000CC4 F7C10100 '....'
jz xcd0 ; 00000CC8 7406 't.'
add ax,0x46 ; 00000CCA 054600 '.F.'
adc dx,byte +0x0 ; 00000CCD 83D200 '...'
xcd0: test cx,0x2 ; 00000CD0 F7C10200 '....'
jz xcdc ; 00000CD4 7406 't.'
add ax,0x3a ; 00000CD6 053A00 '.:.'
adc dx,byte +0x0 ; 00000CD9 83D200 '...'
xcdc: test cx,0x4 ; 00000CDC F7C10400 '....'
jz xce8 ; 00000CE0 7406 't.'
add ax,0x303 ; 00000CE2 050303 '...'
adc dx,byte +0x0 ; 00000CE5 83D200 '...'
xce8: mov bx,0x40 ; 00000CE8 BB4000 '.@.'
div bx ; 00000CEB F7F3 '..'
cmp dx,byte +0x0 ; 00000CED 83FA00 '...'
jz xcf3 ; 00000CF0 7401 't.'
inc ax ; 00000CF2 40 '@'
xcf3: mov bx,ax ; 00000CF3 8BD8 '..'
pop di ; 00000CF5 5F '_'
pop si ; 00000CF6 5E '^'
pop ax ; 00000CF7 58 'X'
mov al,0x1c ; 00000CF8 B01C '..'
pop cx ; 00000CFA 59 'Y'
pop dx ; 00000CFB 5A 'Z'
pop ds ; 00000CFC 1F '.'
pop es ; 00000CFD 07 '.'
pop bp ; 00000CFE 5D ']'
iret ; 00000CFF CF '.'
xd00: mov al,0x0 ; 00000D00 B000 '..'
jmp x713 ; 00000D02 E90EFA '...'
xd05: mov dx,bx ; 00000D05 8BD3 '..'
add dx,byte +0x20 ; 00000D07 83C220 '.. '
test cx,0x1 ; 00000D0A F7C10100 '....'
jz xd2c ; 00000D0E 741C 't.'
push cx ; 00000D10 51 'Q'
push bx ; 00000D11 53 'S'
mov [es:bx],dx ; 00000D12 268917 '&..'
mov bx,dx ; 00000D15 8BDA '..'
add dx,byte +0x46 ; 00000D17 83C246 '..F'
push dx ; 00000D1A 52 'R'
mov di,[0x463] ; 00000D1B 8B3E6304 '.>c.'
push ds ; 00000D1F 1E '.'
mov ds,[cs:0x71e] ; 00000D20 2E8E1E1E07 '.....'
call xf2c ; 00000D25 E80402 '...'
pop ds ; 00000D28 1F '.'
pop dx ; 00000D29 5A 'Z'
pop bx ; 00000D2A 5B '['
pop cx ; 00000D2B 59 'Y'
xd2c: test cx,0x2 ; 00000D2C F7C10200 '....'
jz xd44 ; 00000D30 7412 't.'
push cx ; 00000D32 51 'Q'
push bx ; 00000D33 53 'S'
mov [es:bx+0x2],dx ; 00000D34 26895702 '&.W.'
mov bx,dx ; 00000D38 8BDA '..'
add dx,byte +0x3a ; 00000D3A 83C23A '..:'
push dx ; 00000D3D 52 'R'
call xd9c ; 00000D3E E85B00 '.[.'
pop dx ; 00000D41 5A 'Z'
pop bx ; 00000D42 5B '['
pop cx ; 00000D43 59 'Y'
xd44: test cx,0x4 ; 00000D44 F7C10400 '....'
jz xd00 ; 00000D48 74B6 't.'
mov [es:bx+0x4],dx ; 00000D4A 26895704 '&.W.'
mov bx,dx ; 00000D4E 8BDA '..'
mov di,[0x463] ; 00000D50 8B3E6304 '.>c.'
call xf44 ; 00000D54 E8ED01 '...'
call x2b6e ; 00000D57 E8141E '...'
jmp xcb4 ; 00000D5A E957FF '.W.'
xd5d: test cx,0x1 ; 00000D5D F7C10100 '....'
jz xd74 ; 00000D61 7411 't.'
push cx ; 00000D63 51 'Q'
push bx ; 00000D64 53 'S'
mov bx,[es:bx] ; 00000D65 268B1F '&..'
push ds ; 00000D68 1E '.'
mov ds,[cs:0x71e] ; 00000D69 2E8E1E1E07 '.....'
call x10bd ; 00000D6E E84C03 '.L.'
pop ds ; 00000D71 1F '.'
pop bx ; 00000D72 5B '['
pop cx ; 00000D73 59 'Y'
xd74: test cx,0x2 ; 00000D74 F7C10200 '....'
jz xd85 ; 00000D78 740B 't.'
push cx ; 00000D7A 51 'Q'
push bx ; 00000D7B 53 'S'
mov bx,[es:bx+0x2] ; 00000D7C 268B5F02 '&._.'
call xde1 ; 00000D80 E85E00 '.^.'
pop bx ; 00000D83 5B '['
pop cx ; 00000D84 59 'Y'
xd85: test cx,0x4 ; 00000D85 F7C10400 '....'
jz xd99 ; 00000D89 740E 't.'
mov bx,[es:bx+0x4] ; 00000D8B 268B5F04 '&._.'
mov di,[0x463] ; 00000D8F 8B3E6304 '.>c.'
call x10e5 ; 00000D93 E84F03 '.O.'
jmp xcb4 ; 00000D96 E91BFF '...'
xd99: jmp xd00 ; 00000D99 E964FF '.d.'
xd9c: push es ; 00000D9C 06 '.'
mov di,bx ; 00000D9D 8BFB '..'
mov al,[0x410] ; 00000D9F A01004 '...'
and al,0x30 ; 00000DA2 2430 '$0'
mov [es:di],al ; 00000DA4 268805 '&..'
inc di ; 00000DA7 47 'G'
lea si,[0x449] ; 00000DA8 8D364904 '.6I.'
mov cx,0x1e ; 00000DAC B91E00 '...'
rep movsb ; 00000DAF F3A4 '..'
lea si,[0x484] ; 00000DB1 8D368404 '.6..'
mov cx,0x7 ; 00000DB5 B90700 '...'
rep movsb ; 00000DB8 F3A4 '..'
lea si,[0x4a8] ; 00000DBA 8D36A804 '.6..'
cli ; 00000DBE FA '.'
call xe30 ; 00000DBF E86E00 '.n.'
lea si,[0x14] ; 00000DC2 8D361400 '.6..'
call xe30 ; 00000DC6 E86700 '.g.'
lea si,[0x74] ; 00000DC9 8D367400 '.6t.'
call xe30 ; 00000DCD E86000 '.`.'
lea si,[0x7c] ; 00000DD0 8D367C00 '.6|.'
call xe30 ; 00000DD4 E85900 '.Y.'
lea si,[0x10c] ; 00000DD7 8D360C01 '.6..'
call xe30 ; 00000DDB E85200 '.R.'
sti ; 00000DDE FB '.'
pop es ; 00000DDF 07 '.'
ret ; 00000DE0 C3 '.'
xde1: mov al,[es:bx] ; 00000DE1 268A07 '&..'
and byte [0x410],0xcf ; 00000DE4 80261004CF '.&...'
or [0x410],al ; 00000DE9 08061004 '....'
push es ; 00000DED 06 '.'
mov ax,ds ; 00000DEE 8CD8 '..'
push es ; 00000DF0 06 '.'
pop ds ; 00000DF1 1F '.'
mov si,bx ; 00000DF2 8BF3 '..'
mov es,ax ; 00000DF4 8EC0 '..'
inc si ; 00000DF6 46 'F'
lea di,[0x449] ; 00000DF7 8D3E4904 '.>I.'
mov cx,0x1e ; 00000DFB B91E00 '...'
rep movsb ; 00000DFE F3A4 '..'
lea di,[0x484] ; 00000E00 8D3E8404 '.>..'
mov cx,0x7 ; 00000E04 B90700 '...'
rep movsb ; 00000E07 F3A4 '..'
lea di,[0x4a8] ; 00000E09 8D3EA804 '.>..'
cli ; 00000E0D FA '.'
call xe30 ; 00000E0E E81F00 '...'
lea di,[0x14] ; 00000E11 8D3E1400 '.>..'
call xe30 ; 00000E15 E81800 '...'
lea di,[0x74] ; 00000E18 8D3E7400 '.>t.'
call xe30 ; 00000E1C E81100 '...'
lea di,[0x7c] ; 00000E1F 8D3E7C00 '.>|.'
call xe30 ; 00000E23 E80A00 '.',0x0A,'.'
lea di,[0x10c] ; 00000E26 8D3E0C01 '.>..'
call xe30 ; 00000E2A E80300 '...'
sti ; 00000E2D FB '.'
pop es ; 00000E2E 07 '.'
ret ; 00000E2F C3 '.'
xe30: mov cx,0x4 ; 00000E30 B90400 '...'
rep movsb ; 00000E33 F3A4 '..'
ret ; 00000E35 C3 '.'
xe36: push bp ; 00000E36 55 'U'
push ax ; 00000E37 50 'P'
push ax ; 00000E38 50 'P'
mov bp,0x12b8 ; 00000E39 BDB812 '...'
and ax,0xf ; 00000E3C 250F00 '%..'
shl ax,1 ; 00000E3F D1E0 '..'
add bp,ax ; 00000E41 03E8 '..'
mov bp,[cs:bp+0x0] ; 00000E43 2E8B6E00 '..n.'
pop ax ; 00000E47 58 'X'
xchg al,ah ; 00000E48 86C4 '..'
xor ah,ah ; 00000E4A 32E4 '2.'
shl ax,1 ; 00000E4C D1E0 '..'
add bp,ax ; 00000E4E 03E8 '..'
mov bp,[cs:bp+0x0] ; 00000E50 2E8B6E00 '..n.'
sub bp,0x1342 ; 00000E54 81ED4213 '..B.'
add bx,bp ; 00000E58 03DD '..'
pop ax ; 00000E5A 58 'X'
pop bp ; 00000E5B 5D ']'
ret ; 00000E5C C3 '.'
xe5d: cmp al,0x0 ; 00000E5D 3C00 '<.'
jz xe74 ; 00000E5F 7413 't.'
cmp al,0x2 ; 00000E61 3C02 '<.'
jz xe7b ; 00000E63 7416 't.'
mov bp,font_8x14 ; 00000E65 BD8D3F '..?'
mov bh,0xe ; 00000E68 B70E '..'
cmp ah,0x7 ; 00000E6A 80FC07 '...'
jnz xe83 ; 00000E6D 7514 'u.'
or bl,0x80 ; 00000E6F 80CB80 '...'
jmp short xe83 ; 00000E72 EB0F '..'
xe74: mov bp,font_8x8 ; 00000E74 BD8D37 '..7'
mov bh,0x8 ; 00000E77 B708 '..'
jmp short xe83 ; 00000E79 EB08 '..'
xe7b: mov bp,font_8x16 ; 00000E7B BDBA4E '..N'
mov bh,0x10 ; 00000E7E B710 '..'
or bl,0x80 ; 00000E80 80CB80 '...'
xe83: mov cx,0x100 ; 00000E83 B90001 '...'
mov dx,0x0 ; 00000E86 BA0000 '...'
push cs ; 00000E89 0E '.'
pop ds ; 00000E8A 1F '.'
ret ; 00000E8B C3 '.'
add [bx+si-0x80],al ; 00000E8C 004080 '.@.'
shl byte [bx+si],0x60 ; 00000E8F C02060 '. `'
mov al,[0x51e0] ; 00000E92 A0E051 '..Q'
mov cl,0x5 ; 00000E95 B105 '..'
shl dx,cl ; 00000E97 D3E2 '..'
pop cx ; 00000E99 59 'Y'
mov es,ax ; 00000E9A 8EC0 '..'
mov di,dx ; 00000E9C 8BFA '..'
mov si,bx ; 00000E9E 8BF3 '..'
and si,0x7 ; 00000EA0 81E60700 '....'
mov dh,[cs:si+0xe8c] ; 00000EA4 2E8AB48C0E '.....'
xor dl,dl ; 00000EA9 32D2 '2.'
add di,dx ; 00000EAB 03FA '..'
mov si,bp ; 00000EAD 8BF5 '..'
mov bp,dx ; 00000EAF 8BEA '..'
mov al,bh ; 00000EB1 8AC7 '..'
sub ah,ah ; 00000EB3 2AE4 '*.'
jcxz xec4 ; 00000EB5 E30D '.',0x0D
xeb7: push cx ; 00000EB7 51 'Q'
mov cx,ax ; 00000EB8 8BC8 '..'
rep movsb ; 00000EBA F3A4 '..'
sub di,ax ; 00000EBC 2BF8 '+.'
add di,byte +0x20 ; 00000EBE 83C720 '.. '
pop cx ; 00000EC1 59 'Y'
loop xeb7 ; 00000EC2 E2F3 '..'
xec4: test bl,0x80 ; 00000EC4 F6C380 '...'
jz xee7 ; 00000EC7 741E 't.'
xec9: mov dl,[si] ; 00000EC9 8A14 '..'
or dl,dl ; 00000ECB 0AD2 0x0A,'.'
jz xee7 ; 00000ECD 7418 't.'
xor dh,dh ; 00000ECF 32F6 '2.'
push cx ; 00000ED1 51 'Q'
mov cl,0x5 ; 00000ED2 B105 '..'
shl dx,cl ; 00000ED4 D3E2 '..'
pop cx ; 00000ED6 59 'Y'
add dx,bp ; 00000ED7 03D5 '..'
mov di,dx ; 00000ED9 8BFA '..'
inc si ; 00000EDB 46 'F'
mov cx,ax ; 00000EDC 8BC8 '..'
rep movsb ; 00000EDE F3A4 '..'
sub di,ax ; 00000EE0 2BF8 '+.'
add di,byte +0x20 ; 00000EE2 83C720 '.. '
jmp short xec9 ; 00000EE5 EBE2 '..'
xee7: ret ; 00000EE7 C3 '.'
xee8: push si ; 00000EE8 56 'V'
xchg al,ah ; 00000EE9 86C4 '..'
xor ah,ah ; 00000EEB 32E4 '2.'
mov si,ax ; 00000EED 8BF0 '..'
mov al,[cs:si+0xf07] ; 00000EEF 2E8A84070F '.....'
mov si,ax ; 00000EF4 8BF0 '..'
shl si,1 ; 00000EF6 D1E6 '..'
mov ax,[cs:si+0xeff] ; 00000EF8 2E8B84FF0E '.....'
pop si ; 00000EFD 5E '^'
ret ; 00000EFE C3 '.'
db 0xFF ; 00000EFF FF '.'
dec word [di+0x8d37] ; 00000F00 FF8D378D '..7.'
aas ; 00000F04 3F '?'
mov dx,0x4e ; 00000F05 BA4E00 '.N.'
add [bx+si],al ; 00000F08 0000 '..'
add [bx+di],al ; 00000F0A 0001 '..'
add [bx+di],ax ; 00000F0C 0101 '..'
add [bp+di],al ; 00000F0E 0003 '..'
add [bx+di],ax ; 00000F10 0101 '..'
add [bx+di],ax ; 00000F12 0101 '..'
add [bx+di],ax ; 00000F14 0101 '..'
add al,[bp+si] ; 00000F16 0202 '..'
add ax,[bp+di] ; 00000F18 0303 '..'
add [bx+si+0x56],dx ; 00000F1A 015056 '.PV'
xchg al,ah ; 00000F1D 86C4 '..'
xor ah,ah ; 00000F1F 32E4 '2.'
mov si,ax ; 00000F21 8BF0 '..'
cmp byte [cs:si+0xf07],0x0 ; 00000F23 2E80BC070F00 '......'
pop si ; 00000F29 5E '^'
pop ax ; 00000F2A 58 'X'
ret ; 00000F2B C3 '.'
xf2c: call xff6 ; 00000F2C E8C700 '...'
call xf89 ; 00000F2F E85700 '.W.'
call x1020 ; 00000F32 E8EB00 '...'
mov dx,di ; 00000F35 8BD7 '..'
add dl,0x6 ; 00000F37 80C206 '...'
add bx,byte +0x23 ; 00000F3A 83C323 '..#'
mov bp,0x1 ; 00000F3D BD0100 '...'
call x2f3c ; 00000F40 E8F91F '...'
ret ; 00000F43 C3 '.'
xf44: call xf53 ; 00000F44 E80C00 '...'
mov cx,0x100 ; 00000F47 B90001 '...'
xor di,di ; 00000F4A 33FF '3.'
add bx,byte +0x3 ; 00000F4C 83C303 '...'
call x2ef8 ; 00000F4F E8A61F '...'
ret ; 00000F52 C3 '.'
xf53: mov dx,di ; 00000F53 8BD7 '..'
add dl,0x6 ; 00000F55 80C206 '...'
in al,dx ; 00000F58 EC '.'
mov dl,0xc0 ; 00000F59 B2C0 '..'
mov al,0x14 ; 00000F5B B014 '..'
pushf ; 00000F5D 9C '.'
cli ; 00000F5E FA '.'
out dx,al ; 00000F5F EE '.'
inc dx ; 00000F60 42 'B'
in al,dx ; 00000F61 EC '.'
popf ; 00000F62 9D '.'
mov [es:bx+0x41],al ; 00000F63 26884741 '&.GA'
mov dx,0x3c7 ; 00000F67 BAC703 '...'
in al,dx ; 00000F6A EC '.'
and al,0x1 ; 00000F6B 2401 '$.'
mov [es:bx],al ; 00000F6D 268807 '&..'
xchg al,ah ; 00000F70 86C4 '..'
mov dx,0x3c8 ; 00000F72 BAC803 '...'
in al,dx ; 00000F75 EC '.'
or ah,ah ; 00000F76 0AE4 0x0A,'.'
jz xf7c ; 00000F78 7402 't.'
dec al ; 00000F7A FEC8 '..'
xf7c: mov [es:bx+0x1],al ; 00000F7C 26884701 '&.G.'
mov dx,0x3c6 ; 00000F80 BAC603 '...'
in al,dx ; 00000F83 EC '.'
mov [es:bx+0x2],al ; 00000F84 26884702 '&.G.'
ret ; 00000F88 C3 '.'
xf89: push bx ; 00000F89 53 'S'
mov dx,0x3c4 ; 00000F8A BAC403 '...'
add bx,byte +0x5 ; 00000F8D 83C305 '...'
mov cx,0x4 ; 00000F90 B90400 '...'
mov al,0x1 ; 00000F93 B001 '..'
call x10aa ; 00000F95 E81201 '...'
pop bx ; 00000F98 5B '['
mov dl,0xcc ; 00000F99 B2CC '..'
in al,dx ; 00000F9B EC '.'
mov [es:bx+0x9],al ; 00000F9C 26884709 '&.G.'
mov dl,0xca ; 00000FA0 B2CA '..'
in al,dx ; 00000FA2 EC '.'
mov [es:bx+0x4],al ; 00000FA3 26884704 '&.G.'
mov dx,di ; 00000FA7 8BD7 '..'
push bx ; 00000FA9 53 'S'
add bx,byte +0xa ; 00000FAA 83C30A '..',0x0A
mov cx,0x19 ; 00000FAD B91900 '...'
xor al,al ; 00000FB0 32C0 '2.'
call x10aa ; 00000FB2 E8F500 '...'
pop bx ; 00000FB5 5B '['
mov dx,di ; 00000FB6 8BD7 '..'
add dl,0x6 ; 00000FB8 80C206 '...'
pushf ; 00000FBB 9C '.'
cli ; 00000FBC FA '.'
in al,dx ; 00000FBD EC '.'
push dx ; 00000FBE 52 'R'
mov dl,0xc0 ; 00000FBF B2C0 '..'
mov al,0x10 ; 00000FC1 B010 '..'
out dx,al ; 00000FC3 EE '.'
inc dx ; 00000FC4 42 'B'
in al,dx ; 00000FC5 EC '.'
mov [es:bx+0x33],al ; 00000FC6 26884733 '&.G3'
pop dx ; 00000FCA 5A 'Z'
in al,dx ; 00000FCB EC '.'
push dx ; 00000FCC 52 'R'
mov dl,0xc0 ; 00000FCD B2C0 '..'
mov al,0x12 ; 00000FCF B012 '..'
out dx,al ; 00000FD1 EE '.'
inc dx ; 00000FD2 42 'B'
in al,dx ; 00000FD3 EC '.'
mov [es:bx+0x35],al ; 00000FD4 26884735 '&.G5'
pop dx ; 00000FD8 5A 'Z'
in al,dx ; 00000FD9 EC '.'
mov dl,0xc0 ; 00000FDA B2C0 '..'
mov al,0x13 ; 00000FDC B013 '..'
out dx,al ; 00000FDE EE '.'
inc dx ; 00000FDF 42 'B'
in al,dx ; 00000FE0 EC '.'
popf ; 00000FE1 9D '.'
mov [es:bx+0x36],al ; 00000FE2 26884736 '&.G6'
push bx ; 00000FE6 53 'S'
mov dl,0xce ; 00000FE7 B2CE '..'
add bx,byte +0x37 ; 00000FE9 83C337 '..7'
mov cx,0x9 ; 00000FEC B90900 '...'
xor al,al ; 00000FEF 32C0 '2.'
call x10aa ; 00000FF1 E8B600 '...'
pop bx ; 00000FF4 5B '['
ret ; 00000FF5 C3 '.'
xff6: mov [es:bx+0x40],di ; 00000FF6 26897F40 '&..@'
mov dx,0x3c4 ; 00000FFA BAC403 '...'
in al,dx ; 00000FFD EC '.'
mov [es:bx],al ; 00000FFE 268807 '&..'
mov dx,0x3d4 ; 00001001 BAD403 '...'
in al,dx ; 00001004 EC '.'
mov [es:bx+0x1],al ; 00001005 26884701 '&.G.'
mov dx,0x3ce ; 00001009 BACE03 '...'
in al,dx ; 0000100C EC '.'
mov [es:bx+0x2],al ; 0000100D 26884702 '&.G.'
mov dx,di ; 00001011 8BD7 '..'
add dl,0x6 ; 00001013 80C206 '...'
in al,dx ; 00001016 EC '.'
mov dx,0x3c0 ; 00001017 BAC003 '...'
in al,dx ; 0000101A EC '.'
mov [es:bx+0x3],al ; 0000101B 26884703 '&.G.'
ret ; 0000101F C3 '.'
x1020: mov dx,0x3c4 ; 00001020 BAC403 '...'
mov al,0x2 ; 00001023 B002 '..'
pushf ; 00001025 9C '.'
cli ; 00001026 FA '.'
out dx,al ; 00001027 EE '.'
inc dx ; 00001028 42 'B'
in al,dx ; 00001029 EC '.'
dec dx ; 0000102A 4A 'J'
push ax ; 0000102B 50 'P'
mov ax,0xf02 ; 0000102C B8020F '...'
out dx,ax ; 0000102F EF '.'
mov al,0x4 ; 00001030 B004 '..'
out dx,al ; 00001032 EE '.'
inc dx ; 00001033 42 'B'
in al,dx ; 00001034 EC '.'
dec dx ; 00001035 4A 'J'
push ax ; 00001036 50 'P'
mov ax,0x704 ; 00001037 B80407 '...'
out dx,ax ; 0000103A EF '.'
mov dl,0xce ; 0000103B B2CE '..'
mov al,0x6 ; 0000103D B006 '..'
out dx,al ; 0000103F EE '.'
inc dx ; 00001040 42 'B'
in al,dx ; 00001041 EC '.'
dec dx ; 00001042 4A 'J'
push ax ; 00001043 50 'P'
mov ax,0x406 ; 00001044 B80604 '...'
out dx,ax ; 00001047 EF '.'
mov al,0x5 ; 00001048 B005 '..'
out dx,al ; 0000104A EE '.'
inc dx ; 0000104B 42 'B'
in al,dx ; 0000104C EC '.'
dec dx ; 0000104D 4A 'J'
push ax ; 0000104E 50 'P'
mov ax,0x105 ; 0000104F B80501 '...'
out dx,ax ; 00001052 EF '.'
mov al,0x4 ; 00001053 B004 '..'
out dx,al ; 00001055 EE '.'
inc dx ; 00001056 42 'B'
in al,dx ; 00001057 EC '.'
dec dx ; 00001058 4A 'J'
push ax ; 00001059 50 'P'
mov si,0xffff ; 0000105A BEFFFF '...'
mov byte [si],0x0 ; 0000105D C60400 '...'
mov ax,0x4 ; 00001060 B80400 '...'
out dx,ax ; 00001063 EF '.'
mov al,[si] ; 00001064 8A04 '..'
mov [es:bx+0x42],al ; 00001066 26884742 '&.GB'
mov ax,0x104 ; 0000106A B80401 '...'
out dx,ax ; 0000106D EF '.'
mov al,[si] ; 0000106E 8A04 '..'
mov [es:bx+0x43],al ; 00001070 26884743 '&.GC'
mov ax,0x204 ; 00001074 B80402 '...'
out dx,ax ; 00001077 EF '.'
mov al,[si] ; 00001078 8A04 '..'
mov [es:bx+0x44],al ; 0000107A 26884744 '&.GD'
mov ax,0x304 ; 0000107E B80403 '...'
out dx,ax ; 00001081 EF '.'
mov al,[si] ; 00001082 8A04 '..'
mov [es:bx+0x45],al ; 00001084 26884745 '&.GE'
pop ax ; 00001088 58 'X'
xchg al,ah ; 00001089 86C4 '..'
mov al,0x4 ; 0000108B B004 '..'
out dx,ax ; 0000108D EF '.'
pop ax ; 0000108E 58 'X'
xchg al,ah ; 0000108F 86C4 '..'
mov al,0x5 ; 00001091 B005 '..'
out dx,ax ; 00001093 EF '.'
pop ax ; 00001094 58 'X'
xchg al,ah ; 00001095 86C4 '..'
mov al,0x6 ; 00001097 B006 '..'
out dx,ax ; 00001099 EF '.'
mov dl,0xc4 ; 0000109A B2C4 '..'
pop ax ; 0000109C 58 'X'
xchg al,ah ; 0000109D 86C4 '..'
mov al,0x4 ; 0000109F B004 '..'
out dx,ax ; 000010A1 EF '.'
pop ax ; 000010A2 58 'X'
xchg al,ah ; 000010A3 86C4 '..'
mov al,0x2 ; 000010A5 B002 '..'
out dx,ax ; 000010A7 EF '.'
popf ; 000010A8 9D '.'
ret ; 000010A9 C3 '.'
x10aa: pushf ; 000010AA 9C '.'
cli ; 000010AB FA '.'
out dx,al ; 000010AC EE '.'
inc dx ; 000010AD 42 'B'
push ax ; 000010AE 50 'P'
in al,dx ; 000010AF EC '.'
mov [es:bx],al ; 000010B0 268807 '&..'
pop ax ; 000010B3 58 'X'
popf ; 000010B4 9D '.'
dec dx ; 000010B5 4A 'J'
inc al ; 000010B6 FEC0 '..'
inc bx ; 000010B8 43 'C'
dec cx ; 000010B9 49 'I'
jnz x10aa ; 000010BA 75EE 'u.'
ret ; 000010BC C3 '.'
x10bd: call x11bc ; 000010BD E8FC00 '...'
mov di,[es:bx+0x40] ; 000010C0 268B7F40 '&..@'
call x1127 ; 000010C4 E86000 '.`.'
mov dx,di ; 000010C7 8BD7 '..'
add dl,0x6 ; 000010C9 80C206 '...'
mov al,[es:bx+0x4] ; 000010CC 268A4704 '&.G.'
out dx,al ; 000010D0 EE '.'
push bx ; 000010D1 53 'S'
add bx,byte +0x23 ; 000010D2 83C323 '..#'
mov cx,0x10 ; 000010D5 B91000 '...'
xor di,di ; 000010D8 33FF '3.'
mov bp,0x1 ; 000010DA BD0100 '...'
call x2f11 ; 000010DD E8311E '.1.'
pop bx ; 000010E0 5B '['
call x1194 ; 000010E1 E8B000 '...'
ret ; 000010E4 C3 '.'
x10e5: mov al,[es:bx+0x2] ; 000010E5 268A4702 '&.G.'
mov dx,0x3c6 ; 000010E9 BAC603 '...'
out dx,al ; 000010EC EE '.'
push di ; 000010ED 57 'W'
mov cx,0x100 ; 000010EE B90001 '...'
xor di,di ; 000010F1 33FF '3.'
push bx ; 000010F3 53 'S'
add bx,byte +0x3 ; 000010F4 83C303 '...'
mov dx,0x0 ; 000010F7 BA0000 '...'
call x2ed3 ; 000010FA E8D61D '...'
pop bx ; 000010FD 5B '['
pop di ; 000010FE 5F '_'
call x1103 ; 000010FF E80100 '...'
ret ; 00001102 C3 '.'
x1103: mov dx,di ; 00001103 8BD7 '..'
add dl,0x6 ; 00001105 80C206 '...'
in al,dx ; 00001108 EC '.'
mov dl,0xc0 ; 00001109 B2C0 '..'
mov ah,[es:bx] ; 0000110B 268A27 '&.',0x27
mov al,0x14 ; 0000110E B014 '..'
out dx,ax ; 00001110 EF '.'
mov al,[es:bx+0x1] ; 00001111 268A4701 '&.G.'
mov ah,[es:bx] ; 00001115 268A27 '&.',0x27
or ah,ah ; 00001118 0AE4 0x0A,'.'
jz x1122 ; 0000111A 7406 't.'
mov dx,0x3c7 ; 0000111C BAC703 '...'
out dx,al ; 0000111F EE '.'
jmp short x1126 ; 00001120 EB04 '..'
x1122: mov dx,0x3c8 ; 00001122 BAC803 '...'
out dx,al ; 00001125 EE '.'
x1126: ret ; 00001126 C3 '.'
;
; Programs the card using data from [BX]; CRTC port address is in DI (0x3B4 or 0x3D4).
;
; Writes 0x01 to SEQ register 0x00 (SEQ.RESET).
; Writes values starting at [BX+0x05] to SEQ registers 0x01-0x04.
; Writes [BX+0x09] to Miscellaneous Output register (MISC).
; Writes 0x03 to SEQ register 0x00 (SEQ.RESET).
; Writes 0x00 to CRTC register 0x11 (CRTC.VERT_RETRACE_END).
; Writes values starting at [BX+0x0A] to CRTC registers 0x00-0x18.
; Writes values starting at [BX+0x33] to ATC registers 0x10, 0x12 and 0x13
; Writes values starting at [BX+0x37] to GRC registers 0x00-0x08.
;
x1127: mov dx,0x3c4 ; (DX) == SEQ port address (0x3C4)
mov ax,0x100 ; 0000112A B80001 '...'
pushf ; 0000112D 9C '.'
cli ; 0000112E FA '.'
out dx,ax ; 0000112F EF '.'
push bx ; 00001130 53 'S'
add bx,byte +0x5 ; 00001131 83C305 '...'
mov cx,0x4 ; 00001134 B90400 '...'
mov al,0x1 ; 00001137 B001 '..'
call x1201 ; 00001139 E8C500 '...'
pop bx ; 0000113C 5B '['
mov dl,0xc2 ; (DX) == MISC port address (0x3C2)
mov al,[es:bx+0x9] ; 0000113F 268A4709 '&.G.'
out dx,al ; 00001143 EE '.'
mov dl,0xc4 ; (DX) == SEQ port address (0x3C4)
mov ax,0x300 ; 00001146 B80003 '...'
out dx,ax ; 00001149 EF '.'
popf ; 0000114A 9D '.'
mov dx,di ; (DX) == CRTC port address (0x3B4 or 0x3D4)
mov al,0x11 ; 0000114D B011 '..'
xor ah,ah ; 0000114F 32E4 '2.'
out dx,ax ; 00001151 EF '.'
push bx ; 00001152 53 'S'
add bx,byte +0xa ; 00001153 83C30A '..',0x0A
mov cx,0x19 ; 00001156 B91900 '...'
xor al,al ; 00001159 32C0 '2.'
call x1201 ; 0000115B E8A300 '...'
pop bx ; 0000115E 5B '['
mov dx,di ; 0000115F 8BD7 '..'
add dl,0x6 ; (DX) == STATUS1 port address (0x3BA or 0x3DA)
push dx ; 00001164 52 'R'
pushf ; 00001165 9C '.'
cli ; 00001166 FA '.'
in al,dx ; 00001167 EC '.'
mov dl,0xc0 ; (DX) == ATC port address (0x3C0)
mov al,0x10 ; 0000116A B010 '..'
out dx,al ; 0000116C EE '.'
mov al,[es:bx+0x33] ; 0000116D 268A4733 '&.G3'
out dx,al ; 00001171 EE '.'
mov al,0x12 ; 00001172 B012 '..'
out dx,al ; 00001174 EE '.'
mov al,[es:bx+0x35] ; 00001175 268A4735 '&.G5'
out dx,al ; 00001179 EE '.'
mov al,0x13 ; 0000117A B013 '..'
out dx,al ; 0000117C EE '.'
mov al,[es:bx+0x36] ; 0000117D 268A4736 '&.G6'
out dx,al ; 00001181 EE '.'
popf ; 00001182 9D '.'
push bx ; 00001183 53 'S'
mov dl,0xce ; (DX) == GRC port address (0x3CE)
add bx,byte +0x37 ; 00001186 83C337 '..7'
mov cx,0x9 ; 00001189 B90900 '...'
xor al,al ; 0000118C 32C0 '2.'
call x1201 ; 0000118E E87000 '.p.'
pop bx ; 00001191 5B '['
pop dx ; 00001192 5A 'Z'
ret ; 00001193 C3 '.'
x1194: mov dx,0x3c4 ; 00001194 BAC403 '...'
mov al,[es:bx] ; 00001197 268A07 '&..'
out dx,al ; 0000119A EE '.'
mov dx,0x3d4 ; 0000119B BAD403 '...'
mov al,[es:bx+0x1] ; 0000119E 268A4701 '&.G.'
out dx,al ; 000011A2 EE '.'
mov dx,0x3ce ; 000011A3 BACE03 '...'
mov al,[es:bx+0x2] ; 000011A6 268A4702 '&.G.'
out dx,al ; 000011AA EE '.'
mov dx,[es:bx+0x40] ; 000011AB 268B5740 '&.W@'
add dl,0x6 ; 000011AF 80C206 '...'
in al,dx ; 000011B2 EC '.'
mov dx,0x3c0 ; 000011B3 BAC003 '...'
mov al,[es:bx+0x3] ; 000011B6 268A4703 '&.G.'
out dx,al ; 000011BA EE '.'
ret ; 000011BB C3 '.'
x11bc: mov dx,0x3c4 ; 000011BC BAC403 '...'
mov ax,0x704 ; 000011BF B80407 '...'
out dx,ax ; 000011C2 EF '.'
mov dl,0xce ; 000011C3 B2CE '..'
mov ax,0x406 ; 000011C5 B80604 '...'
out dx,ax ; 000011C8 EF '.'
mov ax,0x5 ; 000011C9 B80500 '...'
out dx,ax ; 000011CC EF '.'
mov si,0xffff ; 000011CD BEFFFF '...'
mov dl,0xc4 ; 000011D0 B2C4 '..'
mov ax,0x2 ; 000011D2 B80200 '...'
out dx,ax ; 000011D5 EF '.'
mov al,[es:bx+0x42] ; 000011D6 268A4742 '&.GB'
mov [si],al ; 000011DA 8804 '..'
mov ax,0x102 ; 000011DC B80201 '...'
out dx,ax ; 000011DF EF '.'
mov al,[es:bx+0x43] ; 000011E0 268A4743 '&.GC'
mov [si],al ; 000011E4 8804 '..'
mov ax,0x202 ; 000011E6 B80202 '...'
out dx,ax ; 000011E9 EF '.'
mov al,[es:bx+0x44] ; 000011EA 268A4744 '&.GD'
mov [si],al ; 000011EE 8804 '..'
mov ax,0x402 ; 000011F0 B80204 '...'
out dx,ax ; 000011F3 EF '.'
mov al,[es:bx+0x45] ; 000011F4 268A4745 '&.GE'
mov [si],al ; 000011F8 8804 '..'
mov ax,0xf02 ; 000011FA B8020F '...'
out dx,ax ; 000011FD EF '.'
mov al,[si] ; 000011FE 8A04 '..'
ret ; 00001200 C3 '.'
x1201: mov ah,[es:bx] ; 00001201 268A27 '&.',0x27
out dx,ax ; 00001204 EF '.'
inc al ; 00001205 FEC0 '..'
inc bx ; 00001207 43 'C'
dec cx ; 00001208 49 'I'
jnz x1201 ; 00001209 75F6 'u.'
ret ; 0000120B C3 '.'
x120c: push ax ; 0000120C 50 'P'
push dx ; 0000120D 52 'R'
mov dx,0x3c4 ; 0000120E BAC403 '...'
mov ax,0x402 ; 00001211 B80204 '...'
out dx,ax ; 00001214 EF '.'
mov ax,0x704 ; 00001215 B80407 '...'
out dx,ax ; 00001218 EF '.'
mov dl,0xce ; 00001219 B2CE '..'
mov ax,0x5 ; 0000121B B80500 '...'
out dx,ax ; 0000121E EF '.'
mov ax,0x406 ; 0000121F B80604 '...'
out dx,ax ; 00001222 EF '.'
mov ax,0x204 ; 00001223 B80402 '...'
out dx,ax ; 00001226 EF '.'
mov dx,cx ; 00001227 8BD1 '..'
and dl,0xf0 ; 00001229 80E2F0 '...'
or dl,0xa ; 0000122C 80CA0A '..',0x0A
in al,dx ; 0000122F EC '.'
mov dl,0xc0 ; 00001230 B2C0 '..'
mov al,0x0 ; 00001232 B000 '..'
out dx,al ; 00001234 EE '.'
pop dx ; 00001235 5A 'Z'
pop ax ; 00001236 58 'X'
ret ; 00001237 C3 '.'
x1238: push ax ; 00001238 50 'P'
push dx ; 00001239 52 'R'
mov dx,0x3c4 ; 0000123A BAC403 '...'
mov ax,0x302 ; 0000123D B80203 '...'
out dx,ax ; 00001240 EF '.'
mov ax,0x304 ; 00001241 B80403 '...'
out dx,ax ; 00001244 EF '.'
mov dl,0xce ; 00001245 B2CE '..'
mov ax,0x1005 ; 00001247 B80510 '...'
out dx,ax ; 0000124A EF '.'
mov al,0x6 ; 0000124B B006 '..'
mov ah,0xa ; 0000124D B40A '.',0x0A
cmp cx,0x3b4 ; 0000124F 81F9B403 '....'
jz x1257 ; 00001253 7402 't.'
mov ah,0xe ; 00001255 B40E '..'
x1257: out dx,ax ; 00001257 EF '.'
mov ax,0x4 ; 00001258 B80400 '...'
out dx,ax ; 0000125B EF '.'
pop dx ; 0000125C 5A 'Z'
pop ax ; 0000125D 58 'X'
ret ; 0000125E C3 '.'
x125f: mov dx,0x3c4 ; 0000125F BAC403 '...'
mov al,0x3 ; 00001262 B003 '..'
mov ah,bl ; 00001264 8AE3 '..'
out dx,ax ; 00001266 EF '.'
ret ; 00001267 C3 '.'
x1268: mov al,[es:bx+si] ; 00001268 268A00 '&..'
cmp al,0xff ; 0000126B 3CFF '<.'
jz x1276 ; 0000126D 7407 't.'
cmp al,ah ; 0000126F 3AC4 ':.'
jz x1278 ; 00001271 7405 't.'
inc si ; 00001273 46 'F'
jmp short x1268 ; 00001274 EBF2 '..'
x1276: stc ; 00001276 F9 '.'
ret ; 00001277 C3 '.'
x1278: clc ; 00001278 F8 '.'
ret ; 00001279 C3 '.'
x127a: mov dx,0x3c4 ; 0000127A BAC403 '...'
mov al,0x1 ; 0000127D B001 '..'
out dx,al ; 0000127F EE '.'
inc dx ; 00001280 42 'B'
in al,dx ; 00001281 EC '.'
push ax ; 00001282 50 'P'
and ax,0x20df ; 00001283 25DF20 '%. '
or ah,al ; 00001286 0AE0 0x0A,'.'
dec dx ; 00001288 4A 'J'
mov al,0x1 ; 00001289 B001 '..'
out dx,ax ; 0000128B EF '.'
pop ax ; 0000128C 58 'X'
xchg al,ah ; 0000128D 86C4 '..'
ret ; 0000128F C3 '.'
db 0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x01,0x00
db 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x03,0x00,0x03,0x00
db 0x03,0x00,0x03,0x00,0x03,0x00,0x04,0x00,0xC0,0x12,0xE8,0x12,0x0A,0x13,0x1C,0x13
db 0x42,0x13,0x82,0x13,0xC2,0x13,0x02,0x14,0x42,0x14,0x82,0x14,0xC2,0x14,0x00,0x00
db 0x00,0x00,0x82,0x15,0xC2,0x15,0x02,0x16,0x42,0x16,0x82,0x16,0xC2,0x16,0x00,0x00
db 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x1A,0x02,0x18,0x42,0x18,0x82,0x18,0xC2,0x18
db 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
db 0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x17,0xC2,0x17,0x02,0x19,0x02,0x19,0x42,0x19
db 0x42,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x19,0x42,0x15,0x00,0x00,0x00,0x00
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC2,0x19
db 0x02,0x1A,0x28,0x18,0x08,0x00,0x08,0x09,0x03,0x00,0x02,0x63,0x2D,0x27,0x28,0x90
db 0x2B,0xA0,0xBF,0x1F,0x00,0xC7,0x06,0x07,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x14
db 0x1F,0x96,0xB9,0xA3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x10,0x11,0x12
db 0x13,0x14,0x15,0x16,0x17,0x08,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0E
db 0x00,0xFF,0x28,0x18,0x08,0x00,0x08,0x09,0x03,0x00,0x02,0x63,0x2D,0x27,0x28,0x90
db 0x2B,0xA0,0xBF,0x1F,0x00,0xC7,0x06,0x07,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x14
db 0x1F,0x96,0xB9,0xA3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x10,0x11,0x12
db 0x13,0x14,0x15,0x16,0x17,0x08,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0E
db 0x00,0xFF,0x50,0x18,0x08,0x00,0x10,0x01,0x03,0x00,0x02,0x63,0x5F,0x4F,0x50,0x82
db 0x55,0x81,0xBF,0x1F,0x00,0xC7,0x06,0x07,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x28
db 0x1F,0x96,0xB9,0xA3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x10,0x11,0x12
db 0x13,0x14,0x15,0x16,0x17,0x08,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0E
db 0x00,0xFF,0x50,0x18,0x08,0x00,0x10,0x01,0x03,0x00,0x02,0x63,0x5F,0x4F,0x50,0x82
db 0x55,0x81,0xBF,0x1F,0x00,0xC7,0x06,0x07,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x28
db 0x1F,0x96,0xB9,0xA3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x10,0x11,0x12
db 0x13,0x14,0x15,0x16,0x17,0x08,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0E
db 0x00,0xFF,0x28,0x18,0x08,0x00,0x40,0x09,0x03,0x00,0x02,0x63,0x2D,0x27,0x28,0x90
db 0x2B,0x80,0xBF,0x1F,0x00,0xC1,0x00,0x00,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x14
db 0x00,0x96,0xB9,0xA2,0xFF,0x00,0x13,0x15,0x17,0x02,0x04,0x06,0x07,0x10,0x11,0x12
db 0x13,0x14,0x15,0x16,0x17,0x01,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x0F
db 0x00,0xFF,0x28,0x18,0x08,0x00,0x40,0x09,0x03,0x00,0x02,0x63,0x2D,0x27,0x28,0x90
db 0x2B,0x80,0xBF,0x1F,0x00,0xC1,0x00,0x00,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x14
db 0x00,0x96,0xB9,0xA2,0xFF,0x00,0x13,0x15,0x17,0x02,0x04,0x06,0x07,0x10,0x11,0x12
db 0x13,0x14,0x15,0x16,0x17,0x01,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x0F
db 0x00,0xFF,0x50,0x18,0x08,0x00,0x40,0x01,0x01,0x00,0x06,0x63,0x5F,0x4F,0x50,0x82
db 0x54,0x80,0xBF,0x1F,0x00,0xC1,0x00,0x00,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x28
db 0x00,0x96,0xB9,0xC2,0xFF,0x00,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17
db 0x17,0x17,0x17,0x17,0x17,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0D
db 0x00,0xFF,0x50,0x18,0x0E,0x00,0x10,0x00,0x03,0x00,0x03,0xA6,0x5F,0x4F,0x50,0x82
db 0x55,0x81,0xBF,0x1F,0x00,0x4D,0x0B,0x0C,0x00,0x00,0x00,0x00,0x83,0x85,0x5D,0x28
db 0x0D,0x63,0xBA,0xA3,0xFF,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x18,0x18
db 0x18,0x18,0x18,0x18,0x18,0x0E,0x00,0x0F,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x0A
db 0x00,0xFF,0x50,0x18,0x10,0x00,0x7D,0x21,0x0F,0x00,0x06,0x63,0x5F,0x4F,0x50,0x82
db 0x55,0x81,0xBF,0x1F,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x28
db 0x1F,0x96,0xB9,0xE3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x38,0x39,0x3A
db 0x3B,0x3C,0x3D,0x3E,0x3F,0x01,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05
db 0x0F,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
db 0x00,0x00,0x28,0x18,0x08,0x00,0x40,0x00,0x00,0x00,0x03,0x23,0x37,0x27,0x2D,0x37
db 0x31,0x15,0x04,0x11,0x00,0x47,0x06,0x07,0x00,0x00,0x00,0x00,0xE1,0x24,0xC7,0x14
db 0x08,0xE0,0xF0,0xA3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x10,0x11,0x12
db 0x13,0x14,0x15,0x16,0x17,0x08,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0E
db 0x00,0xFF,0x50,0x00,0x00,0x00,0x00,0x29,0x0F,0x00,0x06,0x62,0x5F,0x4F,0x50,0x82
db 0x55,0x81,0xBF,0x1F,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x28
db 0x1F,0x96,0xB9,0xE3,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
db 0x00,0x00,0x00,0x00,0x3F,0x01,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x08,0x05
db 0x0F,0xFF,0x50,0x00,0x00,0x00,0x00,0x29,0x0F,0x00,0x06,0x63,0x5F,0x4F,0x50,0x82
db 0x55,0x81,0xBF,0x1F,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x28
db 0x1F,0x96,0xB9,0xE3,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
db 0x00,0x00,0x00,0x00,0x3F,0x01,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x08,0x05
db 0x0F,0xFF,0x28,0x18,0x08,0x00,0x20,0x09,0x0F,0x00,0x06,0x63,0x2D,0x27,0x28,0x90
db 0x2B,0x80,0xBF,0x1F,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x14
db 0x00,0x96,0xB9,0xE3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x10,0x11,0x12
db 0x13,0x14,0x15,0x16,0x17,0x01,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05
db 0x0F,0xFF,0x50,0x18,0x08,0x00,0x40,0x01,0x0F,0x00,0x06,0x63,0x5F,0x4F,0x50,0x82
db 0x54,0x80,0xBF,0x1F,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x28
db 0x00,0x96,0xB9,0xE3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x10,0x11,0x12
db 0x13,0x14,0x15,0x16,0x17,0x01,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05
db 0x0F,0xFF,0x50,0x18,0x0E,0x00,0x80,0x05,0x0F,0x00,0x00,0xA2,0x60,0x4F,0x56,0x1A
db 0x50,0xE0,0x70,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5E,0x2E,0x5D,0x14
db 0x00,0x5E,0x6E,0x8B,0xFF,0x00,0x08,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x08,0x00
db 0x00,0x00,0x18,0x00,0x00,0x0B,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x07
db 0x0F,0xFF,0x50,0x18,0x0E,0x00,0x80,0x05,0x0F,0x00,0x00,0xA7,0x5B,0x4F,0x53,0x17
db 0x50,0xBA,0x6C,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5E,0x2B,0x5D,0x14
db 0x0F,0x5F,0x0A,0x8B,0xFF,0x00,0x01,0x00,0x00,0x04,0x07,0x00,0x00,0x00,0x01,0x00
db 0x00,0x04,0x07,0x00,0x00,0x01,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x07
db 0x0F,0xFF,0x50,0x18,0x0E,0x00,0x80,0x01,0x0F,0x00,0x06,0xA2,0x5F,0x4F,0x50,0x82
db 0x54,0x80,0xBF,0x1F,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x85,0x5D,0x28
db 0x0F,0x63,0xBA,0xE3,0xFF,0x00,0x08,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x08,0x00
db 0x00,0x00,0x18,0x00,0x00,0x0B,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05
db 0x05,0xFF,0x50,0x18,0x0E,0x00,0x80,0x01,0x0F,0x00,0x06,0xA3,0x5F,0x4F,0x50,0x82
db 0x54,0x80,0xBF,0x1F,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x85,0x5D,0x28
db 0x0F,0x63,0xBA,0xE3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x38,0x39,0x3A
db 0x3B,0x3C,0x3D,0x3E,0x3F,0x01,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05
db 0x0F,0xFF,0x28,0x18,0x0E,0x00,0x08,0x09,0x03,0x00,0x02,0xA3,0x2D,0x27,0x28,0x90
db 0x2B,0xA0,0xBF,0x1F,0x00,0x4D,0x0B,0x0C,0x00,0x00,0x00,0x00,0x83,0x85,0x5D,0x14
db 0x1F,0x63,0xBA,0xA3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x38,0x39,0x3A
db 0x3B,0x3C,0x3D,0x3E,0x3F,0x08,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0E
db 0x00,0xFF,0x28,0x18,0x0E,0x00,0x08,0x09,0x03,0x00,0x02,0xA3,0x2D,0x27,0x28,0x90
db 0x2B,0xA0,0xBF,0x1F,0x00,0x4D,0x0B,0x0C,0x00,0x00,0x00,0x00,0x83,0x85,0x5D,0x14
db 0x1F,0x63,0xBA,0xA3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x38,0x39,0x3A
db 0x3B,0x3C,0x3D,0x3E,0x3F,0x08,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0E
db 0x00,0xFF,0x50,0x18,0x0E,0x00,0x10,0x01,0x03,0x00,0x02,0xA3,0x5F,0x4F,0x50,0x82
db 0x55,0x81,0xBF,0x1F,0x00,0x4D,0x0B,0x0C,0x00,0x00,0x00,0x00,0x83,0x85,0x5D,0x28
db 0x1F,0x63,0xBA,0xA3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x38,0x39,0x3A
db 0x3B,0x3C,0x3D,0x3E,0x3F,0x08,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0E
db 0x00,0xFF,0x50,0x18,0x0E,0x00,0x10,0x01,0x03,0x00,0x02,0xA3,0x5F,0x4F,0x50,0x82
db 0x55,0x81,0xBF,0x1F,0x00,0x4D,0x0B,0x0C,0x00,0x00,0x00,0x00,0x83,0x85,0x5D,0x28
db 0x1F,0x63,0xBA,0xA3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x38,0x39,0x3A
db 0x3B,0x3C,0x3D,0x3E,0x3F,0x08,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0E
db 0x00,0xFF,0x28,0x18,0x10,0x00,0x08,0x08,0x03,0x00,0x02,0x67,0x2D,0x27,0x28,0x90
db 0x2B,0xA0,0xBF,0x1F,0x00,0x4F,0x0D,0x0E,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x14
db 0x1F,0x96,0xB9,0xA3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x38,0x39,0x3A
db 0x3B,0x3C,0x3D,0x3E,0x3F,0x0C,0x00,0x0F,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x0E
db 0x00,0xFF,0x50,0x18,0x10,0x00,0x10,0x00,0x03,0x00,0x02,0x67,0x5F,0x4F,0x50,0x82
db 0x55,0x81,0xBF,0x1F,0x00,0x4F,0x0D,0x0E,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x28
db 0x1F,0x96,0xB9,0xA3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x38,0x39,0x3A
db 0x3B,0x3C,0x3D,0x3E,0x3F,0x0C,0x00,0x0F,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x0E
db 0x00,0xFF,0x50,0x18,0x10,0x00,0x10,0x00,0x03,0x00,0x02,0x66,0x5F,0x4F,0x50,0x82
db 0x55,0x81,0xBF,0x1F,0x00,0x4F,0x0D,0x0E,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x28
db 0x0F,0x96,0xB9,0xA3,0xFF,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x18,0x18
db 0x18,0x18,0x18,0x18,0x18,0x0E,0x00,0x0F,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x0A
db 0x00,0xFF,0x50,0x1D,0x10,0x00,0xA0,0x01,0x0F,0x00,0x06,0xE3,0x5F,0x4F,0x50,0x82
db 0x54,0x80,0x0B,0x3E,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xEA,0x8C,0xDF,0x28
db 0x00,0xE7,0x04,0xC3,0xFF,0x00,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F
db 0x3F,0x3F,0x3F,0x3F,0x3F,0x01,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05
db 0x01,0xFF,0x50,0x1D,0x10,0x00,0xA0,0x01,0x0F,0x00,0x06,0xE3,0x5F,0x4F,0x50,0x82
db 0x54,0x80,0x0B,0x3E,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xEA,0x8C,0xDF,0x28
db 0x00,0xE7,0x04,0xE3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x38,0x39,0x3A
db 0x3B,0x3C,0x3D,0x3E,0x3F,0x01,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05
db 0x0F,0xFF,0x28,0x18,0x08,0x00,0x20,0x01,0x0F,0x00,0x0E,0x63,0x5F,0x4F,0x50,0x82
db 0x54,0x80,0xBF,0x1F,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x28
db 0x40,0x96,0xB9,0xA3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A
db 0x0B,0x0C,0x0D,0x0E,0x0F,0x41,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x05
db 0x0F,0xFF
push ax ; 00001A82 50 'P'
and al,0x7f ; 00001A83 247F '$.'
cmp al,0x13 ; 00001A85 3C13 '<.'
pop ax ; 00001A87 58 'X'
ja x1aa2 ; 00001A88 7718 'w.'
push ax ; 00001A8A 50 'P'
and al,0x80 ; 00001A8B 2480 '$.'
and byte [0x487],0x7f ; 00001A8D 802687047F '.&...'
or [0x487],al ; 00001A92 08068704 '....'
pop ax ; 00001A96 58 'X'
and al,0x7f ; 00001A97 247F '$.'
cmp al,[0x449] ; 00001A99 3A064904 ':.I.'
jnz x1aa5 ; 00001A9D 7506 'u.'
jmp x1b38 ; 00001A9F E99600 '...'
x1aa2: jmp x713 ; 00001AA2 E96EEC '.n.'
x1aa5: test byte [0x489],0x1 ; 00001AA5 F606890401 '.....'
jnz x1aaf ; 00001AAA 7503 'u.'
jmp x1b38 ; 00001AAC E98900 '...'
x1aaf: mov bl,[0x488] ; 00001AAF 8A1E8804 '....'
and bx,0xf ; 00001AB3 81E30F00 '....'
mov bl,[cs:bx+0x1e88] ; 00001AB7 2E8A9F881E '.....'
mov bh,bl ; 00001ABC 8AFB '..'
mov dx,[0x463] ; 00001ABE 8B166304 '..c.'
cmp al,0x7 ; 00001AC2 3C07 '<.'
jz x1aff ; 00001AC4 7439 't9'
cmp al,0xf ; 00001AC6 3C0F '<.'
jz x1aff ; 00001AC8 7435 't5'
cmp dx,0x3d4 ; 00001ACA 81FAD403 '....'
jz x1b38 ; 00001ACE 7468 'th'
mov ah,[0x410] ; 00001AD0 8A261004 '.&..'
and ah,0x30 ; 00001AD4 80E430 '..0'
cmp ah,0x30 ; 00001AD7 80FC30 '..0'
jz x1afb ; 00001ADA 741F 't.'
and byte [0x487],0xfd ; 00001ADC 80268704FD '.&...'
mov dx,0x3d4 ; 00001AE1 BAD403 '...'
cmp bl,0xff ; 00001AE4 80FBFF '...'
nop ; 00001AE7 90 '.'
jz x1b38 ; 00001AE8 744E 'tN'
mov bh,[0x489] ; 00001AEA 8A3E8904 '.>..'
shl bh,1 ; 00001AEE D0E7 '..'
cmc ; 00001AF0 F5 '.'
adc bl,0x0 ; 00001AF1 80D300 '...'
and byte [0x489],0x7f ; 00001AF4 802689047F '.&...'
jmp short x1b2b ; 00001AF9 EB30 '.0'
x1afb: mov al,0x7 ; 00001AFB B007 '..'
jmp short x1b38 ; 00001AFD EB39 '.9'
x1aff: cmp dx,0x3b4 ; 00001AFF 81FAB403 '....'
jz x1b38 ; 00001B03 7433 't3'
mov ah,[0x410] ; 00001B05 8A261004 '.&..'
and ah,0x30 ; 00001B09 80E430 '..0'
cmp ah,0x30 ; 00001B0C 80FC30 '..0'
jnz x1b36 ; 00001B0F 7525 'u%'
or byte [0x487],0x2 ; 00001B11 800E870402 '.....'
mov dx,0x3b4 ; 00001B16 BAB403 '...'
cmp bl,0xff ; 00001B19 80FBFF '...'
nop ; 00001B1C 90 '.'
jz x1b38 ; 00001B1D 7419 't.'
and bh,0x80 ; 00001B1F 80E780 '...'
and byte [0x489],0x7f ; 00001B22 802689047F '.&...'
or [0x489],bh ; 00001B27 083E8904 '.>..'
x1b2b: and byte [0x488],0xf0 ; 00001B2B 80268804F0 '.&...'
or [0x488],bl ; 00001B30 081E8804 '....'
jmp short x1b38 ; 00001B34 EB02 '..'
x1b36: mov al,0x0 ; 00001B36 B000 '..'
x1b38: cli ; 00001B38 FA '.'
mov word [0x10c],font_8x8 ; 00001B39 C7060C018D37 '.....7'
mov [0x10e],cs ; 00001B3F 8C0E0E01 '....'
sti ; 00001B43 FB '.'
and byte [0x487],0xf3 ; 00001B44 80268704F3 '.&...'
mov [0x449],al ; 00001B49 A24904 '.I.'
mov ah,[0x410] ; 00001B4C 8A261004 '.&..'
and ah,0x30 ; 00001B50 80E430 '..0'
cmp ah,0x30 ; 00001B53 80FC30 '..0'
jnz x1bbd ; 00001B56 7565 'ue'
test byte [0x487],0x2 ; 00001B58 F606870402 '.....'
jz x1b76 ; 00001B5D 7417 't.'
mov dx,0x3b4 ; 00001B5F BAB403 '...'
cmp al,0xf ; 00001B62 3C0F '<.'
jz x1bd9 ; 00001B64 7473 'ts'
cmp al,0x7 ; 00001B66 3C07 '<.'
jz x1bd9 ; 00001B68 746F 'to'
mov byte [0x449],0x7 ; 00001B6A C606490407 '..I..'
and byte [0x487],0x7f ; 00001B6F 802687047F '.&...'
jmp short x1bd9 ; 00001B74 EB63 '.c'
x1b76: mov byte [0x484],0x18 ; 00001B76 C606840418 '.....'
mov word [0x485],0xe ; 00001B7B C70685040E00 '......'
mov al,[0x449] ; 00001B81 A04904 '.I.'
mov ah,0x0 ; 00001B84 B400 '..'
int 0x42 ; 00001B86 CD42 '.B'
mov word [0x460],0xb0c ; 00001B88 C70660040C0B '..`...'
or byte [0x487],0x8 ; 00001B8E 800E870408 '.....'
jmp x713 ; 00001B93 E97DEB '.}.'
x1b96: mov byte [0x484],0x18 ; 00001B96 C606840418 '.....'
mov word [0x485],0x8 ; 00001B9B C70685040800 '......'
mov al,[0x449] ; 00001BA1 A04904 '.I.'
mov ah,0x0 ; 00001BA4 B400 '..'
or byte [0x487],0x8 ; 00001BA6 800E870408 '.....'
cmp al,0x1 ; 00001BAB 3C01 '<.'
jna x1bb8 ; 00001BAD 7609 'v.'
cmp al,0x4 ; 00001BAF 3C04 '<.'
jnc x1bb8 ; 00001BB1 7305 's.'
or byte [0x487],0x4 ; 00001BB3 800E870404 '.....'
x1bb8: int 0x42 ; 00001BB8 CD42 '.B'
jmp x713 ; 00001BBA E956EB '.V.'
x1bbd: test byte [0x487],0x2 ; 00001BBD F606870402 '.....'
jnz x1b96 ; 00001BC2 75D2 'u.'
mov dx,0x3d4 ; 00001BC4 BAD403 '...'
cmp al,0xf ; 00001BC7 3C0F '<.'
jz x1bcf ; 00001BC9 7404 't.'
cmp al,0x7 ; 00001BCB 3C07 '<.'
jnz x1bd9 ; 00001BCD 750A 'u',0x0A
x1bcf: mov byte [0x449],0x0 ; 00001BCF C606490400 '..I..'
and byte [0x487],0x7f ; 00001BD4 802687047F '.&...'
x1bd9: mov [0x463],dx ; 00001BD9 89166304 '..c.'
mov word [0x44e],0x0 ; 00001BDD C7064E040000 '..N...'
mov byte [0x462],0x0 ; 00001BE3 C606620400 '..b..'
mov cx,0x8 ; 00001BE8 B90800 '...'
mov di,0x450 ; 00001BEB BF5004 '.P.'
push ds ; 00001BEE 1E '.'
pop es ; 00001BEF 07 '.'
sub ax,ax ; 00001BF0 2BC0 '+.'
rep stosw ; 00001BF2 F3AB '..'
mov ah,[0x449] ; 00001BF4 8A264904 '.&I.'
call x73e ; 00001BF8 E843EB '.C.'
call x731 ; 00001BFB E833EB '.3.'
call xe36 ; 00001BFE E835F2 '.5.'
mov al,[es:bx] ; 00001C01 268A07 '&..'
sub ah,ah ; 00001C04 2AE4 '*.'
mov [0x44a],ax ; 00001C06 A34A04 '.J.'
mov al,[es:bx+0x1] ; 00001C09 268A4701 '&.G.'
mov [0x484],al ; 00001C0D A28404 '...'
mov al,[es:bx+0x2] ; 00001C10 268A4702 '&.G.'
mov [0x485],ax ; 00001C14 A38504 '...'
mov ax,[es:bx+0x3] ; 00001C17 268B4703 '&.G.'
mov [0x44c],ax ; 00001C1B A34C04 '.L.'
mov ax,[es:bx+0x14] ; 00001C1E 268B4714 '&.G.'
xchg al,ah ; 00001C22 86C4 '..'
mov [0x460],ax ; 00001C24 A36004 '.`.'
mov di,[0x463] ; 00001C27 8B3E6304 '.>c.'
call x1127 ; 00001C2B E8F9F4 '...'
xor al,al ; 00001C2E 32C0 '2.'
out dx,al ; 00001C30 EE '.'
cli ; 00001C31 FA '.'
in al,dx ; 00001C32 EC '.'
mov dx,0x3c0 ; 00001C33 BAC003 '...'
mov al,0x14 ; 00001C36 B014 '..'
out dx,al ; 00001C38 EE '.'
xor al,al ; 00001C39 32C0 '2.'
out dx,al ; 00001C3B EE '.'
sti ; 00001C3C FB '.'
mov ah,0x20 ; 00001C3D B420 '. '
call x127a ; 00001C3F E838F6 '.8.'
push ax ; 00001C42 50 'P'
test byte [0x489],0x8 ; 00001C43 F606890408 '.....'
jnz x1c73 ; 00001C48 7529 'u)'
mov cx,0x16 ; 00001C4A B91600 '...'
xor di,di ; 00001C4D 33FF '3.'
mov bp,0x1 ; 00001C4F BD0100 '...'
push bx ; 00001C52 53 'S'
add bx,byte +0x23 ; 00001C53 83C323 '..#'
call x722 ; 00001C56 E8C9EA '...'
call x2f11 ; 00001C59 E8B512 '...'
pop bx ; 00001C5C 5B '['
call x7f3 ; 00001C5D E893EB '...'
mov ah,[0x449] ; 00001C60 8A264904 '.&I.'
call x73e ; 00001C64 E8D7EA '...'
mov bl,al ; 00001C67 8AD8 '..'
mov al,[0x489] ; 00001C69 A08904 '...'
and al,0x6 ; 00001C6C 2406 '$.'
shr al,1 ; 00001C6E D0E8 '..'
call x2e52 ; 00001C70 E8DF11 '...'
x1c73: call x7b2 ; 00001C73 E83CEB '.<.'
pop ax ; 00001C76 58 'X'
call x127a ; 00001C77 E800F6 '...'
mov ah,[0x449] ; 00001C7A 8A264904 '.&I.'
db 0xE8,0x9A,0xF2
jz x1cd2 ; 00001C81 744F 'tO'
mov word [0x460],0x0 ; 00001C83 C70660040000 '..`...'
call xee8 ; 00001C89 E85CF2 '.\.'
mov bx,0x10c ; 00001C8C BB0C01 '...'
cli ; 00001C8F FA '.'
mov [bx],ax ; 00001C90 8907 '..'
mov [bx+0x2],cs ; 00001C92 8C4F02 '.O.'
sti ; 00001C95 FB '.'
les bx,[0x4a8] ; 00001C96 C41EA804 '....'
les bx,[es:bx+0xc] ; 00001C9A 26C45F0C '&._.'
mov ax,es ; 00001C9E 8CC0 '..'
or ax,bx ; 00001CA0 0BC3 '..'
jz x1ccf ; 00001CA2 742B 't+'
mov si,0x7 ; 00001CA4 BE0700 '...'
mov ah,[0x449] ; 00001CA7 8A264904 '.&I.'
call x1268 ; 00001CAB E8BAF5 '...'
jc x1ccf ; 00001CAE 721F 'r.'
mov al,[es:bx] ; 00001CB0 268A07 '&..'
dec al ; 00001CB3 FEC8 '..'
mov [0x484],al ; 00001CB5 A28404 '...'
mov ax,[es:bx+0x1] ; 00001CB8 268B4701 '&.G.'
mov [0x485],ax ; 00001CBC A38504 '...'
cli ; 00001CBF FA '.'
mov ax,[es:bx+0x3] ; 00001CC0 268B4703 '&.G.'
mov [0x10c],ax ; 00001CC4 A30C01 '...'
mov ax,[es:bx+0x5] ; 00001CC7 268B4705 '&.G.'
mov [0x10e],ax ; 00001CCB A30E01 '...'
sti ; 00001CCE FB '.'
x1ccf: jmp x1dc4 ; 00001CCF E9F200 '...'
x1cd2: mov cx,[0x463] ; 00001CD2 8B0E6304 '..c.'
call x120c ; 00001CD6 E833F5 '.3.'
mov ah,[0x449] ; 00001CD9 8A264904 '.&I.'
call x73e ; 00001CDD E85EEA '.^.'
mov bl,0x0 ; 00001CE0 B300 '..'
call xe5d ; 00001CE2 E878F1 '.x.'
mov ax,0xa000 ; 00001CE5 B800A0 '...'
db 0xE8,0xA9,0xF1
mov ds,[cs:0x71c] ; 00001CEB 2E8E1E1C07 '.....'
les bx,[0x4a8] ; 00001CF0 C41EA804 '....'
les bx,[es:bx+0x8] ; 00001CF4 26C45F08 '&._.'
mov ax,es ; 00001CF8 8CC0 '..'
or ax,bx ; 00001CFA 0BC3 '..'
jz x1d42 ; 00001CFC 7444 'tD'
mov si,0xb ; 00001CFE BE0B00 '...'
mov ah,[0x449] ; 00001D01 8A264904 '.&I.'
call x1268 ; 00001D05 E860F5 '.`.'
jc x1d42 ; 00001D08 7238 'r8'
mov ah,[es:bx] ; 00001D0A 268A27 '&.',0x27
mov al,[es:bx+0x1] ; 00001D0D 268A4701 '&.G.'
mov cx,[es:bx+0x2] ; 00001D11 268B4F02 '&.O.'
mov dx,[es:bx+0x4] ; 00001D15 268B5704 '&.W.'
mov bp,[es:bx+0x6] ; 00001D19 268B6F06 '&.o.'
mov ds,[es:bx+0x8] ; 00001D1D 268E5F08 '&._.'
push es ; 00001D21 06 '.'
push bx ; 00001D22 53 'S'
mov bx,ax ; 00001D23 8BD8 '..'
mov ax,0xa000 ; 00001D25 B800A0 '...'
db 0xE8,0x69,0xF1
call x36ec ; 00001D2B E8BE19 '...'
pop bx ; 00001D2E 5B '['
pop es ; 00001D2F 07 '.'
mov al,[es:bx+0xa] ; 00001D30 268A470A '&.G',0x0A
cmp al,0xff ; 00001D34 3CFF '<.'
jz x1d42 ; 00001D36 740A 't',0x0A
dec al ; 00001D38 FEC8 '..'
mov ds,[cs:0x71c] ; 00001D3A 2E8E1E1C07 '.....'
mov [0x484],al ; 00001D3F A28404 '...'
x1d42: les bx,[0x4a8] ; 00001D42 C41EA804 '....'
les bx,[es:bx+0x10] ; 00001D46 26C45F10 '&._.'
mov ax,es ; 00001D4A 8CC0 '..'
or ax,bx ; 00001D4C 0BC3 '..'
jz x1db8 ; 00001D4E 7468 'th'
les bx,[es:bx+0x6] ; 00001D50 26C45F06 '&._.'
mov ax,es ; 00001D54 8CC0 '..'
or ax,bx ; 00001D56 0BC3 '..'
jz x1db8 ; 00001D58 745E 't^'
mov si,0x7 ; 00001D5A BE0700 '...'
mov ah,[0x449] ; 00001D5D 8A264904 '.&I.'
call x1268 ; 00001D61 E804F5 '...'
jc x1db8 ; 00001D64 7252 'rR'
mov ah,[0x485] ; 00001D66 8A268504 '.&..'
cmp ah,[es:bx] ; 00001D6A 263A27 '&:',0x27
jnz x1db8 ; 00001D6D 7549 'uI'
mov ah,[es:bx] ; 00001D6F 268A27 '&.',0x27
mov al,[es:bx+0x1] ; 00001D72 268A4701 '&.G.'
mov cx,0x100 ; 00001D76 B90001 '...'
mov dx,0x0 ; 00001D79 BA0000 '...'
mov bp,[es:bx+0x3] ; 00001D7C 268B6F03 '&.o.'
mov ds,[es:bx+0x5] ; 00001D80 268E5F05 '&._.'
push es ; 00001D84 06 '.'
push bx ; 00001D85 53 'S'
mov bx,ax ; 00001D86 8BD8 '..'
and bl,0x7f ; 00001D88 80E37F '...'
mov ax,0xa000 ; 00001D8B B800A0 '...'
db 0xE8,0x03,0xF1
pop bx ; 00001D91 5B '['
pop es ; 00001D92 07 '.'
mov al,0x3 ; 00001D93 B003 '..'
mov dx,0x3c4 ; 00001D95 BAC403 '...'
out dx,al ; 00001D98 EE '.'
inc dx ; 00001D99 42 'B'
in al,dx ; 00001D9A EC '.'
dec dx ; 00001D9B 4A 'J'
and al,0x13 ; 00001D9C 2413 '$.'
mov cl,al ; 00001D9E 8AC8 '..'
mov al,[es:bx+0x1] ; 00001DA0 268A4701 '&.G.'
shl al,1 ; 00001DA4 D0E0 '..'
shl al,1 ; 00001DA6 D0E0 '..'
mov ah,al ; 00001DA8 8AE0 '..'
shl ah,1 ; 00001DAA D0E4 '..'
and al,0xc ; 00001DAC 240C '$.'
and ah,0x20 ; 00001DAE 80E420 '.. '
or ah,al ; 00001DB1 0AE0 0x0A,'.'
or ah,cl ; 00001DB3 0AE1 0x0A,'.'
mov al,0x3 ; 00001DB5 B003 '..'
out dx,ax ; 00001DB7 EF '.'
x1db8: mov ds,[cs:0x71c] ; 00001DB8 2E8E1E1C07 '.....'
mov cx,[0x463] ; 00001DBD 8B0E6304 '..c.'
call x1238 ; 00001DC1 E874F4 '.t.'
x1dc4: mov ds,[cs:0x71c] ; 00001DC4 2E8E1E1C07 '.....'
les bx,[0x4a8] ; 00001DC9 C41EA804 '....'
les bx,[es:bx+0x10] ; 00001DCD 26C45F10 '&._.'
mov ax,es ; 00001DD1 8CC0 '..'
or ax,bx ; 00001DD3 0BC3 '..'
jnz x1dda ; 00001DD5 7503 'u.'
jmp short x1e50 ; 00001DD7 EB77 '.w'
nop ; 00001DD9 90 '.'
x1dda: les bx,[es:bx+0xa] ; 00001DDA 26C45F0A '&._',0x0A
mov ax,es ; 00001DDE 8CC0 '..'
or ax,bx ; 00001DE0 0BC3 '..'
jz x1e50 ; 00001DE2 746C 'tl'
mov si,0x14 ; 00001DE4 BE1400 '...'
mov ah,[0x449] ; 00001DE7 8A264904 '.&I.'
call x1268 ; 00001DEB E87AF4 '.z.'
jc x1e50 ; 00001DEE 7260 'r`'
mov cx,[es:bx+0x4] ; 00001DF0 268B4F04 '&.O.'
jcxz x1e11 ; 00001DF4 E31B '..'
push es ; 00001DF6 06 '.'
push bx ; 00001DF7 53 'S'
mov di,[es:bx+0x6] ; 00001DF8 268B7F06 '&...'
les bx,[es:bx+0x8] ; 00001DFC 26C45F08 '&._.'
xor bp,bp ; 00001E00 33ED '3.'
call x722 ; 00001E02 E81DE9 '...'
test byte [0x489],0x8 ; 00001E05 F606890408 '.....'
jnz x1e0f ; 00001E0A 7503 'u.'
call x2f11 ; 00001E0C E80211 '...'
x1e0f: pop bx ; 00001E0F 5B '['
pop es ; 00001E10 07 '.'
x1e11: mov cx,[es:bx+0xc] ; 00001E11 268B4F0C '&.O.'
jcxz x1e36 ; 00001E15 E31F '..'
push es ; 00001E17 06 '.'
push bx ; 00001E18 53 'S'
mov di,[es:bx+0xe] ; 00001E19 268B7F0E '&...'
les bx,[es:bx+0x10] ; 00001E1D 26C45F10 '&._.'
mov dl,[0x489] ; 00001E21 8A168904 '....'
and dl,0x6 ; 00001E25 80E206 '...'
shr dl,1 ; 00001E28 D0EA '..'
test byte [0x489],0x8 ; 00001E2A F606890408 '.....'
jnz x1e34 ; 00001E2F 7503 'u.'
call x2ed3 ; 00001E31 E89F10 '...'
x1e34: pop bx ; 00001E34 5B '['
pop es ; 00001E35 07 '.'
x1e36: mov al,[es:bx] ; 00001E36 268A07 '&..'
or al,al ; 00001E39 0AC0 0x0A,'.'
jz x1e50 ; 00001E3B 7413 't.'
js x1e47 ; 00001E3D 7808 'x.'
mov ah,[0x485] ; 00001E3F 8A268504 '.&..'
dec ah ; 00001E43 FECC '..'
jmp short x1e49 ; 00001E45 EB02 '..'
x1e47: mov ah,0x1f ; 00001E47 B41F '..'
x1e49: mov al,0x14 ; 00001E49 B014 '..'
mov dx,[0x463] ; 00001E4B 8B166304 '..c.'
out dx,ax ; 00001E4F EF '.'
x1e50: mov ds,[cs:0x71c] ; 00001E50 2E8E1E1C07 '.....'
call x2b6e ; 00001E55 E8160D '..',0x0D
cmp byte [0x449],0x7 ; 00001E58 803E490407 '.>I..'
ja x1e7d ; 00001E5D 771E 'w.'
mov bx,0x1e80 ; 00001E5F BB801E '...'
mov al,[0x449] ; 00001E62 A04904 '.I.'
sub ah,ah ; 00001E65 2AE4 '*.'
add bx,ax ; 00001E67 03D8 '..'
mov al,[cs:bx] ; 00001E69 2E8A07 '...'
mov [0x465],al ; 00001E6C A26504 '.e.'
mov al,0x30 ; 00001E6F B030 '.0'
cmp byte [0x449],0x6 ; 00001E71 803E490406 '.>I..'
jnz x1e7a ; 00001E76 7502 'u.'
mov al,0x3f ; 00001E78 B03F '.?'
x1e7a: mov [0x466],al ; 00001E7A A26604 '.f.'
x1e7d: jmp x713 ; 00001E7D E993E8 '...'
sub al,0x28 ; 00001E80 2C28 ',('
sub ax,0x2a29 ; 00001E82 2D292A '-)*'
cs push ds ; 00001E85 2E1E '..'
sub di,di ; 00001E87 29FF ').'
times 4 db 0xFF ; 00001E89 - 00001E8C
dec word [bp+di+0x8b8b] ; 00001E8D FF8B8B8B '....'
or cx,[bx+si+0x48] ; 00001E91 0B4848 '.HH'
times 4 db 0xFF ; 00001E94 - 00001E97
call x1e9e ; 00001E98 E80300 '...'
jmp x713 ; 00001E9B E975E8 '.u.'
x1e9e: mov [0x460],cx ; 00001E9E 890E6004 '..`.'
test byte [0x487],0x8 ; 00001EA2 F606870408 '.....'
jnz x1ecc ; 00001EA7 7523 'u#'
mov al,ch ; 00001EA9 8AC5 '..'
and al,0x60 ; 00001EAB 2460 '$`'
cmp al,0x20 ; 00001EAD 3C20 '< '
jnz x1eb6 ; 00001EAF 7505 'u.'
mov cx,0x1e00 ; 00001EB1 B9001E '...'
jmp short x1ecc ; 00001EB4 EB16 '..'
x1eb6: test byte [0x487],0x1 ; 00001EB6 F606870401 '.....'
jnz x1ecc ; 00001EBB 750F 'u.'
mov ah,[0x449] ; 00001EBD 8A264904 '.&I.'
db 0xE8,0x57,0xF0
jnz x1ecc ; 00001EC4 7506 'u.'
mov al,[0x485] ; 00001EC6 A08504 '...'
call x1ed2 ; 00001EC9 E80600 '...'
x1ecc: mov al,0xa ; 00001ECC B00A '.',0x0A
call x1f5a ; 00001ECE E88900 '...'
ret ; 00001ED1 C3 '.'
x1ed2: test cx,0xe0e0 ; 00001ED2 F7C1E0E0 '....'
jnz x1f2e ; 00001ED6 7556 'uV'
mov dl,al ; 00001ED8 8AD0 '..'
dec dl ; 00001EDA FECA '..'
mov dh,dl ; 00001EDC 8AF2 '..'
dec dh ; 00001EDE FECE '..'
cmp cl,ch ; 00001EE0 3ACD ':.'
jc x1ef6 ; 00001EE2 7212 'r.'
mov ah,ch ; 00001EE4 8AE5 '..'
or ah,cl ; 00001EE6 0AE1 0x0A,'.'
cmp ah,al ; 00001EE8 3AE0 ':.'
jnc x1f01 ; 00001EEA 7315 's.'
cmp cl,dl ; 00001EEC 3ACA ':.'
jz x1f2e ; 00001EEE 743E 't>'
cmp ch,dh ; 00001EF0 3AEE ':.'
jz x1f2e ; 00001EF2 743A 't:'
jmp short x1f01 ; 00001EF4 EB0B '..'
x1ef6: cmp cl,0x0 ; 00001EF6 80F900 '...'
jz x1f2e ; 00001EF9 7433 't3'
mov ch,dl ; 00001EFB 8AEA '..'
xchg cl,ch ; 00001EFD 86CD '..'
jmp short x1f2e ; 00001EFF EB2D '.-'
x1f01: cmp cl,0x3 ; 00001F01 80F903 '...'
jna x1f2e ; 00001F04 7628 'v('
mov ah,ch ; 00001F06 8AE5 '..'
add ah,0x2 ; 00001F08 80C402 '...'
cmp ah,cl ; 00001F0B 3AE1 ':.'
jc x1f1f ; 00001F0D 7210 'r.'
sub ch,cl ; 00001F0F 2AE9 '*.'
add ch,dl ; 00001F11 02EA '..'
mov cl,dl ; 00001F13 8ACA '..'
cmp al,0xe ; 00001F15 3C0E '<.'
jl x1f2e ; 00001F17 7C15 '|.'
sub cx,0x101 ; 00001F19 81E90101 '....'
jmp short x1f2e ; 00001F1D EB0F '..'
x1f1f: cmp ch,0x2 ; 00001F1F 80FD02 '...'
ja x1f28 ; 00001F22 7704 'w.'
mov cl,dl ; 00001F24 8ACA '..'
jmp short x1f2e ; 00001F26 EB06 '..'
x1f28: mov ch,al ; 00001F28 8AE8 '..'
shr ch,1 ; 00001F2A D0ED '..'
mov cl,dl ; 00001F2C 8ACA '..'
x1f2e: ret ; 00001F2E C3 '.'
call x1f35 ; 00001F2F E80300 '...'
jmp x713 ; 00001F32 E9DEE7 '...'
x1f35: mov cl,bh ; 00001F35 8ACF '..'
xor ch,ch ; 00001F37 32ED '2.'
shl cx,1 ; 00001F39 D1E1 '..'
mov si,cx ; 00001F3B 8BF1 '..'
mov [si+0x450],dx ; 00001F3D 89945004 '..P.'
cmp [0x462],bh ; 00001F41 383E6204 '8>b.'
jnz x1f4c ; 00001F45 7505 'u.'
mov ax,dx ; 00001F47 8BC2 '..'
call x1f4d ; 00001F49 E80100 '...'
x1f4c: ret ; 00001F4C C3 '.'
x1f4d: call x1f67 ; 00001F4D E81700 '...'
mov cx,ax ; 00001F50 8BC8 '..'
add cx,[0x44e] ; 00001F52 030E4E04 '..N.'
sar cx,1 ; 00001F56 D1F9 '..'
mov al,0xe ; 00001F58 B00E '..'
x1f5a: mov dx,[0x463] ; 00001F5A 8B166304 '..c.'
mov ah,ch ; 00001F5E 8AE5 '..'
out dx,ax ; 00001F60 EF '.'
inc al ; 00001F61 FEC0 '..'
mov ah,cl ; 00001F63 8AE1 '..'
out dx,ax ; 00001F65 EF '.'
ret ; 00001F66 C3 '.'
x1f67: push bx ; 00001F67 53 'S'
mov bx,ax ; 00001F68 8BD8 '..'
mov al,ah ; 00001F6A 8AC4 '..'
mul byte [0x44a] ; 00001F6C F6264A04 '.&J.'
xor bh,bh ; 00001F70 32FF '2.'
add ax,bx ; 00001F72 03C3 '..'
shl ax,1 ; 00001F74 D1E0 '..'
pop bx ; 00001F76 5B '['
ret ; 00001F77 C3 '.'
mov bl,bh ; 00001F78 8ADF '..'
xor bh,bh ; 00001F7A 32FF '2.'
shl bx,1 ; 00001F7C D1E3 '..'
mov dx,[bx+0x450] ; 00001F7E 8B975004 '..P.'
mov cx,[0x460] ; 00001F82 8B0E6004 '..`.'
pop di ; 00001F86 5F '_'
pop si ; 00001F87 5E '^'
pop bx ; 00001F88 5B '['
pop ax ; 00001F89 58 'X'
pop ax ; 00001F8A 58 'X'
pop ds ; 00001F8B 1F '.'
pop es ; 00001F8C 07 '.'
pop bp ; 00001F8D 5D ']'
iret ; 00001F8E CF '.'
test byte [0x487],0x8 ; 00001F8F F606870408 '.....'
jnz x1f9b ; 00001F94 7505 'u.'
sub ax,ax ; 00001F96 2BC0 '+.'
jmp x713 ; 00001F98 E978E7 '.x.'
x1f9b: mov ah,0x4 ; 00001F9B B404 '..'
int 0x42 ; 00001F9D CD42 '.B'
pop di ; 00001F9F 5F '_'
pop si ; 00001FA0 5E '^'
add sp,byte +0x6 ; 00001FA1 83C406 '...'
pop ds ; 00001FA4 1F '.'
pop es ; 00001FA5 07 '.'
pop bp ; 00001FA6 5D ']'
iret ; 00001FA7 CF '.'
mov [0x462],al ; 00001FA8 A26204 '.b.'
mov cx,[0x44c] ; 00001FAB 8B0E4C04 '..L.'
cbw ; 00001FAF 98 '.'
push ax ; 00001FB0 50 'P'
mul cx ; 00001FB1 F7E1 '..'
mov [0x44e],ax ; 00001FB3 A34E04 '.N.'
mov cx,ax ; 00001FB6 8BC8 '..'
cmp byte [0x449],0x7 ; 00001FB8 803E490407 '.>I..'
ja x1fc1 ; 00001FBD 7702 'w.'
sar cx,1 ; 00001FBF D1F9 '..'
x1fc1: mov al,0xc ; 00001FC1 B00C '..'
call x1f5a ; 00001FC3 E894FF '...'
pop bx ; 00001FC6 5B '['
shl bx,1 ; 00001FC7 D1E3 '..'
mov ax,[bx+0x450] ; 00001FC9 8B875004 '..P.'
call x1f4d ; 00001FCD E87DFF '.}.'
jmp x713 ; 00001FD0 E940E7 '.@.'
call x1fd9 ; 00001FD3 E80300 '...'
jmp x713 ; 00001FD6 E93AE7 '.:.'
x1fd9: call x24ee ; 00001FD9 E81205 '...'
mov ah,[0x449] ; 00001FDC 8A264904 '.&I.'
mov si,ax ; 00001FE0 8BF0 '..'
shr si,1 ; 00001FE2 D1EE '..'
shr si,1 ; 00001FE4 D1EE '..'
shr si,1 ; 00001FE6 D1EE '..'
shr si,1 ; 00001FE8 D1EE '..'
shr si,1 ; 00001FEA D1EE '..'
shr si,1 ; 00001FEC D1EE '..'
shr si,1 ; 00001FEE D1EE '..'
shr si,1 ; 00001FF0 D1EE '..'
shl si,1 ; 00001FF2 D1E6 '..'
mov si,[cs:si+0x1290] ; 00001FF4 2E8BB49012 '.....'
shl si,1 ; 00001FF9 D1E6 '..'
cmp si,0xa ; 00001FFB 81FE0A00 '..',0x0A,'.'
jnc x2006 ; 00001FFF 7305 's.'
call near [cs:si+0x2007] ; 00002001 2EFF940720 '.... '
x2006: ret ; 00002006 C3 '.'
push es ; 00002007 06 '.'
and [bx+di],dl ; 00002008 2011 ' .'
and [bx+0x2f20],ah ; 0000200A 20A7202F ' . /'
and di,si ; 0000200E 21F7 '!.'
and [bp+si+0xe8d8],cx ; 00002010 218AD8E8 '!...'
or [bp+si],cx ; 00002014 090A '.',0x0A
mov ax,cx ; 00002016 8BC1 '..'
call x206c ; 00002018 E85100 '.Q.'
call x201f ; 0000201B E80100 '...'
ret ; 0000201E C3 '.'
x201f: push bx ; 0000201F 53 'S'
xor ch,ch ; 00002020 32ED '2.'
cmp bl,0x0 ; 00002022 80FB00 '...'
jz x2058 ; 00002025 7431 't1'
add si,ax ; 00002027 03F0 '..'
mov ah,dh ; 00002029 8AE6 '..'
sub ah,bl ; 0000202B 2AE3 '*.'
x202d: call x205c ; 0000202D E82C00 '.,.'
add si,bp ; 00002030 03F5 '..'
add di,bp ; 00002032 03FD '..'
dec ah ; 00002034 FECC '..'
jnz x202d ; 00002036 75F5 'u.'
x2038: pop ax ; 00002038 58 'X'
mov al,0x20 ; 00002039 B020 '. '
x203b: call x2065 ; 0000203B E82700 '.',0x27,'.'
add di,bp ; 0000203E 03FD '..'
dec bl ; 00002040 FECB '..'
jnz x203b ; 00002042 75F7 'u.'
mov ds,[cs:0x71c] ; 00002044 2E8E1E1C07 '.....'
cmp byte [0x449],0x7 ; 00002049 803E490407 '.>I..'
jz x2057 ; 0000204E 7407 't.'
mov al,[0x465] ; 00002050 A06504 '.e.'
mov dx,0x3d8 ; 00002053 BAD803 '...'
out dx,al ; 00002056 EE '.'
x2057: ret ; 00002057 C3 '.'
x2058: mov bl,dh ; 00002058 8ADE '..'
jmp short x2038 ; 0000205A EBDC '..'
x205c: mov cl,dl ; 0000205C 8ACA '..'
push si ; 0000205E 56 'V'
push di ; 0000205F 57 'W'
rep movsw ; 00002060 F3A5 '..'
pop di ; 00002062 5F '_'
pop si ; 00002063 5E '^'
ret ; 00002064 C3 '.'
x2065: mov cl,dl ; 00002065 8ACA '..'
push di ; 00002067 57 'W'
rep stosw ; 00002068 F3AB '..'
pop di ; 0000206A 5F '_'
ret ; 0000206B C3 '.'
x206c: test byte [0x487],0x4 ; 0000206C F606870404 '.....'
jz x2085 ; 00002071 7412 't.'
push dx ; 00002073 52 'R'
mov dh,0x3 ; 00002074 B603 '..'
mov dl,0xda ; 00002076 B2DA '..'
push ax ; 00002078 50 'P'
x2079: in al,dx ; 00002079 EC '.'
test al,0x8 ; 0000207A A808 '..'
jz x2079 ; 0000207C 74FB 't.'
mov al,0x25 ; 0000207E B025 '.%'
mov dl,0xd8 ; 00002080 B2D8 '..'
out dx,al ; 00002082 EE '.'
pop ax ; 00002083 58 'X'
pop dx ; 00002084 5A 'Z'
x2085: call x1f67 ; 00002085 E8DFFE '...'
add ax,[0x44e] ; 00002088 03064E04 '..N.'
mov di,ax ; 0000208C 8BF8 '..'
mov si,ax ; 0000208E 8BF0 '..'
sub dx,cx ; 00002090 2BD1 '+.'
inc dh ; 00002092 FEC6 '..'
inc dl ; 00002094 FEC2 '..'
mov bp,[0x44a] ; 00002096 8B2E4A04 '..J.'
add bp,bp ; 0000209A 03ED '..'
mov al,bl ; 0000209C 8AC3 '..'
mul byte [0x44a] ; 0000209E F6264A04 '.&J.'
add ax,ax ; 000020A2 03C0 '..'
push es ; 000020A4 06 '.'
pop ds ; 000020A5 1F '.'
ret ; 000020A6 C3 '.'
mov bl,al ; 000020A7 8AD8 '..'
call x2a1f ; 000020A9 E87309 '.s.'
mov ax,cx ; 000020AC 8BC1 '..'
call x25c5 ; 000020AE E81405 '...'
mov di,ax ; 000020B1 8BF8 '..'
sub dx,cx ; 000020B3 2BD1 '+.'
add dx,0x101 ; 000020B5 81C20101 '....'
shl dh,1 ; 000020B9 D0E6 '..'
shl dh,1 ; 000020BB D0E6 '..'
cmp byte [0x449],0x6 ; 000020BD 803E490406 '.>I..'
jnc x20c8 ; 000020C2 7304 's.'
shl dl,1 ; 000020C4 D0E2 '..'
shl di,1 ; 000020C6 D1E7 '..'
x20c8: call x20cc ; 000020C8 E80100 '...'
ret ; 000020CB C3 '.'
x20cc: push es ; 000020CC 06 '.'
pop ds ; 000020CD 1F '.'
xor ch,ch ; 000020CE 32ED '2.'
shl bl,1 ; 000020D0 D0E3 '..'
shl bl,1 ; 000020D2 D0E3 '..'
jz x2101 ; 000020D4 742B 't+'
mov al,bl ; 000020D6 8AC3 '..'
mov ah,0x50 ; 000020D8 B450 '.P'
mul ah ; 000020DA F6E4 '..'
mov si,di ; 000020DC 8BF7 '..'
add si,ax ; 000020DE 03F0 '..'
mov ah,dh ; 000020E0 8AE6 '..'
sub ah,bl ; 000020E2 2AE3 '*.'
x20e4: call x2105 ; 000020E4 E81E00 '...'
sub si,0x1fb0 ; 000020E7 81EEB01F '....'
sub di,0x1fb0 ; 000020EB 81EFB01F '....'
dec ah ; 000020EF FECC '..'
jnz x20e4 ; 000020F1 75F1 'u.'
x20f3: mov al,bh ; 000020F3 8AC7 '..'
x20f5: call x211e ; 000020F5 E82600 '.&.'
sub di,0x1fb0 ; 000020F8 81EFB01F '....'
dec bl ; 000020FC FECB '..'
jnz x20f5 ; 000020FE 75F5 'u.'
ret ; 00002100 C3 '.'
x2101: mov bl,dh ; 00002101 8ADE '..'
jmp short x20f3 ; 00002103 EBEE '..'
x2105: mov cl,dl ; 00002105 8ACA '..'
push si ; 00002107 56 'V'
push di ; 00002108 57 'W'
rep movsb ; 00002109 F3A4 '..'
pop di ; 0000210B 5F '_'
pop si ; 0000210C 5E '^'
add si,0x2000 ; 0000210D 81C60020 '... '
add di,0x2000 ; 00002111 81C70020 '... '
push si ; 00002115 56 'V'
push di ; 00002116 57 'W'
mov cl,dl ; 00002117 8ACA '..'
rep movsb ; 00002119 F3A4 '..'
pop di ; 0000211B 5F '_'
pop si ; 0000211C 5E '^'
ret ; 0000211D C3 '.'
x211e: mov cl,dl ; 0000211E 8ACA '..'
push di ; 00002120 57 'W'
rep stosb ; 00002121 F3AA '..'
pop di ; 00002123 5F '_'
add di,0x2000 ; 00002124 81C70020 '... '
push di ; 00002128 57 'W'
mov cl,dl ; 00002129 8ACA '..'
rep stosb ; 0000212B F3AA '..'
pop di ; 0000212D 5F '_'
ret ; 0000212E C3 '.'
mov bl,al ; 0000212F 8AD8 '..'
mov ax,0xa000 ; 00002131 B800A0 '...'
mov es,ax ; 00002134 8EC0 '..'
mov ax,cx ; 00002136 8BC1 '..'
push bx ; 00002138 53 'S'
mov bh,[0x462] ; 00002139 8A3E6204 '.>b.'
call x2679 ; 0000213D E83905 '.9.'
pop bx ; 00002140 5B '['
mov di,ax ; 00002141 8BF8 '..'
sub dx,cx ; 00002143 2BD1 '+.'
add dx,0x101 ; 00002145 81C20101 '....'
mov bp,[0x485] ; 00002149 8B2E8504 '....'
mov cx,[0x44a] ; 0000214D 8B0E4A04 '..J.'
call x2155 ; 00002151 E80100 '...'
ret ; 00002154 C3 '.'
x2155: push es ; 00002155 06 '.'
pop ds ; 00002156 1F '.'
mov al,bl ; 00002157 8AC3 '..'
sub ah,ah ; 00002159 2AE4 '*.'
push dx ; 0000215B 52 'R'
mul bp ; 0000215C F7E5 '..'
mul cx ; 0000215E F7E1 '..'
mov si,di ; 00002160 8BF7 '..'
add si,ax ; 00002162 03F0 '..'
pop dx ; 00002164 5A 'Z'
mov ax,cx ; 00002165 8BC1 '..'
or bl,bl ; 00002167 0ADB 0x0A,'.'
jz x219a ; 00002169 742F 't/'
push ax ; 0000216B 50 'P'
mov cl,dh ; 0000216C 8ACE '..'
sub cl,bl ; 0000216E 2ACB '*.'
xor ch,ch ; 00002170 32ED '2.'
push dx ; 00002172 52 'R'
mov ax,cx ; 00002173 8BC1 '..'
mul bp ; 00002175 F7E5 '..'
mov cx,ax ; 00002177 8BC8 '..'
mov dx,0x3ce ; 00002179 BACE03 '...'
mov ax,0x105 ; 0000217C B80501 '...'
out dx,ax ; 0000217F EF '.'
mov dl,0xc4 ; 00002180 B2C4 '..'
mov ax,0xf02 ; 00002182 B8020F '...'
out dx,ax ; 00002185 EF '.'
pop dx ; 00002186 5A 'Z'
pop ax ; 00002187 58 'X'
call x219e ; 00002188 E81300 '...'
push dx ; 0000218B 52 'R'
push ax ; 0000218C 50 'P'
mov dx,0x3ce ; 0000218D BACE03 '...'
mov ax,0x5 ; 00002190 B80500 '...'
out dx,ax ; 00002193 EF '.'
pop ax ; 00002194 58 'X'
pop dx ; 00002195 5A 'Z'
x2196: call x21b1 ; 00002196 E81800 '...'
ret ; 00002199 C3 '.'
x219a: mov bl,dh ; 0000219A 8ADE '..'
jmp short x2196 ; 0000219C EBF8 '..'
x219e: push cx ; 0000219E 51 'Q'
mov cl,dl ; 0000219F 8ACA '..'
xor ch,ch ; 000021A1 32ED '2.'
push si ; 000021A3 56 'V'
push di ; 000021A4 57 'W'
rep movsb ; 000021A5 F3A4 '..'
pop di ; 000021A7 5F '_'
pop si ; 000021A8 5E '^'
add si,ax ; 000021A9 03F0 '..'
add di,ax ; 000021AB 03F8 '..'
pop cx ; 000021AD 59 'Y'
loop x219e ; 000021AE E2EE '..'
ret ; 000021B0 C3 '.'
x21b1: mov dh,bh ; 000021B1 8AF7 '..'
sub bh,bh ; 000021B3 2AFF '*.'
push ax ; 000021B5 50 'P'
push dx ; 000021B6 52 'R'
mov ax,bx ; 000021B7 8BC3 '..'
mul bp ; 000021B9 F7E5 '..'
mov bx,ax ; 000021BB 8BD8 '..'
pop dx ; 000021BD 5A 'Z'
pop ax ; 000021BE 58 'X'
x21bf: push ax ; 000021BF 50 'P'
call x21d1 ; 000021C0 E80E00 '...'
pop ax ; 000021C3 58 'X'
add di,ax ; 000021C4 03F8 '..'
dec bx ; 000021C6 4B 'K'
jnz x21bf ; 000021C7 75F6 'u.'
mov dx,0x3c4 ; 000021C9 BAC403 '...'
mov ax,0xf02 ; 000021CC B8020F '...'
out dx,ax ; 000021CF EF '.'
ret ; 000021D0 C3 '.'
x21d1: push dx ; 000021D1 52 'R'
mov dx,0x3c4 ; 000021D2 BAC403 '...'
mov ax,0xf02 ; 000021D5 B8020F '...'
out dx,ax ; 000021D8 EF '.'
pop dx ; 000021D9 5A 'Z'
sub ax,ax ; 000021DA 2BC0 '+.'
mov cl,dl ; 000021DC 8ACA '..'
xor ch,ch ; 000021DE 32ED '2.'
push di ; 000021E0 57 'W'
rep stosb ; 000021E1 F3AA '..'
pop di ; 000021E3 5F '_'
mov ah,dh ; 000021E4 8AE6 '..'
push dx ; 000021E6 52 'R'
mov dx,0x3c4 ; 000021E7 BAC403 '...'
mov al,0x2 ; 000021EA B002 '..'
out dx,ax ; 000021EC EF '.'
pop dx ; 000021ED 5A 'Z'
mov al,0xff ; 000021EE B0FF '..'
mov cl,dl ; 000021F0 8ACA '..'
push di ; 000021F2 57 'W'
rep stosb ; 000021F3 F3AA '..'
pop di ; 000021F5 5F '_'
ret ; 000021F6 C3 '.'
mov bl,al ; 000021F7 8AD8 '..'
mov ax,0xa000 ; 000021F9 B800A0 '...'
mov es,ax ; 000021FC 8EC0 '..'
mov ax,cx ; 000021FE 8BC1 '..'
push bx ; 00002200 53 'S'
push dx ; 00002201 52 'R'
call x26dd ; 00002202 E8D804 '...'
pop dx ; 00002205 5A 'Z'
pop bx ; 00002206 5B '['
mov di,ax ; 00002207 8BF8 '..'
sub dx,cx ; 00002209 2BD1 '+.'
add dx,0x101 ; 0000220B 81C20101 '....'
mov bp,[0x485] ; 0000220F 8B2E8504 '....'
mov cx,[0x44a] ; 00002213 8B0E4A04 '..J.'
call x221b ; 00002217 E80100 '...'
ret ; 0000221A C3 '.'
x221b: push es ; 0000221B 06 '.'
pop ds ; 0000221C 1F '.'
mov al,bl ; 0000221D 8AC3 '..'
sub ah,ah ; 0000221F 2AE4 '*.'
push dx ; 00002221 52 'R'
mul bp ; 00002222 F7E5 '..'
mul cx ; 00002224 F7E1 '..'
shl ax,1 ; 00002226 D1E0 '..'
shl ax,1 ; 00002228 D1E0 '..'
shl ax,1 ; 0000222A D1E0 '..'
mov si,di ; 0000222C 8BF7 '..'
add si,ax ; 0000222E 03F0 '..'
pop dx ; 00002230 5A 'Z'
mov ax,cx ; 00002231 8BC1 '..'
or bl,bl ; 00002233 0ADB 0x0A,'.'
jz x224e ; 00002235 7417 't.'
push ax ; 00002237 50 'P'
mov cl,dh ; 00002238 8ACE '..'
sub cl,bl ; 0000223A 2ACB '*.'
xor ch,ch ; 0000223C 32ED '2.'
push dx ; 0000223E 52 'R'
mov ax,cx ; 0000223F 8BC1 '..'
mul bp ; 00002241 F7E5 '..'
mov cx,ax ; 00002243 8BC8 '..'
pop dx ; 00002245 5A 'Z'
pop ax ; 00002246 58 'X'
call x2252 ; 00002247 E80800 '...'
x224a: call x2273 ; 0000224A E82600 '.&.'
ret ; 0000224D C3 '.'
x224e: mov bl,dh ; 0000224E 8ADE '..'
jmp short x224a ; 00002250 EBF8 '..'
x2252: push ax ; 00002252 50 'P'
shl ax,1 ; 00002253 D1E0 '..'
shl ax,1 ; 00002255 D1E0 '..'
shl ax,1 ; 00002257 D1E0 '..'
x2259: push cx ; 00002259 51 'Q'
mov cl,dl ; 0000225A 8ACA '..'
xor ch,ch ; 0000225C 32ED '2.'
shl cx,1 ; 0000225E D1E1 '..'
shl cx,1 ; 00002260 D1E1 '..'
shl cx,1 ; 00002262 D1E1 '..'
push si ; 00002264 56 'V'
push di ; 00002265 57 'W'
rep movsb ; 00002266 F3A4 '..'
pop di ; 00002268 5F '_'
pop si ; 00002269 5E '^'
add si,ax ; 0000226A 03F0 '..'
add di,ax ; 0000226C 03F8 '..'
pop cx ; 0000226E 59 'Y'
loop x2259 ; 0000226F E2E8 '..'
pop ax ; 00002271 58 'X'
ret ; 00002272 C3 '.'
x2273: mov dh,bh ; 00002273 8AF7 '..'
sub bh,bh ; 00002275 2AFF '*.'
push ax ; 00002277 50 'P'
push dx ; 00002278 52 'R'
mov ax,bx ; 00002279 8BC3 '..'
mul bp ; 0000227B F7E5 '..'
mov bx,ax ; 0000227D 8BD8 '..'
pop dx ; 0000227F 5A 'Z'
pop ax ; 00002280 58 'X'
x2281: call x2292 ; 00002281 E80E00 '...'
push ax ; 00002284 50 'P'
shl ax,1 ; 00002285 D1E0 '..'
shl ax,1 ; 00002287 D1E0 '..'
shl ax,1 ; 00002289 D1E0 '..'
add di,ax ; 0000228B 03F8 '..'
dec bx ; 0000228D 4B 'K'
pop ax ; 0000228E 58 'X'
jnz x2281 ; 0000228F 75F0 'u.'
ret ; 00002291 C3 '.'
x2292: push ax ; 00002292 50 'P'
sub ax,ax ; 00002293 2BC0 '+.'
mov cl,dl ; 00002295 8ACA '..'
xor ch,ch ; 00002297 32ED '2.'
shl cx,1 ; 00002299 D1E1 '..'
shl cx,1 ; 0000229B D1E1 '..'
shl cx,1 ; 0000229D D1E1 '..'
mov al,dh ; 0000229F 8AC6 '..'
push di ; 000022A1 57 'W'
rep stosb ; 000022A2 F3AA '..'
pop di ; 000022A4 5F '_'
pop ax ; 000022A5 58 'X'
ret ; 000022A6 C3 '.'
call x22ad ; 000022A7 E80300 '...'
jmp x713 ; 000022AA E966E4 '.f.'
x22ad: call x24ee ; 000022AD E83E02 '.>.'
mov ah,[0x449] ; 000022B0 8A264904 '.&I.'
mov si,ax ; 000022B4 8BF0 '..'
shr si,1 ; 000022B6 D1EE '..'
shr si,1 ; 000022B8 D1EE '..'
shr si,1 ; 000022BA D1EE '..'
shr si,1 ; 000022BC D1EE '..'
shr si,1 ; 000022BE D1EE '..'
shr si,1 ; 000022C0 D1EE '..'
shr si,1 ; 000022C2 D1EE '..'
shr si,1 ; 000022C4 D1EE '..'
shl si,1 ; 000022C6 D1E6 '..'
mov si,[cs:si+0x1290] ; 000022C8 2E8BB49012 '.....'
shl si,1 ; 000022CD D1E6 '..'
cmp si,0xa ; 000022CF 81FE0A00 '..',0x0A,'.'
jnc x22da ; 000022D3 7305 's.'
call near [cs:si+0x22db] ; 000022D5 2EFF94DB22 '...."'
x22da: ret ; 000022DA C3 '.'
fisub dword [bp+si] ; 000022DB DA22 '."'
in ax,0x22 ; 000022DD E522 '."'
xor [bp+di],sp ; 000022DF 3123 '1#'
xchg ax,si ; 000022E1 96 '.'
and ax,[bx+si+0x24] ; 000022E2 234024 '#@$'
std ; 000022E5 FD '.'
mov bl,al ; 000022E6 8AD8 '..'
call x2a1f ; 000022E8 E83407 '.4.'
mov ax,dx ; 000022EB 8BC2 '..'
call x206c ; 000022ED E87CFD '.|.'
call x22f4 ; 000022F0 E80100 '...'
ret ; 000022F3 C3 '.'
x22f4: push bx ; 000022F4 53 'S'
xor ch,ch ; 000022F5 32ED '2.'
cmp bl,0x0 ; 000022F7 80FB00 '...'
jz x232d ; 000022FA 7431 't1'
sub si,ax ; 000022FC 2BF0 '+.'
mov ah,dh ; 000022FE 8AE6 '..'
sub ah,bl ; 00002300 2AE3 '*.'
x2302: call x205c ; 00002302 E857FD '.W.'
sub si,bp ; 00002305 2BF5 '+.'
sub di,bp ; 00002307 2BFD '+.'
dec ah ; 00002309 FECC '..'
jnz x2302 ; 0000230B 75F5 'u.'
x230d: pop ax ; 0000230D 58 'X'
mov al,0x20 ; 0000230E B020 '. '
x2310: call x2065 ; 00002310 E852FD '.R.'
sub di,bp ; 00002313 2BFD '+.'
dec bl ; 00002315 FECB '..'
jnz x2310 ; 00002317 75F7 'u.'
mov ds,[cs:0x71c] ; 00002319 2E8E1E1C07 '.....'
cmp byte [0x449],0x7 ; 0000231E 803E490407 '.>I..'
jz x232c ; 00002323 7407 't.'
mov al,[0x465] ; 00002325 A06504 '.e.'
mov dx,0x3d8 ; 00002328 BAD803 '...'
out dx,al ; 0000232B EE '.'
x232c: ret ; 0000232C C3 '.'
x232d: mov bl,dh ; 0000232D 8ADE '..'
jmp short x230d ; 0000232F EBDC '..'
std ; 00002331 FD '.'
mov bl,al ; 00002332 8AD8 '..'
call x2a1f ; 00002334 E8E806 '...'
mov ax,dx ; 00002337 8BC2 '..'
call x25c5 ; 00002339 E88902 '...'
mov di,ax ; 0000233C 8BF8 '..'
sub dx,cx ; 0000233E 2BD1 '+.'
add dx,0x101 ; 00002340 81C20101 '....'
shl dh,1 ; 00002344 D0E6 '..'
shl dh,1 ; 00002346 D0E6 '..'
cmp byte [0x449],0x6 ; 00002348 803E490406 '.>I..'
jnc x2354 ; 0000234D 7305 's.'
shl dl,1 ; 0000234F D0E2 '..'
shl di,1 ; 00002351 D1E7 '..'
inc di ; 00002353 47 'G'
x2354: call x2358 ; 00002354 E80100 '...'
ret ; 00002357 C3 '.'
x2358: push es ; 00002358 06 '.'
pop ds ; 00002359 1F '.'
xor ch,ch ; 0000235A 32ED '2.'
add di,0xf0 ; 0000235C 81C7F000 '....'
shl bl,1 ; 00002360 D0E3 '..'
shl bl,1 ; 00002362 D0E3 '..'
jz x2392 ; 00002364 742C 't,'
mov al,bl ; 00002366 8AC3 '..'
mov ah,0x50 ; 00002368 B450 '.P'
mul ah ; 0000236A F6E4 '..'
mov si,di ; 0000236C 8BF7 '..'
sub si,ax ; 0000236E 2BF0 '+.'
mov ah,dh ; 00002370 8AE6 '..'
sub ah,bl ; 00002372 2AE3 '*.'
x2374: call x2105 ; 00002374 E88EFD '...'
sub si,0x2050 ; 00002377 81EE5020 '..P '
sub di,0x2050 ; 0000237B 81EF5020 '..P '
dec ah ; 0000237F FECC '..'
jnz x2374 ; 00002381 75F1 'u.'
x2383: mov al,bh ; 00002383 8AC7 '..'
x2385: call x211e ; 00002385 E896FD '...'
sub di,0x2050 ; 00002388 81EF5020 '..P '
dec bl ; 0000238C FECB '..'
jnz x2385 ; 0000238E 75F5 'u.'
cld ; 00002390 FC '.'
ret ; 00002391 C3 '.'
x2392: mov bl,dh ; 00002392 8ADE '..'
jmp short x2383 ; 00002394 EBED '..'
std ; 00002396 FD '.'
mov bl,al ; 00002397 8AD8 '..'
mov ax,0xa000 ; 00002399 B800A0 '...'
mov es,ax ; 0000239C 8EC0 '..'
mov ax,dx ; 0000239E 8BC2 '..'
inc ah ; 000023A0 FEC4 '..'
push bx ; 000023A2 53 'S'
mov bh,[0x462] ; 000023A3 8A3E6204 '.>b.'
call x2679 ; 000023A7 E8CF02 '...'
pop bx ; 000023AA 5B '['
sub ax,[0x44a] ; 000023AB 2B064A04 '+.J.'
mov di,ax ; 000023AF 8BF8 '..'
sub dx,cx ; 000023B1 2BD1 '+.'
add dx,0x101 ; 000023B3 81C20101 '....'
mov bp,[0x485] ; 000023B7 8B2E8504 '....'
mov cx,[0x44a] ; 000023BB 8B0E4A04 '..J.'
call x23c3 ; 000023BF E80100 '...'
ret ; 000023C2 C3 '.'
x23c3: push es ; 000023C3 06 '.'
pop ds ; 000023C4 1F '.'
mov al,bl ; 000023C5 8AC3 '..'
sub ah,ah ; 000023C7 2AE4 '*.'
push dx ; 000023C9 52 'R'
mul bp ; 000023CA F7E5 '..'
mul cx ; 000023CC F7E1 '..'
mov si,di ; 000023CE 8BF7 '..'
sub si,ax ; 000023D0 2BF0 '+.'
pop dx ; 000023D2 5A 'Z'
mov ax,cx ; 000023D3 8BC1 '..'
or bl,bl ; 000023D5 0ADB 0x0A,'.'
jz x2409 ; 000023D7 7430 't0'
push ax ; 000023D9 50 'P'
mov cl,dh ; 000023DA 8ACE '..'
sub cl,bl ; 000023DC 2ACB '*.'
xor ch,ch ; 000023DE 32ED '2.'
push dx ; 000023E0 52 'R'
mov ax,cx ; 000023E1 8BC1 '..'
mul bp ; 000023E3 F7E5 '..'
mov cx,ax ; 000023E5 8BC8 '..'
mov dx,0x3ce ; 000023E7 BACE03 '...'
mov ax,0x105 ; 000023EA B80501 '...'
out dx,ax ; 000023ED EF '.'
mov dl,0xc4 ; 000023EE B2C4 '..'
mov ax,0xf02 ; 000023F0 B8020F '...'
out dx,ax ; 000023F3 EF '.'
pop dx ; 000023F4 5A 'Z'
pop ax ; 000023F5 58 'X'
call x240d ; 000023F6 E81400 '...'
push dx ; 000023F9 52 'R'
push ax ; 000023FA 50 'P'
mov dx,0x3ce ; 000023FB BACE03 '...'
mov ax,0x5 ; 000023FE B80500 '...'
out dx,ax ; 00002401 EF '.'
pop ax ; 00002402 58 'X'
pop dx ; 00002403 5A 'Z'
x2404: call x2420 ; 00002404 E81900 '...'
cld ; 00002407 FC '.'
ret ; 00002408 C3 '.'
x2409: mov bl,dh ; 00002409 8ADE '..'
jmp short x2404 ; 0000240B EBF7 '..'
x240d: push cx ; 0000240D 51 'Q'
mov cl,dl ; 0000240E 8ACA '..'
xor ch,ch ; 00002410 32ED '2.'
push si ; 00002412 56 'V'
push di ; 00002413 57 'W'
rep movsb ; 00002414 F3A4 '..'
pop di ; 00002416 5F '_'
pop si ; 00002417 5E '^'
sub si,ax ; 00002418 2BF0 '+.'
sub di,ax ; 0000241A 2BF8 '+.'
pop cx ; 0000241C 59 'Y'
loop x240d ; 0000241D E2EE '..'
ret ; 0000241F C3 '.'
x2420: mov dh,bh ; 00002420 8AF7 '..'
sub bh,bh ; 00002422 2AFF '*.'
push ax ; 00002424 50 'P'
push dx ; 00002425 52 'R'
mov ax,bx ; 00002426 8BC3 '..'
mul bp ; 00002428 F7E5 '..'
mov bx,ax ; 0000242A 8BD8 '..'
pop dx ; 0000242C 5A 'Z'
pop ax ; 0000242D 58 'X'
x242e: push ax ; 0000242E 50 'P'
call x21d1 ; 0000242F E89FFD '...'
pop ax ; 00002432 58 'X'
sub di,ax ; 00002433 2BF8 '+.'
dec bx ; 00002435 4B 'K'
jnz x242e ; 00002436 75F6 'u.'
mov dx,0x3c4 ; 00002438 BAC403 '...'
mov ax,0xf02 ; 0000243B B8020F '...'
out dx,ax ; 0000243E EF '.'
ret ; 0000243F C3 '.'
std ; 00002440 FD '.'
mov bl,al ; 00002441 8AD8 '..'
mov ax,0xa000 ; 00002443 B800A0 '...'
mov es,ax ; 00002446 8EC0 '..'
mov ax,dx ; 00002448 8BC2 '..'
inc ah ; 0000244A FEC4 '..'
push bx ; 0000244C 53 'S'
push dx ; 0000244D 52 'R'
call x26dd ; 0000244E E88C02 '...'
pop dx ; 00002451 5A 'Z'
mov bx,[0x44a] ; 00002452 8B1E4A04 '..J.'
shl bx,1 ; 00002456 D1E3 '..'
shl bx,1 ; 00002458 D1E3 '..'
shl bx,1 ; 0000245A D1E3 '..'
sub ax,bx ; 0000245C 2BC3 '+.'
add ax,0x7 ; 0000245E 050700 '...'
pop bx ; 00002461 5B '['
mov di,ax ; 00002462 8BF8 '..'
sub dx,cx ; 00002464 2BD1 '+.'
add dx,0x101 ; 00002466 81C20101 '....'
mov bp,[0x485] ; 0000246A 8B2E8504 '....'
mov cx,[0x44a] ; 0000246E 8B0E4A04 '..J.'
call x2476 ; 00002472 E80100 '...'
ret ; 00002475 C3 '.'
x2476: push es ; 00002476 06 '.'
pop ds ; 00002477 1F '.'
mov al,bl ; 00002478 8AC3 '..'
sub ah,ah ; 0000247A 2AE4 '*.'
push dx ; 0000247C 52 'R'
mul bp ; 0000247D F7E5 '..'
mul cx ; 0000247F F7E1 '..'
shl ax,1 ; 00002481 D1E0 '..'
shl ax,1 ; 00002483 D1E0 '..'
shl ax,1 ; 00002485 D1E0 '..'
mov si,di ; 00002487 8BF7 '..'
sub si,ax ; 00002489 2BF0 '+.'
pop dx ; 0000248B 5A 'Z'
mov ax,cx ; 0000248C 8BC1 '..'
or bl,bl ; 0000248E 0ADB 0x0A,'.'
jz x24aa ; 00002490 7418 't.'
push ax ; 00002492 50 'P'
mov cl,dh ; 00002493 8ACE '..'
sub cl,bl ; 00002495 2ACB '*.'
xor ch,ch ; 00002497 32ED '2.'
push dx ; 00002499 52 'R'
mov ax,cx ; 0000249A 8BC1 '..'
mul bp ; 0000249C F7E5 '..'
mov cx,ax ; 0000249E 8BC8 '..'
pop dx ; 000024A0 5A 'Z'
pop ax ; 000024A1 58 'X'
call x24ae ; 000024A2 E80900 '...'
x24a5: call x24cf ; 000024A5 E82700 '.',0x27,'.'
cld ; 000024A8 FC '.'
ret ; 000024A9 C3 '.'
x24aa: mov bl,dh ; 000024AA 8ADE '..'
jmp short x24a5 ; 000024AC EBF7 '..'
x24ae: push ax ; 000024AE 50 'P'
shl ax,1 ; 000024AF D1E0 '..'
shl ax,1 ; 000024B1 D1E0 '..'
shl ax,1 ; 000024B3 D1E0 '..'
x24b5: push cx ; 000024B5 51 'Q'
mov cl,dl ; 000024B6 8ACA '..'
xor ch,ch ; 000024B8 32ED '2.'
shl cx,1 ; 000024BA D1E1 '..'
shl cx,1 ; 000024BC D1E1 '..'
shl cx,1 ; 000024BE D1E1 '..'
push si ; 000024C0 56 'V'
push di ; 000024C1 57 'W'
rep movsb ; 000024C2 F3A4 '..'
pop di ; 000024C4 5F '_'
pop si ; 000024C5 5E '^'
sub si,ax ; 000024C6 2BF0 '+.'
sub di,ax ; 000024C8 2BF8 '+.'
pop cx ; 000024CA 59 'Y'
loop x24b5 ; 000024CB E2E8 '..'
pop ax ; 000024CD 58 'X'
ret ; 000024CE C3 '.'
x24cf: mov dh,bh ; 000024CF 8AF7 '..'
sub bh,bh ; 000024D1 2AFF '*.'
push ax ; 000024D3 50 'P'
push dx ; 000024D4 52 'R'
mov ax,bx ; 000024D5 8BC3 '..'
mul bp ; 000024D7 F7E5 '..'
mov bx,ax ; 000024D9 8BD8 '..'
pop dx ; 000024DB 5A 'Z'
pop ax ; 000024DC 58 'X'
x24dd: call x2292 ; 000024DD E8B2FD '...'
push ax ; 000024E0 50 'P'
shl ax,1 ; 000024E1 D1E0 '..'
shl ax,1 ; 000024E3 D1E0 '..'
shl ax,1 ; 000024E5 D1E0 '..'
sub di,ax ; 000024E7 2BF8 '+.'
dec bx ; 000024E9 4B 'K'
pop ax ; 000024EA 58 'X'
jnz x24dd ; 000024EB 75F0 'u.'
ret ; 000024ED C3 '.'
x24ee: push ax ; 000024EE 50 'P'
mov ah,dh ; 000024EF 8AE6 '..'
sub ah,ch ; 000024F1 2AE5 '*.'
inc ah ; 000024F3 FEC4 '..'
cmp ah,al ; 000024F5 3AE0 ':.'
pop ax ; 000024F7 58 'X'
jnz x24fc ; 000024F8 7502 'u.'
sub al,al ; 000024FA 2AC0 '*.'
x24fc: ret ; 000024FC C3 '.'
call x2503 ; 000024FD E80300 '...'
jmp x713 ; 00002500 E910E2 '...'
x2503: mov al,[0x449] ; 00002503 A04904 '.I.'
xor ah,ah ; 00002506 32E4 '2.'
shl ax,1 ; 00002508 D1E0 '..'
mov si,ax ; 0000250A 8BF0 '..'
mov si,[cs:si+0x1290] ; 0000250C 2E8BB49012 '.....'
shl si,1 ; 00002511 D1E6 '..'
cmp si,0xa ; 00002513 81FE0A00 '..',0x0A,'.'
jnc x251e ; 00002517 7305 's.'
call near [cs:si+0x251f] ; 00002519 2EFF941F25 '....%'
x251e: ret ; 0000251E C3 '.'
push ds ; 0000251F 1E '.'
and ax,0x2529 ; 00002520 252925 '%)%'
db 0x79,0x25
sub ax,0xb126 ; 00002525 2D26B1 '-&.'
es call 0x2a1f ; 00002528 26E8F304 '&...'
xor ch,ch ; 0000252C 32ED '2.'
mov cl,bh ; 0000252E 8ACF '..'
mov di,cx ; 00002530 8BF9 '..'
shl di,1 ; 00002532 D1E7 '..'
mov ax,[di+0x450] ; 00002534 8B855004 '..P.'
mov bx,[0x44c] ; 00002538 8B1E4C04 '..L.'
mov dx,[0x44a] ; 0000253C 8B164A04 '..J.'
call x2562 ; 00002540 E81F00 '...'
mov si,di ; 00002543 8BF7 '..'
mov dx,[0x463] ; 00002545 8B166304 '..c.'
add dx,byte +0x6 ; 00002549 83C206 '...'
test byte [0x487],0x4 ; 0000254C F606870404 '.....'
push es ; 00002551 06 '.'
pop ds ; 00002552 1F '.'
jz x2560 ; 00002553 740B 't.'
x2555: in al,dx ; 00002555 EC '.'
test al,0x1 ; 00002556 A801 '..'
jnz x2555 ; 00002558 75FB 'u.'
cli ; 0000255A FA '.'
x255b: in al,dx ; 0000255B EC '.'
test al,0x1 ; 0000255C A801 '..'
jz x255b ; 0000255E 74FB 't.'
x2560: lodsw ; 00002560 AD '.'
ret ; 00002561 C3 '.'
x2562: xor di,di ; 00002562 33FF '3.'
jcxz x256a ; 00002564 E304 '..'
x2566: add di,bx ; 00002566 03FB '..'
loop x2566 ; 00002568 E2FC '..'
x256a: mov cx,ax ; 0000256A 8BC8 '..'
mov al,ah ; 0000256C 8AC4 '..'
mul dl ; 0000256E F6E2 '..'
xor ch,ch ; 00002570 32ED '2.'
add ax,cx ; 00002572 03C1 '..'
shl ax,1 ; 00002574 D1E0 '..'
add di,ax ; 00002576 03F8 '..'
ret ; 00002578 C3 '.'
call x2a1f ; 00002579 E8A304 '...'
mov ax,[0x450] ; 0000257C A15004 '.P.'
call x25c5 ; 0000257F E84300 '.C.'
mov si,ax ; 00002582 8BF0 '..'
mov ah,[0x449] ; 00002584 8A264904 '.&I.'
push es ; 00002588 06 '.'
pop ds ; 00002589 1F '.'
sub sp,byte +0x8 ; 0000258A 83EC08 '...'
mov bp,sp ; 0000258D 8BEC '..'
call x25d8 ; 0000258F E84600 '.F.'
mov ds,[cs:0x71c] ; 00002592 2E8E1E1C07 '.....'
push ds ; 00002597 1E '.'
les di,[0x10c] ; 00002598 C43E0C01 '.>..'
mov ax,0x0 ; 0000259C B80000 '...'
mov dx,0x80 ; 0000259F BA8000 '...'
mov bx,0x8 ; 000025A2 BB0800 '...'
call x2a04 ; 000025A5 E85C04 '.\.'
pop ds ; 000025A8 1F '.'
jc x25c1 ; 000025A9 7216 'r.'
les di,[0x7c] ; 000025AB C43E7C00 '.>|.'
mov ax,es ; 000025AF 8CC0 '..'
or ax,di ; 000025B1 0BC7 '..'
jz x25c1 ; 000025B3 740C 't.'
mov ax,0x80 ; 000025B5 B88000 '...'
mov dx,0x80 ; 000025B8 BA8000 '...'
mov bx,0x8 ; 000025BB BB0800 '...'
call x2a04 ; 000025BE E84304 '.C.'
x25c1: add sp,byte +0x8 ; 000025C1 83C408 '...'
ret ; 000025C4 C3 '.'
x25c5: push bx ; 000025C5 53 'S'
mov bx,ax ; 000025C6 8BD8 '..'
mov al,ah ; 000025C8 8AC4 '..'
mul byte [0x44a] ; 000025CA F6264A04 '.&J.'
shl ax,1 ; 000025CE D1E0 '..'
shl ax,1 ; 000025D0 D1E0 '..'
sub bh,bh ; 000025D2 2AFF '*.'
add ax,bx ; 000025D4 03C3 '..'
pop bx ; 000025D6 5B '['
ret ; 000025D7 C3 '.'
x25d8: cmp ah,0x6 ; 000025D8 80FC06 '...'
jnz x25f6 ; 000025DB 7519 'u.'
mov dh,0x4 ; 000025DD B604 '..'
x25df: mov al,[si] ; 000025DF 8A04 '..'
mov [bp+0x0],al ; 000025E1 884600 '.F.'
inc bp ; 000025E4 45 'E'
mov al,[si+0x2000] ; 000025E5 8A840020 '... '
mov [bp+0x0],al ; 000025E9 884600 '.F.'
inc bp ; 000025EC 45 'E'
add si,byte +0x50 ; 000025ED 83C650 '..P'
dec dh ; 000025F0 FECE '..'
jnz x25df ; 000025F2 75EB 'u.'
jmp short x260c ; 000025F4 EB16 '..'
x25f6: shl si,1 ; 000025F6 D1E6 '..'
mov dh,0x4 ; 000025F8 B604 '..'
x25fa: call x2610 ; 000025FA E81300 '...'
add si,0x2000 ; 000025FD 81C60020 '... '
call x2610 ; 00002601 E80C00 '...'
sub si,0x1fb0 ; 00002604 81EEB01F '....'
dec dh ; 00002608 FECE '..'
jnz x25fa ; 0000260A 75EE 'u.'
x260c: sub bp,byte +0x8 ; 0000260C 83ED08 '...'
ret ; 0000260F C3 '.'
x2610: mov ah,[si] ; 00002610 8A24 '.$'
mov al,[si+0x1] ; 00002612 8A4401 '.D.'
mov cx,0xc000 ; 00002615 B900C0 '...'
mov dl,0x0 ; 00002618 B200 '..'
x261a: test cx,ax ; 0000261A 85C1 '..'
clc ; 0000261C F8 '.'
jz x2620 ; 0000261D 7401 't.'
stc ; 0000261F F9 '.'
x2620: rcl dl,1 ; 00002620 D0D2 '..'
shr cx,1 ; 00002622 D1E9 '..'
shr cx,1 ; 00002624 D1E9 '..'
jnc x261a ; 00002626 73F2 's.'
mov [bp+0x0],dl ; 00002628 885600 '.V.'
inc bp ; 0000262B 45 'E'
ret ; 0000262C C3 '.'
mov dx,0xa000 ; 0000262D BA00A0 '...'
mov es,dx ; 00002630 8EC2 '..'
mov si,bx ; 00002632 8BF3 '..'
shr si,1 ; 00002634 D1EE '..'
shr si,1 ; 00002636 D1EE '..'
shr si,1 ; 00002638 D1EE '..'
shr si,1 ; 0000263A D1EE '..'
shr si,1 ; 0000263C D1EE '..'
shr si,1 ; 0000263E D1EE '..'
shr si,1 ; 00002640 D1EE '..'
shr si,1 ; 00002642 D1EE '..'
shl si,1 ; 00002644 D1E6 '..'
mov ax,[si+0x450] ; 00002646 8B845004 '..P.'
call x2679 ; 0000264A E82C00 '.,.'
mov si,ax ; 0000264D 8BF0 '..'
mov bx,[0x485] ; 0000264F 8B1E8504 '....'
sub sp,bx ; 00002653 2BE3 '+.'
mov bp,sp ; 00002655 8BEC '..'
mov dx,0x3ce ; 00002657 BACE03 '...'
mov ax,0x805 ; 0000265A B80508 '...'
out dx,ax ; 0000265D EF '.'
mov cx,[0x44a] ; 0000265E 8B0E4A04 '..J.'
call x269e ; 00002662 E83900 '.9.'
mov ax,0x5 ; 00002665 B80500 '...'
out dx,ax ; 00002668 EF '.'
les di,[0x10c] ; 00002669 C43E0C01 '.>..'
mov ax,0x0 ; 0000266D B80000 '...'
mov dx,0x100 ; 00002670 BA0001 '...'
call x2a04 ; 00002673 E88E03 '...'
add sp,bx ; 00002676 03E3 '..'
ret ; 00002678 C3 '.'
x2679: push bx ; 00002679 53 'S'
push cx ; 0000267A 51 'Q'
push dx ; 0000267B 52 'R'
sub ch,ch ; 0000267C 2AED '*.'
mov cl,bh ; 0000267E 8ACF '..'
mov bx,ax ; 00002680 8BD8 '..'
mov al,ah ; 00002682 8AC4 '..'
mul byte [0x44a] ; 00002684 F6264A04 '.&J.'
mul word [0x485] ; 00002688 F7268504 '.&..'
sub bh,bh ; 0000268C 2AFF '*.'
add ax,bx ; 0000268E 03C3 '..'
mov bx,[0x44c] ; 00002690 8B1E4C04 '..L.'
jcxz x269a ; 00002694 E304 '..'
x2696: add ax,bx ; 00002696 03C3 '..'
loop x2696 ; 00002698 E2FC '..'
x269a: pop dx ; 0000269A 5A 'Z'
pop cx ; 0000269B 59 'Y'
pop bx ; 0000269C 5B '['
ret ; 0000269D C3 '.'
x269e: push bx ; 0000269E 53 'S'
x269f: mov al,[es:si] ; 0000269F 268A04 '&..'
not al ; 000026A2 F6D0 '..'
mov [bp+0x0],al ; 000026A4 884600 '.F.'
inc bp ; 000026A7 45 'E'
add si,cx ; 000026A8 03F1 '..'
dec bx ; 000026AA 4B 'K'
jnz x269f ; 000026AB 75F2 'u.'
pop bx ; 000026AD 5B '['
sub bp,bx ; 000026AE 2BEB '+.'
ret ; 000026B0 C3 '.'
mov dx,0xa000 ; 000026B1 BA00A0 '...'
mov es,dx ; 000026B4 8EC2 '..'
mov ax,[0x450] ; 000026B6 A15004 '.P.'
call x26dd ; 000026B9 E82100 '.!.'
mov si,ax ; 000026BC 8BF0 '..'
mov bx,[0x485] ; 000026BE 8B1E8504 '....'
sub sp,bx ; 000026C2 2BE3 '+.'
mov bp,sp ; 000026C4 8BEC '..'
mov dx,[0x44a] ; 000026C6 8B164A04 '..J.'
call x26f5 ; 000026CA E82800 '.(.'
les di,[0x10c] ; 000026CD C43E0C01 '.>..'
mov ax,0x0 ; 000026D1 B80000 '...'
mov dx,0x100 ; 000026D4 BA0001 '...'
call x2a04 ; 000026D7 E82A03 '.*.'
add sp,bx ; 000026DA 03E3 '..'
ret ; 000026DC C3 '.'
x26dd: mov bx,ax ; 000026DD 8BD8 '..'
mov al,ah ; 000026DF 8AC4 '..'
mul byte [0x44a] ; 000026E1 F6264A04 '.&J.'
mul word [0x485] ; 000026E5 F7268504 '.&..'
add al,bl ; 000026E9 02C3 '..'
adc ah,0x0 ; 000026EB 80D400 '...'
shl ax,1 ; 000026EE D1E0 '..'
shl ax,1 ; 000026F0 D1E0 '..'
shl ax,1 ; 000026F2 D1E0 '..'
ret ; 000026F4 C3 '.'
x26f5: push bx ; 000026F5 53 'S'
x26f6: push bx ; 000026F6 53 'S'
mov bh,0x80 ; 000026F7 B780 '..'
sub ah,ah ; 000026F9 2AE4 '*.'
mov cx,0x8 ; 000026FB B90800 '...'
x26fe: mov al,[es:si] ; 000026FE 268A04 '&..'
cmp al,0x0 ; 00002701 3C00 '<.'
jz x2707 ; 00002703 7402 't.'
or ah,bh ; 00002705 0AE7 0x0A,'.'
x2707: ror bh,1 ; 00002707 D0CF '..'
inc si ; 00002709 46 'F'
loop x26fe ; 0000270A E2F2 '..'
mov [bp+0x0],ah ; 0000270C 886600 '.f.'
inc bp ; 0000270F 45 'E'
sub si,byte +0x8 ; 00002710 83EE08 '...'
mov cx,dx ; 00002713 8BCA '..'
shl cx,1 ; 00002715 D1E1 '..'
shl cx,1 ; 00002717 D1E1 '..'
shl cx,1 ; 00002719 D1E1 '..'
add si,cx ; 0000271B 03F1 '..'
pop bx ; 0000271D 5B '['
dec bx ; 0000271E 4B 'K'
jnz x26f6 ; 0000271F 75D5 'u.'
pop bx ; 00002721 5B '['
sub bp,bx ; 00002722 2BEB '+.'
ret ; 00002724 C3 '.'
call x272b ; 00002725 E80300 '...'
jmp x713 ; 00002728 E9E8DF '...'
x272b: mov ah,[0x449] ; 0000272B 8A264904 '.&I.'
cmp ah,0x11 ; 0000272F 80FC11 '...'
jnz x273a ; 00002732 7506 'u.'
and bl,0x80 ; 00002734 80E380 '...'
or bl,0x3f ; 00002737 80CB3F '..?'
x273a: mov si,ax ; 0000273A 8BF0 '..'
shr si,1 ; 0000273C D1EE '..'
shr si,1 ; 0000273E D1EE '..'
shr si,1 ; 00002740 D1EE '..'
shr si,1 ; 00002742 D1EE '..'
shr si,1 ; 00002744 D1EE '..'
shr si,1 ; 00002746 D1EE '..'
shr si,1 ; 00002748 D1EE '..'
shr si,1 ; 0000274A D1EE '..'
shl si,1 ; 0000274C D1E6 '..'
mov si,[cs:si+0x1290] ; 0000274E 2E8BB49012 '.....'
shl si,1 ; 00002753 D1E6 '..'
cmp si,0xa ; 00002755 81FE0A00 '..',0x0A,'.'
jnc x2760 ; 00002759 7305 's.'
call near [cs:si+0x2761] ; 0000275B 2EFF946127 '...a',0x27
x2760: ret ; 00002760 C3 '.'
pusha ; 00002761 60 '`'
daa ; 00002762 27 0x27
imul sp,[bx],byte -0x55 ; 00002763 6B27AB 'k',0x27,'.'
daa ; 00002766 27 0x27
call 0xe829:0x3228 ; 00002767 9A283229E8 '.(2).'
mov cl,0x2 ; 0000276C B102 '..'
mov ah,bl ; 0000276E 8AE3 '..'
push ax ; 00002770 50 'P'
push cx ; 00002771 51 'Q'
xor ch,ch ; 00002772 32ED '2.'
mov cl,bh ; 00002774 8ACF '..'
mov di,cx ; 00002776 8BF9 '..'
shl di,1 ; 00002778 D1E7 '..'
mov ax,[di+0x450] ; 0000277A 8B855004 '..P.'
mov bx,[0x44c] ; 0000277E 8B1E4C04 '..L.'
mov dx,[0x44a] ; 00002782 8B164A04 '..J.'
call x2562 ; 00002786 E8D9FD '...'
pop cx ; 00002789 59 'Y'
pop bx ; 0000278A 5B '['
mov dx,[0x463] ; 0000278B 8B166304 '..c.'
add dx,byte +0x6 ; 0000278F 83C206 '...'
x2792: test byte [0x487],0x4 ; 00002792 F606870404 '.....'
jz x27a4 ; 00002797 740B 't.'
x2799: in al,dx ; 00002799 EC '.'
test al,0x1 ; 0000279A A801 '..'
jnz x2799 ; 0000279C 75FB 'u.'
cli ; 0000279E FA '.'
x279f: in al,dx ; 0000279F EC '.'
test al,0x1 ; 000027A0 A801 '..'
jz x279f ; 000027A2 74FB 't.'
x27a4: mov ax,bx ; 000027A4 8BC3 '..'
stosw ; 000027A6 AB '.'
sti ; 000027A7 FB '.'
loop x2792 ; 000027A8 E2E8 '..'
ret ; 000027AA C3 '.'
call x2a1f ; 000027AB E87102 '.q.'
mov dh,[0x449] ; 000027AE 8A364904 '.6I.'
xor ah,ah ; 000027B2 32E4 '2.'
push ax ; 000027B4 50 'P'
mov ax,[0x450] ; 000027B5 A15004 '.P.'
call x25c5 ; 000027B8 E80AFE '.',0x0A,'.'
mov di,ax ; 000027BB 8BF8 '..'
pop ax ; 000027BD 58 'X'
cmp al,0x80 ; 000027BE 3C80 '<.'
jnc x27c8 ; 000027C0 7306 's.'
lds si,[0x10c] ; 000027C2 C5360C01 '.6..'
jmp short x27ce ; 000027C6 EB06 '..'
x27c8: sub al,0x80 ; 000027C8 2C80 ',.'
lds si,[0x7c] ; 000027CA C5367C00 '.6|.'
x27ce: cmp dh,0x6 ; 000027CE 80FE06 '...'
jc x27d8 ; 000027D1 7205 'r.'
call x27dc ; 000027D3 E80600 '...'
jmp short x27db ; 000027D6 EB03 '..'
x27d8: call x280e ; 000027D8 E83300 '.3.'
x27db: ret ; 000027DB C3 '.'
x27dc: shl ax,1 ; 000027DC D1E0 '..'
shl ax,1 ; 000027DE D1E0 '..'
shl ax,1 ; 000027E0 D1E0 '..'
add si,ax ; 000027E2 03F0 '..'
x27e4: push di ; 000027E4 57 'W'
push si ; 000027E5 56 'V'
mov dh,0x4 ; 000027E6 B604 '..'
x27e8: lodsb ; 000027E8 AC '.'
test bl,0x80 ; 000027E9 F6C380 '...'
jnz x2802 ; 000027EC 7514 'u.'
stosb ; 000027EE AA '.'
lodsb ; 000027EF AC '.'
x27f0: mov [es:di+0x1fff],al ; 000027F0 268885FF1F '&....'
add di,byte +0x4f ; 000027F5 83C74F '..O'
dec dh ; 000027F8 FECE '..'
jnz x27e8 ; 000027FA 75EC 'u.'
pop si ; 000027FC 5E '^'
pop di ; 000027FD 5F '_'
inc di ; 000027FE 47 'G'
loop x27e4 ; 000027FF E2E3 '..'
ret ; 00002801 C3 '.'
x2802: xor al,[es:di] ; 00002802 263205 '&2.'
stosb ; 00002805 AA '.'
lodsb ; 00002806 AC '.'
xor al,[es:di+0x1fff] ; 00002807 263285FF1F '&2...'
jmp short x27f0 ; 0000280C EBE2 '..'
x280e: shl ax,1 ; 0000280E D1E0 '..'
shl ax,1 ; 00002810 D1E0 '..'
shl ax,1 ; 00002812 D1E0 '..'
add si,ax ; 00002814 03F0 '..'
mov dl,bl ; 00002816 8AD3 '..'
shl di,1 ; 00002818 D1E7 '..'
and bl,0x3 ; 0000281A 80E303 '...'
mov al,bl ; 0000281D 8AC3 '..'
push cx ; 0000281F 51 'Q'
mov cx,0x3 ; 00002820 B90300 '...'
x2823: shl al,1 ; 00002823 D0E0 '..'
shl al,1 ; 00002825 D0E0 '..'
or bl,al ; 00002827 0AD8 0x0A,'.'
loop x2823 ; 00002829 E2F8 '..'
mov bh,bl ; 0000282B 8AFB '..'
pop cx ; 0000282D 59 'Y'
x282e: push di ; 0000282E 57 'W'
push si ; 0000282F 56 'V'
mov dh,0x4 ; 00002830 B604 '..'
x2832: lodsb ; 00002832 AC '.'
call x2878 ; 00002833 E84200 '.B.'
and ax,bx ; 00002836 23C3 '#.'
test dl,0x80 ; 00002838 F6C280 '...'
jz x2844 ; 0000283B 7407 't.'
xor ah,[es:di] ; 0000283D 263225 '&2%'
xor al,[es:di+0x1] ; 00002840 26324501 '&2E.'
x2844: mov [es:di],ah ; 00002844 268825 '&.%'
mov [es:di+0x1],al ; 00002847 26884501 '&.E.'
lodsb ; 0000284B AC '.'
call x2878 ; 0000284C E82900 '.).'
and ax,bx ; 0000284F 23C3 '#.'
test dl,0x80 ; 00002851 F6C280 '...'
jz x2860 ; 00002854 740A
xor ah,[es:di+0x2000] ; 00002856 2632A50020 '&2.. '
xor al,[es:di+0x2001] ; 0000285B 2632850120 '&2.. '
x2860: mov [es:di+0x2000],ah ; 00002860 2688A50020 '&... '
mov [es:di+0x2001],al ; 00002865 2688850120 '&... '
add di,byte +0x50 ; 0000286A 83C750 '..P'
dec dh ; 0000286D FECE '..'
jnz x2832 ; 0000286F 75C1 'u.'
pop si ; 00002871 5E '^'
pop di ; 00002872 5F '_'
inc di ; 00002873 47 'G'
inc di ; 00002874 47 'G'
loop x282e ; 00002875 E2B7 '..'
ret ; 00002877 C3 '.'
x2878: push dx ; 00002878 52 'R'
push cx ; 00002879 51 'Q'
push bx ; 0000287A 53 'S'
sub dx,dx ; 0000287B 2BD2 '+.'
mov cx,0x1 ; 0000287D B90100 '...'
x2880: mov bx,ax ; 00002880 8BD8 '..'
and bx,cx ; 00002882 23D9 '#.'
or dx,bx ; 00002884 0BD3 '..'
shl ax,1 ; 00002886 D1E0 '..'
shl cx,1 ; 00002888 D1E1 '..'
mov bx,ax ; 0000288A 8BD8 '..'
and bx,cx ; 0000288C 23D9 '#.'
or dx,bx ; 0000288E 0BD3 '..'
shl cx,1 ; 00002890 D1E1 '..'
jnc x2880 ; 00002892 73EC 's.'
mov ax,dx ; 00002894 8BC2 '..'
pop bx ; 00002896 5B '['
pop cx ; 00002897 59 'Y'
pop dx ; 00002898 5A 'Z'
ret ; 00002899 C3 '.'
xor ah,ah ; 0000289A 32E4 '2.'
mul word [0x485] ; 0000289C F7268504 '.&..'
push ax ; 000028A0 50 'P'
mov si,bx ; 000028A1 8BF3 '..'
shr si,1 ; 000028A3 D1EE '..'
shr si,1 ; 000028A5 D1EE '..'
shr si,1 ; 000028A7 D1EE '..'
shr si,1 ; 000028A9 D1EE '..'
shr si,1 ; 000028AB D1EE '..'
shr si,1 ; 000028AD D1EE '..'
shr si,1 ; 000028AF D1EE '..'
shr si,1 ; 000028B1 D1EE '..'
shl si,1 ; 000028B3 D1E6 '..'
mov ax,[si+0x450] ; 000028B5 8B845004 '..P.'
call x2679 ; 000028B9 E8BDFD '...'
mov di,ax ; 000028BC 8BF8 '..'
mov dx,0xa000 ; 000028BE BA00A0 '...'
mov es,dx ; 000028C1 8EC2 '..'
mov bp,[0x44a] ; 000028C3 8B2E4A04 '..J.'
mov dx,[0x485] ; 000028C7 8B168504 '....'
lds si,[0x10c] ; 000028CB C5360C01 '.6..'
pop ax ; 000028CF 58 'X'
add si,ax ; 000028D0 03F0 '..'
call x28d6 ; 000028D2 E80100 '...'
ret ; 000028D5 C3 '.'
x28d6: test bl,0x80 ; 000028D6 F6C380 '...'
jz x28e6 ; 000028D9 740B 't.'
push dx ; 000028DB 52 'R'
mov dx,0x3ce ; 000028DC BACE03 '...'
mov ax,0x1803 ; 000028DF B80318 '...'
out dx,ax ; 000028E2 EF '.'
pop dx ; 000028E3 5A 'Z'
jmp short x28fd ; 000028E4 EB17 '..'
x28e6: push di ; 000028E6 57 'W'
push dx ; 000028E7 52 'R'
mov dx,0x3c4 ; 000028E8 BAC403 '...'
mov ax,0xf02 ; 000028EB B8020F '...'
out dx,ax ; 000028EE EF '.'
pop dx ; 000028EF 5A 'Z'
sub ax,ax ; 000028F0 2BC0 '+.'
push cx ; 000028F2 51 'Q'
mov cx,dx ; 000028F3 8BCA '..'
x28f5: stosb ; 000028F5 AA '.'
add di,bp ; 000028F6 03FD '..'
dec di ; 000028F8 4F 'O'
loop x28f5 ; 000028F9 E2FA '..'
pop cx ; 000028FB 59 'Y'
pop di ; 000028FC 5F '_'
x28fd: push dx ; 000028FD 52 'R'
mov dx,0x3c4 ; 000028FE BAC403 '...'
mov ah,bl ; 00002901 8AE3 '..'
mov al,0x2 ; 00002903 B002 '..'
out dx,ax ; 00002905 EF '.'
pop dx ; 00002906 5A 'Z'
push di ; 00002907 57 'W'
push bx ; 00002908 53 'S'
push cx ; 00002909 51 'Q'
mov bx,dx ; 0000290A 8BDA '..'
mov cx,bp ; 0000290C 8BCD '..'
x290e: mov al,[si] ; 0000290E 8A04 '..'
mov ah,[es:di] ; 00002910 268A25 '&.%'
mov [es:di],al ; 00002913 268805 '&..'
inc si ; 00002916 46 'F'
add di,cx ; 00002917 03F9 '..'
dec bx ; 00002919 4B 'K'
jnz x290e ; 0000291A 75F2 'u.'
pop cx ; 0000291C 59 'Y'
pop bx ; 0000291D 5B '['
sub si,dx ; 0000291E 2BF2 '+.'
pop di ; 00002920 5F '_'
inc di ; 00002921 47 'G'
loop x28d6 ; 00002922 E2B2 '..'
mov dx,0x3ce ; 00002924 BACE03 '...'
mov ax,0x3 ; 00002927 B80300 '...'
out dx,ax ; 0000292A EF '.'
mov dl,0xc4 ; 0000292B B2C4 '..'
mov ax,0xf02 ; 0000292D B8020F '...'
out dx,ax ; 00002930 EF '.'
ret ; 00002931 C3 '.'
mul byte [0x485] ; 00002932 F6268504 '.&..'
push ax ; 00002936 50 'P'
push bx ; 00002937 53 'S'
mov ax,[0x450] ; 00002938 A15004 '.P.'
call x26dd ; 0000293B E89FFD '...'
mov di,ax ; 0000293E 8BF8 '..'
mov dx,0xa000 ; 00002940 BA00A0 '...'
mov es,dx ; 00002943 8EC2 '..'
pop bx ; 00002945 5B '['
pop ax ; 00002946 58 'X'
mov dx,[0x485] ; 00002947 8B168504 '....'
mov bp,[0x44a] ; 0000294B 8B2E4A04 '..J.'
lds si,[0x10c] ; 0000294F C5360C01 '.6..'
add si,ax ; 00002953 03F0 '..'
x2955: push bx ; 00002955 53 'S'
push cx ; 00002956 51 'Q'
push di ; 00002957 57 'W'
push si ; 00002958 56 'V'
call x2966 ; 00002959 E80A00 '.',0x0A,'.'
pop si ; 0000295C 5E '^'
pop di ; 0000295D 5F '_'
add di,byte +0x8 ; 0000295E 83C708 '...'
pop cx ; 00002961 59 'Y'
pop bx ; 00002962 5B '['
loop x2955 ; 00002963 E2F0 '..'
ret ; 00002965 C3 '.'
x2966: push dx ; 00002966 52 'R'
push bp ; 00002967 55 'U'
shl bp,1 ; 00002968 D1E5 '..'
shl bp,1 ; 0000296A D1E5 '..'
shl bp,1 ; 0000296C D1E5 '..'
cld ; 0000296E FC '.'
x296f: lodsb ; 0000296F AC '.'
mov ah,al ; 00002970 8AE0 '..'
push di ; 00002972 57 'W'
mov cx,0x8 ; 00002973 B90800 '...'
x2976: mov al,bl ; 00002976 8AC3 '..'
shl ah,1 ; 00002978 D0E4 '..'
jc x297e ; 0000297A 7202 'r.'
mov al,bh ; 0000297C 8AC7 '..'
x297e: stosb ; 0000297E AA '.'
loop x2976 ; 0000297F E2F5 '..'
pop di ; 00002981 5F '_'
add di,bp ; 00002982 03FD '..'
dec dx ; 00002984 4A 'J'
jnz x296f ; 00002985 75E8 'u.'
pop bp ; 00002987 5D ']'
pop dx ; 00002988 5A 'Z'
ret ; 00002989 C3 '.'
call x2990 ; 0000298A E80300 '...'
jmp x713 ; 0000298D E983DD '...'
x2990: mov ah,[0x449] ; 00002990 8A264904 '.&I.'
mov si,ax ; 00002994 8BF0 '..'
shr si,1 ; 00002996 D1EE '..'
shr si,1 ; 00002998 D1EE '..'
shr si,1 ; 0000299A D1EE '..'
shr si,1 ; 0000299C D1EE '..'
shr si,1 ; 0000299E D1EE '..'
shr si,1 ; 000029A0 D1EE '..'
shr si,1 ; 000029A2 D1EE '..'
shr si,1 ; 000029A4 D1EE '..'
shl si,1 ; 000029A6 D1E6 '..'
mov si,[cs:si+0x1290] ; 000029A8 2E8BB49012 '.....'
shl si,1 ; 000029AD D1E6 '..'
cmp si,0xa ; 000029AF 81FE0A00 '..',0x0A,'.'
jnc x29ba ; 000029B3 7305 's.'
call near [cs:si+0x29bb] ; 000029B5 2EFF94BB29 '....)'
x29ba: ret ; 000029BA C3 '.'
mov dx,0xc529 ; 000029BB BA29C5 '.).'
sub [bp+di+0x9a27],bp ; 000029BE 29AB279A ').',0x27,'.'
sub [bp+si],dh ; 000029C2 2832 '(2'
sub ax,bp ; 000029C4 29E8 ').'
push di ; 000029C6 57 'W'
add [bx+si+0x51],dl ; 000029C7 005051 '.PQ'
xor ch,ch ; 000029CA 32ED '2.'
mov cl,bh ; 000029CC 8ACF '..'
mov di,cx ; 000029CE 8BF9 '..'
shl di,1 ; 000029D0 D1E7 '..'
mov ax,[di+0x450] ; 000029D2 8B855004 '..P.'
mov bx,[0x44c] ; 000029D6 8B1E4C04 '..L.'
mov dx,[0x44a] ; 000029DA 8B164A04 '..J.'
call x2562 ; 000029DE E881FB '...'
pop cx ; 000029E1 59 'Y'
pop bx ; 000029E2 5B '['
mov dx,[0x463] ; 000029E3 8B166304 '..c.'
add dx,byte +0x6 ; 000029E7 83C206 '...'
x29ea: test byte [0x487],0x4 ; 000029EA F606870404 '.....'
jz x29fc ; 000029EF 740B 't.'
x29f1: in al,dx ; 000029F1 EC '.'
test al,0x1 ; 000029F2 A801 '..'
jnz x29f1 ; 000029F4 75FB 'u.'
cli ; 000029F6 FA '.'
x29f7: in al,dx ; 000029F7 EC '.'
test al,0x1 ; 000029F8 A801 '..'
jz x29f7 ; 000029FA 74FB 't.'
x29fc: mov al,bl ; 000029FC 8AC3 '..'
stosb ; 000029FE AA '.'
sti ; 000029FF FB '.'
inc di ; 00002A00 47 'G'
loop x29ea ; 00002A01 E2E7 '..'
ret ; 00002A03 C3 '.'
x2a04: cld ; 00002A04 FC '.'
push ss ; 00002A05 16 '.'
pop ds ; 00002A06 1F '.'
mov si,bp ; 00002A07 8BF5 '..'
x2a09: push si ; 00002A09 56 'V'
push di ; 00002A0A 57 'W'
mov cx,bx ; 00002A0B 8BCB '..'
repe cmpsb ; 00002A0D F3A6 '..'
pop di ; 00002A0F 5F '_'
pop si ; 00002A10 5E '^'
jz x2a1d ; 00002A11 740A 't',0x0A
inc ax ; 00002A13 40 '@'
add di,bx ; 00002A14 03FB '..'
dec dx ; 00002A16 4A 'J'
jnz x2a09 ; 00002A17 75F0 'u.'
sub ax,ax ; 00002A19 2BC0 '+.'
clc ; 00002A1B F8 '.'
ret ; 00002A1C C3 '.'
x2a1d: stc ; 00002A1D F9 '.'
ret ; 00002A1E C3 '.'
x2a1f: mov si,0xb800 ; 00002A1F BE00B8 '...'
mov di,[0x410] ; 00002A22 8B3E1004 '.>..'
and di,0x30 ; 00002A26 81E73000 '..0.'
cmp di,byte +0x30 ; 00002A2A 83FF30 '..0'
jnz x2a32 ; 00002A2D 7503 'u.'
mov si,0xb000 ; 00002A2F BE00B0 '...'
x2a32: mov es,si ; 00002A32 8EC6 '..'
ret ; 00002A34 C3 '.'
test [es:bp+di+0x14],ecx ; 00002A35 6626854B14 'f&.K.'
push cs ; 00002A3A 0E '.'
cmp byte [0x463],0xb4 ; 00002A3B 803E6304B4 '.>c..'
jz x2a4b ; 00002A40 7409 't.'
test byte [0x487],0x8 ; 00002A42 F606870408 '.....'
jz x2a4e ; 00002A47 7405 't.'
int 0x42 ; 00002A49 CD42 '.B'
x2a4b: jmp x713 ; 00002A4B E9C5DC '...'
x2a4e: xor bp,bp ; 00002A4E 33ED '3.'
les di,[0x4a8] ; 00002A50 C43EA804 '.>..'
add di,byte +0x4 ; 00002A54 83C704 '...'
les di,[es:di] ; 00002A57 26C43D '&.='
mov ax,es ; 00002A5A 8CC0 '..'
or ax,di ; 00002A5C 0BC7 '..'
jz x2a61 ; 00002A5E 7401 't.'
inc bp ; 00002A60 45 'E'
x2a61: call x2b77 ; 00002A61 E81301 '...'
or bh,bh ; 00002A64 0AFF 0x0A,'.'
jnz x2abd ; 00002A66 7555 'uU'
mov bh,bl ; 00002A68 8AFB '..'
mov al,[0x466] ; 00002A6A A06604 '.f.'
and al,0xe0 ; 00002A6D 24E0 '$.'
and bl,0x1f ; 00002A6F 80E31F '...'
or al,bl ; 00002A72 0AC3 0x0A,'.'
mov [0x466],al ; 00002A74 A26604 '.f.'
mov bl,bh ; 00002A77 8ADF '..'
mov ch,al ; 00002A79 8AE8 '..'
and bl,0xf ; 00002A7B 80E30F '...'
mov bh,bl ; 00002A7E 8AFB '..'
shl bl,1 ; 00002A80 D0E3 '..'
and bl,0x10 ; 00002A82 80E310 '...'
and bh,0x7 ; 00002A85 80E707 '...'
or bl,bh ; 00002A88 0ADF 0x0A,'.'
cmp byte [0x449],0x3 ; 00002A8A 803E490403 '.>I..'
jna x2aa2 ; 00002A8F 7611 'v.'
mov ah,0x0 ; 00002A91 B400 '..'
mov al,bl ; 00002A93 8AC3 '..'
call x722 ; 00002A95 E88ADC '...'
call x2b30 ; 00002A98 E89500 '...'
or bp,bp ; 00002A9B 0BED '..'
jz x2aa2 ; 00002A9D 7403 't.'
mov [es:di],bl ; 00002A9F 26881D '&..'
x2aa2: mov ah,0x11 ; 00002AA2 B411 '..'
mov al,bl ; 00002AA4 8AC3 '..'
call x722 ; 00002AA6 E879DC '.y.'
call x2b30 ; 00002AA9 E88400 '...'
or bp,bp ; 00002AAC 0BED '..'
jz x2ab4 ; 00002AAE 7404 't.'
mov [es:di+0x10],bl ; 00002AB0 26885D10 '&.].'
x2ab4: mov bl,ch ; 00002AB4 8ADD '..'
and bl,0x20 ; 00002AB6 80E320 '.. '
mov cl,0x5 ; 00002AB9 B105 '..'
shr bl,cl ; 00002ABB D2EB '..'
x2abd: cmp byte [0x449],0x3 ; 00002ABD 803E490403 '.>I..'
jna x2b17 ; 00002AC2 7653 'vS'
mov al,[0x466] ; 00002AC4 A06604 '.f.'
and al,0xdf ; 00002AC7 24DF '$.'
and bl,0x1 ; 00002AC9 80E301 '...'
jz x2ad0 ; 00002ACC 7402 't.'
or al,0x20 ; 00002ACE 0C20 '. '
x2ad0: mov [0x466],al ; 00002AD0 A26604 '.f.'
and al,0x10 ; 00002AD3 2410 '$.'
or al,0x2 ; 00002AD5 0C02 '..'
or bl,al ; 00002AD7 0AD8 0x0A,'.'
mov ah,0x1 ; 00002AD9 B401 '..'
mov al,bl ; 00002ADB 8AC3 '..'
call x722 ; 00002ADD E842DC '.B.'
call x2b30 ; 00002AE0 E84D00 '.M.'
or bp,bp ; 00002AE3 0BED '..'
jz x2aeb ; 00002AE5 7404 't.'
mov [es:di+0x1],bl ; 00002AE7 26885D01 '&.].'
x2aeb: inc bl ; 00002AEB FEC3 '..'
inc bl ; 00002AED FEC3 '..'
mov ah,0x2 ; 00002AEF B402 '..'
mov al,bl ; 00002AF1 8AC3 '..'
call x722 ; 00002AF3 E82CDC '.,.'
call x2b30 ; 00002AF6 E83700 '.7.'
or bp,bp ; 00002AF9 0BED '..'
jz x2b01 ; 00002AFB 7404 't.'
mov [es:di+0x2],bl ; 00002AFD 26885D02 '&.].'
x2b01: inc bl ; 00002B01 FEC3 '..'
inc bl ; 00002B03 FEC3 '..'
mov ah,0x3 ; 00002B05 B403 '..'
mov al,bl ; 00002B07 8AC3 '..'
call x722 ; 00002B09 E816DC '...'
call x2b30 ; 00002B0C E82100 '.!.'
or bp,bp ; 00002B0F 0BED '..'
jz x2b17 ; 00002B11 7404 't.'
mov [es:di+0x3],bl ; 00002B13 26885D03 '&.].'
x2b17: call x2b6e ; 00002B17 E85400 '.T.'
jmp x713 ; 00002B1A E9F6DB '...'
x2b1d: push cx ; 00002B1D 51 'Q'
xor cx,cx ; 00002B1E 33C9 '3.'
mov ah,0x5 ; 00002B20 B405 '..'
x2b22: in al,dx ; 00002B22 EC '.'
test al,0x8 ; 00002B23 A808 '..'
jnz x2b2e ; 00002B25 7507 'u.'
loop x2b22 ; 00002B27 E2F9 '..'
dec ah ; 00002B29 FECC '..'
jnz x2b22 ; 00002B2B 75F5 'u.'
stc ; 00002B2D F9 '.'
x2b2e: pop cx ; 00002B2E 59 'Y'
ret ; 00002B2F C3 '.'
x2b30: push dx ; 00002B30 52 'R'
push bx ; 00002B31 53 'S'
mov bx,ax ; 00002B32 8BD8 '..'
call x2b1d ; 00002B34 E8E6FF '...'
pushf ; 00002B37 9C '.'
cli ; 00002B38 FA '.'
in al,dx ; 00002B39 EC '.'
mov dl,0xc0 ; 00002B3A B2C0 '..'
mov ax,bx ; 00002B3C 8BC3 '..'
xchg al,ah ; 00002B3E 86C4 '..'
out dx,al ; 00002B40 EE '.'
xchg al,ah ; 00002B41 86C4 '..'
out dx,al ; 00002B43 EE '.'
mov al,0x20 ; 00002B44 B020 '. '
out dx,al ; 00002B46 EE '.'
popf ; 00002B47 9D '.'
pop bx ; 00002B48 5B '['
pop dx ; 00002B49 5A 'Z'
ret ; 00002B4A C3 '.'
x2b4b: push dx ; 00002B4B 52 'R'
push bx ; 00002B4C 53 'S'
mov bx,ax ; 00002B4D 8BD8 '..'
call x2b1d ; 00002B4F E8CBFF '...'
pushf ; 00002B52 9C '.'
cli ; 00002B53 FA '.'
in al,dx ; 00002B54 EC '.'
push dx ; 00002B55 52 'R'
mov ax,bx ; 00002B56 8BC3 '..'
mov dl,0xc0 ; 00002B58 B2C0 '..'
out dx,al ; 00002B5A EE '.'
inc dx ; 00002B5B 42 'B'
jmp short x2b5e ; 00002B5C EB00 '..'
x2b5e: in al,dx ; 00002B5E EC '.'
mov ah,al ; 00002B5F 8AE0 '..'
pop dx ; 00002B61 5A 'Z'
in al,dx ; 00002B62 EC '.'
jmp short x2b65 ; 00002B63 EB00 '..'
x2b65: mov dl,0xc0 ; 00002B65 B2C0 '..'
mov al,0x20 ; 00002B67 B020 '. '
out dx,al ; 00002B69 EE '.'
popf ; 00002B6A 9D '.'
pop bx ; 00002B6B 5B '['
pop dx ; 00002B6C 5A 'Z'
ret ; 00002B6D C3 '.'
x2b6e: call x2b77 ; 00002B6E E80600 '...'
mov dl,0xc0 ; 00002B71 B2C0 '..'
mov al,0x20 ; 00002B73 B020 '. '
out dx,al ; 00002B75 EE '.'
ret ; 00002B76 C3 '.'
x2b77: call x722 ; 00002B77 E8A8DB '...'
in al,dx ; 00002B7A EC '.'
ret ; 00002B7B C3 '.'
ret ; 00002B7C C3 '.'
sub di,bp ; 00002B7D 2BFD '+.'
sub bp,[di] ; 00002B7F 2B2D '+-'
sub al,0x67 ; 00002B81 2C67 ',g'
sub al,0x13 ; 00002B83 2C13 ',.'
pop es ; 00002B85 07 '.'
adc ax,[bx] ; 00002B86 1307 '..'
adc ax,[bx] ; 00002B88 1307 '..'
wait ; 00002B8A 9B '.'
sub al,0xa8 ; 00002B8B 2CA8 ',.'
sub al,0xb5 ; 00002B8D 2CB5 ',.'
sub al,0x13 ; 00002B8F 2C13 ',.'
pop es ; 00002B91 07 '.'
adc ax,[bx] ; 00002B92 1307 '..'
adc ax,[bx] ; 00002B94 1307 '..'
adc ax,[bx] ; 00002B96 1307 '..'
adc ax,[bx] ; 00002B98 1307 '..'
adc ax,[bx] ; 00002B9A 1307 '..'
ret 0x132c ; 00002B9C C22C13 '.,.'
pop es ; 00002B9F 07 '.'
fisubr dword [si] ; 00002BA0 DA2C '.,'
imul word [si] ; 00002BA2 F72C '.,'
adc ax,[bx] ; 00002BA4 1307 '..'
cmp ch,[di] ; 00002BA6 3A2D ':-'
adc ax,[bx] ; 00002BA8 1307 '..'
dec si ; 00002BAA 4E 'N'
sub ax,0x2d62 ; 00002BAB 2D622D '-b-'
imul bp,[di],byte +0x7c ; 00002BAE 6B2D7C 'k-|'
sub ax,0x2da9 ; 00002BB1 2DA92D '-.-'
cbw ; 00002BB4 98 '.'
mov si,ax ; 00002BB5 8BF0 '..'
shl si,1 ; 00002BB7 D1E6 '..'
cmp si,byte +0x38 ; 00002BB9 83FE38 '..8'
jnc x2bfa ; 00002BBC 733C 's<'
jmp near [cs:si+0x2b7c] ; 00002BBE 2EFFA47C2B '...|+'
cmp byte [0x449],0x13 ; 00002BC3 803E490413 '.>I..'
jz x2bfa ; 00002BC8 7430 't0'
xor bp,bp ; 00002BCA 33ED '3.'
les di,[0x4a8] ; 00002BCC C43EA804 '.>..'
add di,byte +0x4 ; 00002BD0 83C704 '...'
les di,[es:di] ; 00002BD3 26C43D '&.='
mov ax,es ; 00002BD6 8CC0 '..'
or ax,di ; 00002BD8 0BC7 '..'
jz x2bdd ; 00002BDA 7401 't.'
inc bp ; 00002BDC 45 'E'
x2bdd: call x2b77 ; 00002BDD E897FF '...'
mov ah,bl ; 00002BE0 8AE3 '..'
mov al,bh ; 00002BE2 8AC7 '..'
call x722 ; 00002BE4 E83BDB '.;.'
call x2b30 ; 00002BE7 E846FF '.F.'
call x2b6e ; 00002BEA E881FF '...'
or bp,bp ; 00002BED 0BED '..'
jz x2bfa ; 00002BEF 7409 't.'
mov al,bh ; 00002BF1 8AC7 '..'
sub bh,bh ; 00002BF3 2AFF '*.'
add di,bx ; 00002BF5 03FB '..'
mov [es:di],al ; 00002BF7 268805 '&..'
x2bfa: jmp x713 ; 00002BFA E916DB '...'
xor bp,bp ; 00002BFD 33ED '3.'
les di,[0x4a8] ; 00002BFF C43EA804 '.>..'
add di,byte +0x4 ; 00002C03 83C704 '...'
les di,[es:di] ; 00002C06 26C43D '&.='
mov ax,es ; 00002C09 8CC0 '..'
or ax,di ; 00002C0B 0BC7 '..'
jz x2c10 ; 00002C0D 7401 't.'
inc bp ; 00002C0F 45 'E'
x2c10: call x2b77 ; 00002C10 E864FF '.d.'
mov ah,0x11 ; 00002C13 B411 '..'
mov al,bh ; 00002C15 8AC7 '..'
call x722 ; 00002C17 E808DB '...'
call x2b30 ; 00002C1A E813FF '...'
call x2b6e ; 00002C1D E84EFF '.N.'
or bp,bp ; 00002C20 0BED '..'
jz x2c2a ; 00002C22 7406 't.'
add di,byte +0x11 ; 00002C24 83C711 '...'
mov [es:di],bh ; 00002C27 26883D '&.='
x2c2a: jmp x713 ; 00002C2A E9E6DA '...'
cmp byte [0x449],0x13 ; 00002C2D 803E490413 '.>I..'
jz x2c64 ; 00002C32 7430 't0'
push ds ; 00002C34 1E '.'
push es ; 00002C35 06 '.'
les di,[0x4a8] ; 00002C36 C43EA804 '.>..'
add di,byte +0x4 ; 00002C3A 83C704 '...'
les di,[es:di] ; 00002C3D 26C43D '&.='
mov ax,es ; 00002C40 8CC0 '..'
or ax,di ; 00002C42 0BC7 '..'
jz x2c4f ; 00002C44 7409 't.'
pop ds ; 00002C46 1F '.'
push ds ; 00002C47 1E '.'
mov si,dx ; 00002C48 8BF2 '..'
mov cx,0x11 ; 00002C4A B91100 '...'
rep movsb ; 00002C4D F3A4 '..'
x2c4f: pop es ; 00002C4F 07 '.'
pop ds ; 00002C50 1F '.'
mov bx,dx ; 00002C51 8BDA '..'
mov di,0x0 ; 00002C53 BF0000 '...'
mov cx,0x11 ; 00002C56 B91100 '...'
xor bp,bp ; 00002C59 33ED '3.'
call x722 ; 00002C5B E8C4DA '...'
call x2f11 ; 00002C5E E8B002 '...'
call x2b6e ; 00002C61 E80AFF '.',0x0A,'.'
x2c64: jmp x713 ; 00002C64 E9ACDA '...'
cli ; 00002C67 FA '.'
call x2b77 ; 00002C68 E80CFF '...'
mov dx,0x3c0 ; 00002C6B BAC003 '...'
mov al,0x10 ; 00002C6E B010 '..'
out dx,al ; 00002C70 EE '.'
inc dx ; 00002C71 42 'B'
in al,dx ; 00002C72 EC '.'
sti ; 00002C73 FB '.'
or bl,bl ; 00002C74 0ADB 0x0A,'.'
jnz x2c82 ; 00002C76 750A 'u',0x0A
and byte [0x465],0xdf ; 00002C78 80266504DF '.&e..'
and al,0xf7 ; 00002C7D 24F7 '$.'
jmp short x2c8d ; 00002C7F EB0C '..'
nop ; 00002C81 90 '.'
x2c82: dec bl ; 00002C82 FECB '..'
jnz x2c8d ; 00002C84 7507 'u.'
or byte [0x465],0x20 ; 00002C86 800E650420 '..e. '
or al,0x8 ; 00002C8B 0C08 '..'
x2c8d: mov ah,0x10 ; 00002C8D B410 '..'
call x722 ; 00002C8F E890DA '...'
call x2b30 ; 00002C92 E89BFE '...'
call x2b6e ; 00002C95 E8D6FE '...'
jmp x713 ; 00002C98 E978DA '.x.'
mov al,bl ; 00002C9B 8AC3 '..'
call x722 ; 00002C9D E882DA '...'
call x2b4b ; 00002CA0 E8A8FE '...'
mov bh,ah ; 00002CA3 8AFC '..'
jmp x2d73 ; 00002CA5 E9CB00 '...'
mov al,0x11 ; 00002CA8 B011 '..'
call x722 ; 00002CAA E875DA '.u.'
call x2b4b ; 00002CAD E89BFE '...'
mov bh,ah ; 00002CB0 8AFC '..'
jmp x2d73 ; 00002CB2 E9BE00 '...'
mov bx,dx ; 00002CB5 8BDA '..'
call x722 ; 00002CB7 E868DA '.h.'
xor bp,bp ; 00002CBA 33ED '3.'
call x2f3c ; 00002CBC E87D02 '.}.'
jmp x713 ; 00002CBF E951DA '.Q.'
test byte [0x489],0x6 ; 00002CC2 F606890406 '.....'
jz x2ccc ; 00002CC7 7403 't.'
call x2df0 ; 00002CC9 E82401 '.$.'
x2ccc: push dx ; 00002CCC 52 'R'
call x722 ; 00002CCD E852DA '.R.'
call x2b1d ; 00002CD0 E84AFE '.J.'
pop dx ; 00002CD3 5A 'Z'
call x2e34 ; 00002CD4 E85D01 '.].'
jmp x713 ; 00002CD7 E939DA '.9.'
mov di,bx ; 00002CDA 8BFB '..'
mov bx,dx ; 00002CDC 8BDA '..'
mov ah,0x20 ; 00002CDE B420 '. '
call x127a ; 00002CE0 E897E5 '...'
mov dl,[0x489] ; 00002CE3 8A168904 '....'
and dl,0x6 ; 00002CE7 80E206 '...'
shr dl,1 ; 00002CEA D0EA '..'
push ax ; 00002CEC 50 'P'
call x2ed3 ; 00002CED E8E301 '...'
pop ax ; 00002CF0 58 'X'
call x127a ; 00002CF1 E886E5 '...'
jmp x713 ; 00002CF4 E91CDA '...'
mov al,0x10 ; 00002CF7 B010 '..'
call x722 ; 00002CF9 E826DA '.&.'
call x2b4b ; 00002CFC E84CFE '.L.'
or bl,bl ; 00002CFF 0ADB 0x0A,'.'
jnz x2d1b ; 00002D01 7518 'u.'
mov al,ah ; 00002D03 8AC4 '..'
or al,0x80 ; 00002D05 0C80 '..'
or bh,bh ; 00002D07 0AFF 0x0A,'.'
jnz x2d0d ; 00002D09 7502 'u.'
and al,0x7f ; 00002D0B 247F '$.'
x2d0d: mov ah,0x10 ; 00002D0D B410 '..'
call x722 ; 00002D0F E810DA '...'
call x2b30 ; 00002D12 E81BFE '...'
call x2b6e ; 00002D15 E856FE '.V.'
jmp x713 ; 00002D18 E9F8D9 '...'
x2d1b: mov al,bh ; 00002D1B 8AC7 '..'
test ah,0x80 ; 00002D1D F6C480 '...'
jnz x2d2a ; 00002D20 7508 'u.'
and al,0x3 ; 00002D22 2403 '$.'
shl al,1 ; 00002D24 D0E0 '..'
shl al,1 ; 00002D26 D0E0 '..'
jmp short x2d2c ; 00002D28 EB02 '..'
x2d2a: and al,0xf ; 00002D2A 240F '$.'
x2d2c: mov ah,0x14 ; 00002D2C B414 '..'
call x722 ; 00002D2E E8F1D9 '...'
call x2b30 ; 00002D31 E8FCFD '...'
call x2b6e ; 00002D34 E837FE '.7.'
jmp x713 ; 00002D37 E9D9D9 '...'
call x722 ; 00002D3A E8E5D9 '...'
call x2b1d ; 00002D3D E8DDFD '...'
call x2dca ; 00002D40 E88700 '...'
pop di ; 00002D43 5F '_'
pop si ; 00002D44 5E '^'
pop bx ; 00002D45 5B '['
pop ax ; 00002D46 58 'X'
pop ax ; 00002D47 58 'X'
mov dl,al ; 00002D48 8AD0 '..'
pop ds ; 00002D4A 1F '.'
pop es ; 00002D4B 07 '.'
pop bp ; 00002D4C 5D ']'
iret ; 00002D4D CF '.'
mov di,bx ; 00002D4E 8BFB '..'
mov bx,dx ; 00002D50 8BDA '..'
mov ah,0x20 ; 00002D52 B420 '. '
call x127a ; 00002D54 E823E5 '.#.'
push ax ; 00002D57 50 'P'
call x2ef8 ; 00002D58 E89D01 '...'
pop ax ; 00002D5B 58 'X'
call x127a ; 00002D5C E81BE5 '...'
jmp x713 ; 00002D5F E9B1D9 '...'
mov dx,0x3c6 ; 00002D62 BAC603 '...'
mov ax,bx ; 00002D65 8BC3 '..'
out dx,al ; 00002D67 EE '.'
jmp x713 ; 00002D68 E9A8D9 '...'
mov dx,0x3c6 ; 00002D6B BAC603 '...'
in al,dx ; 00002D6E EC '.'
xor ah,ah ; 00002D6F 32E4 '2.'
mov bx,ax ; 00002D71 8BD8 '..'
x2d73: pop di ; 00002D73 5F '_'
pop si ; 00002D74 5E '^'
pop ax ; 00002D75 58 'X'
pop cx ; 00002D76 59 'Y'
pop dx ; 00002D77 5A 'Z'
pop ds ; 00002D78 1F '.'
pop es ; 00002D79 07 '.'
pop bp ; 00002D7A 5D ']'
iret ; 00002D7B CF '.'
call x722 ; 00002D7C E8A3D9 '...'
mov al,0x10 ; 00002D7F B010 '..'
call x2b4b ; 00002D81 E8C7FD '...'
mov bl,ah ; 00002D84 8ADC '..'
and bl,0x80 ; 00002D86 80E380 '...'
mov cl,0x7 ; 00002D89 B107 '..'
shr bl,cl ; 00002D8B D2EB '..'
mov al,0x14 ; 00002D8D B014 '..'
call x722 ; 00002D8F E890D9 '...'
call x2b4b ; 00002D92 E8B6FD '...'
mov bh,ah ; 00002D95 8AFC '..'
or bl,bl ; 00002D97 0ADB 0x0A,'.'
jnz x2da4 ; 00002D99 7509 'u.'
and bh,0xc ; 00002D9B 80E70C '...'
shr bh,1 ; 00002D9E D0EF '..'
shr bh,1 ; 00002DA0 D0EF '..'
jmp short x2d73 ; 00002DA2 EBCF '..'
x2da4: and bh,0xf ; 00002DA4 80E70F '...'
jmp short x2d73 ; 00002DA7 EBCA '..'
mov ah,0x20 ; 00002DA9 B420 '. '
call x127a ; 00002DAB E8CCE4 '...'
push ax ; 00002DAE 50 'P'
call x2db9 ; 00002DAF E80700 '...'
pop ax ; 00002DB2 58 'X'
call x127a ; 00002DB3 E8C4E4 '...'
jmp x713 ; 00002DB6 E95AD9 '.Z.'
x2db9: push cx ; 00002DB9 51 'Q'
push bx ; 00002DBA 53 'S'
call x2dca ; 00002DBB E80C00 '...'
call x2df0 ; 00002DBE E82F00 './.'
call x2e34 ; 00002DC1 E87000 '.p.'
pop bx ; 00002DC4 5B '['
inc bx ; 00002DC5 43 'C'
pop cx ; 00002DC6 59 'Y'
loop x2db9 ; 00002DC7 E2F0 '..'
ret ; 00002DC9 C3 '.'
x2dca: mov dx,0x3c7 ; 00002DCA BAC703 '...'
mov al,bl ; 00002DCD 8AC3 '..'
out dx,al ; 00002DCF EE '.'
mov dx,0x3c9 ; 00002DD0 BAC903 '...'
pushf ; 00002DD3 9C '.'
jmp short x2dd6 ; 00002DD4 EB00 '..'
x2dd6: cli ; 00002DD6 FA '.'
in al,dx ; 00002DD7 EC '.'
jmp short x2dda ; 00002DD8 EB00 '..'
x2dda: and al,0x3f ; 00002DDA 243F '$?'
mov ah,al ; 00002DDC 8AE0 '..'
in al,dx ; 00002DDE EC '.'
jmp short x2de1 ; 00002DDF EB00 '..'
x2de1: and al,0x3f ; 00002DE1 243F '$?'
mov ch,al ; 00002DE3 8AE8 '..'
in al,dx ; 00002DE5 EC '.'
popf ; 00002DE6 9D '.'
and al,0x3f ; 00002DE7 243F '$?'
mov cl,al ; 00002DE9 8AC8 '..'
mov dh,ah ; 00002DEB 8AF4 '..'
xor dl,dl ; 00002DED 32D2 '2.'
ret ; 00002DEF C3 '.'
x2df0: push bx ; 00002DF0 53 'S'
mov al,dh ; 00002DF1 8AC6 '..'
push ax ; 00002DF3 50 'P'
mov al,ch ; 00002DF4 8AC5 '..'
push ax ; 00002DF6 50 'P'
mov al,cl ; 00002DF7 8AC1 '..'
and ax,0x3f ; 00002DF9 253F00 '%?.'
xor bx,bx ; 00002DFC 33DB '3.'
xor cx,cx ; 00002DFE 33C9 '3.'
mul word [cs:0x2a39] ; 00002E00 2EF726392A '..&9*'
add bx,ax ; 00002E05 03D8 '..'
adc cx,dx ; 00002E07 13CA '..'
pop ax ; 00002E09 58 'X'
and ax,0x3f ; 00002E0A 253F00 '%?.'
mul word [cs:0x2a37] ; 00002E0D 2EF726372A '..&7*'
add bx,ax ; 00002E12 03D8 '..'
adc cx,dx ; 00002E14 13CA '..'
pop ax ; 00002E16 58 'X'
and ax,0x3f ; 00002E17 253F00 '%?.'
mul word [cs:0x2a35] ; 00002E1A 2EF726352A '..&5*'
add bx,ax ; 00002E1F 03D8 '..'
adc cx,dx ; 00002E21 13CA '..'
add bx,bx ; 00002E23 03DB '..'
adc cx,cx ; 00002E25 13C9 '..'
add bx,0x8000 ; 00002E27 81C30080 '....'
adc cx,byte +0x0 ; 00002E2B 83D100 '...'
mov dh,cl ; 00002E2E 8AF1 '..'
mov ch,cl ; 00002E30 8AE9 '..'
pop bx ; 00002E32 5B '['
ret ; 00002E33 C3 '.'
x2e34: push dx ; 00002E34 52 'R'
mov al,bl ; 00002E35 8AC3 '..'
mov dx,0x3c8 ; 00002E37 BAC803 '...'
out dx,al ; 00002E3A EE '.'
mov dx,0x3c9 ; 00002E3B BAC903 '...'
pop ax ; 00002E3E 58 'X'
mov al,ah ; 00002E3F 8AC4 '..'
pushf ; 00002E41 9C '.'
cli ; 00002E42 FA '.'
out dx,al ; 00002E43 EE '.'
jmp short x2e46 ; 00002E44 EB00 '..'
x2e46: mov al,ch ; 00002E46 8AC5 '..'
out dx,al ; 00002E48 EE '.'
jmp short x2e4b ; 00002E49 EB00 '..'
x2e4b: mov al,cl ; 00002E4B 8AC1 '..'
out dx,al ; 00002E4D EE '.'
popf ; 00002E4E 9D '.'
mov dx,ax ; 00002E4F 8BD0 '..'
ret ; 00002E51 C3 '.'
x2e52: push ax ; 00002E52 50 'P'
mov dx,0x3c6 ; 00002E53 BAC603 '...'
in al,dx ; 00002E56 EC '.'
cmp al,0xff ; 00002E57 3CFF '<.'
jz x2e5e ; 00002E59 7403 't.'
mov al,0xff ; 00002E5B B0FF '..'
out dx,al ; 00002E5D EE '.'
x2e5e: cmp bl,0x0 ; 00002E5E 80FB00 '...'
mov cx,0x40 ; 00002E61 B94000 '.@.'
jz x2e7e ; 00002E64 7418 't.'
pop ax ; 00002E66 58 'X'
push ax ; 00002E67 50 'P'
cmp ah,0xf ; 00002E68 80FC0F '...'
jz x2e72 ; 00002E6B 7405 't.'
cmp ah,0x7 ; 00002E6D 80FC07 '...'
jnz x2e78 ; 00002E70 7506 'u.'
x2e72: mov si,0x30b1 ; 00002E72 BEB130 '..0'
jmp short x2ece ; 00002E75 EB57 '.W'
nop ; 00002E77 90 '.'
x2e78: mov si,0x2fb1 ; 00002E78 BEB12F '../'
jmp short x2eb8 ; 00002E7B EB3B '.;'
nop ; 00002E7D 90 '.'
x2e7e: pop ax ; 00002E7E 58 'X'
push ax ; 00002E7F 50 'P'
cmp ah,0x13 ; 00002E80 80FC13 '...'
jz x2e8b ; 00002E83 7406 't.'
mov si,0x3031 ; 00002E85 BE3130 '.10'
jmp short x2eb8 ; 00002E88 EB2E '..'
nop ; 00002E8A 90 '.'
x2e8b: pop ax ; 00002E8B 58 'X'
push ax ; 00002E8C 50 'P'
mov bx,0x20 ; 00002E8D BB2000 '. .'
call x31f9 ; 00002E90 E86603 '.f.'
mov si,0x3111 ; 00002E93 BE1131 '..1'
mov cx,0x10 ; 00002E96 B91000 '...'
mov bx,0x10 ; 00002E99 BB1000 '...'
call x2f98 ; 00002E9C E8F900 '...'
mov si,0x30f1 ; 00002E9F BEF130 '..0'
mov cx,0x10 ; 00002EA2 B91000 '...'
mov bx,0x0 ; 00002EA5 BB0000 '...'
pop ax ; 00002EA8 58 'X'
push ax ; 00002EA9 50 'P'
test al,0x3 ; 00002EAA A803 '..'
jz x2ece ; 00002EAC 7420 't '
add si,byte +0x10 ; 00002EAE 83C610 '...'
call x2f98 ; 00002EB1 E8E400 '...'
pop ax ; 00002EB4 58 'X'
jmp short x2ed2 ; 00002EB5 EB1B '..'
nop ; 00002EB7 90 '.'
x2eb8: pop ax ; 00002EB8 58 'X'
push ax ; 00002EB9 50 'P'
test al,0x3 ; 00002EBA A803 '..'
jz x2ece ; 00002EBC 7410 't.'
add si,byte +0x40 ; 00002EBE 83C640 '..@'
mov cx,0x40 ; 00002EC1 B94000 '.@.'
mov bx,0x0 ; 00002EC4 BB0000 '...'
call x2f98 ; 00002EC7 E8CE00 '...'
pop ax ; 00002ECA 58 'X'
jmp short x2ed2 ; 00002ECB EB05 '..'
nop ; 00002ECD 90 '.'
x2ece: pop ax ; 00002ECE 58 'X'
call x2f5e ; 00002ECF E88C00 '...'
x2ed2: ret ; 00002ED2 C3 '.'
x2ed3: mov ax,dx ; 00002ED3 8BC2 '..'
x2ed5: push cx ; 00002ED5 51 'Q'
mov dh,[es:bx] ; 00002ED6 268A37 '&.7'
inc bx ; 00002ED9 43 'C'
mov ch,[es:bx] ; 00002EDA 268A2F '&./'
inc bx ; 00002EDD 43 'C'
mov cl,[es:bx] ; 00002EDE 268A0F '&..'
inc bx ; 00002EE1 43 'C'
push bx ; 00002EE2 53 'S'
mov bx,di ; 00002EE3 8BDF '..'
push ax ; 00002EE5 50 'P'
test ax,0x3 ; 00002EE6 A90300 '...'
jz x2eee ; 00002EE9 7403 't.'
call x2df0 ; 00002EEB E802FF '...'
x2eee: call x2e34 ; 00002EEE E843FF '.C.'
pop ax ; 00002EF1 58 'X'
pop bx ; 00002EF2 5B '['
pop cx ; 00002EF3 59 'Y'
inc di ; 00002EF4 47 'G'
loop x2ed5 ; 00002EF5 E2DE '..'
ret ; 00002EF7 C3 '.'
x2ef8: push cx ; 00002EF8 51 'Q'
push bx ; 00002EF9 53 'S'
mov bx,di ; 00002EFA 8BDF '..'
call x2dca ; 00002EFC E8CBFE '...'
pop bx ; 00002EFF 5B '['
inc di ; 00002F00 47 'G'
mov [es:bx],dh ; 00002F01 268837 '&.7'
inc bx ; 00002F04 43 'C'
mov [es:bx],ch ; 00002F05 26882F '&./'
inc bx ; 00002F08 43 'C'
mov [es:bx],cl ; 00002F09 26880F '&..'
inc bx ; 00002F0C 43 'C'
pop cx ; 00002F0D 59 'Y'
loop x2ef8 ; 00002F0E E2E8 '..'
ret ; 00002F10 C3 '.'
x2f11: push dx ; 00002F11 52 'R'
in al,dx ; 00002F12 EC '.'
mov ax,di ; 00002F13 8BC7 '..'
xchg ah,al ; 00002F15 86E0 '..'
x2f17: cmp ah,0x10 ; 00002F17 80FC10 '...'
jz x2f2b ; 00002F1A 740F 't.'
jg x2f3a ; 00002F1C 7F1C '..'
mov al,[es:bx] ; 00002F1E 268A07 '&..'
pop dx ; 00002F21 5A 'Z'
push dx ; 00002F22 52 'R'
call x2b30 ; 00002F23 E80AFC '.',0x0A,'.'
inc ah ; 00002F26 FEC4 '..'
inc bx ; 00002F28 43 'C'
loop x2f17 ; 00002F29 E2EC '..'
x2f2b: or bp,bp ; 00002F2B 0BED '..'
jz x2f30 ; 00002F2D 7401 't.'
inc bx ; 00002F2F 43 'C'
x2f30: inc ah ; 00002F30 FEC4 '..'
mov al,[es:bx] ; 00002F32 268A07 '&..'
pop dx ; 00002F35 5A 'Z'
call x2b30 ; 00002F36 E8F7FB '...'
ret ; 00002F39 C3 '.'
x2f3a: pop dx ; 00002F3A 5A 'Z'
ret ; 00002F3B C3 '.'
x2f3c: mov di,bx ; 00002F3C 8BFB '..'
sub bl,bl ; 00002F3E 2ADB '*.'
x2f40: mov al,bl ; 00002F40 8AC3 '..'
call x2b4b ; 00002F42 E806FC '...'
mov [es:di],ah ; 00002F45 268825 '&.%'
inc bl ; 00002F48 FEC3 '..'
inc di ; 00002F4A 47 'G'
cmp bl,0x10 ; 00002F4B 80FB10 '...'
jc x2f40 ; 00002F4E 72F0 'r.'
or bp,bp ; 00002F50 0BED '..'
jz x2f55 ; 00002F52 7401 't.'
inc di ; 00002F54 47 'G'
x2f55: mov al,0x11 ; 00002F55 B011 '..'
call x2b4b ; 00002F57 E8F1FB '...'
mov [es:di],ah ; 00002F5A 268825 '&.%'
ret ; 00002F5D C3 '.'
x2f5e: mov bl,0x0 ; 00002F5E B300 '..'
x2f60: push cx ; 00002F60 51 'Q'
mov bh,0x3 ; 00002F61 B703 '..'
mov ah,[cs:si] ; 00002F63 2E8A24 '..$'
inc si ; 00002F66 46 'F'
x2f67: mov al,0x0 ; 00002F67 B000 '..'
test ah,0x4 ; 00002F69 F6C404 '...'
jz x2f70 ; 00002F6C 7402
add al,0x2a ; 00002F6E 042A '.*'
x2f70: test ah,0x20 ; 00002F70 F6C420 '.. '
jz x2f77 ; 00002F73 7402 't.'
add al,0x15 ; 00002F75 0415 '..'
x2f77: push ax ; 00002F77 50 'P'
shl ah,1 ; 00002F78 D0E4 '..'
dec bh ; 00002F7A FECF '..'
jnz x2f67 ; 00002F7C 75E9 'u.'
pop ax ; 00002F7E 58 'X'
mov cl,al ; 00002F7F 8AC8 '..'
pop ax ; 00002F81 58 'X'
mov ch,al ; 00002F82 8AE8 '..'
pop ax ; 00002F84 58 'X'
mov dh,al ; 00002F85 8AF0 '..'
push si ; 00002F87 56 'V'
push bx ; 00002F88 53 'S'
xor bh,bh ; 00002F89 32FF '2.'
call x2e34 ; 00002F8B E8A6FE '...'
pop bx ; 00002F8E 5B '['
pop si ; 00002F8F 5E '^'
inc bl ; 00002F90 FEC3 '..'
pop cx ; 00002F92 59 'Y'
cmp bl,cl ; 00002F93 3AD9 ':.'
jl x2f60 ; 00002F95 7CC9 '|.'
ret ; 00002F97 C3 '.'
x2f98: add cx,bx ; 00002F98 03CB '..'
x2f9a: push cx ; 00002F9A 51 'Q'
mov cl,[cs:si] ; 00002F9B 2E8A0C '...'
mov ch,cl ; 00002F9E 8AE9 '..'
mov dh,cl ; 00002FA0 8AF1 '..'
push si ; 00002FA2 56 'V'
push bx ; 00002FA3 53 'S'
call x2e34 ; 00002FA4 E88DFE '...'
pop bx ; 00002FA7 5B '['
pop si ; 00002FA8 5E '^'
inc si ; 00002FA9 46 'F'
inc bx ; 00002FAA 43 'C'
pop cx ; 00002FAB 59 'Y'
cmp bx,cx ; 00002FAC 3BD9 ';.'
jl x2f9a ; 00002FAE 7CEA '|.'
ret ; 00002FB0 C3 '.'
db 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F
db 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F
db 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F
db 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F
db 0x00,0x05,0x11,0x1C,0x08,0x0B,0x25,0x28,0x02,0x07,0x1B,0x20,0x0F,0x14,0x28,0x2C
db 0x0C,0x11,0x25,0x2A,0x14,0x1E,0x32,0x36,0x0F,0x13,0x27,0x2C,0x1B,0x20,0x34,0x39
db 0x06,0x0B,0x1F,0x24,0x13,0x18,0x2C,0x30,0x09,0x0D,0x21,0x26,0x15,0x1A,0x2E,0x33
db 0x13,0x17,0x2B,0x30,0x1F,0x24,0x38,0x3D,0x0E,0x18,0x2D,0x32,0x20,0x24,0x38,0x3F
db 0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07
db 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F
db 0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07
db 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F
db 0x00,0x05,0x11,0x1C,0x08,0x0B,0x14,0x28,0x00,0x05,0x11,0x1C,0x08,0x0B,0x14,0x28
db 0x0E,0x18,0x2D,0x32,0x20,0x24,0x38,0x3F,0x0E,0x18,0x2D,0x32,0x20,0x24,0x38,0x3F
db 0x00,0x05,0x11,0x1C,0x08,0x0B,0x14,0x28,0x00,0x05,0x11,0x1C,0x08,0x0B,0x14,0x28
db 0x0E,0x18,0x2D,0x32,0x20,0x24,0x38,0x3F,0x0E,0x18,0x2D,0x32,0x20,0x24,0x38,0x3F
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07
db 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07
db 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F
db 0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F
db 0x00,0x05,0x11,0x1C,0x08,0x0B,0x14,0x28,0x0E,0x18,0x2D,0x32,0x20,0x24,0x38,0x3F
db 0x00,0x05,0x08,0x0B,0x0E,0x11,0x14,0x18,0x1C,0x20,0x24,0x28,0x2D,0x32,0x38,0x3F
db 0x00,0x10,0x1F,0x2F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x2F,0x1F,0x10
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x27,0x2F,0x37,0x3F,0x3F,0x3F,0x3F
db 0x3F,0x3F,0x3F,0x3F,0x3F,0x37,0x2F,0x27,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F
db 0x2D,0x31,0x36,0x3A,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3A,0x36,0x31
db 0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x00,0x07,0x0E,0x15,0x1C,0x1C,0x1C,0x1C
db 0x1C,0x1C,0x1C,0x1C,0x1C,0x15,0x0E,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
db 0x0E,0x11,0x15,0x18,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x18,0x15,0x11
db 0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x14,0x16,0x18,0x1A,0x1C,0x1C,0x1C,0x1C
db 0x1C,0x1C,0x1C,0x1C,0x1C,0x1A,0x18,0x16,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14
db 0x00,0x04,0x08,0x0C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0C,0x08,0x04
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x0A,0x0C,0x0E,0x10,0x10,0x10,0x10
db 0x10,0x10,0x10,0x10,0x10,0x0E,0x0C,0x0A,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08
db 0x0B,0x0C,0x0D,0x0F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0F,0x0D,0x0C
db 0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B
x31f9: mov bp,bx ; 000031F9 8BEB '..'
mov cx,0x9 ; 000031FB B90900 '...'
mov si,0x3121 ; 000031FE BE2131 '.!1'
x3201: push cx ; 00003201 51 'Q'
mov bx,0x0 ; 00003202 BB0000 '...'
x3205: push bx ; 00003205 53 'S'
mov dh,[cs:bx+si] ; 00003206 2E8A30 '..0'
add bl,0x8 ; 00003209 80C308 '...'
cmp bl,0x18 ; 0000320C 80FB18 '...'
jl x3214 ; 0000320F 7C03 '|.'
sub bl,0x18 ; 00003211 80EB18 '...'
x3214: mov cl,[cs:bx+si] ; 00003214 2E8A08 '...'
add bl,0x8 ; 00003217 80C308 '...'
cmp bl,0x18 ; 0000321A 80FB18 '...'
jl x3222 ; 0000321D 7C03 '|.'
sub bl,0x18 ; 0000321F 80EB18 '...'
x3222: mov ch,[cs:bx+si] ; 00003222 2E8A28 '..('
push si ; 00003225 56 'V'
push ax ; 00003226 50 'P'
mov bx,bp ; 00003227 8BDD '..'
test al,0x3 ; 00003229 A803 '..'
jz x3230 ; 0000322B 7403 't.'
call x2df0 ; 0000322D E8C0FB '...'
x3230: call x2e34 ; 00003230 E801FC '...'
pop ax ; 00003233 58 'X'
pop si ; 00003234 5E '^'
inc bp ; 00003235 45 'E'
pop bx ; 00003236 5B '['
inc bl ; 00003237 FEC3 '..'
cmp bl,0x18 ; 00003239 80FB18 '...'
jl x3205 ; 0000323C 7CC7 '|.'
add si,byte +0x18 ; 0000323E 83C618 '...'
pop cx ; 00003241 59 'Y'
loop x3201 ; 00003242 E2BD '..'
ret ; 00003244 C3 '.'
mov ah,[0x449] ; 00003245 8A264904 '.&I.'
mov si,ax ; 00003249 8BF0 '..'
push cx ; 0000324B 51 'Q'
mov cl,0x8 ; 0000324C B108 '..'
shr si,cl ; 0000324E D3EE '..'
pop cx ; 00003250 59 'Y'
shl si,1 ; 00003251 D1E6 '..'
mov si,[cs:si+0x1290] ; 00003253 2E8BB49012 '.....'
shl si,1 ; 00003258 D1E6 '..'
cmp si,0xa ; 0000325A 81FE0A00 '..',0x0A,'.'
jnc x3265 ; 0000325E 7305 's.'
jmp near [cs:si+0x3268] ; 00003260 2EFFA46832 '...h2'
x3265: jmp x713 ; 00003265 E9ABD4 '...'
adc ax,[bx] ; 00003268 1307 '..'
adc ax,[bx] ; 0000326A 1307 '..'
jc x32a0 ; 0000326C 7232 'r2'
call 0x2e32:0xeb32 ; 0000326E 9A32EB322E '.2.2.'
mov es,[0x720] ; 00003273 8E062007 '.. .'
push ax ; 00003277 50 'P'
push ax ; 00003278 50 'P'
call x3393 ; 00003279 E81701 '...'
shr al,cl ; 0000327C D2E8 '..'
and al,ah ; 0000327E 22C4 '".'
mov cl,[es:si] ; 00003280 268A0C '&..'
pop bx ; 00003283 5B '['
test bl,0x80 ; 00003284 F6C380 '...'
jnz x3296 ; 00003287 750D 'u',0x0D
not ah ; 00003289 F6D4 '..'
and cl,ah ; 0000328B 22CC '".'
or al,cl ; 0000328D 0AC1 0x0A,'.'
x328f: mov [es:si],al ; 0000328F 268804 '&..'
pop ax ; 00003292 58 'X'
jmp x713 ; 00003293 E97DD4 '.}.'
x3296: xor al,cl ; 00003296 32C1 '2.'
jmp short x328f ; 00003298 EBF5 '..'
push ax ; 0000329A 50 'P'
mov ax,dx ; 0000329B 8BC2 '..'
call x33d6 ; 0000329D E83601 '.6.'
x32a0: mov dx,0x3ce ; 000032A0 BACE03 '...'
mov ah,al ; 000032A3 8AE0 '..'
mov al,0x8 ; 000032A5 B008 '..'
out dx,ax ; 000032A7 EF '.'
mov es,[cs:0x71e] ; 000032A8 2E8E061E07 '.....'
pop ax ; 000032AD 58 'X'
mov ch,al ; 000032AE 8AE8 '..'
test ch,0x80 ; 000032B0 F6C580 '...'
jz x32bb ; 000032B3 7406 't.'
mov ax,0x1803 ; 000032B5 B80318 '...'
out dx,ax ; 000032B8 EF '.'
jmp short x32c9 ; 000032B9 EB0E '..'
x32bb: mov dl,0xc4 ; 000032BB B2C4 '..'
mov ax,0xff02 ; 000032BD B802FF '...'
out dx,ax ; 000032C0 EF '.'
mov al,[es:bx] ; 000032C1 268A07 '&..'
sub al,al ; 000032C4 2AC0 '*.'
mov [es:bx],al ; 000032C6 268807 '&..'
x32c9: mov dl,0xc4 ; 000032C9 B2C4 '..'
mov al,0x2 ; 000032CB B002 '..'
mov ah,ch ; 000032CD 8AE5 '..'
and ah,0xf ; 000032CF 80E40F '...'
out dx,ax ; 000032D2 EF '.'
mov ah,[es:bx] ; 000032D3 268A27 '&.',0x27
mov ah,0xff ; 000032D6 B4FF '..'
mov [es:bx],ah ; 000032D8 268827 '&.',0x27
out dx,ax ; 000032DB EF '.'
mov dl,0xce ; 000032DC B2CE '..'
mov ax,0x3 ; 000032DE B80300 '...'
out dx,ax ; 000032E1 EF '.'
mov ax,0xff08 ; 000032E2 B808FF '...'
out dx,ax ; 000032E5 EF '.'
xchg ah,al ; 000032E6 86E0 '..'
jmp x713 ; 000032E8 E928D4 '.(.'
push ax ; 000032EB 50 'P'
mov ax,dx ; 000032EC 8BC2 '..'
mov bx,0x140 ; 000032EE BB4001 '.@.'
mul bx ; 000032F1 F7E3 '..'
add ax,cx ; 000032F3 03C1 '..'
mov si,ax ; 000032F5 8BF0 '..'
pop ax ; 000032F7 58 'X'
mov es,[cs:0x71e] ; 000032F8 2E8E061E07 '.....'
mov [es:si],al ; 000032FD 268804 '&..'
jmp x713 ; 00003300 E910D4 '...'
mov ah,[0x449] ; 00003303 8A264904 '.&I.'
mov si,ax ; 00003307 8BF0 '..'
push cx ; 00003309 51 'Q'
mov cl,0x8 ; 0000330A B108 '..'
shr si,cl ; 0000330C D3EE '..'
pop cx ; 0000330E 59 'Y'
shl si,1 ; 0000330F D1E6 '..'
mov si,[cs:si+0x1290] ; 00003311 2E8BB49012 '.....'
shl si,1 ; 00003316 D1E6 '..'
cmp si,0xa ; 00003318 81FE0A00 '..',0x0A,'.'
jnc x3323 ; 0000331C 7305 's.'
jmp near [cs:si+0x3326] ; 0000331E 2EFFA42633 '...&3'
x3323: jmp x713 ; 00003323 E9EDD3 '...'
adc ax,[bx] ; 00003326 1307 '..'
adc ax,[bx] ; 00003328 1307 '..'
xor [bp+di],dh ; 0000332A 3033 '03'
inc si ; 0000332C 46 'F'
xor di,[bp+di+0x33] ; 0000332D 337B33 '3{3'
mov es,[cs:0x720] ; 00003330 2E8E062007 '... .'
call x3393 ; 00003335 E85B00 '.[.'
mov al,[es:si] ; 00003338 268A04 '&..'
and al,ah ; 0000333B 22C4 '".'
shl al,cl ; 0000333D D2E0 '..'
mov cl,dh ; 0000333F 8ACE '..'
rol al,cl ; 00003341 D2C0 '..'
jmp x713 ; 00003343 E9CDD3 '...'
mov es,[cs:0x71e] ; 00003346 2E8E061E07 '.....'
mov ax,dx ; 0000334B 8BC2 '..'
call x33d6 ; 0000334D E88600 '...'
mov ch,0x7 ; 00003350 B507 '..'
sub ch,cl ; 00003352 2AE9 '*.'
sub dx,dx ; 00003354 2BD2 '+.'
mov ah,0x0 ; 00003356 B400 '..'
x3358: mov cl,ch ; 00003358 8ACD '..'
mov al,0x4 ; 0000335A B004 '..'
push dx ; 0000335C 52 'R'
mov dx,0x3ce ; 0000335D BACE03 '...'
out dx,ax ; 00003360 EF '.'
pop dx ; 00003361 5A 'Z'
mov al,[es:bx] ; 00003362 268A07 '&..'
shr al,cl ; 00003365 D2E8 '..'
and al,0x1 ; 00003367 2401 '$.'
mov cl,ah ; 00003369 8ACC '..'
shl al,cl ; 0000336B D2E0 '..'
or dl,al ; 0000336D 0AD0 0x0A,'.'
inc ah ; 0000336F FEC4 '..'
cmp ah,0x3 ; 00003371 80FC03 '...'
jna x3358 ; 00003374 76E2 'v.'
mov al,dl ; 00003376 8AC2 '..'
jmp x713 ; 00003378 E998D3 '...'
push ax ; 0000337B 50 'P'
mov ax,dx ; 0000337C 8BC2 '..'
mov bx,0x140 ; 0000337E BB4001 '.@.'
mul bx ; 00003381 F7E3 '..'
add ax,cx ; 00003383 03C1 '..'
mov di,ax ; 00003385 8BF8 '..'
pop ax ; 00003387 58 'X'
mov es,[cs:0x71e] ; 00003388 2E8E061E07 '.....'
mov al,[es:di] ; 0000338D 268A05 '&..'
jmp x713 ; 00003390 E980D3 '...'
x3393: push bx ; 00003393 53 'S'
push ax ; 00003394 50 'P'
mov al,0x28 ; 00003395 B028 '.('
push dx ; 00003397 52 'R'
and dl,0xfe ; 00003398 80E2FE '...'
mul dl ; 0000339B F6E2 '..'
pop dx ; 0000339D 5A 'Z'
test dl,0x1 ; 0000339E F6C201 '...'
jz x33a6 ; 000033A1 7403 't.'
add ax,0x2000 ; 000033A3 050020 '.. '
x33a6: mov si,ax ; 000033A6 8BF0 '..'
pop ax ; 000033A8 58 'X'
mov dx,cx ; 000033A9 8BD1 '..'
mov bx,0x2c0 ; 000033AB BBC002 '...'
mov cx,0x302 ; 000033AE B90203 '...'
cmp byte [0x449],0x6 ; 000033B1 803E490406 '.>I..'
jc x33be ; 000033B6 7206 'r.'
mov bx,0x180 ; 000033B8 BB8001 '...'
mov cx,0x703 ; 000033BB B90307 '...'
x33be: and ch,dl ; 000033BE 22EA '".'
shr dx,cl ; 000033C0 D3EA '..'
add si,dx ; 000033C2 03F2 '..'
mov dh,bh ; 000033C4 8AF7 '..'
sub cl,cl ; 000033C6 2AC9 '*.'
x33c8: ror al,1 ; 000033C8 D0C8 '..'
add cl,ch ; 000033CA 02CD '..'
dec bh ; 000033CC FECF '..'
jnz x33c8 ; 000033CE 75F8 'u.'
mov ah,bl ; 000033D0 8AE3 '..'
shr ah,cl ; 000033D2 D2EC '..'
pop bx ; 000033D4 5B '['
ret ; 000033D5 C3 '.'
x33d6: mul word [0x44a] ; 000033D6 F7264A04 '.&J.'
push cx ; 000033DA 51 'Q'
shr cx,1 ; 000033DB D1E9 '..'
shr cx,1 ; 000033DD D1E9 '..'
shr cx,1 ; 000033DF D1E9 '..'
add ax,cx ; 000033E1 03C1 '..'
mov bl,bh ; 000033E3 8ADF '..'
sub bh,bh ; 000033E5 2AFF '*.'
mov cx,bx ; 000033E7 8BCB '..'
mov bx,[0x44c] ; 000033E9 8B1E4C04 '..L.'
jcxz x33f3 ; 000033ED E304 '..'
x33ef: add ax,bx ; 000033EF 03C3 '..'
loop x33ef ; 000033F1 E2FC '..'
x33f3: pop cx ; 000033F3 59 'Y'
mov bx,ax ; 000033F4 8BD8 '..'
and cl,0x7 ; 000033F6 80E107 '...'
mov al,0x80 ; 000033F9 B080 '..'
shr al,cl ; 000033FB D2E8 '..'
ret ; 000033FD C3 '.'
mov bh,[0x462] ; 000033FE 8A3E6204 '.>b.'
mov si,bx ; 00003402 8BF3 '..'
mov cl,0x8 ; 00003404 B108 '..'
shr si,cl ; 00003406 D3EE '..'
shl si,1 ; 00003408 D1E6 '..'
mov dx,[si+0x450] ; 0000340A 8B945004 '..P.'
call x3414 ; 0000340E E80300 '...'
jmp x713 ; 00003411 E9FFD2 '...'
x3414: push ax ; 00003414 50 'P'
cmp al,0xd ; 00003415 3C0D '<',0x0D
jna x3478 ; 00003417 765F 'v_'
x3419: push ds ; 00003419 1E '.'
push bx ; 0000341A 53 'S'
push dx ; 0000341B 52 'R'
mov cx,0x1 ; 0000341C B90100 '...'
call x2990 ; 0000341F E86EF5 '.n.'
pop dx ; 00003422 5A 'Z'
pop bx ; 00003423 5B '['
pop ds ; 00003424 1F '.'
inc dl ; 00003425 FEC2 '..'
cmp dl,[0x44a] ; 00003427 3A164A04 ':.J.'
jnz x3473 ; 0000342B 7546 'uF'
xor dl,dl ; 0000342D 32D2 '2.'
cmp dh,[0x484] ; 0000342F 3A368404 ':6..'
jnz x3471 ; 00003433 753C 'u<'
x3435: call x1f35 ; 00003435 E8FDEA '...'
mov ah,[0x449] ; 00003438 8A264904 '.&I.'
db 0xE8,0xDC,0xDA
jz x3445 ; 0000343F 7404 't.'
mov ah,0x0 ; 00003441 B400 '..'
jmp short x344c ; 00003443 EB07 '..'
x3445: push ds ; 00003445 1E '.'
push bx ; 00003446 53 'S'
call x2503 ; 00003447 E8B9F0 '...'
pop bx ; 0000344A 5B '['
pop ds ; 0000344B 1F '.'
x344c: mov bl,[0x462] ; 0000344C 8A1E6204 '..b.'
mov [0x462],bh ; 00003450 883E6204 '.>b.'
push bx ; 00003454 53 'S'
mov bh,ah ; 00003455 8AFC '..'
mov al,0x1 ; 00003457 B001 '..'
sub cx,cx ; 00003459 2BC9 '+.'
mov dh,[0x484] ; 0000345B 8A368404 '.6..'
mov dl,[0x44a] ; 0000345F 8A164A04 '..J.'
dec dl ; 00003463 FECA '..'
push ds ; 00003465 1E '.'
call x1fd9 ; 00003466 E870EB '.p.'
pop ds ; 00003469 1F '.'
pop bx ; 0000346A 5B '['
mov [0x462],bl ; 0000346B 881E6204 '..b.'
x346f: pop ax ; 0000346F 58 'X'
ret ; 00003470 C3 '.'
x3471: inc dh ; 00003471 FEC6 '..'
x3473: call x1f35 ; 00003473 E8BFEA '...'
jmp short x346f ; 00003476 EBF7 '..'
x3478: jz x348d ; 00003478 7413 't.'
cmp al,0xa ; 0000347A 3C0A '<',0x0A
jz x3491 ; 0000347C 7413 't.'
cmp al,0x7 ; 0000347E 3C07 '<.'
jz x3499 ; 00003480 7417 't.'
cmp al,0x8 ; 00003482 3C08 '<.'
jnz x3419 ; 00003484 7593 'u.'
or dl,dl ; 00003486 0AD2 0x0A,'.'
jz x3473 ; 00003488 74E9 't.'
dec dx ; 0000348A 4A 'J'
jmp short x3473 ; 0000348B EBE6 '..'
x348d: xor dl,dl ; 0000348D 32D2 '2.'
jmp short x3473 ; 0000348F EBE2 '..'
x3491: cmp dh,[0x484] ; 00003491 3A368404 ':6..'
jnz x3471 ; 00003495 75DA 'u.'
jmp short x3435 ; 00003497 EB9C '..'
x3499: mov cx,0x533 ; 00003499 B93305 '.3.'
mov bl,0x1 ; 0000349C B301 '..'
call beep ; 0000349E E8E5D1 '...'
jmp short x346f ; 000034A1 EBCC '..'
cmp al,0x4 ; 000034A3 3C04 '<.'
jnc x34f2 ; 000034A5 734B 'sK'
jcxz x34f2 ; 000034A7 E349 '.I'
mov si,bx ; 000034A9 8BF3 '..'
push cx ; 000034AB 51 'Q'
mov cl,0x8 ; 000034AC B108 '..'
shr si,cl ; 000034AE D3EE '..'
pop cx ; 000034B0 59 'Y'
shl si,1 ; 000034B1 D1E6 '..'
push word [si+0x450] ; 000034B3 FFB45004 '..P.'
push si ; 000034B7 56 'V'
push ax ; 000034B8 50 'P'
push cx ; 000034B9 51 'Q'
push dx ; 000034BA 52 'R'
call x1f35 ; 000034BB E877EA '.w.'
pop dx ; 000034BE 5A 'Z'
pop cx ; 000034BF 59 'Y'
pop ax ; 000034C0 58 'X'
pop si ; 000034C1 5E '^'
x34c2: push cx ; 000034C2 51 'Q'
push bx ; 000034C3 53 'S'
push ax ; 000034C4 50 'P'
xchg ah,al ; 000034C5 86E0 '..'
mov al,[es:bp+0x0] ; 000034C7 268A4600 '&.F.'
inc bp ; 000034CB 45 'E'
cmp al,0x8 ; 000034CC 3C08 '<.'
jz x34dc ; 000034CE 740C 't.'
cmp al,0xd ; 000034D0 3C0D '<',0x0D
jz x34dc ; 000034D2 7408 't.'
cmp al,0xa ; 000034D4 3C0A '<',0x0A
jz x34dc ; 000034D6 7404 't.'
cmp al,0x7 ; 000034D8 3C07 '<.'
jnz x34f5 ; 000034DA 7519 'u.'
x34dc: push si ; 000034DC 56 'V'
push dx ; 000034DD 52 'R'
push es ; 000034DE 06 '.'
push bp ; 000034DF 55 'U'
push ds ; 000034E0 1E '.'
call x3414 ; 000034E1 E830FF '.0.'
pop ds ; 000034E4 1F '.'
pop bp ; 000034E5 5D ']'
pop es ; 000034E6 07 '.'
pop dx ; 000034E7 5A 'Z'
pop si ; 000034E8 5E '^'
mov dx,[si+0x450] ; 000034E9 8B945004 '..P.'
pop ax ; 000034ED 58 'X'
pop bx ; 000034EE 5B '['
pop cx ; 000034EF 59 'Y'
jmp short x353f ; 000034F0 EB4D '.M'
x34f2: jmp x713 ; 000034F2 E91ED2 '...'
x34f5: mov cx,0x1 ; 000034F5 B90100 '...'
cmp ah,0x2 ; 000034F8 80FC02 '...'
jc x3502 ; 000034FB 7205 'r.'
mov bl,[es:bp+0x0] ; 000034FD 268A5E00 '&.^.'
inc bp ; 00003501 45 'E'
x3502: push si ; 00003502 56 'V'
push dx ; 00003503 52 'R'
push es ; 00003504 06 '.'
push bp ; 00003505 55 'U'
push ds ; 00003506 1E '.'
call x272b ; 00003507 E821F2 '.!.'
pop ds ; 0000350A 1F '.'
pop bp ; 0000350B 5D ']'
pop es ; 0000350C 07 '.'
pop dx ; 0000350D 5A 'Z'
pop si ; 0000350E 5E '^'
pop ax ; 0000350F 58 'X'
pop bx ; 00003510 5B '['
pop cx ; 00003511 59 'Y'
inc dl ; 00003512 FEC2 '..'
cmp dl,[0x44a] ; 00003514 3A164A04 ':.J.'
jc x353f ; 00003518 7225 'r%'
mov dl,[0x484] ; 0000351A 8A168404 '....'
inc dl ; 0000351E FEC2 '..'
inc dh ; 00003520 FEC6 '..'
cmp dh,dl ; 00003522 3AF2 ':.'
mov dl,0x0 ; 00003524 B200 '..'
jc x353f ; 00003526 7217 'r.'
dec dh ; 00003528 FECE '..'
push ax ; 0000352A 50 'P'
push bx ; 0000352B 53 'S'
push cx ; 0000352C 51 'Q'
push dx ; 0000352D 52 'R'
push si ; 0000352E 56 'V'
push es ; 0000352F 06 '.'
push bp ; 00003530 55 'U'
push ds ; 00003531 1E '.'
mov al,0xa ; 00003532 B00A '.',0x0A
call x3414 ; 00003534 E8DDFE '...'
pop ds ; 00003537 1F '.'
pop bp ; 00003538 5D ']'
pop es ; 00003539 07 '.'
pop si ; 0000353A 5E '^'
pop dx ; 0000353B 5A 'Z'
pop cx ; 0000353C 59 'Y'
pop bx ; 0000353D 5B '['
pop ax ; 0000353E 58 'X'
x353f: push si ; 0000353F 56 'V'
push ax ; 00003540 50 'P'
push cx ; 00003541 51 'Q'
push dx ; 00003542 52 'R'
call x1f35 ; 00003543 E8EFE9 '...'
pop dx ; 00003546 5A 'Z'
pop cx ; 00003547 59 'Y'
pop ax ; 00003548 58 'X'
pop si ; 00003549 5E '^'
loop x3556 ; 0000354A E20A '.',0x0A
pop dx ; 0000354C 5A 'Z'
test al,0x1 ; 0000354D A801 '..'
jnz x34f2 ; 0000354F 75A1 'u.'
call x1f35 ; 00003551 E8E1E9 '...'
jmp short x34f2 ; 00003554 EB9C '..'
x3556: jmp x34c2 ; 00003556 E969FF '.i.'
cmp al,0x0 ; 00003559 3C00 '<.'
jnz x3561 ; 0000355B 7504 'u.'
push es ; 0000355D 06 '.'
pop ds ; 0000355E 1F '.'
jmp short x35c8 ; 0000355F EB67 '.g'
x3561: cmp al,0x1 ; 00003561 3C01 '<.'
jnz x3567 ; 00003563 7502 'u.'
jmp short x35c8 ; 00003565 EB61 '.a'
x3567: cmp al,0x2 ; 00003567 3C02 '<.'
jnz x356d ; 00003569 7502 'u.'
jmp short x35c8 ; 0000356B EB5B '.['
x356d: cmp al,0x3 ; 0000356D 3C03 '<.'
jnz x3574 ; 0000356F 7503 'u.'
jmp short x35d0 ; 00003571 EB5D '.]'
nop ; 00003573 90 '.'
x3574: cmp al,0x4 ; 00003574 3C04 '<.'
jnz x357c ; 00003576 7504 'u.'
dec al ; 00003578 FEC8 '..'
jmp short x35c8 ; 0000357A EB4C '.L'
x357c: cmp al,0x10 ; 0000357C 3C10 '<.'
jnz x3585 ; 0000357E 7505 'u.'
push es ; 00003580 06 '.'
pop ds ; 00003581 1F '.'
jmp short x35d6 ; 00003582 EB52 '.R'
nop ; 00003584 90 '.'
x3585: cmp al,0x11 ; 00003585 3C11 '<.'
jnz x358c ; 00003587 7503 'u.'
jmp short x35d6 ; 00003589 EB4B '.K'
nop ; 0000358B 90 '.'
x358c: cmp al,0x12 ; 0000358C 3C12 '<.'
jnz x3593 ; 0000358E 7503 'u.'
jmp short x35d6 ; 00003590 EB44 '.D'
nop ; 00003592 90 '.'
x3593: cmp al,0x14 ; 00003593 3C14 '<.'
jnz x359b ; 00003595 7504
dec al ; 00003597 FEC8 '..'
jmp short x35d6 ; 00003599 EB3B '.;'
x359b: cmp al,0x20 ; 0000359B 3C20 '< '
jnz x35a2 ; 0000359D 7503 'u.'
jmp x3639 ; 0000359F E99700
x35a2: cmp al,0x21 ; 000035A2 3C21 '<!'
jnz x35a9 ; 000035A4 7503 'u.'
jmp x364d ; 000035A6 E9A400
x35a9: cmp al,0x22 ; 000035A9 3C22 '<"'
jnz x35b0 ; 000035AB 7503 'u.'
jmp x364d ; 000035AD E99D00
x35b0: cmp al,0x23 ; 000035B0 3C23 '<#'
jnz x35b7 ; 000035B2 7503 'u.'
jmp x364d ; 000035B4 E99600
x35b7: cmp al,0x24 ; 000035B7 3C24 '<$'
jnz x35be ; 000035B9 7503 'u.'
jmp x364d ; 000035BB E98F00
x35be: cmp al,0x30 ; 000035BE 3C30 '<0'
jnz x35c5 ; 000035C0 7503 'u.'
jmp x36a8 ; 000035C2 E9E300 '...'
x35c5: jmp x713 ; 000035C5 E94BD1 '.K.'
x35c8: mov ah,al ; 000035C8 8AE0 '..'
call x35e1 ; 000035CA E81400 '...'
jmp x713 ; 000035CD E943D1 '.C.'
x35d0: call x125f ; 000035D0 E88CDC '...'
jmp x713 ; 000035D3 E93DD1 '.=.'
x35d6: mov ah,al ; 000035D6 8AE0 '..'
sub ah,0x10 ; 000035D8 80EC10 '...'
call x35e1 ; 000035DB E80300 '...'
jmp x713 ; 000035DE E932D1 '.2.'
x35e1: push ds ; 000035E1 1E '.'
push cx ; 000035E2 51 'Q'
mov ds,[cs:0x71c] ; 000035E3 2E8E1E1C07 '.....'
mov cx,[0x463] ; 000035E8 8B0E6304 '..c.'
call x120c ; 000035EC E81DDC '...'
pop cx ; 000035EF 59 'Y'
pop ds ; 000035F0 1F '.'
cmp ah,0x0 ; 000035F1 80FC00 '...'
jz x3617 ; 000035F4 7421 't!'
mov bh,0xe ; 000035F6 B70E '..'
mov bp,font_8x14 ; 000035F8 BD8D3F '..?'
cmp ah,0x1 ; 000035FB 80FC01 '...'
jz x360f ; 000035FE 740F 't.'
mov bh,0x8 ; 00003600 B708 '..'
mov bp,font_8x8 ; 00003602 BD8D37 '..7'
cmp ah,0x2 ; 00003605 80FC02 '...'
jz x360f ; 00003608 7405 't.'
mov bh,0x10 ; 0000360A B710 '..'
mov bp,font_8x16 ; 0000360C BDBA4E '..N'
x360f: mov dx,0x0 ; 0000360F BA0000 '...'
mov cx,0x100 ; 00003612 B90001 '...'
push cs ; 00003615 0E '.'
pop ds ; 00003616 1F '.'
x3617: push ax ; 00003617 50 'P'
and bl,0x7f ; 00003618 80E37F '...'
mov ax,0xa000 ; 0000361B B800A0 '...'
db 0xE8,0x73,0xD8
pop ax ; 00003621 58 'X'
test al,0x10 ; 00003622 A810 '..'
jz x3629 ; 00003624 7403 't.'
call x36ec ; 00003626 E8C300 '...'
x3629: mov ds,[cs:0x71c] ; 00003629 2E8E1E1C07 '.....'
mov cx,[0x463] ; 0000362E 8B0E6304 '..c.'
call x1238 ; 00003632 E803DC '...'
call x2b6e ; 00003635 E836F5 '.6.'
ret ; 00003638 C3 '.'
x3639: sub al,0x20 ; 00003639 2C20 ', '
mov ds,[cs:0x71c] ; 0000363B 2E8E1E1C07 '.....'
cli ; 00003640 FA '.'
mov [0x7c],bp ; 00003641 892E7C00 '..|.'
mov [0x7e],es ; 00003645 8C067E00 '..~.'
sti ; 00003649 FB '.'
jmp x713 ; 0000364A E9C6D0 '...'
x364d: sub al,0x20 ; 0000364D 2C20 ', '
mov ds,[cs:0x71c] ; 0000364F 2E8E1E1C07 '.....'
dec al ; 00003654 FEC8 '..'
jz x3678 ; 00003656 7420 't '
push cs ; 00003658 0E '.'
pop es ; 00003659 07 '.'
dec al ; 0000365A FEC8 '..'
jnz x3666 ; 0000365C 7508 'u.'
mov cx,0xe ; 0000365E B90E00 '...'
mov bp,font_8x14 ; 00003661 BD8D3F '..?'
jmp short x3678 ; 00003664 EB12 '..'
x3666: dec al ; 00003666 FEC8 '..'
jnz x3672 ; 00003668 7508 'u.'
mov cx,0x8 ; 0000366A B90800 '...'
mov bp,font_8x8 ; 0000366D BD8D37 '..7'
jmp short x3678 ; 00003670 EB06 '..'
x3672: mov cx,0x10 ; 00003672 B91000 '...'
mov bp,font_8x16 ; 00003675 BDBA4E '..N'
x3678: cli ; 00003678 FA '.'
mov [0x10c],bp ; 00003679 892E0C01 '....'
mov [0x10e],es ; 0000367D 8C060E01 '....'
sti ; 00003681 FB '.'
mov [0x485],cx ; 00003682 890E8504 '....'
mov al,bl ; 00003686 8AC3 '..'
mov bx,0x36a4 ; 00003688 BBA436 '..6'
or al,al ; 0000368B 0AC0 0x0A,'.'
jnz x3694 ; 0000368D 7505 'u.'
mov al,dl ; 0000368F 8AC2 '..'
jmp short x369c ; 00003691 EB09 '..'
nop ; 00003693 90 '.'
x3694: cmp al,0x3 ; 00003694 3C03 '<.'
jna x369a ; 00003696 7602 'v.'
mov al,0x2 ; 00003698 B002 '..'
x369a: cs xlatb ; 0000369A 2ED7 '..'
x369c: dec al ; 0000369C FEC8 '..'
mov [0x484],al ; 0000369E A28404 '...'
x36a1: jmp x713 ; 000036A1 E96FD0 '.o.'
add [0x2b19],cl ; 000036A4 000E192B '...+'
x36a8: mov cx,[0x485] ; 000036A8 8B0E8504 '....'
mov dl,[0x484] ; 000036AC 8A168404 '....'
cmp bh,0x7 ; 000036B0 80FF07 '...'
ja x36a1 ; 000036B3 77EC 'w.'
cmp bh,0x1 ; 000036B5 80FF01 '...'
ja x36d1 ; 000036B8 7717 'w.'
mov ds,[cs:0x71c] ; 000036BA 2E8E1E1C07 '.....'
or bh,bh ; 000036BF 0AFF 0x0A,'.'
jnz x36ca ; 000036C1 7507 'u.'
les bp,[0x7c] ; 000036C3 C42E7C00 '..|.'
jmp short x36e3 ; 000036C7 EB1A '..'
nop ; 000036C9 90 '.'
x36ca: les bp,[0x10c] ; 000036CA C42E0C01 '....'
jmp short x36e3 ; 000036CE EB13 '..'
nop ; 000036D0 90 '.'
x36d1: sub bh,0x2 ; 000036D1 80EF02 '...'
mov bl,bh ; 000036D4 8ADF '..'
sub bh,bh ; 000036D6 2AFF '*.'
shl bx,1 ; 000036D8 D1E3 '..'
add bx,0x3781 ; 000036DA 81C38137 '...7'
mov bp,[cs:bx] ; 000036DE 2E8B2F '../'
push cs ; 000036E1 0E '.'
pop es ; 000036E2 07 '.'
x36e3: pop di ; 000036E3 5F '_'
pop si ; 000036E4 5E '^'
pop bx ; 000036E5 5B '['
pop ax ; 000036E6 58 'X'
pop ax ; 000036E7 58 'X'
pop ds ; 000036E8 1F '.'
pop ax ; 000036E9 58 'X'
pop ax ; 000036EA 58 'X'
iret ; 000036EB CF '.'
x36ec: mov ds,[cs:0x71c] ; 000036EC 2E8E1E1C07 '.....'
mov al,bh ; 000036F1 8AC7 '..'
xor ah,ah ; 000036F3 32E4 '2.'
mov [0x485],ax ; 000036F5 A38504 '...'
dec al ; 000036F8 FEC8 '..'
mov dx,[0x463] ; 000036FA 8B166304 '..c.'
mov ah,al ; 000036FE 8AE0 '..'
mov al,0x14 ; 00003700 B014 '..'
cmp byte [0x449],0x7 ; 00003702 803E490407 '.>I..'
jnz x370a ; 00003707 7501 'u.'
out dx,ax ; 00003709 EF '.'
x370a: push ax ; 0000370A 50 'P'
mov al,0x9 ; 0000370B B009 '..'
out dx,al ; 0000370D EE '.'
inc dx ; 0000370E 42 'B'
in al,dx ; 0000370F EC '.'
and al,0xe0 ; 00003710 24E0 '$.'
or ah,al ; 00003712 0AE0 0x0A,'.'
dec dx ; 00003714 4A 'J'
mov al,0x9 ; 00003715 B009 '..'
out dx,ax ; 00003717 EF '.'
pop ax ; 00003718 58 'X'
mov cl,ah ; 00003719 8ACC '..'
dec ah ; 0000371B FECC '..'
mov ch,ah ; 0000371D 8AEC '..'
cmp cl,0xd ; 0000371F 80F90D '..',0x0D
jl x3728 ; 00003722 7C04 '|.'
sub cx,0x101 ; 00003724 81E90101 '....'
x3728: mov [0x460],cx ; 00003728 890E6004 '..`.'
mov al,0xa ; 0000372C B00A '.',0x0A
call x1f5a ; 0000372E E829E8 '.).'
mov ah,[0x449] ; 00003731 8A264904 '.&I.'
call x73e ; 00003735 E806D0 '...'
mov bl,al ; 00003738 8AD8 '..'
mov ax,0xc8 ; 0000373A B8C800 '...'
cmp bl,0x0 ; 0000373D 80FB00 '...'
jz x374d ; 00003740 740B 't.'
mov ax,0x15e ; 00003742 B85E01 '.^.'
cmp bl,0x1 ; 00003745 80FB01 '...'
jz x374d ; 00003748 7403 't.'
mov ax,0x190 ; 0000374A B89001 '...'
x374d: cwd ; 0000374D 99 '.'
div word [0x485] ; 0000374E F7368504 '.6..'
dec ax ; 00003752 48 'H'
mov [0x484],al ; 00003753 A28404 '...'
inc al ; 00003756 FEC0 '..'
sub ah,ah ; 00003758 2AE4 '*.'
mul word [0x485] ; 0000375A F7268504 '.&..'
cmp bl,0x0 ; 0000375E 80FB00 '...'
jnz x3765 ; 00003761 7502 'u.'
shl ax,1 ; 00003763 D1E0 '..'
x3765: dec ax ; 00003765 48 'H'
mov dx,[0x463] ; 00003766 8B166304 '..c.'
mov ah,al ; 0000376A 8AE0 '..'
mov al,0x12 ; 0000376C B012 '..'
out dx,ax ; 0000376E EF '.'
mov al,[0x484] ; 0000376F A08404 '...'
inc al ; 00003772 FEC0 '..'
mul byte [0x44a] ; 00003774 F6264A04 '.&J.'
shl ax,1 ; 00003778 D1E0 '..'
add ax,0x100 ; 0000377A 050001 '...'
mov [0x44c],ax ; 0000377D A34C04 '.L.'
ret ; 00003780 C3 '.'
dw font_8x14 ; 00003781 8D3F '.?'
dw font_8x8 ; 00003783 8D37 '.7'
dw font_8x8_hi ; 00003785 8D3B '.;'
dw font_8x14_supp ; 00003787 8D4D '.M'
dw font_8x16 ; 0000378A BA4E '.N'
dw font_8x16_supp ; 0000378B BA5E '.^'
;
; 8x8 font (8 bytes per row, one row per character)
;
font_8x8:
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x0000378D ........
db 0x7E,0x81,0xA5,0x81,0xBD,0x99,0x81,0x7E ; 0x00003795 ~......~
db 0x7E,0xFF,0xDB,0xFF,0xC3,0xE7,0xFF,0x7E ; 0x0000379D ~......~
db 0x6C,0xFE,0xFE,0xFE,0x7C,0x38,0x10,0x00 ; 0x000037A5 l...|8..
db 0x10,0x38,0x7C,0xFE,0x7C,0x38,0x10,0x00 ; 0x000037AD .8|.|8..
db 0x38,0x7C,0x38,0xFE,0xFE,0x7C,0x38,0x7C ; 0x000037B5 8|8..|8|
db 0x10,0x10,0x38,0x7C,0xFE,0x7C,0x38,0x7C ; 0x000037BD ..8|.|8|
db 0x00,0x00,0x18,0x3C,0x3C,0x18,0x00,0x00 ; 0x000037C5 ........
db 0xFF,0xFF,0xE7,0xC3,0xC3,0xE7,0xFF,0xFF ; 0x000037CD ........
db 0x00,0x3C,0x66,0x42,0x42,0x66,0x3C,0x00 ; 0x000037D5 ..fBBf..
db 0xFF,0xC3,0x99,0xBD,0xBD,0x99,0xC3,0xFF ; 0x000037DD ........
db 0x0F,0x07,0x0F,0x7D,0xCC,0xCC,0xCC,0x78 ; 0x000037E5 ...}...x
db 0x3C,0x66,0x66,0x66,0x3C,0x18,0x7E,0x18 ; 0x000037ED .fff..~.
db 0x3F,0x33,0x3F,0x30,0x30,0x70,0xF0,0xE0 ; 0x000037F5 ?3?00p..
db 0x7F,0x63,0x7F,0x63,0x63,0x67,0xE6,0xC0 ; 0x000037FD .c.ccg..
db 0x99,0x5A,0x3C,0xE7,0xE7,0x3C,0x5A,0x99 ; 0x00003805 .Z....Z.
db 0x80,0xE0,0xF8,0xFE,0xF8,0xE0,0x80,0x00 ; 0x0000380D ........
db 0x02,0x0E,0x3E,0xFE,0x3E,0x0E,0x02,0x00 ; 0x00003815 ........
db 0x18,0x3C,0x7E,0x18,0x18,0x7E,0x3C,0x18 ; 0x0000381D ..~..~..
db 0x66,0x66,0x66,0x66,0x66,0x00,0x66,0x00 ; 0x00003825 fffff.f.
db 0x7F,0xDB,0xDB,0x7B,0x1B,0x1B,0x1B,0x00 ; 0x0000382D ...{....
db 0x3E,0x63,0x38,0x6C,0x6C,0x38,0xCC,0x78 ; 0x00003835 .c8ll8.x
db 0x00,0x00,0x00,0x00,0x7E,0x7E,0x7E,0x00 ; 0x0000383D ....~~~.
db 0x18,0x3C,0x7E,0x18,0x7E,0x3C,0x18,0xFF ; 0x00003845 ..~.~...
db 0x18,0x3C,0x7E,0x18,0x18,0x18,0x18,0x00 ; 0x0000384D ..~.....
db 0x18,0x18,0x18,0x18,0x7E,0x3C,0x18,0x00 ; 0x00003855 ....~...
db 0x00,0x18,0x0C,0xFE,0x0C,0x18,0x00,0x00 ; 0x0000385D ........
db 0x00,0x30,0x60,0xFE,0x60,0x30,0x00,0x00 ; 0x00003865 .0`.`0..
db 0x00,0x00,0xC0,0xC0,0xC0,0xFE,0x00,0x00 ; 0x0000386D ........
db 0x00,0x24,0x66,0xFF,0x66,0x24,0x00,0x00 ; 0x00003875 .$f.f$..
db 0x00,0x18,0x3C,0x7E,0xFF,0xFF,0x00,0x00 ; 0x0000387D ...~....
db 0x00,0xFF,0xFF,0x7E,0x3C,0x18,0x00,0x00 ; 0x00003885 ...~....
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x0000388D ........
db 0x30,0x78,0x78,0x30,0x30,0x00,0x30,0x00 ; 0x00003895 0xx00.0.
db 0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00 ; 0x0000389D lll.....
db 0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00 ; 0x000038A5 ll.l.ll.
db 0x30,0x7C,0xC0,0x78,0x0C,0xF8,0x30,0x00 ; 0x000038AD 0|.x..0.
db 0x00,0xC6,0xCC,0x18,0x30,0x66,0xC6,0x00 ; 0x000038B5 ....0f..
db 0x38,0x6C,0x38,0x76,0xDC,0xCC,0x76,0x00 ; 0x000038BD 8l8v..v.
db 0x60,0x60,0xC0,0x00,0x00,0x00,0x00,0x00 ; 0x000038C5 ``......
db 0x18,0x30,0x60,0x60,0x60,0x30,0x18,0x00 ; 0x000038CD .0```0..
db 0x60,0x30,0x18,0x18,0x18,0x30,0x60,0x00 ; 0x000038D5 `0...0`.
db 0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00 ; 0x000038DD .f...f..
db 0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00 ; 0x000038E5 .00.00..
db 0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x60 ; 0x000038ED .....00`
db 0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00 ; 0x000038F5 ........
db 0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00 ; 0x000038FD .....00.
db 0x06,0x0C,0x18,0x30,0x60,0xC0,0x80,0x00 ; 0x00003905 ...0`...
db 0x7C,0xC6,0xCE,0xDE,0xF6,0xE6,0x7C,0x00 ; 0x0000390D |.....|.
db 0x30,0x70,0x30,0x30,0x30,0x30,0xFC,0x00 ; 0x00003915 0p0000..
db 0x78,0xCC,0x0C,0x38,0x60,0xCC,0xFC,0x00 ; 0x0000391D x..8`...
db 0x78,0xCC,0x0C,0x38,0x0C,0xCC,0x78,0x00 ; 0x00003925 x..8..x.
db 0x1C,0x3C,0x6C,0xCC,0xFE,0x0C,0x1E,0x00 ; 0x0000392D ..l.....
db 0xFC,0xC0,0xF8,0x0C,0x0C,0xCC,0x78,0x00 ; 0x00003935 ......x.
db 0x38,0x60,0xC0,0xF8,0xCC,0xCC,0x78,0x00 ; 0x0000393D 8`....x.
db 0xFC,0xCC,0x0C,0x18,0x30,0x30,0x30,0x00 ; 0x00003945 ....000.
db 0x78,0xCC,0xCC,0x78,0xCC,0xCC,0x78,0x00 ; 0x0000394D x..x..x.
db 0x78,0xCC,0xCC,0x7C,0x0C,0x18,0x70,0x00 ; 0x00003955 x..|..p.
db 0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00 ; 0x0000395D .00..00.
db 0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x60 ; 0x00003965 .00..00`
db 0x18,0x30,0x60,0xC0,0x60,0x30,0x18,0x00 ; 0x0000396D .0`.`0..
db 0x00,0x00,0xFC,0x00,0x00,0xFC,0x00,0x00 ; 0x00003975 ........
db 0x60,0x30,0x18,0x0C,0x18,0x30,0x60,0x00 ; 0x0000397D `0...0`.
db 0x78,0xCC,0x0C,0x18,0x30,0x00,0x30,0x00 ; 0x00003985 x...0.0.
db 0x7C,0xC6,0xDE,0xDE,0xDE,0xC0,0x78,0x00 ; 0x0000398D |.....x.
db 0x30,0x78,0xCC,0xCC,0xFC,0xCC,0xCC,0x00 ; 0x00003995 0x......
db 0xFC,0x66,0x66,0x7C,0x66,0x66,0xFC,0x00 ; 0x0000399D .ff|ff..
db 0x3C,0x66,0xC0,0xC0,0xC0,0x66,0x3C,0x00 ; 0x000039A5 .f...f..
db 0xF8,0x6C,0x66,0x66,0x66,0x6C,0xF8,0x00 ; 0x000039AD .lfffl..
db 0xFE,0x62,0x68,0x78,0x68,0x62,0xFE,0x00 ; 0x000039B5 .bhxhb..
db 0xFE,0x62,0x68,0x78,0x68,0x60,0xF0,0x00 ; 0x000039BD .bhxh`..
db 0x3C,0x66,0xC0,0xC0,0xCE,0x66,0x3E,0x00 ; 0x000039C5 .f...f..
db 0xCC,0xCC,0xCC,0xFC,0xCC,0xCC,0xCC,0x00 ; 0x000039CD ........
db 0x78,0x30,0x30,0x30,0x30,0x30,0x78,0x00 ; 0x000039D5 x00000x.
db 0x1E,0x0C,0x0C,0x0C,0xCC,0xCC,0x78,0x00 ; 0x000039DD ......x.
db 0xE6,0x66,0x6C,0x78,0x6C,0x66,0xE6,0x00 ; 0x000039E5 .flxlf..
db 0xF0,0x60,0x60,0x60,0x62,0x66,0xFE,0x00 ; 0x000039ED .```bf..
db 0xC6,0xEE,0xFE,0xFE,0xD6,0xC6,0xC6,0x00 ; 0x000039F5 ........
db 0xC6,0xE6,0xF6,0xDE,0xCE,0xC6,0xC6,0x00 ; 0x000039FD ........
db 0x38,0x6C,0xC6,0xC6,0xC6,0x6C,0x38,0x00 ; 0x00003A05 8l...l8.
db 0xFC,0x66,0x66,0x7C,0x60,0x60,0xF0,0x00 ; 0x00003A0D .ff|``..
db 0x78,0xCC,0xCC,0xCC,0xDC,0x78,0x1C,0x00 ; 0x00003A15 x....x..
db 0xFC,0x66,0x66,0x7C,0x6C,0x66,0xE6,0x00 ; 0x00003A1D .ff|lf..
db 0x78,0xCC,0xE0,0x70,0x1C,0xCC,0x78,0x00 ; 0x00003A25 x..p..x.
db 0xFC,0xB4,0x30,0x30,0x30,0x30,0x78,0x00 ; 0x00003A2D ..0000x.
db 0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xFC,0x00 ; 0x00003A35 ........
db 0xCC,0xCC,0xCC,0xCC,0xCC,0x78,0x30,0x00 ; 0x00003A3D .....x0.
db 0xC6,0xC6,0xC6,0xD6,0xFE,0xEE,0xC6,0x00 ; 0x00003A45 ........
db 0xC6,0xC6,0x6C,0x38,0x38,0x6C,0xC6,0x00 ; 0x00003A4D ..l88l..
db 0xCC,0xCC,0xCC,0x78,0x30,0x30,0x78,0x00 ; 0x00003A55 ...x00x.
db 0xFE,0xC6,0x8C,0x18,0x32,0x66,0xFE,0x00 ; 0x00003A5D ....2f..
db 0x78,0x60,0x60,0x60,0x60,0x60,0x78,0x00 ; 0x00003A65 x`````x.
db 0xC0,0x60,0x30,0x18,0x0C,0x06,0x02,0x00 ; 0x00003A6D .`0.....
db 0x78,0x18,0x18,0x18,0x18,0x18,0x78,0x00 ; 0x00003A75 x.....x.
db 0x10,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00 ; 0x00003A7D .8l.....
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF ; 0x00003A85 ........
db 0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00 ; 0x00003A8D 00......
db 0x00,0x00,0x78,0x0C,0x7C,0xCC,0x76,0x00 ; 0x00003A95 ..x.|.v.
db 0xE0,0x60,0x60,0x7C,0x66,0x66,0xDC,0x00 ; 0x00003A9D .``|ff..
db 0x00,0x00,0x78,0xCC,0xC0,0xCC,0x78,0x00 ; 0x00003AA5 ..x...x.
db 0x1C,0x0C,0x0C,0x7C,0xCC,0xCC,0x76,0x00 ; 0x00003AAD ...|..v.
db 0x00,0x00,0x78,0xCC,0xFC,0xC0,0x78,0x00 ; 0x00003AB5 ..x...x.
db 0x38,0x6C,0x60,0xF0,0x60,0x60,0xF0,0x00 ; 0x00003ABD 8l`.``..
db 0x00,0x00,0x76,0xCC,0xCC,0x7C,0x0C,0xF8 ; 0x00003AC5 ..v..|..
db 0xE0,0x60,0x6C,0x76,0x66,0x66,0xE6,0x00 ; 0x00003ACD .`lvff..
db 0x30,0x00,0x70,0x30,0x30,0x30,0x78,0x00 ; 0x00003AD5 0.p000x.
db 0x0C,0x00,0x0C,0x0C,0x0C,0xCC,0xCC,0x78 ; 0x00003ADD .......x
db 0xE0,0x60,0x66,0x6C,0x78,0x6C,0xE6,0x00 ; 0x00003AE5 .`flxl..
db 0x70,0x30,0x30,0x30,0x30,0x30,0x78,0x00 ; 0x00003AED p00000x.
db 0x00,0x00,0xCC,0xFE,0xFE,0xD6,0xC6,0x00 ; 0x00003AF5 ........
db 0x00,0x00,0xF8,0xCC,0xCC,0xCC,0xCC,0x00 ; 0x00003AFD ........
db 0x00,0x00,0x78,0xCC,0xCC,0xCC,0x78,0x00 ; 0x00003B05 ..x...x.
db 0x00,0x00,0xDC,0x66,0x66,0x7C,0x60,0xF0 ; 0x00003B0D ...ff|`.
db 0x00,0x00,0x76,0xCC,0xCC,0x7C,0x0C,0x1E ; 0x00003B15 ..v..|..
db 0x00,0x00,0xDC,0x76,0x66,0x60,0xF0,0x00 ; 0x00003B1D ...vf`..
db 0x00,0x00,0x7C,0xC0,0x78,0x0C,0xF8,0x00 ; 0x00003B25 ..|.x...
db 0x10,0x30,0x7C,0x30,0x30,0x34,0x18,0x00 ; 0x00003B2D .0|004..
db 0x00,0x00,0xCC,0xCC,0xCC,0xCC,0x76,0x00 ; 0x00003B35 ......v.
db 0x00,0x00,0xCC,0xCC,0xCC,0x78,0x30,0x00 ; 0x00003B3D .....x0.
db 0x00,0x00,0xC6,0xD6,0xFE,0xFE,0x6C,0x00 ; 0x00003B45 ......l.
db 0x00,0x00,0xC6,0x6C,0x38,0x6C,0xC6,0x00 ; 0x00003B4D ...l8l..
db 0x00,0x00,0xCC,0xCC,0xCC,0x7C,0x0C,0xF8 ; 0x00003B55 .....|..
db 0x00,0x00,0xFC,0x98,0x30,0x64,0xFC,0x00 ; 0x00003B5D ....0d..
db 0x1C,0x30,0x30,0xE0,0x30,0x30,0x1C,0x00 ; 0x00003B65 .00.00..
db 0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x00 ; 0x00003B6D ........
db 0xE0,0x30,0x30,0x1C,0x30,0x30,0xE0,0x00 ; 0x00003B75 .00.00..
db 0x76,0xDC,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00003B7D v.......
db 0x00,0x10,0x38,0x6C,0xC6,0xC6,0xFE,0x00 ; 0x00003B85 ..8l....
font_8x8_hi:
db 0x78,0xCC,0xC0,0xCC,0x78,0x18,0x0C,0x78 ; 0x00003B8D x...x..x
db 0x00,0xCC,0x00,0xCC,0xCC,0xCC,0x7E,0x00 ; 0x00003B95 ......~.
db 0x1C,0x00,0x78,0xCC,0xFC,0xC0,0x78,0x00 ; 0x00003B9D ..x...x.
db 0x7E,0xC3,0x3C,0x06,0x3E,0x66,0x3F,0x00 ; 0x00003BA5 ~....f?.
db 0xCC,0x00,0x78,0x0C,0x7C,0xCC,0x7E,0x00 ; 0x00003BAD ..x.|.~.
db 0xE0,0x00,0x78,0x0C,0x7C,0xCC,0x7E,0x00 ; 0x00003BB5 ..x.|.~.
db 0x30,0x30,0x78,0x0C,0x7C,0xCC,0x7E,0x00 ; 0x00003BBD 00x.|.~.
db 0x00,0x00,0x78,0xC0,0xC0,0x78,0x0C,0x38 ; 0x00003BC5 ..x..x.8
db 0x7E,0xC3,0x3C,0x66,0x7E,0x60,0x3C,0x00 ; 0x00003BCD ~..f~`..
db 0xCC,0x00,0x78,0xCC,0xFC,0xC0,0x78,0x00 ; 0x00003BD5 ..x...x.
db 0xE0,0x00,0x78,0xCC,0xFC,0xC0,0x78,0x00 ; 0x00003BDD ..x...x.
db 0xCC,0x00,0x70,0x30,0x30,0x30,0x78,0x00 ; 0x00003BE5 ..p000x.
db 0x7C,0xC6,0x38,0x18,0x18,0x18,0x3C,0x00 ; 0x00003BED |.8.....
db 0xE0,0x00,0x70,0x30,0x30,0x30,0x78,0x00 ; 0x00003BF5 ..p000x.
db 0xC6,0x38,0x6C,0xC6,0xFE,0xC6,0xC6,0x00 ; 0x00003BFD .8l.....
db 0x30,0x30,0x00,0x78,0xCC,0xFC,0xCC,0x00 ; 0x00003C05 00.x....
db 0x1C,0x00,0xFC,0x60,0x78,0x60,0xFC,0x00 ; 0x00003C0D ...`x`..
db 0x00,0x00,0x7F,0x0C,0x7F,0xCC,0x7F,0x00 ; 0x00003C15 ........
db 0x3E,0x6C,0xCC,0xFE,0xCC,0xCC,0xCE,0x00 ; 0x00003C1D .l......
db 0x78,0xCC,0x00,0x78,0xCC,0xCC,0x78,0x00 ; 0x00003C25 x..x..x.
db 0x00,0xCC,0x00,0x78,0xCC,0xCC,0x78,0x00 ; 0x00003C2D ...x..x.
db 0x00,0xE0,0x00,0x78,0xCC,0xCC,0x78,0x00 ; 0x00003C35 ...x..x.
db 0x78,0xCC,0x00,0xCC,0xCC,0xCC,0x7E,0x00 ; 0x00003C3D x.....~.
db 0x00,0xE0,0x00,0xCC,0xCC,0xCC,0x7E,0x00 ; 0x00003C45 ......~.
db 0x00,0xCC,0x00,0xCC,0xCC,0x7C,0x0C,0xF8 ; 0x00003C4D .....|..
db 0xC3,0x18,0x3C,0x66,0x66,0x3C,0x18,0x00 ; 0x00003C55 ...ff...
db 0xCC,0x00,0xCC,0xCC,0xCC,0xCC,0x78,0x00 ; 0x00003C5D ......x.
db 0x18,0x18,0x7E,0xC0,0xC0,0x7E,0x18,0x18 ; 0x00003C65 ..~..~..
db 0x38,0x6C,0x64,0xF0,0x60,0xE6,0xFC,0x00 ; 0x00003C6D 8ld.`...
db 0xCC,0xCC,0x78,0xFC,0x30,0xFC,0x30,0x30 ; 0x00003C75 ..x.0.00
db 0xF8,0xCC,0xCC,0xFA,0xC6,0xCF,0xC6,0xC7 ; 0x00003C7D ........
db 0x0E,0x1B,0x18,0x3C,0x18,0x18,0xD8,0x70 ; 0x00003C85 .......p
db 0x1C,0x00,0x78,0x0C,0x7C,0xCC,0x7E,0x00 ; 0x00003C8D ..x.|.~.
db 0x38,0x00,0x70,0x30,0x30,0x30,0x78,0x00 ; 0x00003C95 8.p000x.
db 0x00,0x1C,0x00,0x78,0xCC,0xCC,0x78,0x00 ; 0x00003C9D ...x..x.
db 0x00,0x1C,0x00,0xCC,0xCC,0xCC,0x7E,0x00 ; 0x00003CA5 ......~.
db 0x00,0xF8,0x00,0xF8,0xCC,0xCC,0xCC,0x00 ; 0x00003CAD ........
db 0xFC,0x00,0xCC,0xEC,0xFC,0xDC,0xCC,0x00 ; 0x00003CB5 ........
db 0x3C,0x6C,0x6C,0x3E,0x00,0x7E,0x00,0x00 ; 0x00003CBD .ll..~..
db 0x38,0x6C,0x6C,0x38,0x00,0x7C,0x00,0x00 ; 0x00003CC5 8ll8.|..
db 0x30,0x00,0x30,0x60,0xC0,0xCC,0x78,0x00 ; 0x00003CCD 0.0`..x.
db 0x00,0x00,0x00,0xFC,0xC0,0xC0,0x00,0x00 ; 0x00003CD5 ........
db 0x00,0x00,0x00,0xFC,0x0C,0x0C,0x00,0x00 ; 0x00003CDD ........
db 0xC3,0xC6,0xCC,0xDE,0x33,0x66,0xCC,0x0F ; 0x00003CE5 ....3f..
db 0xC3,0xC6,0xCC,0xDB,0x37,0x6F,0xCF,0x03 ; 0x00003CED ....7o..
db 0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x00 ; 0x00003CF5 ........
db 0x00,0x33,0x66,0xCC,0x66,0x33,0x00,0x00 ; 0x00003CFD .3f.f3..
db 0x00,0xCC,0x66,0x33,0x66,0xCC,0x00,0x00 ; 0x00003D05 ..f3f...
db 0x22,0x88,0x22,0x88,0x22,0x88,0x22,0x88 ; 0x00003D0D ".".".".
db 0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA ; 0x00003D15 U.U.U.U.
db 0xDB,0x77,0xDB,0xEE,0xDB,0x77,0xDB,0xEE ; 0x00003D1D .w...w..
db 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x00003D25 ........
db 0x18,0x18,0x18,0x18,0xF8,0x18,0x18,0x18 ; 0x00003D2D ........
db 0x18,0x18,0xF8,0x18,0xF8,0x18,0x18,0x18 ; 0x00003D35 ........
db 0x36,0x36,0x36,0x36,0xF6,0x36,0x36,0x36 ; 0x00003D3D 6666.666
db 0x00,0x00,0x00,0x00,0xFE,0x36,0x36,0x36 ; 0x00003D45 .....666
db 0x00,0x00,0xF8,0x18,0xF8,0x18,0x18,0x18 ; 0x00003D4D ........
db 0x36,0x36,0xF6,0x06,0xF6,0x36,0x36,0x36 ; 0x00003D55 66...666
db 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36 ; 0x00003D5D 66666666
db 0x00,0x00,0xFE,0x06,0xF6,0x36,0x36,0x36 ; 0x00003D65 .....666
db 0x36,0x36,0xF6,0x06,0xFE,0x00,0x00,0x00 ; 0x00003D6D 66......
db 0x36,0x36,0x36,0x36,0xFE,0x00,0x00,0x00 ; 0x00003D75 6666....
db 0x18,0x18,0xF8,0x18,0xF8,0x00,0x00,0x00 ; 0x00003D7D ........
db 0x00,0x00,0x00,0x00,0xF8,0x18,0x18,0x18 ; 0x00003D85 ........
db 0x18,0x18,0x18,0x18,0x1F,0x00,0x00,0x00 ; 0x00003D8D ........
db 0x18,0x18,0x18,0x18,0xFF,0x00,0x00,0x00 ; 0x00003D95 ........
db 0x00,0x00,0x00,0x00,0xFF,0x18,0x18,0x18 ; 0x00003D9D ........
db 0x18,0x18,0x18,0x18,0x1F,0x18,0x18,0x18 ; 0x00003DA5 ........
db 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ; 0x00003DAD ........
db 0x18,0x18,0x18,0x18,0xFF,0x18,0x18,0x18 ; 0x00003DB5 ........
db 0x18,0x18,0x1F,0x18,0x1F,0x18,0x18,0x18 ; 0x00003DBD ........
db 0x36,0x36,0x36,0x36,0x37,0x36,0x36,0x36 ; 0x00003DC5 66667666
db 0x36,0x36,0x37,0x30,0x3F,0x00,0x00,0x00 ; 0x00003DCD 6670?...
db 0x00,0x00,0x3F,0x30,0x37,0x36,0x36,0x36 ; 0x00003DD5 ..?07666
db 0x36,0x36,0xF7,0x00,0xFF,0x00,0x00,0x00 ; 0x00003DDD 66......
db 0x00,0x00,0xFF,0x00,0xF7,0x36,0x36,0x36 ; 0x00003DE5 .....666
db 0x36,0x36,0x37,0x30,0x37,0x36,0x36,0x36 ; 0x00003DED 66707666
db 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00 ; 0x00003DF5 ........
db 0x36,0x36,0xF7,0x00,0xF7,0x36,0x36,0x36 ; 0x00003DFD 66...666
db 0x18,0x18,0xFF,0x00,0xFF,0x00,0x00,0x00 ; 0x00003E05 ........
db 0x36,0x36,0x36,0x36,0xFF,0x00,0x00,0x00 ; 0x00003E0D 6666....
db 0x00,0x00,0xFF,0x00,0xFF,0x18,0x18,0x18 ; 0x00003E15 ........
db 0x00,0x00,0x00,0x00,0xFF,0x36,0x36,0x36 ; 0x00003E1D .....666
db 0x36,0x36,0x36,0x36,0x3F,0x00,0x00,0x00 ; 0x00003E25 6666?...
db 0x18,0x18,0x1F,0x18,0x1F,0x00,0x00,0x00 ; 0x00003E2D ........
db 0x00,0x00,0x1F,0x18,0x1F,0x18,0x18,0x18 ; 0x00003E35 ........
db 0x00,0x00,0x00,0x00,0x3F,0x36,0x36,0x36 ; 0x00003E3D ....?666
db 0x36,0x36,0x36,0x36,0xFF,0x36,0x36,0x36 ; 0x00003E45 6666.666
db 0x18,0x18,0xFF,0x18,0xFF,0x18,0x18,0x18 ; 0x00003E4D ........
db 0x18,0x18,0x18,0x18,0xF8,0x00,0x00,0x00 ; 0x00003E55 ........
db 0x00,0x00,0x00,0x00,0x1F,0x18,0x18,0x18 ; 0x00003E5D ........
db 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ; 0x00003E65 ........
db 0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF ; 0x00003E6D ........
db 0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0 ; 0x00003E75 ........
db 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F ; 0x00003E7D ........
db 0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 ; 0x00003E85 ........
db 0x00,0x00,0x76,0xDC,0xC8,0xDC,0x76,0x00 ; 0x00003E8D ..v...v.
db 0x00,0x78,0xCC,0xF8,0xCC,0xF8,0xC0,0xC0 ; 0x00003E95 .x......
db 0x00,0xFC,0xCC,0xC0,0xC0,0xC0,0xC0,0x00 ; 0x00003E9D ........
db 0x00,0xFE,0x6C,0x6C,0x6C,0x6C,0x6C,0x00 ; 0x00003EA5 ..lllll.
db 0xFC,0xCC,0x60,0x30,0x60,0xCC,0xFC,0x00 ; 0x00003EAD ..`0`...
db 0x00,0x00,0x7E,0xD8,0xD8,0xD8,0x70,0x00 ; 0x00003EB5 ..~...p.
db 0x00,0x66,0x66,0x66,0x66,0x7C,0x60,0xC0 ; 0x00003EBD .ffff|`.
db 0x00,0x76,0xDC,0x18,0x18,0x18,0x18,0x00 ; 0x00003EC5 .v......
db 0xFC,0x30,0x78,0xCC,0xCC,0x78,0x30,0xFC ; 0x00003ECD .0x..x0.
db 0x38,0x6C,0xC6,0xFE,0xC6,0x6C,0x38,0x00 ; 0x00003ED5 8l...l8.
db 0x38,0x6C,0xC6,0xC6,0x6C,0x6C,0xEE,0x00 ; 0x00003EDD 8l..ll..
db 0x1C,0x30,0x18,0x7C,0xCC,0xCC,0x78,0x00 ; 0x00003EE5 .0.|..x.
db 0x00,0x00,0x7E,0xDB,0xDB,0x7E,0x00,0x00 ; 0x00003EED ..~..~..
db 0x06,0x0C,0x7E,0xDB,0xDB,0x7E,0x60,0xC0 ; 0x00003EF5 ..~..~`.
db 0x38,0x60,0xC0,0xF8,0xC0,0x60,0x38,0x00 ; 0x00003EFD 8`...`8.
db 0x78,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x00 ; 0x00003F05 x.......
db 0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0x00 ; 0x00003F0D ........
db 0x30,0x30,0xFC,0x30,0x30,0x00,0xFC,0x00 ; 0x00003F15 00.00...
db 0x60,0x30,0x18,0x30,0x60,0x00,0xFC,0x00 ; 0x00003F1D `0.0`...
db 0x18,0x30,0x60,0x30,0x18,0x00,0xFC,0x00 ; 0x00003F25 .0`0....
db 0x0E,0x1B,0x1B,0x18,0x18,0x18,0x18,0x18 ; 0x00003F2D ........
db 0x18,0x18,0x18,0x18,0x18,0xD8,0xD8,0x70 ; 0x00003F35 .......p
db 0x30,0x30,0x00,0xFC,0x00,0x30,0x30,0x00 ; 0x00003F3D 00...00.
db 0x00,0x76,0xDC,0x00,0x76,0xDC,0x00,0x00 ; 0x00003F45 .v..v...
db 0x38,0x6C,0x6C,0x38,0x00,0x00,0x00,0x00 ; 0x00003F4D 8ll8....
db 0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00 ; 0x00003F55 ........
db 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00 ; 0x00003F5D ........
db 0x0F,0x0C,0x0C,0x0C,0xEC,0x6C,0x3C,0x1C ; 0x00003F65 .....l..
db 0x78,0x6C,0x6C,0x6C,0x6C,0x00,0x00,0x00 ; 0x00003F6D xllll...
db 0x70,0x18,0x30,0x60,0x78,0x00,0x00,0x00 ; 0x00003F75 p.0`x...
db 0x00,0x00,0x3C,0x3C,0x3C,0x3C,0x00,0x00 ; 0x00003F7D ........
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00003F85 ........
;
; 8x14 font (14 bytes per row, one row per character)
;
font_8x14:
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00003F8D ..............
db 0x00,0x00,0x7E,0x81,0xA5,0x81,0x81,0xBD,0x99,0x81,0x7E,0x00,0x00,0x00 ; 0x00003F9B ..~.......~...
db 0x00,0x00,0x7E,0xFF,0xDB,0xFF,0xFF,0xC3,0xE7,0xFF,0x7E,0x00,0x00,0x00 ; 0x00003FA9 ..~.......~...
db 0x00,0x00,0x00,0x6C,0xFE,0xFE,0xFE,0xFE,0x7C,0x38,0x10,0x00,0x00,0x00 ; 0x00003FB7 ...l....|8....
db 0x00,0x00,0x00,0x10,0x38,0x7C,0xFE,0x7C,0x38,0x10,0x00,0x00,0x00,0x00 ; 0x00003FC5 ....8|.|8.....
db 0x00,0x00,0x18,0x3C,0x3C,0xE7,0xE7,0xE7,0x18,0x18,0x3C,0x00,0x00,0x00 ; 0x00003FD3 ..............
db 0x00,0x00,0x18,0x3C,0x7E,0xFF,0xFF,0x7E,0x18,0x18,0x3C,0x00,0x00,0x00 ; 0x00003FE1 ....~..~......
db 0x00,0x00,0x00,0x00,0x00,0x18,0x3C,0x3C,0x18,0x00,0x00,0x00,0x00,0x00 ; 0x00003FEF ..............
db 0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0xC3,0xC3,0xE7,0xFF,0xFF,0xFF,0xFF,0xFF ; 0x00003FFD ..............
db 0x00,0x00,0x00,0x00,0x3C,0x66,0x42,0x42,0x66,0x3C,0x00,0x00,0x00,0x00 ; 0x0000400B .....fBBf.....
db 0xFF,0xFF,0xFF,0xFF,0xC3,0x99,0xBD,0xBD,0x99,0xC3,0xFF,0xFF,0xFF,0xFF ; 0x00004019 ..............
db 0x00,0x00,0x1E,0x0E,0x1A,0x32,0x78,0xCC,0xCC,0xCC,0x78,0x00,0x00,0x00 ; 0x00004027 .....2x...x...
db 0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x18,0x7E,0x18,0x18,0x00,0x00,0x00 ; 0x00004035 ...fff..~.....
db 0x00,0x00,0x3F,0x33,0x3F,0x30,0x30,0x30,0x70,0xF0,0xE0,0x00,0x00,0x00 ; 0x00004043 ..?3?000p.....
db 0x00,0x00,0x7F,0x63,0x7F,0x63,0x63,0x63,0x67,0xE7,0xE6,0xC0,0x00,0x00 ; 0x00004051 ...c.cccg.....
db 0x00,0x00,0x18,0x18,0xDB,0x3C,0xE7,0x3C,0xDB,0x18,0x18,0x00,0x00,0x00 ; 0x0000405F ..............
db 0x00,0x00,0x80,0xC0,0xE0,0xF8,0xFE,0xF8,0xE0,0xC0,0x80,0x00,0x00,0x00 ; 0x0000406D ..............
db 0x00,0x00,0x02,0x06,0x0E,0x3E,0xFE,0x3E,0x0E,0x06,0x02,0x00,0x00,0x00 ; 0x0000407B ..............
db 0x00,0x00,0x18,0x3C,0x7E,0x18,0x18,0x18,0x7E,0x3C,0x18,0x00,0x00,0x00 ; 0x00004089 ....~...~.....
db 0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x66,0x66,0x00,0x00,0x00 ; 0x00004097 ..ffffff.ff...
db 0x00,0x00,0x7F,0xDB,0xDB,0xDB,0x7B,0x1B,0x1B,0x1B,0x1B,0x00,0x00,0x00 ; 0x000040A5 ......{.......
db 0x00,0x7C,0xC6,0x60,0x38,0x6C,0xC6,0xC6,0x6C,0x38,0x0C,0xC6,0x7C,0x00 ; 0x000040B3 .|.`8l..l8..|.
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0xFE,0x00,0x00,0x00 ; 0x000040C1 ..............
db 0x00,0x00,0x18,0x3C,0x7E,0x18,0x18,0x18,0x7E,0x3C,0x18,0x7E,0x00,0x00 ; 0x000040CF ....~...~..~..
db 0x00,0x00,0x18,0x3C,0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00 ; 0x000040DD ....~.........
db 0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x3C,0x18,0x00,0x00,0x00 ; 0x000040EB ........~.....
db 0x00,0x00,0x00,0x00,0x18,0x0C,0xFE,0x0C,0x18,0x00,0x00,0x00,0x00,0x00 ; 0x000040F9 ..............
db 0x00,0x00,0x00,0x00,0x30,0x60,0xFE,0x60,0x30,0x00,0x00,0x00,0x00,0x00 ; 0x00004107 ....0`.`0.....
db 0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xC0,0xFE,0x00,0x00,0x00,0x00,0x00 ; 0x00004115 ..............
db 0x00,0x00,0x00,0x00,0x28,0x6C,0xFE,0x6C,0x28,0x00,0x00,0x00,0x00,0x00 ; 0x00004123 ....(l.l(.....
db 0x00,0x00,0x00,0x10,0x38,0x38,0x7C,0x7C,0xFE,0xFE,0x00,0x00,0x00,0x00 ; 0x00004131 ....88||......
db 0x00,0x00,0x00,0xFE,0xFE,0x7C,0x7C,0x38,0x38,0x10,0x00,0x00,0x00,0x00 ; 0x0000413F .....||88.....
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x0000414D ..............
db 0x00,0x00,0x18,0x3C,0x3C,0x3C,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00 ; 0x0000415B ..............
db 0x00,0x66,0x66,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00004169 .fff$.........
db 0x00,0x00,0x6C,0x6C,0xFE,0x6C,0x6C,0x6C,0xFE,0x6C,0x6C,0x00,0x00,0x00 ; 0x00004177 ..ll.lll.ll...
db 0x18,0x18,0x7C,0xC6,0xC2,0xC0,0x7C,0x06,0x86,0xC6,0x7C,0x18,0x18,0x00 ; 0x00004185 ..|...|...|...
db 0x00,0x00,0x00,0x00,0xC2,0xC6,0x0C,0x18,0x30,0x66,0xC6,0x00,0x00,0x00 ; 0x00004193 ........0f....
db 0x00,0x00,0x38,0x6C,0x6C,0x38,0x76,0xDC,0xCC,0xCC,0x76,0x00,0x00,0x00 ; 0x000041A1 ..8ll8v...v...
db 0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x000041AF .000`.........
db 0x00,0x00,0x0C,0x18,0x30,0x30,0x30,0x30,0x30,0x18,0x0C,0x00,0x00,0x00 ; 0x000041BD ....00000.....
db 0x00,0x00,0x30,0x18,0x0C,0x0C,0x0C,0x0C,0x0C,0x18,0x30,0x00,0x00,0x00 ; 0x000041CB ..0.......0...
db 0x00,0x00,0x00,0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00,0x00,0x00,0x00 ; 0x000041D9 ....f...f.....
db 0x00,0x00,0x00,0x00,0x18,0x18,0x7E,0x18,0x18,0x00,0x00,0x00,0x00,0x00 ; 0x000041E7 ......~.......
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00 ; 0x000041F5 ...........0..
db 0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00004203 ..............
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00 ; 0x00004211 ..............
db 0x00,0x00,0x02,0x06,0x0C,0x18,0x30,0x60,0xC0,0x80,0x00,0x00,0x00,0x00 ; 0x0000421F ......0`......
db 0x00,0x00,0x7C,0xC6,0xCE,0xDE,0xF6,0xE6,0xC6,0xC6,0x7C,0x00,0x00,0x00 ; 0x0000422D ..|.......|...
db 0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00,0x00 ; 0x0000423B ...8x.....~...
db 0x00,0x00,0x7C,0xC6,0x06,0x0C,0x18,0x30,0x60,0xC6,0xFE,0x00,0x00,0x00 ; 0x00004249 ..|....0`.....
db 0x00,0x00,0x7C,0xC6,0x06,0x06,0x3C,0x06,0x06,0xC6,0x7C,0x00,0x00,0x00 ; 0x00004257 ..|.......|...
db 0x00,0x00,0x0C,0x1C,0x3C,0x6C,0xCC,0xFE,0x0C,0x0C,0x1E,0x00,0x00,0x00 ; 0x00004265 .....l........
db 0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xFC,0x06,0x06,0xC6,0x7C,0x00,0x00,0x00 ; 0x00004273 ..........|...
db 0x00,0x00,0x38,0x60,0xC0,0xC0,0xFC,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00 ; 0x00004281 ..8`......|...
db 0x00,0x00,0xFE,0xC6,0x06,0x0C,0x18,0x30,0x30,0x30,0x30,0x00,0x00,0x00 ; 0x0000428F .......0000...
db 0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7C,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00 ; 0x0000429D ..|...|...|...
db 0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7E,0x06,0x06,0x0C,0x78,0x00,0x00,0x00 ; 0x000042AB ..|...~...x...
db 0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00 ; 0x000042B9 ..............
db 0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00 ; 0x000042C7 ..........0...
db 0x00,0x00,0x06,0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x06,0x00,0x00,0x00 ; 0x000042D5 .....0`0......
db 0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00 ; 0x000042E3 .....~..~.....
db 0x00,0x00,0x60,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x60,0x00,0x00,0x00 ; 0x000042F1 ..`0.....0`...
db 0x00,0x00,0x7C,0xC6,0xC6,0x0C,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00 ; 0x000042FF ..|...........
db 0x00,0x00,0x7C,0xC6,0xC6,0xDE,0xDE,0xDE,0xDC,0xC0,0x7C,0x00,0x00,0x00 ; 0x0000430D ..|.......|...
db 0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0x00,0x00,0x00 ; 0x0000431B ...8l.........
db 0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x66,0x66,0x66,0xFC,0x00,0x00,0x00 ; 0x00004329 ...fff|fff....
db 0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xC0,0xC2,0x66,0x3C,0x00,0x00,0x00 ; 0x00004337 ...f.....f....
db 0x00,0x00,0xF8,0x6C,0x66,0x66,0x66,0x66,0x66,0x6C,0xF8,0x00,0x00,0x00 ; 0x00004345 ...lfffffl....
db 0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68,0x62,0x66,0xFE,0x00,0x00,0x00 ; 0x00004353 ...fbhxhbf....
db 0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68,0x60,0x60,0xF0,0x00,0x00,0x00 ; 0x00004361 ...fbhxh``....
db 0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xDE,0xC6,0x66,0x3A,0x00,0x00,0x00 ; 0x0000436F ...f.....f:...
db 0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00 ; 0x0000437D ..............
db 0x00,0x00,0x3C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00 ; 0x0000438B ..............
db 0x00,0x00,0x1E,0x0C,0x0C,0x0C,0x0C,0x0C,0xCC,0xCC,0x78,0x00,0x00,0x00 ; 0x00004399 ..........x...
db 0x00,0x00,0xE6,0x66,0x6C,0x6C,0x78,0x6C,0x6C,0x66,0xE6,0x00,0x00,0x00 ; 0x000043A7 ...fllxllf....
db 0x00,0x00,0xF0,0x60,0x60,0x60,0x60,0x60,0x62,0x66,0xFE,0x00,0x00,0x00 ; 0x000043B5 ...`````bf....
db 0x00,0x00,0xC6,0xEE,0xFE,0xFE,0xD6,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00 ; 0x000043C3 ..............
db 0x00,0x00,0xC6,0xE6,0xF6,0xFE,0xDE,0xCE,0xC6,0xC6,0xC6,0x00,0x00,0x00 ; 0x000043D1 ..............
db 0x00,0x00,0x38,0x6C,0xC6,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x00,0x00,0x00 ; 0x000043DF ..8l.....l8...
db 0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x60,0x60,0x60,0xF0,0x00,0x00,0x00 ; 0x000043ED ...fff|```....
db 0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xD6,0xDE,0x7C,0x0C,0x0E,0x00,0x00 ; 0x000043FB ..|......|....
db 0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x6C,0x66,0x66,0xE6,0x00,0x00,0x00 ; 0x00004409 ...fff|lff....
db 0x00,0x00,0x7C,0xC6,0xC6,0x60,0x38,0x0C,0xC6,0xC6,0x7C,0x00,0x00,0x00 ; 0x00004417 ..|..`8...|...
db 0x00,0x00,0x7E,0x7E,0x5A,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00 ; 0x00004425 ..~~Z.........
db 0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00 ; 0x00004433 ..........|...
db 0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x10,0x00,0x00,0x00 ; 0x00004441 ........l8....
db 0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xD6,0xD6,0xFE,0x7C,0x6C,0x00,0x00,0x00 ; 0x0000444F .........|l...
db 0x00,0x00,0xC6,0xC6,0x6C,0x38,0x38,0x38,0x6C,0xC6,0xC6,0x00,0x00,0x00 ; 0x0000445D ....l888l.....
db 0x00,0x00,0x66,0x66,0x66,0x66,0x3C,0x18,0x18,0x18,0x3C,0x00,0x00,0x00 ; 0x0000446B ..ffff........
db 0x00,0x00,0xFE,0xC6,0x8C,0x18,0x30,0x60,0xC2,0xC6,0xFE,0x00,0x00,0x00 ; 0x00004479 ......0`......
db 0x00,0x00,0x3C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3C,0x00,0x00,0x00 ; 0x00004487 ...0000000....
db 0x00,0x00,0x80,0xC0,0xE0,0x70,0x38,0x1C,0x0E,0x06,0x02,0x00,0x00,0x00 ; 0x00004495 .....p8.......
db 0x00,0x00,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00,0x00,0x00 ; 0x000044A3 ..............
db 0x10,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x000044B1 .8l...........
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00 ; 0x000044BF ..............
db 0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x000044CD 00............
db 0x00,0x00,0x00,0x00,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0x76,0x00,0x00,0x00 ; 0x000044DB .....x.|..v...
db 0x00,0x00,0xE0,0x60,0x60,0x78,0x6C,0x66,0x66,0x66,0x7C,0x00,0x00,0x00 ; 0x000044E9 ...``xlfff|...
db 0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00 ; 0x000044F7 .....|....|...
db 0x00,0x00,0x1C,0x0C,0x0C,0x3C,0x6C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00 ; 0x00004505 ......l...v...
db 0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xFE,0xC0,0xC6,0x7C,0x00,0x00,0x00 ; 0x00004513 .....|....|...
db 0x00,0x00,0x38,0x6C,0x64,0x60,0xF0,0x60,0x60,0x60,0xF0,0x00,0x00,0x00 ; 0x00004521 ..8ld`.```....
db 0x00,0x00,0x00,0x00,0x00,0x76,0xCC,0xCC,0xCC,0x7C,0x0C,0xCC,0x78,0x00 ; 0x0000452F .....v...|..x.
db 0x00,0x00,0xE0,0x60,0x60,0x6C,0x76,0x66,0x66,0x66,0xE6,0x00,0x00,0x00 ; 0x0000453D ...``lvfff....
db 0x00,0x00,0x18,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00 ; 0x0000454B .....8........
db 0x00,0x00,0x06,0x06,0x00,0x0E,0x06,0x06,0x06,0x06,0x66,0x66,0x3C,0x00 ; 0x00004559 ..........ff..
db 0x00,0x00,0xE0,0x60,0x60,0x66,0x6C,0x78,0x6C,0x66,0xE6,0x00,0x00,0x00 ; 0x00004567 ...``flxlf....
db 0x00,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00 ; 0x00004575 ..8...........
db 0x00,0x00,0x00,0x00,0x00,0xEC,0xFE,0xD6,0xD6,0xD6,0xC6,0x00,0x00,0x00 ; 0x00004583 ..............
db 0x00,0x00,0x00,0x00,0x00,0xDC,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00 ; 0x00004591 ......fffff...
db 0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00 ; 0x0000459F .....|....|...
db 0x00,0x00,0x00,0x00,0x00,0xDC,0x66,0x66,0x66,0x7C,0x60,0x60,0xF0,0x00 ; 0x000045AD ......fff|``..
db 0x00,0x00,0x00,0x00,0x00,0x76,0xCC,0xCC,0xCC,0x7C,0x0C,0x0C,0x1E,0x00 ; 0x000045BB .....v...|....
db 0x00,0x00,0x00,0x00,0x00,0xDC,0x76,0x66,0x60,0x60,0xF0,0x00,0x00,0x00 ; 0x000045C9 ......vf``....
db 0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0x70,0x1C,0xC6,0x7C,0x00,0x00,0x00 ; 0x000045D7 .....|.p..|...
db 0x00,0x00,0x10,0x30,0x30,0xFC,0x30,0x30,0x30,0x36,0x1C,0x00,0x00,0x00 ; 0x000045E5 ...00.0006....
db 0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00 ; 0x000045F3 ..........v...
db 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x3C,0x18,0x00,0x00,0x00 ; 0x00004601 .....ffff.....
db 0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0xD6,0xD6,0xFE,0x6C,0x00,0x00,0x00 ; 0x0000460F ..........l...
db 0x00,0x00,0x00,0x00,0x00,0xC6,0x6C,0x38,0x38,0x6C,0xC6,0x00,0x00,0x00 ; 0x0000461D ......l88l....
db 0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0xC6,0xC6,0x7E,0x06,0x0C,0xF8,0x00 ; 0x0000462B .........~....
db 0x00,0x00,0x00,0x00,0x00,0xFE,0xCC,0x18,0x30,0x66,0xFE,0x00,0x00,0x00 ; 0x00004639 ........0f....
db 0x00,0x00,0x0E,0x18,0x18,0x18,0x70,0x18,0x18,0x18,0x0E,0x00,0x00,0x00 ; 0x00004647 ......p.......
db 0x00,0x00,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x00,0x00,0x00 ; 0x00004655 ..............
db 0x00,0x00,0x70,0x18,0x18,0x18,0x0E,0x18,0x18,0x18,0x70,0x00,0x00,0x00 ; 0x00004663 ..p.......p...
db 0x00,0x00,0x76,0xDC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00004671 ..v...........
db 0x00,0x00,0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xFE,0x00,0x00,0x00,0x00 ; 0x0000467F .....8l.......
db 0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xC2,0x66,0x3C,0x0C,0x06,0x7C,0x00 ; 0x0000468D ...f....f...|.
db 0x00,0x00,0xCC,0xCC,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00 ; 0x0000469B ..........v...
db 0x00,0x0C,0x18,0x30,0x00,0x7C,0xC6,0xFE,0xC0,0xC6,0x7C,0x00,0x00,0x00 ; 0x000046A9 ...0.|....|...
db 0x00,0x10,0x38,0x6C,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0x76,0x00,0x00,0x00 ; 0x000046B7 ..8l.x.|..v...
db 0x00,0x00,0xCC,0xCC,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0x76,0x00,0x00,0x00 ; 0x000046C5 .....x.|..v...
db 0x00,0x60,0x30,0x18,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0x76,0x00,0x00,0x00 ; 0x000046D3 .`0..x.|..v...
db 0x00,0x38,0x6C,0x38,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0x76,0x00,0x00,0x00 ; 0x000046E1 .8l8.x.|..v...
db 0x00,0x00,0x00,0x00,0x3C,0x66,0x60,0x66,0x3C,0x0C,0x06,0x3C,0x00,0x00 ; 0x000046EF .....f`f......
db 0x00,0x10,0x38,0x6C,0x00,0x7C,0xC6,0xFE,0xC0,0xC6,0x7C,0x00,0x00,0x00 ; 0x000046FD ..8l.|....|...
db 0x00,0x00,0xCC,0xCC,0x00,0x7C,0xC6,0xFE,0xC0,0xC6,0x7C,0x00,0x00,0x00 ; 0x0000470B .....|....|...
db 0x00,0x60,0x30,0x18,0x00,0x7C,0xC6,0xFE,0xC0,0xC6,0x7C,0x00,0x00,0x00 ; 0x00004719 .`0..|....|...
db 0x00,0x00,0x66,0x66,0x00,0x38,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00 ; 0x00004727 ..ff.8........
db 0x00,0x18,0x3C,0x66,0x00,0x38,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00 ; 0x00004735 ...f.8........
db 0x00,0x60,0x30,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00 ; 0x00004743 .`0..8........
db 0x00,0xC6,0xC6,0x10,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0x00,0x00,0x00 ; 0x00004751 ....8l........
db 0x38,0x6C,0x38,0x00,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0x00,0x00,0x00 ; 0x0000475F 8l8.8l........
db 0x18,0x30,0x60,0x00,0xFE,0x66,0x60,0x7C,0x60,0x66,0xFE,0x00,0x00,0x00 ; 0x0000476D .0`..f`|`f....
db 0x00,0x00,0x00,0x00,0xCC,0x76,0x36,0x7E,0xD8,0xD8,0x6E,0x00,0x00,0x00 ; 0x0000477B .....v6~..n...
db 0x00,0x00,0x3E,0x6C,0xCC,0xCC,0xFE,0xCC,0xCC,0xCC,0xCE,0x00,0x00,0x00 ; 0x00004789 ...l..........
db 0x00,0x10,0x38,0x6C,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00 ; 0x00004797 ..8l.|....|...
db 0x00,0x00,0xC6,0xC6,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00 ; 0x000047A5 .....|....|...
db 0x00,0x60,0x30,0x18,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00 ; 0x000047B3 .`0..|....|...
db 0x00,0x30,0x78,0xCC,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00 ; 0x000047C1 .0x.......v...
db 0x00,0x60,0x30,0x18,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00 ; 0x000047CF .`0.......v...
db 0x00,0x00,0xC6,0xC6,0x00,0xC6,0xC6,0xC6,0xC6,0x7E,0x06,0x0C,0x78,0x00 ; 0x000047DD .........~..x.
db 0x00,0xC6,0xC6,0x38,0x6C,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x00,0x00,0x00 ; 0x000047EB ...8l....l8...
db 0x00,0xC6,0xC6,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00 ; 0x000047F9 ..........|...
db 0x00,0x18,0x18,0x3C,0x66,0x60,0x60,0x66,0x3C,0x18,0x18,0x00,0x00,0x00 ; 0x00004807 ....f``f......
db 0x00,0x38,0x6C,0x64,0x60,0xF0,0x60,0x60,0x60,0xE6,0xFC,0x00,0x00,0x00 ; 0x00004815 .8ld`.```.....
db 0x00,0x00,0x66,0x66,0x3C,0x18,0x7E,0x18,0x7E,0x18,0x18,0x00,0x00,0x00 ; 0x00004823 ..ff..~.~.....
db 0x00,0xF8,0xCC,0xCC,0xF8,0xC4,0xCC,0xDE,0xCC,0xCC,0xC6,0x00,0x00,0x00 ; 0x00004831 ..............
db 0x00,0x0E,0x1B,0x18,0x18,0x18,0x7E,0x18,0x18,0x18,0x18,0xD8,0x70,0x00 ; 0x0000483F ......~.....p.
db 0x00,0x18,0x30,0x60,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0x76,0x00,0x00,0x00 ; 0x0000484D ..0`.x.|..v...
db 0x00,0x0C,0x18,0x30,0x00,0x38,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00 ; 0x0000485B ...0.8........
db 0x00,0x18,0x30,0x60,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00 ; 0x00004869 ..0`.|....|...
db 0x00,0x18,0x30,0x60,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00 ; 0x00004877 ..0`......v...
db 0x00,0x00,0x76,0xDC,0x00,0xDC,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00 ; 0x00004885 ..v...fffff...
db 0x76,0xDC,0x00,0xC6,0xE6,0xF6,0xFE,0xDE,0xCE,0xC6,0xC6,0x00,0x00,0x00 ; 0x00004893 v.............
db 0x00,0x3C,0x6C,0x6C,0x3E,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x000048A1 ..ll..~.......
db 0x00,0x38,0x6C,0x6C,0x38,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x000048AF .8ll8.|.......
db 0x00,0x00,0x30,0x30,0x00,0x30,0x30,0x60,0xC6,0xC6,0x7C,0x00,0x00,0x00 ; 0x000048BD ..00.00`..|...
db 0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00 ; 0x000048CB ..............
db 0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x06,0x06,0x06,0x00,0x00,0x00,0x00 ; 0x000048D9 ..............
db 0x00,0xC0,0xC0,0xC6,0xCC,0xD8,0x30,0x60,0xDC,0x86,0x0C,0x18,0x3E,0x00 ; 0x000048E7 ......0`......
db 0x00,0xC0,0xC0,0xC6,0xCC,0xD8,0x30,0x66,0xCE,0x9E,0x3E,0x06,0x06,0x00 ; 0x000048F5 ......0f......
db 0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x3C,0x3C,0x3C,0x18,0x00,0x00,0x00 ; 0x00004903 ..............
db 0x00,0x00,0x00,0x00,0x36,0x6C,0xD8,0x6C,0x36,0x00,0x00,0x00,0x00,0x00 ; 0x00004911 ....6l.l6.....
db 0x00,0x00,0x00,0x00,0xD8,0x6C,0x36,0x6C,0xD8,0x00,0x00,0x00,0x00,0x00 ; 0x0000491F .....l6l......
db 0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44 ; 0x0000492D .D.D.D.D.D.D.D
db 0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA ; 0x0000493B U.U.U.U.U.U.U.
db 0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77 ; 0x00004949 .w.w.w.w.w.w.w
db 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x00004957 ..............
db 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xF8,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x00004965 ..............
db 0x18,0x18,0x18,0x18,0x18,0xF8,0x18,0xF8,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x00004973 ..............
db 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xF6,0x36,0x36,0x36,0x36,0x36,0x36 ; 0x00004981 6666666.666666
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x36,0x36,0x36,0x36,0x36,0x36 ; 0x0000498F ........666666
db 0x00,0x00,0x00,0x00,0x00,0xF8,0x18,0xF8,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x0000499D ..............
db 0x36,0x36,0x36,0x36,0x36,0xF6,0x06,0xF6,0x36,0x36,0x36,0x36,0x36,0x36 ; 0x000049AB 66666...666666
db 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36 ; 0x000049B9 66666666666666
db 0x00,0x00,0x00,0x00,0x00,0xFE,0x06,0xF6,0x36,0x36,0x36,0x36,0x36,0x36 ; 0x000049C7 ........666666
db 0x36,0x36,0x36,0x36,0x36,0xF6,0x06,0xFE,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x000049D5 66666.........
db 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xFE,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x000049E3 6666666.......
db 0x18,0x18,0x18,0x18,0x18,0xF8,0x18,0xF8,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x000049F1 ..............
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x000049FF ..............
db 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00004A0D ..............
db 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00004A1B ..............
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x00004A29 ..............
db 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x00004A37 ..............
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00004A45 ..............
db 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x00004A53 ..............
db 0x18,0x18,0x18,0x18,0x18,0x1F,0x18,0x1F,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x00004A61 ..............
db 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x37,0x36,0x36,0x36,0x36,0x36,0x36 ; 0x00004A6F 66666667666666
db 0x36,0x36,0x36,0x36,0x36,0x37,0x30,0x3F,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00004A7D 6666670?......
db 0x00,0x00,0x00,0x00,0x00,0x3F,0x30,0x37,0x36,0x36,0x36,0x36,0x36,0x36 ; 0x00004A8B .....?07666666
db 0x36,0x36,0x36,0x36,0x36,0xF7,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00004A99 66666.........
db 0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xF7,0x36,0x36,0x36,0x36,0x36,0x36 ; 0x00004AA7 ........666666
db 0x36,0x36,0x36,0x36,0x36,0x37,0x30,0x37,0x36,0x36,0x36,0x36,0x36,0x36 ; 0x00004AB5 66666707666666
db 0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00004AC3 ..............
db 0x36,0x36,0x36,0x36,0x36,0xF7,0x00,0xF7,0x36,0x36,0x36,0x36,0x36,0x36 ; 0x00004AD1 66666...666666
db 0x18,0x18,0x18,0x18,0x18,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00004ADF ..............
db 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xFF,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00004AED 6666666.......
db 0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x00004AFB ..............
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x36,0x36,0x36,0x36,0x36,0x36 ; 0x00004B09 ........666666
db 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x3F,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00004B17 6666666?......
db 0x18,0x18,0x18,0x18,0x18,0x1F,0x18,0x1F,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00004B25 ..............
db 0x00,0x00,0x00,0x00,0x00,0x1F,0x18,0x1F,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x00004B33 ..............
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x36,0x36,0x36,0x36,0x36,0x36 ; 0x00004B41 .......?666666
db 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xFF,0x36,0x36,0x36,0x36,0x36,0x36 ; 0x00004B4F 6666666.666666
db 0x18,0x18,0x18,0x18,0x18,0xFF,0x18,0xFF,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x00004B5D ..............
db 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xF8,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00004B6B ..............
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x00004B79 ..............
db 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ; 0x00004B87 ..............
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ; 0x00004B95 ..............
db 0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0 ; 0x00004BA3 ..............
db 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F ; 0x00004BB1 ..............
db 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00004BBF ..............
db 0x00,0x00,0x00,0x00,0x00,0x76,0xDC,0xD8,0xD8,0xDC,0x76,0x00,0x00,0x00 ; 0x00004BCD .....v....v...
db 0x00,0x00,0x00,0x00,0x7C,0xC6,0xFC,0xC6,0xC6,0xFC,0xC0,0xC0,0x40,0x00 ; 0x00004BDB ....|.......@.
db 0x00,0x00,0xFE,0xC6,0xC6,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00 ; 0x00004BE9 ..............
db 0x00,0x00,0x00,0x00,0xFE,0x6C,0x6C,0x6C,0x6C,0x6C,0x6C,0x00,0x00,0x00 ; 0x00004BF7 .....llllll...
db 0x00,0x00,0xFE,0xC6,0x60,0x30,0x18,0x30,0x60,0xC6,0xFE,0x00,0x00,0x00 ; 0x00004C05 ....`0.0`.....
db 0x00,0x00,0x00,0x00,0x00,0x7E,0xD8,0xD8,0xD8,0xD8,0x70,0x00,0x00,0x00 ; 0x00004C13 .....~....p...
db 0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x7C,0x60,0x60,0xC0,0x00,0x00 ; 0x00004C21 ....ffff|``...
db 0x00,0x00,0x00,0x00,0x76,0xDC,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00 ; 0x00004C2F ....v.........
db 0x00,0x00,0x7E,0x18,0x3C,0x66,0x66,0x66,0x3C,0x18,0x7E,0x00,0x00,0x00 ; 0x00004C3D ..~..fff..~...
db 0x00,0x00,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0x6C,0x38,0x00,0x00,0x00 ; 0x00004C4B ..8l.....l8...
db 0x00,0x00,0x38,0x6C,0xC6,0xC6,0xC6,0x6C,0x6C,0x6C,0xEE,0x00,0x00,0x00 ; 0x00004C59 ..8l...lll....
db 0x00,0x00,0x1E,0x30,0x18,0x0C,0x3E,0x66,0x66,0x66,0x3C,0x00,0x00,0x00 ; 0x00004C67 ...0...fff....
db 0x00,0x00,0x00,0x00,0x00,0x7E,0xDB,0xDB,0x7E,0x00,0x00,0x00,0x00,0x00 ; 0x00004C75 .....~..~.....
db 0x00,0x00,0x03,0x06,0x7E,0xDB,0xDB,0xF3,0x7E,0x60,0xC0,0x00,0x00,0x00 ; 0x00004C83 ....~...~`....
db 0x00,0x00,0x1C,0x30,0x60,0x60,0x7C,0x60,0x60,0x30,0x1C,0x00,0x00,0x00 ; 0x00004C91 ...0``|``0....
db 0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00 ; 0x00004C9F ...|..........
db 0x00,0x00,0x00,0xFE,0x00,0x00,0xFE,0x00,0x00,0xFE,0x00,0x00,0x00,0x00 ; 0x00004CAD ..............
db 0x00,0x00,0x00,0x18,0x18,0x7E,0x18,0x18,0x00,0x00,0xFF,0x00,0x00,0x00 ; 0x00004CBB .....~........
db 0x00,0x00,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00,0x7E,0x00,0x00,0x00 ; 0x00004CC9 ..0.....0.~...
db 0x00,0x00,0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00,0x7E,0x00,0x00,0x00 ; 0x00004CD7 ....0`0...~...
db 0x00,0x00,0x0E,0x1B,0x1B,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x00004CE5 ..............
db 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xD8,0xD8,0x70,0x00,0x00,0x00 ; 0x00004CF3 ..........p...
db 0x00,0x00,0x00,0x18,0x18,0x00,0x7E,0x00,0x18,0x18,0x00,0x00,0x00,0x00 ; 0x00004D01 ......~.......
db 0x00,0x00,0x00,0x00,0x76,0xDC,0x00,0x76,0xDC,0x00,0x00,0x00,0x00,0x00 ; 0x00004D0F ....v..v......
db 0x00,0x38,0x6C,0x6C,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00004D1D .8ll8.........
db 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00004D2B ..............
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00004D39 ..............
db 0x00,0x0F,0x0C,0x0C,0x0C,0x0C,0x0C,0xEC,0x6C,0x3C,0x1C,0x00,0x00,0x00 ; 0x00004D47 ........l.....
db 0x00,0xD8,0x6C,0x6C,0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00004D55 ..lllll.......
db 0x00,0x70,0xD8,0x30,0x60,0xC8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00004D63 .p.0`.........
db 0x00,0x00,0x00,0x00,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x00,0x00,0x00,0x00 ; 0x00004D71 ....||||||....
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00004D7F ..............
;
; 8x14 supplemental
;
font_8x14_supp:
db 0x1D,0x00,0x00,0x00,0x00,0x24,0x66,0xFF,0x66,0x24,0x00,0x00,0x00,0x00,0x00 ; 0x00004D8D .....$f.f$.....
db 0x22,0x00,0x63,0x63,0x63,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00004D9C ".ccc".........
db 0x2B,0x00,0x00,0x00,0x18,0x18,0x18,0xFF,0x18,0x18,0x18,0x00,0x00,0x00,0x00 ; 0x00004DAB +..............
db 0x2D,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00004DBA -..............
db 0x4D,0x00,0x00,0xC3,0xE7,0xFF,0xDB,0xC3,0xC3,0xC3,0xC3,0xC3,0x00,0x00,0x00 ; 0x00004DC9 M..............
db 0x54,0x00,0x00,0xFF,0xDB,0x99,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00 ; 0x00004DD8 T..............
db 0x56,0x00,0x00,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0x66,0x3C,0x18,0x00,0x00,0x00 ; 0x00004DE7 V........f.....
db 0x57,0x00,0x00,0xC3,0xC3,0xC3,0xC3,0xDB,0xDB,0xFF,0x66,0x66,0x00,0x00,0x00 ; 0x00004DF6 W.........ff...
db 0x58,0x00,0x00,0xC3,0xC3,0x66,0x3C,0x18,0x3C,0x66,0xC3,0xC3,0x00,0x00,0x00 ; 0x00004E05 X....f...f.....
db 0x59,0x00,0x00,0xC3,0xC3,0xC3,0x66,0x3C,0x18,0x18,0x18,0x3C,0x00,0x00,0x00 ; 0x00004E14 Y.....f........
db 0x5A,0x00,0x00,0xFF,0xC3,0x86,0x0C,0x18,0x30,0x61,0xC3,0xFF,0x00,0x00,0x00 ; 0x00004E23 Z.......0a.....
db 0x6D,0x00,0x00,0x00,0x00,0x00,0xE6,0xFF,0xDB,0xDB,0xDB,0xDB,0x00,0x00,0x00 ; 0x00004E32 m..............
db 0x76,0x00,0x00,0x00,0x00,0x00,0xC3,0xC3,0xC3,0x66,0x3C,0x18,0x00,0x00,0x00 ; 0x00004E41 v........f.....
db 0x77,0x00,0x00,0x00,0x00,0x00,0xC3,0xC3,0xDB,0xDB,0xFF,0x66,0x00,0x00,0x00 ; 0x00004E50 w..........f...
db 0x91,0x00,0x00,0x00,0x00,0x6E,0x3B,0x1B,0x7E,0xD8,0xDC,0x77,0x00,0x00,0x00 ; 0x00004E5F .....n;.~..w...
db 0x9B,0x00,0x18,0x18,0x7E,0xC3,0xC0,0xC0,0xC3,0x7E,0x18,0x18,0x00,0x00,0x00 ; 0x00004E6E ....~....~.....
db 0x9D,0x00,0x00,0xC3,0x66,0x3C,0x18,0xFF,0x18,0xFF,0x18,0x18,0x00,0x00,0x00 ; 0x00004E7D ....f..........
db 0x9E,0x00,0xFC,0x66,0x66,0x7C,0x62,0x66,0x6F,0x66,0x66,0xF3,0x00,0x00,0x00 ; 0x00004E8C ...ff|bfoff....
db 0xF1,0x00,0x00,0x18,0x18,0x18,0xFF,0x18,0x18,0x18,0x00,0xFF,0x00,0x00,0x00 ; 0x00004E9B ...............
db 0xF6,0x00,0x00,0x18,0x18,0x00,0x00,0xFF,0x00,0x00,0x18,0x18,0x00,0x00,0x00 ; 0x00004EAA ...............
db 0x00 ; end-of-supplemental terminator
;
; 8x16 font (16 bytes per row, one row per character)
;
font_8x16:
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00004EBA ................
db 0x00,0x00,0x7E,0x81,0xA5,0x81,0x81,0xBD,0x99,0x81,0x81,0x7E,0x00,0x00,0x00,0x00 ; 0x00004ECA ..~........~....
db 0x00,0x00,0x7E,0xFF,0xDB,0xFF,0xFF,0xC3,0xE7,0xFF,0xFF,0x7E,0x00,0x00,0x00,0x00 ; 0x00004EDA ..~........~....
db 0x00,0x00,0x00,0x00,0x6C,0xFE,0xFE,0xFE,0xFE,0x7C,0x38,0x10,0x00,0x00,0x00,0x00 ; 0x00004EEA ....l....|8.....
db 0x00,0x00,0x00,0x00,0x10,0x38,0x7C,0xFE,0x7C,0x38,0x10,0x00,0x00,0x00,0x00,0x00 ; 0x00004EFA .....8|.|8......
db 0x00,0x00,0x00,0x18,0x3C,0x3C,0xE7,0xE7,0xE7,0x18,0x18,0x3C,0x00,0x00,0x00,0x00 ; 0x00004F0A ................
db 0x00,0x00,0x00,0x18,0x3C,0x7E,0xFF,0xFF,0x7E,0x18,0x18,0x3C,0x00,0x00,0x00,0x00 ; 0x00004F1A .....~..~.......
db 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x3C,0x3C,0x18,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00004F2A ................
db 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0xC3,0xC3,0xE7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ; 0x00004F3A ................
db 0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x42,0x42,0x66,0x3C,0x00,0x00,0x00,0x00,0x00 ; 0x00004F4A ......fBBf......
db 0xFF,0xFF,0xFF,0xFF,0xFF,0xC3,0x99,0xBD,0xBD,0x99,0xC3,0xFF,0xFF,0xFF,0xFF,0xFF ; 0x00004F5A ................
db 0x00,0x00,0x1E,0x0E,0x1A,0x32,0x78,0xCC,0xCC,0xCC,0xCC,0x78,0x00,0x00,0x00,0x00 ; 0x00004F6A .....2x....x....
db 0x00,0x00,0x3C,0x66,0x66,0x66,0x66,0x3C,0x18,0x7E,0x18,0x18,0x00,0x00,0x00,0x00 ; 0x00004F7A ...ffff..~......
db 0x00,0x00,0x3F,0x33,0x3F,0x30,0x30,0x30,0x30,0x70,0xF0,0xE0,0x00,0x00,0x00,0x00 ; 0x00004F8A ..?3?0000p......
db 0x00,0x00,0x7F,0x63,0x7F,0x63,0x63,0x63,0x63,0x67,0xE7,0xE6,0xC0,0x00,0x00,0x00 ; 0x00004F9A ...c.ccccg......
db 0x00,0x00,0x00,0x18,0x18,0xDB,0x3C,0xE7,0x3C,0xDB,0x18,0x18,0x00,0x00,0x00,0x00 ; 0x00004FAA ................
db 0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFE,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00 ; 0x00004FBA ................
db 0x00,0x02,0x06,0x0E,0x1E,0x3E,0xFE,0x3E,0x1E,0x0E,0x06,0x02,0x00,0x00,0x00,0x00 ; 0x00004FCA ................
db 0x00,0x00,0x18,0x3C,0x7E,0x18,0x18,0x18,0x7E,0x3C,0x18,0x00,0x00,0x00,0x00,0x00 ; 0x00004FDA ....~...~.......
db 0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x66,0x66,0x00,0x00,0x00,0x00 ; 0x00004FEA ..fffffff.ff....
db 0x00,0x00,0x7F,0xDB,0xDB,0xDB,0x7B,0x1B,0x1B,0x1B,0x1B,0x1B,0x00,0x00,0x00,0x00 ; 0x00004FFA ......{.........
db 0x00,0x7C,0xC6,0x60,0x38,0x6C,0xC6,0xC6,0x6C,0x38,0x0C,0xC6,0x7C,0x00,0x00,0x00 ; 0x0000500A .|.`8l..l8..|...
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0xFE,0xFE,0x00,0x00,0x00,0x00 ; 0x0000501A ................
db 0x00,0x00,0x18,0x3C,0x7E,0x18,0x18,0x18,0x7E,0x3C,0x18,0x7E,0x00,0x00,0x00,0x00 ; 0x0000502A ....~...~..~....
db 0x00,0x00,0x18,0x3C,0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00 ; 0x0000503A ....~...........
db 0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x3C,0x18,0x00,0x00,0x00,0x00 ; 0x0000504A .........~......
db 0x00,0x00,0x00,0x00,0x00,0x18,0x0C,0xFE,0x0C,0x18,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x0000505A ................
db 0x00,0x00,0x00,0x00,0x00,0x30,0x60,0xFE,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x0000506A .....0`.`0......
db 0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xC0,0xFE,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x0000507A ................
db 0x00,0x00,0x00,0x00,0x00,0x28,0x6C,0xFE,0x6C,0x28,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x0000508A .....(l.l(......
db 0x00,0x00,0x00,0x00,0x10,0x38,0x38,0x7C,0x7C,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00 ; 0x0000509A .....88||.......
db 0x00,0x00,0x00,0x00,0xFE,0xFE,0x7C,0x7C,0x38,0x38,0x10,0x00,0x00,0x00,0x00,0x00 ; 0x000050AA ......||88......
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x000050BA ................
db 0x00,0x00,0x18,0x3C,0x3C,0x3C,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00 ; 0x000050CA ................
db 0x00,0x66,0x66,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x000050DA .fff$...........
db 0x00,0x00,0x00,0x6C,0x6C,0xFE,0x6C,0x6C,0x6C,0xFE,0x6C,0x6C,0x00,0x00,0x00,0x00 ; 0x000050EA ...ll.lll.ll....
db 0x18,0x18,0x7C,0xC6,0xC2,0xC0,0x7C,0x06,0x06,0x86,0xC6,0x7C,0x18,0x18,0x00,0x00 ; 0x000050FA ..|...|....|....
db 0x00,0x00,0x00,0x00,0xC2,0xC6,0x0C,0x18,0x30,0x60,0xC6,0x86,0x00,0x00,0x00,0x00 ; 0x0000510A ........0`......
db 0x00,0x00,0x38,0x6C,0x6C,0x38,0x76,0xDC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00 ; 0x0000511A ..8ll8v....v....
db 0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x0000512A .000`...........
db 0x00,0x00,0x0C,0x18,0x30,0x30,0x30,0x30,0x30,0x30,0x18,0x0C,0x00,0x00,0x00,0x00 ; 0x0000513A ....000000......
db 0x00,0x00,0x30,0x18,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x18,0x30,0x00,0x00,0x00,0x00 ; 0x0000514A ..0........0....
db 0x00,0x00,0x00,0x00,0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x0000515A .....f...f......
db 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x7E,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x0000516A .......~........
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00,0x00 ; 0x0000517A ............0...
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x0000518A ................
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00 ; 0x0000519A ................
db 0x00,0x00,0x00,0x00,0x02,0x06,0x0C,0x18,0x30,0x60,0xC0,0x80,0x00,0x00,0x00,0x00 ; 0x000051AA ........0`......
db 0x00,0x00,0x38,0x6C,0xC6,0xC6,0xD6,0xD6,0xC6,0xC6,0x6C,0x38,0x00,0x00,0x00,0x00 ; 0x000051BA ..8l......l8....
db 0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00,0x00,0x00 ; 0x000051CA ...8x......~....
db 0x00,0x00,0x7C,0xC6,0x06,0x0C,0x18,0x30,0x60,0xC0,0xC6,0xFE,0x00,0x00,0x00,0x00 ; 0x000051DA ..|....0`.......
db 0x00,0x00,0x7C,0xC6,0x06,0x06,0x3C,0x06,0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00 ; 0x000051EA ..|........|....
db 0x00,0x00,0x0C,0x1C,0x3C,0x6C,0xCC,0xFE,0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00 ; 0x000051FA .....l..........
db 0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xFC,0x06,0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00 ; 0x0000520A ...........|....
db 0x00,0x00,0x38,0x60,0xC0,0xC0,0xFC,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00 ; 0x0000521A ..8`.......|....
db 0x00,0x00,0xFE,0xC6,0x06,0x06,0x0C,0x18,0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00 ; 0x0000522A ........0000....
db 0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7C,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00 ; 0x0000523A ..|...|....|....
db 0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7E,0x06,0x06,0x06,0x0C,0x78,0x00,0x00,0x00,0x00 ; 0x0000524A ..|...~....x....
db 0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00 ; 0x0000525A ................
db 0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00 ; 0x0000526A ...........0....
db 0x00,0x00,0x00,0x06,0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x06,0x00,0x00,0x00,0x00 ; 0x0000527A ......0`0.......
db 0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x0000528A .....~..~.......
db 0x00,0x00,0x00,0x60,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x60,0x00,0x00,0x00,0x00 ; 0x0000529A ...`0.....0`....
db 0x00,0x00,0x7C,0xC6,0xC6,0x0C,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00 ; 0x000052AA ..|.............
db 0x00,0x00,0x00,0x7C,0xC6,0xC6,0xDE,0xDE,0xDE,0xDC,0xC0,0x7C,0x00,0x00,0x00,0x00 ; 0x000052BA ...|.......|....
db 0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00 ; 0x000052CA ...8l...........
db 0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x66,0x66,0x66,0x66,0xFC,0x00,0x00,0x00,0x00 ; 0x000052DA ...fff|ffff.....
db 0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xC0,0xC0,0xC2,0x66,0x3C,0x00,0x00,0x00,0x00 ; 0x000052EA ...f......f.....
db 0x00,0x00,0xF8,0x6C,0x66,0x66,0x66,0x66,0x66,0x66,0x6C,0xF8,0x00,0x00,0x00,0x00 ; 0x000052FA ...lffffffl.....
db 0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68,0x60,0x62,0x66,0xFE,0x00,0x00,0x00,0x00 ; 0x0000530A ...fbhxh`bf.....
db 0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00 ; 0x0000531A ...fbhxh```.....
db 0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xDE,0xC6,0xC6,0x66,0x3A,0x00,0x00,0x00,0x00 ; 0x0000532A ...f......f:....
db 0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00 ; 0x0000533A ................
db 0x00,0x00,0x3C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00 ; 0x0000534A ................
db 0x00,0x00,0x1E,0x0C,0x0C,0x0C,0x0C,0x0C,0xCC,0xCC,0xCC,0x78,0x00,0x00,0x00,0x00 ; 0x0000535A ...........x....
db 0x00,0x00,0xE6,0x66,0x66,0x6C,0x78,0x78,0x6C,0x66,0x66,0xE6,0x00,0x00,0x00,0x00 ; 0x0000536A ...fflxxlff.....
db 0x00,0x00,0xF0,0x60,0x60,0x60,0x60,0x60,0x60,0x62,0x66,0xFE,0x00,0x00,0x00,0x00 ; 0x0000537A ...``````bf.....
db 0x00,0x00,0xC6,0xEE,0xFE,0xFE,0xD6,0xC6,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00 ; 0x0000538A ................
db 0x00,0x00,0xC6,0xE6,0xF6,0xFE,0xDE,0xCE,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00 ; 0x0000539A ................
db 0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00 ; 0x000053AA ..|........|....
db 0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x60,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00 ; 0x000053BA ...fff|````.....
db 0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xD6,0xDE,0x7C,0x0C,0x0E,0x00,0x00 ; 0x000053CA ..|........|....
db 0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x6C,0x66,0x66,0x66,0xE6,0x00,0x00,0x00,0x00 ; 0x000053DA ...fff|lfff.....
db 0x00,0x00,0x7C,0xC6,0xC6,0x60,0x38,0x0C,0x06,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00 ; 0x000053EA ..|..`8....|....
db 0x00,0x00,0x7E,0x7E,0x5A,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00 ; 0x000053FA ..~~Z...........
db 0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00 ; 0x0000540A ...........|....
db 0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x10,0x00,0x00,0x00,0x00 ; 0x0000541A .........l8.....
db 0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xD6,0xD6,0xD6,0xFE,0xEE,0x6C,0x00,0x00,0x00,0x00 ; 0x0000542A ...........l....
db 0x00,0x00,0xC6,0xC6,0x6C,0x7C,0x38,0x38,0x7C,0x6C,0xC6,0xC6,0x00,0x00,0x00,0x00 ; 0x0000543A ....l|88|l......
db 0x00,0x00,0x66,0x66,0x66,0x66,0x3C,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00 ; 0x0000544A ..ffff..........
db 0x00,0x00,0xFE,0xC6,0x86,0x0C,0x18,0x30,0x60,0xC2,0xC6,0xFE,0x00,0x00,0x00,0x00 ; 0x0000545A .......0`.......
db 0x00,0x00,0x3C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3C,0x00,0x00,0x00,0x00 ; 0x0000546A ...00000000.....
db 0x00,0x00,0x00,0x80,0xC0,0xE0,0x70,0x38,0x1C,0x0E,0x06,0x02,0x00,0x00,0x00,0x00 ; 0x0000547A ......p8........
db 0x00,0x00,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00,0x00,0x00,0x00 ; 0x0000548A ................
db 0x10,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x0000549A .8l.............
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00 ; 0x000054AA ................
db 0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x000054BA 00..............
db 0x00,0x00,0x00,0x00,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00 ; 0x000054CA .....x.|...v....
db 0x00,0x00,0xE0,0x60,0x60,0x78,0x6C,0x66,0x66,0x66,0x66,0x7C,0x00,0x00,0x00,0x00 ; 0x000054DA ...``xlffff|....
db 0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xC0,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00 ; 0x000054EA .....|.....|....
db 0x00,0x00,0x1C,0x0C,0x0C,0x3C,0x6C,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00 ; 0x000054FA ......l....v....
db 0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xFE,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00 ; 0x0000550A .....|.....|....
db 0x00,0x00,0x38,0x6C,0x64,0x60,0xF0,0x60,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00 ; 0x0000551A ..8ld`.````.....
db 0x00,0x00,0x00,0x00,0x00,0x76,0xCC,0xCC,0xCC,0xCC,0xCC,0x7C,0x0C,0xCC,0x78,0x00 ; 0x0000552A .....v.....|..x.
db 0x00,0x00,0xE0,0x60,0x60,0x6C,0x76,0x66,0x66,0x66,0x66,0xE6,0x00,0x00,0x00,0x00 ; 0x0000553A ...``lvffff.....
db 0x00,0x00,0x18,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00 ; 0x0000554A .....8..........
db 0x00,0x00,0x06,0x06,0x00,0x0E,0x06,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3C,0x00 ; 0x0000555A ............ff..
db 0x00,0x00,0xE0,0x60,0x60,0x66,0x6C,0x78,0x78,0x6C,0x66,0xE6,0x00,0x00,0x00,0x00 ; 0x0000556A ...``flxxlf.....
db 0x00,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00 ; 0x0000557A ..8.............
db 0x00,0x00,0x00,0x00,0x00,0xEC,0xFE,0xD6,0xD6,0xD6,0xD6,0xC6,0x00,0x00,0x00,0x00 ; 0x0000558A ................
db 0x00,0x00,0x00,0x00,0x00,0xDC,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00 ; 0x0000559A ......ffffff....
db 0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00 ; 0x000055AA .....|.....|....
db 0x00,0x00,0x00,0x00,0x00,0xDC,0x66,0x66,0x66,0x66,0x66,0x7C,0x60,0x60,0xF0,0x00 ; 0x000055BA ......fffff|``..
db 0x00,0x00,0x00,0x00,0x00,0x76,0xCC,0xCC,0xCC,0xCC,0xCC,0x7C,0x0C,0x0C,0x1E,0x00 ; 0x000055CA .....v.....|....
db 0x00,0x00,0x00,0x00,0x00,0xDC,0x76,0x66,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00 ; 0x000055DA ......vf```.....
db 0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0x60,0x38,0x0C,0xC6,0x7C,0x00,0x00,0x00,0x00 ; 0x000055EA .....|.`8..|....
db 0x00,0x00,0x10,0x30,0x30,0xFC,0x30,0x30,0x30,0x30,0x36,0x1C,0x00,0x00,0x00,0x00 ; 0x000055FA ...00.00006.....
db 0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00 ; 0x0000560A ...........v....
db 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00,0x00,0x00,0x00 ; 0x0000561A .....fffff......
db 0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0xD6,0xD6,0xD6,0xFE,0x6C,0x00,0x00,0x00,0x00 ; 0x0000562A ...........l....
db 0x00,0x00,0x00,0x00,0x00,0xC6,0x6C,0x38,0x38,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00 ; 0x0000563A ......l888l.....
db 0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7E,0x06,0x0C,0xF8,0x00 ; 0x0000564A ...........~....
db 0x00,0x00,0x00,0x00,0x00,0xFE,0xCC,0x18,0x30,0x60,0xC6,0xFE,0x00,0x00,0x00,0x00 ; 0x0000565A ........0`......
db 0x00,0x00,0x0E,0x18,0x18,0x18,0x70,0x18,0x18,0x18,0x18,0x0E,0x00,0x00,0x00,0x00 ; 0x0000566A ......p.........
db 0x00,0x00,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00 ; 0x0000567A ................
db 0x00,0x00,0x70,0x18,0x18,0x18,0x0E,0x18,0x18,0x18,0x18,0x70,0x00,0x00,0x00,0x00 ; 0x0000568A ..p........p....
db 0x00,0x00,0x76,0xDC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x0000569A ..v.............
db 0x00,0x00,0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xC6,0xFE,0x00,0x00,0x00,0x00,0x00 ; 0x000056AA .....8l.........
db 0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xC0,0xC2,0x66,0x3C,0x0C,0x06,0x7C,0x00,0x00 ; 0x000056BA ...f.....f...|..
db 0x00,0x00,0xCC,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00 ; 0x000056CA ...........v....
db 0x00,0x0C,0x18,0x30,0x00,0x7C,0xC6,0xFE,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00 ; 0x000056DA ...0.|.....|....
db 0x00,0x10,0x38,0x6C,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00 ; 0x000056EA ..8l.x.|...v....
db 0x00,0x00,0xCC,0x00,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00 ; 0x000056FA .....x.|...v....
db 0x00,0x60,0x30,0x18,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00 ; 0x0000570A .`0..x.|...v....
db 0x00,0x38,0x6C,0x38,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00 ; 0x0000571A .8l8.x.|...v....
db 0x00,0x00,0x00,0x00,0x3C,0x66,0x60,0x60,0x66,0x3C,0x0C,0x06,0x3C,0x00,0x00,0x00 ; 0x0000572A .....f``f.......
db 0x00,0x10,0x38,0x6C,0x00,0x7C,0xC6,0xFE,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00 ; 0x0000573A ..8l.|.....|....
db 0x00,0x00,0xC6,0x00,0x00,0x7C,0xC6,0xFE,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00 ; 0x0000574A .....|.....|....
db 0x00,0x60,0x30,0x18,0x00,0x7C,0xC6,0xFE,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00 ; 0x0000575A .`0..|.....|....
db 0x00,0x00,0x66,0x00,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00 ; 0x0000576A ..f..8..........
db 0x00,0x18,0x3C,0x66,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00 ; 0x0000577A ...f.8..........
db 0x00,0x60,0x30,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00 ; 0x0000578A .`0..8..........
db 0x00,0xC6,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00 ; 0x0000579A ....8l..........
db 0x38,0x6C,0x38,0x00,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00 ; 0x000057AA 8l8.8l..........
db 0x18,0x30,0x60,0x00,0xFE,0x66,0x60,0x7C,0x60,0x60,0x66,0xFE,0x00,0x00,0x00,0x00 ; 0x000057BA .0`..f`|``f.....
db 0x00,0x00,0x00,0x00,0x00,0xCC,0x76,0x36,0x7E,0xD8,0xD8,0x6E,0x00,0x00,0x00,0x00 ; 0x000057CA ......v6~..n....
db 0x00,0x00,0x3E,0x6C,0xCC,0xCC,0xFE,0xCC,0xCC,0xCC,0xCC,0xCE,0x00,0x00,0x00,0x00 ; 0x000057DA ...l............
db 0x00,0x10,0x38,0x6C,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00 ; 0x000057EA ..8l.|.....|....
db 0x00,0x00,0xC6,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00 ; 0x000057FA .....|.....|....
db 0x00,0x60,0x30,0x18,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00 ; 0x0000580A .`0..|.....|....
db 0x00,0x30,0x78,0xCC,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00 ; 0x0000581A .0x........v....
db 0x00,0x60,0x30,0x18,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00 ; 0x0000582A .`0........v....
db 0x00,0x00,0xC6,0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7E,0x06,0x0C,0x78,0x00 ; 0x0000583A ...........~..x.
db 0x00,0xC6,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00 ; 0x0000584A ...|.......|....
db 0x00,0xC6,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00 ; 0x0000585A ...........|....
db 0x00,0x18,0x18,0x3C,0x66,0x60,0x60,0x60,0x66,0x3C,0x18,0x18,0x00,0x00,0x00,0x00 ; 0x0000586A ....f```f.......
db 0x00,0x38,0x6C,0x64,0x60,0xF0,0x60,0x60,0x60,0x60,0xE6,0xFC,0x00,0x00,0x00,0x00 ; 0x0000587A .8ld`.````......
db 0x00,0x00,0x66,0x66,0x3C,0x18,0x7E,0x18,0x7E,0x18,0x18,0x18,0x00,0x00,0x00,0x00 ; 0x0000588A ..ff..~.~.......
db 0x00,0xF8,0xCC,0xCC,0xF8,0xC4,0xCC,0xDE,0xCC,0xCC,0xCC,0xC6,0x00,0x00,0x00,0x00 ; 0x0000589A ................
db 0x00,0x0E,0x1B,0x18,0x18,0x18,0x7E,0x18,0x18,0x18,0x18,0x18,0xD8,0x70,0x00,0x00 ; 0x000058AA ......~......p..
db 0x00,0x18,0x30,0x60,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00 ; 0x000058BA ..0`.x.|...v....
db 0x00,0x0C,0x18,0x30,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00 ; 0x000058CA ...0.8..........
db 0x00,0x18,0x30,0x60,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00 ; 0x000058DA ..0`.|.....|....
db 0x00,0x18,0x30,0x60,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00 ; 0x000058EA ..0`.......v....
db 0x00,0x00,0x76,0xDC,0x00,0xDC,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00 ; 0x000058FA ..v...ffffff....
db 0x76,0xDC,0x00,0xC6,0xE6,0xF6,0xFE,0xDE,0xCE,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00 ; 0x0000590A v...............
db 0x00,0x3C,0x6C,0x6C,0x3E,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x0000591A ..ll..~.........
db 0x00,0x38,0x6C,0x6C,0x38,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x0000592A .8ll8.|.........
db 0x00,0x00,0x30,0x30,0x00,0x30,0x30,0x60,0xC0,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00 ; 0x0000593A ..00.00`...|....
db 0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00 ; 0x0000594A ................
db 0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00 ; 0x0000595A ................
db 0x00,0xC0,0xC0,0xC2,0xC6,0xCC,0x18,0x30,0x60,0xDC,0x86,0x0C,0x18,0x3E,0x00,0x00 ; 0x0000596A .......0`.......
db 0x00,0xC0,0xC0,0xC2,0xC6,0xCC,0x18,0x30,0x66,0xCE,0x9E,0x3E,0x06,0x06,0x00,0x00 ; 0x0000597A .......0f.......
db 0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x18,0x3C,0x3C,0x3C,0x18,0x00,0x00,0x00,0x00 ; 0x0000598A ................
db 0x00,0x00,0x00,0x00,0x00,0x36,0x6C,0xD8,0x6C,0x36,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x0000599A .....6l.l6......
db 0x00,0x00,0x00,0x00,0x00,0xD8,0x6C,0x36,0x6C,0xD8,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x000059AA ......l6l.......
db 0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44 ; 0x000059BA .D.D.D.D.D.D.D.D
db 0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA ; 0x000059CA U.U.U.U.U.U.U.U.
db 0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77 ; 0x000059DA .w.w.w.w.w.w.w.w
db 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x000059EA ................
db 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x000059FA ................
db 0x18,0x18,0x18,0x18,0x18,0xF8,0x18,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x00005A0A ................
db 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xF6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36 ; 0x00005A1A 6666666.66666666
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36 ; 0x00005A2A ........66666666
db 0x00,0x00,0x00,0x00,0x00,0xF8,0x18,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x00005A3A ................
db 0x36,0x36,0x36,0x36,0x36,0xF6,0x06,0xF6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36 ; 0x00005A4A 66666...66666666
db 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36 ; 0x00005A5A 6666666666666666
db 0x00,0x00,0x00,0x00,0x00,0xFE,0x06,0xF6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36 ; 0x00005A6A ........66666666
db 0x36,0x36,0x36,0x36,0x36,0xF6,0x06,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00005A7A 66666...........
db 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00005A8A 6666666.........
db 0x18,0x18,0x18,0x18,0x18,0xF8,0x18,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00005A9A ................
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x00005AAA ................
db 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00005ABA ................
db 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00005ACA ................
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x00005ADA ................
db 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x00005AEA ................
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00005AFA ................
db 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x00005B0A ................
db 0x18,0x18,0x18,0x18,0x18,0x1F,0x18,0x1F,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x00005B1A ................
db 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36 ; 0x00005B2A 6666666766666666
db 0x36,0x36,0x36,0x36,0x36,0x37,0x30,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00005B3A 6666670?........
db 0x00,0x00,0x00,0x00,0x00,0x3F,0x30,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36 ; 0x00005B4A .....?0766666666
db 0x36,0x36,0x36,0x36,0x36,0xF7,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00005B5A 66666...........
db 0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xF7,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36 ; 0x00005B6A ........66666666
db 0x36,0x36,0x36,0x36,0x36,0x37,0x30,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36 ; 0x00005B7A 6666670766666666
db 0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00005B8A ................
db 0x36,0x36,0x36,0x36,0x36,0xF7,0x00,0xF7,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36 ; 0x00005B9A 66666...66666666
db 0x18,0x18,0x18,0x18,0x18,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00005BAA ................
db 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00005BBA 6666666.........
db 0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x00005BCA ................
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36 ; 0x00005BDA ........66666666
db 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00005BEA 6666666?........
db 0x18,0x18,0x18,0x18,0x18,0x1F,0x18,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00005BFA ................
db 0x00,0x00,0x00,0x00,0x00,0x1F,0x18,0x1F,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x00005C0A ................
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36 ; 0x00005C1A .......?66666666
db 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xFF,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36 ; 0x00005C2A 6666666.66666666
db 0x18,0x18,0x18,0x18,0x18,0xFF,0x18,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x00005C3A ................
db 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00005C4A ................
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x00005C5A ................
db 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ; 0x00005C6A ................
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ; 0x00005C7A ................
db 0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0 ; 0x00005C8A ................
db 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F ; 0x00005C9A ................
db 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00005CAA ................
db 0x00,0x00,0x00,0x00,0x00,0x76,0xDC,0xD8,0xD8,0xD8,0xDC,0x76,0x00,0x00,0x00,0x00 ; 0x00005CBA .....v.....v....
db 0x00,0x00,0x78,0xCC,0xCC,0xCC,0xD8,0xCC,0xC6,0xC6,0xC6,0xCC,0x00,0x00,0x00,0x00 ; 0x00005CCA ..x.............
db 0x00,0x00,0xFE,0xC6,0xC6,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00 ; 0x00005CDA ................
db 0x00,0x00,0x00,0x00,0xFE,0x6C,0x6C,0x6C,0x6C,0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00 ; 0x00005CEA .....lllllll....
db 0x00,0x00,0x00,0xFE,0xC6,0x60,0x30,0x18,0x30,0x60,0xC6,0xFE,0x00,0x00,0x00,0x00 ; 0x00005CFA .....`0.0`......
db 0x00,0x00,0x00,0x00,0x00,0x7E,0xD8,0xD8,0xD8,0xD8,0xD8,0x70,0x00,0x00,0x00,0x00 ; 0x00005D0A .....~.....p....
db 0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x7C,0x60,0x60,0xC0,0x00,0x00,0x00 ; 0x00005D1A ....fffff|``....
db 0x00,0x00,0x00,0x00,0x76,0xDC,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00 ; 0x00005D2A ....v...........
db 0x00,0x00,0x00,0x7E,0x18,0x3C,0x66,0x66,0x66,0x3C,0x18,0x7E,0x00,0x00,0x00,0x00 ; 0x00005D3A ...~..fff..~....
db 0x00,0x00,0x00,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0x6C,0x38,0x00,0x00,0x00,0x00 ; 0x00005D4A ...8l.....l8....
db 0x00,0x00,0x38,0x6C,0xC6,0xC6,0xC6,0x6C,0x6C,0x6C,0x6C,0xEE,0x00,0x00,0x00,0x00 ; 0x00005D5A ..8l...llll.....
db 0x00,0x00,0x1E,0x30,0x18,0x0C,0x3E,0x66,0x66,0x66,0x66,0x3C,0x00,0x00,0x00,0x00 ; 0x00005D6A ...0...ffff.....
db 0x00,0x00,0x00,0x00,0x00,0x7E,0xDB,0xDB,0xDB,0x7E,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00005D7A .....~...~......
db 0x00,0x00,0x00,0x03,0x06,0x7E,0xDB,0xDB,0xF3,0x7E,0x60,0xC0,0x00,0x00,0x00,0x00 ; 0x00005D8A .....~...~`.....
db 0x00,0x00,0x1C,0x30,0x60,0x60,0x7C,0x60,0x60,0x60,0x30,0x1C,0x00,0x00,0x00,0x00 ; 0x00005D9A ...0``|```0.....
db 0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00 ; 0x00005DAA ...|............
db 0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0xFE,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00 ; 0x00005DBA ................
db 0x00,0x00,0x00,0x00,0x18,0x18,0x7E,0x18,0x18,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ; 0x00005DCA ......~.........
db 0x00,0x00,0x00,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00,0x7E,0x00,0x00,0x00,0x00 ; 0x00005DDA ...0.....0.~....
db 0x00,0x00,0x00,0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00,0x7E,0x00,0x00,0x00,0x00 ; 0x00005DEA .....0`0...~....
db 0x00,0x00,0x0E,0x1B,0x1B,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18 ; 0x00005DFA ................
db 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xD8,0xD8,0xD8,0x70,0x00,0x00,0x00,0x00 ; 0x00005E0A ...........p....
db 0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x7E,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00 ; 0x00005E1A .......~........
db 0x00,0x00,0x00,0x00,0x00,0x76,0xDC,0x00,0x76,0xDC,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00005E2A .....v..v.......
db 0x00,0x38,0x6C,0x6C,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00005E3A .8ll8...........
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00005E4A ................
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00005E5A ................
db 0x00,0x0F,0x0C,0x0C,0x0C,0x0C,0x0C,0xEC,0x6C,0x6C,0x3C,0x1C,0x00,0x00,0x00,0x00 ; 0x00005E6A ........ll......
db 0x00,0xD8,0x6C,0x6C,0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00005E7A ..lllll.........
db 0x00,0x70,0xD8,0x30,0x60,0xC8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00005E8A .p.0`...........
db 0x00,0x00,0x00,0x00,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x00,0x00,0x00,0x00,0x00 ; 0x00005E9A ....|||||||.....
db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00005EAA ................
;
; 8x16 supplemental
;
font_8x16_supp:
db 0x1D,0x00,0x00,0x00,0x00,0x00,0x24,0x66,0xFF,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00005EBA ......$f.f$......
db 0x30,0x00,0x00,0x3C,0x66,0xC3,0xC3,0xDB,0xDB,0xC3,0xC3,0x66,0x3C,0x00,0x00,0x00,0x00 ; 0x00005ECB 0...f......f.....
db 0x4D,0x00,0x00,0xC3,0xE7,0xFF,0xFF,0xDB,0xC3,0xC3,0xC3,0xC3,0xC3,0x00,0x00,0x00,0x00 ; 0x00005EDC M................
db 0x54,0x00,0x00,0xFF,0xDB,0x99,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00 ; 0x00005EED T................
db 0x56,0x00,0x00,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0x66,0x3C,0x18,0x00,0x00,0x00,0x00 ; 0x00005EFE V.........f......
db 0x57,0x00,0x00,0xC3,0xC3,0xC3,0xC3,0xC3,0xDB,0xDB,0xFF,0x66,0x66,0x00,0x00,0x00,0x00 ; 0x00005F0F W..........ff....
db 0x58,0x00,0x00,0xC3,0xC3,0x66,0x3C,0x18,0x18,0x3C,0x66,0xC3,0xC3,0x00,0x00,0x00,0x00 ; 0x00005F20 X....f....f......
db 0x59,0x00,0x00,0xC3,0xC3,0xC3,0x66,0x3C,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00 ; 0x00005F31 Y.....f..........
db 0x5A,0x00,0x00,0xFF,0xC3,0x86,0x0C,0x18,0x30,0x60,0xC1,0xC3,0xFF,0x00,0x00,0x00,0x00 ; 0x00005F42 Z.......0`.......
db 0x6D,0x00,0x00,0x00,0x00,0x00,0xE6,0xFF,0xDB,0xDB,0xDB,0xDB,0xDB,0x00,0x00,0x00,0x00 ; 0x00005F53 m................
db 0x76,0x00,0x00,0x00,0x00,0x00,0xC3,0xC3,0xC3,0xC3,0x66,0x3C,0x18,0x00,0x00,0x00,0x00 ; 0x00005F64 v.........f......
db 0x77,0x00,0x00,0x00,0x00,0x00,0xC3,0xC3,0xC3,0xDB,0xDB,0xFF,0x66,0x00,0x00,0x00,0x00 ; 0x00005F75 w...........f....
db 0x78,0x00,0x00,0x00,0x00,0x00,0xC3,0x66,0x3C,0x18,0x3C,0x66,0xC3,0x00,0x00,0x00,0x00 ; 0x00005F86 x......f...f.....
db 0x91,0x00,0x00,0x00,0x00,0x00,0x6E,0x3B,0x1B,0x7E,0xD8,0xDC,0x77,0x00,0x00,0x00,0x00 ; 0x00005F97 ......n;.~..w....
db 0x9B,0x00,0x18,0x18,0x7E,0xC3,0xC0,0xC0,0xC0,0xC3,0x7E,0x18,0x18,0x00,0x00,0x00,0x00 ; 0x00005FA8 ....~.....~......
db 0x9D,0x00,0x00,0xC3,0x66,0x3C,0x18,0xFF,0x18,0xFF,0x18,0x18,0x18,0x00,0x00,0x00,0x00 ; 0x00005FB9 ....f............
db 0x9E,0x00,0xFC,0x66,0x66,0x7C,0x62,0x66,0x6F,0x66,0x66,0x66,0xF3,0x00,0x00,0x00,0x00 ; 0x00005FCA ...ff|bfofff.....
db 0xAB,0x00,0xC0,0xC0,0xC2,0xC6,0xCC,0x18,0x30,0x60,0xCE,0x9B,0x06,0x0C,0x1F,0x00,0x00 ; 0x00005FDB ........0`.......
db 0xAC,0x00,0xC0,0xC0,0xC2,0xC6,0xCC,0x18,0x30,0x66,0xCE,0x96,0x3E,0x06,0x06,0x00,0x00 ; 0x00005FEC ........0f.......
db 0x00 ; end-of-supplemental terminator
db 0x00
db 0x1E
{"data":[
-349132203,808728341,792014896,942617394,942746936,976236602,-1461112784,1112080384,1329799245,1413566541,1162625601,0,0,858796032,758527280,1127559216,
1381584975,1414022985,1380012064,1397310529,1498619973,1296389203,1313415251,824192579,741816377,943208753,1279336492,1230118988,1398032455,1397051936,1163285061,1095194180,
22845,757610496,419831562,101122588,7,1515221248,419831562,101122588,7,757610496,1678147338,66160,0,1380999424,419830031,185401881,
12,583936,203,0,-164408034,850648718,-854457928,1074186000,-1945710592,-956284402,1694566406,168216560,-940572671,-1342065658,-1240560634,2080818945,
-1945366528,-956269042,268504070,235834376,1946601217,-1946123008,838891022,62896832,23390446,75957958,-1996044704,213389572,45344832,-1342136344,35645441,1342326760,
-402633752,-2141703836,-58718236,-2147126267,159318780,-402518088,82510446,15198352,76091008,-620012256,-578354572,248249119,63825927,841947624,38070464,-2095906631,
-269999161,1358593,-382786072,-1847054505,64273920,75958006,-1107069950,914949044,817824867,-3676048,971561779,-1996032511,57999620,1392611560,-167586840,17074438,
-16119436,1944585593,-402396338,-622309826,-411018418,28951423,-860204800,31778819,-1028456924,-1174283800,-806878252,-401902336,-1125646156,243712,-860218389,29681667,
-1028521716,-1174291992,-1343749196,-401574656,129499284,-1993965568,1120796164,1493209832,263766979,63879685,-1342071320,1021587977,-402230005,-461373102,26011649,255639806,
179628917,1392607721,1343218816,-402403654,1347944822,1342474656,2131098752,-1993965558,-1477903612,-2146899123,67406094,1481493992,1476692386,1946418304,117211141,2142767221,
-402540800,-1017433030,-1432106868,-1475950844,1031067652,225755136,1977614397,-1475950840,-344656892,243319552,-2144336880,33851150,272007363,914362372,-1023277945,-1568848,
-1555968,-1327461888,16050202,1006695912,1962979354,-400183288,-404225818,-389773824,-58720034,-1293368539,-13479168,-1187524888,1287520257,1286662264,645927028,-1174731639,
1757282309,1285613688,28914667,2018557440,1951176168,-1995538416,96011780,2018819584,-347306520,-2029092840,243271684,1527121033,1400950656,-1107294791,1810397308,108354380,
-402535552,-154974504,33851142,-1195768459,-1174148349,1704985560,1355017732,2112362160,45766656,5826561,1911033520,-1161809152,-1007727896,-1976750872,-1976635711,-28840443,
2127379137,263242738,-402403654,-528089038,3205186,-1018503034,851690435,63355584,63486702,50379246,-352073286,-69014016,195,0,0,0,
-1023349778,-1023349780,1124070888,-269958010,-997831937,-1513277,-1513406,-1168981174,-605534488,1354980095,1526701544,-433924362,1351622379,1526698472,351004170,-401624944,
-1202651258,-1075313393,-1161602817,-1192557618,-1447856,-1031057318,-402403654,-346488918,637095,-1191187992,-454361078,-1977171574,-7018459,985792071,-1007583539,-389969156,
-22347885,2127379137,1364247539,-1188281880,-1460862978,201056520,-1017620023,803754320,-83668,-536303380,-346531333,-387937571,-1014562973,-997801182,1273554698,378258431,
-1031797661,-13047802,619496114,645972832,-1341193080,-1644543,101247184,45089928,-788538392,-2012870432,49924,0,-1157346912,1589182465,753723393,116791157,
1963984009,1946631210,749004811,12256884,13154560,1947155651,1947221243,244727,1006756025,1022194705,1021932562,-1142983416,-1866924030,568902401,235369005,2139827719,
12305162,750249984,1375708648,-472774991,-1144845735,-2144442224,242548543,1946630702,63144709,53407979,-276758145,-1329370904,629812745,937420880,-1057077416,-243986628,
1958696899,752019543,-164748686,1947206471,2139827739,1086817034,736628656,-2134575362,-2144466316,1971586175,113738499,73602699,-335101309,-1341931334,-29038592,1610592488,
-1207712582,1072169216,113662,-1977171062,870843489,-75480066,-1292796412,1166681794,-1258389239,604140803,-32184066,27843250,-1162739083,132694066,-32970498,-1070415694,
-1291977240,50378948,-1946288664,1161430,-1140984344,-1014366208,174164518,1140713960,2115566464,-25892623,-402648901,314256060,716630016,-402648133,-826660176,47875,
-1977171062,-1075300511,-75480067,-1326350840,-42670065,1954596086,1245610109,443909124,-1207712582,-1612185344,112893,-1746402892,1293309,2011693239,-571948246,-396922069,
-477430162,-27828037,-1156482868,-855746710,1757088376,2026700375,1467136771,-12615634,-1027993228,126496259,62193281,-31194507,1140674024,-12615634,-695526284,-402648648,
-2144404154,242548543,772246062,-402561142,1128529206,-1950094101,-402365642,-695468381,839303808,1358784,2754025,0,1981611136,-817705698,1980824704,-1202708970,
-661721088,-29458344,1948252927,-817705726,-53514803,861282043,-2032234762,-2031055932,-1670716,786878720,116692223,1590632286,-1865474210,1027618496,1047543328,1050689168,
1054883552,1149256512,1183860288,1195394880,1263552816,1298156400,1358974528,116328175,116328175,116328175,1375752560,21296,853510739,-1948003841,1527009431,1228832963,
91488772,71908992,1235272451,1952332804,-1017168894,73602699,-2042433798,-1006899488,65241427,786681856,124688267,50011,-1431677611,636026879,-964014037,-164436942,
653785739,-13761462,-1794667612,-1257790457,-1291336185,-772275449,-1731753241,72099575,-1017579517,-523116335,1048639491,1946551369,1491587330,-2061043773,-1963457788,653760711,
-134020020,653771608,-134019963,1979677672,-1446540526,192216576,33548161,162589904,-772002328,-773336601,-1329375001,63879683,-1325439511,63224322,-771793431,-1947807258,
881525332,195,0,0,0,0,-2119859842,2122422717,-2359426,2130700227,-16843156,1063036,-25413616,1063036,-29852616,2084076798,
2084048912,2084076798,1008205824,6204,-1008205825,-6205,1113996288,3958338,-1113996289,-3958339,2098136847,2026687692,1717986876,410916924,809448255,-521113552,
1669292927,-1058642077,-415475047,-1722139417,-17244032,8446200,-29487614,134718,410926104,406617624,1717986918,6684774,2078006143,1776411,1815634750,2026649708,
0,8289918,410926104,-15188866,410926104,1579032,404232216,1588350,-32761856,6156,-27250688,12384,-1061158912,65216,-10083328,9318,
2117867520,65535,2130706176,6204,0,0,813201456,3145776,7105644,0,1828613228,7105790,2025880624,3209228,416073216,13002288,
1983409208,7785692,12607584,0,1616916504,1585248,404238432,6303768,-12818944,26172,-63950848,12336,0,1613770752,-67108864,0,
0,3158016,806882310,8437856,-556874116,8185590,808480816,16527408,940362872,16567392,940362872,7916556,-865321956,1969406,217628924,7916556,
-121610184,7916748,403492092,3158064,2026687608,7916748,2093796472,7346188,3158016,3158016,3158016,1613770752,-1067438056,1585248,16515072,64512,
202911840,6303768,403491960,3145776,-555825540,7913694,-859015120,13421820,2087085820,16541286,-1061132740,3958464,1717988600,16280678,2020107006,16671336,
2020107006,15753320,-1061132740,4089550,-53687092,13421772,808464504,7876656,202116126,7916748,2020370150,15099500,1616929008,16672354,-16847162,13027030,
-554244410,13027022,-960074696,3697862,2087085820,15753312,-858993544,1865948,2087085820,15099500,1893780600,7916572,808498428,7876656,-858993460,16567500,
-858993460,3176652,-691616058,13037310,946652870,13003832,2026687692,7876656,411879166,16672306,1616928888,7888992,405823680,132620,404232312,7870488,
-965986288,0,0,-16777216,1585200,0,209190912,7785596,2086691040,14444134,-864550912,7916736,2081164316,7785676,-864550912,7913724,
-262116296,15753312,-864681984,-133399348,1986814176,15099494,812646448,7876656,202113036,2026687500,1818648800,15101048,808464496,7876656,-20185088,13031166,
-856162304,13421772,-864550912,7916748,1725693952,-262112154,-864681984,504134860,1994129408,15753318,-1065615360,16256120,813445136,1586224,-859045888,7785676,
-859045888,3176652,-691666944,7143166,1824915456,13003832,-859045888,-133399348,-1728315392,16540720,-533712868,1847344,1579032,1579032,472920288,14692400,
56438,0,1815613440,16697030,-859779976,2014058616,-872363008,8309964,-864550884,7913724,104645502,4154942,209191116,8309884,209191136,8309884,
209203248,8309884,-1065877504,940341440,1715258238,3956862,-864550708,7913724,-864550688,7913724,812646604,7876656,406374012,3938328,812646624,7876656,
-965986106,13027070,2013278256,13434060,1627127836,16539768,209649664,8375423,-20157378,13552844,2013318264,7916748,2013318144,7916748,2013323264,7916748,
-872362888,8309964,-872357888,8309964,-872363008,-133399348,1715214531,1588326,-859045684,7916748,-1065478120,404258496,-261854152,16574048,-59192116,808516656,
-87241480,-943271994,1008212750,1893210136,209190940,8309884,812646456,7876656,2013273088,7916748,-872408064,8309964,-134154240,13421772,-322174724,13425916,
1047292988,32256,946629688,31744,1613758512,7916736,-67108864,49344,-67108864,3084,-557005117,265053747,-607336765,63926071,402659352,1579032,
-865717504,13158,862374912,52326,-2011002846,-2011002846,-1437226411,-1437226411,-287606821,-287606821,404232216,404232216,404232216,404232440,418912280,404232440,
909522486,909522678,0,909522686,418906112,404232440,116799030,909522678,909522486,909522486,117309440,909522678,116799030,254,909522486,254,
418912280,248,0,404232440,404232216,31,404232216,255,0,404232447,404232216,404232223,0,255,404232216,404232447,
404690968,404232223,909522486,909522487,808924726,63,809435136,909522487,16201270,255,16711680,909522679,808924726,909522487,16711680,255,
16201270,909522679,16717848,255,909522486,255,16711680,404232447,0,909522687,909522486,63,404690968,31,404684800,404232223,
0,909522495,909522486,909522687,419371032,404232447,404232216,248,0,404232223,-1,-1,0,-1,-252645136,-252645136,
252645135,252645135,-1,0,-596246528,7789768,-120817664,-1061095220,-1060307968,12632256,1819082240,7105644,811650300,16567392,-662831104,7395544,
1717986816,-1067418522,417101312,1579032,-864538372,-63932212,-20550600,3697862,-960074696,15625324,2081959964,7916748,-612499456,32475,-612496378,-1067417893,
-121610184,3694784,-858993544,13421772,-67044352,64512,821833776,16515120,806891616,16515168,811610136,16515096,404429582,404232216,404232216,1893259288,
-67096528,3158016,14448128,56438,946629688,0,402653184,24,0,24,202116111,473722092,1819044984,108,1613764720,120,
1010565120,15420,0,0,0,0,0,0,-2119859842,-2120630911,126,-8519680,-1006632997,8323047,0,-16880640,
947715838,16,268435456,2097052728,4152,0,-415482856,404285415,60,1008205824,2130706302,3938328,0,402653184,1588284,0,
-1,-1010571265,-25,65535,1715208192,1013334594,0,-1,-1111647805,-15463,65535,840568350,-858993544,120,1715208192,406611558,
1579134,0,809448255,-261083088,224,1669267456,1667457919,-1058609305,0,1020991512,417021159,24,-1065353216,-117507872,8437984,0,
1041106434,101596926,2,1008205824,404232318,1588350,0,1717986918,1711302246,102,-612433920,461102043,1776411,2080374784,1815634118,946652870,
8177164,0,0,16711422,0,410926104,1014896664,32280,1008205824,404232318,1579032,0,404232216,1014896664,24,0,
217975832,24,0,1613758464,3170558,0,0,-1061109760,254,0,1814560768,2649342,0,268435456,2088515640,65278,
0,2097085952,272119932,0,0,0,0,0,1010580504,402659352,24,1717986816,36,0,0,1828613228,
1828613228,108,-964945896,108839106,410830470,24,-960364544,1714427916,198,1815609344,-596232084,7785676,805306368,6303792,0,0,
403439616,808464432,792624,0,202119216,403442700,48,0,1023360102,102,0,404226048,1579134,0,0,0,
806885400,0,0,254,0,0,0,1579008,0,403441154,-2134876112,0,-964952064,-420028722,8177350,0,
410531864,404232216,126,-964952064,806882310,16696928,0,101107324,-972683716,124,470548480,-20157380,1969164,0,-1061109506,-972683524,
124,1614282752,-956514112,8177350,0,201770750,808464408,48,-964952064,-964901178,8177350,0,-960051588,201721470,120,402653184,
24,6168,0,1579008,404226048,48,201719808,811610136,396312,0,2113929216,8257536,0,811597824,201722904,6303768,
0,214353532,402659352,24,-964952064,-555819322,8175836,0,-965986288,-960037178,198,1727791104,1719428710,16541286,0,-1061001668,
1724039360,60,1828192256,1717986918,16280678,0,1751279358,1717725304,254,1727922176,1752721506,15753312,0,-1061001668,1724309184,58,
-960102400,-956381498,13027014,0,404232252,404232216,60,203292672,202116108,7916748,0,1819043558,1718381688,230,1626341376,1616928864,
16672354,0,-16847162,-960051498,198,-423231488,-824246538,13027014,0,-960074696,1824966342,56,1727791104,1618765414,15753312,0,
-960051588,2094978758,3596,1727791104,1820092006,15099494,0,1623639676,-960099272,124,2122186752,404232282,3938328,0,-960051514,-960051514,
124,-960102400,-960051514,1063020,0,-960051514,2097075926,108,-960102400,943208556,13026924,0,1717986918,404232252,60,-956432384,
1613764748,16697026,0,808464444,808464432,60,-1065353216,473460960,132622,0,202116156,202116108,60,-965986288,0,0,
0,0,0,16711680,1585200,0,0,0,2013265920,-859014132,118,1625292800,1718384736,8152678,0,2080374784,
-960446266,124,203161600,-865321972,7785676,0,2080374784,-960430394,124,1815609344,1626366052,15753312,0,1979711488,2093796556,7916556,
1625292800,1719037024,15099494,0,939530264,404232216,60,101056512,101060096,1717962246,60,1717592288,1718384748,230,406323200,404232216,
3938328,0,-335544320,-690563330,198,0,1718017024,6710886,0,2080374784,-960051514,124,0,1718017024,1616936038,240,
1979711488,2093796556,1969164,0,1719065600,15753312,0,2080374784,-971214650,124,806354944,808516656,1848880,0,-872415232,-858993460,
118,0,1717986816,1588326,0,-973078528,-19474746,108,0,946652672,13003832,0,-973078528,2126956230,16256006,0,
416087552,16672304,0,404232206,404232304,14,404226048,402659352,1579032,0,404232304,404232206,112,-596246528,0,0,
0,940572672,-20527508,0,1715208192,-1027555134,101465190,124,-872362804,-858993460,118,806882304,-20546560,8177344,268435456,2013293624,
-859014132,118,-859045888,2081191936,7785676,1610612736,2013272112,-859014132,118,946616320,2081191936,7785676,0,1715208192,205284960,15366,
1815613440,-20546560,8177344,0,2080427212,-960430394,124,405823488,-20546560,8177344,0,939550310,404232216,60,1715214336,404240384,
3938328,1610612736,939530288,404232216,60,281462272,-960074696,13027070,1815609344,1815609400,-956381498,198,6303768,2086692606,16672352,0,
1993080832,-656900554,110,1816002560,-855716660,13552844,268435456,2080402488,-960051514,124,-960102400,-960070656,8177350,1610612736,2080380976,-960051514,
124,-864538624,-858993664,7785676,1610612736,-872409040,-858993460,118,-960102400,-960051712,201752262,-973078408,-965986106,1824966342,56,13026816,
-960051514,8177350,402653184,1617312792,406611552,24,1684813824,1616965728,16574048,0,406611558,410916990,24,-858982400,-557005576,13028556,
234881024,404232219,404232318,7395352,1613764608,2081191936,7785676,201326592,939536408,404232216,60,1613764608,-960070656,8177350,402653184,-872390608,
-858993460,118,-596246528,1718017024,6710886,-596246528,-152648192,-959521026,198,1819032576,8257598,0,939524096,3697772,124,0,
808452096,1613770752,8177350,0,0,-1061109506,0,0,117309440,1542,-1073741824,-657668416,-2032377808,4069388,-960446464,1714477260,
104767182,6,402659352,1010580504,24,0,1826122806,54,0,1826095104,14183478,0,1141982225,1141982225,1141982225,-1437252591,
-1437226411,-1437226411,-1437226411,2011002845,2011002845,2011002845,404256733,404232216,404232216,404232216,404232216,-132638696,404232216,404232216,-132638696,404289560,
404232216,909522486,-164219338,909522486,13878,0,909573632,909522486,0,-132581376,404232216,909514776,-164219338,909571590,909522486,909522486,
909522486,909522486,13878,-33554432,909571590,909522486,909522486,-33098186,0,909508608,909522486,65078,0,404232216,-132581352,0,
0,0,404289536,404232216,404232216,521672728,0,404226048,404232216,65304,0,0,-16777216,404232216,404232216,404232216,
404234008,404232216,0,-16777216,0,404226048,404232216,404291352,404232216,404232216,521674520,404232216,909514776,909522486,909522742,909522486,
909522486,1060124470,0,0,1056964608,909522736,909522486,909522486,-16713930,0,0,-16777216,909571840,909522486,909522486,925906742,
909522486,13878,-16777216,65280,0,909522486,-150931658,909522486,404239926,-15198184,65280,0,909522486,-13224394,0,0,
-16777216,404291328,404232216,0,-16777216,909522486,909522486,909522486,16182,0,404232216,521674520,0,0,520093696,404234008,
404232216,0,1056964608,909522486,909522486,909522486,909573942,909522486,404232216,-15139048,404232216,404232216,404232216,63512,0,0,
520093696,404232216,-59368,-1,-1,-1,0,-16777216,-1,-252641281,-252645136,-252645136,-252645136,252645135,252645135,252645135,
-61681,-1,255,0,0,-656640512,7789784,0,-964952064,-54081796,4243648,-956432384,-1061109562,12632256,0,1828585472,
1819044972,108,-956432384,806891616,16696928,0,2113929216,-656877352,112,0,1717986918,-1067425668,0,-596246528,404232216,24,
410910720,1717986876,8263740,0,-960074696,1824966398,56,1815609344,1824966342,15625324,0,202911774,1717986878,60,0,-606372352,
126,0,-612497917,1618932699,192,807141376,1618763872,1847392,0,-960070656,-960051514,198,-33554432,16646144,65024,0,
2115508224,6168,255,405798912,403441164,8257584,0,1613764620,792624,126,453902336,404232219,404232216,404232216,404232216,-656926696,
112,402653184,8257560,6168,0,-596246528,14448128,0,1819031552,56,0,0,0,6168,0,0,
402653184,0,251658240,202116108,1013771276,28,1819072512,7105644,0,1879048192,-933220136,248,0,0,2088533116,31868,
0,0,0,0,29,-10083328,9318,570425344,1667457792,34,0,2818048,404226048,404291352,24,11520,
0,255,0,-1023410099,-1008992281,-1010580541,1409286144,-604045312,404232345,3938328,5636096,-1010580736,1724105667,6204,22272,-1010580541,
1728043995,102,-1023410088,406611651,-1010604484,1493172224,-1010630656,406611651,3938328,5898240,-2033975552,1630541836,65475,27904,-436207616,-606348289,
219,118,-1010630656,406611651,1996488704,0,-607927552,6750171,9502720,1845493760,-662824133,30684,402692864,-1060930024,410960832,24,
-1023410019,-15188890,404291352,-1644167168,1718025216,1868980860,15951462,15794176,404232192,404232447,65280,62976,6168,402653439,24,0,
0,0,0,2113929216,-2122209919,-2122212931,126,2113929216,-9217,-6205,126,0,-16880640,947715838,16,0,
2084048896,272137470,0,0,-415482856,404285415,60,0,-8504296,404258559,60,0,402653184,1588284,0,-256,
-402653185,-1588285,-1,255,1715208192,1013334594,0,-256,-1715208193,-1013334595,-1,503316735,2016549390,-858993460,120,1006632960,
1717986918,410916924,24,1056964608,808468275,-261083088,224,2130706432,1667465059,-412654749,49382,0,1020991512,417021159,24,-1065353216,
-17239840,-1059000072,128,100794368,-29483506,101588542,2,402653184,404258364,406617624,0,1711276032,1717986918,1711302246,102,2130706432,
2078006235,454761243,27,-964952064,-965986208,205024454,31942,0,0,-16843264,254,402653184,404258364,406617624,126,402653184,
404258364,404232216,24,402653184,404232216,1014896664,24,0,202899456,1576190,0,0,1613758464,3170558,0,0,
-1073741824,16695488,0,0,1814560768,2649342,0,0,943198208,-16876420,0,0,2097085952,272119932,0,0,
0,0,0,402653184,406600764,402659352,24,1717960704,9318,0,0,0,1828613228,1828613228,108,2081953792,
2093007558,-964295162,1579132,0,214352384,-966774760,134,939524096,1983409260,-858993444,118,808452096,24624,0,0,201326592,
808464408,405811248,12,805306368,202116120,403442700,48,0,1013317632,6700287,0,0,404226048,1579134,0,0,
0,404226048,12312,0,0,254,0,0,0,402653184,24,0,201720320,-1067438056,128,939524096,
-691616148,1824966358,56,402653184,404256824,404232216,126,2080374784,403441350,-960470992,254,2080374784,1007027910,-972683770,124,201326592,
-865321956,202116350,30,-33554432,-54476608,-972683770,124,939524096,-54476704,-960051514,124,-33554432,201721542,808464408,48,2080374784,
2093401798,-960051514,124,2080374784,2126956230,201721350,120,0,1579008,404226048,0,0,1579008,404226048,48,0,
806882310,202911840,6,0,8257536,32256,0,0,202911840,806882310,96,2080374784,403490502,402659352,24,0,
-557398404,-1059266850,124,268435456,-960074696,-960051458,198,-67108864,2087085670,1717986918,252,1006632960,-1061109146,1724039360,60,-134217728,
1717986924,1818650214,248,-33554432,2020106854,1717723240,254,-33554432,2020106854,1616928872,240,1006632960,-1061109146,1724303070,58,-973078528,
-20527418,-960051514,198,1006632960,404232216,404232216,60,503316480,202116108,-858993652,120,-436207616,2020370022,1717988472,230,-268435456,
1616928864,1717723232,254,-973078528,-687931666,-960051514,198,-973078528,-553715994,-960051506,198,2080374784,-960051514,-960051514,124,-67108864,
2087085670,1616928864,240,2080374784,-960051514,-556349754,920700,-67108864,2087085670,1717986924,230,2080374784,945866438,-960100852,124,2113929216,
404249214,404232216,60,-973078528,-960051514,-960051514,124,-973078528,-960051514,946652870,16,-973078528,-691616058,-285288746,108,-973078528,
947678406,-965968840,198,1711276032,1013343846,404232216,60,-33554432,403474118,-960339920,254,1006632960,808464432,808464432,60,0,
1893777536,101588024,2,1006632960,202116108,202116108,60,1815613440,198,0,0,0,0,0,16711680,405811200,
0,0,0,0,209190912,-858993540,118,-536870912,1819828320,1717986918,124,0,-964952064,-960446272,124,469762048,
1815874572,-858993460,118,0,-964952064,-960446210,124,939524096,-262118292,1616928864,240,0,-864681984,-858993460,2026638460,-536870912,
1986814048,1717986918,230,402653184,406323224,404232216,60,100663296,101580806,101058054,1013343750,-536870912,1818648672,1718384760,230,939524096,
404232216,404232216,60,0,-18087936,-690563370,198,0,1725693952,1717986918,102,0,-964952064,-960051514,124,0,
1725693952,1717986918,-262119300,0,-864681984,-858993460,504106108,0,1994129408,1616928870,240,0,-964952064,-972277664,124,268435456,
821833776,909127728,28,0,-859045888,-858993460,118,0,1717960704,1013343846,24,0,-960102400,-19474730,108,0,
1824915456,1815623736,198,0,-960102400,-960051514,-133429634,0,-855769088,-966774760,254,234881024,1880627224,404232216,14,402653184,
1579032,404232216,24,1879048192,236460056,404232216,112,1979711488,220,0,0,0,1815613440,-20527418,0,1006632960,
-1061109146,1013367488,8128012,-872415232,-859045888,-858993460,118,403439616,-964952016,-960446210,124,940572672,209191020,-858993540,118,-872415232,
209190912,-858993540,118,811597824,209190936,-858993540,118,1815609344,209190968,-858993540,118,0,1617312768,205284960,15366,940572672,
-964951956,-960446210,124,-973078528,-964952064,-960446210,124,811597824,-964952040,-960446210,124,1711276032,406323200,404232216,60,1008205824,
406323302,404232216,60,811597824,406323224,404232216,60,12976128,-965986288,-960037178,198,946616320,-965986304,-960037178,198,1613764608,
1617362432,1717592188,254,0,1993080832,-656900554,110,1040187392,-20132756,-858993460,206,940572672,-964951956,-960051514,124,-973078528,
-964952064,-960051514,124,811597824,-964952040,-960051514,124,2016411648,-859045684,-858993460,118,811597824,-859045864,-858993460,118,-973078528,
-960102400,-960051514,2014054014,12976128,-960051588,-960051514,124,12976128,-960051514,-960051514,124,404226048,1616930364,406611552,24,1815609344,
1626366052,-429891488,252,1711276032,2115517542,404258328,24,-856162304,-859506484,-858993442,198,453902336,2115508248,404232216,7395352,806879232,
209191008,-858993540,118,403439616,406323248,404232216,60,806879232,-964951968,-960051514,124,806879232,-859045792,-858993460,118,1979711488,
1725694172,1717986918,102,14448128,-17373498,-960049442,198,1815871488,2113945196,0,0,1815609344,2080389228,0,0,805306368,
808452144,-960053152,124,0,-33554432,-1061109568,0,0,-33554432,101058054,0,-1061158912,416073410,-2032377808,4069388,-1061158912,
416073410,-1630640592,394814,402653184,404226072,1010580504,24,0,1815478272,3566808,0,0,1826095104,14183478,0,289673472,
289673540,289673540,289673540,1437226308,1437226410,1437226410,1437226410,-579347030,-579347081,-579347081,-579347081,404232311,404232216,404232216,404232216,404232216,
404232216,404232440,404232216,404232216,418912280,404232440,404232216,909522456,909522486,909522678,909522486,54,0,909522686,909522486,54,
418906112,404232440,404232216,909522456,116799030,909522678,909522486,909522486,909522486,909522486,909522486,54,117309440,909522678,909522486,909522486,
116799030,254,0,909522432,909522486,254,0,404232192,418912280,248,0,0,0,404232440,404232216,404232216,
404232216,31,0,404232192,404232216,255,0,0,0,404232447,404232216,404232216,404232216,404232223,404232216,24,
0,255,0,404232192,404232216,404232447,404232216,404232216,404690968,404232223,404232216,909522456,909522486,909522487,909522486,909522486,
808924726,63,0,0,809435136,909522487,909522486,909522486,16201270,255,0,0,16711680,909522679,909522486,909522486,
808924726,909522487,909522486,54,16711680,255,0,909522432,16201270,909522679,909522486,404232246,16717848,255,0,909522432,
909522486,255,0,0,16711680,404232447,404232216,24,0,909522687,909522486,909522486,909522486,63,0,404232192,
404690968,31,0,0,404684800,404232223,404232216,24,0,909522495,909522486,909522486,909522486,909522687,909522486,404232246,
419371032,404232447,404232216,404232216,404232216,248,0,0,0,404232223,404232216,-232,-1,-1,-1,255,
0,-1,-1,-252645121,-252645136,-252645136,-252645136,252645360,252645135,252645135,252645135,-241,-1,0,0,0,
-596246528,-589768488,118,2013265920,-657666868,-960051508,204,-33554432,-1061108026,-1061109568,192,0,1819082240,1819044972,108,0,
811648766,-966774760,254,0,-662831104,-656877352,112,0,1717986816,1618765414,49248,0,417101312,404232216,24,0,
1715214462,406611558,126,0,-960074696,1824966398,56,939524096,-960051604,1819044972,238,503316480,1040980016,1717986918,60,0,
-612499456,8313819,0,0,-612497917,1618932699,192,469762048,2086690864,811622496,28,0,-960051588,-960051514,198,0,
65024,-33554178,0,0,2115508224,6168,255,0,101455920,3151884,126,0,1613764620,792624,126,234881024,
404232987,404232216,404232216,404232216,404232216,-656877544,112,0,1579008,404226174,0,0,-596246528,14448128,0,1815609344,
14444,0,0,0,0,6168,0,0,0,6144,0,202309632,202116108,1013738732,28,1826095104,
1819044972,0,0,-663748608,-121085904,0,0,0,2088532992,2088533116,0,0,0,0,0,7424,
603979776,610729830,0,3145728,-1016710144,-1009001533,3958467,1291845632,-406650880,-1008992257,-1010580541,0,-16777132,404265435,404232216,60,
22016,-1010580541,1724105667,6204,5701632,-1010580736,-606354493,6711039,1476395008,-1010630656,404241510,-1010604484,0,-1023410087,1013367747,404232216,
60,23040,210158591,-1050660840,65475,7143424,0,-606339098,14408667,1979711488,0,-1010580736,406611651,0,119,-1010630656,
-2368573,102,30720,-1023410176,1008221286,50022,9502720,0,2115713902,7855320,-1694498816,2115508224,-1061109565,404258499,0,-1023410019,
-15188890,404291352,24,-67068416,1652319846,1717989222,62310,11206656,-960315200,1613764812,201759694,-1409286113,-1027555328,806931654,1050070630,1542,
0,0,0,0,73602699,-2147040640,669540594,1626505427,-388816407,-1061486614,-13450493,595167782,-1962938136,-754390845,65652618,-744691501,
117435880,79385431,15984640,-1961659301,1021588163,1007055376,-33065711,653788104,123682184,-4462397,-739762000,-392041518,-1157967016,-1014365248,-70067480,-437520246,
1946198760,-1178586346,12222464,1225193120,108394500,-1179123526,-389857280,548929634,-1158580985,-269766656,75958006,-2093386368,281662,-941084044,-1906899201,367546562,
852527617,-771073802,1380977524,-427161168,1523760616,872173912,1504441343,-32455040,-387481654,123720379,195,0,76031626,-2146442112,57936380,-1023148928,
-1174124128,121373620,188488308,255596148,1397756532,1912637160,2139303429,1482358792,-726531468,71934147,309656744,242485052,1760056144,772108800,67323894,-993830821,
637839422,-1014220348,1405345547,-402648901,1968963565,-1009044498,75958006,1343124744,63879762,-320336720,1514186961,-617364648,1468448342,1946171950,947924491,-2096794369,
-253033789,411708995,1593834368,246436035,-661920778,1469760385,1235272536,1913928708,-907502584,-1709825,777044893,33769462,196086388,-154054168,410288324,1206390704,
-2134575407,-164753803,1948255047,-2134575611,17564395,-397163688,11599808,-1976690318,-461372569,-1341099005,33325060,145754484,1946352768,168865794,868441024,-14292746,
104601972,205263990,322702710,-397407628,1968766916,1174596355,-783923642,1364247526,-27465646,1499120270,-397163688,-1605316273,-1336933303,-791615477,1346306085,-402650696,
196661582,-783751040,-2147459144,50612542,1891107700,-1206858496,-1064394752,443942,163075328,-785848256,443942,163097088,-786634752,4096038,91531776,-343929925,
1074510595,-389870760,-1897344762,-466462512,-396881715,-1017392974,0,0,-154064920,100960518,-2031615116,-1157981184,-1947728952,-1966492976,-796596028,2145961866,
-389838128,-1013067654,-86966296,-402405446,-911028114,-1966051864,-798431008,1676212362,-69694768,-1961434173,650546163,642196874,642203018,-397992566,-498663511,350471148,
-1946973188,-3938106,-1968520054,-1014322489,-270383446,-1462619453,-1308462079,1946331178,365068291,-397193021,1482424185,-544808058,1354958852,-997567663,-1174388955,-487119258,
-628373365,-997568424,-1174388955,-487109755,-636237821,4138328,-150072134,331875298,-773729830,-2134540077,1493226371,-1964799400,-1406221317,-1406214006,-1406207862,784586890,
-58055542,-980755318,1191125736,-906050050,851701109,76164845,-1962968344,-790048542,-9312024,-388957558,1760094416,-1965389057,-17176379,-20578746,-1009093175,-13444302,
595167782,-17008152,284917955,-1977159556,296957053,-1157862936,-5241914,-389062168,427163124,71908992,-396527853,-75444158,-1101695744,1048606340,1964180553,2000993883,
116789425,1946551433,65876489,-9443087,2129134571,2003091199,-401600327,-1101529247,549418868,162921472,1172834481,197145343,-17700665,-385945880,-28836247,-2081720887,
-838987577,-1017126283,1979495912,1996799496,1055473841,1980022527,76089078,-2081328122,1085882566,-15210240,0,0,-1207712582,-806878206,117749966,-1295070744,
374990,-1194409496,-1142422522,33863886,-389106200,-1070400627,1355720169,-1207712582,-1545075966,50641102,-1278304792,-61806578,179503733,95997618,-829626352,112255882,
-1194424856,2145910788,-469083954,-1796734092,-1977170949,-12827903,104466036,-227212215,-2000421068,-33258178,-65738545,-410384523,1407718576,-1327451186,-823007223,2081292160,
-1966080510,-401887001,646499902,-855767968,870893822,1629915342,-820713468,-1715369134,75839223,-2069706498,-138347004,1510245670,1962998656,1222693122,313581706,-1597109784,
-1057094524,71968502,-989929263,-1023128413,-1123548998,1105725456,773485308,-1979627638,-2139151152,37519586,246820468,1007685821,1965388801,-826742757,1946221440,-1123109349,
-75493360,-2146863871,117721406,91490933,1035800758,-2134212577,118413963,855703737,1360970706,-444535926,-152711165,41157827,-184367618,-489486927,106560139,-1610565089,
-175390066,-402398212,-1007288220,-1407748992,309641226,-1310444969,65065733,852462328,1604645869,102689259,-768388265,146528910,-78911488,1946640219,820715267,520374688,
108287036,41178684,12133099,573185,520487088,533169066,817494754,369606144,-1542059841,-2095069565,-136175673,1364706079,852462167,1604645869,1495320451,-1017122334,
1381455110,-1974447279,-2139150880,58135356,1006683881,-385649537,-8388443,1476949535,1509896795,-2147439127,376576511,-282802294,-402403654,1599851743,1532515152,-380010569,
-8388462,-2133298417,158468607,-997801077,-351927064,67076325,-521655947,63748812,-1462984216,1963176961,1342616578,1474825392,1086650060,-33393320,-1173376828,-2014837810,
-2135430196,175440639,1476727016,2142723935,-8371477,-401312511,-1636435330,71894774,-385649416,1944649593,177203972,-385649409,1793654637,-352160262,71428225,-385909783,
1499070998,2130346140,-276168075,1968329117,1499158536,123559770,1048653507,1414101136,1380977268,-1337530182,1482354190,17565383,244058128,645923086,142541959,-167475418,
17074438,2145977205,212881408,-154420760,1968718020,263213171,-154423832,1951940804,-100931481,233310324,53798917,104506347,1081345097,68167296,-108533553,372971125,
125109347,68161152,-399906000,611648648,350947763,73602619,243271541,-350223344,74639379,196284021,76031616,-2011297552,73590788,73598663,512361428,-478149616,
821788720,954939509,68167306,-164567936,17074438,719858804,1662401529,-2145422332,158708986,1949367424,-339725811,821854326,128975989,1726508523,-402426375,1676346392,
113725419,135266572,17698444,75966080,821854451,116790389,1963066503,-402149324,243270270,-385350521,113704679,-167246715,33851142,243271028,-167508857,33851142,
113761653,64226403,1979234536,-339725802,1661388557,-402410492,125106345,645924784,-394328953,192215289,-402372190,803734536,-1565201662,-35126199,30337227,-1211262744,
28960800,-132061101,76089078,-402426616,-1973880022,27650296,-1157581080,-1427636214,-1150323464,703070228,-160992004,134514950,-1960425867,736298061,106793766,-1004120314,
-1977218947,-887822275,-386439704,-1006700649,653255239,296959370,-389348888,-2065107118,638017527,-485732981,643237391,638475659,-401572412,123730415,-1977213004,1958742533,
-1979286511,-33258202,-1961578292,-402365674,1357433398,-33953289,225738300,1962430440,-127277049,207093550,1468841667,772720259,-1073085302,992875124,-260766628,105659182,
992930421,-462092204,-1073054025,-125173131,-137238333,-1779891340,-82515968,-386141720,146537536,-136845312,196818036,-77404160,-1977209740,1569334845,1300964865,1435182594,
1392924420,107856934,1543247848,133911784,1166681695,1962884106,-1563886075,112919684,-139991040,129712500,-81336320,-1977206412,-2059519427,640709892,-2147394166,-1185710109,
-768409344,57525286,1543231464,-405734518,-940120112,-2147257328,-411033393,-1173114068,61866948,852100840,-89134876,113725163,1120,-2146430792,235177278,280496244,
-1207731192,-1543889091,244056332,-1141178098,719847436,-1155173129,-1243086841,639464698,-922876534,637830306,-1576974966,-1004141435,-1980103827,-1946088402,-83816954,552042691,
-994385997,-385765373,-1070347869,-1576776029,263914594,1351059456,-109229308,-1576695258,-1960442806,1285751621,1166681604,75801089,38111782,637830562,-2045491829,73442244,
71900810,1997011840,788476438,1970833290,-1341889118,117145648,1068499573,-1023121758,-956020318,-737910010,853051907,133923071,-74773388,-553393199,1754383233,113641707,
-1145830301,-1959892793,-402190785,378273660,-1070463901,1974794880,-2134835710,1609041090,82477256,7618244,71900810,2114059136,281510675,2114190208,281510667,2080897920,
281510659,-1977171918,-935532507,-1463747001,-2081197040,281662,-397276044,-1030818462,-50384038,-1031754765,73768964,-2134371864,141867258,1721811710,-939202556,112244931,
-2147371869,-150698202,-402649928,230162761,21227520,-1274787424,-1022309120,71908992,-1207143161,129175825,1623134413,-1207047334,129175826,-35122995,1520484096,-1207947800,
317210892,135182337,-1207890712,115876621,1946601217,-1946123008,-1207929330,-1264384328,-2029092863,1235224580,-17503996,1726482190,853226186,2039097087,-193664989,-75447298,
653292816,-1288405622,-194713583,-1946904856,-2147196138,-1070463294,851928553,-176166693,-1006763404,535301040,-1058766649,-321780559,-504828790,1976077045,-402542308,359986471,
1006913952,-32605169,2114993345,1019346440,-33391086,512410561,1049232520,-478149495,100368399,-75496066,839089164,645972955,-2133916656,2131003686,1997142912,-2147126251,
-2147186418,68161152,-2029092816,196280836,145953771,1971374070,-2146847998,537137166,75966080,-2010742531,503902212,378078344,-880802717,-1102003201,1085896324,1946631168,
-149952492,76089078,-1207274492,-617410533,-855621447,1405310992,-1142912432,-684828815,2008794246,-1948832169,-397387560,-417151398,173595658,-672572445,198,0,
243880529,-2019556256,1963501572,1086715424,-973730955,-1257868256,-339135970,-388986352,158725187,19186314,367526773,-1327134208,-908007414,-1057038202,-672603766,1524664009,
-2053061799,1963473924,217678093,-2130283509,1963724281,272417561,-108983691,74778375,-1022488903,108334652,51181953,-527797900,-511644464,535134239,1668598026,92137786,
2114189696,1978219098,2129410572,-20411822,-337016119,50167882,-851835778,-41939587,-1979548158,-20411671,-1976243255,46563573,343732538,-402462422,-930427394,238864894,
-906093186,401329662,2114125184,-1964209656,-339083576,48835082,-1966211352,-1010172216,-1974447278,839365057,-1964256293,1352108488,988532996,1963221534,-1965389020,-136039737,
839141926,-774372353,1310589923,-1964257020,-401690393,-477443842,-135786576,1515935944,195,0,0,0,145879947,-422449453,72402561,243995787,
12780640,0,0,0,116834355,1946682503,-855329788,49986,-1571794094,-125172638,1277622168,72262404,71894774,-788367880,-1327985944,-929765364,
229696394,1590201832,-1670826,-1948349696,-385593200,65379,0,0,1364546384,-1962518702,787252204,-544810190,-1963303287,-1981533476,1586101318,-1967115266,
-129594938,1183433354,-1983542538,-1047858106,-1947056503,1177286726,1177239796,855995900,-60913189,737691275,-1992231866,1183575622,-230282250,-263812800,117341827,1183516020,
-1962677256,788001862,1183384650,-230257700,-388479351,712307279,738478496,740390912,741178886,742817282,745766404,742292998,743407105,-29985723,-399346488,1366684376,
62552043,112896,-1593834821,1324024910,-1191181638,1048576004,1946551369,178949,29033451,-530675456,-352321352,-2062644431,113412,1654702131,1278146308,47620,
28974315,-2062644480,572164,-352321352,309773,75828875,-1207957317,1183383552,-698447404,-1982181751,401137238,5826560,-402617368,-1477967777,784630528,1499094791,
-1017619619,-2096870751,1963187838,178951,636218359,48135811,1861683829,310240,367782903,75837175,31358595,2122516084,91555038,-150992709,-330921493,117341827,
-654900620,-1007925623,-135510389,1183448174,-396981782,-1610565437,31358595,2122520958,326370526,621023393,809304112,-1207602176,65779712,-1984954184,1183437894,1183564754,
-630261796,-136821245,1174656622,-666465836,64378505,1444145734,-599356952,-1009101175,737035915,1183448134,-62485532,-2082322807,1962998910,-297366778,-1948105079,-422453642,
-946536658,2114644800,-247383230,994103873,-400637119,376817255,75958006,-1173392380,619447258,-84184056,-659413584,2122578926,510918908,-772780405,-732000543,-1949153650,
1988876414,-391842852,1325335063,-387612700,1317732866,-662795280,-1949153650,548731462,-1410080634,-16647448,-427826610,-972167137,1704986485,64535044,-1195115538,1861681160,
-431584784,16547459,-617400204,-150992712,-150713810,-1947169813,1183719160,-732000558,64519683,1317788790,530904038,75866435,-662715589,-402543896,1325334593,-389316636,
-617414254,-150992712,-150713810,519605227,-1898414589,1317786182,-96039962,1126148851,75832891,2028527228,1042433,2145537791,-1035343663,-402650696,-2084322730,1963253374,
-431584465,117341827,1183516021,-1962677288,2481222,-599381520,-1177008599,-1059913724,31081985,1183569478,-1327462694,-1038030839,1183522499,-529598480,-2082060663,1946221694,
-1193594045,-336134064,-125046645,64779779,1183766654,-732000558,-1947840885,-203977786,-1947169884,-431059974,52428984,-201849872,79184804,2094545664,15067338,2145668863,
13691072,1354292019,65795840,-125051834,-1949153650,1317796422,-203977754,-1946514518,12117582,-1946680544,-1426851258,309315,-763378885,-16733464,-931143090,2122564383,
1131675900,-402586184,45663587,-983177201,1317788467,71999984,-259265545,2114189451,-596245544,517097102,-204185970,-1591786588,-1019542395,1760091263,-464584960,95998591,
-987109376,-1207939608,686296834,47301,-1962926104,-527762874,417858224,-18235,-1207955480,216534786,3532997,2145537791,-796146730,1252121395,-336113148,-599391398,
1183774859,-263287854,-1426865525,-2061616317,-1008501756,-1947705717,1177152070,-631367204,1096643,32261771,57924678,-1948623359,1174531142,17003480,12834398,0,
1431458131,854066775,-1008408337,-1950079000,4439774,-1950047000,-1744883990,-661961871,1975773160,-1061558269,1594344331,1532582493,994319555,2000970308,1363374148,-1979430496,
2114338000,1242991374,2115124228,-773664506,-1578970654,-577895291,1465274704,-930353869,-1744884143,978928582,1174762756,-921963806,1482251871,-268237708,-1070342430,727242894,
199504577,1137034185,1140605904,1137001476,1963391616,59385349,12065003,193668616,-523179642,-1073692287,-506396652,-855711279,-176033675,58007552,-1018116221,-167409114,
-1007025200,-804781896,227157728,352305536,-855750912,-276565643,-1007025400,75958006,-401312764,259375895,-335291718,-76217944,27847930,654048116,-3996277,-1190886090,
113705088,525445,1979658472,2080272,-1950111512,8436202,83828968,-2063167616,95994628,-1014634488,-402587463,-1202651379,2028470277,-1178380093,-18284288,254,
24496395,1150009027,1401967851,1963392643,-385928702,-396639590,1364247260,-13704310,-398133612,1482288597,-661917470,1975688168,-1083316221,535544715,1153416848,-393207573,
-1974418764,-1795215645,-1957149450,-1032132392,1290273653,130255807,1499094367,1364443995,106386770,-1830268842,152124909,-478149003,1070301312,1161216856,1169442135,1156924930,
-402635842,844284661,-2061043740,1525678852,-788220477,-16985912,-1007127091,-923476,-320275318,600279807,182486722,637762011,-1993997517,116835075,1946420359,-1040324584,
-625339531,-322401533,-76217944,27847930,-1047790732,1405332475,1136574474,-1107068672,-1763180513,8332738,-523116335,-268181295,-1912321632,309722,376702524,868344296,
-6756115,-400555843,-947650670,1206968912,12392939,-620057312,841352825,590489093,637896742,-947707000,-1897209264,1089438169,-1017428223,-1946203672,2044398314,-401034233,
367772201,-1962920216,-1962638066,1459898902,378406,-119342589,-387741089,244040213,378209413,-577895350,92939863,92808876,-169674237,-644987041,-286727118,-384846655,
-68632079,1244564478,-773467900,-1947872795,-1912306418,-1263773734,1960871040,495461893,-2010774549,-321894595,-276566155,-486735096,-947691547,-1009152504,0,0,
1031063819,-346167216,-385649576,1381105202,-164428201,-390014488,116834588,1946420359,-1059461096,-625339531,-320828925,-76217944,27847930,-1963197580,-498619708,1516177373,
50009,0,0,0,212882000,-155389464,1482309828,116787061,1946682503,-1019032317,-2142088368,-1274780610,1721789044,184256004,607286747,535265504,
1721943818,-2132833788,-411039773,182964232,1225193211,91552772,1139333938,-401493248,1721761854,-1459670524,-33393632,1225193159,628423684,-410984668,201487361,73835040,
34344996,28571658,-2130700824,-402521661,-1014956018,132645377,-372643840,-1017619622,-88262168,-1964409624,-947196221,-299847442,-376444421,0,0,0,
1397905233,-326414251,71900810,2132016000,-2114745547,-788463642,-1526780186,1210337118,1210337316,1216235556,1216235646,1210337316,1210337316,1210337316,1201031062,1201031062,
1201031062,-75478950,-2147126178,58023931,-385824791,1252065422,-1948059900,1962871544,-1731753463,72099575,-779356157,-355341615,-100406575,-511585802,12058631,-86471008,
-805282165,1929087727,17348707,-826612526,-2042434045,-16060704,62393209,1122912792,-336666490,-16599025,1122944178,-1964056442,378397,-461314166,-1308446705,-2042433852,
495644384,-1191246394,-297074942,-287275454,-1174404168,1122894798,-1192304506,-297074936,-287275454,1532844283,-1017553062,-439221835,78764850,78906544,-826613462,-2042434045,
92991200,57984290,-804205696,1976172267,6195427,67192518,-661992725,-1207917336,-661741568,218201728,495454068,-340020504,-2012902733,1720188998,-1146755071,-1974294805,
-355381024,-150912840,1492683746,1048629643,1946551369,-167566312,65110481,-1090911488,-251431456,-802387410,-337587487,619172124,-2116946431,50333665,1977138938,-523046653,
-1976637046,-773224948,-772812305,-1023976721,74711041,536921985,-1900543813,25067739,-1978829811,-2134575587,-1020128908,-1930754680,-987626102,1183377618,-159257856,182264533,
-1578505277,-523172790,-523116335,-1056709897,-1962880381,197299192,-1324780352,-1329016060,-1158879223,195,0,0,106058067,73547402,-390203928,-538443768,
1499072500,222085979,242505855,225708604,1148454972,1198786364,-768456469,-326412861,1722103,1344566720,1178192012,-165972966,537168134,1397888116,106387025,117508072,
1532583519,-1993965478,1566105348,75773498,-1226243211,-1010369024,41210378,-339490050,-397373315,1968760831,1088967211,-2029586944,393479172,1975355112,64666130,-319102838,
-76217944,1946265836,650414843,-77986680,65736372,-17112344,1242970818,839742724,-2076820782,-352094972,-956395422,-964013885,-164436942,653783691,-268237750,-947198255,
1277622168,1408238340,-1581776709,807732240,3161344,12256117,1539542704,-95370408,1139193520,-290455317,15418086,1122370480,1642332395,-527826709,1642464012,-18691789,
-18691789,1642513546,1354979579,512381523,-2007825310,-402365890,74770251,216792882,-164428201,649924584,1594301835,856031672,-2076800311,1242991108,-842334716,512252688,
1532626018,116835160,1946223753,-1191778231,1947256054,-303555008,263737528,63879685,-1195825688,1048623104,1960051811,-1342130173,-356638962,-1077899702,1505304576,-1527607296,
239783352,12060240,13258784,-826648576,-1191909373,-1377254625,281343672,196147060,-2135382552,669516492,-826620999,-301223933,-331218709,-115080981,-1158807028,263210728,
-1174344722,-1192331544,-661733376,780858931,-919470078,-164372015,344703026,-498679294,-826650375,-301223933,-1220411157,-1073063930,79102580,604040172,-288945415,-1337530182,
13364750,0,0,0,71968394,604276640,1225132672,1648265732,49924,0,0,0,106256208,173232466,-2146077248,319047998,
954730100,-446830363,123361627,-1017618595,74776892,-353693261,41157180,1048607979,1947403337,855280611,-1977198629,-451680195,-2134639033,-226750213,-1977216589,-452728771,
-1948568993,-2147196138,871106242,-334841911,108333224,-805373470,-896797323,-1979465542,15462083,-301626842,548405483,1204915182,-75447298,869563408,-334841911,108333224,
-805373470,-1061489291,-300830717,-1977220885,15461893,-370270032,54329198,-477486731,-890761037,147816676,73731712,1977879072,-135823352,73737856,-462100257,1023362793,
1527215367,-370890520,138215231,296946549,1491377384,820631690,1963539711,855280407,-460592933,-22362230,284917955,745927548,-303361613,192221244,-427113590,-1612129909,
1008331750,-1961331438,548885498,-1947324696,-790078485,-1965192218,-299767557,1023338985,976516371,1946437894,-1278506166,-465573872,225822986,176213888,-2147256851,2028568551,
266699007,1971374070,65372167,-439294512,347340170,1023369961,-1978698475,-429332285,1515965323,-369849766,389873313,-91551627,-370766872,406650514,-1014363531,-402405702,
-269764930,209000764,-402405702,-1973700938,-25826856,561322556,-756542285,251705827,280227618,-790378264,181522663,-805014071,-1947348755,1357470169,1964719358,-1946209610,
-400508933,-343151241,-18298997,-429659931,-955531214,1206245096,954855138,255,762654780,75828875,75765386,134185043,-805433737,2092633215,-1157401344,801374476,
-544554149,-472776910,-223376594,-351859083,1364414703,106256210,309658428,61924234,-402406214,1560786466,1532582495,540853080,175587698,8138377,8259212,624748779,
-620043149,733090420,1946418048,1998172683,50036743,246547060,57942316,-1996470040,-33258226,-2078897974,204376324,235310081,-1967920383,1946625248,1946369042,1996766377,
2353317,12188042,1355952897,-421468078,2145615962,1491602408,1947256054,-414980093,-152567372,-1177883674,280821774,2080521232,-1123503860,91490320,1035800753,-1022947809,
1964047232,-2028041693,-2114221564,-805150493,-771378705,-2010215701,-771444476,-2012312851,266436612,-1022225736,1965095808,335988491,-1939326720,-1023404530,1966144384,-2029586840,
57935876,-154943438,17074438,37501556,645984887,-1267792759,-2029586935,41157124,-1073083468,243275637,-2139093879,41224700,645925044,149947528,-352024538,1946238119,
-1995538191,-353693692,242597898,75958006,-2135853822,-284915418,37541611,645965431,-336657271,905674930,-1073066891,116789877,1967129737,-1202583921,1120735872,45090650,
76089078,1010005056,1009742849,101545218,-91532713,1510002152,887818079,443876156,-1940760826,1391627200,-402652742,-1336277049,-1263867890,-22486549,1206453108,838566143,
645927285,183960713,-2147126080,134514958,-2130767383,309670651,125157386,2112360112,854453172,-1267275584,-75438357,-2146405069,-50034394,-663371766,76091008,-2133726462,
276116731,75966080,1958742782,-2029092669,-1125449468,1966537600,-1219341407,-1964509664,-350623496,-1460970662,1353461329,-88822296,853819368,-478811968,-1946157383,-2147196138,
-336853310,-536762368,63093497,1494230252,-1070339958,1424546611,-382010397,-503155623,-1010234425,12210768,118089728,1053096538,1049166088,109838772,113705398,112197896,
17436300,-706214224,-1017578573,68167296,151238863,-725999433,-1996032509,158662916,75958006,1965192194,-2027519981,116849924,1963459719,-1996032492,225707012,75959936,
185055234,-1262866249,272500739,1662421252,-2010742780,638119940,1049232520,512361609,645923975,-2131295097,-33257178,281870516,1963050998,147060268,129510516,269385731,
-1007276028,-1207405566,914359555,-2146434032,-268138458,76031496,75959936,-855591928,-2027519984,1049164548,113443977,572247,75958006,-1290505214,-1996032505,343212292,
417858231,-1223854848,-167122170,17074438,28770933,-400948808,123666582,1381191875,-973031394,-725886834,-1261204733,-400062936,663270098,1511991356,12802139,0,
1635122344,1567934731,1381061456,652249685,1157645962,679415100,171709300,138154868,121378420,-397337995,-346425100,-338546135,686313765,518740472,443863562,384551678,
1946338550,1586112005,-1269807872,-211163127,-2098704040,-1209902600,1946273014,-322902013,1532582493,50008,0,0,-1475979439,1394898190,-402648901,-1004085183,
-1977220491,-1964166644,-772240411,-13739033,-1336830059,-1559827686,-1336812975,119190528,-1597810337,-1053162358,-466480771,-268181295,73173798,1962998656,-1289950456,-335562753,
68198424,809250852,-1007286155,-351767551,-1007251448,-2046659583,861127675,1547380416,-2045545468,1547380475,-2046069756,46564347,-1192566208,-1969094401,12802820,0,
74767115,-1023409992,1448563283,1756953681,92874357,38636582,-1190869117,-1070399428,-276583693,2013500,-217822786,75808420,-218102855,1174283940,436254973,654258664,
-947708535,-1965346046,-788248290,-1799126557,126561909,-2096789210,-2135227705,1226703477,126496260,1191544870,649217512,-1337516664,63224323,-1968087320,-790048544,184060648,
638002372,-1975057016,183292135,640427207,-1975057016,-2147186402,1049235427,-411040633,32997377,-405666639,-1645675766,62962353,552079536,-804772687,182505696,92808903,
-568203193,-1325152381,576761861,-771455226,92808936,114438983,1393147479,771753657,839015562,352268031,170787956,-964492460,-1930632700,1002671304,-2147257149,123674826,
-1340766170,-337606117,103926552,70369025,137477890,204586756,171035400,36817680,1600018688,12802906,0,0,1448563206,-2081649835,1317604076,-62485250,
-50700663,142345020,1400908011,1414484904,516481,410306827,-661920718,1254024145,-13741229,-1072998384,2028471924,-94467107,481565872,-2080485749,1583155908,-1022928289,
1325299339,-964565295,-1959898214,-773795580,1958742752,-1966801406,5948380,10485862,57213731,61014877,-1957433922,-472777122,451457,-2127495378,771752675,-13750017,
-27882700,-1185683522,-1956708349,-83625378,115447,1381370228,352267857,-782345639,46564330,-171711262,341051219,1711284308,-1610589696,1065952768,47445,-402584344,
132645204,1388535042,41912614,-402652998,-1017511197,2139694677,-1339103228,-1341931334,-331157996,797280294,63420929,-1442765588,-927276918,-469046269,-922877324,63355562,
-617370900,-402587463,-1729568972,1438866908,1732741670,-391077912,-1956780681,2092891734,244052,115447,1381370228,352267857,-782345639,46564330,116124386,1418744963,
-389851993,887620131,112897,-1023378200,1586188886,-62484742,41388838,29016204,38922240,1438867034,-1896194421,-1960379322,-1960442753,-960888251,-617353725,1459683513,
-402405501,-1956651361,-1392221386,-1962932731,-321877032,-335298374,-1977163638,-386888955,-1157976216,347079616,-288977938,181308411,-1174047543,65733575,637782202,-301906549,
-1964190837,62962373,516120046,-108833193,-1961987072,-661717946,-1946519925,-341032868,1662946056,1569269252,63224384,-1962927128,1501395,-402403654,-745865200,-335101309,
-402407238,1599995908,-108805345,-335252479,-1409094742,1364444142,-2082501801,-994441785,-1258180349,-1361778684,-335295302,155682854,-335295814,71796774,73602699,-947651701,
-1258245878,-1363875816,-1962688326,600278011,330629297,-1364006831,-1061488039,-289306109,-1426330558,-851787266,-826611082,-2080666877,11614151,-2081945419,1532583854,1464947651,
-1896194421,-1960379322,1972053567,-1351489472,637782714,-301709942,-1323055229,-1961642752,-1368987431,-1157969013,-1047919680,92940014,-17043897,1993161409,1532583910,-1202315581,
-661741568,-1962934338,-1021354492,-1168682669,45089732,-1968324888,-1274892040,-1381439473,-1326971728,-1327986003,-402148348,-826626662,-402214909,-527782497,112259211,-2014837580,
-402280275,-393564785,28575152,-1330808344,-1383995388,1460062346,-1902116680,-16448,-2096668758,844186311,-1979404051,-1386682139,-1426093336,-41892354,1508800003,-1341930310,
-387741180,45133122,1005119370,63879853,-443939408,-1330826776,-387872252,-963924694,602408624,1532583853,1586372291,-94467076,-994429045,-1274761213,-1391663097,-1341927750,
-402344954,95464706,-68623310,1120306092,63224401,45089205,-337058422,-14817108,-2132422484,-294254339,45096793,-672657484,-16127828,1364414659,508974930,16417542,
-661776524,-1064386509,68206508,-1322939866,584185392,-339473695,68198405,-1146474460,-315467959,1946221187,1066085893,-1959918613,1334455863,-2086341886,-2094136381,-462028993,
1600003847,1482381658,503597507,-1475935100,1311748,67138564,201588860,-64511,284624639,-977220,117440355,379785463,-14,0,0,12583111,
0,5505024,39190869,72876887,106825049,141559647,39124991,8654848,1048619,841635940,268436565,1638532,1477967888,39203370,8654848,43,
841636092,268436567,1638532,1487929344,39334442,52433920,1049176,841636168,335544921,39322400,1502478336,73282090,41948416,16777616,841636308,369099871,
31457920,1511653632,74461738,41948672,480,841636378,1054852,196640,-2086768894,-1635090044,1325408191,3597,-1902379008,-1776336241,16753593,67305985,
939987973,1010514489,205471293,69376,0,-16773616,134217728,0,0,600708,196672,-2086768894,-1635090044,1207967679,2055,-1902379008,
-1994440062,16753593,67305985,939987973,1010514489,205471293,69376,0,-16773616,134217728,0,0,1054852,196640,-2086769150,-1635090044,
1325408191,3597,-1902379008,-1777384817,16753593,134744072,268961800,404232216,236460056,69376,0,-16774640,134217728,0,0,600708,
196672,-2086769150,-1635090044,1207967679,2055,-1902379008,-1996012926,16753593,134744072,268961800,404232216,236460056,69376,0,-16774640,134217728,
0,0,543332,983546,1669066502,308707428,1610674288,0,-2040987648,1493185111,16769897,67305985,939987973,1010514489,20921917,3840,
0,-15792896,0,1248067584,33161224,-301596657,-2140904581,-261090714,24576,0,844596825,-479635200,1061093631,1061109567,1061109567,1061109567,
251658559,0,83886080,65295,0,1054800,983424,1331651342,-2141945264,1073749951,0,-1902379008,-1774169969,16753593,67305985,134678021,
202050057,1091505677,3840,0,-15792832,0,491782400,25165840,-485621745,-2108666017,1040941140,16384,0,1356827882,-486217920,33620223,
100992003,168364039,235736075,251674895,0,88080384,65295,16777216,923728,1057161232,1331668483,-2141945264,1291853759,3083,-1518141440,1661806685,
16753594,150994943,285212671,419430399,251658239,2048,0,-16774640,530512,1057161488,1331651330,-2141945264,-956293185,1798,-1902379008,-1777391473,
16753593,67305985,268895749,336794129,1512981,3840,0,-16773616,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1845493760,
-1902379008,-1774180209,16753593,67305985,134678021,202050057,1091505677,3840,0,-15792832,0,0,80,993536,1331651334,-2125102512,
1073749951,0,-1902379008,-1776342897,16769977,0,0,0,20905984,3840,3840,-15792888,80,993536,1331651334,-2125102512,
1073749951,0,-1902379008,-1776342897,16769977,0,0,0,20905984,3840,3840,-15792888,530472,985376,657285894,-2144628696,
-1073733697,0,-1902379008,-1778379633,16769977,67305985,268895749,336794129,18290197,3840,0,-15792896,530512,983360,1331651334,-2141945264,
-1073733697,0,-1902379008,-1778374513,16769977,67305985,268895749,336794129,18290197,3840,0,-15792896,923728,984448,1331732992,-531621290,
8048,0,777912320,1577063517,16747374,402653192,24,8,184549400,1280,0,-15792368,923728,984448,1331406592,-1169156269,
8044,0,727580672,1594823773,16747274,67108865,7,67108865,16777223,1280,0,-15792368,923728,983424,1331667462,-2141945264,
1073749951,0,-2055012352,1661937757,16769978,402653192,24,8,184549400,1280,0,-16448256,923728,983424,1331667718,-2141945264,
1073749951,0,-2055012352,1661937757,16769978,67305985,939987973,1010514489,20921917,3840,0,-15792896,923688,198920,657302274,-1607757784,
1291853759,3083,-2055012352,1662981213,16753594,67305985,939987973,1010514489,138362429,3840,0,-16773616,923688,198920,657302274,-1607757784,
1291853759,3083,-2055012352,1662981213,16753594,67305985,939987973,1010514489,138362429,3840,0,-16773616,923728,196880,1331667714,-2125102512,
1291853759,3083,-2055012352,1662986333,16753594,67305985,939987973,1010514489,138362429,3840,0,-16773616,923728,196880,1331667714,-2125102512,
1291853759,3083,-2055012352,1662986333,16753594,67305985,939987973,1010514489,138362429,3840,0,-16773616,1054760,198664,657286914,-1607757784,
1325408191,3597,-1902379008,-1776348017,16753593,67305985,939987973,1010514489,205471293,528128,0,-16773616,1054800,196624,1331652354,-2125102512,
1325408191,3597,-1902379008,-1776342897,16753593,67305985,939987973,1010514489,205471293,528128,0,-16773616,1054800,196624,1331652098,-2125102512,
1325408191,3597,-1902379008,-1777391473,16753593,134744072,268961800,404232216,236460056,528128,0,-16774640,1056080,983456,1331684102,-2141945264,
1073757707,0,-1930821632,-419419937,16761604,1061109567,1061109567,1061109567,20922175,3840,0,-16710400,1056080,983456,1331684102,-2141945264,
1073757707,0,-1930821632,-419419937,16769796,67305985,939987973,1010514489,20921917,3840,0,-15792896,530472,983328,1331651342,-2141945264,
1090527167,0,-1902379008,-1774180209,16753593,67305985,134678021,202050057,1091505677,3840,0,-15792832,-1,-1,135268368,-63472,
135274301,135268368,135268368,269486096,524095504,135274301,-1073714968,0,0,0,-1073711856,0,0,-536844056,0,0,
0,-536840918,0,0,1967390746,49152,0,0,0,0,1703936,-536840892,0,0,0,0,
0,524560,16777216,16908800,17040384,84018432,100730368,134219269,117442561,117835522,1040639,117440512,251594754,4128768,690825260,689843754,
134744072,134283521,0,33818624,16843010,1048592,1048592,262148,2,0,0,1048576,16,131088,16777232,-1195853640,
-1330071368,0,-1600086016,-1600085856,1431633920,-21846,134480385,-2143281136,-1070593021,268963328,36880,135270416,524099389,135270416,504368144,792534845,
723062272,335810560,352653569,874786848,891629857,470554632,487397641,1009530920,1026373929,369496578,386339587,908472866,925315875,504240650,521083659,1043216938,
1060059947,470877440,673516296,538642178,740824079,707072268,909254164,740758287,959717403,606014214,808196115,639700233,858659349,808130323,1027089439,841816078,
1060643872,335810560,352915713,335810560,352915713,1043216938,1060059947,1043216938,1060059947,335810560,352915713,335810560,352915713,1043216938,1060059947,1043216938,
1060059947,470877440,672402184,470877440,672402184,841816078,1060643872,841816078,1060643872,470877440,672402184,470877440,672402184,841816078,1060643872,841816078,
1060643872,0,0,353703189,353703189,353703189,353703189,1061109567,1061109567,0,0,353703189,353703189,353703189,353703189,1061109567,
1061109567,335810560,352915713,1043216938,1060059947,470877440,672402184,841816078,1060643872,185074944,403968270,673456156,1060647469,272564224,2047744,1056976703,
1061093439,4140800,268451615,658448159,523190047,1059010367,1061101375,524236575,656359215,826223917,758529837,1059928639,1061104959,759118381,825048886,119275520,
924672,469767452,471597084,1840384,117447694,287051278,236264462,470685724,471600668,236722190,286137365,370938900,337124372,471079452,471602204,337386004,
370416664,68157440,528384,268438544,269484048,1051648,67112968,168822792,135008264,268963344,269486096,135269896,168300556,202377995,185405451,269160208,
269486864,185601803,202051597,303174160,68289552,68289552,68296192,70059008,353764352,16,336860176,336866560,338498560,756290560,757935360,67372048,
67375104,68158464,268698624,269488128,21577,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1124073472,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-1207129515,-1202667520,-900726781,0,852636498,1511509476,-1020672778,-270004816,-1341819393,-1513462,-1560301373,-1269168896,521194754,1482381658,1397816271,857625169,
-2133160238,17104958,113699188,-1979644672,-1274781122,1376832771,1979695592,854995660,-855460654,-855067632,1975519760,-400510974,-1250558050,372949758,-445316022,1979686376,
986119848,2114225206,-339725610,158,23652352,1744988456,1772618601,90826756,1745250856,1797785962,191588362,-401839192,1814564203,325871630,-1472172056,1843937645,
1131292738,-1471713688,1831358314,-2140313520,-1467912536,1860731502,-2022774653,-393711832,1869140330,-9459502,530472,198920,657285890,-1607757784,-956293185,1798,
-1902379008,-1776348017,16753593,67305985,268895749,336794129,135730709,3840,0,-16773616,530472,198920,657285890,-1607757784,-956293185,1798,
-1902379008,-1776348017,16753593,67305985,268895749,336794129,135730709,3840,0,-16773616,530512,196880,1331651330,-2125102512,-956293185,1798,
-1902379008,-1776342897,16753593,67305985,268895749,336794129,135730709,3840,0,-16773616,530512,196880,1331651330,-2125102512,-956293185,1798,
-1902379008,-1776342897,16753593,67305985,268895749,336794129,135730709,3840,0,-16773616,530472,198976,657285890,-2144628696,-1056956481,0,
-1902379008,-1778379633,16753337,35067155,268895748,336794129,18290197,768,0,-16773328,530472,198976,657285890,-2144628696,-1056956481,0,
-1902379008,-1778379633,16753337,35067155,268895748,336794129,18290197,768,0,-16773328,530512,65856,1331651334,-2141945264,-1056956481,0,
-1902379008,-1778374513,16761529,387389207,387389207,387389207,18290455,256,0,-16773888,923728,196624,1331668483,-2125102512,1291853759,3083,
-2055012352,1661806685,16753594,134744072,268961800,404232216,236460056,528128,0,-16774640,1054800,991613,1331651334,-2125102512,1073749951,0,
-1902379008,-1776342897,16769977,67305985,939987973,1010514489,20921917,3840,0,-15792896,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,530472,64,657924867,355546925,1191186692,1798,
618725376,-536341305,16753648,67305985,268895749,336794129,135730709,3840,0,-16773616,80,993536,1331651078,-2125102512,1073749951,0,
-1902379008,-1776342897,16769977,0,0,0,20905984,3840,3840,-15792888,80,993536,1331651334,-2125102512,1073749951,0,
-1902379008,-1776342897,16769977,0,0,0,20905984,3840,3840,-15792888,530472,985376,657285894,-2144628696,-1073733697,0,
-1902379008,-1778379633,16769977,67305985,268895749,336794129,18290197,3840,0,-15792896,530512,983360,1331651334,-2141945264,-1073733697,0,
-1902379008,-1778374513,16769977,67305985,268895749,336794129,18290197,3840,0,-15792896,923728,984448,1331732992,-531621290,8048,0,
777912320,1577063517,16747374,402653192,24,8,184549400,1280,0,-15792368,923728,984448,1331406592,-1169156269,8044,0,
727580672,1594823773,16747274,67108865,7,67108865,16777223,1280,0,-15792368,923728,983424,1331667462,-2141945264,1073749951,0,
-2055012352,1661937757,16769978,402653192,24,8,184549400,1280,0,-16448256,923728,983424,1331667718,-2141945264,1073749951,0,
-2055012352,1661937757,16769978,67305985,939987973,1010514489,20921917,3840,0,-15792896,923688,198920,657302274,-1607757784,1291853759,3083,
-2055012352,1662981213,16753594,67305985,939987973,1010514489,138362429,3840,0,-16773616,923688,198920,657302274,-1607757784,1291853759,3083,
-2055012352,1662981213,16753594,67305985,939987973,1010514489,138362429,3840,0,-16773616,923728,196880,1331667714,-2125102512,1291853759,3083,
-2055012352,1662986333,16753594,67305985,939987973,1010514489,138362429,3840,0,-16773616,923728,196880,1331667714,-2125102512,1291853759,3083,
-2055012352,1662986333,16753594,67305985,939987973,1010514489,138362429,3840,0,-16773616,1054760,198664,657286914,-1607757784,1325408191,3597,
-1902379008,-1776348017,16753593,67305985,939987973,1010514489,205471293,528128,0,-16773616,1054800,196624,1331652354,-2125102512,1325408191,3597,
-1902379008,-1776342897,16753593,67305985,939987973,1010514489,205471293,528128,0,-16773616,1054800,196624,1331652098,-2125102512,1325408191,3597,
-1902379008,-1777391473,16753593,134744072,268961800,404232216,236460056,528128,0,-16774640,1056080,983456,1331684102,-2141945264,1073757707,0,
-1930821632,-419419937,16761604,1061109567,1061109567,1061109567,20922175,3840,0,-16710400,1056080,983456,1331684102,-2141945264,1073757707,0,
-1930821632,-419419937,16769796,67305985,939987973,1010514489,20921917,3840,0,-15792896,530472,983328,1331651342,-2141945264,1090527167,0]
}55 30 15 34 30 35 32 2F 38 31 3A 30 30 E9 00 49 4D 43 4D 41 41 4C 00 00 00 00 00 30 30 36 30 35 4F 59 49 48 20 41 41 49 45 53 53 45 53 49 43 20 39 37 31 38 2C 41 4C 52 47 54 20 45 45 56 44 47 3D 00 00 28 0A 06 1C 07 07 00 00 50 0A 06 1C 07 07 00 00 28 0A 06 70 01 00 00 00 50 0F 06 19 0D 0C 00 00 08 CB 00 00 00 1E 33 8E B3 B8 12 10 06 00 06 0E 00 06 01 F0 06 01 F0 06 01 06 0E 01 06 00 0C 0E 00 06 01 08 0E 01 06 00 00 0E 00 C0 BF EE 64 C6 87 60 06 04 B8 40 B3 E8 00 01 1F E8 02 E8 00 64 58 E4 80 05 05 FC 7F B8 02 6E EB 90 E7 80 89 20 0B 74 87 1F CB 07 CD E8 2F C0 44 B9 13 C7 E8 01 14 E8 2F 57 E8 00 D4 F6 87 02 03 B4 89 63 BF 70 C7 33 E8 01 06 04 75 E8 01 E8 02 06 04 74 0A 79 E8 4E 03 3E E8 4E 80 7F B9 00 BA 03 E4 24 B2 E8 01 D4 E8 00 0B B4 E8 00 03 EB BA 03 C4 0C B2 E8 01 B4 E8 00 10 94 B8 00 26 04 CD E8 00 C3 B8 05 CE E8 01 09 E4 0B 06 52 80 01 8C FE 3C 75 B4 E9 01 80 0F BA 03 76 58 A0 04 80 05 0A 26 04 E8 4D 08 0E 04 E8 4D A2 04 80 03 05 FC 75 B8 00 01 3A 5B 8C A3 04 06 04 74 00 74 3D E0 08 06 04 74 00 80 10 30 0E 04 C3 36 04 80 87 02 B0 E8 00 E8 00 E0 1A F4 E8 00 1A 00 08 25 E6 E8 00 C4 DE 80 25 E8 00 32 E8 37 01 BE 78 B0 74 80 89 FB 05 BE 78 A0 EB B9 00 50 E8 4C 10 0E 04 B9 00 54 E8 4C 18 0E 04 80 89 06 80 80 B9 00 7C E8 4C 75 80 01 D8 C3 06 04 75 BA 03 03 D8 A0 04 C3 B0 E8 00 BA 01 58 B0 E8 00 C0 E8 EF E8 2D C1 2E 05 47 C1 CD F2 B0 BA 03 32 86 42 30 86 4A C3 C3 C0 C6 EE C8 EE 00 BA 03 00 E2 C3 00 00 00 00 00 00 00 EE 00 EC 00 E8 FF 86 E8 FF 86 C3 E8 42 E8 4A 52 E8 E8 FF C3 E8 FF F6 22 EB 90 E8 FF 0A EB 90 0F 86 50 0F E8 FF C3 CE EB 50 E9 5A 8B BA 03 AA 58 A7 09 E8 FF 0A EB 8A 26 25 94 47 C1 CD F1 FC C1 93 AA C1 CD F3 50 E8 2C FE EC 08 FB C9 58 50 E8 2C FE EC 08 FB 58 DD E0 63 86 22 86 0A E8 FF 8B 63 80 06 38 B2 EC 60 80 88 0F 01 E6 D0 08 88 B0 E8 FF E0 06 04 00 00 00 A0 04 01 B9 01 EC 75 F6 89 10 2A 07 0B A4 74 BB 00 C8 C3 0F FB 10 F7 03 B9 01 11 ED 12 E9 08 DF 02 B9 01 E8 2D 07 07 8B 0A BB 00 B7 E8 FF B1 D2 59 C3 90 2E 3F 74 2E 07 05 C3 EB 2E 7F 81 E8 C3 09 8A 50 DF 58 FE 3C 75 C3 BF 57 D2 72 2E 47 10 1B 8B 0A C7 B0 E8 FE C4 74 2E 7F 84 03 C7 8B 63 83 06 BA 03 00 44 E8 FF BA 03 00 E8 FE 01 8A 26 61 E8 FE 80 04 F1 C2 8A 09 FE 03 02 FE 14 B2 A8 75 B2 32 E8 FE 08 B2 32 E8 FD C4 00 E8 FD D6 11 E8 FD 00 8A 26 61 E8 FD 80 18 F1 74 BB 00 BC BB 00 B6 BB 00 B0 BA 03 00 8A 26 61 E8 FD 80 08 F1 0F 74 F6 80 7D 3E 04 75 BA 03 00 E8 FD 01 B4 E8 FD 13 B7 E8 2A E8 2B 57 6E 8A BB 57 CC 11 6A FE 78 BB 57 CC 03 72 2E 3F 74 BA 03 8A 81 B4 75 24 E8 FD 2E 3F 74 8B B8 00 46 2E 3F 74 2E 07 8A 01 36 43 EB C3 36 04 A3 8B 80 06 C0 14 E9 2A 00 00 80 1C 1E 42 80 10 16 50 00 8E 58 3E FF 1F 02 42 CD CF FB 56 F6 DE C4 F0 C4 E6 00 E6 FF F4 5E CF 5E CF C0 40 20 70 90 A0 E0 E0 40 80 40 90 40 40 30 50 70 60 40 00 EF EF EF EF EF EF 70 00 30 00 53 DF FF E3 97 04 C3 3E 04 74 80 49 03 A0 04 5E 02 5F 8B 63 FA 42 E0 FB 53 E3 00 E3 8B 6E 5B 00 55 AA FF E8 2B 8A 32 32 8B F7 4A 2E A4 07 07 07 07 07 07 F8 E7 C7 F7 4C 03 58 D1 D1 03 80 49 06 02 E7 C3 26 04 F8 C7 F7 4C 03 58 F7 85 03 E8 FF 12 C7 00 74 81 FF D0 B0 E8 FC E7 E7 E7 C3 03 CE E9 FF 02 C4 E9 FF E6 E6 54 8B C3 00 00 00 00 00 00 00 00 00 7E A5 BD 81 7E DB C3 FF 6C FE 7C 10 10 7C 7C 10 38 38 FE 38 10 38 FE 38 00 18 3C 00 FF E7 C3 FF 00 66 42 3C FF 99 BD C3 0F 0F CC CC 3C 66 3C 7E 3F 3F 30 F0 7F 7F 63 E6 99 3C E7 5A 80 F8 F8 80 02 3E 3E 02 18 7E 18 3C 66 66 66 66 7F DB 1B 1B 3E 38 6C CC 00 00 7E 7E 18 7E 7E 18 18 7E 18 18 18 18 7E 18 00 0C 0C 00 00 60 60 00 00 C0 C0 00 00 66 66 00 00 3C FF 00 00 FF 3C 00 00 00 00 00 30 78 30 30 6C 6C 00 00 6C FE FE 6C 30 C0 0C 30 00 CC 30 C6 38 38 DC 76 60 C0 00 00 18 60 60 18 60 18 18 60 00 3C 3C 00 00 30 30 00 00 00 00 30 00 00 00 00 00 00 00 30 06 18 60 80 7C CE F6 7C 30 30 30 FC 78 0C 60 FC 78 0C 0C 78 1C 6C FE 1E FC F8 0C 78 38 C0 CC 78 FC 0C 30 30 78 CC CC 78 78 CC 0C 70 00 30 00 30 00 30 00 30 18 60 60 18 00 FC 00 00 60 18 18 60 78 0C 30 30 7C DE DE 78 30 CC FC CC FC 66 66 FC 3C C0 C0 3C F8 66 66 F8 FE 68 68 FE FE 68 68 F0 3C C0 CE 3E CC CC CC CC 78 30 30 78 1E 0C CC 78 E6 6C 6C E6 F0 60 62 FE C6 FE D6 C6 C6 F6 CE C6 38 C6 C6 38 FC 66 60 F0 78 CC DC 1C FC 66 6C E6 78 E0 1C 78 FC 30 30 78 CC CC CC FC CC CC CC 30 C6 C6 FE C6 C6 6C 38 C6 CC CC 30 78 FE 8C 32 FE 78 60 60 78 C0 30 0C 02 78 18 18 78 10 6C 00 00 00 00 00 00 30 18 00 00 00 78 7C 76 E0 60 66 DC 00 78 C0 78 1C 0C CC 76 00 78 FC 78 38 60 60 F0 00 76 CC 0C E0 6C 66 E6 30 70 30 78 0C 0C 0C CC E0 66 78 E6 70 30 30 78 00 CC FE C6 00 F8 CC CC 00 78 CC 78 00 DC 66 60 00 76 CC 0C 00 DC 66 F0 00 7C 78 F8 10 7C 30 18 00 CC CC 76 00 CC CC 30 00 C6 FE 6C 00 C6 38 C6 00 CC CC 0C 00 FC 30 FC 1C 30 30 1C 18 18 18 18 E0 30 30 E0 76 00 00 00 00 38 C6 FE 78 C0 78 0C 00 00 CC 7E 1C 78 FC 78 7E 3C 3E 3F CC 78 7C 7E E0 78 7C 7E 30 78 7C 7E 00 78 C0 0C 7E 3C 7E 3C CC 78 FC 78 E0 78 FC 78 CC 70 30 78 7C 38 18 3C E0 70 30 78 C6 6C FE C6 30 00 CC CC 1C FC 78 FC 00 7F 7F 7F 3E CC CC CE 78 00 CC 78 00 00 CC 78 00 00 CC 78 78 00 CC 7E 00 00 CC 7E 00 00 CC 0C C3 3C 66 18 CC CC CC 78 18 7E C0 18 38 64 60 FC CC 78 30 30 F8 CC C6 C6 0E 18 18 D8 1C 78 7C 7E 38 70 30 78 00 00 CC 78 00 00 CC 7E 00 00 CC CC FC CC FC CC 3C 6C 00 00 38 6C 00 00 30 30 C0 78 00 00 C0 00 00 00 0C 00 C3 CC 33 CC C3 CC 37 CF 18 00 18 18 00 66 66 00 00 66 66 00 22 22 22 22 55 55 55 55 DB DB DB DB 18 18 18 18 18 18 F8 18 18 F8 F8 18 36 36 F6 36 00 00 FE 36 00 F8 F8 18 36 F6 F6 36 36 36 36 36 00 FE F6 36 36 F6 FE 00 36 36 FE 00 18 F8 F8 00 00 00 F8 18 18 18 1F 00 18 18 FF 00 00 00 FF 18 18 18 1F 18 00 00 FF 00 18 18 FF 18 18 1F 1F 18 36 36 37 36 36 37 3F 00 00 3F 37 36 36 F7 FF 00 00 FF F7 36 36 37 37 36 00 FF FF 00 36 F7 F7 36 18 FF FF 00 36 36 FF 00 00 FF FF 18 00 00 FF 36 36 36 3F 00 18 1F 1F 00 00 1F 1F 18 00 00 3F 36 36 36 FF 36 18 FF FF 18 18 18 F8 00 00 00 1F 18 FF FF FF FF 00 00 FF FF F0 F0 F0 F0 0F 0F 0F 0F FF FF 00 00 00 76 C8 76 00 CC CC C0 00 CC C0 C0 00 6C 6C 6C FC 60 60 FC 00 7E D8 70 00 66 66 60 00 DC 18 18 FC 78 CC 30 38 C6 C6 38 38 C6 6C EE 1C 18 CC 78 00 7E DB 00 06 7E DB 60 38 C0 C0 38 78 CC CC CC 00 00 00 00 30 FC 30 FC 60 18 60 FC 18 60 18 FC 0E 1B 18 18 18 18 18 D8 30 00 00 30 00 DC 76 00 38 6C 00 00 00 00 18 00 00 00 18 00 0F 0C EC 3C 78 6C 6C 00 70 30 78 00 00 3C 3C 00 00 00 00 00 00 00 00 00 00 00 00 00 7E A5 81 99 7E 00 00 7E DB FF E7 7E 00 00 00 FE FE 7C 10 00 00 00 38 FE 38 00 00 00 18 3C E7 18 3C 00 00 18 7E FF 18 3C 00 00 00 00 3C 18 00 00 FF FF FF C3 E7 FF FF 00 00 3C 42 66 00 00 FF FF C3 BD 99 FF FF 00 1E 1A 78 CC 78 00 00 3C 66 3C 7E 18 00 00 3F 3F 30 70 E0 00 00 7F 7F 63 67 E6 00 00 18 DB E7 DB 18 00 00 80 E0 FE E0 80 00 00 02 0E FE 0E 02 00 00 18 7E 18 7E 18 00 00 66 66 66 00 66 00 00 7F DB 7B 1B 1B 00 00 C6 38 C6 6C 0C 7C 00 00 00 00 FE FE 00 00 18 7E 18 7E 18 00 00 18 7E 18 18 18 00 00 18 18 18 7E 18 00 00 00 18 FE 18 00 00 00 00 30 FE 30 00 00 00 00 00 C0 FE 00 00 00 00 28 FE 28 00 00 00 00 38 7C FE 00 00 00 00 FE 7C 38 00 00 00 00 00 00 00 00 00 00 18 3C 18 00 18 00 00 66 24 00 00 00 00 00 6C FE 6C FE 6C 00 18 7C C2 7C 86 7C 18 00 00 C2 0C 30 C6 00 00 38 6C 76 CC 76 00 00 30 60 00 00 00 00 00 0C 30 30 30 0C 00 00 30 0C 0C 0C 30 00 00 00 66 FF 66 00 00 00 00 18 7E 18 00 00 00 00 00 00 18 18 00 00 00 00 FE 00 00 00 00 00 00 00 00 18 00 00 02 0C 30 C0 00 00 00 7C CE F6 C6 7C 00 00 18 78 18 18 7E 00 00 7C 06 18 60 FE 00 00 7C 06 3C 06 7C 00 00 0C 3C CC 0C 1E 00 00 FE C0 FC 06 7C 00 00 38 C0 FC C6 7C 00 00 FE 06 18 30 30 00 00 7C C6 7C C6 7C 00 00 7C C6 7E 06 78 00 00 00 18 00 18 00 00 00 00 18 00 18 30 00 00 06 18 60 18 06 00 00 00 00 00 7E 00 00 00 60 18 06 18 60 00 00 7C C6 18 00 18 00 00 7C C6 DE DC 7C 00 00 10 6C C6 C6 C6 00 00 FC 66 7C 66 FC 00 00 3C C2 C0 C2 3C 00 00 F8 66 66 66 F8 00 00 FE 62 78 62 FE 00 00 FE 62 78 60 F0 00 00 3C C2 C0 C6 3A 00 00 C6 C6 FE C6 C6 00 00 3C 18 18 18 3C 00 00 1E 0C 0C CC 78 00 00 E6 6C 78 6C E6 00 00 F0 60 60 62 FE 00 00 C6 FE D6 C6 C6 00 00 C6 F6 DE C6 C6 00 00 38 C6 C6 C6 38 00 00 FC 66 7C 60 F0 00 00 7C C6 C6 DE 0C 00 00 FC 66 7C 66 E6 00 00 7C C6 38 C6 7C 00 00 7E 5A 18 18 3C 00 00 C6 C6 C6 C6 7C 00 00 C6 C6 C6 6C 10 00 00 C6 C6 D6 FE 6C 00 00 C6 6C 38 6C C6 00 00 66 66 3C 18 3C 00 00 FE 8C 30 C2 FE 00 00 3C 30 30 30 3C 00 00 80 E0 38 0E 02 00 00 3C 0C 0C 0C 3C 00 10 6C 00 00 00 00 00 00 00 00 00 00 00 FF 30 18 00 00 00 00 00 00 00 00 0C CC 76 00 00 E0 60 6C 66 7C 00 00 00 00 C6 C0 7C 00 00 1C 0C 6C CC 76 00 00 00 00 C6 C0 7C 00 00 38 64 F0 60 F0 00 00 00 00 CC CC 0C 78 00 E0 60 76 66 E6 00 00 18 00 18 18 3C 00 00 06 00 06 06 66 3C 00 E0 60 6C 6C E6 00 00 38 18 18 18 3C 00 00 00 00 FE D6 C6 00 00 00 00 66 66 66 00 00 00 00 C6 C6 7C 00 00 00 00 66 66 60 F0 00 00 00 CC CC 0C 1E 00 00 00 76 60 F0 00 00 00 00 C6 1C 7C 00 00 10 30 30 30 1C 00 00 00 00 CC CC 76 00 00 00 00 66 66 18 00 00 00 00 C6 D6 6C 00 00 00 00 6C 38 C6 00 00 00 00 C6 C6 06 F8 00 00 00 CC 30 FE 00 00 0E 18 70 18 0E 00 00 18 18 00 18 18 00 00 70 18 0E 18 70 00 00 76 00 00 00 00 00 00 00 10 6C C6 00 00 00 3C C2 C0 66 0C 7C 00 CC 00 CC CC 76 00 00 18 00 C6 C0 7C 00 00 38 00 0C CC 76 00 00 CC 00 0C CC 76 00 00 30 00 0C CC 76 00 00 6C 00 0C CC 76 00 00 00 3C 60 3C 06 00 00 38 00 C6 C0 7C 00 00 CC 00 C6 C0 7C 00 00 30 00 C6 C0 7C 00 00 66 00 18 18 3C 00 00 3C 00 18 18 3C 00 00 30 00 18 18 3C 00 00 C6 38 C6 FE C6 00 38 38 38 C6 FE C6 00 18 60 FE 60 60 FE 00 00 00 CC 36 D8 6E 00 00 3E CC FE CC CE 00 00 38 00 C6 C6 7C 00 00 C6 00 C6 C6 7C 00 00 30 00 C6 C6 7C 00 00 78 00 CC CC 76 00 00 30 00 CC CC 76 00 00 C6 00 C6 C6 06 78 00 C6 6C C6 C6 38 00 00 C6 C6 C6 C6 7C 00 00 18 66 60 3C 18 00 00 6C 60 60 60 FC 00 00 66 3C 7E 7E 18 00 00 CC F8 CC CC C6 00 00 1B 18 7E 18 18 70 00 30 00 0C CC 76 00 00 18 00 18 18 3C 00 00 30 00 C6 C6 7C 00 00 30 00 CC CC 76 00 00 76 00 66 66 66 00 76 00 E6 FE CE C6 00 00 6C 3E 7E 00 00 00 00 6C 38 7C 00 00 00 00 30 00 30 C6 7C 00 00 00 00 FE C0 00 00 00 00 00 FE 06 00 00 00 C0 CC 30 DC 0C 3E 00 C0 CC 30 CE 3E 06 00 18 00 18 3C 18 00 00 00 36 D8 36 00 00 00 00 D8 36 D8 00 00 11 11 11 11 11 11 11 55 55 55 55 55 55 55 DD DD DD DD DD DD DD 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 36 36 36 36 36 36 36 00 00 00 00 36 36 36 00 00 00 18 18 18 18 36 36 36 06 36 36 36 36 36 36 36 36 36 36 00 00 00 06 36 36 36 36 36 36 06 00 00 00 36 36 36 36 00 00 00 18 18 18 18 00 00 00 00 00 00 00 18 18 18 18 18 18 18 00 00 00 18 18 18 18 00 00 00 00 00 00 00 18 18 18 18 18 18 18 18 18 18 00 00 00 00 00 00 00 18 18 18 18 18 18 18 18 18 18 18 18 18 18 36 36 36 36 36 36 36 36 36 36 30 00 00 00 00 00 00 30 36 36 36 36 36 36 00 00 00 00 00 00 00 00 36 36 36 36 36 36 30 36 36 36 00 00 00 00 00 00 00 36 36 36 00 36 36 36 18 18 18 00 00 00 00 36 36 36 36 00 00 00 00 00 00 00 18 18 18 00 00 00 00 36 36 36 36 36 36 36 00 00 00 18 18 18 18 00 00 00 00 00 00 18 18 18 18 00 00 00 00 36 36 36 36 36 36 36 36 36 36 18 18 18 18 18 18 18 18 18 18 18 00 00 00 00 00 00 00 18 18 18 FF FF FF FF FF FF FF 00 00 00 00 FF FF FF F0 F0 F0 F0 F0 F0 F0 0F 0F 0F 0F 0F 0F 0F FF FF FF FF 00 00 00 00 00 00 DC D8 76 00 00 00 7C FC C6 C0 40 00 FE C6 C0 C0 C0 00 00 00 FE 6C 6C 6C 00 00 FE 60 18 60 FE 00 00 00 00 D8 D8 70 00 00 00 66 66 7C 60 00 00 00 76 18 18 18 00 00 7E 3C 66 3C 7E 00 00 38 C6 FE C6 38 00 00 38 C6 C6 6C EE 00 00 1E 18 3E 66 3C 00 00 00 00 DB 7E 00 00 00 03 7E DB 7E C0 00 00 1C 60 7C 60 1C 00 00 00 C6 C6 C6 C6 00 00 00 00 FE 00 00 00 00 00 18 18 00 FF 00 00 30 0C 0C 30 7E 00 00 0C 30 30 0C 7E 00 00 0E 1B 18 18 18 18 18 18 18 18 D8 70 00 00 00 18 7E 18 00 00 00 00 76 00 DC 00 00 00 6C 38 00 00 00 00 00 00 00 18 00 00 00 00 00 00 00 00 00 00 00 0C 0C 0C 6C 1C 00 00 6C 6C 6C 00 00 00 00 D8 60 F8 00 00 00 00 00 7C 7C 7C 00 00 00 00 00 00 00 00 00 1D 00 00 66 66 00 00 00 00 63 22 00 00 00 00 2B 00 18 18 18 18 00 00 00 00 00 FF 00 00 00 4D 00 E7 DB C3 C3 00 00 00 FF 99 18 18 3C 00 56 00 C3 C3 C3 3C 00 00 00 C3 C3 DB FF 66 00 58 00 C3 3C 3C C3 00 00 00 C3 C3 3C 18 3C 00 5A 00 C3 0C 30 C3 00 00 00 00 00 FF DB DB 00 76 00 00 C3 C3 3C 00 00 00 00 00 C3 DB 66 00 91 00 00 3B 7E DC 00 00 00 18 C3 C0 7E 18 00 9D 00 66 18 18 18 00 00 00 66 7C 66 66 F3 00 F1 00 18 FF 18 00 00 00 00 18 00 FF 00 18 00 00 00 00 00 00 00 00 00 00 00 81 81 BD 81 7E 00 00 00 FF FF C3 FF 7E 00 00 00 00 FE FE 7C 10 00 00 00 00 38 FE 38 00 00 00 00 18 3C E7 18 3C 00 00 00 18 7E FF 18 3C 00 00 00 00 00 3C 18 00 00 00 FF FF FF C3 E7 FF FF FF 00 00 3C 42 66 00 00 00 FF FF C3 BD 99 FF FF FF 00 0E 32 CC CC 78 00 00 00 66 66 3C 7E 18 00 00 00 33 30 30 70 E0 00 00 00 63 63 63 67 E6 00 00 00 18 DB E7 DB 18 00 00 80 E0 F8 F8 E0 80 00 00 02 0E 3E 3E 0E 02 00 00 00 3C 18 18 3C 00 00 00 00 66 66 66 00 66 00 00 00 DB DB 1B 1B 1B 00 00 7C 60 6C C6 38 C6 00 00 00 00 00 00 FE FE 00 00 00 3C 18 18 3C 7E 00 00 00 3C 18 18 18 18 00 00 00 18 18 18 7E 18 00 00 00 00 18 FE 18 00 00 00 00 00 30 FE 30 00 00 00 00 00 00 C0 FE 00 00 00 00 00 28 FE 28 00 00 00 00 00 38 7C FE 00 00 00 00 00 FE 7C 38 00 00 00 00 00 00 00 00 00 00 00 00 3C 3C 18 00 18 00 00 66 66 00 00 00 00 00 00 00 6C FE 6C FE 6C 00 00 18 C6 C0 06 86 7C 18 00 00 00 C6 18 60 86 00 00 00 6C 38 DC CC 76 00 00 30 30 00 00 00 00 00 00 00 18 30 30 30 0C 00 00 00 18 0C 0C 0C 30 00 00 00 00 66 FF 66 00 00 00 00 00 18 7E 18 00 00 00 00 00 00 00 18 18 00 00 00 00 00 FE 00 00 00 00 00 00 00 00 00 18 00 00 00 00 06 18 60 80 00 00 00 6C C6 D6 C6 38 00 00 00 38 18 18 18 7E 00 00 00 C6 0C 30 C0 FE 00 00 00 C6 06 06 06 7C 00 00 00 1C 6C FE 0C 1E 00 00 00 C0 C0 06 06 7C 00 00 00 60 C0 C6 C6 7C 00 00 00 C6 06 18 30 30 00 00 00 C6 C6 C6 C6 7C 00 00 00 C6 C6 06 06 78 00 00 00 00 18 00 18 00 00 00 00 00 18 00 18 30 00 00 00 06 18 60 18 06 00 00 00 00 7E 00 00 00 00 00 00 60 18 06 18 60 00 00 00 C6 0C 18 00 18 00 00 00 7C C6 DE DC 7C 00 00 00 38 C6 FE C6 C6 00 00 00 66 66 66 66 FC 00 00 00 66 C0 C0 C2 3C 00 00 00 6C 66 66 66 F8 00 00 00 66 68 68 62 FE 00 00 00 66 68 68 60 F0 00 00 00 66 C0 DE C6 3A 00 00 00 C6 C6 C6 C6 C6 00 00 00 18 18 18 18 3C 00 00 00 0C 0C 0C CC 78 00 00 00 66 6C 78 66 E6 00 00 00 60 60 60 62 FE 00 00 00 EE FE C6 C6 C6 00 00 00 E6 FE CE C6 C6 00 00 00 C6 C6 C6 C6 7C 00 00 00 66 66 60 60 F0 00 00 00 C6 C6 C6 D6 7C 0E 00 00 66 66 6C 66 E6 00 00 00 C6 60 0C C6 7C 00 00 00 7E 18 18 18 3C 00 00 00 C6 C6 C6 C6 7C 00 00 00 C6 C6 C6 6C 10 00 00 00 C6 C6 D6 FE 6C 00 00 00 C6 7C 38 6C C6 00 00 00 66 66 18 18 3C 00 00 00 C6 0C 30 C2 FE 00 00 00 30 30 30 30 3C 00 00 00 80 E0 38 0E 02 00 00 00 0C 0C 0C 0C 3C 00 00 38 C6 00 00 00 00 00 00 00 00 00 00 00 00 FF 00 30 00 00 00 00 00 00 00 00 00 78 7C CC 76 00 00 00 60 78 66 66 7C 00 00 00 00 7C C0 C0 7C 00 00 00 0C 3C CC CC 76 00 00 00 00 7C FE C0 7C 00 00 00 6C 60 60 60 F0 00 00 00 00 76 CC CC 7C CC 00 00 60 6C 66 66 E6 00 00 00 18 38 18 18 3C 00 00 00 06 0E 06 06 06 66 00 00 60 66 78 6C E6 00 00 00 18 18 18 18 3C 00 00 00 00 EC D6 D6 C6 00 00 00 00 DC 66 66 66 00 00 00 00 7C C6 C6 7C 00 00 00 00 DC 66 66 7C 60 00 00 00 76 CC CC 7C 0C 00 00 00 DC 66 60 F0 00 00 00 00 7C 60 0C 7C 00 00 00 30 FC 30 30 1C 00 00 00 00 CC CC CC 76 00 00 00 00 66 66 66 18 00 00 00 00 C6 D6 D6 6C 00 00 00 00 C6 38 38 C6 00 00 00 00 C6 C6 C6 7E 0C 00 00 00 FE 18 60 FE 00 00 00 18 18 18 18 0E 00 00 00 18 18 18 18 18 00 00 00 18 18 18 18 70 00 00 00 DC 00 00 00 00 00 00 00 00 38 C6 C6 00 00 00 00 66 C0 C0 66 0C 7C 00 00 00 CC CC CC 76 00 00 0C 30 7C FE C0 7C 00 00 10 6C 78 7C CC 76 00 00 00 00 78 7C CC 76 00 00 60 18 78 7C CC 76 00 00 38 38 78 7C CC 76 00 00 00 00 66 60 3C 06 00 00 10 6C 7C FE C0 7C 00 00 00 00 7C FE C0 7C 00 00 60 18 7C FE C0 7C 00 00 00 00 38 18 18 3C 00 00 18 66 38 18 18 3C 00 00 60 18 38 18 18 3C 00 00 C6 10 6C C6 C6 C6 00 00 6C 00 6C C6 C6 C6 00 00 30 00 66 7C 60 FE 00 00 00 00 CC 36 D8 6E 00 00 00 6C CC CC CC CE 00 00 10 6C 7C C6 C6 7C 00 00 00 00 7C C6 C6 7C 00 00 60 18 7C C6 C6 7C 00 00 30 CC CC CC CC 76 00 00 60 18 CC CC CC 76 00 00 00 00 C6 C6 C6 7E 0C 00 C6 7C C6 C6 C6 7C 00 00 C6 C6 C6 C6 C6 7C 00 00 18 3C 60 60 3C 18 00 00 38 64 F0 60 60 FC 00 00 00 66 18 18 18 18 00 00 F8 CC C4 DE CC C6 00 00 0E 18 18 18 18 18 70 00 18 60 78 7C CC 76 00 00 0C 30 38 18 18 3C 00 00 18 60 7C C6 C6 7C 00 00 18 60 CC CC CC 76 00 00 00 DC DC 66 66 66 00 00 DC C6 F6 DE C6 C6 00 00 3C 6C 00 00 00 00 00 00 38 6C 00 00 00 00 00 00 00 30 30 60 C6 7C 00 00 00 00 00 C0 C0 00 00 00 00 00 00 06 06 00 00 00 C0 C2 CC 30 DC 0C 3E 00 C0 C2 CC 30 CE 3E 06 00 00 18 18 18 3C 18 00 00 00 00 36 D8 36 00 00 00 00 00 D8 36 D8 00 00 00 44 44 44 44 44 44 44 44 AA AA AA AA AA AA AA AA 77 77 77 77 77 77 77 77 18 18 18 18 18 18 18 18 18 18 18 F8 18 18 18 18 18 18 F8 F8 18 18 18 18 36 36 36 F6 36 36 36 36 00 00 00 FE 36 36 36 36 00 00 F8 F8 18 18 18 18 36 36 F6 F6 36 36 36 36 36 36 36 36 36 36 36 36 00 00 FE F6 36 36 36 36 36 36 F6 FE 00 00 00 00 36 36 36 FE 00 00 00 00 18 18 F8 F8 00 00 00 00 00 00 00 F8 18 18 18 18 18 18 18 1F 00 00 00 00 18 18 18 FF 00 00 00 00 00 00 00 FF 18 18 18 18 18 18 18 1F 18 18 18 18 00 00 00 FF 00 00 00 00 18 18 18 FF 18 18 18 18 18 18 1F 1F 18 18 18 18 36 36 36 37 36 36 36 36 36 36 37 3F 00 00 00 00 00 00 3F 37 36 36 36 36 36 36 F7 FF 00 00 00 00 00 00 FF F7 36 36 36 36 36 36 37 37 36 36 36 36 00 00 FF FF 00 00 00 00 36 36 F7 F7 36 36 36 36 18 18 FF FF 00 00 00 00 36 36 36 FF 00 00 00 00 00 00 FF FF 18 18 18 18 00 00 00 FF 36 36 36 36 36 36 36 3F 00 00 00 00 18 18 1F 1F 00 00 00 00 00 00 1F 1F 18 18 18 18 00 00 00 3F 36 36 36 36 36 36 36 FF 36 36 36 36 18 18 FF FF 18 18 18 18 18 18 18 F8 00 00 00 00 00 00 00 1F 18 18 18 18 FF FF FF FF FF FF FF FF 00 00 00 FF FF FF FF FF F0 F0 F0 F0 F0 F0 F0 F0 0F 0F 0F 0F 0F 0F 0F 0F FF FF FF 00 00 00 00 00 00 00 76 D8 D8 76 00 00 00 CC CC CC C6 CC 00 00 00 C6 C0 C0 C0 C0 00 00 00 00 6C 6C 6C 6C 00 00 00 FE 60 18 60 FE 00 00 00 00 7E D8 D8 70 00 00 00 00 66 66 7C 60 00 00 00 00 DC 18 18 18 00 00 00 7E 3C 66 3C 7E 00 00 00 38 C6 FE C6 38 00 00 00 6C C6 6C 6C EE 00 00 00 30 0C 66 66 3C 00 00 00 00 7E DB 7E 00 00 00 00 03 7E DB 7E C0 00 00 00 30 60 60 60 1C 00 00 00 7C C6 C6 C6 C6 00 00 00 00 00 FE 00 00 00 00 00 00 18 18 00 FF 00 00 00 30 0C 0C 30 7E 00 00 00 0C 30 30 0C 7E 00 00 00 1B 18 18 18 18 18 18 18 18 18 18 D8 70 00 00 00 00 18 7E 18 00 00 00 00 00 76 00 DC 00 00 00 38 6C 00 00 00 00 00 00 00 00 00 18 00 00 00 00 00 00 00 00 00 00 00 00 0F 0C 0C EC 6C 1C 00 00 D8 6C 6C 00 00 00 00 00 70 30 C8 00 00 00 00 00 00 00 7C 7C 7C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 66 66 00 00 00 30 00 66 C3 DB C3 3C 00 00 00 C3 FF DB C3 C3 00 00 54 00 DB 18 18 18 3C 00 00 00 C3 C3 C3 C3 3C 00 00 57 00 C3 C3 DB FF 66 00 00 00 C3 66 18 3C C3 00 00 59 00 C3 66 18 18 3C 00 00 00 FF 86 18 60 C3 00 00 6D 00 00 E6 DB DB DB 00 00 00 00 00 C3 C3 3C 00 00 77 00 00 C3 C3 DB 66 00 00 00 00 00 66 18 66 00 00 91 00 00 6E 1B D8 77 00 00 00 18 C3 C0 C3 18 00 00 9D 00 66 18 18 18 18 00 00 00 66 7C 66 66 66 00 00 AB C0 C2 CC 30 CE 06 1F 00 00 C0 C6 18 66 96 06 00 00 00 00 00 00 00 00 00 8B 63 80 06 F2 E8 D3 F2 E9 D3 EA BA 03 32 26 79 E8 FF C3 08 8A E9 D3 9C E8 FF 57 BB 00 F3 5B 13 C3 E4 10 06 11 07 C8 F8 88 5F C3 BB B0 E8 D2 A1 58 FA C0 8A E8 D2 8A EB E8 00 16 C0 00 BA A0 06 04 75 BA B8 00 C3 62 B8 07 F1 00 EB F6 87 80 39 3E 04 74 E8 FF 57 C2 E8 01 D0 F6 0A 74 50 B0 8A E8 D2 58 FC FF AB 80 10 CA E7 BB 5F C3 00 00 00 8A 88 80 0F FC 74 80 03 A0 04 B4 3C 74 3C 74 3C 74 50 E8 00 05 83 08 5B 74 B2 C3 49 A8 74 3C 74 50 E8 00 05 F6 03 5B C3 3E 04 C4 8C 0B C3 BB 00 ED 5B EE DB F6 87 08 0E 52 CE B0 E8 D1 40 58 33 56 86 2E 00 0B 80 FF 05 C3 EB 43 8A 80 FF C3 B0 F6 8B 81 9A 58 A0 04 14 08 E8 FF E5 9D 50 F6 03 74 B0 E8 D1 C4 74 B0 E8 D1 C4 75 2E 47 20 05 C4 EB 0C 58 53 C0 B0 72 2E 67 80 03 10 04 FC 74 B0 80 02 02 10 C0 C3 F6 25 74 3C 76 3C 76 3C 74 50 C4 58 03 02 46 46 E6 50 52 5C 8E 5A 58 53 4F 50 49 50 0B D0 25 3F B8 00 4E B8 80 48 B8 00 3E 04 74 B8 00 10 00 8E 26 06 00 B8 40 28 26 06 00 B8 00 1C 26 3E 00 74 BB 80 03 0B 58 C3 06 E8 D0 32 CD 58 B2 5B 00 00 00 00 E8 D1 06 04 74 E8 00 FA C8 E8 D0 C9 C4 84 8A E8 D0 C3 7A 9D E8 D0 BA 03 6E B2 E8 D0 E0 68 8A E8 D0 D8 C3 16 F3 C6 8A 47 8A 47 8A 47 A9 46 EC E3 FC F3 C6 C3 8A AA C7 8A AA E2 C3 D2 01 02 2A 02 03 C2 C3 53 79 5B 86 86 04 C3 51 8A 25 00 66 F7 8B 8B 58 8A 25 00 85 F7 03 13 58 3F BA 0E E2 C8 DA E1 D3 C5 83 00 58 E3 FB 2E 8A 2E 8A 2E 8A C3 8A 8A 8A 8A E8 FF FE FE 75 C3 ED 8A E8 FF E2 E8 E8 71 8A D0 D0 E8 FF DA C5 F9 46 C5 C9 DA 32 32 26 79 E8 FC C3 FB 7C 26 7D B3 E8 FC C6 B0 E8 CF F4 75 80 49 13 5D 42 80 00 55 84 80 49 13 5B 44 B1 F6 89 06 09 ED F1 6F EB E8 FF 64 B9 10 61 57 74 BF 00 B5 B1 E8 FF C0 C7 F1 E8 FE 69 47 C9 EB C7 FE 75 5F E8 FC 08 04 B1 E9 FF 04 F6 89 06 F1 C6 B9 00 17 00 00 00 00 BA 03 02 E8 CE 04 E8 CE CE 05 E8 CE 06 E8 CE 04 E8 CE 8D 32 E9 CE BA 03 02 E8 CE 04 E8 CE 0E 50 75 B3 B2 B8 10 8C 8A B0 E8 CE 04 E8 CE 0A 74 E8 FB 26 01 3C 74 3A 49 75 34 C3 3E 04 CF 14 75 8A B0 E8 CE E0 09 F1 80 0D 02 CF E7 0B 3E 88 60 FE FE E8 CE 26 04 14 52 C1 F7 85 FE A2 04 C0 26 04 80 00 02 E0 8A B0 E8 CE 84 FE F6 4A D1 FE A3 04 BA 08 10 E8 FC 1A 8A 01 D0 7F E2 3C 74 B6 BD 10 01 25 1B B8 80 00 1B 0E 10 80 01 09 3E 04 75 74 B6 BD 1F CA 8B 0E B9 01 D2 1E 8A 80 03 E5 C3 74 FE 02 B1 D3 8B 59 1F 00 8E 8B FC 03 64 F6 80 17 0A 74 57 E4 05 E0 F8 CF ED A4 EB 1E 57 33 8E BB 00 4B 5B 07 03 EB A0 04 3C 74 3C 74 EB B9 01 08 B0 06 AA C7 E2 B9 00 07 BF 16 83 1F C7 E2 1F 57 57 CF ED A4 83 20 E2 5F 06 57 51 50 E0 7F 3C 77 E9 00 7F 03 A5 80 1F 08 5B FF E9 00 FF 72 8A 24 BA 03 DF 5B 50 58 B7 59 92 80 0F D8 FF 72 8B 86 E8 06 E5 FF 75 E8 CC CC E8 CC 01 03 02 06 B0 E8 CC C4 58 02 C4 0F CE E8 CC B7 FF 75 E8 05 5F B7 EB 80 01 14 7E 75 F6 49 F8 03 79 E8 04 8F FF 03 6D E8 FA 02 81 41 E9 FF 16 5A 9C FA 75 8A 9D 52 08 5B 5A 5D C3 81 90 49 74 50 BA 46 0E 5A C7 0C 10 8C 0E 80 87 7F 26 04 06 04 75 E9 00 B0 E8 CB C4 58 73 B0 E8 CB C4 58 67 FB 74 E8 05 34 EB 3A 49 74 80 10 CF 87 75 3B 63 75 80 10 30 29 88 75 B3 EB 3B 63 75 80 10 20 13 72 75 B3 80 88 F0 1E 04 62 C7 63 D4 8A 10 80 30 FB 75 EB 8A 10 80 30 06 04 74 E8 F9 16 04 1F FA 75 80 30 0D C0 76 FC 75 B0 EB E8 F9 03 18 EB EB C7 0C 10 8C 0E 80 87 F3 FC 75 F6 87 02 34 07 7E 80 87 08 E7 C6 85 08 06 04 74 80 87 04 06 04 75 C7 63 D4 E8 F8 16 C0 0D 06 04 03 A9 74 B0 80 87 7F F9 74 A2 04 08 E8 02 B4 49 E8 CB CE E8 CD 20 B9 53 20 F6 89 08 03 2A 58 F8 A5 E8 00 0A E8 F8 6F 14 E8 FC 67 06 04 75 26 4D E3 26 5D 06 26 7D 26 3D 14 E8 F7 97 FE 47 EF 8A B3 E8 CB 52 E8 F7 07 8B 0C 0F 57 8B 0E C4 10 EF 5F B4 26 05 C0 11 06 26 04 CC 14 16 04 36 E8 F7 F9 3C 74 E8 F8 07 69 2E 57 C3 8C 83 0E 8A 0A 74 2E 5C 75 2E 4C 75 2E 54 75 B7 0A 75 8A C3 D1 74 E9 00 14 E8 FB 40 BB 00 D7 74 BB 00 62 74 26 3D 8A 01 8B 02 8B 04 06 26 6D E8 FC E8 FB 5F 8A 0A FF 05 C8 84 BB 00 A7 74 BB 00 26 74 26 3D 3E 04 30 8A 01 E3 53 00 33 26 6D E8 FB 8A D0 D0 F6 10 03 CF 80 2C 13 C4 B0 E8 CA E4 AF EB C7 60 00 B8 10 3E 04 74 B8 08 03 3D FA 0C 8C 0E FB 0C E8 F7 25 07 E8 FA 1D 8A FE A2 04 8A 01 85 26 6D FA 2E 01 06 01 C3 E7 B3 BA 03 01 A3 33 A3 04 62 BB 00 87 04 7D 26 05 4A 26 45 A3 04 8A 01 84 26 45 A2 04 8B 14 C4 60 8A 49 80 07 16 FF 8A 78 A2 04 30 FB 75 B0 A2 04 A2 04 06 04 03 D8 FF FB 74 8B D1 03 81 91 EB C6 63 B4 C7 2E 3F 07 7C 8B 63 32 80 B4 02 C0 C2 E8 C8 EA C4 74 8A 49 80 01 13 C7 80 03 0B C7 80 07 03 C7 32 26 25 3C 47 C0 10 F3 3E 04 74 52 62 8E 5A FF F3 80 04 65 E8 C8 FA 74 FE A0 04 04 C3 B0 A3 01 26 04 B8 00 49 B8 00 43 A0 04 00 10 80 49 07 0C 11 B3 CD BF 5A 0D 12 B3 CD E8 00 A0 E8 00 0C E8 01 0E E8 01 0D E8 01 06 00 00 0E 00 B8 A3 01 0E 04 A0 04 F4 0E E8 CA DB FF 8A 23 74 FE 80 10 F0 8A 34 11 64 E8 F4 16 04 C2 32 E9 C7 DB 7F 74 FE B0 E8 C7 E4 B1 D2 8A E8 F5 C8 1C 01 27 74 A0 04 0F 0E C1 10 08 C1 12 02 C1 8A 88 8A 89 80 0F FB 7E 80 0C 03 DB 80 10 CF 26 04 80 09 15 05 0E 04 80 10 30 0E 04 B3 EB B3 F6 80 02 09 0E 04 80 87 FD 26 04 08 88 89 63 80 FF 50 84 B9 00 07 14 0F F6 89 04 0A 1B 33 B9 00 10 C3 50 E0 71 2E 86 BB 57 D7 D8 50 5A 22 0A 58 E3 E9 C6 00 00 00 51 89 60 A0 04 08 20 C5 75 F6 20 06 1E C9 10 D0 43 75 8A 24 75 E8 00 E5 0A E0 86 FE 8A E8 C9 E0 59 A0 04 08 0D F9 0B 06 F9 0C 19 3C 75 81 07 75 B9 0E 3C 75 81 0C 74 8A D0 80 1F E5 0A 74 3A 7D 80 03 5A E9 0C EC 52 C8 C9 E9 4A FD 7E 3A 7D 80 02 02 E9 C8 C9 34 F5 C6 3A 7C 2A 02 FE 8A FE 3C 7E FE FE EB 80 02 08 EC C8 C9 0A E9 E8 CD C8 C9 52 50 C1 07 DB EB C8 97 04 EB 1E 04 24 DA C7 E4 26 04 FF D8 E3 1E 04 EB E7 0E FE 8A B0 E8 C8 5B C3 00 00 00 00 00 00 00 8B B1 D3 D1 81 50 8B 8B 60 C3 00 00 00 00 00 00 33 F6 87 08 04 04 42 00 52 50 62 8A 98 26 04 4E F6 49 F8 02 E8 D8 0C 94 8A B0 E8 C8 56 E6 00 DE 90 04 63 00 00 00 00 00 50 55 52 06 EC EC 32 86 89 FA DC E4 46 89 FE C0 C6 46 8A 89 F6 C5 46 8A 89 F2 46 2B F4 2B FC 05 DB 5E 8B F8 46 40 46 8B F6 46 40 46 83 FE 74 8B F8 03 46 F7 4A 89 DC 46 89 D8 4F 74 A0 04 00 21 06 2D 02 46 04 73 06 3E 01 4F 45 36 C8 32 D8 75 EB BA 00 01 BB 00 4E EB BA 00 04 80 49 06 05 02 EB BB 00 5E B8 00 31 0E 04 01 33 A0 04 2E 04 00 EB BA 00 0E 04 08 B8 00 0D 04 8B 85 BB 00 00 89 D4 5E 89 DA 56 E8 00 58 E8 00 5F E8 00 C4 07 5A 5D 58 A1 04 7E 03 07 02 F7 EB 83 DE 75 F7 E0 04 F7 EB F7 85 83 DE 74 83 DE 75 BB 00 EB 46 83 FE 74 F7 89 EC 8B EC 6E 89 EA 56 C3 00 83 DE 7E 83 DE 74 A1 04 30 3D 00 05 00 EB B8 B0 46 89 D2 8B DC 6E 03 D8 6E 03 D4 46 89 D6 46 13 E8 46 89 DA 8B EE 46 89 E4 46 89 E2 7E 00 06 46 89 E2 76 D1 2E 94 40 0A 42 41 41 40 41 1E 67 75 F6 87 04 0F DA EC 08 FB B0 B2 EE 83 FC 74 8B F0 E1 5E 8E D2 7E 8B DC A4 17 FF E4 E5 02 8B F0 7E 8E D2 46 B4 86 F3 E8 01 4E 7F 1F 0D 75 A0 04 D8 EE C3 08 F7 F0 46 83 FC 74 33 B8 00 2E 04 EB F0 F8 8E D2 5E 03 D8 76 8B E6 A4 43 85 3B 7F E8 01 41 FF E4 CB 92 33 B8 00 2E 04 EB F8 03 D8 46 8B E6 46 F3 1F 3B 85 7C E8 01 0F FF E2 D1 49 B8 00 56 C3 7E 04 2F 46 83 FE 75 8B D8 03 46 25 F0 46 29 D8 04 D3 01 DA 46 8B DA E0 09 20 C3 8B F0 6E 89 E6 7E 00 43 DB 50 F7 8B 8B 03 DC 7E 8E D2 5E 8B E6 C6 D7 A4 F0 FA 4E B8 20 F0 F8 A4 B8 00 D8 CA E5 FF E4 C0 D0 33 B8 00 EB 46 8B 8E D2 46 8B E6 D7 AA FA 4E B8 20 F8 46 F3 43 04 3B 7F E8 00 4E 7F 1F 83 FC 74 B8 01 63 B8 0F 65 33 8B F0 4A F7 8B 8B 03 D8 76 8E D2 8E D4 A4 1F 85 3B 7F E8 00 4E 7F B8 00 29 E8 00 02 E8 C5 00 E8 00 46 8A B0 E8 C5 FF E8 00 02 E8 C5 35 FF E2 D6 8B 33 A1 04 F7 5A 46 8B 8E D2 4E 8B F3 43 1E 04 E3 8B E8 46 29 DC 5E C3 10 8B EC 46 73 01 DA 46 01 D8 03 5E C3 00 00 53 52 57 E8 EF E4 E8 C4 DE 43 E8 C4 EA FF 71 8B E8 C3 03 B9 8B 07 5D 59 C3 44 44 44 44 43 A0 04 D0 06 0E 16 04 12 06 E2 E2 E2 85 8E 50 56 33 8B 51 FF C6 59 04 05 E2 0B 5F 59 74 03 E2 33 8E 58 C1 E4 C9 C5 D0 FC 04 C5 80 06 05 8A EB B8 08 8B 86 D0 81 00 14 D1 D1 FE 75 81 00 75 83 50 26 05 D0 FA B8 08 E0 8A 80 FF 00 FE 75 83 08 FA F6 87 04 14 17 75 BA 03 A8 75 FA A8 74 FB 8B C3 36 04 80 C7 85 08 E8 FF 10 1F E8 C3 EA 80 E8 FF 80 06 04 B8 08 85 B9 01 0D 50 05 E8 C3 C3 00 E9 FE 00 0B 75 C3 8B EB 90 83 06 02 FF 9A 5B DC 50 8A 2E 94 44 D5 59 E2 8B E8 C2 03 6D 8B EB 90 BF EB 90 B4 50 E3 FF F6 58 D8 7A 75 E8 BF C3 5F 5A 5B 53 52 57 56 E8 ED 11 75 80 80 CB 58 36 57 B4 02 F5 BE 00 F5 52 E4 26 04 F0 C3 04 C8 FC CD F8 AC F1 8A E8 FF C7 C2 E0 DB 03 33 26 03 F6 87 04 18 FD 75 BA 03 C8 A8 75 FA A8 74 8B FB C3 0A BE 00 03 1F E8 C2 7F D1 D1 D1 03 A0 04 DA 04 3C 74 E8 C1 ED 98 BD 20 92 83 50 F0 EB BD 20 0A 79 26 05 32 26 05 88 83 50 EA D9 EF 01 5B E8 FF EA DB 07 18 29 EB E8 00 0E 04 16 04 26 05 03 E2 5F E3 15 8B 85 8B 4A 8E 57 8A AC 88 03 E2 5F 8E 32 E8 C1 0F F1 E8 FE 2E 04 E5 E5 E5 0E 04 DA AC 80 E0 05 88 EB 26 3D D0 75 83 08 FD E5 83 08 D9 00 00 00 00 0B 74 50 5D 58 03 32 51 57 33 E8 C0 1C F6 87 04 18 D9 75 BA 03 E0 A8 75 FA A8 74 FB C4 47 DD 5F 59 00 00 00 00 00 00 00 50 B0 E8 BC C4 5A 75 F6 87 08 03 42 50 52 3E 04 74 A0 04 FB DB 32 E0 E7 0A A2 04 DF E3 80 08 E7 FB 06 04 74 32 E8 00 11 3E A0 04 FF 20 02 C7 06 04 74 24 80 01 02 20 66 24 0C 0A B3 E8 00 C3 02 0E 81 01 E8 00 C9 5A 58 E8 BD E8 E9 C3 8A EE 20 FB 8F 00 00 00 00 00 00 51 52 55 8B 8A 49 80 13 35 F3 E6 00 E6 FF 5E 24 24 24 24 7E 7E 7E 24 24 24 24 24 24 96 96 96 96 96 96 5A 80 5E 05 FB 75 E9 00 8E A1 04 E2 F8 FF 09 C7 F7 4C 03 8B D1 D1 D1 03 F6 81 07 B8 A0 D8 8B 00 EF FB 63 08 D2 BA 03 42 E0 0A 79 B8 18 EE 86 EE 0F 02 B2 EE 86 EE 1D 05 8A 80 0F 02 C4 42 E0 8A C6 FF 02 4A 42 E0 B8 00 CE EE 86 EE 08 4A 42 E0 FB 5D 5A 59 B5 D2 32 B1 B0 B4 2A BA 03 42 E0 8A 22 74 80 10 EB C9 E3 5E C6 01 EB 8A E8 00 00 8E 80 01 74 88 E8 BB B3 05 46 88 01 A5 EB 52 E0 D1 B8 01 E2 F8 8B 80 49 06 18 03 D1 E1 00 FA E0 03 2E 2C E1 E0 1C E7 01 D1 E1 00 FA D8 03 D2 8A 2E 0C E9 EF EF EF F7 01 74 81 00 BB B8 DB 7E 0D 0D 1D C4 74 32 88 EB 8A 22 D2 88 00 81 D5 DD C3 E9 4A D1 D1 D1 F7 03 83 00 F8 C2 C0 09 04 C8 09 EC C3 00 00 00 00 00 53 52 8A 62 E8 BD 08 E8 F4 5A 5B 3C 7F 74 3C 74 3C 74 3C 74 EB 32 C3 8B F7 1A C0 24 8C 39 1A 1B 06 04 74 52 51 57 E8 01 5F 59 5A 26 04 58 3A 84 75 E9 00 C6 0A 74 FE C3 7D 50 FF 58 2B E8 00 06 04 74 E8 BD 12 DA 8A FA A8 75 EC 01 FB C4 88 5A B4 EB E8 FA C2 16 04 0D D2 36 04 03 62 FE C3 8A 32 32 8B F7 4A 03 D1 8A 98 26 04 F0 BB B8 10 25 00 30 75 BB B0 C3 58 50 B0 E6 EB B0 E6 EB B0 E6 EB E4 EB 8A 0C E6 33 E2 33 E2 8A E6 FB C3 53 8A 62 53 3E 04 4B 74 32 EB 57 33 E8 BD 8B 07 B8 06 C9 36 04 16 04 CA 10 88 62 5A 58 F6 89 01 49 F6 F6 10 40 E8 B8 B8 05 CE E8 B9 00 80 63 D4 03 00 0E BE 4A C0 00 B9 00 F2 B8 4A 50 B8 20 CA 00 BA 03 F4 1F E8 B8 C4 74 B0 E8 B8 CC E8 B9 BA 03 0B EB 42 EB 24 0C EE E8 B0 EE 00 E8 EE 00 8E 33 8A 02 32 D1 33 32 8B 02 46 F9 BA 03 0B EB 42 06 0A 74 B7 EC 00 F9 C7 BA 46 0E CB 00 00 00 00 00 00 8A 4A A0 04 80 06 04 3E 04 00 00 00 00 00 00 00 50 55 52 53 C0 15 3E 04 74 E8 E5 5D 5B 5A 5D 58 3C 75 B3 EB 3C 74 EB 80 49 13 E3 FA DB 26 3D 13 47 C3 FB 7C B3 26 3D 03 5F DB 16 04 C2 EC C9 0A A8 75 E2 FE 75 8B BA 03 C3 EB 26 05 EB B0 EE D1 FE 80 10 D4 C9 0A A8 75 E2 FE 75 BA 03 11 EB 26 05 EB B0 EE 6E 3C 75 8A B3 E8 E4 CF 80 65 20 E4 08 E7 80 65 DF 74 E9 FF 07 07 E8 E4 3F 3C 75 B3 E8 E4 8A E9 FF 09 17 FA DB 8B 8A AA C3 FB 7C 75 B3 EB 3C 75 8A 8A 8B E8 E6 19 12 18 FA B7 E8 EE EB E8 E6 DD FB 21 E9 FE 13 34 06 04 4A CB 10 3F 0A 75 80 80 ED 03 E7 E9 FF E5 F6 80 07 E5 D0 D0 8A B3 E9 FF 15 0F C3 68 8B 5B 5A F4 A1 3C 75 8B E8 E6 92 3C 75 8A BA 03 BE EB 3C 75 BA 03 B6 5B D8 75 3C 75 B3 E8 E3 00 22 B3 E8 E3 E7 D1 C9 04 ED ED D9 E9 FE 1B B6 FF FB 20 77 8B 8B E8 E5 63 32 0B E8 E5 E2 E9 FF 00 3C 75 8B 85 8A 84 53 FF 77 FE 7F BB 00 03 0C C4 5B 8A 32 D1 2E AF 75 07 EF 53 52 55 3C 75 8A B0 BA 03 22 07 5F 59 58 3C 72 77 89 7C 8C 7E EB 3C 73 0A 74 B2 80 03 0B 19 07 FB 74 B2 2C 74 E8 00 0E 04 CA 16 04 2E 01 06 01 B3 E0 07 12 03 A9 04 A5 23 8A B9 01 D2 52 E0 5A E3 E8 E8 F6 10 03 43 B4 E8 E6 CA 0E BD 10 02 0C 08 10 74 B1 BD 1F 07 80 10 23 1E 04 FB E3 02 EF 05 EB 2E 04 04 ED 0E 04 E1 B8 12 80 20 0B 06 00 68 0E 00 80 30 68 06 04 74 32 C3 06 04 74 3C 77 80 89 6F 09 06 04 74 B4 0A 75 80 89 80 FC 75 B4 80 88 F0 26 04 A7 01 F1 0E 04 EB 0A 75 F6 87 02 B1 26 04 EB 3C 77 80 89 EF B2 FB 75 0A 75 F6 89 40 8F 52 80 CD 5A B0 F6 89 40 33 01 2F 02 0D 57 8B E8 00 5F EB 3C 75 06 52 C0 F2 BA 00 C7 5A 0E AA EB A8 74 E9 FF FB 75 80 89 F7 C0 05 0E 04 E9 FF FB 75 0A 75 B0 E8 B4 ED C0 76 EB 80 33 10 26 04 0A 75 80 89 02 D1 FB 75 80 87 FE C0 C3 0E 04 EB 80 36 A1 52 20 E7 F8 19 5A EB 51 AC E8 B4 E8 E4 C0 75 B9 FF 16 04 C2 EC 00 01 F9 C2 EC 10 8A 33 33 E8 E3 3A 59 02 C7 C9 50 BA 00 09 5A C4 08 89 B4 8C B6 C7 08 B0 8C 0A B0 E8 B3 58 80 10 CF 03 B7 BA 03 06 04 75 F6 87 02 22 13 26 04 F6 87 08 14 06 04 74 80 87 02 07 B7 BA 03 3E 04 16 04 26 04 08 88 8A 89 8A 87 80 87 F7 26 04 B4 CD F6 01 2C C3 74 B8 03 0E 04 F6 02 08 03 80 10 10 26 04 08 88 80 87 08 00 10 26 04 88 89 C3 57 08 F6 87 02 14 07 06 04 75 B7 E8 00 0D 06 09 06 04 75 B7 B8 1A 96 5F C3 53 1E 00 8E BB 03 D3 28 27 D2 88 3C 1F 5B C3 00 00 A8 75 0B 74 50 51 55 E0 8A 00 3C 7F 74 3C 74 3C 74 3C 75 51 F4 59 29 D2 25 E8 F8 EB 0A 74 FE EB F6 02 05 8A 00 50 09 69 58 E8 F8 E2 F6 01 03 C0 5D 59 58 00 00 00 00 00 51 06 0E 24 BB 00 41 26 75 26 0C ED E5 F8 E7 2E 95 51 1A 06 51 51 00 1A 5F C3 8A 3A 7D 32 D1 03 26 5C 80 00 08 1C FF FF 18 10 24 3C 75 F6 01 08 08 F6 01 02 FB 53 C0 3B 04 13 FB 3B 04 0B FB C6 40 EA FF A2 04 C3 00 00 0B 74 B8 00 53 57 51 B8 75 89 26 4D 83 04 3C 33 F3 83 3C 1E BE 04 A4 84 B9 00 A4 FE FD 00 E8 FF 89 83 02 DB 1E 04 E3 C3 75 8B 26 05 C7 BB 75 1E 04 8A 26 05 E8 B2 88 47 03 C4 E8 B1 E0 E8 E8 F8 C4 07 88 47 E7 EC C7 2C 88 47 1E 04 E3 8A 87 80 01 F7 B1 D2 0A E8 B1 C0 B0 E8 B1 08 E0 E0 C7 88 47 21 83 03 05 60 06 04 E8 88 47 D2 57 09 B9 00 8A 02 FF FF 74 2E 54 83 04 EC C8 C3 C3 03 CA 5F 26 15 1B E0 18 31 01 31 02 31 04 31 08 31 10 31 00 5E 5A C3 00 00 00 00 06 57 55 EC EC 89 FE 46 89 FA 3C 7C EB 80 A8 4F 81 07 0B 74 32 8B D1 BE 53 2E 10 0B 74 E8 DD 5E B0 B4 8B FE C4 5D 5F 07 8B FE D1 81 9A 2E 04 E0 E0 C0 02 C4 DC 5A 66 A0 23 69 5D A3 BE 53 5E D1 81 06 2E 30 E3 00 FF 2E 34 56 BE 53 03 5F 5E 03 F7 01 74 56 51 FF 59 5E EA C6 E2 C3 53 54 54 00 00 00 00 89 55 00 E8 01 54 E8 02 C3 26 7F BA 00 E3 5A 55 89 04 2E BA 03 14 42 26 85 01 C7 EC 01 8A BA 03 0A 74 FE AA C6 EC 33 B9 01 34 E8 DC C3 26 47 E8 B0 77 5D 56 BE 54 03 F7 01 74 56 51 FF 59 5E EA C6 E2 EB 83 90 A7 C3 23 E8 01 01 E8 00 56 8B FA 46 26 77 8C BA 00 51 5A C3 8B FA 46 26 7F 26 45 BA 03 33 B9 01 83 03 9F 5F 36 04 05 00 D8 D0 BA 03 8A 26 05 F0 68 FA C0 B0 EE C6 FB CE C9 05 C7 EB BA 03 8B 01 8B EC C5 C0 EE C3 57 83 00 0E 46 8E 8B FA 5C AC 08 1E 04 89 40 C4 E8 00 D3 16 BA 03 10 8B 83 06 BA 03 04 5E 1F 83 01 04 AA 02 EE 53 57 DF C7 BA 03 01 04 D4 BA 03 26 47 BA 03 26 47 8B 63 8B 83 0A 00 18 B4 BA 03 FB C7 B1 B5 51 B2 59 BA 03 C1 42 FB FE 3A 76 BA 03 FB C7 B1 B5 E8 AE 59 C3 51 8B FA 46 26 3F 8B 40 71 BA 03 8A 04 83 23 00 13 D9 66 8B FA C0 8A EE 8A 47 FB C1 CD E6 59 C3 56 00 8E BE FF 04 1F 53 57 C4 B0 E8 AD F8 02 0F A8 B0 E8 AD D8 04 07 9A BA 03 06 9F 8A 8B B0 B4 E8 AD 05 8F 8A B0 B4 E8 AD 04 81 8A 06 B8 A0 C0 FF AA 07 C7 51 ED 04 E5 58 E8 FF FE 80 03 EE BA 03 04 E3 42 B0 8A E8 AD CE B0 8A E8 AD 04 E1 2A 8B B0 E8 AD 59 C3 8E FC 5E 8B BA 03 04 07 0C BA 03 06 04 02 B0 32 E8 AC C6 51 C4 B5 B0 8A E8 AC 1D AC E5 FD 76 59 B0 B4 E8 AC 09 C3 53 52 56 06 FA 74 8E 33 8E AC 10 26 25 30 D1 E1 C4 05 10 24 AA 49 32 83 00 05 8B EB 2E 37 8A 02 A4 C3 2E 3F 75 07 5E 5A 5B C3 04 84 07 04 14 04 00 7C 04 01 FF FF F7 BC F1 63 FF F7 A3 F2 FF 00 00 00 00 C7 C0 00 00 00 54 55 56 57 58 59 5E 5F 70 FF 54 00 84 2B 10 64 2A 55 00 84 19 10 18 2A 56 00 84 2B 00 FC 2A 57 00 84 19 00 B0 2A 58 00 20 58 10 48 2A 59 00 20 58 00 8E 2A 5E 00 80 90 00 D4 2A 5F 00 80 E0 00 1A 2A 70 00 80 E0 00 1A 2A 84 10 20 03 02 9E 84 8A BF 00 0D 00 00 9C 8F 1F B9 FF 01 03 05 07 39 3B 3D 3F 00 01 00 00 10 00 00 00 00 00 00 00 84 09 40 03 02 9E 84 8A BF 00 07 00 00 9C 82 1F B9 FF 01 03 05 07 39 3B 3D 3F 00 01 00 00 10 00 00 00 00 00 00 00 84 10 20 03 02 9E 84 8A BF 00 0D 00 00 9C 8F 0F B9 FF 08 08 08 08 18 18 18 18 00 01 00 00 10 00 00 00 00 00 00 00 84 09 40 03 02 9E 84 8A BF 00 07 00 00 9C 82 07 B9 FF 08 08 08 08 18 18 18 18 00 01 00 00 10 00 00 00 00 00 00 00 64 08 FA 0F 06 7B 64 66 70 00 00 00 00 59 57 00 69 FF 01 03 05 07 39 3B 3D 3F 00 00 00 00 00 0F 00 00 00 64 08 FA 0F 06 7B 64 66 70 00 00 00 00 59 57 00 69 FF 3F 3F 3F 3F 3F 3F 3F 3F 00 00 00 00 00 0F 00 00 00 50 10 80 0F 0E 5F 50 54 BF 00 00 00 00 9C 8F 40 B9 FF 01 03 05 07 09 0B 0D 0F 00 00 00 00 40 0F 00 00 00 50 10 80 0F 0E 5F 50 54 0B 00 00 00 00 EA DF 40 04 FF 01 03 05 07 09 0B 0D 0F 00 00 00 00 40 0F 00 00 00 50 0E 10 03 03 5F 50 54 BF 00 0B 00 00 83 5D 0D BA FF FF FF FF FF FF FF FF FF 00 00 00 00 10 00 50 08 10 03 02 5F 50 54 BF 00 06 00 00 9C 8F 0F B9 FF 01 03 05 07 11 13 15 17 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 9C 8F 40 B9 FF 01 03 05 07 09 0B 0D 0F 00 00 00 00 40 0F 00 00 00 00 50 00 00 0F 06 5F 50 55 BF 00 00 00 00 9C 8F 1F B9 FF 00 00 00 00 00 00 00 3F 00 00 00 00 08 0F 50 00 00 0F 06 5F 50 55 BF 00 00 00 00 9C 8F 1F B9 FF 00 00 00 00 00 00 00 3F 00 00 00 00 08 0F 28 08 20 0F 06 2D 28 2B BF 00 00 00 00 9C 8F 00 B9 FF 01 03 05 07 11 13 15 17 00 00 00 00 00 0F 50 08 40 0F 06 5F 50 54 BF 00 00 00 00 9C 8F 00 B9 FF 01 03 05 07 11 13 15 17 00 00 00 00 00 0F 50 0E 80 0F 00 60 56 50 70 00 00 00 00 5E 5D 00 6E FF 08 00 18 00 08 00 18 00 00 00 00 00 10 0F 50 0E 80 0F 00 5B 53 50 6C 00 00 00 00 5E 5D 0F 0A FF 01 00 07 00 01 00 07 00 00 00 00 00 10 0F 50 0E 80 0F 06 5F 50 54 BF 00 00 00 00 83 5D 0F BA FF 08 00 18 00 08 00 18 00 00 00 00 00 00 05 50 0E 80 0F 06 5F 50 54 BF 00 00 00 00 83 5D 0F BA FF 01 03 05 07 39 3B 3D 3F 00 00 00 00 00 0F 28 0E 08 03 02 2D 28 2B BF 00 0B 00 00 83 5D 1F BA FF 01 03 05 07 39 3B 3D 3F 00 00 00 00 10 00 28 0E 08 03 02 2D 28 2B BF 00 0B 00 00 83 5D 1F BA FF 01 03 05 07 39 3B 3D 3F 00 00 00 00 10 00 50 0E 10 03 02 5F 50 55 BF 00 0B 00 00 83 5D 1F BA FF 01 03 05 07 39 3B 3D 3F 00 00 00 00 10 00 50 0E 10 03 02 5F 50 55 BF 00 0B 00 00 83 5D 1F BA FF 01 03 05 07 39 3B 3D 3F 00 00 00 00 10 00 28 10 08 03 02 2D 28 2B BF 00 0D 00 00 9C 8F 1F B9 FF 01 03 05 07 39 3B 3D 3F 00 08 00 00 10 00 50 10 10 03 02 5F 50 55 BF 00 0D 00 00 9C 8F 1F B9 FF 01 03 05 07 39 3B 3D 3F 00 08 00 00 10 00 50 10 10 03 02 5F 50 55 BF 00 0D 00 00 9C 8F 0F B9 FF 08 08 08 08 18 18 18 18 00 08 00 00 10 00 50 10 A0 0F 06 5F 50 54 0B 00 00 00 00 EA DF 00 04 FF 3F 3F 3F 3F 3F 3F 3F 3F 00 00 00 00 00 01 50 10 A0 0F 06 5F 50 54 0B 00 00 00 00 EA DF 00 04 FF 01 03 05 07 39 3B 3D 3F 00 00 00 00 00 0F 28 08 20 0F 0E 5F 50 54 BF 00 00 00 00 9C 8F 40 B9 FF 01 03 05 07 09 0B 0D 0F 00 00 00 00 40 0F FF FF FF FF 10 10 10 FF 3D 10 10 10 10 10 10 10 10 3D 3D 10 E8 00 00 00 00 00 00 00 10 00 00 00 00 00 E8 00 00 00 00 00 00 00 2A 00 00 00 00 00 1A 44 00 00 00 00 00 00 00 00 00 00 00 1A 44 00 00 00 00 00 00 00 00 00 00 00 10 08 00 00 00 02 00 04 00 02 00 01 05 00 01 00 02 06 FF 0F 00 00 02 FF 00 3F 2C 2D 2A 1E 08 08 01 01 00 00 00 04 02 01 10 10 10 10 04 04 02 00 00 00 00 00 00 10 10 00 10 02 10 00 B8 B8 B8 B8 00 00 00 A0 A0 A0 00 55 AA FF 01 04 10 40 03 30 00 08 10 00 10 10 3D 3D 10 10 10 10 3D 3D 00 19 00 04 01 05 20 24 21 25 08 0C 09 0D 28 2C 29 2D 02 06 03 07 22 26 23 27 0A 0E 0B 0F 2A 2E 2B 2F 00 11 08 25 02 1B 0F 28 0C 25 14 32 0F 27 1B 34 06 1F 13 2C 09 21 15 2E 13 2B 1F 38 0E 2D 20 38 00 04 01 09 00 04 01 09 2A 2E 2B 2F 2A 2E 2B 2F 00 04 01 09 00 04 01 09 2A 2E 2B 2F 2A 2E 2B 2F 00 11 08 14 00 11 08 14 0E 2D 20 38 0E 2D 20 38 00 11 08 14 00 11 08 14 0E 2D 20 38 0E 2D 20 38 00 00 00 00 15 15 15 15 15 15 15 15 3F 3F 3F 3F 00 00 00 00 15 15 15 15 15 15 15 15 3F 3F 3F 3F 00 04 01 09 2A 2E 2B 2F 00 11 08 14 0E 2D 20 38 00 08 0E 14 1C 24 2D 38 00 3F 00 1F 3F 00 3F 3F 00 3F 1F 00 1F 3F 1F 2F 3F 1F 3F 3F 1F 3F 2F 1F 2D 3F 2D 36 3F 2D 3F 3F 2D 3F 36 2D 00 1C 00 0E 1C 00 1C 1C 00 1C 0E 00 0E 1C 0E 15 1C 0E 1C 1C 0E 1C 15 0E 14 1C 14 18 1C 14 1C 1C 14 1C 18 14 00 10 00 08 10 00 10 10 00 10 08 00 08 10 08 0C 10 08 10 10 08 10 0C 08 0B 10 0B 0D 10 0B 10 10 0B 10 0D 0B 10 12 10 12 10 12 00 12 00 2D 00 16 10 00 10 14 00 14 00 2D 00 14 00 2D 10 04 00 04 00 10 00 04 00 10 49 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 0C 00 50 03 50 00 00 52 D2 E4 17 F6 29 B0 E8 FF 05 0A E8 C3 FF 00 5A 02 10 5A 5B CF 50 51 1E D2 DA 3E 05 74 C6 00 01 3E 04 03 10 E8 FF CC F6 D2 02 10 08 10 C0 02 20 9E 75 FE 3A 4A 75 E8 FF A8 C6 36 04 D6 C0 9E 00 00 68 28 02 69 A8 04 69 28 06 6A 28 0A 6B A8 0C 6B 28 0E 6C E8 40 6D E8 42 6E 68 47 6A 28 50 6D A8 81 6E E8 83 6E 28 88 6A 68 D2 6F 28 08 08 03 02 2D 28 2B BF 00 06 00 00 9C 8F 1F B9 FF 01 03 05 07 11 13 15 17 00 00 00 00 10 00 28 08 08 03 02 2D 28 2B BF 00 06 00 00 9C 8F 1F B9 FF 01 03 05 07 11 13 15 17 00 00 00 00 10 00 50 08 10 03 02 5F 50 55 BF 00 06 00 00 9C 8F 1F B9 FF 01 03 05 07 11 13 15 17 00 00 00 00 10 00 50 08 10 03 02 5F 50 55 BF 00 06 00 00 9C 8F 1F B9 FF 01 03 05 07 11 13 15 17 00 00 00 00 10 00 28 08 40 03 02 2D 28 2B BF 00 00 00 00 9C 8F 00 B9 FF 13 17 04 07 11 13 15 17 00 00 00 00 30 00 28 08 40 03 02 2D 28 2B BF 00 00 00 00 9C 8F 00 B9 FF 13 17 04 07 11 13 15 17 00 00 00 00 30 00 50 08 40 01 06 5F 50 54 BF 00 00 00 00 9C 8F 00 B9 FF 17 17 17 17 17 17 17 17 00 00 00 00 00 00 50 0E 10 03 03 5F 50 55 BF 00 0B 00 00 83 5D 0D BA FF 08 08 08 08 18 18 18 18 00 08 00 00 10 00 50 10 7D 0F 06 5F 50 55 BF 00 00 00 00 9C 8F 1F B9 FF 01 03 05 07 39 3B 3D 3F 00 00 00 00 00 0F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 28 08 40 00 03 37 2D 31 04 00 06 00 00 E1 C7 08 F0 FF 01 03 05 07 11 13 15 17 00 00 00 00 10 00 50 00 00 0F 06 5F 50 55 BF 00 00 00 00 9C 8F 1F B9 FF 00 00 00 00 00 00 00 3F 00 00 00 00 08 0F 50 00 00 0F 06 5F 50 55 BF 00 00 00 00 9C 8F 1F B9 FF 00 00 00 00 00 00 00 3F 00 00 00 00 08 0F 28 08 20 0F 06 2D 28 2B BF 00 00 00 00 9C 8F 00 B9 FF 01 03 05 07 11 13 15 17 00 00 00 00 00 0F 50 08 40 0F 06 5F 50 54 BF 00 00 00 00 9C 8F 00 B9 FF 01 03 05 07 11 13 15 17 00 00 00 00 00 0F 50 0E 80 0F 00 60 56 50 70 00 00 00 00 5E 5D 00 6E FF 08 00 18 00 08 00 18 00 00 00 00 00 10 0F 50 0E 80 0F 00 5B 53 50 6C 00 00 00 00 5E 5D 0F 0A FF 01 00 07 00 01 00 07 00 00 00 00 00 10 0F 50 0E 80 0F 06 5F 50 54 BF 00 00 00 00 83 5D 0F BA FF 08 00 18 00 08 00 18 00 00 00 00 00 00 05 50 0E 80 0F 06 5F 50 54 BF 00 00 00 00 83 5D 0F BA FF 01 03 05 07 39 3B 3D 3F 00 00 00 00 00 0F 28 0E 08 03 02 2D 28 2B BF 00 0B 00 00 83 5D 1F BA FF 01 03 05 07 39 3B 3D 3F 00 00 00 00 10 00 28 0E 08 03 02 2D 28 2B BF 00 0B 00 00 83 5D 1F BA FF 01 03 05 07 39 3B 3D 3F 00 00 00 00 10 00 50 0E 10 03 02 5F 50 55 BF 00 0B 00 00 83 5D 1F BA FF 01 03 05 07 39 3B 3D 3F 00 00 00 00 10 00 50 0E 10 03 02 5F 50 55 BF 00 0B 00 00 83 5D 1F BA FF 01 03 05 07 39 3B 3D 3F 00 00 00 00 10 00 28 10 08 03 02 2D 28 2B BF 00 0D 00 00 9C 8F 1F B9 FF 01 03 05 07 39 3B 3D 3F 00 08 00 00 10 00 50 10 10 03 02 5F 50 55 BF 00 0D 00 00 9C 8F 1F B9 FF 01 03 05 07 39 3B 3D 3F 00 08 00 00 10 00 50 10 10 03 02 5F 50 55 BF 00 0D 00 00 9C 8F 0F B9 FF 08 08 08 08 18 18 18 18 00 08 00 00 10 00 50 10 A0 0F 06 5F 50 54 0B 00 00 00 00 EA DF 00 04 FF 3F 3F 3F 3F 3F 3F 3F 3F 00 00 00 00 00 01 50 10 A0 0F 06 5F 50 54 0B 00 00 00 00 EA DF 00 04 FF 01 03 05 07 39 3B 3D 3F 00 00 00 00 00 0F 28 08 20 0F 0E 5F 50 54 BF 00 00 00
AA EB 37 30 30 2F 33 38 2D 38 30 3A 30 A8 00 42 20 4F 50 54 42 45 00 00 00 00 30 33 35 2D 30 43 50 52 47 54 50 52 44 53 20 59 54 4D 20 4E 2E 31 38 2C 39 38 20 4C 20 49 48 53 52 53 52 45 56 41 59 00 38 2D 1F 19 02 06 00 00 71 5A 1F 19 02 06 00 00 38 2D 7F 64 02 00 00 00 61 52 19 19 02 0B 00 00 E9 00 00 00 00 00 55 F6 DE 32 01 CD C7 40 D0 8C 42 C7 08 65 C7 0A 00 C7 B4 B0 8C B6 C7 7C 10 8C 7E C7 0C 10 8C 0E C7 74 85 8C 76 32 BA 03 E8 01 06 04 C6 89 11 0C E8 02 9F B0 E8 02 47 50 4B E8 31 80 07 FC 74 80 02 09 0F E8 02 04 E8 00 0E 04 5D DB 02 DD FB 0E E8 03 19 32 E8 02 00 83 23 EF BB 00 25 E9 2F 91 BE 03 06 04 74 BE 03 36 04 30 E8 FF DB 39 F6 89 01 03 90 53 D3 F6 89 01 09 FF 05 73 EB E8 4E DA 5B E7 C3 01 51 CC E8 01 FE C2 D9 BA 03 CF 75 E8 00 BC B8 00 1B CC E8 01 01 C2 B9 BA 03 AF 75 E8 00 07 80 89 FE 42 92 59 C3 0F BA 03 9D B0 32 3C 75 E8 01 E4 E8 01 C0 0F EB 0A 81 53 E4 50 CE E8 01 50 89 50 FC 7F 80 89 FB A7 EB 80 89 04 CD 58 89 58 FC 74 80 06 08 7F B7 E8 34 C3 C8 AA C7 A8 D8 3D C0 0D 00 75 C7 A8 F4 EB C3 0E 04 80 87 02 80 10 10 36 04 C3 0F FF 42 FF 8A B0 E8 00 F5 3C B0 75 B0 E8 00 E7 86 E8 00 FC C3 B2 53 FF CE B9 00 4C E8 4C 10 26 04 B9 00 68 E8 4C 33 01 BE 78 95 74 80 89 06 05 BE 78 85 EB 80 87 08 0E 04 5B CF 53 05 BE 78 6B 5B 06 CB E8 46 F6 87 02 05 B8 EB BA 03 65 EE 50 16 7D 58 02 E8 00 0E 71 33 BA 4A C3 2C 8A EE 8A EE FE 3A 7E C3 0F CE E8 00 E0 E8 00 E0 C3 C3 32 BA 03 BA 03 B9 03 C9 EB EE FB 00 00 00 00 00 00 00 00 EB C3 EB C3 F5 42 C4 EF 4A C4 E8 FF E8 FF C3 BA 46 DB 5A 50 9D 5A D6 E6 1E 50 91 5A E6 14 B0 E8 FF B8 05 BF 58 BA 03 B8 E8 FF 50 C2 CE E8 FF EB B8 00 E9 B8 00 E4 C1 8A E8 FF FE 3A 7E C3 8A E8 FF FE 3A 7E C3 51 41 B9 FF A8 E1 0B 59 C3 51 2F B9 FF A8 E0 59 EB 8A E8 FF C3 C3 C4 E7 4B C3 16 04 C2 E8 FF C2 24 C3 26 04 B0 E8 FF E8 06 04 02 DB D0 08 88 C3 00 00 00 49 BB 00 5E E8 2C 17 06 04 75 3C 74 E8 2C 06 00 B9 00 3C 74 3C 74 BB 00 E0 3C 74 3C 74 3C 75 BB 00 90 C3 21 72 0E 2E 7F C3 00 E8 2C A5 51 06 E3 0A BB 68 80 FF 0E 3A 74 83 03 F0 03 01 EF 68 B0 2E 25 E8 37 47 C0 0F F1 57 74 E8 2C 22 F6 03 74 2E 7F 83 40 0F 2B F6 80 0A 80 04 75 83 06 16 04 C2 EC C0 B0 E8 FE B0 5F C4 B8 01 3F BB 00 C3 8A 04 33 43 FB 7E B2 26 45 81 B4 75 24 E8 FE DA 01 02 BA C0 07 E8 FE C0 C0 FD B2 B8 03 FD 8B B8 00 F5 BB 00 C3 8A 0A E9 43 FB 7E E8 FE 10 E8 2A 12 E8 2A 13 E8 2A CE BB 00 C3 8A 37 BF 43 FB 7E B0 E8 FD C4 74 80 4A 84 1A C4 B8 01 9F B8 00 01 97 BB 00 00 77 C3 DD 73 E8 FE E3 60 FE 78 BB 57 CC 0A 68 FE 78 BB 57 80 FF 11 C2 2E 07 FE 03 02 FE 4D 43 80 FF 1C D6 11 E8 FD 80 FF 0E 8A 2E 67 E8 FD 43 EC 8B 63 E8 FE D6 C2 32 BB 00 05 00 00 00 FC 76 CD CF FC 76 1E B8 F0 D8 80 FE FA 74 CD CF 6D FC 1E 33 8E 86 8B 86 81 FF D1 2E 94 06 1F 5E 1F 90 36 3D 3E 3E 3E 3E 3E 3E 43 44 46 46 47 47 49 4B 4B 4D 4E 51 06 06 06 06 06 06 51 52 53 00 8A 32 D1 8B 50 5B 80 49 02 05 3E 04 C3 49 3C 74 3C C3 16 04 EE 86 EE C3 81 03 D0 2E 97 07 C3 00 55 AA FF 25 50 C6 E4 F6 FA 26 04 FF 8B 95 A4 B5 C6 B3 03 D1 8A 98 26 04 F8 C3 E0 E0 F8 3E 04 74 D1 58 F7 85 03 8A 98 26 04 F8 C3 26 04 F8 7B 75 8B A9 FE 0B E7 01 EC 09 2D D1 D1 D1 58 B0 BA 03 65 B0 BA 03 5D D1 D1 8B 02 34 00 00 00 00 00 00 00 00 00 00 81 81 99 7E FF FF E7 7E FE FE 38 00 38 FE 38 00 7C FE 7C 7C 10 7C 7C 7C 00 3C 18 00 FF C3 E7 FF 3C 42 66 00 C3 BD 99 FF 07 7D CC 78 66 66 18 18 33 30 70 E0 63 63 67 C0 5A E7 3C 99 E0 FE E0 00 0E FE 0E 00 3C 18 7E 18 66 66 00 00 DB 7B 1B 00 63 6C 38 78 00 00 7E 00 3C 18 3C FF 3C 18 18 00 18 18 3C 00 18 FE 18 00 30 FE 30 00 00 C0 FE 00 24 FF 24 00 18 7E FF 00 FF 7E 18 00 00 00 00 00 78 30 00 00 6C 00 00 00 6C 6C 6C 00 7C 78 F8 00 C6 18 66 00 6C 76 CC 00 60 00 00 00 30 60 30 00 30 18 30 00 66 FF 66 00 30 FC 30 00 00 00 30 60 00 FC 00 00 00 00 30 00 0C 30 C0 00 C6 DE E6 00 70 30 30 00 CC 38 CC 00 CC 38 CC 00 3C CC 0C 00 C0 0C CC 00 60 F8 CC 00 CC 18 30 00 CC 78 CC 00 CC 7C 18 00 30 00 30 00 30 00 30 60 30 C0 30 00 00 00 FC 00 30 0C 30 00 CC 18 00 00 C6 DE C0 00 78 CC CC 00 66 7C 66 00 66 C0 66 00 6C 66 6C 00 62 78 62 00 62 78 60 00 66 C0 66 00 CC FC CC 00 30 30 30 00 0C 0C CC 00 66 78 66 00 60 60 66 00 EE FE C6 00 E6 DE C6 00 6C C6 6C 00 66 7C 60 00 CC CC 78 00 66 7C 66 00 CC 70 CC 00 B4 30 30 00 CC CC CC 00 CC CC 78 00 C6 D6 EE 00 C6 38 6C 00 CC 78 30 00 C6 18 66 00 60 60 60 00 60 18 06 00 18 18 18 00 38 C6 00 00 00 00 00 FF 30 00 00 00 00 0C CC 00 60 7C 66 00 00 CC CC 00 0C 7C CC 00 00 CC C0 00 6C F0 60 00 00 CC 7C F8 60 76 66 00 00 30 30 00 00 0C CC 78 60 6C 6C 00 30 30 30 00 00 FE D6 00 00 CC CC 00 00 CC CC 00 00 66 7C F0 00 CC 7C 1E 00 76 60 00 00 C0 0C 00 30 30 34 00 00 CC CC 00 00 CC 78 00 00 D6 FE 00 00 6C 6C 00 00 CC 7C F8 00 98 64 00 30 E0 30 00 18 00 18 00 30 1C 30 00 DC 00 00 00 10 6C C6 00 CC CC 18 78 CC CC CC 00 00 CC C0 00 C3 06 66 00 00 0C CC 00 00 0C CC 00 30 0C CC 00 00 C0 78 38 C3 66 60 00 00 CC C0 00 00 CC C0 00 00 30 30 00 C6 18 18 00 00 30 30 00 38 C6 C6 00 30 78 FC 00 00 60 60 00 00 0C CC 00 6C FE CC 00 CC 78 CC 00 CC 78 CC 00 E0 78 CC 00 CC CC CC 00 E0 CC CC 00 CC CC 7C F8 18 66 3C 00 00 CC CC 00 18 C0 7E 18 6C F0 E6 00 CC FC FC 30 CC FA CF C7 1B 3C 18 70 00 0C CC 00 00 30 30 00 1C 78 CC 00 1C CC CC 00 F8 F8 CC 00 00 EC DC 00 6C 3E 7E 00 6C 38 7C 00 00 60 CC 00 00 FC C0 00 00 FC 0C 00 C6 DE 66 0F C6 DB 6F 03 18 18 18 00 33 CC 33 00 CC 33 CC 00 88 88 88 88 AA AA AA AA 77 EE 77 EE 18 18 18 18 18 18 18 18 18 18 18 18 36 36 36 36 00 00 36 36 00 18 18 18 36 06 36 36 36 36 36 36 00 06 36 36 36 06 00 00 36 36 00 00 18 18 00 00 00 00 18 18 18 18 00 00 18 18 00 00 00 00 18 18 18 18 18 18 00 00 00 00 18 18 18 18 18 18 18 18 36 36 36 36 36 30 00 00 00 30 36 36 36 00 00 00 00 00 36 36 36 30 36 36 00 00 00 00 36 00 36 36 18 00 00 00 36 36 00 00 00 00 18 18 00 00 36 36 36 36 00 00 18 18 00 00 00 18 18 18 00 00 36 36 36 36 36 36 18 18 18 18 18 18 00 00 00 00 18 18 FF FF FF FF 00 00 FF FF F0 F0 F0 F0 0F 0F 0F 0F FF FF 00 00 00 DC DC 00 78 F8 F8 C0 FC C0 C0 00 FE 6C 6C 00 CC 30 CC 00 00 D8 D8 00 66 66 7C C0 76 18 18 00 30 CC 78 FC 6C FE 6C 00 6C C6 6C 00 30 7C CC 00 00 DB 7E 00 0C DB 7E C0 60 F8 60 00 CC CC CC 00 FC FC FC 00 30 30 00 00 30 30 00 00 30 30 00 00 1B 18 18 18 18 18 D8 70 30 FC 30 00 76 00 DC 00 6C 38 00 00 00 18 00 00 00 00 00 00 0C 0C 6C 1C 6C 6C 00 00 18 60 00 00 00 3C 3C 00 00 00 00 00 00 00 00 00 00 00 00 00 81 81 BD 81 00 00 00 FF FF C3 FF 00 00 00 6C FE FE 38 00 00 00 10 7C 7C 10 00 00 00 3C E7 E7 18 00 00 00 3C FF 7E 18 00 00 00 00 18 3C 00 00 00 FF FF E7 C3 FF FF FF 00 00 66 42 3C 00 00 FF FF 99 BD C3 FF FF 00 0E 32 CC CC 00 00 00 66 66 18 18 00 00 00 33 30 30 F0 00 00 00 63 63 63 E7 C0 00 00 18 3C 3C 18 00 00 00 C0 F8 F8 C0 00 00 00 06 3E 3E 06 00 00 00 3C 18 18 3C 00 00 00 66 66 66 66 00 00 00 DB DB 1B 1B 00 00 7C 60 6C C6 38 C6 00 00 00 00 00 FE 00 00 00 3C 18 18 3C 7E 00 00 3C 18 18 18 00 00 00 18 18 18 3C 00 00 00 00 0C 0C 00 00 00 00 00 60 60 00 00 00 00 00 C0 C0 00 00 00 00 00 6C 6C 00 00 00 00 10 38 7C FE 00 00 00 FE 7C 38 10 00 00 00 00 00 00 00 00 00 00 3C 3C 18 18 00 00 66 66 00 00 00 00 00 00 6C 6C 6C 6C 00 00 18 C6 C0 06 C6 18 00 00 00 C6 18 66 00 00 00 6C 38 DC CC 00 00 30 30 00 00 00 00 00 00 18 30 30 18 00 00 00 18 0C 0C 18 00 00 00 00 3C 3C 00 00 00 00 00 18 18 00 00 00 00 00 00 00 18 30 00 00 00 00 00 00 00 00 00 00 00 00 18 00 00 00 06 18 60 80 00 00 00 C6 DE E6 C6 00 00 00 38 18 18 18 00 00 00 C6 0C 30 C6 00 00 00 C6 06 06 C6 00 00 00 1C 6C FE 0C 00 00 00 C0 C0 06 C6 00 00 00 60 C0 C6 C6 00 00 00 C6 0C 30 30 00 00 00 C6 C6 C6 C6 00 00 00 C6 C6 06 0C 00 00 00 18 00 00 18 00 00 00 18 00 00 18 00 00 00 0C 30 30 0C 00 00 00 00 7E 00 00 00 00 00 30 0C 0C 30 00 00 00 C6 0C 18 18 00 00 00 C6 DE DE C0 00 00 00 38 C6 FE C6 00 00 00 66 66 66 66 00 00 00 66 C0 C0 66 00 00 00 6C 66 66 6C 00 00 00 66 68 68 66 00 00 00 66 68 68 60 00 00 00 66 C0 DE 66 00 00 00 C6 C6 C6 C6 00 00 00 18 18 18 18 00 00 00 0C 0C 0C CC 00 00 00 66 6C 6C 66 00 00 00 60 60 60 66 00 00 00 EE FE C6 C6 00 00 00 E6 FE CE C6 00 00 00 6C C6 C6 6C 00 00 00 66 66 60 60 00 00 00 C6 C6 D6 7C 0E 00 00 66 66 6C 66 00 00 00 C6 60 0C C6 00 00 00 7E 18 18 18 00 00 00 C6 C6 C6 C6 00 00 00 C6 C6 C6 38 00 00 00 C6 C6 D6 7C 00 00 00 C6 38 38 C6 00 00 00 66 66 18 18 00 00 00 C6 18 60 C6 00 00 00 30 30 30 30 00 00 00 C0 70 1C 06 00 00 00 0C 0C 0C 0C 00 00 38 C6 00 00 00 00 00 00 00 00 00 00 00 00 30 00 00 00 00 00 00 00 00 78 7C CC 00 00 00 60 78 66 66 00 00 00 00 7C C0 C6 00 00 00 0C 3C CC CC 00 00 00 00 7C FE C6 00 00 00 6C 60 60 60 00 00 00 00 76 CC 7C CC 00 00 60 6C 66 66 00 00 00 18 38 18 18 00 00 00 06 0E 06 06 66 00 00 60 66 78 66 00 00 00 18 18 18 18 00 00 00 00 EC D6 D6 00 00 00 00 DC 66 66 00 00 00 00 7C C6 C6 00 00 00 00 DC 66 7C 60 00 00 00 76 CC 7C 0C 00 00 00 DC 66 60 00 00 00 00 7C 70 C6 00 00 00 30 FC 30 36 00 00 00 00 CC CC CC 00 00 00 00 66 66 3C 00 00 00 00 C6 D6 FE 00 00 00 00 C6 38 6C 00 00 00 00 C6 C6 7E 0C 00 00 00 FE 18 66 00 00 00 18 18 18 18 00 00 00 18 18 18 18 00 00 00 18 18 18 18 00 00 00 DC 00 00 00 00 00 00 00 38 C6 FE 00 00 00 66 C0 C2 3C 06 00 00 CC CC CC CC 00 00 0C 30 7C FE C6 00 00 10 6C 78 7C CC 00 00 00 CC 78 7C CC 00 00 60 18 78 7C CC 00 00 38 38 78 7C CC 00 00 00 00 66 66 0C 3C 00 10 6C 7C FE C6 00 00 00 CC 7C FE C6 00 00 60 18 7C FE C6 00 00 00 66 38 18 18 00 00 18 66 38 18 18 00 00 60 18 38 18 18 00 00 C6 10 6C C6 C6 00 00 6C 00 6C C6 C6 00 00 30 00 66 7C 66 00 00 00 00 76 7E D8 00 00 00 6C CC CC CC 00 00 10 6C 7C C6 C6 00 00 00 C6 7C C6 C6 00 00 60 18 7C C6 C6 00 00 30 CC CC CC CC 00 00 60 18 CC CC CC 00 00 00 C6 C6 C6 7E 0C 00 C6 38 C6 C6 6C 00 00 C6 00 C6 C6 C6 00 00 18 3C 60 66 18 00 00 38 64 F0 60 E6 00 00 00 66 18 18 18 00 00 F8 CC C4 DE CC 00 00 0E 18 18 18 18 D8 00 18 60 78 7C CC 00 00 0C 30 38 18 18 00 00 18 60 7C C6 C6 00 00 18 60 CC CC CC 00 00 00 DC DC 66 66 00 00 DC C6 F6 DE C6 00 00 3C 6C 00 00 00 00 00 38 6C 00 00 00 00 00 00 30 30 60 C6 00 00 00 00 00 C0 C0 00 00 00 00 00 06 06 00 00 C0 C6 D8 60 86 18 00 C0 C6 D8 66 9E 06 00 00 18 18 3C 3C 00 00 00 00 6C 6C 00 00 00 00 00 6C 6C 00 00 00 44 44 44 44 44 44 44 AA AA AA AA AA AA AA 77 77 77 77 77 77 77 18 18 18 18 18 18 18 18 18 18 F8 18 18 18 18 18 F8 F8 18 18 18 36 36 36 F6 36 36 36 00 00 00 FE 36 36 36 00 00 F8 F8 18 18 18 36 36 F6 F6 36 36 36 36 36 36 36 36 36 36 00 00 FE F6 36 36 36 36 36 F6 FE 00 00 00 36 36 36 FE 00 00 00 18 18 F8 F8 00 00 00 00 00 00 F8 18 18 18 18 18 18 1F 00 00 00 18 18 18 FF 00 00 00 00 00 00 FF 18 18 18 18 18 18 1F 18 18 18 00 00 00 FF 00 00 00 18 18 18 FF 18 18 18 18 18 1F 1F 18 18 18 36 36 36 37 36 36 36 36 36 37 3F 00 00 00 00 00 3F 37 36 36 36 36 36 F7 FF 00 00 00 00 00 FF F7 36 36 36 36 36 37 37 36 36 36 00 00 FF FF 00 00 00 36 36 F7 F7 36 36 36 18 18 FF FF 00 00 00 36 36 36 FF 00 00 00 00 00 FF FF 18 18 18 00 00 00 FF 36 36 36 36 36 36 3F 00 00 00 18 18 1F 1F 00 00 00 00 00 1F 1F 18 18 18 00 00 00 3F 36 36 36 36 36 36 FF 36 36 36 18 18 FF FF 18 18 18 18 18 18 F8 00 00 00 00 00 00 1F 18 18 18 FF FF FF FF FF FF FF 00 00 00 FF FF FF FF F0 F0 F0 F0 F0 F0 F0 0F 0F 0F 0F 0F 0F 0F FF FF FF 00 00 00 00 00 00 76 D8 DC 00 00 00 00 C6 C6 FC C0 00 00 C6 C0 C0 C0 00 00 00 00 6C 6C 6C 00 00 00 C6 30 30 C6 00 00 00 00 7E D8 D8 00 00 00 00 66 66 60 C0 00 00 00 DC 18 18 00 00 00 18 66 66 18 00 00 00 6C C6 C6 6C 00 00 00 6C C6 6C 6C 00 00 00 30 0C 66 66 00 00 00 00 7E DB 00 00 00 00 06 DB F3 60 00 00 00 30 60 60 30 00 00 00 7C C6 C6 C6 00 00 00 FE 00 00 FE 00 00 00 18 7E 18 00 00 00 00 18 06 18 00 00 00 00 18 60 18 00 00 00 00 1B 18 18 18 18 18 18 18 18 18 D8 00 00 00 18 00 00 18 00 00 00 00 DC 76 00 00 00 38 6C 00 00 00 00 00 00 00 00 18 00 00 00 00 00 00 18 00 00 00 0F 0C 0C EC 3C 00 00 D8 6C 6C 00 00 00 00 70 30 C8 00 00 00 00 00 00 7C 7C 7C 00 00 00 00 00 00 00 00 00 00 00 24 FF 24 00 00 22 63 63 00 00 00 00 00 00 00 18 FF 18 00 00 2D 00 00 00 00 00 00 00 00 C3 FF C3 C3 C3 00 54 00 DB 18 18 18 00 00 00 C3 C3 C3 66 18 00 57 00 C3 C3 DB 66 00 00 00 C3 66 18 66 C3 00 59 00 C3 66 18 18 00 00 00 FF 86 18 61 FF 00 6D 00 00 E6 DB DB 00 00 00 00 00 C3 66 18 00 77 00 00 C3 DB FF 00 00 00 00 6E 1B D8 77 00 9B 18 7E C0 C3 18 00 00 00 C3 3C FF FF 18 00 9E FC 66 62 6F 66 00 00 00 18 18 18 18 FF 00 F6 00 18 00 00 18 00 00 00 00 00 00 00 00 00 00 00 7E A5 81 99 81 00 00 00 7E DB FF E7 FF 00 00 00 00 6C FE FE 38 00 00 00 00 10 7C 7C 10 00 00 00 00 3C E7 E7 18 00 00 00 00 3C FF 7E 18 00 00 00 00 00 18 3C 00 00 00 FF FF FF E7 C3 FF FF FF 00 00 00 66 42 3C 00 00 FF FF FF 99 BD C3 FF FF 00 1E 1A 78 CC CC 00 00 00 3C 66 66 18 18 00 00 00 3F 3F 30 30 F0 00 00 00 7F 7F 63 63 E7 C0 00 00 00 18 3C 3C 18 00 00 00 C0 F0 FE F0 C0 00 00 00 06 1E FE 1E 06 00 00 00 18 7E 18 7E 18 00 00 00 66 66 66 66 66 00 00 00 7F DB 7B 1B 1B 00 00 00 C6 38 C6 6C 0C 7C 00 00 00 00 00 FE FE 00 00 00 18 7E 18 7E 18 00 00 00 18 7E 18 18 18 00 00 00 18 18 18 18 3C 00 00 00 00 00 0C 0C 00 00 00 00 00 00 60 60 00 00 00 00 00 00 C0 C0 00 00 00 00 00 00 6C 6C 00 00 00 00 00 10 38 7C FE 00 00 00 00 FE 7C 38 10 00 00 00 00 00 00 00 00 00 00 00 18 3C 18 18 18 00 00 00 66 24 00 00 00 00 00 00 00 6C 6C 6C 6C 00 00 18 7C C2 7C 06 C6 18 00 00 00 C2 0C 30 C6 00 00 00 38 6C 76 CC CC 00 00 00 30 60 00 00 00 00 00 00 0C 30 30 30 18 00 00 00 30 0C 0C 0C 18 00 00 00 00 00 3C 3C 00 00 00 00 00 00 18 18 00 00 00 00 00 00 00 00 18 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 18 00 00 00 00 02 0C 30 C0 00 00 00 38 C6 D6 C6 6C 00 00 00 18 78 18 18 18 00 00 00 7C 06 18 60 C6 00 00 00 7C 06 3C 06 C6 00 00 00 0C 3C CC 0C 0C 00 00 00 FE C0 FC 06 C6 00 00 00 38 C0 FC C6 C6 00 00 00 FE 06 0C 30 30 00 00 00 7C C6 7C C6 C6 00 00 00 7C C6 7E 06 0C 00 00 00 00 18 00 00 18 00 00 00 00 18 00 00 18 00 00 00 00 0C 30 30 0C 00 00 00 00 00 00 7E 00 00 00 00 00 30 0C 0C 30 00 00 00 7C C6 18 18 18 00 00 00 00 C6 DE DE C0 00 00 00 10 6C C6 C6 C6 00 00 00 FC 66 7C 66 66 00 00 00 3C C2 C0 C0 66 00 00 00 F8 66 66 66 6C 00 00 00 FE 62 78 60 66 00 00 00 FE 62 78 60 60 00 00 00 3C C2 C0 C6 66 00 00 00 C6 C6 FE C6 C6 00 00 00 3C 18 18 18 18 00 00 00 1E 0C 0C CC CC 00 00 00 E6 66 78 6C 66 00 00 00 F0 60 60 60 66 00 00 00 C6 FE D6 C6 C6 00 00 00 C6 F6 DE C6 C6 00 00 00 7C C6 C6 C6 C6 00 00 00 FC 66 7C 60 60 00 00 00 7C C6 C6 C6 DE 0C 00 00 FC 66 7C 66 66 00 00 00 7C C6 38 06 C6 00 00 00 7E 5A 18 18 18 00 00 00 C6 C6 C6 C6 C6 00 00 00 C6 C6 C6 C6 38 00 00 00 C6 C6 D6 D6 EE 00 00 00 C6 6C 38 7C C6 00 00 00 66 66 3C 18 18 00 00 00 FE 86 18 60 C6 00 00 00 3C 30 30 30 30 00 00 00 00 C0 70 1C 06 00 00 00 3C 0C 0C 0C 0C 00 00 10 6C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 30 18 00 00 00 00 00 00 00 00 00 0C CC CC 00 00 00 E0 60 6C 66 66 00 00 00 00 00 C6 C0 C6 00 00 00 1C 0C 6C CC CC 00 00 00 00 00 C6 C0 C6 00 00 00 38 64 F0 60 60 00 00 00 00 00 CC CC CC 0C 78 00 E0 60 76 66 66 00 00 00 18 00 18 18 18 00 00 00 06 00 06 06 06 66 3C 00 E0 60 6C 78 66 00 00 00 38 18 18 18 18 00 00 00 00 00 FE D6 D6 00 00 00 00 00 66 66 66 00 00 00 00 00 C6 C6 C6 00 00 00 00 00 66 66 66 60 F0 00 00 00 CC CC CC 0C 1E 00 00 00 76 60 60 00 00 00 00 00 C6 38 C6 00 00 00 10 30 30 30 36 00 00 00 00 00 CC CC CC 00 00 00 00 00 66 66 3C 00 00 00 00 00 C6 D6 FE 00 00 00 00 00 6C 38 6C 00 00 00 00 00 C6 C6 C6 06 F8 00 00 00 CC 30 C6 00 00 00 0E 18 70 18 18 00 00 00 18 18 00 18 18 00 00 00 70 18 0E 18 18 00 00 00 76 00 00 00 00 00 00 00 00 10 6C C6 FE 00 00 00 3C C2 C0 C2 3C 06 00 00 CC 00 CC CC CC 00 00 00 18 00 C6 C0 C6 00 00 00 38 00 0C CC CC 00 00 00 CC 00 0C CC CC 00 00 00 30 00 0C CC CC 00 00 00 6C 00 0C CC CC 00 00 00 00 3C 60 66 0C 3C 00 00 38 00 C6 C0 C6 00 00 00 C6 00 C6 C0 C6 00 00 00 30 00 C6 C0 C6 00 00 00 66 00 18 18 18 00 00 00 3C 00 18 18 18 00 00 00 30 00 18 18 18 00 00 00 00 38 C6 FE C6 00 00 38 38 38 C6 FE C6 00 00 18 60 FE 60 60 66 00 00 00 00 00 76 7E D8 00 00 00 3E CC FE CC CC 00 00 00 38 00 C6 C6 C6 00 00 00 C6 00 C6 C6 C6 00 00 00 30 00 C6 C6 C6 00 00 00 78 00 CC CC CC 00 00 00 30 00 CC CC CC 00 00 00 C6 00 C6 C6 C6 06 78 00 00 C6 C6 C6 C6 00 00 00 00 C6 C6 C6 C6 00 00 00 18 66 60 66 18 00 00 00 6C 60 60 60 E6 00 00 00 66 3C 7E 7E 18 00 00 00 CC F8 CC CC CC 00 00 00 1B 18 7E 18 18 D8 00 00 30 00 0C CC CC 00 00 00 18 00 18 18 18 00 00 00 30 00 C6 C6 C6 00 00 00 30 00 CC CC CC 00 00 00 76 00 66 66 66 00 00 76 00 E6 FE CE C6 00 00 00 6C 3E 7E 00 00 00 00 00 6C 38 7C 00 00 00 00 00 30 00 30 C0 C6 00 00 00 00 00 FE C0 C0 00 00 00 00 00 FE 06 06 00 00 00 C0 C6 18 60 86 18 00 00 C0 C6 18 66 9E 06 00 00 18 00 18 3C 3C 00 00 00 00 00 6C 6C 00 00 00 00 00 00 6C 6C 00 00 00 11 11 11 11 11 11 11 11 55 55 55 55 55 55 55 55 DD DD DD DD DD DD DD DD 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 36 36 36 36 36 36 36 36 00 00 00 00 36 36 36 36 00 00 00 18 18 18 18 18 36 36 36 06 36 36 36 36 36 36 36 36 36 36 36 36 00 00 00 06 36 36 36 36 36 36 36 06 00 00 00 00 36 36 36 36 00 00 00 00 18 18 18 18 00 00 00 00 00 00 00 00 18 18 18 18 18 18 18 18 00 00 00 00 18 18 18 18 00 00 00 00 00 00 00 00 18 18 18 18 18 18 18 18 18 18 18 18 00 00 00 00 00 00 00 00 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 36 36 36 36 36 36 36 36 36 36 36 30 00 00 00 00 00 00 00 30 36 36 36 36 36 36 36 00 00 00 00 00 00 00 00 00 36 36 36 36 36 36 36 30 36 36 36 36 00 00 00 00 00 00 00 00 36 36 36 00 36 36 36 36 18 18 18 00 00 00 00 00 36 36 36 36 00 00 00 00 00 00 00 00 18 18 18 18 00 00 00 00 36 36 36 36 36 36 36 36 00 00 00 00 18 18 18 18 00 00 00 00 00 00 00 18 18 18 18 18 00 00 00 00 36 36 36 36 36 36 36 36 36 36 36 36 18 18 18 18 18 18 18 18 18 18 18 18 00 00 00 00 00 00 00 00 18 18 18 18 FF FF FF FF FF FF FF FF 00 00 00 00 FF FF FF FF F0 F0 F0 F0 F0 F0 F0 F0 0F 0F 0F 0F 0F 0F 0F 0F FF FF FF FF 00 00 00 00 00 00 00 DC D8 DC 00 00 00 78 CC D8 C6 C6 00 00 00 FE C6 C0 C0 C0 00 00 00 00 FE 6C 6C 6C 00 00 00 00 C6 30 30 C6 00 00 00 00 00 D8 D8 D8 00 00 00 00 66 66 66 60 C0 00 00 00 76 18 18 18 00 00 00 00 18 66 66 18 00 00 00 00 6C C6 C6 6C 00 00 00 38 C6 C6 6C 6C 00 00 00 1E 18 3E 66 66 00 00 00 00 00 DB DB 00 00 00 00 00 06 DB F3 60 00 00 00 1C 60 7C 60 30 00 00 00 00 C6 C6 C6 C6 00 00 00 00 FE 00 00 FE 00 00 00 00 18 7E 18 00 00 00 00 00 18 06 18 00 00 00 00 00 18 60 18 00 00 00 00 0E 1B 18 18 18 18 18 18 18 18 18 D8 D8 00 00 00 00 18 00 00 18 00 00 00 00 00 DC 76 00 00 00 00 6C 38 00 00 00 00 00 00 00 00 00 18 00 00 00 00 00 00 00 18 00 00 00 00 0C 0C 0C 6C 3C 00 00 00 6C 6C 6C 00 00 00 00 00 D8 60 F8 00 00 00 00 00 00 7C 7C 7C 7C 00 00 00 00 00 00 00 00 00 00 1D 00 00 24 FF 24 00 00 00 00 3C C3 DB C3 66 00 00 4D 00 E7 FF C3 C3 C3 00 00 00 FF 99 18 18 18 00 00 56 00 C3 C3 C3 66 18 00 00 00 C3 C3 C3 DB 66 00 00 58 00 C3 3C 18 66 C3 00 00 00 C3 C3 3C 18 18 00 00 5A 00 C3 0C 30 C1 FF 00 00 00 00 00 FF DB DB 00 00 76 00 00 C3 C3 66 18 00 00 00 00 00 C3 DB FF 00 00 78 00 00 C3 3C 3C C3 00 00 00 00 00 3B 7E DC 00 00 9B 18 7E C0 C0 7E 18 00 00 00 C3 3C FF FF 18 00 00 9E FC 66 62 6F 66 F3 00 00 00 C0 C6 18 60 9B 0C 00 AC C0 C2 CC 30 CE 3E 06 00 00 00 00 00 00 00 00 00 16 04 C2 80 60 27 80 60 21 E8 FF C0 C3 FF 8A 23 F0 8A E8 D3 C7 03 E8 D3 ED 06 53 04 E8 00 74 8B 32 3C 72 3C 75 FE 03 26 3D 07 E8 FF 20 D3 EB E8 D3 BA 03 C3 DA FB F8 E5 A2 74 33 B9 80 00 F6 49 F8 06 00 B9 40 E8 00 20 75 BA B0 EF 06 04 75 83 4C 00 32 C7 06 8E 50 15 8A 32 58 D2 0B 52 09 E6 BD 5A 51 33 F3 59 C6 FE 7F E8 D2 07 00 00 00 00 26 04 E4 80 09 03 FC C3 49 BA 03 07 1A 0B 16 0F 12 53 86 72 2E 7F 00 58 02 D4 A0 04 FC 12 07 0E 53 68 72 2E 47 04 58 C4 A8 26 39 C3 DF 53 10 E8 FF 75 33 C3 06 04 75 50 BA 03 0C EC A8 5A C3 DB BE 57 3A 74 2E 38 74 83 02 F0 2E 18 FB 5E 50 0E E3 D8 C3 57 C3 49 3C 72 9C C9 E8 FF C3 2E 47 02 0A 0B 51 F6 80 18 0F 47 F6 80 0E F6 03 74 F6 80 02 01 C3 E8 FF 00 19 8A 03 E4 74 B0 80 01 09 08 FC 74 B0 0A 5B 33 E8 FF 19 06 14 0C 0D 13 0A E8 FF 75 EB 46 46 D1 C3 51 E8 FE C2 59 C3 E8 D1 A0 04 B0 E8 D0 00 50 09 E8 D1 0B E8 D1 5F 80 49 03 03 70 CD B8 A0 C0 C6 00 55 09 E8 D1 C6 00 AA 09 E8 D1 80 00 AA 05 0B EB BB 40 0B E8 D1 8E 58 E4 10 E8 D0 C3 00 00 00 00 27 F6 89 06 03 86 9C BA 03 8B B2 8A E8 D0 C7 7F 8A E8 D0 C3 FF FA C7 E8 D0 C9 6D 8A E8 D0 F8 63 8A FB E3 8B 8B 26 25 26 3D 26 1D E8 FF E2 C3 14 8B 8B E8 FF C4 8A AA C3 46 EF 32 A8 74 B2 A8 74 80 15 50 E8 FF 58 E3 DF 08 50 53 C4 3F BA 26 E2 C8 DA 50 C4 3F BA 4B E2 C8 DA 25 00 14 F7 03 13 D1 D1 80 80 D3 59 8A 8A C3 AC E0 AC F8 AC D8 2E 24 FC DC C5 22 46 C5 C9 ED 32 2E 04 7A 8A D0 D0 E8 FF FA E8 E8 68 8A 8A E8 FE FE FE 75 C3 DB FF 8A 23 79 FE 80 10 F0 8A 34 11 69 BA 03 FF 61 E8 FD 19 3E 04 77 E8 D0 FB 75 BE 76 3E 04 75 BE 77 10 06 04 74 32 03 E8 FF 03 7E BE 77 10 E8 FF BE 77 20 FC 09 08 45 32 0B E8 FE EE E8 FE FE 75 83 10 CD E2 C3 B5 75 BE 77 40 3E BE 76 06 04 74 83 40 40 E9 FF 00 00 00 00 C4 B8 04 CF B8 07 C9 B2 B8 00 C1 B8 04 BB B8 02 B5 E8 FB C0 A5 50 C4 B8 03 A3 B8 03 9D B3 E8 FC 02 0A CE 05 E8 CE E3 06 85 B8 00 7F 58 E4 03 94 C3 8A 43 FF 06 06 04 F2 FF 88 85 FE E8 FC 07 E7 14 53 B3 B0 E8 CE FF 7C FE 8A B0 E8 CE 26 04 CC C8 33 88 61 E8 CF 8B 99 36 04 C8 84 FE F7 85 5A FB 75 D1 48 E0 12 09 A0 04 C0 26 04 E0 C4 4C C3 00 BD 08 41 72 2E 47 8A 24 80 80 02 2E 0E 10 3C 74 75 E8 CE FB 74 B6 BD 10 FB 75 80 49 07 0A 05 10 3D 80 80 DA 07 00 33 C3 51 EB E5 D0 F6 04 02 C5 F5 05 E2 FA 06 BA A0 C2 F5 E3 E8 00 C3 74 AC C0 12 32 B1 D3 03 8A 32 F3 5F E9 06 53 D2 DA 08 E8 FB 5F 74 1F 30 49 1F 54 06 56 02 22 00 BF 00 00 1F 83 1F FA 30 BE 16 08 A4 C6 83 1F F7 C3 51 8A 32 F3 5F C7 59 F1 C3 55 52 53 8A 25 80 13 03 C6 3C 74 E9 00 FF 76 58 32 59 AD 80 19 16 C7 EF CE E8 CC 5F 53 5B 7F E9 00 FF 73 80 09 09 C3 C4 04 EB 80 03 29 E0 BA 03 A1 A8 B4 75 B4 50 0C 57 F6 40 75 FE B0 BA 03 87 EB 80 02 0A 10 58 5F 7F 42 FF 75 E8 FA 9E 06 04 74 E9 FF 73 EB 0A 74 E9 FF 6A 75 EB E8 04 7B E8 02 59 80 7E 02 EF 51 75 58 59 5F 07 2E 3E 78 54 0A 52 E8 B0 EE 58 06 01 08 0E 01 26 04 08 87 F6 89 01 03 7F 50 0C B9 F6 40 75 50 0F AD F6 40 74 E8 F9 08 0D E8 03 A3 06 04 40 26 04 E8 F9 16 16 04 07 0E 04 EB E8 04 24 09 14 16 04 07 0E 04 EB E8 04 0E 0B 26 04 08 88 E8 04 06 04 03 1E 04 E3 80 30 38 38 26 04 E4 F6 89 01 2C 2A 3B 63 74 80 B4 09 FC 74 32 EB 80 30 04 07 6D 66 75 E8 04 63 4F 06 01 08 0E 01 26 04 80 30 14 06 04 75 B0 E8 02 0E 04 E9 FE 06 04 F6 87 02 05 0E 04 F6 87 02 DD 06 04 03 B8 75 32 EB C7 63 B4 E8 F8 07 07 26 04 E8 F8 0B 49 E8 04 2F EB A2 04 FD E8 01 98 B7 E8 01 E8 F8 06 04 75 E8 FB 8A E8 01 B6 BB 00 AA 74 BB 00 29 74 F6 89 08 46 8B 04 2B 8B 06 57 C4 08 8A E8 CB 65 E8 F7 C3 E2 26 3D 11 01 E8 F7 84 5F 26 4D E3 06 26 5D 26 7D E8 F9 07 1F 8A 0A 74 7C 8A 85 FE B0 8B 63 E8 CA 50 E9 FD 7E 0D 4F 74 E8 F8 FF 0C BE 57 C6 2E 04 C0 12 3B 04 F0 3B 06 EA 3B 08 E4 7E C0 02 F8 E8 F7 03 95 E8 FB F1 E8 FC 08 E8 F7 34 0B E8 FB 2C 8A 26 5D 26 4D 26 55 57 53 C4 06 17 5B 54 07 26 45 3C 74 FE A2 04 06 E8 F7 41 07 E8 FB 39 8A 3A 85 75 26 5D 80 7F B9 01 D2 C4 03 D7 5B FB E7 E7 C7 74 80 20 E7 B3 BA 03 03 06 32 E8 FA 4E 06 04 00 10 80 85 0E 08 10 7C B8 1F A3 01 0E 01 BB 00 2A 74 BB 00 B5 74 26 05 C8 84 26 45 A2 04 C4 03 89 0C 8C 0E FB 80 20 DF C4 B0 E9 C9 C0 4E A2 04 0F 88 50 4B F9 8A A2 04 8B 03 4C 26 45 A2 04 8A 02 85 26 45 86 A3 04 1E 04 FB 77 32 2E 87 75 65 B0 80 06 02 3F 66 C3 49 C7 63 D4 8A 32 80 07 0C FB E3 DF C3 68 08 06 04 BB 68 8B 0E E8 FF 16 04 C0 FA 75 FE 80 04 5F 80 04 3E 00 1E 04 FB 7E 83 10 FB 7E 83 10 FB 7C 83 10 C0 8A E8 C8 FE A8 74 83 4C 00 0C E8 F5 C2 33 FC AB C2 A0 04 11 80 B8 08 C2 66 E8 C8 B8 06 B4 80 87 F7 0C E8 01 0D E8 01 49 B4 CD C3 3E 04 75 B8 11 07 10 60 EB B8 11 07 10 FD BF 5A 2D B8 41 12 B8 08 0C B8 23 06 C7 74 85 8C 76 B8 06 B4 80 87 08 49 E9 FE 07 66 32 32 26 79 E8 F4 C3 FB 75 26 7D B3 E8 F4 96 8B 63 80 06 C0 65 32 E8 F5 02 C3 0B 1F 80 C0 04 EC EC E1 8A 75 B1 E8 F5 15 49 3C 7C FE 3C 7E FE 3C 7E FE C3 1E 04 3E 04 E3 80 05 05 FB 7C 32 C3 26 04 80 89 7F FB 77 74 80 89 80 0E 04 80 87 02 0B 13 08 C7 75 B3 80 10 20 26 04 80 88 F0 1E 04 16 04 CB C3 BE 76 40 3C 74 E8 F7 06 04 74 B8 10 DB 40 CD 58 53 8A BB 57 D7 C4 77 2E 8B 58 E8 C6 E7 DC 0A 5B D7 00 00 00 00 52 0E 04 87 A8 75 F6 40 0B C5 74 B5 32 EB 8A E8 F4 09 C2 01 03 15 8A B0 E8 C9 E0 C0 E1 D7 86 5A C3 85 3C 75 81 0C 74 81 0D 75 C3 10 0A F9 07 04 0E C3 0E 06 F9 03 71 E0 EC E1 80 1F C9 63 E9 05 F9 7E 3A 75 3A 7E 8A FE 8A EB 80 02 04 CD 0D FD 7E 8A 8A FE EB 8A 80 02 F1 14 E9 E8 CD C8 C9 0E 1D C9 CD 17 FD 7E 8A 8A FE EB 2A 02 FE 8A FE C3 53 8A B1 32 D3 8A 89 50 D1 3A 62 75 8B 8A 32 F7 4A 32 03 D1 03 4E D1 8A B0 E8 C8 E3 0F F7 58 5A 00 00 00 00 00 00 00 00 F3 08 EE E6 C6 04 14 0E 04 00 00 00 00 00 00 00 C0 06 04 74 B4 CD C3 00 53 A2 04 F8 F7 4C A3 04 06 04 75 D1 8A B0 E8 C8 E3 0D 8D 5E 81 FF 8B 8B 50 E9 FF 00 00 00 00 00 53 51 57 8B 83 2E DB DF 5E 8A 32 89 FC 5E 33 8A 89 F8 C2 46 8A 89 F4 C1 46 8B F8 46 40 46 75 33 89 FC 46 2B F4 89 EE 46 2B F2 89 F0 7E 06 05 46 EB 8B F4 2E 04 46 8B F2 46 E8 F2 2A 49 2C 78 2C 7E 2C 7E 2C 7E 2C 7E 2C 7E 2C 74 FE 74 E8 F2 51 77 03 B9 00 02 A1 04 4E 02 B9 00 3E 04 74 BB 00 03 01 89 E0 00 EB 8B 85 BB 00 C0 62 F7 4C BA 00 1C 01 8B 85 BB 00 00 EB BA 00 0E 04 08 B8 00 46 89 D6 4E 89 DE 17 E8 00 8B E8 00 A7 83 2E 5F 59 5B C3 4A 83 DE 75 BB 00 EB 25 7E 02 0A 6E BB 00 EB 15 2E 04 7E 01 06 7E 04 05 08 F7 89 EC 7E 06 02 D8 46 C3 46 F7 FC 46 89 E8 B8 A0 7E 01 19 7E 04 13 10 25 00 30 74 B8 B8 03 00 89 D4 46 C3 46 F7 DA 46 F7 D6 46 89 D8 56 03 EA 56 89 DC 56 C3 46 2B FC 46 8B FC 46 83 FC 75 8B EE 46 8B DE E6 FF C7 EB 7E 3B F1 D2 3B C3 E8 C6 16 06 04 74 BA 03 24 74 FA 25 D8 FB 7E 00 1E 4E D1 8E D4 46 8B D8 76 F3 E8 02 4E 7F E8 02 4E 8B D8 46 8B FA 20 E0 AB FA FF E2 E6 E8 C6 07 65 BA 03 FB B8 00 6E 89 E6 7E 00 38 DB 08 F7 4A F7 8B 8B 1E 46 8E D4 7E 03 DC 4E F3 1F A1 04 C3 D8 AA E8 00 4E 7F E8 01 DB 08 F7 4A F7 8B 1E 7E 8E D2 4E 8B FA AA 43 1E 04 DE 78 E8 00 4E 7F E8 C2 09 E8 C2 83 DE 75 8B E6 7E 06 05 46 EB 8B DC 00 29 DC 46 B9 00 C0 46 01 D6 46 86 B0 E8 C2 1E 46 F7 E0 46 83 FC 74 33 B8 00 EB F0 F8 76 03 D8 46 8E D4 4E 8B 8B F3 8B 8B 8B E6 00 03 03 F3 43 04 3B 7C E8 00 4E 7F E8 00 DB 50 F7 03 DC F8 46 8B FA 4E 8B F3 8B 8B E6 00 03 8B FA AA B8 00 C3 D2 AA FF E2 C8 C3 7E 00 43 05 E8 C5 02 E8 C5 DB 4E A1 04 EB F0 F8 7E 03 DC 46 1E 5E F3 43 A1 04 C3 DC 68 FF E4 D2 05 E8 C5 4D B8 0F 28 B8 00 1F 8B FA E0 02 18 B8 FF 0F B8 0F 0C E8 00 4E 7F C3 D0 DB 4A 52 EB 03 DC F8 46 8B F0 C2 AA 3B 85 7C C3 5E 8B EA 46 19 DA BB 00 46 01 DC 03 5E 8B EC 46 73 01 D6 00 00 00 51 55 06 32 E8 C3 27 8B BE 00 A4 8B 2E 97 43 D8 E7 75 E8 C0 C3 5F 5A 5B 1C 3B 62 77 70 51 49 8A 3C 7E 8B 4A 3C 7E D1 D1 D1 A1 04 DD 51 57 ED C8 2E 97 43 3A 75 46 F2 C9 5E 58 04 F0 DE C0 D8 2B 32 0B C3 43 43 43 44 43 FA 75 26 03 18 00 26 0B E9 E0 C1 C0 00 E1 E1 CC F0 F5 20 03 C7 C3 8A F6 03 C3 00 D0 26 0D C1 14 47 CC F1 EF 03 C3 06 04 74 E8 C3 0F DA EC 01 FB EC 01 FB 26 05 FF 85 B9 00 06 04 00 30 75 BE 00 A8 8B B9 00 20 04 8F 85 C3 05 E8 C3 00 E8 FF B8 00 78 58 B9 01 FE 00 00 C9 01 BE 44 54 53 FE 75 32 E8 C2 E8 C2 51 E3 FF F6 E8 ED 58 F0 D8 9B 75 E8 BF C3 1F BE 44 20 E8 C2 8A 2E 94 44 8B E8 C2 03 4C 8B 07 5D 59 C3 51 55 06 50 92 3D 09 06 E3 80 3F C3 45 45 45 46 44 43 E8 C2 32 F7 85 03 5A B5 D1 D0 FE 75 C3 E8 FF FC EC 8A 23 86 0A 79 26 03 89 C3 06 04 74 E8 C1 13 DA 8B EC 01 FB EC 01 FB C1 AB 53 C0 43 79 BE 00 96 25 00 E0 E0 E0 F0 49 8E B9 00 06 16 E1 33 E8 FF 00 E8 FF C7 E2 47 19 00 AD DB 06 32 26 23 88 26 23 C7 E2 8E 81 40 47 C3 49 8B 0A 79 B4 E8 C2 15 36 8B 85 8B 4A 57 C6 00 FA F8 8A E8 C2 0E 04 16 04 DD 26 05 26 05 FA F5 47 D9 E4 EE B4 E9 C1 FB 8B 4A D1 D1 D1 8B 85 8E 57 B4 84 74 26 1D 03 88 47 EC EF EF 03 E2 5F C7 8E C3 00 00 00 00 C9 3D E8 EB 74 E9 FE 52 06 F6 D9 E8 C1 06 04 74 E8 C0 13 DA 8A EC 01 FB EC 01 FB 8A AA E2 07 5A C3 00 00 00 00 00 00 00 52 0C F1 F6 40 58 07 06 04 74 CD C3 53 80 64 B4 6A 66 86 0A 75 24 80 1F C7 66 8A 80 07 E7 D0 0A F6 49 FC 05 DB 43 B3 E8 00 66 32 A8 74 FE F6 49 FC 25 DF E7 74 0C A2 04 10 02 F8 01 15 81 01 E8 00 C3 02 07 E8 E9 5B C3 39 FA 7C 8A EE C7 B0 EE E9 E9 00 00 00 00 00 00 57 53 50 EC 1E 04 FB 7F 8B 81 FF D1 2E A4 47 48 48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 47 47 48 FB 74 80 5F 03 C7 E9 00 4A F7 8B 0A 74 8A 98 26 04 F8 D1 EA EA EA FA D1 E1 00 00 8E FA 5E D0 8A 72 B8 01 E4 CE EE 86 EE FF 0B 03 4A 42 E0 EB B8 FF C4 42 E0 8A C6 00 E7 E4 B0 B2 EE 86 EE 1D 05 B8 FF EE 86 EE 03 BA 03 42 E0 B8 FF EE 86 EE 58 5B 5F C3 01 E5 DB 04 04 04 E1 CE EE 86 EE 05 C5 03 CB D0 FE 75 88 00 46 04 CA D8 A4 B8 A0 D8 7E 0D 07 1D B2 EB 8A 88 00 66 E8 BB A6 8A 50 EA 40 F7 8B 58 D1 3E 04 74 24 F6 81 03 03 BE 75 F1 8A D0 D2 EB D1 24 F6 81 07 03 BE 75 F1 E0 E9 8A 86 D1 D1 D1 5A C2 00 04 C7 20 00 8E 80 01 74 8A F6 80 11 C3 05 8C 05 C5 E8 46 EB F6 22 0A EB A1 04 E0 E0 E0 E2 C1 D2 8B 8B 0B 74 B1 D3 B0 E8 BA 00 00 00 00 00 00 51 06 3E 04 F5 E8 00 DF 07 59 C3 0D 58 0E 0A 0D 08 44 07 47 48 D2 55 EC 46 00 75 50 C8 46 74 F6 89 20 14 53 56 06 07 07 5E 5B 80 89 DF 5D 36 04 03 B6 FE C3 D2 02 CA EB 90 E8 E7 75 52 40 F6 87 04 17 86 75 BA 03 E0 EC 01 FB A8 74 8A 26 04 FB 0E 03 E2 FE 3A 4A 75 32 3A 84 75 EB 90 C6 50 C6 E4 F6 F2 26 04 F0 E6 C7 F7 4C 03 53 00 A1 04 30 3D 00 03 00 8E 5B C3 FA B6 43 00 EE 42 00 03 42 00 61 00 E0 03 61 C9 FE C9 FE C4 61 58 50 52 1E 04 88 62 E8 E7 04 FF 0C 06 F6 0F 26 1D 5F 01 33 8A 84 8A 4A FE CD 5B 1E 04 5B C3 06 04 74 E8 B8 C4 74 1E ED 50 0F BA 03 25 B8 B8 3E 04 74 B8 B0 1F EA 8E BF 20 59 90 A4 CD 0E 06 00 50 00 58 CE E8 B8 C3 AD F6 10 F7 0B A5 80 02 27 C3 CE B0 EE 00 EC 00 F9 02 BA 46 0F EB BA 76 B8 C0 D8 F6 2E 00 C9 E1 F6 C0 14 C2 E2 50 CE B0 EE 00 B7 58 C0 02 04 EB 24 0A EE E8 B0 EE 00 00 00 00 00 00 00 26 04 87 24 0A 49 8A 62 C3 00 00 00 00 00 00 00 57 06 51 0A 75 80 49 13 06 38 E8 E5 59 07 5F C3 01 04 11 EA 02 02 7C 3E 04 74 8B 32 57 8A E8 E5 FE 80 10 F2 11 8A E8 E5 32 8B 63 80 06 33 B7 EC 08 06 F9 CF F5 CA C0 8A EE 00 8A EE 00 20 8B 47 C3 FB 7C 33 B7 EC 08 06 F9 CF F5 C0 B0 EE 00 8A EE 00 20 E9 FF 03 21 E3 10 CA 80 08 0E 04 0A 75 80 F7 26 04 E8 E4 46 3C 75 5B A8 E9 FF 08 0B 11 9C 58 D8 30 3C 75 8B 32 E8 E4 C7 FE 80 10 F3 2C 11 ED 10 0B C3 E6 D9 9F EB 3C 75 8B 53 20 2E 8B 5B D0 8B 8A E8 EE E9 3C 75 3A 49 74 8B B3 E8 E4 C9 0D CF 0A 75 80 7F 78 80 0F C7 75 80 03 E5 E5 FD 14 62 3C 75 8A E8 E6 CB 5A 8A E9 FE 17 08 FA 8B E9 FE 18 0A C3 C6 E8 B6 EF 19 0C C6 E8 B6 8A E9 FE 1A 21 14 D2 B9 0F EF 10 C8 D0 D0 0A 75 D0 D0 8B 59 50 3C 75 32 8B B7 E8 ED EB C7 FE E8 E6 C0 C7 D6 47 EE 38 00 00 30 2D 0E 04 16 04 80 07 0E CF 0C 7C 75 BB 01 2F C3 DF FF E3 8B F2 0E EB 50 51 57 06 03 12 E3 03 C4 E8 B6 5D 5A 5B C3 20 41 0A 2E 00 06 00 E8 25 E4 DB 12 2B FB 74 B2 77 80 02 02 0E 21 03 48 89 85 FE 88 84 89 0C 8C 0E EB 8A 24 74 3C 74 3C 77 E8 00 F9 00 33 50 E8 E6 80 7F 0B 58 C4 74 E8 E7 01 F6 EB B9 00 10 3C 7C B1 BD 08 05 10 3D 0E C3 FB 75 8A 87 8A 81 60 D0 B1 D2 8A 88 B1 D2 8A 88 80 0F 12 C3 FB 75 C7 14 39 8C 16 C3 FB 75 F6 87 08 03 C0 F6 89 01 3A 02 F2 26 04 B4 F6 87 02 02 0B C0 17 0E 04 80 09 02 08 26 04 08 88 EB 3C 74 80 89 10 EA C0 0E 06 04 75 80 89 EF D6 02 A6 26 04 EB 80 35 4C C0 12 06 04 75 06 B8 12 42 07 02 06 04 74 3C 74 3C 75 06 52 FA CD 5A 07 34 03 1A 57 8C 8B 52 01 E8 07 B0 E8 B4 E1 FE 03 47 80 31 11 26 04 0A 74 80 89 08 11 80 32 12 C0 07 0E 7D EB 32 E8 B4 E6 FB 75 80 89 FD C0 D8 0E 04 EB 80 34 10 26 04 0A 74 80 87 01 BC FB 75 53 B7 F6 8A E8 EB 5B A8 2E 50 AD FA 3F 32 E8 E3 FE 8B 63 80 06 EB A8 E0 BA 03 24 59 E8 C0 DB 54 FB E9 74 E2 0B C3 52 00 E8 07 FA 3E 01 3E 01 06 01 06 01 06 0E 01 06 D5 FB C3 26 04 B8 09 20 D4 F6 89 01 09 06 04 74 75 80 87 FD 06 04 75 F6 89 04 0D 0E 04 B8 0B 30 B4 08 10 89 63 80 88 F0 26 04 3E 04 1E 04 26 04 80 89 FE 00 10 C7 75 F6 08 2C 07 80 10 30 C3 74 B8 05 36 04 80 88 F0 26 04 0E 04 B4 CD 80 87 FB 3E 04 06 BB 00 06 04 74 B3 F6 89 01 14 02 18 75 B7 EB F6 89 01 02 01 01 E8 00 07 50 52 B8 C6 D8 D4 8B B4 86 E8 B2 27 28 5A 58 00 00 00 FC 61 C9 5D 53 52 8A 26 46 45 0D 28 13 0A 13 08 16 07 1A E8 F8 EB 32 EB 51 28 59 1E D2 1A CA 16 C4 74 26 5E 45 B4 E8 F3 51 82 59 B7 C4 74 E8 EC 5A 5B C3 00 00 00 00 00 57 A8 75 53 10 E8 E0 C4 02 8A 32 8A 8B D1 5B FF 97 B0 EB A3 DA B0 B4 07 59 A0 04 C1 11 E4 E0 F0 8B 04 FB 75 EB B3 B7 EB A0 04 30 30 08 C3 74 EB 90 C3 74 86 C3 33 26 5C 74 86 26 5C 74 86 83 02 E2 B8 00 8A 5B 00 00 00 DB 04 00 C3 52 56 FC 68 26 05 8C 02 C7 B9 00 C0 AA EF B9 00 49 F3 BE 04 03 F3 26 45 B8 1A 31 26 1D C7 33 8A 49 D1 81 94 2E 07 89 83 02 80 02 49 2E 07 88 47 45 26 1D B0 BA 03 5E 8A D0 D0 8A 0A 24 26 05 8A D0 0A 24 26 05 8A 89 80 0F 3E 04 E7 80 01 04 E7 FB 9D BA 03 10 20 24 D0 D0 0A 26 05 E8 DE C7 B1 B0 22 87 D2 26 05 33 06 BE 53 06 2E 5C 32 2E 14 04 0A 03 C6 E2 8C 8C 3B 74 80 20 07 88 B0 8A EB CB 06 BF 04 BF 08 BF 0C CB 0A CB 02 59 5F 5B 00 00 00 00 00 52 56 8B 83 0A 4E 8C FC 5E FC 03 08 28 53 53 54 E1 00 C9 18 E4 D8 E3 4A 53 FF 58 C0 06 78 8B FA 1C 1C 4E 83 0A 5E 5A C3 76 4E E6 C6 53 8B D1 D1 0A 74 FE 8A C3 00 00 00 03 03 03 03 ED 8B FE E3 E3 00 FF 81 02 2E 30 FF 8B FE E7 B9 00 8B FA FB C2 00 09 52 2E 14 5A D1 83 02 E4 F5 07 14 20 66 5A A0 26 3F B9 00 0C E8 01 07 5D 52 89 02 00 E8 02 C3 26 7F E8 B0 C0 B0 EE EC 88 2F BA 03 24 AA E0 C8 EC E4 02 C8 BA 03 AA DB 00 E8 DF 98 5D 55 8A 67 9F E8 E5 8B FE 7C B9 00 C2 00 09 52 2E 14 5A D1 83 02 EA 06 54 54 54 E8 02 34 B9 00 7C C3 52 5E 8E FC 8B 02 C0 01 E8 02 5E 55 5E 8E FC 8B 04 8B 02 C6 EE DB 00 57 C7 E8 DE 8B 63 AD 06 8B 8B EC C0 EC E0 8A 8B E8 AF BA 03 14 8B EE 8B 0A 74 BA 03 03 C8 26 45 EE D3 8A BA 03 5D 1E 56 F9 74 8B FC D8 76 8B 40 EB 8B 63 26 5D BA 03 1B 8B E8 00 CE E8 00 D3 C2 EC C0 E8 00 5F C3 F9 74 EC EB AC C3 51 8B 83 05 C4 B1 B5 E8 AE CC EC 88 09 CA EC 88 04 16 04 FB C7 B1 B5 E8 AE C0 8B 83 23 00 13 E8 AE FA C0 8A EE EC AA C1 CD EA CE 8B 83 37 00 08 83 5F 5B 53 57 5E 8E FC 8B 26 75 E8 AF CA 26 45 EE C7 B1 B5 8B E8 AE CB BA 03 C1 26 05 EE FE 3A 76 5F 5B 1E B8 A0 D8 FF 8A 5E C3 51 BA 03 02 BE 8A B0 B4 E8 AD 04 B0 8A B0 B4 E8 AD CE B0 E8 AD E0 F0 06 04 87 B0 E8 AD E8 05 01 79 B0 E8 AD C8 57 00 8E BF FF 5F 83 42 32 B0 8A E8 AD 8A AA C5 FD 76 59 C4 B0 8A E8 AD 02 E7 3B BA 03 05 E5 31 B0 8A E8 AD C6 06 23 5F 5B 1E 5E 8B FA 37 C4 B0 B4 E8 AD CE B0 B4 E8 AD 05 E4 FB 83 42 BA 03 01 02 E5 EB E8 FF D0 80 08 EE 1F 02 0F D7 E8 FF 50 51 57 1E 83 00 17 D8 C0 C0 BF 04 8A B1 F6 22 0A EB A0 04 30 BB 57 ED FA 74 2E 3F 03 8B 2E 4F F3 83 03 83 FF E4 1F 5F 59 58 49 1E 04 A8 04 00 74 04 00 0C 04 FF 06 10 16 FF FF 06 10 16 FF FF 00 00 00 00 00 00 00 00 00 00 01 02 03 04 05 06 07 08 FF 02 10 00 00 00 58 32 04 10 00 00 00 58 32 02 10 00 00 00 58 32 04 10 00 00 00 58 32 02 14 03 02 00 59 32 02 14 03 02 00 59 32 04 15 02 01 01 59 32 04 16 02 01 01 5A 32 04 16 02 01 00 5A 32 18 00 00 00 6F 83 81 9E 1F 4F 0E 00 00 8E 42 96 A3 00 02 04 14 38 3A 3C 3E 0C 0F 00 00 00 0E FF 00 08 00 00 00 00 2A 00 00 00 6F 83 81 9E 1F 48 08 00 00 8E 42 89 A3 00 02 04 14 38 3A 3C 3E 0C 0F 00 00 00 0E FF 00 08 00 00 00 00 18 00 00 00 6E 83 81 9E 1F 4F 0E 00 00 8E 42 96 A3 00 08 08 08 10 18 18 18 0E 0F 00 00 00 0A FF 00 08 00 00 00 00 2A 00 00 00 6E 83 81 9E 1F 48 08 00 00 8E 42 89 A3 00 08 08 08 10 18 18 18 0E 0F 00 00 00 0A FF 00 08 00 00 00 00 4A 00 01 00 EF 63 80 12 F0 60 00 00 00 86 32 59 E3 00 02 04 14 38 3A 3C 3E 01 0F 00 00 00 05 FF 00 00 00 4A 00 01 00 EE 63 80 12 F0 60 00 00 00 86 32 59 E3 00 3F 3F 3F 3F 3F 3F 3F 01 0F 00 00 00 05 FF 00 00 00 18 00 01 00 63 4F 82 80 1F 40 00 00 00 8E 50 96 A3 00 02 04 06 08 0A 0C 0E 41 0F 00 00 00 05 FF 00 00 01 1D 00 01 00 E3 4F 82 80 3E 40 00 00 00 8C 50 E7 E3 00 02 04 06 08 0A 0C 0E 41 0F 00 00 00 05 FF 00 00 01 18 00 00 3F A6 4F 82 80 1F 4D 0C 00 00 A5 28 63 A3 00 FF 08 FF 10 FF 18 FF 0E 08 00 00 00 0A FF 18 00 01 3F 63 4F 82 80 1F C7 07 00 00 8E 28 96 A3 00 02 04 06 10 12 14 16 00 0F 00 00 00 0E FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 92 00 8E 28 96 A3 00 02 04 06 08 0A 0C 0E 41 0F 00 00 00 05 FF 00 00 00 00 00 00 29 00 63 4F 82 81 1F 40 00 00 00 8E 28 96 E3 00 00 00 00 00 00 00 00 01 0F 00 0F 00 05 FF 00 00 29 00 63 4F 82 81 1F 40 00 00 00 8E 28 96 E3 00 00 00 00 00 00 00 00 01 0F 00 0F 00 05 FF 18 00 09 00 63 27 90 80 1F C0 00 00 00 8E 14 96 E3 00 02 04 06 10 12 14 16 01 0F 00 00 00 05 FF 18 00 01 00 63 4F 82 80 1F C0 00 00 00 8E 28 96 E3 00 02 04 06 10 12 14 16 01 0F 00 00 00 05 FF 18 00 05 00 A2 4F 1A E0 1F 00 00 00 00 2E 14 5E 8B 00 00 18 00 00 00 00 00 0B 05 00 00 00 07 FF 18 00 05 00 A7 4F 17 BA 1F 00 00 00 00 2B 14 5F 8B 00 00 04 00 00 00 04 00 01 05 00 00 00 07 FF 18 00 01 00 A2 4F 82 80 1F 40 00 00 00 85 28 63 E3 00 00 18 00 00 00 00 00 0B 05 00 00 00 05 FF 18 00 01 00 A3 4F 82 80 1F 40 00 00 00 85 28 63 E3 00 02 04 14 38 3A 3C 3E 01 0F 00 00 00 05 FF 18 00 09 00 A3 27 90 A0 1F 4D 0C 00 00 85 14 63 A3 00 02 04 14 38 3A 3C 3E 08 0F 00 00 00 0E FF 18 00 09 00 A3 27 90 A0 1F 4D 0C 00 00 85 14 63 A3 00 02 04 14 38 3A 3C 3E 08 0F 00 00 00 0E FF 18 00 01 00 A3 4F 82 81 1F 4D 0C 00 00 85 28 63 A3 00 02 04 14 38 3A 3C 3E 08 0F 00 00 00 0E FF 18 00 01 00 A3 4F 82 81 1F 4D 0C 00 00 85 28 63 A3 00 02 04 14 38 3A 3C 3E 08 0F 00 00 00 0E FF 18 00 08 00 67 27 90 A0 1F 4F 0E 00 00 8E 14 96 A3 00 02 04 14 38 3A 3C 3E 0C 0F 00 00 00 0E FF 18 00 00 00 67 4F 82 81 1F 4F 0E 00 00 8E 28 96 A3 00 02 04 14 38 3A 3C 3E 0C 0F 00 00 00 0E FF 18 00 00 00 66 4F 82 81 1F 4F 0E 00 00 8E 28 96 A3 00 08 08 08 10 18 18 18 0E 0F 00 00 00 0A FF 1D 00 01 00 E3 4F 82 80 3E 40 00 00 00 8C 28 E7 C3 00 3F 3F 3F 3F 3F 3F 3F 01 0F 00 00 00 05 FF 1D 00 01 00 E3 4F 82 80 3E 40 00 00 00 8C 28 E7 E3 00 02 04 14 38 3A 3C 3E 01 0F 00 00 00 05 FF 18 00 01 00 63 4F 82 80 1F 41 00 00 00 8E 28 96 A3 00 02 04 06 08 0A 0C 0E 41 0F 00 00 00 05 FF FF FF FF FF 08 08 08 FF 1F 08 08 08 08 08 08 10 10 1F 1F 08 68 C0 00 00 00 00 00 00 75 C0 00 00 00 00 68 E0 00 00 00 00 00 00 75 E0 00 00 00 00 00 75 C0 00 00 00 00 00 00 00 00 00 00 00 75 E0 00 00 00 00 00 00 00 00 00 00 01 00 00 01 02 01 04 01 05 05 06 06 06 08 08 07 07 07 E0 00 00 07 08 0E 00 00 28 29 2E 29 08 08 01 08 00 00 08 02 01 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 B8 B8 B8 B0 00 00 A0 A0 A0 A0 00 55 AA FF 02 08 20 80 0C C0 0E 10 90 00 10 08 1F 1F 10 08 0C 1E 1F 2F 0E 2B 10 14 11 15 30 34 31 35 18 1C 19 1D 38 3C 39 3D 12 16 13 17 32 36 33 37 1A 1E 1B 1F 3A 3E 3B 3F 05 1C 0B 28 07 20 14 2C 11 2A 1E 36 13 2C 20 39 0B 24 18 30 0D 26 1A 33 17 30 24 3D 18 32 24 3F 10 14 11 15 10 14 11 15 3A 3E 3B 3F 3A 3E 3B 3F 10 14 11 15 10 14 11 15 3A 3E 3B 3F 3A 3E 3B 3F 05 1C 0B 28 05 1C 0B 28 18 32 24 3F 18 32 24 3F 05 1C 0B 28 05 1C 0B 28 18 32 24 3F 18 32 24 3F 00 00 00 00 15 15 15 15 15 15 15 15 3F 3F 3F 3F 00 00 00 00 15 15 15 15 15 15 15 15 3F 3F 3F 3F 10 14 11 15 3A 3E 3B 3F 05 1C 0B 28 18 32 24 3F 05 0B 11 18 20 28 32 3F 00 10 3F 00 2F 3F 00 3F 2F 00 3F 10 1F 27 3F 1F 37 3F 1F 3F 37 1F 3F 27 2D 31 3F 2D 3A 3F 2D 3F 3A 2D 3F 31 00 07 1C 00 15 1C 00 1C 15 00 1C 07 0E 11 1C 0E 18 1C 0E 1C 18 0E 1C 11 14 16 1C 14 1A 1C 14 1C 1A 14 1C 16 00 04 10 00 0C 10 00 10 0C 00 10 04 08 0A 10 08 0E 10 08 10 0E 08 10 0A 0B 0C 10 0B 0F 10 0B 10 0F 0B 10 0C 12 12 04 04 04 04 1E 04 04 04 04 15 00 00 14 14 2D 14 14 14 14 2D 2D 2D 04 04 10 04 04 04 04 10 10 10 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 AA B8 C0 B8 00 CA 00 00 33 32 CD 5A C4 C3 0D EF 75 B0 E8 FF B0 A2 05 B4 CD 1F 59 58 FB 53 52 33 8E 80 00 01 E9 06 05 8A 62 B4 CD 52 C1 75 32 32 B4 CD B4 CD 0A 75 B0 E8 FF B5 C2 16 04 E5 9D 75 FE 3A 84 7E 32 EB 00 00 E8 01 69 68 03 69 E8 05 6A 68 09 6B 68 0B 6B E8 0D 6C 68 13 6F A8 41 6D 28 43 6E A8 4F 6D 68 80 6E A8 82 6E E8 87 6F E8 D1 6F A8 FF 18 00 09 00 63 27 90 A0 1F C7 07 00 00 8E 14 96 A3 00 02 04 06 10 12 14 16 08 0F 00 00 00 0E FF 18 00 09 00 63 27 90 A0 1F C7 07 00 00 8E 14 96 A3 00 02 04 06 10 12 14 16 08 0F 00 00 00 0E FF 18 00 01 00 63 4F 82 81 1F C7 07 00 00 8E 28 96 A3 00 02 04 06 10 12 14 16 08 0F 00 00 00 0E FF 18 00 01 00 63 4F 82 81 1F C7 07 00 00 8E 28 96 A3 00 02 04 06 10 12 14 16 08 0F 00 00 00 0E FF 18 00 09 00 63 27 90 80 1F C1 00 00 00 8E 14 96 A2 00 15 02 06 10 12 14 16 01 03 00 00 00 0F FF 18 00 09 00 63 27 90 80 1F C1 00 00 00 8E 14 96 A2 00 15 02 06 10 12 14 16 01 03 00 00 00 0F FF 18 00 01 00 63 4F 82 80 1F C1 00 00 00 8E 28 96 C2 00 17 17 17 17 17 17 17 01 01 00 00 00 0D FF 18 00 00 00 A6 4F 82 81 1F 4D 0C 00 00 85 28 63 A3 00 08 08 08 10 18 18 18 0E 0F 00 00 00 0A FF 18 00 21 00 63 4F 82 81 1F 40 00 00 00 8E 28 96 E3 00 02 04 14 38 3A 3C 3E 01 0F 00 00 00 05 FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 18 00 00 00 23 27 37 15 11 47 07 00 00 24 14 E0 A3 00 02 04 06 10 12 14 16 08 0F 00 00 00 0E FF 00 00 29 00 62 4F 82 81 1F 40 00 00 00 8E 28 96 E3 00 00 00 00 00 00 00 00 01 0F 00 0F 00 05 FF 00 00 29 00 63 4F 82 81 1F 40 00 00 00 8E 28 96 E3 00 00 00 00 00 00 00 00 01 0F 00 0F 00 05 FF 18 00 09 00 63 27 90 80 1F C0 00 00 00 8E 14 96 E3 00 02 04 06 10 12 14 16 01 0F 00 00 00 05 FF 18 00 01 00 63 4F 82 80 1F C0 00 00 00 8E 28 96 E3 00 02 04 06 10 12 14 16 01 0F 00 00 00 05 FF 18 00 05 00 A2 4F 1A E0 1F 00 00 00 00 2E 14 5E 8B 00 00 18 00 00 00 00 00 0B 05 00 00 00 07 FF 18 00 05 00 A7 4F 17 BA 1F 00 00 00 00 2B 14 5F 8B 00 00 04 00 00 00 04 00 01 05 00 00 00 07 FF 18 00 01 00 A2 4F 82 80 1F 40 00 00 00 85 28 63 E3 00 00 18 00 00 00 00 00 0B 05 00 00 00 05 FF 18 00 01 00 A3 4F 82 80 1F 40 00 00 00 85 28 63 E3 00 02 04 14 38 3A 3C 3E 01 0F 00 00 00 05 FF 18 00 09 00 A3 27 90 A0 1F 4D 0C 00 00 85 14 63 A3 00 02 04 14 38 3A 3C 3E 08 0F 00 00 00 0E FF 18 00 09 00 A3 27 90 A0 1F 4D 0C 00 00 85 14 63 A3 00 02 04 14 38 3A 3C 3E 08 0F 00 00 00 0E FF 18 00 01 00 A3 4F 82 81 1F 4D 0C 00 00 85 28 63 A3 00 02 04 14 38 3A 3C 3E 08 0F 00 00 00 0E FF 18 00 01 00 A3 4F 82 81 1F 4D 0C 00 00 85 28 63 A3 00 02 04 14 38 3A 3C 3E 08 0F 00 00 00 0E FF 18 00 08 00 67 27 90 A0 1F 4F 0E 00 00 8E 14 96 A3 00 02 04 14 38 3A 3C 3E 0C 0F 00 00 00 0E FF 18 00 00 00 67 4F 82 81 1F 4F 0E 00 00 8E 28 96 A3 00 02 04 14 38 3A 3C 3E 0C 0F 00 00 00 0E FF 18 00 00 00 66 4F 82 81 1F 4F 0E 00 00 8E 28 96 A3 00 08 08 08 10 18 18 18 0E 0F 00 00 00 0A FF 1D 00 01 00 E3 4F 82 80 3E 40 00 00 00 8C 28 E7 C3 00 3F 3F 3F 3F 3F 3F 3F 01 0F 00 00 00 05 FF 1D 00 01 00 E3 4F 82 80 3E 40 00 00 00 8C 28 E7 E3 00 02 04 14 38 3A 3C 3E 01 0F 00 00 00 05 FF 18 00 01 00 63 4F 82 80 1F 41 00 00
Paradise VGA Board: WDVGA PLUS 16 --- This Paradise VGA board was manufactured in 1988 and sold by Western Digital Corporation as a **WDVGA PLUS 16**, Model No. 61-603023-02.  A copy of the board's [ROM BIOS](1988-05-23.json) was created by [dumping](/devices/pc/bios/compaq/deskpro386/#dumping-the-roms) the contents of each of the board's two M27128AZB PROMs to a *.hex* file, and then merging the *.hex* files with the following [FileDump](/modules/filedump/) command: filedump --file=62-003084-060.hex --merge=62-003085-060.hex --output=1988-05-23.json For a more human-readable dump, use the `--comments` option: filedump --file=62-003084-060.hex --merge=62-003085-060.hex --output=1988-05-23.dump --comments And for those who want a binary file, the FileDump API can be used to recreate binary data from JSON data: > [http://www.pcjs.org/api/v1/dump?file=http://www.pcjs.org/devices/pc/video/paradise/vga/1988-05-23.json&format=rom](http://www.pcjs.org/api/v1/dump?file=http://www.pcjs.org/devices/pc/video/paradise/vga/1988-05-23.json&format=rom) The first 128 bytes of the ROM BIOS contain: 00000000 55 aa 30 eb 15 37 34 30 30 30 35 2f 32 33 2f 38 |U.0..740005/23/8| 00000010 38 2d 31 38 3a 30 30 3a 30 30 e9 a8 00 00 49 42 |8-18:00:00....IB| 00000020 4d 20 43 4f 4d 50 41 54 41 42 4c 45 00 00 00 00 |M COMPATABLE....| 00000030 00 00 00 00 00 30 30 33 30 35 36 2d 30 30 35 43 |.....003056-005C| 00000040 4f 50 59 52 49 47 48 54 20 50 41 52 41 44 49 53 |OPYRIGHT PARADIS| 00000050 45 20 53 59 53 54 45 4d 53 20 49 4e 43 2e 20 31 |E SYSTEMS INC. 1| 00000060 39 38 37 2c 31 39 38 38 2c 20 41 4c 4c 20 52 49 |987,1988, ALL RI| 00000070 47 48 54 53 20 52 45 53 45 52 56 45 44 56 47 41 |GHTS RESERVEDVGA| Although Compaq's early VGA boards also used a Paradise chipset and Inmos DAC, and have many physical similarities to this WDC Paradise board, the ROMs claim different authorship. A full disassembly and comparison of the Compaq and WDC boards will be made at a later date. One thing we know already: the Paradise developers didn't know how to spell "compatible."
IBM PC Configurations --- This folder contains IBM PC [Machine Configurations](machine/), along with [Control Panels](/devices/pc/panel/), [Keyboard Layouts](/devices/pc/keyboard/) and other components. [Application Demos](/apps/pc/) and [Disk Archives](/disks/pc/) are also available.
@CHARSET "UTF-8";
/**
@author Jeff Parsons (@jeffpar)
@website http://www.pcjs.org/
@created 2013-05-05
@modified 2014-02-23
@license http://www.gnu.org/licenses/gpl.html
*/
body {
margin: 0;
background: #202020;
}
h1, h2 {
margin-top: 0;
color: #cccccc;
}
h1, h2, h3, h4 {
word-wrap: break-word;
}
h4 a {
color: #cccccc !important;
}
p {
line-height: 1.5em;
}
img {
max-width: 100%;
}
a img {
vertical-align: bottom;
}
pre, code {
color: #000000;
background-color: #cccccc;
font-family: Monaco, Consolas, "Lucida Console", monospace;
font-size: 12px;
}
pre {
margin: 1em 2em;
padding: 1em;
border-radius: 5px;
overflow: auto;
}
code {
padding: 1px;
}
pre a, code a {
color: #006400 !important;
}
.common {
width: 100%;
margin: 0 auto;
color: #cccccc;
}
.common a {
color: #7fc07f;
text-decoration: none;
}
.common hr {
border-color: #808080;
}
.common a:hover {
text-decoration: underline;
}
.common, .machine {
font-family: "Helvetica Neue", Helvetica, Arial, Geneva, sans-serif;
font-size: 15px;
}
.machine {
margin: 15px;
overflow: hidden;
}
.c1pjs {
overflow: visible;
}
.machine-placeholder {
text-align: center;
font-weight: bold;
}
.common-top {
background: #202020;
font-size: small;
}
.common-top-left {
float: left;
width: 60%;
}
.common-top-left ul {
line-height: 1.5em;
list-style-type: none;
margin: 0;
padding: 1em 1em 1em 9px;
overflow: hidden;
}
.common-top-left ul li {
display: block;
float: left;
}
.common-top-left ul li a {
border-right: 1px solid #6f6f6f;
padding: 2px 6px 2px 6px;
}
.common-top-left ul li:last-child a {
border-right: none;
}
.common-top-right {
float: right;
width: 40%;
}
.common-top-right p {
float: right;
margin: 0;
padding: 1em;
}
.common-middle {
clear: both;
padding: 1px 1em 1px 1em;
background: #404040;
}
.common-sidebar {
float: left;
font-size: small;
width: 140px;
padding-bottom: 20px;
overflow: hidden;
white-space: nowrap;
word-wrap: break-word;
}
.common-list {
list-style-type: none;
margin-top: 0;
margin-bottom: 0;
padding-left: 0;
}
.common-list li {
padding-bottom: 7px;
}
.common-list-data {
list-style-type: none;
margin-top: 0;
margin-bottom: 0;
padding-left: 0;
}
.common-list-data li {
line-height: 1.5em;
}
.common-list-data-items, .common-list-data-subitems {
font-size: x-small;
list-style-type: none;
margin-top: 0;
margin-bottom: 0;
padding-left: 2em;
}
.common-list-data-items li, .common-list-data-subitems li {
padding-bottom: 0;
}
.common-main {
margin-left: 150px;
}
.common-image-gallery {
margin: 0 auto;
text-align: center;
}
.common-image-gallery:after {
content: '';
display: block;
}
.common-image-frame {
display: inline-block;
margin: 8px;
text-align: center;
}
.common-image-link {
padding: 5px;
border: 1px solid black;
border-radius: 5px;
background-color: #FAEBD7;
}
.common-image-label {
font-size: x-small;
}
.common-bottom {
clear: both;
padding-top: 1em;
}
.common-bottom:after {
content: '';
display: block;
clear: both;
}
.common-reference {
float: left;
font-size: x-small;
}
.common-reference a {
text-decoration: none;
}
.common-copyright {
float: right;
font-size: x-small;
}
.common-copyright a {
text-decoration: none;
}
.md-list {
}
.md-list li {
line-height: 1.5em;
margin-bottom: 1em;
}
.md-list li p {
padding-left: 2em;
}
.md-list-compact {
}
.md-list-compact li {
margin-bottom: 0;
}
.md-list-none {
list-style-type: none;
padding-left: 2em;
}
.md-list-none li {
margin-bottom: 0;
}
@media screen and (max-width: 900px) {
.common-sidebar {
width: 100%;
white-space: normal;
}
.common-list {
padding-left: 0;
}
.common-list-data {
padding-left: 0;
}
.common-sidebar h4, .common-list li, .common-list-data li, .common-list-data-items li {
width: 130px;
float: left;
overflow: hidden;
vertical-align: top;
padding-right: 1em;
margin-top: 0;
}
.common-list-data-subitems {
display: none;
}
.common-main {
clear: both;
margin-left: 0;
padding-left: 0;
padding-right: 0;
}
.md-list-none {
padding-left: 1em;
}
}
<?xml version="1.0" encoding="UTF-8"?> <!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2012-05-05" modified="2014-02-23" license="http://www.gnu.org/licenses/gpl.html" --> <!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp " "> <!ENTITY ne "≠"> <!ENTITY le "≤"> <!ENTITY ge "≥"> <!ENTITY times "×"> <!ENTITY sdot "⋅"> <!ENTITY divide "÷"> <!ENTITY copy "©"> <!ENTITY Sigma "Σ"> <!ENTITY sigma "σ"> <!ENTITY sum "∑"> <!ENTITY lbrace "{"> ]> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template name="commonStyles"> <meta charset="utf-8"/> <link rel="shortcut icon" href="/versions/images/current/favicon.ico" type="image/x-icon"/> <link rel="stylesheet" type="text/css" href="/versions/pcjs/1.18.2/common.css"/> </xsl:template> <xsl:template name="commonTop"> <div class="common-top"> <div class="common-top-left"> <ul> <li><a href="/">Home</a></li> <li><a href="/apps/pc/">Apps</a></li> <li><a href="/disks/pc/">Disks</a></li> <li><a href="/devices/pc/machine/">Machines</a></li> <li><a href="/docs/">Docs</a></li> <li><a href="/pubs/">Pubs</a></li> <li><a href="/blog/">Blog</a></li> <li><a href="/docs/about/">About</a></li> </ul> </div> <div class="common-top-right"> <p>Powered by <a href="http://nodejs.org" target="_blank">Node.js</a> and <a href="http://aws.amazon.com/about-aws/whats-new/2013/03/11/announcing-aws-elastic-beanstalk-for-node-js/" target="_blank">AWS</a></p> </div> </div> </xsl:template> <xsl:template name="commonBottom"> <div class="common-bottom"> <p class="common-reference"></p> <p class="common-copyright"> <span class="common-copyright"><a href="http://www.pcjs.org/">pcjs.org</a> website © 2012-2015 by <a href="http://twitter.com/jeffpar">@jeffpar</a></span><br/> <span class="common-copyright">PCjs and C1Pjs released under <a href="http://gnu.org/licenses/gpl.html">GPL version 3 or later</a></span> </p> </div> </xsl:template> </xsl:stylesheet>
@CHARSET "UTF-8";
*:not(input,textarea) {
-webkit-user-select: none;
}
.pcjs-embed {
}
.pcjs-embed:after {
clear:both;
}
.pcjs-name, .pcjs-menu {
clear: both;
font-weight: bold;
padding-bottom: 4px;
}
.pcjs-menu {
float: left;
}
.pcjs-canvas {
width: 100%;
height: auto;
}
.pcjs-container {
color: #000000;
position: relative;
}
.pcjs-label {
font-size: small;
line-height: 19px;
vertical-align: middle;
float: left;
font-family: "Lucida Console", monospace;
}
.pcjs-control textarea {
font-family: Monaco, monospace;
font-size: x-small;
}
.pcjs-fieldset {
border: none;
margin: 0;
padding: 0;
}
.pcjs-flag {
font-family: "Lucida Console", monospace;
font-size: small;
text-align: center;
line-height: 19px;
vertical-align: middle;
}
.pcjs-register {
font-family: "Lucida Console", monospace;
font-size: small;
text-align: center;
line-height: 19px;
vertical-align: middle;
border: 1px solid black;
}
.pcjs-switches {
float: left;
}
.pcjs-bitBucket {
float: left;
width: 19px;
height: 38px;
}
.pcjs-bitCell {
float: left;
width: 19px;
height: 19px;
margin-right: -1px;
margin-bottom: -1px;
border: 1px solid black;
text-align: center;
line-height: 19px;
}
.pcjs-bitCellLeft {
border-left: 1px solid black;
}
.pcjs-bitLabel {
font-size: xx-small;
text-align: center;
}
.pcjs-description, .pcjs-status {
font-size: x-small;
line-height: 2em;
}
.pcjs-key {
border: 1px solid black;
font-size: x-small;
text-align: center;
position: absolute;
height: 34px;
line-height: 34px;
background-color: #ffffff;
}
.pcjs-led {
float: left;
width: 8px;
height: 8px;
margin: 4px;
border: 1px solid black;
text-align: center;
line-height: 19px;
background-color: #000000;
}
.pcjs-video-object {
clear: both;
height: auto;
position: relative;
}
.pcjs-video-object textarea {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
opacity: 0;
border: 0;
padding: 0;
line-height: 0;
}
.pcjs-reference {
float: left;
font-size: x-small;
}
.pcjs-reference a {
text-decoration: none;
}
.pcjs-copyright {
float: right;
font-size: x-small;
}
.pcjs-copyright a {
text-decoration: none;
}
@media screen and (max-width: 900px) {
.pcjs-textarea {
width: 100% !important;
}
.pcjs-registers {
width: 100% !important;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2012-05-05" modified="2014-02-23" license="http://www.gnu.org/licenses/gpl.html" -->
<!DOCTYPE xsl:stylesheet [
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="rootDir" select="''"/>
<xsl:param name="generator" select="'client'"/>
<xsl:variable name="MACHINECLASS">pc</xsl:variable>
<xsl:variable name="APPCLASS">pcjs</xsl:variable>
<xsl:variable name="APPVERSION">1.18.2</xsl:variable>
<xsl:variable name="SITEHOST">www.pcjs.org</xsl:variable>
<xsl:template name="componentStyles">
<link rel="stylesheet" type="text/css" href="/versions/{$APPCLASS}/{$APPVERSION}/components.css"/>
</xsl:template>
<xsl:template name="componentScripts">
<xsl:param name="component"/>
<script type="text/javascript" src="/versions/{$APPCLASS}/{$APPVERSION}/{$component}.js"> </script>
</xsl:template>
<xsl:template name="componentIncludes">
<xsl:param name="component"/>
<xsl:call-template name="componentScripts"><xsl:with-param name="component" select="$component"/></xsl:call-template>
</xsl:template>
<xsl:template name="machine">
<xsl:param name="href">/devices/pc/machine/5150/mda/64kb/machine.xml</xsl:param>
<xsl:param name="state" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="$href"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/machine">
<xsl:with-param name="machineState" select="$state"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="machine[@ref]">
<xsl:param name="machineState" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/machine">
<xsl:with-param name="machine" select="@id"/>
<xsl:with-param name="machineState">
<xsl:choose>
<xsl:when test="$machineState != ''"><xsl:value-of select="$machineState"/></xsl:when>
<xsl:otherwise><xsl:value-of select="@state"/></xsl:otherwise>
</xsl:choose>
</xsl:with-param>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="machine[not(@ref)]">
<xsl:param name="machine"><xsl:value-of select="@id"/></xsl:param>
<xsl:param name="machineState" select="''"/>
<xsl:variable name="machineStyle">
<xsl:if test="@float">float:<xsl:value-of select="@float"/></xsl:if>
</xsl:variable>
<div id="{$machine}" class="machine {@class}js" style="{$machineStyle}">
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="machineState">
<xsl:choose>
<xsl:when test="$machineState != ''"><xsl:value-of select="$machineState"/></xsl:when>
<xsl:otherwise><xsl:value-of select="@state"/></xsl:otherwise>
</xsl:choose>
</xsl:with-param>
<xsl:with-param name="component" select="'machine'"/>
<xsl:with-param name="class"><xsl:value-of select="@class"/>js</xsl:with-param>
<xsl:with-param name="parms"><xsl:if test="@parms">,<xsl:value-of select="@parms"/></xsl:if></xsl:with-param>
<xsl:with-param name="url"><xsl:value-of select="@url"/></xsl:with-param>
</xsl:call-template>
</div>
</xsl:template>
<xsl:template match="component[@ref]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/component">
<xsl:with-param name="machine" select="$machine"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="component[not(@ref)]">
<xsl:param name="machine" select="''"/>
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="class" select="@class"/>
<xsl:with-param name="parms"><xsl:if test="@parms">,<xsl:value-of select="@parms"/></xsl:if></xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template name="component">
<xsl:param name="machine" select="''"/>
<xsl:param name="machineState" select="''"/>
<xsl:param name="component" select="name(.)"/>
<xsl:param name="class" select="''"/>
<xsl:param name="parms" select="''"/>
<xsl:param name="url" select="''"/>
<xsl:variable name="id">
<xsl:choose>
<xsl:when test="$component = 'machine'"><xsl:value-of select="$machine"/>.machine</xsl:when>
<xsl:when test="$machine != '' and @id"><xsl:value-of select="$machine"/>.<xsl:value-of select="@id"/></xsl:when>
<xsl:when test="$machine != ''"><xsl:value-of select="$machine"/>.<xsl:value-of select="$component"/></xsl:when>
<xsl:when test="@id"><xsl:value-of select="@id"/></xsl:when>
<xsl:otherwise><xsl:value-of select="$component"/></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="componentURL">
<xsl:choose>
<xsl:when test="$component = 'machine'">url:'<xsl:value-of select="$url"/>'</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="name">
<xsl:choose>
<xsl:when test="name"><xsl:value-of select="name"/></xsl:when>
<xsl:when test="@name"><xsl:value-of select="@name"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="comment">
<xsl:choose>
<xsl:when test="@comment">,comment:'<xsl:value-of select="@comment"/>'</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="border">
<xsl:choose>
<xsl:when test="@border = '1'">border:1px solid black;border-radius:15px;</xsl:when>
<xsl:when test="@border">border:<xsl:value-of select="@border"/>;</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="left">
<xsl:choose>
<xsl:when test="@left">left:<xsl:value-of select="@left"/>;</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="top">
<xsl:choose>
<xsl:when test="@top">top:<xsl:value-of select="@top"/>;</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="width">
<xsl:choose>
<xsl:when test="@width">
<xsl:choose>
<xsl:when test="$left != '' or $top != ''">width:<xsl:value-of select="@width"/>;</xsl:when>
<xsl:otherwise>width:auto;max-width:<xsl:value-of select="@width"/>;</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="height">
<xsl:choose>
<xsl:when test="@height">height:<xsl:value-of select="@height"/>;</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="padding">
<xsl:choose>
<xsl:when test="@padding">padding:<xsl:value-of select="@padding"/>;</xsl:when>
<xsl:otherwise>
<xsl:if test="@padtop">padding-top:<xsl:value-of select="@padtop"/>;</xsl:if>
<xsl:if test="@padright">padding-right:<xsl:value-of select="@padright"/>;</xsl:if>
<xsl:if test="@padbottom">padding-bottom:<xsl:value-of select="@padbottom"/>;</xsl:if>
<xsl:if test="@padleft">padding-left:<xsl:value-of select="@padleft"/>;</xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="pos">
<xsl:choose>
<xsl:when test="@pos = 'left'">float:left;</xsl:when>
<xsl:when test="@pos = 'right'">float:right;</xsl:when>
<xsl:when test="@pos = 'center'">margin:0 auto;</xsl:when>
<xsl:when test="@pos">position:<xsl:value-of select="@pos"/>;</xsl:when>
<xsl:when test="$left != '' or $top != ''">position:relative;</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="style">
<xsl:if test="$component = 'machine'">overflow:auto;width:100%;</xsl:if>
<xsl:if test="@style"><xsl:value-of select="@style"/></xsl:if>
</xsl:variable>
<xsl:variable name="componentClass">
<xsl:value-of select="$APPCLASS"/><xsl:text>-</xsl:text><xsl:value-of select="$component"/><xsl:text> </xsl:text><xsl:value-of select="$APPCLASS"/><xsl:text>-component</xsl:text>
</xsl:variable>
<div id="{$id}" class="{$componentClass}" style="{$width}{$height}{$pos}{$left}{$top}{$padding}" data-value="{$componentURL}">
<xsl:if test="$component = 'machine'">
<xsl:apply-templates select="name" mode="machine"/>
</xsl:if>
<xsl:if test="$component != 'machine'">
<xsl:apply-templates select="name" mode="component"/>
</xsl:if>
<div class="{$APPCLASS}-container" style="{$border}{$style}">
<xsl:if test="$component = 'machine'">
<xsl:apply-templates select="menu" mode="machine"/>
</xsl:if>
<xsl:if test="$component != 'machine'">
<xsl:apply-templates select="menu" mode="component"/>
</xsl:if>
<xsl:if test="$class != '' and $component != 'machine'">
<div class="{$APPCLASS}-{$class}-object" data-value="id:'{$id}',name:'{$name}'{$comment}{$parms}"> </div>
</xsl:if>
<xsl:if test="control">
<div class="{$APPCLASS}-controls">
<xsl:apply-templates select="control" mode="component"/>
</div>
</xsl:if>
<xsl:apply-templates>
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="machineState" select="$machineState"/>
</xsl:apply-templates>
</div>
<xsl:if test="$component = 'machine'">
<xsl:choose>
<xsl:when test="$url != ''"><div class="{$APPCLASS}-reference">[<a href="{$url}">XML</a>]</div></xsl:when>
<xsl:otherwise/>
</xsl:choose>
<div class="{$APPCLASS}-copyright">
<a href="http://{$SITEHOST}" target="_blank">PCjs</a> v<xsl:value-of select="$APPVERSION"/> © 2012-2015 by <a href="http://twitter.com/jeffpar" target="_blank">@jeffpar</a>
</div>
<div style="clear:both"> </div>
</xsl:if>
</div>
</xsl:template>
<xsl:template match="name" mode="machine">
<xsl:variable name="pos">
<xsl:choose>
<xsl:when test="@pos = 'center'">text-align:center;</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<h2 style="{$pos}"><xsl:apply-templates/></h2>
</xsl:template>
<xsl:template match="name" mode="component">
<div class="{$APPCLASS}-name"><xsl:apply-templates/></div>
</xsl:template>
<xsl:template match="menu" mode="component">
<xsl:apply-templates mode="component"/>
</xsl:template>
<xsl:template match="title" mode="component">
<div class="{$APPCLASS}-menu"><xsl:apply-templates/></div>
</xsl:template>
<xsl:template match="control" mode="component">
<xsl:variable name="type">
<xsl:text>type:'</xsl:text><xsl:value-of select="@type"/><xsl:text>'</xsl:text>
</xsl:variable>
<xsl:variable name="binding">
<xsl:text>binding:'</xsl:text><xsl:value-of select="@binding"/><xsl:text>'</xsl:text>
</xsl:variable>
<xsl:variable name="border">
<xsl:choose>
<xsl:when test="@border = '1'">border:1px solid black;</xsl:when>
<xsl:when test="@border">border:<xsl:value-of select="@border"/>;</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="width">
<xsl:choose>
<xsl:when test="@width">width:<xsl:value-of select="@width"/>;</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="height">
<xsl:choose>
<xsl:when test="@height">height:<xsl:value-of select="@height"/>;</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="left">
<xsl:choose>
<xsl:when test="@left">left:<xsl:value-of select="@left"/>;</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="top">
<xsl:choose>
<xsl:when test="@top">top:<xsl:value-of select="@top"/>;</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="padding">
<xsl:choose>
<xsl:when test="@padding">padding:<xsl:value-of select="@padding"/>;</xsl:when>
<xsl:otherwise>
<xsl:if test="@padtop">padding-top:<xsl:value-of select="@padtop"/>;</xsl:if>
<xsl:if test="@padright">padding-right:<xsl:value-of select="@padright"/>;</xsl:if>
<xsl:if test="@padbottom">padding-bottom:<xsl:value-of select="@padbottom"/>;</xsl:if>
<xsl:if test="@padleft">padding-left:<xsl:value-of select="@padleft"/>;</xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="pos">
<xsl:choose>
<xsl:when test="@pos = 'left'">float:left;</xsl:when>
<xsl:when test="@pos = 'right'">float:right;</xsl:when>
<xsl:when test="@pos = 'center'">margin:0 auto;</xsl:when>
<xsl:when test="@pos">position:<xsl:value-of select="@pos"/>;</xsl:when>
<xsl:when test="$left != '' or $top != ''">position:relative;</xsl:when>
<xsl:otherwise><xsl:if test="$left = ''">float:left;</xsl:if></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="style">
<xsl:choose>
<xsl:when test="@style"><xsl:value-of select="@style"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="containerClass">
<xsl:if test="@type = 'container' and @class"><xsl:text> </xsl:text><xsl:value-of select="@class"/></xsl:if>
</xsl:variable>
<xsl:variable name="containerStyle">
<xsl:value-of select="$pos"/><xsl:value-of select="$left"/><xsl:value-of select="$top"/><xsl:value-of select="$padding"/>
<xsl:choose>
<xsl:when test="@type = 'container'"><xsl:value-of select="$border"/><xsl:value-of select="$width"/><xsl:value-of select="$height"/><xsl:value-of select="$style"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<div class="{$APPCLASS}-control{$containerClass}" style="{$containerStyle}">
<xsl:variable name="fontsize">
<xsl:choose>
<xsl:when test="@size = 'large' or @size = 'small'">font-size:<xsl:value-of select="@size"/>;</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="subClass">
<xsl:if test="@label"><xsl:text> </xsl:text><xsl:value-of select="$APPCLASS"/><xsl:text>-label</xsl:text></xsl:if>
</xsl:variable>
<xsl:variable name="labelWidth">
<xsl:if test="@labelwidth">width:<xsl:value-of select="@labelwidth"/>;</xsl:if>
</xsl:variable>
<xsl:variable name="labelStyle">
<xsl:choose>
<xsl:when test="@labelstyle"><xsl:value-of select="@labelstyle"/></xsl:when>
<xsl:otherwise>text-align:right;</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:if test="@label">
<xsl:if test="not(@labelpos) or @labelpos = 'left'">
<div class="{$APPCLASS}-label" style="{$labelWidth}{$labelStyle}"><xsl:value-of select="@label"/></div>
</xsl:if>
</xsl:if>
<xsl:choose>
<xsl:when test="@type = 'canvas'">
<canvas class="{$APPCLASS}-binding {$APPCLASS}-canvas" width="{@width}" height="{@height}" style="-webkit-user-select:none;{$border}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></canvas>
</xsl:when>
<xsl:when test="@type = 'button'">
<button class="{$APPCLASS}-binding" style="-webkit-user-select:none;{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></button>
</xsl:when>
<xsl:when test="@type = 'list'">
<select class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}">
<xsl:apply-templates select="disk|app|manifest" mode="component"/>
</select>
</xsl:when>
<xsl:when test="@type = 'text'">
<input class="{$APPCLASS}-binding" type="text" style="{$border}{$width}{$height}{$style}" data-value="{$type},{$binding}" value="{.}" autocapitalize="off" autocorrect="off"/>
</xsl:when>
<xsl:when test="@type = 'submit'">
<input class="{$APPCLASS}-binding" type="submit" style="{$border}{$fontsize}{$style}" data-value="{$type},{$binding}" value="{.}"/>
</xsl:when>
<xsl:when test="@type = 'textarea'">
<textarea class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$style}" data-value="{$type},{$binding}" readonly="readonly"> </textarea>
</xsl:when>
<xsl:when test="@type = 'heading'">
<div><xsl:value-of select="."/></div>
</xsl:when>
<xsl:when test="@type = 'file'">
<form class="{$APPCLASS}-binding" data-value="{$type},{$binding}">
<fieldset class="{$APPCLASS}-fieldset">
<input type="file"/>
<input type="submit" value="Mount" disabled="true"/>
</fieldset>
</form>
</xsl:when>
<xsl:when test="@type = 'led'">
<div class="{$APPCLASS}-binding {$APPCLASS}-{@type}" data-value="{$type},{$binding}"><xsl:value-of select="."/></div>
</xsl:when>
<xsl:when test="@type = 'separator'">
<hr/>
</xsl:when>
<xsl:when test="@type = 'container'">
<xsl:apply-templates mode="component"/>
</xsl:when>
<xsl:when test="not(@type)">
<div style="clear:both"> </div>
</xsl:when>
<xsl:otherwise>
<div class="{$APPCLASS}-binding{$subClass} {$APPCLASS}-{@type}" style="-webkit-user-select:none;{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></div>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="@label">
<xsl:if test="@labelpos = 'right'">
<div class="{$APPCLASS}-label" style="{$labelWidth}{$labelStyle}"><xsl:value-of select="@label"/></div>
</xsl:if>
<div style="clear:both"> </div>
</xsl:if>
</div>
</xsl:template>
<xsl:template match="disk[@ref]" mode="component">
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/disk" mode="component"/>
</xsl:template>
<xsl:template match="disk[not(@ref)]" mode="component">
<xsl:variable name="desc">
<xsl:if test="@desc">
<xsl:text>desc:'</xsl:text><xsl:value-of select="@desc"/><xsl:text>'</xsl:text>
<xsl:if test="@href">
<xsl:text>,href:'</xsl:text><xsl:value-of select="@href"/><xsl:text>'</xsl:text>
</xsl:if>
</xsl:if>
</xsl:variable>
<option value="{@path}" data-value="{$desc}"><xsl:if test="name"><xsl:value-of select="name"/></xsl:if><xsl:if test="not(name)"><xsl:value-of select="."/></xsl:if></option>
</xsl:template>
<xsl:template match="app[@ref]" mode="component">
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/app" mode="component"/>
</xsl:template>
<xsl:template match="app[not(@ref)]" mode="component">
<xsl:variable name="desc">
<xsl:if test="@desc">
<xsl:text>desc:'</xsl:text><xsl:value-of select="@desc"/><xsl:text>'</xsl:text>
<xsl:if test="@href">
<xsl:text>,href:'</xsl:text><xsl:value-of select="@href"/><xsl:text>'</xsl:text>
</xsl:if>
</xsl:if>
</xsl:variable>
<xsl:variable name="path">
<xsl:if test="@path"><xsl:value-of select="@path"/></xsl:if>
</xsl:variable>
<xsl:variable name="files">
<xsl:for-each select="file"><xsl:if test="position() = 1"><xsl:value-of select="$path"/></xsl:if><xsl:value-of select="@name"/><xsl:if test="position() != last()">;</xsl:if></xsl:for-each>
</xsl:variable>
<option value="{$files}" data-value="{$desc}"><xsl:value-of select="@name"/></option>
</xsl:template>
<xsl:template match="manifest[@ref]" mode="component">
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/manifest" mode="component">
<xsl:with-param name="disk"><xsl:value-of select="@disk"/></xsl:with-param>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="manifest[not(@ref)]" mode="component">
<xsl:param name="disk"><xsl:value-of select="@disk"/></xsl:param>
<xsl:if test="$disk != ''">
<xsl:variable name="prefix">
<xsl:if test="title/@prefix"><xsl:value-of select="title/@prefix"/><xsl:text>: </xsl:text></xsl:if>
</xsl:variable>
<xsl:for-each select="disk">
<xsl:if test="$disk = @id or $disk = '*'">
<xsl:variable name="name">
<xsl:choose>
<xsl:when test="name"><xsl:value-of select="$prefix"/><xsl:value-of select="name"/></xsl:when>
<xsl:when test="normalize-space(./text()) != ''">
<xsl:value-of select="$prefix"/><xsl:value-of select="normalize-space(./text())"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="../title"/><xsl:if test="../version != ''"><xsl:text> </xsl:text><xsl:value-of select="../version"/></xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="link">
<xsl:if test="link">
<xsl:text>desc:'</xsl:text><xsl:value-of select="link"/><xsl:text>'</xsl:text>
<xsl:if test="link/@href">
<xsl:text>,href:'</xsl:text><xsl:value-of select="link/@href"/><xsl:text>'</xsl:text>
</xsl:if>
</xsl:if>
</xsl:variable>
<xsl:if test="@href">
<option value="{@href}" data-value="{$link}"><xsl:value-of select="$name"/></option>
</xsl:if>
<xsl:if test="not(@href)">
<xsl:variable name="dir">
<xsl:if test="@dir"><xsl:value-of select="@dir"/></xsl:if>
</xsl:variable>
<xsl:variable name="files">
<xsl:for-each select="file"><xsl:if test="position() = 1"><xsl:value-of select="$dir"/></xsl:if><xsl:value-of select="@dir"/><xsl:value-of select="."/><xsl:if test="position() != last()">;</xsl:if></xsl:for-each>
</xsl:variable>
<option value="{$files}" data-value="{$link}"><xsl:value-of select="$name"/></option>
</xsl:if>
</xsl:if>
</xsl:for-each>
</xsl:if>
</xsl:template>
<xsl:template match="name">
</xsl:template>
<xsl:template match="title">
</xsl:template>
<xsl:template match="control">
</xsl:template>
<xsl:template match="cpu[@ref]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/cpu"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
</xsl:template>
<xsl:template match="cpu[not(@ref)]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="model">
<xsl:choose>
<xsl:when test="@model"><xsl:value-of select="@model"/></xsl:when>
<xsl:otherwise>8088</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="cycles">
<xsl:choose>
<xsl:when test="@cycles"><xsl:value-of select="@cycles"/></xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="multiplier">
<xsl:choose>
<xsl:when test="@multiplier"><xsl:value-of select="@multiplier"/></xsl:when>
<xsl:otherwise>1</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="autoStart">
<xsl:choose>
<xsl:when test="@autostart"><xsl:value-of select="@autostart"/></xsl:when>
<xsl:otherwise>null</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="csStart">
<xsl:choose>
<xsl:when test="@csstart"><xsl:value-of select="@csstart"/></xsl:when>
<xsl:otherwise>-1</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="csInterval">
<xsl:choose>
<xsl:when test="@csinterval"><xsl:value-of select="@csinterval"/></xsl:when>
<xsl:otherwise>-1</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="csStop">
<xsl:choose>
<xsl:when test="@csstop"><xsl:value-of select="@csstop"/></xsl:when>
<xsl:otherwise>-1</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="class" select="'cpu'"/>
<xsl:with-param name="parms">,model:<xsl:value-of select="$model"/>,cycles:<xsl:value-of select="$cycles"/>,multiplier:<xsl:value-of select="$multiplier"/>,autoStart:<xsl:value-of select="$autoStart"/>,csStart:<xsl:value-of select="$csStart"/>,csInterval:<xsl:value-of select="$csInterval"/>,csStop:<xsl:value-of select="$csStop"/></xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="chipset[@ref]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/chipset"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
</xsl:template>
<xsl:template match="chipset[not(@ref)]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="model">
<xsl:choose>
<xsl:when test="@model"><xsl:value-of select="@model"/></xsl:when>
<xsl:otherwise>5150</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="sw1">
<xsl:choose>
<xsl:when test="@sw1"><xsl:value-of select="@sw1"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="sw2">
<xsl:choose>
<xsl:when test="@sw2"><xsl:value-of select="@sw2"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="sound">
<xsl:choose>
<xsl:when test="@sound"><xsl:value-of select="@sound"/></xsl:when>
<xsl:otherwise>true</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="scaletimers">
<xsl:choose>
<xsl:when test="@scaletimers"><xsl:value-of select="@scaletimers"/></xsl:when>
<xsl:otherwise>false</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="floppies">
<xsl:choose>
<xsl:when test="@floppies"><xsl:value-of select="@floppies"/></xsl:when>
<xsl:otherwise>{}</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="monitor">
<xsl:choose>
<xsl:when test="@monitor"><xsl:value-of select="@monitor"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="rtcdate">
<xsl:choose>
<xsl:when test="@rtcdate"><xsl:value-of select="@rtcdate"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="class">chipset</xsl:with-param>
<xsl:with-param name="parms">,model:'<xsl:value-of select="$model"/>',scaleTimers:<xsl:value-of select="$scaletimers"/>,sw1:'<xsl:value-of select="$sw1"/>',sw2:'<xsl:value-of select="$sw2"/>',sound:<xsl:value-of select="$sound"/>,floppies:<xsl:value-of select="$floppies"/>,monitor:'<xsl:value-of select="$monitor"/>',rtcDate:'<xsl:value-of select="$rtcdate"/>'</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="keyboard[@ref]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/keyboard"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
</xsl:template>
<xsl:template match="keyboard[not(@ref)]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="model">
<xsl:choose>
<xsl:when test="@model"><xsl:value-of select="@model"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="class">keyboard</xsl:with-param>
<xsl:with-param name="parms">,model:'<xsl:value-of select="$model"/>'</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="serial[@ref]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/serial"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
</xsl:template>
<xsl:template match="serial[not(@ref)]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="adapter">
<xsl:choose>
<xsl:when test="@adapter"><xsl:value-of select="@adapter"/></xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="binding">
<xsl:choose>
<xsl:when test="@binding"><xsl:value-of select="@binding"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="class">serial</xsl:with-param>
<xsl:with-param name="parms">,adapter:<xsl:value-of select="$adapter"/>,binding:'<xsl:value-of select="$binding"/>'</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="mouse[@ref]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/mouse"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
</xsl:template>
<xsl:template match="mouse[not(@ref)]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="serial">
<xsl:choose>
<xsl:when test="@serial"><xsl:value-of select="@serial"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="class">mouse</xsl:with-param>
<xsl:with-param name="parms">,serial:'<xsl:value-of select="$serial"/>'</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="fdc[@ref]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/fdc">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="mount" select="@automount"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="fdc[not(@ref)]">
<xsl:param name="machine" select="''"/>
<xsl:param name="mount" select="''"/>
<xsl:variable name="automount">
<xsl:choose>
<xsl:when test="$mount != ''"><xsl:value-of select="$mount"/></xsl:when>
<xsl:otherwise><xsl:value-of select="@automount"/></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="class">fdc</xsl:with-param>
<xsl:with-param name="parms">,autoMount:'<xsl:value-of select="$automount"/>'</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="hdc[@ref]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/hdc"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
</xsl:template>
<xsl:template match="hdc[not(@ref)]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="drives">
<xsl:choose>
<xsl:when test="@drives"><xsl:value-of select="@drives"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="type">
<xsl:choose>
<xsl:when test="@type"><xsl:value-of select="@type"/></xsl:when>
<xsl:otherwise>xt</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="class">hdc</xsl:with-param>
<xsl:with-param name="parms">,drives:'<xsl:value-of select="$drives"/>',type:'<xsl:value-of select="$type"/>'</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="rom[@ref]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/rom"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
</xsl:template>
<xsl:template match="rom[not(@ref)]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="addr">
<xsl:choose>
<xsl:when test="@addr"><xsl:value-of select="@addr"/></xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="size">
<xsl:choose>
<xsl:when test="@size"><xsl:value-of select="@size"/></xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="alias">
<xsl:choose>
<xsl:when test="@alias"><xsl:value-of select="@alias"/></xsl:when>
<xsl:otherwise>null</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="file">
<xsl:choose>
<xsl:when test="@file"><xsl:value-of select="@file"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="notify">
<xsl:choose>
<xsl:when test="@notify"><xsl:value-of select="@notify"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="class">rom</xsl:with-param>
<xsl:with-param name="parms">,addr:<xsl:value-of select="$addr"/>,size:<xsl:value-of select="$size"/>,alias:<xsl:value-of select="$alias"/>,file:'<xsl:value-of select="$file"/>',notify:'<xsl:value-of select="$notify"/>'</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="ram[@ref]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/ram"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
</xsl:template>
<xsl:template match="ram[not(@ref)]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="addr">
<xsl:choose>
<xsl:when test="@addr"><xsl:value-of select="@addr"/></xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="size">
<xsl:choose>
<xsl:when test="@size"><xsl:value-of select="@size"/></xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="test">
<xsl:choose>
<xsl:when test="@test"><xsl:value-of select="@test"/></xsl:when>
<xsl:otherwise>true</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="class">ram</xsl:with-param>
<xsl:with-param name="parms">,addr:<xsl:value-of select="$addr"/>,size:<xsl:value-of select="$size"/>,test:<xsl:value-of select="$test"/></xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="video[@ref]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/video"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
</xsl:template>
<xsl:template match="video[not(@ref)]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="model">
<xsl:choose>
<xsl:when test="@model"><xsl:value-of select="@model"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="mode">
<xsl:choose>
<xsl:when test="@mode"><xsl:value-of select="@mode"/></xsl:when>
<xsl:otherwise>7</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="screenWidth">
<xsl:choose>
<xsl:when test="@screenwidth"><xsl:value-of select="@screenwidth"/></xsl:when>
<xsl:otherwise>256</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="screenHeight">
<xsl:choose>
<xsl:when test="@screenheight"><xsl:value-of select="@screenheight"/></xsl:when>
<xsl:otherwise>224</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="memory">
<xsl:choose>
<xsl:when test="@memory"><xsl:value-of select="@memory"/></xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="switches">
<xsl:choose>
<xsl:when test="@switches"><xsl:value-of select="@switches"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="scale">
<xsl:choose>
<xsl:when test="@scale"><xsl:value-of select="@scale"/></xsl:when>
<xsl:otherwise>false</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="charCols">
<xsl:choose>
<xsl:when test="@cols"><xsl:value-of select="@cols"/></xsl:when>
<xsl:otherwise>80</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="charRows">
<xsl:choose>
<xsl:when test="@rows"><xsl:value-of select="@rows"/></xsl:when>
<xsl:otherwise>25</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="fontROM">
<xsl:choose>
<xsl:when test="@charset"><xsl:value-of select="@charset"/></xsl:when>
<xsl:when test="@fontrom"><xsl:value-of select="@fontrom"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="screenColor">
<xsl:choose>
<xsl:when test="@screencolor"><xsl:value-of select="@screencolor"/></xsl:when>
<xsl:otherwise>black</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="touchScreen">
<xsl:choose>
<xsl:when test="@touchscreen"><xsl:value-of select="@touchscreen"/></xsl:when>
<xsl:otherwise>false</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="autoLock">
<xsl:choose>
<xsl:when test="@autolock"><xsl:value-of select="@autolock"/></xsl:when>
<xsl:otherwise>false</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="class">video</xsl:with-param>
<xsl:with-param name="parms">,model:'<xsl:value-of select="$model"/>',mode:<xsl:value-of select="$mode"/>,screenWidth:<xsl:value-of select="$screenWidth"/>,screenHeight:<xsl:value-of select="$screenHeight"/>,memory:<xsl:value-of select="$memory"/>,switches:'<xsl:value-of select="$switches"/>',scale:<xsl:value-of select="$scale"/>,charCols:<xsl:value-of select="$charCols"/>,charRows:<xsl:value-of select="$charRows"/>,fontROM:'<xsl:value-of select="$fontROM"/>',screenColor:'<xsl:value-of select="$screenColor"/>',touchScreen:<xsl:value-of select="$touchScreen"/>,autoLock:<xsl:value-of select="$autoLock"/></xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="debugger[@ref]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/debugger"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
</xsl:template>
<xsl:template match="debugger[not(@ref)]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="commands">
<xsl:choose>
<xsl:when test="@commands"><xsl:value-of select="@commands"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="messages">
<xsl:choose>
<xsl:when test="@messages"><xsl:value-of select="@messages"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="class">debugger</xsl:with-param>
<xsl:with-param name="parms">,commands:'<xsl:value-of select="$commands"/>',messages:'<xsl:value-of select="$messages"/>'</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="panel[@ref]">
<xsl:param name="machine" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/panel"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
</xsl:template>
<xsl:template match="panel[not(@ref)]">
<xsl:param name="machine" select="''"/>
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="class">panel</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="computer[@ref]">
<xsl:param name="machine" select="''"/>
<xsl:param name="machineState" select="''"/>
<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($componentFile)/computer">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="machineState" select="$machineState"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="computer[not(@ref)]">
<xsl:param name="machine" select="''"/>
<xsl:param name="machineState" select="''"/>
<xsl:variable name="busWidth">
<xsl:choose>
<xsl:when test="@buswidth"><xsl:value-of select="@buswidth"/></xsl:when>
<xsl:otherwise>20</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="resume">
<xsl:choose>
<xsl:when test="@resume and $machineState = ''"><xsl:value-of select="@resume"/></xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="state">
<xsl:choose>
<xsl:when test="$machineState != ''"><xsl:value-of select="$machineState"/></xsl:when>
<xsl:when test="@state"><xsl:value-of select="@state"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="component">
<xsl:with-param name="machine" select="$machine"/>
<xsl:with-param name="class">computer</xsl:with-param>
<xsl:with-param name="parms">,busWidth:<xsl:value-of select="$busWidth"/>,resume:<xsl:value-of select="$resume"/>,state:'<xsl:value-of select="$state"/>'</xsl:with-param>
</xsl:call-template>
</xsl:template>
</xsl:stylesheet>
@CHARSET "UTF-8";
.page {
margin: 2% 2%;
padding: 2% 2%;
min-width: 30em;
overflow: auto;
font-size: large;
font-family: Helvetica, Arial, sans-serif;
background: #303030;
color: #ccc;
}
.page-header {
}
.page-header-title {
text-align: center;
}
.page a {
color: #7fc07f;
text-decoration: none;
}
a.footlink, a.paralink {
text-decoration: none;
}
a.footlink:link, a.paralink:link {
color: blue;
}
a.footlink:visited, a.paralink:visited {
color: blue;
}
.galleryitem {
float: left;
width: 200px;
}
.item {
float: left;
width: 2em;
text-indent: 1em;
}
.list {
margin-left: 3em;
text-indent: 0;
text-align: justify;
}
ul {
list-style: none;
}
div.pnumber {
float: left;
width: 2em;
text-indent: 1em;
}
div.pitem {
margin-left: 10em;
}
p.indent, .justified p {
text-indent: 2em;
text-align: justify;
line-height: 1.5em;
}
p.noindent {
text-indent: 0;
text-align: justify;
}
p.center, .center {
text-align: center;
}
li.para {
margin-top: 1em;
margin-bottom: 1em;
}
.left {
text-align: left;
}
.right {
text-align: right;
}
blockquote.tag {
font-size: small;
font-family: Monaco, Fixed, monospace;
margin-top: 0;
margin-bottom: 0;
}
.blockquote {
padding-left: 1em;
text-indent: 0;
text-align: justify;
}
.italics {
font-style: italic;
}
.medium {
font-size: medium;
}
.small {
font-size: x-small;
}
.smallcaps {
font-variant: small-caps;
}
.strike {
text-decoration: line-through;
}
.summation, .bracelist {
display: inline-block;
position: relative;
vertical-align: middle;
text-align: center;
margin-bottom: 0.5ex;
text-indent: 0;
}
.bracelist-symbol {
font-size: 3em;
vertical-align: -40%;
}
.summation .summation-lower, .summation .summation-upper, .bracelist-item {
display: block;
font-size: 75%;
text-align: center;
}
.summation .summation-upper {
margin-bottom: 0;
margin-left: 0.8ex;
font-style: italic;
}
.summation .summation-lower{
margin-bottom: -0.6ex;
font-style: italic;
}
.summation .summation-symbol {
font-size: 2em;
}
p sup {
vertical-align: baseline;
position: relative;
bottom: .5em;
font-size: small;
}
p sub {
vertical-align: baseline;
position: relative;
bottom: -.5em;
font-size: small;
}
.footnote {
font-size: medium;
text-indent: 1em;
text-align: justify;
margin-top: .5em;
}
.image-right {
float: right;
margin-left: 1em;
margin-top: 1em;
margin-bottom: 1em;
}
.image-caption {
font-size: small;
text-align: center;
}<?xml version="1.0" encoding="UTF-8"?>
<!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2012-05-05" modified="2014-02-23" license="http://www.gnu.org/licenses/gpl.html" -->
<!DOCTYPE xsl:stylesheet [
<!ENTITY nbsp " "> <!ENTITY ne "≠"> <!ENTITY le "≤"> <!ENTITY ge "≥">
<!ENTITY times "×"> <!ENTITY sdot "⋅"> <!ENTITY divide "÷">
<!ENTITY copy "©"> <!ENTITY Sigma "Σ"> <!ENTITY sigma "σ"> <!ENTITY sum "∑"> <!ENTITY lbrace "{">
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template name="documentStyles">
<link rel="stylesheet" type="text/css" href="/versions/pcjs/1.18.2/document.css"/>
</xsl:template>
<xsl:template match="title">
<h1><xsl:apply-templates/></h1>
</xsl:template>
<xsl:template name="p">
<xsl:if test="@id">
<a name="{@id}"></a>
</xsl:if>
<xsl:choose>
<xsl:when test="not(@class)">
<p><xsl:apply-templates/></p>
</xsl:when>
<xsl:otherwise>
<p class="{@class}"><xsl:apply-templates/></p>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="p">
<xsl:call-template name="p"/>
</xsl:template>
<xsl:template match="br">
<br/>
</xsl:template>
<xsl:template match="p[@number]">
<div class="pnumber">
<xsl:choose>
<xsl:when test="not(@number) or @number = ''"> </xsl:when>
<xsl:otherwise><xsl:value-of select="@number"/></xsl:otherwise>
</xsl:choose>
</div>
<div class="pitem">
<xsl:call-template name="p"/>
</div>
</xsl:template>
<xsl:template match="span">
<xsl:choose>
<xsl:when test="not(@class)">
<span><xsl:apply-templates/></span>
</xsl:when>
<xsl:when test="@class = 'italics'">
<em><xsl:apply-templates/></em>
</xsl:when>
<xsl:otherwise>
<span class="{@class}"><xsl:apply-templates/></span>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="h2">
<h2><xsl:apply-templates/></h2>
</xsl:template>
<xsl:template match="h3">
<h3><xsl:apply-templates/></h3>
</xsl:template>
<xsl:template match="h4">
<h4><xsl:apply-templates/></h4>
</xsl:template>
<xsl:template match="h5">
<h5><xsl:apply-templates/></h5>
</xsl:template>
<xsl:template match="h6">
<h6><xsl:apply-templates/></h6>
</xsl:template>
<xsl:template match="em">
<em><xsl:apply-templates/></em>
</xsl:template>
<xsl:template match="strong">
<strong><xsl:apply-templates/></strong>
</xsl:template>
<xsl:template match="a">
<a href="{@href}" target="{@target}"><xsl:apply-templates/></a>
</xsl:template>
<xsl:template match="ol">
<blockquote><ol><xsl:apply-templates/></ol></blockquote>
</xsl:template>
<xsl:template match="ul">
<blockquote><ul><xsl:apply-templates/></ul></blockquote>
</xsl:template>
<xsl:template match="li">
<li><xsl:apply-templates/></li>
</xsl:template>
<xsl:template match="img">
<div><img src="{@src}" alt="image"/></div>
</xsl:template>
<xsl:template match="pre">
<pre><xsl:apply-templates/></pre>
</xsl:template>
<xsl:template match="figure">
<xsl:choose>
<xsl:when test="@pos">
<div class="{@pos}"><img src="{@ref}" alt="{.}"/><br/><xsl:value-of select="."/></div>
</xsl:when>
<xsl:otherwise>
<div><img src="{@ref}" alt="{.}"/><br/><xsl:value-of select="."/></div>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="sub">
<sub><xsl:apply-templates/></sub>
</xsl:template>
<xsl:template match="sup">
<sup><xsl:apply-templates/></sup>
</xsl:template>
<xsl:template match="lt"><</xsl:template>
<xsl:template match="gt">></xsl:template>
<xsl:template match="ne">≠</xsl:template>
<xsl:template match="le">≤</xsl:template>
<xsl:template match="ge">≥</xsl:template>
<xsl:template match="times">×</xsl:template>
<xsl:template match="dot">⋅</xsl:template>
<xsl:template match="divide">÷</xsl:template>
<xsl:template match="sigma">σ</xsl:template>
<xsl:template match="summation">
<span class="summation">
<span class="summation-upper"><xsl:value-of select="@upper"/></span>
<span class="summation-symbol">∑</span>
<span class="summation-lower"><xsl:value-of select="@lower"/></span>
</span>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="bracelist">
<span class="bracelist-symbol">{</span>
<span class="bracelist">
<xsl:for-each select="item">
<span class="bracelist-item"><xsl:apply-templates/></span>
</xsl:for-each>
</span>
</xsl:template>
<xsl:template match="footlink">
<xsl:variable name="docID" select="/document/@id"/>
<a class="footlink" id="fn{$docID}_ref{@n}" href="#fn{$docID}_{@n}"><sup><xsl:if test="@quoted"><xsl:text>[</xsl:text></xsl:if><xsl:value-of select="@n"/><xsl:if test="@quoted"><xsl:text>]</xsl:text></xsl:if></sup></a>
</xsl:template>
<xsl:template match="footnote">
<xsl:variable name="docID" select="/document/@id"/>
<div class="footnote"><a id="fn{$docID}_{@n}" href="#fn{$docID}_ref{@n}"><sup><xsl:value-of select="@n"/></sup></a><xsl:text> </xsl:text>
<xsl:apply-templates/>
</div>
</xsl:template>
<xsl:template name="authors">
<xsl:for-each select="author"><xsl:if test="position() != 1"><xsl:text>, </xsl:text></xsl:if><xsl:if test="position() != 1 and position() = last()"><xsl:text>and </xsl:text></xsl:if><xsl:value-of select="."/></xsl:for-each>
</xsl:template>
<xsl:template name="formatDate">
<xsl:param name="date"/>
<xsl:param name="format">MDY</xsl:param>
<xsl:variable name="year">
<xsl:value-of select="substring-before($date,'-')"/>
</xsl:variable>
<xsl:variable name="mon-day">
<xsl:value-of select="substring-after($date,'-')"/>
</xsl:variable>
<xsl:variable name="mon">
<xsl:value-of select="substring-before($mon-day,'-')"/>
</xsl:variable>
<xsl:variable name="full-day">
<xsl:value-of select="substring-after($mon-day,'-')"/>
</xsl:variable>
<xsl:variable name="day">
<xsl:choose>
<xsl:when test="substring($full-day,1,1) = '0'"><xsl:value-of select="substring($full-day,2)"/></xsl:when>
<xsl:otherwise><xsl:value-of select="$full-day"/></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:choose>
<xsl:when test="$mon = '01'">January </xsl:when>
<xsl:when test="$mon = '02'">February </xsl:when>
<xsl:when test="$mon = '03'">March </xsl:when>
<xsl:when test="$mon = '04'">April </xsl:when>
<xsl:when test="$mon = '05'">May </xsl:when>
<xsl:when test="$mon = '06'">June </xsl:when>
<xsl:when test="$mon = '07'">July </xsl:when>
<xsl:when test="$mon = '08'">August </xsl:when>
<xsl:when test="$mon = '09'">September </xsl:when>
<xsl:when test="$mon = '10'">October </xsl:when>
<xsl:when test="$mon = '11'">November </xsl:when>
<xsl:when test="$mon = '12'">December </xsl:when>
<xsl:when test="$mon = '00'"/> </xsl:choose>
<xsl:if test="$day != '0' and $format = 'MDY'">
<xsl:value-of select="$day"/><xsl:text>, </xsl:text>
</xsl:if>
<xsl:value-of select="$year"/>
</xsl:template>
<xsl:template match="gallery">
<h2><xsl:value-of select="description"/></h2>
<div class="gallery">
<xsl:apply-templates select="item" mode="gallery"/>
</div>
<div style="clear:both;"></div>
</xsl:template>
<xsl:template match="item" mode="gallery">
<div class="galleryitem">
<a href="{@ref}"><img src="/versions/images/current/pdf-192.jpg" alt="{.}"/></a><br/>
<div style="font-size:small; text-align:center;"><xsl:value-of select="."/></div>
</div>
</xsl:template>
<xsl:template match="list[@type = 'timeline']">
<xsl:if test="not(description)">
<h2>Timeline</h2>
</xsl:if>
<xsl:if test="description">
<h2><xsl:value-of select="description"/></h2>
</xsl:if>
<blockquote>
<xsl:apply-templates select="item" mode="timeline"/>
</blockquote>
</xsl:template>
<xsl:template match="item" mode="timeline">
<xsl:if test="@ref">
<xsl:variable name="documentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($documentFile)/document" mode="withDate">
<xsl:with-param name="itemRef" select="@ref"/>
</xsl:apply-templates>
</xsl:if>
<xsl:if test="not(@ref)">
<h3><xsl:call-template name="formatDate"><xsl:with-param name="date" select="@date"/></xsl:call-template></h3>
<blockquote>
<xsl:value-of select="."/>
</blockquote>
</xsl:if>
</xsl:template>
<xsl:template match="list[@type = 'people']">
<xsl:if test="not(description)">
<h2>People</h2>
</xsl:if>
<xsl:if test="description">
<h2><xsl:value-of select="description"/></h2>
</xsl:if>
<blockquote>
<xsl:apply-templates select="item" mode="people"/>
</blockquote>
</xsl:template>
<xsl:template match="item" mode="people">
<h3><xsl:value-of select="name"/></h3>
<xsl:apply-templates select="list"/>
</xsl:template>
<xsl:template match="list[@type = 'documents']">
<xsl:if test="description"><h2><xsl:value-of select="description"/></h2></xsl:if>
<ul>
<xsl:apply-templates select="item" mode="document"/>
</ul>
</xsl:template>
<xsl:template match="item" mode="document">
<xsl:variable name="documentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
<xsl:apply-templates select="document($documentFile)/document">
<xsl:with-param name="itemRef" select="@ref"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="document">
<xsl:param name="itemRef"/>
<li>
<xsl:call-template name="documentSummary"><xsl:with-param name="itemRef" select="$itemRef"/></xsl:call-template>
</li>
</xsl:template>
<xsl:template match="document" mode="withDate">
<xsl:param name="itemRef"/>
<h3><xsl:call-template name="formatDate"><xsl:with-param name="date" select="date"/><xsl:with-param name="format" select="MY"/></xsl:call-template></h3>
<blockquote>
<p>
<xsl:call-template name="documentSummary"><xsl:with-param name="itemRef" select="$itemRef"/><xsl:with-param name="multiLine" select="'true'"/></xsl:call-template>
</p>
</blockquote>
</xsl:template>
<xsl:template name="documentSummary">
<xsl:param name="itemRef"/>
<xsl:param name="multiLine">false</xsl:param>
<xsl:choose>
<xsl:when test="content|include">
<a href="{$itemRef}"><xsl:value-of select="title"/></a>
<xsl:if test="@ref">
<span class="small">
<xsl:text> [</xsl:text><a href="{@ref}">Original</a><xsl:text>]</xsl:text>
</span>
</xsl:if>
</xsl:when>
<xsl:otherwise>
<a href="{$itemRef}"><xsl:value-of select="title"/></a>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="copy">
<span class="small">
<xsl:text> [</xsl:text><a href="{copy/@ref}"><xsl:value-of select="copy"/></a><xsl:text>]</xsl:text>
</span>
</xsl:if>
<xsl:if test="author"><xsl:if test="$multiLine = 'true'"><br/></xsl:if><span class="medium"><xsl:text> by </xsl:text><xsl:call-template name="authors"/></span></xsl:if>
<xsl:if test="source">
<span class="small">
<br/>
<xsl:text>[Source: </xsl:text>
<xsl:if test="site">
<a href="{site/@url}"><xsl:value-of select="site"/></a>
</xsl:if>
<xsl:if test="not(site)">
<a href="{source/@url}"><xsl:value-of select="source"/></a>
</xsl:if>
<xsl:text>]</xsl:text>
</span>
</xsl:if>
</xsl:template>
<xsl:template match="list[@type = 'resources']">
<xsl:if test="not(description)">
<h2>Resources</h2>
</xsl:if>
<xsl:if test="description">
<h2><xsl:value-of select="description"/></h2>
</xsl:if>
<blockquote>
<xsl:apply-templates select="item" mode="resources"/>
</blockquote>
</xsl:template>
<xsl:template match="item" mode="resources">
<h3><xsl:value-of select="description"/></h3>
<xsl:apply-templates select="list"/>
</xsl:template>
<xsl:template match="list[@type = 'links']">
<xsl:if test="description">
<h4><xsl:value-of select="description"/></h4>
</xsl:if>
<ul>
<xsl:apply-templates select="item" mode="links"/>
</ul>
</xsl:template>
<xsl:template match="item" mode="links">
<li><a href="{@ref}"><xsl:value-of select="."/></a></li>
</xsl:template>
<xsl:template match="list[not(@type)]">
<xsl:if test="description">
<h2><xsl:value-of select="description"/></h2>
</xsl:if>
<blockquote>
<xsl:apply-templates select="item|tag" mode="outer"/>
</blockquote>
</xsl:template>
<xsl:template match="item" mode="outer">
<xsl:if test="description">
<h3><xsl:value-of select="description"/></h3>
</xsl:if>
<xsl:apply-templates select="list|item|tag" mode="inner"/>
</xsl:template>
<xsl:template match="list" mode="inner">
<xsl:if test="description">
<h4><xsl:value-of select="description"/></h4>
</xsl:if>
<ul>
<xsl:apply-templates select="list|item|para|tag" mode="inner"/>
</ul>
</xsl:template>
<xsl:template name="innerlist">
<xsl:if test="description">
<xsl:value-of select="description"/>
</xsl:if>
<ul>
<xsl:apply-templates select="list|item|para|tag" mode="inner"/>
</ul>
</xsl:template>
<xsl:template match="item" mode="inner">
<xsl:choose>
<xsl:when test="@ref">
<li><a href="{@ref}"><xsl:apply-templates/></a></li>
</xsl:when>
<xsl:when test="description">
<li><xsl:call-template name="innerlist"/></li>
</xsl:when>
<xsl:otherwise>
<li><xsl:apply-templates/></li>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="para" mode="inner">
<li class="para"><xsl:apply-templates/></li>
</xsl:template>
<xsl:template match="tag" mode="outer">
<xsl:call-template name="tag"/>
</xsl:template>
<xsl:template match="tag" mode="inner">
<xsl:call-template name="tag"/>
</xsl:template>
<xsl:template name="tag">
<blockquote class="tag">
<xsl:text><</xsl:text><xsl:if test="@href"><a href="{@href}"><xsl:value-of select="@name"/></a></xsl:if><xsl:if test="not(@href)"><xsl:value-of select="@name"/></xsl:if><xsl:for-each select="attr"><xsl:text> </xsl:text><xsl:value-of select="@name"/><xsl:text>="</xsl:text><xsl:value-of select="@value"/><xsl:text>"</xsl:text></xsl:for-each>
<xsl:choose>
<xsl:when test="tag"><xsl:text>></xsl:text><xsl:apply-templates mode="inner"/><xsl:text></</xsl:text><xsl:value-of select="@name"/><xsl:text>></xsl:text></xsl:when>
<xsl:when test="normalize-space(.) != ''"><xsl:text>></xsl:text><xsl:value-of select="."/><xsl:text></</xsl:text><xsl:value-of select="@name"/><xsl:text>></xsl:text></xsl:when>
<xsl:otherwise><xsl:text>/></xsl:text></xsl:otherwise>
</xsl:choose>
</blockquote>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2012-05-05" modified="2014-02-23" license="http://www.gnu.org/licenses/gpl.html" -->
<!DOCTYPE xsl:stylesheet [
<!ENTITY nbsp " "> <!ENTITY sect "§"> <!ENTITY copy "©"> <!ENTITY para "¶"> <!ENTITY ndash "–"> <!ENTITY mdash "—">
<!ENTITY lsquo "‘"> <!ENTITY rsquo "’"> <!ENTITY ldquo "“"> <!ENTITY rdquo "”"> <!ENTITY dagger "†"> <!ENTITY Dagger "‡">
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output doctype-system="about:legacy-compat"/>
<xsl:include href="/versions/pcjs/1.18.2/common.xsl"/>
<xsl:include href="/versions/pcjs/1.18.2/components.xsl"/>
<xsl:template match="/machine">
<html lang="en">
<head>
<title><xsl:value-of select="$SITEHOST"/></title>
<xsl:call-template name="commonStyles"/>
<xsl:call-template name="componentStyles"/>
</head>
<body>
<div class="common">
<xsl:call-template name="commonTop"/>
<div class="common-middle">
<p></p>
<div id="{@id}" class="machine {@class}js">
<xsl:call-template name="component">
<xsl:with-param name="machine" select="@id"/>
<xsl:with-param name="component" select="'machine'"/>
<xsl:with-param name="class"><xsl:value-of select="@class"/>js</xsl:with-param>
<xsl:with-param name="parms"><xsl:if test="@parms">,<xsl:value-of select="@parms"/></xsl:if></xsl:with-param>
</xsl:call-template>
</div>
</div>
<xsl:call-template name="commonBottom"/>
</div>
<xsl:call-template name="componentScripts">
<xsl:with-param name="component">
<xsl:choose>
<xsl:when test="debugger"><xsl:value-of select="@class"/>-dbg</xsl:when>
<xsl:otherwise><xsl:value-of select="@class"/></xsl:otherwise>
</xsl:choose>
</xsl:with-param>
</xsl:call-template>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2014-04-10" modified="2014-04-10" license="http://www.gnu.org/licenses/gpl.html" -->
<!DOCTYPE xsl:stylesheet [
<!ENTITY nbsp " "> <!ENTITY sect "§"> <!ENTITY copy "©"> <!ENTITY para "¶"> <!ENTITY ndash "–"> <!ENTITY mdash "—">
<!ENTITY lsquo "‘"> <!ENTITY rsquo "’"> <!ENTITY ldquo "“"> <!ENTITY rdquo "”"> <!ENTITY dagger "†"> <!ENTITY Dagger "‡">
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output doctype-system="about:legacy-compat"/>
<xsl:include href="/versions/pcjs/1.18.2/common.xsl"/>
<xsl:include href="/versions/pcjs/1.18.2/components.xsl"/>
<xsl:template match="/manifest[@type = 'document']">
<html lang="en">
<head>
<title><xsl:value-of select="$SITEHOST"/></title>
<xsl:call-template name="commonStyles"/>
<xsl:call-template name="componentStyles"/>
</head>
<body>
<div class="common">
<xsl:call-template name="commonTop"/>
<div class="common-middle">
<h4>Document Manifest</h4>
<div class="common-sidebar">
<ul class="common-list-data">
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Title'"/>
<xsl:with-param name="node" select="title"/>
<xsl:with-param name="default">None</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Version'"/>
<xsl:with-param name="node" select="version"/>
<xsl:with-param name="default" select="''"/>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Source'"/>
<xsl:with-param name="node" select="source"/>
<xsl:with-param name="default" select="''"/>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Documents'"/>
<xsl:with-param name="node" select="document"/>
<xsl:with-param name="default"><xsl:value-of select="title"/> <xsl:if test="version != ''"><xsl:text> </xsl:text><xsl:value-of select="version"/></xsl:if></xsl:with-param>
</xsl:call-template>
</ul>
</div>
<div class="common-main">
<p><xsl:value-of select="desc"/></p>
<xsl:call-template name="commonBottom"/>
</div>
</div>
</div>
</body>
</html>
</xsl:template>
<xsl:template match="/manifest[@type = 'software' or not(@type)]">
<xsl:variable name="machineClass">
<xsl:choose>
<xsl:when test="machine/@class"><xsl:value-of select="machine/@class"/></xsl:when>
<xsl:otherwise><xsl:value-of select="$MACHINECLASS"/></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<html lang="en">
<head>
<title><xsl:value-of select="$SITEHOST"/></title>
<xsl:call-template name="commonStyles"/>
<xsl:call-template name="componentStyles"/>
</head>
<body>
<div class="common">
<xsl:call-template name="commonTop"/>
<div class="common-middle">
<h4>Software Manifest</h4>
<div class="common-sidebar">
<ul class="common-list-data">
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Title'"/>
<xsl:with-param name="node" select="title"/>
<xsl:with-param name="default">None</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Version'"/>
<xsl:with-param name="node" select="version"/>
<xsl:with-param name="default">Unknown</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Type'"/>
<xsl:with-param name="node" select="type"/>
<xsl:with-param name="default">None</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Category'"/>
<xsl:with-param name="node" select="category"/>
<xsl:with-param name="default">None</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Created'"/>
<xsl:with-param name="node" select="creationDate"/>
<xsl:with-param name="default" select="''"/>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Creators'"/>
<xsl:with-param name="node" select="creator"/>
<xsl:with-param name="default" select="''"/>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label"><xsl:if test="creationDate">Updated</xsl:if><xsl:if test="not(creationDate)">Released</xsl:if></xsl:with-param>
<xsl:with-param name="node" select="releaseDate"/>
<xsl:with-param name="default">Unknown</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Company'"/>
<xsl:with-param name="node" select="company"/>
<xsl:with-param name="default" select="''"/>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Authors'"/>
<xsl:with-param name="node" select="author"/>
<xsl:with-param name="default" select="''"/>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Contributors'"/>
<xsl:with-param name="node" select="contributor"/>
<xsl:with-param name="default" select="''"/>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Publisher'"/>
<xsl:with-param name="node" select="publisher"/>
<xsl:with-param name="default" select="''"/>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'License'"/>
<xsl:with-param name="node" select="license"/>
<xsl:with-param name="default" select="''"/>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Source'"/>
<xsl:with-param name="node" select="source"/>
<xsl:with-param name="default" select="''"/>
</xsl:call-template>
<xsl:call-template name="listItem">
<xsl:with-param name="label" select="'Disks'"/>
<xsl:with-param name="node" select="disk"/>
<xsl:with-param name="default"><xsl:value-of select="title"/> <xsl:if test="version != ''"><xsl:text> </xsl:text><xsl:value-of select="version"/></xsl:if></xsl:with-param>
</xsl:call-template>
</ul>
</div>
<div class="common-main">
<xsl:for-each select="machine[not(@type) or @type = 'default']">
<xsl:call-template name="machine">
<xsl:with-param name="href" select="@href"/>
<xsl:with-param name="state" select="@state"/>
</xsl:call-template>
</xsl:for-each>
<xsl:if test="not(machine[not(@type) or @type = 'default'])">
<p>No default machine specified for '<xsl:value-of select="title"/>' in manifest.xml</p>
</xsl:if>
<xsl:call-template name="commonBottom"/>
</div>
</div>
</div>
<xsl:call-template name="componentScripts">
<xsl:with-param name="component">
<xsl:choose>
<xsl:when test="machine/@debugger"><xsl:value-of select="$machineClass"/>-dbg</xsl:when>
<xsl:otherwise><xsl:value-of select="$machineClass"/></xsl:otherwise>
</xsl:choose>
</xsl:with-param>
</xsl:call-template>
</body>
</html>
</xsl:template>
<xsl:template name="listItem">
<xsl:param name="label"/>
<xsl:param name="node"/>
<xsl:param name="default">Unknown</xsl:param>
<xsl:if test="$node != '' or $default != ''">
<li><xsl:value-of select="$label"/>
<ul class="common-list-data-items">
<xsl:for-each select="$node">
<xsl:variable name="desc">
<xsl:choose>
<xsl:when test="desc"><xsl:value-of select="desc"/></xsl:when>
<xsl:when test="org"><xsl:value-of select="org"/></xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<li title="{$desc}">
<xsl:variable name="value">
<xsl:choose>
<xsl:when test="name">
<xsl:value-of select="name"/>
</xsl:when>
<xsl:when test="normalize-space(./text()) != ''">
<xsl:value-of select="normalize-space(./text())"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$default"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="href">
<xsl:if test="@href"><xsl:value-of select="@href"/></xsl:if>
</xsl:variable>
<xsl:choose>
<xsl:when test="$href != ''">
<a href="{$href}"><xsl:value-of select="$value"/></a>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$value"/>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="page">
<ul class="common-list-data-subitems">
<xsl:for-each select="page">
<li>
<xsl:if test="@href">
<a href="{$href}{@href}"><xsl:value-of select="."/></a>
</xsl:if>
<xsl:if test="not(@href)">
<xsl:value-of select="."/>
</xsl:if>
</li>
</xsl:for-each>
</ul>
</xsl:if>
</li>
</xsl:for-each>
<xsl:if test="not($node)">
<xsl:if test="@href">
<a href="{@href}"><xsl:value-of select="$default"/></a>
</xsl:if>
<xsl:if test="not(@href)">
<xsl:value-of select="$default"/>
</xsl:if>
</xsl:if>
</ul>
</li>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?> <!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2012-05-05" modified="2014-02-23" license="http://www.gnu.org/licenses/gpl.html" --> <!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp " "> <!ENTITY sect "§"> <!ENTITY copy "©"> <!ENTITY para "¶"> <!ENTITY ndash "–"> <!ENTITY mdash "—"> <!ENTITY lsquo "‘"> <!ENTITY rsquo "’"> <!ENTITY ldquo "“"> <!ENTITY rdquo "”"> <!ENTITY dagger "†"> <!ENTITY Dagger "‡"> ]> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output doctype-system="about:legacy-compat"/> <xsl:include href="/versions/pcjs/1.18.2/common.xsl"/> <xsl:include href="/versions/pcjs/1.18.2/document.xsl"/> <xsl:include href="/versions/pcjs/1.18.2/components.xsl"/> <xsl:template match="/outline"> <xsl:variable name="machineClass"> <xsl:choose> <xsl:when test="machine/@class"><xsl:value-of select="machine/@class"/></xsl:when> <xsl:otherwise><xsl:value-of select="$MACHINECLASS"/></xsl:otherwise> </xsl:choose> </xsl:variable> <html lang="en"> <head> <title><xsl:value-of select="title"/><xsl:text> | </xsl:text><xsl:value-of select="$SITEHOST"/></title> <xsl:call-template name="commonStyles"/> <xsl:call-template name="documentStyles"/> <xsl:call-template name="componentStyles"/> </head> <body> <div class="common"> <div class="page justified"> <xsl:apply-templates/> </div> </div> <xsl:call-template name="componentScripts"> <xsl:with-param name="component"> <xsl:choose> <xsl:when test="debugger"><xsl:value-of select="$machineClass"/>-dbg</xsl:when> <xsl:otherwise><xsl:value-of select="$machineClass"/></xsl:otherwise> </xsl:choose> </xsl:with-param> </xsl:call-template> </body> </html> </xsl:template> </xsl:stylesheet>
(function(){var f,ca,ea,fa={163840:[40,1,8],184320:[40,1,9],327680:[40,2,8],368640:[40,2,9],737280:[80,2,9],1228800:[80,2,15],1474560:[80,2,18],2949120:[80,2,36]};
function ga(a,b){var c;if(a){b||(b=16);if("$"==a.charAt(0))b=16,a=a.substr(1);else if("0x"==a.substr(0,2))b=16,a=a.substr(2);else{var d=a.charAt(a.length-1).toLowerCase();"h"==d?(b=16,d=null):"."==d&&(b=10,d=null);null===d&&(a=a.substr(0,a.length-1))}var e,d=a;(b&&10!=b?16==b?null!==d.match(/^[0-9a-f]+$/i):1:null!==d.match(/^[0-9]+$/))&&!isNaN(e=parseInt(a,b))&&(c=e|0)}return c}
function h(a,b){var c="";void 0===b?b=8:8<b&&(b=8);if(null==a||isNaN(a))for(;0<b--;)c="?"+c;else for(;0<b--;){var d=a&15,d=d+(0<=d&&9>=d?48:55),c=String.fromCharCode(d)+c;a>>=4}return c}function k(a){return"0x"+h(a,2)}function ha(a){return"0x"+h(a,4)}function ia(a,b){var c=a,d=a.lastIndexOf("/");0<=d&&(c=a.substr(d+1));d=c.indexOf("&");0<d&&(c=c.substr(0,d));b&&(d=c.lastIndexOf("."),0<d&&(c=c.substring(0,d)));return c}
function ja(a){var b="",c=a.lastIndexOf(".");0<=c&&(b=a.substr(c+1).toLowerCase());return b}var ka={"&":"&","<":"<",">":">",'"':""","'":"'"};function la(a){return a.replace(/[&<>"']/g,function(a){return ka[a]})}function ma(a,b){var c="",d;for(d in a)d=d.replace(/([\\[\]*{}().+?])/g,"\\$1"),c+=(c?"|":"")+d;return b.replace(new RegExp("("+c+")","g"),function(b){return a[b]})}function na(a,b){return a+" ".substr(0,b-a.length)}
function oa(a){return String.prototype.trim?a.trim():a.replace(/^\s+|\s+$/g,"")}function qa(a,b,c){var d=0,e=a.length,g=0;for(void 0===c&&(c=function(a,b){return a>b?1:a<b?-1:0});d<e;){var l=d+e>>1,p;p=c(b,a[l]);0<p?d=l+1:(e=l,g=!p)}return g?d:~d}function ra(a,b,c){c=qa(a,b,c);0>c&&a.splice(-(c+1),0,b)}var ta=Date.now||function(){return+new Date};
function ua(){function a(a){return(10>a?"0":"")+a}var b=new Date;return b.getFullYear()+"-"+a(b.getMonth()+1)+"-"+a(b.getDate())+" "+a(b.getHours())+":"+a(b.getMinutes())+":"+a(b.getSeconds())}var va=[31,28,31,30,31,30,31,31,30,31,30,31];function wa(a,b){var c=0,d=1,e;for(e in a){if(d>=arguments.length)break;d++;c=void 0}return c}function xa(a,b){return(b&a.Mq)>>a.shift}
function ya(a,b){var c;if(Array.prototype.indexOf)return a.indexOf(b,c);c=c||0;0>c&&(c+=a.length);0>c&&(c=0);for(var d=a.length;c<d;c++)if(c in a&&a[c]===b)return c;return-1}
function za(a,b,c,d,e,g){b=!!b;var l=0,p=null,w=ia(a),v=window.XMLHttpRequest?new window.XMLHttpRequest:new window.ActiveXObject("Microsoft.XMLHTTP");b&&(v.onreadystatechange=function(){4===v.readyState&&(p=v.responseText,200==v.status||!v.status&&p.length&&"file:"==(window?window.location.protocol:"file:")||(l=v.status||-1),e&&(d?e.call(d,w,p,l,g):e(w,p,l,g)))});if(c){var E="",O;for(O in c)c.hasOwnProperty(O)&&(E&&(E+="&"),E+=O+"="+encodeURIComponent(c[O]));E=E.replace(/%20/g,"+");v.open("POST",
a,b);v.setRequestHeader("Content-type","application/x-www-form-urlencoded");v.send(E)}else v.open("GET",a,b),v.send();a=[];b||(p=v.responseText,200!=v.status&&(l=v.status||-1),e&&(d?e.call(d,w,p,l,g):e(w,p,l,g)),a=[l,p]);return a}function Aa(){return"http://"+(window?window.location.host:"www.pcjs.org")}function Ca(a){window&&window.alert(a)}function Da(a){var b=!1;window&&(b=window.confirm(a));return b}var Ea=null;
function Fa(){if(null==Ea){var a=!1;if(window)try{window.localStorage.setItem("PCjs.localStorage","PCjs.localStorage"),a="PCjs.localStorage"==window.localStorage.getItem("PCjs.localStorage"),window.localStorage.removeItem("PCjs.localStorage")}catch(b){a=!1}Ea=a}return Ea}function Ha(a){var b;if(window)try{b=window.localStorage.getItem(a)}catch(c){}return b}function Ia(a,b){try{return window.localStorage.setItem(a,b),!0}catch(c){}return!1}
function Ja(a){if(window){var b=window?window.navigator.userAgent:"";return"iOS"==a&&b.match(/(iPod|iPhone|iPad)/)&&b.match(/AppleWebKit/)||"MSIE"==a&&b.match(/(MSIE|Trident)/)||0<=b.indexOf(a)?!0:!1}return!1}function Ka(a,b,c){function d(){--a;0<=a&&(b()||(a=0));0<a?setTimeout(d,0):c()}d()}
function La(a,b){function c(){b(100===d)&&(e=setTimeout(c,d),d=100)}var d=0,e=null,g=!1;a.onmousedown=function(){g||e||(d=500,c())};a.ontouchstart=function(){e||(d=500,c())};a.onmouseup=a.onmouseout=function(){e&&(clearTimeout(e),e=null)};a.ontouchend=a.ontouchcancel=function(){e&&(clearTimeout(e),e=null);g=!0}}var Ma={init:[],show:[],exit:[]},Na=!1,Oa=!0;function Pa(a,b){if(window){var c=window[a];window[a]="function"!==typeof c?b:function(){c&&c();b()}}}function Qa(a){Ma.init.push(a)}
function Sa(a){if(Oa)try{for(var b=0;b<a.length;b++)a[b]()}catch(c){Ca("An unexpected exception occurred:\n\n"+c.message+"\n\nPlease send this information to support@pcjs.org. Thanks.")}}function Ta(a){!Oa&&a?(Oa=!0,Na&&Va("init")):Oa=a}function Va(a){Ma[a]&&Sa(Ma[a])}Pa("onload",function(){Na=!0;Sa(Ma.init)});Pa("onpageshow",function(){Sa(Ma.show)});Pa(Ja("Opera")||Ja("iOS")?"onunload":"onbeforeunload",function(){Sa(Ma.exit)});
function Wa(a,b,c,d){this.type=a;b||(b={id:"",name:""});this.id=b.id;this.name=b.name;this.Dn=b.comment;this.fs=b;void 0===this.id&&(this.id="");b=this.id.indexOf(".");0<b?(this.ao=this.id.substr(0,b),this.Jg=this.id.substr(b+1)):this.Jg=this.id;this[a]=c;this.fa={Bg:!1,Zc:!1,dl:!1,hc:!1,Kd:!1};this.dj=null;this.fa.Kd=!1;this.va={};this.Y=null;this.Xb=d||-1;Xa[Xa.length]=this}var $a=void 0,ab={};
if(window){$a||($a=window.location.search.substr(1));for(var bb,cb=/\+/g,db=/([^&=]+)=?([^&]*)/g;bb=db.exec($a);)ab[decodeURIComponent(bb[1].replace(cb," "))]=decodeURIComponent(bb[2].replace(cb," "))}function eb(a){function b(){}if(window){if(!a)throw new TypeError;if(Object.create)return Object.create(a);var c=typeof a;if("object"!==c&&"function"!==c)throw new TypeError;}b.prototype=a;return new b}
function fb(a,b){b||(b=Wa);a.prototype=eb(b.prototype);a.prototype.constructor=a;a.prototype.parent=b.prototype}var Xa=[];function gb(a){var b,c=[];a&&(a=0<(b=a.indexOf("."))?a.substr(0,b+1):"");for(b=0;b<Xa.length;b++){var d=Xa[b];a&&d.id.indexOf(a)||c.push(d)}return c}function hb(a,b){if(void 0!==a){var c;b&&0<(c=b.indexOf("."))&&(a=b.substr(0,c+1)+a);for(c=0;c<Xa.length;c++)if(Xa[c].id===a)return Xa[c]}return null}
function ib(a,b){var c;if(void 0!==a){var d;b&&(b=0<(d=b.indexOf("."))?b.substr(0,d+1):"");for(d=0;d<Xa.length;d++)if(c)c==Xa[d]&&(c=null);else if(!(a!=Xa[d].type||b&&Xa[d].id.indexOf(b)))return Xa[d]}return null}function jb(a){var b=null;if(a=a.getAttribute("data-value"))try{b=eval("({"+a+"})")}catch(c){Ca(c.message+" ("+a+")")}return b}window&&!window.document.ELEMENT_NODE&&(window.document.ELEMENT_NODE=1);
function kb(a,b){for(var c=lb(b.parentNode,"pcjs-control"),d=0;d<c.length;d++)for(var e=c[d].childNodes,g=0;g<e.length;g++){var l=e[g];if(l.nodeType===window.document.ELEMENT_NODE){var p=l.getAttribute("class");if(p)for(var w=p.split(" "),v=0;v<w.length;v++)switch(p=w[v],p){case "pcjs-binding":(p=jb(l))&&p.binding&&a.Lb(p.type,p.binding,l),v=w.length}}}}
function lb(a,b,c){c&&(b+="-"+c+"-object");if(a.getElementsByClassName)return a.getElementsByClassName(b);var d;c=[];a=a.getElementsByTagName("*");var e=new RegExp("(^| )"+b+"( |$)");b=0;for(d=a.length;b<d;b++)e.test(a[b].className)&&c.push(a[b]);return c}
Wa.prototype={constructor:Wa,parent:null,toString:function(){return this.name?this.name:this.id||this.type},Lb:function(a,b,c){switch(b){case "clear":return this.va[b]||(this.va[b]=c,c.onclick=function(a){return function(){a.va.print&&(a.va.print.value="")}}(this)),!0;case "print":return this.va[b]||(this.Gh=this.va[b]=c,c.value="",this.R=function(a){return function(b,c){8192<a.value.length&&(a.value=a.value.substr(a.value.length-4096));a.value+=(void 0!==c?c+": ":"")+(b||"")+"\n";a.scrollTop=a.scrollHeight}}(c),
this.Da=function(a,b,c){this.R(a,"notice",c)}),!0;default:return!1}},log:function(){},assert:function(){},R:function(){},status:function(a){this.R(this.Jg+": "+a)},Da:function(a,b){b||Ca(a)},kc:function(){return this.fa.hc=!0},jc:function(a,b){b&&(this.fa.hc=!1);return!0},qa:function(a){if(this.Y){a=this===this.Y?a|0:a||this.Xb;var b=this.Y.Xb&a;return b===a||!!(b&this.Y.$o)}return!1},$a:function(a,b,c){return this.Y?((!0===b||this.qa(b|0))&&this.Y.message(a,c),!0):!1}};
function m(a,b,c,d,e,g,l){a.Y&&(!0===l?l=0:null==l&&(l=a.Xb),mb(a.Y,a,b,c,d,e,g,l))}function nb(a,b){if(a.fa.dl)return a.fa.Zc&&(a.fa.Zc=!1),a.fa.dl=!1;if(a.fa.Kd)return a.R(a.toString()+" error"),!1;a.fa.Zc=b;return a.fa.Zc}function ob(a,b){a.fa.Zc&&(b?a.fa.dl=!0:void 0===b&&a.R(a.toString()+" busy"));return a.fa.Zc}function pb(a,b){if(!a.fa.Kd&&(a.fa.Bg=!1!==b,a.fa.Bg)){var c=a.dj;a.dj=null;c&&c()}}function qb(a,b){b&&(a.fa.Bg?b():a.dj=b);return a.fa.Bg}function sb(a,b){a.fa.Kd=!0;a.Da(b)}
var tb="undefined"!==typeof ArrayBuffer;function ub(a){Wa.call(this,"Panel",a,ub);this.canvas=null;this.Me=this.Ne=this.Rh=-1}fb(ub);function vb(a,b,c,d){this.Yf=[a,b,c,d];this.uk=null;void 0===a&&(this.Yf[0]=256*Math.random()|0,this.Yf[1]=256*Math.random()|0,this.Yf[2]=256*Math.random()|0,this.Yf[3]=255,this.uk=null)}vb.prototype.toString=function(){this.uk||(this.uk="#"+h(this.Yf[0],2)+h(this.Yf[1],2)+h(this.Yf[2],2));return this.uk};function wb(a,b,c,d){this.x=a;this.y=b;this.Wc=c;this.md=d}
wb.prototype.contains=function(a,b){return a>=this.x&&a<this.x+this.Wc&&b>=this.y&&b<this.y+this.md};function xb(a,b,c,d){void 0===d&&(d=b>=c>>2);d?(b=new wb(a.x,a.y,a.Wc,a.md*b/c|0),a.y+=b.md,a.md-=b.md):(b=new wb(a.x,a.y,a.Wc*b/c|0,a.md),a.x+=b.Wc,a.Wc-=b.Wc);return b}f=ub.prototype;f.Lb=function(a,b,c){return this.Fa&&this.Fa.Lb(a,b,c)||this.O&&this.O.Lb(a,b,c)||this.Ka&&this.Ka.Lb(a,b,c)||this.Y&&this.Y.Lb(a,b,c)?!0:this.parent.Lb.call(this,a,b,c)};
f.Ic=function(a,b,c,d){this.Fa=a;this.ma=b;this.O=c;this.Y=d;this.Ka=yb(a,"Keyboard")};f.kc=function(a,b){b||zb();return!0};f.jc=function(){return!0};f.Xk=function(a,b){a.button||(this.Rh=b?0:-1,Ab(this,a,b))};f.ho=function(a){Ab(this,a)};
function Ab(a,b,c){var d=1280/a.canvas.offsetWidth,e=720/a.canvas.offsetHeight,g=a.canvas.getBoundingClientRect(),d=(b.clientX-g.left)*d|0;b=(b.clientY-g.top)*e|0;null==c&&(a.Rh||(a.Rh=Math.abs(a.Me-d)>Math.abs(a.Ne-b)?1:2),1==a.Rh?b=a.Ne:2==a.Rh&&(d=a.Me));a.Me=d;a.Ne=b;if(0<=d&&1280>d&&0<=b&&720>b){a:{c=d;if(960>c&&a.kb&&a.kb.mg)for(g=0;g<a.kb.mg.length;g++)if(e=a.kb.mg[g],e.contains(c,b)){c-=e.x;b-=e.y;var d=a.kb.qh[g],l=xa(Bb.uo,a.kb.Bk[d.Bp]),g=l*a.ma.lb,d=(l+d.pe)*a.ma.lb-1;0<b&&(g+=e.Wc*(b-
1)*a.xo);g+=c*a.xo;g|=0;g>d&&(g=d);c=g;break a}c=n}c!==n&&(c&=-16,c!=a.mn&&(Cb(a,c,!0),a.mn=c))}}
f.yd=function(){if(this.canvas&&this.Ti&&this.Ze&&this.If){var a=this.Ze.width,b=this.Ze.height;this.If.fillStyle="black";this.If.fillRect(0,0,a,b);Db(this,18,this.Ze,this.If,this.canvas.style.color);Gb(this,3);Hb(this,"CPU");Hb(this,"Target");Hb(this,"Current");Jb(this);Hb(this,this.O.la);Hb(this,Kb(this.O));Hb(this,Lb(this.O));Jb(this,2);Gb(this,8);this.Vq=16;this.Wq=4;Hb(this,"AX",this.O.F,2);Hb(this,"DS",this.O.ab.ia,0,1);Hb(this,"DX",this.O.H,2);Hb(this,"SI",this.O.K,0,1.5);Hb(this,"BX",this.O.D,
2);Hb(this,"ES",this.O.Na.ia,0,1);Hb(this,"CX",this.O.G,2);Hb(this,"DI",this.O.J,0,1.5);Hb(this,"CS",Mb(this.O),2);Hb(this,"SS",this.O.ua.ia,0,1);Hb(this,"IP",q(this.O),2);Hb(this,"SP",r(this.O),0,1.5);var c;Hb(this,"PS",c=Nb(this.O),2);Hb(this,"BP",this.O.L,0,1.5);Gb(this,9);Hb(this,"V"+(c&Ob?1:0));Hb(this,"D"+(c&Pb?1:0));Hb(this,"I"+(c&Qb?1:0));Hb(this,"T"+(c&Rb?1:0));Hb(this,"S"+(c&Sb?1:0));Hb(this,"Z"+(c&Tb?1:0));Hb(this,"A"+(c&Ub?1:0));Hb(this,"P"+(c&Vb?1:0));Hb(this,"C"+(c&Wb?1:0),0,2);Cb(this,
this.mn);this.Ti.drawImage(this.Ze,0,0,a,b,this.Du,this.Gu,this.bu,this.eu)}};function Xb(a,b,c,d){a.kb.qh[a.kb.xn++]={Bp:b,pe:c,type:d};return wa(Bb,b,c,0,d)}
function Cb(a,b,c){if(a.Ti&&a.Ze&&a.If){var d=a.Ze.width;a.If.fillStyle="black";a.If.fillRect(0,360,d,360);Db(a,378,a.Ze,a.If,a.canvas.style.color);Gb(a,24);if(null==b)Hb(a,"Mouse over memory to dump");else{Hb(a,"0x"+h(b),null,0,1);for(var e=1;16>=e;e++){for(var g="",l=1;8>=l;l++){var p=Yb(a.ma,b++);Hb(a,h(p,2),null,1);g+=32<=p&&128>p?String.fromCharCode(p):"."}Hb(a,g,null,0,1)}}c&&a.Ti.drawImage(a.Ze,0,360,d,360,a.Bu,a.Eu,a.$t,a.cu)}}
function Db(a,b,c,d,e){var g,l=a.$s=10;a.zd=l;a.ig=b;a.Gg=a.Yn=18;g||(g=a.Un||a.Yn+"px Monaco, Lucida Console, Courier New");a.ej=a.Un=g;c&&(a.bp=c);d&&(a.Zd=d,a.hp=e||"white")}function Gb(a,b){a.Yk=a.bp.width/b|0}function Jb(a,b){a.zd=a.$s;a.ig+=(a.Gg+2)*(b||1)}function Hb(a,b,c,d,e){a.Zd.font=a.ej;a.Zd.fillStyle=a.hp;a.Zd.fillText(b,a.zd,a.ig);a.zd+=a.Yk;null!=c&&(b=c.toString(),16==a.Vq&&(b="0x"+h(c,a.Wq)),a.Zd.fillText(b,a.zd,a.ig),a.zd+=a.Yk);d&&(a.zd+=a.Yk*d);e&&Jb(a,e)}
function zb(){for(var a=!1,b=lb(window.document,"pcjs","panel"),c=0;c<b.length;c++){var d=b[c],e=jb(d),g=hb(e.id);g||(a=!0,g=new ub(e));kb(g,d);a&&pb(g)}}Qa(zb);
function Zb(a,b,c){Wa.call(this,"Bus",a,Zb);this.O=b;this.Y=c;this.ze=a.buswidth||20;this.Hk=Math.pow(2,this.ze);this.Th=this.Cb=this.Hk-1|0;this.Ca=32==this.ze||20>=this.ze?12:24>=this.ze?14:15;this.lb=1<<this.Ca;this.ko=this.lb>>2;this.Ga=this.lb-1;this.ye=this.Hk/this.lb|0;this.sd=this.ye-1;this.je=[];this.ke=[];this.Oh=this.Ph=!1;this.sl();pb(this)}fb(Zb);var Bb,$b={uo:20,count:8,Yt:1,type:3},ac=0,bc;for(bc in $b){var cc=$b[bc];$b[bc]={Mq:(1<<cc)-1<<ac,shift:ac};ac+=cc}Bb=void 0;f=Zb.prototype;
f.sl=function(){var a=new t;this.na=Array(this.ye);for(var b=0;b<this.ye;b++)this.na[b]=a;this.O.sl(this.na,this.Ca);a=this.O;a.Cb=a.Ce=this.Cb};f.reset=function(){dc(this,!0)};f.kc=function(a,b){b||this.reset();return!0};
function ec(a,b,c,d,e){for(var g=b>>>a.Ca;0<c&&g<a.na.length;){var l=a.na[g],p=g*a.lb,w=c>a.lb?a.lb:c;if(l&&l.size){if(l.type==d&&l.Z==e){if(b+c<=l.Ba)return l.eg+=l.Ba-b,l.Ba=b,!0;if(b>=l.Ba+l.eg){w=l.size-(b-p);w>c&&(w=c);l.eg=b-l.Ba+w;c-=w;b=p+a.lb;continue}}return fc(1,b,c)}l=a.na[g++]=new t(b,w,a.lb,d,e);a.Y&&gc(l,a.Y,b,a.lb);c-=w;b=p+a.lb}return 0<c?fc(2,b,c):!0}
function dc(a,b){if(32==a.ze)b?a.jg&&(hc(a,1048576,1048576,a.jg),a.jg=null):a.jg||(a.jg=ic(a,1048576,1048576),hc(a,1048576,1048576,ic(a,0,1048576)));else if(20<a.ze){var c=a.Cb&-1048577|(b?1048576:0);if(c!=a.Cb&&(a.Cb=c,a.O)){var d=a.O;d.Cb=d.Ce=c}}}f.wk=function(a,b,c){if(!(a&this.Ga||!b||b&this.Ga)){for(var d=a>>>this.Ca;0<b;){var e=this.na[d];if(!e.Z)return fc(5,a,b);e.Rd(c);b-=this.lb;d++}return!0}return fc(3,a,b)};
function jc(a,b,c){if(!(b&a.Ga||!c||c&a.Ga)){for(var d=b>>>a.Ca;0<c;){b=d*a.lb;var e=a.na[d++]=new t(b);a.Y&&gc(e,a.Y,b,a.lb);c-=a.lb}return!0}return fc(4,b,c)}function ic(a,b,c){var d=[];for(b>>>=a.Ca;0<c&&b<a.na.length;)d.push(a.na[b++]),c-=a.lb;return d}function hc(a,b,c,d,e){for(var g=0,l=b>>>a.Ca;0<c&&l<a.na.length;){var p=d[g++];if(!p)break;if(void 0!==e){var w=new t(b);a.Y&&gc(w,a.Y,b,a.lb);w.clone(p,e);p=w}a.na[l++]=p;c-=a.lb}}
f.Ra=function(a){return this.na[(a&this.Cb)>>>this.Ca].sc(a&this.Ga,a)};function Yb(a,b){return a.na[(b&a.Cb)>>>a.Ca].Wg(b&a.Ga,b)}f.ra=function(a){var b=a&this.Ga,c=(a&this.Cb)>>>this.Ca;return b!=this.Ga?this.na[c].gi(b,a):this.na[c++].sc(b,a)|this.na[c&this.sd].sc(0,a+1)<<8};function kc(a,b){var c=b&a.Ga,d=(b&a.Cb)>>>a.Ca;return c!=a.Ga?a.na[d].Km(c,b):a.na[d++].Wg(c,b)|a.na[d&a.sd].Wg(0,b+1)<<8}
f.de=function(a){var b=a&this.Ga,c=(a&this.Cb)>>>this.Ca;if(b<this.Ga-2)return this.na[c].Bc(b,a);var d=(b&3)<<3;return this.na[c].Bc(b&-4,a)>>>d|this.na[c+1&this.sd].Bc(0,a+3)<<32-d};f.cd=function(a,b){this.na[(a&this.Cb)>>>this.Ca].Ec(a&this.Ga,b&255,a)};f.Ib=function(a,b){var c=a&this.Ga,d=(a&this.Cb)>>>this.Ca;c!=this.Ga?this.na[d].ri(c,b&65535,a):(this.na[d++].Ec(c,b&255,a),this.na[d&this.sd].Ec(0,b>>8&255,a+1))};
function lc(a,b,c){var d=b&a.Ga,e=(b&a.Cb)>>>a.Ca;d!=a.Ga?a.na[e].Ym(d,c&65535,b):(a.na[e++].qi(d,c&255,b),a.na[e&a.sd].qi(0,c>>8&255,b+1))}f.vk=function(a,b){var c=a&this.Ga,d=(a&this.Cb)>>>this.Ca;if(c<this.Ga-2)this.na[d].Le(c,b);else{var e,g=(c&3)<<3,c=c&-4;e=this.na[d].Bc(c,a);this.na[d].Le(c,e&~(-1<<g)|b<<g,a);d=d+1&this.sd;a+=3;e=this.na[d].Bc(0,a);this.na[d].Le(0,e&-1<<g|b>>>32-g,a)}};
function mc(a){for(var b=0,c=[],d=0;d<a.ye;d++){var e=a.na[d];if(e.Ua||e.Ln){c[b++]=d;var g=b++;a:if(e=e.save()){for(var l=0,p=0,w=[];l<e.length;){for(var v=e[l],E=l+1;E<e.length&&e[E]===v;)E++;w[p++]=E-l;w[p++]=v;l=E}if(w.length<e.length){e=w;break a}}c[g]=e}}c[b]=!a.jg&&a.Th==a.Cb;return c}function nc(a,b){if(void 0===b)return a.Oh=!a.Oh,a.Oh;void 0===a.je[b]&&(a.je[b]=[null,null,!1]);a.je[b][2]=!a.je[b][2];return a.je[b][2]}
function oc(a,b,c,d){void 0===d&&(d=0);for(var e in c){var g=a,l=+e+d,p=b,w=c[e];if(void 0!==w)for(var v=+e+d;v<=l;v++)void 0!==g.je[v]?Ca("Input port "+ha(v)+" registered by "+g.je[v][0].id+", ignoring "+p.id):g.je[v]=[p,w,!1,!1]}}function pc(a,b,c){var d=255,e=a.je[b];void 0!==e?(e[1]&&(c=e[1].call(e[0],b,c),void 0!==c&&(d=c)),a.Y&&a.Oh!=e[2]&&qc(a.Y,b,d)):a.Y&&(mb(a.Y,a,b,null,c),a.Oh&&qc(a.Y,b,d));return d}
function rc(a,b){if(void 0===b)return a.Ph=!a.Ph,a.Ph;void 0===a.ke[b]&&(a.ke[b]=[null,null,!1]);a.ke[b][2]=!a.ke[b][2];return a.ke[b][2]}function sc(a,b,c,d){void 0===d&&(d=0);for(var e in c){var g=a,l=+e+d,p=b,w=c[e];if(void 0!==w)for(var v=+e+d;v<=l;v++)void 0!==g.ke[v]?Ca("Output port "+ha(v)+" registered by "+g.ke[v][0].id+", ignoring "+p.id):g.ke[v]=[p,w,!1,!1]}}
function tc(a,b,c,d){var e=a.ke[b];void 0!==e?(e[1]&&e[1].call(e[0],b,c,d),a.Y&&a.Ph!=e[2]&&uc(a.Y,b,c)):a.Y&&(mb(a.Y,a,b,c,d),a.Ph&&uc(a.Y,b,c))}function fc(a,b,c){Ca("Memory block error ("+a+","+h(b)+","+h(c)+")");return!1}var vc;if(tb){var wc=new ArrayBuffer(2);(new DataView(wc)).setUint16(0,256,!0);vc=256===(new Uint16Array(wc))[0]}else vc=!1;var xc=vc;
function t(a,b,c,d,e,g){this.id=yc+=2;this.ea=null;this.offset=0;this.Ba=a;this.eg=b;this.size=c||0;this.type=d||zc;this.ce=d==Ac;this.Z=null;this.O=g;this.Ua=this.Ln=!1;Bc(this);if(c)if(e)this.Z=e,a=e.Wn(a),this.ea=a[0],this.offset=a[1],this.Rd(e.pl());else if(tb)this.buffer=new ArrayBuffer(c),this.ef=new DataView(this.buffer,0,c),this.Vb=new Uint8Array(this.buffer,0,c),this.Di=new Uint16Array(this.buffer,0,c>>1),this.ea=new Int32Array(this.buffer,0,c>>2),this.Rd(xc?Cc:Dc);else{this.ea=Array(c>>
2);for(e=0;e<this.ea.length;e++)this.ea[e]=0;this.Rd(Ec)}else this.Rd()}var zc=0,Ac=2,Fc="NONE RAM ROM VIDEO H/W UNPAGED PAGED".split(" "),Gc=["black","blue","green","cyan"],yc=0;function Hc(a){tb&&!xc&&(a=a<<24|a<<8&16711680|a>>8&65280|a>>>24);return a}
t.prototype={constructor:t,parent:null,clone:function(a,b){this.id=a.id|1;this.eg=a.eg;this.size=a.size;b&&(this.type=b,this.ce=b==Ac);tb?(this.buffer=a.buffer,this.ef=a.ef,this.Vb=a.Vb,this.Di=a.Di,this.ea=a.ea,this.Rd(xc?Cc:Dc)):(this.ea=a.ea,this.Rd(Ec))},save:function(){var a,b;if(this.Z)a=null;else if(tb)for(a=Array(this.size>>2),b=0;b<a.length;b++)a[b]=this.ef.getInt32(b<<2,!0);else a=this.ea;return a},restore:function(a){if(this.Z)return null==a;if(a&&this.size==a.length<<2){var b;if(tb)for(b=
0;b<a.length;b++)this.ef.setInt32(b<<2,a[b],!0);else this.ea=a;return this.Ua=!0}return!1},Rd:function(a){a||(a=5==this.type?Jc:6==this.type?Kc:Lc);Mc(this,a,!0);Nc(this,a,!0)},Ue:function(a,b){this.Y&&(b?0===this.zn++&&Nc(this,Oc):0===this.wn++&&Mc(this,Oc))},Ao:function(){this.Y&&this.Y.qa(128)&&this.Y.message("attempt to read invalid block %"+h(this.Ba),!0);return 255},xf:function(a,b){this.Y&&this.Y.qa(128)&&this.Y.message("attempt to write "+ha(b)+" to invalid block %"+h(this.Ba),!0)},Bo:function(a,
b){return this.sc(a,b)|this.sc(a+1,b)<<8},yo:function(a,b){return this.sc(a,b)|this.sc(a+1,b)<<8|this.sc(a+2,b)<<16|this.sc(a+3,b)<<24},Uo:function(a,b){this.Ec(a,b&255);this.Ec(a+1,b>>8)},So:function(a,b){this.Ec(a,b&255);this.Ec(a+1,b>>8&255);this.Ec(a+2,b>>16&255);this.Ec(a+3,b>>>24)},ms:function(a){return this.ea[a>>2]>>>((a&3)<<3)&255},ys:function(a){var b=a>>2;a=(a&3)<<3;var c=this.ea[b]>>a;return 24>a?c&65535:c&255|(this.ea[b+1]&255)<<8},ss:function(a){var b=a>>2;a=(a&3)<<3;var c=this.ea[b];
a&&(c=c>>>a|this.ea[b+1]<<32-a);return c},Ls:function(a,b){var c=a>>2,d=(a&3)<<3;this.ea[c]=this.ea[c]&~(255<<d)|b<<d;this.Ua=!0},Xs:function(a,b){var c=a>>2,d=(a&3)<<3;24>d?this.ea[c]=this.ea[c]&~(65535<<d)|b<<d:(this.ea[c]=this.ea[c]&16777215|b<<24,c++,this.ea[c]=this.ea[c]&-256|b>>8);this.Ua=!0},Rs:function(a,b){var c=a>>2,d=(a&3)<<3;if(d){var e=-1<<d;this.ea[c]=this.ea[c]&~e|b<<d;c++;this.ea[c]=this.ea[c]&e|b>>>32-d}else this.ea[c]=b;this.Ua=!0},ks:function(a,b){this.Y&&Pc(this.Y,b);return this.Wg(a,
b)},ws:function(a,b){this.Y&&(Pc(this.Y,b)||Pc(this.Y,b+1));return this.Km(a,b)},qs:function(a,b){this.Y&&(Pc(this.Y,b)||Pc(this.Y,b+1)||Pc(this.Y,b+2)||Pc(this.Y,b+3));return this.zo(a,b)},Js:function(a,b,c){this.Y&&Qc(this.Y,c);this.ce?this.xf(a,b,c):this.qi(a,b,c)},Vs:function(a,b,c){this.Y&&(Qc(this.Y,c)||Qc(this.Y,c+1));this.ce?this.xf(a,b,c):this.Ym(a,b,c)},Ps:function(a,b,c){this.Y&&(Qc(this.Y,this.Ba+a)||Qc(this.Y,this.Ba+a+1)||Qc(this.Y,this.Ba+a+2)||Qc(this.Y,this.Ba+a+3));this.ce?this.xf(a,
b,c):this.To(a,b,c)},ns:function(a,b){this.jd.ea[this.pd]|=this.oe;this.kd.ea[this.qd]|=this.oe;return this.qg.sc(a,b)},zs:function(a,b){this.jd.ea[this.pd]|=this.oe;this.kd.ea[this.qd]|=this.oe;return this.qg.gi(a,b)},ts:function(a,b){this.jd.ea[this.pd]|=this.oe;this.kd.ea[this.qd]|=this.oe;return this.qg.Bc(a,b)},Ms:function(a,b,c){this.jd.ea[this.pd]|=this.oe;this.kd.ea[this.qd]|=this.Rk;this.qg.Ec(a,b,c)},Ys:function(a,b,c){this.jd.ea[this.pd]|=this.oe;this.kd.ea[this.qd]|=this.Rk;this.qg.ri(a,
b,c)},Ss:function(a,b,c){this.jd.ea[this.pd]|=this.oe;this.kd.ea[this.qd]|=this.Rk;this.qg.Le(a,b,c)},os:function(a,b){return(Rc(this.O,b,!1)||this).sc(a,b)},As:function(a,b){return(Rc(this.O,b,!1)||this).gi(a,b)},us:function(a,b){return(Rc(this.O,b,!1)||this).Bc(a,b)},Ns:function(a,b,c){(Rc(this.O,c,!0)||this).Ec(a,b,c)},Zs:function(a,b,c){(Rc(this.O,c,!0)||this).ri(a,b,c)},Ts:function(a,b,c){(Rc(this.O,c,!0)||this).Le(a,b,c)},js:function(a){return this.Vb[a]},ls:function(a){return this.Vb[a]},vs:function(a){return this.ef.getUint16(a,
!0)},xs:function(a){return a&1?this.Vb[a]|this.Vb[a+1]<<8:this.Di[a>>1]},ps:function(a){return this.ef.getInt32(a,!0)},rs:function(a){return a&3?this.Vb[a]|this.Vb[a+1]<<8|this.Vb[a+2]<<16|this.Vb[a+3]<<24:this.ea[a>>2]},Is:function(a,b){this.Vb[a]=b;this.Ua=!0},Ks:function(a,b){this.Vb[a]=b;this.Ua=!0},Us:function(a,b){this.ef.setUint16(a,b,!0);this.Ua=!0},Ws:function(a,b){a&1?(this.Vb[a]=b,this.Vb[a+1]=b>>8):this.Di[a>>1]=b;this.Ua=!0},Os:function(a,b){this.ef.setInt32(a,b,!0);this.Ua=!0},Qs:function(a,
b){a&3?(this.Vb[a]=b,this.Vb[a+1]=b>>8,this.Vb[a+2]=b>>16,this.Vb[a+3]=b>>24):this.ea[a>>2]=b;this.Ua=!0}};function Sc(a,b){a.Y&&(b?0===--a.zn&&(a.Ec=a.ce?a.xf:a.qi,a.ri=a.ce?a.xf:a.Ym,a.Le=a.ce?a.xf:a.To):0===--a.wn&&(a.sc=a.Wg,a.gi=a.Km,a.Bc=a.zo))}function Bc(a,b,c,d,e,g){a.qg=b;a.jd=c;a.pd=d>>2;a.kd=e;a.qd=g>>2;a.Rk=b?Hc(Tc|Uc):0;a.oe=b?Hc(Tc):0}function gc(a,b,c,d){a.Y=b;a.wn=a.zn=0;Vc(a.Y,c,d)}
function Nc(a,b,c){a.Ec=!a.ce&&b[3]||a.xf;a.ri=!a.ce&&b[4]||a.Uo;a.Le=!a.ce&&b[5]||a.So;c&&(a.qi=b[3]||a.xf,a.Ym=b[4]||a.Uo,a.To=b[5]||a.So)}function Mc(a,b,c){a.sc=b[0]||a.Ao;a.gi=b[1]||a.Bo;a.Bc=b[2]||a.yo;c&&(a.Wg=b[0]||a.Ao,a.Km=b[1]||a.Bo,a.zo=b[2]||a.yo)}
var Lc=[],Ec=[t.prototype.ms,t.prototype.ys,t.prototype.ss,t.prototype.Ls,t.prototype.Xs,t.prototype.Rs],Oc=[t.prototype.ks,t.prototype.ws,t.prototype.qs,t.prototype.Js,t.prototype.Vs,t.prototype.Ps],Kc=[t.prototype.ns,t.prototype.zs,t.prototype.ts,t.prototype.Ms,t.prototype.Ys,t.prototype.Ss],Jc=[t.prototype.os,t.prototype.As,t.prototype.us,t.prototype.Ns,t.prototype.Zs,t.prototype.Ts];
if(tb)var Dc=[t.prototype.js,t.prototype.vs,t.prototype.ps,t.prototype.Is,t.prototype.Us,t.prototype.Os],Cc=[t.prototype.ls,t.prototype.xs,t.prototype.rs,t.prototype.Ks,t.prototype.Ws,t.prototype.Qs];
function Wc(a,b){Wa.call(this,"CPU",a,Wc,1);var c=a.cycles||b,d=a.multiplier||1;this.T={};this.T.ee=c;this.T.Ae=d;this.T.gj=Math.round(this.T.ee/1E4)/100;this.T.Sh=this.T.gj*this.T.Ae;this.fa.qb=!1;this.fa.ll=!1;this.fa.cl=a.autoStart;this.fa.Mn=!1;c=ab.autostart;void 0!==c&&(this.fa.cl="true"==c?!0:"false"==c?!1:null);this.fa.yg=!1;this.T.Uh=this.T.Mg=0;this.T.Vh=a.csStart;this.T.Lg=a.csInterval;this.T.Ng=a.csStop;this.Bd=[];var e=this;this.er=function(){e.Zf()};pb(this)}fb(Wc);f=Wc.prototype;
f.Ic=function(a,b,c,d){this.ma=b;this.Y=d;this.Fa=a;for(b=null;b=yb(a,"Video",b);)this.Bd.push(b);this.ja=yb(a,"ChipSet");pb(this)};f.reset=function(){};f.save=function(){return null};f.restore=function(){return!1};f.kc=function(a,b){if(!b){if(a&&this.restore){Xc(this);if(!this.restore(a))return!1;Yc(this)}else this.reset();this.Y?this.Y.Dq():this.R("No debugger detected")}Zc(this);return!0};f.jc=function(a){return a&&this.save?this.save():!0};
function $c(a){(!0===a.fa.cl||null===a.fa.cl&&!a.Y&&void 0===a.va.run)&&a.Zf()}f.Vn=function(){return 0};function Yc(a){void 0===a.T.Vh&&(a.T.Vh=0);void 0===a.T.Lg&&(a.T.Lg=-1);void 0===a.T.Ng&&(a.T.Ng=-1);a.fa.yg=0<=a.T.Vh&&0<a.T.Lg;a.fa.yg&&(a.T.Uh=0,a.T.Mg=a.T.Vh-a.Uf)}function bd(a,b){if(a.fa.yg){var c=!1;a.T.Uh=a.T.Uh+a.Vn()|0;a.T.Mg-=b;0>=a.T.Mg&&(a.T.Mg+=a.T.Lg,c=!0);0<=a.T.Ng&&a.T.Ng<=cd(a)&&(a.T.Lg=a.T.Ng=-1,Yc(a),a.yb(),c=!0);c&&a.R(cd(a)+" cycles: checksum="+h(a.T.Uh))}}
f.yd=function(){this.Fa&&this.Fa.Ee&&this.Fa.Ee.yd()};
function dd(a){for(var b=0;b<a.Bd.length;b++)ed(a.Bd[b]);if(a.Fa&&a.Fa.Ee&&(a=a.Fa.Ee,a.wp)){Db(a,18,a.Bh,a.ip,a.canvas.style.color);if(a.iu){var b=a.ma,c=a.kb,d,e;null==d&&(d=0);null==e&&(e=b.Hk-d|0);null==c&&(c={Vk:0,pe:0,Bk:[]});var g=d>>>b.Ca;d=d+e-1>>>b.Ca;c.Vk=0;for(c.pe=0;g<=d;)e=b.na[g],c.Vk+=e.size,e.size&&(c.Bk.push(wa(Bb,g,0,0,e.type)),c.pe++),g++;a.kb=c;a.xo=a.kb.pe*a.ma.lb/691200;b=0;a.kb.xn=0;a.kb.qh||(a.kb.qh=[]);c=-1;d=0;var l=-1;for(e=0;e<a.kb.pe;e++){var p=a.kb.Bk[e],g=xa(Bb.type,
p),p=xa(Bb.uo,p);if(g!=c||p!=l+1)(l=e-d)&&(b+=Xb(a,d,l,c)),c=g,d=e;l=p}b+=Xb(a,d,e-d,c);c=a.kb.gp!=b;a.kb.gp=b;if(c){c=new wb(0,0,a.Bh.width,a.Bh.height);a.kb.mg=[];d=a.kb.pe;for(b=0;b<a.kb.xn;b++)e=a.kb.qh[b].pe,a.kb.mg.push(xb(c,e,d,!b)),d-=e;for(b=0;b<a.kb.mg.length;b++)c=a.kb.qh[b],d=e=a.kb.mg[b],g=a.ip,(l=Gc[c.type])||(l=new vb),g.strokeStyle="black",g.strokeRect(d.x,d.y,d.Wc,d.md),g.fillStyle="string"==typeof l?l:l.toString(),g.fillRect(d.x,d.y,d.Wc,d.md),d=a,g=e,d.ej=d.Un,d.Gg=d.Yn,e=g.x+(g.Wc>>
1),l=g.y+(g.md>>1),p=g.md,g.Wc<g.md&&(p=g.Wc,d.Sn=!0,d.Zd.save(),d.Zd.translate(e,l),d.Zd.rotate(-Math.PI/2),e=l=0),p<d.Gg&&(d.Gg=p,d.ej=d.Gg+"px Monaco, Lucida Console, Courier New"),g=l,d.zd=e,d.ig=g,d=a,c=Fc[c.type]+" ("+(c.pe*a.ma.lb/1024|0)+"Kb)",d.Zd.font=d.ej,d.zd-=d.Zd.measureText(c).width>>1,d.ig+=(d.Gg>>1)-2,Hb(d,c),d.Sn&&(d.Zd.restore(),d.Sn=!1)}}else Hb(a,"This space intentionally left blank");a.Ti.drawImage(a.Bh,0,0,a.Bh.width,a.Bh.height,a.Cu,a.Fu,a.au,a.du);a.wp=!1}}
f.dd=function(){this.Bd.length&&this.Bd[0].dd()};
f.Lb=function(a,b,c){var d=this;a=!1;switch(b){case "run":this.va[b]=c;c.onclick=function(){var a;if(a=d.Fa)if(a=d.Fa,a.fa.hc)a=!0;else{var b=null,c,p=gb(a.id);for(c=0;c<p.length&&(b=p[c],b===a||b.fa.Bg);c++);if(c==p.length)for(c=0;c<p.length&&(b=p[c],b===a||b.fa.hc);c++);c==p.length&&(b=a);Ca("The "+b.type+" component ("+b.id+") is not "+(b.fa.Bg?"powered yet":"ready yet"+(b.dj?" (waiting for notification)":""))+".");a=!1}a&&(d.fa.qb?d.yb(!0):d.Zf(!0))};a=!0;break;case "reset":this.va[b]=c;c.onclick=
function(){d.Fa&&fd(d.Fa)};a=!0;break;case "speed":this.va[b]=c;a=!0;break;case "setSpeed":this.va[b]=c,c.onclick=function(){gd(d,d.T.Ae<<1,!0)},c.textContent=Kb(this),a=!0}return a};function hd(a,b){if(a.fa.qb){var c=a.A-b;a.A-=c;a.td-=c}}function id(a,b,c){a.Uf+=b;c&&(a.td=a.A=0)}
function jd(a,b){var c=30;60>c&&(c=60);2>c&&(c=2);var d=1;b&&1<a.T.Ae&&a.T.kf&&(d=a.T.kf/a.T.gj);a.T.io=Math.round(1E3/30);a.T.Tq=Math.floor(a.T.ee/c*d);a.T.zl=Math.floor(a.T.ee/30*d);a.T.no=Math.floor(a.T.ee/60*d);a.T.mo=Math.floor(a.T.ee/2*d);b||(a.T.Og=a.T.zl,a.T.Xh=a.T.no,a.T.Wh=a.T.mo);a.T.Al=0}function cd(a,b){var c=a.Uf+a.of+a.td-a.A;b&&1<a.T.Ae&&a.T.kf>a.T.gj&&(c=Math.round(c/a.T.Ae));return c}function Xc(a){a.T.kf=0;a.Uf=a.of=a.td=a.A=0;Yc(a);gd(a,1)}
function Lb(a){return a.fa.qb&&a.T.kf?a.T.kf.toFixed(2)+"Mhz":"Stopped"}function Kb(a){return a.T.Sh.toFixed(2)+"Mhz"}function gd(a,b,c){if(void 0!==b){.8>a.T.kf/a.T.Sh&&(b=1);a.T.Ae=b;b=a.T.gj*a.T.Ae;if(a.T.Sh!=b){a.T.Sh=b;b=Kb(a);var d=a.va.setSpeed;d&&(d.textContent=b);a.R("target speed: "+b)}c&&a.dd()}id(a,a.of);a.of=0;a.T.Kg=ta();a.T.Rf=0;jd(a)}
f.Zf=function(a){if(nb(this,!0)){if(!this.fa.qb){gd(this);this.Fa&&this.Fa.start(this.T.Kg,cd(this));this.fa.qb=!0;this.fa.ll=!0;this.ja&&kd(this.ja);var b=this.va.run;b&&(b.textContent="Halt");this.yd(!0);a&&this.dd()}this.T.Al>=this.T.ee&&jd(this,!0);this.T.Yh=0;this.T.hj=ta();this.T.Rf&&(a=this.T.hj-this.T.Rf,a>this.T.io&&(this.T.Kg+=a,this.T.Kg>this.T.hj&&(this.T.Kg=this.T.hj)));try{do{var c=this.fa.yg?1:this.T.Tq;if(this.ja){ld(this.ja);var d=this.ja;a=c;var e=d.Nb[0];if(e.Of){var g=(cd(d.O,
d.ff)-e.Nd)/d.dk|0,l=md(d,0)-g;6==e.mode&&(l-=g);var p=l*d.dk|0;6==e.mode&&(p>>=1);a>p&&(a=p)}var c=a,w=this.ja;a=c;if(w.ga&&w.ga[11]&64){var v=w.Vg-cd(w.O,w.ff);0<v&&a>v&&(a=v)}c=a}this.ih(c);var E=this.td-this.A;this.of+=E;this.T.Yh+=E;id(this,0,!0);bd(this,E);this.T.Xh-=E;0>=this.T.Xh&&(this.T.Xh+=this.T.no,dd(this));this.T.Wh-=E;0>=this.T.Wh&&(this.T.Wh+=this.T.mo,this.yd());this.T.Og-=E;if(0>=this.T.Og){this.T.Og+=this.T.zl;break}}while(this.fa.qb)}catch(O){this.yb();Zc(this);this.Fa&&this.Fa.stop(ta(),
cd(this));nb(this,!1);sb(this,O.stack||O.message);return}c=setTimeout;d=this.er;this.T.Rf=ta();e=this.T.io;this.T.Yh&&(e=Math.round(e*this.T.Yh/this.T.zl));e-=this.T.Rf-this.T.hj;if(g=this.T.Rf-this.T.Kg)this.T.kf=Math.round(this.of/(10*g))/100,864E5<=g&&(this.Uf=0,this.ja&&ld(this.ja,!0),gd(this));if(0>e||this.T.kf<this.T.Sh)e=0;this.T.Al+=this.T.Yh;this.T.Rf+=e;c(d,e)}else Zc(this),this.Fa&&this.Fa.stop(ta(),cd(this))};f.ih=function(){return 0};
f.yb=function(a){ob(this,!0);this.td-=this.A;this.A=0;id(this,this.of);this.of=0;if(this.fa.qb){this.fa.qb=!1;this.ja&&kd(this.ja);var b=this.va.run;b&&(b.textContent="Run")}this.fa.ue=a};function Zc(a){dd(a);a.yd()}var n=-1,Wb=1,Vb=4,Ub=16,Tb=64,Sb=128,Rb=256,Qb=512,Pb=1024,Ob=2048,Uc=64,Tc=32,nd=Rb|Qb|Pb,od=Wb|Vb|Ub|Tb|Sb|Ob,pd=Wb|Vb|Ub|Tb|Sb;
function qd(a,b,c,d){this.O=a;this.Y=a.Y;this.id=b;this.ni=c||"";this.ia=0;this.fb=65535;this.qf=this.fb+1;this.Qa=this.zc=this.Jh=this.Pb=this.type=this.ya=0;this.Dd=n;this.pa=this.Gd=2;this.C=this.V=65535;this.on=this.id==rd?Array(32):[];this.el=null;this.cj=!1;sd(this,!0,d)}var rd=1;f=qd.prototype;f.Lq=function(a){this.ia=a&65535;return this.ya=this.ia<<4};
f.Kq=function(a,b){var c,d,e=this.O;a&=65535;a&4?(c=e.xd.ya,d=c+e.xd.fb|0):(c=e.Ed,d=e.zf);if(!b||c){c=c+(a&65528)|0;if(d-c|0)return b||(e.A-=15),td(this,c,a,b);b||ud.call(e,13,a)}return n};f.Jq=function(a){var b=this.O;a=b.Fd+(a<<2);var c=b.ra(a);b.aa&=~(Rb|Qb);return this.load(b.ra(a+2))+c|0};f.Iq=function(a){var b=this.O;a<<=3;var c=b.Fd+a|0;if(7<=(b.Af-c|0))return td(this,c,a)+b.Nm;ud.call(b,13,a|3,!0);return n};f.dp=function(a){return this.ya+a|0};f.fp=function(a){return this.ya+a|0};
f.Bn=function(a,b,c){return(a>>>0)+b<=this.qf?this.ya+a|0:this.Qi(0,0,c)};f.cp=function(a,b,c){return(a>>>0)+b>this.qf?this.ya+a|0:this.Qi(0,0,c)};f.Qi=function(a,b,c){c||ud.call(this.O,13,0);return n};f.Cn=function(a,b,c){return(a>>>0)+b<=this.qf?this.ya+a|0:this.Ri(0,0,c)};f.ep=function(a,b,c){return(a>>>0)+b>this.qf?this.ya+a|0:this.Ri(0,0,c)};f.Ri=function(a,b,c){c||ud.call(this.O,13,0);return n};
function vd(a,b,c){var d=a.O,e=d.ra(b+2),g=d.ra(b)|(e&255)<<16,d=d.ra(b+4);a.ia=c;a.ya=g;a.fb=d;a.qf=(d>>>0)+1;a.Pb=e;a.type=e&7936;a.Jh=0;a.Dd=b;sd(a,!0)}
function td(a,b,c,d){var e=a.O,g=e.ra(b+0),l=e.ra(b+4),p=l&7936,w=e.ra(b+2)|(l&255)<<16,v=e.ra(b+6),E=c&65528;80386<=e.la&&(w|=(v&65280)<<16,g|=(v&15)<<16,v&128&&(g=g<<12|4095));for(;;){var O,J,G;if(a.id==rd){a.cj=!1;O=a.el;var S,X;G=c&3;var T=(l&24576)>>13;if(E&&!(l&32768)){d||ud.call(e,11,c);w=n;break}if(6144<=p){G=c&3;if(G>a.Qa){if(!1!==O&&!(T==a.Qa||p&1024&&T<=a.Qa)){w=n;break}E=e.La();wd(e,e.La(),!0);u(e,E);a.cj=!0}S=!1}else{if(256==p){if(!xd(a,c,O)){w=n;break}return a.ya}if(1024==p)S=!0,X=-1,
J=c,G<a.Qa&&(G=a.Qa);else if(1536==p)S=!0,X=~(16384|Rb|Qb),J=c|1;else if(1792==p)S=!0,X=~(16384|Rb),J=c|1;else if(1280==p){if(!xd(a,w&65535,O)){w=n;break}return a.ya}}if(S){b=w&65535;if(G<=T){d=a.Qa;if(a.load(b,!0)===n){w=n;break}e.Nm=g;if(a.Qa<d){if(!0!==O){w=n;break}E=r(e);g=0;for(l&=31;l--;)a.on[g++]=yd(e,e.ua,E),E+=2;l=e.bb.ya;O=(a.Qa<<2)+2;d=O+2;G=e.ua.ia;J=r(e);wd(e,e.ra(l+d),!0);u(e,e.ra(l+O));x(e,G);for(x(e,J);g;)x(e,a.on[--g]);a.cj=!0}e.aa&=X;return a.ya}d||ud.call(e,13,J,!0);w=n;break}else if(!1!==
S){d||ud.call(e,13,c,!0);w=n;break}}else if(2==a.id){if(E){if(!(l&32768)){d||ud.call(e,11,c);w=n;break}if(4096>p||2048==(p&2560)){d||ud.call(e,13,c,!!l);w=n;break}}}else if(3==a.id){if(!(l&32768)){d||ud.call(e,12,c);w=n;break}if(!E||4096>p||512!=(p&2560)){d||ud.call(e,13,c,!0);w=n;break}}else if(4==a.id){if(!E||256!=p&&768!=p){d||ud.call(e,10,c,!0);w=n;break}}else if(6==a.id&&!(p&4096)&&768<p){w=n;break}a.ia=c;a.ya=w;a.fb=g;a.qf=(g>>>0)+1;a.Pb=l;a.type=p;a.Jh=v;a.Dd=b;sd(a,!0);break}return w}
function xd(a,b,c){var d=a.O,e=d.bb.ya,g=a.Qa,l=d.bb.ia;if(!c){if(768!=d.bb.type)return ud.call(d,10,b,!0),!1;d.Ib(d.bb.Dd+4,d.bb.Pb&-769|256)}if(d.bb.load(b)===n)return!1;var p=d.bb.ya;if(!1===c){if(768!=d.bb.type)return ud.call(d,13,b,!0),!1}else{if(768==d.bb.type)return ud.call(d,13,b,!0),!1;d.Ib(d.bb.Dd+4,d.bb.Pb|=768);d.bb.type=768}d.Ib(e+14,q(d));d.Ib(e+16,Nb(d));d.Ib(e+18,d.F);d.Ib(e+20,d.G);d.Ib(e+22,d.H);d.Ib(e+24,d.D);d.Ib(e+26,r(d));d.Ib(e+28,d.L);d.Ib(e+30,d.K);d.Ib(e+32,d.J);d.Ib(e+34,
d.Na.ia);d.Ib(e+36,d.ta.ia);d.Ib(e+38,d.ua.ia);d.Ib(e+40,d.ab.ia);d.xd.load(d.ra(p+42));Ad(d,d.ra(p+16)|(c?16384:0));d.F=d.ra(p+18);d.G=d.ra(p+20);d.H=d.ra(p+22);d.D=d.ra(p+24);d.L=d.ra(p+28);d.K=d.ra(p+30);d.J=d.ra(p+32);d.Na.load(d.ra(p+34));d.ab.load(d.ra(p+40));Bd(d,d.ra(p+14),d.ra(p+36));b=38;e=26;a.Qa<g&&(e=(a.Qa<<2)+2,b=e+2);wd(d,d.ra(p+b),!0);u(d,d.ra(p+e));c&&d.Ib(p+0,l);d.ob|=8;return!0}
f.save=function(){return[this.ia,this.ya,this.fb,this.Pb,this.id,this.ni,this.Qa,this.zc,this.Dd,this.Gd,this.V,this.pa,this.C,this.type,this.qf]};f.restore=function(a){"number"==typeof a?this.load(a):(this.ia=a[0],this.ya=a[1],this.fb=a[2],this.Pb=a[3],this.id=a[4],this.ni=a[5],this.Qa=a[6],this.zc=a[7],this.Dd=a[8],this.Gd=a[9]||2,this.V=a[10]||65535,this.pa=a[11]||2,this.C=a[12]||65535,this.type=a[13]||this.Pb&7936,this.qf=a[14]||(this.fb>>>0)+1)};
function sd(a,b,c){void 0===c&&(c=!!(a.O.ob&1));a.zg=!1;if(c){a.load=a.Kq;a.co=a.Iq;a.yc=a.Bn;a.nc=a.Cn;if(!(a.ia&-4))a.yc=a.Qi,a.nc=a.Ri;else if(a.type&4096){6144==(a.type&6656)&&(a.yc=a.Qi);if(a.type&2048||!(a.type&512))a.nc=a.Ri;1024==(a.type&3072)&&(a.yc==a.Bn&&(a.yc=a.cp),a.nc==a.Cn&&(a.nc=a.ep),a.zg=!0)}b&&(a.ia&-4&&a.Dd!==n&&(b=a.Dd+5,a.O.cd(b,a.O.Ra(b)|1)),a.Qa=a.ia&3,a.zc=(a.Pb&24576)>>13,80386>a.O.la||!(a.Jh&64)?(a.pa=2,a.C=65535):(a.pa=4,a.C=-1),a.Gd=a.pa,a.V=a.C)}else a.load=a.Lq,a.co=
a.Jq,a.yc=a.dp,a.nc=a.fp,a.Qa=a.zc=0,a.Dd=n}
function Cd(a){this.la=a.model||8088;var b=0;switch(this.la){default:b=4772727;break;case 80286:b=6E6;break;case 80386:b=16E6}Wc.call(this,a,b);this.cn=61442;this.ti=nd;this.si=4;this.Gb=255;this.B=80386==this.la?Dd:80286==this.la?Ed:Fd;this.Pa=Hd;this.fn=Id;this.gn=Jd;this.hn=Kd;if(80186<=this.la&&(this.Pa=Hd.slice(),this.fn=Id.slice(),this.gn=Jd.slice(),this.Gb=31,this.Pa[15]=Ld,this.Pa[96]=Md,this.Pa[97]=Nd,this.Pa[98]=Od,this.Pa[99]=Ld,this.Pa[100]=Ld,this.Pa[101]=Ld,this.Pa[102]=Ld,this.Pa[103]=
Ld,this.Pa[104]=Pd,this.Pa[105]=Qd,this.Pa[106]=Rd,this.Pa[107]=Sd,this.Pa[108]=Td,this.Pa[109]=Ud,this.Pa[110]=Vd,this.Pa[111]=Wd,this.Pa[192]=Xd,this.Pa[193]=Yd,this.Pa[200]=Zd,this.Pa[201]=$d,this.Pa[241]=ae,this.fn[7]=be,this.gn[7]=be,80286<=this.la)){this.cn=2;this.ti|=28672;this.si=0;this.Pa[15]=ce;this.ph=de.slice();for(a=0;a<this.ph.length;a++)this.ph[a]||(this.ph[a]=ee);this.Pa[84]=fe;this.Pa[99]=ge;if(80386<=this.la){var c;this.Pa[100]=he;this.Pa[101]=ie;this.Pa[102]=je;this.Pa[103]=ke;
for(c in y)this.ph[+c]=y[c]}}this.wi=[];this.xi=[];this.td=this.zh=0;this.fa.ue=this.fa.Kn=!1;this.vn=0;this.Pe=this.na=[];this.Ca=this.lb=this.Ga=this.ye=this.sd=this.Cb=this.Ce=0;le(this)}fb(Cd,Wc);
var Fd={di:4,N:5,da:6,ba:7,ca:8,I:9,P:11,Q:12,mf:4,El:60,Fl:83,$b:3,Fb:9,qc:16,bi:1,Ml:19,Ol:28,Ql:16,Pl:21,Nl:37,Kl:2,tj:9,Ll:5,Jl:33,vj:10,uj:8,Rg:3,Qg:15,dm:51,em:1,fm:2,gm:4,cm:32,wj:15,im:15,Ia:16,Ja:4,km:11,jm:18,hm:24,Mb:4,lm:2,Sf:16,mm:17,Bj:18,nm:19,Aj:5,Cj:6,sm:2,rm:8,pm:9,qm:10,om:10,Dj:10,Ej:10,Sl:80,Ul:144,Rl:86,Tl:154,Wl:101,Yl:165,Vl:107,Xl:171,um:70,wm:113,tm:76,vm:124,$l:80,bm:128,Zl:86,am:134,Tg:3,Sg:16,Lj:10,Kj:8,xm:51,ac:8,ym:17,zm:36,Ac:11,Am:16,nf:10,ad:2,qj:18,rj:7,sj:15,xj:12,
yj:7,zj:11,Fj:18,Gj:7,Hj:15,Mj:15,Nj:7,Oj:13,Uj:11,Vj:7,Wj:8,Bm:8,Em:12,Cm:18,Dm:17,Fm:15,Qj:8,Pj:20,Rj:2,Zj:3,Ug:9,Yj:5,Xj:11,ak:4,$j:17,Gm:11},Ed={di:0,N:0,da:0,ba:0,ca:0,I:0,P:1,Q:1,mf:3,El:14,Fl:16,$b:2,Fb:7,qc:7,bi:0,Ml:7,Ol:13,Ql:7,Pl:11,Nl:16,Kl:3,tj:6,Ll:2,Jl:13,vj:5,uj:5,Rg:2,Qg:7,dm:23,em:0,fm:1,gm:3,cm:17,wj:7,im:11,Ia:7,Ja:3,km:7,jm:11,hm:15,Mb:2,lm:3,Sf:7,mm:8,Bj:8,nm:8,Aj:4,Cj:4,sm:2,rm:3,pm:5,qm:2,om:3,Dj:5,Ej:3,Sl:14,Ul:22,Rl:17,Tl:25,Wl:17,Yl:25,Vl:20,Xl:28,um:13,wm:21,tm:16,vm:24,
$l:13,bm:21,Zl:16,am:24,Tg:2,Sg:7,Lj:5,Kj:5,xm:19,ac:5,ym:5,zm:17,Ac:3,Am:5,nf:3,ad:0,qj:8,rj:5,sj:9,xj:5,yj:5,zj:4,Fj:5,Gj:5,Hj:4,Mj:7,Nj:5,Oj:8,Uj:3,Vj:4,Wj:3,Bm:11,Em:11,Cm:15,Dm:15,Fm:7,Qj:5,Pj:8,Rj:0,Zj:2,Ug:6,Yj:3,Xj:6,ak:3,$j:5,Gm:5},Dd={di:0,N:0,da:0,ba:0,ca:0,I:0,P:1,Q:1,mf:3,El:14,Fl:16,$b:2,Fb:7,qc:7,bi:0,Ml:7,Ol:13,Ql:7,Pl:11,Nl:16,Kl:3,tj:6,Ll:2,Jl:13,vj:5,uj:5,Rg:2,Qg:7,dm:23,em:0,fm:1,gm:3,cm:17,wj:7,im:11,Ia:7,Ja:3,km:7,jm:11,hm:15,Mb:2,lm:3,Sf:7,mm:8,Bj:8,nm:8,Aj:4,Cj:4,sm:2,rm:3,
pm:5,qm:2,om:3,Dj:5,Ej:3,Sl:14,Ul:22,Rl:17,Tl:25,Wl:17,Yl:25,Vl:20,Xl:28,um:13,wm:21,tm:16,vm:24,$l:13,bm:21,Zl:16,am:24,Tg:2,Sg:7,Lj:5,Kj:5,xm:19,ac:5,ym:5,zm:17,Ac:3,Am:5,nf:3,ad:0,qj:8,rj:5,sj:9,xj:5,yj:5,zj:4,Fj:5,Gj:5,Hj:4,Mj:7,Nj:5,Oj:8,Uj:3,Vj:4,Wj:3,Bm:11,Em:11,Cm:15,Dm:15,Fm:7,Qj:5,Pj:8,Rj:0,Zj:2,Ug:6,Yj:3,Xj:6,ak:3,$j:5,Gm:5,po:11,Il:6,Gl:8,Hl:5,Zq:3,Xq:6,Yq:6,ro:9,qo:12,Jj:3,Ij:6,ar:4,$q:5,Tj:3,Sj:7};f=Cd.prototype;
f.sl=function(a,b){this.na=this.Pe=a;this.Ca=b;this.lb=1<<this.Ca;this.Ga=this.lb-1;this.ye=a.length;this.sd=this.ye-1};function me(a){if(a.na===a.Pe){a.na=Array(a.ye);a.Sk=new t(null,0,0,5,null,a);for(var b=0;b<a.ye;b++)a.na[b]=a.Sk}else for(b=0;b<a.ui.length;b++)a.na[a.ui[b]]=a.Sk;a.ui=[]}
function Rc(a,b,c,d){var e=(b&-4194304)>>>20,g=a.Pe[(a.Wf+e&a.Cb)>>>a.Ca],l=g.Bc(e);if(!(l&1))return d||ne.call(a,b,!1,c),null;if(!(l&4)&&3==a.ta.Qa)return d||ne.call(a,b,!0,c),null;var p=(b&4190208)>>>10,l=a.Pe[((l&-4096)+p&a.Cb)>>>a.Ca],w=l.Bc(p);if(!(w&1||d))return d||ne.call(a,b,!1,c),null;if(!(w&4)&&3==a.ta.Qa)return d||ne.call(a,b,!0,c),null;c=a.Pe[((w&-4096)+(b&4095)&a.Cb)>>>a.Ca];if(d)return c;d=new t(b&-4096,0,0,6);Bc(d,c,g,e,l,p);b>>>=a.Ca;a.na[b]=d;a.ui.push(b);return d}
f.reset=function(){this.fa.qb&&this.yb();le(this);Xc(this);this.fa.Kd=!1};
function le(a){a.F=0;a.D=0;a.G=0;a.H=0;a.he=0;a.L=0;a.K=0;a.J=0;a.Yb=!1;a.tb=a.lc=0;a.Qd=0;a.Ii=0;a.ob=65520;a.Fd=0;a.Af=1023;a.aa=a.pj=0;a.fh=a.li=a.eh=a.gh=0;a.mj=-1;a.ta=new qd(a,rd,"CS");a.ab=new qd(a,2,"DS");a.Na=new qd(a,2,"ES");a.ua=new qd(a,3,"SS");u(a,0);wd(a,0);80386<=a.la&&(a.H=772,a.ob=16,a.hi=0,a.Vf=0,a.Wf=0,a.kn=Array(8),a.ln=Array(8),a.Cc=new qd(a,2,"FS"),a.Dc=new qd(a,2,"GS"));a.No=new qd(a,0,"NULL");a.ha=a.ab;a.ka=a.ua;a.S=a.Aa=0;a.X=a.Ma=n;a.Ab=0;Bd(a,0,65535);if(80286<=a.la){a.Ed=
0;a.zf=65535;a.xd=new qd(a,5,"LDT",!0);a.bb=new qd(a,4,"TSS",!0);a.Sb=new qd(a,6,"VER",!0);Bd(a,65520,61440);var b,c=q(a);b=a.ta;var d=-65536;80386>b.O.la&&(d&=16777215);b=b.ya=d;a.sa=b+c|0;a.ki=b+a.ta.fb|0}Ad(a,0);oe(a)}function pe(a){2==a.Gd?(a.Zb=a.ra,a.Qc=z,a.ed=qe,a.Se=re,a.Oa=A,a.Jb=se,a.Pc=te):(a.Zb=a.de,a.Qc=B,a.ed=ue,a.Se=ve,a.Oa=C,a.Jb=we,a.Pc=xe)}function ye(a,b){a.pa!=b&&(a.Aa|=4096,a.pa=b,a.C=2==b?65535:-1,ze(a))}
function ze(a){2==a.pa?(a.dataType=32768,a.pc=a.ra,a.bg=a.Ib):(a.dataType=-2147483648,a.pc=a.de,a.bg=a.vk)}function Ae(a){a.Gd=a.ta.Gd;a.V=a.ta.V;pe(a);a.pa=a.ta.pa;a.C=a.ta.C;ze(a);a.Aa&=-12289}f.Vn=function(){var a=this.F+this.D+this.G+this.H+r(this)+this.L+this.K+this.J|0;return a=a+q(this)+Mb(this)+this.ab.ia+this.ua.ia+this.Na.ia+Nb(this)|0};function Be(a,b,c,d){void 0!==d&&(void 0===a.wi[b]&&(a.wi[b]=[]),a.wi[b].push([c,d]))}
function Ce(a,b){var c=a.wi[b];if(void 0!==c)for(var d=0;d<c.length;d++)if(!c[d][1].call(c[d][0],a.sa))return!1;a.fa.Kn&&a.qa(16)&&De(a.Y,b,a.sa)&&Ee(a,a.sa,function(a,c){return function(d){Fe(a.Y,b,d,cd(a)-c)}}(a,cd(a)));return!0}function Ee(a,b,c){void 0!==c&&(null==a.xi[b]&&a.zh++,a.xi[b]=c)}function Ge(a,b){var c=a.xi[b];null!=c&&(c(--a.zh),delete a.xi[b])}
function oe(a,b){void 0===b&&(b=!!(a.ob&1));!b!=!(a.ob&1)&&a.qa()&&a.$a("CPU switching to "+(b?"protected":"real")+"-mode",a.Xb,!0);a.hn=b?He:Kd;sd(a.ta);sd(a.ab);sd(a.ua);sd(a.Na);80386<=a.la&&(sd(a.Cc),sd(a.Dc),Ae(a))}
f.save=function(){var a=new Ie(this);a.set(0,[this.F,this.D,this.G,this.H,r(this),this.L,this.K,this.J]);var b=q(this),c=this.ta.save(),d=this.ab.save(),e=this.ua.save(),g=this.Na.save(),l;null!=this.Ed?(l=[this.ob,this.Ed,this.zf,this.Fd,this.Af,this.xd.save(),this.bb.save(),this.pj],l.push(this.hi),l.push(this.Vf),l.push(this.Wf),l.push(this.kn),l.push(this.ln)):l=null;b=[b,c,d,e,g,l,Nb(this)];80386<=this.la&&(b.push(this.Cc.save()),b.push(this.Dc.save()));a.set(1,b);a.set(2,[this.ha.ni,this.ka.ni,
this.S,this.Aa,this.Ab,this.X,this.Ma]);a.set(3,[0,this.Uf,this.T.Ae]);a.set(4,mc(this.ma));return a.data()};
f.restore=function(a){var b=a[0];this.F=b[0];this.D=b[1];this.G=b[2];this.H=b[3];var c=b[4];this.L=b[5];this.K=b[6];this.J=b[7];b=a[1];this.ta.restore(b[1]);this.ab.restore(b[2]);this.ua.restore(b[3]);this.Na.restore(b[4]);var d=b[5];d&&d.length&&(this.ob=d[0],this.Ed=d[1],this.zf=d[2],this.Fd=d[3],this.Af=d[4],this.xd.restore(d[5]),this.bb.restore(d[6]),this.pj=d[7],80386<=this.la&&(this.hi=d[8],this.Vf=d[9],this.Wf=d[10],this.kn=d[11],this.ln=d[12]),oe(this));Ad(this,b[6]);Bd(this,b[0],this.ta.ia);
u(this,c);wd(this,this.ua.ia);80386<=this.la&&(this.Cc.restore(b[7]),this.Dc.restore(b[8]));b=a[2];this.ha=null!=b[0]&&Je(this,b[0])||this.ab;this.ka=null!=b[1]&&Je(this,b[1])||this.ua;this.S=b[2];this.Aa=b[3];this.Ab=b[4];this.X=b[5];this.Ma=b[6];b=a[3];this.Uf=b[1];gd(this,b[2]);a:{b=this.ma;a=a[4];for(c=0;c<a.length-1;c+=2){var d=a[c],e=a[c+1];if(e&&e.length<b.ko){for(var g=0,l=Array(b.ko),p=0;p<e.length-1;)for(var w=e[p++],v=e[p++];w--;)l[g++]=v;e=l}g=b.na[d];if(!g||!g.restore(e)){Ca("Unable to restore memory block "+
d);b=!1;break a}}void 0!==a[c]&&dc(b,a[c]);b=!0}return b};function Je(a,b){switch(b){case "CS":return a.ta;case "DS":return a.ab;case "SS":return a.ua;case "ES":return a.Na;case "NULL":return a.No;default:return[0,b,0,0,""]}}function Mb(a){return a.ta.ia}function Ke(a,b){var c=q(a);a.sa=a.ta.load(b)+c|0;a.ki=a.ta.ya+a.ta.fb|0;Ae(a);a.S|=a.si}function Le(a,b){a.ab.load(b);a.S|=a.si}
function wd(a,b,c){var d=r(a);a.Lc=a.ua.load(b)+d|0;a.ua.zg?(a.ok=a.ua.ya+a.ua.V|0,a.Om=a.ua.ya+a.ua.fb|0):(a.ok=a.ua.ya+a.ua.fb|0,a.Om=a.ua.ya);c||(a.S|=4)}function Me(a,b){a.Na.load(b);a.S|=a.si}function q(a){return a.sa-a.ta.ya|0}function D(a,b){a.sa=a.ta.ya+(b&a.C)|0}function Bd(a,b,c,d){a.ta.el=d;a.Nm=b;b=a.ta.load(c);return b!==n?(a.sa=b+(a.Nm&a.C)|0,a.ki=b+a.ta.fb|0,Ae(a),a.ta.cj):null}
function Oe(a,b){a.sa=a.sa+b|0;var c=a.ki-a.sa|0;0>c&&0<=(a.ki^a.sa)&&(8088>=a.la||a.ta.fb==a.ta.V?D(a,a.sa-a.ta.ya):-1>c&&ud.call(a,13,0))}function r(a){return a.he&~a.ua.V|a.Lc-a.ua.ya}function u(a,b){a.he=b;a.Lc=a.ua.ya+(b&a.ua.V)|0}function Pe(a,b,c,d,e,g){if(63!=(e&63)&&e!=a.resultType){var l=(e^a.resultType)&a.resultType;l&&(l&1&&Qe(a),l&2&&Re(a),l&4&&Se(a),l&8&&Te(a),l&16&&Ue(a),l&32&&Ve(a))}g?(a.fh=d,a.eh=b):(a.fh=b,a.eh=d);a.li=c;a.gh=d;a.resultType=e}
function We(a,b,c,d,e){a.resultType=c|26;a.gh=b;d?Xe(a):Ye(a);e?Ze(a):$e(a);return b}function af(a,b,c,d){c&d?Xe(a):Ye(a);(b^c)&d?Ze(a):$e(a)}function bf(a){return Qe(a)?1:0}function Qe(a){a.resultType&1&&(a.aa&=~Wb,(a.fh^(a.fh^a.li)&(a.li^a.eh))&a.resultType&-2147450752&&(a.aa|=Wb),a.resultType&=-2);return a.aa&Wb}function Re(a){a.resultType&2&&(a.aa&=~Vb,38505>>((a.gh^a.gh>>4)&15)&1&&(a.aa|=Vb),a.resultType&=-3);return a.aa&Vb}
function Se(a){a.resultType&4&&(a.aa&=~Ub,(a.eh^a.fh^a.li)&16&&(a.aa|=Ub),a.resultType&=-5);return a.aa&Ub}function Te(a){a.resultType&8&&(a.aa&=~Tb,a.gh&((a.resultType&-2147450752)-1|a.resultType&-2147450752)||(a.aa|=Tb),a.resultType&=-9);return a.aa&Tb}function Ue(a){a.resultType&16&&(a.aa&=~Sb,a.gh&a.resultType&-2147450752&&(a.aa|=Sb),a.resultType&=-17);return a.aa&Sb}
function Ve(a){a.resultType&32&&(a.aa&=~Ob,(a.fh^a.eh)&(a.li^a.eh)&a.resultType&-2147450752&&(a.aa|=Ob),a.resultType&=-33);return a.aa&Ob}function Ye(a){a.resultType&=-2;a.aa&=~Wb}function cf(a){a.resultType&=-5;a.aa&=~Ub}function df(a){a.resultType&=-9;a.aa&=~Tb}function $e(a){a.resultType&=-33;a.aa&=~Ob}function Xe(a){a.resultType&=-2;a.aa|=Wb}function ef(a){a.resultType&=-5;a.aa|=Ub}function ff(a){a.resultType&=-9;a.aa|=Tb}function Ze(a){a.resultType&=-33;a.aa|=Ob}
function Nb(a){return a.aa&~od|Qe(a)|Re(a)|Se(a)|Te(a)|Ue(a)|Ve(a)}function gf(a,b){b=b|a.ob&1|65520;a.ob=a.ob&-65536|b&65535;a.ob&1&&oe(a,!0)}function Ad(a,b,c){a.ob&1||(b&=-61441);void 0===c&&(c=a.ta.Qa);c?b=b&-12289|a.aa&12288:a.pj=(b&12288)>>12;c>a.pj&&(b=b&~Qb|a.aa&Qb);a.resultType=128;a.aa=a.aa&~(a.ti|od)|b&(a.ti|od)|a.cn;a.aa&Rb&&(a.Ab|=2,a.S|=4)}
f.Lb=function(a,b,c){var d=!1;switch(b){case "EAX":case "EBX":case "ECX":case "EDX":case "ESP":case "EBP":case "ESI":case "EDI":case "EIP":case "AX":case "BX":case "CX":case "DX":case "SP":case "BP":case "SI":case "DI":case "IP":case "PC":case "CS":case "DS":case "SS":case "ES":case "PS":case "C":case "P":case "A":case "Z":case "S":case "T":case "I":case "D":case "V":this.va[b]=c;this.vn++;d=!0;break;default:d=this.parent.Lb.call(this,a,b,c)}return d};
function hf(a,b){var c=a.na[(b&a.Ce)>>>a.Ca];return 5!=c.type||(c=Rc(a,b,!1,!0),c)?c.Wg(b&a.Ga,b):null}f.Ra=function(a){return this.na[(a&this.Ce)>>>this.Ca].sc(a&this.Ga,a)};f.ra=function(a){var b=a&this.Ga,c=(a&this.Ce)>>>this.Ca;this.A-=this.B.di;return b<this.Ga?this.na[c].gi(b,a):this.na[c].sc(b,a)|this.na[c+1&this.sd].sc(0,a+1)<<8};
f.de=function(a){var b=a&this.Ga,c=(a&this.Ce)>>>this.Ca;if(b<this.Ga-2)return this.na[c].Bc(b,a);var d=(b&3)<<3;return this.na[c].Bc(b&-4,a)>>>d|this.na[c+1&this.sd].Bc(0,a+3)<<32-d};f.cd=function(a,b){this.na[(a&this.Ce)>>>this.Ca].Ec(a&this.Ga,b&255,a)};f.Ib=function(a,b){var c=a&this.Ga,d=(a&this.Ce)>>>this.Ca;this.A-=this.B.di;c<this.Ga?this.na[d].ri(c,b&65535,a):(this.na[d++].Ec(c,b&255,a),this.na[d&this.sd].Ec(0,b>>8&255,a+1))};
f.vk=function(a,b){var c=a&this.Ga,d=(a&this.Ce)>>>this.Ca;this.A-=this.B.di;if(c<this.Ga-2)this.na[d].Le(c,b,a);else{var e,g=(c&3)<<3,c=c&-4;e=this.na[d].Bc(c,a);this.na[d].Le(c,e&~(-1<<g)|b<<g,a);d=d+1&this.sd;a+=3;e=this.na[d].Bc(0,a);this.na[d].Le(0,e&-1<<g|b>>>32-g,a)}};function jf(a,b,c){a.pi=b;a.X=b.yc(a.fi=c,1);return a.S&1?0:a.Ra(a.X)}function F(a,b){return jf(a,a.ha,b&a.V)}function H(a,b){return jf(a,a.ka,b&a.V)}function kf(a,b,c){a.pi=b;a.X=b.yc(a.fi=c,a.pa);return a.S&1?0:a.pc(a.X)}
function I(a,b){return kf(a,a.ha,b&a.V)}function K(a,b){return kf(a,a.ka,b&a.V)}function lf(a,b,c){a.pi=b;a.Ma=a.X=b.yc(a.fi=c,1);return a.S&1?0:a.Ra(a.X)}function L(a,b){return lf(a,a.ha,b&a.V)}function M(a,b){return lf(a,a.ka,b&a.V)}function mf(a,b,c){a.pi=b;a.Ma=a.X=b.yc(a.fi=c,a.pa);return a.S&1?0:a.pc(a.X)}function N(a,b){return mf(a,a.ha,b&a.V)}function P(a,b){return mf(a,a.ka,b&a.V)}function Q(a,b){a.S&2||a.cd(a.pi.nc(a.fi,1),b)}function R(a,b){a.S&2||a.bg(a.pi.nc(a.fi,a.pa),b)}
function yd(a,b,c){return a.pc(b.yc(c,a.pa))}f.U=function(){var a=this.Ra(this.sa);Oe(this,1);return a};function nf(a){var b=a.ra(a.sa);Oe(a,2);return b}function U(a){var b=a.Zb(a.sa);Oe(a,a.Gd);return b}f.oa=function(){var a=this.pc(this.sa);Oe(this,this.pa);return a};f.M=function(){var a=this.Ra(this.sa)<<24>>24;Oe(this,1);return a};function V(a,b){var c=a.Ra(a.sa);Oe(a,1);return of[c].call(a,b)}
f.La=function(){var a=this.pc(this.Lc);this.Lc=this.Lc+this.pa|0;var b=this.ok-this.Lc|0;0>b&&0<=(this.ok^this.Lc)&&(8088>=this.la||!this.ua.zg&&this.ua.fb==this.ua.V||this.ua.zg&&!this.ua.fb?u(this,this.Lc-this.ua.ya&this.ua.V):-1>b&&ud.call(this,12,0));return a};function x(a,b){a.Lc=a.Lc-a.pa|0;0>(a.Lc-a.Om|0)&&0<=(a.Om^a.Lc)&&(8088>=a.la||!a.ua.zg&&a.ua.fb==a.ua.V||a.ua.zg&&!a.ua.fb?u(a,a.Lc-a.ua.ya&a.ua.V):ud.call(a,12,0));a.bg(a.Lc,b)}
function pf(a,b,c){var d=4;1==b.length&&(d=1,c=c?1:0);if(80386>a.la)2<b.length&&(b=b.substr(1,2));else if("PS"==b||2<b.length)d=8;a.va[b]&&(void 0===c&&(sb(a,"Value for "+b+" is invalid"),a.yb()),d=!a.fa.qb||a.fa.Mn?h(c,d):"--------".substr(0,d),a.va[b].textContent!=d&&(a.va[b].textContent=d))}
f.yd=function(a){if(this.vn&&(a||!this.fa.qb||this.fa.Mn)){pf(this,"EAX",this.F);pf(this,"EBX",this.D);pf(this,"ECX",this.G);pf(this,"EDX",this.H);pf(this,"ESP",r(this));pf(this,"EBP",this.L);pf(this,"ESI",this.K);pf(this,"EDI",this.J);pf(this,"CS",Mb(this));pf(this,"DS",this.ab.ia);pf(this,"SS",this.ua.ia);pf(this,"ES",this.Na.ia);pf(this,"EIP",q(this));var b=Nb(this);pf(this,"PS",b);pf(this,"V",b&Ob);pf(this,"D",b&Pb);pf(this,"I",b&Qb);pf(this,"T",b&Rb);pf(this,"S",b&Sb);pf(this,"Z",b&Tb);pf(this,
"A",b&Ub);pf(this,"P",b&Vb);pf(this,"C",b&Wb)}if(b=this.va.speed)b.textContent=Lb(this);this.parent.yd.call(this,a)};
f.ih=function(a){this.fa.ue=!0;var b=this.fa.Kn=this.Y&&qf(this.Y),c=a?this.fa.ll?0:1:-1;this.fa.ll=!1;this.td=this.A=a;this.ja&&!a&&ld(this.ja);a||this.qa(1024)||(this.S|=4);do{var d=this.S&12528;if(d)this.Aa|=d;else if(this.Rb=this.sa,this.ha=this.ab,this.ka=this.ua,this.X=this.Ma=n,this.Aa&12288&&Ae(this),this.Aa=this.S&256,this.Ab){a:{if(!(this.S&4))for(var d=80286>this.la?0:1,e=0;2>e;e++){switch(d){case 0:if(this.Ab&1&&this.aa&Qb){var g=rf(this.ja);if(-1<=g&&(this.Ab&=-2,0<=g)){this.Ab&=-5;sf.call(this,
g,null,11);d=!0;break a}}break;case 1:if(this.Ab&2){this.Ab&=-3;sf.call(this,1,null,11);d=!0;break a}}d=1-d}if(d=this.Ab&8){d=this.ja;e=!1;for(g=0;g<d.ub;g++)for(var l=d.ub[g],p=0;p<l.Tb.length;p++){var w=l.Tb[p];w.xe||(tf(d,w),w.xe||(e=!0))}d=!e}d&&(this.Ab&=-9);d=!1}if(d&&!a){this.R("interrupt dispatched");this.S=0;break}if(this.Ab&4){this.S=this.A=0;break}}if(b){if(uf(this.Y,this.sa,c)){this.yb();break}c=1}this.S=0;this.Pa[this.U()].call(this)}while(0<this.A);return this.fa.ue?this.td-this.A:void 0===
this.fa.ue?0:-1};Qa(function(){for(var a=lb(window.document,"pcjs","cpu"),b=0;b<a.length;b++){var c=a[b],d=jb(c),d=new Cd(d);kb(d,c)}});function vf(a,b){var c=a+b+bf(this)|0;Pe(this,a,b,c,191);this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.Fb:this.B.qc;return c&255}function wf(a,b){var c=a+b+bf(this)|0;Pe(this,a,b,c,this.dataType|63);this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.Fb:this.B.qc;return c&this.C}
function xf(a,b){var c=a+b|0;Pe(this,a,b,c,191);this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.Fb:this.B.qc;return c&255}function yf(a,b){var c=a+b|0;Pe(this,a,b,c,this.dataType|63);this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.Fb:this.B.qc;return c&this.C}function zf(a,b){var c=a&b;We(this,c,128);this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.Fb:this.B.qc;return c}function Af(a,b){this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.Fb:this.B.qc;return We(this,a&b,this.dataType)}
function Bf(a,b){this.A-=10+(this.X===n?0:1);if((a&3)<(b&3))return a=a&-4|b&3,ff(this),a;df(this);return a}function Cf(a){if(this.X===n)return Ld.call(this),a;var b=a,c=this.pc(this.X),d=this.pc(this.X+this.pa);2==this.pa&&(b=a<<16>>16,c=c<<16>>16,d=d<<16>>16);this.A-=this.B.Jl;if(b<c||b>d)D(this,this.Rb-this.ta.ya),sf.call(this,5,null,0);this.S|=2;return a}function Df(a,b){var c=0;if(b){df(this);for(var d=1;d&this.C;){if(b&d){a=c;break}d<<=1;c++}}else ff(this);this.A-=this.B.po+3*c;return a}
function Ef(a,b){var c=0;if(b){df(this);for(var d=2==this.pa?15:31,e=1<<d;e;){if(b&e){a=d;break}e>>>=1;c++;d--}}else ff(this);this.A-=this.B.po+3*c;return a}function Ff(a,b){a&1<<(b&31)?Xe(this):Ye(this);this.A-=this.X===n?this.B.Zq:this.B.Xq;this.S|=2;return a}function Gf(a,b){var c=1<<(b&31);a&c?Xe(this):Ye(this);this.A-=this.X===n?this.B.Il:this.B.Gl;return a^c}function Hf(a,b){var c=1<<(b&31);a&c?Xe(this):Ye(this);this.A-=this.X===n?this.B.Il:this.B.Gl;return a&~c}
function If(a,b){var c=1<<(b&31);a&c?Xe(this):Ye(this);this.A-=this.X===n?this.B.Il:this.B.Gl;return a|c}function Jf(a,b){var c=Mb(this),d=q(this);null!=Bd(this,a,b,!0)&&(x(this,c),x(this,d))}function Kf(a,b){Pe(this,a,b,a-b|0,191,!0);this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.tj:this.B.Fb;this.S|=2;return a}function Lf(a,b){Pe(this,a,b,a-b|0,this.dataType|63,!0);this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.tj:this.B.Fb;this.S|=2;return a}
function Mf(a){var b=(a&this.C)-1|0;Pe(this,a,1,b,32830,!0);this.A-=2;return a&~this.C|b&this.C}function Nf(a,b){var c=a[1]-b[1];c||(c=a[0]-b[0]);return c}
function Of(a,b,c){this.Yb=!1;if((c>>>=0)&&!(c<=b>>>0)){var d=0,e=1;c=[c>>>0,0];for(a=[a>>>0,b>>>0];0<Nf(a,c);){var g=b=c;b[0]+=g[0];b[1]+=g[1];4294967295<b[0]&&(b[0]>>>=0,b[1]++);e+=e}do 0<=Nf(a,c)&&(b=a,g=c,b[0]-=g[0],b[1]-=g[1],0>b[0]&&(b[0]>>>=0,b[1]--),d+=e),b=c,b[0]>>>=1,b[1]&1&&(b[0]=(b[0]|2147483648)>>>0),b[1]>>>=1,e>>>=1;while(e);this.tb=d;this.lc=a[0];this.Yb=!0}}function Pf(a){return a}
function Qf(a,b){a=this.U();var c=(b<<16>>16)*(a<<24>>24)|0;32767<c||-32768>c?(Xe(this),Ze(this)):(Ye(this),$e(this));this.A-=this.X===n?21:24;return c&65535}function Rf(a,b){var c,d;a=this.oa();2==this.pa?(d=(b<<16>>16)*(a<<16>>16)|0,c=32767<d||-32768>d):(d=b*a,c=2147483647<d||-2147483648>d);c?(Xe(this),Ze(this)):(Ye(this),$e(this));d&=this.C;this.A-=this.X===n?21:24;return d}
function Sf(a,b){var c=(a<<16>>16)*(b<<16>>16)|0;32767<c||-32768>c?(Xe(this),Ze(this)):(Ye(this),$e(this));this.A-=this.X===n?this.B.ro:this.B.qo;return c&65535}function Tf(a,b){var c=a*b;2147483647<c||-2147483648>c?(Xe(this),Ze(this)):(Ye(this),$e(this));this.A-=this.X===n?this.B.ro:this.B.qo;return c|0}function Uf(a){var b=(a&this.C)+1|0;Pe(this,a,1,b,32830);this.A-=2;return a&~this.C|b&this.C}
function sf(a,b,c){this.A-=this.B.dm+c;this.ta.el=!0;c=Nb(this);var d=Mb(this),e=q(this);a=this.ta.co(a);a!==n&&(x(this,c),x(this,d),x(this,e),null!=b&&x(this,b),this.mj=-1,this.sa=a,this.ki=this.ta.ya+this.ta.fb|0,Ae(this))}function Vf(a,b){this.A-=14+(this.X===n?0:2);df(this);this.Sb.load(b,!0)!==n&&this.Sb.zc>=this.ta.Qa&&this.Sb.zc>=(b&3)&&(ff(this),a=this.Sb.Pb&-256,2<this.pa&&(a|=(this.Sb.Jh&-65281)<<16));return a}
function Wf(a,b){if(this.X===n)return ee.call(this),a;Le(this,this.ra(this.X+this.pa));this.A-=this.B.Sf;return b}function Xf(a){if(this.X===n)return ee.call(this),a;this.A-=this.B.lm;return this.X}function Yf(a,b){if(this.X===n)return ee.call(this),a;Me(this,this.ra(this.X+this.pa));this.A-=this.B.Sf;return b}function Zf(a,b){if(this.X===n)return ee.call(this),a;var c=this.ra(this.X+this.pa);this.Cc.load(c);this.A-=this.B.Sf;return b}
function $f(a,b){if(this.X===n)return ee.call(this),a;var c=this.ra(this.X+this.pa);this.Dc.load(c);this.A-=this.B.Sf;return b}function ag(a,b){this.A-=14+(this.X===n?0:2);if(b&65528&&this.Sb.load(b,!0)!==n&&(7168==(this.Sb.Pb&7168)||this.Sb.zc>=this.ta.Qa)&&this.Sb.zc>=(b&3))return ff(this),this.Sb.fb;df(this);return a}function bg(a,b){if(this.X===n)return ee.call(this),a;wd(this,this.ra(this.X+this.pa));this.A-=this.B.Sf;return b}
function cg(a,b){this.A-=this.Ma===n?this.X===n?this.B.sm:this.B.rm:this.B.pm;return b}function dg(a,b){return b}function eg(){this.Ma!==n&&ye(this,2);return cg.call(this,0,this.Qd)}function fg(a,b){var c=b&65535,d=b>>>16,e=a&65535,g=a>>>16,l=c*e,e=(l>>>16)+d*e,p=e>>>16,e=(e&65535)+c*g;this.Yb=!0;this.tb=e<<16|l&65535;this.lc=p+((e>>>16)+d*g)|0}function gg(a,b){this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.Fb:this.B.qc;return We(this,a|b,128)}
function ng(a,b){this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.Fb:this.B.qc;return We(this,a|b,this.dataType)}function og(a){var b=this.La(),c=this.La();(a<<=this.pa>>2)&&u(this,r(this)+a);Bd(this,b,c,!1)&&(a&&u(this,r(this)+a),this.ab.ia&65528&&this.ab.zc<this.ta.Qa&&7168!=(this.ab.Pb&7168)&&this.ab.load(0),this.Na.ia&65528&&this.Na.zc<this.ta.Qa&&7168!=(this.Na.Pb&7168)&&this.Na.load(0));2==a&&this.zh&&Ge(this,this.sa)}
function pg(a,b){var c=a-b-bf(this)|0;Pe(this,a,b,c,191,!0);this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.Fb:this.B.qc;return c&255}function qg(a,b){var c=a-b-bf(this)|0;Pe(this,a,b,c,this.dataType|63,!0);this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.Fb:this.B.qc;return c&this.C}function rg(a){this.S|=1;this.ed[this.U()].call(this,a);this.A-=this.X===n?this.B.ar:this.B.$q}function sg(){return Ve(this)?1:0}function tg(){return Qe(this)?1:0}function ug(){return Qe(this)?0:1}
function vg(){return Te(this)?1:0}function wg(){return Te(this)?0:1}function xg(){return Qe(this)||Te(this)?1:0}function yg(){return Qe(this)||Te(this)?0:1}function zg(){return Ue(this)?1:0}function Ag(){return Ue(this)?0:1}function Bg(){return Re(this)?1:0}function Cg(){return Re(this)?0:1}function Dg(){return!Ue(this)!=!Ve(this)?1:0}function Eg(){return!Ue(this)!=!Ve(this)?0:1}function Fg(){return Te(this)||!Ue(this)!=!Ve(this)?1:0}function Gg(){return Te(this)||!Ue(this)!=!Ve(this)?0:1}
function Hg(a,b,c){if(c){16<c&&(a=b,c-=16);var d=a<<c-1;a=(d<<1|b>>16-c)&65535;We(this,a,32768,d&32768)}return a}function Ig(a,b,c){if(c){var d=a<<c-1;a=d<<1|b>>32-c;We(this,a,-2147483648,d&-2147483648)}return a}function Jg(a,b){return Hg.call(this,a,b,this.U())}function Kg(a,b){return Ig.call(this,a,b,this.U())}function Lg(a,b){return Hg.call(this,a,b,this.G&31)}function Mg(a,b){return Ig.call(this,a,b,this.G&31)}
function Ng(a,b,c){if(c){16<c&&(a=b,c-=16);var d=a>>c-1;a=(d>>1|b<<16-c)&65535;We(this,a,32768,d&1)}return a}function Og(a,b,c){if(c){var d=a>>c-1;a=d>>1|b<<32-c;We(this,a,-2147483648,d&1)}return a}function Pg(a,b){return Ng.call(this,a,b,this.U())}function Qg(a,b){return Og.call(this,a,b,this.U())}function Rg(a,b){return Ng.call(this,a,b,this.G&31)}function Sg(a,b){return Og.call(this,a,b,this.G&31)}
function Tg(a,b){var c=a-b|0;Pe(this,a,b,c,191,!0);this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.Fb:this.B.qc;return c&255}function Ug(a,b){var c=a-b|0;Pe(this,a,b,c,this.dataType|63,!0);this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.Fb:this.B.qc;return c&this.C}function Vg(a,b){We(this,a&b,128);this.A-=this.Ma===n?this.X===n?this.B.Zj:this.B.Ug:this.B.Ug;this.S|=2;return a}function Wg(a,b){We(this,a&b,32768);this.A-=this.Ma===n?this.X===n?this.B.Zj:this.B.Ug:this.B.Ug;this.S|=2;return a}
function Xg(a,b){if(this.X===n){switch(this.Ii&7){case 0:this.F=this.F&-256|a;break;case 1:this.G=this.G&-256|a;break;case 2:this.H=this.H&-256|a;break;case 3:this.D=this.D&-256|a;break;case 4:this.F=this.F&255|a<<8;break;case 5:this.G=this.G&255|a<<8;break;case 6:this.H=this.H&255|a<<8;break;case 7:this.D=this.D&255|a<<8}this.A-=this.B.ak}else this.Ma=this.X,Q(this,a),this.A-=this.B.$j;return b}
function Yg(a,b){if(this.X===n){switch(this.Ii&7){case 0:this.F=a;break;case 1:this.G=a;break;case 2:this.H=a;break;case 3:this.D=a;break;case 4:u(this,a);break;case 5:this.L=a;break;case 6:this.K=a;break;case 7:this.J=a}this.A-=this.B.ak}else this.Ma=this.X,R(this,a),this.A-=this.B.$j;return b}function Zg(a,b){var c=a^b;We(this,c,128);this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.Fb:this.B.qc;return c}
function $g(a,b){this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.Fb:this.B.qc;return We(this,a^b,this.dataType)}function ah(a){ud.call(this,13,0);return a}function be(a){Ld.call(this);return a}function bh(a){ee.call(this);return a}function ch(){D(this,this.Rb-this.ta.ya);sf.call(this,0,null,2)}function dh(){this.A-=this.X===n?2:this.B.Fm;return 1}function eh(){var a=this.G&255;this.A-=(this.X===n?this.B.Qj:this.B.Pj)+(a<<this.B.Rj);return a}
function fh(){var a=this.U();this.A-=(this.X===n?this.B.Qj:this.B.Pj)+(a<<this.B.Rj);return a}function gh(){return null}function ud(a,b,c){if(this.fa.ue){var d=!1;if(80186<=this.la)if(0>this.mj)D(this,this.Rb-this.ta.ya),d=!0;else if(8!=this.mj)b=0,a=8,d=!0;else{hh.call(this,-1,0,c);le(this);return}hh.call(this,a,b,c)&&(d=!1);d&&sf.call(this,this.mj=a,b,0);this.S|=3}else this.$a("Fault "+k(a)+" blocked by Debugger",1073741824),D(this,this.Rb-this.ta.ya)}
function ne(a,b,c){this.Vf=a;a=0;b&&(a|=1);c&&(a|=2);3==this.ta.Qa&&(a|=4);ud.call(this,14,a)}function hh(a,b,c){var d=32,e=hf(this,this.sa);204==e&&(c=!1,d|=1);983040<=this.sa&&1048575>=this.sa&&(c=!1);this.qa(d|-2147483648)&&(c=!0);if(this.qa(d)||c)a=(c?"\n":"")+"Fault "+k(a)+(null!=b?" ("+ha(b)+")":"")+" on opcode "+k(e)+" at "+ih(q(this),Mb(this))+" (%"+h(this.sa,6)+")",b=this.fa.qb,this.$a(a,d)?c&&(c=b,this.Y.yb()):(this.Da(a),this.yb());return c}function ce(){this.ph[this.U()].call(this)}
function fe(){x(this,r(this)&this.C);this.A-=this.B.Ac}function Md(){var a=r(this)&this.C;x(this,this.F&this.C);x(this,this.G&this.C);x(this,this.H&this.C);x(this,this.D&this.C);x(this,a);x(this,this.L&this.C);x(this,this.K&this.C);x(this,this.J&this.C);this.A-=this.B.zm}
function Nd(){this.J=this.J&~this.C|this.La();this.K=this.K&~this.C|this.La();this.L=this.L&~this.C|this.La();u(this,r(this)+this.pa);this.D=this.D&~this.C|this.La();this.H=this.H&~this.C|this.La();this.G=this.G&~this.C|this.La();this.F=this.F&~this.C|this.La();this.A-=this.B.xm}function Od(){this.Oa[this.U()].call(this,Cf)}function ge(){this.Jb[this.U()].call(this,Bf)}function he(){this.S|=20;this.ha=this.ka=this.Cc;this.A-=this.B.ad;this.yb()}
function ie(){this.S|=20;this.ha=this.ka=this.Dc;this.A-=this.B.ad;this.yb()}function je(){this.S|=4096;this.pa^=6;this.C^=-65536;ze(this);this.A-=this.B.ad}function ke(){this.S|=8192;this.Gd^=6;this.V^=-65536;pe(this);this.A-=this.B.ad}function Pd(){x(this,this.oa());this.A-=this.B.Ac}function Qd(){this.Oa[this.U()].call(this,Rf)}function Rd(){x(this,this.U());this.A-=this.B.Ac}function Sd(){this.Oa[this.U()].call(this,Qf)}
function Td(){var a=1,b=0,c=5;this.Aa&192&&(a=this.G&this.V,b=1,this.Aa&256&&(c=4));if(a--){var d=pc(this.ma,this.H,this.sa-b-1);this.cd(this.Na.nc(this.J&this.V,1),d);this.J=this.J&~this.V|this.J+(this.aa&Pb?-1:1)&this.V;this.A-=c;this.G=this.G&~this.V|this.G-b&this.V;a&&(this.sa=this.Rb,this.S|=256)}}
function Ud(){var a=1,b=0,c=5;this.Aa&192&&(a=this.G&this.V,b=1,this.Aa&256&&(c=4));if(a--){for(var d=this.sa-b-1,e=0,g=0,l=0;l<this.pa;l++)e|=pc(this.ma,this.H,d)<<g,g+=8;d=e;this.bg(this.Na.nc(this.J&this.V,this.pa),d);this.J=this.J&~this.V|this.J+(this.aa&Pb?-this.pa:this.pa)&this.V;this.A-=c;this.G=this.G&~this.V|this.G-b&this.V;a&&(this.sa=this.Rb,this.S|=256)}}
function Vd(){var a=1,b=0,c=5;this.Aa&192&&(a=this.G&this.V,b=1,this.Aa&256&&(c=4));if(a--){var d=this.Ra(this.ab.yc(this.K&this.V,1));this.K=this.K&~this.V|this.K+(this.aa&Pb?-1:1)&this.V;this.A-=c;tc(this.ma,this.H,d,this.sa-b-1);this.G=this.G&~this.V|this.G-b&this.V;a&&(this.sa=this.Rb,this.S|=256)}}
function Wd(){var a=1,b=0,c=5;this.Aa&192&&(a=this.G&this.V,b=1,this.Aa&256&&(c=4));if(a--){var d=yd(this,this.ab,this.K&this.V);this.K=this.K&~this.V|this.K+(this.aa&Pb?-this.pa:this.pa)&this.V;this.A-=c;for(var c=this.sa-b-1,e=0,g=0;g<this.pa;g++)tc(this.ma,this.H,d>>e&255,c),e+=8;this.G=this.G&~this.V|this.G-b&this.V;a&&(this.sa=this.Rb,this.S|=256)}}function jh(){var a=this.M();Ve(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja}
function kh(){var a=this.M();Ve(this)?this.A-=this.B.Ja:(D(this,q(this)+a),this.A-=this.B.Ia)}function lh(){var a=this.M();Qe(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja}function mh(){var a=this.M();Qe(this)?this.A-=this.B.Ja:(D(this,q(this)+a),this.A-=this.B.Ia)}function nh(){var a=this.M();Te(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja}function oh(){var a=this.M();Te(this)?this.A-=this.B.Ja:(D(this,q(this)+a),this.A-=this.B.Ia)}
function ph(){var a=this.M();Qe(this)||Te(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja}function qh(){var a=this.M();Qe(this)||Te(this)?this.A-=this.B.Ja:(D(this,q(this)+a),this.A-=this.B.Ia)}function rh(){var a=this.M();Ue(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja}function sh(){var a=this.M();Ue(this)?this.A-=this.B.Ja:(D(this,q(this)+a),this.A-=this.B.Ia)}function th(){var a=this.M();Re(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja}
function uh(){var a=this.M();Re(this)?this.A-=this.B.Ja:(D(this,q(this)+a),this.A-=this.B.Ia)}function vh(){var a=this.M();!Ue(this)!=!Ve(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja}function wh(){var a=this.M();!Ue(this)==!Ve(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja}function xh(){var a=this.M();Te(this)||!Ue(this)!=!Ve(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja}
function yh(){var a=this.M();Te(this)||!Ue(this)!=!Ve(this)?this.A-=this.B.Ja:(D(this,q(this)+a),this.A-=this.B.Ia)}function zh(){this.Se[this.U()].call(this,Ah,this.U);this.A-=this.Ma===n?1:this.B.bi}function Xd(){this.Se[this.U()].call(this,Bh,fh)}function Yd(){this.Pc[this.U()].call(this,2==this.pa?Ch:Dh,fh)}function Eh(){var a=nf(this)<<(this.pa>>2),b=this.La();D(this,b);a&&u(this,r(this)+a);this.A-=this.B.Em}function Fh(){var a=this.La();D(this,a);this.A-=this.B.Bm}
function Zd(){var a=nf(this),b=this.U()&31;this.A-=11;x(this,this.L);var c=r(this)&this.C;if(0<b){for(this.A-=(b<<2)+(1<b?1:0);--b;)this.L=this.L&~this.C|this.L-this.pa&this.C,x(this,yd(this,this.ua,this.L&this.C));x(this,c)}this.L=this.L&~this.C|c;u(this,r(this)&~this.ua.V|r(this)-a&this.ua.V)}function $d(){u(this,r(this)&~this.ua.V|this.L&this.ua.V);this.L=this.L&~this.C|this.La()&this.C;this.A-=5}function Gh(){og.call(this,nf(this));this.A-=this.B.Dm}
function Hh(){og.call(this,0);this.A-=this.B.Cm}function Ih(){this.Oa[this.U()].call(this,Pf);this.A-=8}function Jh(){this.S|=36;this.A-=this.B.ad}function ae(){ee.call(this)}function Ld(){ud.call(this,6);this.yb()}function ee(){D(this,this.Rb-this.ta.ya);sb(this,"Undefined opcode "+k(Yb(this.ma,this.sa))+" at "+("0x"+h(this.sa)));this.yb()}
var Hd=[function(){var a=this.U();this.ed[a].call(this,xf)},function(){this.Jb[this.U()].call(this,yf)},function(){this.Qc[this.U()].call(this,xf)},function(){this.Oa[this.U()].call(this,yf)},function(){this.F=this.F&-256|xf.call(this,this.F&255,this.U());this.A--},function(){this.F=this.F&~this.C|yf.call(this,this.F&this.C,this.oa());this.A--},function(){x(this,this.Na.ia);this.A-=this.B.nf},function(){Me(this,this.La());this.A-=this.B.ac},function(){this.ed[this.U()].call(this,gg)},function(){this.Jb[this.U()].call(this,
ng)},function(){this.Qc[this.U()].call(this,gg)},function(){this.Oa[this.U()].call(this,ng)},function(){this.F=this.F&-256|gg.call(this,this.F&255,this.U());this.A--},function(){this.F=this.F&~this.C|ng.call(this,this.F&this.C,this.oa());this.A--},function(){x(this,this.ta.ia);this.A-=this.B.nf},function(){Ke(this,this.La());this.A-=this.B.ac},function(){this.ed[this.U()].call(this,vf)},function(){this.Jb[this.U()].call(this,wf)},function(){this.Qc[this.U()].call(this,vf)},function(){this.Oa[this.U()].call(this,
wf)},function(){this.F=this.F&-256|vf.call(this,this.F&255,this.U());this.A--},function(){this.F=this.F&~this.C|wf.call(this,this.F&this.C,this.oa());this.A--},function(){x(this,this.ua.ia);this.A-=this.B.nf},function(){wd(this,this.La());this.A-=this.B.ac},function(){this.ed[this.U()].call(this,pg)},function(){this.Jb[this.U()].call(this,qg)},function(){this.Qc[this.U()].call(this,pg)},function(){this.Oa[this.U()].call(this,qg)},function(){this.F=this.F&-256|pg.call(this,this.F&255,this.U());this.A--},
function(){this.F=this.F&~this.C|qg.call(this,this.F&this.C,this.oa());this.A--},function(){x(this,this.ab.ia);this.A-=this.B.nf},function(){Le(this,this.La());this.A-=this.B.ac},function(){this.ed[this.U()].call(this,zf)},function(){this.Jb[this.U()].call(this,Af)},function(){this.Qc[this.U()].call(this,zf)},function(){this.Oa[this.U()].call(this,Af)},function(){this.F=this.F&-256|zf.call(this,this.F&255,this.U());this.A--},function(){this.F=this.F&~this.C|Af.call(this,this.F&this.C,this.oa());this.A--},
function(){this.S|=20;this.ha=this.ka=this.Na;this.A-=this.B.ad},function(){var a=this.F&255,b=Se(this),c=Qe(this);if(9<(a&15)||b)a+=6,b=Ub;if(159<a||c)a+=96,c=Wb;a&=255;this.F=this.F&-256|a;We(this,a,128);c?Xe(this):Ye(this);b?ef(this):cf(this);this.A-=this.B.mf},function(){this.ed[this.U()].call(this,Tg)},function(){this.Jb[this.U()].call(this,Ug)},function(){this.Qc[this.U()].call(this,Tg)},function(){this.Oa[this.U()].call(this,Ug)},function(){this.F=this.F&-256|Tg.call(this,this.F&255,this.U());
this.A--},function(){this.F=this.F&~this.C|Ug.call(this,this.F&this.C,this.oa());this.A--},function(){this.S|=20;this.ha=this.ka=this.ta;this.A-=this.B.ad},function(){var a=this.F&255,b=Se(this),c=Qe(this);if(9<(a&15)||b)a-=6,b=Ub;if(159<a||c)a-=96,c=Wb;a&=255;this.F=this.F&-256|a;We(this,a,128);c?Xe(this):Ye(this);b?ef(this):cf(this);this.A-=this.B.mf},function(){this.ed[this.U()].call(this,Zg)},function(){this.Jb[this.U()].call(this,$g)},function(){this.Qc[this.U()].call(this,Zg)},function(){this.Oa[this.U()].call(this,
$g)},function(){this.F=this.F&-256|Zg.call(this,this.F&255,this.U());this.A--},function(){this.F=this.F&~this.C|$g.call(this,this.F&this.C,this.oa());this.A--},function(){this.S|=20;this.ha=this.ka=this.ua;this.A-=this.B.ad},function(){var a,b,c=this.F&255,d=this.F>>8&255;9<(c&15)||Se(this)?(c=c+6&15,d=d+1&255,a=b=1):a=b=0;this.F=this.F&-65536|d<<8|c;a?Xe(this):Ye(this);b?ef(this):cf(this);this.A-=this.B.mf},function(){this.ed[this.U()].call(this,Kf)},function(){this.Jb[this.U()].call(this,Lf)},function(){this.Qc[this.U()].call(this,
Kf)},function(){this.Oa[this.U()].call(this,Lf)},function(){Kf.call(this,this.F&255,this.U());this.A--},function(){Lf.call(this,this.F&this.C,this.oa());this.A--},function(){this.S|=20;this.ha=this.ka=this.ab;this.A-=this.B.ad},function(){var a,b,c=this.F&255,d=this.F>>8&255;9<(c&15)||Se(this)?(c=c-6&15,d=d-1&255,a=b=1):a=b=0;this.F=this.F&-65536|d<<8|c;a?Xe(this):Ye(this);b?ef(this):cf(this);this.A-=this.B.mf},function(){this.F=Uf.call(this,this.F)},function(){this.G=Uf.call(this,this.G)},function(){this.H=
Uf.call(this,this.H)},function(){this.D=Uf.call(this,this.D)},function(){u(this,Uf.call(this,r(this)))},function(){this.L=Uf.call(this,this.L)},function(){this.K=Uf.call(this,this.K)},function(){this.J=Uf.call(this,this.J)},function(){this.F=Mf.call(this,this.F)},function(){this.G=Mf.call(this,this.G)},function(){this.H=Mf.call(this,this.H)},function(){this.D=Mf.call(this,this.D)},function(){u(this,Mf.call(this,r(this)))},function(){this.L=Mf.call(this,this.L)},function(){this.K=Mf.call(this,this.K)},
function(){this.J=Mf.call(this,this.J)},function(){x(this,this.F&this.C);this.A-=this.B.Ac},function(){x(this,this.G&this.C);this.A-=this.B.Ac},function(){x(this,this.H&this.C);this.A-=this.B.Ac},function(){x(this,this.D&this.C);this.A-=this.B.Ac},function(){x(this,r(this)-2&65535);this.A-=this.B.Ac},function(){x(this,this.L&this.C);this.A-=this.B.Ac},function(){x(this,this.K&this.C);this.A-=this.B.Ac},function(){x(this,this.J&this.C);this.A-=this.B.Ac},function(){this.F=this.F&~this.C|this.La();
this.A-=this.B.ac},function(){this.G=this.G&~this.C|this.La();this.A-=this.B.ac},function(){this.H=this.H&~this.C|this.La();this.A-=this.B.ac},function(){this.D=this.D&~this.C|this.La();this.A-=this.B.ac},function(){u(this,r(this)&~this.C|this.La());this.A-=this.B.ac},function(){this.L=this.L&~this.C|this.La();this.A-=this.B.ac},function(){this.K=this.K&~this.C|this.La();this.A-=this.B.ac},function(){this.J=this.J&~this.C|this.La();this.A-=this.B.ac},jh,kh,lh,mh,nh,oh,ph,qh,rh,sh,th,uh,vh,wh,xh,yh,
jh,kh,lh,mh,nh,oh,ph,qh,rh,sh,th,uh,vh,wh,xh,yh,zh,function(){this.Pc[this.U()].call(this,Kh,this.oa);this.A-=this.Ma===n?1:this.B.bi},zh,function(){this.Pc[this.U()].call(this,Kh,this.M);this.A-=this.Ma===n?1:this.B.bi},function(){this.ed[this.U()].call(this,Vg)},function(){this.Jb[this.U()].call(this,Wg)},function(){this.Qc[this.Ii=this.U()].call(this,Xg)},function(){this.Oa[this.Ii=this.U()].call(this,Yg)},function(){this.S|=1;this.ed[this.U()].call(this,cg)},function(){this.S|=1;this.Jb[this.U()].call(this,
cg)},function(){this.Qc[this.U()].call(this,cg)},function(){this.Oa[this.U()].call(this,cg)},function(){var a=this.U();switch((a&56)>>3){case 0:this.Qd=this.Na.ia;break;case 1:this.Qd=this.ta.ia;break;case 2:this.Qd=this.ua.ia;break;case 3:this.Qd=this.ab.ia;break;case 4:if(80386<=this.la){this.Qd=this.Cc.ia;break}Ld.call(this);break;case 5:if(80386<=this.la){this.Qd=this.Dc.ia;break}default:Ld.call(this)}this.S|=1;this.Jb[a].call(this,eg)},function(){this.S|=1;this.ha=this.ka=this.No;this.Oa[this.U()].call(this,
Xf)},function(){var a,b=this.U(),c=(b&56)>>3;switch(c){case 0:a=this.F;break;case 2:a=this.H;break;case 3:a=this.D;break;default:if(80286==this.la||80386==this.la&&4!=c&&5!=c){Ld.call(this);return}switch(c){case 1:a=this.G;break;case 4:a=r(this);break;case 5:a=this.L;break;case 6:a=this.K;break;case 7:a=this.J}}this.Oa[b].call(this,cg);switch(c){case 0:Me(this,this.F);this.F=a;break;case 1:Ke(this,this.G);this.G=a;break;case 2:wd(this,this.H);this.H=a;break;case 3:Le(this,this.D);this.D=a;break;case 4:80386<=
this.la?this.Cc.load(r(this)):Me(this,r(this));u(this,a);break;case 5:80386<=this.la?this.Dc.load(this.L):Ke(this,this.L);this.L=a;break;case 6:wd(this,this.K);this.K=a;break;case 7:Le(this,this.J),this.J=a}},function(){this.S|=1;this.Pc[this.U()].call(this,Lh,this.La)},function(){this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.G&this.C;this.G=this.G&~this.C|a&this.C;this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.H&this.C;this.H=this.H&~this.C|a&this.C;this.A-=3},function(){var a=
this.F;this.F=this.F&~this.C|this.D&this.C;this.D=this.D&~this.C|a&this.C;this.A-=3},function(){var a=this.F,b=r(this);this.F=this.F&~this.C|b&this.C;u(this,b&~this.C|a&this.C);this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.L&this.C;this.L=this.L&~this.C|a&this.C;this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.K&this.C;this.K=this.K&~this.C|a&this.C;this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.J&this.C;this.J=this.J&~this.C|a&this.C;this.A-=3},function(){this.F=
2==this.pa?this.F&-65536|this.F<<24>>24&65535:this.F<<16>>16;this.A-=2},function(){this.H=2==this.pa?this.H&-65536|(this.F&32768?65535:0):this.F&-2147483648?-1:0;this.A-=this.B.Ll},function(){Jf.call(this,this.oa(),nf(this));this.A-=this.B.Ol},function(){this.$a("WAIT not implemented");this.A--},function(){x(this,Nb(this));this.A-=this.B.Ac},function(){Ad(this,this.La());this.A-=this.B.ac},function(){var a=this.F>>8&255;a&Wb?Xe(this):Ye(this);a&Vb?(this.resultType&=-3,this.aa|=Vb):(this.resultType&=
-3,this.aa&=~Vb);a&Ub?ef(this):cf(this);a&Tb?ff(this):df(this);a&Sb?(this.resultType&=-17,this.aa|=Sb):(this.resultType&=-17,this.aa&=~Sb);this.A-=this.B.Mb},function(){this.F=this.F&-65281|(Nb(this)&pd)<<8;this.A-=this.B.Mb},function(){var a=this.F&-256,b;b=U(this);b=this.Ra(this.ha.yc(b,1));this.F=a|b;this.A-=this.B.Dj},function(){this.F=this.F&~this.C|yd(this,this.ha,U(this));this.A-=this.B.Dj},function(){var a=U(this),b=this.F;this.cd(this.ha.nc(a,1),b);this.A-=this.B.Ej},function(){var a=U(this),
b=this.F;this.bg(this.ha.nc(a,this.pa),b);this.A-=this.B.Ej},function(){var a=1,b=0,c=this.B.Fj;this.Aa&192&&(a=this.G&this.V,b=1,c=this.B.Hj,this.Aa&256||(this.A-=this.B.Gj));if(a--){var d=this.aa&Pb?-1:1,e=this.Ra(this.ha.yc(this.K,1));this.cd(this.Na.nc(this.J&this.V,1),e);this.K=this.K&~this.V|this.K+d&this.V;this.J=this.J&~this.V|this.J+d&this.V;this.A-=c;this.G=this.G&~this.V|this.G-b&this.V;a&&(this.sa=this.Rb,this.S|=256)}},function(){var a=1,b=0,c=this.B.Fj;this.Aa&192&&(a=this.G&this.V,
b=1,c=this.B.Hj,this.Aa&256||(this.A-=this.B.Gj));if(a--){var d=this.aa&Pb?-this.pa:this.pa,e=yd(this,this.ha,this.K);this.bg(this.Na.nc(this.J&this.V,this.pa),e);this.K=this.K&~this.V|this.K+d&this.V;this.J=this.J&~this.V|this.J+d&this.V;this.A-=c;this.G=this.G&~this.V|this.G-b&this.V;a&&(this.sa=this.Rb,this.S|=256)}},function(){var a=1,b=0,c=this.B.qj;this.Aa&192&&(a=this.G&this.V,b=1,c=this.B.sj,this.Aa&256||(this.A-=this.B.rj));if(a--){var d=this.aa&Pb?-1:1,e=jf(this,this.ha,this.K&this.V),g=
lf(this,this.Na,this.J&this.V);Kf.call(this,e,g);this.K=this.K&~this.V|this.K+d&this.V;this.J=this.J&~this.V|this.J+d&this.V;this.A-=c-this.B.Fb;this.G=this.G&~this.V|this.G-b&this.V;a&&Te(this)==(this.Aa&64)&&(this.sa=this.Rb,this.S|=256)}},function(){var a=1,b=0,c=this.B.qj;this.Aa&192&&(a=this.G&this.V,b=1,c=this.B.sj,this.Aa&256||(this.A-=this.B.rj));if(a--){var d=this.aa&Pb?-this.pa:this.pa,e=kf(this,this.ha,this.K&this.V),g=mf(this,this.Na,this.J&this.V);Lf.call(this,e,g);this.K=this.K&~this.V|
this.K+d&this.V;this.J=this.J&~this.V|this.J+d&this.V;this.A-=c-this.B.Fb;this.G=this.G&~this.V|this.G-b&this.V;a&&Te(this)==(this.Aa&64)&&(this.sa=this.Rb,this.S|=256)}},function(){We(this,this.F&this.U(),128);this.A-=this.B.mf},function(){We(this,this.F&this.oa(),this.dataType);this.A-=this.B.mf},function(){var a=1,b=0,c=this.B.Uj;this.Aa&192&&(a=this.G&this.V,b=1,c=this.B.Wj,this.Aa&256||(this.A-=this.B.Vj));if(a--){var d=this.F;this.cd(this.Na.nc(this.J&this.V,1),d);this.J=this.J&~this.V|this.J+
(this.aa&Pb?-1:1)&this.V;this.A-=c;this.G=this.G&~this.V|this.G-b&this.V;a&&(this.sa=this.Rb,this.S|=256)}},function(){var a=1,b=0,c=this.B.Uj;this.Aa&192&&(a=this.G&this.V,b=1,c=this.B.Wj,this.Aa&256||(this.A-=this.B.Vj));if(a--){var d=this.F;this.bg(this.Na.nc(this.J&this.V,this.pa),d);this.J=this.J&~this.V|this.J+(this.aa&Pb?-this.pa:this.pa)&this.V;this.A-=c;this.G=this.G&~this.V|this.G-b&this.V;a&&(this.sa=this.Rb,this.S|=256)}},function(){var a=1,b=0,c=this.B.xj;this.Aa&192&&(a=this.G&this.V,
b=1,c=this.B.zj,this.Aa&256||(this.A-=this.B.yj));a--&&(this.F=this.F&-256|this.Ra(this.ha.yc(this.K&this.V,1)),this.K=this.K&~this.V|this.K+(this.aa&Pb?-1:1)&this.V,this.A-=c,this.G=this.G&~this.V|this.G-b&this.V,a&&(this.sa=this.Rb,this.S|=256))},function(){var a=1,b=0,c=this.B.xj;this.Aa&192&&(a=this.G&this.V,b=1,c=this.B.zj,this.Aa&256||(this.A-=this.B.yj));a--&&(this.F=this.F&~this.C|yd(this,this.ha,this.K&this.V),this.K=this.K&~this.V|this.K+(this.aa&Pb?-this.pa:this.pa)&this.V,this.A-=c,this.G=
this.G&~this.V|this.G-b&this.V,a&&(this.sa=this.Rb,this.S|=256))},function(){var a=1,b=0,c=this.B.Mj;this.Aa&192&&(a=this.G&this.V,b=1,c=this.B.Oj,this.Aa&256||(this.A-=this.B.Nj));a--&&(Kf.call(this,this.F&255,lf(this,this.Na,this.J&this.V)),this.J=this.J&~this.V|this.J+(this.aa&Pb?-1:1)&this.V,this.A-=c-this.B.Fb,this.G=this.G&~this.V|this.G-b&this.V,a&&Te(this)==(this.Aa&64)&&(this.sa=this.Rb,this.S|=256))},function(){var a=1,b=0,c=this.B.Mj;this.Aa&192&&(a=this.G&this.V,b=1,c=this.B.Oj,this.Aa&
256||(this.A-=this.B.Nj));a--&&(Lf.call(this,this.F&this.C,mf(this,this.Na,this.J&this.V)),this.J=this.J&~this.V|this.J+(this.aa&Pb?-this.pa:this.pa)&this.V,this.A-=c-this.B.Fb,this.G=this.G&~this.V|this.G-b&this.V,a&&Te(this)==(this.Aa&64)&&(this.sa=this.Rb,this.S|=256))},function(){this.F=this.F&-256|this.U();this.A-=this.B.Mb},function(){this.G=this.G&-256|this.U();this.A-=this.B.Mb},function(){this.H=this.H&-256|this.U();this.A-=this.B.Mb},function(){this.D=this.D&-256|this.U();this.A-=this.B.Mb},
function(){this.F=this.F&255|this.U()<<8;this.A-=this.B.Mb},function(){this.G=this.G&255|this.U()<<8;this.A-=this.B.Mb},function(){this.H=this.H&255|this.U()<<8;this.A-=this.B.Mb},function(){this.D=this.D&255|this.U()<<8;this.A-=this.B.Mb},function(){this.F=this.F&~this.C|this.oa();this.A-=this.B.Mb},function(){this.G=this.G&~this.C|this.oa();this.A-=this.B.Mb},function(){this.H=this.H&~this.C|this.oa();this.A-=this.B.Mb},function(){this.D=this.D&~this.C|this.oa();this.A-=this.B.Mb},function(){u(this,
r(this)&~this.C|this.oa());this.A-=this.B.Mb},function(){this.L=this.L&~this.C|this.oa();this.A-=this.B.Mb},function(){this.K=this.K&~this.C|this.oa();this.A-=this.B.Mb},function(){this.J=this.J&~this.C|this.oa();this.A-=this.B.Mb},Eh,Fh,Eh,Fh,function(){this.Oa[this.U()].call(this,Yf)},function(){this.Oa[this.U()].call(this,Wf)},function(){this.S|=1;this.Se[this.U()].call(this,Mh,this.U)},function(){this.S|=1;this.Pc[this.U()].call(this,Mh,this.oa)},Gh,Hh,Gh,Hh,function(){sf.call(this,3,null,this.B.em)},
function(){var a=this.U();Ce(this,a)?sf.call(this,a,null,0):this.A--},function(){Ve(this)?sf.call(this,4,null,this.B.fm):this.A-=this.B.gm},function(){this.A-=this.B.cm;if(this.ob&1&&this.aa&16384){var a=this.ra(this.bb.ya+0);xd(this.ta,a,!1)}else{var a=this.ta.Qa,b=this.La(),c=this.La(),d=this.La();null!=Bd(this,b,c,!1)&&(Ad(this,d,a),this.zh&&Ge(this,this.sa))}},function(){this.Se[this.U()].call(this,Bh,dh)},function(){this.Pc[this.U()].call(this,2==this.pa?Ch:Dh,dh)},function(){this.Se[this.U()].call(this,
Bh,eh)},function(){this.Pc[this.U()].call(this,2==this.pa?Ch:Dh,eh)},function(){var a=this.U();if(a){var b=this.F&255;this.F=this.F&-65536|b/a<<8|b%a;We(this,this.F,128);this.A-=this.B.Fl}},function(){var a=this.U();this.F=this.F&-65536|(this.F>>8&255)*a+this.F&255;We(this,this.F,128);this.A-=this.B.El},function(){this.F=this.F&-256|(Qe(this)?255:0);this.A-=2},function(){this.F=this.F&-256|jf(this,this.ha,this.D+(this.F&255)&65535);this.A-=this.B.Gm},Ih,Ih,Ih,Ih,Ih,Ih,Ih,Ih,function(){var a=this.M();
(this.G=this.G-1&this.V)&&!Te(this)?(D(this,q(this)+a),this.A-=this.B.nm):this.A-=this.B.Aj},function(){var a=this.M();(this.G=this.G-1&this.V)&&Te(this)?(D(this,q(this)+a),this.A-=this.B.Bj):this.A-=this.B.Cj},function(){var a=this.M();(this.G=this.G-1&this.V)?(D(this,q(this)+a),this.A-=this.B.mm):this.A-=this.B.Aj},function(){var a=this.M();this.G&this.V?this.A-=this.B.Cj:(D(this,q(this)+a),this.A-=this.B.Bj)},function(){var a=this.U();this.F=this.F&-256|pc(this.ma,a,this.sa-2);this.A-=this.B.vj},
function(){var a=this.U();this.F=pc(this.ma,a,this.sa-2);this.F|=pc(this.ma,a+1&65535,this.sa-2)<<8;this.A-=this.B.vj},function(){var a=this.U();tc(this.ma,a,this.F&255,this.sa-2);this.A-=this.B.Lj},function(){var a=this.U();tc(this.ma,a,this.F&255,this.sa-2);tc(this.ma,a+1&65535,this.F>>8,this.sa-2);this.A-=this.B.Lj},function(){var a=this.oa(),b=q(this),a=b+a;x(this,b);D(this,a);this.A-=this.B.Ml},function(){var a=this.oa();D(this,q(this)+a);this.A-=this.B.wj},function(){Bd(this,this.oa(),nf(this));
this.A-=this.B.im},function(){var a=this.M();D(this,q(this)+a);this.A-=this.B.wj},function(){this.F=this.F&-256|pc(this.ma,this.H,this.sa-1);this.A-=this.B.uj},function(){this.F=pc(this.ma,this.H,this.sa-1);this.F|=pc(this.ma,this.H+1&65535,this.sa-1)<<8;this.A-=this.B.uj},function(){tc(this.ma,this.H,this.F&255,this.sa-1);this.A-=this.B.Kj},function(){tc(this.ma,this.H,this.F&255,this.sa-1);tc(this.ma,this.H+1&65535,this.F>>8,this.sa-1);this.A-=this.B.Kj},Jh,Jh,function(){this.S|=132;this.A-=this.B.ad},
function(){this.S|=68;this.A-=this.B.ad},function(){this.Ab|=4;this.A-=2;this.Y&&this.qa(-2147483648)?(this.sa=this.sa+-1|0,this.yb()):this.aa&Qb||(this.Y&&(this.sa=this.sa+-1|0),this.yb())},function(){Qe(this)?Ye(this):Xe(this);this.A-=2},function(){this.Yb=!1;this.Se[this.U()].call(this,Nh,gh);this.Yb&&(this.F=this.F&~this.C|this.tb&this.C)},function(){this.Yb=!1;this.Pc[this.U()].call(this,Oh,gh);this.Yb&&(this.F=this.F&~this.C|this.tb&this.C,this.H=this.H&~this.C|this.lc&this.C)},function(){Ye(this);
this.A-=2},function(){Xe(this);this.A-=2},function(){this.aa&=~Qb;this.A-=this.B.Kl},function(){this.aa|=Qb;this.S|=4;this.A-=2},function(){this.aa&=~Pb;this.A-=2},function(){this.aa|=Pb;this.A-=2},function(){this.Se[this.U()].call(this,Id,gh)},function(){this.Pc[this.U()].call(this,Jd,gh)}],Ah=[xf,gg,vf,pg,zf,Tg,Zg,Kf],Kh=[yf,ng,wf,qg,Af,Ug,$g,Lf],Lh=[function(a,b){this.A-=this.Ma===n?this.B.ac:this.B.ym;return b},ah,ah,ah,ah,ah,ah,ah],Mh=[function(a,b){this.A-=this.Ma===n?this.B.qm:this.B.om;return b},
bh,bh,bh,bh,bh,bh,bh],Bh=[function(a,b){var c=a,d=b&this.Gb;if(d){var e;(d&=7)?(e=a<<d-1,c=(a<<d|a>>8-d)&255):e=a<<7;af(this,c,e,128)}return c},function(a,b){var c=a,d=b&this.Gb;if(d){var e;(d&=7)?(e=a<<8-d,c=(a>>>d|e)&255):e=a;af(this,c,e,128)}return c},function(a,b){var c=a,d=b&this.Gb;if(d){var e=bf(this);(d%=9)?(c=(a<<d|e<<d-1|a>>9-d)&255,e=a<<d-1):e<<=7;af(this,c,e,128)}return c},function(a,b){var c=a,d=b&this.Gb;if(d){var e=bf(this);(d%=9)?(c=(a>>d|e<<8-d|a<<9-d)&255,e=a<<8-d):e<<=7;af(this,
c,e,128)}return c},function(a,b){var c=a,d=b&this.Gb;if(d){var e=0;8<d?c=0:(e=a<<d-1,c=e<<1&255);We(this,c,128,e&128,(c^e)&128)}return c},function(a,b){var c=b&this.Gb;c&&(c=8<c?0:a>>>c-1,a=c>>>1&255,We(this,a,128,c&1,a&128));return a},bh,function(a,b){var c=b&this.Gb;c&&(9<c&&(c=9),c=a<<24>>24>>c-1,a=c>>1&255,We(this,a,128,c&1));return a}],Ch=[function(a,b){var c=a,d=b&this.Gb;if(d){var e;(d&=15)?(e=a<<d-1,c=(a<<d|a>>16-d)&65535):e=a<<15;af(this,c,e,32768)}return c},function(a,b){var c=a,d=b&this.Gb;
if(d){var e;(d&=15)?(e=a<<16-d,c=(a>>>d|e)&65535):e=a;af(this,c,e,32768)}return c},function(a,b){var c=a,d=b&this.Gb;if(d){var e=bf(this);(d%=17)?(c=(a<<d|e<<d-1|a>>17-d)&65535,e=a<<d-1):e<<=15;af(this,c,e,32768)}return c},function(a,b){var c=a,d=b&this.Gb;if(d){var e=bf(this);(d%=17)?(c=(a>>d|e<<16-d|a<<17-d)&65535,e=a<<16-d):e<<=15;af(this,c,e,32768)}return c},function(a,b){var c=a,d=b&this.Gb;if(d){var e=0;16<d?c=0:(e=a<<d-1,c=e<<1&65535);We(this,c,32768,e&32768,(c^e)&32768)}return c},function(a,
b){var c=b&this.Gb;c&&(c=16<c?0:a>>>c-1,a=c>>>1&65535,We(this,a,32768,c&1,a&32768));return a},bh,function(a,b){var c=b&this.Gb;c&&(17<c&&(c=17),c=a<<16>>16>>c-1,a=c>>1&65535,We(this,a,32768,c&1));return a}],Dh=[function(a,b){var c=a,d=b&this.Gb;d&&(c=a<<d|a>>>32-d,af(this,c,a<<d-1,-2147483648));return c},function(a,b){var c=a,d=b&this.Gb;if(d){var e=a<<32-d,c=a>>>d|e;af(this,c,e,-2147483648)}return c},function(a,b){var c=a,d=b&this.Gb;d&&(c=bf(this),c=a<<d|c<<d-1|a>>>32-d>>>1,af(this,c,a<<d-1,-2147483648));
return c},function(a,b){var c=a,d=b&this.Gb;d&&(c=bf(this),c=a>>>d|c<<32-d|a<<32-d<<1,af(this,c,a<<32-d,-2147483648));return c},function(a,b){var c=a,d=b&this.Gb;d&&(d=a<<d-1,c=d<<1,We(this,c,-2147483648,d&-2147483648,(c^d)&-2147483648));return c},function(a,b){var c=b&this.Gb;c&&(c=a>>>c-1,a=c>>>1,We(this,a,-2147483648,c&1,a&-2147483648));return a},bh,function(a,b){var c=b&this.Gb;c&&(c=a>>c-1,a=c>>1,We(this,a,-2147483648,c&1));return a}],Nh=[function(a,b){b=this.U();We(this,a&b,128);this.A-=this.X===
n?this.B.Yj:this.B.Xj;this.S|=2;return a},bh,function(a){this.A-=this.X===n?this.B.Tg:this.B.Sg;return a^255},function(a){var b=-a|0;Pe(this,0,a,b,191,!0);this.A-=this.X===n?this.B.Tg:this.B.Sg;return b&255},function(a){this.Yb=!0;this.tb=(this.F&255)*a&65535;this.tb&65280?(Xe(this),Ze(this)):(Ye(this),$e(this));this.A-=this.X===n?this.B.um:this.B.tm;this.S|=2;return a},function(a){var b=(this.F<<24>>24)*(a<<24>>24)|0;this.Yb=!0;this.tb=b&65535;127<b||-128>b?(Xe(this),Ze(this)):(Ye(this),$e(this));
this.A-=this.X===n?this.B.$l:this.B.Zl;this.S|=2;return a},function(a,b){if(!a)return ch.call(this),a;var c=(b=this.F&65535)/a;if(255<c)return ch.call(this),a;this.Yb=!0;this.tb=c&255|(b%a&255)<<8;this.A-=this.X===n?this.B.Sl:this.B.Rl;this.S|=2;return a},function(a,b){if(!a)return ch.call(this),a;var c=a<<24>>24,d=(b=this.F<<16>>16)/c|0;if(d!=d<<24>>24||8086==this.la&&-128==d)return ch.call(this),a;this.Yb=!0;this.tb=d&255|(b%c&255)<<8;this.A-=this.X===n?this.B.Wl:this.B.Vl;this.S|=2;return a}],
Oh=[function(a,b){b=this.oa();We(this,a&b,32768);this.A-=this.X===n?this.B.Yj:this.B.Xj;this.S|=2;return a},bh,function(a){this.A-=this.X===n?this.B.Tg:this.B.Sg;return a^65535},function(a){var b=-a|0;Pe(this,0,a,b,32831,!0);this.A-=this.X===n?this.B.Tg:this.B.Sg;return b&65535},function(a,b){if(2==this.pa){b=this.F&65535;var c=b*a|0;this.Yb=!0;this.tb=c&65535;this.lc=c>>16&65535}else fg.call(this,a,this.F);this.lc?(Xe(this),Ze(this)):(Ye(this),$e(this));this.A-=this.X===n?this.B.wm:this.B.vm;this.S|=
2;return a},function(a,b){var c;if(2==this.pa)b=this.F&65535,c=(b<<16>>16)*(a<<16>>16)|0,this.Yb=!0,this.tb=c&65535,this.lc=c>>16&65535,c=32767<c||-32768>c;else{c=a;var d=this.F,e=!1;0>d&&(d=-d|0,e=!e);0>c&&(c=-c|0,e=!e);fg.call(this,c,d);e&&(this.tb=~this.tb+1|0,this.lc=~this.lc+(this.tb?0:1)|0);c=this.lc!=this.tb>>31}c?(Xe(this),Ze(this)):(Ye(this),$e(this));this.A-=this.X===n?this.B.bm:this.B.am;this.S|=2;return a},function(a,b){if(2==this.pa){if(!a)return ch.call(this),a;b=65536*(this.H&65535)+
(this.F&65535);var c=b/a|0;if(65536<=c)return ch.call(this),a;this.Yb=!0;this.tb=c&65535;this.lc=b%a&65535}else{Of.call(this,this.F,this.H,a);if(!this.Yb)return ch.call(this),a;this.tb|=0;this.lc|=0}this.A-=this.X===n?this.B.Ul:this.B.Tl;this.S|=2;return a},function(a,b){if(2==this.pa){if(!a)return ch.call(this),a;var c=a<<16>>16,d=(b=this.H<<16|this.F&65535)/c|0;if(d!=d<<16>>16||8086==this.la&&-32768==d)return ch.call(this),a;this.Yb=!0;this.tb=d&65535;this.lc=b%c&65535}else{var c=this.F,d=this.H,
e=a,g=!1,l=!1;0>e&&(e=-e|0,g=!g);0>d&&(c=-c|0,d=~d+(c?0:1)|0,l=!0,g=!g);Of.call(this,c,d,e);2147483647<this.tb&&(this.Yb=!1);g&&(this.tb=-this.tb);l&&(this.lc=-this.lc);if(!this.Yb)return ch.call(this),a;this.tb|=0;this.lc|=0}this.A-=this.X===n?this.B.Yl:this.B.Xl;this.S|=2;return a}],Id=[function(a){var b=a+1|0;Pe(this,a,1,b,190);this.A-=this.X===n?this.B.Rg:this.B.Qg;return b&255},function(a){var b=a-1|0;Pe(this,a,1,b,190,!0);this.A-=this.X===n?this.B.Rg:this.B.Qg;return b&255},bh,bh,bh,bh,bh,bh],
Jd=[function(a){var b=a+1|0;Pe(this,a,1,b,32830);this.A-=this.X===n?this.B.Rg:this.B.Qg;return b&65535},function(a){var b=a-1|0;Pe(this,a,1,b,32830,!0);this.A-=this.X===n?this.B.Rg:this.B.Qg;return b&65535},function(a){x(this,q(this));D(this,a);this.A-=this.X===n?this.B.Ql:this.B.Pl;this.S|=2;return a},function(a){if(this.X===n)return bh.call(this,a);Jf.call(this,a,this.ra(this.X+this.pa));this.A-=this.B.Nl;this.S|=2;return a},function(a){D(this,a);this.A-=this.X===n?this.B.km:this.B.jm;this.S|=2;
return a},function(a){if(this.X===n)return bh.call(this,a);Bd(this,a,this.ra(this.X+this.pa));this.zh&&Ge(this,this.sa);this.A-=this.B.hm;this.S|=2;return a},function(a){var b=a;this.S&512&&(a=a-2&65535,80286>this.la&&(b=a));x(this,b);this.A-=this.X===n?this.B.Ac:this.B.Am;this.S|=2;return a},ah],de=Array(256);de[0]=function(){var a=this.U();16>(a&56)&&(this.S|=1);this.Pc[a].call(this,this.hn,gh)};de[1]=function(){var a=this.U();a&16||(this.S|=1);this.Pc[a].call(this,Ph,gh)};
de[2]=function(){this.Oa[this.U()].call(this,Vf)};de[3]=function(){this.Oa[this.U()].call(this,ag)};
de[5]=function(){this.ta.Qa?ud.call(this,13,0,!0):(gf(this,this.ra(2054)),this.J=this.ra(2086),this.K=this.ra(2088),this.L=this.ra(2090),this.D=this.ra(2094),this.H=this.ra(2096),this.G=this.ra(2098),this.F=this.ra(2100),vd(this.Na,2102,this.ra(2084)),vd(this.ta,2108,this.ra(2082)),vd(this.ua,2114,this.ra(2080)),vd(this.ab,2120,this.ra(2078)),Ad(this,this.ra(2072)),D(this,this.ra(2074)),u(this,this.ra(2092)),this.Ed=this.ra(2126)|this.Ra(2128)<<16,this.zf=this.Ed+this.ra(2130),vd(this.xd,2132,this.ra(2076)),
this.Fd=this.ra(2138)|this.Ra(2140)<<16,this.Af=this.Fd+this.ra(2142),vd(this.bb,2144,this.ra(2070)),this.A-=195)};de[6]=function(){this.ta.Qa?ud.call(this,13,0):(this.ob&=-9,this.A-=2)};de[11]=Ld;var y=[];y[32]=function(){var a=this.U()|192;if(this.ta.Qa)ud.call(this,13,0);else{switch((a&56)>>3){case 0:this.Qd=this.ob;break;case 1:this.Qd=this.hi;break;case 2:this.Qd=this.Vf;break;case 3:this.Qd=this.Wf;break;default:ee.call(this);return}ye(this,4);this.Oa[a].call(this,eg)}};
y[34]=function(){var a,b=this.U()|192;if(this.ta.Qa)ud.call(this,13,0);else{var c=(b&56)>>3;switch(c){case 0:a=this.F;break;case 1:a=this.G;break;case 2:a=this.H;break;case 3:a=this.D;break;default:Ld.call(this);return}ye(this,4);this.Oa[b].call(this,cg);switch(c){case 0:c=this.F;this.F=a;this.ob=c;oe(this);this.ob&-2147483648?me(this):this.na!=this.Pe&&(this.na=this.Pe,this.ui=this.Sk=null);break;case 1:this.hi=this.G;this.G=a;break;case 2:this.Vf=this.H;this.H=a;break;case 3:c=this.D,this.D=a,this.Wf=
c,this.ob&-2147483648&&me(this)}}};y[128]=function(){var a=this.oa();Ve(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja};y[129]=function(){var a=this.oa();Ve(this)?this.A-=this.B.Ja:(D(this,q(this)+a),this.A-=this.B.Ia)};y[130]=function(){var a=this.oa();Qe(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja};y[131]=function(){var a=this.oa();Qe(this)?this.A-=this.B.Ja:(D(this,q(this)+a),this.A-=this.B.Ia)};
y[132]=function(){var a=this.oa();Te(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja};y[133]=function(){var a=this.oa();Te(this)?this.A-=this.B.Ja:(D(this,q(this)+a),this.A-=this.B.Ia)};y[134]=function(){var a=this.oa();Qe(this)||Te(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja};y[135]=function(){var a=this.oa();Qe(this)||Te(this)?this.A-=this.B.Ja:(D(this,q(this)+a),this.A-=this.B.Ia)};
y[136]=function(){var a=this.oa();Ue(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja};y[137]=function(){var a=this.oa();Ue(this)?this.A-=this.B.Ja:(D(this,q(this)+a),this.A-=this.B.Ia)};y[138]=function(){var a=this.oa();Re(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja};y[139]=function(){var a=this.oa();Re(this)?this.A-=this.B.Ja:(D(this,q(this)+a),this.A-=this.B.Ia)};
y[140]=function(){var a=this.oa();!Ue(this)!=!Ve(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja};y[141]=function(){var a=this.oa();!Ue(this)==!Ve(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja};y[142]=function(){var a=this.oa();Te(this)||!Ue(this)!=!Ve(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja};y[143]=function(){var a=this.oa();Te(this)||!Ue(this)!=!Ve(this)?this.A-=this.B.Ja:(D(this,q(this)+a),this.A-=this.B.Ia)};y[144]=function(){rg.call(this,sg)};
y[145]=function(){rg.call(this,sg)};y[146]=function(){rg.call(this,tg)};y[147]=function(){rg.call(this,ug)};y[148]=function(){rg.call(this,vg)};y[149]=function(){rg.call(this,wg)};y[150]=function(){rg.call(this,xg)};y[151]=function(){rg.call(this,yg)};y[152]=function(){rg.call(this,zg)};y[153]=function(){rg.call(this,Ag)};y[154]=function(){rg.call(this,Bg)};y[155]=function(){rg.call(this,Cg)};y[156]=function(){rg.call(this,Dg)};y[157]=function(){rg.call(this,Eg)};y[158]=function(){rg.call(this,Fg)};
y[159]=function(){rg.call(this,Gg)};y[160]=function(){x(this,this.Cc.ia);this.A-=this.B.nf};y[161]=function(){var a=this.La();this.Cc.load(a);this.A-=this.B.ac};y[163]=function(){this.Jb[this.U()].call(this,Ff);this.X!==n&&(this.A-=this.B.Yq)};y[164]=function(){this.Jb[this.U()].call(this,2==this.pa?Jg:Kg);this.A-=this.X===n?this.B.Tj:this.B.Sj};y[165]=function(){this.Jb[this.U()].call(this,2==this.pa?Lg:Mg);this.A-=this.X===n?this.B.Tj:this.B.Sj};y[168]=function(){x(this,this.Dc.ia);this.A-=this.B.nf};
y[169]=function(){var a=this.La();this.Dc.load(a);this.A-=this.B.ac};y[171]=function(){this.Jb[this.U()].call(this,If);this.X!==n&&(this.A-=this.B.Hl)};y[172]=function(){this.Jb[this.U()].call(this,2==this.pa?Pg:Qg);this.A-=this.X===n?this.B.Tj:this.B.Sj};y[173]=function(){this.Jb[this.U()].call(this,2==this.pa?Rg:Sg);this.A-=this.X===n?this.B.Tj:this.B.Sj};y[175]=function(){this.Oa[this.U()].call(this,2==this.pa?Sf:Tf)};y[178]=function(){this.Oa[this.U()].call(this,bg)};
y[179]=function(){this.Jb[this.U()].call(this,Hf);this.X!==n&&(this.A-=this.B.Hl)};y[180]=function(){this.Oa[this.U()].call(this,Zf)};y[181]=function(){this.Oa[this.U()].call(this,$f)};
y[182]=function(){var a,b=this.U(),c=(b&56)>>3;switch(c){case 4:a=this.F;break;case 5:a=this.G;break;case 6:a=this.H;break;case 7:a=this.D}this.Qc[b].call(this,dg);switch(c){case 0:this.F=this.F&~this.C|this.F&255;break;case 1:this.G=this.G&~this.C|this.G&255;break;case 2:this.H=this.H&~this.C|this.H&255;break;case 3:this.D=this.D&~this.C|this.D&255;break;case 4:this.he=this.he&~this.C|this.F>>8&255;this.F=a;break;case 5:this.L=this.L&~this.C|this.G>>8&255;this.G=a;break;case 6:this.K=this.K&~this.C|
this.H>>8&255;this.H=a;break;case 7:this.J=this.J&~this.C|this.D>>8&255,this.D=a}this.A-=this.X===n?this.B.Jj:this.B.Ij};y[183]=function(){var a=this.U();ye(this,2);this.Oa[a].call(this,dg);switch((a&56)>>3){case 0:this.F&=65535;break;case 1:this.G&=65535;break;case 2:this.H&=65535;break;case 3:this.D&=65535;break;case 4:this.he&=65535;break;case 5:this.L&=65535;break;case 6:this.K&=65535;break;case 7:this.J&=65535}this.A-=this.X===n?this.B.Jj:this.B.Ij};
y[186]=function(){this.Pc[this.U()].call(this,Qh,this.U)};y[187]=function(){this.Jb[this.U()].call(this,Gf);this.X!==n&&(this.A-=this.B.Hl)};y[188]=function(){this.Oa[this.U()].call(this,Df)};y[189]=function(){this.Oa[this.U()].call(this,Ef)};
y[190]=function(){var a,b=this.U(),c=(b&56)>>3;switch(c){case 4:a=this.F;break;case 5:a=this.G;break;case 6:a=this.H;break;case 7:a=this.D}this.Qc[b].call(this,dg);switch(c){case 0:this.F=this.F&~this.C|(this.F&255)<<24>>24&this.C;break;case 1:this.G=this.G&~this.C|(this.G&255)<<24>>24&this.C;break;case 2:this.H=this.H&~this.C|(this.H&255)<<24>>24&this.C;break;case 3:this.D=this.D&~this.C|(this.D&255)<<24>>24&this.C;break;case 4:this.he=this.he&~this.C|this.F<<16>>24&this.C;this.F=a;break;case 5:this.L=
this.L&~this.C|this.G<<16>>24&this.C;this.G=a;break;case 6:this.K=this.K&~this.C|this.H<<16>>24&this.C;this.H=a;break;case 7:this.J=this.J&~this.C|this.D<<16>>24&this.C,this.D=a}this.A-=this.X===n?this.B.Jj:this.B.Ij};
y[191]=function(){var a=this.U();ye(this,2);this.Oa[a].call(this,dg);switch((a&56)>>3){case 0:this.F=this.F<<16>>16;break;case 1:this.G=this.G<<16>>16;break;case 2:this.H=this.H<<16>>16;break;case 3:this.D=this.D<<16>>16;break;case 4:this.he=this.he<<16>>16;break;case 5:this.L=this.L<<16>>16;break;case 6:this.K=this.K<<16>>16;break;case 7:this.J=this.J<<16>>16}this.A-=this.X===n?this.B.Jj:this.B.Ij};
var He=[function(){this.A-=2+(this.X===n?0:1);return this.xd.ia},function(){this.A-=2+(this.X===n?0:1);return this.bb.ia},function(a){this.S|=2;this.xd.load(a);this.A-=17+(this.X===n?0:2);return a},function(a){this.S|=2;this.bb.load(a)!==n&&(this.Ib(this.bb.Dd+4,this.bb.Pb|=512),this.bb.type=768);this.A-=17+(this.X===n?0:2);return a},function(a){this.S|=2;this.A-=14+(this.X===n?0:2);if(this.Sb.load(a,!0)!==n&&2048!=(this.Sb.Pb&2560)&&(this.Sb.zc>=this.ta.Qa&&this.Sb.zc>=(a&3)||7168==(this.Sb.Pb&7168)))return ff(this),
a;df(this);return a},function(a){this.S|=2;this.A-=14+(this.X===n?0:2);if(this.Sb.load(a,!0)!==n&&512==(this.Sb.Pb&2560)&&this.Sb.zc>=this.ta.Qa&&this.Sb.zc>=(a&3))return ff(this),a;df(this);return a},bh,bh],Kd=[be,be,be,be,be,be,bh,bh],Ph=[function(a){if(this.X===n)Ld.call(this);else{a=this.zf-this.Ed;var b=this.Ed;80286==this.la?b|=-16777216:80386<=this.la&&(2==this.pa?b&=16777215:a|=b<<16);this.vk(this.X+2,b);this.A-=11}return a},function(a){if(this.X===n)Ld.call(this);else{a=this.Af-this.Fd;var b=
this.Fd;80286==this.la?b|=-16777216:80386<=this.la&&(2==this.pa?b&=16777215:a|=b<<16);this.vk(this.X+2,b);this.A-=12}return a},function(a){this.X===n?Ld.call(this):(this.Ed=this.de(this.X+2)&(this.C|this.C<<8),a&=65535,this.zf=this.Ed+a,this.S|=2,this.A-=11);return a},function(a){this.X===n?Ld.call(this):(this.Fd=this.de(this.X+2)&(this.C|this.C<<8),a&=65535,this.Af=this.Fd+a,this.S|=2,this.A-=12);return a},function(){this.A-=2+(this.X===n?0:1);return this.ob},bh,function(a){gf(this,a);this.A-=this.X===
n?3:6;this.S|=2;return a},bh],Qh=[bh,bh,bh,bh,Ff,If,Hf,Gf],z=[function(a){a=a.call(this,this.F&255,F(this,this.D+this.K));this.F=this.F&-256|a;this.A-=this.B.ba},function(a){a=a.call(this,this.F&255,F(this,this.D+this.J));this.F=this.F&-256|a;this.A-=this.B.ca},function(a){a=a.call(this,this.F&255,H(this,this.L+this.K));this.F=this.F&-256|a;this.A-=this.B.ca},function(a){a=a.call(this,this.F&255,H(this,this.L+this.J));this.F=this.F&-256|a;this.A-=this.B.ba},function(a){a=a.call(this,this.F&255,F(this,
this.K));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,F(this,this.J));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,F(this,U(this)));this.F=this.F&-256|a;this.A-=this.B.da},function(a){a=a.call(this,this.F&255,F(this,this.D));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,F(this,this.D+this.K));this.G=this.G&-256|a;this.A-=this.B.ba},function(a){a=a.call(this,this.G&255,F(this,this.D+this.J));this.G=this.G&-256|
a;this.A-=this.B.ca},function(a){a=a.call(this,this.G&255,H(this,this.L+this.K));this.G=this.G&-256|a;this.A-=this.B.ca},function(a){a=a.call(this,this.G&255,H(this,this.L+this.J));this.G=this.G&-256|a;this.A-=this.B.ba},function(a){a=a.call(this,this.G&255,F(this,this.K));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,F(this,this.J));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,F(this,U(this)));this.G=this.G&-256|a;this.A-=this.B.da},function(a){a=
a.call(this,this.G&255,F(this,this.D));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,F(this,this.D+this.K));this.H=this.H&-256|a;this.A-=this.B.ba},function(a){a=a.call(this,this.H&255,F(this,this.D+this.J));this.H=this.H&-256|a;this.A-=this.B.ca},function(a){a=a.call(this,this.H&255,H(this,this.L+this.K));this.H=this.H&-256|a;this.A-=this.B.ca},function(a){a=a.call(this,this.H&255,H(this,this.L+this.J));this.H=this.H&-256|a;this.A-=this.B.ba},function(a){a=a.call(this,
this.H&255,F(this,this.K));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,F(this,this.J));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,F(this,U(this)));this.H=this.H&-256|a;this.A-=this.B.da},function(a){a=a.call(this,this.H&255,F(this,this.D));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,F(this,this.D+this.K));this.D=this.D&-256|a;this.A-=this.B.ba},function(a){a=a.call(this,this.D&255,F(this,this.D+this.J));
this.D=this.D&-256|a;this.A-=this.B.ca},function(a){a=a.call(this,this.D&255,H(this,this.L+this.K));this.D=this.D&-256|a;this.A-=this.B.ca},function(a){a=a.call(this,this.D&255,H(this,this.L+this.J));this.D=this.D&-256|a;this.A-=this.B.ba},function(a){a=a.call(this,this.D&255,F(this,this.K));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,F(this,this.J));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,F(this,U(this)));this.D=this.D&-256|a;this.A-=
this.B.da},function(a){a=a.call(this,this.D&255,F(this,this.D));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,F(this,this.D+this.K));this.F=this.F&-65281|a<<8;this.A-=this.B.ba},function(a){a=a.call(this,this.F>>8&255,F(this,this.D+this.J));this.F=this.F&-65281|a<<8;this.A-=this.B.ca},function(a){a=a.call(this,this.F>>8&255,H(this,this.L+this.K));this.F=this.F&-65281|a<<8;this.A-=this.B.ca},function(a){a=a.call(this,this.F>>8&255,H(this,this.L+this.J));this.F=this.F&
-65281|a<<8;this.A-=this.B.ba},function(a){a=a.call(this,this.F>>8&255,F(this,this.K));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,F(this,this.J));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,F(this,U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.da},function(a){a=a.call(this,this.F>>8&255,F(this,this.D));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,F(this,this.D+this.K));this.G=
this.G&-65281|a<<8;this.A-=this.B.ba},function(a){a=a.call(this,this.G>>8&255,F(this,this.D+this.J));this.G=this.G&-65281|a<<8;this.A-=this.B.ca},function(a){a=a.call(this,this.G>>8&255,H(this,this.L+this.K));this.G=this.G&-65281|a<<8;this.A-=this.B.ca},function(a){a=a.call(this,this.G>>8&255,H(this,this.L+this.J));this.G=this.G&-65281|a<<8;this.A-=this.B.ba},function(a){a=a.call(this,this.G>>8&255,F(this,this.K));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,
F(this,this.J));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,F(this,U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.da},function(a){a=a.call(this,this.G>>8&255,F(this,this.D));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,F(this,this.D+this.K));this.H=this.H&-65281|a<<8;this.A-=this.B.ba},function(a){a=a.call(this,this.H>>8&255,F(this,this.D+this.J));this.H=this.H&-65281|a<<8;this.A-=this.B.ca},function(a){a=a.call(this,
this.H>>8&255,H(this,this.L+this.K));this.H=this.H&-65281|a<<8;this.A-=this.B.ca},function(a){a=a.call(this,this.H>>8&255,H(this,this.L+this.J));this.H=this.H&-65281|a<<8;this.A-=this.B.ba},function(a){a=a.call(this,this.H>>8&255,F(this,this.K));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,F(this,this.J));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,F(this,U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.da},function(a){a=
a.call(this,this.H>>8&255,F(this,this.D));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,F(this,this.D+this.K));this.D=this.D&-65281|a<<8;this.A-=this.B.ba},function(a){a=a.call(this,this.D>>8&255,F(this,this.D+this.J));this.D=this.D&-65281|a<<8;this.A-=this.B.ca},function(a){a=a.call(this,this.D>>8&255,H(this,this.L+this.K));this.D=this.D&-65281|a<<8;this.A-=this.B.ca},function(a){a=a.call(this,this.D>>8&255,H(this,this.L+this.J));this.D=this.D&-65281|a<<8;this.A-=
this.B.ba},function(a){a=a.call(this,this.D>>8&255,F(this,this.K));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,F(this,this.J));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,F(this,U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.da},function(a){a=a.call(this,this.D>>8&255,F(this,this.D));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,F(this,this.D+this.K+this.M()));this.F=this.F&-256|
a;this.A-=this.B.P},function(a){a=a.call(this,this.F&255,F(this,this.D+this.J+this.M()));this.F=this.F&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.F&255,H(this,this.L+this.K+this.M()));this.F=this.F&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.F&255,H(this,this.L+this.J+this.M()));this.F=this.F&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&255,F(this,this.K+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.J+this.M()));
this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,H(this,this.L+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.D+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.D+this.K+this.M()));this.G=this.G&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&255,F(this,this.D+this.J+this.M()));this.G=this.G&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.G&255,H(this,
this.L+this.K+this.M()));this.G=this.G&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.G&255,H(this,this.L+this.J+this.M()));this.G=this.G&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&255,F(this,this.K+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.J+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,H(this,this.L+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,
this.G&255,F(this,this.D+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.D+this.K+this.M()));this.H=this.H&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&255,F(this,this.D+this.J+this.M()));this.H=this.H&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.H&255,H(this,this.L+this.K+this.M()));this.H=this.H&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.H&255,H(this,this.L+this.J+this.M()));this.H=this.H&-256|a;this.A-=this.B.P},
function(a){a=a.call(this,this.H&255,F(this,this.K+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.J+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,H(this,this.L+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.D+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.D+this.K+this.M()));this.D=this.D&-256|a;this.A-=
this.B.P},function(a){a=a.call(this,this.D&255,F(this,this.D+this.J+this.M()));this.D=this.D&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.D&255,H(this,this.L+this.K+this.M()));this.D=this.D&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.D&255,H(this,this.L+this.J+this.M()));this.D=this.D&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&255,F(this,this.K+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.J+this.M()));this.D=
this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,H(this,this.L+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.D+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.D+this.K+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.F>>8&255,F(this,this.D+this.J+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.F>>8&
255,H(this,this.L+this.K+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.F>>8&255,H(this,this.L+this.J+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.F>>8&255,F(this,this.K+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.J+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,H(this,this.L+this.M()));this.F=this.F&-65281|a<<
8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.D+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.D+this.K+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.G>>8&255,F(this,this.D+this.J+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.G>>8&255,H(this,this.L+this.K+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,
this.G>>8&255,H(this,this.L+this.J+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.G>>8&255,F(this,this.K+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.J+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,H(this,this.L+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.D+this.M()));this.G=this.G&-65281|
a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.D+this.K+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.H>>8&255,F(this,this.D+this.J+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.H>>8&255,H(this,this.L+this.K+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.H>>8&255,H(this,this.L+this.J+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.P},function(a){a=
a.call(this,this.H>>8&255,F(this,this.K+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.J+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,H(this,this.L+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.D+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.D+this.K+this.M()));this.D=
this.D&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.D>>8&255,F(this,this.D+this.J+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.D>>8&255,H(this,this.L+this.K+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.D>>8&255,H(this,this.L+this.J+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.D>>8&255,F(this,this.K+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=
a.call(this,this.D>>8&255,F(this,this.J+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,H(this,this.L+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.D+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.D+this.K+U(this)));this.F=this.F&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&255,F(this,this.D+this.J+U(this)));this.F=this.F&
-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.F&255,H(this,this.L+this.K+U(this)));this.F=this.F&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.F&255,H(this,this.L+this.J+U(this)));this.F=this.F&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&255,F(this,this.K+U(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.J+U(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,H(this,this.L+U(this)));this.F=
this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.D+U(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.D+this.K+U(this)));this.G=this.G&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&255,F(this,this.D+this.J+U(this)));this.G=this.G&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.G&255,H(this,this.L+this.K+U(this)));this.G=this.G&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.G&255,H(this,this.L+
this.J+U(this)));this.G=this.G&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&255,F(this,this.K+U(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.J+U(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,H(this,this.L+U(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.D+U(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.D+
this.K+U(this)));this.H=this.H&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&255,F(this,this.D+this.J+U(this)));this.H=this.H&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.H&255,H(this,this.L+this.K+U(this)));this.H=this.H&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.H&255,H(this,this.L+this.J+U(this)));this.H=this.H&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&255,F(this,this.K+U(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,
this.H&255,F(this,this.J+U(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,H(this,this.L+U(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.D+U(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.D+this.K+U(this)));this.D=this.D&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&255,F(this,this.D+this.J+U(this)));this.D=this.D&-256|a;this.A-=this.B.Q},function(a){a=
a.call(this,this.D&255,H(this,this.L+this.K+U(this)));this.D=this.D&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.D&255,H(this,this.L+this.J+U(this)));this.D=this.D&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&255,F(this,this.K+U(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.J+U(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,H(this,this.L+U(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=
a.call(this,this.D&255,F(this,this.D+U(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.D+this.K+U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.F>>8&255,F(this,this.D+this.J+U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.F>>8&255,H(this,this.L+this.K+U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.F>>8&255,H(this,this.L+this.J+U(this)));
this.F=this.F&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.F>>8&255,F(this,this.K+U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.J+U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,H(this,this.L+U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.D+U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,
this.G>>8&255,F(this,this.D+this.K+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.G>>8&255,F(this,this.D+this.J+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.G>>8&255,H(this,this.L+this.K+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.G>>8&255,H(this,this.L+this.J+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.G>>8&255,F(this,this.K+U(this)));this.G=
this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.J+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,H(this,this.L+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.D+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.D+this.K+U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,
this.H>>8&255,F(this,this.D+this.J+U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.H>>8&255,H(this,this.L+this.K+U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.H>>8&255,H(this,this.L+this.J+U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.H>>8&255,F(this,this.K+U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.J+U(this)));this.H=this.H&
-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,H(this,this.L+U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.D+U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.D+this.K+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.D>>8&255,F(this,this.D+this.J+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,
this.D>>8&255,H(this,this.L+this.K+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.D>>8&255,H(this,this.L+this.J+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.D>>8&255,F(this,this.K+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.J+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,H(this,this.L+U(this)));this.D=this.D&-65281|
a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.D+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,this.F&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.G&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.H&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.D&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.F>>8&255);this.F=this.F&-256|a},function(a){a=
a.call(this,this.F&255,this.G>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.H>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.D>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.G&255,this.F&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.G&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.H&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.D&255);this.G=this.G&-256|a},function(a){a=
a.call(this,this.G&255,this.F>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.G>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.H>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.D>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.H&255,this.F&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.G&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.H&255);this.H=this.H&-256|a},function(a){a=
a.call(this,this.H&255,this.D&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.F>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.G>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.H>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.D>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.D&255,this.F&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.G&255);this.D=this.D&-256|a},function(a){a=
a.call(this,this.D&255,this.H&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.D&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.F>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.G>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.H>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.D>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.F>>8&255,this.F&255);this.F=this.F&-65281|a<<8},
function(a){a=a.call(this,this.F>>8&255,this.G&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.H&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.D&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.F>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.G>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.H>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,
this.F>>8&255,this.D>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.F&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.G&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.H&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.D&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.F>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.G>>
8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.H>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.D>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.F&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.G&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.H&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.D&255);this.H=this.H&
-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.F>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.G>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.H>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.D>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.F&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.G&255);this.D=this.D&-65281|a<<8},function(a){a=
a.call(this,this.D>>8&255,this.H&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.D&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.F>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.G>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.H>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.D>>8&255);this.D=this.D&-65281|a<<8}],qe=[function(a){a=a.call(this,
L(this,this.D+this.K),this.F&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.D+this.J),this.F&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.K),this.F&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.J),this.F&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.K),this.F&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.F&255);Q(this,a);this.A-=this.B.N},function(a){a=
a.call(this,L(this,U(this)),this.F&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.D),this.F&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.G&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.D+this.J),this.G&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.K),this.G&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.J),this.G&255);Q(this,a);this.A-=this.B.ba},
function(a){a=a.call(this,L(this,this.K),this.G&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.G&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this)),this.G&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.D),this.G&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.H&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.D+this.J),this.H&255);Q(this,a);this.A-=this.B.ca},
function(a){a=a.call(this,M(this,this.L+this.K),this.H&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.J),this.H&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.K),this.H&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.H&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this)),this.H&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.D),this.H&255);Q(this,a);this.A-=this.B.N},
function(a){a=a.call(this,L(this,this.D+this.K),this.D&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.D+this.J),this.D&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.K),this.D&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.J),this.D&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.K),this.D&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.D&255);Q(this,a);this.A-=
this.B.N},function(a){a=a.call(this,L(this,U(this)),this.D&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.D),this.D&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.F>>8&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.D+this.J),this.F>>8&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.K),this.F>>8&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.J),this.F>>
8&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.K),this.F>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.F>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.D),this.F>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.G>>8&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.D+
this.J),this.G>>8&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.K),this.G>>8&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.J),this.G>>8&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.K),this.G>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.G>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.da},function(a){a=
a.call(this,L(this,this.D),this.G>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.H>>8&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.D+this.J),this.H>>8&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.K),this.H>>8&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.J),this.H>>8&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.K),this.H>>8&255);Q(this,
a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.H>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.D),this.H>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.D>>8&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.D+this.J),this.D>>8&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.K),
this.D>>8&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.J),this.D>>8&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.K),this.D>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.D>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.D),this.D>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,
this.D+this.K+this.M()),this.F&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.F&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+this.M()),this.F&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.J+this.M()),this.F&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+this.M()),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.F&
255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.G&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.G&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+this.M()),this.G&255);Q(this,a);this.A-=this.B.Q},
function(a){a=a.call(this,M(this,this.L+this.J+this.M()),this.G&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+this.M()),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+
this.M()),this.H&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.H&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+this.M()),this.H&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.J+this.M()),this.H&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+this.M()),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.H&255);Q(this,a);
this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.D&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.D&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+this.M()),this.D&255);Q(this,a);this.A-=this.B.Q},function(a){a=
a.call(this,M(this,this.L+this.J+this.M()),this.D&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+this.M()),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.F>>
8&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.F>>8&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+this.M()),this.F>>8&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.J+this.M()),this.F>>8&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+this.M()),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.F>>8&255);Q(this,a);
this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.Q},
function(a){a=a.call(this,M(this,this.L+this.J+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,
this.D+this.K+this.M()),this.H>>8&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.H>>8&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+this.M()),this.H>>8&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.J+this.M()),this.H>>8&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+this.M()),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),
this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.D>>8&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.D>>8&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+this.M()),this.D>>8&255);
Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.J+this.M()),this.D>>8&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+this.M()),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=
a.call(this,L(this,this.D+this.K+U(this)),this.F&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+U(this)),this.F&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+U(this)),this.F&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.J+U(this)),this.F&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+U(this)),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),
this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+U(this)),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+U(this)),this.G&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+U(this)),this.G&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+U(this)),this.G&255);Q(this,a);this.A-=this.B.Q},
function(a){a=a.call(this,M(this,this.L+this.J+U(this)),this.G&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+U(this)),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+U(this)),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+U(this)),
this.H&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+U(this)),this.H&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+U(this)),this.H&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.J+U(this)),this.H&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+U(this)),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),this.H&255);Q(this,a);this.A-=this.B.I},
function(a){a=a.call(this,M(this,this.L+U(this)),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+U(this)),this.D&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+U(this)),this.D&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+U(this)),this.D&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+
this.J+U(this)),this.D&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+U(this)),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+U(this)),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+U(this)),this.F>>8&255);Q(this,a);this.A-=
this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.J+U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=
a.call(this,M(this,this.L+U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+
this.J+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+U(this)),this.H>>8&255);Q(this,
a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.J+U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.I},
function(a){a=a.call(this,M(this,this.L+U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,
M(this,this.L+this.J+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.I},z[192],z[200],z[208],z[216],z[224],z[232],z[240],z[248],z[193],
z[201],z[209],z[217],z[225],z[233],z[241],z[249],z[194],z[202],z[210],z[218],z[226],z[234],z[242],z[250],z[195],z[203],z[211],z[219],z[227],z[235],z[243],z[251],z[196],z[204],z[212],z[220],z[228],z[236],z[244],z[252],z[197],z[205],z[213],z[221],z[229],z[237],z[245],z[253],z[198],z[206],z[214],z[222],z[230],z[238],z[246],z[254],z[199],z[207],z[215],z[223],z[231],z[239],z[247],z[255]],re=[function(a,b){var c=a[0].call(this,L(this,this.D+this.K),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,
b){var c=a[0].call(this,L(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[0].call(this,M(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[0].call(this,M(this,this.L+this.J),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[0].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,
L(this,U(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[0].call(this,L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,this.D+this.K),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[1].call(this,L(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[1].call(this,M(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[1].call(this,M(this,this.L+this.J),
b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[1].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,U(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[1].call(this,L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.D+this.K),b.call(this));Q(this,c);this.A-=
this.B.ba},function(a,b){var c=a[2].call(this,L(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[2].call(this,M(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[2].call(this,M(this,this.L+this.J),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[2].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,
b){var c=a[2].call(this,L(this,U(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[2].call(this,L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.D+this.K),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[3].call(this,L(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[3].call(this,M(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[3].call(this,
M(this,this.L+this.J),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[3].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,U(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[3].call(this,L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.D+this.K),b.call(this));
Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[4].call(this,L(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[4].call(this,M(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[4].call(this,M(this,this.L+this.J),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[4].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=
this.B.N},function(a,b){var c=a[4].call(this,L(this,U(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[4].call(this,L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.D+this.K),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[5].call(this,L(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[5].call(this,M(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,
b){var c=a[5].call(this,M(this,this.L+this.J),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[5].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,U(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[5].call(this,L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,
this.D+this.K),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[6].call(this,L(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[6].call(this,M(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[6].call(this,M(this,this.L+this.J),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[6].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.J),b.call(this));
Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,U(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[6].call(this,L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.D+this.K),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[7].call(this,L(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[7].call(this,M(this,this.L+this.K),b.call(this));Q(this,c);this.A-=
this.B.ca},function(a,b){var c=a[7].call(this,M(this,this.L+this.J),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[7].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,U(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[7].call(this,L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=
a[0].call(this,L(this,this.D+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,L(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[0].call(this,M(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[0].call(this,M(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=
this.B.I},function(a,b){var c=a[0].call(this,L(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,M(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.D+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,L(this,this.D+this.J+this.M()),b.call(this));
Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[1].call(this,M(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[1].call(this,M(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,this.L+this.M()),
b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.D+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,L(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[2].call(this,M(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[2].call(this,
M(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,
L(this,this.D+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,L(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[3].call(this,M(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[3].call(this,M(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,
b){var c=a[3].call(this,L(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.D+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,L(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},
function(a,b){var c=a[4].call(this,M(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[4].call(this,M(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,M(this,this.L+this.M()),b.call(this));Q(this,c);
this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,L(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[5].call(this,M(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[5].call(this,M(this,this.L+this.J+this.M()),
b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,M(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.D+this.K+
this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,L(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[6].call(this,M(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[6].call(this,M(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,
L(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.D+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,L(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=
a[7].call(this,M(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[7].call(this,M(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,
b){var c=a[7].call(this,L(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.D+this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,L(this,this.D+this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[0].call(this,M(this,this.L+this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[0].call(this,M(this,this.L+this.J+U(this)),b.call(this));Q(this,c);this.A-=
this.B.P},function(a,b){var c=a[0].call(this,L(this,this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.D+this.K+U(this)),b.call(this));Q(this,c);this.A-=
this.B.P},function(a,b){var c=a[1].call(this,L(this,this.D+this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[1].call(this,M(this,this.L+this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[1].call(this,M(this,this.L+this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,L(this,this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.J+U(this)),b.call(this));
Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.D+this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,L(this,this.D+this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[2].call(this,M(this,this.L+this.K+U(this)),
b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[2].call(this,M(this,this.L+this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,L(this,this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.D+U(this)),
b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.D+this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,L(this,this.D+this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[3].call(this,M(this,this.L+this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[3].call(this,M(this,this.L+this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,
L(this,this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.D+this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,
L(this,this.D+this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[4].call(this,M(this,this.L+this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[4].call(this,M(this,this.L+this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,L(this,this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=
a[4].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,L(this,this.D+this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[5].call(this,M(this,this.L+this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.Q},
function(a,b){var c=a[5].call(this,M(this,this.L+this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,L(this,this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},
function(a,b){var c=a[6].call(this,L(this,this.D+this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,L(this,this.D+this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[6].call(this,M(this,this.L+this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[6].call(this,M(this,this.L+this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,L(this,this.K+U(this)),b.call(this));Q(this,
c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.D+this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,L(this,this.D+this.J+U(this)),b.call(this));
Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[7].call(this,M(this,this.L+this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[7].call(this,M(this,this.L+this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,L(this,this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.L+U(this)),b.call(this));
Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[0].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[0].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[0].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[0].call(this,this.F>>8&
255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[0].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[0].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[0].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[1].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[1].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[1].call(this,
this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[1].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[1].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[1].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[1].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[1].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=
a[2].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[2].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[2].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[2].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[2].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[2].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=
a[2].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[2].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[3].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[3].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[3].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[3].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=
a[3].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[3].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[3].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[3].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[4].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[4].call(this,this.G&255,b.call(this));this.G=this.G&-256|
c},function(a,b){var c=a[4].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[4].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[4].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[4].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[4].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[4].call(this,this.D>>8&255,b.call(this));this.D=
this.D&-65281|c<<8},function(a,b){var c=a[5].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[5].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[5].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[5].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[5].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[5].call(this,this.G>>8&255,b.call(this));
this.G=this.G&-65281|c<<8},function(a,b){var c=a[5].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[5].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[6].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[6].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[6].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[6].call(this,this.D&255,b.call(this));
this.D=this.D&-256|c},function(a,b){var c=a[6].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[6].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[6].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[6].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[7].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[7].call(this,this.G&
255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[7].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[7].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[7].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[7].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[7].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[7].call(this,
this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8}],A=[function(a){a=a.call(this,this.F&this.C,I(this,this.D+this.K));this.F=this.F&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.F&this.C,I(this,this.D+this.J));this.F=this.F&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.F&this.C,K(this,this.L+this.K));this.F=this.F&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.F&this.C,K(this,this.L+this.J));this.F=this.F&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,
this.F&this.C,I(this,this.K));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,I(this,this.J));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,I(this,U(this)));this.F=this.F&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.F&this.C,I(this,this.D));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,I(this,this.D+this.K));this.G=this.G&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.G&
this.C,I(this,this.D+this.J));this.G=this.G&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.G&this.C,K(this,this.L+this.K));this.G=this.G&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.G&this.C,K(this,this.L+this.J));this.G=this.G&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.G&this.C,I(this,this.K));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,I(this,this.J));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,
this.G&this.C,I(this,U(this)));this.G=this.G&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.G&this.C,I(this,this.D));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,I(this,this.D+this.K));this.H=this.H&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.H&this.C,I(this,this.D+this.J));this.H=this.H&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.H&this.C,K(this,this.L+this.K));this.H=this.H&~this.C|a;this.A-=this.B.ca},function(a){a=
a.call(this,this.H&this.C,K(this,this.L+this.J));this.H=this.H&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.H&this.C,I(this,this.K));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,I(this,this.J));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,I(this,U(this)));this.H=this.H&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.H&this.C,I(this,this.D));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,
this.D&this.C,I(this,this.D+this.K));this.D=this.D&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.D&this.C,I(this,this.D+this.J));this.D=this.D&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.D&this.C,K(this,this.L+this.K));this.D=this.D&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.D&this.C,K(this,this.L+this.J));this.D=this.D&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.D&this.C,I(this,this.K));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=
a.call(this,this.D&this.C,I(this,this.J));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,I(this,U(this)));this.D=this.D&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.D&this.C,I(this,this.D));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,r(this)&this.C,I(this,this.D+this.K));u(this,r(this)&~this.C|a);this.A-=this.B.ba},function(a){a=a.call(this,r(this)&this.C,I(this,this.D+this.J));u(this,r(this)&~this.C|a);this.A-=this.B.ca},function(a){a=
a.call(this,r(this)&this.C,K(this,this.L+this.K));u(this,r(this)&~this.C|a);this.A-=this.B.ca},function(a){a=a.call(this,r(this)&this.C,K(this,this.L+this.J));u(this,r(this)&~this.C|a);this.A-=this.B.ba},function(a){a=a.call(this,r(this)&this.C,I(this,this.K));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,r(this)&this.C,I(this,this.J));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,r(this)&this.C,I(this,U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.da},
function(a){a=a.call(this,r(this)&this.C,I(this,this.D));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,I(this,this.D+this.K));this.L=this.L&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.L&this.C,I(this,this.D+this.J));this.L=this.L&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.L&this.C,K(this,this.L+this.K));this.L=this.L&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.L&this.C,K(this,this.L+this.J));this.L=this.L&~this.C|
a;this.A-=this.B.ba},function(a){a=a.call(this,this.L&this.C,I(this,this.K));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,I(this,this.J));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,I(this,U(this)));this.L=this.L&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.L&this.C,I(this,this.D));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,I(this,this.D+this.K));this.K=this.K&~this.C|a;
this.A-=this.B.ba},function(a){a=a.call(this,this.K&this.C,I(this,this.D+this.J));this.K=this.K&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.K&this.C,K(this,this.L+this.K));this.K=this.K&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.K&this.C,K(this,this.L+this.J));this.K=this.K&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.K&this.C,I(this,this.K));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,I(this,this.J));this.K=this.K&
~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,I(this,U(this)));this.K=this.K&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.K&this.C,I(this,this.D));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,I(this,this.D+this.K));this.J=this.J&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.J&this.C,I(this,this.D+this.J));this.J=this.J&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.J&this.C,K(this,this.L+this.K));
this.J=this.J&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.J&this.C,K(this,this.L+this.J));this.J=this.J&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.J&this.C,I(this,this.K));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,I(this,this.J));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,I(this,U(this)));this.J=this.J&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.J&this.C,I(this,this.D));
this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,I(this,this.D+this.K+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&this.C,I(this,this.D+this.J+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.F&this.C,K(this,this.L+this.K+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.F&this.C,K(this,this.L+this.J+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.P},function(a){a=
a.call(this,this.F&this.C,I(this,this.K+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.J+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,K(this,this.L+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.D+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.D+this.K+this.M()));this.G=this.G&~this.C|
a;this.A-=this.B.P},function(a){a=a.call(this,this.G&this.C,I(this,this.D+this.J+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.G&this.C,K(this,this.L+this.K+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.G&this.C,K(this,this.L+this.J+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&this.C,I(this,this.K+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&
this.C,I(this,this.J+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,K(this,this.L+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.D+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.D+this.K+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&this.C,I(this,this.D+this.J+this.M()));this.H=this.H&~this.C|a;this.A-=
this.B.Q},function(a){a=a.call(this,this.H&this.C,K(this,this.L+this.K+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.H&this.C,K(this,this.L+this.J+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&this.C,I(this,this.K+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.J+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,K(this,this.L+
this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.D+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.D+this.K+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&this.C,I(this,this.D+this.J+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.D&this.C,K(this,this.L+this.K+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.Q},
function(a){a=a.call(this,this.D&this.C,K(this,this.L+this.J+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&this.C,I(this,this.K+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.J+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,K(this,this.L+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.D+this.M()));this.D=
this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.D+this.K+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.P},function(a){a=a.call(this,r(this)&this.C,I(this,this.D+this.J+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.Q},function(a){a=a.call(this,r(this)&this.C,K(this,this.L+this.K+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.Q},function(a){a=a.call(this,r(this)&this.C,K(this,this.L+this.J+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.P},
function(a){a=a.call(this,r(this)&this.C,I(this,this.K+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.J+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,K(this,this.L+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.D+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.D+this.K+
this.M()));this.L=this.L&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.L&this.C,I(this,this.D+this.J+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.L&this.C,K(this,this.L+this.K+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.L&this.C,K(this,this.L+this.J+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.L&this.C,I(this,this.K+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},
function(a){a=a.call(this,this.L&this.C,I(this,this.J+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,K(this,this.L+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.D+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.D+this.K+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.K&this.C,I(this,this.D+this.J+this.M()));
this.K=this.K&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.K&this.C,K(this,this.L+this.K+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.K&this.C,K(this,this.L+this.J+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.K&this.C,I(this,this.K+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.J+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
this.K&this.C,K(this,this.L+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.D+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.D+this.K+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.J&this.C,I(this,this.D+this.J+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.J&this.C,K(this,this.L+this.K+this.M()));this.J=this.J&
~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.J&this.C,K(this,this.L+this.J+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.J&this.C,I(this,this.K+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.J+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,K(this,this.L+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,
I(this,this.D+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.D+this.K+U(this)));this.F=this.F&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&this.C,I(this,this.D+this.J+U(this)));this.F=this.F&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.F&this.C,K(this,this.L+this.K+U(this)));this.F=this.F&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.F&this.C,K(this,this.L+this.J+U(this)));this.F=this.F&~this.C|a;
this.A-=this.B.P},function(a){a=a.call(this,this.F&this.C,I(this,this.K+U(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.J+U(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,K(this,this.L+U(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.D+U(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.D+this.K+
U(this)));this.G=this.G&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&this.C,I(this,this.D+this.J+U(this)));this.G=this.G&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.G&this.C,K(this,this.L+this.K+U(this)));this.G=this.G&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.G&this.C,K(this,this.L+this.J+U(this)));this.G=this.G&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&this.C,I(this,this.K+U(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=
a.call(this,this.G&this.C,I(this,this.J+U(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,K(this,this.L+U(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.D+U(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.D+this.K+U(this)));this.H=this.H&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&this.C,I(this,this.D+this.J+U(this)));this.H=this.H&
~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.H&this.C,K(this,this.L+this.K+U(this)));this.H=this.H&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.H&this.C,K(this,this.L+this.J+U(this)));this.H=this.H&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&this.C,I(this,this.K+U(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.J+U(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,
K(this,this.L+U(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.D+U(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.D+this.K+U(this)));this.D=this.D&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&this.C,I(this,this.D+this.J+U(this)));this.D=this.D&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.D&this.C,K(this,this.L+this.K+U(this)));this.D=this.D&~this.C|a;this.A-=
this.B.Q},function(a){a=a.call(this,this.D&this.C,K(this,this.L+this.J+U(this)));this.D=this.D&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&this.C,I(this,this.K+U(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.J+U(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,K(this,this.L+U(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.D+U(this)));
this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.D+this.K+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.P},function(a){a=a.call(this,r(this)&this.C,I(this,this.D+this.J+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.Q},function(a){a=a.call(this,r(this)&this.C,K(this,this.L+this.K+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.Q},function(a){a=a.call(this,r(this)&this.C,K(this,this.L+this.J+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.P},
function(a){a=a.call(this,r(this)&this.C,I(this,this.K+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.J+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,K(this,this.L+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.D+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.D+this.K+U(this)));
this.L=this.L&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.L&this.C,I(this,this.D+this.J+U(this)));this.L=this.L&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.L&this.C,K(this,this.L+this.K+U(this)));this.L=this.L&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.L&this.C,K(this,this.L+this.J+U(this)));this.L=this.L&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.L&this.C,I(this,this.K+U(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=
a.call(this,this.L&this.C,I(this,this.J+U(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,K(this,this.L+U(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.D+U(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.D+this.K+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.K&this.C,I(this,this.D+this.J+U(this)));this.K=this.K&
~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.K&this.C,K(this,this.L+this.K+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.K&this.C,K(this,this.L+this.J+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.K&this.C,I(this,this.K+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.J+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,
K(this,this.L+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.D+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.D+this.K+U(this)));this.J=this.J&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.J&this.C,I(this,this.D+this.J+U(this)));this.J=this.J&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.J&this.C,K(this,this.L+this.K+U(this)));this.J=this.J&~this.C|a;this.A-=
this.B.Q},function(a){a=a.call(this,this.J&this.C,K(this,this.L+this.J+U(this)));this.J=this.J&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.J&this.C,I(this,this.K+U(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.J+U(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,K(this,this.L+U(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.D+U(this)));
this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,this.F&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.G&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.H&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.D&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,r(this)&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.L&this.C);this.F=
this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.K&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.J&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.F&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.G&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.H&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.D&this.C);this.G=this.G&~this.C|a},function(a){a=
a.call(this,this.G&this.C,r(this)&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.L&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.K&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.J&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.F&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.G&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,
this.H&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.D&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,r(this)&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.L&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.K&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.J&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.F&this.C);this.D=
this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.G&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.H&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.D&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,r(this)&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.L&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.K&this.C);this.D=this.D&~this.C|a},function(a){a=
a.call(this,this.D&this.C,this.J&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,r(this)&this.C,this.F&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.G&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.H&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.D&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,r(this)&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,
r(this)&this.C,this.L&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.K&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.J&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,this.L&this.C,this.F&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.G&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.H&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,
this.D&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,r(this)&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.L&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.K&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.J&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.F&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.G&this.C);this.K=
this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.H&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.D&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,r(this)&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.L&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.K&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.J&this.C);this.K=this.K&~this.C|a},function(a){a=
a.call(this,this.J&this.C,this.F&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.G&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.H&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.D&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,r(this)&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.L&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,
this.K&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.J&this.C);this.J=this.J&~this.C|a}],se=[function(a){a=a.call(this,N(this,this.D+this.K),this.F&this.C);R(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.D+this.J),this.F&this.C);R(this,a);this.A-=this.B.ca},function(a){a=a.call(this,P(this,this.L+this.K),this.F&this.C);R(this,a);this.A-=this.B.ca},function(a){a=a.call(this,P(this,this.L+this.J),this.F&this.C);R(this,a);this.A-=this.B.ba},function(a){a=
a.call(this,N(this,this.K),this.F&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.F&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),this.F&this.C);R(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.D),this.F&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D+this.K),this.G&this.C);R(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.D+this.J),this.G&this.C);R(this,a);this.A-=this.B.ca},
function(a){a=a.call(this,P(this,this.L+this.K),this.G&this.C);R(this,a);this.A-=this.B.ca},function(a){a=a.call(this,P(this,this.L+this.J),this.G&this.C);R(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.K),this.G&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.G&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),this.G&this.C);R(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.D),this.G&this.C);R(this,
a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D+this.K),this.H&this.C);R(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.D+this.J),this.H&this.C);R(this,a);this.A-=this.B.ca},function(a){a=a.call(this,P(this,this.L+this.K),this.H&this.C);R(this,a);this.A-=this.B.ca},function(a){a=a.call(this,P(this,this.L+this.J),this.H&this.C);R(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.K),this.H&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,
this.J),this.H&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),this.H&this.C);R(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.D),this.H&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D+this.K),this.D&this.C);R(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.D+this.J),this.D&this.C);R(this,a);this.A-=this.B.ca},function(a){a=a.call(this,P(this,this.L+this.K),this.D&this.C);R(this,a);this.A-=this.B.ca},function(a){a=
a.call(this,P(this,this.L+this.J),this.D&this.C);R(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.K),this.D&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.D&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),this.D&this.C);R(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.D),this.D&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D+this.K),r(this)&this.C);R(this,a);this.A-=this.B.ba},
function(a){a=a.call(this,N(this,this.D+this.J),r(this)&this.C);R(this,a);this.A-=this.B.ca},function(a){a=a.call(this,P(this,this.L+this.K),r(this)&this.C);R(this,a);this.A-=this.B.ca},function(a){a=a.call(this,P(this,this.L+this.J),r(this)&this.C);R(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.K),r(this)&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),r(this)&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),r(this)&this.C);
R(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.D),r(this)&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D+this.K),this.L&this.C);R(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.D+this.J),this.L&this.C);R(this,a);this.A-=this.B.ca},function(a){a=a.call(this,P(this,this.L+this.K),this.L&this.C);R(this,a);this.A-=this.B.ca},function(a){a=a.call(this,P(this,this.L+this.J),this.L&this.C);R(this,a);this.A-=this.B.ba},function(a){a=a.call(this,
N(this,this.K),this.L&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.L&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),this.L&this.C);R(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.D),this.L&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D+this.K),this.K&this.C);R(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.D+this.J),this.K&this.C);R(this,a);this.A-=this.B.ca},function(a){a=
a.call(this,P(this,this.L+this.K),this.K&this.C);R(this,a);this.A-=this.B.ca},function(a){a=a.call(this,P(this,this.L+this.J),this.K&this.C);R(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.K),this.K&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.K&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),this.K&this.C);R(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.D),this.K&this.C);R(this,a);this.A-=this.B.N},
function(a){a=a.call(this,N(this,this.D+this.K),this.J&this.C);R(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.D+this.J),this.J&this.C);R(this,a);this.A-=this.B.ca},function(a){a=a.call(this,P(this,this.L+this.K),this.J&this.C);R(this,a);this.A-=this.B.ca},function(a){a=a.call(this,P(this,this.L+this.J),this.J&this.C);R(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.K),this.J&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.J&this.C);
R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),this.J&this.C);R(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.D),this.J&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D+this.K+this.M()),this.F&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+this.M()),this.F&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+this.M()),this.F&this.C);R(this,a);this.A-=this.B.Q},function(a){a=
a.call(this,P(this,this.L+this.J+this.M()),this.F&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+this.M()),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+
this.M()),this.G&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+this.M()),this.G&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+this.M()),this.G&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+this.M()),this.G&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+this.M()),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.G&
this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+this.M()),this.H&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+this.M()),this.H&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+this.M()),this.H&this.C);R(this,
a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+this.M()),this.H&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+this.M()),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=
a.call(this,N(this,this.D+this.K+this.M()),this.D&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+this.M()),this.D&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+this.M()),this.D&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+this.M()),this.D&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+this.M()),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,
N(this,this.J+this.M()),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+this.M()),r(this)&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+this.M()),r(this)&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+
this.M()),r(this)&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+this.M()),r(this)&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+this.M()),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),r(this)&this.C);
R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+this.M()),this.L&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+this.M()),this.L&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+this.M()),this.L&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+this.M()),this.L&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+this.M()),this.L&this.C);R(this,a);
this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+this.M()),this.K&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+this.M()),this.K&this.C);R(this,a);this.A-=this.B.Q},function(a){a=
a.call(this,P(this,this.L+this.K+this.M()),this.K&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+this.M()),this.K&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+this.M()),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+
this.M()),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+this.M()),this.J&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+this.M()),this.J&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+this.M()),this.J&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+this.M()),this.J&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+this.M()),
this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+U(this)),this.F&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+U(this)),this.F&this.C);R(this,a);
this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+U(this)),this.F&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+U(this)),this.F&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+U(this)),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=
a.call(this,N(this,this.D+U(this)),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+U(this)),this.G&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+U(this)),this.G&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+U(this)),this.G&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+U(this)),this.G&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,
this.K+U(this)),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+U(this)),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+U(this)),this.H&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+U(this)),this.H&this.C);
R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+U(this)),this.H&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+U(this)),this.H&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+U(this)),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),this.H&this.C);R(this,a);this.A-=this.B.I},
function(a){a=a.call(this,N(this,this.D+U(this)),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+U(this)),this.D&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+U(this)),this.D&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+U(this)),this.D&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+U(this)),this.D&this.C);R(this,a);this.A-=this.B.P},function(a){a=
a.call(this,N(this,this.K+U(this)),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+U(this)),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+U(this)),r(this)&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+
U(this)),r(this)&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+U(this)),r(this)&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+U(this)),r(this)&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+U(this)),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),r(this)&this.C);
R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+U(this)),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+U(this)),this.L&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+U(this)),this.L&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+U(this)),this.L&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+U(this)),this.L&this.C);R(this,a);this.A-=
this.B.P},function(a){a=a.call(this,N(this,this.K+U(this)),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+U(this)),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+U(this)),this.K&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,
N(this,this.D+this.J+U(this)),this.K&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+U(this)),this.K&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+U(this)),this.K&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+U(this)),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),
this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+U(this)),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+U(this)),this.J&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+U(this)),this.J&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+U(this)),this.J&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+U(this)),this.J&this.C);
R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+U(this)),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+U(this)),this.J&this.C);R(this,a);this.A-=this.B.I},A[192],A[200],A[208],A[216],A[224],A[232],A[240],A[248],A[193],A[201],A[209],A[217],A[225],A[233],A[241],
A[249],A[194],A[202],A[210],A[218],A[226],A[234],A[242],A[250],A[195],A[203],A[211],A[219],A[227],A[235],A[243],A[251],A[196],A[204],A[212],A[220],A[228],A[236],A[244],A[252],A[197],A[205],A[213],A[221],A[229],A[237],A[245],A[253],A[198],A[206],A[214],A[222],A[230],A[238],A[246],A[254],A[199],A[207],A[215],A[223],A[231],A[239],A[247],A[255]],te=[function(a,b){var c=a[0].call(this,N(this,this.D+this.K),b.call(this));R(this,c);this.A-=this.B.ba},function(a,b){var c=a[0].call(this,N(this,this.D+this.J),
b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[0].call(this,P(this,this.L+this.K),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[0].call(this,P(this,this.L+this.J),b.call(this));R(this,c);this.A-=this.B.ba},function(a,b){var c=a[0].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,N(this,this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,N(this,U(this)),b.call(this));R(this,c);
this.A-=this.B.da},function(a,b){var c=a[0].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,N(this,this.D+this.K),b.call(this));R(this,c);this.A-=this.B.ba},function(a,b){var c=a[1].call(this,N(this,this.D+this.J),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[1].call(this,P(this,this.L+this.K),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[1].call(this,P(this,this.L+this.J),b.call(this));R(this,c);this.A-=this.B.ba},
function(a,b){var c=a[1].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,N(this,this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,N(this,U(this)),b.call(this));R(this,c);this.A-=this.B.da},function(a,b){var c=a[1].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,N(this,this.D+this.K),b.call(this));R(this,c);this.A-=this.B.ba},function(a,b){var c=a[2].call(this,
N(this,this.D+this.J),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[2].call(this,P(this,this.L+this.K),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[2].call(this,P(this,this.L+this.J),b.call(this));R(this,c);this.A-=this.B.ba},function(a,b){var c=a[2].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,N(this,this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,N(this,U(this)),b.call(this));
R(this,c);this.A-=this.B.da},function(a,b){var c=a[2].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,this.D+this.K),b.call(this));R(this,c);this.A-=this.B.ba},function(a,b){var c=a[3].call(this,N(this,this.D+this.J),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[3].call(this,P(this,this.L+this.K),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[3].call(this,P(this,this.L+this.J),b.call(this));R(this,c);
this.A-=this.B.ba},function(a,b){var c=a[3].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,U(this)),b.call(this));R(this,c);this.A-=this.B.da},function(a,b){var c=a[3].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,N(this,this.D+this.K),b.call(this));R(this,c);this.A-=this.B.ba},function(a,b){var c=
a[4].call(this,N(this,this.D+this.J),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[4].call(this,P(this,this.L+this.K),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[4].call(this,P(this,this.L+this.J),b.call(this));R(this,c);this.A-=this.B.ba},function(a,b){var c=a[4].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,N(this,this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,N(this,
U(this)),b.call(this));R(this,c);this.A-=this.B.da},function(a,b){var c=a[4].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,N(this,this.D+this.K),b.call(this));R(this,c);this.A-=this.B.ba},function(a,b){var c=a[5].call(this,N(this,this.D+this.J),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[5].call(this,P(this,this.L+this.K),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[5].call(this,P(this,this.L+this.J),
b.call(this));R(this,c);this.A-=this.B.ba},function(a,b){var c=a[5].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,N(this,this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,N(this,U(this)),b.call(this));R(this,c);this.A-=this.B.da},function(a,b){var c=a[5].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,N(this,this.D+this.K),b.call(this));R(this,c);this.A-=
this.B.ba},function(a,b){var c=a[6].call(this,N(this,this.D+this.J),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[6].call(this,P(this,this.L+this.K),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[6].call(this,P(this,this.L+this.J),b.call(this));R(this,c);this.A-=this.B.ba},function(a,b){var c=a[6].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,N(this,this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,
b){var c=a[6].call(this,N(this,U(this)),b.call(this));R(this,c);this.A-=this.B.da},function(a,b){var c=a[6].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,N(this,this.D+this.K),b.call(this));R(this,c);this.A-=this.B.ba},function(a,b){var c=a[7].call(this,N(this,this.D+this.J),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[7].call(this,P(this,this.L+this.K),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[7].call(this,
P(this,this.L+this.J),b.call(this));R(this,c);this.A-=this.B.ba},function(a,b){var c=a[7].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,N(this,this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,N(this,U(this)),b.call(this));R(this,c);this.A-=this.B.da},function(a,b){var c=a[7].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,N(this,this.D+this.K+this.M()),
b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,N(this,this.D+this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[0].call(this,P(this,this.L+this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[0].call(this,P(this,this.L+this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,
N(this,this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.D+this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,N(this,this.D+this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=
a[1].call(this,P(this,this.L+this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[1].call(this,P(this,this.L+this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,
b){var c=a[1].call(this,N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.D+this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,N(this,this.D+this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[2].call(this,P(this,this.L+this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[2].call(this,P(this,this.L+this.J+this.M()),b.call(this));R(this,
c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.D+this.K+this.M()),b.call(this));
R(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,N(this,this.D+this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[3].call(this,P(this,this.L+this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[3].call(this,P(this,this.L+this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.J+
this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.D+this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,N(this,this.D+this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[4].call(this,
P(this,this.L+this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[4].call(this,P(this,this.L+this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=
a[4].call(this,N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.D+this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,N(this,this.D+this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[5].call(this,P(this,this.L+this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[5].call(this,P(this,this.L+this.J+this.M()),b.call(this));R(this,c);this.A-=
this.B.P},function(a,b){var c=a[5].call(this,N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.D+this.K+this.M()),b.call(this));R(this,
c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,N(this,this.D+this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[6].call(this,P(this,this.L+this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[6].call(this,P(this,this.L+this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.J+this.M()),
b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.D+this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,N(this,this.D+this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[7].call(this,P(this,
this.L+this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[7].call(this,P(this,this.L+this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,
N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.D+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,N(this,this.D+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[0].call(this,P(this,this.L+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[0].call(this,P(this,this.L+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,
b){var c=a[0].call(this,N(this,this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,P(this,this.L+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.D+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.D+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,
b){var c=a[1].call(this,N(this,this.D+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[1].call(this,P(this,this.L+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[1].call(this,P(this,this.L+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,N(this,this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},
function(a,b){var c=a[1].call(this,P(this,this.L+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.D+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.D+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,N(this,this.D+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[2].call(this,P(this,this.L+this.K+U(this)),b.call(this));R(this,c);
this.A-=this.B.Q},function(a,b){var c=a[2].call(this,P(this,this.L+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,N(this,this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,P(this,this.L+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.D+U(this)),b.call(this));R(this,
c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.D+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,N(this,this.D+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[3].call(this,P(this,this.L+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[3].call(this,P(this,this.L+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,N(this,this.K+U(this)),
b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,P(this,this.L+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.D+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.D+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,N(this,this.D+this.J+
U(this)),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[4].call(this,P(this,this.L+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[4].call(this,P(this,this.L+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,N(this,this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,P(this,
this.L+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.D+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.D+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,N(this,this.D+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[5].call(this,P(this,this.L+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[5].call(this,
P(this,this.L+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,N(this,this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,P(this,this.L+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.D+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,
N(this,this.D+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,N(this,this.D+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[6].call(this,P(this,this.L+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[6].call(this,P(this,this.L+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,N(this,this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,
b){var c=a[6].call(this,N(this,this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,P(this,this.L+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.D+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.D+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,N(this,this.D+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.Q},
function(a,b){var c=a[7].call(this,P(this,this.L+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[7].call(this,P(this,this.L+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,N(this,this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,P(this,this.L+U(this)),b.call(this));R(this,c);this.A-=
this.B.I},function(a,b){var c=a[7].call(this,N(this,this.D+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[0].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[0].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[0].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[0].call(this,r(this)&
this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[0].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[0].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[0].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[1].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[1].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=
a[1].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[1].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[1].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[1].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[1].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[1].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|
c},function(a,b){var c=a[2].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[2].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[2].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[2].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[2].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[2].call(this,this.L&this.C,b.call(this));
this.L=this.L&~this.C|c},function(a,b){var c=a[2].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[2].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[3].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[3].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[3].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[3].call(this,this.D&
this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[3].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[3].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[3].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[3].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[4].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=
a[4].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[4].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[4].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[4].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[4].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[4].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|
c},function(a,b){var c=a[4].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[5].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[5].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[5].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[5].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[5].call(this,r(this)&this.C,b.call(this));
u(this,r(this)&~this.C|c)},function(a,b){var c=a[5].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[5].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[5].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[6].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[6].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[6].call(this,
this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[6].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[6].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[6].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[6].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[6].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,
b){var c=a[7].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[7].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[7].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[7].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[7].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[7].call(this,this.L&this.C,b.call(this));this.L=
this.L&~this.C|c},function(a,b){var c=a[7].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[7].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c}],B=[function(a){a=a.call(this,this.F&255,F(this,this.F));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,F(this,this.G));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,F(this,this.H));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&
255,F(this,this.D));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,F(this,V(this,0)));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,F(this,U(this)));this.F=this.F&-256|a;this.A-=this.B.da},function(a){a=a.call(this,this.F&255,F(this,this.K));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,F(this,this.J));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,F(this,this.F));this.G=this.G&-256|
a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,F(this,this.G));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,F(this,this.H));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,F(this,this.D));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,F(this,V(this,0)));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,F(this,U(this)));this.G=this.G&-256|a;this.A-=this.B.da},function(a){a=a.call(this,
this.G&255,F(this,this.K));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,F(this,this.J));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,F(this,this.F));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,F(this,this.G));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,F(this,this.H));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,F(this,this.D));this.H=this.H&
-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,F(this,V(this,0)));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,F(this,U(this)));this.H=this.H&-256|a;this.A-=this.B.da},function(a){a=a.call(this,this.H&255,F(this,this.K));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,F(this,this.J));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,F(this,this.F));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=
a.call(this,this.D&255,F(this,this.G));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,F(this,this.H));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,F(this,this.D));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,F(this,V(this,0)));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,F(this,U(this)));this.D=this.D&-256|a;this.A-=this.B.da},function(a){a=a.call(this,this.D&255,F(this,this.K));
this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,F(this,this.J));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,F(this,this.F));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,F(this,this.G));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,F(this,this.H));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,F(this,this.D));this.F=this.F&
-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,F(this,V(this,0)));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,F(this,U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.da},function(a){a=a.call(this,this.F>>8&255,F(this,this.K));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,F(this,this.J));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,F(this,this.F));this.G=this.G&
-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,F(this,this.G));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,F(this,this.H));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,F(this,this.D));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,F(this,V(this,0)));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,F(this,U(this)));this.G=this.G&
-65281|a<<8;this.A-=this.B.da},function(a){a=a.call(this,this.G>>8&255,F(this,this.K));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,F(this,this.J));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,F(this,this.F));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,F(this,this.G));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,F(this,this.H));this.H=this.H&
-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,F(this,this.D));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,F(this,V(this,0)));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,F(this,U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.da},function(a){a=a.call(this,this.H>>8&255,F(this,this.K));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,F(this,this.J));this.H=this.H&
-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,F(this,this.F));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,F(this,this.G));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,F(this,this.H));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,F(this,this.D));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,F(this,V(this,0)));this.D=this.D&
-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,F(this,U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.da},function(a){a=a.call(this,this.D>>8&255,F(this,this.K));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,F(this,this.J));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,F(this,this.F+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.G+this.M()));this.F=
this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.H+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.D+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,V(this,1)+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,H(this,this.L+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.K+this.M()));
this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.J+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.F+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.G+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.H+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.D+this.M()));
this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,V(this,1)+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,H(this,this.L+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.K+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.J+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.F+this.M()));
this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.G+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.H+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.D+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,V(this,1)+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,H(this,this.L+this.M()));
this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.K+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.J+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.F+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.G+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.H+this.M()));
this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.D+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,V(this,1)+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,H(this,this.L+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.K+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.J+this.M()));
this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.F+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.G+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.H+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.D+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,
this.F>>8&255,F(this,V(this,1)+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,H(this,this.L+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.K+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.J+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.F+this.M()));this.G=this.G&-65281|a<<
8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.G+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.H+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.D+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,V(this,1)+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,H(this,
this.L+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.K+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.J+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.F+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.G+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=
a.call(this,this.H>>8&255,F(this,this.H+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.D+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,V(this,1)+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,H(this,this.L+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.K+this.M()));this.H=this.H&
-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.J+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.F+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.G+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.H+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&
255,F(this,this.D+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,V(this,1)+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,H(this,this.L+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.K+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.J+this.M()));this.D=this.D&-65281|a<<8;this.A-=
this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.F+U(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.G+U(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.H+U(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.D+U(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,V(this,2)+U(this)));this.F=this.F&-256|a;this.A-=
this.B.I},function(a){a=a.call(this,this.F&255,H(this,this.L+U(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.K+U(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.J+U(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.F+U(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.G+U(this)));this.G=this.G&-256|a;this.A-=this.B.I},
function(a){a=a.call(this,this.G&255,F(this,this.H+U(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.D+U(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,V(this,2)+U(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,H(this,this.L+U(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.K+U(this)));this.G=this.G&-256|a;this.A-=this.B.I},
function(a){a=a.call(this,this.G&255,F(this,this.J+U(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.F+U(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.G+U(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.H+U(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.D+U(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=
a.call(this,this.H&255,F(this,V(this,2)+U(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,H(this,this.L+U(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.K+U(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.J+U(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.F+U(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=
a.call(this,this.D&255,F(this,this.G+U(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.H+U(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.D+U(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,V(this,2)+U(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,H(this,this.L+U(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=
a.call(this,this.D&255,F(this,this.K+U(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.J+U(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.F+U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.G+U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.H+U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},
function(a){a=a.call(this,this.F>>8&255,F(this,this.D+U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,V(this,2)+U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,H(this,this.L+U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.K+U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.J+U(this)));this.F=
this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.F+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.G+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.H+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.D+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>
8&255,F(this,V(this,2)+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,H(this,this.L+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.K+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.J+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.F+U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},
function(a){a=a.call(this,this.H>>8&255,F(this,this.G+U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.H+U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.D+U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,V(this,2)+U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,H(this,this.L+U(this)));this.H=
this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.K+U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.J+U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.F+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.G+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>
8&255,F(this,this.H+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.D+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,V(this,2)+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,H(this,this.L+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.K+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},
function(a){a=a.call(this,this.D>>8&255,F(this,this.J+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,this.F&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.G&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.H&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.D&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.F>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,
this.G>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.H>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.D>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.G&255,this.F&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.G&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.H&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.D&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&
255,this.F>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.G>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.H>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.D>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.H&255,this.F&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.G&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.H&255);this.H=this.H&-256|a},function(a){a=a.call(this,
this.H&255,this.D&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.F>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.G>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.H>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.D>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.D&255,this.F&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.G&255);this.D=this.D&-256|a},function(a){a=a.call(this,
this.D&255,this.H&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.D&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.F>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.G>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.H>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.D>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.F>>8&255,this.F&255);this.F=this.F&-65281|a<<8},function(a){a=
a.call(this,this.F>>8&255,this.G&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.H&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.D&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.F>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.G>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.H>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>
8&255,this.D>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.F&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.G&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.H&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.D&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.F>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.G>>8&255);
this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.H>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.D>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.F&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.G&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.H&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.D&255);this.H=this.H&-65281|
a<<8},function(a){a=a.call(this,this.H>>8&255,this.F>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.G>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.H>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.D>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.F&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.G&255);this.D=this.D&-65281|a<<8},function(a){a=
a.call(this,this.D>>8&255,this.H&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.D&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.F>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.G>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.H>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.D>>8&255);this.D=this.D&-65281|a<<8}],ue=[function(a){a=a.call(this,
L(this,this.F),this.F&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.F&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.F&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.F&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,V(this,0)),this.F&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this)),this.F&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.K),
this.F&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.F&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.G&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.G&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.G&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.G&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,V(this,0)),this.G&255);
Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this)),this.G&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.K),this.G&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.G&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.H&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.H&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.H&255);Q(this,a);this.A-=
this.B.N},function(a){a=a.call(this,L(this,this.D),this.H&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,V(this,0)),this.H&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this)),this.H&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.K),this.H&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.H&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.D&255);Q(this,a);this.A-=this.B.N},
function(a){a=a.call(this,L(this,this.G),this.D&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.D&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.D&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,V(this,0)),this.D&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this)),this.D&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.K),this.D&255);Q(this,a);this.A-=this.B.N},function(a){a=
a.call(this,L(this,this.J),this.D&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.F>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.F>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.F>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.F>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,V(this,0)),this.F>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=
a.call(this,L(this,U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.K),this.F>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.F>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.G>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.G>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.G>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=
a.call(this,L(this,this.D),this.G>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,V(this,0)),this.G>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.K),this.G>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.G>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.H>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=
a.call(this,L(this,this.G),this.H>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.H>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.H>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,V(this,0)),this.H>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.K),this.H>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=
a.call(this,L(this,this.J),this.H>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.D>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.D>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.D>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.D>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,V(this,0)),this.D>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=
a.call(this,L(this,U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.K),this.D>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.D>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F+this.M()),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.F&255);Q(this,a);this.A-=this.B.I},
function(a){a=a.call(this,L(this,this.D+this.M()),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,1)+this.M()),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),
this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,1)+this.M()),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=
a.call(this,L(this,this.K+this.M()),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.H&255);Q(this,
a);this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,1)+this.M()),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,
this.G+this.M()),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,1)+this.M()),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.D&255);Q(this,a);this.A-=this.B.I},
function(a){a=a.call(this,L(this,this.J+this.M()),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,
1)+this.M()),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.G>>8&255);Q(this,a);
this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,1)+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,
L(this,this.J+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,1)+this.M()),this.H>>8&
255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=
a.call(this,L(this,this.H+this.M()),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,1)+this.M()),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),
this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+U(this)),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+U(this)),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+U(this)),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,2)+U(this)),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=
a.call(this,M(this,this.L+U(this)),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+U(this)),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+U(this)),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+U(this)),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+U(this)),this.G&255);Q(this,a);
this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,2)+U(this)),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+U(this)),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+U(this)),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+
U(this)),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+U(this)),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+U(this)),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,2)+U(this)),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+U(this)),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=
a.call(this,L(this,this.K+U(this)),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+U(this)),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+U(this)),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+U(this)),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.D&255);Q(this,a);
this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,2)+U(this)),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+U(this)),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+U(this)),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,
this.G+U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,2)+U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+U(this)),this.F>>8&255);Q(this,
a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,
L(this,V(this,2)+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+U(this)),this.H>>8&255);
Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,2)+U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=
a.call(this,L(this,this.J+U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,2)+U(this)),this.D>>
8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.I},B[192],B[200],B[208],B[216],B[224],B[232],B[240],B[248],B[193],B[201],B[209],B[217],B[225],B[233],B[241],B[249],B[194],B[202],B[210],B[218],B[226],B[234],B[242],B[250],B[195],B[203],B[211],B[219],
B[227],B[235],B[243],B[251],B[196],B[204],B[212],B[220],B[228],B[236],B[244],B[252],B[197],B[205],B[213],B[221],B[229],B[237],B[245],B[253],B[198],B[206],B[214],B[222],B[230],B[238],B[246],B[254],B[199],B[207],B[215],B[223],B[231],B[239],B[247],B[255]],ve=[function(a,b){var c=a[0].call(this,L(this,this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.H),b.call(this));
Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,V(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,U(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[0].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,
b){var c=a[1].call(this,L(this,this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,V(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,U(this)),
b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[1].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},
function(a,b){var c=a[2].call(this,L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,V(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,U(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[2].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,
this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,V(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,U(this)),b.call(this));Q(this,c);this.A-=
this.B.da},function(a,b){var c=a[3].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,
L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,V(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,U(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[4].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.F),b.call(this));Q(this,
c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,V(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,U(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=
a[5].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.D),b.call(this));
Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,V(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,U(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[6].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,
b){var c=a[7].call(this,L(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,V(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,U(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[7].call(this,L(this,this.K),
b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.F+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.H+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.D+this.M()),b.call(this));
Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,V(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,M(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.F+this.M()),b.call(this));
Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.H+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,V(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,this.L+this.M()),b.call(this));
Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.F+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.H+this.M()),b.call(this));
Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,V(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.J+this.M()),b.call(this));
Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.F+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.H+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,V(this,1)+this.M()),b.call(this));
Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.F+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.G+this.M()),b.call(this));
Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.H+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,V(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,M(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.K+this.M()),b.call(this));
Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.F+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.H+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+this.M()),b.call(this));
Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,V(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,M(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.F+this.M()),b.call(this));
Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.H+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,V(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,this.L+this.M()),b.call(this));
Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.F+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.H+this.M()),b.call(this));
Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,V(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.J+this.M()),b.call(this));
Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.F+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.G+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.H+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,V(this,2)+U(this)),b.call(this));
Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.F+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.G+U(this)),b.call(this));Q(this,
c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.H+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,V(this,2)+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.K+U(this)),b.call(this));Q(this,
c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.F+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.G+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.H+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);
this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,V(this,2)+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.F+U(this)),b.call(this));Q(this,c);
this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.G+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.H+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,V(this,2)+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);
this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.F+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.G+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.H+U(this)),b.call(this));Q(this,c);this.A-=
this.B.I},function(a,b){var c=a[4].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,V(this,2)+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=
this.B.I},function(a,b){var c=a[5].call(this,L(this,this.F+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.G+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.H+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,V(this,2)+U(this)),b.call(this));Q(this,c);this.A-=
this.B.I},function(a,b){var c=a[5].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.F+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.G+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},
function(a,b){var c=a[6].call(this,L(this,this.H+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,V(this,2)+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},
function(a,b){var c=a[6].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.F+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.G+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.H+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,
b){var c=a[7].call(this,L(this,V(this,2)+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[0].call(this,
this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[0].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[0].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[0].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[0].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[0].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=
a[0].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[1].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[1].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[1].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[1].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[1].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=
a[1].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[1].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[1].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[2].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[2].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[2].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,
b){var c=a[2].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[2].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[2].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[2].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[2].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[3].call(this,this.F&255,b.call(this));this.F=this.F&
-256|c},function(a,b){var c=a[3].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[3].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[3].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[3].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[3].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[3].call(this,this.H>>8&255,b.call(this));this.H=
this.H&-65281|c<<8},function(a,b){var c=a[3].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[4].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[4].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[4].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[4].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[4].call(this,this.F>>8&255,b.call(this));
this.F=this.F&-65281|c<<8},function(a,b){var c=a[4].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[4].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[4].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[5].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[5].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[5].call(this,this.H&
255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[5].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[5].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[5].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[5].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[5].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=
a[6].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[6].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[6].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[6].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[6].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[6].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=
a[6].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[6].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[7].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[7].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[7].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[7].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=
a[7].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[7].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[7].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[7].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8}],C=[function(a){a=a.call(this,this.F&this.C,I(this,this.F));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,I(this,this.G));this.F=
this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,I(this,this.H));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,I(this,this.D));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,I(this,V(this,0)));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,I(this,U(this)));this.F=this.F&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.F&this.C,I(this,this.K));this.F=this.F&
~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,I(this,this.J));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,I(this,this.F));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,I(this,this.G));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,I(this,this.H));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,I(this,this.D));this.G=this.G&~this.C|a;this.A-=
this.B.N},function(a){a=a.call(this,this.G&this.C,I(this,V(this,0)));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,I(this,U(this)));this.G=this.G&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.G&this.C,I(this,this.K));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,I(this,this.J));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,I(this,this.F));this.H=this.H&~this.C|a;this.A-=this.B.N},
function(a){a=a.call(this,this.H&this.C,I(this,this.G));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,I(this,this.H));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,I(this,this.D));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,I(this,V(this,0)));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,I(this,U(this)));this.H=this.H&~this.C|a;this.A-=this.B.da},function(a){a=
a.call(this,this.H&this.C,I(this,this.K));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,I(this,this.J));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,I(this,this.F));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,I(this,this.G));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,I(this,this.H));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,
this.D&this.C,I(this,this.D));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,I(this,V(this,0)));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,I(this,U(this)));this.D=this.D&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.D&this.C,I(this,this.K));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,I(this,this.J));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,r(this)&
this.C,I(this,this.F));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,r(this)&this.C,I(this,this.G));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,r(this)&this.C,I(this,this.H));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,r(this)&this.C,I(this,this.D));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,r(this)&this.C,I(this,V(this,0)));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,r(this)&
this.C,I(this,U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.da},function(a){a=a.call(this,r(this)&this.C,I(this,this.K));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,r(this)&this.C,I(this,this.J));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,I(this,this.F));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,I(this,this.G));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,
I(this,this.H));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,I(this,this.D));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,I(this,V(this,0)));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,I(this,U(this)));this.L=this.L&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.L&this.C,I(this,this.K));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,I(this,
this.J));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,I(this,this.F));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,I(this,this.G));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,I(this,this.H));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,I(this,this.D));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,I(this,V(this,0)));
this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,I(this,U(this)));this.K=this.K&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.K&this.C,I(this,this.K));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,I(this,this.J));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,I(this,this.F));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,I(this,this.G));this.J=this.J&
~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,I(this,this.H));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,I(this,this.D));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,I(this,V(this,0)));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,I(this,U(this)));this.J=this.J&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.J&this.C,I(this,this.K));this.J=this.J&~this.C|
a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,I(this,this.J));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,I(this,this.F+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.G+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.H+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.D+this.M()));
this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,V(this,1)+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,K(this,this.L+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.K+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.J+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&
this.C,I(this,this.F+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.G+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.H+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.D+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,V(this,1)+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},
function(a){a=a.call(this,this.G&this.C,K(this,this.L+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.K+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.J+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.F+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.G+this.M()));this.H=this.H&
~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.H+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.D+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,V(this,1)+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,K(this,this.L+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,
this.K+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.J+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.F+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.G+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.H+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=
a.call(this,this.D&this.C,I(this,this.D+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,V(this,1)+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,K(this,this.L+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.K+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.J+this.M()));this.D=this.D&~this.C|
a;this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.F+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.G+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.H+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.D+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,
I(this,V(this,1)+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,K(this,this.L+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.K+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.J+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.F+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},
function(a){a=a.call(this,this.L&this.C,I(this,this.G+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.H+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.D+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,V(this,1)+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,K(this,this.L+this.M()));this.L=
this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.K+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.J+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.F+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.G+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,
I(this,this.H+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.D+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,V(this,1)+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,K(this,this.L+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.K+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=
a.call(this,this.K&this.C,I(this,this.J+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.F+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.G+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.H+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.D+this.M()));this.J=this.J&~this.C|
a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,V(this,1)+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,K(this,this.L+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.K+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.J+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.F+
U(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.G+U(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.H+U(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.D+U(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,V(this,2)+U(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
this.F&this.C,K(this,this.L+U(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.K+U(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.J+U(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.F+U(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.G+U(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},
function(a){a=a.call(this,this.G&this.C,I(this,this.H+U(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.D+U(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,V(this,2)+U(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,K(this,this.L+U(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.K+U(this)));this.G=this.G&
~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.J+U(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.F+U(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.G+U(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.H+U(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.D+
U(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,V(this,2)+U(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,K(this,this.L+U(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.K+U(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.J+U(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
this.D&this.C,I(this,this.F+U(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.G+U(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.H+U(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.D+U(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,V(this,2)+U(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},
function(a){a=a.call(this,this.D&this.C,K(this,this.L+U(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.K+U(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.J+U(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.F+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.G+U(this)));u(this,r(this)&
~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.H+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.D+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,V(this,2)+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,K(this,this.L+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&
this.C,I(this,this.K+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.J+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.F+U(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.G+U(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.H+U(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},
function(a){a=a.call(this,this.L&this.C,I(this,this.D+U(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,V(this,2)+U(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,K(this,this.L+U(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.K+U(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.J+U(this)));this.L=this.L&
~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.F+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.G+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.H+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.D+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,V(this,
2)+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,K(this,this.L+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.K+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.J+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.F+U(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
this.J&this.C,I(this,this.G+U(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.H+U(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.D+U(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,V(this,2)+U(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,K(this,this.L+U(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},
function(a){a=a.call(this,this.J&this.C,I(this,this.K+U(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.J+U(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,this.F&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.G&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.H&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.D&this.C);
this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,r(this)&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.L&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.K&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.J&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.F&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.G&this.C);this.G=this.G&~this.C|
a},function(a){a=a.call(this,this.G&this.C,this.H&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.D&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,r(this)&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.L&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.K&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.J&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,
this.H&this.C,this.F&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.G&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.H&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.D&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,r(this)&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.L&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.K&
this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.J&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.F&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.G&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.H&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.D&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,r(this)&this.C);this.D=this.D&
~this.C|a},function(a){a=a.call(this,this.D&this.C,this.L&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.K&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.J&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,r(this)&this.C,this.F&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.G&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.H&this.C);u(this,r(this)&~this.C|a)},function(a){a=
a.call(this,r(this)&this.C,this.D&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,r(this)&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.L&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.K&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.J&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,this.L&this.C,this.F&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,
this.L&this.C,this.G&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.H&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.D&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,r(this)&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.L&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.K&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.J&
this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.F&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.G&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.H&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.D&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,r(this)&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.L&this.C);this.K=this.K&
~this.C|a},function(a){a=a.call(this,this.K&this.C,this.K&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.J&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.F&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.G&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.H&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.D&this.C);this.J=this.J&~this.C|a},function(a){a=
a.call(this,this.J&this.C,r(this)&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.L&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.K&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.J&this.C);this.J=this.J&~this.C|a}],we=[function(a){a=a.call(this,N(this,this.F),this.F&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.G),this.F&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,
N(this,this.H),this.F&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D),this.F&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,V(this,0)),this.F&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),this.F&this.C);R(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.K),this.F&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.F&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,
N(this,this.F),this.G&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.G),this.G&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.H),this.G&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D),this.G&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,V(this,0)),this.G&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),this.G&this.C);R(this,a);this.A-=this.B.da},function(a){a=a.call(this,
N(this,this.K),this.G&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.G&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.F),this.H&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.G),this.H&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.H),this.H&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D),this.H&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,
N(this,V(this,0)),this.H&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),this.H&this.C);R(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.K),this.H&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.H&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.F),this.D&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.G),this.D&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,
N(this,this.H),this.D&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D),this.D&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,V(this,0)),this.D&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),this.D&this.C);R(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.K),this.D&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.D&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,
N(this,this.F),r(this)&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.G),r(this)&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.H),r(this)&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D),r(this)&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,V(this,0)),r(this)&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),r(this)&this.C);R(this,a);this.A-=this.B.da},function(a){a=
a.call(this,N(this,this.K),r(this)&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),r(this)&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.F),this.L&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.G),this.L&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.H),this.L&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D),this.L&this.C);R(this,a);this.A-=this.B.N},function(a){a=
a.call(this,N(this,V(this,0)),this.L&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),this.L&this.C);R(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.K),this.L&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.L&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.F),this.K&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.G),this.K&this.C);R(this,a);this.A-=this.B.N},function(a){a=
a.call(this,N(this,this.H),this.K&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D),this.K&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,V(this,0)),this.K&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),this.K&this.C);R(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.K),this.K&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.K&this.C);R(this,a);this.A-=this.B.N},function(a){a=
a.call(this,N(this,this.F),this.J&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.G),this.J&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.H),this.J&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D),this.J&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,V(this,0)),this.J&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),this.J&this.C);R(this,a);this.A-=this.B.da},function(a){a=
a.call(this,N(this,this.K),this.J&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.J&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.F+this.M()),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+this.M()),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+this.M()),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.F&this.C);R(this,
a);this.A-=this.B.I},function(a){a=a.call(this,N(this,V(this,1)+this.M()),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+this.M()),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+this.M()),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=
a.call(this,N(this,this.G+this.M()),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+this.M()),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,V(this,1)+this.M()),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+this.M()),
this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+this.M()),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+this.M()),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+this.M()),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.H&this.C);R(this,a);this.A-=this.B.I},
function(a){a=a.call(this,N(this,V(this,1)+this.M()),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+this.M()),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+this.M()),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,
this.G+this.M()),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+this.M()),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,V(this,1)+this.M()),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+this.M()),this.D&this.C);R(this,
a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+this.M()),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+this.M()),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+this.M()),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=
a.call(this,N(this,V(this,1)+this.M()),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+this.M()),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+this.M()),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+this.M()),
this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+this.M()),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,V(this,1)+this.M()),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+this.M()),this.L&this.C);R(this,a);this.A-=
this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+this.M()),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+this.M()),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+this.M()),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,
N(this,V(this,1)+this.M()),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+this.M()),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+this.M()),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+this.M()),this.J&this.C);
R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+this.M()),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,V(this,1)+this.M()),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+this.M()),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=
a.call(this,N(this,this.J+this.M()),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+U(this)),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+U(this)),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+U(this)),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+U(this)),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,V(this,2)+U(this)),this.F&
this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+U(this)),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+U(this)),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+U(this)),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=
a.call(this,N(this,this.H+U(this)),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+U(this)),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,V(this,2)+U(this)),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+U(this)),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),this.G&
this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+U(this)),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+U(this)),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+U(this)),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+U(this)),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,V(this,2)+U(this)),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=
a.call(this,P(this,this.L+U(this)),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+U(this)),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+U(this)),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+U(this)),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+U(this)),this.D&
this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+U(this)),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,V(this,2)+U(this)),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+U(this)),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=
a.call(this,N(this,this.F+U(this)),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+U(this)),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+U(this)),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+U(this)),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,V(this,2)+U(this)),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),
r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+U(this)),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+U(this)),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+U(this)),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+U(this)),this.L&this.C);R(this,a);this.A-=this.B.I},
function(a){a=a.call(this,N(this,this.D+U(this)),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,V(this,2)+U(this)),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+U(this)),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+
U(this)),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+U(this)),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+U(this)),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+U(this)),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,V(this,2)+U(this)),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),this.K&this.C);R(this,a);this.A-=
this.B.I},function(a){a=a.call(this,N(this,this.K+U(this)),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+U(this)),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+U(this)),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+U(this)),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,
this.D+U(this)),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,V(this,2)+U(this)),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+U(this)),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),this.J&this.C);R(this,a);this.A-=this.B.I},C[192],C[200],C[208],C[216],C[224],C[232],C[240],C[248],C[193],C[201],C[209],
C[217],C[225],C[233],C[241],C[249],C[194],C[202],C[210],C[218],C[226],C[234],C[242],C[250],C[195],C[203],C[211],C[219],C[227],C[235],C[243],C[251],C[196],C[204],C[212],C[220],C[228],C[236],C[244],C[252],C[197],C[205],C[213],C[221],C[229],C[237],C[245],C[253],C[198],C[206],C[214],C[222],C[230],C[238],C[246],C[254],C[199],C[207],C[215],C[223],C[231],C[239],C[247],C[255]],xe=[function(a,b){var c=a[0].call(this,N(this,this.F),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,
N(this,this.G),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,N(this,this.H),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,N(this,V(this,0)),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,N(this,U(this)),b.call(this));R(this,c);this.A-=this.B.da},function(a,b){var c=a[0].call(this,N(this,this.K),b.call(this));R(this,
c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,N(this,this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,N(this,this.F),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,N(this,this.G),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,N(this,this.H),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=
a[1].call(this,N(this,V(this,0)),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,N(this,U(this)),b.call(this));R(this,c);this.A-=this.B.da},function(a,b){var c=a[1].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,N(this,this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,N(this,this.F),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,N(this,this.G),b.call(this));
R(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,N(this,this.H),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,N(this,V(this,0)),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,N(this,U(this)),b.call(this));R(this,c);this.A-=this.B.da},function(a,b){var c=a[2].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,
b){var c=a[2].call(this,N(this,this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,this.F),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,this.G),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,this.H),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,V(this,0)),
b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,U(this)),b.call(this));R(this,c);this.A-=this.B.da},function(a,b){var c=a[3].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,N(this,this.F),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,N(this,this.G),b.call(this));R(this,c);this.A-=this.B.N},
function(a,b){var c=a[4].call(this,N(this,this.H),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,N(this,V(this,0)),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,N(this,U(this)),b.call(this));R(this,c);this.A-=this.B.da},function(a,b){var c=a[4].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,N(this,
this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,N(this,this.F),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,N(this,this.G),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,N(this,this.H),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,N(this,V(this,0)),b.call(this));R(this,c);this.A-=
this.B.N},function(a,b){var c=a[5].call(this,N(this,U(this)),b.call(this));R(this,c);this.A-=this.B.da},function(a,b){var c=a[5].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,N(this,this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,N(this,this.F),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,N(this,this.G),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,
N(this,this.H),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,N(this,V(this,0)),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,N(this,U(this)),b.call(this));R(this,c);this.A-=this.B.da},function(a,b){var c=a[6].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,N(this,this.J),b.call(this));R(this,
c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,N(this,this.F),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,N(this,this.G),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,N(this,this.H),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,N(this,V(this,0)),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=
a[7].call(this,N(this,U(this)),b.call(this));R(this,c);this.A-=this.B.da},function(a,b){var c=a[7].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,N(this,this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,N(this,this.F+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.G+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,
this.H+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,V(this,1)+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,
N(this,this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.F+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.G+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.H+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,
N(this,V(this,1)+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.F+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,
N(this,this.G+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.H+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,V(this,1)+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,
N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.F+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.G+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.H+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,
N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,V(this,1)+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,
N(this,this.F+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.G+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.H+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,V(this,1)+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,
P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.F+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.G+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,
N(this,this.H+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,V(this,1)+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,
N(this,this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.F+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.G+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.H+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,
N(this,V(this,1)+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.F+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,
N(this,this.G+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.H+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,V(this,1)+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,
N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.F+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.G+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.H+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,
N(this,this.D+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,V(this,2)+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,P(this,this.L+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,
N(this,this.F+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.G+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.H+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.D+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,V(this,2)+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,
P(this,this.L+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.F+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.G+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,
this.H+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.D+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,V(this,2)+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,P(this,this.L+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,
this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.F+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.G+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.H+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.D+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,V(this,
2)+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,P(this,this.L+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.F+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.G+
U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.H+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.D+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,V(this,2)+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,P(this,this.L+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.K+
U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.F+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.G+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.H+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.D+U(this)),
b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,V(this,2)+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,P(this,this.L+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.F+U(this)),
b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.G+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.H+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.D+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,V(this,2)+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,P(this,this.L+U(this)),
b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.F+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.G+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.H+U(this)),b.call(this));
R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.D+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,V(this,2)+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,P(this,this.L+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.J+U(this)),b.call(this));
R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[0].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[0].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[0].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[0].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[0].call(this,
this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[0].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[0].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[1].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[1].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[1].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,
b){var c=a[1].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[1].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[1].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[1].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[1].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[2].call(this,this.F&this.C,b.call(this));this.F=
this.F&~this.C|c},function(a,b){var c=a[2].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[2].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[2].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[2].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[2].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[2].call(this,this.K&
this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[2].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[3].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[3].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[3].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[3].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=
a[3].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[3].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[3].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[3].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[4].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[4].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|
c},function(a,b){var c=a[4].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[4].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[4].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[4].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[4].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[4].call(this,this.J&this.C,b.call(this));
this.J=this.J&~this.C|c},function(a,b){var c=a[5].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[5].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[5].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[5].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[5].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[5].call(this,
this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[5].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[5].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[6].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[6].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[6].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,
b){var c=a[6].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[6].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[6].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[6].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[6].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[7].call(this,this.F&this.C,b.call(this));this.F=
this.F&~this.C|c},function(a,b){var c=a[7].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[7].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[7].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[7].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[7].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[7].call(this,this.K&
this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[7].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c}],of=[function(){return this.F+this.F},function(){return this.G+this.F},function(){return this.H+this.F},function(){return this.D+this.F},function(){this.ha=this.ka;return r(this)+this.F},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+this.F},function(){return this.K+this.F},function(){return this.J+this.F},function(){return this.F+this.G},function(){return this.G+
this.G},function(){return this.H+this.G},function(){return this.D+this.G},function(){this.ha=this.ka;return r(this)+this.G},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+this.G},function(){return this.K+this.G},function(){return this.J+this.G},function(){return this.F+this.H},function(){return this.G+this.H},function(){return this.H+this.H},function(){return this.D+this.H},function(){this.ha=this.ka;return r(this)+this.H},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+this.H},
function(){return this.K+this.H},function(){return this.J+this.H},function(){return this.F+this.D},function(){return this.G+this.D},function(){return this.H+this.D},function(){return this.D+this.D},function(){this.ha=this.ka;return r(this)+this.D},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+this.D},function(){return this.K+this.D},function(){return this.J+this.D},function(){return this.F},function(){return this.G},function(){return this.H},function(){return this.D},function(){this.ha=
this.ka;return r(this)},function(a){return a?(this.ha=this.ka,this.L):this.oa()},function(){return this.K},function(){return this.J},function(){return this.F+this.L},function(){return this.G+this.L},function(){return this.H+this.L},function(){return this.D+this.L},function(){this.ha=this.ka;return r(this)+this.L},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+this.L},function(){return this.K+this.L},function(){return this.J+this.L},function(){return this.F+this.K},function(){return this.G+
this.K},function(){return this.H+this.K},function(){return this.D+this.K},function(){this.ha=this.ka;return r(this)+this.K},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+this.K},function(){return this.K+this.K},function(){return this.J+this.K},function(){return this.F+this.J},function(){return this.G+this.J},function(){return this.H+this.J},function(){return this.D+this.J},function(){this.ha=this.ka;return r(this)+this.J},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+this.J},
function(){return this.K+this.J},function(){return this.J+this.J},function(){return this.F+(this.F<<1)},function(){return this.G+(this.F<<1)},function(){return this.H+(this.F<<1)},function(){return this.D+(this.F<<1)},function(){this.ha=this.ka;return r(this)+(this.F<<1)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.F<<1)},function(){return this.K+(this.F<<1)},function(){return this.J+(this.F<<1)},function(){return this.F+(this.G<<1)},function(){return this.G+(this.G<<1)},function(){return this.H+
(this.G<<1)},function(){return this.D+(this.G<<1)},function(){this.ha=this.ka;return r(this)+(this.G<<1)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.G<<1)},function(){return this.K+(this.G<<1)},function(){return this.J+(this.G<<1)},function(){return this.F+(this.H<<1)},function(){return this.G+(this.H<<1)},function(){return this.H+(this.H<<1)},function(){return this.D+(this.H<<1)},function(){this.ha=this.ka;return r(this)+(this.H<<1)},function(a){return(a?(this.ha=this.ka,this.L):
this.oa())+(this.H<<1)},function(){return this.K+(this.H<<1)},function(){return this.J+(this.H<<1)},function(){return this.F+(this.D<<1)},function(){return this.G+(this.D<<1)},function(){return this.H+(this.D<<1)},function(){return this.D+(this.D<<1)},function(){this.ha=this.ka;return r(this)+(this.D<<1)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.D<<1)},function(){return this.K+(this.D<<1)},function(){return this.J+(this.D<<1)},function(){return this.F},function(){return this.G},
function(){return this.H},function(){return this.D},function(){this.ha=this.ka;return r(this)},function(a){return a?(this.ha=this.ka,this.L):this.oa()},function(){return this.K},function(){return this.J},function(){return this.F+(this.L<<1)},function(){return this.G+(this.L<<1)},function(){return this.H+(this.L<<1)},function(){return this.D+(this.L<<1)},function(){this.ha=this.ka;return r(this)+(this.L<<1)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.L<<1)},function(){return this.K+
(this.L<<1)},function(){return this.J+(this.L<<1)},function(){return this.F+(this.K<<1)},function(){return this.G+(this.K<<1)},function(){return this.H+(this.K<<1)},function(){return this.D+(this.K<<1)},function(){this.ha=this.ka;return r(this)+(this.K<<1)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.K<<1)},function(){return this.K+(this.K<<1)},function(){return this.J+(this.K<<1)},function(){return this.F+(this.J<<1)},function(){return this.G+(this.J<<1)},function(){return this.H+
(this.J<<1)},function(){return this.D+(this.J<<1)},function(){this.ha=this.ka;return r(this)+(this.J<<1)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.J<<1)},function(){return this.K+(this.J<<1)},function(){return this.J+(this.J<<1)},function(){return this.F+(this.F<<2)},function(){return this.G+(this.F<<2)},function(){return this.H+(this.F<<2)},function(){return this.D+(this.F<<2)},function(){this.ha=this.ka;return r(this)+(this.F<<2)},function(a){return(a?(this.ha=this.ka,this.L):
this.oa())+(this.F<<2)},function(){return this.K+(this.F<<2)},function(){return this.J+(this.F<<2)},function(){return this.F+(this.G<<2)},function(){return this.G+(this.G<<2)},function(){return this.H+(this.G<<2)},function(){return this.D+(this.G<<2)},function(){this.ha=this.ka;return r(this)+(this.G<<2)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.G<<2)},function(){return this.K+(this.G<<2)},function(){return this.J+(this.G<<2)},function(){return this.F+(this.H<<2)},function(){return this.G+
(this.H<<2)},function(){return this.H+(this.H<<2)},function(){return this.D+(this.H<<2)},function(){this.ha=this.ka;return r(this)+(this.H<<2)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.H<<2)},function(){return this.K+(this.H<<2)},function(){return this.J+(this.H<<2)},function(){return this.F+(this.D<<2)},function(){return this.G+(this.D<<2)},function(){return this.H+(this.D<<2)},function(){return this.D+(this.D<<2)},function(){this.ha=this.ka;return r(this)+(this.D<<2)},function(a){return(a?
(this.ha=this.ka,this.L):this.oa())+(this.D<<2)},function(){return this.K+(this.D<<2)},function(){return this.J+(this.D<<2)},function(){return this.F},function(){return this.G},function(){return this.H},function(){return this.D},function(){this.ha=this.ka;return r(this)},function(a){return a?(this.ha=this.ka,this.L):this.oa()},function(){return this.K},function(){return this.J},function(){return this.F+(this.L<<2)},function(){return this.G+(this.L<<2)},function(){return this.H+(this.L<<2)},function(){return this.D+
(this.L<<2)},function(){this.ha=this.ka;return r(this)+(this.L<<2)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.L<<2)},function(){return this.K+(this.L<<2)},function(){return this.J+(this.L<<2)},function(){return this.F+(this.K<<2)},function(){return this.G+(this.K<<2)},function(){return this.H+(this.K<<2)},function(){return this.D+(this.K<<2)},function(){this.ha=this.ka;return r(this)+(this.K<<2)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.K<<2)},function(){return this.K+
(this.K<<2)},function(){return this.J+(this.K<<2)},function(){return this.F+(this.J<<2)},function(){return this.G+(this.J<<2)},function(){return this.H+(this.J<<2)},function(){return this.D+(this.J<<2)},function(){this.ha=this.ka;return r(this)+(this.J<<2)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.J<<2)},function(){return this.K+(this.J<<2)},function(){return this.J+(this.J<<2)},function(){return this.F+(this.F<<3)},function(){return this.G+(this.F<<3)},function(){return this.H+
(this.F<<3)},function(){return this.D+(this.F<<3)},function(){this.ha=this.ka;return r(this)+(this.F<<3)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.F<<3)},function(){return this.K+(this.F<<3)},function(){return this.J+(this.F<<3)},function(){return this.F+(this.G<<3)},function(){return this.G+(this.G<<3)},function(){return this.H+(this.G<<3)},function(){return this.D+(this.G<<3)},function(){this.ha=this.ka;return r(this)+(this.G<<3)},function(a){return(a?(this.ha=this.ka,this.L):
this.oa())+(this.G<<3)},function(){return this.K+(this.G<<3)},function(){return this.J+(this.G<<3)},function(){return this.F+(this.H<<3)},function(){return this.G+(this.H<<3)},function(){return this.H+(this.H<<3)},function(){return this.D+(this.H<<3)},function(){this.ha=this.ka;return r(this)+(this.H<<3)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.H<<3)},function(){return this.K+(this.H<<3)},function(){return this.J+(this.H<<3)},function(){return this.F+(this.D<<3)},function(){return this.G+
(this.D<<3)},function(){return this.H+(this.D<<3)},function(){return this.D+(this.D<<3)},function(){this.ha=this.ka;return r(this)+(this.D<<3)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.D<<3)},function(){return this.K+(this.D<<3)},function(){return this.J+(this.D<<3)},function(){return this.F},function(){return this.G},function(){return this.H},function(){return this.D},function(){this.ha=this.ka;return r(this)},function(a){return a?(this.ha=this.ka,this.L):this.oa()},function(){return this.K},
function(){return this.J},function(){return this.F+(this.L<<3)},function(){return this.G+(this.L<<3)},function(){return this.H+(this.L<<3)},function(){return this.D+(this.L<<3)},function(){this.ha=this.ka;return r(this)+(this.L<<3)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.L<<3)},function(){return this.K+(this.L<<3)},function(){return this.J+(this.L<<3)},function(){return this.F+(this.K<<3)},function(){return this.G+(this.K<<3)},function(){return this.H+(this.K<<3)},function(){return this.D+
(this.K<<3)},function(){this.ha=this.ka;return r(this)+(this.K<<3)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.K<<3)},function(){return this.K+(this.K<<3)},function(){return this.J+(this.K<<3)},function(){return this.F+(this.J<<3)},function(){return this.G+(this.J<<3)},function(){return this.H+(this.J<<3)},function(){return this.D+(this.J<<3)},function(){this.ha=this.ka;return r(this)+(this.J<<3)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.J<<3)},function(){return this.K+
(this.J<<3)},function(){return this.J+(this.J<<3)}];
function Rh(a){Wa.call(this,"ChipSet",a,Rh,32768);this.la=(this.la=a.model)&&Sh[this.la]||Th;this.mc=0;var b=a.sw1;if(b)this.mc=Uh(b,Vh|Wh.Yo);else{this.Qe=[360,360];(b=a.floppies)&&b.length&&(this.Qe=b);if(b=this.Qe.length)this.mc|=Xh.zk,b--,this.mc|=(b&3)<<Xh.mh;if(b=a.monitor||(this.la<Yh?"mono":"ega"),void 0!==Zh[b])this.mc|=Zh[b]<<Wh.mh}this.wf=Uh(a.sw2||"11110000",0);this.Hq=this.la==Th?16:64;this.Ni=this.Ah=1;this.la>=Yh&&(this.Ni=this.Ah=2);this.ff=a.scaleTimers||!1;this.Gs=a.rtcDate;this.Rn=
!1;a.sound&&(this.Wk=this.Eh=null,window&&(this.Wk=window.AudioContext||window.webkitAudioContext),this.Wk&&(this.Eh=new this.Wk));this.reset(!0);pb(this)}fb(Rh);var Th=5150,Yh=5170,Sh={5150:Th,5160:5160,5170:Yh,deskpro386:5180},Zh={none:0,tv:1,color:2,mono:3,ega:0,vga:0},Xh={zk:1,ONE:0,Nt:64,Lt:128,kt:192,lh:192,mh:6},Vh=12,Wh={Mt:16,ct:32,Yo:48,lh:48,mh:4};f=Rh.prototype;
f.Lb=function(a,b,c){switch(b){case "sw1":return this.va[b]=c,$h(this,b,c,this.mc,{0:this.la==Th?"Bootable Floppy Drive":"Loop on POST",1:this.la==Th?"Reserved":"Coprocessor",2:"Base Memory Size",4:"Monitor Type",6:"Number of Floppy Drives"}),!0;case "sw2":if(this.la==Th)return this.va[b]=c,$h(this,b,c,this.wf,{0:"Expansion Memory Size",4:"Reserved"}),!0;break;case "swdesc":return this.va[b]=c,!0}return!1};
f.Ic=function(a,b,c,d){this.ma=b;this.O=c;this.Y=d;this.Fa=a;this.Ka=yb(a,"Keyboard");this.dk=c.T.ee/1193181;oc(b,this,ai);sc(b,this,bi);this.la<Yh?(oc(b,this,ci),sc(b,this,di)):(oc(b,this,ei),sc(b,this,fi));if(d){var e=this;gi(d,1024,function(){for(var a=0;a<e.cc.length;a++){for(var b=e.cc[a],c="PIC"+a+":",d=0;d<b.Oc.length;d++)c+=" IC"+(d+1)+"="+k(b.Oc[d]);c+=" IMR="+k(b.Vd)+" IRR="+k(b.Wb)+" ISR="+k(b.Sc)+" DELAY="+b.Pg;e.Y.R(c)}});gi(d,2048,function(){for(var a=0;a<e.Nb.length;a++){hi(e,a);var b=
e.Nb[a],c="TIMER"+a+":",d=0;if(null!=b.$d)for(var v=0;v<=b.$d;v++)d|=b.eb[v]<<8*v;c+=" mode="+b.mode+" bytes="+b.$d+" count="+ha(d);e.Y.R(c)}});gi(d,4096,function(){for(var a="",b=0;64>b;b++){var c=13>=b?ii(e,b):e.ga[b];a&&(a+="\n");a+="CMOS["+k(b)+"]: "+k(c)}e.Y.R(a)})}Be(c,26,this,this.Gq)};f.kc=function(a,b){if(!b)if(!a)this.reset();else if(!this.restore(a))return!1;return!0};f.jc=function(a){return a&&this.save?this.save():!0};
f.reset=function(a){var b;this.Sd=this.mc;this.dg=this.wf;ji(this);this.ub=Array(this.Ni);for(b=0;b<this.Ni;b++)ki(this,b);this.cc=Array(this.Ah);li(this,0,32);1<this.Ah&&li(this,1,160);this.rn=this.Ok=null;this.Nb=Array(5180==this.la?6:3);for(b=0;b<this.Nb.length;b++)mi(this,b);this.xh=this.Pk=this.Tc=this.Ki=null;this.Ji=0;if(this.la>=Yh){this.jb=16;this.me=0;this.Ud=16;this.Ei=0;this.ne=160;512<=ni(this)&&(this.ne|=16);3==oi(this)&&(this.ne|=64);5180==this.la&&(this.ne|=12);this.Fi=3;this.ng=Array(8);
this.Bf=0;a&&(this.ga=Array(64));pi(this,this.Gs);for(a=21;24>=a;a++)this.ga[a]=0;for(a=14;46>a;a++)void 0===this.ga[a]&&(this.ga[a]=0);this.ga[20]=this.Sd&(Wh.lh|2|Xh.zk|Xh.lh);this.ga[16]=qi(this,0)<<4|qi(this,1);ri(this)}};
function pi(a,b){var c=b?new Date(b):new Date;"[object Date]"!==Object.prototype.toString.call(c)||isNaN(c.getTime())?(c=new Date,a.R("CMOS date invalid ("+b+"), using "+c)):b&&a.R("CMOS date: "+c);a.ga[0]=c.getSeconds();a.ga[1]=0;a.ga[2]=c.getMinutes();a.ga[3]=0;a.ga[4]=c.getHours();a.ga[5]=0;a.ga[6]=c.getDay()+1;a.ga[7]=c.getDate();a.ga[8]=c.getMonth()+1;c=c.getFullYear();a.ga[9]=c%100;c/=100;a.ga[50]=c%10|c/10<<4;a.ga[10]=38;a.ga[11]=2;a.ga[12]=0;a.ga[13]=128;a.ci=a.Vg=0;a.so=a.bk=null}
function ii(a,b){var c=a.ga[b];if(10>b){var d=!1;4!=b&&5!=b||a.ga[11]&2||(c=12>c?c?c:12:(c-=12)?c+128:140,d=!0);a.ga[11]&4||(d&&128<c&&(c-=48),c=c%10|c/10<<4)}else 10==b&&(a.ga[b]^=128);return c}function si(a){var b;void 0===b&&(b=a.bk);a.Vg=cd(a.O,a.ff)+b;a.ga[11]&64&&hd(a.O,b)}function ri(a){for(var b=0,c=16;46>c;c++)b+=a.ga[c];a.ga[47]=b&255;a.ga[46]=b>>8}
f.save=function(){var a=new Ie(this);a.set(0,[this.mc,this.wf,this.Sd,this.dg]);for(var b=[],c=0;c<this.ub;c++){for(var d=this.ub[c],e=d,g=[],l=0;l<e.Tb.length;l++){var p=e.Tb[l];g[l]=[p.xe,p.zi,p.oc,p.ib,p.eb,p.mode,p.Li,p.Bs,p.Ds]}b[c]=[d.Ye,d.Mk,d.sn,d.vb,g]}a.set(1,[b]);b=[];for(c=0;c<this.cc.length;c++)d=this.cc[c],b[c]=[d.Pg,d.Oc,d.Be,d.Vd,d.Wb,d.Sc,d.Cf,d.wh];a.set(2,[b]);b=[];for(c=0;c<this.Nb.length;c++)d=this.Nb[c],b[c]=[d.oc,d.Vc,d.eb,d.Jf,d.un,d.mode,d.rk,d.bf,d.$d,d.be,d.Nh,d.Of,d.Nd];
a.set(3,[this.Ok,b,this.rn]);a.set(4,[this.Ki,this.Tc,this.Pk,this.xh,this.Ji]);this.la>=Yh&&(a.set(5,[this.jb,this.me,this.Ud,this.Ei,this.ne,this.Fi]),a.set(6,[this.ng[7],this.ng,this.Bf,this.ga,this.ci,this.Vg]));return a.data()};
f.restore=function(a){var b,c;b=a[0];this.mc=b[0];this.wf=b[1];this.Sd=b[2];this.dg=b[3];b=a[1];for(c=0;c<this.Ni;c++)ki(this,c,1==b.length?b[0][c]:b);b=a[2];for(c=0;c<this.Ah;c++)li(this,c,0===c?32:160,b[0][c]);b=a[3];this.Ok=b[0];this.rn=b[2];for(c=0;c<this.Nb.length;c++)mi(this,c,b[1][c]);b=a[4];this.Ki=b[0];this.Tc=b[1];this.Pk=b[2];this.xh=b[3];this.Ji=b[4];if(b=a[5])this.jb=b[0],this.me=b[1],this.Ud=b[2],this.Ei=b[3],this.ne=b[4],this.Fi=b[5];if(b=a[6])this.ng=b[1],this.ng[7]=b[0],this.Bf=b[2],
this.ga=b[3],this.ci=b[4],this.Vg=b[5],pi(this);return!0};var ti=[0,null,null,0,Array(4)];function ki(a,b,c){var d=a.ub[b];d||(d={Tb:Array(4)});c=c&&5==c.length?c:ti;d.Ye=c[0];d.Mk=c[1];d.sn=c[2];d.vb=c[3];d.Rq=b<<2;for(var e=0;e<d.Tb.length;e++)ui(d,e,c[4][e]);a.ub[b]=d}var vi=[!0,[0,0],[0,0],[0,0],[0,0]];
function ui(a,b,c){var d=a.Tb[b];d||(d={zi:[0,0],oc:[0,0],ib:[0,0],eb:[0,0]});c=c&&8==c.length?c:vi;d.xe=c[0];d.zi[0]=c[1][0];d.zi[1]=c[1][1];d.oc[0]=c[2][0];d.oc[1]=c[2][1];d.ib[0]=c[3][0];d.ib[1]=c[3][1];d.eb[0]=c[4][0];d.eb[1]=c[4][1];d.mode=c[5];d.Li=c[6];d.Z=a;d.$n=b;wi(d,c[8],c[9]);a.Tb[b]=d}function wi(a,b,c,d){"string"==typeof b&&(b=hb(b));b&&(a.Ui=null,a.Bs=b.id,a.Ds=c,a.Si=b,a.ol=b[c],a.ek=d)}var xi=[0,Array(4)];
function li(a,b,c,d){var e=a.cc[b];e||(e={Oc:[null,null,null,null]});d=d&&8==d.length?d:xi;e.port=c;e.ru=b<<3;e.Pg=d[0];e.Oc[0]=d[1][0];e.Oc[1]=d[1][1];e.Oc[2]=d[1][2];e.Oc[3]=d[1][3];e.Be=d[2];e.Vd=d[3];e.Wb=d[4];e.Sc=d[5];e.Cf=d[6];e.wh=d[7];a.cc[b]=e}var yi=[[0,0],[0,0],[0,0],[0,0]];
function mi(a,b,c){var d=a.Nb[b];d||(d={oc:[0,0],Vc:[0,0],eb:[0,0],Jf:[0,0]});c=c&&13==c.length?c:yi;d.oc[0]=c[0][0];d.oc[1]=c[0][1];d.Vc[0]=c[1][0];d.Vc[1]=c[1][1];d.eb[0]=c[2][0];d.eb[1]=c[2][1];d.Jf[0]=c[3][0];d.Jf[1]=c[3][1];d.un=c[4];d.mode=c[5];d.rk=c[6];d.bf=c[7];d.$d=c[8];d.be=c[9];d.Nh=c[10];d.Of=c[11];d.Nd=c[12];a.Nb[b]=d}function ni(a,b){return((((b?a.mc:a.Sd)&12)>>2)+1)*a.Hq+32*((b?a.wf:a.dg)&15)}function zi(a,b){var c=b?a.mc:a.Sd;return a.la!=Th||c&Xh.zk?((c&Xh.lh)>>Xh.mh)+1:0}
function qi(a,b){if(b<zi(a)){if(!a.Qe)return 1;if(b<a.Qe.length)switch(a.Qe[b]){case 160:case 180:case 320:case 360:return 1;case 720:return 3;case 1200:return 2;case 1440:return 4}}return 0}function oi(a,b){return((b?a.mc:a.Sd)&Wh.lh)>>Wh.mh}
function $h(a,b,c,d,e){for(var g="",l=1;8>=l;l++){var p="pcjs-bitCell";l||(p+=" pcjs-bitCellLeft");g+='<div id="'+(b+"-"+l)+'" class="'+p+'" data-value="0">'+l+"</div>\n"}c.innerHTML=g;b=lb(c,"pcjs-bitCell");c=null;for(l=0;l<b.length;l++)null!=e&&null!=e[l]&&(c=e[l]),c&&b[l].setAttribute("title",c),Ai(b[l],d&1<<l?!1:!0),b[l].onclick=function(a,b){return function(){var c="1"!=b.getAttribute("data-value");Ai(b,c);var d=b.getAttribute("id").split("-"),e=1<<+d[1]-1;switch(d[0]){case "sw1":a.mc=a.mc&~e|
(c?0:e);break;case "sw2":a.wf=a.wf&~e|(c?0:e)}ji(a)}}(a,b[l])}function Ai(a,b){a.setAttribute("data-value",b?"1":"0");a.style.color=b?"#ffffff":"#000000";a.style.backgroundColor=b?"#000000":"#ffffff"}function ji(a){var b=a.va.swdesc,c={0:"Enhanced Color",1:"TV",2:"Color",3:"Monochrome"};if(null!=b){var d;d=""+(ni(a,!0)+"Kb");d+=", "+c[oi(a,!0)]+" Monitor";d+=", "+zi(a,!0)+" Floppy Drives";if(null!=a.Sd&&a.Sd!=a.mc||null!=a.dg&&a.dg!=a.wf)d+=" (Reset required)";b.textContent=d}}
function Bi(a,b,c,d,e){var g=a.ub[b],l=g.Tb[c],p=l.ib[g.vb];a.qa(768)&&m(a,d,null,e,"DMA"+b+".CHANNEL"+c+".ADDR["+g.vb+"]",p,!0);g.vb^=1;b||0!=c||g.vb||(l.ib[0]++,255<l.ib[0]&&(l.ib[0]=0,l.ib[1]++,255<l.ib[1]&&(l.ib[1]=0)));return p}function Ci(a,b,c,d,e,g){var l=a.ub[b];a.qa(768)&&m(a,d,e,g,"DMA"+b+".CHANNEL"+c+".ADDR["+l.vb+"]",null,!0);a=l.Tb[c];a.ib[l.vb]=a.zi[l.vb]=e;l.vb^=1}
function Di(a,b,c,d,e){var g=a.ub[b],l=g.Tb[c],p=l.eb[g.vb];a.qa(768)&&m(a,d,null,e,"DMA"+b+".CHANNEL"+c+".COUNT["+g.vb+"]",p,!0);g.vb^=1;b||0!=c||g.vb||(l.eb[0]--,0>l.eb[0]&&(l.eb[0]=255,l.eb[1]--,0>l.eb[1]&&(l.eb[1]=255)));return p}function Ei(a,b,c,d,e,g){var l=a.ub[b];a.qa(768)&&m(a,d,e,g,"DMA"+b+".CHANNEL"+c+".COUNT["+l.vb+"]",null,!0);a=l.Tb[c];a.eb[l.vb]=a.oc[l.vb]=e;l.vb^=1}function Fi(a,b,c,d){var e=a.ub[b],g=e.Ye|1;e.Ye&=-16;a.qa(768)&&m(a,c,null,d,"DMA"+b+".STATUS",g,!0);return g}
function Gi(a,b,c,d,e){var g=a.ub[b];a.qa(768)&&m(a,c,d,e,"DMA"+b+".REQ",null,!0);a=d&3;g.Ye=g.Ye&~(16<<a)|(d&4)<<a+2;g.sn=d}function Hi(a,b,c,d,e){var g=a.ub[b];a.qa(768)&&m(a,c,d,e,"DMA"+b+".MASK",null,!0);b=d&3;c=g.Tb[b];c.xe=!!(d&4);c.xe||Ii(a,g.Rq+b)}function Ji(a,b,c,d,e){a.qa(768)&&m(a,c,d,e,"DMA"+b+".MODE",null,!0);a.ub[b].Tb[d&3].mode=d}function Ki(a,b,c,d,e){a.qa(768)&&m(a,c,d,e,"DMA"+b+".MASTER_CLEAR",null,!0);a=a.ub[b];for(b=0;b<a.Tb.length;b++)ui(a,b)}
function Li(a,b,c,d,e){var g=a.ub[b].Tb[c].Li;a.qa(768)&&m(a,d,null,e,"DMA"+b+".CHANNEL"+c+".PAGE",g,!0);return g}function Mi(a,b,c,d,e,g){a.qa(768)&&m(a,d,e,g,"DMA"+b+".CHANNEL"+c+".PAGE",null,!0);a.ub[b].Tb[c].Li=e}function Ni(a,b,c,d){var e=a.ng[b];a.qa(768)&&m(a,c,null,d,"DMA.SPARE"+b+".PAGE",e,!0);return e}function Oi(a,b,c,d,e){a.qa(768)&&m(a,c,d,e,"DMA.SPARE"+b+".PAGE",null,!0);a.ng[b]=d}function Pi(a,b,c,d,e){wi(a.ub[b>>2].Tb[b&3],c,d,e)}
function Ii(a,b,c){b=a.ub[b>>2].Tb[b&3];b.Si&&b.ol&&b.ek?(c&&(b.Ui=c),b.xe||tf(a,b,!0)):c&&c(!0)}function tf(a,b,c){c&&(b.count=b.eb[1]<<8|b.eb[0],b.type=b.mode&12,b.Tn=b.Kd=!1);for(var d=!1;0<=b.count&&(c=b.Li<<16|b.ib[1]<<8|b.ib[0],4==b.type?(d=!0,function(c){b.ol.call(b.Si,b.ek,-1,function(g,l){0>g&&(b.Tn||(b.Tn=!0),g=255);b.xe||a.ma.cd(c,g);(d=l)&&setTimeout(function(){Qi(b)||tf(a,b)},0)})}(c)):8==b.type?(c=a.ma.Ra(c),0>b.ol.call(b.Si,b.ek,c)&&(b.Kd=!0)):0!=b.type&&(b.Kd=!0)),!d&&!Qi(b););}
function Qi(a){if(!a.Kd&&0<=--a.count&&(a.mode&32?(a.ib[0]--,0>a.ib[0]&&(a.ib[0]=255,a.ib[1]--,0>a.ib[1]&&(a.ib[1]=255))):(a.ib[0]++,255<a.ib[0]&&(a.ib[0]=0,a.ib[1]++,255<a.ib[1]&&(a.ib[1]=0))),!a.xe))return!1;var b=a.Z;b.Ye=b.Ye&~(16<<a.$n)|1<<a.$n;a.mode&16||(a.xe=!0,a.Si=a.ek=null);a.Ui&&(a.Ui(!a.Kd),a.Ui=null);return!0}function Ri(a,b,c){var d=0,e=a.cc[b];if(null!=e.wh)switch(e.wh&3){case 2:d=e.Wb;break;case 3:d=e.Sc}a.qa(34048)&&m(a,e.port,null,c,"PIC"+b,d,!0);return d}
function Si(a,b,c,d){var e=a.cc[b];a.qa(34048)&&m(a,e.port,c,d,"PIC"+b,null,!0);if(c&16)e.Be=0,e.Oc[e.Be++]=c,e.Vd=0,e.Cf=7,e.Wb=e.Sc=0,e.wh=10;else if(c&8)c&100&&a.Da("PIC"+b+"("+k(e.port)+"): unsupported OCW3 command: "+k(c)),e.wh=c;else if(d=c&224,d&32){var g,l=0;if(96==(d&96))l=1<<(c&7);else for(g=e.Cf+1;;){g&=7;var p=1<<g;if(e.Sc&p){l=p;break}if(g++==e.Cf)break}e.Sc&l&&(e.Sc&=~l,Ti(a));d&128&&a.Da("PIC"+b+"("+k(e.port)+"): unsupported OCW2 rotate command: "+k(c))}else 192==d?e.Cf=c&7:a.Da("PIC"+
b+"("+k(e.port)+"): unsupported OCW2 automatic EOI command: "+k(c))}function Ui(a,b,c){var d=a.cc[b],e=d.Vd;a.qa(34048)&&m(a,d.port+1,null,c,"PIC"+b,e,!0);return e}function Vi(a,b,c,d){var e=a.cc[b];a.qa(34048)&&m(a,e.port+1,c,d,"PIC"+b,null,!0);e.Be<e.Oc.length?(e.Oc[e.Be++]=c,2==e.Be&&e.Oc[0]&2&&e.Be++,3!=e.Be||e.Oc[0]&1||e.Be++):(e.Vd=c,d=a.O,d.S|=4,Ti(a,b||253!=c?0:6))}function Wi(a,b,c){var d=a.cc[b>>3];b=1<<(b&7);d.Wb&b||(d.Wb|=b,d.Pg=c||0,Ti(a))}
function Xi(a,b){var c=a.cc[b>>3],d=1<<(b&7);c.Wb&d&&(c.Wb&=~d,Ti(a))}function Ti(a,b){var c,d=-1;1<a.Ah&&(c=a.cc[1],d=~(c.Sc|c.Vd)&c.Wb);c=a.cc[0];0<=d&&(c.Wb=d?c.Wb|4:c.Wb&-5);var d=~(c.Sc|c.Vd)&c.Wb,e=a.O;e.ja&&(e.Ab=d?e.Ab|1:e.Ab&-2);d&&b&&(c.Pg=b)}function rf(a,b){void 0===b&&(b=0);var c=-1,d=a.cc[b];if(d.Pg)c=-2,d.Pg--;else for(var e=d.Wb&((d.Sc|d.Vd)^255),g=d.Cf+1;;){var g=g&7,l=1<<g;if(e&l){c=b||2!=g?d.Oc[1]+g:rf(a,1);0<=c&&(d.Sc|=l,d.Wb&=~l);break}if(g++==d.Cf)break}return c}
function Yi(a,b,c,d){var e;e=a.Nb[b];e.bf==e.$d&&Zi(a,b);if(e.Nh)return e.Jf[e.bf++];hi(a,b);e=e.eb[e.bf++];a.qa(2304)&&m(a,c,null,d,"TIMER"+b,e,!0);return e}function $i(a,b,c,d,e){a.qa(2304)&&m(a,c,d,e,"TIMER"+b,null,!0);c=a.Nb[b];c.bf==c.$d&&Zi(a,b);c.oc[c.bf++]=d;c.bf==c.$d&&(c.Of&&0!=c.mode&&8!=c.mode||(c.Nh=!1,c.eb[0]=c.Vc[0]=c.oc[0],c.eb[1]=c.Vc[1]=c.oc[1],c.Nd=cd(a.O,a.ff),c.Of=!0,c.be=0!=c.mode,0==b&&(Xi(a,0),d=aj(a,0)*a.dk|0,6==c.mode&&(d>>=1),hd(a.O,d))),2==b&&kd(a))}f=Rh.prototype;
f.oq=function(a,b){m(this,a,null,b,"PIT1_CTRL",null,2048);return null};f.Sr=function(a,b,c){this.Ok=b;m(this,a,b,c,"PIT1_CTRL",null,2048);a=(b&192)>>6;if(3!=a){c=b&1;var d=b&14;if(b&=48){var e=this.Nb[a];e.rk=b;e.mode=d;e.un=c;e.oc=[0,0];e.eb=[0,0];e.Jf=[0,0];e.be=!1;e.Nh=!1;e.Of=!1;Zi(this,a);0==a&&Xi(this,0);2==a&&255==this.cc[0].Vd&&77==this.Tc&&(a=this.Nb[0],a.Vc[0]=a.oc[0],a.Vc[1]=a.oc[1],a.Nd=cd(this.O,this.ff))}else hi(this,a),b=this.Nb[a],b.Jf[0]=b.eb[0],b.Jf[1]=b.eb[1],b.Nh=!0,Zi(this,a)}};
function aj(a,b){var c=a.Nb[b],d=c.oc[1]<<8|c.oc[0];d||(d=1==c.$d?256:65536);return d}function md(a,b){var c=a.Nb[b],d=c.Vc[1]<<8|c.Vc[0];d||(d=1==c.$d?256:65536);return d}function Zi(a,b){var c=a.Nb[b];c.bf=32==c.rk?1:0;c.$d=48==c.rk?2:1}
function hi(a,b,c){var d=a.Nb[b];if(d.Of&&(2!=b||a.Tc&1)){var e=cd(a.O,a.ff),g=(e-d.Nd)/a.dk|0;0>g&&(d.Nd=e,g=0);var l=aj(a,b),p=md(a,b)-g;0==d.mode?(0>=p&&(p=0),p||(d.be=!0,d.Of=!1,b||Wi(a,0))):4==d.mode?(d.be=1!=p,0>=p&&(p=l+p,0>=p&&(p=l),d.Vc[0]=p&255,d.Vc[1]=p>>8,d.Nd=e,!b&&d.be&&Wi(a,0))):6==d.mode&&(p-=g,0>=p&&(d.be=!d.be,p=l+p,0>=p&&(p=l),d.Vc[0]=p&255,d.Vc[1]=p>>8,d.Nd=e,!b&&d.be&&Wi(a,0)));d.eb[0]=p&255;d.eb[1]=p>>8;c&&(a.Nd=0)}return d}
function ld(a,b){for(var c=0;c<a.Nb.length;c++)hi(a,c,b);if(a.la>=Yh){var c=a.O.T.ee,d=cd(a.O,a.ff);null==a.bk&&(a.ci=cd(a.O,a.ff),a.so=1024,a.bk=Math.floor(a.O.T.ee/a.so),si(a));d>=a.Vg&&(a.ga[12]|=64,a.ga[11]&64&&(a.ga[12]|=128,Wi(a,8)),a.Vg=d+a.bk);a.ga[0]==a.ga[1]&&a.ga[2]==a.ga[3]&&a.ga[4]==a.ga[5]&&(a.ga[12]|=32,a.ga[11]&32&&(a.ga[12]|=128,Wi(a,8)));var e=d-a.ci,g=Math.floor(e/c);if(g&&!(a.ga[11]&128)){for(;g--;)if(60<=++a.ga[0]&&(a.ga[0]=0,60<=++a.ga[2]&&(a.ga[2]=0,24<=++a.ga[4]))){a.ga[4]=
0;a.ga[6]=a.ga[6]%7+1;var l;l=a.ga[9];var p=va[a.ga[8]-1];28==p&&0===l%4&&(l%100||0===l%400)&&p++;l=p;++a.ga[7]>l&&(a.ga[7]=1,12<++a.ga[8]&&(a.ga[8]=1,a.ga[9]=(a.ga[9]+1)%100))}a.ga[12]|=16;a.ga[11]&16&&(a.ga[12]|=128,Wi(a,8))}a.ci=d-e%c}}f.pq=function(a,b){var c=this.Ki;if(this.xh&16)if(this.Tc&128)c=this.Sd;else if(this.Ka){var c=this.Ka,d=0;c.dc.length&&(d=c.dc[0]);c.qa()&&c.$a("scan code "+k(d)+" delivered");c=d}m(this,a,null,b,"PPI_A",c);return c};
f.Tr=function(a,b,c){m(this,a,b,c,"PPI_A");this.Ki=b};f.qq=function(a,b){var c=this.Tc;m(this,a,null,b,"PPI_B",c);return c};f.Ur=function(a,b,c){m(this,a,b,c,"PPI_B");bj(this,b);this.Ka&&cj(this.Ka,b&128?!1:!0,b&64?!0:!1)};function bj(a,b){var c=!!(b&2),d=!!(a.Tc&2);a.Tc=b;c!=d&&kd(a,c)}f.rq=function(a,b){var c=0,c=this.la==Th?this.Tc&4?c|this.dg&15:c|this.dg>>4&1:this.Tc&8?c|this.Sd>>4:c|this.Sd&15;this.Tc&1&&hi(this,2).be&&(c=this.Tc&2?c|32:c|16);m(this,a,null,b,"PPI_C",c,32896);return c};
f.Vr=function(a,b,c){m(this,a,b,c,"PPI_C");this.Pk=b};f.sq=function(a,b){var c=this.xh;m(this,a,null,b,"PPI_CTRL",c);return c};f.Wr=function(a,b,c){m(this,a,b,c,"PPI_CTRL");this.xh=b};f.Fp=function(a,b){var c=this.Ei;m(this,a,null,b,"8042_OUTBUFF",c,16384);this.jb&=-258;this.Ka&&dj(this.Ka);return c};
f.gr=function(a,b,c){m(this,a,b,c,"8042_INBUF.DATA",null,16384);if(this.jb&8)switch(this.me){case 96:ej(this,b);break;case 209:fj(this,b);break;default:if(ej(this,this.Ud&-17),this.Ka){a=-1;switch(b){case 255:a=250,gj(this.Ka)}hj(this,a)}}this.me=b;this.jb&=-9};f.Gp=function(a,b){var c=this.Tc&-209|(cd(this.O)&64?16:0);m(this,a,null,b,"8042_RWREG",c,16384);return c};f.hr=function(a,b,c){m(this,a,b,c,"8042_RWREG",null,16384);bj(this,b)};
f.Hp=function(a,b){m(this,a,null,b,"8042_STATUS",this.jb,16384);var c=this.jb&255;this.jb&256&&(this.jb|=1,this.jb&=-257);return c};
f.fr=function(a,b,c){m(this,a,b,c,"8042_INBUFF.CMD",null,16384);this.me=b;this.jb|=8;a=0;240<=this.me&&(a=this.me^15,this.me=240);switch(this.me){case 32:hj(this,this.Ud);break;case 173:ej(this,this.Ud|16);break;case 174:ej(this,this.Ud&-17);this.Ka&&dj(this.Ka);break;case 170:this.Ka&&(a=this.Ka,a.dc=[],a.qa()&&a.$a("scan codes flushed"));ej(this,this.Ud|16);hj(this,85);fj(this,3);break;case 171:hj(this,0);break;case 192:hj(this,this.ne);break;case 208:hj(this,this.Fi);break;case 224:hj(this,this.Ud&
16?0:1);break;case 240:a&1&&le(this.O)}};function ej(a,b){a.Ud=b;a.jb=a.jb&-5|b&4;a.Ka&&cj(a.Ka,!!(b&8),!(b&16))}function hj(a,b,c){0<=b&&(a.Ei=b,c?a.jb|=1:(a.jb&=-2,a.jb|=256))}function fj(a,b){a.Fi=b;dc(a.ma,!!(b&2));b&1||le(a.O)}function ij(a,b){a.la<Yh?Wi(a,1,4):a.Ud&16||a.jb&257||(hj(a,b,!0),jj(a.Ka),Wi(a,1,120))}f.Vp=function(a,b){m(this,a,null,b,"CMOS.ADDR",this.Bf,4096);return this.Bf};f.vr=function(a,b,c){m(this,a,b,c,"CMOS.ADDR",null,4096);this.Bf=b;this.Ji=b&128?0:128};
f.Wp=function(a,b){var c=this.Bf&63,d=13>=c?ii(this,c):this.ga[c];this.qa(4352)&&m(this,a,null,b,"CMOS.DATA["+k(c)+"]",d,!0);null!=b&&12==c&&(this.ga[c]&=15,d&128&&Xi(this,8),d&64&&this.ga[11]&64&&si(this));return d};
f.wr=function(a,b,c){var d=this.Bf&63;this.qa(4352)&&m(this,a,b,c,"CMOS.DATA["+k(d)+"]",null,!0);a=b^this.ga[d];if(13>=d){if(c=b,10>d){var e=!1;this.ga[11]&4||(c=10*(c>>4)+(c&15),e=!0);if(4==d||5==d)e&&23<c&&(c+=48),this.ga[11]&2||(12>=c?c=12==c?0:c:(c-=116,c=24==c?12:c))}}else c=b;this.ga[d]=c;11==d&&a&64&&b&64&&si(this)};f.Rr=function(a,b,c){m(this,a,b,c,"NMI");this.Ji=b};f.xr=function(a,b,c){m(this,a,b,c,"COPROC.CLEAR")};f.yr=function(a,b,c){m(this,a,b,c,"COPROC.RESET")};
f.Gq=function(a){if(this.qa(8192)&&De(this.Y,26,a)){var b=this.O.F>>8;Ee(this.O,a,function(a,d){return function(e){d=cd(a.O)-d;var g,l=a.O.H&255,p=a.O.H>>8,w=a.O.H&255,v=a.O.H>>8;if(2==b||3==b)g=" CH(hour)="+ha(p)+" CL(min)="+k(l)+" DH(sec)="+k(v);else if(4==b||5==b)g=" CX(year)="+ha(a.O.G)+" DH(month)="+k(v)+" DL(day)="+k(w);Fe(a.Y,26,e,d,g)}}(this,cd(this.O)))}return!0};function Uh(a,b){if(void 0===a)return b;for(var c=0,d=1,e=0;e<a.length;e++)"0"==a.charAt(e)&&(c|=d),d<<=1;return c}
function kd(a,b){if(a.Eh)try{void 0!==b?a.Rn=b:b=a.Rn&&a.O&&a.O.fa.qb;var c=Math.round(1193181/aj(a,2));if(20>c||2E4<c)b=!1;b?a.wc?(a.wc.frequency.value=c,a.qa(8388608)&&a.$a("speaker set to "+c+"hz",!0)):(a.wc=a.Eh.createOscillator(),a.wc&&(a.wc.type="number"==typeof a.wc.type?1:"square",a.wc.connect(a.Eh.destination),a.wc.frequency.value=c,"start"in a.wc?a.wc.start(0):a.wc.noteOn(0),a.qa(8388608)&&a.$a("speaker on at "+c+"hz",!0))):a.wc&&("stop"in a.wc?a.wc.stop(0):a.wc.noteOff(0),a.wc.disconnect(),
delete a.wc,a.qa(8388608)&&a.$a("speaker off at "+c+"hz",!0))}catch(d){a.Da("AudioContext exception: "+d.message),a.Eh=null}else b&&a.$a("BEEP",8388608)}
var ai={0:function(a,b){return Bi(this,0,0,a,b)},1:function(a,b){return Di(this,0,0,a,b)},2:function(a,b){return Bi(this,0,1,a,b)},3:function(a,b){return Di(this,0,1,a,b)},4:function(a,b){return Bi(this,0,2,a,b)},5:function(a,b){return Di(this,0,2,a,b)},6:function(a,b){return Bi(this,0,3,a,b)},7:function(a,b){return Di(this,0,3,a,b)},8:function(a,b){return Fi(this,0,a,b)},32:function(a,b){return Ri(this,0,b)},33:function(a,b){return Ui(this,0,b)},64:function(a,b){return Yi(this,0,a,b)},65:function(a,
b){return Yi(this,1,a,b)},66:function(a,b){return Yi(this,2,a,b)},67:Rh.prototype.oq,129:function(a,b){return Li(this,0,2,a,b)},130:function(a,b){return Li(this,0,3,a,b)},131:function(a,b){return Li(this,0,1,a,b)},135:function(a,b){return Li(this,0,0,a,b)}},ci={96:Rh.prototype.pq,97:Rh.prototype.qq,98:Rh.prototype.rq,99:Rh.prototype.sq},ei={96:Rh.prototype.Fp,97:Rh.prototype.Gp,100:Rh.prototype.Hp,112:Rh.prototype.Vp,113:Rh.prototype.Wp,128:function(a,b){return Ni(this,7,a,b)},132:function(a,b){return Ni(this,
0,a,b)},133:function(a,b){return Ni(this,1,a,b)},134:function(a,b){return Ni(this,2,a,b)},136:function(a,b){return Ni(this,3,a,b)},137:function(a,b){return Li(this,1,2,a,b)},138:function(a,b){return Li(this,1,3,a,b)},139:function(a,b){return Li(this,1,1,a,b)},140:function(a,b){return Ni(this,4,a,b)},141:function(a,b){return Ni(this,5,a,b)},142:function(a,b){return Ni(this,6,a,b)},143:function(a,b){return Li(this,1,0,a,b)},160:function(a,b){return Ri(this,1,b)},161:function(a,b){return Ui(this,1,b)},
192:function(a,b){return Bi(this,1,0,a,b)},194:function(a,b){return Di(this,1,0,a,b)},196:function(a,b){return Bi(this,1,1,a,b)},198:function(a,b){return Di(this,1,1,a,b)},200:function(a,b){return Bi(this,1,2,a,b)},202:function(a,b){return Di(this,1,2,a,b)},204:function(a,b){return Bi(this,1,3,a,b)},206:function(a,b){return Di(this,1,3,a,b)},208:function(a,b){return Fi(this,1,a,b)}},bi={0:function(a,b,c){Ci(this,0,0,a,b,c)},1:function(a,b,c){Ei(this,0,0,a,b,c)},2:function(a,b,c){Ci(this,0,1,a,b,c)},
3:function(a,b,c){Ei(this,0,1,a,b,c)},4:function(a,b,c){Ci(this,0,2,a,b,c)},5:function(a,b,c){Ei(this,0,2,a,b,c)},6:function(a,b,c){Ci(this,0,3,a,b,c)},7:function(a,b,c){Ei(this,0,3,a,b,c)},8:function(a,b,c){this.qa(768)&&m(this,a,b,c,"DMA0.CMD",null,!0);this.ub[0].Mk=b},9:function(a,b,c){Gi(this,0,a,b,c)},10:function(a,b,c){Hi(this,0,a,b,c)},11:function(a,b,c){Ji(this,0,a,b,c)},12:function(a,b,c){this.qa(768)&&m(this,a,b,c,"DMA0.RESET_FF",null,!0);this.ub[0].vb=0},13:function(a,b,c){Ki(this,0,a,
b,c)},32:function(a,b,c){Si(this,0,b,c)},33:function(a,b,c){Vi(this,0,b,c)},64:function(a,b,c){$i(this,0,a,b,c)},65:function(a,b,c){$i(this,1,a,b,c)},66:function(a,b,c){$i(this,2,a,b,c)},67:Rh.prototype.Sr,129:function(a,b,c){Mi(this,0,2,a,b,c)},130:function(a,b,c){Mi(this,0,3,a,b,c)},131:function(a,b,c){Mi(this,0,1,a,b,c)},135:function(a,b,c){Mi(this,0,0,a,b,c)}},di={96:Rh.prototype.Tr,97:Rh.prototype.Ur,98:Rh.prototype.Vr,99:Rh.prototype.Wr,160:Rh.prototype.Rr},fi={96:Rh.prototype.gr,97:Rh.prototype.hr,
100:Rh.prototype.fr,112:Rh.prototype.vr,113:Rh.prototype.wr,128:function(a,b,c){Oi(this,7,a,b,c)},132:function(a,b,c){Oi(this,0,a,b,c)},133:function(a,b,c){Oi(this,1,a,b,c)},134:function(a,b,c){Oi(this,2,a,b,c)},136:function(a,b,c){Oi(this,3,a,b,c)},137:function(a,b,c){Mi(this,1,2,a,b,c)},138:function(a,b,c){Mi(this,1,3,a,b,c)},139:function(a,b,c){Mi(this,1,1,a,b,c)},140:function(a,b,c){Oi(this,4,a,b,c)},141:function(a,b,c){Oi(this,5,a,b,c)},142:function(a,b,c){Oi(this,6,a,b,c)},143:function(a,b,
c){Mi(this,1,0,a,b,c)},160:function(a,b,c){Si(this,1,b,c)},161:function(a,b,c){Vi(this,1,b,c)},192:function(a,b,c){Ci(this,1,0,a,b,c)},194:function(a,b,c){Ei(this,1,0,a,b,c)},196:function(a,b,c){Ci(this,1,1,a,b,c)},198:function(a,b,c){Ei(this,1,1,a,b,c)},200:function(a,b,c){Ci(this,1,2,a,b,c)},202:function(a,b,c){Ei(this,1,2,a,b,c)},204:function(a,b,c){Ci(this,1,3,a,b,c)},206:function(a,b,c){Ei(this,1,3,a,b,c)},208:function(a,b,c){this.qa(768)&&m(this,a,b,c,"DMA1.CMD",null,!0);this.ub[1].Mk=b},210:function(a,
b,c){Gi(this,1,a,b,c)},212:function(a,b,c){Hi(this,1,a,b,c)},214:function(a,b,c){Ji(this,1,a,b,c)},216:function(a,b,c){this.qa(768)&&m(this,a,b,c,"DMA1.RESET_FF",null,!0);this.ub[1].vb=0},218:function(a,b,c){Ki(this,1,a,b,c)},240:Rh.prototype.xr,241:Rh.prototype.yr};Qa(function(){for(var a=lb(window.document,"pcjs","chipset"),b=0;b<a.length;b++){var c=a[b],d=jb(c),d=new Rh(d);kb(d,c);ji(d)}});
function kj(a){Wa.call(this,"ROM",a,kj);this.Ob=null;this.Gk=a.addr;this.hh=a.size;this.th=a.alias;this.mi=a.file;this.Cs=ia(this.mi);this.hf=a.notify;this.en=null;if(this.hf&&(a=this.hf.indexOf("["),0<a)){try{this.en=eval(this.hf.substr(a))}catch(b){}this.hf=this.hf.substr(0,a)}if(this.mi){a=this.mi;var c=ja(this.Cs);"json"!=c&&"hex"!=c&&(a=Aa()+"/api/v1/dump?file="+this.mi+"&format=bytes&decimal=true");za(a,!0,null,this,kj.prototype.br)}}fb(kj);
kj.prototype.Ic=function(a,b,c,d){this.ma=b;this.O=c;this.Y=d;lj(this)};kj.prototype.kc=function(){this.Fk&&(this.Y&&mj(this.Y,this.Gk,this.hh,this.Fk),delete this.Fk);return!0};kj.prototype.jc=function(){return!0};
kj.prototype.br=function(a,b,c){if(c)this.Da("Unable to load system ROM (error "+c+")");else{if("["==b.charAt(0)||"{"==b.charAt(0))try{var d=eval("("+b+")"),e=d.bytes,g=d.data;if(e)this.Ob=e;else if(g)for(this.Ob=Array(4*g.length),c=b=0;b<g.length;b++)this.Ob[c++]=g[b]&255,this.Ob[c++]=g[b]>>8&255,this.Ob[c++]=g[b]>>16&255,this.Ob[c++]=g[b]>>24&255;else this.Ob=d;this.Fk=d.symbols;if(!this.Ob.length){Ca("Empty ROM: "+a);return}if(1==this.Ob.length){Ca(this.Ob[0]);return}}catch(l){this.Da("ROM data error: "+
l.message);return}else for(a=b.replace(/\n/gm," ").replace(/ +$/,"").split(" "),this.Ob=Array(a.length),d=0;d<a.length;d++)this.Ob[d]=ga(a[d],16);lj(this)}};
function lj(a){if(!qb(a))if(!a.mi)pb(a);else if(a.Ob&&a.ma){if(a.Ob.length!=a.hh)sb(a,"ROM size (0x"+h(a.Ob.length)+") does not match specified size ("+("0x"+h(a.hh))+")");else{var b;b=a.Gk;if(ec(a.ma,b,a.hh,Ac)){for(var c=0;c<a.Ob.length;c++){var d=a.ma,e=b+c;d.na[(e&d.Cb)>>>d.Ca].qi(e&d.Ga,a.Ob[c]&255,e)}b=!0}else b=!1;if(b){b=[];"number"==typeof a.th?b.push(a.th):null!=a.th&&a.th.length&&(b=a.th);for(c=0;c<b.length;c++){var d=a,e=b[c],g=ic(d.ma,d.Gk,d.hh);hc(d.ma,e,d.hh,g)}a.hf&&((b=hb(a.hf,a.id))?
(c=a.Ob,d=a.en,5==b.nb?nj(b,c,d||[12640,8752],8):7==b.nb&&nj(b,c,d||[14221,16269],8),pb(b)):a.Da("Unable to find component: "+a.hf));delete a.Ob}}pb(a)}}Qa(function(){for(var a=lb(window.document,"pcjs","rom"),b=0;b<a.length;b++){var c=a[b],d=jb(c),d=new kj(d);kb(d,c)}});function oj(a){Wa.call(this,"RAM",a,oj);this.Ai=a.addr;this.Ie=a.size;this.yp=a.test;this.up=!!this.Ie;this.Vi=!1}fb(oj);oj.prototype.Ic=function(a,b,c,d){this.ma=b;this.O=c;this.Y=d;this.ja=yb(a,"ChipSet");pb(this)};
oj.prototype.kc=function(a,b){b||this.reset();return!0};oj.prototype.jc=function(){return!0};
oj.prototype.reset=function(){if(!this.Ai&&!this.up&&this.ja){var a=1024*ni(this.ja);this.Ie&&a!=this.Ie&&(jc(this.ma,this.Ai,this.Ie),this.Vi=!1);this.Ie=a}!this.Vi&&this.Ie&&ec(this.ma,this.Ai,this.Ie,1)&&(this.Vi=!0,this.status(Math.floor(this.Ie/1024)+"Kb allocated"),"ramCPQ"==this.Jg&&(this.Z=new pj(this),ec(this.ma,qj,1,4,this.Z)));if(this.Vi){if(this.yp||lc(this.ma,1138,4660),"ramCPQ"!=this.Jg&&this.ja&&(a=this.ja,a.ga)){var b=1048576>this.Ai?21:23,c=a.ga[b]|a.ga[b+1]<<8,c=c+(this.Ie>>10);
a.ga[b]=c&255;a.ga[b+1]=c>>8;ri(a)}}else Ca("No RAM allocated")};function pj(a){this.hs=a;this.Wm=rj;this.Ro=sj;this.yk=tj;this.nh=null}
var qj=-2134900736,rj=65535,sj=2575,tj=2,uj=[null,0],vj=[function(a){var b=255;2>a?b=a&1?this.Z.Ro>>8:this.Z.Ro&255:4>a&&(b=a&1?this.Z.yk>>8:this.Z.yk&255);return b},null,null,function(a,b){var c=this.Z;if(a)2==a&&(c.yk=c.yk&-256|b);else if(b!=(c.Wm&255)){var d=c.hs.ma;if(b&1)c.nh&&(hc(d,917504,131072,c.nh),c.nh=null);else{c.nh||(c.nh=ic(d,917504,131072));var e=ic(d,16646144,131072);hc(d,917504,131072,e,b&2?1:Ac)}c.Wm=c.Wm&-256|b}},null,null];pj.prototype.Wn=function(){return uj};
pj.prototype.pl=function(){return vj};Qa(function(){for(var a=lb(window.document,"pcjs","ram"),b=0;b<a.length;b++){var c=a[b],d=jb(c),d=new oj(d);kb(d,c)}});function wj(a){Wa.call(this,"Keyboard",a,wj,65536);this.Pn=Ja("Mobi");this.vp=Ja("MSIE");this.$a("mobile keyboard support: "+(this.Pn?"true":"false"));this.yn=0;this.Zi=!0;this.ml=this.gl=!1;this.Ub=[];this.Oq=500;this.Pq=100;this.Nq=50;this.Jn=!1;pb(this)}fb(wj);
var W={dt:1,et:3,ft:26," ":32,"!":33,'"':34,"#":35,$:36,"%":37,"&":38,"'":39,"(":40,")":41,"*":42,"+":43,",":44,"-":45,".":46,"/":47,0:48,1:49,2:50,3:51,4:52,5:53,6:54,7:55,8:56,9:57,":":58,";":59,"<":60,"=":61,">":62,"?":63,"@":64,at:65,bt:66,an:67,Wo:68,E:69,it:70,lt:71,bn:72,nt:73,ot:74,pt:75,qt:76,rt:77,Ak:78,tt:79,ut:80,wt:81,dn:82,At:83,Kt:84,Ot:85,Pt:86,Qt:87,St:88,Tt:89,Ut:90,"[":91,"\\":92,"]":93,"^":94,_:95,"`":96,Vt:97,Wt:98,Zt:99,fu:100,gu:101,hu:102,ju:103,ku:104,lu:105,mu:106,nu:107,
ou:108,pu:109,qu:110,su:111,tu:112,uu:113,vu:114,wu:115,xu:116,yu:117,zu:118,Au:119,x:120,y:121,z:122,"{":123,"|":124,"}":125,"~":126},xj={};xj[186]=W[";"];xj[187]=W["="];xj[188]=W[","];xj[189]=W["-"];xj[190]=W["."];xj[191]=W["/"];xj[192]=W["`"];xj[219]=W["["];xj[220]=W["\\"];xj[221]=W["]"];xj[222]=W["'"];xj[173]=W["-"];var yj={};yj[W["1"]]=W["!"];yj[W["2"]]=W["@"];yj[W["3"]]=W["#"];yj[W["4"]]=W.$;yj[W["5"]]=W["%"];yj[W["6"]]=W["^"];yj[W["7"]]=W["&"];yj[W["8"]]=W["*"];yj[W["9"]]=W["("];
yj[W["0"]]=W[")"];yj[186]=W[":"];yj[187]=W["+"];yj[188]=W["<"];yj[189]=W._;yj[190]=W[">"];yj[191]=W["?"];yj[192]=W["~"];yj[219]=W["{"];yj[220]=W["|"];yj[221]=W["}"];yj[222]=W['"'];yj[173]=W._;yj[61]=W["+"];yj[59]=W[":"];
var zj={3016:1,1016:2,1017:8,1018:32,1091:128,1093:64,1224:128,1020:512,1144:1024,1145:2048},Aj={TAB:1009,ESC:1027,F1:1112,F2:1113,F3:1114,F4:1115,F5:1116,F6:1117,F7:1118,F8:1119,F9:1120,F10:1121,LEFT:1037,UP:1038,RIGHT:1039,DOWN:1040,CTRL_C:4003,CTRL_BREAK:4008,CTRL_ALT_DEL:4046},Bj={esc:1027,1:W["1"],2:W["2"],3:W["3"],4:W["4"],5:W["5"],6:W["6"],7:W["7"],8:W["8"],9:W["9"],0:W["0"],"-":W["-"],"=":W["="],bs:1008,tab:1009,q:81,w:87,e:69,r:82,t:84,y:89,u:85,i:73,o:79,p:80,"[":W["["],"]":W["]"],enter:13,
ctrl:1017,a:65,s:83,d:68,f:70,g:71,h:72,j:74,k:75,l:76,";":W[";"],quote:W["'"],"`":W["`"],shift:1016,"\\":W["\\"],z:90,x:88,c:67,v:86,b:66,n:78,m:77,",":W[","],".":W["."],"/":W["/"],"right-shift":3016,prtsc:1044,alt:1018,space:W[" "],"caps-lock":1020,f1:1112,f2:1113,f3:1114,f4:1115,f5:1116,f6:1117,f7:1118,f8:1119,f9:1120,f10:1121,"num-lock":1144,"scroll-lock":1145,"num-home":1036,"num-up":1038,"num-pgup":1033,"num-sub":1109,"num-left":1037,"num-center":1101,"num-right":1039,"num-add":1107,"num-end":1035,
"num-down":1040,"num-pgdn":1034,"num-ins":1045,"num-del":1046},Ij={"caps-lock":512,"num-lock":1024,"scroll-lock":2048},Y={1027:1};Y[W["1"]]=2;Y[W["!"]]=10754;Y[W["2"]]=3;Y[W["@"]]=10755;Y[W["3"]]=4;Y[W["#"]]=10756;Y[W["4"]]=5;Y[W.$]=10757;Y[W["5"]]=6;Y[W["%"]]=10758;Y[W["6"]]=7;Y[W["^"]]=10759;Y[W["7"]]=8;Y[W["&"]]=10760;Y[W["8"]]=9;Y[W["*"]]=10761;Y[W["9"]]=10;Y[W["("]]=10762;Y[W["0"]]=11;Y[W[")"]]=10763;Y[W["-"]]=12;Y[W._]=10764;Y[W["="]]=13;Y[W["+"]]=10765;Y[1008]=14;Y[1009]=15;Y[113]=16;
Y[81]=10768;Y[119]=17;Y[87]=10769;Y[101]=18;Y[69]=10770;Y[114]=19;Y[82]=10771;Y[116]=20;Y[84]=10772;Y[121]=21;Y[89]=10773;Y[117]=22;Y[85]=10774;Y[105]=23;Y[73]=10775;Y[111]=24;Y[79]=10776;Y[112]=25;Y[80]=10777;Y[W["["]]=26;Y[W["{"]]=10778;Y[W["]"]]=27;Y[W["}"]]=10779;Y[13]=28;Y[1017]=29;Y[97]=30;Y[65]=10782;Y[115]=31;Y[83]=10783;Y[100]=32;Y[68]=10784;Y[102]=33;Y[70]=10785;Y[103]=34;Y[71]=10786;Y[104]=35;Y[72]=10787;Y[106]=36;Y[74]=10788;Y[107]=37;Y[75]=10789;Y[108]=38;Y[76]=10790;Y[W[";"]]=39;
Y[W[":"]]=10791;Y[W["'"]]=40;Y[W['"']]=10792;Y[W["`"]]=41;Y[W["~"]]=10793;Y[1016]=42;Y[W["\\"]]=43;Y[W["|"]]=10795;Y[122]=44;Y[90]=10796;Y[120]=45;Y[88]=10797;Y[99]=46;Y[67]=10798;Y[118]=47;Y[86]=10799;Y[98]=48;Y[66]=10800;Y[110]=49;Y[78]=10801;Y[109]=50;Y[77]=10802;Y[W[","]]=51;Y[W["<"]]=10803;Y[W["."]]=52;Y[W[">"]]=10804;Y[W["/"]]=53;Y[W["?"]]=10805;Y[3016]=54;Y[1044]=55;Y[1018]=56;Y[W[" "]]=57;Y[1020]=58;Y[1112]=59;Y[1113]=60;Y[1114]=61;Y[1115]=62;Y[1116]=63;Y[1117]=64;Y[1118]=65;Y[1119]=66;
Y[1120]=67;Y[1121]=68;Y[1144]=69;Y[1145]=70;Y[1036]=71;Y[1038]=72;Y[1033]=73;Y[1109]=74;Y[1037]=75;Y[1101]=76;Y[1039]=77;Y[1107]=78;Y[1035]=79;Y[1040]=80;Y[1034]=81;Y[1045]=82;Y[1046]=83;Y[1122]=87;Y[1123]=88;Y[1091]=91;Y[1093]=93;Y[1224]=91;Y[4003]=7470;Y[4008]=7494;Y[4046]=3677523;f=wj.prototype;
f.Lb=function(a,b,c){var d=this,e=a+"-"+b;if(void 0===this.va[e])switch(b){case "kbd":return c.onkeydown=function(a){return Jj(d,a,!0)},c.onkeypress=function(a){a=a||window.event;a=a.which||a.keyCode;if(d.Jn){var b=d.Ub.length?d.Ub[0].vf:0;b&&(65<=b&&90>=b||97<=b&&122>=b)&&(65<=a&&90>=a||97<=a&&122>=a)&&b!=a&&(d.ml=!0,a=b)}(b=!Y[a]||!!(d.fc&128))||Kj(d,a,!0);return b},c.onkeyup=function(a){return Jj(d,a,!1)},!0;case "caps-lock":return this.va[e]=c,c.onclick=function(){d.O&&d.O.dd();Kj(d,1020,!0)},
!0;case "num-lock":return this.va[e]=c,c.onclick=function(){d.O&&d.O.dd();Kj(d,1144,!0)},!0;case "scroll-lock":return this.va[e]=c,c.onclick=function(){d.O&&d.O.dd();Kj(d,1145,!0)},!0;default:var g=b.toUpperCase().replace(/-/g,"_");if(void 0!==Aj[g]&&"button"==a)return this.va[e]=c,c.onclick=function(a,b,c){return function(){a.O&&a.O.dd();Lj(a,c,!0);Kj(a,c,!0)}}(this,g,Aj[g]),!0;if(void 0!==Bj[b])return this.yn++,this.va[e]=c,a=function(a,b,c){return function(){Kj(a,c)}}(this,b,Bj[b]),b=function(a,
b,c){return function(){Mj(a,c)}}(this,b,Bj[b]),"ontouchstart"in window?(c.ontouchstart=a,c.ontouchend=b):(c.onmousedown=a,c.onmouseup=c.onmouseout=b),!0}return!1};function Nj(a,b,c){if(a.yn){for(var d in yj)if(b==yj[d]){b=+d;(d=xj[d])&&(b=d);break}for(var e in Bj)if((d=Bj[e]==b)||(d=b,97<=d&&122>=d&&(d-=32),d=Bj[e]==d),d){(a=a.va["key-"+e])&&void 0!==c&&(a.style.color=c?"#ffffff":"#000000",a.style.backgroundColor=c?"#000000":"#ffffff");break}}}
f.Ic=function(a,b,c,d){this.ma=b;this.O=c;this.Y=d;this.ja=yb(a,"ChipSet")};function gj(a,b){a.$a("keyboard reset",65792);a.dc=[170];a.Kh=!0;b&&a.ja&&ij(a.ja,a.dc[0])}function cj(a,b,c){a.fl!==c&&(a.fl=a.kl=c)&&(a.Kh=!0);a.Yi!==b&&(a.Yi=b)&&!a.kl&&jj(a,!0);a.Yi&&a.kl&&(gj(a,!0),a.kl=!1)}function dj(a){var b=0;a.dc.length&&a.Kh&&(b=a.dc[0],a.ja&&ij(a.ja,b));a.qa()&&a.$a("scan code "+k(b)+" available")}
function jj(a,b){0<a.dc.length&&(a.dc.shift(),(a.Kh=b)&&(a.dc.length&&a.ja?ij(a.ja,a.dc[0]):b=!1),a.qa()&&a.$a("scan codes shifted, notify "+(b?"true":"false")))}f.kc=function(a,b){return!b&&(this.reset(),a&&this.restore&&!this.restore(a))?!1:!0};f.jc=function(a){return a&&this.save?this.save():!0};f.reset=function(){this.jf();this.fc=this.Xd=0;this.dc=[];this.Kh=!0};f.save=function(){var a=new Ie(this);a.set(0,this.Vm());return a.data()};f.restore=function(a){return this.jf(a[0])};
f.jf=function(a){var b=0;void 0===a&&(a=[]);this.fl=this.Kh=a[b++];this.Yi=a[b];return!0};f.Vm=function(){var a=0,b=[];b[a++]=this.fl;b[a]=this.Yi;return b};
function Lj(a,b,c,d){if(Y[b]){var e=Math.floor(b/1E3)&2;if(b=zj[b]||0){!e||b&85||(b>>=1);if(b&3584){if(!1===d)return!0;d=null}null==d?d=!((c?a.Xd:a.fc)&b):d||b&255&&(b=255);if(c){a.Xd&=~b;d&&(a.Xd|=b);c=b;var g,l;for(l in Ij)d="led-"+l,e=Ij[l],c&&c!=e||!(g=a.va[d])||(g.style.backgroundColor=a.Xd&e?"#00ff00":"#000000")}else a.fc&=~b,d&&(a.fc|=b);return!0}}return!1}
function Kj(a,b,c){if(Y[b]&&a.O&&a.O.fa.qb){zj[b]&&a.Ub.length&&0<a.Ub[0].ge&&(a.Ub[0].ge=0);for(var d,e=0;e<a.Ub.length;e++)if(d=a.Ub[e],d.vf==b){if(!c||0<=d.ge){e=-1;break}0<e&&(0<a.Ub[0].ge&&(a.Ub[0].ge=0),a.Ub.splice(e,1));break}0>e||(e==a.Ub.length&&(d={},d.vf=b,d.fc=a.fc,Nj(a,b,!0),e++),0<e&&a.Ub.splice(0,0,d),d.Mh=!0,d.ge=c?-1:zj[b]?0:1,Oj(a,d))}}
function Mj(a,b,c){if(!Y[b]||!(c||a.O&&a.O.fa.qb))return!1;for(var d=!1,e=0;e<a.Ub.length;e++){var g=a.Ub[e];if(g.vf==b||g.vf==yj[b]){a.Ub.splice(e,1);g.Po&&clearTimeout(g.Po);g.Mh&&!c&&Pj(a,g.vf,!1);Nj(a,b,!1);d=!0;break}}!a.Ub.length&&a.ml&&(Lj(a,1020),a.ml=!1);return d}
function Oj(a,b){if(a.O&&a.O.fa.qb){if(Pj(a,b.vf,b.Mh),b.ge){var c;if(0>b.ge){if(!b.Mh){Mj(a,b.vf);return}b.Mh=!1;c=a.Nq}else c=1==b.ge++?a.Oq:a.Pq;b.Po=setTimeout(function(a){return function(){Oj(a,b)}}(a),c)}}else Mj(a,b.vf,!0)}function Qj(a,b,c){var d=b;if(65<=b&&90>=b)!(a.fc&515)==c&&(d=b+32);else if(97<=b&&122>=b)!!(a.fc&515)==c&&(d=b-32);else if(!!(a.fc&3)==c){if(a=yj[b])d=a}else if(a=xj[b])d=a;return d}f.fk=function(a){this.Zi=a;a||(this.fc&=-256)};
function Jj(a,b,c){var d=!0,e=!1,g=!1,l=b.keyCode,p=Qj(a,l,!0);a.gl&&p==W["`"]&&(l=p=27);if(Y[l+1E3])if(p+=1E3,2==b.location&&(p+=2E3),Lj(a,p,!1,c)){if(20==l||144==l||145==l)a.vp||(c=e=!0);if(!(c||91!=l&&93!=l))for(var w=0;w<a.Ub.length;w++){var v=a.Ub[w];v.Mh=!1;0<v.ge&&(v.ge=0)}}else 8==l&&8==(a.fc&40)&&(p=4008),d=!1;else if(Y[p]&&a.fc&60&&(d=!1),!a.Jn&&d&&c||a.fc&192)g=!0;d||b.preventDefault();g||a.Pn&&d||(c?Kj(a,p,e):Mj(a,p)||(b=Qj(a,l,!1),b!=p&&Mj(a,b)));return d}
function Pj(a,b,c){Lj(a,b,!0,c);var d=Y[b]||Y[b+1E3];if(void 0!==d){14==d&&40==(a.fc&40)&&(d=83);var e=[],g=d&255;e.push(g|(c?0:128));for(b=65<=b&&90>=b||97<=b&&122>=b;d>>>=8;){var l=0,p=d&255;224==g||225==g?e.push(g|(c?0:128)):(42==p?a.Xd&3||a.Xd&512&&b||(l=p):29==p?a.Xd&12||(l=p):56==p?a.Xd&48||(l=p):e.push(g|(c?0:128)),l&&(c?e.unshift(l):e.push(l|128)))}for(c=0;c<e.length;c++)d=a,g=e[c],d.dc&&(20>d.dc.length?(d.qa()&&d.$a("scan code "+k(g)+" buffered"),d.dc.push(g),1==d.dc.length&&d.ja&&ij(d.ja,
g)):(20==d.dc.length&&d.dc.push(255),d.$a("scan code buffer overflow")))}}Qa(function(){for(var a=lb(window.document,"pcjs","keyboard"),b=0;b<a.length;b++){var c=a[b],d=jb(c),d=new wj(d);kb(d,c)}});
function Z(a,b,c,d,e){Wa.call(this,"Video",a,Z,262144);this.la=a.model;this.nb=Rj[this.la]||Sj;this.Yd=a.memory||0;this.Lo=a.switches;this.Od=a.mode;if(void 0===this.Od||void 0===Tj[this.Od])this.Od=Uj;this.kj=a.charCols;this.Bl=a.charRows;if(void 0===this.kj||void 0===this.Bl)this.kj=Tj[this.Od][0],this.Bl=Tj[this.Od][1];this.re=a.screenWidth;this.df=a.screenHeight;this.xp=a.scale;this.tp=12<=Math.round(this.re/this.kj);this.zp=a.touchScreen;this.Ch=b;this.ld=c;this.Za=(this.Hs=d)||b||null;this.lf=
null;this.sp=a.autoLock;this.Ya=this.bc=0;this.Re=[];this.le=Array(16);this.Zi=!1;var g=this;if(this.Jd=e)this.Jd.vg=e.requestFullscreen||e.msRequestFullscreen||e.mozRequestFullScreen||e.webkitRequestFullscreen,this.Jd.vg&&(b=function(){var a=document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement?!0:!1;g.$a("notifyFullScreen("+a+")",!0);g.Ka&&(g.Ka.gl=a)},"onfullscreenchange"in document?document.addEventListener("fullscreenchange",
b,!1):"onmozfullscreenchange"in document?document.addEventListener("mozfullscreenchange",b,!1):"onwebkitfullscreenchange"in document?document.addEventListener("webkitfullscreenchange",b,!1):"onmsfullscreenchange"in document&&document.addEventListener("msfullscreenchange",b,!1));this.Za&&(this.Za.onfocus=function(){return g.fk(!0)},this.Za.onblur=function(){return g.fk(!1)},this.Za.Qf=this.Za.requestPointerLock||this.Za.mozRequestPointerLock||this.Za.webkitRequestPointerLock,this.Za.Qo=this.Za.exitPointerLock||
this.Za.mozExitPointerLock||this.Za.webkitExitPointerLock,this.Za.Qf&&(b=function(){g.ei(document.pointerLockElement===g.Za||document.mozPointerLockElement===g.Za||document.webkitPointerLockElement===g.Za)},"onpointerlockchange"in document?document.addEventListener("pointerlockchange",b,!1):"onmozpointerlockchange"in document?document.addEventListener("mozpointerlockchange",b,!1):"onwebkitpointerlockchange"in document&&document.addEventListener("webkitpointerlockchange",b,!1)));if(a=a.fontROM)"json"!=
ja(a)&&(a=Aa()+"/api/v1/dump?file="+a+"&format=bytes"),za(a,!0,null,this,this.cr)}fb(Z);var Sj=1,Rj={mda:1,cga:3,ega:5,vga:7},Uj=7,Vj={2:{oj:15700,nj:208,gk:85,hk:96},3:{oj:18432,nj:364,gk:85,hk:96},4:{oj:21850,nj:364,gk:85,hk:96},7:{oj:16700,nj:480,gk:85,hk:83}},Wj={6:[1,3,!0],7:[2,3,!0],8:[6,3,!0],9:[4,3,!0],10:[3,1,!0],11:[3,2,!0],0:[1,3,!1],1:[2,3,!1],2:[6,3,!1],3:[4,3,!1],4:[3,1,!1],5:[3,2,!1]},Tj=[,[40,25,1,0,3],,[80,25,1,0,3],[320,200,8,192],,[640,200,16,192]];Tj[Uj]=[80,25,1,0,1];
Tj[13]=[320,200,16];Tj[14]=[640,200,16];Tj[15]=[640,350,16];Tj[16]=[640,350,16];Tj[17]=[640,480,16];Tj[18]=[640,480,16];Tj[19]=[320,200,16];Tj[0]=Tj[1];Tj[2]=Tj[3];Tj[5]=Tj[4];var Xj=Array(5);Xj[0]=[0,0,0,255];Xj[1]=[127,192,127,255];Xj[2]=[127,192,127,255];Xj[3]=[127,255,127,255];Xj[4]=[127,255,127,255];var Yj=[0,1,2,2,2,2,2,2,0,3,4,4,4,4,4,4],Zj=Array(16);Zj[0]=[0,0,0,255];Zj[1]=[0,0,170,255];Zj[2]=[0,170,0,255];Zj[3]=[0,170,170,255];Zj[4]=[170,0,0,255];Zj[5]=[170,0,170,255];Zj[6]=[170,85,0,255];
Zj[7]=[170,170,170,255];Zj[8]=[85,85,85,255];Zj[9]=[85,85,255,255];Zj[10]=[85,255,85,255];Zj[11]=[85,255,255,255];Zj[12]=[255,85,85,255];Zj[13]=[255,85,255,255];Zj[14]=[255,255,85,255];Zj[15]=[255,255,255,255];var ak=[2,4,6],bk=[3,5,7],ck=[0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63],dk=[0,255,65280,65535,16711680,16711935,16776960,16777215,-16777216,-16776961,-16711936,-16711681,-65536,-65281,-256,-1],ek=[0];ek[128]=1;ek[32768]=2;ek[32896]=3;ek[8388608]=4;ek[8388736]=5;ek[8421376]=6;ek[8421504]=7;
ek[-2147483648]=8;ek[-2147483520]=9;ek[-2147450880]=10;ek[-2147450752]=11;ek[-2139095040]=12;ek[-2139094912]=13;ek[-2139062272]=14;ek[-2139062144]=15;
function fk(a,b,c,d){if(void 0!==b&&(!c||c.length)){this.video=a;var e=gk[b],g=a.Pd||e[5];if(!c||6>c.length)c=[!1,0,null,null,0,Array(hk)];this.Y=a.Y;this.type=e[0];this.port=e[1];this.nb=b;this.Ya=e[2];this.bc=e[3];this.Yd=d||e[4];65536<=this.Yd&&720896<=this.Ya&&(this.bc=Math.min(this.Yd>>2,32768));this.Xc=c[0];this.bd=c[1];this.Yg=c[2];this.wa=c[3];this.Kc=c[4]&255;this.jk=c[4]>>8&255;this.tc=c[5];this.ul=hk;this.Ci=ik;if(5<=b){this.ul=jk;this.Ci=kk;b=c[6];void 0===b&&(b=[!1,0,Array(20),0,3==g?
0:1,0,0,Array(5),0,0,0,Array(9),0,[this.Ya,this.bc,this.Yd],Array(this.Yd>>2),5144,0,-1,0,-1,0,-1,0,0,0,1,255,0,0,0,Array(256)]);this.ae=b[0];this.Fe=b[1];this.rf=b[2];this.Jk=lk;this.qk=b[3];this.ah=b[4];this.ji=b[5];this.He=b[6];this.dh=b[7];this.Lk=mk;this.Do=b[8];this.Eo=b[9];this.Ge=b[10];this.Xf=b[11];this.Kk=nk;this.xb=b[12];d=b[13];"number"==typeof d&&(d=[this.Ya,this.bc,d]);this.Ya=d[0];this.bc=d[1];d=this.Yd>>2;if((this.Td=b[14])&&this.Td.length<d){for(var e=this.Td,l=0,p=Array(d),w=0;w<
e.length-1;){for(var v=e[w++],E=e[w++];v--;)p[l]=E,l+=2;l==d&&(l=1)}this.Td=p}(d=b[15])&&(d=d&8?d&-9:ok[d&65280]|ok[d&255]);this.wk(d);this.Hm=b[16];this.sb=b[17];this.fe=b[18];this.Bb=b[19];this.ck=b[20];this.pf=b[21];this.Tf=b[22];this.wl=b[23];this.xl=b[24];7==this.nb&&(this.Pm=b[25],this.Mm=b[26],this.ud=b[27],this.uc=b[28],this.mk=b[29],this.ii=b[30])}g=Vj[g]||Vj[3];this.yl=a.O.T.ee/g.oj|0;this.Sq=this.yl*g.gk/100|0;this.oo=this.yl*g.nj;this.Uq=this.oo*g.hk/100|0;this.Dl=null==c[7]?0:c[7]}}
var hk=18,jk=25,ik="HORZ_TOTAL HORZ_DISP HORZ_SYNC_POS HORZ_SYNC_WIDTH VERT_TOTAL VERT_TOTAL_ADJ VERT_DISP VERT_SYNC_POS INTERLACE_POS MAX_SCAN_LINE CURSOR_START CURSOR_END START_ADDR_HI START_ADDR_LO CURSOR_ADDR_HI CURSOR_ADDR_LO LIGHT_PEN_HI LIGHT_PEN_LO".split(" "),kk="HORZ_TOTAL HORZ_DISP_END HORZ_BLANK_START HORZ_BLANK_END HORZ_RETRACE_START HORZ_RETRACE_END VERT_TOTAL OVERFLOW PRESET_ROW_SCAN MAX_SCAN_LINE CURSOR_START CURSOR_END START_ADDR_HI START_ADDR_LO CURSOR_ADDR_HI CURSOR_ADDR_LO VERT_RETRACE_START VERT_RETRACE_END VERT_DISP_END OFFSET UNDERLINE VERT_BLANK_START VERT_BLANK_END MODE_CTRL LINE_COMPARE".split(" "),
lk="PAL00 PAL01 PAL02 PAL03 PAL04 PAL05 PAL06 PAL07 PAL08 PAL09 PAL0A PAL0B PAL0C PAL0D PAL0E PAL0F MODE OVERSCAN PLANES HORZPAN".split(" "),mk=["RESET","CLOCKING","MAPMASK","CHARMAP","MEMMODE"],nk="SRESET ESRESET COLORCMP DATAROT READMAP MODE MISC COLORDC BITMASK".split(" "),ok=[,,1024,5120];ok[16]=1280;ok[512]=0;ok[1024]=32;ok[1536]=96;ok[2560]=160;ok[3584]=224;ok[768]=16;ok[4096]=1;ok[8192]=2;ok[24576]=98;ok[40960]=162;ok[57344]=226;var pk=[];
pk[1024]=function(a){a+=this.offset;return(this.Z.xb=this.ea[a])>>this.Z.Hm&255};pk[5120]=function(a){a+=this.offset;var b=this.Z.xb=this.ea[a&-2];return(a&1?b>>8:b)&255};pk[1280]=function(a){a+=this.offset;a=this.Z.xb=this.ea[a];for(var b=this.Z.xl,c=this.Z.wl&b,d=0,e=128;e;)(a&b)==c&&(d|=e),c>>>=1,b>>>=1,e>>=1;return d};pk[0]=function(a,b){var c=a+this.offset,d;d=this.ea[c]&~this.Z.sb|(b|b<<8|b<<16|b<<24)&this.Z.sb;d=d&this.Z.Bb|this.Z.xb&~this.Z.Bb;this.ea[c]!=d&&(this.ea[c]=d,this.Ua=!0)};
pk[32]=function(a,b){var c=a+this.offset;b=b>>this.Z.fe|b<<8-this.Z.fe&255;var d;d=(b|b<<8|b<<16|b<<24)&this.Z.pf|this.Z.Tf;d=d&this.Z.sb|this.ea[c]&~this.Z.sb;d=d&this.Z.Bb|this.Z.xb&~this.Z.Bb;this.ea[c]!=d&&(this.ea[c]=d,this.Ua=!0)};pk[96]=function(a,b){var c=a+this.offset;b=b>>this.Z.fe|b<<8-this.Z.fe&255;var d;d=(b|b<<8|b<<16|b<<24)&this.Z.pf|this.Z.Tf;d&=this.Z.xb;d=d&this.Z.sb|this.ea[c]&~this.Z.sb;d=d&this.Z.Bb|this.Z.xb&~this.Z.Bb;this.ea[c]!=d&&(this.ea[c]=d,this.Ua=!0)};
pk[160]=function(a,b){var c=a+this.offset;b=b>>this.Z.fe|b<<8-this.Z.fe&255;var d;d=(b|b<<8|b<<16|b<<24)&this.Z.pf|this.Z.Tf;d|=this.Z.xb;d=d&this.Z.sb|this.ea[c]&~this.Z.sb;d=d&this.Z.Bb|this.Z.xb&~this.Z.Bb;this.ea[c]!=d&&(this.ea[c]=d,this.Ua=!0)};pk[224]=function(a,b){var c=a+this.offset;b=b>>this.Z.fe|b<<8-this.Z.fe&255;var d;d=(b|b<<8|b<<16|b<<24)&this.Z.pf|this.Z.Tf;d^=this.Z.xb;d=d&this.Z.sb|this.ea[c]&~this.Z.sb;d=d&this.Z.Bb|this.Z.xb&~this.Z.Bb;this.ea[c]!=d&&(this.ea[c]=d,this.Ua=!0)};
pk[16]=function(a,b){a+=this.offset;var c,d=a&-2;c=this.Z.sb&(d==a?16711935:-16711936);c=(b|b<<8|b<<16|b<<24)&c|this.ea[d]&~c;c=c&this.Z.Bb|this.Z.xb&~this.Z.Bb;this.ea[d]!=c&&(this.ea[d]=c,this.Ua=!0)};pk[1]=function(a){a+=this.offset;var b=this.ea[a]&~this.Z.sb|this.Z.xb&this.Z.sb;this.ea[a]!=b&&(this.ea[a]=b,this.Ua=!0)};pk[17]=function(a){a+=this.offset;var b=a&-2;a=this.Z.sb&(b==a?16711935:-16711936);a=this.ea[b]&~a|this.Z.xb&a;this.ea[b]!=a&&(this.ea[b]=a,this.Ua=!0)};
pk[2]=function(a,b){var c=a+this.offset,d=dk[b&15],d=d&this.Z.sb|this.ea[c]&~this.Z.sb,d=d&this.Z.Bb|this.Z.xb&~this.Z.Bb;this.ea[c]!=d&&(this.ea[c]=d,this.Ua=!0)};pk[98]=function(a,b){var c=a+this.offset,d=dk[b&15],d=d&this.Z.xb,d=d&this.Z.sb|this.ea[c]&~this.Z.sb,d=d&this.Z.Bb|this.Z.xb&~this.Z.Bb;this.ea[c]!=d&&(this.ea[c]=d,this.Ua=!0)};
pk[162]=function(a,b){var c=a+this.offset,d=dk[b&15],d=d|this.Z.xb,d=d&this.Z.sb|this.ea[c]&~this.Z.sb,d=d&this.Z.Bb|this.Z.xb&~this.Z.Bb;this.ea[c]!=d&&(this.ea[c]=d,this.Ua=!0)};pk[226]=function(a,b){var c=a+this.offset,d=dk[b&15],d=d^this.Z.xb,d=d&this.Z.sb|this.ea[c]&~this.Z.sb,d=d&this.Z.Bb|this.Z.xb&~this.Z.Bb;this.ea[c]!=d&&(this.ea[c]=d,this.Ua=!0)};
function qk(a){var b=[];if(void 0!==a.nb){b[0]=a.Xc;b[1]=a.bd;b[2]=a.Yg;b[3]=a.wa;b[4]=a.Kc|a.jk<<8;b[5]=a.tc;if(5<=a.nb){var c=[];c[0]=a.ae;c[1]=a.Fe;c[2]=a.rf;c[3]=a.qk;c[4]=a.ah;c[5]=a.ji;c[6]=a.He;c[7]=a.dh;c[8]=a.Do;c[9]=a.Eo;c[10]=a.Ge;c[11]=a.Xf;c[12]=a.xb;c[13]=[a.Ya,a.bc,a.Yd];var d;a:if(d=a.Td){var e=0,g=[];if(void 0!==d[0])for(var l=0;2>l;l++)for(var p=l;p<d.length;){for(var w=d[p],v=p+2;v<d.length&&d[v]===w;)v+=2;g[e++]=v-p>>1;g[e++]=w;p=v}if(g.length<d.length){d=g;break a}}c[14]=d;c[15]=
a.ij|8;c[16]=a.Hm;c[17]=a.sb;c[18]=a.fe;c[19]=a.Bb;c[20]=a.ck;c[21]=a.pf;c[22]=a.Tf;c[23]=a.wl;c[24]=a.xl;7==a.nb&&(c[25]=a.Pm,c[26]=a.Mm,c[27]=a.ud,c[28]=a.uc,c[29]=a.mk,c[30]=a.ii);b[6]=c}b[7]=a.Dl}return b}function rk(a,b,c,d,e){if(d){var g="",l,p=0;for(l=0;l<e.length;l++)p<e[l].length&&(p=e[l].length);p++;for(l=0;l<e.length;l++)g&&(g+="\n"),g+=b+"["+k(l)+"]: "+na(e[l],p)+k(d[l])+(l===c?"*":"");a.Y.R(g)}else a.Y.R(b+": "+k(c))}fk.prototype.Wn=function(a){return[this.Td,a-this.Ya]};
fk.prototype.pl=function(){return this.Bi};fk.prototype.wk=function(a){if(null!=a&&a!=this.ij){var b=a&65280,c=pk[b];c||b&4096&&(c=pk[4096]);var b=a&247,d=pk[b];d||b&16&&(d=pk[16]);this.Bi||(this.Bi=Array(6));this.Bi[0]=c;this.Bi[3]=d;this.ij=a}};var gk=[];gk[Sj]=["MDA",948,720896,4096,0,3];gk[3]=["CGA",980,753664,16384,0,2];gk[5]=["EGA",980,753664,16384,65536,4];gk[7]=["VGA",980,753664,16384,262144,7];f=Z.prototype;
f.Ic=function(a,b,c,d){this.ma=b;this.O=c;this.Y=d;3!=Rj[this.la]&&(oc(b,this,sk),sc(b,this,tk));Rj[this.la]!=Sj&&(oc(b,this,uk),sc(b,this,vk));5<=this.nb&&(oc(b,this,wk),sc(b,this,xk));7==this.nb&&(oc(b,this,yk),sc(b,this,zk));if(d){var e=this;gi(d,262144,function(a){if(e.Ha)if(a){var b=e.Ha;if(b.Td){a=ga(a);a=void 0!==a?a-b.Ya:b.gs||0;0>a&&(a=0);for(var c="",d=0;8>d;d++){for(var g=h(b.Ya+a)+":",O=0;8>O&&a<b.Td.length;O++)var J=b.Td[a++],g=g+(" "+h(J));c&&(c+="\n");c+=g}c&&b.Y.R(c);b.gs=a}else b.Y.R("no buffer")}else e.Y.R("BIOSMODE: "+
k(e.De)),b=e.Ha,rk(b,"CRTC",b.Kc,b.tc,b.Ci),b.nb!=Sj&&3!=b.nb||rk(b," MODEREG",b.bd),rk(b," STATUS1",b.wa),3==b.nb&&rk(b," COLOR",b.Yg),5<=b.nb&&(b.Y.R(" ATCDATA: "+b.ae),rk(b," ATC",b.Fe,b.rf,b.Jk),rk(b," GRC",b.Ge,b.Xf,b.Kk),rk(b," SEQ",b.He,b.dh,b.Lk),rk(b," FEAT",b.ji),rk(b," MISC",b.ah),rk(b," STATUS0",b.qk),b.Y.R(" LATCHES: 0x"+h(b.xb)),b.Y.R(" ACCESS: "+ha(b.ij)),b.Y.R("Use 'dump video [addr]' to dump video memory"));else e.Y.R("no active video card")})}if((this.Ka=
yb(a,"Keyboard"))&&this.Ch){for(var g in this.va)0<g.indexOf("lock")&&this.Ka.Lb("led",g,this.va[g]);this.Ka.Lb(this.Hs?"textarea":"canvas","kbd",this.Za)}this.Gi=9;(this.ja=yb(a,"ChipSet"))&&this.Lo&&5==this.nb&&(this.Gi=Uh(this.Lo,this.Gi));this.Ka&&this.zp&&Ak(this)};
f.Lb=function(a,b,c){var d=this;if(!this.va[b])switch(this.va[b]=c,b){case "fullScreen":return this.Jd&&this.Jd.vg?c.onclick=function(){d.vg()}:c.parentNode.removeChild(c),!0;case "lockPointer":return this.Es=c.textContent,this.Za&&this.Za.Qf?c.onclick=function(){d.Qf(!0)}:c.parentNode.removeChild(c),!0;case "refresh":return c.onclick=function(){ed(d,!0)},!0}return!1};f.dd=function(){this.Za&&this.Za.focus()};
f.vg=function(){var a=!1;this.Jd&&(this.Jd.vg&&(this.Jd.style.width=this.Jd.style.height="100%",this.Jd.style.backgroundColor="black",this.Jd.vg(),a=!0),this.dd());return a};f.Qf=function(a){var b=!1;this.Za&&(a?this.Za.Qf&&(this.Za.Qf(),this.lf.ei(!0),b=!0):this.Za.Qo&&(this.Za.Qo(),this.lf.ei(!1),b=!0),this.dd());return b};f.ei=function(a){this.lf&&(this.lf.ei(a),this.Ka&&(this.Ka.gl=a));var b=this.va.lockPointer;b&&(b.textContent=a?"Press Esc to Unlock Pointer":this.Es)};
function Ak(a){var b=a.Za;b&&!a.Lh&&(b.addEventListener("touchstart",function(b){Bk(a,b)},!1),b.addEventListener("touchmove",function(b){Bk(a,b)},!0),b.addEventListener("touchend",function(){},!1),a.Lh=!0)}f.fk=function(a){this.Zi=a;this.Ka&&this.Ka.fk(a)};
function Bk(a,b){a.Zi&&b.preventDefault();var c=0,d=0,e=a.Ch;do isNaN(e.offsetLeft)||(c+=e.offsetLeft,d+=e.offsetTop);while(e=e.offsetParent);var g=a.re/a.Ch.offsetWidth,e=a.df/a.Ch.offsetHeight,l,p;b.targetTouches?(l=b.targetTouches[0].pageX,p=b.targetTouches[0].pageY):(l=b.pageX,p=b.pageY);c=(l-c)*g/(a.re/3)|0;d=(p-d)*e/(a.df/3)|0;1!=d?d?Kj(a.Ka,1040,!0):Kj(a.Ka,1038,!0):1!=c&&(c?Kj(a.Ka,1039,!0):Kj(a.Ka,1037,!0))}
f.kc=function(a,b){if(!b)if(!a||!this.restore)this.reset();else if(!this.restore(a))return!1;return!0};f.jc=function(a){return a&&this.save?this.save():!0};
f.reset=function(){var a=!0,b=0;this.ja&&(b=oi(this.ja));this.la||(this.nb=3==b?Sj:3);this.Od=3;switch(this.nb){case 7:b=7;break;case 5:var c=Wj[this.Gi];c&&(b=c[0]);b||(b=4);break;case Sj:b=3;this.Od=Uj;break;default:b=2}this.Pd!==b&&(this.Pd=b,a=!0);this.Ha=null;this.Id=this.Tk=new fk(this,Sj);this.gc=this.Pi=new fk(this,3);5>this.nb?this.W=new fk:(this.W=new fk(this,this.nb,null,this.Yd),Ck(this));Dk(this);this.De=null;this.Ff=this.od=-1;this.Ef=0;Ek(this,this.Od);if(this.Ha.Ya&&a){a=this.Ha.Ya+
this.Uk;for(b=this.Ha.Ya;b<a;b+=2){var d=Math.floor(65536*Math.random());4==this.Pd||7==this.Pd?(c=b>>1&255,d=d>>8&-129,d>>4==(d&15)&&(d^=15)):(c=d&255,d=(d&256?7:112)|8&d>>8);lc(this.ma,b,c|d<<8)}ed(this,!0)}};function Ck(a){a.W.ah&1?(a.Id=a.Tk,a.gc=a.W):(a.Id=a.W,a.gc=a.Pi)}f.save=function(){var a=new Ie(this);a.set(0,qk(this.Tk));a.set(1,qk(this.Pi));a.set(2,[this.Pd,this.Od,this.De]);a.set(3,qk(this.W));return a.data()};
f.restore=function(a){var b=a[2];this.Pd=b[0];this.Od=b[1];this.De=b[2];this.Ha=null;this.Id=this.Tk=new fk(this,Sj,a[0]);this.gc=this.Pi=new fk(this,3,a[1]);this.W=new fk(this,this.nb,a[3],this.Yd);this.W.Xc&&Ck(this);Dk(this);if(!Fk(this))return!1;Gk(this);return!0};
f.cr=function(a,b,c){if(c)this.Da("Unable to load font ROM image (error "+c+")");else{try{var d=eval("("+b+")");if(!d.length){Ca("Empty font ROM image: "+a);return}if(1==d.length){Ca(d[0]);return}if(8192==d.length)nj(this,d,[6144,0]);else{this.Da("Unrecognized font data length ("+d.length+")");return}}catch(e){this.Da("Font ROM data error: "+e.message);return}(this.ld||this.Y)&&pb(this)}};
function Hk(a,b){if(1==b)return a.le[0]=Zj[0],a.le[1]=Zj[7],a.le;if(2==b){var c=a.Ha.Yg;if(a.Ha===a.W){var d=a.W.rf[0],c=d&7;d&16&&(c|=8);18!=a.W.rf[1]&&(c|=32)}a.le[0]=Zj[c&15];c=c&32?bk:ak;for(d=0;d<c.length;d++)a.le[d+1]=Zj[c[d]];return a.le}if(a.gc===a.Pi)return Zj;c=null!=a.W.rf[15]?a.W.rf:ck;for(d=0;d<a.le.length;d++){var e=c[d]||0;a.le[d]=[(e&4?170:0)|(e&32?85:0),(e&2?170:0)|(e&16?85:0),(e&1?170:0)|(e&8?85:0),255]}return a.le}function nj(a,b,c,d){a.yi=b;a.Ek=c;a.Kf=d}
function Dk(a){var b=!1;if(window&&a.yi){var c=Hk(a),d,e=a.Kf?a.Kf:8;Ik(a,3,a.Ek[0],0,e,8,a.yi,c)&&(b=!0);d=a.Kf?0:2048;e=a.Kf?a.Kf:9;Ik(a,1,a.Ek[1],d,e,14,a.yi,Xj,Yj)&&(b=!0);a.Kf&&Ik(a,a.nb,a.Ek[1],0,a.Kf,14,a.yi,c)&&(b=!0)}return b}function Ik(a,b,c,d,e,g,l,p,w){var v=!1;null!=c&&(Jk(a,b,c,d,e,g,l,p,w)&&(v=!0),a.tp&&Jk(a,b<<1,c,d,e,g,l,p,w)&&(v=!0));return v}
function Jk(a,b,c,d,e,g,l,p,w){var v=!1,E=b&1?0:1,O=a.Re[b];O||(O={Fc:e<<E,Gc:g<<E,kg:Array(p.length),jn:p.slice(),oh:w,Ck:Array(p.length)});for(w=0;w<p.length;w++){var J=p[w],G=O.kg[w]?O.jn[w]:[];if(J[0]!==G[0]||J[1]!==G[1]||J[2]!==G[2]){var v=O,G=w,S=E,X=c,T=d,aa=e,Ba=g,pa=l,Ra=[0,0,0,0],Eb=window.document.createElement("canvas");Eb.width=v.Fc<<4;Eb.height=v.Gc<<4;for(var Ua=Eb.getContext("2d"),ba=void 0,sa=void 0,da=void 0,rb=8>Ba||!T?Ba:8,Fb=Ua.createImageData(v.Fc,v.Gc),ba=0;256>ba;ba++){for(da=
0;da<Ba;da++)for(var Ya=v.oh&&G&1&&da>=Ba-2,Za=pa[da<rb?X+ba*rb+da:T+ba*rb+da-rb],Ga=0;Ga<=S;Ga++)for(sa=0;sa<aa;sa++){var zd=sa<<S,ad=(da<<S)+Ga,Ic=Ya||Za&128>>(8<=sa&&192<=ba&&223>=ba?7:sa)?J:Ra;Kk(Fb,zd,ad,Ic);S&&Kk(Fb,zd+1,ad,Ic)}Ua.putImageData(Fb,(ba&15)*v.Fc,(ba>>4)*v.Gc)}v.kg[G]="#"+h(J[0],2)+h(J[1],2)+h(J[2],2);v.jn[G]=J;v.Ck[G]=Eb;v=!0}}a.Re[b]=O;return v}function Lk(a){0<a.Ef||0<=a.od?0>a.Ff&&(a.Ff=0):a.Ff=-1}
function Gk(a){if(a.ic){for(var b=10;15>=b;b++)if(null==a.Ha.tc[b])return;var c=a.Ha.tc[10],b=c&31,d=a.Ha.tc[11]&31,e=a.Ha.tc[9]&31,g=!1;a.Ha===a.W&&(g=!0,7!=e||4!=b||d||(d=7));if(c&32||b>d&&!g||b>e)Mk(a);else{c=a.Ha.tc[15]+((a.Ha.tc[14]&63)<<8);a.od!=c&&(Mk(a),a.od=c);d=d-b+1;if(a.Vo!=b||a.Fn!=d)a.Vo=b,a.Fn=d;a.cf=e+1;Lk(a)}}}
function Mk(a){if(0<=a.od){if(void 0!==a.xc){var b=a.xc[a.od];if(b&131072){var b=b&-131073,c=a.od%a.Qb,d=Math.floor(a.od/a.Qb);a.ic&&a.Re[a.ic]&&(a.ug&&Nk(a,c,d,b,a.ug),Nk(a,c,d,b));a.xc[a.od]=b}}a.od=-1}}
function Ok(a){var b;a=a.Ha;var c=a.Xf[5];if(null!=c){b=1024;var d=0,e=a.Xf[3]&31;switch(c&3){case 0:if(e){d=32;switch(e&24){case 8:d=96;break;case 16:d=160;break;case 24:d=224}a.fe=e&7}break;case 1:d=1;break;case 2:switch(e&24){default:d=2;break;case 8:d=98;break;case 16:d=162;break;case 24:d=226}}c&8&&(b=1280);a=a.dh[4];null==a||a&4||(b|=4096,d|=16);b|=d}return b}f.Rd=function(a){var b=this.Ha;b&&null!=a&&a!=b.ij&&(b.wk(a),this.ma.wk(b.Ya,b.bc,b.pl()))};
function Fk(a,b){var c,d=a.De,e=a.Ha;if(e)if(e.nb==Sj)d=Uj;else if(5<=e.nb){var d=null,g=e.Yd>>2,l=32768<g?32768:g,p=e.Xf[6];if(null!=p){switch(p&12){case 0:e.Ya=655360;e.bc=g;d=255;break;case 4:e.Ya=655360;e.bc=g;d=3==a.Pd?15:16;break;case 8:e.Ya=720896;e.bc=l;d=Uj;break;case 12:e.Ya=753664,e.bc=l,d=3==a.Pd?2:3}c=e.dh[1]&8;g=e.tc[6];g|=e.tc[7]&1?256:0;7==e.nb&&(g|=e.tc[7]&32?512:0);255!=d&&(p&1?753664==e.Ya?d=c?7-d:6:400>g?350>g&&(d=c?13:14):d=3==a.Pd?17:18:c&&(d-=2));c=Ok(a)}}else e.bd&8&&(e.bd&
2?(d=e.bd&16?6:5,e.bd&4||--d):(d=e.bd&1?3:1,e.bd&4&&--d));else a.De=null,null==d&&(d=a.Od);if(!Ek(a,d,b))return!1;a.Rd(c);return!0}
function Ek(a,b,c){if(null!=b&&(b!=a.De||c)){a.ap=0;a.De=b;b=a.Ha||(b==Uj?a.Id:a.gc);if(b!=a.Ha||b.Ya!=a.Ya||b.bc!=a.bc){Mk(a);if(a.Ya){if(!jc(a.ma,a.Ya,a.bc))return!1;a.Ha&&(a.Ha.Xc=!1)}a.Ha=b;b.Xc=!0;a.Ya=b.Ya;a.bc=b.bc;if(!ec(a.ma,b.Ya,b.bc,3,b===a.W?b:null))return!1}a.ic=0;a.Qb=a.kj;a.Jc=a.Bl;a.vl=Tj[Uj][2];b=0;var d=Tj[a.De];d&&(a.Qb=d[0],a.Jc=d[1],a.vl=d[2],b=d[3]||0,a.ic=d[4],4!=a.Pd&&7!=a.Pd||a.Ha!==a.W||3!=a.ic||(7==a.W.tc[9]?a.Jc=43:a.ic=a.nb));a.lo=a.Qb*a.Jc;a.jj=a.lo/a.vl;a.Uk=(a.jj<<
1)+b;a.An=b?a.Uk+b>>1:0;13<=a.De&&(a.jj<<=1);a.Re.length&&(a.se=Math.floor(a.re/a.Qb),a.te=Math.floor(a.df/a.Jc),a.ic?(b=a.Re[a.ic],d=a.Re[a.ic<<1],a.xp&&80==a.Qb?d&&a.se>=3*d.Fc>>2&&(a.ic<<=1,b=d):(d&&a.se>=d.Fc&&(a.ic<<=1,b=d),b&&(a.se=b.Fc,a.te=b.Gc)),a.Hh=a.Ih=0,b&&(a.Hh=a.Qb*b.Fc,a.Ih=a.Jc*b.Gc)):(a.se=a.te=1,a.Hh=a.Qb,a.Ih=a.Jc),a.fj=a.ld.createImageData(a.Hh,a.Ih),a.rg=window.document.createElement("canvas"),a.rg.width=a.Hh,a.rg.height=a.Ih,a.ug=a.rg.getContext("2d"),a.Zm=a.$m=0,a.Zk=a.re,
a.$k=a.df,b=a.re-a.Qb*a.se,d=a.df-a.Jc*a.te,0<b&&(a.Zm=b>>1,a.Zk-=b),0<d&&(a.$m=d>>1,a.$k-=d),b||d)&&(a.ld.fillStyle=a.Ch.style.backgroundColor,a.ld.fillRect(0,0,a.re,a.df));!1!==c?ed(a,!0):Pk(a,!0)}return!0}function Kk(a,b,c,d){b=(b+c*a.width)*d.length;a.data[b]=d[0];a.data[b+1]=d[1];a.data[b+2]=d[2];a.data[b+3]=d[3]}function Pk(a,b){var c;if(b){if(c=a.jj,void 0===a.xc||a.xc.length!=c)a.xc=Array(c)}else{if(void 0===a.xc)return;c=a.xc.length}for(var d=0;d<c;d++)a.xc[d]=-1;a.Ef=-1}
function Nk(a,b,c,d,e){var g=d&255,l=d>>8;d=l&15;var p=a.Re[a.ic];p.oh&&(d=p.oh[d]);var w=l>>4&15;p.oh&&(w=p.oh[w]);e?(b*=p.Fc,c*=p.Gc,e.fillStyle=p.kg[w],e.fillRect(b,c,p.Fc,p.Gc)):(b=b*a.se+a.Zm,c=c*a.te+a.$m,a.ld.fillStyle=p.kg[w],a.ld.fillRect(b,c,a.se,a.te));l&256&&(w=(g&15)*p.Fc,g=(g>>4)*p.Gc,e?e.drawImage(p.Ck[d],w,g,p.Fc,p.Gc,b,c,p.Fc,p.Gc):a.ld.drawImage(p.Ck[d],w,g,p.Fc,p.Gc,b,c,a.se,a.te));l&512&&(g=a.Vo,l=a.Fn,e?(a.cf&&a.cf!==p.Gc&&(g=Math.floor(g*p.Gc/a.cf),l=Math.floor(l*p.Gc/a.cf)),
e.fillStyle=p.kg[d],e.fillRect(b,c+g,p.Fc,l)):(a.cf&&a.cf!==a.te&&(g=Math.floor(g*a.te/a.cf),l=Math.floor(l*a.te/a.cf)),a.ld.fillStyle=p.kg[d],a.ld.fillRect(b,c+g,a.se,l)))}
function ed(a,b){if(a.fa.hc){var c=!1;a.Ha&&(a.Ha===a.W?a.W.Fe&32&&(c=!0):a.Ha.bd&8&&(c=!0));if(c||b){if(b)Pk(a,!0);else if(void 0===a.xc)return;var d=!1;!(b||++a.ap&15)&&0<=a.Ff&&(a.Ff++,d=!0);var e=0,g=a.lo,c=a.Ha.Ya,l=c+a.Ha.bc,p=(a.Ha.tc[12]<<8)+a.Ha.tc[13];a.ic&&(p<<=1);var c=c+p,w=a.Uk;c+w>l&&(w=l-c,0>w&&(w=0));l=c+w;if(p=!b){for(var p=a.ma,v=!0,E=c>>>p.Ca;0<w&&E<p.na.length;)p.na[E].Ua&&(p.na[E].Ua=v=!1,p.na[E].Ln=!0),w-=p.lb,E++;p=v}if(p){if(!d)return;if(!a.Ef){if(0>a.od)return;e=a.od;g=e+
1}}if(a.ic){if(a.Re[a.ic]){d=0;p=a.Ef=0;w=1048575;a.Ha.bd&32&&(p=32768,w&=~p,a.Ff&2||(w&=-65537));for(c+=e<<1;c<l&&e<g;)v=kc(a.ma,c),v|=65536,v&p&&(a.Ef++,v&=w),e==a.od&&(v|=a.Ff&1?131072:0),E=a.xc[e],E!=v&&(Nk(a,e%a.Qb,Math.floor(e/a.Qb),v,a.ug),a.xc[e]=v,d++),c+=2,e++;d&&a.ug&&a.ld.drawImage(a.rg,0,0,a.Hh,a.Ih,a.Zm,a.$m,a.Zk,a.$k);Lk(a)}}else if(a.An){for(var g=l,O,J,e=c,l=a.Ef=0,d=a.vl,p=16==d?65536:196608,w=16==d?1:2,v=Hk(a,w),G=E=0,S=a.Qb,X=0,T=a.Jc,aa=0;e<g;){O=kc(a.ma,e);J=a.xc[l];if(J===O)E+=
d;else{a.xc[l]=O;O=O>>8|(O&255)<<8;J=p;var Ba=16;E<S&&(S=E);for(var pa=0;pa<d;pa++){var Ra=(O&(J>>=w))>>(Ba-=w);Kk(a.fj,E++,G,v[Ra])}E>X&&(X=E);G<T&&(T=G);G>=aa&&(aa=G+1)}e+=2;l++;if(E>=a.Qb){E=0;G+=2;if(G>a.Jc)break;G==a.Jc&&(G=1,e=c+a.An)}}S<a.Qb&&(a.ug.putImageData(a.fj,0,0,S,T,X-S,aa-T),a.ld.drawImage(a.rg,0,0,a.Qb,a.Jc,0,0,a.re,a.df))}else{g=l;e=a.Ef=0;l=Hk(a);d=a.Ha.Td;w=p=0;v=a.Qb;E=0;G=a.Jc;for(S=0;c<g;){X=c++-a.Ya;X=d[X];T=a.xc[e];if(T===X)p+=8;else{a.xc[e]=X;p<v&&(v=p);for(T=0;8>T;T++)aa=
ek[X&-2139062144]||0,Kk(a.fj,p++,w,l[aa]),X<<=1;p>E&&(E=p);w<G&&(G=w);w>=S&&(S=w+1)}e++;if(p>=a.Qb&&(p=0,++w>a.Jc))break}v<a.Qb&&(a.ug.putImageData(a.fj,0,0,v,G,E-v,S-G),a.ld.drawImage(a.rg,0,0,a.Qb,a.Jc,0,0,a.re,a.df))}}}}f.kq=function(a,b){return Qk(this,this.Id,a,b)};f.Or=function(a,b,c){var d=this.Id;d.jk=d.Kc;d.Kc=b&31;m(this,a,b,c,"CRTC.INDX")};f.jq=function(a,b){return Rk(this,this.Id,a,b)};f.Nr=function(a,b,c){Sk(this,this.Id,a,b,c)};f.lq=function(a,b){return Tk(this,this.Id,b)};
f.Pr=function(a,b,c){a=this.Id;m(this,a.port+4,b,c,"MODE");a.bd=b;Fk(this,!1)};f.mq=function(a,b){return Uk(this,this.Id,b)};f.wo=function(a,b,c){this.W.ji=this.W.ji&-4|b&3;m(this,a,b,c,"FEAT")};f.bo=function(a,b){var c=this.W.ae?this.W.rf[this.W.Fe&31]:this.W.Fe;b&&!this.qa()||m(this,960,null,b,"ATC."+(this.W.ae?this.W.Jk[this.W.Fe&31]:"INDX"),c);this.W.ae=!this.W.ae;return c};
f.vo=function(a,b,c){var d=this.W.Fe&32;if(this.W.ae){var e=this.W.Fe&31;if(16<=e||!d)c&&!this.qa()||m(this,a,b,c,"ATC."+this.W.Jk[e]),this.W.rf[e]=b;this.W.ae=!1}else this.W.Fe=b,m(this,a,b,c,"ATC.INDX"),this.W.ae=!0,b&32&&!d&&Dk(this)&&ed(this,!0)};f.wq=function(a,b){var c=0;if(5==this.nb)c=3-((this.W.ah&12)>>2),c=(this.Gi&1<<c)<<4-c;else{var d=this.W.ii[0];45!=(d&63)&&2880!=(d&4032)&&184320!=(d&258048)&&(c|=16)}c|=this.W.qk&-17;this.W.qk=c;m(this,962,null,b,"STATUS0",c);return c};
f.Qr=function(a,b,c){this.W.ah=b;Ck(this);m(this,962,b,c,"MISC")};f.xq=function(a,b){var c=this.W.Pm;m(this,963,null,b,"VGA_ENABLE",c);return c};f.$r=function(a,b,c){this.W.Pm=b;m(this,963,b,c,"VGA_ENABLE")};f.vq=function(a,b){var c=this.W.He;m(this,964,null,b,"SEQ.INDX",c);return c};f.Yr=function(a,b,c){this.W.He=b;m(this,964,b,c,"SEQ.INDX")};f.uq=function(a,b){var c=this.W.dh[this.W.He];b&&!this.qa()||m(this,965,null,b,"SEQ"+this.W.Lk[this.W.He],c);return c};
f.Xr=function(a,b,c){c&&!this.qa()||m(this,965,b,c,"SEQ."+this.W.Lk[this.W.He]);this.W.dh[this.W.He]=b;switch(this.W.He){case 2:this.W.sb=dk[b&15];break;case 4:this.Rd(Ok(this))}};f.Yp=function(a,b){var c=this.W.Mm;b&&!this.qa()||m(this,966,null,b,"DAC.MASK",c);return c};f.Ar=function(a,b,c){c&&!this.qa()||m(this,966,b,c,"DAC.MASK");this.W.Mm=b};f.Zp=function(a,b){var c=this.W.mk;b&&!this.qa()||m(this,967,null,b,"DAC.STATE",c);return c};
f.Br=function(a,b,c){c&&!this.qa()||m(this,967,b,c,"DAC.READ");this.W.ud=b;this.W.mk=3;this.W.uc=0};f.Cr=function(a,b,c){c&&!this.qa()||m(this,968,b,c,"DAC.WRITE");this.W.ud=b;this.W.mk=0;this.W.uc=0};f.Xp=function(a,b){var c=this.W.ii[this.W.ud]>>this.W.uc&63;b&&!this.qa()||m(this,969,null,b,"DAC.DATA["+k(this.W.ud)+"]["+k(this.W.uc)+"]",c);this.W.uc+=6;12<this.W.uc&&(this.W.uc=0,this.W.ud=this.W.ud+1&255);return c};
f.zr=function(a,b,c){a=this.W.ii[this.W.ud];c&&!this.qa()||m(this,969,b,c,"DAC.DATA["+k(this.W.ud)+"]["+k(this.W.uc)+"]");this.W.ii[this.W.ud]=a&~(63<<this.W.uc)|(b&63)<<this.W.uc;this.W.uc+=6;12<this.W.uc&&(this.W.uc=0,this.W.ud=this.W.ud+1&255)};f.yq=function(a,b){var c=this.W.ji;m(this,970,null,b,"FEAT",c);return c};f.Jr=function(a,b,c){this.W.Eo=b;m(this,970,b,c,"GRC2")};f.zq=function(a,b){var c=this.W.ah;m(this,972,null,b,"MISC",c);return c};f.Ir=function(a,b,c){this.W.Do=b;m(this,972,b,c,"GRC1")};
f.dq=function(a,b){var c=this.W.Ge;m(this,974,null,b,"GRC.INDX",c);return c};f.Hr=function(a,b,c){this.W.Ge=b;m(this,974,b,c,"GRC.INDX")};f.cq=function(a,b){var c=this.W.Xf[this.W.Ge];b&&!this.qa()||m(this,975,null,b,"GRC."+this.W.Kk[this.W.Ge],c);return c};
f.Gr=function(a,b,c){c&&!this.qa()||m(this,975,b,c,"GRC."+this.W.Kk[this.W.Ge]);this.W.Xf[this.W.Ge]=b;switch(this.W.Ge){case 0:this.W.ck=dk[b&15];this.W.Tf=this.W.ck&~this.W.pf;break;case 1:this.W.pf=~dk[b&15];this.W.Tf=this.W.ck&~this.W.pf;break;case 2:this.W.wl=dk[b&15]&-2139062144;break;case 3:case 5:this.Rd(Ok(this));break;case 4:this.W.Hm=(b&3)<<3;break;case 6:Fk(this,!1);break;case 7:this.W.xl=dk[b&15]&-2139062144;break;case 8:this.W.Bb=b|b<<8|b<<16|b<<24}};
f.Sp=function(a,b){return Qk(this,this.gc,a,b)};f.tr=function(a,b,c){var d=this.gc;d.jk=d.Kc;d.Kc=b&31;m(this,a,b,c,"CRTC.INDX")};f.Rp=function(a,b){return Rk(this,this.gc,a,b)};f.sr=function(a,b,c){Sk(this,this.gc,a,b,c)};f.Tp=function(a,b){return Tk(this,this.gc,b)};f.ur=function(a,b,c){a=this.gc;m(this,a.port+4,b,c,"MODE");a.bd=b;Fk(this,!1)};f.Qp=function(a,b){var c=this.gc.Yg;b&&!this.qa()||m(this,a,null,b,this.gc.type+".COLOR",c);return c};
f.rr=function(a,b,c){c&&!this.qa()||m(this,a,b,c,this.gc.type+".COLOR");this.gc.Yg!==b&&(this.gc.Yg=b,Pk(this,!1))};f.Up=function(a,b){return Uk(this,this.gc,b)};function Qk(a,b,c,d){var e;b.Xc&&(e=b.Kc);m(a,c,null,d,"CRTC.INDX",e);return e}function Rk(a,b,c,d){var e;b.Xc&&b.Kc<b.ul&&(e=b.tc[b.Kc]);d&&!a.qa()||m(a,c,null,d,"CRTC."+b.Ci[b.Kc],e);return e}function Sk(a,b,c,d,e){b.Kc<b.ul&&(e&&!a.qa()||m(a,c,d,e,"CRTC."+b.Ci[b.Kc]),b.tc[b.Kc]=d,9==b.Kc&&8!=b.jk&&Fk(a,!0),Gk(a))}
function Tk(a,b,c){var d=b.bd;m(a,b.port+4,null,c,"MODE",d);return d}function Uk(a,b,c){var d=0,e=cd(a.O),g=e-b.Dl;0>g&&(g=0);g%b.yl>b.Sq&&(d|=1);g%=b.oo;g>b.Uq&&(d|=8);b.Dl=e-g;b===a.W?(d|=b.wa&48^48,b.ae=!1):d=(b.wa^=9)|240;b.wa=d;m(a,b.port+6,null,c,b===a.W?"STATUS1":"STATUS",d);return d}
var sk={948:Z.prototype.kq,949:Z.prototype.jq,952:Z.prototype.lq,954:Z.prototype.mq},tk={948:Z.prototype.Or,949:Z.prototype.Nr,952:Z.prototype.Pr},uk={980:Z.prototype.Sp,981:Z.prototype.Rp,984:Z.prototype.Tp,985:Z.prototype.Qp,986:Z.prototype.Up},vk={980:Z.prototype.tr,981:Z.prototype.sr,984:Z.prototype.ur,985:Z.prototype.rr},wk={960:Z.prototype.bo,961:Z.prototype.bo,962:Z.prototype.wq,964:Z.prototype.vq,965:Z.prototype.uq,974:Z.prototype.dq,975:Z.prototype.cq},xk={954:Z.prototype.wo,960:Z.prototype.vo,
961:Z.prototype.vo,962:Z.prototype.Qr,964:Z.prototype.Yr,965:Z.prototype.Xr,970:Z.prototype.Jr,972:Z.prototype.Ir,974:Z.prototype.Hr,975:Z.prototype.Gr,986:Z.prototype.wo},yk={963:Z.prototype.xq,966:Z.prototype.Yp,967:Z.prototype.Zp,969:Z.prototype.Xp,970:Z.prototype.yq,972:Z.prototype.zq},zk={963:Z.prototype.$r,966:Z.prototype.Ar,967:Z.prototype.Br,968:Z.prototype.Cr,969:Z.prototype.zr};
Qa(function(){for(var a=lb(window.document,"pcjs","video"),b=0;b<a.length;b++){var c=a[b],d=jb(c),e=window.document.createElement("canvas");if(void 0===e||!e.getContext){c.innerHTML="<br/>Missing <canvas> support. Please try a newer web browser.";break}e.setAttribute("class","pcjs-canvas");e.setAttribute("width",d.screenWidth);e.setAttribute("height",d.screenHeight);e.style.backgroundColor=d.screenColor;e.style.height="auto";0<=(window?window.navigator.userAgent:"").indexOf("MSIE")&&(c.onresize=
function(a,b,c,d){return function(){b.style.height=(a.clientWidth*d/c|0)+"px"}}(c,e,d.screenWidth,d.screenHeight),c.onresize());c.appendChild(e);var g=window.document.createElement("textarea");Ja("iOS")&&(g.setAttribute("autocapitalize","off"),g.setAttribute("autocorrect","off"));c.appendChild(g);var l=e.getContext("2d"),d=new Z(d,e,l,g,c);kb(d,c)}});
function Vk(a){this.Zn=a.adapter;switch(this.Zn){case 1:this.Jm=1016;this.ai=4;break;case 2:this.Jm=760;this.ai=3;break;default:Ca("Unrecognized serial adapter #"+this.Zn);return}this.af=null;Wa.call(this,"SerialPort",a,Vk,4194304);var b=a.binding,c;a=Wk;b&&(void 0===c&&(c="Panel"),(c=ib(c,this.id))&&(b=c.va[b])&&this.Lb(null,a,b))}fb(Vk);var Wk="buffer";f=Vk.prototype;f.nn=function(a,b){return a==this.Jg?(this.lf=b,this):null};
f.Lb=function(a,b,c){var d=this;switch(b){case Wk:return this.va[b]=this.af=c,c.onkeydown=function(a){a=a||window.event;var b=a.keyCode;8===b&&(a.preventDefault&&a.preventDefault(),Xk(d,[b]))},c.onkeypress=function(a){a=a||window.event;Xk(d,[a.which||a.keyCode])},!0}return!1};f.Ic=function(a,b,c,d){this.ma=b;this.O=c;this.Y=d;this.ja=yb(a,"ChipSet");oc(b,this,Yk,this.Jm);sc(b,this,Zk,this.Jm);pb(this)};f.kc=function(a,b){if(!b)if(!a||!this.restore)this.reset();else if(!this.restore(a))return!1;return!0};
f.jc=function(a){return a&&this.save?this.save():!0};f.reset=function(){this.jf()};f.save=function(){var a=new Ie(this),b=0,c=[];c[b++]=this.Qk;c[b++]=this.tn;c[b++]=this.fg;c[b++]=this.Hi;c[b++]=this.We;c[b++]=this.Hd;c[b++]=this.Wd;c[b++]=this.hd;c[b++]=this.qn;c[b]=this.sh;a.set(0,c);return a.data()};f.restore=function(a){return this.jf(a[0])};
f.jf=function(a){var b=0;void 0===a&&(a=[0,0,384,0,1,0,0,96,48,[]]);this.Qk=a[b++];this.tn=a[b++];this.fg=a[b++];this.Hi=a[b++];this.We=a[b++];this.Hd=a[b++];this.Wd=a[b++];this.hd=a[b++];this.qn=a[b++];this.sh=a[b];return!0};function Xk(a,b){a.sh=a.sh.concat(b);$k(a)}function $k(a){0<a.sh.length&&!(a.hd&1)&&(a.Qk=a.sh.shift(),a.hd|=1);var b=-1;a.hd&1&&a.Hi&1&&(b=4);0<=b?(a.We&=-8,a.We|=b,a.ja&&a.ai&&Wi(a.ja,a.ai,100)):(a.We|=1,a.ja&&a.ai&&Xi(a.ja,a.ai))}
f.tq=function(a,b){var c=this.Hd&128?this.fg&255:this.Qk;m(this,a,null,b,this.Hd&128?"DLL":"RBR",c);this.hd&=-2;$k(this);return c};f.eq=function(a,b){var c=this.Hd&128?this.fg>>8:this.Hi;m(this,a,null,b,this.Hd&128?"DLM":"IER",c);return c};f.fq=function(a,b){var c=this.We;m(this,a,null,b,"IIR",c);return c};f.gq=function(a,b){var c=this.Hd;m(this,a,null,b,"LCR",c);return c};f.iq=function(a,b){var c=this.Wd;m(this,a,null,b,"MCR",c);return c};
f.hq=function(a,b){var c=this.hd;m(this,a,null,b,"LSR",c);return c};f.nq=function(a,b){var c=this.qn;m(this,a,null,b,"MSR",c);return c};f.Zr=function(a,b,c){m(this,a,b,c,this.Hd&128?"DLL":"THR");this.Hd&128?this.fg=this.fg&-256|b:(this.tn=b,this.hd&=-97,this.af?(13!=b&&(8==b?this.af.value=this.af.value.slice(0,-1):(this.af.value+=String.fromCharCode(b),this.af.scrollTop=this.af.scrollHeight)),a=!0):a=!1,a&&(this.hd|=96))};
f.Kr=function(a,b,c){m(this,a,b,c,this.Hd&128?"DLM":"IER");this.Hd&128?this.fg=this.fg&255|b<<8:this.Hi=b};f.Lr=function(a,b,c){m(this,a,b,c,"LCR");this.Hd=b};
f.Mr=function(a,b,c){var d=this.Wd;m(this,a,b,c,"MCR");this.Wd=b;this.lf&&(d^b)&3&&(a=this.lf,b=this.Wd,(c=3==(b&3))?a.Xc||(d=!1,a.Wd&2||(a.reset(),a.$a("serial mouse reset"),d=!0),a.Wd&1||(a.$a("serial mouse ID requested"),d=!0),d&&(Xk(a.Dh,[77,77]),a.$a("serial mouse ID sent")),al(a),a.setActive(c)):a.Xc&&(a.$a("serial mouse inactive"),bl(a),a.setActive(c)),a.Wd=b)};
var Yk={0:Vk.prototype.tq,1:Vk.prototype.eq,2:Vk.prototype.fq,3:Vk.prototype.gq,4:Vk.prototype.iq,5:Vk.prototype.hq,6:Vk.prototype.nq},Zk={0:Vk.prototype.Zr,1:Vk.prototype.Kr,3:Vk.prototype.Lr,4:Vk.prototype.Mr};Qa(function(){for(var a=lb(window.document,"pcjs","serial"),b=0;b<a.length;b++){var c=a[b],d=jb(c),d=new Vk(d);kb(d,c)}});function cl(a){Wa.call(this,"Mouse",a,cl,33554432);if(this.ql=a.serial)this.Qm="SerialPort";this.setActive(!1);this.Lh=this.$i=!1;this.Bd=[];this.lg=[];pb(this)}fb(cl);
f=cl.prototype;f.Ic=function(a,b,c,d){this.Fa=a;this.ma=b;this.O=c;this.Y=d;for(b=null;b=yb(a,"Video",b);)this.Bd.push(b)};f.setActive=function(a){this.Xc=a};
f.kc=function(a,b){if(!b){if(!a||!this.restore)this.reset();else if(!this.restore(a))return!1;if(this.Qm&&!this.Dh){for(var c=null;(c=yb(this.Fa,this.Qm,c))&&(!c.nn||!(this.Dh=c.nn(this.ql,this))););if(this.Dh)for(this.lg=[],c=0;c<this.Bd.length;c++){var d;d=this.Bd[c];d.lf=this;(d=d.Za)&&this.lg.push(d)}else Ca(this.id+": "+this.Qm+" "+this.ql+" unavailable")}this.Xc?al(this):bl(this)}return!0};f.jc=function(a){return a&&this.save?this.save():!0};f.reset=function(){this.jf()};
f.save=function(){var a=new Ie(this);a.set(0,this.Vm());return a.data()};f.restore=function(a){return this.jf(a[0])};f.jf=function(a){var b=0;void 0===a&&(a=[!1,-1,-1,0,0,!1,!1,0]);this.setActive(a[b++]);this.Me=a[b++];this.Ne=a[b++];this.gg=a[b++];this.hg=a[b++];this.Wi=a[b++];this.Xi=a[b++];this.Wd=a[b];return!0};f.Vm=function(){var a=0,b=[];b[a++]=this.Xc;b[a++]=this.Me;b[a++]=this.Ne;b[a++]=this.gg;b[a++]=this.hg;b[a++]=this.Wi;b[a++]=this.Xi;b[a]=this.Wd;return b};f.ei=function(a){this.$i=a};
function al(a){if(!a.Lh)for(var b=0;b<a.lg.length;b++)dl(a,a.lg[b])&&(a.Lh=!0)}function bl(a){if(a.Lh)for(var b=0;b<a.lg.length;b++){var c=a.lg[b];c&&(c.style.cursor="auto")}}function dl(a,b){return b?(b.addEventListener("mousemove",function(b){a.ho(b)},!1),b.addEventListener("mousedown",function(b){a.Xk(b.button,!0)},!1),b.addEventListener("mouseup",function(b){a.Xk(b.button,!1)},!1),b.style.cursor="none",!0):!1}
f.ho=function(a){if(this.Xc&&this.O&&this.O.fa.qb){if(0>this.Me||0>this.Ne)this.Me=a.clientX,this.Ne=a.clientY;this.$i?(this.gg=a.movementX||a.mozMovementX||a.webkitMovementX||0,this.hg=a.movementY||a.mozMovementY||a.webkitMovementY||0):(this.gg=a.clientX-this.Me,this.hg=a.clientY-this.Ne);(this.gg||this.hg)&&el(this,null,a.clientX,a.clientY);this.Me=a.clientX;this.Ne=a.clientY}};
f.Xk=function(a,b){if(this.Xc&&this.O&&this.O.fa.qb){var c;!(c=!1!==this.$i)&&(c=this.Bd.length)&&(c=this.Bd[0],c=c.sp?c.Qf(!0):!1);c||(this.$i=null);c="mouse button"+a+" "+(b?"dn":"up");switch(a){case 0:this.Wi!=b&&(this.Wi=b,el(this,c));break;case 2:this.Xi!=b&&(this.Xi=b,el(this,c))}}};
function el(a,b,c,d){var e=64|(a.Wi?32:0)|(a.Xi?16:0)|(a.hg&192)>>4|(a.gg&192)>>6,g=a.gg&63,l=a.hg&63;a.qa(4194304)&&a.$a((b?b+": ":"")+(void 0!==d?"mouse ("+c+","+d+"): ":"")+"serial packet ["+k(e)+","+k(g)+","+k(l)+"]",0,!0);Xk(a.Dh,[e,g,l]);a.gg=a.hg=0}Qa(function(){for(var a=lb(window.document,"pcjs","mouse"),b=0;b<a.length;b++){var c=a[b],d=jb(c),d=new cl(d);kb(d,c)}});
function fl(a,b,c){Wa.call(this,"Disk",{id:a.ao+".disk"+ ++gl},fl,2097152);this.Z=a;this.Fa=a.Fa;this.Y=a.Y;this.Ta=b;this.ie=b.name;this.Cg=b.Cg;this.aj=this.ve=!1;this.create(c,b.Db,b.Eb,b.Kb,b.wb);this.yf=[];this.vi=[];this.Je=null;this.jo=0;this.nl=!1;pb(this)}var gl=0;fb(fl);f=fl.prototype;f.Ic=function(a,b,c,d){this.Y=d};f.kc=function(a,b){b||!this.aj||this.ve||(pb(this,!1),this.load(this.ie,this.$f,null,this.pp,this));return!0};f.pp=function(){pb(this,!0)};
f.jc=function(a,b){if(this.ve){var c,d=0;if(this.nl&&!Da("Disk writes are still in progress, shut down anyway?"))return!1;for(;c=hl(this,!1);)if(d=c[0]){this.Z.Da('Unable to save "'+this.ie+'" (error '+d+")");break}b&&this.ve&&(c="action=close&volume="+this.$f,c+="&machine="+this.Z.Fg(),c+="&user="+this.Z.gf(),za(Aa()+"/api/v1/disk?"+c,!0),this.ve=!1);!d&&a&&this.Z.Da(this.ie+" saved")}return!0};
f.create=function(a,b,c,d,e){this.mode=a;this.Db=b;this.Eb=c;this.Kb=d;this.wb=e;this.hb=[];if("preload"!=this.mode){a=Array(this.Db);for(b=0;b<a.length;b++){c=Array(this.Eb);for(d=0;d<c.length;d++){e=Array(this.Kb);for(var g=1;g<=e.length;g++)e[g-1]=il(null,b,d,g,this.wb,"local"==this.mode?0:null);c[d]=e}a[b]=c}this.hb=a}this.wg=null};
f.load=function(a,b,c,d,e){var g=b;if(!this.Pf)if(this.ie=a,this.$f=b,this.Pf=d,this.jp=e||this.Z,c){var l=this,p=new FileReader;p.onload=function(){var a=p.result,b,c=a?a.byteLength:0,d=fa[c];if(d){l.Db=d[0];l.Eb=d[1];l.Kb=d[2];l.wb=512;b=l.wb>>2;var e=d=0,a=new DataView(a,0,c);l.hb=Array(l.Db);for(c=0;c<l.hb.length;c++)for(var g=l.hb[c]=Array(l.Eb),S=0;S<g.length;S++)for(var X=g[S]=Array(l.Kb),T=0;T<X.length;T++){for(var aa=il(null,c,S,T+1,l.wb,0),Ba=aa.data,pa=0;pa<b;pa++,e+=4)var Ra=Ba[pa]=a.getInt32(e,
!0),d=d+Ra&-1;aa.Uc=b;X[T]=aa}l.wg=d;b=l}else l.Da("Unrecognized diskette format ("+c+" bytes)");l.Pf&&(l.Pf.call(l.Z,l.Ta,b,l.ie,l.$f),l.Pf=null)};p.readAsArrayBuffer(c)}else 0>b.indexOf("/api/v1/dump")&&(a=ja(b),"json"==a?g=encodeURI(b):"demandrw"==this.mode||"demandro"==this.mode?(g=jl(this,b),this.aj=!0):(c="path",d="&mbhd=10",!b.indexOf("http:")||!b.indexOf("ftp:")||0<="dsk ima img 360 720 12 144".split(" ").indexOf(a)?(c="disk",d="&mbhd=0"):-1!==b.indexOf("/",b.length-1)&&(c="dir"),g=Aa()+"/api/v1/dump?"+
c+"="+encodeURIComponent(b)+(this.Cg?"":d)+"&format=json")),za(g,!0,null,this,this.np,b)};
f.np=function(a,b,c,d){var e=null;this.Eg=!1;var g=0>c&&this.Fa&&!this.Fa.fa.hc;if(this.aj)c?this.Z.Da('Unable to connect to disk "'+d+'" (error '+c+": "+b+")",g):(this.ve=!0,e=this);else if(c)this.Z.Da('Unable to load disk "'+this.ie+'" (error '+c+")",g);else try{if(0<ia(a,!0).toLowerCase().indexOf("-readonly"))this.Eg=!0;else{var l=b.indexOf("\n");0<l&&1024>l&&0<b.substring(0,l).indexOf("write-protected")&&(this.Eg=!0)}var p;p="<"==b.substr(0,1)?["Missing disk image: "+this.ie]:0>b.indexOf("0x")&&
'["'!=b.substr(0,2)?JSON.parse(b.replace(/([a-z]+):/gm,'"$1":').replace(/\/\/[^\n]*/gm,"")):eval("("+b+")");if(p.length)if(1==p.length)Ca(p[0]);else{this.Db=p.length;this.Eb=p[0].length;this.Kb=p[0][0].length;var w=p[0][0][0];this.wb=w&&w.length||512;for(b=a=0;b<this.Db;b++)for(c=0;c<this.Eb;c++)for(d=0;d<this.Kb;d++)if(w=p[b][c][d]){var v=w.length;void 0===v&&(v=w.length=512);var v=v>>2,E=w.pattern;void 0===E&&(E=w.pattern=0);var O=w.data;if(void 0===O){var J=w.bytes;if(void 0!==J&&J.length){for(var g=
v<<2,G=J.length;G<g;G++)J[G]=E;this.fill(w,J,0)}else O=[],E=w.pattern=E|E<<8|E<<16|E<<24,w.data=O;delete w.bytes}il(w,b,c);for(g=0;g<O.length;g++)a=a+O[g]&-1}this.hb=p;this.wg=a;e=this}else Ca("Empty disk image: "+this.ie)}catch(S){Ca("Disk image error: "+S.message)}this.Pf&&(this.Pf.call(this.jp,this.Ta,e,this.ie,this.$f),this.Pf=null)};function il(a,b,c,d,e,g){a||(a={sector:d,length:e,data:[],pattern:g});a.Cp=b;a.Ep=c;a.Ld=a.Uc=0;a.Ua=!1;return a}
function jl(a,b){var c;c="action=open&volume="+b+("&mode="+a.mode);c+="&chs="+a.Db+":"+a.Eb+":"+a.Kb+":"+a.wb;c+="&machine="+a.Z.Fg();c+="&user="+a.Z.gf();return Aa()+"/api/v1/disk?"+c}function kl(a,b,c,d,e,g,l){if(a.ve){var p;p="action=read&volume="+a.$f;p+="&chs="+a.Db+":"+a.Eb+":"+a.Kb+":"+a.wb;p=p+("&addr="+b+":"+c+":"+d+":"+e)+("&machine="+a.Z.Fg());p+="&user="+a.Z.gf();za(Aa()+"/api/v1/disk?"+p,g,null,a,a.qp,[b,c,d,e,g,l])}else l&&l(-1,!1)}
f.qp=function(a,b,c,d){var e=!1;a=d[0];var g=d[1],l=d[2],p=d[3];if(!c){b=JSON.parse(b);for(e=0;p--;){var w=this.seek(a,g,l,!0);if(!w)break;this.fill(w,b,e);e+=w.length;l++}e=d[4]}(d=d[5])&&d(c,e)};f.rp=function(a,b,c,d){a=d[0];b=d[1];var e=d[2],g=d[3];d=d[4];this.nl=!1;if(0<=a&&a<this.hb.length&&0<=b&&b<this.hb[a].length)for(--e;0<g--&&0<=e&&e<this.hb[a][b].length;e++){var l=this.hb[a][b][e];c?ll(this,l,!1):l.Ua||(l.Ld=l.Uc=0)}d&&ml(this)};
function ll(a,b,c){b.Ua=!0;var d=a.yf.indexOf(b);0<=d&&(a.yf.splice(d,1),a.vi.splice(d,1));a.yf.push(b);a.vi.push(ta());c&&ml(a)}function ml(a){if(a.yf.length){var b=a.vi[0]+2E3;a.Je&&a.jo<b&&(clearTimeout(a.Je),a.Je=null);if(!a.Je){var c=ta(),b=b-c;0>b&&(b=0);2E3<b&&(b=2E3);a.Je=setTimeout(function(){hl(a,!0)},b);a.jo=c+b}}else a.Je&&(clearTimeout(a.Je),a.Je=null)}
function hl(a,b){b&&(a.Je=null);var c=a.yf[0];if(c){for(var d=c.Cp,e=c.Ep,c=c.sector,g=0,l=[],p=c-1;p<a.hb[d][e].length;p++){var w=a.hb[d][e][p];if(!w.Ua)break;var v=a.yf.indexOf(w);a.yf.splice(v,1);a.vi.splice(v,1);l=l.concat(nl(w));w.Ua=!1;g++}a.ve?(p={},a.nl=!0,p.action="write",p.volume=a.$f,p.chs=a.Db+":"+a.Eb+":"+a.Kb+":"+a.wb,p.addr=d+":"+e+":"+c+":"+g,p.machine=a.Z.Fg(),p.user=a.Z.gf(),p.data=JSON.stringify(l),d=za(Aa()+"/api/v1/disk",b,p,a,a.rp,[d,e,c,g,b])):d=!1;return b||d}return!1}
f.info=function(){return this.hb.length?[this.hb.length,this.hb[0].length,this.hb[0][0].length,this.hb[0][0][0].length]:[0,0,0,0]};
f.seek=function(a,b,c,d,e){var g=null,l=this.Ta,p=this.hb[a];if(p){var w=p[b];if(!w&&l.Nk&&b<l.Eb)for(w=p[b]=Array(l.Xe),p=0;p<w.length;p++)w[p]=il(null,a,b,p+1,l.mb,0);if(w){for(p=0;p<w.length;p++)if(w[p]&&w[p].sector==c){g=w[p];if(null===g.pattern)if(d)g.pattern=0;else{for(d=1;++p<w.length;)null===w[p].pattern&&d++;kl(this,a,b,c,d,null!=e,function(a,b){a&&(g=null);e&&e(g,b)});return e?null:g}break}!g&&l.Nk&&9==l.cb&&(g=w[p]=il(null,a,b,l.cb,l.mb,0))}}e&&e(g,!1);return g};
f.fill=function(a,b,c){for(var d=a.length>>2,e=Array(d),g=0;g<d;g++)e[g]=b[c]|b[c+1]<<8|b[c+2]<<16|b[c+3]<<24,c+=4;a.data=e};function nl(a){var b=a.length,c=Array(b),d=0,b=b>>2,e=a.data;a=a.pattern;for(var g=0;g<b;g++){var l=g<e.length?e[g]:a;c[d++]=l&255;c[d++]=l>>8&255;c[d++]=l>>16&255;c[d++]=l>>24&255}return c}function ol(a,b){var c=-1;if(a&&b<a.length)var c=a.data,d=b>>2,c=(d<c.length?c[d]:a.pattern)>>((b&3)<<3)&255;return c}
f.write=function(a,b,c){if(this.Eg)return!1;if(b<a.length){if(c!=ol(a,b)){var d=a.data,e=a.pattern,g=b>>2;b=(b&3)<<3;for(var l=d.length;l<=g;l++)d[l]=e;a.Uc?g<a.Ld?(a.Uc+=a.Ld-g,a.Ld=g):g>=a.Ld+a.Uc&&(a.Uc+=g-(a.Ld+a.Uc)+1):(a.Ld=g,a.Uc=1);d[g]=d[g]&~(255<<b)|c<<b;this.ve&&ll(this,a,!0)}return!0}return null};
f.save=function(){var a=0,b=[];b[a++]=[this.$f,this.wg,this.Db,this.Eb,this.Kb,this.wb];if(!this.ve&&!this.Eg)for(var c=this.hb,d=0;d<c.length;d++)for(var e=0;e<c[d].length;e++)for(var g=0;g<c[d][e].length;g++){var l=c[d][e][g];if(l&&l.Uc){for(var p=[],w=0,v=l.Ld,E=l.Ld+l.Uc;v<E;)p[w++]=l.data[v++];b[a++]=[d,e,g,l.Ld,p]}}return b};
f.restore=function(a){var b=0,c="unsupported restore format";if(a&&0<a.length){var d=0,e=a[d++];e&&2<=e.length&&(!this.hb.length&&6<=e.length?this.create("local",e[2],e[3],e[4],e[5]):null!=e[1]&&null!=this.wg&&e[1]!=this.wg&&(c="original checksum ("+e[1]+") differs from current checksum ("+this.wg+")",b=-2));for(this.hb.length||(b=-1);d<a.length&&0<=b;){var g=0,l=a[d++],p=l[g++],w=l[g++],v=l[g++];if(p>=this.hb.length||w>=this.hb[p].length||v>=this.hb[p][w].length){c="sector (CHS="+p+":"+w+":"+v+") out of range ("+
b+" changes applied)";b=-1;break}if(this.Eg){c="unable to modify write-protected disk";b=-1;break}e=l[g++];g=l[g++];l=e+g.length;if(p=this.hb[p][w][v]){for(w=p.data.length;w<e;)p.data[w++]=p.pattern;w=0;p.Ld=e;for(p.Uc=g.length;e<l;)p.data[e++]=g[w++];b++}}}0>b&&-2!=b&&this.Z.Da("Unable to restore disk '"+this.ie+": "+c);return b};
f.toJSON=function(){var a=JSON.stringify(this.hb),a=a.replace(/,"length":512/gm,"").replace(/,"pattern":0/gm,""),a=a.replace(/"(sector|length|data|pattern)":/gm,"$1:"),a=a.replace(/,"[^"]*":([0-9]+|true|false)/gm,"");return a=a.replace(/(sector|length|data|pattern):/gm,'"$1":')};
function pl(a){Wa.call(this,"FDC",a,pl,524288);this.dmaRead=this.al;this.dmaWrite=this.bl;this.dmaFormat=this.kp;this.Hf=null;if(a.autoMount&&(this.Hf=a.autoMount,"string"==typeof this.Hf))try{this.Hf=eval("("+a.autoMount+")")}catch(b){Ca("FDC auto-mount error: "+b.message+" ("+a.autoMount+")"),this.Hf=null}this.Nc=[];this.On=!Ja("Mobi")&&window&&"FileReader"in window}fb(pl);ea={};ca={};
var ql={3:{qe:3,$e:0,name:ca.Ft},4:{qe:2,$e:1,name:ca.Dt},5:{qe:9,$e:7,name:ca.Rt},6:{qe:9,$e:7,name:ca.xt},7:{qe:2,$e:0,name:ca.zt},8:{qe:1,$e:2,name:ca.Et},10:{qe:2,$e:7,name:ca.yt},13:{qe:6,$e:7,name:ca.jt},15:{qe:3,$e:0,name:ca.Ct}};f=pl.prototype;
f.Lb=function(a,b,c){var d=this;switch(b){case "listDisks":return this.va[b]=c,c.onchange=function(){var a=d.va.descDisk,b=c.options[c.selectedIndex];if(a&&b){var l={};if(b=b.getAttribute("data-value"))try{l=eval("({"+b+"})")}catch(p){Ca("FDC option error: "+p.message)}b=l.desc;void 0===b&&(b="");l=l.href;void 0!==l&&(b='<a href="'+l+'" target="_blank">'+b+"</a>");a.innerHTML=b}},!0;case "descDisk":case "listDrives":return this.va[b]=c,c.onchange=function(){var a=ga(c.value,10);null!=a&&rl(d,a)},
!0;case "loadDrive":return this.va[b]=c,c.onclick=function(){var a=d.va.listDisks;a&&sl(d,a.options[a.selectedIndex].text,a.value)},!0;case "mountDrive":return this.On?(this.va[b]=c,c.addEventListener("change",function(){var a=c.children[0];a.children[1].disabled=!a.children[0].files.length}),c.onsubmit=function(a){if(a=a.currentTarget[1].files[0]){var b=a.name;sl(d,ia(b,!0),b,a)}return!1}):c.parentNode.removeChild(c),!0}return!1};
f.Ic=function(a,b,c,d){this.ma=b;this.O=c;this.Y=d;this.Fa=a;this.ja=yb(a,"ChipSet");this.we();oc(b,this,tl);sc(b,this,ul);this.On&&vl(this,"Local Disk","?");vl(this,"Remote Disk","??");this.vh()||pb(this)};
f.kc=function(a,b){if(!b){if(!a||!this.restore){if(this.reset(),this.Fa.jl){this.Nc=[];for(var c=0;c<this.Ea.length;c++)wl(this,c,!0);this.vh(!0)}}else if(!this.restore(a))return!1;if(c=this.va.listDrives){for(;c.firstChild;)c.removeChild(c.firstChild);c.textContent="";for(var d=0;d<this.Cl;d++){var e=window.document.createElement("option");e.value=d;e.textContent=String.fromCharCode(65+d)+":";c.appendChild(e)}0<this.Cl&&(c.value="0",rl(this,0))}}return!0};
f.jc=function(a){return a&&this.save?this.save():!0};f.reset=function(){this.we()};f.save=function(){var a=new Ie(this);a.set(0,this.Sm());return a.data()};f.restore=function(a){return this.we(a[0])};
f.we=function(a){var b=0,c,d=!0;void 0===a&&(a=[0,0,128,Array(9),0,0,0,[]]);this.rb=a[b++];b++;this.wa=a[b++];this.vc=a[b++];this.Hb=a[b++];this.pb=a[b++];this.bh=a[b++];var e=a[b++];c=a[b++];null!=c&&(this.Nc=c);void 0===this.Ea&&(this.Cl=4,this.ja&&(this.Cl=zi(this.ja)),this.Ea=Array(4));for(c=0;c<this.Ea.length;c++){var g=this.Ea[c];if(void 0===g){var g=this.Ea[c]={},l;if(this.ja)a:{l=this.ja;if(c<zi(l)){if(!l.Qe){l=360;break a}if(c<l.Qe.length){l=l.Qe[c];break a}}l=0}else l=0;switch(l){case 160:case 180:g.Eb=
1;default:g.Db=40;g.Kb=9;break;case 720:g.Db=80;g.Kb=9;break;case 1200:g.Db=80;g.Kb=15;break;case 1440:g.Db=80,g.Kb=18}}this.rl(g,c,e[c])||(d=!1)}this.tf=a[b++]||0;this.Co=a[b]||0;return d};f.Sm=function(){var a=0,b=[];b[a++]=this.rb;b[a++]=0;b[a++]=this.wa;b[a++]=this.vc;b[a++]=this.Hb;b[a++]=this.pb;b[a++]=this.bh;b[a++]=this.Um();for(var c=a++,d=0;d<this.Ea.length;d++){var e=this.Ea[d];e.xa&&xl(this,e.ag,e.xa)}b[c]=this.Nc;b[a++]=this.tf;b[a]=this.Co;return b};
f.rl=function(a,b,c){var d=0,e=!0;a.rb=b;a.Zc=a.Ag=!1;void 0===c&&(c=[192,!0,0,2,0]);"boolean"==typeof c[1]&&(c[1]=["Floppy Drive",a.Db||40,a.Eb||c[3],a.Kb||9,a.wb||512,c[1],a.lj,a.Zh,a.$h]);a.gb=c[d++];var g=c[d++];a.name=g[0];a.Db=g[1];a.Eb=g[2];a.Kb=g[3];a.wb=g[4];a.Cg=g[5];(a.lj=g[6])?(a.Zh=g[7],a.$h=g[8]):(a.lj=a.Db,a.Zh=a.Eb,a.$h=a.Kb);a.Sa=c[d++];a.Ve=c[d++];a.zb=c[d++];a.Ve=100<=a.Ve?a.Ve-100:a.Ve-a.zb;a.cb=c[d++];a.Xe=c[d++];a.mb=c[d++];a.Va=c[d++];a.Xa=null;a.xa||(a.ag="");var l=c[d++];
102==l&&(l=!1);"boolean"==typeof l?(g=c[d++],c=c[d],l?(d=this.Ea[b],wl(this,b,!0,!0),d.Ag=!0,b=new fl(this,d,"preload"),this.Hn(d,b,g,c,!0)):yl(this,b,g,c,!0)?a.xa&&c&&zl(this,g,c,a.xa):pb(this,!1)):void 0!==l&&a.xa&&0>a.xa.restore(l)&&(e=!1);e&&a.xa&&void 0!==a.Va&&(a.Xa=a.xa.seek(a.zb,a.Sa,a.cb));return e};f.Um=function(){for(var a=0,b=[],c=0;c<this.Ea.length;c++)b[a++]=this.Tm(this.Ea[c]);return b};
f.Tm=function(a){var b=0,c=[];c[b++]=a.gb;c[b++]=[a.name,a.Db,a.Eb,a.Kb,a.wb,a.Cg,a.lj,a.Zh,a.$h];c[b++]=a.Sa;c[b++]=a.Ve+100;c[b++]=a.zb;c[b++]=a.cb;c[b++]=a.Xe;c[b++]=a.mb;c[b++]=a.Va;c[b++]=a.Ag;c[b++]=a.Jo;c[b]=a.ag;return c};f.En=function(a){var b;a=this.Ea[a];if(void 0!==a){b={};for(var c in a)b[c]=a[c]}return b};f.Mo=function(a,b,c){if(a.xa){var d=a.xa.info(),e=d[2],g=d[1]*e;if(b+c<=d[0]*g)return a.zb=Math.floor(b/g),b%=g,a.Sa=Math.floor(b/e),a.cb=b%e+1,a.mb=c*d[3],a.gb=0,!0}return!1};
f.vh=function(a){a||(this.Df=0);if(this.Hf)for(var b in this.Hf){var c=this.Hf[b];if(c.name&&c.path){var d=b.charCodeAt(0)-65;if(0<=d&&d<this.Ea.length){!yl(this,d,c.name,c.path,!0)&&a&&pb(this,!1);continue}}this.Da("Unrecognized auto-mount specification for drive "+b)}return!!this.Df};
function sl(a,b,c,d){var e,g=a.va.listDrives;if(g&&!isNaN(e=ga(g.value,10))&&0<=e&&e<a.Ea.length)if(c)if("?"==c)a.Da('Use "Choose File" and "Mount" to select and load a local disk.');else{if("??"==c){c=window.prompt("Enter the URL of a remote disk image.","")||"";if(!c)return;b=ia(c);a.R("Attempting to load "+c+' as "'+b+'"')}for(a.R("loading disk "+c+"...");yl(a,e,b,c,!1,d)&&window.confirm("Click OK to reload the original disk.\n(WARNING: All disk changes will be discarded)");){for(var g=a,l=c,p=
void 0,p=0;p<g.Nc.length;p++)if(g.Nc[p][1]==l){g.Nc.splice(p,1);break}wl(a,e,!1,!0)}}else wl(a,e);else a.Da("Nothing to load")}function yl(a,b,c,d,e,g){var l=a.Ea[b];if(d&&l.ag!=d){wl(a,b,e,!0);if(l.Zc)return a.Da("Drive "+b+" busy"),!0;l.Zc=!0;e&&(l.Nf=!0,a.Df++,a.qa()&&a.$a("loading diskette '"+c+"'"));l.Ag=!!g;(new fl(a,l,"preload")).load(c,d,g,a.Hn);return!1}return!0}
f.Hn=function(a,b,c,d,e){var g;a.Zc=!1;b&&(g=b.info(),b&&g[0]>a.Db||g[1]>a.Eb)&&(this.Da('Diskette "'+c+'" too large for drive '+String.fromCharCode(65+a.rb)),b=null);b?(a.xa=b,a.Jo=c,a.ag=d,zl(this,c,d,b),g=b.info(),this.tf|=128,this.Da('Mounted diskette "'+c+'" in drive '+String.fromCharCode(65+a.rb),a.Nf||e),a.lj=g[0],a.Zh=g[1],a.$h=g[2]):a.Ag=!1;a.Nf&&(a.Nf=!1,--this.Df||pb(this));rl(this,a.rb)};
function vl(a,b,c){if(a=a.va.listDisks){for(var d=0;d<a.options.length;d++)if(a.options[d].value==c)return;d=window.document.createElement("option");d.value=c;d.textContent=b;a.appendChild(d)}}function rl(a,b){if(0<=b&&b<a.Ea.length){var c=a.Ea[b],d=a.va.listDisks,e=a.va.listDrives;if(d&&e&&(e=ga(e.value,10),c=c.Ag?"?":c.ag,!isNaN(e)&&e==b)){for(e=0;e<d.options.length;e++)if(d.options[e].value==c){d.selectedIndex!=e&&(d.selectedIndex=e);break}e==d.options.length&&(d.selectedIndex=0)}}}
function wl(a,b,c,d){var e=a.Ea[b];e.xa&&(xl(a,e.ag,e.xa),e.Jo="",e.ag="",e.xa=null,e.Ag=!1,a.tf|=128,d||a.Da("Drive "+String.fromCharCode(65+b)+" unloaded",c),c||d||rl(a,b))}function zl(a,b,c,d){var e;for(e=0;e<a.Nc.length;e++)if(a.Nc[e][1]==c){d.restore(a.Nc[e][2]);return}a.Nc[e]=[b,c,[]]}function xl(a,b,c){var d;for(d=0;d<a.Nc.length;d++)if(a.Nc[d][1]==b){a.Nc[d][2]=c.save();break}}f.Fr=function(a,b,c){m(this,a,b,c,"OUTPUT");b&4?this.bh&4||this.bh&8&&this.ja&&Wi(this.ja,6):this.we();this.bh=b};
f.bq=function(a,b){m(this,a,null,b,"STATUS",this.wa);return this.wa};f.$p=function(a,b){var c=0;this.Hb<this.pb&&(c=this.vc[this.Hb]);this.bh&8&&this.ja&&Xi(this.ja,6);this.qa()&&m(this,a,null,b,"DATA["+this.Hb+"]",c);++this.Hb>=this.pb&&(this.wa&=-81,this.Hb=this.pb=0);return c};
f.Er=function(a,b,c){this.qa()&&m(this,a,b,c,"DATA["+this.pb+"]");this.pb<this.vc.length&&(this.vc[this.pb++]=b);a=this.vc[0]&31;if(void 0!==ql[a]&&this.pb>=ql[a].qe){b=!1;this.Hb=0;a=this.Wa();var d,e,g,l,p=a&31;switch(p){case 3:this.Wa(ea.Gt);this.Wa(ea.mt);this.ec();break;case 4:c=this.Wa(ea.kh);this.rb=c&3;d=this.Ea[this.rb];this.ec();this.rc((d.gb&-16777216)>>>24,ea.Jt);break;case 5:case 6:c=this.Wa(ea.kh);b=c>>2&1;this.rb=c&3;d=this.Ea[this.rb];d.Sa=b;c=d.zb=this.Wa(ea.an);e=this.Wa(ea.bn);
g=d.cb=this.Wa(ea.dn);l=this.Wa(ea.Ak);d.mb=128<<l;d.Xe=this.Wa(ea.ht);this.Wa(ea.Xo);this.Wa(ea.gt);6==p?(p=d,p.gb=72,p.xa&&(p.Xa=null,p.gb=0,this.ja&&(Pi(this.ja,2,this,"dmaRead",p),Ii(this.ja,2)))):(p=d,p.gb=72,p.xa&&(p.xa.Eg?p.gb=576:(p.Xa=null,p.gb=0,this.ja&&(Pi(this.ja,2,this,"dmaWrite",p),Ii(this.ja,2)))));Al(this,d,a,b,c,e,g,l);b=!0;break;case 7:c=this.Wa(ea.kh);this.rb=c&3;d=this.Ea[this.rb];d.zb=d.Ve=0;d.gb=268435488;this.ec();b=!0;break;case 8:d=this.Ea[this.rb];d.Sa=0;this.ec();this.rc(d.rb|
d.Sa<<2|d.gb&255,ea.Zo);this.rc(d.zb,ea.vt);this.rb=this.rb+1&3;break;case 10:c=this.Wa(ea.kh);b=c>>2&1;this.rb=c&3;d=this.Ea[this.rb];c=d.zb;e=d.Sa=b;g=d.cb=1;l=0;d.gb=0;d.xa&&(d.Xa=d.xa.seek(d.zb,d.Sa,d.cb))?l=d.Xa.length:d.gb=72;Al(this,d,a,b,c,e,g,l);b=!0;break;case 13:c=this.Wa(ea.kh);b=c>>2&1;this.rb=c&3;d=this.Ea[this.rb];c=d.zb;e=d.Sa=b;g=1;l=this.Wa(ea.Ak);d.mb=128<<l;d.Xe=this.Wa(ea.Bt);this.Wa(ea.Xo);d.pn=this.Wa(ea.Wo);p=d;p.gb=72;p.xa&&(p.Xa=null,p.gb=0,this.ja&&(p.sg=0,p.gd=Array(4),
p.Nk=!0,p.Oi=0,Pi(this.ja,2,this,"dmaFormat",p),Ii(this.ja,2),p.Nk=!1));Al(this,d,a,b,c,e,g,l);b=!0;break;case 15:c=this.Wa(ea.kh),this.rb=c&3,d=this.Ea[this.rb],d.Sa=c>>2&1,c=this.Wa(ea.st),d.zb+=c-d.Ve,0>d.zb&&(d.zb=0),d.zb>=d.Db&&(d.zb=d.Db-1),d.Ve=c,d.gb=32,d.zb||(d.gb|=268435456),this.ec(),b=!0}0<this.pb&&(this.wa|=80);this.bh&8&&(!d||d.gb&8||!b||this.ja&&Wi(this.ja,6))}};f.aq=function(a,b){var c=this.tf;this.tf&=-129;m(this,a,null,b,"INPUT",c);return c};
f.Dr=function(a,b,c){m(this,a,b,c,"CONTROL");this.Co=b};function Al(a,b,c,d,e,g,l,p){a.ec();a.rc(b.rb|b.Sa<<2|b.gb&255,ea.Zo);a.rc((b.gb&65280)>>>8,ea.Ht);a.rc((b.gb&16711680)>>>16,ea.It);var w=0;if(e!=b.zb||g!=b.Sa)w=l=1;c&128&&(g^=w,d||(w=0));a.rc(e+w,ea.an);a.rc(g,ea.bn);a.rc(l,ea.dn);a.rc(p,ea.Ak)}f.Wa=function(){var a=this.vc[this.Hb];this.Hb++;return a};f.ec=function(){this.Hb=this.pb=0};f.rc=function(a){this.vc[this.pb++]=a};f.al=function(a,b,c){void 0===b||0>b?this.Xg(a,c):c(-1,!1)};
f.bl=function(a,b){return void 0!==b&&0<=b?this.jh(a,b):-1};f.kp=function(a,b){return void 0!==b&&0<=b?this.Xm(a,b):-1};f.Xg=function(a,b){var c=-1,d=null,e=0;if(!a.gb&&a.xa){do{if(a.Xa&&(e=a.Va,0<=(c=ol(a.Xa,a.Va++)))){d=a.Xa;break}a.Xa=a.xa.seek(a.zb,a.Sa,a.cb);if(!a.Xa){a.gb=1088;break}a.Va=0;this.uh(a)}while(1)}b(c,!1,d,e)};
f.jh=function(a,b){if(a.gb||!a.xa)return-1;do{if(a.Xa&&a.xa.write(a.Xa,a.Va++,b))break;a.Xa=a.xa.seek(a.zb,a.Sa,a.cb);if(!a.Xa){a.gb=8256;b=-1;break}a.Va=0;this.uh(a)}while(1);return b};f.uh=function(a){a.cb++;a.cb>=a.$h+1&&(a.cb=1,a.Sa++,a.Sa>=a.Zh&&(a.Sa=0,a.zb++))};f.Xm=function(a,b){if(a.gb)return-1;a.gd[a.sg++]=b;if(a.sg==a.gd.length){a.zb=a.gd[0];a.Sa=a.gd[1];a.cb=a.gd[2];a.mb=128<<a.gd[3];for(var c=a.sg=0;c<a.mb;c++)if(0>this.jh(a,a.pn))return-1;a.Oi++}a.Oi>=a.Xe&&(b=-1);return b};
var tl={1012:pl.prototype.bq,1013:pl.prototype.$p,1015:pl.prototype.aq},ul={1010:pl.prototype.Fr,1013:pl.prototype.Er,1015:pl.prototype.Dr};Qa(function(){for(var a=lb(window.document,"pcjs","fdc"),b=0;b<a.length;b++){var c=a[b],d=jb(c),d=new pl(d);kb(d,c)}});
function Bl(a){Wa.call(this,"HDC",a,Bl,1048576);this.dmaRead=this.al;this.dmaWrite=this.bl;this.dmaWriteBuffer=this.lp;this.dmaWriteFormat=this.mp;this.Dk=[];if(a.drives)try{this.Dk=eval("("+a.drives+")")}catch(b){Ca("HDC drive configuration error: "+b.message+" ("+a.drives+")")}this.Qh=(this.Mf="at"==a.type)?1:0;this.Dp=this.Mf?2:3}fb(Bl);
var Cl=[{0:[306,2],1:[375,8],2:[306,6],3:[306,4]},{1:[306,4],2:[615,4],3:[615,6],4:[940,8],5:[940,6],6:[615,4],7:[462,8],8:[733,5],9:[900,15],10:[820,3],11:[855,5],12:[855,7],13:[306,8],14:[733,7]}];f=Bl.prototype;f.Lb=function(){return!1};f.Ic=function(a,b,c,d){this.ma=b;this.O=c;this.Y=d;this.Fa=a;this.ja=yb(a,"ChipSet");oc(b,this,this.Mf?Dl:El);sc(b,this,this.Mf?Fl:Gl);Be(c,19,this,this.Eq);Be(c,64,this,this.Fq);this.reset();this.vh()||pb(this)};
f.kc=function(a,b){if(!b)if(!a||!this.restore)this.we(),this.Fa.jl&&this.vh(!0);else if(!this.restore(a))return!1;return!0};f.jc=function(a){return a&&this.save?this.save():!0};f.Fg=function(){return this.Fa?this.Fa.Fg():""};f.gf=function(){return this.Fa?this.Fa.gf():""};f.reset=function(){this.we(null,!0)};f.save=function(){var a=new Ie(this);a.set(0,this.Sm());return a.data()};f.restore=function(a){return this.we(a[0])};
f.we=function(a,b){var c=0,d=!0;if(this.Mf)null==a&&(a=[0,0,0,0,0,0,0,0,64,0]),this.sf=a[c++],this.Io=a[c++],this.uf=a[c++],this.pk=a[c++],this.lk=a[c++],this.kk=a[c++],this.$g=a[c++],this.wa=a[c++],this.Lm=a[c++],this.nk=a[c++];else{null==a&&(a=[0,0,Array(14),0,0]);this.Zg=a[c++];this.wa=a[c++];this.vc=a[c++];this.Hb=a[c++];this.pb=a[c++];this.Ho=a[c++];this.Go=a[c++];this.Fo=a[c++];var e=a[c++];void 0!==e?this.Hg=e:void 0===this.Hg&&(this.Hg=-1)}void 0===this.Ea&&(this.Ea=Array(this.Dk.length));
c=a[c];void 0===c&&(c=[]);for(e=0;e<this.Ea.length;e++){void 0===this.Ea[e]&&(this.Ea[e]={});var g=this.Ea[e];this.rl(e,g,this.Dk[e],c[e],b)||(d=!1);null!=this.Zg&&1>=e&&(this.Zg|=(g.type&3)<<(1-e<<1))}return d};
f.Sm=function(){var a=0,b=[];this.Mf?(b[a++]=this.sf,b[a++]=this.Io,b[a++]=this.uf,b[a++]=this.pk,b[a++]=this.lk,b[a++]=this.kk,b[a++]=this.$g,b[a++]=this.wa,b[a++]=this.Lm,b[a++]=this.nk):(b[a++]=this.Zg,b[a++]=this.wa,b[a++]=this.vc,b[a++]=this.Hb,b[a++]=this.pb,b[a++]=this.Ho,b[a++]=this.Go,b[a++]=this.Fo,b[a++]=this.Hg);b[a]=this.Um();return b};
f.rl=function(a,b,c,d,e){var g=0,l=!0;void 0===d&&(d=[0,0,!1,Array(8)]);b.rb=a;b.errorCode=d[g++];b.Oo=d[g++];b.Cg=d[g++];b.og=d[g++];b.pg=d[g++];b.Sa=d[g++];b.Eb=d[g++];b.Ke=d[g++];b.cb=d[g++];b.Xe=d[g++];b.mb=d[g++];b.Mi=this.Mf?0:1;b.name=c.name;void 0===b.name&&(b.name="Hard Drive");b.path=c.path;b.mode=c.mode||(b.path?"preload":"local");"demandro"!=b.mode&&"demandrw"!=b.mode||this.gf()||(b.mode="local");b.type=c.type;if(void 0===b.type||void 0===Cl[this.Qh][b.type])b.type=this.Dp;c=Cl[this.Qh][b.type];
b.Kb=c[2]||17;b.wb=c[3]||512;if(e&&this.ja&&(e=this.ja,c=b.type,e.ga)){var p=e.ga[18],p=a?p&240|c:p&15|c<<4;e.ga&&(e.ga[18]=p,ri(e))}void 0===b.xa&&(b.xa=null,this.Da("Type "+b.type+' "'+b.name+'" is fixed disk '+a,!0));Hl(this,b);b.Va=d[g++];b.Xa=null;b.xa&&(a=d[g],void 0!==a&&0>b.xa.restore(a)&&(l=!1),l&&void 0!==b.Va&&(b.Xa=b.xa.seek(b.Ke,b.Sa,b.cb+b.Mi)));return l};f.Um=function(){for(var a=0,b=[],c=0;c<this.Ea.length;c++)b[a++]=this.Tm(this.Ea[c]);return b};
f.Tm=function(a){var b=0,c=[];c[b++]=a.errorCode;c[b++]=a.Oo;c[b++]=a.Cg;c[b++]=a.og;c[b++]=a.pg;c[b++]=a.Sa;c[b++]=a.Eb;c[b++]=a.Ke;c[b++]=a.cb;c[b++]=a.Xe;c[b++]=a.mb;c[b++]=a.Va;c[b]=a.xa?a.xa.save():null;return c};f.En=function(a){var b;a=this.Ea[a];if(void 0!==a){b={};for(var c in a)b[c]=a[c]}return b};
function Hl(a,b,c){if(b){var d=0,e=0;null==c&&((d=b.og[2])?e=b.og[0]<<8|b.og[1]:c=b.type);null==c||d||(d=Cl[a.Qh][c][1],e=Cl[a.Qh][c][0]);d&&((c=Cl[a.Qh][b.type])&&e!=c[0]&&d!=c[1]&&a.Da("Warning: drive parameters ("+e+","+d+") do not match drive type "+b.type+" ("+c[0]+","+c[1]+")"),b.Db=e,b.Eb=d,null==b.xa&&(b.xa=new fl(a,b,b.mode)))}}
f.Mo=function(a,b,c){if(a.xa){var d=a.xa.info(),e=d[0];if(e){var g=d[2],l=d[1]*g;if(b+c<=e*l)return a.Ke=Math.floor(b/l),b%=l,a.Sa=Math.floor(b/g),a.cb=b%g,a.mb=c*d[3],a.errorCode=0,!0}}return!1};
f.vh=function(a){a||(this.Df=0);for(var b=0;b<this.Ea.length;b++){var c=this.Ea[b];if(c.name&&c.path){if(!(a&&c.xa&&c.xa.aj)){var d;d=c.name;var c=c.path,e=this.Ea[b];e.Zc?(this.Da("Drive "+b+" busy"),d=!0):(e.Zc=!0,e.Nf=!0,this.Df++,this.qa()&&this.$a("loading "+d),(e.xa||new fl(this,e,e.mode)).load(d,c,null,this.op),d=!1);!d&&a&&pb(this,!1)}}else a&&void 0!==c.type&&(c.xa=null,Hl(this,c,c.type))}return!!this.Df};
f.op=function(a,b,c){a.Zc=!1;(a.xa=b)&&this.Da('Mounted disk "'+c+'" in drive '+String.fromCharCode(67+a.rb),a.Nf);a.Nf&&(a.Nf=!1,--this.Df||pb(this))};f.Bq=function(a,b){var c=0;this.Hb<this.pb&&(c=this.vc[this.Hb]);this.ja&&Xi(this.ja,5);this.wa&=-33;m(this,a,null,b,"DATA["+this.Hb+"]",c);++this.Hb>=this.pb&&(this.Hb=this.pb=0,this.wa&=-15);return c};
f.as=function(a,b,c){m(this,a,b,c,"DATA["+this.pb+"]");this.pb<this.vc.length&&(this.vc[this.pb++]=b);a=12!=this.vc[0]?6:this.vc.length;6==this.pb&&(this.wa&=-2);this.pb>=a&&(this.wa|=2,this.wa&=-2,Il(this))};f.Cq=function(a,b){var c=this.wa;m(this,a,null,b,"STATUS",c);this.Hb<this.pb&&(this.wa|=1);return c};f.es=function(a,b,c){m(this,a,b,c,"RESET");this.Ho=b;this.ja&&Xi(this.ja,5);this.we()};f.Aq=function(a,b){m(this,a,null,b,"CONFIG",this.Zg);return this.Zg};
f.ds=function(a,b,c){m(this,a,b,c,"PULSE");this.Go=b;this.wa=13};f.cs=function(a,b,c){m(this,a,b,c,"PATTERN");this.Fo=b};f.Im=function(a,b,c){m(this,a,b,c,"NOISE")};
f.Kp=function(a,b){var c=-1;if(this.Ta){var d=this,c=this.Xg(this.Ta,function(){});1==this.Ta.Va?this.qa(1048832)&&m(this,a,null,b,"DATA["+this.Ta.Va+"]",c):this.Ta.Va==this.Ta.wb&&(this.Ta.mb-=this.Ta.wb,this.uf=this.uf-1&255,this.Ta.mb>=this.Ta.wb?(d.wa=136,this.Xg(this.Ta,function(a){0<=a?(Jl(d),d.wa=80):(d.wa=1,d.sf=16)},!1)):this.wa=80)}return c};
f.lr=function(a,b,c){this.Ta&&this.Ta.mb>=this.Ta.wb&&(0>this.jh(this.Ta,b)?(this.wa=1,this.sf=16):1==this.Ta.Va?this.qa(1048832)&&m(this,a,b,c,"DATA["+this.Ta.Va+"]"):this.Ta.Va==this.Ta.wb&&(this.Ta.mb-=this.Ta.wb,this.uf=this.uf-1&255,Jl(this),this.wa=80,this.Ta.mb>=this.Ta.wb&&(this.wa|=8)))};f.Mp=function(a,b){var c=this.sf;m(this,a,null,b,"ERROR",c);return c};f.qr=function(a,b,c){m(this,a,b,c,"WPREC");this.Io=b};f.Np=function(a,b){var c=this.uf;m(this,a,null,b,"SECCNT",c);return c};
f.or=function(a,b,c){m(this,a,b,c,"SECCNT");this.uf=b};f.Op=function(a,b){var c=this.pk;m(this,a,null,b,"SECNUM",c);return c};f.pr=function(a,b,c){m(this,a,b,c,"SECNUM");this.pk=b};f.Jp=function(a,b){var c=this.lk;m(this,a,null,b,"CYLLO",c);return c};f.kr=function(a,b,c){m(this,a,b,c,"CYLLO");this.lk=b};f.Ip=function(a,b){var c=this.kk;m(this,a,null,b,"CYLHI",c);return c};f.jr=function(a,b,c){m(this,a,b,c,"CYLHI");this.kk=b};f.Lp=function(a,b){var c=this.$g;m(this,a,null,b,"DRVHD",c);return c};
f.mr=function(a,b,c){m(this,a,b,c,"DRVHD");this.$g=b;this.wa=this.Ea[this.$g&16?1:0]?this.wa|64:this.wa&-65};f.Pp=function(a,b){var c=this.wa;m(this,a,null,b,"STATUS",c);return c};f.ir=function(a,b,c){m(this,a,b,c,"COMMAND");this.Lm=b;this.ja&&Xi(this.ja,14);Kl(this)};f.nr=function(a,b,c){m(this,a,b,c,"FDR");this.nk&4&&!(b&4)&&(this.sf=1);this.nk=b};
function Kl(a){var b=!1,c=a.Lm,d=a.$g&16?1:0,e=a.$g&15,g=a.lk|(a.kk&3)<<8,l=a.pk,p=a.uf||256;a.Ta=null;a.sf=0;a.wa=80;(d=a.Ea[d])?(d.Ke=g,d.Sa=e,d.cb=l,d.mb=p*d.wb,c=144<=c?c:c&240,d.Xa=null,d.Va=0,d.errorCode=0,a.Ta=d):c=-1;switch(c&240){case 32:a.wa=136;a.Xg(d,function(b){0<=b&&a.ja?(Jl(a),a.wa=80):(a.wa=1,a.sf=16)},!1);break;case 48:a.wa=8;break;case 16:b=!0;break;case 64:b=!0;break;case 144:a.sf=1;b=!0;break;case 145:d.Eb=e+1,d.Kb=p,b=!0}b&&Jl(a)}
function Jl(a){!a.ja||a.nk&2||Wi(a.ja,14,120)}
function Il(a){a.Hb=0;var b=a.Wa(),c=a.Wa(),d=c&32,e=d>>5,g=c&31,l=a.Wa(),p=a.Wa(),w=l<<2&768|p,v=l&63,E=a.Wa(),O=a.Wa(),J=a.Ea[e];J&&(J.Ke=w,J.Sa=g,J.cb=v,J.mb=E*J.wb);switch(b){case 3:a.ec(J?J.errorCode:4);a.rc(c);a.rc(l);a.rc(p);a.rc(0|d);b=-1;break;case 12:for(c=0;0<=(b=a.Wa());)J&&c<J.og.length&&(J.og[c++]=b);J&&Hl(a,J);b=0;J||a.Hg!=e||(a.Hg=-1,b=2);a.ec(b|d);b=-1;break;case 224:case 228:a.ec(0|d),b=-1}if(0<=b)switch(void 0===J?b=-1:(J.errorCode=0,J.Oo=0),b){case 0:a.ec(0|d);break;case 1:J.Xt=
O;a.ec(0|d);break;case 5:a.ec(0|d);break;case 8:Ll(a,J,function(b){a.ec(b|d)});break;case 10:Ml(a,J,function(b){a.ec(b|d)});break;case 15:Nl(a,J,function(b){a.ec(b|d)});break;default:a.ec(2|d)}}f.Wa=function(){var a=-1;this.Hb<this.pb&&(a=this.vc[this.Hb++]);return a};f.ec=function(a){this.Hb=this.pb=0;void 0!==a&&this.rc(a);this.ja&&Wi(this.ja,5);this.wa|=32};f.rc=function(a){this.vc[this.pb++]=a};f.al=function(a,b,c){void 0===b||0>b?this.Xg(a,c):c(-1,!1)};
f.bl=function(a,b){return void 0!==b&&0<=b?this.jh(a,b):-1};f.lp=function(a,b){var c;void 0!==b&&0<=b?(c=b,a.Va<a.pg.length?a.pg[a.Va++]=c:(a.errorCode=20,c=-1)):c=-1;return c};f.mp=function(a,b){return void 0!==b&&0<=b?this.Xm(a,b):-1};function Ll(a,b,c){b.errorCode=4;if(b.xa&&(b.Xa=null,a.ja)){b.errorCode=0;Pi(a.ja,3,a,"dmaRead",b);Ii(a.ja,3,function(a){a||0!=b.errorCode||(b.errorCode=4);c(b.errorCode?2:0)});return}c(b.errorCode?2:0)}
function Ml(a,b,c){b.errorCode=4;if(b.xa&&(b.Xa=null,a.ja)){b.errorCode=0;Pi(a.ja,3,a,"dmaWrite",b);Ii(a.ja,3,function(a){a||(0==b.errorCode&&(b.errorCode=4),20==b.errorCode&&(b.errorCode=0));c(b.errorCode?2:0)});return}c(b.errorCode?2:0)}function Nl(a,b,c){b.errorCode=4;b.pg&&b.pg.length==b.mb||(b.pg=Array(b.mb));b.Va=0;a.ja?(b.errorCode=0,Pi(a.ja,3,a,"dmaWriteBuffer",b),Ii(a.ja,3,function(a){a||0!=b.errorCode||(b.errorCode=4);c(b.errorCode?2:0)})):c(b.errorCode?2:0)}
f.Xg=function(a,b,c){var d=-1,e=null,g=0;if(a.errorCode)return b&&b(d,!1,e,g),d;var l=!1!==c?1:0;if(a.Xa&&(g=a.Va,d=ol(a.Xa,a.Va),a.Va+=l,0<=d))return e=a.Xa,b&&b(d,!1,e,g),d;if(b){var p=this;if(a.xa)return a.xa.seek(a.Ke,a.Sa,a.cb+a.Mi,!1,function(c,v){(a.Xa=c)?(e=c,g=a.Va=0,p.uh(a),d=ol(a.Xa,a.Va),a.Va+=l):a.errorCode=20;b(d,v,e,g)}),d;a.errorCode=20;b(d,!1,e,g)}return d};
f.jh=function(a,b){if(a.errorCode)return-1;do{if(a.Xa&&a.xa.write(a.Xa,a.Va++,b))break;a.xa&&a.xa.seek(a.Ke,a.Sa,a.cb+a.Mi,!0,function(b){a.Xa=b});if(!a.Xa){a.errorCode=20;b=-1;break}a.Va=0;this.uh(a)}while(1);return b};f.uh=function(a){a.cb++;var b=1-a.Mi;a.cb>=a.Kb+b&&(a.cb=b,a.Sa++,a.Sa>=a.Eb&&(a.Sa=0,a.Ke++))};
f.Xm=function(a,b){if(a.errorCode)return-1;a.gd[a.sg++]=b;if(a.sg==a.gd.length){a.Ke=a.gd[0];a.Sa=a.gd[1];a.cb=a.gd[2];a.mb=128<<a.gd[3];for(var c=a.sg=0;c<a.mb;c++)if(0>this.jh(a,a.pn))return-1;a.Oi++}a.Oi>=a.Xe&&(b=-1);return b};f.Eq=function(){var a=this.O.H&255;!(this.O.F>>8)&&128<a&&(this.Hg=a-128);return!0};f.Fq=function(){var a;(a=this.O.F>>8||!this.ja)||(a=!(this.ja.cc[0].Vd&64));return a?!0:!1};
var El={800:Bl.prototype.Bq,801:Bl.prototype.Cq,802:Bl.prototype.Aq},Dl={496:Bl.prototype.Kp,497:Bl.prototype.Mp,498:Bl.prototype.Np,499:Bl.prototype.Op,500:Bl.prototype.Jp,501:Bl.prototype.Ip,502:Bl.prototype.Lp,503:Bl.prototype.Pp},Gl={800:Bl.prototype.as,801:Bl.prototype.es,802:Bl.prototype.ds,803:Bl.prototype.cs,807:Bl.prototype.Im,811:Bl.prototype.Im,815:Bl.prototype.Im},Fl={496:Bl.prototype.lr,497:Bl.prototype.qr,498:Bl.prototype.or,499:Bl.prototype.pr,500:Bl.prototype.kr,501:Bl.prototype.jr,
502:Bl.prototype.mr,503:Bl.prototype.ir,1014:Bl.prototype.nr};Qa(function(){for(var a=lb(window.document,"pcjs","hdc"),b=0;b<a.length;b++){var c=a[b],d=jb(c),d=new Bl(d);kb(d,c)}});
function Ol(a){Wa.call(this,"Debugger",a,Ol);this.yh=this.Md=-1;this.tg=4;this.fo=65535;this.Gf=5;this.eo=1048575;this.nd=Pl(this);this.Gn=Pl(this);this.rd=-1;this.fd=[];this.xg=!1;this.Lf=Pl(this);this.Rc=[];Ql(this);Rl(this);Sl(this,a.messages);this.Rm=a.commands;var b=this;window?void 0===window.$&&(window.$=function(a){return Tl(b,a)}):void 0===global.$&&(global.$=function(a){return Tl(b,a)})}fb(Ol);
var Ul={16:262144,19:524288,21:32768,22:65536,28:2048,33:134217728,51:33554432},Vl={"?":"help","a [#]":"assemble","b [#]":"breakpoint",c:"clear output","d [#]":"dump memory","e [#]":"edit memory",f:"frequencies","g [#]":"go [to #]","h [#]":"halt/history","i [#]":"input port #",k:"stack trace",l:"load sector(s)",m:"messages","o [#]":"output port #",p:"step over",r:"dump/edit registers","t [#]":"step instruction(s)","u [#]":"unassemble",x:"execution options",reset:"reset computer",ver:"display version"},
Wl="INVALID AAA AAD AAM AAS ADC ADD AND ARPL AS: BOUND BSF BSR BT BTC BTR BTS CALL CBW CLC CLD CLI CLTS CMC CMP CMPSB CMPSW CS: CWD DAA DAS DEC DIV DS: ENTER ES: ESC FADD FBLD FBSTP FCOM FCOMP FDIV FDIVR FIADD FICOM FICOMP FIDIV FIDIVR FILD FIMUL FIST FISTP FISUB FISUBR FLD FLDCW FLDENV FMUL FNSAVE FNSTCW FNSTENV FNSTSW FRSTOR FS: FST FSTP FSUB FSUBR GS: HLT IDIV IMUL IN INC INS INT INT3 INTO IRET JBE JC JCXZ JG JGE JL JLE JMP JA JNC JNO JNP JNS JNZ JO JP JS JZ LAHF LAR LDS LEA LEAVE LES LFS LGDT LGS LIDT LLDT LMSW LOADALL LOCK LODSB LODSW LOOP LOOPNZ LOOPZ LSL LSS LTR MOV MOVSB MOVSW MOVSX MOVZX MUL NEG NOP NOT OR OS: OUT OUTS POP POPA POPF PUSH PUSHA PUSHF RCL RCR REPNZ REPZ RET RETF ROL ROR SAHF SALC SAR SBB SCASB SCASW SETBE SETC SETG SETGE SETL SETLE SETNBE SETNC SETNO SETNP SETNS SETNZ SETO SETP SETS SETZ SGDT SHL SHLD SHR SHRD SIDT SLDT SMSW SS: STC STD STI STOSB STOSW STR SUB TEST VERR VERW WAIT XCHG XLAT XOR".split(" "),
Xl=[8086,80186,80286,80386],Yl="AL CL DL BL AH CH DH BH AX CX DX BX SP BP SI DI ES CS SS DS FS GS IP PS EAX ECX EDX EBX ESP EBP ESI EDI CR0 CR1 CR2 CR3".split(" "),Zl="BX+SI BX+DI BP+SI BP+DI SI DI BP BX EAX ECX EDX EBX ESP EBP ESI EDI".split(" "),$l={cpu:1,seg:2,desc:4,tss:8,"int":16,fault:32,bus:64,mem:128,port:256,dma:512,pic:1024,timer:2048,cmos:4096,rtc:8192,8042:16384,chipset:32768,keyboard:65536,key:131072,video:262144,fdc:524288,hdc:1048576,disk:2097152,serial:4194304,speaker:8388608,state:16777216,
mouse:33554432,computer:67108864,dos:134217728,data:268435456,log:536870912,warn:1073741824,halt:-2147483648},am=[0,0],bm=[205,12291],cm=[[6,12417,4257],[6,12420,4260],[6,12449,4225],[6,12452,4228],[6,12385,4097],[6,14436,4100],[136,4211],[133,8307],[129,12417,4257],[129,12420,4260],[129,12449,4225],[129,12452,4228],[129,12385,4097],[129,14436,4100],[136,4467],[133,8563],[5,12417,4257],[5,12420,4260],[5,12449,4225],[5,12452,4228],[5,12385,4097],[5,14436,4100],[136,4723],[133,8819],[150,12417,4257],
[150,12420,4260],[150,12449,4225],[150,12452,4228],[150,12385,4097],[150,14436,4100],[136,4979],[133,9075],[7,12417,4257],[7,12420,4260],[7,12449,4225],[7,12452,4228],[7,12385,4097],[7,14436,4100],[35,15],[29],[184,12417,4257],[184,12420,4260],[184,12449,4225],[184,12452,4228],[184,12385,4097],[184,14436,4100],[27,15],[30],[191,12417,4257],[191,12420,4260],[191,12449,4225],[191,12452,4228],[191,12385,4097],[191,14436,4100],[177,15],[1],[24,4225,4257],[24,4228,4260],[24,4257,4225],[24,4260,4228],[24,
4193,4097],[24,6244,4100],[33,15],[4],[74,14436],[74,14692],[74,14948],[74,15204],[74,15460],[74,15716],[74,15972],[74,16228],[31,14436],[31,14692],[31,14948],[31,15204],[31,15460],[31,15716],[31,15972],[31,16228],[136,6244],[136,6500],[136,6756],[136,7012],[136,7268],[136,7524],[136,7780],[136,8036],[133,10340],[133,10596],[133,10852],[133,11108],[133,11364],[133,11620],[133,11876],[133,12132],[137,32768],[134,32768],[10,37028,4232],[8,8323,4259],[64,49167],[69,49167],[130,49167],[9,49167],[136,
36868],[72,45219,4235],[136,36866],[72,45219,4234],[75,41041,6756],[75,41044,6756],[132,39524,4161],[132,39524,4164],[94,4145],[90,4145],[81,4145],[89,4145],[97,4145],[93,4145],[80,4145],[88,4145],[96,4145],[92,4145],[95,4145],[91,4145],[85,4145],[84,4145],[86,4145],[83,4145],[192,12417,4097],[193,12420,4100],[192,12417,4097],[194,12420,4097],[185,4225,4257],[185,4228,4260],[189,12449,12417],[189,12452,12420],[120,8321,4257],[120,8324,4260],[120,8353,4225],[120,8356,4228],[120,8324,4275],[101,8356,
148],[120,8371,4228],[133,8324],[127],[189,14436,14692],[189,14436,14948],[189,14436,15204],[189,14436,15460],[189,14436,15716],[189,14436,15972],[189,14436,16228],[18],[28],[17,4103],[188],[138],[135],[147],[98],[120,8289,4129],[120,10340,4132],[120,8225,4193],[120,8228,6244],[121,8273,4161],[122,8276,4164],[25,4177,4161],[26,4180,4164],[185,4193,4097],[185,6244,4100],[181,8273,4193],[182,8276,6244],[112,8289,4161],[113,10340,4164],[151,4193,4177],[152,6244,4180],[120,8289,4097],[120,8545,4097],
[120,8801,4097],[120,9057,4097],[120,9313,4097],[120,9569,4097],[120,9825,4097],[120,10081,4097],[120,10340,4100],[120,10596,4100],[120,10852,4100],[120,11108,4100],[120,11364,4100],[120,11620,4100],[120,11876,4100],[120,12132,4100],[195,28801,4097],[196,28804,4097],[143,4099],[143],[103,8356,4246],[100,8356,4246],[120,8321,4097],[120,8324,4100],[34,36867,4097],[102,32768],[144,4099],[144],[77],[76,4097],[78],[79],[197,12417,4113],[198,12420,4113],[199,12417,4449],[200,12420,4449],[3,1],[2,1],[148],
[190],[36,4228],[36,4228],[36,4228],[36,4228],[36,4228],[36,4228],[36,4228],[36,4228],[115,4145],[116,4145],[114,4145],[82,4145],[73,8289,4097],[73,10340,4097],[131,4097,4193],[131,4097,6244],[17,4148],[87,4148],[87,4103],[87,4145],[73,8289,6756],[73,10340,6756],[131,6756,4193],[131,6756,6244],[111,15],[0],[141,15],[142,15],[70],[23],[201,12417],[202,12420],[19],[178],[21],[180],[20],[179],[203,12417],[204,12420]],dm={0:[206,12419],1:[207,12419],2:[99,41123,4243],3:[117,41123,4243],5:[110,32768],
6:[22,32768],32:[120,57509,4309],34:[120,57557,4261],128:[94,53300],129:[90,53300],130:[81,53300],131:[89,53300],132:[97,53300],133:[93,53300],134:[80,53300],135:[88,53300],136:[96,53300],137:[92,53300],138:[95,53300],139:[91,53300],140:[85,53300],141:[84,53300],142:[86,53300],143:[83,53300],144:[165,57473],145:[161,57473],146:[154,57473],147:[160,57473],148:[168,57473],149:[164,57473],150:[153,57473],151:[159,57473],152:[167,57473],153:[163,57473],154:[166,57473],155:[162,57473],156:[157,57473],
157:[156,57473],158:[158,57473],159:[155,57473],160:[136,54387],161:[133,58483],163:[13,53380,4260],164:[171,57476,4260,4097],165:[171,57476,4260,4449],168:[136,54643],169:[133,58739],171:[16,57476,4260],172:[173,57476,4260,4097],173:[173,57476,4260,4449],175:[72,61572,4260],178:[118,8356,4246],179:[15,57476,4260],180:[104,8356,4246],181:[106,8356,4246],182:[124,57508,4225],183:[124,57509,4227],186:[208,61572,4097],187:[14,57476,4260],188:[11,57508,4228],189:[12,57508,4228],190:[123,57508,4225],191:[123,
57509,4227]},em=[[[6,12417,4097],[129,12417,4097],[5,12417,4097],[150,12417,4097],[7,12417,4097],[184,12417,4097],[191,12417,4097],[24,4225,4097]],[[6,12420,4100],[129,12420,4100],[5,12420,4100],[150,12420,4100],[7,12420,4100],[184,12420,4100],[191,12420,4100],[24,4228,4100]],[[6,12420,4098],[129,12420,4098],[5,12420,4098],[150,12420,4098],[7,12420,4098],[184,12420,4098],[191,12420,4098],[24,4228,4098]],[[145,45185,4097],[146,45185,4097],[139,45185,4097],[140,45185,4097],[170,45185,4097],[172,45185,
4097],am,[149,45185,4097]],[[145,45188,4097],[146,45188,4097],[139,45188,4097],[140,45188,4097],[170,45188,4097],[172,45188,4097],am,[149,45188,4097]],[[145,12417,4113],[146,12417,4113],[139,12417,4113],[140,12417,4113],[170,12417,4113],[172,12417,4113],am,[149,12417,4113]],[[145,12420,4113],[146,12420,4113],[139,12420,4113],[140,12420,4113],[170,12420,4113],[172,12420,4113],am,[149,12420,4113]],[[145,12417,4449],[146,12417,4449],[139,12417,4449],[140,12417,4449],[170,12417,4449],[172,12417,4449],
am,[149,12417,4449]],[[145,12420,4449],[146,12420,4449],[139,12420,4449],[140,12420,4449],[170,12420,4449],[172,12420,4449],am,[149,12420,4449]],[[185,4225,4097],am,[128,12417],[126,12417],[125,4225],[72,12417],[32,4225],[71,12417]],[[185,4228,4100],am,[128,12420],[126,12420],[125,4228],[72,12420],[32,4228],[71,12420]],[[74,12417],[31,12417],am,am,am,am,am,am],[[74,12420],[31,12420],[17,4228],[17,4231],[87,4228],[87,4231],[136,4228],am],[],[[175,41091],[183,41091],[108,36995],[119,36995],[186,36995],
[187,36995],am,am],[[169,41091],[174,41091],[105,36995],[107,36995],[176,41091],am,[109,36995],am],[am,am,am,am,[13,53380,4097],[16,57476,4097],[15,57476,4097],[14,57476,4097]]],fm={19:{0:"disk reset",1:"get status",2:"read drive DL (CH:DH:CL,AL) into ES:BX",3:"write drive DL (CH:DH:CL,AL) from ES:BX",4:"verify drive DL (CH:DH:CL,AL)",5:"format drive DL using ES:BX",8:"read drive DL parameters into ES:DI",21:"get drive DL DASD type",22:"get drive DL change line status",23:"set drive DL DASD type",
24:"set drive DL media type"},21:{128:"open device",129:"close device",130:"program termination",131:"wait CX:DXus for event",132:"joystick support",133:"SYSREQ pressed",134:"wait CX:DXus",135:"move block (CX words)",136:"get extended memory size",137:"processor to virtual mode",144:"device busy loop",145:"interrupt complete flag set"},33:{0:"terminate program",1:"read character (al) from stdin with echo",2:"write character DL to stdout",3:"read character (al) from stdaux",4:"write character DL to stdaux",
5:"write character DL to stdprn",6:"direct console output (input if DL=FF)",7:"direct console input without echo",8:"read character (al) from stdin without echo",9:"write $-terminated string DS:DX to stdout",10:"buffered input (ds:dx)",11:"get stdin status",12:"flush buffer and read stdin",13:"disk reset",14:"select default drive DL",15:"open file using fcb DS:DX",16:"close file using fcb DS:DX",17:"find first matching file using fcb DS:DX",18:"find next matching file using fcb DS:DX",19:"delete file using fcb DS:DX",
20:"sequential read from file using fcb DS:DX",21:"sequential write to file using fcb DS:DX",22:"create or truncate file using fcb DS:DX",23:"rename file using fcb DS:DX",25:"get current default drive (al)",26:"set disk transfer area (dta) DS:DX",27:"get allocation information for default drive",28:"get allocation information for specific drive DL",31:"get drive parameter block for default drive",33:"read random record from file using fcb DS:DX",34:"write random record to file using fcb DS:DX",35:"get file size using fcb DS:DX",
36:"set random record number for fcb DS:DX",37:"set address DS:DX of interrupt vector AL",38:"create new program segment prefix (psp) at segment DX",39:"random block read from file using fcb DS:DX",40:"random block write to file using fcb DS:DX",41:"parse filename DS:SI into fcb ES:DI using AL",42:"get system date (year=cx, mon=dh, day=dl)",43:"set system date (year=CX, mon=DH, day=DL)",44:"get system time (hour=ch, min=cl, sec=dh, 100ths=dl)",45:"set system time (hour=CH, min=CL, sec=DH, 100ths=DL)",
46:"set verify flag AL",47:"get disk transfer area address (es:bx)",48:"get DOS version (al=major, ah=minor)",49:"terminate and stay resident",50:"get drive parameter block (dpb=ds:bx) for drive DL",51:"extended break check",52:"get address (es:bx) of InDOS flag",53:"get address (es:bx) of interrupt vector AL",54:"get free disk space of drive DL",55:"get(0)/set(1) switch character DL (AL)",56:"get country-specific information",57:"create subdirectory DS:DX",58:"remove subdirectory DS:DX",59:"set current directory DS:DX",
60:"create or truncate file DS:DX with attributes CX",61:"open existing file DS:DX with mode AL",62:"close file BX",63:"read CX bytes from file BX into buffer DS:DX",64:"write CX bytes to file BX from buffer DS:DX",65:"delete file DS:DX",66:"set position CX:DX of file BX relative to AL",67:"get(0)/set(1) attributes CX of file DS:DX (AL)",68:"get device information (IOCTL)",69:"duplicate file handle BX",70:"force file handle CX to duplicate file handle BX",71:"get current directory (ds:si) for drive DL",
72:"allocate memory segment with BX paragraphs",73:"free memory segment ES",74:"resize memory segment ES to BX paragraphs",75:"load program DS:DX using parameter block ES:BX",76:"terminate with return code AL",77:"get return code (al)",78:"find first matching file DS:DX with attributes CX",79:"find next matching file",80:"set current psp BX",81:"get current psp (bx)",82:"get system variables (es:bx)",83:"translate bpb DS:SI to dpb (es:bp)",84:"get verify flag (al)",85:"create child psp at segment DX",
86:"rename file DS:DX to name ES:DI",87:"get(0)/set(1) file date DX and time CX (AL)",88:"get(0)/set(1) memory allocation strategy (AL)",89:"get extended error information",90:"create temporary file DS:DX with attributes CX",91:"create file DS:DX with attributes CX",92:"lock(0)/unlock(1) file BX region CX:DX length SI:DI (AL)"}};f=Ol.prototype;
f.Ic=function(a,b,c,d){this.ma=b;this.O=c;this.Fa=a;this.Ap=yb(a,"FDC");this.Xn=yb(a,"HDC");this.Gf=b.ze>>2;this.eo=b.Th;this.rh=cm;80186<=this.O.la&&(this.rh=cm.slice(),this.rh[15]=am,80286<=this.O.la&&(this.rh[15]=bm,80386<=this.O.la&&(this.tg=8,this.fo=-1)));gi(this,64,function(){d.R("id physaddr blkaddr used size type");d.R("-------- --------- -------- ------ ------ ----");for(var a=0;a<d.O.na.length;a++){var b=d.O.Pe[a];b.type!==zc&&d.R(h(b.id)+" %"+h(a<<d.O.Ca)+": "+h(b.Ba)+
" "+ha(b.eg)+" "+ha(b.size)+" "+Fc[b.type])}});gi(this,4,function(a){if(a){var b=gm(d,a);if(void 0===b)d.R("invalid selector: "+a);else if(a=hm(d,b),d.R("dumpDesc("+ha(a?a.ia:b)+"): %"+h(a?a.Dd:null,d.Gf)),a){var c,b=!1;if(a.type&4096)a.type&2048?(c="code"+(a.type&512?",readable":",execonly"),a.type&1024&&(c+=",conforming")):(c="data"+(a.type&512?",writable":",readonly"),a.type&1024&&(c+=",expdown")),a.type&256&&(c+=",accessed");else switch(a.type){case 256:c="tss";break;case 512:c="ldt";break;
case 768:c="busy tss";break;case 1024:c="call gate";b=!0;break;case 1280:c="task gate";b=!0;break;case 1536:c="int gate";b=!0;break;case 1792:c="trap gate",b=!0}!c||a.Pb&32768||(c+=",not present");d.R((b?"seg="+ha(a.ya&65535)+" off="+ha(a.fb):"base="+h(a.ya,d.Gf)+" limit="+h(a.fb,a.fb&-65536?8:4))+" type="+k(a.type>>8)+" ("+c+") ext="+ha(a.Jh&-65296)+" dpl="+k(a.zc))}}else d.R("no selector")});gi(this,8,function(a){a:{if(a){var b=gm(d,a);if(void 0===b){d.R("invalid task selector: "+a);break a}a=hm(d,
b)}else a=d.O.bb;d.R("dumpTSS("+ha(a?a.ia:b)+"): %"+h(a?a.ya:null,d.Gf));if(a){var b="",c;for(c in im){var p=im[c],w=8>c.length?" ":"",v=a.ya+p,v=hf(d.O,v)|hf(d.O,v+1)<<8;b&&(b+="\n");b+=ha(p)+" "+c+": "+w+ha(v)}d.R(b)}}});gi(this,134217728,function(a){if(a)for(d.R("dumpDOS("+a+")"),a=gm(d,a);a;){var b=Pl(d,0,a),c=d.Ra(b,1),p=d.ra(b,2),w=d.ra(b,5);if(77!=c&&90!=c)break;d.R(ih(0,a)+": '"+String.fromCharCode(c)+"' PID="+ha(p)+" LEN="+ha(w)+' "'+jm(d,b)+'"');a+=1+w}else d.R("no MCB")});pb(this)};
f.Lb=function(a,b,c){var d=this;switch(b){case "debugInput":return this.Fh=this.va[b]=c,c.onkeydown=function(a){var b;if(13==a.keyCode){b=c.value;c.value="";var l=km(d,b,!0),p;for(p in l)Tl(d,l[p])}else 27==a.keyCode?c.value=b="":(38==a.keyCode?d.rd<d.fd.length-1&&(b=d.fd[++d.rd]):40==a.keyCode&&(0<d.rd?b=d.fd[--d.rd]:(b="",d.rd=-1)),null!=b&&(l=b.length,c.value=b,c.setSelectionRange(l,l)));null!=b&&a.preventDefault&&a.preventDefault()},!0;case "debugEnter":return this.va[b]=c,La(c,function(){if(d.Fh){var a=
d.Fh.value;d.Fh.value="";var a=km(d,a,!0),b;for(b in a)Tl(d,a[b]);return!0}return!1}),!0;case "step":return this.va[b]=c,La(c,function(a){var b=!1;ob(d,!0)||(nb(d,!0),b=d.ih(a?1:0),nb(d,!1));return b}),!0}return!1};f.dd=function(){this.Fh&&this.Fh.focus()};
function hm(a,b){if(b===Mb(a.O))return a.O.ta;if(b===a.O.ab.ia)return a.O.ab;if(b===a.O.Na.ia)return a.O.Na;if(b===a.O.ua.ia)return a.O.ua;if(80386<=a.O.la){if(b===a.O.Cc.ia)return a.O.Cc;if(b===a.O.Dc.ia)return a.O.Dc}if(a.tl)return null;var c=new qd(a.O,7,"DBG");c.load(b,!0);return c}f.Zb=function(a,b,c){var d=a.Ba;if(null==d){var d=n,e=hm(this,a.ia);e&&(d=b?e.nc(a.za,c||1,!0):e.yc(a.za,c||1,!0),a.Ba=d)}return d};
f.Ra=function(a,b){var c=255,d=this.Zb(a,!1,1);d!==n&&(c=hf(this.O,d)|0,b&&lm(this,a,b));return c};f.pc=function(a,b){return a.$c?this.de(a,b?4:0):this.ra(a,b?2:0)};f.ra=function(a,b){var c=65535,d=this.Zb(a,!1,2);d!==n&&(c=hf(this.O,d)|hf(this.O,d+1)<<8,b&&lm(this,a,b));return c};f.de=function(a,b){var c=-1,d=this.Zb(a,!1,4);d!==n&&(c=hf(this.O,d)|hf(this.O,d+1)<<8|hf(this.O,d+2)<<16|hf(this.O,d+3)<<24,b&&lm(this,a,b));return c};
f.cd=function(a,b,c){var d=this.Zb(a,!0,1);d!==n&&(this.O.cd(d,b),c&&lm(this,a,c),Zc(this.O))};f.Ib=function(a,b,c){var d=this.Zb(a,!0,2);d!==n&&(this.O.Ib(d,b),c&&lm(this,a,c),Zc(this.O))};function Pl(a,b,c,d,e,g){void 0===e&&(e=a.O&&4==a.O.ta.pa);void 0===g&&(g=a.O&&4==a.O.ta.Gd);return{za:b||0,ia:c,Ba:d,Dg:!1,$c:e||!1,Yc:g||!1}}function mm(a){return[a.za,a.ia,a.Ba,a.Dg,a.$c,a.Yc,a.il,a.ue]}function nm(a){return{za:a[0],ia:a[1],Ba:a[2],Dg:a[3],$c:a[4],Yc:a[5],il:a[6],ue:a[7]}}
function om(a,b){if(null!=b.ia){var c=hm(a,b.ia);if(!c||b.za>c.fb)b.za=0,b.Ba=null}}function lm(a,b,c){c=c||1;null!=b.Ba&&(b.Ba+=c);null!=b.ia&&(b.za+=c,om(a,b))}function ih(a,b,c){return null!=b?h(b,4)+":"+h(a,a&-65536||c?8:4):h(a)}function pm(a){return null==a.ia?"%"+h(a.Ba):ih(a.za,a.ia,a.Yc)}function jm(a,b){var c,d="";for(c=8;d.length<c;){var e=a.Ra(b,1);if(!e)break;d+=32<=e&&128>e?String.fromCharCode(e):"."}return d}
var im={PREV_TSS:0,CPL0_SP:2,CPL0_SS:4,CPL1_SP:6,CPL1_SS:8,CPL2_SP:10,CPL2_SS:12,TASK_IP:14,TASK_PS:16,TASK_AX:18,TASK_CX:20,TASK_DX:22,TASK_BX:24,TASK_SP:26,TASK_BP:28,TASK_SI:30,TASK_DI:32,TASK_ES:34,TASK_CS:36,TASK_SS:38,TASK_DS:40,TASK_LDT:42};
function qm(a,b){var c="",d=10,e=a.Ig,g=a.Te;if(g.length){var l=void 0===b?a.to:+b;isNaN(l)?l=d:c="more ";l>g.length&&(a.R("note: only "+g.length+" available"),l=g.length);e-=l;0>e&&(null!=g[g.length-1][1]?e+=g.length:(l=e+l,e=0));for(void 0!==b&&a.R(l+" instructions earlier:");d&&e!=a.Ig;){var p=g[e++];if(null==p.ia)break;p=Pl(a,p.za,p.ia,p.Ba);a.R(rm(a,p,"history",l--));p.il&&(e++,l--);e>=g.length&&(e=0);a.to=l;d--}}10==d&&(a.R("no "+c+"history available"),a.to=void 0)}
function Sl(a,b){a.Y=a;a.Xb=a.$o=1073741824;a.sk=null;a.Ik=[];var c=km(a,b.replace("keys","key").replace("kbd","keyboard"));if(c.length)for(var d in $l)0<=ya(c,d)&&(a.Xb|=$l[d],a.R(d+" messages enabled"))}function gi(a,b,c){for(var d in $l)if(b==$l[d]){a.Ik[d]=c;break}}
function sm(a,b){var c="??";if(0<=b){var d,e,g=a.O;switch(b){case 0:d=g.F;e=2;break;case 1:d=g.G;e=2;break;case 2:d=g.H;e=2;break;case 3:d=g.D;e=2;break;case 4:d=g.F>>8;e=2;break;case 5:d=g.G>>8;e=2;break;case 6:d=g.H>>8;e=2;break;case 7:d=g.D>>8;e=2;break;case 8:d=g.F;e=4;break;case 9:d=g.G;e=4;break;case 10:d=g.H;e=4;break;case 11:d=g.D;e=4;break;case 12:d=r(g);e=4;break;case 13:d=g.L;e=4;break;case 14:d=g.K;e=4;break;case 15:d=g.J;e=4;break;case 22:d=q(g);e=a.tg;break;case 23:d=Nb(g);e=a.tg;break;
case 16:d=g.Na.ia;e=4;break;case 17:d=Mb(g);e=4;break;case 18:d=g.ua.ia;e=4;break;case 19:d=g.ab.ia,e=4}if(!e)if(80286==a.O.la)32==b&&(d=g.ob,e=4);else if(80386<=a.O.la)switch(b){case 24:d=g.F;e=8;break;case 25:d=g.G;e=8;break;case 26:d=g.H;e=8;break;case 27:d=g.D;e=8;break;case 28:d=r(g);e=8;break;case 29:d=g.L;e=8;break;case 30:d=g.K;e=8;break;case 31:d=g.J;e=8;break;case 32:d=g.ob;e=8;break;case 33:d=g.hi;e=8;break;case 34:d=g.Vf;e=8;break;case 35:d=g.Wf;e=8;break;case 20:d=g.Cc.ia;e=4;break;case 21:d=
g.Dc.ia,e=4}e&&(c=h(d,e))}return c}f=Ol.prototype;f.message=function(a,b){b&&(a+=" @"+ih(q(this.O),Mb(this.O)));if(!this.sk||a!=this.sk)if(this.R(a),this.sk=a,this.O){this.Xb&-2147483648&&this.yb();var c=this.O;c.T.Og=0;c.td-=c.A;c.A=0;Zc(c)}};
function De(a,b,c){var d,e=!1,g=Ul[b];g&&(d=a.O.F>>8,e=a.qa(g)?!0:524288==g&&a.qa(g=1048576));if(e){var l=a.O.H&255;if(33==b&&11==d||524288==g&&128<=l||1048576==g&&128>l)e=!1}if(e){if(g=(g=fm[b])&&g[d]||""){for(var p=g,g=0;g<Yl.length;g++)if(l=Yl[g],0<=p.indexOf(l)){var w=sm(a,g),v={};v[l]=w;p=ma(v,p)}g=" "+p}a.message("INT "+k(b)+": AH="+k(d)+" @"+ih(c-2-a.O.ta.ya,Mb(a.O))+g)}return e}
function Fe(a,b,c,d,e){a.message("INT "+k(b)+": C="+(Qe(a.O)?1:0)+(e||"")+" (cycles="+d+(c?",level="+(c+1):"")+")")}function mb(a,b,c,d,e,g,l,p){p|=256;if(null==e||(a.Xb&p)==p)p=null,null!=e&&(p=Mb(a.O),e-=a.O.ta.ya),a.message(b.Jg+"."+(null!=d?"outPort":"inPort")+"("+ha(c)+","+(g?g:"unknown")+(null!=d?","+k(d):"")+")"+(null!=l?": "+k(l):"")+(null!=e?" @"+ih(e,p):""))}
f.Dq=function(){this.R("Type ? for list of debugger commands");this.yd();if(this.Rm){var a=km(this,this.Rm);delete this.Rm;for(var b in a)Tl(this,a[b])}};function Rl(a){var b;if(qf(a)){if(!a.Te||!a.Te.length){a.Te=Array(1E4);for(b=0;b<a.Te.length;b++)a.Te[b]=Pl(a);a.Ig=0}if(!a.Cd||!a.Cd.length)for(a.Cd=Array(256),b=0;b<a.Cd.length;b++)a.Cd[b]=[b,0]}else a.Ig=0,a.Te=[],a.Cd=[]}f.Zf=function(a){if(!tm(this))return!1;this.O.Zf(a);return!0};
f.ih=function(a,b,c){if(!tm(this))return!1;this.Md=0;do{a||qf(this)&&uf(this,this.O.sa,0);try{var d=this.O.ih(a);0<d&&(this.Md+=d,id(this.O,d,!0),bd(this.O,d),this.yh++)}catch(e){this.Md=0,sb(this.O,e.stack||e.message)}}while(this.O.S&12528);!1!==c&&Zc(this.O);this.yd(b||!1,!1);return 0<this.Md};f.yb=function(a){this.O&&this.O.yb(a)};f.yd=function(a,b){void 0===a&&(a=!0);void 0===b&&(b=!0);this.nd=Pl(this,q(this.O),Mb(this.O));a&&1!=this.Hc?um(this,null,b):vm(this)};
function tm(a){var b;if(b=a.O&&qb(a.O))b=a.O,b.fa.hc?b=!0:(b.R(b.toString()+" not powered"),b=!1);b&&!ob(a.O)?(a=a.O,a.fa.Kd?(a.R(a.toString()+" error"),a=!0):a=!1,a=!a):a=!1;return a}f.kc=function(a,b){return!b&&(this.reset(!0),a&&this.restore&&!this.restore(a))?!1:!0};f.jc=function(a,b){b&&this.R(a?"suspending":"shutting down");return a&&this.save?this.save():!0};
f.reset=function(a){Rl(this);this.yh=0;this.sk=null;this.Md=0;this.nd=Pl(this,q(this.O),Mb(this.O));void 0===this.fa.qb||a||this.R("reset");this.fa.qb=!1;wm(this);a||this.yd()};f.save=function(){var a=new Ie(this);a.set(0,mm(this.nd));a.set(1,mm(this.Lf));a.set(2,[this.fd,this.xg,this.Xb]);return a.data()};f.restore=function(a){var b=0;void 0!==a[2]&&(this.nd=nm(a[b++]),this.Lf=nm(a[b++]),this.fd=a[b][0],"string"==typeof this.fd&&(this.fd=[this.fd]),this.xg=a[b][1],this.Xb||(this.Xb=a[b][2]));return!0};
f.start=function(a,b){this.Hc||this.R("running");this.fa.qb=!0;this.Qq=a;this.Nd=b};f.stop=function(a,b){if(this.fa.qb){this.fa.qb=!1;this.Md=b-this.Nd;if(!this.Hc){var c="stopped";if(this.Md){var d=a-this.Qq,e=0<d?Math.round(1E3*this.Md/d):0,c=c+" (";qf(this)&&(c+=this.yh+" ops, ",this.yh=0);c+=this.Md+" cycles, "+d+" ms, "+e+" hz)"}this.R(c)}this.yd(!0,2!=this.Hc);this.dd();wm(this,this.O.sa)}};function qf(a){return 1<a.Mc.length||a.qa(16)}
function uf(a,b,c){if(0<c&&(xm(a,b,a.Mc)||3==a.O.ta.Qa&&!(a.O.aa&Qb)))return!0;0<=c&&a.Cd.length&&(a.yh++,c=hf(a.O,b),null!=c&&(a.Cd[c][1]++,c=a.Te[a.Ig],c.za=q(a.O),c.ia=Mb(a.O),c.Ba=b,++a.Ig==a.Te.length&&(a.Ig=0)));return!1}function Pc(a,b){return xm(a,b,a.Oe)?(a.yb(!0),!0):!1}function Qc(a,b){return xm(a,b,a.Ad)?(a.yb(!0),!0):!1}function qc(a,b,c){a.R("break on input from port "+ha(b)+": "+k(c));a.yb(!0)}function uc(a,b,c){a.R("break on output to port "+ha(b)+": "+k(c));a.yb(!0)}
function Ql(a){var b;a.Mc=["exec"];if(void 0!==a.Oe)for(b=1;b<a.Oe.length;b++){var c=a.ma,d=a.Zb(a.Oe[b]);Sc(c.na[d>>>c.Ca],!1)}a.Oe=["read"];if(void 0!==a.Ad)for(b=1;b<a.Ad.length;b++)c=a.ma,d=a.Zb(a.Ad[b]),Sc(c.na[d>>>c.Ca],!0);a.Ad=["write"];a.tl=0}f.Ue=function(a,b,c){if(!ym(this,a,b)){b.Dg=c;a.push(b);if(a!=this.Mc){var d=this.ma,e=this.Zb(b);d.na[e>>>d.Ca].Ue(e&d.Ga,a==this.Ad)}c?b.ia=null:this.R("breakpoint enabled: "+pm(b)+" ("+a[0]+")");Rl(this);return!0}return!1};
function ym(a,b,c,d){var e=!1;c=zm(a,a.Zb(c));for(var g=1;g<b.length;g++){var l=b[g];if(c==zm(a,a.Zb(l))){e=!0;if(d){b.splice(g,1);b!=a.Mc&&(d=a.ma,Sc(d.na[c>>>d.Ca],b==a.Ad));l.Dg||a.R("breakpoint cleared: "+pm(l)+" ("+b[0]+")");Rl(a);break}a.R("breakpoint exists: "+pm(l)+" ("+b[0]+")");break}}return e}function Am(a,b){for(var c=1;c<b.length;c++)a.R("breakpoint enabled: "+pm(b[c])+" ("+b[0]+")");return b.length-1}
function Vc(a,b,c,d){if(void 0===d)Vc(a,b,c,a.Oe),Vc(a,b,c,a.Ad);else for(var e=1;e<d.length;e++){var g=a.Zb(d[e]);if(g>=b&&g<b+c){var l=a.ma;l.na[g>>>l.Ca].Ue(g&l.Ga,d==a.Ad)}}}function wm(a,b){if(void 0!==b)xm(a,b,a.Mc,!0),a.Hc=0;else for(var c=1;c<a.Mc.length;c++){var d=a.Mc[c];if(d.Dg){if(!ym(a,a.Mc,d,!0))break;c=0}}}function zm(a,b){var c=a.eo&-65536;(b&c)==c&&(b&=1048575);return b}
function xm(a,b,c,d){var e=!1;if(!a.tl++){b=zm(a,b);for(var g=1;g<c.length;g++){var l=c[g];null!=l.ia&&(l.Ba=null);if(b==zm(a,a.Zb(l))){l.Dg?ym(a,c,l,!0):d||a.R("breakpoint hit: "+pm(l)+" ("+c[0]+")");e=!0;break}}}a.tl--;return e}
function rm(a,b,c,d){for(var e=Pl(a,b.za,b.ia,b.Ba),g=a.Ra(b,1),l=2;(102==g||103==g)&&l--;)102==g?b.$c=!b.$c:b.Yc=!b.Yc,g=a.Ra(b,1);var l=a.rh[g],p=l[0],w=-1;205==p&&(p=a.Ra(b,1),l=dm[p]||am,g|=p<<8,p=l[0]);p>=Wl.length&&(w=a.Ra(b,1),l=em[p-Wl.length][w>>3&7]);var p=Wl[l[0]],v=l.length-1,E="";if(164<=g&&167>=g||170<=g&&175>=g)v=0,b.$c&&"W"==p.slice(-1)&&(p=p.slice(0,-1)+"D");for(var g=null,O=!0,J=1;J<=v;J++){var G,S;G="";S=l[J];if(void 0!==S){null==g&&(g=S>>14);var X=S&15;if(0!=X)if(15==X)O=!1;else{var T=
S&240;if(128<=T)if(0>w&&(w=a.Ra(b,1)),160<=T)G=Bm(a,w>>3&7,S,b);else{G=a;var X=b,aa="",T=w>>6,Ba=w&7;if(3>T){var pa=void 0;if(!T&&(!X.Yc&&6==Ba||X.Yc&&5==Ba))T=2;else{if(X.Yc)if(4!=Ba)Ba+=8;else{var aa=T,Ra=G.Ra(X,1),pa=Ra>>6,Eb=Ra>>3&7,Ra=Ra&7,Ua="";if(aa||5!=Ra)Ua=Zl[Ra+8];4!=Eb&&(Ua&&(Ua+="+"),Ua+=Zl[Eb+8],pa&&(Ua+="*"+(1<<pa)));aa=Ua}aa||(aa=Zl[Ba])}1==T?(pa=G.Ra(X,1),pa&128?(pa=pa<<24>>24,aa+="-"+h(-pa,2)):aa+="+"+h(pa,2)):2==T&&(aa&&(aa+="+"),X.Yc?(pa=G.de(X,4),aa+=h(pa)):(pa=G.ra(X,2),aa+=
h(pa,4)));aa="["+aa+"]";7==(S&15)&&(aa="FAR "+aa)}else aa=Bm(G,Ba,S,X);G=aa}else if(16==T)G="1";else if(0==T){G=a;X=b;T=" ";switch(S&15){case 1:S&12288&&(T=h(G.Ra(X,1),2));break;case 2:T=h(G.Ra(X,1)<<24>>24,4);break;case 4:case 8:if(X.$c){T=h(G.de(X,4));break}case 3:T=h(G.ra(X,2),4);break;case 7:T=pm(Pl(G,G.pc(X,!0),G.ra(X,2),null,X.$c,X.Yc));break;default:T="imm("+ha(S)+")"}G=T}else 32==T?(b.Yc?(S=8,G=a.de(b,4)):(S=4,G=a.ra(b,2)),G="["+h(G,S)+"]"):48==T?(G=1==X?a.Ra(b,1)<<24>>24:a.pc(b,!0),G=b.za+
G&(b.$c?-1:65535),G=Cm(a,Pl(a,G,b.ia))[0]||h(G,b.$c?8:4)):96==T?G=Bm(a,(S&3840)>>8,S,b):112==T?G=Bm(a,(S&3840)>>8,176,b):64==T?G="DS:[SI]":80==T&&(G="ES:[DI]");if(!G||!G.length){E="INVALID";break}0<E.length&&(E+=",");E+=G}}}l=pm(e)+" ";w="";do w+=h(a.Ra(e,1),2);while(e.Ba!=b.Ba);l+=na(w,16);l+=na(p,8);E&&(l+=" "+E);a.O.la<Xl[g]&&(c=Xl[g]+" CPU only");c&&O&&(l=na(l,56)+";"+c,l=a.O.fa.yg?l+("cycles="+cd(a.O).toString()+" cs="+h(a.O.T.Uh)):l+(null!=d?"="+d.toString():""));Dm(a,b,O);return l}
function Bm(a,b,c,d){var e=c&240;if(176==e){if(5<b||4<=b&&80386>a.O.la)return"??";b+=16}else if(208==e)b+=32;else if(a=c&15,3<=a&&(8>b&&(b+=8),5==a||4==a&&d.$c))b+=16;return Yl[b]}function Em(a,b){var c;switch(b){case "V":c=Ve(a.O);break;case "D":c=a.O.aa&Pb;break;case "I":c=a.O.aa&Qb;break;case "T":c=a.O.aa&Rb;break;case "S":c=Ue(a.O);break;case "Z":c=Te(a.O);break;case "A":c=Se(a.O);break;case "P":c=Re(a.O);break;case "C":c=Qe(a.O);break;default:c=0}return b+(c?"1":"0")+" "}
function Fm(a,b){8<=b&&15>=b&&4<a.tg&&(b+=16);var c=Yl[b];32==b&&80286==a.O.la&&(c="MS");return c+"="+sm(a,b)+" "}function Gm(a,b,c){return b.ni+"="+h(b.ia,4)+(c?"["+h(b.ya,a.Gf)+","+h(b.fb,b.fb&-65536?8:4)+"]":"")}function Hm(a,b,c,d,e){return b+"="+(null!=c?h(c,4):"")+"["+h(d,a.Gf)+","+h(e-d,4)+"]"}
function Im(a,b){var c;void 0===b&&(b=!!(a.O.ob&1));c=Fm(a,8)+Fm(a,11)+Fm(a,9)+Fm(a,10)+(4<a.tg?"\n":"")+Fm(a,12)+Fm(a,13)+Fm(a,14)+Fm(a,15)+"\n"+Gm(a,a.O.ua,b)+" "+Gm(a,a.O.ab,b)+" "+Gm(a,a.O.Na,b)+" ";if(b){var d="TR="+h(a.O.bb.ia,4),e=a.ma,e="A20="+(e.jg||e.Th!=e.Cb?"OFF ":"ON ");80386>a.O.la&&(d="\n"+d,c+=e,e="");c+="\n"+Gm(a,a.O.ta,b)+" ";80386<=a.O.la&&(e+="\n",c+=Gm(a,a.O.Cc,b)+" "+Gm(a,a.O.Dc,b)+"\n");c+=Hm(a,"LD",a.O.xd.ia,a.O.xd.ya,a.O.xd.ya+a.O.xd.fb)+" "+Hm(a,"GD",null,a.O.Ed,a.O.zf)+
" "+Hm(a,"ID",null,a.O.Fd,a.O.Af)+" ";c=c+(d+" "+e)+Fm(a,32);80386<=a.O.la&&(c+=Fm(a,34)+Fm(a,35))}else 80386<=a.O.la&&(c+=Gm(a,a.O.Cc,b)+" "+Gm(a,a.O.Dc,b)+" ");return c+=Fm(a,23)+Em(a,"V")+Em(a,"D")+Em(a,"I")+Em(a,"T")+Em(a,"S")+Em(a,"Z")+Em(a,"A")+Em(a,"P")+Em(a,"C")}
function Jm(a,b,c){var d;d=2==c?a.Gn:a.nd;c=d.za;var e=d.ia;d=d.Ba;if(void 0!==b){"%"==b.charAt(0)&&(b=b.substr(1),c=0,e=null);var g=b;d=null;if(g.match(/^[a-z_][a-z0-9_]*$/i)){d={};for(var l=g.toUpperCase(),p=0;p<a.Rc.length;p++){var g=a.Rc[p][0],w=a.Rc[p][2][l];if(void 0!==w){l=w.o;void 0!==l&&(p=w.s,void 0===p&&(p=g>>>4),d.za=l,d.ia=p,void 0!==w.p&&(d.Ba=w.p));break}}}if(d&&null!=d.za)return d;d=b.indexOf(":");0>d?null!=e?(c=gm(a,b),d=null):d=gm(a,b):(e=gm(a,b.substring(0,d)),c=gm(a,b.substring(d+
1)),d=null)}d=Pl(a,c,e,d);om(a,d);return d}function gm(a,b,c){var d;void 0!==b?(d=ya(Yl,b.toUpperCase()),0<=d&&(b=sm(a,d)),d=ga(b),void 0===d&&a.R("invalid "+(c?c:"value")+": "+b)):a.R("missing "+(c||"value"));return d}
function mj(a,b,c,d){function e(a,b){return a[0]>b[0]?1:a[0]<b[0]?-1:0}var g={},l=[],p;for(p in d){var w=d[p];"number"==typeof w&&(d[p]=w={o:w});var v=w.o,E=w.s,O=w.a;void 0!==v&&(void 0!==E&&(g.za=v,g.ia=E,g.Ba=null,a.Zb(g),(g.Ba&-65536)==(a.ma.Th&-65536)&&(g.Ba&=1048575),w.p=g.Ba),ra(l,[v,p],e));O&&(w.a=O.replace(/''/g,'"'))}a.Rc.push([b,c,d,l])}
function Cm(a,b,c){for(var d=[],e=a.Zb(b),g=0;g<a.Rc.length;g++){var l=a.Rc[g][0],p=a.Rc[g][1];if(e>=l&&e<l+p){b=qa(a.Rc[g][3],[b.za],function(a,b){return a[0]>b[0]?1:a[0]<b[0]?-1:0});0<=b?Km(a,g,b,d):c&&(b=~b,Km(a,g,b-1,d),Km(a,g,b,d));break}}return d}function Km(a,b,c,d){var e={},g=a.Rc[b][3],l=0,p=null;0<=c&&c<g.length&&(l=g[c][0],p=g[c][1]);p&&(e=a.Rc[b][2][p],p="."==p.charAt(0)?null:e.l||p);d.push(p);d.push(l);d.push(e.a);d.push(e.c)}
function Lm(a,b){if("?"==b)a.R("\nfrequency commands:"),a.R("\tclear\tclear all frequency counts");else{var c,d=0;if(a.Cd)if("clear"==b){for(c=0;c<a.Cd.length;c++)a.Cd[c]=[c,0];a.R("frequency data cleared");d++}else if(void 0!==b)a.R("unknown frequency command: "+b),d++;else{var e=a.Cd.slice();e.sort(function(a,b){return b[1]-a[1]});for(c=0;c<e.length;c++){var g=e[c][0],l=e[c][1];l&&(a.R((Wl[a.rh[g][0]]+" ").substr(0,5)+" ("+k(g)+"): "+l+" times"),d++)}}d||a.R("no frequency data available")}}
function Mm(a,b){var c=Jm(a,b,1);if(null!=c.za||null!=c.Ba){var d=a.Zb(c);a.R((b?b+": ":"")+pm(c)+" (%"+h(d,a.Gf)+")");d=Cm(a,c,!0);if(d.length){var e,g;d[0]&&(g="",(e=c.za-d[1])&&(g=" + "+ha(e)),a.R(d[0]+" ("+ih(d[1],c.ia)+")"+g));4<d.length&&d[4]&&(g="",(e=d[5]-c.za)&&(g=" - "+ha(e)),a.R(d[4]+" ("+ih(d[5],c.ia)+")"+g))}else a.R("no symbols")}}
function Nm(a,b){if("l"==b[0]&&void 0===b[1]||"?"==b[1])a.R("\nlist/load commands:"),a.R("\tl [address] [drive #] [sector #] [# sectors]"),a.R("\tln [address] lists symbol(s) nearest to address");else if("ln"==b[0])Mm(a,b[1]);else{var c="json"==b[1],d,e=0,g=0,l=c?{}:Jm(a,b[1],2);d=gm(a,b[2],"drive #");if(void 0!==d){if(!c){e=gm(a,b[3],"sector #");if(void 0===e)return;g=gm(a,b[4],"# of sectors");void 0===g&&(g=1)}var p=a.Ap;2<=d&&a.Xn&&(d-=2,p=a.Xn);if(p){var w=p.En(d);if(w)if(w.xa)if(c)a.R(w.xa.toJSON());
else if(p.Mo(w,e,g)){for(var v=0,E=!1,c=pm(l);!E&&0<w.mb--;)(function(a,b){p.sc(w,function(c){0>c?(a.R("out of data at address "+pm(b)),E=!0):(a.cd(b,c,1),v++)})})(a,l);a.R(v+" bytes read at "+c)}else a.R("sector "+e+" request out of range");else a.R("drive "+d+" not loaded");else a.R("invalid drive: "+d)}else a.R("disk controller not present")}}}
function um(a,b,c){if(b&&"?"==b[1])a.R("\nregister commands:"),a.R("\tr\t\tdisplay all registers"),a.R("\tr [target=#]\tmodify target register"),a.R("supported targets:"),a.R("\tall registers and flags V,D,I,S,Z,A,P,C");else{var d;if(null!=b&&1<b.length){var e=b[1];if("p"==e)d=80286<=a.O.la;else{c=null;var g=e.indexOf("=");if(0<g)c=e.substr(g+1),e=e.substr(0,g);else if(2<b.length)c=b[2];else{a.R("missing value for "+b[1]);return}b=!1;g=ga(c,16);if(!isNaN(g)){b=!0;var l=e.toUpperCase();"E"==l.charAt(0)&&
4>=a.tg&&(l=null);switch(l){case "AL":a.O.F=a.O.F&-256|g&255;break;case "AH":a.O.F=a.O.F&-65281|g<<8&255;break;case "AX":a.O.F=a.O.F&-65536|g&65535;break;case "BL":a.O.D=a.O.D&-256|g&255;break;case "BH":a.O.D=a.O.D&-65281|g<<8&255;break;case "BX":a.O.D=a.O.D&-65536|g&65535;break;case "CL":a.O.G=a.O.G&-256|g&255;break;case "CH":a.O.G=a.O.G&-65281|g<<8&255;break;case "CX":a.O.G=a.O.G&-65536|g&65535;break;case "DL":a.O.H=a.O.H&-256|g&255;break;case "DH":a.O.H=a.O.H&-65281|g<<8&255;break;case "DX":a.O.H=
a.O.H&-65536|g&65535;break;case "SP":u(a.O,r(a.O)&-65536|g&65535);break;case "BP":a.O.L=a.O.L&-65536|g&65535;break;case "SI":a.O.K=a.O.K&-65536|g&65535;break;case "DI":a.O.J=a.O.J&-65536|g&65535;break;case "DS":Le(a.O,g);break;case "ES":Me(a.O,g);break;case "SS":wd(a.O,g);break;case "CS":Ke(a.O,g);a.nd=Pl(a,q(a.O),Mb(a.O));break;case "IP":D(a.O,g);a.nd=Pl(a,q(a.O),Mb(a.O));break;case "PC":case "PS":Ad(a.O,g);break;case "C":g?Xe(a.O):Ye(a.O);break;case "P":g?(e=a.O,e.resultType&=-3,e.aa|=Vb):(e=a.O,
e.resultType&=-3,e.aa&=~Vb);break;case "A":g?ef(a.O):cf(a.O);break;case "Z":g?ff(a.O):df(a.O);break;case "S":g?(e=a.O,e.resultType&=-17,e.aa|=Sb):(e=a.O,e.resultType&=-17,e.aa&=~Sb);break;case "I":g?(e=a.O,e.aa|=Qb):(e=a.O,e.aa&=~Qb);break;case "D":g?(e=a.O,e.aa|=Pb):(e=a.O,e.aa&=~Pb);break;case "V":g?Ze(a.O):$e(a.O);break;default:var p=!0;if(80286<=a.O.la)switch(p=!1,l){case "MS":gf(a.O,g);break;case "TR":a.O.bb.load(g,!0)===n&&(b=!1);break;default:if(p=!0,80386<=a.O.la)switch(p=!1,l){case "EAX":a.O.F=
g;break;case "EBX":a.O.D=g;break;case "ECX":a.O.G=g;break;case "EDX":a.O.H=g;break;case "ESP":u(a.O,g);break;case "EBP":a.O.L=g;break;case "ESI":a.O.K=g;break;case "EDI":a.O.J=g;break;case "FS":a.O.Cc.load(g);break;case "GS":a.O.Dc.load(g);break;case "CR0":a.O.ob=g;break;case "CR2":a.O.Vf=g;break;case "CR3":a.O.Wf=g;break;default:p=!0}}if(p){a.R("unknown register: "+e);return}}}if(!b){a.R("invalid value: "+c);return}Zc(a.O);a.R("\nupdated registers:");c=!0}}a.R((c?"":"\n")+Im(a,d));a.nd=Pl(a,q(a.O),
Mb(a.O));vm(a,pm(a.nd))}}function Om(a,b,c){for(var d=null,e=b.za,g=e,l=1;6>=l;l++){if(2<l){b.za=e;b.Ba=null;var p=rm(a,b);if(0<p.indexOf("CALL")||c&&0<p.indexOf("INT")){d=p;break}}if(!--e)break}b.za=g;return d}function Pm(a,b,c){var d="tr"==b;b=null!=c?+c:1;var e=1==b?0:1;Ka(b,function(){return nb(a,!0)&&a.ih(e,d,!1)},function(){Zc(a.O);nb(a,!1)})}function Dm(a,b,c){b.il=b.$c||b.Yc;c&&(b.$c=4==a.O.ta.pa,b.Yc=4==a.O.ta.Gd);b.ue=c}
function vm(a,b,c,d){b=Jm(a,b,1);if(null!=b.za){void 0===d&&(d=1);var e=Pl(a,a.fo,b.ia,a.ma.Th),e=256;if(void 0!==c){e=Jm(a,c,1);if(null==e.za||e.za<b.za)return;e=e.za-b.za;if(256<e){a.R("range too large");return}d=-1}var g=b.za!=a.nd.za;c=0;for(Dm(a,b,!0);0<e&&d--;){a.Ra(b);var l=b.Ba,p=ob(a,!1)||a.Hc?a.Md:null,w=null!=p?"cycles":null,v=Cm(a,b);if(v[0]){var E=v[0]+":",g=!1;v[2]&&(E+=" "+v[2]);a.R(E)}g&&a.R();v[3]&&(w=v[3],p=null);g=rm(a,b,w,p);b.ue||d||d++;a.R(g);a.nd=b;e-=b.Ba-l;g=!1;c++}}}
function km(a,b,c){if(c)if(b){0>a.rd&&a.fd.length&&(a.rd=0);if(0>a.rd||b!=a.fd[a.rd])a.fd.splice(0,0,b),a.rd=0;a.rd--}else b=a.fd[a.rd+1];a=b?b.split(0<=b.indexOf("|")?"|":";"):[""];for(var d in a)a[d]=oa(a[d]);return a}
function Tl(a,b){var c=!0;try{if(b.length||(a.xg?(a.R("ended assemble @"+pm(a.Lf)),a.nd=a.Lf,a.xg=!1):b="?"),b=b.toLowerCase(),qb(a)&&0<b.length){if(a.xg)b="a "+pm(a.Lf)+" "+b;else{var d,e,g;switch(b){case "reset":return a.Fa&&a.Fa.reset(),!0;case "ver":return a.R("PCjs version 1.18.2 ("+a.O.la+",RELEASE,NOPREFETCH"+(tb?",TYPEDARRAYS":",LONGARRAYS")+",NOBACKTRACK)"),!0;default:for(e=b.charAt(0),g=1;g<b.length;g++){d=b.charAt(g);if(" "==d)break;if("r"==e||"a">d||"z"<d){b=b.substring(0,g)+" "+b.substring(g);
break}}}}var l=b.split(" ");switch(l[0].charAt(0)){case "a":var p=Jm(a,l[1],1);if(null!=p.za)if(a.Lf=p,void 0===l[2])a.R("begin assemble @"+pm(p)),a.xg=!0,Zc(a.O);else{var w;a.R("not supported yet");w=[];if(w.length){for(var v=0;v<w.length;v++)a.cd(p,w[v],1);a.R(rm(a,a.Lf))}}break;case "b":a:{var E=l[1],O=l[0].charAt(1);if(O&&"?"!=O)if("l"==O)v=0,v+=Am(a,a.Mc),v+=Am(a,a.Oe),(v+=Am(a,a.Ad))||a.R("no breakpoints");else if(void 0===E)a.R("missing breakpoint address");else{v={};if("*"!=E&&(v=Jm(a,E,1),
null==v.za))break a;E=null==v.za?E:ha(v.za);"c"==O?null==v.za?(Ql(a),a.R("all breakpoints cleared")):ym(a,a.Mc,v,!0)||ym(a,a.Oe,v,!0)||ym(a,a.Ad,v,!0)||a.R("breakpoint missing: "+pm(v)):"i"==O?a.R("breakpoint "+(nc(a.ma,v.za)?"enabled":"cleared")+": port "+E+" (input)"):"o"==O?a.R("breakpoint "+(rc(a.ma,v.za)?"enabled":"cleared")+": port "+E+" (output)"):null!=v.za&&("p"==O?a.Ue(a.Mc,v):"r"==O?a.Ue(a.Oe,v):"w"==O?a.Ue(a.Ad,v):a.R("unknown breakpoint command: "+O))}else a.R("\nbreakpoint commands:"),
a.R("\tbi [p]\ttoggle break on input port [p]"),a.R("\tbo [p]\ttoggle break on output port [p]"),a.R("\tbp [a]\tset exec breakpoint at addr [a]"),a.R("\tbr [a]\tset read breakpoint at addr [a]"),a.R("\tbw [a]\tset write breakpoint at addr [a]"),a.R("\tbc [a]\tclear breakpoint at addr [a]"),a.R("\tbl\tlist all breakpoints")}break;case "c":a.Gh&&(a.Gh.value="");break;case "d":a:{var J=l[0],v=l[1],G=l[2],S;if("?"==v){v="";for(S in $l)a.Ik[S]&&(v&&(v+=","),v+=S);v+=",state,symbols";a.R("\ndump commands:");
a.R("\tdb [a] [#] dump # bytes at address a");a.R("\tdw [a] [#] dump # words at address a");a.R("\tdd [a] [#] dump # dwords at address a");a.R("\tdh [#] dump # instructions prior");v.length&&a.R("dump extensions:\n\t"+v)}else if("state"==v)a.R(Qm(a.Fa,!0));else if("symbols"==v)for(v=0;v<a.Rc.length;v++){var X=a.Rc[v][0],T=a.Rc[v][2],aa;for(aa in T)if("."!=aa.charAt(0)){var Ba=T[aa],pa=Ba.o;if(void 0!==pa){var Ra=Ba.s;void 0===Ra&&(Ra=X>>>4);var Eb=T[aa].l;Eb&&(aa=Eb);a.R(ih(pa,Ra)+
" "+aa)}}}else if("dh"==J)qm(a,v);else{"ds"==J&&(J="d",G=v,v="desc");for(S in $l)if(v==S){var Ua=a.Ik[S];Ua?Ua(G):a.R("no dump registered for "+v);break a}var ba=Jm(a,v,2);if(null!=ba.za&&(null!=ba.ia||null!=ba.Ba)){var sa="",da=0,rb="dd"==J?4:"dw"==J?2:1,l=16/rb|0;G&&("l"==G.charAt(0)&&(G=G.substr(1)),(da=+G)&&(da=(da+l-1)/l|0));da||(da=8);for(G=0;G<da;G++){for(var Fb=l=0,Ya="",Za="",v=pm(ba),J=0;16>J;J++){var Ga=a.Ra(ba,1),l=l|Ga<<(Fb++<<3);Fb==rb&&(Ya+=h(l,2*rb),Ya+=1==rb?7==J?"-":" ":" ",l=Fb=
0);Za+=32<=Ga&&128>Ga?String.fromCharCode(Ga):"."}sa&&(sa+="\n");sa+=v+" "+Ya+" "+Za}sa&&a.R(sa);a.Gn=ba}}}break;case "e":var zd=l[1];if(void 0===zd)a.R("missing address");else{var ad=Jm(a,zd,2);if(null!=ad.za)for(v=2;v<l.length;v++){var Ic=ga(l[v],16);if(void 0===Ic){a.R("unrecognized value: "+k(Ic));break}a.R("setting "+pm(ad)+" to "+k(Ic));a.cd(ad,Ic,1)}}break;case "f":Lm(a,l[1]);break;case "g":a:{var Cj=l[1];if(void 0!==Cj){var Dj=Jm(a,Cj,1);if(null==Dj.za)break a;a.Ue(a.Mc,Dj,!0)}a.Zf(!0)||
a.R('cpu not available, "g" command ignored')}break;case "h":var Ej=l[1];a.fa.qb&&void 0===Ej?(a.R("halting"),a.yb()):qm(a,Ej);break;case "i":var hg=l[1];if(hg&&"?"!=hg){var ig=gm(a,hg);if(void 0!==ig){var fn=pc(a.ma,ig);a.R(ha(ig)+": "+k(fn))}}else a.R("\ninput commands:"),a.R("\ti [p]\tread port [p]"),a.R("warning: port accesses can affect hardware state");break;case "k":v=0;Fb=a.O.ta.ia;Ya=Pl(a);Za=Pl(a,r(a.O),a.O.ua.ia);for(a.R("stack trace for "+pm(Za));10>v;){ba=null;for(Ga=256;Za.za>>>0<a.O.ok>>>
0;){Ya.za=a.pc(Za,!0);if(null==Za.Ba||!Ga--)break;Ya.ia=Fb;if(ba=Om(a,Ya))break;Ya.ia=a.pc(Za);if(ba=Om(a,Ya,!0)){Fb=a.pc(Za,!0);0<ba.indexOf("INT")&&a.pc(Za,!0);break}}if(!ba)break;ba=na(ba,50)+";stack="+pm(Za)+" return="+pm(Ya);a.R(ba);v++}v||a.R("no return addresses found");break;case "l":Nm(a,l);break;case "m":a:{v=null;da=l[1];"?"==da&&(da=void 0);if(void 0!==da){ba=0;if("all"==da)ba=1610481663,da=null;else if("on"==da)v=!0,da=null;else if("off"==da)v=!1,da=null;else{"keys"==da&&(da="key");"kbd"==
da&&(da="keyboard");for(sa in $l)if(da==sa){ba=$l[sa];v=!!(a.Xb&ba);break}if(!ba){a.R("unknown message category: "+da);break a}}ba&&("on"==l[2]?(a.Xb|=ba,v=!0):"off"==l[2]&&(a.Xb&=~ba,v=!1))}ba=0;Ga="";for(sa in $l)if(!da||da==sa)if(rb=!!(a.Xb&$l[sa]),null===v||v==rb)Ga&&(Ga+=","),++ba%10||(Ga+="\n\t"),"key"==sa&&(sa="keys"),Ga+=sa;void 0===da&&a.R("\nmessage commands:\n\tm [category] [on|off]\tturn categories on/off");a.R((null!==v?v?"messages on: ":"messages off: ":"message categories:\n\t")+(Ga||
"none"))}break;case "o":var jg=l[1],gn=l[2];if(jg&&"?"!=jg){var kg=gm(a,jg,"port #"),lg=gm(a,gn);void 0!==kg&&void 0!==lg&&(tc(a.ma,kg,lg),a.R(ha(kg)+": "+k(lg)))}else a.R("\noutput commands:"),a.R("\to [p] [b]\twrite byte [b] to port [p]"),a.R("warning: port accesses can affect hardware state");break;case "p":case "pr":var Fj="pr"==l[0]?1:0,v=1+Fj;if(a.Hc)a.R("step in progress");else{var Ne,ba=!1,Ib=Pl(a,q(a.O),Mb(a.O));do switch(Ne=!1,a.Ra(Ib)){case 38:case 46:case 54:case 62:case 100:case 101:case 102:case 103:case 240:lm(a,
Ib,1);Ne=!0;break;case 204:case 206:a.Hc=v;lm(a,Ib,1);break;case 205:case 224:case 225:case 226:a.Hc=v;lm(a,Ib,2);break;case 232:a.Hc=v;lm(a,Ib,3);break;case 154:a.Hc=v;lm(a,Ib,5);break;case 255:var Gj=a.pc(Ib)&14591;a.Hc=4351==Gj||6399==Gj?v:0;break;case 243:case 242:lm(a,Ib,1);ba=Ne=!0;break;case 108:case 109:case 110:case 111:case 164:case 165:case 166:case 167:case 170:case 171:case 172:case 173:case 174:case 175:ba&&(a.Hc=v,lm(a,Ib,1))}while(Ne);a.Hc?(a.Ue(a.Mc,Ib,!0),a.Zf()||(a.O.dd(),a.Hc=
0)):Pm(a,Fj?"tr":"t")}break;case "r":um(a,l);break;case "t":case "tr":Pm(a,l[0],l[1]);break;case "u":vm(a,l[1],l[2],8);break;case "x":a:if(void 0===l[1]||"?"==l[1])a.R("\nexecution options:"),a.R("\tcs int #\tset checksum cycle interval to #"),a.R("\tcs start #\tset checksum cycle start count to #"),a.R("\tcs stop #\tset checksum cycle stop count to #"),a.R("\tsp #\t\tset speed multiplier to #");else switch(l[1]){case "cs":var Gd;void 0!==l[3]&&(Gd=+l[3]);switch(l[2]){case "int":a.O.T.Lg=Gd;break;
case "start":a.O.T.Vh=Gd;break;case "stop":a.O.T.Ng=Gd;break;default:a.R("unknown cs option");break a}void 0!==Gd&&Yc(a.O);a.R("checksums "+(a.O.fa.yg?"enabled":"disabled"));break;case "sp":void 0!==l[2]&&gd(a.O,+l[2]);a.R("target speed: "+Kb(a.O)+" ("+a.O.T.Ae+"x)");break;default:a.R("unknown option: "+l[1])}break;case "?":var v="commands:",mg;for(mg in Vl)v+="\n"+na(mg,7)+Vl[mg];qf(a)||(v+="\nnote: frequency/history disabled if no exec breakpoints");a.R(v);break;default:a.R("unknown command: "+
b),c=!1}}}catch(Hj){a.R("debugger error: "+(Hj.stack||Hj.message)),c=!1}return c}Qa(function(){for(var a=lb(window.document,"pcjs","debugger"),b=0;b<a.length;b++){var c=a[b],d=jb(c),d=new Ol(d);kb(d,c)}});function Ie(a,b,c){this.id=a.id;this.key=Rm(a,b,c);this.Y=a.Y;Sm(this,a.fs)}function Rm(a,b,c){a=a.id;if(b){var d=b.indexOf(".");0<d&&(a+=".v"+b.substr(0,d))}c&&(a+="."+c);return a}
Ie.prototype={constructor:Ie,set:function(a,b){try{this[this.id][a]=b}catch(c){}},get:function(a){return this[this.id][a]||null},value:function(){return this[this.id]},data:function(){return this[this.id]},load:function(a){return a?(this[this.id]=a,this.hl=!0):this.hl?!0:Fa()&&(a=Ha(this.key))?(this[this.id]=a,this.hl=!0):!1},parse:function(){var a=!0;try{this[this.id]=JSON.parse(this[this.id])}catch(b){Ca(b.message||b),a=!1}return a},toString:function(){var a=this[this.id];return"string"==typeof a?
a:JSON.stringify(a)},clear:function(a){Sm(this);var b=[];try{for(var c=0,d=window.localStorage.length;c<d;c++)b.push(window.localStorage.key(c))}catch(e){}for(c=0;c<b.length;c++)if((d=b[c])&&(a||d.substr(0,this.key.length)==this.key)){try{window.localStorage.removeItem(d)}catch(g){}b.splice(c,1);c=0}},qa:function(a){return this.Y?this.Y.qa(null==a?16777216:a|16777216):!1},$a:function(a){this.Y&&this.Y.message(a)}};function Sm(a,b){a[a.id]={};b&&a.set("parms",b);a.hl=!1}
function Tm(a){var b=!0;if(Fa()){var c=JSON.stringify(a[a.id]);Ia(a.key,c)||(Ca("Unable to store "+c.length+" bytes in browser local storage"),b=!1)}return b}
function Um(a,b,c){Wa.call(this,"Computer",a,Um,67108864);this.fa.hc=!1;this.ze=a.busWidth||a.buswidth;this.vd=Vm;this.oi=null;this.bj=!1;this.url=b?b.url:null;this.Fs=(Math.random()+.1).toString(36).substr(2,12);this.wd=Wm(this);if(this.O=ib("CPU",this.id)){this.Y=ib("Debugger",this.id);this.ma=new Zb({id:this.ao+".bus",buswidth:this.ze},this.O,this.Y);var d,e=gb(this.id);if((this.Ee=ib("Panel",this.id))&&this.Ee.Gh)for(b=0;b<e.length;b++)d=e[b],d.Da=this.Ee.Da,d.R=this.Ee.R,d.Gh=this.Ee.Gh;for(b=
0;b<e.length;b++)d=e[b],d.Ic&&d.Ic(this,this.ma,this.O,this.Y);b=null;d=a.resume;void 0!==d&&(1<d.length?b=this.tk=d:this.vd=parseInt(d,10));var g;if(a=ab&&ab.state||(g=!0,a.state))b=this.Ko=a,g||(this.bj=!0,this.vd=Vm),this.vd&&(this.xk=new Ie(this,"1.18.2"),this.xk.load()?b=null:delete this.xk);!b&&this.vd&&(g=null,this.wd&&(g=Aa()+"/api/v1/user?req=load&user="+this.wd+"&state="+Rm(this,"1.18.2")),b=g)&&(this.bj=!0);b?za(b,!0,null,this,this.dr):pb(this);c||Xm(this,this.ik)}else Ca("Unable to find CPU component")}
fb(Um);var Vm=0;f=Um.prototype;f.Fg=function(){return this.Fs};f.gf=function(){return this.wd?this.wd:""};f.dr=function(a,b,c){c?(this.tk=null,this.bj=!1,this.Da("Unable to load machine state from server (error "+c+(b?": "+oa(b):"")+")")):this.oi=b;pb(this)};function Xm(a,b,c){for(var d=gb(a.id),e=0;e<=d.length;e++){var g=e<d.length?d[e]:a;if(!qb(g)){qb(g,function(){Xm(a,b,c)});return}}b.call(a,c)}
function Ym(a,b){var c=new Ie(a,"1.18.2","validate");if(c.load()&&c.parse()){var d=c.get("timestamp"),e=b?b.get("timestamp"):"unknown";d!=e&&(a.Da("Machine state may be out-of-date\n("+d+" vs. "+e+")\nCheck your browser's local storage limits"),b||c.clear())}}
f.ik=function(a){void 0===a&&(a=this.vd||(this.oi?1:Vm));var b=!1,c=!1;this.Qn=!1;var d=this.xk||new Ie(this,"1.18.2");if(-1==a)b=!0;else if(a>Vm){if(d.load(this.oi)){this.cg=new Ie(this,"1.18.2","failsafe");this.cg.load()&&(Zm(this,d),a=2,Sm(this.cg));this.cg.set("timestamp",ua());Tm(this.cg);var e=this.vd&&!this.bj;if(1==a||Da("Click OK to restore the previous PCjs machine state, or CANCEL to reset the machine.")){if(c=d.parse()){var g=d.get("code"),l=d.get("data");g&&("ok"==g?d.load(l):("error"==
g&&"no machine state"!=l?(this.Da("Error: "+l),"unable to verify user"==l&&(Ia("user",""),this.wd=null)):this.R(g+": "+l),Sm(d),d.load()?(c=d.parse(),e=!0):c=!1))}e&&Ym(this,c?d:null)}else 2==a&&d.clear()}else Ym(this);delete this.oi;delete this.xk}e=gb(this.id);for(g=0;g<e.length;g++)l=e[g],l!==this&&l!=this.O&&(c=$m(this,l,d,b,c));b=[d,a,c];-1!=a?Xm(this,this.In,b):this.In(b)};
function $m(a,b,c,d,e){if(!b.fa.hc){b.fa.hc=!0;if(b.kc){var g=null;e&&((g=c.get(b.id))||(g=c.get(b.id.replace(/[a-z0-9]\./i,"."))));"string"===typeof g&&(g=null);!b.kc(g,d)&&g&&(Ca("Unable to restore state for "+b.type),a.Ko&&!a.oi?(c.clear(),a.vd=Vm,window&&window.location.reload()):a.Qn=!0,b.kc(null),e=!1)}if(!d&&b.Dn)for(a=b.Dn.split("|"),c=0;c<a.length;c++)b.status(a[c])}return e}
f.In=function(a){var b=a[0],c=0>a[1];a=a[2];this.fa.hc=!0;this.Nn||(this.R("PCjs v1.18.2\nCopyright \u00a9 2012-2015 Jeff Parsons <Jeff@pcjs.org>\nLicense: GPL version 3 or later <http://gnu.org/licenses/gpl.html>"),this.Nn=!0);this.O&&($m(this,this.O,b,c,a),$c(this.O));this.Qn&&(Zm(this,b),b.clear());!c&&this.cg&&(this.cg.clear(),delete this.cg)};
function Zm(a,b){if(Da("There may be a problem with your PCjs machine.\n\nTo help us diagnose it, click OK to send this PCjs machine state to http://www.pcjs.org.")){var c=a.gf(),d=b.toString(),e={app:"PCjs",ver:"1.18.2"};e.url=a.url;e.user=c;e.type="bug";e.data=d;za("http://www.pcjs.org/api/v1/report",!0,e)}}
function Qm(a,b,c){var d,e="none",g=new Ie(a,"1.18.2"),l=new Ie(a,"1.18.2","validate"),p=ua();l.set("timestamp",p);g.set("timestamp",p);g.set("version","1.18.2");g.set("url",window?window.location.href:null);g.set("browser",window?window.navigator.userAgent:"");a.O&&a.O.jc&&(c&&a.O.yb(),d=a.O.jc(b,c),"object"===typeof d&&g.set(a.O.id,d),c&&(a.O.fa.hc=!1,!1===d&&(e=null)));for(var p=gb(a.id),w=0;w<p.length;w++){var v=p[w];v.fa.hc&&(v.jc&&(d=v.jc(b,c),"object"===typeof d&&g.set(v.id,d)),c&&(v.fa.hc=
!1,!1===d&&(e=null)))}e&&(c?(p=d=!1,b?(a.wd&&an(a,a.wd,g.toString()),Tm(l)&&Tm(g)||(e=null,d=p=!0)):a.vd&&(d=!0,p=3==a.vd),d&&g.clear(p)):e=g.toString());c&&(a.fa.hc=!1);return e}f.reset=function(){this.ma&&this.ma.reset&&(this.$a("Resetting "+this.ma.type),this.ma.reset());for(var a=gb(this.id),b=0;b<a.length;b++){var c=a[b];c!==this&&c!==this.ma&&c.reset&&(this.$a("Resetting "+c.type),c.reset())}};
f.start=function(a,b){for(var c=gb(this.id),d=0;d<c.length;d++){var e=c[d];"CPU"!=e.type&&e!==this&&e.start&&e.start(a,b)}};f.stop=function(a,b){for(var c=gb(this.id),d=0;d<c.length;d++){var e=c[d];"CPU"!=e.type&&e!==this&&e.stop&&e.stop(a,b)}};
f.Lb=function(a,b,c){var d=this;switch(b){case "save":return this.va[b]=c,c.onclick=function(){var a=Wm(d,!0);if(a){var b=!(!d.vd||d.tk),c=Qm(d,b);b?an(d,a,c):d.Da("Resume disabled, machine state not saved")}},!0;case "reset":return this.va[b]=c,c.onclick=function(){fd(d)},!0}return!1};
function Wm(a,b){var c=a.wd;c||(c=Ha("user"),void 0!==c?!c&&b&&(c=null,window&&(c=window.prompt("To save machine states on the pcjs.org server, you need a user ID (email support@pcjs.org).\n\nOnce you have an ID, enter it below.","")),c&&((c=bn(a,c))||a.Da("Your user ID has not been approved."))):b&&a.Da("Browser local storage is not available"));return c}
function bn(a,b){a.wd=null;var c=za(Aa()+"/api/v1/user?req=verify&user="+b),d=c[1];if(!c[0]&&d)try{c=eval("("+d+")"),c.code&&"ok"==c.code&&(Ia("user",c.data),a.wd=c.data)}catch(e){Ca(e.message+" ("+d+")")}return a.wd}
function an(a,b,c){if(c){var d={req:"store"};d.user=b;d.state=Rm(a,"1.18.2");d.data=c;b=za(Aa()+"/api/v1/user",!1,d);d=b[1];if(b[0]){if(d){var e=d.indexOf("\n");0<e&&(d=d.substr(0,e));d.indexOf("Error: ")||(d=d.substr(7))}d='{"code":'+b[0]+',"data":"'+d+'"}'}b=JSON.parse(d);b&&"ok"==b.code?a.Da("Machine state saved to server"):c&&(c=b&&b.data||"unable to save machine state",c="error"==b.code?"Error: "+c:"Error "+b.code+": "+c,a.Da(c),Ia("user",""),a.wd=null)}}
function fd(a){if(a.vd&&!a.tk){var b=Da("Click OK to save changes to this PCjs machine.\n\nWARNING: If you CANCEL, all disk changes will be discarded.");Qm(a,b,!0);!b&&a.Ko?window&&window.location.reload():(b||(a.jl=!0),a.ik(Vm),a.jl=!1)}else a.reset(),a.O&&$c(a.O)}function yb(a,b,c){a=gb(a.id);for(var d=0;d<a.length;d++){var e=a[d];if(c)c==e&&(c=null);else if(e.type==b)return e}return null}
Qa(function(){for(var a=lb(window.document,"pcjs-machine"),b=0;b<a.length;b++)for(var c=a[b],d=jb(c),c=lb(c,"pcjs","computer"),e=0;e<c.length;e++){var g=c[e],l=jb(g),l=new Um(l,d,!0);kb(l,g);Xm(l,l.ik)}});Ma.show.push(function(){for(var a=lb(window.document,"pcjs","computer"),b=0;b<a.length;b++){var c=jb(a[b]);(c=ib("Computer",c.id))&&c.Nn&&!c.fa.hc&&c.ik(-1)}});
Ma.exit.push(function(){for(var a=lb(window.document,"pcjs","computer"),b=0;b<a.length;b++){var c=jb(a[b]);(c=ib("Computer",c.id))&&c.fa.hc&&Qm(c,!(!c.vd||c.tk),!0)}});var cn=0;function dn(a,b,c,d,e,g){e("Loading "+a+"...");za(a,!0,null,null,function(l,p,w){w?(p||(p="unable to load "+a+" ("+w+")"),g(p,null)):en(p,a,b,c,d,e,g)})}
function en(a,b,c,d,e,g,l){function p(a,g){if(g)l(g,null);else{if(c){var p=b;p&&0>p.indexOf("/")&&(p=window.location.pathname+p);a=a.replace(/(<machine[^>]*\sid=)(['"]).*?\2/,"$1$2"+c+"$2"+(d?" state=$2"+d+"$2":"")+(p?" url=$2"+p+"$2":""))}p=null;if("<"==a.charAt(0))try{window.ActiveXObject||"ActiveXObject"in window?(e||(a=a.replace(/<!DOCTYPE(.|[\r\n])*]>\s*/g,"")),p=new window.ActiveXObject("Microsoft.XMLDOM"),p.async=!1,p.loadXML(a)):p=(new window.DOMParser).parseFromString(a,"text/xml")}catch(O){p=
null,a=O.message}else a="unrecognized XML: "+(255<a.length?a.substr(0,255)+"...":a);l(a,p)}}a?e?hn(a,g,p):p(a,null):l("no data"+(b?" for file: "+b:""),null)}
function hn(a,b,c){var d;if(d=/<([a-z]+)\s+ref="(.*?)"(.*?)\/>/g.exec(a)){var e=d[2];b("Loading "+e+"...");za(e,!0,null,null,function(g,l,p){if(p||!l)c(a,"unable to resolve XML reference: "+d[0]+" ("+p+")");else{if(g=d[3])if(p=l.match(new RegExp("<"+d[1]+"[^>]*>"))){for(var w=p[0],v,E=/( [a-z]+=)(['"])(.*?)\2/g;v=E.exec(g);)w=0>w.indexOf(v[1])?w.replace(">",v[0]+">"):w.replace(new RegExp(v[1]+"(['\"])(.*?)\\1"),v[0]);p[0]!=w&&(l=l.replace(p[0],w))}else{c(a,"missing <"+d[1]+"> in "+e);return}l=l.replace(/<\?xml[^>]*>[\r\n]*/,
"");a=a.replace(d[0],l);hn(a,b,c)}})}else c(a,null)}
function jn(a,b,c,d){function e(a){if(void 0===p){var b=l&&lb(l,"machine-warning");p=b&&b[0]||l}p&&(p.innerHTML=la(a))}function g(a){e("Error: "+a);w&&(--cn||Ta(!0));w=!1}var l,p,w=!0;cn++;try{if(l=window.document.getElementById(a)){c||(c="/versions/pcjs/1.18.2/components.xsl");var v=function(d,p){if(p){var v=function(d,v){if(v)if(v)if(e("Processing "+b+"..."),window.ActiveXObject||"ActiveXObject"in window){var w=p.transformNode(v);w?(l.outerHTML=w,--cn||Ta(!0)):g("transformNodeToObject failed")}else window.document.implementation&&
window.document.implementation.createDocument?(w=new XSLTProcessor,w.importStylesheet(v),(w=w.transformToFragment(p,window.document))?l.parentNode?(l.parentNode.replaceChild(w,l),--cn||Ta(!0)):g("invalid machine element: "+a):g("transformToFragment failed")):g("unable to transform XML: unsupported browser");else g("failed to load XSL file: "+c);else g(d)};p?dn(c,null,null,!1,e,v):g("failed to load XML file: "+b)}else g(d)};"<"!=b.charAt(0)?dn(b,a,d,!0,e,v):en(b,null,a,d,!1,e,v)}else g("missing machine element: "+
a)}catch(E){g(E.message)}return w}window.embedPC=function(a,b,c,d){Ta(!1);return jn(a,b,c,d)};window.enableEvents=Ta;window.sendEvent=Va;})();
(function(){var f,aa,g,ba={163840:[40,1,8],184320:[40,1,9],327680:[40,2,8],368640:[40,2,9],737280:[80,2,9],1228800:[80,2,15],1474560:[80,2,18],2949120:[80,2,36]};
function ca(a,b){var c;if(a){b||(b=16);if("$"==a.charAt(0))b=16,a=a.substr(1);else if("0x"==a.substr(0,2))b=16,a=a.substr(2);else{var d=a.charAt(a.length-1).toLowerCase();"h"==d?(b=16,d=null):"."==d&&(b=10,d=null);null===d&&(a=a.substr(0,a.length-1))}var e,d=a;(b&&10!=b?16==b?null!==d.match(/^[0-9a-f]+$/i):1:null!==d.match(/^[0-9]+$/))&&!isNaN(e=parseInt(a,b))&&(c=e|0)}return c}
function da(a,b){var c="";void 0===b?b=8:8<b&&(b=8);if(null==a||isNaN(a))for(;0<b--;)c="?"+c;else for(;0<b--;){var d=a&15,d=d+(0<=d&&9>=d?48:55),c=String.fromCharCode(d)+c;a>>=4}return c}function ea(a){return"0x"+da(a,2)}function fa(a,b){var c=a,d=a.lastIndexOf("/");0<=d&&(c=a.substr(d+1));d=c.indexOf("&");0<d&&(c=c.substr(0,d));b&&(d=c.lastIndexOf("."),0<d&&(c=c.substring(0,d)));return c}function ga(a){var b="",c=a.lastIndexOf(".");0<=c&&(b=a.substr(c+1).toLowerCase());return b}
var ha={"&":"&","<":"<",">":">",'"':""","'":"'"};function ka(a){return a.replace(/[&<>"']/g,function(a){return ha[a]})}var la=Date.now||function(){return+new Date};function ma(){function a(a){return(10>a?"0":"")+a}var b=new Date;return b.getFullYear()+"-"+a(b.getMonth()+1)+"-"+a(b.getDate())+" "+a(b.getHours())+":"+a(b.getMinutes())+":"+a(b.getSeconds())}var na=[31,28,31,30,31,30,31,31,30,31,30,31];
function oa(a,b){var c=0,d=1,e;for(e in a){if(d>=arguments.length)break;d++;c=void 0}return c}function pa(a,b){return(b&a.Gp)>>a.shift}
function qa(a,b,c,d,e,m){b=!!b;var n=0,p=null,v=fa(a),w=window.XMLHttpRequest?new window.XMLHttpRequest:new window.ActiveXObject("Microsoft.XMLHTTP");b&&(w.onreadystatechange=function(){4===w.readyState&&(p=w.responseText,200==w.status||!w.status&&p.length&&"file:"==(window?window.location.protocol:"file:")||(n=w.status||-1),e&&(d?e.call(d,v,p,n,m):e(v,p,n,m)))});if(c){var G="",Q;for(Q in c)c.hasOwnProperty(Q)&&(G&&(G+="&"),G+=Q+"="+encodeURIComponent(c[Q]));G=G.replace(/%20/g,"+");w.open("POST",
a,b);w.setRequestHeader("Content-type","application/x-www-form-urlencoded");w.send(G)}else w.open("GET",a,b),w.send();a=[];b||(p=w.responseText,200!=w.status&&(n=w.status||-1),e&&(d?e.call(d,v,p,n,m):e(v,p,n,m)),a=[n,p]);return a}function ra(){return"http://"+(window?window.location.host:"www.pcjs.org")}function sa(a){window&&window.alert(a)}function ta(a){var b=!1;window&&(b=window.confirm(a));return b}var ua=null;
function va(){if(null==ua){var a=!1;if(window)try{window.localStorage.setItem("PCjs.localStorage","PCjs.localStorage"),a="PCjs.localStorage"==window.localStorage.getItem("PCjs.localStorage"),window.localStorage.removeItem("PCjs.localStorage")}catch(b){a=!1}ua=a}return ua}function wa(a){var b;if(window)try{b=window.localStorage.getItem(a)}catch(c){}return b}function xa(a,b){try{return window.localStorage.setItem(a,b),!0}catch(c){}return!1}
function ya(a){if(window){var b=window?window.navigator.userAgent:"";return"iOS"==a&&b.match(/(iPod|iPhone|iPad)/)&&b.match(/AppleWebKit/)||"MSIE"==a&&b.match(/(MSIE|Trident)/)||0<=b.indexOf(a)?!0:!1}return!1}var za={init:[],show:[],exit:[]},Aa=!1,Ba=!0;function Ca(a,b){if(window){var c=window[a];window[a]="function"!==typeof c?b:function(){c&&c();b()}}}function Da(a){za.init.push(a)}
function Ea(a){if(Ba)try{for(var b=0;b<a.length;b++)a[b]()}catch(c){sa("An unexpected exception occurred:\n\n"+c.message+"\n\nPlease send this information to support@pcjs.org. Thanks.")}}function Fa(a){!Ba&&a?(Ba=!0,Aa&&Ga("init")):Ba=a}function Ga(a){za[a]&&Ea(za[a])}Ca("onload",function(){Aa=!0;Ea(za.init)});Ca("onpageshow",function(){Ea(za.show)});Ca(ya("Opera")||ya("iOS")?"onunload":"onbeforeunload",function(){Ea(za.exit)});
function Ha(a,b,c){this.type=a;b||(b={id:"",name:""});this.id=b.id;this.name=b.name;this.Hm=b.comment;this.Zq=b;void 0===this.id&&(this.id="");b=this.id.indexOf(".");0<b?(this.cn=this.id.substr(0,b),this.Sg=this.id.substr(b+1)):this.Sg=this.id;this[a]=c;this.ha={Qf:!1,Uc:!1,lk:!1,cc:!1,wd:!1};this.ki=null;this.ha.wd=!1;this.qa={};this.Sa=null;Ia[Ia.length]=this}var Ja=void 0,Ka={};
if(window){Ja||(Ja=window.location.search.substr(1));for(var La,Ma=/\+/g,Na=/([^&=]+)=?([^&]*)/g;La=Na.exec(Ja);)Ka[decodeURIComponent(La[1].replace(Ma," "))]=decodeURIComponent(La[2].replace(Ma," "))}function Oa(a){function b(){}if(window){if(!a)throw new TypeError;if(Object.create)return Object.create(a);var c=typeof a;if("object"!==c&&"function"!==c)throw new TypeError;}b.prototype=a;return new b}
function Pa(a,b){b||(b=Ha);a.prototype=Oa(b.prototype);a.prototype.constructor=a;a.prototype.parent=b.prototype}var Ia=[];function Qa(a){var b,c=[];a&&(a=0<(b=a.indexOf("."))?a.substr(0,b+1):"");for(b=0;b<Ia.length;b++){var d=Ia[b];a&&d.id.indexOf(a)||c.push(d)}return c}function Ra(a,b){if(void 0!==a){var c;b&&0<(c=b.indexOf("."))&&(a=b.substr(0,c+1)+a);for(c=0;c<Ia.length;c++)if(Ia[c].id===a)return Ia[c]}return null}
function Sa(a,b){var c;if(void 0!==a){var d;b&&(b=0<(d=b.indexOf("."))?b.substr(0,d+1):"");for(d=0;d<Ia.length;d++)if(c)c==Ia[d]&&(c=null);else if(!(a!=Ia[d].type||b&&Ia[d].id.indexOf(b)))return Ia[d]}return null}function Ua(a){var b=null;if(a=a.getAttribute("data-value"))try{b=eval("({"+a+"})")}catch(c){sa(c.message+" ("+a+")")}return b}window&&!window.document.ELEMENT_NODE&&(window.document.ELEMENT_NODE=1);
function Va(a,b){for(var c=Wa(b.parentNode,"pcjs-control"),d=0;d<c.length;d++)for(var e=c[d].childNodes,m=0;m<e.length;m++){var n=e[m];if(n.nodeType===window.document.ELEMENT_NODE){var p=n.getAttribute("class");if(p)for(var v=p.split(" "),w=0;w<v.length;w++)switch(p=v[w],p){case "pcjs-binding":(p=Ua(n))&&p.binding&&a.Kb(p.type,p.binding,n),w=v.length}}}}
function Wa(a,b,c){c&&(b+="-"+c+"-object");if(a.getElementsByClassName)return a.getElementsByClassName(b);var d;c=[];a=a.getElementsByTagName("*");var e=new RegExp("(^| )"+b+"( |$)");b=0;for(d=a.length;b<d;b++)e.test(a[b].className)&&c.push(a[b]);return c}
Ha.prototype={constructor:Ha,parent:null,toString:function(){return this.name?this.name:this.id||this.type},Kb:function(a,b,c){switch(b){case "clear":return this.qa[b]||(this.qa[b]=c,c.onclick=function(a){return function(){a.qa.print&&(a.qa.print.value="")}}(this)),!0;case "print":return this.qa[b]||(this.ek=this.qa[b]=c,c.value="",this.oc=function(a){return function(b,c){8192<a.value.length&&(a.value=a.value.substr(a.value.length-4096));a.value+=(void 0!==c?c+": ":"")+(b||"")+"\n";a.scrollTop=a.scrollHeight}}(c),
this.wa=function(a,b,c){this.oc(a,"notice",c)}),!0;default:return!1}},log:function(){},assert:function(){},oc:function(){},status:function(a){this.oc(this.Sg+": "+a)},wa:function(a,b){b||sa(a)},fc:function(){return this.ha.cc=!0},ec:function(a,b){b&&(this.ha.cc=!1);return!0},nc:function(){return!1}};function Xa(a,b){if(a.ha.lk)return a.ha.Uc&&(a.ha.Uc=!1),a.ha.lk=!1;if(a.ha.wd)return a.oc(a.toString()+" error"),!1;a.ha.Uc=b;return a.ha.Uc}
function Ya(a,b){if(!a.ha.wd&&(a.ha.Qf=!1!==b,a.ha.Qf)){var c=a.ki;a.ki=null;c&&c()}}function Za(a,b){b&&(a.ha.Qf?b():a.ki=b);return a.ha.Qf}function $a(a,b){a.ha.wd=!0;a.wa(b)}var ab="undefined"!==typeof ArrayBuffer;function bb(a){Ha.call(this,"Panel",a,bb);this.canvas=null;this.ce=this.de=this.Tg=-1}Pa(bb);function cb(a,b,c,d){this.qf=[a,b,c,d];this.Ej=null;void 0===a&&(this.qf[0]=256*Math.random()|0,this.qf[1]=256*Math.random()|0,this.qf[2]=256*Math.random()|0,this.qf[3]=255,this.Ej=null)}
cb.prototype.toString=function(){this.Ej||(this.Ej="#"+da(this.qf[0],2)+da(this.qf[1],2)+da(this.qf[2],2));return this.Ej};function db(a,b,c,d){this.x=a;this.y=b;this.Ic=c;this.Tc=d}db.prototype.contains=function(a,b){return a>=this.x&&a<this.x+this.Ic&&b>=this.y&&b<this.y+this.Tc};function eb(a,b,c,d){void 0===d&&(d=b>=c>>2);d?(b=new db(a.x,a.y,a.Ic,a.Tc*b/c|0),a.y+=b.Tc,a.Tc-=b.Tc):(b=new db(a.x,a.y,a.Ic*b/c|0,a.Tc),a.x+=b.Ic,a.Ic-=b.Ic);return b}f=bb.prototype;
f.Kb=function(a,b,c){return this.za&&this.za.Kb(a,b,c)||this.W&&this.W.Kb(a,b,c)||this.Da&&this.Da.Kb(a,b,c)?!0:this.parent.Kb.call(this,a,b,c)};f.Jc=function(a,b,c,d){this.za=a;this.la=b;this.W=c;this.Sa=d;this.Da=fb(a,"Keyboard")};f.fc=function(a,b){b||gb();return!0};f.ec=function(){return!0};f.dk=function(a,b){a.button||(this.Tg=b?0:-1,hb(this,a,b))};f.fn=function(a){hb(this,a)};
function hb(a,b,c){var d=1280/a.canvas.offsetWidth,e=720/a.canvas.offsetHeight,m=a.canvas.getBoundingClientRect(),d=(b.clientX-m.left)*d|0;b=(b.clientY-m.top)*e|0;null==c&&(a.Tg||(a.Tg=Math.abs(a.ce-d)>Math.abs(a.de-b)?1:2),1==a.Tg?b=a.de:2==a.Tg&&(d=a.ce));a.ce=d;a.de=b;if(0<=d&&1280>d&&0<=b&&720>b){a:{c=d;if(960>c&&a.Xa&&a.Xa.Cf)for(m=0;m<a.Xa.Cf.length;m++)if(e=a.Xa.Cf[m],e.contains(c,b)){c-=e.x;b-=e.y;var d=a.Xa.wg[m],n=pa(ib.sn,a.Xa.Mj[d.xo]),m=n*a.la.nb,d=(n+d.Ld)*a.la.nb-1;0<b&&(m+=e.Ic*(b-
1)*a.vn);m+=c*a.vn;m|=0;m>d&&(m=d);c=m;break a}c=h}c!==h&&(c&=-16,c!=a.sm&&(jb(a,c,!0),a.sm=c))}}
f.be=function(){if(this.canvas&&this.Xh&&this.le&&this.$e){var a=this.le.width,b=this.le.height;this.$e.fillStyle="black";this.$e.fillRect(0,0,a,b);kb(this,18,this.le,this.$e,this.canvas.style.color);lb(this,3);k(this,"CPU");k(this,"Target");k(this,"Current");mb(this);k(this,this.W.na);k(this,this.W.R.jf.toFixed(2)+"Mhz");k(this,pb(this.W));mb(this,2);lb(this,8);this.Pp=16;this.Qp=4;k(this,"AX",this.W.F,2);k(this,"DS",this.W.jb.ta,0,1);k(this,"DX",this.W.H,2);k(this,"SI",this.W.K,0,1.5);k(this,"BX",
this.W.D,2);k(this,"ES",this.W.Ra.ta,0,1);k(this,"CX",this.W.G,2);k(this,"DI",this.W.J,0,1.5);k(this,"CS",this.W.oa.ta,2);k(this,"SS",this.W.ra.ta,0,1);k(this,"IP",l(this.W),2);k(this,"SP",q(this.W),0,1.5);var c;k(this,"PS",c=qb(this.W),2);k(this,"BP",this.W.L,0,1.5);lb(this,9);k(this,"V"+(c&rb?1:0));k(this,"D"+(c&sb?1:0));k(this,"I"+(c&tb?1:0));k(this,"T"+(c&ub?1:0));k(this,"S"+(c&vb?1:0));k(this,"Z"+(c&wb?1:0));k(this,"A"+(c&xb?1:0));k(this,"P"+(c&yb?1:0));k(this,"C"+(c&zb?1:0),0,2);jb(this,this.sm);
this.Xh.drawImage(this.le,0,0,a,b,this.wt,this.zt,this.Us,this.Xs)}};function Ab(a,b,c,d){a.Xa.wg[a.Xa.Cm++]={xo:b,Ld:c,type:d};return oa(ib,b,c,0,d)}
function jb(a,b,c){if(a.Xh&&a.le&&a.$e){var d=a.le.width;a.$e.fillStyle="black";a.$e.fillRect(0,360,d,360);kb(a,378,a.le,a.$e,a.canvas.style.color);lb(a,24);if(null==b)k(a,"Mouse over memory to dump");else{k(a,"0x"+da(b),null,0,1);for(var e=1;16>=e;e++){for(var m="",n=1;8>=n;n++){var p=Bb(a.la,b++);k(a,da(p,2),null,1);m+=32<=p&&128>p?String.fromCharCode(p):"."}k(a,m,null,0,1)}}c&&a.Xh.drawImage(a.le,0,360,d,360,a.ut,a.xt,a.Ss,a.Vs)}}
function kb(a,b,c,d,e){var m,n=a.Pr=10;a.bd=n;a.zf=b;a.Uf=a.$m=18;m||(m=a.Wm||a.$m+"px Monaco, Lucida Console, Courier New");a.li=a.Wm=m;c&&(a.Wn=c);d&&(a.vd=d,a.bo=e||"white")}function lb(a,b){a.fk=a.Wn.width/b|0}function mb(a,b){a.bd=a.Pr;a.zf+=(a.Uf+2)*(b||1)}function k(a,b,c,d,e){a.vd.font=a.li;a.vd.fillStyle=a.bo;a.vd.fillText(b,a.bd,a.zf);a.bd+=a.fk;null!=c&&(b=c.toString(),16==a.Pp&&(b="0x"+da(c,a.Qp)),a.vd.fillText(b,a.bd,a.zf),a.bd+=a.fk);d&&(a.bd+=a.fk*d);e&&mb(a,e)}
function gb(){for(var a=!1,b=Wa(window.document,"pcjs","panel"),c=0;c<b.length;c++){var d=b[c],e=Ua(d),m=Ra(e.id);m||(a=!0,m=new bb(e));Va(m,d);a&&Ya(m)}}Da(gb);function Cb(a,b,c){Ha.call(this,"Bus",a,Cb);this.W=b;this.Sa=c;this.Ae=a.buswidth||20;this.Sj=Math.pow(2,this.Ae);this.Kp=this.vb=this.Sj-1|0;this.Aa=32==this.Ae||20>=this.Ae?12:24>=this.Ae?14:15;this.nb=1<<this.Aa;this.jn=this.nb>>2;this.Ea=this.nb-1;this.Td=this.Sj/this.nb|0;this.Yc=this.Td-1;this.Ah=[];this.Bh=[];this.yk();Ya(this)}Pa(Cb);
var ib,Db={sn:20,count:8,Qs:1,type:3},Eb=0,Fb;for(Fb in Db){var Gb=Db[Fb];Db[Fb]={Gp:(1<<Gb)-1<<Eb,shift:Eb};Eb+=Gb}ib=void 0;f=Cb.prototype;f.yk=function(){var a=new r;this.ka=Array(this.Td);for(var b=0;b<this.Td;b++)this.ka[b]=a;this.W.yk(this.ka,this.Aa);a=this.W;a.vb=a.Wd=this.vb};f.reset=function(){Hb(this,!0)};f.fc=function(a,b){b||this.reset();return!0};
function Ib(a,b,c,d,e){for(var m=b>>>a.Aa;0<c&&m<a.ka.length;){var n=a.ka[m],p=m*a.nb,v=c>a.nb?a.nb:c;if(n&&n.size){if(n.type==d&&n.V==e){if(b+c<=n.yg)return n.ng+=n.yg-b,n.yg=b,!0;if(b>=n.yg+n.ng){v=n.size-(b-p);v>c&&(v=c);n.ng=b-n.yg+v;c-=v;b=p+a.nb;continue}}return Jb(1,b,c)}a.ka[m++]=new r(b,v,a.nb,d,e);c-=v;b=p+a.nb}return 0<c?Jb(2,b,c):!0}
function Hb(a,b){if(32==a.Ae)b?a.sg&&(Kb(a,1048576,1048576,a.sg),a.sg=null):a.sg||(a.sg=Lb(a,1048576,1048576),Kb(a,1048576,1048576,Lb(a,0,1048576)));else if(20<a.Ae){var c=a.vb&-1048577|(b?1048576:0);if(c!=a.vb&&(a.vb=c,a.W)){var d=a.W;d.vb=d.Wd=c}}}f.Gj=function(a,b,c){if(!(a&this.Ea||!b||b&this.Ea)){for(var d=a>>>this.Aa;0<b;){var e=this.ka[d];if(!e.V)return Jb(5,a,b);e.ld(c);b-=this.nb;d++}return!0}return Jb(3,a,b)};
function Mb(a,b,c){if(!(b&a.Ea||!c||c&a.Ea)){for(var d=b>>>a.Aa;0<c;)b=d*a.nb,a.ka[d++]=new r(b),c-=a.nb;return!0}return Jb(4,b,c)}function Lb(a,b,c){var d=[];for(b>>>=a.Aa;0<c&&b<a.ka.length;)d.push(a.ka[b++]),c-=a.nb;return d}function Kb(a,b,c,d,e){for(var m=0,n=b>>>a.Aa;0<c&&n<a.ka.length;){var p=d[m++];if(!p)break;if(void 0!==e){var v=new r(b);v.clone(p,e);p=v}a.ka[n++]=p;c-=a.nb}}f.vc=function(a){return this.ka[(a&this.vb)>>>this.Aa].xc(a&this.Ea,a)};
function Bb(a,b){return a.ka[(b&a.vb)>>>a.Aa].rj(b&a.Ea,b)}f.ma=function(a){var b=a&this.Ea,c=(a&this.vb)>>>this.Aa;return b!=this.Ea?this.ka[c].sj(b,a):this.ka[c++].xc(b,a)|this.ka[c&this.Yc].xc(0,a+1)<<8};function Nb(a,b){var c=b&a.Ea,d=(b&a.vb)>>>a.Aa;return c!=a.Ea?a.ka[d].mr(c,b):a.ka[d++].rj(c,b)|a.ka[d&a.Yc].rj(0,b+1)<<8}
f.Qg=function(a){var b=a&this.Ea,c=(a&this.vb)>>>this.Aa;if(b<this.Ea-2)return this.ka[c].yc(b,a);var d=(b&3)<<3;return this.ka[c].yc(b&-4,a)>>>d|this.ka[c+1&this.Yc].yc(0,a+3)<<32-d};f.Me=function(a,b){this.ka[(a&this.vb)>>>this.Aa].Bc(a&this.Ea,b&255,a)};f.Cb=function(a,b){var c=a&this.Ea,d=(a&this.vb)>>>this.Aa;c!=this.Ea?this.ka[d].Jj(c,b&65535,a):(this.ka[d++].Bc(c,b&255,a),this.ka[d&this.Yc].Bc(0,b>>8&255,a+1))};
function Ob(a,b,c){var d=b&a.Ea,e=(b&a.vb)>>>a.Aa;d!=a.Ea?a.ka[e].Kr(d,c&65535,b):(a.ka[e++].cm(d,c&255,b),a.ka[e&a.Yc].cm(0,c>>8&255,b+1))}f.Fj=function(a,b){var c=a&this.Ea,d=(a&this.vb)>>>this.Aa;if(c<this.Ea-2)this.ka[d].Qe(c,b);else{var e,m=(c&3)<<3,c=c&-4;e=this.ka[d].yc(c,a);this.ka[d].Qe(c,e&~(-1<<m)|b<<m,a);d=d+1&this.Yc;a+=3;e=this.ka[d].yc(0,a);this.ka[d].Qe(0,e&-1<<m|b>>>32-m,a)}};
function Pb(a){for(var b=0,c=[],d=0;d<a.Td;d++){var e=a.ka[d];if(e.La||e.Mm){c[b++]=d;var m=b++;a:if(e=e.save()){for(var n=0,p=0,v=[];n<e.length;){for(var w=e[n],G=n+1;G<e.length&&e[G]===w;)G++;v[p++]=G-n;v[p++]=w;n=G}if(v.length<e.length){e=v;break a}}c[m]=e}}c[b]=!a.sg&&a.Kp==a.vb;return c}
function Sb(a,b,c,d){void 0===d&&(d=0);for(var e in c){var m=a,n=+e+d,p=b,v=c[e];if(void 0!==v)for(var w=+e+d;w<=n;w++)void 0!==m.Ah[w]?sa("Input port 0x"+da(w,4)+" registered by "+m.Ah[w][0].id+", ignoring "+p.id):m.Ah[w]=[p,v,!1,!1]}}function Tb(a,b,c){var d=255;a=a.Ah[b];void 0!==a&&a[1]&&(b=a[1].call(a[0],b,c),void 0!==b&&(d=b));return d}
function Ub(a,b,c,d){void 0===d&&(d=0);for(var e in c){var m=a,n=+e+d,p=b,v=c[e];if(void 0!==v)for(var w=+e+d;w<=n;w++)void 0!==m.Bh[w]?sa("Output port 0x"+da(w,4)+" registered by "+m.Bh[w][0].id+", ignoring "+p.id):m.Bh[w]=[p,v,!1,!1]}}function Vb(a,b,c,d){a=a.Bh[b];void 0!==a&&a[1]&&a[1].call(a[0],b,c,d)}function Jb(a,b,c){sa("Memory block error ("+a+","+da(b)+","+da(c)+")");return!1}var Wb;
if(ab){var Xb=new ArrayBuffer(2);(new DataView(Xb)).setUint16(0,256,!0);Wb=256===(new Uint16Array(Xb))[0]}else Wb=!1;var Yb=Wb;
function r(a,b,c,d,e,m){this.id=Zb+=2;this.ba=null;this.offset=0;this.yg=a;this.ng=b;this.size=c||0;this.type=d||$b;this.hi=d==ac;this.V=null;this.W=m;this.La=this.Mm=!1;bc(this);if(c)if(e)this.V=e,a=e.Zm(a),this.ba=a[0],this.offset=a[1],this.ld(e.vk());else if(ab)this.buffer=new ArrayBuffer(c),this.re=new DataView(this.buffer,0,c),this.Mb=new Uint8Array(this.buffer,0,c),this.Gh=new Uint16Array(this.buffer,0,c>>1),this.ba=new Int32Array(this.buffer,0,c>>2),this.ld(Yb?cc:dc);else{this.ba=Array(c>>
2);for(e=0;e<this.ba.length;e++)this.ba[e]=0;this.ld(ec)}else this.ld()}var $b=0,ac=2,fc="NONE RAM ROM VIDEO H/W UNPAGED PAGED".split(" "),gc=["black","blue","green","cyan"],Zb=0;function hc(a){ab&&!Yb&&(a=a<<24|a<<8&16711680|a>>8&65280|a>>>24);return a}
r.prototype={constructor:r,parent:null,clone:function(a,b){this.id=a.id|1;this.ng=a.ng;this.size=a.size;b&&(this.type=b,this.hi=b==ac);ab?(this.buffer=a.buffer,this.re=a.re,this.Mb=a.Mb,this.Gh=a.Gh,this.ba=a.ba,this.ld(Yb?cc:dc)):(this.ba=a.ba,this.ld(ec))},save:function(){var a,b;if(this.V)a=null;else if(ab)for(a=Array(this.size>>2),b=0;b<a.length;b++)a[b]=this.re.getInt32(b<<2,!0);else a=this.ba;return a},restore:function(a){if(this.V)return null==a;if(a&&this.size==a.length<<2){var b;if(ab)for(b=
0;b<a.length;b++)this.re.setInt32(b<<2,a[b],!0);else this.ba=a;return this.La=!0}return!1},ld:function(a){a||(a=5==this.type?ic:6==this.type?jc:kc);var b=a;this.xc=b[0]||this.wn;this.sj=b[1]||this.xn;this.yc=b[2]||this.gr;this.rj=b[0]||this.wn;this.mr=b[1]||this.xn;this.Bc=!this.hi&&a[3]||this.On;this.Jj=!this.hi&&a[4]||this.Pn;this.Qe=!this.hi&&a[5]||this.Er;this.cm=a[3]||this.On;this.Kr=a[4]||this.Pn},wn:function(){return 255},On:function(){},xn:function(a,b){return this.xc(a,b)|this.xc(a+1,b)<<
8},gr:function(a,b){return this.xc(a,b)|this.xc(a+1,b)<<8|this.xc(a+2,b)<<16|this.xc(a+3,b)<<24},Pn:function(a,b){this.Bc(a,b&255);this.Bc(a+1,b>>8)},Er:function(a,b){this.Bc(a,b&255);this.Bc(a+1,b>>8&255);this.Bc(a+2,b>>16&255);this.Bc(a+3,b>>>24)},cr:function(a){return this.ba[a>>2]>>>((a&3)<<3)&255},or:function(a){var b=a>>2;a=(a&3)<<3;var c=this.ba[b]>>a;return 24>a?c&65535:c&255|(this.ba[b+1]&255)<<8},ir:function(a){var b=a>>2;a=(a&3)<<3;var c=this.ba[b];a&&(c=c>>>a|this.ba[b+1]<<32-a);return c},
Ar:function(a,b){var c=a>>2,d=(a&3)<<3;this.ba[c]=this.ba[c]&~(255<<d)|b<<d;this.La=!0},Mr:function(a,b){var c=a>>2,d=(a&3)<<3;24>d?this.ba[c]=this.ba[c]&~(65535<<d)|b<<d:(this.ba[c]=this.ba[c]&16777215|b<<24,c++,this.ba[c]=this.ba[c]&-256|b>>8);this.La=!0},Gr:function(a,b){var c=a>>2,d=(a&3)<<3;if(d){var e=-1<<d;this.ba[c]=this.ba[c]&~e|b<<d;c++;this.ba[c]=this.ba[c]&e|b>>>32-d}else this.ba[c]=b;this.La=!0},dr:function(a,b){this.Qc.ba[this.Wc]|=this.Kd;this.Rc.ba[this.Xc]|=this.Kd;return this.If.xc(a,
b)},pr:function(a,b){this.Qc.ba[this.Wc]|=this.Kd;this.Rc.ba[this.Xc]|=this.Kd;return this.If.sj(a,b)},jr:function(a,b){this.Qc.ba[this.Wc]|=this.Kd;this.Rc.ba[this.Xc]|=this.Kd;return this.If.yc(a,b)},Br:function(a,b,c){this.Qc.ba[this.Wc]|=this.Kd;this.Rc.ba[this.Xc]|=this.Yj;this.If.Bc(a,b,c)},Nr:function(a,b,c){this.Qc.ba[this.Wc]|=this.Kd;this.Rc.ba[this.Xc]|=this.Yj;this.If.Jj(a,b,c)},Hr:function(a,b,c){this.Qc.ba[this.Wc]|=this.Kd;this.Rc.ba[this.Xc]|=this.Yj;this.If.Qe(a,b,c)},er:function(a,
b){return(lc(this.W,b,!1)||this).xc(a,b)},qr:function(a,b){return(lc(this.W,b,!1)||this).sj(a,b)},kr:function(a,b){return(lc(this.W,b,!1)||this).yc(a,b)},Cr:function(a,b,c){(lc(this.W,c,!0)||this).Bc(a,b,c)},Or:function(a,b,c){(lc(this.W,c,!0)||this).Jj(a,b,c)},Ir:function(a,b,c){(lc(this.W,c,!0)||this).Qe(a,b,c)},ar:function(a){return this.Mb[a]},br:function(a){return this.Mb[a]},lr:function(a){return this.re.getUint16(a,!0)},nr:function(a){return a&1?this.Mb[a]|this.Mb[a+1]<<8:this.Gh[a>>1]},fr:function(a){return this.re.getInt32(a,
!0)},hr:function(a){return a&3?this.Mb[a]|this.Mb[a+1]<<8|this.Mb[a+2]<<16|this.Mb[a+3]<<24:this.ba[a>>2]},yr:function(a,b){this.Mb[a]=b;this.La=!0},zr:function(a,b){this.Mb[a]=b;this.La=!0},Jr:function(a,b){this.re.setUint16(a,b,!0);this.La=!0},Lr:function(a,b){a&1?(this.Mb[a]=b,this.Mb[a+1]=b>>8):this.Gh[a>>1]=b;this.La=!0},Dr:function(a,b){this.re.setInt32(a,b,!0);this.La=!0},Fr:function(a,b){a&3?(this.Mb[a]=b,this.Mb[a+1]=b>>8,this.Mb[a+2]=b>>16,this.Mb[a+3]=b>>24):this.ba[a>>2]=b;this.La=!0}};
function bc(a,b,c,d,e,m){a.If=b;a.Qc=c;a.Wc=d>>2;a.Rc=e;a.Xc=m>>2;a.Yj=b?hc(mc|nc):0;a.Kd=b?hc(mc):0}var kc=[],ec=[r.prototype.cr,r.prototype.or,r.prototype.ir,r.prototype.Ar,r.prototype.Mr,r.prototype.Gr],jc=[r.prototype.dr,r.prototype.pr,r.prototype.jr,r.prototype.Br,r.prototype.Nr,r.prototype.Hr],ic=[r.prototype.er,r.prototype.qr,r.prototype.kr,r.prototype.Cr,r.prototype.Or,r.prototype.Ir];
if(ab)var dc=[r.prototype.ar,r.prototype.lr,r.prototype.fr,r.prototype.yr,r.prototype.Jr,r.prototype.Dr],cc=[r.prototype.br,r.prototype.nr,r.prototype.hr,r.prototype.zr,r.prototype.Lr,r.prototype.Fr];
function oc(a,b){Ha.call(this,"CPU",a,oc);var c=a.cycles||b,d=a.multiplier||1;this.R={};this.R.zd=c;this.R.Be=d;this.R.ni=Math.round(this.R.zd/1E4)/100;this.R.jf=this.R.ni*this.R.Be;this.ha.Pb=!1;this.ha.Tm=!1;this.ha.kk=a.autoStart;this.ha.Nm=!1;c=Ka.autostart;void 0!==c&&(this.ha.kk="true"==c?!0:"false"==c?!1:null);this.ha.ci=!1;this.R.qi=this.R.Xf=0;this.R.ri=a.csStart;this.R.Ug=a.csInterval;this.R.Vg=a.csStop;this.dd=[];var e=this;this.Zp=function(){qc(e)};Ya(this)}Pa(oc);f=oc.prototype;
f.Jc=function(a,b,c,d){this.la=b;this.Sa=d;this.za=a;for(b=null;b=fb(a,"Video",b);)this.dd.push(b);this.fa=fb(a,"ChipSet");Ya(this)};f.reset=function(){};f.save=function(){return null};f.restore=function(){return!1};f.fc=function(a,b){if(!b){if(a&&this.restore){rc(this);if(!this.restore(a))return!1;sc(this)}else this.reset();this.oc("No debugger detected")}tc(this);this.be();return!0};f.ec=function(a){return a&&this.save?this.save():!0};
function uc(a){(!0===a.ha.kk||null===a.ha.kk&&void 0===a.qa.run)&&qc(a)}f.Ym=function(){return 0};function sc(a){void 0===a.R.ri&&(a.R.ri=0);void 0===a.R.Ug&&(a.R.Ug=-1);void 0===a.R.Vg&&(a.R.Vg=-1);a.ha.ci=0<=a.R.ri&&0<a.R.Ug;a.ha.ci&&(a.R.qi=0,a.R.Xf=a.R.ri-a.nf)}f.be=function(){this.za&&this.za.Xd&&this.za.Xd.be()};
function tc(a){for(var b=0;b<a.dd.length;b++)vc(a.dd[b]);if(a.za&&a.za.Xd&&(a=a.za.Xd,a.to)){kb(a,18,a.Fg,a.co,a.canvas.style.color);if(a.at){var b=a.la,c=a.Xa,d,e;null==d&&(d=0);null==e&&(e=b.Sj-d|0);null==c&&(c={bk:0,Ld:0,Mj:[]});var m=d>>>b.Aa;d=d+e-1>>>b.Aa;c.bk=0;for(c.Ld=0;m<=d;)e=b.ka[m],c.bk+=e.size,e.size&&(c.Mj.push(oa(ib,m,0,0,e.type)),c.Ld++),m++;a.Xa=c;a.vn=a.Xa.Ld*a.la.nb/691200;b=0;a.Xa.Cm=0;a.Xa.wg||(a.Xa.wg=[]);c=-1;d=0;var n=-1;for(e=0;e<a.Xa.Ld;e++){var p=a.Xa.Mj[e],m=pa(ib.type,
p),p=pa(ib.sn,p);if(m!=c||p!=n+1)(n=e-d)&&(b+=Ab(a,d,n,c)),c=m,d=e;n=p}b+=Ab(a,d,e-d,c);c=a.Xa.ao!=b;a.Xa.ao=b;if(c){c=new db(0,0,a.Fg.width,a.Fg.height);a.Xa.Cf=[];d=a.Xa.Ld;for(b=0;b<a.Xa.Cm;b++)e=a.Xa.wg[b].Ld,a.Xa.Cf.push(eb(c,e,d,!b)),d-=e;for(b=0;b<a.Xa.Cf.length;b++)c=a.Xa.wg[b],d=e=a.Xa.Cf[b],m=a.co,(n=gc[c.type])||(n=new cb),m.strokeStyle="black",m.strokeRect(d.x,d.y,d.Ic,d.Tc),m.fillStyle="string"==typeof n?n:n.toString(),m.fillRect(d.x,d.y,d.Ic,d.Tc),d=a,m=e,d.li=d.Wm,d.Uf=d.$m,e=m.x+(m.Ic>>
1),n=m.y+(m.Tc>>1),p=m.Tc,m.Ic<m.Tc&&(p=m.Ic,d.Um=!0,d.vd.save(),d.vd.translate(e,n),d.vd.rotate(-Math.PI/2),e=n=0),p<d.Uf&&(d.Uf=p,d.li=d.Uf+"px Monaco, Lucida Console, Courier New"),m=n,d.bd=e,d.zf=m,d=a,c=fc[c.type]+" ("+(c.Ld*a.la.nb/1024|0)+"Kb)",d.vd.font=d.li,d.bd-=d.vd.measureText(c).width>>1,d.zf+=(d.Uf>>1)-2,k(d,c),d.Um&&(d.vd.restore(),d.Um=!1)}}else k(a,"This space intentionally left blank");a.Xh.drawImage(a.Fg,0,0,a.Fg.width,a.Fg.height,a.vt,a.yt,a.Ts,a.Ws);a.to=!1}}
f.Fd=function(){this.dd.length&&this.dd[0].Fd()};
f.Kb=function(a,b,c){var d=this;a=!1;switch(b){case "run":this.qa[b]=c;c.onclick=function(){var a;if(a=d.za)if(a=d.za,a.ha.cc)a=!0;else{var b=null,c,p=Qa(a.id);for(c=0;c<p.length&&(b=p[c],b===a||b.ha.Qf);c++);if(c==p.length)for(c=0;c<p.length&&(b=p[c],b===a||b.ha.cc);c++);c==p.length&&(b=a);sa("The "+b.type+" component ("+b.id+") is not "+(b.ha.Qf?"powered yet":"ready yet"+(b.ki?" (waiting for notification)":""))+".");a=!1}a&&(d.ha.Pb?wc(d,!0):qc(d,!0))};a=!0;break;case "reset":this.qa[b]=c;c.onclick=
function(){d.za&&xc(d.za)};a=!0;break;case "speed":this.qa[b]=c;a=!0;break;case "setSpeed":this.qa[b]=c,c.onclick=function(){yc(d,d.R.Be<<1,!0)},c.textContent=this.R.jf.toFixed(2)+"Mhz",a=!0}return a};function zc(a,b){if(a.ha.Pb){var c=a.A-b;a.A-=c;a.yd-=c}}function Ac(a,b,c){a.nf+=b;c&&(a.yd=a.A=0)}
function Bc(a,b){var c=30;60>c&&(c=60);2>c&&(c=2);var d=1;b&&1<a.R.Be&&a.R.ye&&(d=a.R.ye/a.R.ni);a.R.gn=Math.round(1E3/30);a.R.Np=Math.floor(a.R.zd/c*d);a.R.Fk=Math.floor(a.R.zd/30*d);a.R.mn=Math.floor(a.R.zd/60*d);a.R.ln=Math.floor(a.R.zd/2*d);b||(a.R.Yg=a.R.Fk,a.R.Xg=a.R.mn,a.R.Wg=a.R.ln);a.R.Gk=0}function Cc(a,b){var c=a.nf+a.Fe+a.yd-a.A;b&&1<a.R.Be&&a.R.ye>a.R.ni&&(c=Math.round(c/a.R.Be));return c}function rc(a){a.R.ye=0;a.nf=a.Fe=a.yd=a.A=0;sc(a);yc(a,1)}
function pb(a){return a.ha.Pb&&a.R.ye?a.R.ye.toFixed(2)+"Mhz":"Stopped"}function yc(a,b,c){if(void 0!==b){.8>a.R.ye/a.R.jf&&(b=1);a.R.Be=b;b=a.R.ni*a.R.Be;if(a.R.jf!=b){a.R.jf=b;b=a.R.jf.toFixed(2)+"Mhz";var d=a.qa.setSpeed;d&&(d.textContent=b);a.oc("target speed: "+b)}c&&a.Fd()}Ac(a,a.Fe);a.Fe=0;a.R.Wf=la();a.R.kf=0;Bc(a)}
function qc(a,b){if(Xa(a,!0)){if(!a.ha.Pb){yc(a);a.za&&a.za.start(a.R.Wf,Cc(a));a.ha.Pb=!0;a.ha.Tm=!0;a.fa&&Dc(a.fa);var c=a.qa.run;c&&(c.textContent="Halt");a.be(!0);b&&a.Fd()}a.R.Gk>=a.R.zd&&Bc(a,!0);a.R.Zg=0;a.R.oi=la();a.R.kf&&(c=a.R.oi-a.R.kf,c>a.R.gn&&(a.R.Wf+=c,a.R.Wf>a.R.oi&&(a.R.Wf=a.R.oi)));try{do{var d=a.ha.ci?1:a.R.Np;if(a.fa){Ec(a.fa);var e=a.fa,c=d,m=e.Tb[0];if(m.ff){var n=(Cc(e.W,e.te)-m.Ud)/e.lj|0,p=Fc(e,0)-n;6==m.mode&&(p-=n);var v=p*e.lj|0;6==m.mode&&(v>>=1);c>v&&(c=v)}var d=c,w=
a.fa,c=d;if(w.ea&&w.ea[11]&64){var G=w.cg-Cc(w.W,w.te);0<G&&c>G&&(c=G)}d=c}a.Kn(d);var Q=a.yd-a.A;a.Fe+=Q;a.R.Zg+=Q;Ac(a,0,!0);var c=a,M=Q;if(c.ha.ci){var R=!1;c.R.qi=c.R.qi+c.Ym()|0;c.R.Xf-=M;0>=c.R.Xf&&(c.R.Xf+=c.R.Ug,R=!0);0<=c.R.Vg&&c.R.Vg<=Cc(c)&&(c.R.Ug=c.R.Vg=-1,sc(c),wc(c),R=!0);R&&c.oc(Cc(c)+" cycles: checksum="+da(c.R.qi))}a.R.Xg-=Q;0>=a.R.Xg&&(a.R.Xg+=a.R.mn,tc(a));a.R.Wg-=Q;0>=a.R.Wg&&(a.R.Wg+=a.R.ln,a.be());a.R.Yg-=Q;if(0>=a.R.Yg){a.R.Yg+=a.R.Fk;break}}while(a.ha.Pb)}catch(W){wc(a);tc(a);
a.be();a.za&&a.za.stop(la(),Cc(a));Xa(a,!1);$a(a,W.stack||W.message);return}d=setTimeout;e=a.Zp;a.R.kf=la();m=a.R.gn;a.R.Zg&&(m=Math.round(m*a.R.Zg/a.R.Fk));m-=a.R.kf-a.R.oi;if(n=a.R.kf-a.R.Wf)a.R.ye=Math.round(a.Fe/(10*n))/100,864E5<=n&&(a.nf=0,a.fa&&Ec(a.fa,!0),yc(a));if(0>m||a.R.ye<a.R.jf)m=0;a.R.Gk+=a.R.Zg;a.R.kf+=m;d(e,m)}else tc(a),a.be(),a.za&&a.za.stop(la(),Cc(a))}f.Kn=function(){return 0};
function wc(a,b){a.ha.Uc&&(a.ha.lk=!0);a.yd-=a.A;a.A=0;Ac(a,a.Fe);a.Fe=0;if(a.ha.Pb){a.ha.Pb=!1;a.fa&&Dc(a.fa);var c=a.qa.run;c&&(c.textContent="Run")}a.ha.Ng=b}var h=-1,zb=1,yb=4,xb=16,wb=64,vb=128,ub=256,tb=512,sb=1024,rb=2048,nc=64,mc=32,Gc=ub|tb|sb,Hc=zb|yb|xb|wb|vb|rb,Ic=zb|yb|xb|wb|vb;
function Jc(a,b,c,d){this.W=a;this.Sa=a.Sa;this.id=b;this.Cj=c||"";this.ta=0;this.Gb=65535;this.He=this.Gb+1;this.Ka=this.tc=this.Zh=this.Nb=this.type=this.xa=0;this.nd=h;this.ja=this.Hd=2;this.C=this.T=65535;this.um=this.id==Lc?Array(32):[];this.mk=null;this.ji=!1;Mc(this,!0,d)}var Lc=1;f=Jc.prototype;f.Fp=function(a){this.ta=a&65535;return this.xa=this.ta<<4};
f.Ep=function(a,b){var c,d,e=this.W;a&=65535;a&4?(c=e.Le.xa,d=c+e.Le.Gb|0):(c=e.od,d=e.Ff);if(!b||c){c=c+(a&65528)|0;if(d-c|0)return b||(e.A-=15),Nc(this,c,a,b);b||Oc.call(e,13,a)}return h};f.Dp=function(a){var b=this.W;a=b.pd+(a<<2);var c=b.ma(a);b.ca&=~(ub|tb);return this.load(b.ma(a+2))+c|0};f.Cp=function(a){var b=this.W;a<<=3;var c=b.pd+a|0;if(7<=(b.Gf-c|0))return Nc(this,c,a)+b.Sl;Oc.call(b,13,a|3,!0);return h};f.Yn=function(a){return this.xa+a|0};f.$n=function(a){return this.xa+a|0};
f.Fm=function(a,b,c){return(a>>>0)+b<=this.He?this.xa+a|0:this.Uh(0,0,c)};f.Xn=function(a,b,c){return(a>>>0)+b>this.He?this.xa+a|0:this.Uh(0,0,c)};f.Uh=function(a,b,c){c||Oc.call(this.W,13,0);return h};f.Gm=function(a,b,c){return(a>>>0)+b<=this.He?this.xa+a|0:this.Vh(0,0,c)};f.Zn=function(a,b,c){return(a>>>0)+b>this.He?this.xa+a|0:this.Vh(0,0,c)};f.Vh=function(a,b,c){c||Oc.call(this.W,13,0);return h};
function Pc(a,b,c){var d=a.W,e=d.ma(b+2),m=d.ma(b)|(e&255)<<16,d=d.ma(b+4);a.ta=c;a.xa=m;a.Gb=d;a.He=(d>>>0)+1;a.Nb=e;a.type=e&7936;a.Zh=0;a.nd=b;Mc(a,!0)}
function Nc(a,b,c,d){var e=a.W,m=e.ma(b+0),n=e.ma(b+4),p=n&7936,v=e.ma(b+2)|(n&255)<<16,w=e.ma(b+6),G=c&65528;80386<=e.na&&(v|=(w&65280)<<16,m|=(w&15)<<16,w&128&&(m=m<<12|4095));for(;;){var Q,M,R;if(a.id==Lc){a.ji=!1;Q=a.mk;var W,ia;R=c&3;var ja=(n&24576)>>13;if(G&&!(n&32768)){d||Oc.call(e,11,c);v=h;break}if(6144<=p){R=c&3;if(R>a.Ka){if(!1!==Q&&!(ja==a.Ka||p&1024&&ja<=a.Ka)){v=h;break}G=e.Fa();Qc(e,e.Fa(),!0);t(e,G);a.ji=!0}W=!1}else{if(256==p){if(!Rc(a,c,Q)){v=h;break}return a.xa}if(1024==p)W=!0,
ia=-1,M=c,R<a.Ka&&(R=a.Ka);else if(1536==p)W=!0,ia=~(16384|ub|tb),M=c|1;else if(1792==p)W=!0,ia=~(16384|ub),M=c|1;else if(1280==p){if(!Rc(a,v&65535,Q)){v=h;break}return a.xa}}if(W){b=v&65535;if(R<=ja){d=a.Ka;if(a.load(b,!0)===h){v=h;break}e.Sl=m;if(a.Ka<d){if(!0!==Q){v=h;break}G=q(e);m=0;for(n&=31;n--;)a.um[m++]=Sc(e,e.ra,G),G+=2;n=e.gb.xa;Q=(a.Ka<<2)+2;d=Q+2;R=e.ra.ta;M=q(e);Qc(e,e.ma(n+d),!0);t(e,e.ma(n+Q));u(e,R);for(u(e,M);m;)u(e,a.um[--m]);a.ji=!0}e.ca&=ia;return a.xa}d||Oc.call(e,13,M,!0);v=
h;break}else if(!1!==W){d||Oc.call(e,13,c,!0);v=h;break}}else if(2==a.id){if(G){if(!(n&32768)){d||Oc.call(e,11,c);v=h;break}if(4096>p||2048==(p&2560)){d||Oc.call(e,13,c,!!n);v=h;break}}}else if(3==a.id){if(!(n&32768)){d||Oc.call(e,12,c);v=h;break}if(!G||4096>p||512!=(p&2560)){d||Oc.call(e,13,c,!0);v=h;break}}else if(4==a.id){if(!G||256!=p&&768!=p){d||Oc.call(e,10,c,!0);v=h;break}}else if(6==a.id&&!(p&4096)&&768<p){v=h;break}a.ta=c;a.xa=v;a.Gb=m;a.He=(m>>>0)+1;a.Nb=n;a.type=p;a.Zh=w;a.nd=b;Mc(a,!0);
break}return v}
function Rc(a,b,c){var d=a.W,e=d.gb.xa,m=a.Ka,n=d.gb.ta;if(!c){if(768!=d.gb.type)return Oc.call(d,10,b,!0),!1;d.Cb(d.gb.nd+4,d.gb.Nb&-769|256)}if(d.gb.load(b)===h)return!1;var p=d.gb.xa;if(!1===c){if(768!=d.gb.type)return Oc.call(d,13,b,!0),!1}else{if(768==d.gb.type)return Oc.call(d,13,b,!0),!1;d.Cb(d.gb.nd+4,d.gb.Nb|=768);d.gb.type=768}d.Cb(e+14,l(d));d.Cb(e+16,qb(d));d.Cb(e+18,d.F);d.Cb(e+20,d.G);d.Cb(e+22,d.H);d.Cb(e+24,d.D);d.Cb(e+26,q(d));d.Cb(e+28,d.L);d.Cb(e+30,d.K);d.Cb(e+32,d.J);d.Cb(e+34,
d.Ra.ta);d.Cb(e+36,d.oa.ta);d.Cb(e+38,d.ra.ta);d.Cb(e+40,d.jb.ta);d.Le.load(d.ma(p+42));Tc(d,d.ma(p+16)|(c?16384:0));d.F=d.ma(p+18);d.G=d.ma(p+20);d.H=d.ma(p+22);d.D=d.ma(p+24);d.L=d.ma(p+28);d.K=d.ma(p+30);d.J=d.ma(p+32);d.Ra.load(d.ma(p+34));d.jb.load(d.ma(p+40));Uc(d,d.ma(p+14),d.ma(p+36));b=38;e=26;a.Ka<m&&(e=(a.Ka<<2)+2,b=e+2);Qc(d,d.ma(p+b),!0);t(d,d.ma(p+e));c&&d.Cb(p+0,n);d.Ab|=8;return!0}
f.save=function(){return[this.ta,this.xa,this.Gb,this.Nb,this.id,this.Cj,this.Ka,this.tc,this.nd,this.Hd,this.T,this.ja,this.C,this.type,this.He]};f.restore=function(a){"number"==typeof a?this.load(a):(this.ta=a[0],this.xa=a[1],this.Gb=a[2],this.Nb=a[3],this.id=a[4],this.Cj=a[5],this.Ka=a[6],this.tc=a[7],this.nd=a[8],this.Hd=a[9]||2,this.T=a[10]||65535,this.ja=a[11]||2,this.C=a[12]||65535,this.type=a[13]||this.Nb&7936,this.He=a[14]||(this.Gb>>>0)+1)};
function Mc(a,b,c){void 0===c&&(c=!!(a.W.Ab&1));a.Of=!1;if(c){a.load=a.Ep;a.en=a.Cp;a.qc=a.Fm;a.lc=a.Gm;if(!(a.ta&-4))a.qc=a.Uh,a.lc=a.Vh;else if(a.type&4096){6144==(a.type&6656)&&(a.qc=a.Uh);if(a.type&2048||!(a.type&512))a.lc=a.Vh;1024==(a.type&3072)&&(a.qc==a.Fm&&(a.qc=a.Xn),a.lc==a.Gm&&(a.lc=a.Zn),a.Of=!0)}b&&(a.ta&-4&&a.nd!==h&&(b=a.nd+5,a.W.Me(b,a.W.vc(b)|1)),a.Ka=a.ta&3,a.tc=(a.Nb&24576)>>13,80386>a.W.na||!(a.Zh&64)?(a.ja=2,a.C=65535):(a.ja=4,a.C=-1),a.Hd=a.ja,a.T=a.C)}else a.load=a.Fp,a.en=
a.Dp,a.qc=a.Yn,a.lc=a.$n,a.Ka=a.tc=0,a.nd=h}
function Vc(a){this.na=a.model||8088;var b=0;switch(this.na){default:b=4772727;break;case 80286:b=6E6;break;case 80386:b=16E6}oc.call(this,a,b);this.im=61442;this.wh=Gc;this.vh=4;this.sb=255;this.B=80386==this.na?Wc:80286==this.na?Xc:Yc;this.Ia=Zc;this.mm=$c;this.nm=ad;this.om=bd;if(80186<=this.na&&(this.Ia=Zc.slice(),this.mm=$c.slice(),this.nm=ad.slice(),this.sb=31,this.Ia[15]=cd,this.Ia[96]=dd,this.Ia[97]=ed,this.Ia[98]=fd,this.Ia[99]=cd,this.Ia[100]=cd,this.Ia[101]=cd,this.Ia[102]=cd,this.Ia[103]=
cd,this.Ia[104]=gd,this.Ia[105]=hd,this.Ia[106]=id,this.Ia[107]=jd,this.Ia[108]=kd,this.Ia[109]=ld,this.Ia[110]=md,this.Ia[111]=nd,this.Ia[192]=od,this.Ia[193]=pd,this.Ia[200]=qd,this.Ia[201]=rd,this.Ia[241]=sd,this.mm[7]=td,this.nm[7]=td,80286<=this.na)){this.im=2;this.wh|=28672;this.vh=0;this.Ia[15]=ud;this.vg=vd.slice();for(a=0;a<this.vg.length;a++)this.vg[a]||(this.vg[a]=wd);this.Ia[84]=xd;this.Ia[99]=yd;if(80386<=this.na){var c;this.Ia[100]=zd;this.Ia[101]=Ad;this.Ia[102]=Bd;this.Ia[103]=Cd;
for(c in x)this.vg[+c]=x[c]}}this.zh=[];this.km=[];this.yd=this.Rh=0;this.ha.Ng=this.ha.po=!1;this.Bm=0;this.Re=this.ka=[];this.Aa=this.nb=this.Ea=this.Td=this.Yc=this.vb=this.Wd=0;Dd(this)}Pa(Vc,oc);
var Yc={gh:4,N:5,aa:6,Y:7,Z:8,I:9,O:11,P:12,De:4,Kk:60,Lk:83,Qb:3,rb:9,dc:16,eh:1,Sk:19,Uk:28,Wk:16,Vk:21,Tk:37,Qk:2,Bi:9,Rk:5,Pk:33,Di:10,Ci:8,Zf:3,Yf:15,jl:51,kl:1,ll:2,ml:4,il:32,Ei:15,ol:15,Ba:16,Ca:4,ql:11,pl:18,nl:24,zb:4,rl:2,lf:16,sl:17,Ji:18,tl:19,Ii:5,Ki:6,yl:2,xl:8,vl:9,wl:10,ul:10,Li:10,Mi:10,Yk:80,$k:144,Xk:86,Zk:154,bl:101,dl:165,al:107,cl:171,Al:70,Cl:113,zl:76,Bl:124,fl:80,hl:128,el:86,gl:134,ag:3,$f:16,Ti:10,Si:8,Dl:51,Rb:8,El:17,Fl:36,mc:11,Gl:16,Ee:10,Kc:2,yi:18,zi:7,Ai:15,Fi:12,
Gi:7,Hi:11,Ni:18,Oi:7,Pi:15,Ui:15,Vi:7,Wi:13,bj:11,cj:7,dj:8,Hl:8,Kl:12,Il:18,Jl:17,Ll:15,Yi:8,Xi:20,Zi:2,gj:3,bg:9,fj:5,ej:11,ij:4,hj:17,Ml:11},Xc={gh:0,N:0,aa:0,Y:0,Z:0,I:0,O:1,P:1,De:3,Kk:14,Lk:16,Qb:2,rb:7,dc:7,eh:0,Sk:7,Uk:13,Wk:7,Vk:11,Tk:16,Qk:3,Bi:6,Rk:2,Pk:13,Di:5,Ci:5,Zf:2,Yf:7,jl:23,kl:0,ll:1,ml:3,il:17,Ei:7,ol:11,Ba:7,Ca:3,ql:7,pl:11,nl:15,zb:2,rl:3,lf:7,sl:8,Ji:8,tl:8,Ii:4,Ki:4,yl:2,xl:3,vl:5,wl:2,ul:3,Li:5,Mi:3,Yk:14,$k:22,Xk:17,Zk:25,bl:17,dl:25,al:20,cl:28,Al:13,Cl:21,zl:16,Bl:24,
fl:13,hl:21,el:16,gl:24,ag:2,$f:7,Ti:5,Si:5,Dl:19,Rb:5,El:5,Fl:17,mc:3,Gl:5,Ee:3,Kc:0,yi:8,zi:5,Ai:9,Fi:5,Gi:5,Hi:4,Ni:5,Oi:5,Pi:4,Ui:7,Vi:5,Wi:8,bj:3,cj:4,dj:3,Hl:11,Kl:11,Il:15,Jl:15,Ll:7,Yi:5,Xi:8,Zi:0,gj:2,bg:6,fj:3,ej:6,ij:3,hj:5,Ml:5},Wc={gh:0,N:0,aa:0,Y:0,Z:0,I:0,O:1,P:1,De:3,Kk:14,Lk:16,Qb:2,rb:7,dc:7,eh:0,Sk:7,Uk:13,Wk:7,Vk:11,Tk:16,Qk:3,Bi:6,Rk:2,Pk:13,Di:5,Ci:5,Zf:2,Yf:7,jl:23,kl:0,ll:1,ml:3,il:17,Ei:7,ol:11,Ba:7,Ca:3,ql:7,pl:11,nl:15,zb:2,rl:3,lf:7,sl:8,Ji:8,tl:8,Ii:4,Ki:4,yl:2,xl:3,vl:5,
wl:2,ul:3,Li:5,Mi:3,Yk:14,$k:22,Xk:17,Zk:25,bl:17,dl:25,al:20,cl:28,Al:13,Cl:21,zl:16,Bl:24,fl:13,hl:21,el:16,gl:24,ag:2,$f:7,Ti:5,Si:5,Dl:19,Rb:5,El:5,Fl:17,mc:3,Gl:5,Ee:3,Kc:0,yi:8,zi:5,Ai:9,Fi:5,Gi:5,Hi:4,Ni:5,Oi:5,Pi:4,Ui:7,Vi:5,Wi:8,bj:3,cj:4,dj:3,Hl:11,Kl:11,Il:15,Jl:15,Ll:7,Yi:5,Xi:8,Zi:0,gj:2,bg:6,fj:3,ej:6,ij:3,hj:5,Ml:5,on:11,Ok:6,Mk:8,Nk:5,Tp:3,Rp:6,Sp:6,qn:9,pn:12,Ri:3,Qi:6,Vp:4,Up:5,aj:3,$i:7};f=Vc.prototype;
f.yk=function(a,b){this.ka=this.Re=a;this.Aa=b;this.nb=1<<this.Aa;this.Ea=this.nb-1;this.Td=a.length;this.Yc=this.Td-1};function Ed(a){if(a.ka===a.Re){a.ka=Array(a.Td);a.Zj=new r(null,0,0,5,null,a);for(var b=0;b<a.Td;b++)a.ka[b]=a.Zj}else for(b=0;b<a.xh.length;b++)a.ka[a.xh[b]]=a.Zj;a.xh=[]}
function lc(a,b,c,d){var e=(b&-4194304)>>>20,m=a.Re[(a.kh+e&a.vb)>>>a.Aa],n=m.yc(e);if(!(n&1))return d||Fd.call(a,b,!1,c),null;if(!(n&4)&&3==a.oa.Ka)return d||Fd.call(a,b,!0,c),null;var p=(b&4190208)>>>10,n=a.Re[((n&-4096)+p&a.vb)>>>a.Aa],v=n.yc(p);if(!(v&1||d))return d||Fd.call(a,b,!1,c),null;if(!(v&4)&&3==a.oa.Ka)return d||Fd.call(a,b,!0,c),null;c=a.Re[((v&-4096)+(b&4095)&a.vb)>>>a.Aa];if(d)return c;d=new r(b&-4096,0,0,6);bc(d,c,m,e,n,p);b>>>=a.Aa;a.ka[b]=d;a.xh.push(b);return d}
f.reset=function(){this.ha.Pb&&wc(this);Dd(this);rc(this);this.ha.wd=!1};
function Dd(a){a.F=0;a.D=0;a.G=0;a.H=0;a.Dd=0;a.L=0;a.K=0;a.J=0;a.Ob=!1;a.fb=a.Zb=0;a.kd=0;a.Lh=0;a.Ab=65520;a.pd=0;a.Gf=1023;a.ca=a.xi=0;a.kg=a.rh=a.jg=a.lg=0;a.ui=-1;a.oa=new Jc(a,Lc,"CS");a.jb=new Jc(a,2,"DS");a.Ra=new Jc(a,2,"ES");a.ra=new Jc(a,3,"SS");t(a,0);Qc(a,0);80386<=a.na&&(a.H=772,a.Ab=16,a.tj=0,a.jh=0,a.kh=0,a.qm=Array(8),a.rm=Array(8),a.Yd=new Jc(a,2,"FS"),a.Zd=new Jc(a,2,"GS"));a.In=new Jc(a,0,"NULL");a.da=a.jb;a.ga=a.ra;a.Q=a.va=0;a.U=a.Ga=h;a.kb=0;Uc(a,0,65535);if(80286<=a.na){a.od=
0;a.Ff=65535;a.Le=new Jc(a,5,"LDT",!0);a.gb=new Jc(a,4,"TSS",!0);a.Jb=new Jc(a,6,"VER",!0);Uc(a,65520,61440);var b,c=l(a);b=a.oa;var d=-65536;80386>b.W.na&&(d&=16777215);b=b.xa=d;a.pa=b+c|0;a.oh=b+a.oa.Gb|0}Tc(a,0);Id(a)}function Jd(a){2==a.Hd?(a.Xm=a.ma,a.Ec=y,a.Mc=Kd,a.ge=Ld,a.Ha=z,a.tb=Md,a.Dc=Nd):(a.Xm=a.Qg,a.Ec=A,a.Mc=Od,a.ge=Pd,a.Ha=B,a.tb=Qd,a.Dc=Rd)}function Sd(a,b){a.ja!=b&&(a.va|=4096,a.ja=b,a.C=2==b?65535:-1,Td(a))}
function Td(a){2==a.ja?(a.dataType=32768,a.ve=a.ma,a.tf=a.Cb):(a.dataType=-2147483648,a.ve=a.Qg,a.tf=a.Fj)}function Ud(a){a.Hd=a.oa.Hd;a.T=a.oa.T;Jd(a);a.ja=a.oa.ja;a.C=a.oa.C;Td(a);a.va&=-12289}f.Ym=function(){var a=this.F+this.D+this.G+this.H+q(this)+this.L+this.K+this.J|0;return a=a+l(this)+this.oa.ta+this.jb.ta+this.ra.ta+this.Ra.ta+qb(this)|0};function Vd(a,b,c,d){void 0!==d&&(void 0===a.zh[b]&&(a.zh[b]=[]),a.zh[b].push([c,d]))}
function Wd(a,b){var c=a.km[b];null!=c&&(c(--a.Rh),delete a.km[b])}function Id(a,b){void 0===b&&(b=!!(a.Ab&1));a.om=b?Xd:bd;Mc(a.oa);Mc(a.jb);Mc(a.ra);Mc(a.Ra);80386<=a.na&&(Mc(a.Yd),Mc(a.Zd),Ud(a))}
f.save=function(){var a=new Yd(this);a.set(0,[this.F,this.D,this.G,this.H,q(this),this.L,this.K,this.J]);var b=l(this),c=this.oa.save(),d=this.jb.save(),e=this.ra.save(),m=this.Ra.save(),n;null!=this.od?(n=[this.Ab,this.od,this.Ff,this.pd,this.Gf,this.Le.save(),this.gb.save(),this.xi],n.push(this.tj),n.push(this.jh),n.push(this.kh),n.push(this.qm),n.push(this.rm)):n=null;b=[b,c,d,e,m,n,qb(this)];80386<=this.na&&(b.push(this.Yd.save()),b.push(this.Zd.save()));a.set(1,b);a.set(2,[this.da.Cj,this.ga.Cj,
this.Q,this.va,this.kb,this.U,this.Ga]);a.set(3,[0,this.nf,this.R.Be]);a.set(4,Pb(this.la));return a.data()};
f.restore=function(a){var b=a[0];this.F=b[0];this.D=b[1];this.G=b[2];this.H=b[3];var c=b[4];this.L=b[5];this.K=b[6];this.J=b[7];b=a[1];this.oa.restore(b[1]);this.jb.restore(b[2]);this.ra.restore(b[3]);this.Ra.restore(b[4]);var d=b[5];d&&d.length&&(this.Ab=d[0],this.od=d[1],this.Ff=d[2],this.pd=d[3],this.Gf=d[4],this.Le.restore(d[5]),this.gb.restore(d[6]),this.xi=d[7],80386<=this.na&&(this.tj=d[8],this.jh=d[9],this.kh=d[10],this.qm=d[11],this.rm=d[12]),Id(this));Tc(this,b[6]);Uc(this,b[0],this.oa.ta);
t(this,c);Qc(this,this.ra.ta);80386<=this.na&&(this.Yd.restore(b[7]),this.Zd.restore(b[8]));b=a[2];this.da=null!=b[0]&&Zd(this,b[0])||this.jb;this.ga=null!=b[1]&&Zd(this,b[1])||this.ra;this.Q=b[2];this.va=b[3];this.kb=b[4];this.U=b[5];this.Ga=b[6];b=a[3];this.nf=b[1];yc(this,b[2]);a:{b=this.la;a=a[4];for(c=0;c<a.length-1;c+=2){var d=a[c],e=a[c+1];if(e&&e.length<b.jn){for(var m=0,n=Array(b.jn),p=0;p<e.length-1;)for(var v=e[p++],w=e[p++];v--;)n[m++]=w;e=n}m=b.ka[d];if(!m||!m.restore(e)){sa("Unable to restore memory block "+
d);b=!1;break a}}void 0!==a[c]&&Hb(b,a[c]);b=!0}return b};function Zd(a,b){switch(b){case "CS":return a.oa;case "DS":return a.jb;case "SS":return a.ra;case "ES":return a.Ra;case "NULL":return a.In;default:return[0,b,0,0,""]}}function $d(a,b){var c=l(a);a.pa=a.oa.load(b)+c|0;a.oh=a.oa.xa+a.oa.Gb|0;Ud(a);a.Q|=a.vh}function ae(a,b){a.jb.load(b);a.Q|=a.vh}
function Qc(a,b,c){var d=q(a);a.Ac=a.ra.load(b)+d|0;a.ra.Of?(a.Tl=a.ra.xa+a.ra.T|0,a.Ul=a.ra.xa+a.ra.Gb|0):(a.Tl=a.ra.xa+a.ra.Gb|0,a.Ul=a.ra.xa);c||(a.Q|=4)}function be(a,b){a.Ra.load(b);a.Q|=a.vh}function l(a){return a.pa-a.oa.xa|0}function C(a,b){a.pa=a.oa.xa+(b&a.C)|0}function Uc(a,b,c,d){a.oa.mk=d;a.Sl=b;b=a.oa.load(c);return b!==h?(a.pa=b+(a.Sl&a.C)|0,a.oh=b+a.oa.Gb|0,Ud(a),a.oa.ji):null}
function ce(a,b){a.pa=a.pa+b|0;var c=a.oh-a.pa|0;0>c&&0<=(a.oh^a.pa)&&(8088>=a.na||a.oa.Gb==a.oa.T?C(a,a.pa-a.oa.xa):-1>c&&Oc.call(a,13,0))}function q(a){return a.Dd&~a.ra.T|a.Ac-a.ra.xa}function t(a,b){a.Dd=b;a.Ac=a.ra.xa+(b&a.ra.T)|0}function de(a,b,c,d,e,m){if(63!=(e&63)&&e!=a.resultType){var n=(e^a.resultType)&a.resultType;n&&(n&1&&ee(a),n&2&&fe(a),n&4&&ge(a),n&8&&he(a),n&16&&ie(a),n&32&&je(a))}m?(a.kg=d,a.jg=b):(a.kg=b,a.jg=d);a.rh=c;a.lg=d;a.resultType=e}
function D(a,b,c,d,e){a.resultType=c|26;a.lg=b;d?ke(a):le(a);e?me(a):ne(a);return b}function oe(a,b,c,d){c&d?ke(a):le(a);(b^c)&d?me(a):ne(a)}function pe(a){return ee(a)?1:0}function ee(a){a.resultType&1&&(a.ca&=~zb,(a.kg^(a.kg^a.rh)&(a.rh^a.jg))&a.resultType&-2147450752&&(a.ca|=zb),a.resultType&=-2);return a.ca&zb}function fe(a){a.resultType&2&&(a.ca&=~yb,38505>>((a.lg^a.lg>>4)&15)&1&&(a.ca|=yb),a.resultType&=-3);return a.ca&yb}
function ge(a){a.resultType&4&&(a.ca&=~xb,(a.jg^a.kg^a.rh)&16&&(a.ca|=xb),a.resultType&=-5);return a.ca&xb}function he(a){a.resultType&8&&(a.ca&=~wb,a.lg&((a.resultType&-2147450752)-1|a.resultType&-2147450752)||(a.ca|=wb),a.resultType&=-9);return a.ca&wb}function ie(a){a.resultType&16&&(a.ca&=~vb,a.lg&a.resultType&-2147450752&&(a.ca|=vb),a.resultType&=-17);return a.ca&vb}
function je(a){a.resultType&32&&(a.ca&=~rb,(a.kg^a.jg)&(a.rh^a.jg)&a.resultType&-2147450752&&(a.ca|=rb),a.resultType&=-33);return a.ca&rb}function le(a){a.resultType&=-2;a.ca&=~zb}function qe(a){a.resultType&=-5;a.ca&=~xb}function re(a){a.resultType&=-9;a.ca&=~wb}function ne(a){a.resultType&=-33;a.ca&=~rb}function ke(a){a.resultType&=-2;a.ca|=zb}function se(a){a.resultType&=-5;a.ca|=xb}function te(a){a.resultType&=-9;a.ca|=wb}function me(a){a.resultType&=-33;a.ca|=rb}
function qb(a){return a.ca&~Hc|ee(a)|fe(a)|ge(a)|he(a)|ie(a)|je(a)}function ue(a,b){b=b|a.Ab&1|65520;a.Ab=a.Ab&-65536|b&65535;a.Ab&1&&Id(a,!0)}function Tc(a,b,c){a.Ab&1||(b&=-61441);void 0===c&&(c=a.oa.Ka);c?b=b&-12289|a.ca&12288:a.xi=(b&12288)>>12;c>a.xi&&(b=b&~tb|a.ca&tb);a.resultType=128;a.ca=a.ca&~(a.wh|Hc)|b&(a.wh|Hc)|a.im;a.ca&ub&&(a.kb|=2,a.Q|=4)}
f.Kb=function(a,b,c){var d=!1;switch(b){case "EAX":case "EBX":case "ECX":case "EDX":case "ESP":case "EBP":case "ESI":case "EDI":case "EIP":case "AX":case "BX":case "CX":case "DX":case "SP":case "BP":case "SI":case "DI":case "IP":case "PC":case "CS":case "DS":case "SS":case "ES":case "PS":case "C":case "P":case "A":case "Z":case "S":case "T":case "I":case "D":case "V":this.qa[b]=c;this.Bm++;d=!0;break;default:d=this.parent.Kb.call(this,a,b,c)}return d};
f.vc=function(a){return this.ka[(a&this.Wd)>>>this.Aa].xc(a&this.Ea,a)};f.ma=function(a){var b=a&this.Ea,c=(a&this.Wd)>>>this.Aa;this.A-=this.B.gh;return b<this.Ea?this.ka[c].sj(b,a):this.ka[c].xc(b,a)|this.ka[c+1&this.Yc].xc(0,a+1)<<8};f.Qg=function(a){var b=a&this.Ea,c=(a&this.Wd)>>>this.Aa;if(b<this.Ea-2)return this.ka[c].yc(b,a);var d=(b&3)<<3;return this.ka[c].yc(b&-4,a)>>>d|this.ka[c+1&this.Yc].yc(0,a+3)<<32-d};f.Me=function(a,b){this.ka[(a&this.Wd)>>>this.Aa].Bc(a&this.Ea,b&255,a)};
f.Cb=function(a,b){var c=a&this.Ea,d=(a&this.Wd)>>>this.Aa;this.A-=this.B.gh;c<this.Ea?this.ka[d].Jj(c,b&65535,a):(this.ka[d++].Bc(c,b&255,a),this.ka[d&this.Yc].Bc(0,b>>8&255,a+1))};f.Fj=function(a,b){var c=a&this.Ea,d=(a&this.Wd)>>>this.Aa;this.A-=this.B.gh;if(c<this.Ea-2)this.ka[d].Qe(c,b,a);else{var e,m=(c&3)<<3,c=c&-4;e=this.ka[d].yc(c,a);this.ka[d].Qe(c,e&~(-1<<m)|b<<m,a);d=d+1&this.Yc;a+=3;e=this.ka[d].yc(0,a);this.ka[d].Qe(0,e&-1<<m|b>>>32-m,a)}};
function ve(a,b,c){a.uh=b;a.U=b.qc(a.ih=c,1);return a.Q&1?0:a.vc(a.U)}function E(a,b){return ve(a,a.da,b&a.T)}function F(a,b){return ve(a,a.ga,b&a.T)}function we(a,b,c){a.uh=b;a.U=b.qc(a.ih=c,a.ja);return a.Q&1?0:a.ve(a.U)}function H(a,b){return we(a,a.da,b&a.T)}function I(a,b){return we(a,a.ga,b&a.T)}function xe(a,b,c){a.uh=b;a.Ga=a.U=b.qc(a.ih=c,1);return a.Q&1?0:a.vc(a.U)}function J(a,b){return xe(a,a.da,b&a.T)}function K(a,b){return xe(a,a.ga,b&a.T)}
function ye(a,b,c){a.uh=b;a.Ga=a.U=b.qc(a.ih=c,a.ja);return a.Q&1?0:a.ve(a.U)}function L(a,b){return ye(a,a.da,b&a.T)}function N(a,b){return ye(a,a.ga,b&a.T)}function O(a,b){a.Q&2||a.Me(a.uh.lc(a.ih,1),b)}function P(a,b){a.Q&2||a.tf(a.uh.lc(a.ih,a.ja),b)}function Sc(a,b,c){return a.ve(b.qc(c,a.ja))}f.S=function(){var a=this.vc(this.pa);ce(this,1);return a};function ze(a){var b=a.ma(a.pa);ce(a,2);return b}function S(a){var b=a.Xm(a.pa);ce(a,a.Hd);return b}
f.ia=function(){var a=this.ve(this.pa);ce(this,this.ja);return a};f.M=function(){var a=this.vc(this.pa)<<24>>24;ce(this,1);return a};function T(a,b){var c=a.vc(a.pa);ce(a,1);return Ae[c].call(a,b)}f.Fa=function(){var a=this.ve(this.Ac);this.Ac=this.Ac+this.ja|0;var b=this.Tl-this.Ac|0;0>b&&0<=(this.Tl^this.Ac)&&(8088>=this.na||!this.ra.Of&&this.ra.Gb==this.ra.T||this.ra.Of&&!this.ra.Gb?t(this,this.Ac-this.ra.xa&this.ra.T):-1>b&&Oc.call(this,12,0));return a};
function u(a,b){a.Ac=a.Ac-a.ja|0;0>(a.Ac-a.Ul|0)&&0<=(a.Ul^a.Ac)&&(8088>=a.na||!a.ra.Of&&a.ra.Gb==a.ra.T||a.ra.Of&&!a.ra.Gb?t(a,a.Ac-a.ra.xa&a.ra.T):Oc.call(a,12,0));a.tf(a.Ac,b)}function Be(a,b,c){var d=4;1==b.length&&(d=1,c=c?1:0);if(80386>a.na)2<b.length&&(b=b.substr(1,2));else if("PS"==b||2<b.length)d=8;a.qa[b]&&(void 0===c&&($a(a,"Value for "+b+" is invalid"),wc(a)),d=!a.ha.Pb||a.ha.Nm?da(c,d):"--------".substr(0,d),a.qa[b].textContent!=d&&(a.qa[b].textContent=d))}
f.be=function(a){if(this.Bm&&(a||!this.ha.Pb||this.ha.Nm)){Be(this,"EAX",this.F);Be(this,"EBX",this.D);Be(this,"ECX",this.G);Be(this,"EDX",this.H);Be(this,"ESP",q(this));Be(this,"EBP",this.L);Be(this,"ESI",this.K);Be(this,"EDI",this.J);Be(this,"CS",this.oa.ta);Be(this,"DS",this.jb.ta);Be(this,"SS",this.ra.ta);Be(this,"ES",this.Ra.ta);Be(this,"EIP",l(this));var b=qb(this);Be(this,"PS",b);Be(this,"V",b&rb);Be(this,"D",b&sb);Be(this,"I",b&tb);Be(this,"T",b&ub);Be(this,"S",b&vb);Be(this,"Z",b&wb);Be(this,
"A",b&xb);Be(this,"P",b&yb);Be(this,"C",b&zb)}if(b=this.qa.speed)b.textContent=pb(this);this.parent.be.call(this,a)};
f.Kn=function(a){this.ha.Ng=!0;this.ha.po=!1;this.ha.Tm=!1;this.yd=this.A=a;this.fa&&!a&&Ec(this.fa);a||(this.Q|=4);do{if(a=this.Q&12528)this.va|=a;else if(this.Ib=this.pa,this.da=this.jb,this.ga=this.ra,this.U=this.Ga=h,this.va&12288&&Ud(this),this.va=this.Q&256,this.kb){a:{if(!(this.Q&4)){a=80286>this.na?0:1;for(var b=0;2>b;b++){switch(a){case 0:if(this.kb&1&&this.ca&tb){var c=Ce(this.fa);if(-1<=c&&(this.kb&=-2,0<=c)){this.kb&=-5;De.call(this,c,null,11);break a}}break;case 1:if(this.kb&2){this.kb&=
-3;De.call(this,1,null,11);break a}}a=1-a}}if(a=this.kb&8){a=this.fa;b=!1;for(c=0;c<a.$a;c++)for(var d=a.$a[c],e=0;e<d.Db.length;e++){var m=d.Db[e];m.Sd||(Ee(a,m),m.Sd||(b=!0))}a=!b}a&&(this.kb&=-9)}if(this.kb&4){this.Q=this.A=0;break}}this.Q=0;this.Ia[this.S()].call(this)}while(0<this.A);return this.ha.Ng?this.yd-this.A:void 0===this.ha.Ng?0:-1};Da(function(){for(var a=Wa(window.document,"pcjs","cpu"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),d=new Vc(d);Va(d,c)}});
function Fe(a,b){var c=a+b+pe(this)|0;de(this,a,b,c,191);this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.rb:this.B.dc;return c&255}function Ge(a,b){var c=a+b+pe(this)|0;de(this,a,b,c,this.dataType|63);this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.rb:this.B.dc;return c&this.C}function He(a,b){var c=a+b|0;de(this,a,b,c,191);this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.rb:this.B.dc;return c&255}
function Ie(a,b){var c=a+b|0;de(this,a,b,c,this.dataType|63);this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.rb:this.B.dc;return c&this.C}function Je(a,b){var c=a&b;D(this,c,128);this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.rb:this.B.dc;return c}function Ke(a,b){this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.rb:this.B.dc;return D(this,a&b,this.dataType)}function Le(a,b){this.A-=10+(this.U===h?0:1);if((a&3)<(b&3))return a=a&-4|b&3,te(this),a;re(this);return a}
function Me(a){if(this.U===h)return cd.call(this),a;var b=a,c=this.ve(this.U),d=this.ve(this.U+this.ja);2==this.ja&&(b=a<<16>>16,c=c<<16>>16,d=d<<16>>16);this.A-=this.B.Pk;if(b<c||b>d)C(this,this.Ib-this.oa.xa),De.call(this,5,null,0);this.Q|=2;return a}function Ne(a,b){var c=0;if(b){re(this);for(var d=1;d&this.C;){if(b&d){a=c;break}d<<=1;c++}}else te(this);this.A-=this.B.on+3*c;return a}
function Oe(a,b){var c=0;if(b){re(this);for(var d=2==this.ja?15:31,e=1<<d;e;){if(b&e){a=d;break}e>>>=1;c++;d--}}else te(this);this.A-=this.B.on+3*c;return a}function Pe(a,b){a&1<<(b&31)?ke(this):le(this);this.A-=this.U===h?this.B.Tp:this.B.Rp;this.Q|=2;return a}function Qe(a,b){var c=1<<(b&31);a&c?ke(this):le(this);this.A-=this.U===h?this.B.Ok:this.B.Mk;return a^c}function Te(a,b){var c=1<<(b&31);a&c?ke(this):le(this);this.A-=this.U===h?this.B.Ok:this.B.Mk;return a&~c}
function Ue(a,b){var c=1<<(b&31);a&c?ke(this):le(this);this.A-=this.U===h?this.B.Ok:this.B.Mk;return a|c}function Ve(a,b){var c=this.oa.ta,d=l(this);null!=Uc(this,a,b,!0)&&(u(this,c),u(this,d))}function We(a,b){de(this,a,b,a-b|0,191,!0);this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.Bi:this.B.rb;this.Q|=2;return a}function Xe(a,b){de(this,a,b,a-b|0,this.dataType|63,!0);this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.Bi:this.B.rb;this.Q|=2;return a}
function Ye(a){var b=(a&this.C)-1|0;de(this,a,1,b,32830,!0);this.A-=2;return a&~this.C|b&this.C}function Ze(a,b){var c=a[1]-b[1];c||(c=a[0]-b[0]);return c}
function $e(a,b,c){this.Ob=!1;if((c>>>=0)&&!(c<=b>>>0)){var d=0,e=1;c=[c>>>0,0];for(a=[a>>>0,b>>>0];0<Ze(a,c);){var m=b=c;b[0]+=m[0];b[1]+=m[1];4294967295<b[0]&&(b[0]>>>=0,b[1]++);e+=e}do 0<=Ze(a,c)&&(b=a,m=c,b[0]-=m[0],b[1]-=m[1],0>b[0]&&(b[0]>>>=0,b[1]--),d+=e),b=c,b[0]>>>=1,b[1]&1&&(b[0]=(b[0]|2147483648)>>>0),b[1]>>>=1,e>>>=1;while(e);this.fb=d;this.Zb=a[0];this.Ob=!0}}function af(a){return a}
function bf(a,b){a=this.S();var c=(b<<16>>16)*(a<<24>>24)|0;32767<c||-32768>c?(ke(this),me(this)):(le(this),ne(this));this.A-=this.U===h?21:24;return c&65535}function cf(a,b){var c,d;a=this.ia();2==this.ja?(d=(b<<16>>16)*(a<<16>>16)|0,c=32767<d||-32768>d):(d=b*a,c=2147483647<d||-2147483648>d);c?(ke(this),me(this)):(le(this),ne(this));d&=this.C;this.A-=this.U===h?21:24;return d}
function df(a,b){var c=(a<<16>>16)*(b<<16>>16)|0;32767<c||-32768>c?(ke(this),me(this)):(le(this),ne(this));this.A-=this.U===h?this.B.qn:this.B.pn;return c&65535}function ef(a,b){var c=a*b;2147483647<c||-2147483648>c?(ke(this),me(this)):(le(this),ne(this));this.A-=this.U===h?this.B.qn:this.B.pn;return c|0}function ff(a){var b=(a&this.C)+1|0;de(this,a,1,b,32830);this.A-=2;return a&~this.C|b&this.C}
function De(a,b,c){this.A-=this.B.jl+c;this.oa.mk=!0;c=qb(this);var d=this.oa.ta,e=l(this);a=this.oa.en(a);a!==h&&(u(this,c),u(this,d),u(this,e),null!=b&&u(this,b),this.ui=-1,this.pa=a,this.oh=this.oa.xa+this.oa.Gb|0,Ud(this))}function gf(a,b){this.A-=14+(this.U===h?0:2);re(this);this.Jb.load(b,!0)!==h&&this.Jb.tc>=this.oa.Ka&&this.Jb.tc>=(b&3)&&(te(this),a=this.Jb.Nb&-256,2<this.ja&&(a|=(this.Jb.Zh&-65281)<<16));return a}
function hf(a,b){if(this.U===h)return wd.call(this),a;ae(this,this.ma(this.U+this.ja));this.A-=this.B.lf;return b}function jf(a){if(this.U===h)return wd.call(this),a;this.A-=this.B.rl;return this.U}function kf(a,b){if(this.U===h)return wd.call(this),a;be(this,this.ma(this.U+this.ja));this.A-=this.B.lf;return b}function lf(a,b){if(this.U===h)return wd.call(this),a;var c=this.ma(this.U+this.ja);this.Yd.load(c);this.A-=this.B.lf;return b}
function mf(a,b){if(this.U===h)return wd.call(this),a;var c=this.ma(this.U+this.ja);this.Zd.load(c);this.A-=this.B.lf;return b}function nf(a,b){this.A-=14+(this.U===h?0:2);if(b&65528&&this.Jb.load(b,!0)!==h&&(7168==(this.Jb.Nb&7168)||this.Jb.tc>=this.oa.Ka)&&this.Jb.tc>=(b&3))return te(this),this.Jb.Gb;re(this);return a}function of(a,b){if(this.U===h)return wd.call(this),a;Qc(this,this.ma(this.U+this.ja));this.A-=this.B.lf;return b}
function pf(a,b){this.A-=this.Ga===h?this.U===h?this.B.yl:this.B.xl:this.B.vl;return b}function qf(a,b){return b}function rf(){this.Ga!==h&&Sd(this,2);return pf.call(this,0,this.kd)}function sf(a,b){var c=b&65535,d=b>>>16,e=a&65535,m=a>>>16,n=c*e,e=(n>>>16)+d*e,p=e>>>16,e=(e&65535)+c*m;this.Ob=!0;this.fb=e<<16|n&65535;this.Zb=p+((e>>>16)+d*m)|0}function tf(a,b){this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.rb:this.B.dc;return D(this,a|b,128)}
function uf(a,b){this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.rb:this.B.dc;return D(this,a|b,this.dataType)}function vf(a){var b=this.Fa(),c=this.Fa();(a<<=this.ja>>2)&&t(this,q(this)+a);Uc(this,b,c,!1)&&(a&&t(this,q(this)+a),this.jb.ta&65528&&this.jb.tc<this.oa.Ka&&7168!=(this.jb.Nb&7168)&&this.jb.load(0),this.Ra.ta&65528&&this.Ra.tc<this.oa.Ka&&7168!=(this.Ra.Nb&7168)&&this.Ra.load(0));2==a&&this.Rh&&Wd(this,this.pa)}
function wf(a,b){var c=a-b-pe(this)|0;de(this,a,b,c,191,!0);this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.rb:this.B.dc;return c&255}function xf(a,b){var c=a-b-pe(this)|0;de(this,a,b,c,this.dataType|63,!0);this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.rb:this.B.dc;return c&this.C}function yf(a){this.Q|=1;this.Mc[this.S()].call(this,a);this.A-=this.U===h?this.B.Vp:this.B.Up}function zf(){return je(this)?1:0}function Af(){return ee(this)?1:0}function Bf(){return ee(this)?0:1}
function Cf(){return he(this)?1:0}function Df(){return he(this)?0:1}function Ef(){return ee(this)||he(this)?1:0}function Ff(){return ee(this)||he(this)?0:1}function Gf(){return ie(this)?1:0}function Hf(){return ie(this)?0:1}function If(){return fe(this)?1:0}function Jf(){return fe(this)?0:1}function Kf(){return!ie(this)!=!je(this)?1:0}function Lf(){return!ie(this)!=!je(this)?0:1}function Mf(){return he(this)||!ie(this)!=!je(this)?1:0}function Nf(){return he(this)||!ie(this)!=!je(this)?0:1}
function Of(a,b,c){if(c){16<c&&(a=b,c-=16);var d=a<<c-1;a=(d<<1|b>>16-c)&65535;D(this,a,32768,d&32768)}return a}function Pf(a,b,c){if(c){var d=a<<c-1;a=d<<1|b>>32-c;D(this,a,-2147483648,d&-2147483648)}return a}function Qf(a,b){return Of.call(this,a,b,this.S())}function Rf(a,b){return Pf.call(this,a,b,this.S())}function Sf(a,b){return Of.call(this,a,b,this.G&31)}function Tf(a,b){return Pf.call(this,a,b,this.G&31)}
function Uf(a,b,c){if(c){16<c&&(a=b,c-=16);var d=a>>c-1;a=(d>>1|b<<16-c)&65535;D(this,a,32768,d&1)}return a}function Vf(a,b,c){if(c){var d=a>>c-1;a=d>>1|b<<32-c;D(this,a,-2147483648,d&1)}return a}function Wf(a,b){return Uf.call(this,a,b,this.S())}function Xf(a,b){return Vf.call(this,a,b,this.S())}function Yf(a,b){return Uf.call(this,a,b,this.G&31)}function Zf(a,b){return Vf.call(this,a,b,this.G&31)}
function $f(a,b){var c=a-b|0;de(this,a,b,c,191,!0);this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.rb:this.B.dc;return c&255}function ag(a,b){var c=a-b|0;de(this,a,b,c,this.dataType|63,!0);this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.rb:this.B.dc;return c&this.C}function bg(a,b){D(this,a&b,128);this.A-=this.Ga===h?this.U===h?this.B.gj:this.B.bg:this.B.bg;this.Q|=2;return a}function cg(a,b){D(this,a&b,32768);this.A-=this.Ga===h?this.U===h?this.B.gj:this.B.bg:this.B.bg;this.Q|=2;return a}
function dg(a,b){if(this.U===h){switch(this.Lh&7){case 0:this.F=this.F&-256|a;break;case 1:this.G=this.G&-256|a;break;case 2:this.H=this.H&-256|a;break;case 3:this.D=this.D&-256|a;break;case 4:this.F=this.F&255|a<<8;break;case 5:this.G=this.G&255|a<<8;break;case 6:this.H=this.H&255|a<<8;break;case 7:this.D=this.D&255|a<<8}this.A-=this.B.ij}else this.Ga=this.U,O(this,a),this.A-=this.B.hj;return b}
function eg(a,b){if(this.U===h){switch(this.Lh&7){case 0:this.F=a;break;case 1:this.G=a;break;case 2:this.H=a;break;case 3:this.D=a;break;case 4:t(this,a);break;case 5:this.L=a;break;case 6:this.K=a;break;case 7:this.J=a}this.A-=this.B.ij}else this.Ga=this.U,P(this,a),this.A-=this.B.hj;return b}function fg(a,b){var c=a^b;D(this,c,128);this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.rb:this.B.dc;return c}
function gg(a,b){this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.rb:this.B.dc;return D(this,a^b,this.dataType)}function hg(a){Oc.call(this,13,0);return a}function td(a){cd.call(this);return a}function U(a){wd.call(this);return a}function ig(){C(this,this.Ib-this.oa.xa);De.call(this,0,null,2)}function jg(){this.A-=this.U===h?2:this.B.Ll;return 1}function kg(){var a=this.G&255;this.A-=(this.U===h?this.B.Yi:this.B.Xi)+(a<<this.B.Zi);return a}
function lg(){var a=this.S();this.A-=(this.U===h?this.B.Yi:this.B.Xi)+(a<<this.B.Zi);return a}function mg(){return null}function Oc(a,b,c){if(this.ha.Ng){var d=!1;if(80186<=this.na)if(0>this.ui)C(this,this.Ib-this.oa.xa),d=!0;else if(8!=this.ui)b=0,a=8,d=!0;else{ng.call(this,-1,0,c);Dd(this);return}ng.call(this,a,b,c)&&(d=!1);d&&De.call(this,this.ui=a,b,0);this.Q|=3}else this.nc("Fault "+ea(a)+" blocked by Debugger",1073741824),C(this,this.Ib-this.oa.xa)}
function Fd(a,b,c){this.jh=a;a=0;b&&(a|=1);c&&(a|=2);3==this.oa.Ka&&(a|=4);Oc.call(this,14,a)}
function ng(a,b,c){var d=32,e;a:{e=this.pa;var m=this.ka[(e&this.Wd)>>>this.Aa];if(5==m.type&&(m=lc(this,e,!1,!0),!m)){e=null;break a}e=m.rj(e&this.Ea,e)}204==e&&(c=!1,d|=1);983040<=this.pa&&1048575>=this.pa&&(c=!1);c&&(a=(c?"\n":"")+"Fault "+ea(a)+(null!=b?" (0x"+da(b,4)+")":"")+" on opcode "+ea(e)+" at "+this.Sa.dt(l(this),this.oa.ta)+" (%"+da(this.pa,6)+")",b=this.ha.Pb,this.nc(a,d)?c&&(c=b,wc(this.Sa)):(this.wa(a),wc(this)));return c}function ud(){this.vg[this.S()].call(this)}
function xd(){u(this,q(this)&this.C);this.A-=this.B.mc}function dd(){var a=q(this)&this.C;u(this,this.F&this.C);u(this,this.G&this.C);u(this,this.H&this.C);u(this,this.D&this.C);u(this,a);u(this,this.L&this.C);u(this,this.K&this.C);u(this,this.J&this.C);this.A-=this.B.Fl}
function ed(){this.J=this.J&~this.C|this.Fa();this.K=this.K&~this.C|this.Fa();this.L=this.L&~this.C|this.Fa();t(this,q(this)+this.ja);this.D=this.D&~this.C|this.Fa();this.H=this.H&~this.C|this.Fa();this.G=this.G&~this.C|this.Fa();this.F=this.F&~this.C|this.Fa();this.A-=this.B.Dl}function fd(){this.Ha[this.S()].call(this,Me)}function yd(){this.tb[this.S()].call(this,Le)}function zd(){this.Q|=20;this.da=this.ga=this.Yd;this.A-=this.B.Kc;wc(this)}
function Ad(){this.Q|=20;this.da=this.ga=this.Zd;this.A-=this.B.Kc;wc(this)}function Bd(){this.Q|=4096;this.ja^=6;this.C^=-65536;Td(this);this.A-=this.B.Kc}function Cd(){this.Q|=8192;this.Hd^=6;this.T^=-65536;Jd(this);this.A-=this.B.Kc}function gd(){u(this,this.ia());this.A-=this.B.mc}function hd(){this.Ha[this.S()].call(this,cf)}function id(){u(this,this.S());this.A-=this.B.mc}function jd(){this.Ha[this.S()].call(this,bf)}
function kd(){var a=1,b=0,c=5;this.va&192&&(a=this.G&this.T,b=1,this.va&256&&(c=4));if(a--){var d=Tb(this.la,this.H,this.pa-b-1);this.Me(this.Ra.lc(this.J&this.T,1),d);this.J=this.J&~this.T|this.J+(this.ca&sb?-1:1)&this.T;this.A-=c;this.G=this.G&~this.T|this.G-b&this.T;a&&(this.pa=this.Ib,this.Q|=256)}}
function ld(){var a=1,b=0,c=5;this.va&192&&(a=this.G&this.T,b=1,this.va&256&&(c=4));if(a--){for(var d=this.pa-b-1,e=0,m=0,n=0;n<this.ja;n++)e|=Tb(this.la,this.H,d)<<m,m+=8;d=e;this.tf(this.Ra.lc(this.J&this.T,this.ja),d);this.J=this.J&~this.T|this.J+(this.ca&sb?-this.ja:this.ja)&this.T;this.A-=c;this.G=this.G&~this.T|this.G-b&this.T;a&&(this.pa=this.Ib,this.Q|=256)}}
function md(){var a=1,b=0,c=5;this.va&192&&(a=this.G&this.T,b=1,this.va&256&&(c=4));if(a--){var d=this.vc(this.jb.qc(this.K&this.T,1));this.K=this.K&~this.T|this.K+(this.ca&sb?-1:1)&this.T;this.A-=c;Vb(this.la,this.H,d,this.pa-b-1);this.G=this.G&~this.T|this.G-b&this.T;a&&(this.pa=this.Ib,this.Q|=256)}}
function nd(){var a=1,b=0,c=5;this.va&192&&(a=this.G&this.T,b=1,this.va&256&&(c=4));if(a--){var d=Sc(this,this.jb,this.K&this.T);this.K=this.K&~this.T|this.K+(this.ca&sb?-this.ja:this.ja)&this.T;this.A-=c;for(var c=this.pa-b-1,e=0,m=0;m<this.ja;m++)Vb(this.la,this.H,d>>e&255,c),e+=8;this.G=this.G&~this.T|this.G-b&this.T;a&&(this.pa=this.Ib,this.Q|=256)}}function og(){var a=this.M();je(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca}
function pg(){var a=this.M();je(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)}function qg(){var a=this.M();ee(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca}function rg(){var a=this.M();ee(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)}function sg(){var a=this.M();he(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca}function tg(){var a=this.M();he(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)}
function ug(){var a=this.M();ee(this)||he(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca}function vg(){var a=this.M();ee(this)||he(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)}function wg(){var a=this.M();ie(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca}function xg(){var a=this.M();ie(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)}function yg(){var a=this.M();fe(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca}
function zg(){var a=this.M();fe(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)}function Ag(){var a=this.M();!ie(this)!=!je(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca}function Bg(){var a=this.M();!ie(this)==!je(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca}function Cg(){var a=this.M();he(this)||!ie(this)!=!je(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca}
function Dg(){var a=this.M();he(this)||!ie(this)!=!je(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)}function Eg(){this.ge[this.S()].call(this,Fg,this.S);this.A-=this.Ga===h?1:this.B.eh}function od(){this.ge[this.S()].call(this,Gg,lg)}function pd(){this.Dc[this.S()].call(this,2==this.ja?Hg:Ig,lg)}function Jg(){var a=ze(this)<<(this.ja>>2),b=this.Fa();C(this,b);a&&t(this,q(this)+a);this.A-=this.B.Kl}function Kg(){var a=this.Fa();C(this,a);this.A-=this.B.Hl}
function qd(){var a=ze(this),b=this.S()&31;this.A-=11;u(this,this.L);var c=q(this)&this.C;if(0<b){for(this.A-=(b<<2)+(1<b?1:0);--b;)this.L=this.L&~this.C|this.L-this.ja&this.C,u(this,Sc(this,this.ra,this.L&this.C));u(this,c)}this.L=this.L&~this.C|c;t(this,q(this)&~this.ra.T|q(this)-a&this.ra.T)}function rd(){t(this,q(this)&~this.ra.T|this.L&this.ra.T);this.L=this.L&~this.C|this.Fa()&this.C;this.A-=5}function Lg(){vf.call(this,ze(this));this.A-=this.B.Jl}
function Mg(){vf.call(this,0);this.A-=this.B.Il}function Ng(){this.Ha[this.S()].call(this,af);this.A-=8}function Og(){this.Q|=36;this.A-=this.B.Kc}function sd(){wd.call(this)}function cd(){Oc.call(this,6);wc(this)}function wd(){C(this,this.Ib-this.oa.xa);$a(this,"Undefined opcode "+ea(Bb(this.la,this.pa))+" at "+("0x"+da(this.pa)));wc(this)}
var Zc=[function(){var a=this.S();this.Mc[a].call(this,He)},function(){this.tb[this.S()].call(this,Ie)},function(){this.Ec[this.S()].call(this,He)},function(){this.Ha[this.S()].call(this,Ie)},function(){this.F=this.F&-256|He.call(this,this.F&255,this.S());this.A--},function(){this.F=this.F&~this.C|Ie.call(this,this.F&this.C,this.ia());this.A--},function(){u(this,this.Ra.ta);this.A-=this.B.Ee},function(){be(this,this.Fa());this.A-=this.B.Rb},function(){this.Mc[this.S()].call(this,tf)},function(){this.tb[this.S()].call(this,
uf)},function(){this.Ec[this.S()].call(this,tf)},function(){this.Ha[this.S()].call(this,uf)},function(){this.F=this.F&-256|tf.call(this,this.F&255,this.S());this.A--},function(){this.F=this.F&~this.C|uf.call(this,this.F&this.C,this.ia());this.A--},function(){u(this,this.oa.ta);this.A-=this.B.Ee},function(){$d(this,this.Fa());this.A-=this.B.Rb},function(){this.Mc[this.S()].call(this,Fe)},function(){this.tb[this.S()].call(this,Ge)},function(){this.Ec[this.S()].call(this,Fe)},function(){this.Ha[this.S()].call(this,
Ge)},function(){this.F=this.F&-256|Fe.call(this,this.F&255,this.S());this.A--},function(){this.F=this.F&~this.C|Ge.call(this,this.F&this.C,this.ia());this.A--},function(){u(this,this.ra.ta);this.A-=this.B.Ee},function(){Qc(this,this.Fa());this.A-=this.B.Rb},function(){this.Mc[this.S()].call(this,wf)},function(){this.tb[this.S()].call(this,xf)},function(){this.Ec[this.S()].call(this,wf)},function(){this.Ha[this.S()].call(this,xf)},function(){this.F=this.F&-256|wf.call(this,this.F&255,this.S());this.A--},
function(){this.F=this.F&~this.C|xf.call(this,this.F&this.C,this.ia());this.A--},function(){u(this,this.jb.ta);this.A-=this.B.Ee},function(){ae(this,this.Fa());this.A-=this.B.Rb},function(){this.Mc[this.S()].call(this,Je)},function(){this.tb[this.S()].call(this,Ke)},function(){this.Ec[this.S()].call(this,Je)},function(){this.Ha[this.S()].call(this,Ke)},function(){this.F=this.F&-256|Je.call(this,this.F&255,this.S());this.A--},function(){this.F=this.F&~this.C|Ke.call(this,this.F&this.C,this.ia());this.A--},
function(){this.Q|=20;this.da=this.ga=this.Ra;this.A-=this.B.Kc},function(){var a=this.F&255,b=ge(this),c=ee(this);if(9<(a&15)||b)a+=6,b=xb;if(159<a||c)a+=96,c=zb;a&=255;this.F=this.F&-256|a;D(this,a,128);c?ke(this):le(this);b?se(this):qe(this);this.A-=this.B.De},function(){this.Mc[this.S()].call(this,$f)},function(){this.tb[this.S()].call(this,ag)},function(){this.Ec[this.S()].call(this,$f)},function(){this.Ha[this.S()].call(this,ag)},function(){this.F=this.F&-256|$f.call(this,this.F&255,this.S());
this.A--},function(){this.F=this.F&~this.C|ag.call(this,this.F&this.C,this.ia());this.A--},function(){this.Q|=20;this.da=this.ga=this.oa;this.A-=this.B.Kc},function(){var a=this.F&255,b=ge(this),c=ee(this);if(9<(a&15)||b)a-=6,b=xb;if(159<a||c)a-=96,c=zb;a&=255;this.F=this.F&-256|a;D(this,a,128);c?ke(this):le(this);b?se(this):qe(this);this.A-=this.B.De},function(){this.Mc[this.S()].call(this,fg)},function(){this.tb[this.S()].call(this,gg)},function(){this.Ec[this.S()].call(this,fg)},function(){this.Ha[this.S()].call(this,
gg)},function(){this.F=this.F&-256|fg.call(this,this.F&255,this.S());this.A--},function(){this.F=this.F&~this.C|gg.call(this,this.F&this.C,this.ia());this.A--},function(){this.Q|=20;this.da=this.ga=this.ra;this.A-=this.B.Kc},function(){var a,b,c=this.F&255,d=this.F>>8&255;9<(c&15)||ge(this)?(c=c+6&15,d=d+1&255,a=b=1):a=b=0;this.F=this.F&-65536|d<<8|c;a?ke(this):le(this);b?se(this):qe(this);this.A-=this.B.De},function(){this.Mc[this.S()].call(this,We)},function(){this.tb[this.S()].call(this,Xe)},function(){this.Ec[this.S()].call(this,
We)},function(){this.Ha[this.S()].call(this,Xe)},function(){We.call(this,this.F&255,this.S());this.A--},function(){Xe.call(this,this.F&this.C,this.ia());this.A--},function(){this.Q|=20;this.da=this.ga=this.jb;this.A-=this.B.Kc},function(){var a,b,c=this.F&255,d=this.F>>8&255;9<(c&15)||ge(this)?(c=c-6&15,d=d-1&255,a=b=1):a=b=0;this.F=this.F&-65536|d<<8|c;a?ke(this):le(this);b?se(this):qe(this);this.A-=this.B.De},function(){this.F=ff.call(this,this.F)},function(){this.G=ff.call(this,this.G)},function(){this.H=
ff.call(this,this.H)},function(){this.D=ff.call(this,this.D)},function(){t(this,ff.call(this,q(this)))},function(){this.L=ff.call(this,this.L)},function(){this.K=ff.call(this,this.K)},function(){this.J=ff.call(this,this.J)},function(){this.F=Ye.call(this,this.F)},function(){this.G=Ye.call(this,this.G)},function(){this.H=Ye.call(this,this.H)},function(){this.D=Ye.call(this,this.D)},function(){t(this,Ye.call(this,q(this)))},function(){this.L=Ye.call(this,this.L)},function(){this.K=Ye.call(this,this.K)},
function(){this.J=Ye.call(this,this.J)},function(){u(this,this.F&this.C);this.A-=this.B.mc},function(){u(this,this.G&this.C);this.A-=this.B.mc},function(){u(this,this.H&this.C);this.A-=this.B.mc},function(){u(this,this.D&this.C);this.A-=this.B.mc},function(){u(this,q(this)-2&65535);this.A-=this.B.mc},function(){u(this,this.L&this.C);this.A-=this.B.mc},function(){u(this,this.K&this.C);this.A-=this.B.mc},function(){u(this,this.J&this.C);this.A-=this.B.mc},function(){this.F=this.F&~this.C|this.Fa();
this.A-=this.B.Rb},function(){this.G=this.G&~this.C|this.Fa();this.A-=this.B.Rb},function(){this.H=this.H&~this.C|this.Fa();this.A-=this.B.Rb},function(){this.D=this.D&~this.C|this.Fa();this.A-=this.B.Rb},function(){t(this,q(this)&~this.C|this.Fa());this.A-=this.B.Rb},function(){this.L=this.L&~this.C|this.Fa();this.A-=this.B.Rb},function(){this.K=this.K&~this.C|this.Fa();this.A-=this.B.Rb},function(){this.J=this.J&~this.C|this.Fa();this.A-=this.B.Rb},og,pg,qg,rg,sg,tg,ug,vg,wg,xg,yg,zg,Ag,Bg,Cg,Dg,
og,pg,qg,rg,sg,tg,ug,vg,wg,xg,yg,zg,Ag,Bg,Cg,Dg,Eg,function(){this.Dc[this.S()].call(this,Pg,this.ia);this.A-=this.Ga===h?1:this.B.eh},Eg,function(){this.Dc[this.S()].call(this,Pg,this.M);this.A-=this.Ga===h?1:this.B.eh},function(){this.Mc[this.S()].call(this,bg)},function(){this.tb[this.S()].call(this,cg)},function(){this.Ec[this.Lh=this.S()].call(this,dg)},function(){this.Ha[this.Lh=this.S()].call(this,eg)},function(){this.Q|=1;this.Mc[this.S()].call(this,pf)},function(){this.Q|=1;this.tb[this.S()].call(this,
pf)},function(){this.Ec[this.S()].call(this,pf)},function(){this.Ha[this.S()].call(this,pf)},function(){var a=this.S();switch((a&56)>>3){case 0:this.kd=this.Ra.ta;break;case 1:this.kd=this.oa.ta;break;case 2:this.kd=this.ra.ta;break;case 3:this.kd=this.jb.ta;break;case 4:if(80386<=this.na){this.kd=this.Yd.ta;break}cd.call(this);break;case 5:if(80386<=this.na){this.kd=this.Zd.ta;break}default:cd.call(this)}this.Q|=1;this.tb[a].call(this,rf)},function(){this.Q|=1;this.da=this.ga=this.In;this.Ha[this.S()].call(this,
jf)},function(){var a,b=this.S(),c=(b&56)>>3;switch(c){case 0:a=this.F;break;case 2:a=this.H;break;case 3:a=this.D;break;default:if(80286==this.na||80386==this.na&&4!=c&&5!=c){cd.call(this);return}switch(c){case 1:a=this.G;break;case 4:a=q(this);break;case 5:a=this.L;break;case 6:a=this.K;break;case 7:a=this.J}}this.Ha[b].call(this,pf);switch(c){case 0:be(this,this.F);this.F=a;break;case 1:$d(this,this.G);this.G=a;break;case 2:Qc(this,this.H);this.H=a;break;case 3:ae(this,this.D);this.D=a;break;case 4:80386<=
this.na?this.Yd.load(q(this)):be(this,q(this));t(this,a);break;case 5:80386<=this.na?this.Zd.load(this.L):$d(this,this.L);this.L=a;break;case 6:Qc(this,this.K);this.K=a;break;case 7:ae(this,this.J),this.J=a}},function(){this.Q|=1;this.Dc[this.S()].call(this,Qg,this.Fa)},function(){this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.G&this.C;this.G=this.G&~this.C|a&this.C;this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.H&this.C;this.H=this.H&~this.C|a&this.C;this.A-=3},function(){var a=
this.F;this.F=this.F&~this.C|this.D&this.C;this.D=this.D&~this.C|a&this.C;this.A-=3},function(){var a=this.F,b=q(this);this.F=this.F&~this.C|b&this.C;t(this,b&~this.C|a&this.C);this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.L&this.C;this.L=this.L&~this.C|a&this.C;this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.K&this.C;this.K=this.K&~this.C|a&this.C;this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.J&this.C;this.J=this.J&~this.C|a&this.C;this.A-=3},function(){this.F=
2==this.ja?this.F&-65536|this.F<<24>>24&65535:this.F<<16>>16;this.A-=2},function(){this.H=2==this.ja?this.H&-65536|(this.F&32768?65535:0):this.F&-2147483648?-1:0;this.A-=this.B.Rk},function(){Ve.call(this,this.ia(),ze(this));this.A-=this.B.Uk},function(){this.nc("WAIT not implemented");this.A--},function(){u(this,qb(this));this.A-=this.B.mc},function(){Tc(this,this.Fa());this.A-=this.B.Rb},function(){var a=this.F>>8&255;a&zb?ke(this):le(this);a&yb?(this.resultType&=-3,this.ca|=yb):(this.resultType&=
-3,this.ca&=~yb);a&xb?se(this):qe(this);a&wb?te(this):re(this);a&vb?(this.resultType&=-17,this.ca|=vb):(this.resultType&=-17,this.ca&=~vb);this.A-=this.B.zb},function(){this.F=this.F&-65281|(qb(this)&Ic)<<8;this.A-=this.B.zb},function(){var a=this.F&-256,b;b=S(this);b=this.vc(this.da.qc(b,1));this.F=a|b;this.A-=this.B.Li},function(){this.F=this.F&~this.C|Sc(this,this.da,S(this));this.A-=this.B.Li},function(){var a=S(this),b=this.F;this.Me(this.da.lc(a,1),b);this.A-=this.B.Mi},function(){var a=S(this),
b=this.F;this.tf(this.da.lc(a,this.ja),b);this.A-=this.B.Mi},function(){var a=1,b=0,c=this.B.Ni;this.va&192&&(a=this.G&this.T,b=1,c=this.B.Pi,this.va&256||(this.A-=this.B.Oi));if(a--){var d=this.ca&sb?-1:1,e=this.vc(this.da.qc(this.K,1));this.Me(this.Ra.lc(this.J&this.T,1),e);this.K=this.K&~this.T|this.K+d&this.T;this.J=this.J&~this.T|this.J+d&this.T;this.A-=c;this.G=this.G&~this.T|this.G-b&this.T;a&&(this.pa=this.Ib,this.Q|=256)}},function(){var a=1,b=0,c=this.B.Ni;this.va&192&&(a=this.G&this.T,
b=1,c=this.B.Pi,this.va&256||(this.A-=this.B.Oi));if(a--){var d=this.ca&sb?-this.ja:this.ja,e=Sc(this,this.da,this.K);this.tf(this.Ra.lc(this.J&this.T,this.ja),e);this.K=this.K&~this.T|this.K+d&this.T;this.J=this.J&~this.T|this.J+d&this.T;this.A-=c;this.G=this.G&~this.T|this.G-b&this.T;a&&(this.pa=this.Ib,this.Q|=256)}},function(){var a=1,b=0,c=this.B.yi;this.va&192&&(a=this.G&this.T,b=1,c=this.B.Ai,this.va&256||(this.A-=this.B.zi));if(a--){var d=this.ca&sb?-1:1,e=ve(this,this.da,this.K&this.T),m=
xe(this,this.Ra,this.J&this.T);We.call(this,e,m);this.K=this.K&~this.T|this.K+d&this.T;this.J=this.J&~this.T|this.J+d&this.T;this.A-=c-this.B.rb;this.G=this.G&~this.T|this.G-b&this.T;a&&he(this)==(this.va&64)&&(this.pa=this.Ib,this.Q|=256)}},function(){var a=1,b=0,c=this.B.yi;this.va&192&&(a=this.G&this.T,b=1,c=this.B.Ai,this.va&256||(this.A-=this.B.zi));if(a--){var d=this.ca&sb?-this.ja:this.ja,e=we(this,this.da,this.K&this.T),m=ye(this,this.Ra,this.J&this.T);Xe.call(this,e,m);this.K=this.K&~this.T|
this.K+d&this.T;this.J=this.J&~this.T|this.J+d&this.T;this.A-=c-this.B.rb;this.G=this.G&~this.T|this.G-b&this.T;a&&he(this)==(this.va&64)&&(this.pa=this.Ib,this.Q|=256)}},function(){D(this,this.F&this.S(),128);this.A-=this.B.De},function(){D(this,this.F&this.ia(),this.dataType);this.A-=this.B.De},function(){var a=1,b=0,c=this.B.bj;this.va&192&&(a=this.G&this.T,b=1,c=this.B.dj,this.va&256||(this.A-=this.B.cj));if(a--){var d=this.F;this.Me(this.Ra.lc(this.J&this.T,1),d);this.J=this.J&~this.T|this.J+
(this.ca&sb?-1:1)&this.T;this.A-=c;this.G=this.G&~this.T|this.G-b&this.T;a&&(this.pa=this.Ib,this.Q|=256)}},function(){var a=1,b=0,c=this.B.bj;this.va&192&&(a=this.G&this.T,b=1,c=this.B.dj,this.va&256||(this.A-=this.B.cj));if(a--){var d=this.F;this.tf(this.Ra.lc(this.J&this.T,this.ja),d);this.J=this.J&~this.T|this.J+(this.ca&sb?-this.ja:this.ja)&this.T;this.A-=c;this.G=this.G&~this.T|this.G-b&this.T;a&&(this.pa=this.Ib,this.Q|=256)}},function(){var a=1,b=0,c=this.B.Fi;this.va&192&&(a=this.G&this.T,
b=1,c=this.B.Hi,this.va&256||(this.A-=this.B.Gi));a--&&(this.F=this.F&-256|this.vc(this.da.qc(this.K&this.T,1)),this.K=this.K&~this.T|this.K+(this.ca&sb?-1:1)&this.T,this.A-=c,this.G=this.G&~this.T|this.G-b&this.T,a&&(this.pa=this.Ib,this.Q|=256))},function(){var a=1,b=0,c=this.B.Fi;this.va&192&&(a=this.G&this.T,b=1,c=this.B.Hi,this.va&256||(this.A-=this.B.Gi));a--&&(this.F=this.F&~this.C|Sc(this,this.da,this.K&this.T),this.K=this.K&~this.T|this.K+(this.ca&sb?-this.ja:this.ja)&this.T,this.A-=c,this.G=
this.G&~this.T|this.G-b&this.T,a&&(this.pa=this.Ib,this.Q|=256))},function(){var a=1,b=0,c=this.B.Ui;this.va&192&&(a=this.G&this.T,b=1,c=this.B.Wi,this.va&256||(this.A-=this.B.Vi));a--&&(We.call(this,this.F&255,xe(this,this.Ra,this.J&this.T)),this.J=this.J&~this.T|this.J+(this.ca&sb?-1:1)&this.T,this.A-=c-this.B.rb,this.G=this.G&~this.T|this.G-b&this.T,a&&he(this)==(this.va&64)&&(this.pa=this.Ib,this.Q|=256))},function(){var a=1,b=0,c=this.B.Ui;this.va&192&&(a=this.G&this.T,b=1,c=this.B.Wi,this.va&
256||(this.A-=this.B.Vi));a--&&(Xe.call(this,this.F&this.C,ye(this,this.Ra,this.J&this.T)),this.J=this.J&~this.T|this.J+(this.ca&sb?-this.ja:this.ja)&this.T,this.A-=c-this.B.rb,this.G=this.G&~this.T|this.G-b&this.T,a&&he(this)==(this.va&64)&&(this.pa=this.Ib,this.Q|=256))},function(){this.F=this.F&-256|this.S();this.A-=this.B.zb},function(){this.G=this.G&-256|this.S();this.A-=this.B.zb},function(){this.H=this.H&-256|this.S();this.A-=this.B.zb},function(){this.D=this.D&-256|this.S();this.A-=this.B.zb},
function(){this.F=this.F&255|this.S()<<8;this.A-=this.B.zb},function(){this.G=this.G&255|this.S()<<8;this.A-=this.B.zb},function(){this.H=this.H&255|this.S()<<8;this.A-=this.B.zb},function(){this.D=this.D&255|this.S()<<8;this.A-=this.B.zb},function(){this.F=this.F&~this.C|this.ia();this.A-=this.B.zb},function(){this.G=this.G&~this.C|this.ia();this.A-=this.B.zb},function(){this.H=this.H&~this.C|this.ia();this.A-=this.B.zb},function(){this.D=this.D&~this.C|this.ia();this.A-=this.B.zb},function(){t(this,
q(this)&~this.C|this.ia());this.A-=this.B.zb},function(){this.L=this.L&~this.C|this.ia();this.A-=this.B.zb},function(){this.K=this.K&~this.C|this.ia();this.A-=this.B.zb},function(){this.J=this.J&~this.C|this.ia();this.A-=this.B.zb},Jg,Kg,Jg,Kg,function(){this.Ha[this.S()].call(this,kf)},function(){this.Ha[this.S()].call(this,hf)},function(){this.Q|=1;this.ge[this.S()].call(this,Rg,this.S)},function(){this.Q|=1;this.Dc[this.S()].call(this,Rg,this.ia)},Lg,Mg,Lg,Mg,function(){De.call(this,3,null,this.B.kl)},
function(){var a=this.S(),b;a:{b=this.zh[a];if(void 0!==b)for(var c=0;c<b.length;c++)if(!b[c][1].call(b[c][0],this.pa)){b=!1;break a}b=!0}b?De.call(this,a,null,0):this.A--},function(){je(this)?De.call(this,4,null,this.B.ll):this.A-=this.B.ml},function(){this.A-=this.B.il;if(this.Ab&1&&this.ca&16384){var a=this.ma(this.gb.xa+0);Rc(this.oa,a,!1)}else{var a=this.oa.Ka,b=this.Fa(),c=this.Fa(),d=this.Fa();null!=Uc(this,b,c,!1)&&(Tc(this,d,a),this.Rh&&Wd(this,this.pa))}},function(){this.ge[this.S()].call(this,
Gg,jg)},function(){this.Dc[this.S()].call(this,2==this.ja?Hg:Ig,jg)},function(){this.ge[this.S()].call(this,Gg,kg)},function(){this.Dc[this.S()].call(this,2==this.ja?Hg:Ig,kg)},function(){var a=this.S();if(a){var b=this.F&255;this.F=this.F&-65536|b/a<<8|b%a;D(this,this.F,128);this.A-=this.B.Lk}},function(){var a=this.S();this.F=this.F&-65536|(this.F>>8&255)*a+this.F&255;D(this,this.F,128);this.A-=this.B.Kk},function(){this.F=this.F&-256|(ee(this)?255:0);this.A-=2},function(){this.F=this.F&-256|ve(this,
this.da,this.D+(this.F&255)&65535);this.A-=this.B.Ml},Ng,Ng,Ng,Ng,Ng,Ng,Ng,Ng,function(){var a=this.M();(this.G=this.G-1&this.T)&&!he(this)?(C(this,l(this)+a),this.A-=this.B.tl):this.A-=this.B.Ii},function(){var a=this.M();(this.G=this.G-1&this.T)&&he(this)?(C(this,l(this)+a),this.A-=this.B.Ji):this.A-=this.B.Ki},function(){var a=this.M();(this.G=this.G-1&this.T)?(C(this,l(this)+a),this.A-=this.B.sl):this.A-=this.B.Ii},function(){var a=this.M();this.G&this.T?this.A-=this.B.Ki:(C(this,l(this)+a),this.A-=
this.B.Ji)},function(){var a=this.S();this.F=this.F&-256|Tb(this.la,a,this.pa-2);this.A-=this.B.Di},function(){var a=this.S();this.F=Tb(this.la,a,this.pa-2);this.F|=Tb(this.la,a+1&65535,this.pa-2)<<8;this.A-=this.B.Di},function(){var a=this.S();Vb(this.la,a,this.F&255,this.pa-2);this.A-=this.B.Ti},function(){var a=this.S();Vb(this.la,a,this.F&255,this.pa-2);Vb(this.la,a+1&65535,this.F>>8,this.pa-2);this.A-=this.B.Ti},function(){var a=this.ia(),b=l(this),a=b+a;u(this,b);C(this,a);this.A-=this.B.Sk},
function(){var a=this.ia();C(this,l(this)+a);this.A-=this.B.Ei},function(){Uc(this,this.ia(),ze(this));this.A-=this.B.ol},function(){var a=this.M();C(this,l(this)+a);this.A-=this.B.Ei},function(){this.F=this.F&-256|Tb(this.la,this.H,this.pa-1);this.A-=this.B.Ci},function(){this.F=Tb(this.la,this.H,this.pa-1);this.F|=Tb(this.la,this.H+1&65535,this.pa-1)<<8;this.A-=this.B.Ci},function(){Vb(this.la,this.H,this.F&255,this.pa-1);this.A-=this.B.Si},function(){Vb(this.la,this.H,this.F&255,this.pa-1);Vb(this.la,
this.H+1&65535,this.F>>8,this.pa-1);this.A-=this.B.Si},Og,Og,function(){this.Q|=132;this.A-=this.B.Kc},function(){this.Q|=68;this.A-=this.B.Kc},function(){this.kb|=4;this.A-=2;this.ca&tb||wc(this)},function(){ee(this)?le(this):ke(this);this.A-=2},function(){this.Ob=!1;this.ge[this.S()].call(this,Sg,mg);this.Ob&&(this.F=this.F&~this.C|this.fb&this.C)},function(){this.Ob=!1;this.Dc[this.S()].call(this,Tg,mg);this.Ob&&(this.F=this.F&~this.C|this.fb&this.C,this.H=this.H&~this.C|this.Zb&this.C)},function(){le(this);
this.A-=2},function(){ke(this);this.A-=2},function(){this.ca&=~tb;this.A-=this.B.Qk},function(){this.ca|=tb;this.Q|=4;this.A-=2},function(){this.ca&=~sb;this.A-=2},function(){this.ca|=sb;this.A-=2},function(){this.ge[this.S()].call(this,$c,mg)},function(){this.Dc[this.S()].call(this,ad,mg)}],Fg=[He,tf,Fe,wf,Je,$f,fg,We],Pg=[Ie,uf,Ge,xf,Ke,ag,gg,Xe],Qg=[function(a,b){this.A-=this.Ga===h?this.B.Rb:this.B.El;return b},hg,hg,hg,hg,hg,hg,hg],Rg=[function(a,b){this.A-=this.Ga===h?this.B.wl:this.B.ul;return b},
U,U,U,U,U,U,U],Gg=[function(a,b){var c=a,d=b&this.sb;if(d){var e;(d&=7)?(e=a<<d-1,c=(a<<d|a>>8-d)&255):e=a<<7;oe(this,c,e,128)}return c},function(a,b){var c=a,d=b&this.sb;if(d){var e;(d&=7)?(e=a<<8-d,c=(a>>>d|e)&255):e=a;oe(this,c,e,128)}return c},function(a,b){var c=a,d=b&this.sb;if(d){var e=pe(this);(d%=9)?(c=(a<<d|e<<d-1|a>>9-d)&255,e=a<<d-1):e<<=7;oe(this,c,e,128)}return c},function(a,b){var c=a,d=b&this.sb;if(d){var e=pe(this);(d%=9)?(c=(a>>d|e<<8-d|a<<9-d)&255,e=a<<8-d):e<<=7;oe(this,c,e,128)}return c},
function(a,b){var c=a,d=b&this.sb;if(d){var e=0;8<d?c=0:(e=a<<d-1,c=e<<1&255);D(this,c,128,e&128,(c^e)&128)}return c},function(a,b){var c=b&this.sb;c&&(c=8<c?0:a>>>c-1,a=c>>>1&255,D(this,a,128,c&1,a&128));return a},U,function(a,b){var c=b&this.sb;c&&(9<c&&(c=9),c=a<<24>>24>>c-1,a=c>>1&255,D(this,a,128,c&1));return a}],Hg=[function(a,b){var c=a,d=b&this.sb;if(d){var e;(d&=15)?(e=a<<d-1,c=(a<<d|a>>16-d)&65535):e=a<<15;oe(this,c,e,32768)}return c},function(a,b){var c=a,d=b&this.sb;if(d){var e;(d&=15)?
(e=a<<16-d,c=(a>>>d|e)&65535):e=a;oe(this,c,e,32768)}return c},function(a,b){var c=a,d=b&this.sb;if(d){var e=pe(this);(d%=17)?(c=(a<<d|e<<d-1|a>>17-d)&65535,e=a<<d-1):e<<=15;oe(this,c,e,32768)}return c},function(a,b){var c=a,d=b&this.sb;if(d){var e=pe(this);(d%=17)?(c=(a>>d|e<<16-d|a<<17-d)&65535,e=a<<16-d):e<<=15;oe(this,c,e,32768)}return c},function(a,b){var c=a,d=b&this.sb;if(d){var e=0;16<d?c=0:(e=a<<d-1,c=e<<1&65535);D(this,c,32768,e&32768,(c^e)&32768)}return c},function(a,b){var c=b&this.sb;
c&&(c=16<c?0:a>>>c-1,a=c>>>1&65535,D(this,a,32768,c&1,a&32768));return a},U,function(a,b){var c=b&this.sb;c&&(17<c&&(c=17),c=a<<16>>16>>c-1,a=c>>1&65535,D(this,a,32768,c&1));return a}],Ig=[function(a,b){var c=a,d=b&this.sb;d&&(c=a<<d|a>>>32-d,oe(this,c,a<<d-1,-2147483648));return c},function(a,b){var c=a,d=b&this.sb;if(d){var e=a<<32-d,c=a>>>d|e;oe(this,c,e,-2147483648)}return c},function(a,b){var c=a,d=b&this.sb;d&&(c=pe(this),c=a<<d|c<<d-1|a>>>32-d>>>1,oe(this,c,a<<d-1,-2147483648));return c},function(a,
b){var c=a,d=b&this.sb;d&&(c=pe(this),c=a>>>d|c<<32-d|a<<32-d<<1,oe(this,c,a<<32-d,-2147483648));return c},function(a,b){var c=a,d=b&this.sb;d&&(d=a<<d-1,c=d<<1,D(this,c,-2147483648,d&-2147483648,(c^d)&-2147483648));return c},function(a,b){var c=b&this.sb;c&&(c=a>>>c-1,a=c>>>1,D(this,a,-2147483648,c&1,a&-2147483648));return a},U,function(a,b){var c=b&this.sb;c&&(c=a>>c-1,a=c>>1,D(this,a,-2147483648,c&1));return a}],Sg=[function(a,b){b=this.S();D(this,a&b,128);this.A-=this.U===h?this.B.fj:this.B.ej;
this.Q|=2;return a},U,function(a){this.A-=this.U===h?this.B.ag:this.B.$f;return a^255},function(a){var b=-a|0;de(this,0,a,b,191,!0);this.A-=this.U===h?this.B.ag:this.B.$f;return b&255},function(a){this.Ob=!0;this.fb=(this.F&255)*a&65535;this.fb&65280?(ke(this),me(this)):(le(this),ne(this));this.A-=this.U===h?this.B.Al:this.B.zl;this.Q|=2;return a},function(a){var b=(this.F<<24>>24)*(a<<24>>24)|0;this.Ob=!0;this.fb=b&65535;127<b||-128>b?(ke(this),me(this)):(le(this),ne(this));this.A-=this.U===h?this.B.fl:
this.B.el;this.Q|=2;return a},function(a,b){if(!a)return ig.call(this),a;var c=(b=this.F&65535)/a;if(255<c)return ig.call(this),a;this.Ob=!0;this.fb=c&255|(b%a&255)<<8;this.A-=this.U===h?this.B.Yk:this.B.Xk;this.Q|=2;return a},function(a,b){if(!a)return ig.call(this),a;var c=a<<24>>24,d=(b=this.F<<16>>16)/c|0;if(d!=d<<24>>24||8086==this.na&&-128==d)return ig.call(this),a;this.Ob=!0;this.fb=d&255|(b%c&255)<<8;this.A-=this.U===h?this.B.bl:this.B.al;this.Q|=2;return a}],Tg=[function(a,b){b=this.ia();
D(this,a&b,32768);this.A-=this.U===h?this.B.fj:this.B.ej;this.Q|=2;return a},U,function(a){this.A-=this.U===h?this.B.ag:this.B.$f;return a^65535},function(a){var b=-a|0;de(this,0,a,b,32831,!0);this.A-=this.U===h?this.B.ag:this.B.$f;return b&65535},function(a,b){if(2==this.ja){b=this.F&65535;var c=b*a|0;this.Ob=!0;this.fb=c&65535;this.Zb=c>>16&65535}else sf.call(this,a,this.F);this.Zb?(ke(this),me(this)):(le(this),ne(this));this.A-=this.U===h?this.B.Cl:this.B.Bl;this.Q|=2;return a},function(a,b){var c;
if(2==this.ja)b=this.F&65535,c=(b<<16>>16)*(a<<16>>16)|0,this.Ob=!0,this.fb=c&65535,this.Zb=c>>16&65535,c=32767<c||-32768>c;else{c=a;var d=this.F,e=!1;0>d&&(d=-d|0,e=!e);0>c&&(c=-c|0,e=!e);sf.call(this,c,d);e&&(this.fb=~this.fb+1|0,this.Zb=~this.Zb+(this.fb?0:1)|0);c=this.Zb!=this.fb>>31}c?(ke(this),me(this)):(le(this),ne(this));this.A-=this.U===h?this.B.hl:this.B.gl;this.Q|=2;return a},function(a,b){if(2==this.ja){if(!a)return ig.call(this),a;b=65536*(this.H&65535)+(this.F&65535);var c=b/a|0;if(65536<=
c)return ig.call(this),a;this.Ob=!0;this.fb=c&65535;this.Zb=b%a&65535}else{$e.call(this,this.F,this.H,a);if(!this.Ob)return ig.call(this),a;this.fb|=0;this.Zb|=0}this.A-=this.U===h?this.B.$k:this.B.Zk;this.Q|=2;return a},function(a,b){if(2==this.ja){if(!a)return ig.call(this),a;var c=a<<16>>16,d=(b=this.H<<16|this.F&65535)/c|0;if(d!=d<<16>>16||8086==this.na&&-32768==d)return ig.call(this),a;this.Ob=!0;this.fb=d&65535;this.Zb=b%c&65535}else{var c=this.F,d=this.H,e=a,m=!1,n=!1;0>e&&(e=-e|0,m=!m);0>
d&&(c=-c|0,d=~d+(c?0:1)|0,n=!0,m=!m);$e.call(this,c,d,e);2147483647<this.fb&&(this.Ob=!1);m&&(this.fb=-this.fb);n&&(this.Zb=-this.Zb);if(!this.Ob)return ig.call(this),a;this.fb|=0;this.Zb|=0}this.A-=this.U===h?this.B.dl:this.B.cl;this.Q|=2;return a}],$c=[function(a){var b=a+1|0;de(this,a,1,b,190);this.A-=this.U===h?this.B.Zf:this.B.Yf;return b&255},function(a){var b=a-1|0;de(this,a,1,b,190,!0);this.A-=this.U===h?this.B.Zf:this.B.Yf;return b&255},U,U,U,U,U,U],ad=[function(a){var b=a+1|0;de(this,a,
1,b,32830);this.A-=this.U===h?this.B.Zf:this.B.Yf;return b&65535},function(a){var b=a-1|0;de(this,a,1,b,32830,!0);this.A-=this.U===h?this.B.Zf:this.B.Yf;return b&65535},function(a){u(this,l(this));C(this,a);this.A-=this.U===h?this.B.Wk:this.B.Vk;this.Q|=2;return a},function(a){if(this.U===h)return U.call(this,a);Ve.call(this,a,this.ma(this.U+this.ja));this.A-=this.B.Tk;this.Q|=2;return a},function(a){C(this,a);this.A-=this.U===h?this.B.ql:this.B.pl;this.Q|=2;return a},function(a){if(this.U===h)return U.call(this,
a);Uc(this,a,this.ma(this.U+this.ja));this.Rh&&Wd(this,this.pa);this.A-=this.B.nl;this.Q|=2;return a},function(a){var b=a;this.Q&512&&(a=a-2&65535,80286>this.na&&(b=a));u(this,b);this.A-=this.U===h?this.B.mc:this.B.Gl;this.Q|=2;return a},hg],vd=Array(256);vd[0]=function(){var a=this.S();16>(a&56)&&(this.Q|=1);this.Dc[a].call(this,this.om,mg)};vd[1]=function(){var a=this.S();a&16||(this.Q|=1);this.Dc[a].call(this,Ug,mg)};vd[2]=function(){this.Ha[this.S()].call(this,gf)};
vd[3]=function(){this.Ha[this.S()].call(this,nf)};
vd[5]=function(){this.oa.Ka?Oc.call(this,13,0,!0):(ue(this,this.ma(2054)),this.J=this.ma(2086),this.K=this.ma(2088),this.L=this.ma(2090),this.D=this.ma(2094),this.H=this.ma(2096),this.G=this.ma(2098),this.F=this.ma(2100),Pc(this.Ra,2102,this.ma(2084)),Pc(this.oa,2108,this.ma(2082)),Pc(this.ra,2114,this.ma(2080)),Pc(this.jb,2120,this.ma(2078)),Tc(this,this.ma(2072)),C(this,this.ma(2074)),t(this,this.ma(2092)),this.od=this.ma(2126)|this.vc(2128)<<16,this.Ff=this.od+this.ma(2130),Pc(this.Le,2132,this.ma(2076)),
this.pd=this.ma(2138)|this.vc(2140)<<16,this.Gf=this.pd+this.ma(2142),Pc(this.gb,2144,this.ma(2070)),this.A-=195)};vd[6]=function(){this.oa.Ka?Oc.call(this,13,0):(this.Ab&=-9,this.A-=2)};vd[11]=cd;var x=[];x[32]=function(){var a=this.S()|192;if(this.oa.Ka)Oc.call(this,13,0);else{switch((a&56)>>3){case 0:this.kd=this.Ab;break;case 1:this.kd=this.tj;break;case 2:this.kd=this.jh;break;case 3:this.kd=this.kh;break;default:wd.call(this);return}Sd(this,4);this.Ha[a].call(this,rf)}};
x[34]=function(){var a,b=this.S()|192;if(this.oa.Ka)Oc.call(this,13,0);else{var c=(b&56)>>3;switch(c){case 0:a=this.F;break;case 1:a=this.G;break;case 2:a=this.H;break;case 3:a=this.D;break;default:cd.call(this);return}Sd(this,4);this.Ha[b].call(this,pf);switch(c){case 0:c=this.F;this.F=a;this.Ab=c;Id(this);this.Ab&-2147483648?Ed(this):this.ka!=this.Re&&(this.ka=this.Re,this.xh=this.Zj=null);break;case 1:this.tj=this.G;this.G=a;break;case 2:this.jh=this.H;this.H=a;break;case 3:c=this.D,this.D=a,this.kh=
c,this.Ab&-2147483648&&Ed(this)}}};x[128]=function(){var a=this.ia();je(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca};x[129]=function(){var a=this.ia();je(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)};x[130]=function(){var a=this.ia();ee(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca};x[131]=function(){var a=this.ia();ee(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)};
x[132]=function(){var a=this.ia();he(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca};x[133]=function(){var a=this.ia();he(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)};x[134]=function(){var a=this.ia();ee(this)||he(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca};x[135]=function(){var a=this.ia();ee(this)||he(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)};
x[136]=function(){var a=this.ia();ie(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca};x[137]=function(){var a=this.ia();ie(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)};x[138]=function(){var a=this.ia();fe(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca};x[139]=function(){var a=this.ia();fe(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)};
x[140]=function(){var a=this.ia();!ie(this)!=!je(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca};x[141]=function(){var a=this.ia();!ie(this)==!je(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca};x[142]=function(){var a=this.ia();he(this)||!ie(this)!=!je(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca};x[143]=function(){var a=this.ia();he(this)||!ie(this)!=!je(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)};x[144]=function(){yf.call(this,zf)};
x[145]=function(){yf.call(this,zf)};x[146]=function(){yf.call(this,Af)};x[147]=function(){yf.call(this,Bf)};x[148]=function(){yf.call(this,Cf)};x[149]=function(){yf.call(this,Df)};x[150]=function(){yf.call(this,Ef)};x[151]=function(){yf.call(this,Ff)};x[152]=function(){yf.call(this,Gf)};x[153]=function(){yf.call(this,Hf)};x[154]=function(){yf.call(this,If)};x[155]=function(){yf.call(this,Jf)};x[156]=function(){yf.call(this,Kf)};x[157]=function(){yf.call(this,Lf)};x[158]=function(){yf.call(this,Mf)};
x[159]=function(){yf.call(this,Nf)};x[160]=function(){u(this,this.Yd.ta);this.A-=this.B.Ee};x[161]=function(){var a=this.Fa();this.Yd.load(a);this.A-=this.B.Rb};x[163]=function(){this.tb[this.S()].call(this,Pe);this.U!==h&&(this.A-=this.B.Sp)};x[164]=function(){this.tb[this.S()].call(this,2==this.ja?Qf:Rf);this.A-=this.U===h?this.B.aj:this.B.$i};x[165]=function(){this.tb[this.S()].call(this,2==this.ja?Sf:Tf);this.A-=this.U===h?this.B.aj:this.B.$i};x[168]=function(){u(this,this.Zd.ta);this.A-=this.B.Ee};
x[169]=function(){var a=this.Fa();this.Zd.load(a);this.A-=this.B.Rb};x[171]=function(){this.tb[this.S()].call(this,Ue);this.U!==h&&(this.A-=this.B.Nk)};x[172]=function(){this.tb[this.S()].call(this,2==this.ja?Wf:Xf);this.A-=this.U===h?this.B.aj:this.B.$i};x[173]=function(){this.tb[this.S()].call(this,2==this.ja?Yf:Zf);this.A-=this.U===h?this.B.aj:this.B.$i};x[175]=function(){this.Ha[this.S()].call(this,2==this.ja?df:ef)};x[178]=function(){this.Ha[this.S()].call(this,of)};
x[179]=function(){this.tb[this.S()].call(this,Te);this.U!==h&&(this.A-=this.B.Nk)};x[180]=function(){this.Ha[this.S()].call(this,lf)};x[181]=function(){this.Ha[this.S()].call(this,mf)};
x[182]=function(){var a,b=this.S(),c=(b&56)>>3;switch(c){case 4:a=this.F;break;case 5:a=this.G;break;case 6:a=this.H;break;case 7:a=this.D}this.Ec[b].call(this,qf);switch(c){case 0:this.F=this.F&~this.C|this.F&255;break;case 1:this.G=this.G&~this.C|this.G&255;break;case 2:this.H=this.H&~this.C|this.H&255;break;case 3:this.D=this.D&~this.C|this.D&255;break;case 4:this.Dd=this.Dd&~this.C|this.F>>8&255;this.F=a;break;case 5:this.L=this.L&~this.C|this.G>>8&255;this.G=a;break;case 6:this.K=this.K&~this.C|
this.H>>8&255;this.H=a;break;case 7:this.J=this.J&~this.C|this.D>>8&255,this.D=a}this.A-=this.U===h?this.B.Ri:this.B.Qi};x[183]=function(){var a=this.S();Sd(this,2);this.Ha[a].call(this,qf);switch((a&56)>>3){case 0:this.F&=65535;break;case 1:this.G&=65535;break;case 2:this.H&=65535;break;case 3:this.D&=65535;break;case 4:this.Dd&=65535;break;case 5:this.L&=65535;break;case 6:this.K&=65535;break;case 7:this.J&=65535}this.A-=this.U===h?this.B.Ri:this.B.Qi};
x[186]=function(){this.Dc[this.S()].call(this,Vg,this.S)};x[187]=function(){this.tb[this.S()].call(this,Qe);this.U!==h&&(this.A-=this.B.Nk)};x[188]=function(){this.Ha[this.S()].call(this,Ne)};x[189]=function(){this.Ha[this.S()].call(this,Oe)};
x[190]=function(){var a,b=this.S(),c=(b&56)>>3;switch(c){case 4:a=this.F;break;case 5:a=this.G;break;case 6:a=this.H;break;case 7:a=this.D}this.Ec[b].call(this,qf);switch(c){case 0:this.F=this.F&~this.C|(this.F&255)<<24>>24&this.C;break;case 1:this.G=this.G&~this.C|(this.G&255)<<24>>24&this.C;break;case 2:this.H=this.H&~this.C|(this.H&255)<<24>>24&this.C;break;case 3:this.D=this.D&~this.C|(this.D&255)<<24>>24&this.C;break;case 4:this.Dd=this.Dd&~this.C|this.F<<16>>24&this.C;this.F=a;break;case 5:this.L=
this.L&~this.C|this.G<<16>>24&this.C;this.G=a;break;case 6:this.K=this.K&~this.C|this.H<<16>>24&this.C;this.H=a;break;case 7:this.J=this.J&~this.C|this.D<<16>>24&this.C,this.D=a}this.A-=this.U===h?this.B.Ri:this.B.Qi};
x[191]=function(){var a=this.S();Sd(this,2);this.Ha[a].call(this,qf);switch((a&56)>>3){case 0:this.F=this.F<<16>>16;break;case 1:this.G=this.G<<16>>16;break;case 2:this.H=this.H<<16>>16;break;case 3:this.D=this.D<<16>>16;break;case 4:this.Dd=this.Dd<<16>>16;break;case 5:this.L=this.L<<16>>16;break;case 6:this.K=this.K<<16>>16;break;case 7:this.J=this.J<<16>>16}this.A-=this.U===h?this.B.Ri:this.B.Qi};
var Xd=[function(){this.A-=2+(this.U===h?0:1);return this.Le.ta},function(){this.A-=2+(this.U===h?0:1);return this.gb.ta},function(a){this.Q|=2;this.Le.load(a);this.A-=17+(this.U===h?0:2);return a},function(a){this.Q|=2;this.gb.load(a)!==h&&(this.Cb(this.gb.nd+4,this.gb.Nb|=512),this.gb.type=768);this.A-=17+(this.U===h?0:2);return a},function(a){this.Q|=2;this.A-=14+(this.U===h?0:2);if(this.Jb.load(a,!0)!==h&&2048!=(this.Jb.Nb&2560)&&(this.Jb.tc>=this.oa.Ka&&this.Jb.tc>=(a&3)||7168==(this.Jb.Nb&7168)))return te(this),
a;re(this);return a},function(a){this.Q|=2;this.A-=14+(this.U===h?0:2);if(this.Jb.load(a,!0)!==h&&512==(this.Jb.Nb&2560)&&this.Jb.tc>=this.oa.Ka&&this.Jb.tc>=(a&3))return te(this),a;re(this);return a},U,U],bd=[td,td,td,td,td,td,U,U],Ug=[function(a){if(this.U===h)cd.call(this);else{a=this.Ff-this.od;var b=this.od;80286==this.na?b|=-16777216:80386<=this.na&&(2==this.ja?b&=16777215:a|=b<<16);this.Fj(this.U+2,b);this.A-=11}return a},function(a){if(this.U===h)cd.call(this);else{a=this.Gf-this.pd;var b=
this.pd;80286==this.na?b|=-16777216:80386<=this.na&&(2==this.ja?b&=16777215:a|=b<<16);this.Fj(this.U+2,b);this.A-=12}return a},function(a){this.U===h?cd.call(this):(this.od=this.Qg(this.U+2)&(this.C|this.C<<8),a&=65535,this.Ff=this.od+a,this.Q|=2,this.A-=11);return a},function(a){this.U===h?cd.call(this):(this.pd=this.Qg(this.U+2)&(this.C|this.C<<8),a&=65535,this.Gf=this.pd+a,this.Q|=2,this.A-=12);return a},function(){this.A-=2+(this.U===h?0:1);return this.Ab},U,function(a){ue(this,a);this.A-=this.U===
h?3:6;this.Q|=2;return a},U],Vg=[U,U,U,U,Pe,Ue,Te,Qe],y=[function(a){a=a.call(this,this.F&255,E(this,this.D+this.K));this.F=this.F&-256|a;this.A-=this.B.Y},function(a){a=a.call(this,this.F&255,E(this,this.D+this.J));this.F=this.F&-256|a;this.A-=this.B.Z},function(a){a=a.call(this,this.F&255,F(this,this.L+this.K));this.F=this.F&-256|a;this.A-=this.B.Z},function(a){a=a.call(this,this.F&255,F(this,this.L+this.J));this.F=this.F&-256|a;this.A-=this.B.Y},function(a){a=a.call(this,this.F&255,E(this,this.K));
this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,this.J));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,S(this)));this.F=this.F&-256|a;this.A-=this.B.aa},function(a){a=a.call(this,this.F&255,E(this,this.D));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,E(this,this.D+this.K));this.G=this.G&-256|a;this.A-=this.B.Y},function(a){a=a.call(this,this.G&255,E(this,this.D+this.J));this.G=this.G&-256|a;this.A-=
this.B.Z},function(a){a=a.call(this,this.G&255,F(this,this.L+this.K));this.G=this.G&-256|a;this.A-=this.B.Z},function(a){a=a.call(this,this.G&255,F(this,this.L+this.J));this.G=this.G&-256|a;this.A-=this.B.Y},function(a){a=a.call(this,this.G&255,E(this,this.K));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,E(this,this.J));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,E(this,S(this)));this.G=this.G&-256|a;this.A-=this.B.aa},function(a){a=a.call(this,
this.G&255,E(this,this.D));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,this.D+this.K));this.H=this.H&-256|a;this.A-=this.B.Y},function(a){a=a.call(this,this.H&255,E(this,this.D+this.J));this.H=this.H&-256|a;this.A-=this.B.Z},function(a){a=a.call(this,this.H&255,F(this,this.L+this.K));this.H=this.H&-256|a;this.A-=this.B.Z},function(a){a=a.call(this,this.H&255,F(this,this.L+this.J));this.H=this.H&-256|a;this.A-=this.B.Y},function(a){a=a.call(this,this.H&255,E(this,
this.K));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,this.J));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,S(this)));this.H=this.H&-256|a;this.A-=this.B.aa},function(a){a=a.call(this,this.H&255,E(this,this.D));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,this.D+this.K));this.D=this.D&-256|a;this.A-=this.B.Y},function(a){a=a.call(this,this.D&255,E(this,this.D+this.J));this.D=this.D&-256|
a;this.A-=this.B.Z},function(a){a=a.call(this,this.D&255,F(this,this.L+this.K));this.D=this.D&-256|a;this.A-=this.B.Z},function(a){a=a.call(this,this.D&255,F(this,this.L+this.J));this.D=this.D&-256|a;this.A-=this.B.Y},function(a){a=a.call(this,this.D&255,E(this,this.K));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,this.J));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,S(this)));this.D=this.D&-256|a;this.A-=this.B.aa},function(a){a=
a.call(this,this.D&255,E(this,this.D));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,E(this,this.D+this.K));this.F=this.F&-65281|a<<8;this.A-=this.B.Y},function(a){a=a.call(this,this.F>>8&255,E(this,this.D+this.J));this.F=this.F&-65281|a<<8;this.A-=this.B.Z},function(a){a=a.call(this,this.F>>8&255,F(this,this.L+this.K));this.F=this.F&-65281|a<<8;this.A-=this.B.Z},function(a){a=a.call(this,this.F>>8&255,F(this,this.L+this.J));this.F=this.F&-65281|a<<8;this.A-=this.B.Y},
function(a){a=a.call(this,this.F>>8&255,E(this,this.K));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,E(this,this.J));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,E(this,S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.aa},function(a){a=a.call(this,this.F>>8&255,E(this,this.D));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,E(this,this.D+this.K));this.G=this.G&-65281|a<<8;this.A-=this.B.Y},
function(a){a=a.call(this,this.G>>8&255,E(this,this.D+this.J));this.G=this.G&-65281|a<<8;this.A-=this.B.Z},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+this.K));this.G=this.G&-65281|a<<8;this.A-=this.B.Z},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+this.J));this.G=this.G&-65281|a<<8;this.A-=this.B.Y},function(a){a=a.call(this,this.G>>8&255,E(this,this.K));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,E(this,this.J));this.G=this.G&-65281|a<<
8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,E(this,S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.aa},function(a){a=a.call(this,this.G>>8&255,E(this,this.D));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,E(this,this.D+this.K));this.H=this.H&-65281|a<<8;this.A-=this.B.Y},function(a){a=a.call(this,this.H>>8&255,E(this,this.D+this.J));this.H=this.H&-65281|a<<8;this.A-=this.B.Z},function(a){a=a.call(this,this.H>>8&255,F(this,this.L+this.K));this.H=
this.H&-65281|a<<8;this.A-=this.B.Z},function(a){a=a.call(this,this.H>>8&255,F(this,this.L+this.J));this.H=this.H&-65281|a<<8;this.A-=this.B.Y},function(a){a=a.call(this,this.H>>8&255,E(this,this.K));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,E(this,this.J));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,E(this,S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.aa},function(a){a=a.call(this,this.H>>8&255,E(this,this.D));
this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,E(this,this.D+this.K));this.D=this.D&-65281|a<<8;this.A-=this.B.Y},function(a){a=a.call(this,this.D>>8&255,E(this,this.D+this.J));this.D=this.D&-65281|a<<8;this.A-=this.B.Z},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+this.K));this.D=this.D&-65281|a<<8;this.A-=this.B.Z},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+this.J));this.D=this.D&-65281|a<<8;this.A-=this.B.Y},function(a){a=a.call(this,this.D>>
8&255,E(this,this.K));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,E(this,this.J));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,E(this,S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.aa},function(a){a=a.call(this,this.D>>8&255,E(this,this.D));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,this.D+this.K+this.M()));this.F=this.F&-256|a;this.A-=this.B.O},function(a){a=a.call(this,
this.F&255,E(this,this.D+this.J+this.M()));this.F=this.F&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&255,F(this,this.L+this.K+this.M()));this.F=this.F&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&255,F(this,this.L+this.J+this.M()));this.F=this.F&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.F&255,E(this,this.K+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.J+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=
a.call(this,this.F&255,F(this,this.L+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.D+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.D+this.K+this.M()));this.G=this.G&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.G&255,E(this,this.D+this.J+this.M()));this.G=this.G&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&255,F(this,this.L+this.K+this.M()));this.G=this.G&-256|a;this.A-=
this.B.P},function(a){a=a.call(this,this.G&255,F(this,this.L+this.J+this.M()));this.G=this.G&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.G&255,E(this,this.K+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.J+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.L+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.D+this.M()));this.G=this.G&-256|
a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.D+this.K+this.M()));this.H=this.H&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.H&255,E(this,this.D+this.J+this.M()));this.H=this.H&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&255,F(this,this.L+this.K+this.M()));this.H=this.H&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&255,F(this,this.L+this.J+this.M()));this.H=this.H&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.H&255,E(this,this.K+
this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.J+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.L+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.D+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.D+this.K+this.M()));this.D=this.D&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.D&255,E(this,
this.D+this.J+this.M()));this.D=this.D&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&255,F(this,this.L+this.K+this.M()));this.D=this.D&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&255,F(this,this.L+this.J+this.M()));this.D=this.D&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.D&255,E(this,this.K+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.J+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,
this.D&255,F(this,this.L+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.D+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.D+this.K+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.F>>8&255,E(this,this.D+this.J+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.F>>8&255,F(this,this.L+this.K+this.M()));this.F=this.F&-65281|
a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.F>>8&255,F(this,this.L+this.J+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.F>>8&255,E(this,this.K+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.J+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.L+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&
255,E(this,this.D+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.D+this.K+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.G>>8&255,E(this,this.D+this.J+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+this.K+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+this.J+this.M()));this.G=this.G&
-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.G>>8&255,E(this,this.K+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.J+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.D+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&
255,E(this,this.D+this.K+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.H>>8&255,E(this,this.D+this.J+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.H>>8&255,F(this,this.L+this.K+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.H>>8&255,F(this,this.L+this.J+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.H>>8&255,E(this,this.K+this.M()));this.H=this.H&
-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.J+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.L+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.D+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.D+this.K+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.D>>
8&255,E(this,this.D+this.J+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+this.K+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+this.J+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.D>>8&255,E(this,this.K+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.J+this.M()));this.D=this.D&
-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.D+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.D+this.K+S(this)));this.F=this.F&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.F&255,E(this,this.D+this.J+S(this)));this.F=this.F&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&255,F(this,
this.L+this.K+S(this)));this.F=this.F&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&255,F(this,this.L+this.J+S(this)));this.F=this.F&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.F&255,E(this,this.K+S(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.J+S(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.L+S(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&
255,E(this,this.D+S(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.D+this.K+S(this)));this.G=this.G&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.G&255,E(this,this.D+this.J+S(this)));this.G=this.G&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&255,F(this,this.L+this.K+S(this)));this.G=this.G&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&255,F(this,this.L+this.J+S(this)));this.G=this.G&-256|a;this.A-=this.B.O},function(a){a=
a.call(this,this.G&255,E(this,this.K+S(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.J+S(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.L+S(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.D+S(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.D+this.K+S(this)));this.H=this.H&-256|a;this.A-=this.B.O},function(a){a=
a.call(this,this.H&255,E(this,this.D+this.J+S(this)));this.H=this.H&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&255,F(this,this.L+this.K+S(this)));this.H=this.H&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&255,F(this,this.L+this.J+S(this)));this.H=this.H&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.H&255,E(this,this.K+S(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.J+S(this)));this.H=this.H&-256|a;this.A-=this.B.I},
function(a){a=a.call(this,this.H&255,F(this,this.L+S(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.D+S(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.D+this.K+S(this)));this.D=this.D&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.D&255,E(this,this.D+this.J+S(this)));this.D=this.D&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&255,F(this,this.L+this.K+S(this)));this.D=this.D&-256|
a;this.A-=this.B.P},function(a){a=a.call(this,this.D&255,F(this,this.L+this.J+S(this)));this.D=this.D&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.D&255,E(this,this.K+S(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.J+S(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.L+S(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.D+S(this)));this.D=this.D&
-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.D+this.K+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.F>>8&255,E(this,this.D+this.J+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.F>>8&255,F(this,this.L+this.K+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.F>>8&255,F(this,this.L+this.J+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,
this.F>>8&255,E(this,this.K+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.J+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.L+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.D+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.D+this.K+S(this)));this.G=this.G&-65281|a<<
8;this.A-=this.B.O},function(a){a=a.call(this,this.G>>8&255,E(this,this.D+this.J+S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+this.K+S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+this.J+S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.G>>8&255,E(this,this.K+S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>
8&255,E(this,this.J+S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.D+S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.D+this.K+S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.H>>8&255,E(this,this.D+this.J+S(this)));this.H=this.H&-65281|a<<8;
this.A-=this.B.P},function(a){a=a.call(this,this.H>>8&255,F(this,this.L+this.K+S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.H>>8&255,F(this,this.L+this.J+S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.H>>8&255,E(this,this.K+S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.J+S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,
F(this,this.L+S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.D+S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.D+this.K+S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.D>>8&255,E(this,this.D+this.J+S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+this.K+S(this)));this.D=this.D&-65281|a<<
8;this.A-=this.B.P},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+this.J+S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.D>>8&255,E(this,this.K+S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.J+S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,
this.D+S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,this.F&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.G&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.H&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.D&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.F>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.G>>8&255);this.F=this.F&-256|a},function(a){a=
a.call(this,this.F&255,this.H>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.D>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.G&255,this.F&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.G&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.H&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.D&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.F>>8&255);this.G=this.G&-256|a},function(a){a=
a.call(this,this.G&255,this.G>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.H>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.D>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.H&255,this.F&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.G&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.H&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.D&255);this.H=this.H&-256|a},function(a){a=
a.call(this,this.H&255,this.F>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.G>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.H>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.D>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.D&255,this.F&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.G&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.H&255);this.D=this.D&-256|a},function(a){a=
a.call(this,this.D&255,this.D&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.F>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.G>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.H>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.D>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.F>>8&255,this.F&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.G&255);this.F=this.F&-65281|
a<<8},function(a){a=a.call(this,this.F>>8&255,this.H&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.D&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.F>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.G>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.H>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.D>>8&255);this.F=this.F&-65281|a<<8},function(a){a=
a.call(this,this.G>>8&255,this.F&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.G&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.H&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.D&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.F>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.G>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&
255,this.H>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.D>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.F&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.G&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.H&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.D&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.F>>8&255);this.H=
this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.G>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.H>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.D>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.F&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.G&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.H&255);this.D=this.D&-65281|a<<8},
function(a){a=a.call(this,this.D>>8&255,this.D&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.F>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.G>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.H>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.D>>8&255);this.D=this.D&-65281|a<<8}],Kd=[function(a){a=a.call(this,J(this,this.D+this.K),this.F&255);O(this,a);this.A-=this.B.Y},function(a){a=
a.call(this,J(this,this.D+this.J),this.F&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.K),this.F&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.J),this.F&255);O(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.K),this.F&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.F&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.F&255);O(this,a);this.A-=this.B.aa},function(a){a=
a.call(this,J(this,this.D),this.F&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D+this.K),this.G&255);O(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.D+this.J),this.G&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.K),this.G&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.J),this.G&255);O(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.K),this.G&255);O(this,a);this.A-=this.B.N},function(a){a=
a.call(this,J(this,this.J),this.G&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.G&255);O(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.D),this.G&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D+this.K),this.H&255);O(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.D+this.J),this.H&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.K),this.H&255);O(this,a);this.A-=this.B.Z},function(a){a=
a.call(this,K(this,this.L+this.J),this.H&255);O(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.K),this.H&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.H&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.H&255);O(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.D),this.H&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D+this.K),this.D&255);O(this,a);this.A-=this.B.Y},function(a){a=
a.call(this,J(this,this.D+this.J),this.D&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.K),this.D&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.J),this.D&255);O(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.K),this.D&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.D&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.D&255);O(this,a);this.A-=this.B.aa},function(a){a=
a.call(this,J(this,this.D),this.D&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D+this.K),this.F>>8&255);O(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.D+this.J),this.F>>8&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.K),this.F>>8&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.J),this.F>>8&255);O(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.K),this.F>>8&255);O(this,a);this.A-=
this.B.N},function(a){a=a.call(this,J(this,this.J),this.F>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.F>>8&255);O(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.D),this.F>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D+this.K),this.G>>8&255);O(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.D+this.J),this.G>>8&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.K),this.G>>
8&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.J),this.G>>8&255);O(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.K),this.G>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.G>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.G>>8&255);O(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.D),this.G>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D+
this.K),this.H>>8&255);O(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.D+this.J),this.H>>8&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.K),this.H>>8&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.J),this.H>>8&255);O(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.K),this.H>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.H>>8&255);O(this,a);this.A-=this.B.N},function(a){a=
a.call(this,J(this,S(this)),this.H>>8&255);O(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.D),this.H>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D+this.K),this.D>>8&255);O(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.D+this.J),this.D>>8&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.K),this.D>>8&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.J),this.D>>8&255);O(this,a);
this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.K),this.D>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.D>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.D>>8&255);O(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.D),this.D>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D+this.K+this.M()),this.F&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+this.M()),
this.F&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+this.M()),this.F&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+this.M()),this.F&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+this.M()),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.F&255);O(this,a);this.A-=this.B.I},
function(a){a=a.call(this,J(this,this.D+this.M()),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+this.M()),this.G&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+this.M()),this.G&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+this.M()),this.G&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+this.M()),this.G&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,
J(this,this.K+this.M()),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+this.M()),this.H&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+this.M()),this.H&255);O(this,
a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+this.M()),this.H&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+this.M()),this.H&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+this.M()),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,
J(this,this.D+this.M()),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+this.M()),this.D&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+this.M()),this.D&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+this.M()),this.D&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+this.M()),this.D&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+this.M()),
this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.P},
function(a){a=a.call(this,K(this,this.L+this.K+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,
J(this,this.D+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+this.M()),this.G>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+this.M()),this.G>>8&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+this.M()),this.G>>8&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+this.M()),this.G>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+
this.M()),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+this.M()),this.H>>8&255);
O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.I},
function(a){a=a.call(this,J(this,this.D+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.O},function(a){a=
a.call(this,J(this,this.K+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+S(this)),this.F&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+
S(this)),this.F&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+S(this)),this.F&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+S(this)),this.F&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+S(this)),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.F&255);O(this,a);this.A-=this.B.I},
function(a){a=a.call(this,J(this,this.D+S(this)),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+S(this)),this.G&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+S(this)),this.G&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+S(this)),this.G&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+S(this)),this.G&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,
this.K+S(this)),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+S(this)),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+S(this)),this.H&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+S(this)),this.H&255);O(this,a);this.A-=
this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+S(this)),this.H&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+S(this)),this.H&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+S(this)),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,
this.D+S(this)),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+S(this)),this.D&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+S(this)),this.D&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+S(this)),this.D&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+S(this)),this.D&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+S(this)),this.D&255);
O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+S(this)),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.P},function(a){a=
a.call(this,K(this,this.L+this.K+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+S(this)),
this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+S(this)),this.G>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+S(this)),this.G>>8&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+S(this)),this.G>>8&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+S(this)),this.G>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+S(this)),this.G>>8&255);
O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+S(this)),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.P},
function(a){a=a.call(this,K(this,this.L+this.K+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,
this.D+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+S(this)),this.D>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+S(this)),this.D>>8&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+S(this)),this.D>>8&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+S(this)),this.D>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+S(this)),
this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+S(this)),this.D>>8&255);O(this,a);this.A-=this.B.I},y[192],y[200],y[208],y[216],y[224],y[232],y[240],y[248],y[193],y[201],y[209],y[217],y[225],y[233],y[241],y[249],y[194],y[202],y[210],y[218],y[226],y[234],y[242],y[250],y[195],y[203],
y[211],y[219],y[227],y[235],y[243],y[251],y[196],y[204],y[212],y[220],y[228],y[236],y[244],y[252],y[197],y[205],y[213],y[221],y[229],y[237],y[245],y[253],y[198],y[206],y[214],y[222],y[230],y[238],y[246],y[254],y[199],y[207],y[215],y[223],y[231],y[239],y[247],y[255]],Ld=[function(a,b){var c=a[0].call(this,J(this,this.D+this.K),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[0].call(this,J(this,this.D+this.J),b.call(this));O(this,c);this.A-=this.B.Z},function(a,b){var c=a[0].call(this,
K(this,this.L+this.K),b.call(this));O(this,c);this.A-=this.B.Z},function(a,b){var c=a[0].call(this,K(this,this.L+this.J),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[0].call(this,J(this,this.K),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,b){var c=a[0].call(this,J(this,this.D),b.call(this));
O(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,J(this,this.D+this.K),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[1].call(this,J(this,this.D+this.J),b.call(this));O(this,c);this.A-=this.B.Z},function(a,b){var c=a[1].call(this,K(this,this.L+this.K),b.call(this));O(this,c);this.A-=this.B.Z},function(a,b){var c=a[1].call(this,K(this,this.L+this.J),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[1].call(this,J(this,this.K),b.call(this));O(this,c);this.A-=
this.B.N},function(a,b){var c=a[1].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,b){var c=a[1].call(this,J(this,this.D),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,this.D+this.K),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[2].call(this,J(this,this.D+this.J),b.call(this));O(this,c);this.A-=this.B.Z},function(a,b){var c=
a[2].call(this,K(this,this.L+this.K),b.call(this));O(this,c);this.A-=this.B.Z},function(a,b){var c=a[2].call(this,K(this,this.L+this.J),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[2].call(this,J(this,this.K),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,b){var c=a[2].call(this,J(this,this.D),
b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,this.D+this.K),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[3].call(this,J(this,this.D+this.J),b.call(this));O(this,c);this.A-=this.B.Z},function(a,b){var c=a[3].call(this,K(this,this.L+this.K),b.call(this));O(this,c);this.A-=this.B.Z},function(a,b){var c=a[3].call(this,K(this,this.L+this.J),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[3].call(this,J(this,this.K),b.call(this));
O(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,b){var c=a[3].call(this,J(this,this.D),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,J(this,this.D+this.K),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[4].call(this,J(this,this.D+this.J),b.call(this));O(this,c);this.A-=this.B.Z},
function(a,b){var c=a[4].call(this,K(this,this.L+this.K),b.call(this));O(this,c);this.A-=this.B.Z},function(a,b){var c=a[4].call(this,K(this,this.L+this.J),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[4].call(this,J(this,this.K),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,b){var c=a[4].call(this,
J(this,this.D),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,J(this,this.D+this.K),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[5].call(this,J(this,this.D+this.J),b.call(this));O(this,c);this.A-=this.B.Z},function(a,b){var c=a[5].call(this,K(this,this.L+this.K),b.call(this));O(this,c);this.A-=this.B.Z},function(a,b){var c=a[5].call(this,K(this,this.L+this.J),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[5].call(this,J(this,this.K),
b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,b){var c=a[5].call(this,J(this,this.D),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,J(this,this.D+this.K),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[6].call(this,J(this,this.D+this.J),b.call(this));O(this,c);this.A-=
this.B.Z},function(a,b){var c=a[6].call(this,K(this,this.L+this.K),b.call(this));O(this,c);this.A-=this.B.Z},function(a,b){var c=a[6].call(this,K(this,this.L+this.J),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[6].call(this,J(this,this.K),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,b){var c=
a[6].call(this,J(this,this.D),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,J(this,this.D+this.K),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[7].call(this,J(this,this.D+this.J),b.call(this));O(this,c);this.A-=this.B.Z},function(a,b){var c=a[7].call(this,K(this,this.L+this.K),b.call(this));O(this,c);this.A-=this.B.Z},function(a,b){var c=a[7].call(this,K(this,this.L+this.J),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[7].call(this,
J(this,this.K),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,b){var c=a[7].call(this,J(this,this.D),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,this.D+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[0].call(this,J(this,this.D+this.J+this.M()),
b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,K(this,this.L+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,K(this,this.L+this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[0].call(this,J(this,this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,K(this,
this.L+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.D+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.D+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[1].call(this,J(this,this.D+this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,K(this,this.L+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=
a[1].call(this,K(this,this.L+this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[1].call(this,J(this,this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,K(this,this.L+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.D+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,
b){var c=a[2].call(this,J(this,this.D+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[2].call(this,J(this,this.D+this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,K(this,this.L+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,K(this,this.L+this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[2].call(this,J(this,this.K+this.M()),b.call(this));O(this,
c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,K(this,this.L+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.D+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.D+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[3].call(this,J(this,this.D+this.J+this.M()),b.call(this));
O(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,K(this,this.L+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,K(this,this.L+this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[3].call(this,J(this,this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,K(this,this.L+this.M()),
b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.D+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.D+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[4].call(this,J(this,this.D+this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,K(this,this.L+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,
K(this,this.L+this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[4].call(this,J(this,this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,K(this,this.L+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.D+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,
J(this,this.D+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[5].call(this,J(this,this.D+this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,K(this,this.L+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,K(this,this.L+this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[5].call(this,J(this,this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,
b){var c=a[5].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,K(this,this.L+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.D+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.D+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[6].call(this,J(this,this.D+this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.P},
function(a,b){var c=a[6].call(this,K(this,this.L+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,K(this,this.L+this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[6].call(this,J(this,this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,K(this,this.L+this.M()),b.call(this));O(this,c);
this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.D+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.D+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[7].call(this,J(this,this.D+this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,K(this,this.L+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,K(this,this.L+this.J+this.M()),
b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[7].call(this,J(this,this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,K(this,this.L+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.D+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.D+this.K+
S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[0].call(this,J(this,this.D+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,K(this,this.L+this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,K(this,this.L+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[0].call(this,J(this,this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,
J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.D+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.D+this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[1].call(this,J(this,this.D+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,
K(this,this.L+this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,K(this,this.L+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[1].call(this,J(this,this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,
J(this,this.D+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.D+this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[2].call(this,J(this,this.D+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,K(this,this.L+this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,K(this,this.L+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,
b){var c=a[2].call(this,J(this,this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.D+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.D+this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,
b){var c=a[3].call(this,J(this,this.D+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,K(this,this.L+this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,K(this,this.L+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[3].call(this,J(this,this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.I},
function(a,b){var c=a[3].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.D+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.D+this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[4].call(this,J(this,this.D+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,K(this,this.L+this.K+S(this)),b.call(this));O(this,c);
this.A-=this.B.P},function(a,b){var c=a[4].call(this,K(this,this.L+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[4].call(this,J(this,this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.D+S(this)),b.call(this));O(this,
c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.D+this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[5].call(this,J(this,this.D+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,K(this,this.L+this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,K(this,this.L+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[5].call(this,J(this,this.K+S(this)),
b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.D+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.D+this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[6].call(this,J(this,this.D+this.J+
S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,K(this,this.L+this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,K(this,this.L+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[6].call(this,J(this,this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,K(this,
this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.D+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.D+this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[7].call(this,J(this,this.D+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,K(this,this.L+this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,
K(this,this.L+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[7].call(this,J(this,this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.D+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,
this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[0].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[0].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[0].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[0].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[0].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[0].call(this,
this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[0].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[1].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[1].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[1].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[1].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[1].call(this,
this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[1].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[1].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[1].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[2].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[2].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=
a[2].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[2].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[2].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[2].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[2].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[2].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<
8},function(a,b){var c=a[3].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[3].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[3].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[3].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[3].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[3].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|
c<<8},function(a,b){var c=a[3].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[3].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[4].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[4].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[4].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[4].call(this,this.D&255,b.call(this));this.D=this.D&
-256|c},function(a,b){var c=a[4].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[4].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[4].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[4].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[5].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[5].call(this,this.G&255,b.call(this));
this.G=this.G&-256|c},function(a,b){var c=a[5].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[5].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[5].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[5].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[5].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[5].call(this,this.D>>8&
255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[6].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[6].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[6].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[6].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[6].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[6].call(this,this.G>>
8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[6].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[6].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[7].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[7].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[7].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[7].call(this,
this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[7].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[7].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[7].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[7].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8}],z=[function(a){a=a.call(this,this.F&this.C,H(this,this.D+this.K));this.F=this.F&~this.C|a;this.A-=
this.B.Y},function(a){a=a.call(this,this.F&this.C,H(this,this.D+this.J));this.F=this.F&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.F&this.C,I(this,this.L+this.K));this.F=this.F&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.F&this.C,I(this,this.L+this.J));this.F=this.F&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.F&this.C,H(this,this.K));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,this.J));this.F=this.F&~this.C|
a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,S(this)));this.F=this.F&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.F&this.C,H(this,this.D));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,this.D+this.K));this.G=this.G&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.G&this.C,H(this,this.D+this.J));this.G=this.G&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.G&this.C,I(this,this.L+this.K));this.G=this.G&
~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.G&this.C,I(this,this.L+this.J));this.G=this.G&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.G&this.C,H(this,this.K));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,this.J));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,S(this)));this.G=this.G&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.G&this.C,H(this,this.D));this.G=this.G&~this.C|
a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,H(this,this.D+this.K));this.H=this.H&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.H&this.C,H(this,this.D+this.J));this.H=this.H&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.H&this.C,I(this,this.L+this.K));this.H=this.H&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.H&this.C,I(this,this.L+this.J));this.H=this.H&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.H&this.C,H(this,this.K));this.H=
this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,H(this,this.J));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,H(this,S(this)));this.H=this.H&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.H&this.C,H(this,this.D));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,H(this,this.D+this.K));this.D=this.D&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.D&this.C,H(this,this.D+this.J));this.D=
this.D&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.D&this.C,I(this,this.L+this.K));this.D=this.D&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.D&this.C,I(this,this.L+this.J));this.D=this.D&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.D&this.C,H(this,this.K));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,H(this,this.J));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,H(this,S(this)));this.D=
this.D&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.D&this.C,H(this,this.D));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,H(this,this.D+this.K));t(this,q(this)&~this.C|a);this.A-=this.B.Y},function(a){a=a.call(this,q(this)&this.C,H(this,this.D+this.J));t(this,q(this)&~this.C|a);this.A-=this.B.Z},function(a){a=a.call(this,q(this)&this.C,I(this,this.L+this.K));t(this,q(this)&~this.C|a);this.A-=this.B.Z},function(a){a=a.call(this,q(this)&this.C,I(this,
this.L+this.J));t(this,q(this)&~this.C|a);this.A-=this.B.Y},function(a){a=a.call(this,q(this)&this.C,H(this,this.K));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,H(this,this.J));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,H(this,S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.aa},function(a){a=a.call(this,q(this)&this.C,H(this,this.D));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,
H(this,this.D+this.K));this.L=this.L&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.L&this.C,H(this,this.D+this.J));this.L=this.L&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.L&this.C,I(this,this.L+this.K));this.L=this.L&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.L&this.C,I(this,this.L+this.J));this.L=this.L&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.L&this.C,H(this,this.K));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,
this.L&this.C,H(this,this.J));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,H(this,S(this)));this.L=this.L&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.L&this.C,H(this,this.D));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,this.D+this.K));this.K=this.K&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.K&this.C,H(this,this.D+this.J));this.K=this.K&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,
this.K&this.C,I(this,this.L+this.K));this.K=this.K&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.K&this.C,I(this,this.L+this.J));this.K=this.K&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.K&this.C,H(this,this.K));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,this.J));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,S(this)));this.K=this.K&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,
this.K&this.C,H(this,this.D));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,this.D+this.K));this.J=this.J&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.J&this.C,H(this,this.D+this.J));this.J=this.J&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.J&this.C,I(this,this.L+this.K));this.J=this.J&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.J&this.C,I(this,this.L+this.J));this.J=this.J&~this.C|a;this.A-=this.B.Y},function(a){a=
a.call(this,this.J&this.C,H(this,this.K));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,this.J));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,S(this)));this.J=this.J&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.J&this.C,H(this,this.D));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,this.D+this.K+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.O},function(a){a=
a.call(this,this.F&this.C,H(this,this.D+this.J+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&this.C,I(this,this.L+this.K+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&this.C,I(this,this.L+this.J+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.F&this.C,H(this,this.K+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.J+this.M()));this.F=
this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.L+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.D+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.D+this.K+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.G&this.C,H(this,this.D+this.J+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,
this.G&this.C,I(this,this.L+this.K+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&this.C,I(this,this.L+this.J+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.G&this.C,H(this,this.K+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.J+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.L+this.M()));this.G=this.G&~this.C|
a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.D+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.D+this.K+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.H&this.C,H(this,this.D+this.J+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&this.C,I(this,this.L+this.K+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&
this.C,I(this,this.L+this.J+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.H&this.C,H(this,this.K+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.J+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.L+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.D+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},
function(a){a=a.call(this,this.D&this.C,H(this,this.D+this.K+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.D&this.C,H(this,this.D+this.J+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&this.C,I(this,this.L+this.K+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&this.C,I(this,this.L+this.J+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.D&this.C,H(this,
this.K+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.J+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.L+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.D+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.D+this.K+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.O},function(a){a=
a.call(this,q(this)&this.C,H(this,this.D+this.J+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.P},function(a){a=a.call(this,q(this)&this.C,I(this,this.L+this.K+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.P},function(a){a=a.call(this,q(this)&this.C,I(this,this.L+this.J+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.O},function(a){a=a.call(this,q(this)&this.C,H(this,this.K+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.J+
this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,I(this,this.L+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.D+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.D+this.K+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.L&this.C,H(this,this.D+this.J+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.P},
function(a){a=a.call(this,this.L&this.C,I(this,this.L+this.K+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.L&this.C,I(this,this.L+this.J+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.L&this.C,H(this,this.K+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.J+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.L+this.M()));
this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.D+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.D+this.K+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.K&this.C,H(this,this.D+this.J+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.K&this.C,I(this,this.L+this.K+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.P},function(a){a=
a.call(this,this.K&this.C,I(this,this.L+this.J+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.K&this.C,H(this,this.K+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.J+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.L+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.D+this.M()));this.K=this.K&~this.C|
a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.D+this.K+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.J&this.C,H(this,this.D+this.J+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.J&this.C,I(this,this.L+this.K+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.J&this.C,I(this,this.L+this.J+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,
this.J&this.C,H(this,this.K+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.J+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.L+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.D+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.D+this.K+S(this)));this.F=this.F&~this.C|a;this.A-=
this.B.O},function(a){a=a.call(this,this.F&this.C,H(this,this.D+this.J+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&this.C,I(this,this.L+this.K+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&this.C,I(this,this.L+this.J+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.F&this.C,H(this,this.K+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,
this.J+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.L+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.D+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.D+this.K+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.G&this.C,H(this,this.D+this.J+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.P},function(a){a=
a.call(this,this.G&this.C,I(this,this.L+this.K+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&this.C,I(this,this.L+this.J+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.G&this.C,H(this,this.K+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.J+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.L+S(this)));this.G=this.G&
~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.D+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.D+this.K+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.H&this.C,H(this,this.D+this.J+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&this.C,I(this,this.L+this.K+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&
this.C,I(this,this.L+this.J+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.H&this.C,H(this,this.K+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.J+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.L+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.D+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},
function(a){a=a.call(this,this.D&this.C,H(this,this.D+this.K+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.D&this.C,H(this,this.D+this.J+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&this.C,I(this,this.L+this.K+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&this.C,I(this,this.L+this.J+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.D&this.C,H(this,this.K+
S(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.J+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.L+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.D+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.D+this.K+S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.O},function(a){a=a.call(this,
q(this)&this.C,H(this,this.D+this.J+S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.P},function(a){a=a.call(this,q(this)&this.C,I(this,this.L+this.K+S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.P},function(a){a=a.call(this,q(this)&this.C,I(this,this.L+this.J+S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.O},function(a){a=a.call(this,q(this)&this.C,H(this,this.K+S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.J+S(this)));t(this,
q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,I(this,this.L+S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.D+S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.D+this.K+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.L&this.C,H(this,this.D+this.J+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,
this.L&this.C,I(this,this.L+this.K+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.L&this.C,I(this,this.L+this.J+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.L&this.C,H(this,this.K+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.J+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.L+S(this)));this.L=this.L&~this.C|a;this.A-=
this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.D+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.D+this.K+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.K&this.C,H(this,this.D+this.J+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.K&this.C,I(this,this.L+this.K+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.K&this.C,I(this,
this.L+this.J+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.K&this.C,H(this,this.K+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.J+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.L+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.D+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=
a.call(this,this.J&this.C,H(this,this.D+this.K+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.J&this.C,H(this,this.D+this.J+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.J&this.C,I(this,this.L+this.K+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.J&this.C,I(this,this.L+this.J+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.J&this.C,H(this,this.K+S(this)));
this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.J+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.L+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.D+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,this.F&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.G&this.C);this.F=
this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.H&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.D&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,q(this)&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.L&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.K&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.J&this.C);this.F=this.F&~this.C|a},function(a){a=
a.call(this,this.G&this.C,this.F&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.G&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.H&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.D&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,q(this)&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.L&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,
this.K&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.J&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.F&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.G&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.H&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.D&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,q(this)&this.C);this.H=
this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.L&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.K&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.J&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.F&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.G&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.H&this.C);this.D=this.D&~this.C|a},function(a){a=
a.call(this,this.D&this.C,this.D&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,q(this)&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.L&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.K&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.J&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,q(this)&this.C,this.F&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&
this.C,this.G&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.H&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.D&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,q(this)&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.L&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.K&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,
this.J&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,this.L&this.C,this.F&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.G&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.H&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.D&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,q(this)&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.L&this.C);this.L=
this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.K&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.J&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.F&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.G&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.H&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.D&this.C);this.K=this.K&~this.C|a},function(a){a=
a.call(this,this.K&this.C,q(this)&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.L&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.K&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.J&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.F&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.G&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,
this.H&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.D&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,q(this)&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.L&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.K&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.J&this.C);this.J=this.J&~this.C|a}],Md=[function(a){a=a.call(this,L(this,this.D+this.K),this.F&
this.C);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,L(this,this.D+this.J),this.F&this.C);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,N(this,this.L+this.K),this.F&this.C);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,N(this,this.L+this.J),this.F&this.C);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,L(this,this.K),this.F&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.F&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,
L(this,S(this)),this.F&this.C);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,L(this,this.D),this.F&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.G&this.C);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,L(this,this.D+this.J),this.G&this.C);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,N(this,this.L+this.K),this.G&this.C);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,N(this,this.L+this.J),this.G&this.C);P(this,a);this.A-=this.B.Y},
function(a){a=a.call(this,L(this,this.K),this.G&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.G&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),this.G&this.C);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,L(this,this.D),this.G&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.H&this.C);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,L(this,this.D+this.J),this.H&this.C);P(this,a);
this.A-=this.B.Z},function(a){a=a.call(this,N(this,this.L+this.K),this.H&this.C);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,N(this,this.L+this.J),this.H&this.C);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,L(this,this.K),this.H&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.H&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),this.H&this.C);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,L(this,this.D),this.H&
this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.D&this.C);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,L(this,this.D+this.J),this.D&this.C);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,N(this,this.L+this.K),this.D&this.C);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,N(this,this.L+this.J),this.D&this.C);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,L(this,this.K),this.D&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,
L(this,this.J),this.D&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),this.D&this.C);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,L(this,this.D),this.D&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),q(this)&this.C);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,L(this,this.D+this.J),q(this)&this.C);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,N(this,this.L+this.K),q(this)&this.C);P(this,a);this.A-=this.B.Z},
function(a){a=a.call(this,N(this,this.L+this.J),q(this)&this.C);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,L(this,this.K),q(this)&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),q(this)&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),q(this)&this.C);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,L(this,this.D),q(this)&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.L&this.C);P(this,
a);this.A-=this.B.Y},function(a){a=a.call(this,L(this,this.D+this.J),this.L&this.C);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,N(this,this.L+this.K),this.L&this.C);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,N(this,this.L+this.J),this.L&this.C);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,L(this,this.K),this.L&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.L&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),
this.L&this.C);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,L(this,this.D),this.L&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.K&this.C);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,L(this,this.D+this.J),this.K&this.C);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,N(this,this.L+this.K),this.K&this.C);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,N(this,this.L+this.J),this.K&this.C);P(this,a);this.A-=this.B.Y},function(a){a=
a.call(this,L(this,this.K),this.K&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.K&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),this.K&this.C);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,L(this,this.D),this.K&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.J&this.C);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,L(this,this.D+this.J),this.J&this.C);P(this,a);this.A-=this.B.Z},
function(a){a=a.call(this,N(this,this.L+this.K),this.J&this.C);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,N(this,this.L+this.J),this.J&this.C);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,L(this,this.K),this.J&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.J&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),this.J&this.C);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,L(this,this.D),this.J&this.C);P(this,a);
this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.F&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.F&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+this.M()),this.F&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+this.M()),this.F&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.K+this.M()),this.F&this.C);P(this,a);this.A-=
this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.G&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.G&this.C);P(this,a);this.A-=this.B.P},function(a){a=
a.call(this,N(this,this.L+this.K+this.M()),this.G&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+this.M()),this.G&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.K+this.M()),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+
this.M()),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.H&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.H&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+this.M()),this.H&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+this.M()),this.H&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.K+this.M()),
this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.D&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.D&this.C);P(this,
a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+this.M()),this.D&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+this.M()),this.D&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.K+this.M()),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=
a.call(this,L(this,this.D+this.M()),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,
L(this,this.K+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.L&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),
this.L&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+this.M()),this.L&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+this.M()),this.L&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.K+this.M()),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),this.L&this.C);P(this,
a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.K&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.K&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+this.M()),this.K&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+this.M()),this.K&this.C);P(this,a);this.A-=
this.B.O},function(a){a=a.call(this,L(this,this.K+this.M()),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.J&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,
L(this,this.D+this.J+this.M()),this.J&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+this.M()),this.J&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+this.M()),this.J&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.K+this.M()),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),
this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+S(this)),this.F&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.D+this.J+S(this)),this.F&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+S(this)),this.F&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+S(this)),this.F&this.C);
P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.K+S(this)),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+S(this)),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+S(this)),this.G&this.C);P(this,a);this.A-=this.B.O},function(a){a=
a.call(this,L(this,this.D+this.J+S(this)),this.G&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+S(this)),this.G&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+S(this)),this.G&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.K+S(this)),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+
S(this)),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+S(this)),this.H&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.D+this.J+S(this)),this.H&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+S(this)),this.H&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+S(this)),this.H&
this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.K+S(this)),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+S(this)),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+S(this)),this.D&this.C);P(this,a);this.A-=this.B.O},
function(a){a=a.call(this,L(this,this.D+this.J+S(this)),this.D&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+S(this)),this.D&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+S(this)),this.D&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.K+S(this)),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,
N(this,this.L+S(this)),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.D+this.J+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+
S(this)),q(this)&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.K+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+S(this)),this.L&this.C);P(this,
a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.D+this.J+S(this)),this.L&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+S(this)),this.L&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+S(this)),this.L&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.K+S(this)),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),this.L&this.C);P(this,a);this.A-=this.B.I},
function(a){a=a.call(this,N(this,this.L+S(this)),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+S(this)),this.K&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.D+this.J+S(this)),this.K&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+S(this)),this.K&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,
N(this,this.L+this.J+S(this)),this.K&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.K+S(this)),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+S(this)),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+S(this)),this.J&
this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.D+this.J+S(this)),this.J&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+S(this)),this.J&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+S(this)),this.J&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.K+S(this)),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),this.J&this.C);P(this,a);this.A-=
this.B.I},function(a){a=a.call(this,N(this,this.L+S(this)),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),this.J&this.C);P(this,a);this.A-=this.B.I},z[192],z[200],z[208],z[216],z[224],z[232],z[240],z[248],z[193],z[201],z[209],z[217],z[225],z[233],z[241],z[249],z[194],z[202],z[210],z[218],z[226],z[234],z[242],z[250],z[195],z[203],z[211],z[219],z[227],z[235],z[243],z[251],z[196],z[204],z[212],z[220],z[228],z[236],z[244],z[252],z[197],z[205],z[213],z[221],
z[229],z[237],z[245],z[253],z[198],z[206],z[214],z[222],z[230],z[238],z[246],z[254],z[199],z[207],z[215],z[223],z[231],z[239],z[247],z[255]],Nd=[function(a,b){var c=a[0].call(this,L(this,this.D+this.K),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[0].call(this,L(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[0].call(this,N(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[0].call(this,N(this,this.L+this.J),b.call(this));
P(this,c);this.A-=this.B.Y},function(a,b){var c=a[0].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[0].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,this.D+this.K),b.call(this));P(this,c);this.A-=this.B.Y},function(a,
b){var c=a[1].call(this,L(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[1].call(this,N(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[1].call(this,N(this,this.L+this.J),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[1].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,
L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[1].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.D+this.K),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[2].call(this,L(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[2].call(this,N(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[2].call(this,N(this,this.L+this.J),
b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[2].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[2].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.D+this.K),b.call(this));P(this,c);this.A-=
this.B.Y},function(a,b){var c=a[3].call(this,L(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[3].call(this,N(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[3].call(this,N(this,this.L+this.J),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[3].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,
b){var c=a[3].call(this,L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[3].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.D+this.K),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[4].call(this,L(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[4].call(this,N(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[4].call(this,
N(this,this.L+this.J),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[4].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[4].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.D+this.K),b.call(this));
P(this,c);this.A-=this.B.Y},function(a,b){var c=a[5].call(this,L(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[5].call(this,N(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[5].call(this,N(this,this.L+this.J),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[5].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},
function(a,b){var c=a[5].call(this,L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[5].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.D+this.K),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[6].call(this,L(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[6].call(this,N(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=
a[6].call(this,N(this,this.L+this.J),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[6].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[6].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.D+this.K),
b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[7].call(this,L(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[7].call(this,N(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[7].call(this,N(this,this.L+this.J),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[7].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.J),b.call(this));P(this,
c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[7].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[0].call(this,L(this,this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,N(this,this.L+this.K+this.M()),b.call(this));
P(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,N(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[0].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.D+this.M()),b.call(this));
P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[1].call(this,L(this,this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,N(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,N(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[1].call(this,L(this,
this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[2].call(this,
L(this,this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,N(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,N(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[2].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,
b){var c=a[2].call(this,N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[3].call(this,L(this,this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,N(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=
this.B.P},function(a,b){var c=a[3].call(this,N(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[3].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.D+this.M()),b.call(this));P(this,
c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[4].call(this,L(this,this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,N(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,N(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[4].call(this,L(this,this.K+
this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[5].call(this,L(this,
this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,N(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,N(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[5].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=
a[5].call(this,N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[6].call(this,L(this,this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,N(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.P},
function(a,b){var c=a[6].call(this,N(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[6].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=
this.B.I},function(a,b){var c=a[7].call(this,L(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[7].call(this,L(this,this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,N(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,N(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[7].call(this,L(this,this.K+this.M()),
b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.D+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[0].call(this,L(this,this.D+
this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,N(this,this.L+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,N(this,this.L+this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[0].call(this,L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,
N(this,this.L+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.D+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[1].call(this,L(this,this.D+this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,N(this,this.L+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=
a[1].call(this,N(this,this.L+this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[1].call(this,L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.L+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=
a[2].call(this,L(this,this.D+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[2].call(this,L(this,this.D+this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,N(this,this.L+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,N(this,this.L+this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[2].call(this,L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},
function(a,b){var c=a[2].call(this,L(this,this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.L+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.D+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[3].call(this,L(this,this.D+this.J+S(this)),b.call(this));P(this,c);this.A-=
this.B.P},function(a,b){var c=a[3].call(this,N(this,this.L+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,N(this,this.L+this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[3].call(this,L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.L+S(this)),b.call(this));P(this,
c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.D+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[4].call(this,L(this,this.D+this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,N(this,this.L+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,N(this,this.L+this.J+S(this)),
b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[4].call(this,L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.L+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+this.K+S(this)),
b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[5].call(this,L(this,this.D+this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,N(this,this.L+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,N(this,this.L+this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[5].call(this,L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,
this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.L+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.D+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[6].call(this,L(this,this.D+this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,
N(this,this.L+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,N(this,this.L+this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[6].call(this,L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.L+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,
L(this,this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.D+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[7].call(this,L(this,this.D+this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,N(this,this.L+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,N(this,this.L+this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,
b){var c=a[7].call(this,L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.L+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[0].call(this,
this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[0].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[0].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[0].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[0].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[0].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,
b){var c=a[0].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[1].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[1].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[1].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[1].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[1].call(this,q(this)&this.C,b.call(this));t(this,q(this)&
~this.C|c)},function(a,b){var c=a[1].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[1].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[1].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[2].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[2].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[2].call(this,this.H&this.C,
b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[2].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[2].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[2].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[2].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[2].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=
a[3].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[3].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[3].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[3].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[3].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[3].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|
c},function(a,b){var c=a[3].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[3].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[4].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[4].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[4].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[4].call(this,this.D&this.C,b.call(this));
this.D=this.D&~this.C|c},function(a,b){var c=a[4].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[4].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[4].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[4].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[5].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[5].call(this,
this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[5].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[5].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[5].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[5].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[5].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,
b){var c=a[5].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[6].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[6].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[6].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[6].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[6].call(this,q(this)&this.C,b.call(this));t(this,q(this)&
~this.C|c)},function(a,b){var c=a[6].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[6].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[6].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[7].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[7].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[7].call(this,this.H&this.C,
b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[7].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[7].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[7].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[7].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[7].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c}],A=[function(a){a=a.call(this,
this.F&255,E(this,this.F));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,this.G));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,this.H));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,this.D));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,T(this,0)));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,S(this)));this.F=this.F&
-256|a;this.A-=this.B.aa},function(a){a=a.call(this,this.F&255,E(this,this.K));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,this.J));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,E(this,this.F));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,E(this,this.G));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,E(this,this.H));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,
this.G&255,E(this,this.D));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,E(this,T(this,0)));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,E(this,S(this)));this.G=this.G&-256|a;this.A-=this.B.aa},function(a){a=a.call(this,this.G&255,E(this,this.K));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,E(this,this.J));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,this.F));this.H=this.H&
-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,this.G));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,this.H));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,this.D));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,T(this,0)));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,S(this)));this.H=this.H&-256|a;this.A-=this.B.aa},function(a){a=
a.call(this,this.H&255,E(this,this.K));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,this.J));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,this.F));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,this.G));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,this.H));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,this.D));this.D=
this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,T(this,0)));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,S(this)));this.D=this.D&-256|a;this.A-=this.B.aa},function(a){a=a.call(this,this.D&255,E(this,this.K));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,this.J));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,E(this,this.F));this.F=this.F&-65281|a<<8;this.A-=this.B.N},
function(a){a=a.call(this,this.F>>8&255,E(this,this.G));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,E(this,this.H));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,E(this,this.D));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,E(this,T(this,0)));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,E(this,S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.aa},
function(a){a=a.call(this,this.F>>8&255,E(this,this.K));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,E(this,this.J));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,E(this,this.F));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,E(this,this.G));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,E(this,this.H));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=
a.call(this,this.G>>8&255,E(this,this.D));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,E(this,T(this,0)));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,E(this,S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.aa},function(a){a=a.call(this,this.G>>8&255,E(this,this.K));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,E(this,this.J));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=
a.call(this,this.H>>8&255,E(this,this.F));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,E(this,this.G));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,E(this,this.H));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,E(this,this.D));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,E(this,T(this,0)));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=
a.call(this,this.H>>8&255,E(this,S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.aa},function(a){a=a.call(this,this.H>>8&255,E(this,this.K));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,E(this,this.J));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,E(this,this.F));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,E(this,this.G));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=
a.call(this,this.D>>8&255,E(this,this.H));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,E(this,this.D));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,E(this,T(this,0)));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,E(this,S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.aa},function(a){a=a.call(this,this.D>>8&255,E(this,this.K));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=
a.call(this,this.D>>8&255,E(this,this.J));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,this.F+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.G+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.H+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.D+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=
a.call(this,this.F&255,E(this,T(this,1)+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.L+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.K+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.J+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.F+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=
a.call(this,this.G&255,E(this,this.G+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.H+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.D+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,T(this,1)+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.L+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=
a.call(this,this.G&255,E(this,this.K+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.J+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.F+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.G+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.H+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=
a.call(this,this.H&255,E(this,this.D+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,T(this,1)+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.L+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.K+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.J+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=
a.call(this,this.D&255,E(this,this.F+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.G+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.H+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.D+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,T(this,1)+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=
a.call(this,this.D&255,F(this,this.L+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.K+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.J+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.F+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.G+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},
function(a){a=a.call(this,this.F>>8&255,E(this,this.H+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.D+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,T(this,1)+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.L+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.K+this.M()));
this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.J+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.F+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.G+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.H+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,
this.G>>8&255,E(this,this.D+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,T(this,1)+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.K+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.J+this.M()));this.G=this.G&-65281|a<<
8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.F+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.G+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.H+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.D+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,
T(this,1)+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.L+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.K+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.J+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.F+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},
function(a){a=a.call(this,this.D>>8&255,E(this,this.G+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.H+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.D+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,T(this,1)+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+this.M()));
this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.K+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.J+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.F+S(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.G+S(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,
this.H+S(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.D+S(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,T(this,2)+S(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.L+S(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.K+S(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,
this.J+S(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.F+S(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.G+S(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.H+S(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.D+S(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,T(this,
2)+S(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.L+S(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.K+S(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.J+S(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.F+S(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.G+
S(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.H+S(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.D+S(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,T(this,2)+S(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.L+S(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.K+
S(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.J+S(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.F+S(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.G+S(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.H+S(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.D+S(this)));
this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,T(this,2)+S(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.L+S(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.K+S(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.J+S(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.F+S(this)));
this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.G+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.H+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.D+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,T(this,2)+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,
this.F>>8&255,F(this,this.L+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.K+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.J+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.F+S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.G+S(this)));this.G=this.G&-65281|a<<8;this.A-=
this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.H+S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.D+S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,T(this,2)+S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.K+S(this)));
this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.J+S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.F+S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.G+S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.H+S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,
this.H>>8&255,E(this,this.D+S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,T(this,2)+S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.L+S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.K+S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.J+S(this)));this.H=this.H&-65281|a<<8;this.A-=
this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.F+S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.G+S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.H+S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.D+S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,T(this,2)+S(this)));
this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.K+S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.J+S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,this.F&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.G&255);this.F=this.F&
-256|a},function(a){a=a.call(this,this.F&255,this.H&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.D&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.F>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.G>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.H>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.D>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.G&255,this.F&255);this.G=
this.G&-256|a},function(a){a=a.call(this,this.G&255,this.G&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.H&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.D&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.F>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.G>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.H>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.D>>8&255);
this.G=this.G&-256|a},function(a){a=a.call(this,this.H&255,this.F&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.G&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.H&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.D&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.F>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.G>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.H>>8&
255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.D>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.D&255,this.F&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.G&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.H&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.D&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.F>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.G>>
8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.H>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.D>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.F>>8&255,this.F&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.G&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.H&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.D&255);this.F=this.F&-65281|a<<8},function(a){a=
a.call(this,this.F>>8&255,this.F>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.G>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.H>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.D>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.F&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.G&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>
8&255,this.H&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.D&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.F>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.G>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.H>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.D>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.F&255);
this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.G&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.H&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.D&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.F>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.G>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.H>>8&255);this.H=this.H&-65281|
a<<8},function(a){a=a.call(this,this.H>>8&255,this.D>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.F&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.G&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.H&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.D&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.F>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,
this.D>>8&255,this.G>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.H>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.D>>8&255);this.D=this.D&-65281|a<<8}],Od=[function(a){a=a.call(this,J(this,this.F),this.F&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.G),this.F&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.H),this.F&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,
this.D),this.F&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,T(this,0)),this.F&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.F&255);O(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.K),this.F&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.F&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.F),this.G&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.G),this.G&
255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.H),this.G&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D),this.G&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,T(this,0)),this.G&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.G&255);O(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.K),this.G&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.G&255);O(this,
a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.F),this.H&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.G),this.H&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.H),this.H&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D),this.H&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,T(this,0)),this.H&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.H&255);O(this,a);this.A-=
this.B.aa},function(a){a=a.call(this,J(this,this.K),this.H&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.H&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.F),this.D&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.G),this.D&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.H),this.D&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D),this.D&255);O(this,a);this.A-=this.B.N},function(a){a=
a.call(this,J(this,T(this,0)),this.D&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.D&255);O(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.K),this.D&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.D&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.F),this.F>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.G),this.F>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,
J(this,this.H),this.F>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D),this.F>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,T(this,0)),this.F>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.F>>8&255);O(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.K),this.F>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.F>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,
J(this,this.F),this.G>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.G),this.G>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.H),this.G>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D),this.G>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,T(this,0)),this.G>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.G>>8&255);O(this,a);this.A-=this.B.aa},function(a){a=a.call(this,
J(this,this.K),this.G>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.G>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.F),this.H>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.G),this.H>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.H),this.H>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D),this.H>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,
J(this,T(this,0)),this.H>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.H>>8&255);O(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.K),this.H>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.H>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.F),this.D>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.G),this.D>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,
J(this,this.H),this.D>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D),this.D>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,T(this,0)),this.D>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.D>>8&255);O(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.K),this.D>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.D>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,
J(this,this.F+this.M()),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+this.M()),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+this.M()),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,T(this,1)+this.M()),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.F&255);O(this,a);this.A-=
this.B.I},function(a){a=a.call(this,J(this,this.K+this.M()),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+this.M()),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+this.M()),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+this.M()),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),
this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,T(this,1)+this.M()),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+this.M()),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+this.M()),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=
a.call(this,J(this,this.G+this.M()),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+this.M()),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,T(this,1)+this.M()),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+this.M()),this.H&255);
O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+this.M()),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+this.M()),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+this.M()),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,
J(this,T(this,1)+this.M()),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+this.M()),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+this.M()),this.F>>8&255);O(this,
a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,T(this,1)+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=
a.call(this,J(this,this.J+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+this.M()),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+this.M()),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+this.M()),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,T(this,1)+this.M()),
this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+this.M()),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.I},
function(a){a=a.call(this,J(this,this.H+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,T(this,1)+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,
this.J+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,T(this,1)+this.M()),this.D>>8&255);O(this,
a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+S(this)),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+S(this)),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,
J(this,this.H+S(this)),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+S(this)),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,T(this,2)+S(this)),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+S(this)),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.F&255);O(this,a);this.A-=
this.B.I},function(a){a=a.call(this,J(this,this.F+S(this)),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+S(this)),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+S(this)),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+S(this)),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,T(this,2)+S(this)),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),
this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+S(this)),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+S(this)),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+S(this)),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+S(this)),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,
J(this,this.D+S(this)),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,T(this,2)+S(this)),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+S(this)),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+S(this)),this.D&255);O(this,a);this.A-=
this.B.I},function(a){a=a.call(this,J(this,this.G+S(this)),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+S(this)),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+S(this)),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,T(this,2)+S(this)),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+S(this)),
this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=
a.call(this,J(this,T(this,2)+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+S(this)),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+S(this)),this.G>>
8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+S(this)),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+S(this)),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,T(this,2)+S(this)),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+S(this)),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=
a.call(this,J(this,this.J+S(this)),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,T(this,2)+S(this)),this.H>>
8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+S(this)),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+S(this)),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=
a.call(this,J(this,this.H+S(this)),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+S(this)),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,T(this,2)+S(this)),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+S(this)),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.D>>
8&255);O(this,a);this.A-=this.B.I},A[192],A[200],A[208],A[216],A[224],A[232],A[240],A[248],A[193],A[201],A[209],A[217],A[225],A[233],A[241],A[249],A[194],A[202],A[210],A[218],A[226],A[234],A[242],A[250],A[195],A[203],A[211],A[219],A[227],A[235],A[243],A[251],A[196],A[204],A[212],A[220],A[228],A[236],A[244],A[252],A[197],A[205],A[213],A[221],A[229],A[237],A[245],A[253],A[198],A[206],A[214],A[222],A[230],A[238],A[246],A[254],A[199],A[207],A[215],A[223],A[231],A[239],A[247],A[255]],Pd=[function(a,b){var c=
a[0].call(this,J(this,this.F),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,this.G),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,this.H),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,this.D),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,T(this,0)),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,S(this)),b.call(this));
O(this,c);this.A-=this.B.aa},function(a,b){var c=a[0].call(this,J(this,this.K),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,J(this,this.F),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,J(this,this.G),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,J(this,this.H),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=
a[1].call(this,J(this,this.D),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,J(this,T(this,0)),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,b){var c=a[1].call(this,J(this,this.K),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,this.F),b.call(this));
O(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,this.G),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,this.H),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,this.D),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,T(this,0)),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,
b){var c=a[2].call(this,J(this,this.K),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,this.F),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,this.G),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,this.H),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,this.D),b.call(this));
O(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,T(this,0)),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,b){var c=a[3].call(this,J(this,this.K),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,J(this,this.F),b.call(this));O(this,c);this.A-=this.B.N},function(a,
b){var c=a[4].call(this,J(this,this.G),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,J(this,this.H),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,J(this,this.D),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,J(this,T(this,0)),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,b){var c=a[4].call(this,J(this,this.K),
b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,J(this,this.F),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,J(this,this.G),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,J(this,this.H),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,J(this,this.D),b.call(this));O(this,c);this.A-=this.B.N},
function(a,b){var c=a[5].call(this,J(this,T(this,0)),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,b){var c=a[5].call(this,J(this,this.K),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,J(this,this.F),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,J(this,
this.G),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,J(this,this.H),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,J(this,this.D),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,J(this,T(this,0)),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,b){var c=a[6].call(this,J(this,this.K),b.call(this));O(this,c);this.A-=
this.B.N},function(a,b){var c=a[6].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,J(this,this.F),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,J(this,this.G),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,J(this,this.H),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,J(this,this.D),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,
J(this,T(this,0)),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,b){var c=a[7].call(this,J(this,this.K),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,this.F+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.G+this.M()),b.call(this));
O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.H+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.D+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,T(this,1)+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,K(this,this.L+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.K+this.M()),b.call(this));
O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.F+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.G+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.H+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.D+this.M()),b.call(this));
O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,T(this,1)+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,K(this,this.L+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.F+this.M()),b.call(this));
O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.G+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.H+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.D+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,T(this,1)+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,K(this,this.L+this.M()),b.call(this));
O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.F+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.G+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.H+this.M()),b.call(this));
O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.D+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,T(this,1)+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,K(this,this.L+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.J+this.M()),b.call(this));
O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.F+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.G+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.H+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.D+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,T(this,1)+this.M()),b.call(this));
O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,K(this,this.L+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.F+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.G+this.M()),b.call(this));
O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.H+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.D+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,T(this,1)+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,K(this,this.L+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.K+this.M()),b.call(this));
O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.F+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.G+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.H+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.D+this.M()),b.call(this));
O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,T(this,1)+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,K(this,this.L+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.F+this.M()),b.call(this));
O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.G+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.H+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.D+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,T(this,1)+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,K(this,this.L+this.M()),b.call(this));
O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.F+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.G+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.H+S(this)),b.call(this));
O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.D+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,T(this,2)+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.J+S(this)),b.call(this));
O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.F+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.G+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.H+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.D+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,T(this,2)+S(this)),b.call(this));
O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.F+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.G+S(this)),b.call(this));O(this,
c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.H+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.D+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,T(this,2)+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.K+S(this)),b.call(this));O(this,
c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.F+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.G+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.H+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.D+S(this)),b.call(this));O(this,c);
this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,T(this,2)+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.F+S(this)),b.call(this));O(this,c);
this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.G+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.H+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.D+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,T(this,2)+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);
this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.F+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.G+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.H+S(this)),b.call(this));O(this,c);this.A-=
this.B.I},function(a,b){var c=a[5].call(this,J(this,this.D+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,T(this,2)+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=
this.B.I},function(a,b){var c=a[6].call(this,J(this,this.F+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.G+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.H+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.D+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,T(this,2)+S(this)),b.call(this));O(this,c);this.A-=
this.B.I},function(a,b){var c=a[6].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.F+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.G+S(this)),b.call(this));O(this,c);this.A-=this.B.I},
function(a,b){var c=a[7].call(this,J(this,this.H+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.D+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,T(this,2)+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.I},
function(a,b){var c=a[7].call(this,J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[0].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[0].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[0].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[0].call(this,this.F>>8&255,b.call(this));this.F=this.F&
-65281|c<<8},function(a,b){var c=a[0].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[0].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[0].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[1].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[1].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[1].call(this,this.H&255,b.call(this));
this.H=this.H&-256|c},function(a,b){var c=a[1].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[1].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[1].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[1].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[1].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[2].call(this,this.F&
255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[2].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[2].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[2].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[2].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[2].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[2].call(this,
this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[2].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[3].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[3].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[3].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[3].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[3].call(this,
this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[3].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[3].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[3].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[4].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[4].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=
a[4].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[4].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[4].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[4].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[4].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[4].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<
8},function(a,b){var c=a[5].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[5].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[5].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[5].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[5].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[5].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|
c<<8},function(a,b){var c=a[5].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[5].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[6].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[6].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[6].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[6].call(this,this.D&255,b.call(this));this.D=this.D&
-256|c},function(a,b){var c=a[6].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[6].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[6].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[6].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[7].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[7].call(this,this.G&255,b.call(this));
this.G=this.G&-256|c},function(a,b){var c=a[7].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[7].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[7].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[7].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[7].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[7].call(this,this.D>>8&
255,b.call(this));this.D=this.D&-65281|c<<8}],B=[function(a){a=a.call(this,this.F&this.C,H(this,this.F));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,this.G));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,this.H));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,this.D));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,T(this,0)));this.F=
this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,S(this)));this.F=this.F&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.F&this.C,H(this,this.K));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,this.J));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,this.F));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,this.G));this.G=this.G&~this.C|
a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,this.H));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,this.D));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,T(this,0)));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,S(this)));this.G=this.G&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.G&this.C,H(this,this.K));this.G=this.G&~this.C|a;this.A-=
this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,this.J));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,H(this,this.F));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,H(this,this.G));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,H(this,this.H));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,H(this,this.D));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=
a.call(this,this.H&this.C,H(this,T(this,0)));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,H(this,S(this)));this.H=this.H&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.H&this.C,H(this,this.K));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,H(this,this.J));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,H(this,this.F));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,
this.D&this.C,H(this,this.G));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,H(this,this.H));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,H(this,this.D));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,H(this,T(this,0)));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,H(this,S(this)));this.D=this.D&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.D&
this.C,H(this,this.K));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,H(this,this.J));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,H(this,this.F));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,H(this,this.G));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,H(this,this.H));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,
H(this,this.D));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,H(this,T(this,0)));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,H(this,S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.aa},function(a){a=a.call(this,q(this)&this.C,H(this,this.K));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,H(this,this.J));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,this.L&
this.C,H(this,this.F));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,H(this,this.G));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,H(this,this.H));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,H(this,this.D));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,H(this,T(this,0)));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,H(this,
S(this)));this.L=this.L&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.L&this.C,H(this,this.K));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,H(this,this.J));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,this.F));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,this.G));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,this.H));
this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,this.D));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,T(this,0)));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,S(this)));this.K=this.K&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.K&this.C,H(this,this.K));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,this.J));this.K=
this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,this.F));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,this.G));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,this.H));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,this.D));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,T(this,0)));this.J=this.J&~this.C|
a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,S(this)));this.J=this.J&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.J&this.C,H(this,this.K));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,this.J));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,this.F+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.G+this.M()));this.F=this.F&
~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.H+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.D+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,T(this,1)+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.L+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,
this.K+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.J+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.F+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.G+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.H+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=
a.call(this,this.G&this.C,H(this,this.D+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,T(this,1)+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.L+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.K+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.J+this.M()));this.G=this.G&~this.C|
a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.F+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.G+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.H+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.D+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,T(this,
1)+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.L+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.K+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.J+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.F+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
this.D&this.C,H(this,this.G+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.H+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.D+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,T(this,1)+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.L+this.M()));this.D=this.D&~this.C|a;this.A-=
this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.K+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.J+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.F+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.G+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.H+this.M()));
t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.D+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,T(this,1)+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,I(this,this.L+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.K+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=
a.call(this,q(this)&this.C,H(this,this.J+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.F+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.G+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.H+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.D+this.M()));this.L=this.L&~this.C|
a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,T(this,1)+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.L+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.K+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.J+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.F+
this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.G+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.H+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.D+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,T(this,1)+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
this.K&this.C,I(this,this.L+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.K+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.J+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.F+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.G+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},
function(a){a=a.call(this,this.J&this.C,H(this,this.H+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.D+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,T(this,1)+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.L+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.K+this.M()));this.J=
this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.J+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.F+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.G+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.H+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,
this.D+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,T(this,2)+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.L+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.K+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.J+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
this.G&this.C,H(this,this.F+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.G+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.H+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.D+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,T(this,2)+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},
function(a){a=a.call(this,this.G&this.C,I(this,this.L+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.K+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.J+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.F+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.G+S(this)));this.H=this.H&
~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.H+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.D+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,T(this,2)+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.L+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,
this.K+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.J+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.F+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.G+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.H+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
this.D&this.C,H(this,this.D+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,T(this,2)+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.L+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.K+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.J+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},
function(a){a=a.call(this,q(this)&this.C,H(this,this.F+S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.G+S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.H+S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.D+S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,T(this,2)+S(this)));
t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,I(this,this.L+S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.K+S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.J+S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.F+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
this.L&this.C,H(this,this.G+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.H+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.D+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,T(this,2)+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.L+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},
function(a){a=a.call(this,this.L&this.C,H(this,this.K+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.J+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.F+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.G+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.H+S(this)));this.K=this.K&
~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.D+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,T(this,2)+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.L+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.K+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,
this.J+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.F+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.G+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.H+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.D+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
this.J&this.C,H(this,T(this,2)+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.L+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.K+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.J+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,this.F&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,
this.F&this.C,this.G&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.H&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.D&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,q(this)&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.L&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.K&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.J&
this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.F&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.G&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.H&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.D&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,q(this)&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.L&this.C);this.G=this.G&
~this.C|a},function(a){a=a.call(this,this.G&this.C,this.K&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.J&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.F&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.G&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.H&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.D&this.C);this.H=this.H&~this.C|a},function(a){a=
a.call(this,this.H&this.C,q(this)&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.L&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.K&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.J&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.F&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.G&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,
this.H&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.D&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,q(this)&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.L&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.K&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.J&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,q(this)&this.C,this.F&this.C);t(this,
q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.G&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.H&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.D&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,q(this)&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.L&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.K&this.C);t(this,q(this)&
~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.J&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,this.L&this.C,this.F&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.G&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.H&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.D&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,q(this)&this.C);this.L=this.L&~this.C|a},function(a){a=
a.call(this,this.L&this.C,this.L&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.K&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.J&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.F&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.G&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.H&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,
this.D&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,q(this)&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.L&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.K&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.J&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.F&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.G&this.C);this.J=
this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.H&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.D&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,q(this)&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.L&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.K&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.J&this.C);this.J=this.J&~this.C|a}],Qd=
[function(a){a=a.call(this,L(this,this.F),this.F&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.F&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.F&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.F&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,T(this,0)),this.F&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),this.F&this.C);P(this,a);this.A-=this.B.aa},
function(a){a=a.call(this,L(this,this.K),this.F&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.F&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.G&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.G&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.G&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.G&this.C);P(this,a);this.A-=this.B.N},
function(a){a=a.call(this,L(this,T(this,0)),this.G&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),this.G&this.C);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,L(this,this.K),this.G&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.G&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.H&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.H&this.C);P(this,a);this.A-=this.B.N},
function(a){a=a.call(this,L(this,this.H),this.H&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.H&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,T(this,0)),this.H&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),this.H&this.C);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,L(this,this.K),this.H&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.H&this.C);P(this,a);this.A-=this.B.N},
function(a){a=a.call(this,L(this,this.F),this.D&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.D&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.D&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.D&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,T(this,0)),this.D&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),this.D&this.C);P(this,a);this.A-=this.B.aa},
function(a){a=a.call(this,L(this,this.K),this.D&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.D&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),q(this)&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),q(this)&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),q(this)&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),q(this)&this.C);P(this,a);this.A-=this.B.N},
function(a){a=a.call(this,L(this,T(this,0)),q(this)&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),q(this)&this.C);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,L(this,this.K),q(this)&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),q(this)&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.L&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.L&this.C);P(this,a);this.A-=
this.B.N},function(a){a=a.call(this,L(this,this.H),this.L&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.L&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,T(this,0)),this.L&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),this.L&this.C);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,L(this,this.K),this.L&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.L&this.C);P(this,a);
this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.K&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.K&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.K&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.K&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,T(this,0)),this.K&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),this.K&this.C);P(this,
a);this.A-=this.B.aa},function(a){a=a.call(this,L(this,this.K),this.K&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.K&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.J&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.J&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.J&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.J&this.C);P(this,
a);this.A-=this.B.N},function(a){a=a.call(this,L(this,T(this,0)),this.J&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),this.J&this.C);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,L(this,this.K),this.J&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.J&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F+this.M()),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),
this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,1)+this.M()),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.F&this.C);P(this,a);this.A-=
this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,
L(this,T(this,1)+this.M()),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.H&this.C);
P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,1)+this.M()),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=
a.call(this,L(this,this.J+this.M()),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,1)+this.M()),
this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.I},
function(a){a=a.call(this,L(this,this.H+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,1)+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,
this.J+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,1)+this.M()),this.L&this.C);
P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=
a.call(this,L(this,this.H+this.M()),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,1)+this.M()),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),
this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,1)+this.M()),this.J&this.C);P(this,a);this.A-=
this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+S(this)),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+S(this)),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,
this.H+S(this)),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,2)+S(this)),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+S(this)),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+S(this)),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),this.F&this.C);P(this,
a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+S(this)),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+S(this)),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+S(this)),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,2)+S(this)),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,
N(this,this.L+S(this)),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+S(this)),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+S(this)),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+S(this)),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+S(this)),this.H&this.C);P(this,
a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,2)+S(this)),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+S(this)),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+S(this)),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,
L(this,this.F+S(this)),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+S(this)),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+S(this)),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,2)+S(this)),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+S(this)),this.D&this.C);
P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+S(this)),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=
a.call(this,L(this,this.D+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,2)+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+S(this)),
this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+S(this)),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+S(this)),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,2)+S(this)),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+S(this)),this.L&this.C);P(this,a);this.A-=this.B.I},
function(a){a=a.call(this,L(this,this.K+S(this)),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+S(this)),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+S(this)),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+S(this)),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),
this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,2)+S(this)),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+S(this)),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+S(this)),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+S(this)),this.J&this.C);P(this,a);this.A-=this.B.I},
function(a){a=a.call(this,L(this,this.G+S(this)),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+S(this)),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,2)+S(this)),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+S(this)),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+
S(this)),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),this.J&this.C);P(this,a);this.A-=this.B.I},B[192],B[200],B[208],B[216],B[224],B[232],B[240],B[248],B[193],B[201],B[209],B[217],B[225],B[233],B[241],B[249],B[194],B[202],B[210],B[218],B[226],B[234],B[242],B[250],B[195],B[203],B[211],B[219],B[227],B[235],B[243],B[251],B[196],B[204],B[212],B[220],B[228],B[236],B[244],B[252],B[197],B[205],B[213],B[221],B[229],B[237],B[245],B[253],B[198],B[206],B[214],
B[222],B[230],B[238],B[246],B[254],B[199],B[207],B[215],B[223],B[231],B[239],B[247],B[255]],Rd=[function(a,b){var c=a[0].call(this,L(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,
T(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[0].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,this.G),b.call(this));P(this,c);this.A-=
this.B.N},function(a,b){var c=a[1].call(this,L(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,T(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[1].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,
L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,T(this,0)),b.call(this));P(this,c);
this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[2].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,
L(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,T(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[3].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.J),b.call(this));P(this,
c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,T(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=
a[4].call(this,L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[4].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.H),b.call(this));
P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,T(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[5].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,
b){var c=a[6].call(this,L(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,T(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,S(this)),
b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[6].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},
function(a,b){var c=a[7].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,T(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[7].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,
this.F+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,T(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,
N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.F+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,
L(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,T(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,
L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.F+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,
L(this,T(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.F+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,
L(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,T(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,
L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.F+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,
L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,T(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,
L(this,this.F+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,T(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,
N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.F+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,
L(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,T(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,
L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.F+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,
L(this,T(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.F+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,
L(this,this.G+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.H+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,T(this,2)+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.L+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,
L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.F+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.G+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.H+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,
this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,T(this,2)+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.L+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,
this.F+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.G+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.H+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,T(this,2)+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,
this.L+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.F+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.G+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.H+
S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,T(this,2)+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.L+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.J+
S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.F+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.G+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.H+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,T(this,2)+
S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.L+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.F+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.G+S(this)),
b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.H+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,T(this,2)+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.L+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.K+S(this)),
b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.F+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.G+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.H+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.D+S(this)),b.call(this));
P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,T(this,2)+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.L+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.F+S(this)),b.call(this));
P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.G+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.H+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,T(this,2)+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.L+S(this)),b.call(this));
P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[0].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[0].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,
b){var c=a[0].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[0].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[0].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[0].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[0].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[1].call(this,this.F&this.C,b.call(this));this.F=
this.F&~this.C|c},function(a,b){var c=a[1].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[1].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[1].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[1].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[1].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[1].call(this,this.K&
this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[1].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[2].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[2].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[2].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[2].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=
a[2].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[2].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[2].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[2].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[3].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[3].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|
c},function(a,b){var c=a[3].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[3].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[3].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[3].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[3].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[3].call(this,this.J&this.C,b.call(this));
this.J=this.J&~this.C|c},function(a,b){var c=a[4].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[4].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[4].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[4].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[4].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[4].call(this,
this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[4].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[4].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[5].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[5].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[5].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,
b){var c=a[5].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[5].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[5].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[5].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[5].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[6].call(this,this.F&this.C,b.call(this));this.F=
this.F&~this.C|c},function(a,b){var c=a[6].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[6].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[6].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[6].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[6].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[6].call(this,this.K&
this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[6].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[7].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[7].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[7].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[7].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=
a[7].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[7].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[7].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[7].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c}],Ae=[function(){return this.F+this.F},function(){return this.G+this.F},function(){return this.H+this.F},function(){return this.D+this.F},function(){this.da=this.ga;return q(this)+
this.F},function(a){return(a?(this.da=this.ga,this.L):this.ia())+this.F},function(){return this.K+this.F},function(){return this.J+this.F},function(){return this.F+this.G},function(){return this.G+this.G},function(){return this.H+this.G},function(){return this.D+this.G},function(){this.da=this.ga;return q(this)+this.G},function(a){return(a?(this.da=this.ga,this.L):this.ia())+this.G},function(){return this.K+this.G},function(){return this.J+this.G},function(){return this.F+this.H},function(){return this.G+
this.H},function(){return this.H+this.H},function(){return this.D+this.H},function(){this.da=this.ga;return q(this)+this.H},function(a){return(a?(this.da=this.ga,this.L):this.ia())+this.H},function(){return this.K+this.H},function(){return this.J+this.H},function(){return this.F+this.D},function(){return this.G+this.D},function(){return this.H+this.D},function(){return this.D+this.D},function(){this.da=this.ga;return q(this)+this.D},function(a){return(a?(this.da=this.ga,this.L):this.ia())+this.D},
function(){return this.K+this.D},function(){return this.J+this.D},function(){return this.F},function(){return this.G},function(){return this.H},function(){return this.D},function(){this.da=this.ga;return q(this)},function(a){return a?(this.da=this.ga,this.L):this.ia()},function(){return this.K},function(){return this.J},function(){return this.F+this.L},function(){return this.G+this.L},function(){return this.H+this.L},function(){return this.D+this.L},function(){this.da=this.ga;return q(this)+this.L},
function(a){return(a?(this.da=this.ga,this.L):this.ia())+this.L},function(){return this.K+this.L},function(){return this.J+this.L},function(){return this.F+this.K},function(){return this.G+this.K},function(){return this.H+this.K},function(){return this.D+this.K},function(){this.da=this.ga;return q(this)+this.K},function(a){return(a?(this.da=this.ga,this.L):this.ia())+this.K},function(){return this.K+this.K},function(){return this.J+this.K},function(){return this.F+this.J},function(){return this.G+
this.J},function(){return this.H+this.J},function(){return this.D+this.J},function(){this.da=this.ga;return q(this)+this.J},function(a){return(a?(this.da=this.ga,this.L):this.ia())+this.J},function(){return this.K+this.J},function(){return this.J+this.J},function(){return this.F+(this.F<<1)},function(){return this.G+(this.F<<1)},function(){return this.H+(this.F<<1)},function(){return this.D+(this.F<<1)},function(){this.da=this.ga;return q(this)+(this.F<<1)},function(a){return(a?(this.da=this.ga,this.L):
this.ia())+(this.F<<1)},function(){return this.K+(this.F<<1)},function(){return this.J+(this.F<<1)},function(){return this.F+(this.G<<1)},function(){return this.G+(this.G<<1)},function(){return this.H+(this.G<<1)},function(){return this.D+(this.G<<1)},function(){this.da=this.ga;return q(this)+(this.G<<1)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.G<<1)},function(){return this.K+(this.G<<1)},function(){return this.J+(this.G<<1)},function(){return this.F+(this.H<<1)},function(){return this.G+
(this.H<<1)},function(){return this.H+(this.H<<1)},function(){return this.D+(this.H<<1)},function(){this.da=this.ga;return q(this)+(this.H<<1)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.H<<1)},function(){return this.K+(this.H<<1)},function(){return this.J+(this.H<<1)},function(){return this.F+(this.D<<1)},function(){return this.G+(this.D<<1)},function(){return this.H+(this.D<<1)},function(){return this.D+(this.D<<1)},function(){this.da=this.ga;return q(this)+(this.D<<1)},function(a){return(a?
(this.da=this.ga,this.L):this.ia())+(this.D<<1)},function(){return this.K+(this.D<<1)},function(){return this.J+(this.D<<1)},function(){return this.F},function(){return this.G},function(){return this.H},function(){return this.D},function(){this.da=this.ga;return q(this)},function(a){return a?(this.da=this.ga,this.L):this.ia()},function(){return this.K},function(){return this.J},function(){return this.F+(this.L<<1)},function(){return this.G+(this.L<<1)},function(){return this.H+(this.L<<1)},function(){return this.D+
(this.L<<1)},function(){this.da=this.ga;return q(this)+(this.L<<1)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.L<<1)},function(){return this.K+(this.L<<1)},function(){return this.J+(this.L<<1)},function(){return this.F+(this.K<<1)},function(){return this.G+(this.K<<1)},function(){return this.H+(this.K<<1)},function(){return this.D+(this.K<<1)},function(){this.da=this.ga;return q(this)+(this.K<<1)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.K<<1)},function(){return this.K+
(this.K<<1)},function(){return this.J+(this.K<<1)},function(){return this.F+(this.J<<1)},function(){return this.G+(this.J<<1)},function(){return this.H+(this.J<<1)},function(){return this.D+(this.J<<1)},function(){this.da=this.ga;return q(this)+(this.J<<1)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.J<<1)},function(){return this.K+(this.J<<1)},function(){return this.J+(this.J<<1)},function(){return this.F+(this.F<<2)},function(){return this.G+(this.F<<2)},function(){return this.H+
(this.F<<2)},function(){return this.D+(this.F<<2)},function(){this.da=this.ga;return q(this)+(this.F<<2)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.F<<2)},function(){return this.K+(this.F<<2)},function(){return this.J+(this.F<<2)},function(){return this.F+(this.G<<2)},function(){return this.G+(this.G<<2)},function(){return this.H+(this.G<<2)},function(){return this.D+(this.G<<2)},function(){this.da=this.ga;return q(this)+(this.G<<2)},function(a){return(a?(this.da=this.ga,this.L):
this.ia())+(this.G<<2)},function(){return this.K+(this.G<<2)},function(){return this.J+(this.G<<2)},function(){return this.F+(this.H<<2)},function(){return this.G+(this.H<<2)},function(){return this.H+(this.H<<2)},function(){return this.D+(this.H<<2)},function(){this.da=this.ga;return q(this)+(this.H<<2)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.H<<2)},function(){return this.K+(this.H<<2)},function(){return this.J+(this.H<<2)},function(){return this.F+(this.D<<2)},function(){return this.G+
(this.D<<2)},function(){return this.H+(this.D<<2)},function(){return this.D+(this.D<<2)},function(){this.da=this.ga;return q(this)+(this.D<<2)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.D<<2)},function(){return this.K+(this.D<<2)},function(){return this.J+(this.D<<2)},function(){return this.F},function(){return this.G},function(){return this.H},function(){return this.D},function(){this.da=this.ga;return q(this)},function(a){return a?(this.da=this.ga,this.L):this.ia()},function(){return this.K},
function(){return this.J},function(){return this.F+(this.L<<2)},function(){return this.G+(this.L<<2)},function(){return this.H+(this.L<<2)},function(){return this.D+(this.L<<2)},function(){this.da=this.ga;return q(this)+(this.L<<2)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.L<<2)},function(){return this.K+(this.L<<2)},function(){return this.J+(this.L<<2)},function(){return this.F+(this.K<<2)},function(){return this.G+(this.K<<2)},function(){return this.H+(this.K<<2)},function(){return this.D+
(this.K<<2)},function(){this.da=this.ga;return q(this)+(this.K<<2)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.K<<2)},function(){return this.K+(this.K<<2)},function(){return this.J+(this.K<<2)},function(){return this.F+(this.J<<2)},function(){return this.G+(this.J<<2)},function(){return this.H+(this.J<<2)},function(){return this.D+(this.J<<2)},function(){this.da=this.ga;return q(this)+(this.J<<2)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.J<<2)},function(){return this.K+
(this.J<<2)},function(){return this.J+(this.J<<2)},function(){return this.F+(this.F<<3)},function(){return this.G+(this.F<<3)},function(){return this.H+(this.F<<3)},function(){return this.D+(this.F<<3)},function(){this.da=this.ga;return q(this)+(this.F<<3)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.F<<3)},function(){return this.K+(this.F<<3)},function(){return this.J+(this.F<<3)},function(){return this.F+(this.G<<3)},function(){return this.G+(this.G<<3)},function(){return this.H+
(this.G<<3)},function(){return this.D+(this.G<<3)},function(){this.da=this.ga;return q(this)+(this.G<<3)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.G<<3)},function(){return this.K+(this.G<<3)},function(){return this.J+(this.G<<3)},function(){return this.F+(this.H<<3)},function(){return this.G+(this.H<<3)},function(){return this.H+(this.H<<3)},function(){return this.D+(this.H<<3)},function(){this.da=this.ga;return q(this)+(this.H<<3)},function(a){return(a?(this.da=this.ga,this.L):
this.ia())+(this.H<<3)},function(){return this.K+(this.H<<3)},function(){return this.J+(this.H<<3)},function(){return this.F+(this.D<<3)},function(){return this.G+(this.D<<3)},function(){return this.H+(this.D<<3)},function(){return this.D+(this.D<<3)},function(){this.da=this.ga;return q(this)+(this.D<<3)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.D<<3)},function(){return this.K+(this.D<<3)},function(){return this.J+(this.D<<3)},function(){return this.F},function(){return this.G},
function(){return this.H},function(){return this.D},function(){this.da=this.ga;return q(this)},function(a){return a?(this.da=this.ga,this.L):this.ia()},function(){return this.K},function(){return this.J},function(){return this.F+(this.L<<3)},function(){return this.G+(this.L<<3)},function(){return this.H+(this.L<<3)},function(){return this.D+(this.L<<3)},function(){this.da=this.ga;return q(this)+(this.L<<3)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.L<<3)},function(){return this.K+
(this.L<<3)},function(){return this.J+(this.L<<3)},function(){return this.F+(this.K<<3)},function(){return this.G+(this.K<<3)},function(){return this.H+(this.K<<3)},function(){return this.D+(this.K<<3)},function(){this.da=this.ga;return q(this)+(this.K<<3)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.K<<3)},function(){return this.K+(this.K<<3)},function(){return this.J+(this.K<<3)},function(){return this.F+(this.J<<3)},function(){return this.G+(this.J<<3)},function(){return this.H+
(this.J<<3)},function(){return this.D+(this.J<<3)},function(){this.da=this.ga;return q(this)+(this.J<<3)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.J<<3)},function(){return this.K+(this.J<<3)},function(){return this.J+(this.J<<3)}];
function Wg(a){Ha.call(this,"ChipSet",a,Wg);this.na=(this.na=a.model)&&Xg[this.na]||Yg;this.$b=0;var b=a.sw1;if(b)this.$b=Zg(b,$g|ah.Tn);else{this.ee=[360,360];(b=a.floppies)&&b.length&&(this.ee=b);if(b=this.ee.length)this.$b|=bh.Kj,b--,this.$b|=(b&3)<<bh.rg;if(b=a.monitor||(this.na<ch?"mono":"ega"),void 0!==dh[b])this.$b|=dh[b]<<ah.rg}this.Oe=Zg(a.sw2||"11110000",0);this.Bp=this.na==Yg?16:64;this.Qh=this.Eg=1;this.na>=ch&&(this.Qh=this.Eg=2);this.te=a.scaleTimers||!1;this.wr=a.rtcDate;this.Sm=!1;
a.sound&&(this.ck=this.Ig=null,window&&(this.ck=window.AudioContext||window.webkitAudioContext),this.ck&&(this.Ig=new this.ck));this.reset(!0);Ya(this)}Pa(Wg);var Yg=5150,ch=5170,Xg={5150:Yg,5160:5160,5170:ch,deskpro386:5180},dh={none:0,tv:1,color:2,mono:3,ega:0,vga:0},bh={Kj:1,ONE:0,Es:64,Cs:128,$r:192,qg:192,rg:6},$g=12,ah={Ds:16,Sr:32,Tn:48,qg:48,rg:4};f=Wg.prototype;
f.Kb=function(a,b,c){switch(b){case "sw1":return this.qa[b]=c,eh(this,b,c,this.$b,{0:this.na==Yg?"Bootable Floppy Drive":"Loop on POST",1:this.na==Yg?"Reserved":"Coprocessor",2:"Base Memory Size",4:"Monitor Type",6:"Number of Floppy Drives"}),!0;case "sw2":if(this.na==Yg)return this.qa[b]=c,eh(this,b,c,this.Oe,{0:"Expansion Memory Size",4:"Reserved"}),!0;break;case "swdesc":return this.qa[b]=c,!0}return!1};
f.Jc=function(a,b,c,d){this.la=b;this.W=c;this.Sa=d;this.za=a;this.Da=fb(a,"Keyboard");this.lj=c.R.zd/1193181;Sb(b,this,fh);Ub(b,this,gh);this.na<ch?(Sb(b,this,hh),Ub(b,this,ih)):(Sb(b,this,jh),Ub(b,this,kh))};f.fc=function(a,b){if(!b)if(!a)this.reset();else if(!this.restore(a))return!1;return!0};f.ec=function(a){return a&&this.save?this.save():!0};
f.reset=function(a){var b;this.md=this.$b;this.vf=this.Oe;lh(this);this.$a=Array(this.Qh);for(b=0;b<this.Qh;b++)mh(this,b);this.ac=Array(this.Eg);nh(this,0,32);1<this.Eg&&nh(this,1,160);this.xm=this.Vj=null;this.Tb=Array(5180==this.na?6:3);for(b=0;b<this.Tb.length;b++)oh(this,b);this.Dg=this.Wj=this.Fc=this.Nh=null;this.Mh=0;if(this.na>=ch){this.ab=16;this.Id=0;this.qd=16;this.Hh=0;this.Jd=160;512<=ph(this)&&(this.Jd|=16);3==qh(this)&&(this.Jd|=64);5180==this.na&&(this.Jd|=12);this.Ih=3;this.yb=Array(8);
this.Hf=0;a&&(this.ea=Array(64));rh(this,this.wr);for(a=21;24>=a;a++)this.ea[a]=0;for(a=14;46>a;a++)void 0===this.ea[a]&&(this.ea[a]=0);this.ea[20]=this.md&(ah.qg|2|bh.Kj|bh.qg);this.ea[16]=sh(this,0)<<4|sh(this,1);th(this)}};
function rh(a,b){var c=b?new Date(b):new Date;"[object Date]"!==Object.prototype.toString.call(c)||isNaN(c.getTime())?(c=new Date,a.oc("CMOS date invalid ("+b+"), using "+c)):b&&a.oc("CMOS date: "+c);a.ea[0]=c.getSeconds();a.ea[1]=0;a.ea[2]=c.getMinutes();a.ea[3]=0;a.ea[4]=c.getHours();a.ea[5]=0;a.ea[6]=c.getDay()+1;a.ea[7]=c.getDate();a.ea[8]=c.getMonth()+1;c=c.getFullYear();a.ea[9]=c%100;c/=100;a.ea[50]=c%10|c/10<<4;a.ea[10]=38;a.ea[11]=2;a.ea[12]=0;a.ea[13]=128;a.fh=a.cg=0;a.rn=a.jj=null}
function yh(a){var b;void 0===b&&(b=a.jj);a.cg=Cc(a.W,a.te)+b;a.ea[11]&64&&zc(a.W,b)}function th(a){for(var b=0,c=16;46>c;c++)b+=a.ea[c];a.ea[47]=b&255;a.ea[46]=b>>8}
f.save=function(){var a=new Yd(this);a.set(0,[this.$b,this.Oe,this.md,this.vf]);for(var b=[],c=0;c<this.$a;c++){for(var d=this.$a[c],e=d,m=[],n=0;n<e.Db.length;n++){var p=e.Db[n];m[n]=[p.Sd,p.Dh,p.bc,p.Wa,p.Ya,p.mode,p.Oh,p.rr,p.tr]}b[c]=[d.ke,d.Tj,d.ym,d.Fb,m]}a.set(1,[b]);b=[];for(c=0;c<this.ac.length;c++)d=this.ac[c],b[c]=[d.$g,d.cd,d.Vd,d.rd,d.Vb,d.Oc,d.Ue,d.Cg];a.set(2,[b]);b=[];for(c=0;c<this.Tb.length;c++)d=this.Tb[c],b[c]=[d.bc,d.Hc,d.Ya,d.bf,d.Am,d.mode,d.Bj,d.oe,d.af,d.xd,d.Pg,d.ff,d.Ud];
a.set(3,[this.Vj,b,this.xm]);a.set(4,[this.Nh,this.Fc,this.Wj,this.Dg,this.Mh]);this.na>=ch&&(a.set(5,[this.ab,this.Id,this.qd,this.Hh,this.Jd,this.Ih]),a.set(6,[this.yb[7],this.yb,this.Hf,this.ea,this.fh,this.cg]));return a.data()};
f.restore=function(a){var b,c;b=a[0];this.$b=b[0];this.Oe=b[1];this.md=b[2];this.vf=b[3];b=a[1];for(c=0;c<this.Qh;c++)mh(this,c,1==b.length?b[0][c]:b);b=a[2];for(c=0;c<this.Eg;c++)nh(this,c,0===c?32:160,b[0][c]);b=a[3];this.Vj=b[0];this.xm=b[2];for(c=0;c<this.Tb.length;c++)oh(this,c,b[1][c]);b=a[4];this.Nh=b[0];this.Fc=b[1];this.Wj=b[2];this.Dg=b[3];this.Mh=b[4];if(b=a[5])this.ab=b[0],this.Id=b[1],this.qd=b[2],this.Hh=b[3],this.Jd=b[4],this.Ih=b[5];if(b=a[6])this.yb=b[1],this.yb[7]=b[0],this.Hf=b[2],
this.ea=b[3],this.fh=b[4],this.cg=b[5],rh(this);return!0};var zh=[0,null,null,0,Array(4)];function mh(a,b,c){var d=a.$a[b];d||(d={Db:Array(4)});c=c&&5==c.length?c:zh;d.ke=c[0];d.Tj=c[1];d.ym=c[2];d.Fb=c[3];d.Lp=b<<2;for(var e=0;e<d.Db.length;e++)Ah(d,e,c[4][e]);a.$a[b]=d}var Bh=[!0,[0,0],[0,0],[0,0],[0,0]];
function Ah(a,b,c){var d=a.Db[b];d||(d={Dh:[0,0],bc:[0,0],Wa:[0,0],Ya:[0,0]});c=c&&8==c.length?c:Bh;d.Sd=c[0];d.Dh[0]=c[1][0];d.Dh[1]=c[1][1];d.bc[0]=c[2][0];d.bc[1]=c[2][1];d.Wa[0]=c[3][0];d.Wa[1]=c[3][1];d.Ya[0]=c[4][0];d.Ya[1]=c[4][1];d.mode=c[5];d.Oh=c[6];d.V=a;d.bn=b;Ch(d,c[8],c[9]);a.Db[b]=d}function Ch(a,b,c,d){"string"==typeof b&&(b=Ra(b));b&&(a.Yh=null,a.rr=b.id,a.tr=c,a.Wh=b,a.uk=b[c],a.mj=d)}var Dh=[0,Array(4)];
function nh(a,b,c,d){var e=a.ac[b];e||(e={cd:[null,null,null,null]});d=d&&8==d.length?d:Dh;e.port=c;e.kt=b<<3;e.$g=d[0];e.cd[0]=d[1][0];e.cd[1]=d[1][1];e.cd[2]=d[1][2];e.cd[3]=d[1][3];e.Vd=d[2];e.rd=d[3];e.Vb=d[4];e.Oc=d[5];e.Ue=d[6];e.Cg=d[7];a.ac[b]=e}var Eh=[[0,0],[0,0],[0,0],[0,0]];
function oh(a,b,c){var d=a.Tb[b];d||(d={bc:[0,0],Hc:[0,0],Ya:[0,0],bf:[0,0]});c=c&&13==c.length?c:Eh;d.bc[0]=c[0][0];d.bc[1]=c[0][1];d.Hc[0]=c[1][0];d.Hc[1]=c[1][1];d.Ya[0]=c[2][0];d.Ya[1]=c[2][1];d.bf[0]=c[3][0];d.bf[1]=c[3][1];d.Am=c[4];d.mode=c[5];d.Bj=c[6];d.oe=c[7];d.af=c[8];d.xd=c[9];d.Pg=c[10];d.ff=c[11];d.Ud=c[12];a.Tb[b]=d}function ph(a,b){return((((b?a.$b:a.md)&12)>>2)+1)*a.Bp+32*((b?a.Oe:a.vf)&15)}function Fh(a,b){var c=b?a.$b:a.md;return a.na!=Yg||c&bh.Kj?((c&bh.qg)>>bh.rg)+1:0}
function sh(a,b){if(b<Fh(a)){if(!a.ee)return 1;if(b<a.ee.length)switch(a.ee[b]){case 160:case 180:case 320:case 360:return 1;case 720:return 3;case 1200:return 2;case 1440:return 4}}return 0}function qh(a,b){return((b?a.$b:a.md)&ah.qg)>>ah.rg}
function eh(a,b,c,d,e){for(var m="",n=1;8>=n;n++){var p="pcjs-bitCell";n||(p+=" pcjs-bitCellLeft");m+='<div id="'+(b+"-"+n)+'" class="'+p+'" data-value="0">'+n+"</div>\n"}c.innerHTML=m;b=Wa(c,"pcjs-bitCell");c=null;for(n=0;n<b.length;n++)null!=e&&null!=e[n]&&(c=e[n]),c&&b[n].setAttribute("title",c),Gh(b[n],d&1<<n?!1:!0),b[n].onclick=function(a,b){return function(){var c="1"!=b.getAttribute("data-value");Gh(b,c);var d=b.getAttribute("id").split("-"),e=1<<+d[1]-1;switch(d[0]){case "sw1":a.$b=a.$b&~e|
(c?0:e);break;case "sw2":a.Oe=a.Oe&~e|(c?0:e)}lh(a)}}(a,b[n])}function Gh(a,b){a.setAttribute("data-value",b?"1":"0");a.style.color=b?"#ffffff":"#000000";a.style.backgroundColor=b?"#000000":"#ffffff"}function lh(a){var b=a.qa.swdesc,c={0:"Enhanced Color",1:"TV",2:"Color",3:"Monochrome"};if(null!=b){var d;d=""+(ph(a,!0)+"Kb");d+=", "+c[qh(a,!0)]+" Monitor";d+=", "+Fh(a,!0)+" Floppy Drives";if(null!=a.md&&a.md!=a.$b||null!=a.vf&&a.vf!=a.Oe)d+=" (Reset required)";b.textContent=d}}
function Hh(a,b,c){a=a.$a[b];var d=a.Db[c],e=d.Wa[a.Fb];a.Fb^=1;b||0!=c||a.Fb||(d.Wa[0]++,255<d.Wa[0]&&(d.Wa[0]=0,d.Wa[1]++,255<d.Wa[1]&&(d.Wa[1]=0)));return e}function Ih(a,b,c,d){a=a.$a[b];c=a.Db[c];c.Wa[a.Fb]=c.Dh[a.Fb]=d;a.Fb^=1}function Jh(a,b,c){a=a.$a[b];var d=a.Db[c],e=d.Ya[a.Fb];a.Fb^=1;b||0!=c||a.Fb||(d.Ya[0]--,0>d.Ya[0]&&(d.Ya[0]=255,d.Ya[1]--,0>d.Ya[1]&&(d.Ya[1]=255)));return e}function Kh(a,b,c,d){a=a.$a[b];c=a.Db[c];c.Ya[a.Fb]=c.bc[a.Fb]=d;a.Fb^=1}
function Lh(a,b){var c=a.$a[b],d=c.ke|1;c.ke&=-16;return d}function Mh(a,b,c){a=a.$a[b];b=c&3;a.ke=a.ke&~(16<<b)|(c&4)<<b+2;a.ym=c}function Nh(a,b,c){b=a.$a[b];var d=c&3,e=b.Db[d];e.Sd=!!(c&4);e.Sd||Oh(a,b.Lp+d)}function Ph(a,b){for(var c=a.$a[b],d=0;d<c.Db.length;d++)Ah(c,d)}function Qh(a,b,c){return a.$a[b].Db[c].Oh}function Rh(a,b,c,d){a.$a[b].Db[c].Oh=d}function Sh(a,b,c,d,e){Ch(a.$a[b>>2].Db[b&3],c,d,e)}
function Oh(a,b,c){b=a.$a[b>>2].Db[b&3];b.Wh&&b.uk&&b.mj?(c&&(b.Yh=c),b.Sd||Ee(a,b,!0)):c&&c(!0)}function Ee(a,b,c){c&&(b.count=b.Ya[1]<<8|b.Ya[0],b.type=b.mode&12,b.Vm=b.wd=!1);for(var d=!1;0<=b.count&&(c=b.Oh<<16|b.Wa[1]<<8|b.Wa[0],4==b.type?(d=!0,function(c){b.uk.call(b.Wh,b.mj,-1,function(m,n){0>m&&(b.Vm||(b.Vm=!0),m=255);b.Sd||a.la.Me(c,m);(d=n)&&setTimeout(function(){Th(b)||Ee(a,b)},0)})}(c)):8==b.type?(c=a.la.vc(c),0>b.uk.call(b.Wh,b.mj,c)&&(b.wd=!0)):0!=b.type&&(b.wd=!0)),!d&&!Th(b););}
function Th(a){if(!a.wd&&0<=--a.count&&(a.mode&32?(a.Wa[0]--,0>a.Wa[0]&&(a.Wa[0]=255,a.Wa[1]--,0>a.Wa[1]&&(a.Wa[1]=255))):(a.Wa[0]++,255<a.Wa[0]&&(a.Wa[0]=0,a.Wa[1]++,255<a.Wa[1]&&(a.Wa[1]=0))),!a.Sd))return!1;var b=a.V;b.ke=b.ke&~(16<<a.bn)|1<<a.bn;a.mode&16||(a.Sd=!0,a.Wh=a.mj=null);a.Yh&&(a.Yh(!a.wd),a.Yh=null);return!0}function Uh(a,b){var c=0,d=a.ac[b];if(null!=d.Cg)switch(d.Cg&3){case 2:c=d.Vb;break;case 3:c=d.Oc}return c}
function Vh(a,b,c){var d=a.ac[b];if(c&16)d.Vd=0,d.cd[d.Vd++]=c,d.rd=0,d.Ue=7,d.Vb=d.Oc=0,d.Cg=10;else if(c&8)c&100&&a.wa("PIC"+b+"("+ea(d.port)+"): unsupported OCW3 command: "+ea(c)),d.Cg=c;else{var e=c&224;if(e&32){var m,n=0;if(96==(e&96))n=1<<(c&7);else for(m=d.Ue+1;;){m&=7;var p=1<<m;if(d.Oc&p){n=p;break}if(m++==d.Ue)break}d.Oc&n&&(d.Oc&=~n,Wh(a));e&128&&a.wa("PIC"+b+"("+ea(d.port)+"): unsupported OCW2 rotate command: "+ea(c))}else 192==e?d.Ue=c&7:a.wa("PIC"+b+"("+ea(d.port)+"): unsupported OCW2 automatic EOI command: "+
ea(c))}}function Xh(a,b,c){var d=a.ac[b];d.Vd<d.cd.length?(d.cd[d.Vd++]=c,2==d.Vd&&d.cd[0]&2&&d.Vd++,3!=d.Vd||d.cd[0]&1||d.Vd++):(d.rd=c,d=a.W,d.Q|=4,Wh(a,b||253!=c?0:6))}function Yh(a,b,c){var d=a.ac[b>>3];b=1<<(b&7);d.Vb&b||(d.Vb|=b,d.$g=c||0,Wh(a))}function Zh(a,b){var c=a.ac[b>>3],d=1<<(b&7);c.Vb&d&&(c.Vb&=~d,Wh(a))}
function Wh(a,b){var c,d=-1;1<a.Eg&&(c=a.ac[1],d=~(c.Oc|c.rd)&c.Vb);c=a.ac[0];0<=d&&(c.Vb=d?c.Vb|4:c.Vb&-5);var d=~(c.Oc|c.rd)&c.Vb,e=a.W;e.fa&&(e.kb=d?e.kb|1:e.kb&-2);d&&b&&(c.$g=b)}function Ce(a,b){void 0===b&&(b=0);var c=-1,d=a.ac[b];if(d.$g)c=-2,d.$g--;else for(var e=d.Vb&((d.Oc|d.rd)^255),m=d.Ue+1;;){var m=m&7,n=1<<m;if(e&n){c=b||2!=m?d.cd[1]+m:Ce(a,1);0<=c&&(d.Oc|=n,d.Vb&=~n);break}if(m++==d.Ue)break}return c}
function $h(a,b){var c=a.Tb[b];c.oe==c.af&&ai(a,b);if(c.Pg)return c.bf[c.oe++];bi(a,b);return c.Ya[c.oe++]}function ci(a,b,c){var d=a.Tb[b];d.oe==d.af&&ai(a,b);d.bc[d.oe++]=c;d.oe==d.af&&(d.ff&&0!=d.mode&&8!=d.mode||(d.Pg=!1,d.Ya[0]=d.Hc[0]=d.bc[0],d.Ya[1]=d.Hc[1]=d.bc[1],d.Ud=Cc(a.W,a.te),d.ff=!0,d.xd=0!=d.mode,0==b&&(Zh(a,0),c=di(a,0)*a.lj|0,6==d.mode&&(c>>=1),zc(a.W,c))),2==b&&Dc(a))}f=Wg.prototype;f.kp=function(){return null};
f.Mq=function(a,b){this.Vj=b;var c=(b&192)>>6;if(3!=c){var d=b&1,e=b&14,m=b&48;if(m){var n=this.Tb[c];n.Bj=m;n.mode=e;n.Am=d;n.bc=[0,0];n.Ya=[0,0];n.bf=[0,0];n.xd=!1;n.Pg=!1;n.ff=!1;ai(this,c);0==c&&Zh(this,0);2==c&&255==this.ac[0].rd&&77==this.Fc&&(c=this.Tb[0],c.Hc[0]=c.bc[0],c.Hc[1]=c.bc[1],c.Ud=Cc(this.W,this.te))}else bi(this,c),d=this.Tb[c],d.bf[0]=d.Ya[0],d.bf[1]=d.Ya[1],d.Pg=!0,ai(this,c)}};function di(a,b){var c=a.Tb[b],d=c.bc[1]<<8|c.bc[0];d||(d=1==c.af?256:65536);return d}
function Fc(a,b){var c=a.Tb[b],d=c.Hc[1]<<8|c.Hc[0];d||(d=1==c.af?256:65536);return d}function ai(a,b){var c=a.Tb[b];c.oe=32==c.Bj?1:0;c.af=48==c.Bj?2:1}
function bi(a,b,c){var d=a.Tb[b];if(d.ff&&(2!=b||a.Fc&1)){var e=Cc(a.W,a.te),m=(e-d.Ud)/a.lj|0;0>m&&(d.Ud=e,m=0);var n=di(a,b),p=Fc(a,b)-m;0==d.mode?(0>=p&&(p=0),p||(d.xd=!0,d.ff=!1,b||Yh(a,0))):4==d.mode?(d.xd=1!=p,0>=p&&(p=n+p,0>=p&&(p=n),d.Hc[0]=p&255,d.Hc[1]=p>>8,d.Ud=e,!b&&d.xd&&Yh(a,0))):6==d.mode&&(p-=m,0>=p&&(d.xd=!d.xd,p=n+p,0>=p&&(p=n),d.Hc[0]=p&255,d.Hc[1]=p>>8,d.Ud=e,!b&&d.xd&&Yh(a,0)));d.Ya[0]=p&255;d.Ya[1]=p>>8;c&&(a.Ud=0)}return d}
function Ec(a,b){for(var c=0;c<a.Tb.length;c++)bi(a,c,b);if(a.na>=ch){var c=a.W.R.zd,d=Cc(a.W,a.te);null==a.jj&&(a.fh=Cc(a.W,a.te),a.rn=1024,a.jj=Math.floor(a.W.R.zd/a.rn),yh(a));d>=a.cg&&(a.ea[12]|=64,a.ea[11]&64&&(a.ea[12]|=128,Yh(a,8)),a.cg=d+a.jj);a.ea[0]==a.ea[1]&&a.ea[2]==a.ea[3]&&a.ea[4]==a.ea[5]&&(a.ea[12]|=32,a.ea[11]&32&&(a.ea[12]|=128,Yh(a,8)));var e=d-a.fh,m=Math.floor(e/c);if(m&&!(a.ea[11]&128)){for(;m--;)if(60<=++a.ea[0]&&(a.ea[0]=0,60<=++a.ea[2]&&(a.ea[2]=0,24<=++a.ea[4]))){a.ea[4]=
0;a.ea[6]=a.ea[6]%7+1;var n;n=a.ea[9];var p=na[a.ea[8]-1];28==p&&0===n%4&&(n%100||0===n%400)&&p++;n=p;++a.ea[7]>n&&(a.ea[7]=1,12<++a.ea[8]&&(a.ea[8]=1,a.ea[9]=(a.ea[9]+1)%100))}a.ea[12]|=16;a.ea[11]&16&&(a.ea[12]|=128,Yh(a,8))}a.fh=d-e%c}}f.lp=function(){var a=this.Nh;if(this.Dg&16)if(this.Fc&128)a=this.md;else if(this.Da){var a=this.Da,b=0;a.Ub.length&&(b=a.Ub[0]);a=b}return a};f.Nq=function(a,b){this.Nh=b};f.mp=function(){return this.Fc};
f.Oq=function(a,b){ei(this,b);this.Da&&fi(this.Da,b&128?!1:!0,b&64?!0:!1)};function ei(a,b){var c=!!(b&2),d=!!(a.Fc&2);a.Fc=b;c!=d&&Dc(a,c)}f.np=function(){var a=0,a=this.na==Yg?this.Fc&4?a|this.vf&15:a|this.vf>>4&1:this.Fc&8?a|this.md>>4:a|this.md&15;this.Fc&1&&bi(this,2).xd&&(a=this.Fc&2?a|32:a|16);return a};f.Pq=function(a,b){this.Wj=b};f.op=function(){return this.Dg};f.Qq=function(a,b){this.Dg=b};f.Bo=function(){var a=this.Hh;this.ab&=-258;this.Da&&gi(this.Da);return a};
f.aq=function(a,b){if(this.ab&8)switch(this.Id){case 96:hi(this,b);break;case 209:ii(this,b);break;default:if(hi(this,this.qd&-17),this.Da){var c=-1;switch(b){case 255:c=250,ji(this.Da)}ki(this,c)}}this.Id=b;this.ab&=-9};f.Co=function(){return this.Fc&-209|(Cc(this.W)&64?16:0)};f.bq=function(a,b){ei(this,b)};f.Do=function(){var a=this.ab&255;this.ab&256&&(this.ab|=1,this.ab&=-257);return a};
f.$p=function(a,b){this.Id=b;this.ab|=8;var c=0;240<=this.Id&&(c=this.Id^15,this.Id=240);switch(this.Id){case 32:ki(this,this.qd);break;case 173:hi(this,this.qd|16);break;case 174:hi(this,this.qd&-17);this.Da&&gi(this.Da);break;case 170:this.Da&&(this.Da.Ub=[]);hi(this,this.qd|16);ki(this,85);ii(this,3);break;case 171:ki(this,0);break;case 192:ki(this,this.Jd);break;case 208:ki(this,this.Ih);break;case 224:ki(this,this.qd&16?0:1);break;case 240:c&1&&Dd(this.W)}};
function hi(a,b){a.qd=b;a.ab=a.ab&-5|b&4;a.Da&&fi(a.Da,!!(b&8),!(b&16))}function ki(a,b,c){0<=b&&(a.Hh=b,c?a.ab|=1:(a.ab&=-2,a.ab|=256))}function ii(a,b){a.Ih=b;Hb(a.la,!!(b&2));b&1||Dd(a.W)}function li(a,b){a.na<ch?Yh(a,1,4):a.qd&16||a.ab&257||(ki(a,b,!0),mi(a.Da),Yh(a,1,120))}f.Ro=function(){return this.Hf};f.pq=function(a,b){this.Hf=b;this.Mh=b&128?0:128};
f.So=function(a,b){var c=this.Hf&63,d;if(13>=c)if(d=this.ea[c],10>c){var e=!1;4!=c&&5!=c||this.ea[11]&2||(d=12>d?d?d:12:(d-=12)?d+128:140,e=!0);this.ea[11]&4||(e&&128<d&&(d-=48),d=d%10|d/10<<4)}else 10==c&&(this.ea[c]^=128);else d=this.ea[c];null!=b&&12==c&&(this.ea[c]&=15,d&128&&Zh(this,8),d&64&&this.ea[11]&64&&yh(this));return d};
f.qq=function(a,b){var c=this.Hf&63,d=b^this.ea[c],e;if(13>=c){if(e=b,10>c){var m=!1;this.ea[11]&4||(e=10*(e>>4)+(e&15),m=!0);if(4==c||5==c)m&&23<e&&(e+=48),this.ea[11]&2||(12>=e?e=12==e?0:e:(e-=116,e=24==e?12:e))}}else e=b;this.ea[c]=e;11==c&&d&64&&b&64&&yh(this)};f.Lq=function(a,b){this.Mh=b};f.rq=function(){};f.sq=function(){};function Zg(a,b){if(void 0===a)return b;for(var c=0,d=1,e=0;e<a.length;e++)"0"==a.charAt(e)&&(c|=d),d<<=1;return c}
function Dc(a,b){if(a.Ig)try{void 0!==b?a.Sm=b:b=a.Sm&&a.W&&a.W.ha.Pb;var c=Math.round(1193181/di(a,2));if(20>c||2E4<c)b=!1;b?a.ic?a.ic.frequency.value=c:(a.ic=a.Ig.createOscillator(),a.ic&&(a.ic.type="number"==typeof a.ic.type?1:"square",a.ic.connect(a.Ig.destination),a.ic.frequency.value=c,"start"in a.ic?a.ic.start(0):a.ic.noteOn(0))):a.ic&&("stop"in a.ic?a.ic.stop(0):a.ic.noteOff(0),a.ic.disconnect(),delete a.ic)}catch(d){a.wa("AudioContext exception: "+d.message),a.Ig=null}else b&&a.nc("BEEP",
8388608)}
var fh={0:function(){return Hh(this,0,0)},1:function(){return Jh(this,0,0)},2:function(){return Hh(this,0,1)},3:function(){return Jh(this,0,1)},4:function(){return Hh(this,0,2)},5:function(){return Jh(this,0,2)},6:function(){return Hh(this,0,3)},7:function(){return Jh(this,0,3)},8:function(){return Lh(this,0)},32:function(){return Uh(this,0)},33:function(){return this.ac[0].rd},64:function(){return $h(this,0)},65:function(){return $h(this,1)},66:function(){return $h(this,2)},67:Wg.prototype.kp,129:function(){return Qh(this,
0,2)},130:function(){return Qh(this,0,3)},131:function(){return Qh(this,0,1)},135:function(){return Qh(this,0,0)}},hh={96:Wg.prototype.lp,97:Wg.prototype.mp,98:Wg.prototype.np,99:Wg.prototype.op},jh={96:Wg.prototype.Bo,97:Wg.prototype.Co,100:Wg.prototype.Do,112:Wg.prototype.Ro,113:Wg.prototype.So,128:function(){return this.yb[7]},132:function(){return this.yb[0]},133:function(){return this.yb[1]},134:function(){return this.yb[2]},136:function(){return this.yb[3]},137:function(){return Qh(this,1,2)},
138:function(){return Qh(this,1,3)},139:function(){return Qh(this,1,1)},140:function(){return this.yb[4]},141:function(){return this.yb[5]},142:function(){return this.yb[6]},143:function(){return Qh(this,1,0)},160:function(){return Uh(this,1)},161:function(){return this.ac[1].rd},192:function(){return Hh(this,1,0)},194:function(){return Jh(this,1,0)},196:function(){return Hh(this,1,1)},198:function(){return Jh(this,1,1)},200:function(){return Hh(this,1,2)},202:function(){return Jh(this,1,2)},204:function(){return Hh(this,
1,3)},206:function(){return Jh(this,1,3)},208:function(){return Lh(this,1)}},gh={0:function(a,b){Ih(this,0,0,b)},1:function(a,b){Kh(this,0,0,b)},2:function(a,b){Ih(this,0,1,b)},3:function(a,b){Kh(this,0,1,b)},4:function(a,b){Ih(this,0,2,b)},5:function(a,b){Kh(this,0,2,b)},6:function(a,b){Ih(this,0,3,b)},7:function(a,b){Kh(this,0,3,b)},8:function(a,b){this.$a[0].Tj=b},9:function(a,b){Mh(this,0,b)},10:function(a,b){Nh(this,0,b)},11:function(a,b){this.$a[0].Db[b&3].mode=b},12:function(){this.$a[0].Fb=
0},13:function(){Ph(this,0)},32:function(a,b){Vh(this,0,b)},33:function(a,b){Xh(this,0,b)},64:function(a,b){ci(this,0,b)},65:function(a,b){ci(this,1,b)},66:function(a,b){ci(this,2,b)},67:Wg.prototype.Mq,129:function(a,b){Rh(this,0,2,b)},130:function(a,b){Rh(this,0,3,b)},131:function(a,b){Rh(this,0,1,b)},135:function(a,b){Rh(this,0,0,b)}},ih={96:Wg.prototype.Nq,97:Wg.prototype.Oq,98:Wg.prototype.Pq,99:Wg.prototype.Qq,160:Wg.prototype.Lq},kh={96:Wg.prototype.aq,97:Wg.prototype.bq,100:Wg.prototype.$p,
112:Wg.prototype.pq,113:Wg.prototype.qq,128:function(a,b){this.yb[7]=b},132:function(a,b){this.yb[0]=b},133:function(a,b){this.yb[1]=b},134:function(a,b){this.yb[2]=b},136:function(a,b){this.yb[3]=b},137:function(a,b){Rh(this,1,2,b)},138:function(a,b){Rh(this,1,3,b)},139:function(a,b){Rh(this,1,1,b)},140:function(a,b){this.yb[4]=b},141:function(a,b){this.yb[5]=b},142:function(a,b){this.yb[6]=b},143:function(a,b){Rh(this,1,0,b)},160:function(a,b){Vh(this,1,b)},161:function(a,b){Xh(this,1,b)},192:function(a,
b){Ih(this,1,0,b)},194:function(a,b){Kh(this,1,0,b)},196:function(a,b){Ih(this,1,1,b)},198:function(a,b){Kh(this,1,1,b)},200:function(a,b){Ih(this,1,2,b)},202:function(a,b){Kh(this,1,2,b)},204:function(a,b){Ih(this,1,3,b)},206:function(a,b){Kh(this,1,3,b)},208:function(a,b){this.$a[1].Tj=b},210:function(a,b){Mh(this,1,b)},212:function(a,b){Nh(this,1,b)},214:function(a,b){this.$a[1].Db[b&3].mode=b},216:function(){this.$a[1].Fb=0},218:function(){Ph(this,1)},240:Wg.prototype.rq,241:Wg.prototype.sq};
Da(function(){for(var a=Wa(window.document,"pcjs","chipset"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),d=new Wg(d);Va(d,c);lh(d)}});
function ni(a){Ha.call(this,"ROM",a,ni);this.Eb=null;this.Rj=a.addr;this.mg=a.size;this.zg=a.alias;this.sh=a.file;this.sr=fa(this.sh);this.we=a.notify;this.lm=null;if(this.we&&(a=this.we.indexOf("["),0<a)){try{this.lm=eval(this.we.substr(a))}catch(b){}this.we=this.we.substr(0,a)}if(this.sh){a=this.sh;var c=ga(this.sr);"json"!=c&&"hex"!=c&&(a=ra()+"/api/v1/dump?file="+this.sh+"&format=bytes&decimal=true");qa(a,!0,null,this,ni.prototype.Wp)}}Pa(ni);
ni.prototype.Jc=function(a,b,c,d){this.la=b;this.W=c;this.Sa=d;oi(this)};ni.prototype.fc=function(){this.Qj&&(this.Sa&&this.Sa.Ns(this.Rj,this.mg,this.Qj),delete this.Qj);return!0};ni.prototype.ec=function(){return!0};
ni.prototype.Wp=function(a,b,c){if(c)this.wa("Unable to load system ROM (error "+c+")");else{if("["==b.charAt(0)||"{"==b.charAt(0))try{var d=eval("("+b+")"),e=d.bytes,m=d.data;if(e)this.Eb=e;else if(m)for(this.Eb=Array(4*m.length),c=b=0;b<m.length;b++)this.Eb[c++]=m[b]&255,this.Eb[c++]=m[b]>>8&255,this.Eb[c++]=m[b]>>16&255,this.Eb[c++]=m[b]>>24&255;else this.Eb=d;this.Qj=d.symbols;if(!this.Eb.length){sa("Empty ROM: "+a);return}if(1==this.Eb.length){sa(this.Eb[0]);return}}catch(n){this.wa("ROM data error: "+
n.message);return}else for(a=b.replace(/\n/gm," ").replace(/ +$/,"").split(" "),this.Eb=Array(a.length),d=0;d<a.length;d++)this.Eb[d]=ca(a[d],16);oi(this)}};
function oi(a){if(!Za(a))if(!a.sh)Ya(a);else if(a.Eb&&a.la){if(a.Eb.length!=a.mg)$a(a,"ROM size (0x"+da(a.Eb.length)+") does not match specified size ("+("0x"+da(a.mg))+")");else{var b;b=a.Rj;if(Ib(a.la,b,a.mg,ac)){for(var c=0;c<a.Eb.length;c++){var d=a.la,e=b+c;d.ka[(e&d.vb)>>>d.Aa].cm(e&d.Ea,a.Eb[c]&255,e)}b=!0}else b=!1;if(b){b=[];"number"==typeof a.zg?b.push(a.zg):null!=a.zg&&a.zg.length&&(b=a.zg);for(c=0;c<b.length;c++){var d=a,e=b[c],m=Lb(d.la,d.Rj,d.mg);Kb(d.la,e,d.mg,m)}a.we&&((b=Ra(a.we,
a.id))?(c=a.Eb,d=a.lm,5==b.wb?pi(b,c,d||[12640,8752],8):7==b.wb&&pi(b,c,d||[14221,16269],8),Ya(b)):a.wa("Unable to find component: "+a.we));delete a.Eb}}Ya(a)}}Da(function(){for(var a=Wa(window.document,"pcjs","rom"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),d=new ni(d);Va(d,c)}});function qi(a){Ha.call(this,"RAM",a,qi);this.Eh=a.addr;this.$d=a.size;this.vo=a.test;this.ro=!!this.$d;this.$h=!1}Pa(qi);qi.prototype.Jc=function(a,b,c,d){this.la=b;this.W=c;this.Sa=d;this.fa=fb(a,"ChipSet");Ya(this)};
qi.prototype.fc=function(a,b){b||this.reset();return!0};qi.prototype.ec=function(){return!0};
qi.prototype.reset=function(){if(!this.Eh&&!this.ro&&this.fa){var a=1024*ph(this.fa);this.$d&&a!=this.$d&&(Mb(this.la,this.Eh,this.$d),this.$h=!1);this.$d=a}!this.$h&&this.$d&&Ib(this.la,this.Eh,this.$d,1)&&(this.$h=!0,this.status(Math.floor(this.$d/1024)+"Kb allocated"),"ramCPQ"==this.Sg&&(this.V=new ri(this),Ib(this.la,si,1,4,this.V)));if(this.$h){if(this.vo||Ob(this.la,1138,4660),"ramCPQ"!=this.Sg&&this.fa&&(a=this.fa,a.ea)){var b=1048576>this.Eh?21:23,c=a.ea[b]|a.ea[b+1]<<8,c=c+(this.$d>>10);
a.ea[b]=c&255;a.ea[b+1]=c>>8;th(a)}}else sa("No RAM allocated")};function ri(a){this.$q=a;this.bm=ti;this.Nn=ui;this.Ij=vi;this.tg=null}
var si=-2134900736,ti=65535,ui=2575,vi=2,wi=[null,0],xi=[function(a){var b=255;2>a?b=a&1?this.V.Nn>>8:this.V.Nn&255:4>a&&(b=a&1?this.V.Ij>>8:this.V.Ij&255);return b},null,null,function(a,b){var c=this.V;if(a)2==a&&(c.Ij=c.Ij&-256|b);else if(b!=(c.bm&255)){var d=c.$q.la;if(b&1)c.tg&&(Kb(d,917504,131072,c.tg),c.tg=null);else{c.tg||(c.tg=Lb(d,917504,131072));var e=Lb(d,16646144,131072);Kb(d,917504,131072,e,b&2?1:ac)}c.bm=c.bm&-256|b}},null,null];ri.prototype.Zm=function(){return wi};
ri.prototype.vk=function(){return xi};Da(function(){for(var a=Wa(window.document,"pcjs","ram"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),d=new qi(d);Va(d,c)}});function yi(a){Ha.call(this,"Keyboard",a,yi);this.Qm=ya("Mobi");this.so=ya("MSIE");this.nc("mobile keyboard support: "+(this.Qm?"true":"false"));this.Dm=0;this.ei=!0;this.sk=this.ok=!1;this.Lb=[];this.Ip=500;this.Jp=100;this.Hp=50;this.Lm=!1;Ya(this)}Pa(yi);
var V={Tr:1,Ur:3,Vr:26," ":32,"!":33,'"':34,"#":35,$:36,"%":37,"&":38,"'":39,"(":40,")":41,"*":42,"+":43,",":44,"-":45,".":46,"/":47,0:48,1:49,2:50,3:51,4:52,5:53,6:54,7:55,8:56,9:57,":":58,";":59,"<":60,"=":61,">":62,"?":63,"@":64,Qr:65,Rr:66,gm:67,Rn:68,E:69,Yr:70,as:71,hm:72,ds:73,es:74,fs:75,gs:76,hs:77,Lj:78,ks:79,ls:80,ns:81,jm:82,rs:83,Bs:84,Fs:85,Gs:86,Hs:87,Js:88,Ks:89,Ls:90,"[":91,"\\":92,"]":93,"^":94,_:95,"`":96,Ms:97,Os:98,Rs:99,Ys:100,Zs:101,$s:102,bt:103,ct:104,et:105,ft:106,gt:107,
ht:108,it:109,jt:110,lt:111,mt:112,nt:113,ot:114,pt:115,qt:116,rt:117,st:118,tt:119,x:120,y:121,z:122,"{":123,"|":124,"}":125,"~":126},zi={};zi[186]=V[";"];zi[187]=V["="];zi[188]=V[","];zi[189]=V["-"];zi[190]=V["."];zi[191]=V["/"];zi[192]=V["`"];zi[219]=V["["];zi[220]=V["\\"];zi[221]=V["]"];zi[222]=V["'"];zi[173]=V["-"];var Ai={};Ai[V["1"]]=V["!"];Ai[V["2"]]=V["@"];Ai[V["3"]]=V["#"];Ai[V["4"]]=V.$;Ai[V["5"]]=V["%"];Ai[V["6"]]=V["^"];Ai[V["7"]]=V["&"];Ai[V["8"]]=V["*"];Ai[V["9"]]=V["("];
Ai[V["0"]]=V[")"];Ai[186]=V[":"];Ai[187]=V["+"];Ai[188]=V["<"];Ai[189]=V._;Ai[190]=V[">"];Ai[191]=V["?"];Ai[192]=V["~"];Ai[219]=V["{"];Ai[220]=V["|"];Ai[221]=V["}"];Ai[222]=V['"'];Ai[173]=V._;Ai[61]=V["+"];Ai[59]=V[":"];
var Bi={3016:1,1016:2,1017:8,1018:32,1091:128,1093:64,1224:128,1020:512,1144:1024,1145:2048},Ci={TAB:1009,ESC:1027,F1:1112,F2:1113,F3:1114,F4:1115,F5:1116,F6:1117,F7:1118,F8:1119,F9:1120,F10:1121,LEFT:1037,UP:1038,RIGHT:1039,DOWN:1040,CTRL_C:4003,CTRL_BREAK:4008,CTRL_ALT_DEL:4046},Di={esc:1027,1:V["1"],2:V["2"],3:V["3"],4:V["4"],5:V["5"],6:V["6"],7:V["7"],8:V["8"],9:V["9"],0:V["0"],"-":V["-"],"=":V["="],bs:1008,tab:1009,q:81,w:87,e:69,r:82,t:84,y:89,u:85,i:73,o:79,p:80,"[":V["["],"]":V["]"],enter:13,
ctrl:1017,a:65,s:83,d:68,f:70,g:71,h:72,j:74,k:75,l:76,";":V[";"],quote:V["'"],"`":V["`"],shift:1016,"\\":V["\\"],z:90,x:88,c:67,v:86,b:66,n:78,m:77,",":V[","],".":V["."],"/":V["/"],"right-shift":3016,prtsc:1044,alt:1018,space:V[" "],"caps-lock":1020,f1:1112,f2:1113,f3:1114,f4:1115,f5:1116,f6:1117,f7:1118,f8:1119,f9:1120,f10:1121,"num-lock":1144,"scroll-lock":1145,"num-home":1036,"num-up":1038,"num-pgup":1033,"num-sub":1109,"num-left":1037,"num-center":1101,"num-right":1039,"num-add":1107,"num-end":1035,
"num-down":1040,"num-pgdn":1034,"num-ins":1045,"num-del":1046},Ei={"caps-lock":512,"num-lock":1024,"scroll-lock":2048},X={1027:1};X[V["1"]]=2;X[V["!"]]=10754;X[V["2"]]=3;X[V["@"]]=10755;X[V["3"]]=4;X[V["#"]]=10756;X[V["4"]]=5;X[V.$]=10757;X[V["5"]]=6;X[V["%"]]=10758;X[V["6"]]=7;X[V["^"]]=10759;X[V["7"]]=8;X[V["&"]]=10760;X[V["8"]]=9;X[V["*"]]=10761;X[V["9"]]=10;X[V["("]]=10762;X[V["0"]]=11;X[V[")"]]=10763;X[V["-"]]=12;X[V._]=10764;X[V["="]]=13;X[V["+"]]=10765;X[1008]=14;X[1009]=15;X[113]=16;
X[81]=10768;X[119]=17;X[87]=10769;X[101]=18;X[69]=10770;X[114]=19;X[82]=10771;X[116]=20;X[84]=10772;X[121]=21;X[89]=10773;X[117]=22;X[85]=10774;X[105]=23;X[73]=10775;X[111]=24;X[79]=10776;X[112]=25;X[80]=10777;X[V["["]]=26;X[V["{"]]=10778;X[V["]"]]=27;X[V["}"]]=10779;X[13]=28;X[1017]=29;X[97]=30;X[65]=10782;X[115]=31;X[83]=10783;X[100]=32;X[68]=10784;X[102]=33;X[70]=10785;X[103]=34;X[71]=10786;X[104]=35;X[72]=10787;X[106]=36;X[74]=10788;X[107]=37;X[75]=10789;X[108]=38;X[76]=10790;X[V[";"]]=39;
X[V[":"]]=10791;X[V["'"]]=40;X[V['"']]=10792;X[V["`"]]=41;X[V["~"]]=10793;X[1016]=42;X[V["\\"]]=43;X[V["|"]]=10795;X[122]=44;X[90]=10796;X[120]=45;X[88]=10797;X[99]=46;X[67]=10798;X[118]=47;X[86]=10799;X[98]=48;X[66]=10800;X[110]=49;X[78]=10801;X[109]=50;X[77]=10802;X[V[","]]=51;X[V["<"]]=10803;X[V["."]]=52;X[V[">"]]=10804;X[V["/"]]=53;X[V["?"]]=10805;X[3016]=54;X[1044]=55;X[1018]=56;X[V[" "]]=57;X[1020]=58;X[1112]=59;X[1113]=60;X[1114]=61;X[1115]=62;X[1116]=63;X[1117]=64;X[1118]=65;X[1119]=66;
X[1120]=67;X[1121]=68;X[1144]=69;X[1145]=70;X[1036]=71;X[1038]=72;X[1033]=73;X[1109]=74;X[1037]=75;X[1101]=76;X[1039]=77;X[1107]=78;X[1035]=79;X[1040]=80;X[1034]=81;X[1045]=82;X[1046]=83;X[1122]=87;X[1123]=88;X[1091]=91;X[1093]=93;X[1224]=91;X[4003]=7470;X[4008]=7494;X[4046]=3677523;f=yi.prototype;
f.Kb=function(a,b,c){var d=this,e=a+"-"+b;if(void 0===this.qa[e])switch(b){case "kbd":return c.onkeydown=function(a){return Fi(d,a,!0)},c.onkeypress=function(a){a=a||window.event;a=a.which||a.keyCode;if(d.Lm){var b=d.Lb.length?d.Lb[0].Ne:0;b&&(65<=b&&90>=b||97<=b&&122>=b)&&(65<=a&&90>=a||97<=a&&122>=a)&&b!=a&&(d.sk=!0,a=b)}(b=!X[a]||!!(d.Xb&128))||Gi(d,a,!0);return b},c.onkeyup=function(a){return Fi(d,a,!1)},!0;case "caps-lock":return this.qa[e]=c,c.onclick=function(){d.W&&d.W.Fd();Gi(d,1020,!0)},
!0;case "num-lock":return this.qa[e]=c,c.onclick=function(){d.W&&d.W.Fd();Gi(d,1144,!0)},!0;case "scroll-lock":return this.qa[e]=c,c.onclick=function(){d.W&&d.W.Fd();Gi(d,1145,!0)},!0;default:var m=b.toUpperCase().replace(/-/g,"_");if(void 0!==Ci[m]&&"button"==a)return this.qa[e]=c,c.onclick=function(a,b,c){return function(){a.W&&a.W.Fd();Hi(a,c,!0);Gi(a,c,!0)}}(this,m,Ci[m]),!0;if(void 0!==Di[b])return this.Dm++,this.qa[e]=c,a=function(a,b,c){return function(){Gi(a,c)}}(this,b,Di[b]),b=function(a,
b,c){return function(){Ii(a,c)}}(this,b,Di[b]),"ontouchstart"in window?(c.ontouchstart=a,c.ontouchend=b):(c.onmousedown=a,c.onmouseup=c.onmouseout=b),!0}return!1};function Ji(a,b,c){if(a.Dm){for(var d in Ai)if(b==Ai[d]){b=+d;(d=zi[d])&&(b=d);break}for(var e in Di)if((d=Di[e]==b)||(d=b,97<=d&&122>=d&&(d-=32),d=Di[e]==d),d){(a=a.qa["key-"+e])&&void 0!==c&&(a.style.color=c?"#ffffff":"#000000",a.style.backgroundColor=c?"#000000":"#ffffff");break}}}
f.Jc=function(a,b,c,d){this.la=b;this.W=c;this.Sa=d;this.fa=fb(a,"ChipSet")};function ji(a,b){a.nc("keyboard reset",65792);a.Ub=[170];a.Lg=!0;b&&a.fa&&li(a.fa,a.Ub[0])}function fi(a,b,c){a.nk!==c&&(a.nk=a.rk=c)&&(a.Lg=!0);a.di!==b&&(a.di=b)&&!a.rk&&mi(a,!0);a.di&&a.rk&&(ji(a,!0),a.rk=!1)}function gi(a){var b=0;a.Ub.length&&a.Lg&&(b=a.Ub[0],a.fa&&li(a.fa,b))}function mi(a,b){0<a.Ub.length&&(a.Ub.shift(),(a.Lg=b)&&a.Ub.length&&a.fa&&li(a.fa,a.Ub[0]))}
f.fc=function(a,b){return!b&&(this.reset(),a&&this.restore&&!this.restore(a))?!1:!0};f.ec=function(a){return a&&this.save?this.save():!0};f.reset=function(){this.xe();this.Xb=this.td=0;this.Ub=[];this.Lg=!0};f.save=function(){var a=new Yd(this);a.set(0,this.am());return a.data()};f.restore=function(a){return this.xe(a[0])};f.xe=function(a){var b=0;void 0===a&&(a=[]);this.nk=this.Lg=a[b++];this.di=a[b];return!0};f.am=function(){var a=0,b=[];b[a++]=this.nk;b[a]=this.di;return b};
function Hi(a,b,c,d){if(X[b]){var e=Math.floor(b/1E3)&2;if(b=Bi[b]||0){!e||b&85||(b>>=1);if(b&3584){if(!1===d)return!0;d=null}null==d?d=!((c?a.td:a.Xb)&b):d||b&255&&(b=255);if(c){a.td&=~b;d&&(a.td|=b);c=b;var m,n;for(n in Ei)d="led-"+n,e=Ei[n],c&&c!=e||!(m=a.qa[d])||(m.style.backgroundColor=a.td&e?"#00ff00":"#000000")}else a.Xb&=~b,d&&(a.Xb|=b);return!0}}return!1}
function Gi(a,b,c){if(X[b]&&a.W&&a.W.ha.Pb){Bi[b]&&a.Lb.length&&0<a.Lb[0].Bd&&(a.Lb[0].Bd=0);for(var d,e=0;e<a.Lb.length;e++)if(d=a.Lb[e],d.Ne==b){if(!c||0<=d.Bd){e=-1;break}0<e&&(0<a.Lb[0].Bd&&(a.Lb[0].Bd=0),a.Lb.splice(e,1));break}0>e||(e==a.Lb.length&&(d={},d.Ne=b,d.Xb=a.Xb,Ji(a,b,!0),e++),0<e&&a.Lb.splice(0,0,d),d.Og=!0,d.Bd=c?-1:Bi[b]?0:1,Ki(a,d))}}
function Ii(a,b,c){if(!X[b]||!(c||a.W&&a.W.ha.Pb))return!1;for(var d=!1,e=0;e<a.Lb.length;e++){var m=a.Lb[e];if(m.Ne==b||m.Ne==Ai[b]){a.Lb.splice(e,1);m.Ln&&clearTimeout(m.Ln);m.Og&&!c&&Li(a,m.Ne,!1);Ji(a,b,!1);d=!0;break}}!a.Lb.length&&a.sk&&(Hi(a,1020),a.sk=!1);return d}
function Ki(a,b){if(a.W&&a.W.ha.Pb){if(Li(a,b.Ne,b.Og),b.Bd){var c;if(0>b.Bd){if(!b.Og){Ii(a,b.Ne);return}b.Og=!1;c=a.Hp}else c=1==b.Bd++?a.Ip:a.Jp;b.Ln=setTimeout(function(a){return function(){Ki(a,b)}}(a),c)}}else Ii(a,b.Ne,!0)}function Mi(a,b,c){var d=b;if(65<=b&&90>=b)!(a.Xb&515)==c&&(d=b+32);else if(97<=b&&122>=b)!!(a.Xb&515)==c&&(d=b-32);else if(!!(a.Xb&3)==c){if(a=Ai[b])d=a}else if(a=zi[b])d=a;return d}f.nj=function(a){this.ei=a;a||(this.Xb&=-256)};
function Fi(a,b,c){var d=!0,e=!1,m=!1,n=b.keyCode,p=Mi(a,n,!0);a.ok&&p==V["`"]&&(n=p=27);if(X[n+1E3])if(p+=1E3,2==b.location&&(p+=2E3),Hi(a,p,!1,c)){if(20==n||144==n||145==n)a.so||(c=e=!0);if(!(c||91!=n&&93!=n))for(var v=0;v<a.Lb.length;v++){var w=a.Lb[v];w.Og=!1;0<w.Bd&&(w.Bd=0)}}else 8==n&&8==(a.Xb&40)&&(p=4008),d=!1;else if(X[p]&&a.Xb&60&&(d=!1),!a.Lm&&d&&c||a.Xb&192)m=!0;d||b.preventDefault();m||a.Qm&&d||(c?Gi(a,p,e):Ii(a,p)||(b=Mi(a,n,!1),b!=p&&Ii(a,b)));return d}
function Li(a,b,c){Hi(a,b,!0,c);var d=X[b]||X[b+1E3];if(void 0!==d){14==d&&40==(a.Xb&40)&&(d=83);var e=[],m=d&255;e.push(m|(c?0:128));for(b=65<=b&&90>=b||97<=b&&122>=b;d>>>=8;){var n=0,p=d&255;224==m||225==m?e.push(m|(c?0:128)):(42==p?a.td&3||a.td&512&&b||(n=p):29==p?a.td&12||(n=p):56==p?a.td&48||(n=p):e.push(m|(c?0:128)),n&&(c?e.unshift(n):e.push(n|128)))}for(c=0;c<e.length;c++)d=a,m=e[c],d.Ub&&(20>d.Ub.length?(d.Ub.push(m),1==d.Ub.length&&d.fa&&li(d.fa,m)):(20==d.Ub.length&&d.Ub.push(255),d.nc("scan code buffer overflow")))}}
Da(function(){for(var a=Wa(window.document,"pcjs","keyboard"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),d=new yi(d);Va(d,c)}});
function Y(a,b,c,d,e){Ha.call(this,"Video",a,Y);this.na=a.model;this.wb=Ni[this.na]||Oi;this.ud=a.memory||0;this.Hn=a.switches;this.hd=a.mode;if(void 0===this.hd||void 0===Pi[this.hd])this.hd=Qi;this.si=a.charCols;this.Hk=a.charRows;if(void 0===this.si||void 0===this.Hk)this.si=Pi[this.hd][0],this.Hk=Pi[this.hd][1];this.Nd=a.screenWidth;this.qe=a.screenHeight;this.uo=a.scale;this.qo=12<=Math.round(this.Nd/this.si);this.wo=a.touchScreen;this.Gg=b;this.Sc=c;this.Ta=(this.xr=d)||b||null;this.ze=null;
this.oo=a.autoLock;this.Va=this.Sb=0;this.fe=[];this.Gd=Array(16);this.ei=!1;var m=this;if(this.fd=e)this.fd.Mf=e.requestFullscreen||e.msRequestFullscreen||e.mozRequestFullScreen||e.webkitRequestFullscreen,this.fd.Mf&&(b=function(){var a=document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement?!0:!1;m.nc("notifyFullScreen("+a+")",!0);m.Da&&(m.Da.ok=a)},"onfullscreenchange"in document?document.addEventListener("fullscreenchange",b,!1):
"onmozfullscreenchange"in document?document.addEventListener("mozfullscreenchange",b,!1):"onwebkitfullscreenchange"in document?document.addEventListener("webkitfullscreenchange",b,!1):"onmsfullscreenchange"in document&&document.addEventListener("msfullscreenchange",b,!1));this.Ta&&(this.Ta.onfocus=function(){return m.nj(!0)},this.Ta.onblur=function(){return m.nj(!1)},this.Ta.hf=this.Ta.requestPointerLock||this.Ta.mozRequestPointerLock||this.Ta.webkitRequestPointerLock,this.Ta.Mn=this.Ta.exitPointerLock||
this.Ta.mozExitPointerLock||this.Ta.webkitExitPointerLock,this.Ta.hf&&(b=function(){m.hh(document.pointerLockElement===m.Ta||document.mozPointerLockElement===m.Ta||document.webkitPointerLockElement===m.Ta)},"onpointerlockchange"in document?document.addEventListener("pointerlockchange",b,!1):"onmozpointerlockchange"in document?document.addEventListener("mozpointerlockchange",b,!1):"onwebkitpointerlockchange"in document&&document.addEventListener("webkitpointerlockchange",b,!1)));if(a=a.fontROM)"json"!=
ga(a)&&(a=ra()+"/api/v1/dump?file="+a+"&format=bytes"),qa(a,!0,null,this,this.Xp)}Pa(Y);var Oi=1,Ni={mda:1,cga:3,ega:5,vga:7},Qi=7,Ri={2:{wi:15700,vi:208,oj:85,pj:96},3:{wi:18432,vi:364,oj:85,pj:96},4:{wi:21850,vi:364,oj:85,pj:96},7:{wi:16700,vi:480,oj:85,pj:83}},Si={6:[1,3,!0],7:[2,3,!0],8:[6,3,!0],9:[4,3,!0],10:[3,1,!0],11:[3,2,!0],0:[1,3,!1],1:[2,3,!1],2:[6,3,!1],3:[4,3,!1],4:[3,1,!1],5:[3,2,!1]},Pi=[,[40,25,1,0,3],,[80,25,1,0,3],[320,200,8,192],,[640,200,16,192]];Pi[Qi]=[80,25,1,0,1];
Pi[13]=[320,200,16];Pi[14]=[640,200,16];Pi[15]=[640,350,16];Pi[16]=[640,350,16];Pi[17]=[640,480,16];Pi[18]=[640,480,16];Pi[19]=[320,200,16];Pi[0]=Pi[1];Pi[2]=Pi[3];Pi[5]=Pi[4];var Ti=Array(5);Ti[0]=[0,0,0,255];Ti[1]=[127,192,127,255];Ti[2]=[127,192,127,255];Ti[3]=[127,255,127,255];Ti[4]=[127,255,127,255];var Ui=[0,1,2,2,2,2,2,2,0,3,4,4,4,4,4,4],Vi=Array(16);Vi[0]=[0,0,0,255];Vi[1]=[0,0,170,255];Vi[2]=[0,170,0,255];Vi[3]=[0,170,170,255];Vi[4]=[170,0,0,255];Vi[5]=[170,0,170,255];Vi[6]=[170,85,0,255];
Vi[7]=[170,170,170,255];Vi[8]=[85,85,85,255];Vi[9]=[85,85,255,255];Vi[10]=[85,255,85,255];Vi[11]=[85,255,255,255];Vi[12]=[255,85,85,255];Vi[13]=[255,85,255,255];Vi[14]=[255,255,85,255];Vi[15]=[255,255,255,255];var Wi=[2,4,6],Xi=[3,5,7],Yi=[0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63],Zi=[0,255,65280,65535,16711680,16711935,16776960,16777215,-16777216,-16776961,-16711936,-16711681,-65536,-65281,-256,-1],$i=[0];$i[128]=1;$i[32768]=2;$i[32896]=3;$i[8388608]=4;$i[8388736]=5;$i[8421376]=6;$i[8421504]=7;
$i[-2147483648]=8;$i[-2147483520]=9;$i[-2147450880]=10;$i[-2147450752]=11;$i[-2139095040]=12;$i[-2139094912]=13;$i[-2139062272]=14;$i[-2139062144]=15;
function aj(a,b,c,d){if(void 0!==b&&(!c||c.length)){this.video=a;var e=bj[b],m=a.jd||e[5];if(!c||6>c.length)c=[!1,0,null,null,0,Array(cj)];this.wb=b;this.Va=e[2];this.Sb=e[3];this.ud=d||e[4];65536<=this.ud&&720896<=this.Va&&(this.Sb=Math.min(this.ud>>2,32768));this.uc=c[0];this.Lc=c[1];this.lh=c[2];this.sa=c[3];this.Zc=c[4]&255;this.uj=c[4]>>8&255;this.pc=c[5];this.Ak=cj;if(5<=b){this.Ak=dj;b=c[6];void 0===b&&(b=[!1,0,Array(20),0,3==m?0:1,0,0,Array(5),0,0,0,Array(9),0,[this.Va,this.Sb,this.ud],Array(this.ud>>
2),5144,0,-1,0,-1,0,-1,0,0,0,1,255,0,0,0,Array(256)]);this.se=b[0];this.pf=b[1];this.of=b[2];this.Vl=b[3];this.ph=b[4];this.zj=b[5];this.ig=b[6];this.qh=b[7];this.zn=b[8];this.An=b[9];this.gg=b[10];this.fg=b[11];this.lb=b[12];d=b[13];"number"==typeof d&&(d=[this.Va,this.Sb,d]);this.Va=d[0];this.Sb=d[1];d=this.ud>>2;if((this.Te=b[14])&&this.Te.length<d){for(var e=this.Te,n=0,p=Array(d),v=0;v<e.length-1;){for(var w=e[v++],G=e[v++];w--;)p[n]=G,n+=2;n==d&&(n=1)}this.Te=p}(d=b[15])&&(d=d&8?d&-9:ej[d&65280]|
ej[d&255]);this.Gj(d);this.Nl=b[16];this.eb=b[17];this.Ad=b[18];this.mb=b[19];this.kj=b[20];this.Ge=b[21];this.mf=b[22];this.Ck=b[23];this.Dk=b[24];7==this.wb&&(this.Wl=b[25],this.Rl=b[26],this.Cd=b[27],this.zc=b[28],this.xj=b[29],this.nh=b[30])}m=Ri[m]||Ri[3];this.Ek=a.W.R.zd/m.wi|0;this.Mp=this.Ek*m.oj/100|0;this.nn=this.Ek*m.vi;this.Op=this.nn*m.pj/100|0;this.Jk=null==c[7]?0:c[7]}}var cj=18,dj=25,ej=[,,1024,5120];ej[16]=1280;ej[512]=0;ej[1024]=32;ej[1536]=96;ej[2560]=160;ej[3584]=224;ej[768]=16;
ej[4096]=1;ej[8192]=2;ej[24576]=98;ej[40960]=162;ej[57344]=226;var fj=[];fj[1024]=function(a){a+=this.offset;return(this.V.lb=this.ba[a])>>this.V.Nl&255};fj[5120]=function(a){a+=this.offset;var b=this.V.lb=this.ba[a&-2];return(a&1?b>>8:b)&255};fj[1280]=function(a){a+=this.offset;a=this.V.lb=this.ba[a];for(var b=this.V.Dk,c=this.V.Ck&b,d=0,e=128;e;)(a&b)==c&&(d|=e),c>>>=1,b>>>=1,e>>=1;return d};
fj[0]=function(a,b){var c=a+this.offset,d;d=this.ba[c]&~this.V.eb|(b|b<<8|b<<16|b<<24)&this.V.eb;d=d&this.V.mb|this.V.lb&~this.V.mb;this.ba[c]!=d&&(this.ba[c]=d,this.La=!0)};fj[32]=function(a,b){var c=a+this.offset;b=b>>this.V.Ad|b<<8-this.V.Ad&255;var d;d=(b|b<<8|b<<16|b<<24)&this.V.Ge|this.V.mf;d=d&this.V.eb|this.ba[c]&~this.V.eb;d=d&this.V.mb|this.V.lb&~this.V.mb;this.ba[c]!=d&&(this.ba[c]=d,this.La=!0)};
fj[96]=function(a,b){var c=a+this.offset;b=b>>this.V.Ad|b<<8-this.V.Ad&255;var d;d=(b|b<<8|b<<16|b<<24)&this.V.Ge|this.V.mf;d&=this.V.lb;d=d&this.V.eb|this.ba[c]&~this.V.eb;d=d&this.V.mb|this.V.lb&~this.V.mb;this.ba[c]!=d&&(this.ba[c]=d,this.La=!0)};fj[160]=function(a,b){var c=a+this.offset;b=b>>this.V.Ad|b<<8-this.V.Ad&255;var d;d=(b|b<<8|b<<16|b<<24)&this.V.Ge|this.V.mf;d|=this.V.lb;d=d&this.V.eb|this.ba[c]&~this.V.eb;d=d&this.V.mb|this.V.lb&~this.V.mb;this.ba[c]!=d&&(this.ba[c]=d,this.La=!0)};
fj[224]=function(a,b){var c=a+this.offset;b=b>>this.V.Ad|b<<8-this.V.Ad&255;var d;d=(b|b<<8|b<<16|b<<24)&this.V.Ge|this.V.mf;d^=this.V.lb;d=d&this.V.eb|this.ba[c]&~this.V.eb;d=d&this.V.mb|this.V.lb&~this.V.mb;this.ba[c]!=d&&(this.ba[c]=d,this.La=!0)};fj[16]=function(a,b){a+=this.offset;var c,d=a&-2;c=this.V.eb&(d==a?16711935:-16711936);c=(b|b<<8|b<<16|b<<24)&c|this.ba[d]&~c;c=c&this.V.mb|this.V.lb&~this.V.mb;this.ba[d]!=c&&(this.ba[d]=c,this.La=!0)};
fj[1]=function(a){a+=this.offset;var b=this.ba[a]&~this.V.eb|this.V.lb&this.V.eb;this.ba[a]!=b&&(this.ba[a]=b,this.La=!0)};fj[17]=function(a){a+=this.offset;var b=a&-2;a=this.V.eb&(b==a?16711935:-16711936);a=this.ba[b]&~a|this.V.lb&a;this.ba[b]!=a&&(this.ba[b]=a,this.La=!0)};fj[2]=function(a,b){var c=a+this.offset,d=Zi[b&15],d=d&this.V.eb|this.ba[c]&~this.V.eb,d=d&this.V.mb|this.V.lb&~this.V.mb;this.ba[c]!=d&&(this.ba[c]=d,this.La=!0)};
fj[98]=function(a,b){var c=a+this.offset,d=Zi[b&15],d=d&this.V.lb,d=d&this.V.eb|this.ba[c]&~this.V.eb,d=d&this.V.mb|this.V.lb&~this.V.mb;this.ba[c]!=d&&(this.ba[c]=d,this.La=!0)};fj[162]=function(a,b){var c=a+this.offset,d=Zi[b&15],d=d|this.V.lb,d=d&this.V.eb|this.ba[c]&~this.V.eb,d=d&this.V.mb|this.V.lb&~this.V.mb;this.ba[c]!=d&&(this.ba[c]=d,this.La=!0)};
fj[226]=function(a,b){var c=a+this.offset,d=Zi[b&15],d=d^this.V.lb,d=d&this.V.eb|this.ba[c]&~this.V.eb,d=d&this.V.mb|this.V.lb&~this.V.mb;this.ba[c]!=d&&(this.ba[c]=d,this.La=!0)};
function gj(a){var b=[];if(void 0!==a.wb){b[0]=a.uc;b[1]=a.Lc;b[2]=a.lh;b[3]=a.sa;b[4]=a.Zc|a.uj<<8;b[5]=a.pc;if(5<=a.wb){var c=[];c[0]=a.se;c[1]=a.pf;c[2]=a.of;c[3]=a.Vl;c[4]=a.ph;c[5]=a.zj;c[6]=a.ig;c[7]=a.qh;c[8]=a.zn;c[9]=a.An;c[10]=a.gg;c[11]=a.fg;c[12]=a.lb;c[13]=[a.Va,a.Sb,a.ud];var d;a:if(d=a.Te){var e=0,m=[];if(void 0!==d[0])for(var n=0;2>n;n++)for(var p=n;p<d.length;){for(var v=d[p],w=p+2;w<d.length&&d[w]===v;)w+=2;m[e++]=w-p>>1;m[e++]=v;p=w}if(m.length<d.length){d=m;break a}}c[14]=d;c[15]=
a.zk|8;c[16]=a.Nl;c[17]=a.eb;c[18]=a.Ad;c[19]=a.mb;c[20]=a.kj;c[21]=a.Ge;c[22]=a.mf;c[23]=a.Ck;c[24]=a.Dk;7==a.wb&&(c[25]=a.Wl,c[26]=a.Rl,c[27]=a.Cd,c[28]=a.zc,c[29]=a.xj,c[30]=a.nh);b[6]=c}b[7]=a.Jk}return b}aj.prototype.Zm=function(a){return[this.Te,a-this.Va]};aj.prototype.vk=function(){return this.Fh};
aj.prototype.Gj=function(a){if(null!=a&&a!=this.zk){var b=a&65280,c=fj[b];c||b&4096&&(c=fj[4096]);var b=a&247,d=fj[b];d||b&16&&(d=fj[16]);this.Fh||(this.Fh=Array(6));this.Fh[0]=c;this.Fh[3]=d;this.zk=a}};var bj=[];bj[Oi]=["MDA",948,720896,4096,0,3];bj[3]=["CGA",980,753664,16384,0,2];bj[5]=["EGA",980,753664,16384,65536,4];bj[7]=["VGA",980,753664,16384,262144,7];f=Y.prototype;
f.Jc=function(a,b,c,d){this.la=b;this.W=c;this.Sa=d;3!=Ni[this.na]&&(Sb(b,this,hj),Ub(b,this,ij));Ni[this.na]!=Oi&&(Sb(b,this,jj),Ub(b,this,kj));5<=this.wb&&(Sb(b,this,lj),Ub(b,this,mj));7==this.wb&&(Sb(b,this,nj),Ub(b,this,oj));if((this.Da=fb(a,"Keyboard"))&&this.Gg){for(var e in this.qa)0<e.indexOf("lock")&&this.Da.Kb("led",e,this.qa[e]);this.Da.Kb(this.xr?"textarea":"canvas","kbd",this.Ta)}this.Jh=9;(this.fa=fb(a,"ChipSet"))&&this.Hn&&5==this.wb&&(this.Jh=Zg(this.Hn,this.Jh));this.Da&&this.wo&&
pj(this)};f.Kb=function(a,b,c){var d=this;if(!this.qa[b])switch(this.qa[b]=c,b){case "fullScreen":return this.fd&&this.fd.Mf?c.onclick=function(){d.Mf()}:c.parentNode.removeChild(c),!0;case "lockPointer":return this.ur=c.textContent,this.Ta&&this.Ta.hf?c.onclick=function(){d.hf(!0)}:c.parentNode.removeChild(c),!0;case "refresh":return c.onclick=function(){vc(d,!0)},!0}return!1};f.Fd=function(){this.Ta&&this.Ta.focus()};
f.Mf=function(){var a=!1;this.fd&&(this.fd.Mf&&(this.fd.style.width=this.fd.style.height="100%",this.fd.style.backgroundColor="black",this.fd.Mf(),a=!0),this.Fd());return a};f.hf=function(a){var b=!1;this.Ta&&(a?this.Ta.hf&&(this.Ta.hf(),this.ze.hh(!0),b=!0):this.Ta.Mn&&(this.Ta.Mn(),this.ze.hh(!1),b=!0),this.Fd());return b};f.hh=function(a){this.ze&&(this.ze.hh(a),this.Da&&(this.Da.ok=a));var b=this.qa.lockPointer;b&&(b.textContent=a?"Press Esc to Unlock Pointer":this.ur)};
function pj(a){var b=a.Ta;b&&!a.Mg&&(b.addEventListener("touchstart",function(b){qj(a,b)},!1),b.addEventListener("touchmove",function(b){qj(a,b)},!0),b.addEventListener("touchend",function(){},!1),a.Mg=!0)}f.nj=function(a){this.ei=a;this.Da&&this.Da.nj(a)};
function qj(a,b){a.ei&&b.preventDefault();var c=0,d=0,e=a.Gg;do isNaN(e.offsetLeft)||(c+=e.offsetLeft,d+=e.offsetTop);while(e=e.offsetParent);var m=a.Nd/a.Gg.offsetWidth,e=a.qe/a.Gg.offsetHeight,n,p;b.targetTouches?(n=b.targetTouches[0].pageX,p=b.targetTouches[0].pageY):(n=b.pageX,p=b.pageY);c=(n-c)*m/(a.Nd/3)|0;d=(p-d)*e/(a.qe/3)|0;1!=d?d?Gi(a.Da,1040,!0):Gi(a.Da,1038,!0):1!=c&&(c?Gi(a.Da,1039,!0):Gi(a.Da,1037,!0))}
f.fc=function(a,b){if(!b)if(!a||!this.restore)this.reset();else if(!this.restore(a))return!1;return!0};f.ec=function(a){return a&&this.save?this.save():!0};
f.reset=function(){var a=!0,b=0;this.fa&&(b=qh(this.fa));this.na||(this.wb=3==b?Oi:3);this.hd=3;switch(this.wb){case 7:b=7;break;case 5:var c=Si[this.Jh];c&&(b=c[0]);b||(b=4);break;case Oi:b=3;this.hd=Qi;break;default:b=2}this.jd!==b&&(this.jd=b,a=!0);this.Ja=null;this.ed=this.$j=new aj(this,Oi);this.kc=this.Th=new aj(this,3);5>this.wb?this.X=new aj:(this.X=new aj(this,this.wb,null,this.ud),rj(this));sj(this);this.Ce=null;this.Ye=this.Vc=-1;this.Xe=0;tj(this,this.hd);if(this.Ja.Va&&a){a=this.Ja.Va+
this.ak;for(b=this.Ja.Va;b<a;b+=2){var d=Math.floor(65536*Math.random());4==this.jd||7==this.jd?(c=b>>1&255,d=d>>8&-129,d>>4==(d&15)&&(d^=15)):(c=d&255,d=(d&256?7:112)|8&d>>8);Ob(this.la,b,c|d<<8)}vc(this,!0)}};function rj(a){a.X.ph&1?(a.ed=a.$j,a.kc=a.X):(a.ed=a.X,a.kc=a.Th)}f.save=function(){var a=new Yd(this);a.set(0,gj(this.$j));a.set(1,gj(this.Th));a.set(2,[this.jd,this.hd,this.Ce]);a.set(3,gj(this.X));return a.data()};
f.restore=function(a){var b=a[2];this.jd=b[0];this.hd=b[1];this.Ce=b[2];this.Ja=null;this.ed=this.$j=new aj(this,Oi,a[0]);this.kc=this.Th=new aj(this,3,a[1]);this.X=new aj(this,this.wb,a[3],this.ud);this.X.uc&&rj(this);sj(this);if(!uj(this))return!1;vj(this);return!0};
f.Xp=function(a,b,c){if(c)this.wa("Unable to load font ROM image (error "+c+")");else{try{var d=eval("("+b+")");if(!d.length){sa("Empty font ROM image: "+a);return}if(1==d.length){sa(d[0]);return}if(8192==d.length)pi(this,d,[6144,0]);else{this.wa("Unrecognized font data length ("+d.length+")");return}}catch(e){this.wa("Font ROM data error: "+e.message);return}(this.Sc||this.Sa)&&Ya(this)}};
function wj(a,b){if(1==b)return a.Gd[0]=Vi[0],a.Gd[1]=Vi[7],a.Gd;if(2==b){var c=a.Ja.lh;if(a.Ja===a.X){var d=a.X.of[0],c=d&7;d&16&&(c|=8);18!=a.X.of[1]&&(c|=32)}a.Gd[0]=Vi[c&15];c=c&32?Xi:Wi;for(d=0;d<c.length;d++)a.Gd[d+1]=Vi[c[d]];return a.Gd}if(a.kc===a.Th)return Vi;c=null!=a.X.of[15]?a.X.of:Yi;for(d=0;d<a.Gd.length;d++){var e=c[d]||0;a.Gd[d]=[(e&4?170:0)|(e&32?85:0),(e&2?170:0)|(e&16?85:0),(e&1?170:0)|(e&8?85:0),255]}return a.Gd}function pi(a,b,c,d){a.Ch=b;a.Pj=c;a.cf=d}
function sj(a){var b=!1;if(window&&a.Ch){var c=wj(a),d,e=a.cf?a.cf:8;xj(a,3,a.Pj[0],0,e,8,a.Ch,c)&&(b=!0);d=a.cf?0:2048;e=a.cf?a.cf:9;xj(a,1,a.Pj[1],d,e,14,a.Ch,Ti,Ui)&&(b=!0);a.cf&&xj(a,a.wb,a.Pj[1],0,a.cf,14,a.Ch,c)&&(b=!0)}return b}function xj(a,b,c,d,e,m,n,p,v){var w=!1;null!=c&&(yj(a,b,c,d,e,m,n,p,v)&&(w=!0),a.qo&&yj(a,b<<1,c,d,e,m,n,p,v)&&(w=!0));return w}
function yj(a,b,c,d,e,m,n,p,v){var w=!1,G=b&1?0:1,Q=a.fe[b];Q||(Q={rc:e<<G,sc:m<<G,Af:Array(p.length),pm:p.slice(),ug:v,Nj:Array(p.length)});for(v=0;v<p.length;v++){var M=p[v],R=Q.Af[v]?Q.pm[v]:[];if(M[0]!==R[0]||M[1]!==R[1]||M[2]!==R[2]){var w=Q,R=v,W=G,ia=c,ja=d,Ta=e,nb=m,Qb=n,Kc=[0,0,0,0],Gd=window.document.createElement("canvas");Gd.width=w.rc<<4;Gd.height=w.sc<<4;for(var uh=Gd.getContext("2d"),ob=void 0,pc=void 0,Rb=void 0,Hd=8>nb||!ja?nb:8,Re=uh.createImageData(w.rc,w.sc),ob=0;256>ob;ob++){for(Rb=
0;Rb<nb;Rb++)for(var zk=w.ug&&R&1&&Rb>=nb-2,Ak=Qb[Rb<Hd?ia+ob*Hd+Rb:ja+ob*Hd+Rb-Hd],Se=0;Se<=W;Se++)for(pc=0;pc<Ta;pc++){var vh=pc<<W,wh=(Rb<<W)+Se,xh=zk||Ak&128>>(8<=pc&&192<=ob&&223>=ob?7:pc)?M:Kc;zj(Re,vh,wh,xh);W&&zj(Re,vh+1,wh,xh)}uh.putImageData(Re,(ob&15)*w.rc,(ob>>4)*w.sc)}w.Af[R]="#"+da(M[0],2)+da(M[1],2)+da(M[2],2);w.pm[R]=M;w.Nj[R]=Gd;w=!0}}a.fe[b]=Q;return w}function Aj(a){0<a.Xe||0<=a.Vc?0>a.Ye&&(a.Ye=0):a.Ye=-1}
function vj(a){if(a.Yb){for(var b=10;15>=b;b++)if(null==a.Ja.pc[b])return;var c=a.Ja.pc[10],b=c&31,d=a.Ja.pc[11]&31,e=a.Ja.pc[9]&31,m=!1;a.Ja===a.X&&(m=!0,7!=e||4!=b||d||(d=7));if(c&32||b>d&&!m||b>e)Bj(a);else{c=a.Ja.pc[15]+((a.Ja.pc[14]&63)<<8);a.Vc!=c&&(Bj(a),a.Vc=c);d=d-b+1;if(a.Qn!=b||a.Im!=d)a.Qn=b,a.Im=d;a.pe=e+1;Aj(a)}}}
function Bj(a){if(0<=a.Vc){if(void 0!==a.jc){var b=a.jc[a.Vc];if(b&131072){var b=b&-131073,c=a.Vc%a.Hb,d=Math.floor(a.Vc/a.Hb);a.Yb&&a.fe[a.Yb]&&(a.Lf&&Cj(a,c,d,b,a.Lf),Cj(a,c,d,b));a.jc[a.Vc]=b}}a.Vc=-1}}
function Dj(a){var b;a=a.Ja;var c=a.fg[5];if(null!=c){b=1024;var d=0,e=a.fg[3]&31;switch(c&3){case 0:if(e){d=32;switch(e&24){case 8:d=96;break;case 16:d=160;break;case 24:d=224}a.Ad=e&7}break;case 1:d=1;break;case 2:switch(e&24){default:d=2;break;case 8:d=98;break;case 16:d=162;break;case 24:d=226}}c&8&&(b=1280);a=a.qh[4];null==a||a&4||(b|=4096,d|=16);b|=d}return b}f.ld=function(a){var b=this.Ja;b&&null!=a&&a!=b.zk&&(b.Gj(a),this.la.Gj(b.Va,b.Sb,b.vk()))};
function uj(a,b){var c,d=a.Ce,e=a.Ja;if(e)if(e.wb==Oi)d=Qi;else if(5<=e.wb){var d=null,m=e.ud>>2,n=32768<m?32768:m,p=e.fg[6];if(null!=p){switch(p&12){case 0:e.Va=655360;e.Sb=m;d=255;break;case 4:e.Va=655360;e.Sb=m;d=3==a.jd?15:16;break;case 8:e.Va=720896;e.Sb=n;d=Qi;break;case 12:e.Va=753664,e.Sb=n,d=3==a.jd?2:3}c=e.qh[1]&8;m=e.pc[6];m|=e.pc[7]&1?256:0;7==e.wb&&(m|=e.pc[7]&32?512:0);255!=d&&(p&1?753664==e.Va?d=c?7-d:6:400>m?350>m&&(d=c?13:14):d=3==a.jd?17:18:c&&(d-=2));c=Dj(a)}}else e.Lc&8&&(e.Lc&
2?(d=e.Lc&16?6:5,e.Lc&4||--d):(d=e.Lc&1?3:1,e.Lc&4&&--d));else a.Ce=null,null==d&&(d=a.hd);if(!tj(a,d,b))return!1;a.ld(c);return!0}
function tj(a,b,c){if(null!=b&&(b!=a.Ce||c)){a.Vn=0;a.Ce=b;b=a.Ja||(b==Qi?a.ed:a.kc);if(b!=a.Ja||b.Va!=a.Va||b.Sb!=a.Sb){Bj(a);if(a.Va){if(!Mb(a.la,a.Va,a.Sb))return!1;a.Ja&&(a.Ja.uc=!1)}a.Ja=b;b.uc=!0;a.Va=b.Va;a.Sb=b.Sb;if(!Ib(a.la,b.Va,b.Sb,3,b===a.X?b:null))return!1}a.Yb=0;a.Hb=a.si;a.wc=a.Hk;a.Bk=Pi[Qi][2];b=0;var d=Pi[a.Ce];d&&(a.Hb=d[0],a.wc=d[1],a.Bk=d[2],b=d[3]||0,a.Yb=d[4],4!=a.jd&&7!=a.jd||a.Ja!==a.X||3!=a.Yb||(7==a.X.pc[9]?a.wc=43:a.Yb=a.wb));a.kn=a.Hb*a.wc;a.pi=a.kn/a.Bk;a.ak=(a.pi<<
1)+b;a.Em=b?a.ak+b>>1:0;13<=a.Ce&&(a.pi<<=1);a.fe.length&&(a.Od=Math.floor(a.Nd/a.Hb),a.Pd=Math.floor(a.qe/a.wc),a.Yb?(b=a.fe[a.Yb],d=a.fe[a.Yb<<1],a.uo&&80==a.Hb?d&&a.Od>=3*d.rc>>2&&(a.Yb<<=1,b=d):(d&&a.Od>=d.rc&&(a.Yb<<=1,b=d),b&&(a.Od=b.rc,a.Pd=b.sc)),a.Jg=a.Kg=0,b&&(a.Jg=a.Hb*b.rc,a.Kg=a.wc*b.sc)):(a.Od=a.Pd=1,a.Jg=a.Hb,a.Kg=a.wc),a.mi=a.Sc.createImageData(a.Jg,a.Kg),a.Jf=window.document.createElement("canvas"),a.Jf.width=a.Jg,a.Jf.height=a.Kg,a.Lf=a.Jf.getContext("2d"),a.em=a.fm=0,a.gk=a.Nd,
a.hk=a.qe,b=a.Nd-a.Hb*a.Od,d=a.qe-a.wc*a.Pd,0<b&&(a.em=b>>1,a.gk-=b),0<d&&(a.fm=d>>1,a.hk-=d),b||d)&&(a.Sc.fillStyle=a.Gg.style.backgroundColor,a.Sc.fillRect(0,0,a.Nd,a.qe));!1!==c?vc(a,!0):Ej(a,!0)}return!0}function zj(a,b,c,d){b=(b+c*a.width)*d.length;a.data[b]=d[0];a.data[b+1]=d[1];a.data[b+2]=d[2];a.data[b+3]=d[3]}function Ej(a,b){var c;if(b){if(c=a.pi,void 0===a.jc||a.jc.length!=c)a.jc=Array(c)}else{if(void 0===a.jc)return;c=a.jc.length}for(var d=0;d<c;d++)a.jc[d]=-1;a.Xe=-1}
function Cj(a,b,c,d,e){var m=d&255,n=d>>8;d=n&15;var p=a.fe[a.Yb];p.ug&&(d=p.ug[d]);var v=n>>4&15;p.ug&&(v=p.ug[v]);e?(b*=p.rc,c*=p.sc,e.fillStyle=p.Af[v],e.fillRect(b,c,p.rc,p.sc)):(b=b*a.Od+a.em,c=c*a.Pd+a.fm,a.Sc.fillStyle=p.Af[v],a.Sc.fillRect(b,c,a.Od,a.Pd));n&256&&(v=(m&15)*p.rc,m=(m>>4)*p.sc,e?e.drawImage(p.Nj[d],v,m,p.rc,p.sc,b,c,p.rc,p.sc):a.Sc.drawImage(p.Nj[d],v,m,p.rc,p.sc,b,c,a.Od,a.Pd));n&512&&(m=a.Qn,n=a.Im,e?(a.pe&&a.pe!==p.sc&&(m=Math.floor(m*p.sc/a.pe),n=Math.floor(n*p.sc/a.pe)),
e.fillStyle=p.Af[d],e.fillRect(b,c+m,p.rc,n)):(a.pe&&a.pe!==a.Pd&&(m=Math.floor(m*a.Pd/a.pe),n=Math.floor(n*a.Pd/a.pe)),a.Sc.fillStyle=p.Af[d],a.Sc.fillRect(b,c+m,a.Od,n)))}
function vc(a,b){if(a.ha.cc){var c=!1;a.Ja&&(a.Ja===a.X?a.X.pf&32&&(c=!0):a.Ja.Lc&8&&(c=!0));if(c||b){if(b)Ej(a,!0);else if(void 0===a.jc)return;var d=!1;!(b||++a.Vn&15)&&0<=a.Ye&&(a.Ye++,d=!0);var e=0,m=a.kn,c=a.Ja.Va,n=c+a.Ja.Sb,p=(a.Ja.pc[12]<<8)+a.Ja.pc[13];a.Yb&&(p<<=1);var c=c+p,v=a.ak;c+v>n&&(v=n-c,0>v&&(v=0));n=c+v;if(p=!b){for(var p=a.la,w=!0,G=c>>>p.Aa;0<v&&G<p.ka.length;)p.ka[G].La&&(p.ka[G].La=w=!1,p.ka[G].Mm=!0),v-=p.nb,G++;p=w}if(p){if(!d)return;if(!a.Xe){if(0>a.Vc)return;e=a.Vc;m=e+
1}}if(a.Yb){if(a.fe[a.Yb]){d=0;p=a.Xe=0;v=1048575;a.Ja.Lc&32&&(p=32768,v&=~p,a.Ye&2||(v&=-65537));for(c+=e<<1;c<n&&e<m;)w=Nb(a.la,c),w|=65536,w&p&&(a.Xe++,w&=v),e==a.Vc&&(w|=a.Ye&1?131072:0),G=a.jc[e],G!=w&&(Cj(a,e%a.Hb,Math.floor(e/a.Hb),w,a.Lf),a.jc[e]=w,d++),c+=2,e++;d&&a.Lf&&a.Sc.drawImage(a.Jf,0,0,a.Jg,a.Kg,a.em,a.fm,a.gk,a.hk);Aj(a)}}else if(a.Em){for(var m=n,Q,M,e=c,n=a.Xe=0,d=a.Bk,p=16==d?65536:196608,v=16==d?1:2,w=wj(a,v),R=G=0,W=a.Hb,ia=0,ja=a.wc,Ta=0;e<m;){Q=Nb(a.la,e);M=a.jc[n];if(M===
Q)G+=d;else{a.jc[n]=Q;Q=Q>>8|(Q&255)<<8;M=p;var nb=16;G<W&&(W=G);for(var Qb=0;Qb<d;Qb++){var Kc=(Q&(M>>=v))>>(nb-=v);zj(a.mi,G++,R,w[Kc])}G>ia&&(ia=G);R<ja&&(ja=R);R>=Ta&&(Ta=R+1)}e+=2;n++;if(G>=a.Hb){G=0;R+=2;if(R>a.wc)break;R==a.wc&&(R=1,e=c+a.Em)}}W<a.Hb&&(a.Lf.putImageData(a.mi,0,0,W,ja,ia-W,Ta-ja),a.Sc.drawImage(a.Jf,0,0,a.Hb,a.wc,0,0,a.Nd,a.qe))}else{m=n;e=a.Xe=0;n=wj(a);d=a.Ja.Te;v=p=0;w=a.Hb;G=0;R=a.wc;for(W=0;c<m;){ia=c++-a.Va;ia=d[ia];ja=a.jc[e];if(ja===ia)p+=8;else{a.jc[e]=ia;p<w&&(w=p);
for(ja=0;8>ja;ja++)Ta=$i[ia&-2139062144]||0,zj(a.mi,p++,v,n[Ta]),ia<<=1;p>G&&(G=p);v<R&&(R=v);v>=W&&(W=v+1)}e++;if(p>=a.Hb&&(p=0,++v>a.wc))break}w<a.Hb&&(a.Lf.putImageData(a.mi,0,0,w,R,G-w,W-R),a.Sc.drawImage(a.Jf,0,0,a.Hb,a.wc,0,0,a.Nd,a.qe))}}}}f.gp=function(){var a=this.ed,b;a.uc&&(b=a.Zc);return b};f.Iq=function(a,b){var c=this.ed;c.uj=c.Zc;c.Zc=b&31};f.fp=function(){return Fj(this.ed)};f.Hq=function(a,b){Gj(this,this.ed,b)};f.hp=function(){return this.ed.Lc};
f.Jq=function(a,b){this.ed.Lc=b;uj(this,!1)};f.ip=function(){return Hj(this,this.ed)};f.un=function(a,b){this.X.zj=this.X.zj&-4|b&3};f.dn=function(){var a=this.X.se?this.X.of[this.X.pf&31]:this.X.pf;this.X.se=!this.X.se;return a};f.tn=function(a,b){var c=this.X.pf&32;if(this.X.se){var d=this.X.pf&31;if(16<=d||!c)this.X.of[d]=b;this.X.se=!1}else this.X.pf=b,this.X.se=!0,b&32&&!c&&sj(this)&&vc(this,!0)};
f.sp=function(){var a=0;if(5==this.wb)a=3-((this.X.ph&12)>>2),a=(this.Jh&1<<a)<<4-a;else{var b=this.X.nh[0];45!=(b&63)&&2880!=(b&4032)&&184320!=(b&258048)&&(a|=16)}a|=this.X.Vl&-17;return this.X.Vl=a};f.Kq=function(a,b){this.X.ph=b;rj(this)};f.tp=function(){return this.X.Wl};f.Uq=function(a,b){this.X.Wl=b};f.rp=function(){return this.X.ig};f.Sq=function(a,b){this.X.ig=b};f.qp=function(){return this.X.qh[this.X.ig]};
f.Rq=function(a,b){this.X.qh[this.X.ig]=b;switch(this.X.ig){case 2:this.X.eb=Zi[b&15];break;case 4:this.ld(Dj(this))}};f.Uo=function(){return this.X.Rl};f.uq=function(a,b){this.X.Rl=b};f.Vo=function(){return this.X.xj};f.vq=function(a,b){this.X.Cd=b;this.X.xj=3;this.X.zc=0};f.wq=function(a,b){this.X.Cd=b;this.X.xj=0;this.X.zc=0};f.To=function(){var a=this.X.nh[this.X.Cd]>>this.X.zc&63;this.X.zc+=6;12<this.X.zc&&(this.X.zc=0,this.X.Cd=this.X.Cd+1&255);return a};
f.tq=function(a,b){this.X.nh[this.X.Cd]=this.X.nh[this.X.Cd]&~(63<<this.X.zc)|(b&63)<<this.X.zc;this.X.zc+=6;12<this.X.zc&&(this.X.zc=0,this.X.Cd=this.X.Cd+1&255)};f.up=function(){return this.X.zj};f.Dq=function(a,b){this.X.An=b};f.vp=function(){return this.X.ph};f.Cq=function(a,b){this.X.zn=b};f.$o=function(){return this.X.gg};f.Bq=function(a,b){this.X.gg=b};f.Zo=function(){return this.X.fg[this.X.gg]};
f.Aq=function(a,b){this.X.fg[this.X.gg]=b;switch(this.X.gg){case 0:this.X.kj=Zi[b&15];this.X.mf=this.X.kj&~this.X.Ge;break;case 1:this.X.Ge=~Zi[b&15];this.X.mf=this.X.kj&~this.X.Ge;break;case 2:this.X.Ck=Zi[b&15]&-2139062144;break;case 3:case 5:this.ld(Dj(this));break;case 4:this.X.Nl=(b&3)<<3;break;case 6:uj(this,!1);break;case 7:this.X.Dk=Zi[b&15]&-2139062144;break;case 8:this.X.mb=b|b<<8|b<<16|b<<24}};f.Oo=function(){var a=this.kc,b;a.uc&&(b=a.Zc);return b};
f.nq=function(a,b){var c=this.kc;c.uj=c.Zc;c.Zc=b&31};f.No=function(){return Fj(this.kc)};f.mq=function(a,b){Gj(this,this.kc,b)};f.Po=function(){return this.kc.Lc};f.oq=function(a,b){this.kc.Lc=b;uj(this,!1)};f.Mo=function(){return this.kc.lh};f.lq=function(a,b){this.kc.lh!==b&&(this.kc.lh=b,Ej(this,!1))};f.Qo=function(){return Hj(this,this.kc)};function Fj(a){var b;a.uc&&a.Zc<a.Ak&&(b=a.pc[a.Zc]);return b}function Gj(a,b,c){b.Zc<b.Ak&&(b.pc[b.Zc]=c,9==b.Zc&&8!=b.uj&&uj(a,!0),vj(a))}
function Hj(a,b){var c=0,d=Cc(a.W),e=d-b.Jk;0>e&&(e=0);e%b.Ek>b.Mp&&(c|=1);e%=b.nn;e>b.Op&&(c|=8);b.Jk=d-e;b===a.X?(c|=b.sa&48^48,b.se=!1):c=(b.sa^=9)|240;return b.sa=c}
var hj={948:Y.prototype.gp,949:Y.prototype.fp,952:Y.prototype.hp,954:Y.prototype.ip},ij={948:Y.prototype.Iq,949:Y.prototype.Hq,952:Y.prototype.Jq},jj={980:Y.prototype.Oo,981:Y.prototype.No,984:Y.prototype.Po,985:Y.prototype.Mo,986:Y.prototype.Qo},kj={980:Y.prototype.nq,981:Y.prototype.mq,984:Y.prototype.oq,985:Y.prototype.lq},lj={960:Y.prototype.dn,961:Y.prototype.dn,962:Y.prototype.sp,964:Y.prototype.rp,965:Y.prototype.qp,974:Y.prototype.$o,975:Y.prototype.Zo},mj={954:Y.prototype.un,960:Y.prototype.tn,
961:Y.prototype.tn,962:Y.prototype.Kq,964:Y.prototype.Sq,965:Y.prototype.Rq,970:Y.prototype.Dq,972:Y.prototype.Cq,974:Y.prototype.Bq,975:Y.prototype.Aq,986:Y.prototype.un},nj={963:Y.prototype.tp,966:Y.prototype.Uo,967:Y.prototype.Vo,969:Y.prototype.To,970:Y.prototype.up,972:Y.prototype.vp},oj={963:Y.prototype.Uq,966:Y.prototype.uq,967:Y.prototype.vq,968:Y.prototype.wq,969:Y.prototype.tq};
Da(function(){for(var a=Wa(window.document,"pcjs","video"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),e=window.document.createElement("canvas");if(void 0===e||!e.getContext){c.innerHTML="<br/>Missing <canvas> support. Please try a newer web browser.";break}e.setAttribute("class","pcjs-canvas");e.setAttribute("width",d.screenWidth);e.setAttribute("height",d.screenHeight);e.style.backgroundColor=d.screenColor;e.style.height="auto";0<=(window?window.navigator.userAgent:"").indexOf("MSIE")&&(c.onresize=
function(a,b,c,d){return function(){b.style.height=(a.clientWidth*d/c|0)+"px"}}(c,e,d.screenWidth,d.screenHeight),c.onresize());c.appendChild(e);var m=window.document.createElement("textarea");ya("iOS")&&(m.setAttribute("autocapitalize","off"),m.setAttribute("autocorrect","off"));c.appendChild(m);var n=e.getContext("2d"),d=new Y(d,e,n,m,c);Va(d,c)}});
function Ij(a){this.an=a.adapter;switch(this.an){case 1:this.Pl=1016;this.dh=4;break;case 2:this.Pl=760;this.dh=3;break;default:sa("Unrecognized serial adapter #"+this.an);return}this.ne=null;Ha.call(this,"SerialPort",a,Ij);var b=a.binding,c;a=Jj;b&&(void 0===c&&(c="Panel"),(c=Sa(c,this.id))&&(b=c.qa[b])&&this.Kb(null,a,b))}Pa(Ij);var Jj="buffer";f=Ij.prototype;f.tm=function(a,b){return a==this.Sg?(this.ze=b,this):null};
f.Kb=function(a,b,c){var d=this;switch(b){case Jj:return this.qa[b]=this.ne=c,c.onkeydown=function(a){a=a||window.event;var b=a.keyCode;8===b&&(a.preventDefault&&a.preventDefault(),Kj(d,[b]))},c.onkeypress=function(a){a=a||window.event;Kj(d,[a.which||a.keyCode])},!0}return!1};f.Jc=function(a,b,c,d){this.la=b;this.W=c;this.Sa=d;this.fa=fb(a,"ChipSet");Sb(b,this,Lj,this.Pl);Ub(b,this,Mj,this.Pl);Ya(this)};f.fc=function(a,b){if(!b)if(!a||!this.restore)this.reset();else if(!this.restore(a))return!1;return!0};
f.ec=function(a){return a&&this.save?this.save():!0};f.reset=function(){this.xe()};f.save=function(){var a=new Yd(this),b=0,c=[];c[b++]=this.Xj;c[b++]=this.zm;c[b++]=this.wf;c[b++]=this.Kh;c[b++]=this.ie;c[b++]=this.Ve;c[b++]=this.sd;c[b++]=this.Pc;c[b++]=this.wm;c[b]=this.xg;a.set(0,c);return a.data()};f.restore=function(a){return this.xe(a[0])};
f.xe=function(a){var b=0;void 0===a&&(a=[0,0,384,0,1,0,0,96,48,[]]);this.Xj=a[b++];this.zm=a[b++];this.wf=a[b++];this.Kh=a[b++];this.ie=a[b++];this.Ve=a[b++];this.sd=a[b++];this.Pc=a[b++];this.wm=a[b++];this.xg=a[b];return!0};function Kj(a,b){a.xg=a.xg.concat(b);Nj(a)}function Nj(a){0<a.xg.length&&!(a.Pc&1)&&(a.Xj=a.xg.shift(),a.Pc|=1);var b=-1;a.Pc&1&&a.Kh&1&&(b=4);0<=b?(a.ie&=-8,a.ie|=b,a.fa&&a.dh&&Yh(a.fa,a.dh,100)):(a.ie|=1,a.fa&&a.dh&&Zh(a.fa,a.dh))}
f.pp=function(){var a=this.Ve&128?this.wf&255:this.Xj;this.Pc&=-2;Nj(this);return a};f.ap=function(){return this.Ve&128?this.wf>>8:this.Kh};f.bp=function(){return this.ie};f.cp=function(){return this.Ve};f.ep=function(){return this.sd};f.dp=function(){return this.Pc};f.jp=function(){return this.wm};
f.Tq=function(a,b){if(this.Ve&128)this.wf=this.wf&-256|b;else{this.zm=b;this.Pc&=-97;var c;this.ne?(13!=b&&(8==b?this.ne.value=this.ne.value.slice(0,-1):(this.ne.value+=String.fromCharCode(b),this.ne.scrollTop=this.ne.scrollHeight)),c=!0):c=!1;c&&(this.Pc|=96)}};f.Eq=function(a,b){this.Ve&128?this.wf=this.wf&255|b<<8:this.Kh=b};f.Fq=function(a,b){this.Ve=b};
f.Gq=function(a,b){var c=this.sd;this.sd=b;if(this.ze&&(c^b)&3){var c=this.ze,d=this.sd,e=3==(d&3);if(e){if(!c.uc){var m=!1;c.sd&2||(c.reset(),c.nc("serial mouse reset"),m=!0);c.sd&1||(c.nc("serial mouse ID requested"),m=!0);m&&(Kj(c.Hg,[77,77]),c.nc("serial mouse ID sent"));Oj(c);c.setActive(e)}}else c.uc&&(c.nc("serial mouse inactive"),Pj(c),c.setActive(e));c.sd=d}};
var Lj={0:Ij.prototype.pp,1:Ij.prototype.ap,2:Ij.prototype.bp,3:Ij.prototype.cp,4:Ij.prototype.ep,5:Ij.prototype.dp,6:Ij.prototype.jp},Mj={0:Ij.prototype.Tq,1:Ij.prototype.Eq,3:Ij.prototype.Fq,4:Ij.prototype.Gq};Da(function(){for(var a=Wa(window.document,"pcjs","serial"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),d=new Ij(d);Va(d,c)}});function Qj(a){Ha.call(this,"Mouse",a,Qj);if(this.wk=a.serial)this.Xl="SerialPort";this.setActive(!1);this.Mg=this.fi=!1;this.dd=[];this.Bf=[];Ya(this)}Pa(Qj);f=Qj.prototype;
f.Jc=function(a,b,c,d){this.za=a;this.la=b;this.W=c;this.Sa=d;for(b=null;b=fb(a,"Video",b);)this.dd.push(b)};f.setActive=function(a){this.uc=a};
f.fc=function(a,b){if(!b){if(!a||!this.restore)this.reset();else if(!this.restore(a))return!1;if(this.Xl&&!this.Hg){for(var c=null;(c=fb(this.za,this.Xl,c))&&(!c.tm||!(this.Hg=c.tm(this.wk,this))););if(this.Hg)for(this.Bf=[],c=0;c<this.dd.length;c++){var d;d=this.dd[c];d.ze=this;(d=d.Ta)&&this.Bf.push(d)}else sa(this.id+": "+this.Xl+" "+this.wk+" unavailable")}this.uc?Oj(this):Pj(this)}return!0};f.ec=function(a){return a&&this.save?this.save():!0};f.reset=function(){this.xe()};
f.save=function(){var a=new Yd(this);a.set(0,this.am());return a.data()};f.restore=function(a){return this.xe(a[0])};f.xe=function(a){var b=0;void 0===a&&(a=[!1,-1,-1,0,0,!1,!1,0]);this.setActive(a[b++]);this.ce=a[b++];this.de=a[b++];this.xf=a[b++];this.yf=a[b++];this.ai=a[b++];this.bi=a[b++];this.sd=a[b];return!0};f.am=function(){var a=0,b=[];b[a++]=this.uc;b[a++]=this.ce;b[a++]=this.de;b[a++]=this.xf;b[a++]=this.yf;b[a++]=this.ai;b[a++]=this.bi;b[a]=this.sd;return b};f.hh=function(a){this.fi=a};
function Oj(a){if(!a.Mg)for(var b=0;b<a.Bf.length;b++)Rj(a,a.Bf[b])&&(a.Mg=!0)}function Pj(a){if(a.Mg)for(var b=0;b<a.Bf.length;b++){var c=a.Bf[b];c&&(c.style.cursor="auto")}}function Rj(a,b){return b?(b.addEventListener("mousemove",function(b){a.fn(b)},!1),b.addEventListener("mousedown",function(b){a.dk(b.button,!0)},!1),b.addEventListener("mouseup",function(b){a.dk(b.button,!1)},!1),b.style.cursor="none",!0):!1}
f.fn=function(a){if(this.uc&&this.W&&this.W.ha.Pb){if(0>this.ce||0>this.de)this.ce=a.clientX,this.de=a.clientY;this.fi?(this.xf=a.movementX||a.mozMovementX||a.webkitMovementX||0,this.yf=a.movementY||a.mozMovementY||a.webkitMovementY||0):(this.xf=a.clientX-this.ce,this.yf=a.clientY-this.de);(this.xf||this.yf)&&Sj(this);this.ce=a.clientX;this.de=a.clientY}};
f.dk=function(a,b){if(this.uc&&this.W&&this.W.ha.Pb){var c;!(c=!1!==this.fi)&&(c=this.dd.length)&&(c=this.dd[0],c=c.oo?c.hf(!0):!1);c||(this.fi=null);switch(a){case 0:this.ai!=b&&(this.ai=b,Sj(this));break;case 2:this.bi!=b&&(this.bi=b,Sj(this))}}};function Sj(a){Kj(a.Hg,[64|(a.ai?32:0)|(a.bi?16:0)|(a.yf&192)>>4|(a.xf&192)>>6,a.xf&63,a.yf&63]);a.xf=a.yf=0}Da(function(){for(var a=Wa(window.document,"pcjs","mouse"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),d=new Qj(d);Va(d,c)}});
function Tj(a,b,c){Ha.call(this,"Disk",{id:a.cn+".disk"+ ++Uj},Tj);this.V=a;this.za=a.za;this.Sa=a.Sa;this.Pa=b;this.Ed=b.name;this.Rf=b.Rf;this.gi=this.Qd=!1;this.create(c,b.pb,b.qb,b.xb,b.hb);this.Se=[];this.yh=[];this.ae=null;this.hn=0;this.tk=!1;Ya(this)}var Uj=0;Pa(Tj);f=Tj.prototype;f.Jc=function(a,b,c,d){this.Sa=d};f.fc=function(a,b){b||!this.gi||this.Qd||(Ya(this,!1),this.load(this.Ed,this.rf,null,this.lo,this));return!0};f.lo=function(){Ya(this,!0)};
f.ec=function(a,b){if(this.Qd){var c,d=0;if(this.tk&&!ta("Disk writes are still in progress, shut down anyway?"))return!1;for(;c=Vj(this,!1);)if(d=c[0]){this.V.wa('Unable to save "'+this.Ed+'" (error '+d+")");break}b&&this.Qd&&(c="action=close&volume="+this.rf,c+="&machine="+this.V.Tf(),c+="&user="+this.V.ue(),qa(ra()+"/api/v1/disk?"+c,!0),this.Qd=!1);!d&&a&&this.V.wa(this.Ed+" saved")}return!0};
f.create=function(a,b,c,d,e){this.mode=a;this.pb=b;this.qb=c;this.xb=d;this.hb=e;this.Ua=[];if("preload"!=this.mode){a=Array(this.pb);for(b=0;b<a.length;b++){c=Array(this.qb);for(d=0;d<c.length;d++){e=Array(this.xb);for(var m=1;m<=e.length;m++)e[m-1]=Wj(null,b,d,m,this.hb,"local"==this.mode?0:null);c[d]=e}a[b]=c}this.Ua=a}this.Nf=null};
f.load=function(a,b,c,d,e){var m=b;if(!this.gf)if(this.Ed=a,this.rf=b,this.gf=d,this.eo=e||this.V,c){var n=this,p=new FileReader;p.onload=function(){var a=p.result,b,c=a?a.byteLength:0,d=ba[c];if(d){n.pb=d[0];n.qb=d[1];n.xb=d[2];n.hb=512;b=n.hb>>2;var e=d=0,a=new DataView(a,0,c);n.Ua=Array(n.pb);for(c=0;c<n.Ua.length;c++)for(var m=n.Ua[c]=Array(n.qb),W=0;W<m.length;W++)for(var ia=m[W]=Array(n.xb),ja=0;ja<ia.length;ja++){for(var Ta=Wj(null,c,W,ja+1,n.hb,0),nb=Ta.data,Qb=0;Qb<b;Qb++,e+=4)var Kc=nb[Qb]=
a.getInt32(e,!0),d=d+Kc&-1;Ta.Gc=b;ia[ja]=Ta}n.Nf=d;b=n}else n.wa("Unrecognized diskette format ("+c+" bytes)");n.gf&&(n.gf.call(n.V,n.Pa,b,n.Ed,n.rf),n.gf=null)};p.readAsArrayBuffer(c)}else 0>b.indexOf("/api/v1/dump")&&(a=ga(b),"json"==a?m=encodeURI(b):"demandrw"==this.mode||"demandro"==this.mode?(m=Xj(this,b),this.gi=!0):(c="path",d="&mbhd=10",!b.indexOf("http:")||!b.indexOf("ftp:")||0<="dsk ima img 360 720 12 144".split(" ").indexOf(a)?(c="disk",d="&mbhd=0"):-1!==b.indexOf("/",b.length-1)&&(c=
"dir"),m=ra()+"/api/v1/dump?"+c+"="+encodeURIComponent(b)+(this.Rf?"":d)+"&format=json")),qa(m,!0,null,this,this.jo,b)};
f.jo=function(a,b,c,d){var e=null;this.Sf=!1;var m=0>c&&this.za&&!this.za.ha.cc;if(this.gi)c?this.V.wa('Unable to connect to disk "'+d+'" (error '+c+": "+b+")",m):(this.Qd=!0,e=this);else if(c)this.V.wa('Unable to load disk "'+this.Ed+'" (error '+c+")",m);else try{if(0<fa(a,!0).toLowerCase().indexOf("-readonly"))this.Sf=!0;else{var n=b.indexOf("\n");0<n&&1024>n&&0<b.substring(0,n).indexOf("write-protected")&&(this.Sf=!0)}var p;p="<"==b.substr(0,1)?["Missing disk image: "+this.Ed]:0>b.indexOf("0x")&&
'["'!=b.substr(0,2)?JSON.parse(b.replace(/([a-z]+):/gm,'"$1":').replace(/\/\/[^\n]*/gm,"")):eval("("+b+")");if(p.length)if(1==p.length)sa(p[0]);else{this.pb=p.length;this.qb=p[0].length;this.xb=p[0][0].length;var v=p[0][0][0];this.hb=v&&v.length||512;for(b=a=0;b<this.pb;b++)for(c=0;c<this.qb;c++)for(d=0;d<this.xb;d++)if(v=p[b][c][d]){var w=v.length;void 0===w&&(w=v.length=512);var w=w>>2,G=v.pattern;void 0===G&&(G=v.pattern=0);var Q=v.data;if(void 0===Q){var M=v.bytes;if(void 0!==M&&M.length){for(var m=
w<<2,R=M.length;R<m;R++)M[R]=G;this.fill(v,M,0)}else Q=[],G=v.pattern=G|G<<8|G<<16|G<<24,v.data=Q;delete v.bytes}Wj(v,b,c);for(m=0;m<Q.length;m++)a=a+Q[m]&-1}this.Ua=p;this.Nf=a;e=this}else sa("Empty disk image: "+this.Ed)}catch(W){sa("Disk image error: "+W.message)}this.gf&&(this.gf.call(this.eo,this.Pa,e,this.Ed,this.rf),this.gf=null)};function Wj(a,b,c,d,e,m){a||(a={sector:d,length:e,data:[],pattern:m});a.yo=b;a.Ao=c;a.gd=a.Gc=0;a.La=!1;return a}
function Xj(a,b){var c;c="action=open&volume="+b+("&mode="+a.mode);c+="&chs="+a.pb+":"+a.qb+":"+a.xb+":"+a.hb;c+="&machine="+a.V.Tf();c+="&user="+a.V.ue();return ra()+"/api/v1/disk?"+c}function Yj(a,b,c,d,e,m,n){if(a.Qd){var p;p="action=read&volume="+a.rf;p+="&chs="+a.pb+":"+a.qb+":"+a.xb+":"+a.hb;p=p+("&addr="+b+":"+c+":"+d+":"+e)+("&machine="+a.V.Tf());p+="&user="+a.V.ue();qa(ra()+"/api/v1/disk?"+p,m,null,a,a.mo,[b,c,d,e,m,n])}else n&&n(-1,!1)}
f.mo=function(a,b,c,d){var e=!1;a=d[0];var m=d[1],n=d[2],p=d[3];if(!c){b=JSON.parse(b);for(e=0;p--;){var v=this.seek(a,m,n,!0);if(!v)break;this.fill(v,b,e);e+=v.length;n++}e=d[4]}(d=d[5])&&d(c,e)};f.no=function(a,b,c,d){a=d[0];b=d[1];var e=d[2],m=d[3];d=d[4];this.tk=!1;if(0<=a&&a<this.Ua.length&&0<=b&&b<this.Ua[a].length)for(--e;0<m--&&0<=e&&e<this.Ua[a][b].length;e++){var n=this.Ua[a][b][e];c?Zj(this,n,!1):n.La||(n.gd=n.Gc=0)}d&&ak(this)};
function Zj(a,b,c){b.La=!0;var d=a.Se.indexOf(b);0<=d&&(a.Se.splice(d,1),a.yh.splice(d,1));a.Se.push(b);a.yh.push(la());c&&ak(a)}function ak(a){if(a.Se.length){var b=a.yh[0]+2E3;a.ae&&a.hn<b&&(clearTimeout(a.ae),a.ae=null);if(!a.ae){var c=la(),b=b-c;0>b&&(b=0);2E3<b&&(b=2E3);a.ae=setTimeout(function(){Vj(a,!0)},b);a.hn=c+b}}else a.ae&&(clearTimeout(a.ae),a.ae=null)}
function Vj(a,b){b&&(a.ae=null);var c=a.Se[0];if(c){for(var d=c.yo,e=c.Ao,c=c.sector,m=0,n=[],p=c-1;p<a.Ua[d][e].length;p++){var v=a.Ua[d][e][p];if(!v.La)break;var w=a.Se.indexOf(v);a.Se.splice(w,1);a.yh.splice(w,1);n=n.concat(bk(v));v.La=!1;m++}a.Qd?(p={},a.tk=!0,p.action="write",p.volume=a.rf,p.chs=a.pb+":"+a.qb+":"+a.xb+":"+a.hb,p.addr=d+":"+e+":"+c+":"+m,p.machine=a.V.Tf(),p.user=a.V.ue(),p.data=JSON.stringify(n),d=qa(ra()+"/api/v1/disk",b,p,a,a.no,[d,e,c,m,b])):d=!1;return b||d}return!1}
f.info=function(){return this.Ua.length?[this.Ua.length,this.Ua[0].length,this.Ua[0][0].length,this.Ua[0][0][0].length]:[0,0,0,0]};
f.seek=function(a,b,c,d,e){var m=null,n=this.Pa,p=this.Ua[a];if(p){var v=p[b];if(!v&&n.Uj&&b<n.qb)for(v=p[b]=Array(n.je),p=0;p<v.length;p++)v[p]=Wj(null,a,b,p+1,n.ob,0);if(v){for(p=0;p<v.length;p++)if(v[p]&&v[p].sector==c){m=v[p];if(null===m.pattern)if(d)m.pattern=0;else{for(d=1;++p<v.length;)null===v[p].pattern&&d++;Yj(this,a,b,c,d,null!=e,function(a,b){a&&(m=null);e&&e(m,b)});return e?null:m}break}!m&&n.Uj&&9==n.bb&&(m=v[p]=Wj(null,a,b,n.bb,n.ob,0))}}e&&e(m,!1);return m};
f.fill=function(a,b,c){for(var d=a.length>>2,e=Array(d),m=0;m<d;m++)e[m]=b[c]|b[c+1]<<8|b[c+2]<<16|b[c+3]<<24,c+=4;a.data=e};function bk(a){var b=a.length,c=Array(b),d=0,b=b>>2,e=a.data;a=a.pattern;for(var m=0;m<b;m++){var n=m<e.length?e[m]:a;c[d++]=n&255;c[d++]=n>>8&255;c[d++]=n>>16&255;c[d++]=n>>24&255}return c}function ck(a,b){var c=-1;if(a&&b<a.length)var c=a.data,d=b>>2,c=(d<c.length?c[d]:a.pattern)>>((b&3)<<3)&255;return c}
f.write=function(a,b,c){if(this.Sf)return!1;if(b<a.length){if(c!=ck(a,b)){var d=a.data,e=a.pattern,m=b>>2;b=(b&3)<<3;for(var n=d.length;n<=m;n++)d[n]=e;a.Gc?m<a.gd?(a.Gc+=a.gd-m,a.gd=m):m>=a.gd+a.Gc&&(a.Gc+=m-(a.gd+a.Gc)+1):(a.gd=m,a.Gc=1);d[m]=d[m]&~(255<<b)|c<<b;this.Qd&&Zj(this,a,!0)}return!0}return null};
f.save=function(){var a=0,b=[];b[a++]=[this.rf,this.Nf,this.pb,this.qb,this.xb,this.hb];if(!this.Qd&&!this.Sf)for(var c=this.Ua,d=0;d<c.length;d++)for(var e=0;e<c[d].length;e++)for(var m=0;m<c[d][e].length;m++){var n=c[d][e][m];if(n&&n.Gc){for(var p=[],v=0,w=n.gd,G=n.gd+n.Gc;w<G;)p[v++]=n.data[w++];b[a++]=[d,e,m,n.gd,p]}}return b};
f.restore=function(a){var b=0,c="unsupported restore format";if(a&&0<a.length){var d=0,e=a[d++];e&&2<=e.length&&(!this.Ua.length&&6<=e.length?this.create("local",e[2],e[3],e[4],e[5]):null!=e[1]&&null!=this.Nf&&e[1]!=this.Nf&&(c="original checksum ("+e[1]+") differs from current checksum ("+this.Nf+")",b=-2));for(this.Ua.length||(b=-1);d<a.length&&0<=b;){var m=0,n=a[d++],p=n[m++],v=n[m++],w=n[m++];if(p>=this.Ua.length||v>=this.Ua[p].length||w>=this.Ua[p][v].length){c="sector (CHS="+p+":"+v+":"+w+") out of range ("+
b+" changes applied)";b=-1;break}if(this.Sf){c="unable to modify write-protected disk";b=-1;break}e=n[m++];m=n[m++];n=e+m.length;if(p=this.Ua[p][v][w]){for(v=p.data.length;v<e;)p.data[v++]=p.pattern;v=0;p.gd=e;for(p.Gc=m.length;e<n;)p.data[e++]=m[v++];b++}}}0>b&&-2!=b&&this.V.wa("Unable to restore disk '"+this.Ed+": "+c);return b};
f.toJSON=function(){var a=JSON.stringify(this.Ua),a=a.replace(/,"length":512/gm,"").replace(/,"pattern":0/gm,""),a=a.replace(/"(sector|length|data|pattern)":/gm,"$1:"),a=a.replace(/,"[^"]*":([0-9]+|true|false)/gm,"");return a=a.replace(/(sector|length|data|pattern):/gm,'"$1":')};
function dk(a){Ha.call(this,"FDC",a,dk);this.dmaRead=this.ik;this.dmaWrite=this.jk;this.dmaFormat=this.fo;this.Ze=null;if(a.autoMount&&(this.Ze=a.autoMount,"string"==typeof this.Ze))try{this.Ze=eval("("+a.autoMount+")")}catch(b){sa("FDC auto-mount error: "+b.message+" ("+a.autoMount+")"),this.Ze=null}this.Cc=[];this.Pm=!ya("Mobi")&&window&&"FileReader"in window}Pa(dk);g={};aa={};
var ek={3:{Md:3,me:0,name:aa.ws},4:{Md:2,me:1,name:aa.us},5:{Md:9,me:7,name:aa.Is},6:{Md:9,me:7,name:aa.os},7:{Md:2,me:0,name:aa.qs},8:{Md:1,me:2,name:aa.vs},10:{Md:2,me:7,name:aa.ps},13:{Md:6,me:7,name:aa.Zr},15:{Md:3,me:0,name:aa.ts}};f=dk.prototype;
f.Kb=function(a,b,c){var d=this;switch(b){case "listDisks":return this.qa[b]=c,c.onchange=function(){var a=d.qa.descDisk,b=c.options[c.selectedIndex];if(a&&b){var n={};if(b=b.getAttribute("data-value"))try{n=eval("({"+b+"})")}catch(p){sa("FDC option error: "+p.message)}b=n.desc;void 0===b&&(b="");n=n.href;void 0!==n&&(b='<a href="'+n+'" target="_blank">'+b+"</a>");a.innerHTML=b}},!0;case "descDisk":case "listDrives":return this.qa[b]=c,c.onchange=function(){var a=ca(c.value,10);null!=a&&fk(d,a)},
!0;case "loadDrive":return this.qa[b]=c,c.onclick=function(){var a=d.qa.listDisks;a&&gk(d,a.options[a.selectedIndex].text,a.value)},!0;case "mountDrive":return this.Pm?(this.qa[b]=c,c.addEventListener("change",function(){var a=c.children[0];a.children[1].disabled=!a.children[0].files.length}),c.onsubmit=function(a){if(a=a.currentTarget[1].files[0]){var b=a.name;gk(d,fa(b,!0),b,a)}return!1}):c.parentNode.removeChild(c),!0}return!1};
f.Jc=function(a,b,c,d){this.la=b;this.W=c;this.Sa=d;this.za=a;this.fa=fb(a,"ChipSet");this.Rd();Sb(b,this,hk);Ub(b,this,ik);this.Pm&&jk(this,"Local Disk","?");jk(this,"Remote Disk","??");this.Bg()||Ya(this)};
f.fc=function(a,b){if(!b){if(!a||!this.restore){if(this.reset(),this.za.qk){this.Cc=[];for(var c=0;c<this.ya.length;c++)kk(this,c,!0);this.Bg(!0)}}else if(!this.restore(a))return!1;if(c=this.qa.listDrives){for(;c.firstChild;)c.removeChild(c.firstChild);c.textContent="";for(var d=0;d<this.Ik;d++){var e=window.document.createElement("option");e.value=d;e.textContent=String.fromCharCode(65+d)+":";c.appendChild(e)}0<this.Ik&&(c.value="0",fk(this,0))}}return!0};
f.ec=function(a){return a&&this.save?this.save():!0};f.reset=function(){this.Rd()};f.save=function(){var a=new Yd(this);a.set(0,this.Yl());return a.data()};f.restore=function(a){return this.Rd(a[0])};
f.Rd=function(a){var b=0,c,d=!0;void 0===a&&(a=[0,0,128,Array(9),0,0,0,[]]);this.cb=a[b++];b++;this.sa=a[b++];this.hc=a[b++];this.Bb=a[b++];this.ib=a[b++];this.hg=a[b++];var e=a[b++];c=a[b++];null!=c&&(this.Cc=c);void 0===this.ya&&(this.Ik=4,this.fa&&(this.Ik=Fh(this.fa)),this.ya=Array(4));for(c=0;c<this.ya.length;c++){var m=this.ya[c];if(void 0===m){var m=this.ya[c]={},n;if(this.fa)a:{n=this.fa;if(c<Fh(n)){if(!n.ee){n=360;break a}if(c<n.ee.length){n=n.ee[c];break a}}n=0}else n=0;switch(n){case 160:case 180:m.qb=
1;default:m.pb=40;m.xb=9;break;case 720:m.pb=80;m.xb=9;break;case 1200:m.pb=80;m.xb=15;break;case 1440:m.pb=80,m.xb=18}}this.xk(m,c,e[c])||(d=!1)}this.Je=a[b++]||0;this.yn=a[b]||0;return d};f.Yl=function(){var a=0,b=[];b[a++]=this.cb;b[a++]=0;b[a++]=this.sa;b[a++]=this.hc;b[a++]=this.Bb;b[a++]=this.ib;b[a++]=this.hg;b[a++]=this.$l();for(var c=a++,d=0;d<this.ya.length;d++){var e=this.ya[d];e.ua&&lk(this,e.sf,e.ua)}b[c]=this.Cc;b[a++]=this.Je;b[a]=this.yn;return b};
f.xk=function(a,b,c){var d=0,e=!0;a.cb=b;a.Uc=a.Pf=!1;void 0===c&&(c=[192,!0,0,2,0]);"boolean"==typeof c[1]&&(c[1]=["Floppy Drive",a.pb||40,a.qb||c[3],a.xb||9,a.hb||512,c[1],a.ti,a.ah,a.bh]);a.Za=c[d++];var m=c[d++];a.name=m[0];a.pb=m[1];a.qb=m[2];a.xb=m[3];a.hb=m[4];a.Rf=m[5];(a.ti=m[6])?(a.ah=m[7],a.bh=m[8]):(a.ti=a.pb,a.ah=a.qb,a.bh=a.xb);a.Oa=c[d++];a.he=c[d++];a.ub=c[d++];a.he=100<=a.he?a.he-100:a.he-a.ub;a.bb=c[d++];a.je=c[d++];a.ob=c[d++];a.Qa=c[d++];a.Na=null;a.ua||(a.sf="");var n=c[d++];
102==n&&(n=!1);"boolean"==typeof n?(m=c[d++],c=c[d],n?(d=this.ya[b],kk(this,b,!0,!0),d.Pf=!0,b=new Tj(this,d,"preload"),this.Jm(d,b,m,c,!0)):mk(this,b,m,c,!0)?a.ua&&c&&nk(this,m,c,a.ua):Ya(this,!1)):void 0!==n&&a.ua&&0>a.ua.restore(n)&&(e=!1);e&&a.ua&&void 0!==a.Qa&&(a.Na=a.ua.seek(a.ub,a.Oa,a.bb));return e};f.$l=function(){for(var a=0,b=[],c=0;c<this.ya.length;c++)b[a++]=this.Zl(this.ya[c]);return b};
f.Zl=function(a){var b=0,c=[];c[b++]=a.Za;c[b++]=[a.name,a.pb,a.qb,a.xb,a.hb,a.Rf,a.ti,a.ah,a.bh];c[b++]=a.Oa;c[b++]=a.he+100;c[b++]=a.ub;c[b++]=a.bb;c[b++]=a.je;c[b++]=a.ob;c[b++]=a.Qa;c[b++]=a.Pf;c[b++]=a.Fn;c[b]=a.sf;return c};f.Bg=function(a){a||(this.We=0);if(this.Ze)for(var b in this.Ze){var c=this.Ze[b];if(c.name&&c.path){var d=b.charCodeAt(0)-65;if(0<=d&&d<this.ya.length){!mk(this,d,c.name,c.path,!0)&&a&&Ya(this,!1);continue}}this.wa("Unrecognized auto-mount specification for drive "+b)}return!!this.We};
function gk(a,b,c,d){var e,m=a.qa.listDrives;if(m&&!isNaN(e=ca(m.value,10))&&0<=e&&e<a.ya.length)if(c)if("?"==c)a.wa('Use "Choose File" and "Mount" to select and load a local disk.');else{if("??"==c){c=window.prompt("Enter the URL of a remote disk image.","")||"";if(!c)return;b=fa(c);a.oc("Attempting to load "+c+' as "'+b+'"')}for(a.oc("loading disk "+c+"...");mk(a,e,b,c,!1,d)&&window.confirm("Click OK to reload the original disk.\n(WARNING: All disk changes will be discarded)");){for(var m=a,n=c,
p=void 0,p=0;p<m.Cc.length;p++)if(m.Cc[p][1]==n){m.Cc.splice(p,1);break}kk(a,e,!1,!0)}}else kk(a,e);else a.wa("Nothing to load")}function mk(a,b,c,d,e,m){var n=a.ya[b];if(d&&n.sf!=d){kk(a,b,e,!0);if(n.Uc)return a.wa("Drive "+b+" busy"),!0;n.Uc=!0;e&&(n.ef=!0,a.We++);n.Pf=!!m;(new Tj(a,n,"preload")).load(c,d,m,a.Jm);return!1}return!0}
f.Jm=function(a,b,c,d,e){var m;a.Uc=!1;b&&(m=b.info(),b&&m[0]>a.pb||m[1]>a.qb)&&(this.wa('Diskette "'+c+'" too large for drive '+String.fromCharCode(65+a.cb)),b=null);b?(a.ua=b,a.Fn=c,a.sf=d,nk(this,c,d,b),m=b.info(),this.Je|=128,this.wa('Mounted diskette "'+c+'" in drive '+String.fromCharCode(65+a.cb),a.ef||e),a.ti=m[0],a.ah=m[1],a.bh=m[2]):a.Pf=!1;a.ef&&(a.ef=!1,--this.We||Ya(this));fk(this,a.cb)};
function jk(a,b,c){if(a=a.qa.listDisks){for(var d=0;d<a.options.length;d++)if(a.options[d].value==c)return;d=window.document.createElement("option");d.value=c;d.textContent=b;a.appendChild(d)}}function fk(a,b){if(0<=b&&b<a.ya.length){var c=a.ya[b],d=a.qa.listDisks,e=a.qa.listDrives;if(d&&e&&(e=ca(e.value,10),c=c.Pf?"?":c.sf,!isNaN(e)&&e==b)){for(e=0;e<d.options.length;e++)if(d.options[e].value==c){d.selectedIndex!=e&&(d.selectedIndex=e);break}e==d.options.length&&(d.selectedIndex=0)}}}
function kk(a,b,c,d){var e=a.ya[b];e.ua&&(lk(a,e.sf,e.ua),e.Fn="",e.sf="",e.ua=null,e.Pf=!1,a.Je|=128,d||a.wa("Drive "+String.fromCharCode(65+b)+" unloaded",c),c||d||fk(a,b))}function nk(a,b,c,d){var e;for(e=0;e<a.Cc.length;e++)if(a.Cc[e][1]==c){d.restore(a.Cc[e][2]);return}a.Cc[e]=[b,c,[]]}function lk(a,b,c){var d;for(d=0;d<a.Cc.length;d++)if(a.Cc[d][1]==b){a.Cc[d][2]=c.save();break}}f.zq=function(a,b){b&4?this.hg&4||this.hg&8&&this.fa&&Yh(this.fa,6):this.Rd();this.hg=b};f.Yo=function(){return this.sa};
f.Wo=function(){var a=0;this.Bb<this.ib&&(a=this.hc[this.Bb]);this.hg&8&&this.fa&&Zh(this.fa,6);++this.Bb>=this.ib&&(this.sa&=-81,this.Bb=this.ib=0);return a};
f.yq=function(a,b){this.ib<this.hc.length&&(this.hc[this.ib++]=b);var c=this.hc[0]&31;if(void 0!==ek[c]&&this.ib>=ek[c].Md){var d=!1;this.Bb=0;var c=this.Ma(),e,m,n,p,v,w=c&31;switch(w){case 3:this.Ma(g.xs);this.Ma(g.cs);this.Wb();break;case 4:m=this.Ma(g.pg);this.cb=m&3;e=this.ya[this.cb];this.Wb();this.gc((e.Za&-16777216)>>>24,g.As);break;case 5:case 6:m=this.Ma(g.pg);d=m>>2&1;this.cb=m&3;e=this.ya[this.cb];e.Oa=d;m=e.ub=this.Ma(g.gm);n=this.Ma(g.hm);p=e.bb=this.Ma(g.jm);v=this.Ma(g.Lj);e.ob=128<<
v;e.je=this.Ma(g.Xr);this.Ma(g.Sn);this.Ma(g.Wr);6==w?(w=e,w.Za=72,w.ua&&(w.Na=null,w.Za=0,this.fa&&(Sh(this.fa,2,this,"dmaRead",w),Oh(this.fa,2)))):(w=e,w.Za=72,w.ua&&(w.ua.Sf?w.Za=576:(w.Na=null,w.Za=0,this.fa&&(Sh(this.fa,2,this,"dmaWrite",w),Oh(this.fa,2)))));ok(this,e,c,d,m,n,p,v);d=!0;break;case 7:m=this.Ma(g.pg);this.cb=m&3;e=this.ya[this.cb];e.ub=e.he=0;e.Za=268435488;this.Wb();d=!0;break;case 8:e=this.ya[this.cb];e.Oa=0;this.Wb();this.gc(e.cb|e.Oa<<2|e.Za&255,g.Un);this.gc(e.ub,g.ms);this.cb=
this.cb+1&3;break;case 10:m=this.Ma(g.pg);d=m>>2&1;this.cb=m&3;e=this.ya[this.cb];m=e.ub;n=e.Oa=d;p=e.bb=1;v=0;e.Za=0;e.ua&&(e.Na=e.ua.seek(e.ub,e.Oa,e.bb))?v=e.Na.length:e.Za=72;ok(this,e,c,d,m,n,p,v);d=!0;break;case 13:m=this.Ma(g.pg);d=m>>2&1;this.cb=m&3;e=this.ya[this.cb];m=e.ub;n=e.Oa=d;p=1;v=this.Ma(g.Lj);e.ob=128<<v;e.je=this.Ma(g.ss);this.Ma(g.Sn);e.vm=this.Ma(g.Rn);w=e;w.Za=72;w.ua&&(w.Na=null,w.Za=0,this.fa&&(w.Kf=0,w.Nc=Array(4),w.Uj=!0,w.Sh=0,Sh(this.fa,2,this,"dmaFormat",w),Oh(this.fa,
2),w.Uj=!1));ok(this,e,c,d,m,n,p,v);d=!0;break;case 15:m=this.Ma(g.pg),this.cb=m&3,e=this.ya[this.cb],e.Oa=m>>2&1,m=this.Ma(g.js),e.ub+=m-e.he,0>e.ub&&(e.ub=0),e.ub>=e.pb&&(e.ub=e.pb-1),e.he=m,e.Za=32,e.ub||(e.Za|=268435456),this.Wb(),d=!0}0<this.ib&&(this.sa|=80);this.hg&8&&(!e||e.Za&8||!d||this.fa&&Yh(this.fa,6))}};f.Xo=function(){var a=this.Je;this.Je&=-129;return a};f.xq=function(a,b){this.yn=b};
function ok(a,b,c,d,e,m,n,p){a.Wb();a.gc(b.cb|b.Oa<<2|b.Za&255,g.Un);a.gc((b.Za&65280)>>>8,g.ys);a.gc((b.Za&16711680)>>>16,g.zs);var v=0;if(e!=b.ub||m!=b.Oa)v=n=1;c&128&&(m^=v,d||(v=0));a.gc(e+v,g.gm);a.gc(m,g.hm);a.gc(n,g.jm);a.gc(p,g.Lj)}f.Ma=function(){var a=this.hc[this.Bb];this.Bb++;return a};f.Wb=function(){this.Bb=this.ib=0};f.gc=function(a){this.hc[this.ib++]=a};f.ik=function(a,b,c){void 0===b||0>b?this.dg(a,c):c(-1,!1)};f.jk=function(a,b){return void 0!==b&&0<=b?this.og(a,b):-1};
f.fo=function(a,b){return void 0!==b&&0<=b?this.dm(a,b):-1};f.dg=function(a,b){var c=-1,d=null,e=0;if(!a.Za&&a.ua){do{if(a.Na&&(e=a.Qa,0<=(c=ck(a.Na,a.Qa++)))){d=a.Na;break}a.Na=a.ua.seek(a.ub,a.Oa,a.bb);if(!a.Na){a.Za=1088;break}a.Qa=0;this.Ag(a)}while(1)}b(c,!1,d,e)};f.og=function(a,b){if(a.Za||!a.ua)return-1;do{if(a.Na&&a.ua.write(a.Na,a.Qa++,b))break;a.Na=a.ua.seek(a.ub,a.Oa,a.bb);if(!a.Na){a.Za=8256;b=-1;break}a.Qa=0;this.Ag(a)}while(1);return b};
f.Ag=function(a){a.bb++;a.bb>=a.bh+1&&(a.bb=1,a.Oa++,a.Oa>=a.ah&&(a.Oa=0,a.ub++))};f.dm=function(a,b){if(a.Za)return-1;a.Nc[a.Kf++]=b;if(a.Kf==a.Nc.length){a.ub=a.Nc[0];a.Oa=a.Nc[1];a.bb=a.Nc[2];a.ob=128<<a.Nc[3];for(var c=a.Kf=0;c<a.ob;c++)if(0>this.og(a,a.vm))return-1;a.Sh++}a.Sh>=a.je&&(b=-1);return b};var hk={1012:dk.prototype.Yo,1013:dk.prototype.Wo,1015:dk.prototype.Xo},ik={1010:dk.prototype.zq,1013:dk.prototype.yq,1015:dk.prototype.xq};
Da(function(){for(var a=Wa(window.document,"pcjs","fdc"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),d=new dk(d);Va(d,c)}});function Z(a){Ha.call(this,"HDC",a,Z);this.dmaRead=this.ik;this.dmaWrite=this.jk;this.dmaWriteBuffer=this.ho;this.dmaWriteFormat=this.io;this.Oj=[];if(a.drives)try{this.Oj=eval("("+a.drives+")")}catch(b){sa("HDC drive configuration error: "+b.message+" ("+a.drives+")")}this.Rg=(this.df="at"==a.type)?1:0;this.zo=this.df?2:3}Pa(Z);
var pk=[{0:[306,2],1:[375,8],2:[306,6],3:[306,4]},{1:[306,4],2:[615,4],3:[615,6],4:[940,8],5:[940,6],6:[615,4],7:[462,8],8:[733,5],9:[900,15],10:[820,3],11:[855,5],12:[855,7],13:[306,8],14:[733,7]}];f=Z.prototype;f.Kb=function(){return!1};f.Jc=function(a,b,c,d){this.la=b;this.W=c;this.Sa=d;this.za=a;this.fa=fb(a,"ChipSet");Sb(b,this,this.df?qk:rk);Ub(b,this,this.df?sk:tk);Vd(c,19,this,this.zp);Vd(c,64,this,this.Ap);this.reset();this.Bg()||Ya(this)};
f.fc=function(a,b){if(!b)if(!a||!this.restore)this.Rd(),this.za.qk&&this.Bg(!0);else if(!this.restore(a))return!1;return!0};f.ec=function(a){return a&&this.save?this.save():!0};f.Tf=function(){return this.za?this.za.Tf():""};f.ue=function(){return this.za?this.za.ue():""};f.reset=function(){this.Rd(null,!0)};f.save=function(){var a=new Yd(this);a.set(0,this.Yl());return a.data()};f.restore=function(a){return this.Rd(a[0])};
f.Rd=function(a,b){var c=0,d=!0;if(this.df)null==a&&(a=[0,0,0,0,0,0,0,0,64,0]),this.Ie=a[c++],this.En=a[c++],this.Ke=a[c++],this.Aj=a[c++],this.wj=a[c++],this.vj=a[c++],this.eg=a[c++],this.sa=a[c++],this.Ql=a[c++],this.yj=a[c++];else{null==a&&(a=[0,0,Array(14),0,0]);this.mh=a[c++];this.sa=a[c++];this.hc=a[c++];this.Bb=a[c++];this.ib=a[c++];this.Dn=a[c++];this.Cn=a[c++];this.Bn=a[c++];var e=a[c++];void 0!==e?this.Vf=e:void 0===this.Vf&&(this.Vf=-1)}void 0===this.ya&&(this.ya=Array(this.Oj.length));
c=a[c];void 0===c&&(c=[]);for(e=0;e<this.ya.length;e++){void 0===this.ya[e]&&(this.ya[e]={});var m=this.ya[e];this.xk(e,m,this.Oj[e],c[e],b)||(d=!1);null!=this.mh&&1>=e&&(this.mh|=(m.type&3)<<(1-e<<1))}return d};
f.Yl=function(){var a=0,b=[];this.df?(b[a++]=this.Ie,b[a++]=this.En,b[a++]=this.Ke,b[a++]=this.Aj,b[a++]=this.wj,b[a++]=this.vj,b[a++]=this.eg,b[a++]=this.sa,b[a++]=this.Ql,b[a++]=this.yj):(b[a++]=this.mh,b[a++]=this.sa,b[a++]=this.hc,b[a++]=this.Bb,b[a++]=this.ib,b[a++]=this.Dn,b[a++]=this.Cn,b[a++]=this.Bn,b[a++]=this.Vf);b[a]=this.$l();return b};
f.xk=function(a,b,c,d,e){var m=0,n=!0;void 0===d&&(d=[0,0,!1,Array(8)]);b.cb=a;b.errorCode=d[m++];b.Jn=d[m++];b.Rf=d[m++];b.Df=d[m++];b.Ef=d[m++];b.Oa=d[m++];b.qb=d[m++];b.Pe=d[m++];b.bb=d[m++];b.je=d[m++];b.ob=d[m++];b.Ph=this.df?0:1;b.name=c.name;void 0===b.name&&(b.name="Hard Drive");b.path=c.path;b.mode=c.mode||(b.path?"preload":"local");"demandro"!=b.mode&&"demandrw"!=b.mode||this.ue()||(b.mode="local");b.type=c.type;if(void 0===b.type||void 0===pk[this.Rg][b.type])b.type=this.zo;c=pk[this.Rg][b.type];
b.xb=c[2]||17;b.hb=c[3]||512;if(e&&this.fa&&(e=this.fa,c=b.type,e.ea)){var p=e.ea[18],p=a?p&240|c:p&15|c<<4;e.ea&&(e.ea[18]=p,th(e))}void 0===b.ua&&(b.ua=null,this.wa("Type "+b.type+' "'+b.name+'" is fixed disk '+a,!0));uk(this,b);b.Qa=d[m++];b.Na=null;b.ua&&(a=d[m],void 0!==a&&0>b.ua.restore(a)&&(n=!1),n&&void 0!==b.Qa&&(b.Na=b.ua.seek(b.Pe,b.Oa,b.bb+b.Ph)));return n};f.$l=function(){for(var a=0,b=[],c=0;c<this.ya.length;c++)b[a++]=this.Zl(this.ya[c]);return b};
f.Zl=function(a){var b=0,c=[];c[b++]=a.errorCode;c[b++]=a.Jn;c[b++]=a.Rf;c[b++]=a.Df;c[b++]=a.Ef;c[b++]=a.Oa;c[b++]=a.qb;c[b++]=a.Pe;c[b++]=a.bb;c[b++]=a.je;c[b++]=a.ob;c[b++]=a.Qa;c[b]=a.ua?a.ua.save():null;return c};
function uk(a,b,c){if(b){var d=0,e=0;null==c&&((d=b.Df[2])?e=b.Df[0]<<8|b.Df[1]:c=b.type);null==c||d||(d=pk[a.Rg][c][1],e=pk[a.Rg][c][0]);d&&((c=pk[a.Rg][b.type])&&e!=c[0]&&d!=c[1]&&a.wa("Warning: drive parameters ("+e+","+d+") do not match drive type "+b.type+" ("+c[0]+","+c[1]+")"),b.pb=e,b.qb=d,null==b.ua&&(b.ua=new Tj(a,b,b.mode)))}}
f.Bg=function(a){a||(this.We=0);for(var b=0;b<this.ya.length;b++){var c=this.ya[b];if(c.name&&c.path){if(!(a&&c.ua&&c.ua.gi)){var d;d=c.name;var c=c.path,e=this.ya[b];e.Uc?(this.wa("Drive "+b+" busy"),d=!0):(e.Uc=!0,e.ef=!0,this.We++,(e.ua||new Tj(this,e,e.mode)).load(d,c,null,this.ko),d=!1);!d&&a&&Ya(this,!1)}}else a&&void 0!==c.type&&(c.ua=null,uk(this,c,c.type))}return!!this.We};
f.ko=function(a,b,c){a.Uc=!1;(a.ua=b)&&this.wa('Mounted disk "'+c+'" in drive '+String.fromCharCode(67+a.cb),a.ef);a.ef&&(a.ef=!1,--this.We||Ya(this))};f.xp=function(){var a=0;this.Bb<this.ib&&(a=this.hc[this.Bb]);this.fa&&Zh(this.fa,5);this.sa&=-33;++this.Bb>=this.ib&&(this.Bb=this.ib=0,this.sa&=-15);return a};f.Vq=function(a,b){this.ib<this.hc.length&&(this.hc[this.ib++]=b);var c=12!=this.hc[0]?6:this.hc.length;6==this.ib&&(this.sa&=-2);this.ib>=c&&(this.sa|=2,this.sa&=-2,vk(this))};
f.yp=function(){var a=this.sa;this.Bb<this.ib&&(this.sa|=1);return a};f.Yq=function(a,b){this.Dn=b;this.fa&&Zh(this.fa,5);this.Rd()};f.wp=function(){return this.mh};f.Xq=function(a,b){this.Cn=b;this.sa=13};f.Wq=function(a,b){this.Bn=b};f.Ol=function(){};
f.Go=function(){var a=-1;if(this.Pa){var b=this,a=this.dg(this.Pa,function(){});1!=this.Pa.Qa&&this.Pa.Qa==this.Pa.hb&&(this.Pa.ob-=this.Pa.hb,this.Ke=this.Ke-1&255,this.Pa.ob>=this.Pa.hb?(b.sa=136,this.dg(this.Pa,function(a){0<=a?(wk(b),b.sa=80):(b.sa=1,b.Ie=16)},!1)):this.sa=80)}return a};
f.fq=function(a,b){this.Pa&&this.Pa.ob>=this.Pa.hb&&(0>this.og(this.Pa,b)?(this.sa=1,this.Ie=16):1!=this.Pa.Qa&&this.Pa.Qa==this.Pa.hb&&(this.Pa.ob-=this.Pa.hb,this.Ke=this.Ke-1&255,wk(this),this.sa=80,this.Pa.ob>=this.Pa.hb&&(this.sa|=8)))};f.Io=function(){return this.Ie};f.kq=function(a,b){this.En=b};f.Jo=function(){return this.Ke};f.iq=function(a,b){this.Ke=b};f.Ko=function(){return this.Aj};f.jq=function(a,b){this.Aj=b};f.Fo=function(){return this.wj};f.eq=function(a,b){this.wj=b};f.Eo=function(){return this.vj};
f.dq=function(a,b){this.vj=b};f.Ho=function(){return this.eg};f.gq=function(a,b){this.eg=b;this.sa=this.ya[this.eg&16?1:0]?this.sa|64:this.sa&-65};f.Lo=function(){return this.sa};f.cq=function(a,b){this.Ql=b;this.fa&&Zh(this.fa,14);xk(this)};f.hq=function(a,b){this.yj&4&&!(b&4)&&(this.Ie=1);this.yj=b};
function xk(a){var b=!1,c=a.Ql,d=a.eg&16?1:0,e=a.eg&15,m=a.wj|(a.vj&3)<<8,n=a.Aj,p=a.Ke||256;a.Pa=null;a.Ie=0;a.sa=80;(d=a.ya[d])?(d.Pe=m,d.Oa=e,d.bb=n,d.ob=p*d.hb,c=144<=c?c:c&240,d.Na=null,d.Qa=0,d.errorCode=0,a.Pa=d):c=-1;switch(c&240){case 32:a.sa=136;a.dg(d,function(b){0<=b&&a.fa?(wk(a),a.sa=80):(a.sa=1,a.Ie=16)},!1);break;case 48:a.sa=8;break;case 16:b=!0;break;case 64:b=!0;break;case 144:a.Ie=1;b=!0;break;case 145:d.qb=e+1,d.xb=p,b=!0}b&&wk(a)}
function wk(a){!a.fa||a.yj&2||Yh(a.fa,14,120)}
function vk(a){a.Bb=0;var b=a.Ma(),c=a.Ma(),d=c&32,e=d>>5,m=c&31,n=a.Ma(),p=a.Ma(),v=n<<2&768|p,w=n&63,G=a.Ma(),Q=a.Ma(),M=a.ya[e];M&&(M.Pe=v,M.Oa=m,M.bb=w,M.ob=G*M.hb);switch(b){case 3:a.Wb(M?M.errorCode:4);a.gc(c);a.gc(n);a.gc(p);a.gc(0|d);b=-1;break;case 12:for(c=0;0<=(b=a.Ma());)M&&c<M.Df.length&&(M.Df[c++]=b);M&&uk(a,M);b=0;M||a.Vf!=e||(a.Vf=-1,b=2);a.Wb(b|d);b=-1;break;case 224:case 228:a.Wb(0|d),b=-1}if(0<=b)switch(void 0===M?b=-1:(M.errorCode=0,M.Jn=0),b){case 0:a.Wb(0|d);break;case 1:M.Ps=
Q;a.Wb(0|d);break;case 5:a.Wb(0|d);break;case 8:yk(a,M,function(b){a.Wb(b|d)});break;case 10:Bk(a,M,function(b){a.Wb(b|d)});break;case 15:Ck(a,M,function(b){a.Wb(b|d)});break;default:a.Wb(2|d)}}f.Ma=function(){var a=-1;this.Bb<this.ib&&(a=this.hc[this.Bb++]);return a};f.Wb=function(a){this.Bb=this.ib=0;void 0!==a&&this.gc(a);this.fa&&Yh(this.fa,5);this.sa|=32};f.gc=function(a){this.hc[this.ib++]=a};f.ik=function(a,b,c){void 0===b||0>b?this.dg(a,c):c(-1,!1)};
f.jk=function(a,b){return void 0!==b&&0<=b?this.og(a,b):-1};f.ho=function(a,b){var c;void 0!==b&&0<=b?(c=b,a.Qa<a.Ef.length?a.Ef[a.Qa++]=c:(a.errorCode=20,c=-1)):c=-1;return c};f.io=function(a,b){return void 0!==b&&0<=b?this.dm(a,b):-1};function yk(a,b,c){b.errorCode=4;if(b.ua&&(b.Na=null,a.fa)){b.errorCode=0;Sh(a.fa,3,a,"dmaRead",b);Oh(a.fa,3,function(a){a||0!=b.errorCode||(b.errorCode=4);c(b.errorCode?2:0)});return}c(b.errorCode?2:0)}
function Bk(a,b,c){b.errorCode=4;if(b.ua&&(b.Na=null,a.fa)){b.errorCode=0;Sh(a.fa,3,a,"dmaWrite",b);Oh(a.fa,3,function(a){a||(0==b.errorCode&&(b.errorCode=4),20==b.errorCode&&(b.errorCode=0));c(b.errorCode?2:0)});return}c(b.errorCode?2:0)}function Ck(a,b,c){b.errorCode=4;b.Ef&&b.Ef.length==b.ob||(b.Ef=Array(b.ob));b.Qa=0;a.fa?(b.errorCode=0,Sh(a.fa,3,a,"dmaWriteBuffer",b),Oh(a.fa,3,function(a){a||0!=b.errorCode||(b.errorCode=4);c(b.errorCode?2:0)})):c(b.errorCode?2:0)}
f.dg=function(a,b,c){var d=-1,e=null,m=0;if(a.errorCode)return b&&b(d,!1,e,m),d;var n=!1!==c?1:0;if(a.Na&&(m=a.Qa,d=ck(a.Na,a.Qa),a.Qa+=n,0<=d))return e=a.Na,b&&b(d,!1,e,m),d;if(b){var p=this;if(a.ua)return a.ua.seek(a.Pe,a.Oa,a.bb+a.Ph,!1,function(c,w){(a.Na=c)?(e=c,m=a.Qa=0,p.Ag(a),d=ck(a.Na,a.Qa),a.Qa+=n):a.errorCode=20;b(d,w,e,m)}),d;a.errorCode=20;b(d,!1,e,m)}return d};
f.og=function(a,b){if(a.errorCode)return-1;do{if(a.Na&&a.ua.write(a.Na,a.Qa++,b))break;a.ua&&a.ua.seek(a.Pe,a.Oa,a.bb+a.Ph,!0,function(b){a.Na=b});if(!a.Na){a.errorCode=20;b=-1;break}a.Qa=0;this.Ag(a)}while(1);return b};f.Ag=function(a){a.bb++;var b=1-a.Ph;a.bb>=a.xb+b&&(a.bb=b,a.Oa++,a.Oa>=a.qb&&(a.Oa=0,a.Pe++))};
f.dm=function(a,b){if(a.errorCode)return-1;a.Nc[a.Kf++]=b;if(a.Kf==a.Nc.length){a.Pe=a.Nc[0];a.Oa=a.Nc[1];a.bb=a.Nc[2];a.ob=128<<a.Nc[3];for(var c=a.Kf=0;c<a.ob;c++)if(0>this.og(a,a.vm))return-1;a.Sh++}a.Sh>=a.je&&(b=-1);return b};f.zp=function(){var a=this.W.H&255;!(this.W.F>>8)&&128<a&&(this.Vf=a-128);return!0};f.Ap=function(){var a;(a=this.W.F>>8||!this.fa)||(a=!(this.fa.ac[0].rd&64));return a?!0:!1};
var rk={800:Z.prototype.xp,801:Z.prototype.yp,802:Z.prototype.wp},qk={496:Z.prototype.Go,497:Z.prototype.Io,498:Z.prototype.Jo,499:Z.prototype.Ko,500:Z.prototype.Fo,501:Z.prototype.Eo,502:Z.prototype.Ho,503:Z.prototype.Lo},tk={800:Z.prototype.Vq,801:Z.prototype.Yq,802:Z.prototype.Xq,803:Z.prototype.Wq,807:Z.prototype.Ol,811:Z.prototype.Ol,815:Z.prototype.Ol},sk={496:Z.prototype.fq,497:Z.prototype.kq,498:Z.prototype.iq,499:Z.prototype.jq,500:Z.prototype.eq,501:Z.prototype.dq,502:Z.prototype.gq,503:Z.prototype.cq,
1014:Z.prototype.hq};Da(function(){for(var a=Wa(window.document,"pcjs","hdc"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),d=new Z(d);Va(d,c)}});function Yd(a,b,c){this.id=a.id;this.key=Dk(a,b,c);this.Sa=a.Sa;Ek(this,a.Zq)}function Dk(a,b,c){a=a.id;if(b){var d=b.indexOf(".");0<d&&(a+=".v"+b.substr(0,d))}c&&(a+="."+c);return a}
Yd.prototype={constructor:Yd,set:function(a,b){try{this[this.id][a]=b}catch(c){}},get:function(a){return this[this.id][a]||null},value:function(){return this[this.id]},data:function(){return this[this.id]},load:function(a){return a?(this[this.id]=a,this.pk=!0):this.pk?!0:va()&&(a=wa(this.key))?(this[this.id]=a,this.pk=!0):!1},parse:function(){var a=!0;try{this[this.id]=JSON.parse(this[this.id])}catch(b){sa(b.message||b),a=!1}return a},toString:function(){var a=this[this.id];return"string"==typeof a?
a:JSON.stringify(a)},clear:function(a){Ek(this);var b=[];try{for(var c=0,d=window.localStorage.length;c<d;c++)b.push(window.localStorage.key(c))}catch(e){}for(c=0;c<b.length;c++)if((d=b[c])&&(a||d.substr(0,this.key.length)==this.key)){try{window.localStorage.removeItem(d)}catch(m){}b.splice(c,1);c=0}},nc:function(){}};function Ek(a,b){a[a.id]={};b&&a.set("parms",b);a.pk=!1}
function Fk(a){var b=!0;if(va()){var c=JSON.stringify(a[a.id]);xa(a.key,c)||(sa("Unable to store "+c.length+" bytes in browser local storage"),b=!1)}return b}
function Gk(a,b,c){Ha.call(this,"Computer",a,Gk);this.ha.cc=!1;this.Ae=a.busWidth||a.buswidth;this.$c=Hk;this.th=null;this.ii=!1;this.url=b?b.url:null;this.vr=(Math.random()+.1).toString(36).substr(2,12);this.ad=Ik(this);if(this.W=Sa("CPU",this.id)){this.Sa=Sa("Debugger",this.id);this.la=new Cb({id:this.cn+".bus",buswidth:this.Ae},this.W,this.Sa);var d,e=Qa(this.id);if((this.Xd=Sa("Panel",this.id))&&this.Xd.ek)for(b=0;b<e.length;b++)d=e[b],d.wa=this.Xd.wa,d.oc=this.Xd.oc,d.ek=this.Xd.ek;for(b=0;b<
e.length;b++)d=e[b],d.Jc&&d.Jc(this,this.la,this.W,this.Sa);b=null;d=a.resume;void 0!==d&&(1<d.length?b=this.Dj=d:this.$c=parseInt(d,10));var m;if(a=Ka&&Ka.state||(m=!0,a.state))b=this.Gn=a,m||(this.ii=!0,this.$c=Hk),this.$c&&(this.Hj=new Yd(this,"1.18.2"),this.Hj.load()?b=null:delete this.Hj);!b&&this.$c&&(m=null,this.ad&&(m=ra()+"/api/v1/user?req=load&user="+this.ad+"&state="+Dk(this,"1.18.2")),b=m)&&(this.ii=!0);b?qa(b,!0,null,this,this.Yp):Ya(this);c||Jk(this,this.qj)}else sa("Unable to find CPU component")}
Pa(Gk);var Hk=0;f=Gk.prototype;f.Tf=function(){return this.vr};f.ue=function(){return this.ad?this.ad:""};f.Yp=function(a,b,c){c?(this.Dj=null,this.ii=!1,this.wa("Unable to load machine state from server (error "+c+(b?": "+(String.prototype.trim?b.trim():b.replace(/^\s+|\s+$/g,"")):"")+")")):this.th=b;Ya(this)};function Jk(a,b,c){for(var d=Qa(a.id),e=0;e<=d.length;e++){var m=e<d.length?d[e]:a;if(!Za(m)){Za(m,function(){Jk(a,b,c)});return}}b.call(a,c)}
function Kk(a,b){var c=new Yd(a,"1.18.2","validate");if(c.load()&&c.parse()){var d=c.get("timestamp"),e=b?b.get("timestamp"):"unknown";d!=e&&(a.wa("Machine state may be out-of-date\n("+d+" vs. "+e+")\nCheck your browser's local storage limits"),b||c.clear())}}
f.qj=function(a){void 0===a&&(a=this.$c||(this.th?1:Hk));var b=!1,c=!1;this.Rm=!1;var d=this.Hj||new Yd(this,"1.18.2");if(-1==a)b=!0;else if(a>Hk){if(d.load(this.th)){this.uf=new Yd(this,"1.18.2","failsafe");this.uf.load()&&(Lk(this,d),a=2,Ek(this.uf));this.uf.set("timestamp",ma());Fk(this.uf);var e=this.$c&&!this.ii;if(1==a||ta("Click OK to restore the previous PCjs machine state, or CANCEL to reset the machine.")){if(c=d.parse()){var m=d.get("code"),n=d.get("data");m&&("ok"==m?d.load(n):("error"==
m&&"no machine state"!=n?(this.wa("Error: "+n),"unable to verify user"==n&&(xa("user",""),this.ad=null)):this.oc(m+": "+n),Ek(d),d.load()?(c=d.parse(),e=!0):c=!1))}e&&Kk(this,c?d:null)}else 2==a&&d.clear()}else Kk(this);delete this.th;delete this.Hj}e=Qa(this.id);for(m=0;m<e.length;m++)n=e[m],n!==this&&n!=this.W&&(c=Mk(this,n,d,b,c));b=[d,a,c];-1!=a?Jk(this,this.Km,b):this.Km(b)};
function Mk(a,b,c,d,e){if(!b.ha.cc){b.ha.cc=!0;if(b.fc){var m=null;e&&((m=c.get(b.id))||(m=c.get(b.id.replace(/[a-z0-9]\./i,"."))));"string"===typeof m&&(m=null);!b.fc(m,d)&&m&&(sa("Unable to restore state for "+b.type),a.Gn&&!a.th?(c.clear(),a.$c=Hk,window&&window.location.reload()):a.Rm=!0,b.fc(null),e=!1)}if(!d&&b.Hm)for(a=b.Hm.split("|"),c=0;c<a.length;c++)b.status(a[c])}return e}
f.Km=function(a){var b=a[0],c=0>a[1];a=a[2];this.ha.cc=!0;this.Om||(this.oc("PCjs v1.18.2\nCopyright \u00a9 2012-2015 Jeff Parsons <Jeff@pcjs.org>\nLicense: GPL version 3 or later <http://gnu.org/licenses/gpl.html>"),this.Om=!0);this.W&&(Mk(this,this.W,b,c,a),uc(this.W));this.Rm&&(Lk(this,b),b.clear());!c&&this.uf&&(this.uf.clear(),delete this.uf)};
function Lk(a,b){if(ta("There may be a problem with your PCjs machine.\n\nTo help us diagnose it, click OK to send this PCjs machine state to http://www.pcjs.org.")){var c=a.ue(),d=b.toString(),e={app:"PCjs",ver:"1.18.2"};e.url=a.url;e.user=c;e.type="bug";e.data=d;qa("http://www.pcjs.org/api/v1/report",!0,e)}}
function Nk(a,b,c){var d,e="none",m=new Yd(a,"1.18.2"),n=new Yd(a,"1.18.2","validate"),p=ma();n.set("timestamp",p);m.set("timestamp",p);m.set("version","1.18.2");m.set("url",window?window.location.href:null);m.set("browser",window?window.navigator.userAgent:"");a.W&&a.W.ec&&(c&&wc(a.W),d=a.W.ec(b,c),"object"===typeof d&&m.set(a.W.id,d),c&&(a.W.ha.cc=!1,!1===d&&(e=null)));for(var p=Qa(a.id),v=0;v<p.length;v++){var w=p[v];w.ha.cc&&(w.ec&&(d=w.ec(b,c),"object"===typeof d&&m.set(w.id,d)),c&&(w.ha.cc=
!1,!1===d&&(e=null)))}e&&(c?(p=d=!1,b?(a.ad&&Ok(a,a.ad,m.toString()),Fk(n)&&Fk(m)||(e=null,d=p=!0)):a.$c&&(d=!0,p=3==a.$c),d&&m.clear(p)):e=m.toString());c&&(a.ha.cc=!1);return e}f.reset=function(){this.la&&this.la.reset&&(this.nc("Resetting "+this.la.type),this.la.reset());for(var a=Qa(this.id),b=0;b<a.length;b++){var c=a[b];c!==this&&c!==this.la&&c.reset&&(this.nc("Resetting "+c.type),c.reset())}};
f.start=function(a,b){for(var c=Qa(this.id),d=0;d<c.length;d++){var e=c[d];"CPU"!=e.type&&e!==this&&e.start&&e.start(a,b)}};f.stop=function(a,b){for(var c=Qa(this.id),d=0;d<c.length;d++){var e=c[d];"CPU"!=e.type&&e!==this&&e.stop&&e.stop(a,b)}};
f.Kb=function(a,b,c){var d=this;switch(b){case "save":return this.qa[b]=c,c.onclick=function(){var a=Ik(d,!0);if(a){var b=!(!d.$c||d.Dj),c=Nk(d,b);b?Ok(d,a,c):d.wa("Resume disabled, machine state not saved")}},!0;case "reset":return this.qa[b]=c,c.onclick=function(){xc(d)},!0}return!1};
function Ik(a,b){var c=a.ad;c||(c=wa("user"),void 0!==c?!c&&b&&(c=null,window&&(c=window.prompt("To save machine states on the pcjs.org server, you need a user ID (email support@pcjs.org).\n\nOnce you have an ID, enter it below.","")),c&&((c=Pk(a,c))||a.wa("Your user ID has not been approved."))):b&&a.wa("Browser local storage is not available"));return c}
function Pk(a,b){a.ad=null;var c=qa(ra()+"/api/v1/user?req=verify&user="+b),d=c[1];if(!c[0]&&d)try{c=eval("("+d+")"),c.code&&"ok"==c.code&&(xa("user",c.data),a.ad=c.data)}catch(e){sa(e.message+" ("+d+")")}return a.ad}
function Ok(a,b,c){if(c){var d={req:"store"};d.user=b;d.state=Dk(a,"1.18.2");d.data=c;b=qa(ra()+"/api/v1/user",!1,d);d=b[1];if(b[0]){if(d){var e=d.indexOf("\n");0<e&&(d=d.substr(0,e));d.indexOf("Error: ")||(d=d.substr(7))}d='{"code":'+b[0]+',"data":"'+d+'"}'}b=JSON.parse(d);b&&"ok"==b.code?a.wa("Machine state saved to server"):c&&(c=b&&b.data||"unable to save machine state",c="error"==b.code?"Error: "+c:"Error "+b.code+": "+c,a.wa(c),xa("user",""),a.ad=null)}}
function xc(a){if(a.$c&&!a.Dj){var b=ta("Click OK to save changes to this PCjs machine.\n\nWARNING: If you CANCEL, all disk changes will be discarded.");Nk(a,b,!0);!b&&a.Gn?window&&window.location.reload():(b||(a.qk=!0),a.qj(Hk),a.qk=!1)}else a.reset(),a.W&&uc(a.W)}function fb(a,b,c){a=Qa(a.id);for(var d=0;d<a.length;d++){var e=a[d];if(c)c==e&&(c=null);else if(e.type==b)return e}return null}
Da(function(){for(var a=Wa(window.document,"pcjs-machine"),b=0;b<a.length;b++)for(var c=a[b],d=Ua(c),c=Wa(c,"pcjs","computer"),e=0;e<c.length;e++){var m=c[e],n=Ua(m),n=new Gk(n,d,!0);Va(n,m);Jk(n,n.qj)}});za.show.push(function(){for(var a=Wa(window.document,"pcjs","computer"),b=0;b<a.length;b++){var c=Ua(a[b]);(c=Sa("Computer",c.id))&&c.Om&&!c.ha.cc&&c.qj(-1)}});
za.exit.push(function(){for(var a=Wa(window.document,"pcjs","computer"),b=0;b<a.length;b++){var c=Ua(a[b]);(c=Sa("Computer",c.id))&&c.ha.cc&&Nk(c,!(!c.$c||c.Dj),!0)}});var Qk=0;function Rk(a,b,c,d,e,m){e("Loading "+a+"...");qa(a,!0,null,null,function(n,p,v){v?(p||(p="unable to load "+a+" ("+v+")"),m(p,null)):Sk(p,a,b,c,d,e,m)})}
function Sk(a,b,c,d,e,m,n){function p(a,m){if(m)n(m,null);else{if(c){var p=b;p&&0>p.indexOf("/")&&(p=window.location.pathname+p);a=a.replace(/(<machine[^>]*\sid=)(['"]).*?\2/,"$1$2"+c+"$2"+(d?" state=$2"+d+"$2":"")+(p?" url=$2"+p+"$2":""))}p=null;if("<"==a.charAt(0))try{window.ActiveXObject||"ActiveXObject"in window?(e||(a=a.replace(/<!DOCTYPE(.|[\r\n])*]>\s*/g,"")),p=new window.ActiveXObject("Microsoft.XMLDOM"),p.async=!1,p.loadXML(a)):p=(new window.DOMParser).parseFromString(a,"text/xml")}catch(Q){p=
null,a=Q.message}else a="unrecognized XML: "+(255<a.length?a.substr(0,255)+"...":a);n(a,p)}}a?e?Tk(a,m,p):p(a,null):n("no data"+(b?" for file: "+b:""),null)}
function Tk(a,b,c){var d;if(d=/<([a-z]+)\s+ref="(.*?)"(.*?)\/>/g.exec(a)){var e=d[2];b("Loading "+e+"...");qa(e,!0,null,null,function(m,n,p){if(p||!n)c(a,"unable to resolve XML reference: "+d[0]+" ("+p+")");else{if(m=d[3])if(p=n.match(new RegExp("<"+d[1]+"[^>]*>"))){for(var v=p[0],w,G=/( [a-z]+=)(['"])(.*?)\2/g;w=G.exec(m);)v=0>v.indexOf(w[1])?v.replace(">",w[0]+">"):v.replace(new RegExp(w[1]+"(['\"])(.*?)\\1"),w[0]);p[0]!=v&&(n=n.replace(p[0],v))}else{c(a,"missing <"+d[1]+"> in "+e);return}n=n.replace(/<\?xml[^>]*>[\r\n]*/,
"");a=a.replace(d[0],n);Tk(a,b,c)}})}else c(a,null)}
function Uk(a,b,c,d){function e(a){if(void 0===p){var b=n&&Wa(n,"machine-warning");p=b&&b[0]||n}p&&(p.innerHTML=ka(a))}function m(a){e("Error: "+a);v&&(--Qk||Fa(!0));v=!1}var n,p,v=!0;Qk++;try{if(n=window.document.getElementById(a)){c||(c="/versions/pcjs/1.18.2/components.xsl");var w=function(d,p){if(p){var v=function(d,v){if(v)if(v)if(e("Processing "+b+"..."),window.ActiveXObject||"ActiveXObject"in window){var w=p.transformNode(v);w?(n.outerHTML=w,--Qk||Fa(!0)):m("transformNodeToObject failed")}else window.document.implementation&&
window.document.implementation.createDocument?(w=new XSLTProcessor,w.importStylesheet(v),(w=w.transformToFragment(p,window.document))?n.parentNode?(n.parentNode.replaceChild(w,n),--Qk||Fa(!0)):m("invalid machine element: "+a):m("transformToFragment failed")):m("unable to transform XML: unsupported browser");else m("failed to load XSL file: "+c);else m(d)};p?Rk(c,null,null,!1,e,v):m("failed to load XML file: "+b)}else m(d)};"<"!=b.charAt(0)?Rk(b,a,d,!0,e,w):Sk(b,null,a,d,!1,e,w)}else m("missing machine element: "+
a)}catch(G){m(G.message)}return v}window.embedPC=function(a,b,c,d){Fa(!1);return Uk(a,b,c,d)};window.enableEvents=Fa;window.sendEvent=Ga;})();
module pcjsEmbed {
export function embed(global?: any) {
if (!global)
global = (function() {
return this.parent;
})();
var drive = <persistence.Drive>global.require('drive');
var embed_pcjs = drive.read('/pcjs/versions/pcjs/1.18.2/pc.js');
var wrapped = embed_pcjs;
var frame = createFrame(global.window);
var embedPC = frame.evalFN(wrapped);
startWith(frame.global, embedPC);
}
function startWith(window, embedPC) {
// do rawgit instead
var embedPCURL = 'https://api.github.com/repos/jeffpar/pcjs/contents';
var machineXML = '/devices/pc/machine/5170/ega/1152kb/rev3/machine.xml';
// //devices/pc/machine/5160/cga/640kb
// devices/pc/machine/5150/mda/64kb/machine.xml
//docs/pcjs/demos/sample3a.xml
// /devices/pc/machine/5160/ega/640kb/win101/machine.xml
window.addEventListener('load', function(load_event) {
var root = document.getElementById('root');
if (!root) {
root = document.createElement('div');
root.id = 'root';
document.body.appendChild(root);
}
else {
root.innerHTML = '';
}
var rootInner = document.createElement('div');
rootInner.id = Math.random() + '-' + new Date().getTime();
root.appendChild(rootInner);
}
function createFrame(document: Document) {
var ifr = <HTMLIFrameElement>elem(
'iframe',
{
position: 'absolute',
left: 0, top: 0,
width: '100%', height: '100%',
border: 'none',
src: 'about:blank'
},
window.document.body);
var ifrwin = ifr.contentWindow || (<any>ifr).window;
var ifrdoc = ifrwin.document;
if (ifrdoc.open) ifrdoc.open();
ifrdoc.write(
'<!' + 'doctype html' + '>' +
'<' + 'html' + '>' +
'<' + 'head' + '><' + 'style' + '>' +
'body,html{margin:0;padding:0;border:none;height:100%;border:none;}' +
'*,*:before,*:after{box-sizing:inherit;}' +
'html{box-sizing:border-box;}' +
'</' + 'style' + '>\n' +
'<' + 'body' + '>' +
'<' + 'script' + '>window.__eval_export_=function(code) { return eval(code); }</' + 'script' + '>' +
// it's important to have body before any long scripts (especialy external),
// so IFRAME is immediately ready
'<' + 'body' + '>' +
'</' + 'html' + '>');
if (ifrdoc.close) ifrdoc.close();
var ifrwin_eval = ifrwin.__eval_export_;
try {
delete (<any>ifrwin).__eval_export_;
}
catch (weirdIEFailure) {
// no big deal if it fails
}
ifrdoc.body.innerHTML = '';
if (window.onerror) {
ifrwin.onerror = delegate_onerror;
}
return {
document: ifrdoc,
global: ifrwin,
iframe: ifr,
evalFN: ifrwin_eval
};
function delegate_onerror() {
window.onerror.apply(window, arguments);
ments);
}
}
}module pcjsEmbed {
export function overideLocalStorage(drive: persistence.Drive, cachePath: string) {
class LocalStorageOverride {
keys = [];
length = 0;
constructor() {
this._updateKeys();
}
getItem(key: string) {
//console.log('getItem_proxy(' + JSON.stringify(key) + ')');
var cached = cachePath + (cachePath.slice(-1) === '/' ? '' : '/') + (key.charAt(0) === '/' ? key.slice(1) : key);
return drive.read(cached);
}
setItem(key: string, value) {
// console.log('setItem_proxy(' + JSON.stringify(key) + ', ' + JSON.stringify(value) + ')');
var cached = cachePath + (cachePath.slice(-1) === '/' ? '' : '/') + (key.charAt(0) === '/' ? key.slice(1) : key);
document.write(cached, value);
this._updateKeys();
};
removeItem(key: string) {
// console.log('removeItem_proxy(' + JSON.stringify(key) + ')');
var cached = cachePath + (cachePath.slice(-1) === '/' ? '' : '/') + (key.charAt(0) === '/' ? key.slice(1) : key);
this._updateKeys();
}
key(index: number) {
return this.keys[index];
}
_updateKeys() {
this.keys = [];
var allFiles = drive.files();
var prefix = cachePath + (cachePath.slice(-1) === '/' ? '' : '/');
for (var i = 0; i < allFiles.length; i++) {
if (allFiles[i].length > prefix.length && allFiles[i].slice(0, prefix.length) === prefix) {
this.keys.push(allFiles[i].slice(prefix.length));
}
}
this.length = this.keys.length;
}
}
}
}module pcjsEmbed {
var embedPCURL = 'https://api.github.com/repos/jeffpar/pcjs/contents';
export function overrideXMLHttpRequest(window: Window, drive: persistence.Drive, currentPath: string, existingPath: string, cachePath: string) {
return XMLHttpRequestOverride;
class XMLHttpRequestOverride {
private _url = '';
private _original_url = '';
private static _callbackCounter = 0;
status = 0;
readyState = 0;
responseText = null;
onreadystatechange: () => void = null;
constructor() {
}
open(method: string, url: string) {
if (url.charAt(0) !== '/') {
var lastMachineSlash = currentPath.lastIndexOf('/');
this._original_url = url;
url = currentPath.slice(0, lastMachineSlash + 1) + url;
}
this._url = url;
}
send() {
var existing = existingPath + (existingPath.slice(-1) === '/' ? '' : '/') + (this._url.charAt(0) === '/' ? this._url.slice(1) : this._url);
var result = drive.read(existing);
if (!result) {
var cached = cachePath + (cachePath.slice(-1) === '/' ? '' : '/') + (this._url.charAt(0) === '/' ? this._url.slice(1) : this._url);
result = drive.read(cached);
}
if (result) {
this.status = 200;
this.readyState = 4;
this.responseText = result;
if (typeof this.responseText != 'string')
this.responseText = JSON.stringify(this.responseText);
setTimeout(function() { this.onreadystatechange(); }, 1);
return;
}
try {
var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://rawgit.com/jeffpar/pcjs/master' + this._url);
xhr.onreadystatechange = function() {
if (xhr.readyState !== 4) return;
if (xhr.status !== 200) {
this._send_jsonp({ data: { content: btoa(xhr.responseText) } });
return;
}
this._processResultContent(xhr.response);
};
xhr.send();
}
catch (xhrError) {
this._send_jsonp();
}
}
_send_jsonp() {
var callbackName = 'jsonpCallback' + (XMLHttpRequestOverride._callbackCounter++);
window[callbackName] = function(result) {
document.body.removeChild(reqScript);
this.processResult(result);
};
var reqScript = document.createElement('script');
reqScript.src = embedPCURL + this._url + '?callback=' + callbackName;
document.body.appendChild(reqScript);
}
_processResult(result) {
if (!result.data.content) {
alert(result.data.message + '\n' + this._url + '\n\n' + JSON.stringify(result));
return;
}
this._processResultContent(atob(result.data.content));
}
_processResultContent(resultContent) {
this.responseText = resultContent;
var cached = cachePath + (cachePath.slice(-1) === '/' ? '' : '/') + (this._url.charAt(0) === '/' ? this._url.slice(1) : this._url);
drive.write(cached, this.responseText);
/*
if (this.responseText.charAt(0) !== '<') {
try {
contentsByPath[this._url] = JSON.parse(this.responseText);
}
catch (error) { }
}
var contentsByPathScript = document.getElementById('contentsByPathScript');
if (!contentsByPathScript) {
contentsByPathScript = document.createElement('script');
contentsByPathScript.id = 'contentsByPathScript';
document.body.appendChild(contentsByPathScript);
}
contentsByPathScript.text = 'var contentsByPath = ' + JSON.stringify(contentsByPath).replace(new RegExp('<' + '/' + 'script', 'g'), '<"+"/"+"script') + ';';
*/
this.status = 200;
this.readyState = 4;
this.onreadystatechange();
}
setRequestHeader() { }
}
}
}module pcjsEmbed {
export function wrapGlobal(global: any, window: Window, drive: persistence.Drive) {
global.XMLHttpRequest = overrideXMLHttpRequest(window, drive);
}
}module persistence {
function getIndexedDB() {
try {
return typeof indexedDB === 'undefined' || typeof indexedDB.open !== 'function' ? null : indexedDB;
}
catch (error) {
return null;
}
}
export module attached.indexedDB {
export var name = 'indexedDB';
export function detect(uniqueKey: string, callback: (detached: Drive.Detached) => void): void {
try {
detectCore(uniqueKey, callback);
}
catch (error) {
callback(null);
}
}
function detectCore(uniqueKey: string, callback: (detached: Drive.Detached) => void): void {
var indexedDBInstance = getIndexedDB();
if (!indexedDBInstance) {
callback(null);
return;
}
var dbName = uniqueKey || 'portabled';
var openRequest = indexedDBInstance.open(dbName, 1);
openRequest.onerror = (errorEvent) => callback(null);
openRequest.onupgradeneeded = createDBAndTables;
openRequest.onsuccess = (event) => {
var db: IDBDatabase = openRequest.result;
try {
var transaction = db.transaction(['files', 'metadata']);
// files mentioned here, but not really used to detect
// broken multi-store transaction implementation in Safari
transaction.onerror = (errorEvent) => callback(null);
var metadataStore = transaction.objectStore('metadata');
var filesStore = transaction.objectStore('files');
var editedUTCRequest = metadataStore.get('editedUTC');
}
catch (getStoreError) {
callback(null);
return;
}
if (!editedUTCRequest) {
callback(null);
return;
}
editedUTCRequest.onerror = (errorEvent) => {
var detached = new IndexedDBDetached(db, null);
callback(detached);
};
editedUTCRequest.onsuccess = (event) => {
var result: MetadataData = editedUTCRequest.result;
var detached = new IndexedDBDetached(db, result && typeof result.value === 'number' ? result.value : null);
callback(detached);
};
}
function createDBAndTables() {
var db: IDBDatabase = openRequest.result;
var filesStore = db.createObjectStore('files', { keyPath: 'path' });
var metadataStore = db.createObjectStore('metadata', { keyPath: 'property' })
}
}
class IndexedDBDetached implements Drive.Detached {
constructor(
private _db: IDBDatabase,
public timestamp: number) {
}
applyTo(mainDrive: Drive, callback: Drive.Detached.CallbackWithShadow): void {
var transaction = this._db.transaction(['files', 'metadata'], 'readwrite');
var metadataStore = transaction.objectStore('metadata');
var filesStore = transaction.objectStore('files');
var countRequest = filesStore.count();
countRequest.onerror = (errorEvent) => {
console.error('Could not count files store.');
callback(null);
};
countRequest.onsuccess = (event) => {
var storeCount: number = countRequest.result;
var cursorRequest = filesStore.openCursor();
cursorRequest.onerror = (errorEvent) => callback(null);
// to cleanup any files which content is the same on the main drive
var deleteList: string[] = [];
var anyLeft = false;
var processedCount = 0;
cursorRequest.onsuccess = (event) => {
var cursor: IDBCursor = cursorRequest.result;
if (!cursor) {
// cleaning up files whose content is duplicating the main drive
if (anyLeft) {
for (var i = 0; i < deleteList.length; i++) {
filesStore['delete'](deleteList[i]);
}
}
else {
filesStore.clear();
metadataStore.clear();
}
callback(new IndexedDBShadow(this._db, this.timestamp));
return;
}
if (callback.progress)
callback.progress(processedCount, storeCount);
processedCount++;
var result: FileData = (<any>cursor).value;
if (result && result.path) {
var existingContent = mainDrive.read(result.path);
if (existingContent === result.content) {
deleteList.push(result.path);
}
else {
mainDrive.timestamp = this.timestamp;
mainDrive.write(result.path, result.content);
anyLeft = true;
}
}
cursor['continue']();
}; // cursorRequest.onsuccess
}; // countRequest.onsuccess
}
purge(callback: Drive.Detached.CallbackWithShadow): void {
var transaction = this._db.transaction(['files', 'metadata'], 'readwrite');
var filesStore = transaction.objectStore('files');
filesStore.clear();
var metadataStore = transaction.objectStore('metadata');
metadataStore.clear();
callback(new IndexedDBShadow(this._db, -1));
}
}
class IndexedDBShadow implements Drive.Shadow {
constructor(private _db: IDBDatabase, public timestamp: number) {
}
write(file: string, content: string) {
var transaction = this._db.transaction(['files', 'metadata'], 'readwrite');
var filesStore = transaction.objectStore('files');
var metadataStore = transaction.objectStore('metadata');
// no file deletion here: we need to keep account of deletions too!
var fileData: FileData = {
path: file,
content: content,
state: null
};
var putFile = filesStore.put(fileData);
var md: MetadataData = {
property: 'editedUTC',
value: Date.now()
};
metadataStore.put(md);
}
}
interface FileData {
path: string;
content: string;
state: string;
}
interface MetadataData {
property: string;
value: any;
}
}
}module persistence {
function getLocalStorage() {
return typeof localStorage === 'undefined' || typeof localStorage.length !== 'number' ? null : localStorage;
}
// is it OK&
export module attached.localStorage {
export var name = 'localStorage';
export function detect(uniqueKey: string, callback: (detached: Drive.Detached) => void): void {
var localStorageInstance = getLocalStorage();
if (!localStorageInstance) {
callback(null);
return;
}
var access = new LocalStorageAccess(localStorageInstance, uniqueKey);
var dt = new LocalStorageDetached(access);
callback(dt);
}
class LocalStorageAccess {
private _cache: { [key: string]: string; } = {};
constructor(private _localStorage: Storage, private _prefix: string) {
}
get (key: string): string {
var k = this._expandKey(key);
var r = this._localStorage.getItem(k);
return r;
}
set(key: string, value: string): void {
var k = this._expandKey(key);
return this._localStorage.setItem(k, value);
}
remove(key: string): void {
var k = this._expandKey(key);
return this._localStorage.removeItem(k);
}
keys(): string[] {
var result: string[] = [];
var len = this._localStorage.length;
for (var i = 0; i < len; i++) {
var str = this._localStorage.key(i);
if (str.length > this._prefix.length && str.slice(0, this._prefix.length) === this._prefix)
result.push(str.slice(this._prefix.length));
}
return result;
}
private _expandKey(key: string): string {
var k: string;
if (!key) {
k = this._prefix;
}
else {
k = this._cache[key];
if (!k)
this._cache[key] = k = this._prefix + key;
}
return k;
}
}
class LocalStorageDetached implements Drive.Detached {
timestamp: number = 0;
constructor(private _access: LocalStorageAccess) {
var timestampStr = this._access.get('*timestamp');
if (timestampStr && timestampStr.charAt(0)>='0' && timestampStr.charAt(0)<='9') {
try {
this.timestamp = parseInt(timestampStr);
}
catch (parseError) {
}
}
}
applyTo(mainDrive: Drive, callback: Drive.Detached.CallbackWithShadow): void {
var keys = this._access.keys();
for (var i = 0; i < keys.length; i++) {
var k = keys[i];
if (k.charAt(0)==='/') {
var value = this._access.get(k);
mainDrive.write(k, value);
}
}
var shadow = new LocalStorageShadow(this._access, mainDrive.timestamp);
callback(shadow);
}
purge(callback: Drive.Detached.CallbackWithShadow): void {
var keys = this._access.keys();
for (var i = 0; i < keys.length; i++) {
var k = keys[i];
if (k.charAt(0)==='/') {
var value = this._access.remove(k);
}
}
var shadow = new LocalStorageShadow(this._access, this.timestamp);
callback(shadow);
}
}
class LocalStorageShadow implements Drive.Shadow {
constructor(private _access: LocalStorageAccess, public timestamp: number) {
}
write(file: string, content: string) {
this._access.set(file, content);
this._access.set('*timestamp', <any>this.timestamp);
}
}
}
} module persistence {
function getOpenDatabase() {
return typeof openDatabase !== 'function' ? null : openDatabase;
}
export module attached.webSQL {
export var name = 'webSQL';
export function detect(uniqueKey: string, callback: (detached: Drive.Detached) => void): void {
var openDatabaseInstance = getOpenDatabase();
if (!openDatabaseInstance) {
callback(null);
return;
}
var dbName = uniqueKey || 'portabled';
var db = openDatabase(
dbName, // name
1, // version
'Portabled virtual filesystem data', // displayName
1024 * 1024); // size
// upgradeCallback?
db.readTransaction(
transaction => {
transaction.executeSql(
'SELECT value from "*metadata" WHERE name=\'editedUTC\'',
[],
(transaction, result) => {
var editedValue: number = null;
if (result.rows && result.rows.length === 1) {
var editedValueStr = result.rows.item(0).value;
if (typeof editedValueStr === 'string') {
try {
editedValue = parseInt(editedValueStr);
}
catch (error) {
// unexpected value for the timestamp, continue as if no value found
}
}
else if (typeof editedValueStr === 'number') {
editedValue = editedValueStr;
}
}
callback(new WebSQLDetached(db, editedValue || 0, true));
},
(transaction, sqlError) => {
// no data
callback(new WebSQLDetached(db, 0, false));
});
},
sqlError=> {
// failed to load
callback(null);
});
}
class WebSQLDetached implements Drive.Detached {
constructor(
private _db: Database,
public timestamp: number,
private _metadataTableIsValid: boolean) {
}
applyTo(mainDrive: Drive, callback: Drive.Detached.CallbackWithShadow): void {
this._db.readTransaction(
transaction => listAllTables(
transaction,
tables => {
var ftab = getFilenamesFromTables(tables);
this._applyToWithFiles(transaction, ftab, mainDrive, callback);
},
sqlError => {
reportSQLError('Failed to list tables for the webSQL database.', sqlError);
callback(new WebSQLShadow(this._db, this.timestamp, this._metadataTableIsValid));
}),
sqlError => {
reportSQLError('Failed to open read transaction for the webSQL database.', sqlError);
callback(new WebSQLShadow(this._db, this.timestamp, this._metadataTableIsValid));
});
}
purge(callback: Drive.Detached.CallbackWithShadow): void {
this._db.transaction(
transaction => listAllTables(
transaction,
tables => {
this._purgeWithTables(transaction, tables, callback);
},
sqlError => {
reportSQLError('Failed to list tables for the webSQL database.', sqlError);
callback(new WebSQLShadow(this._db, 0, false));
}),
sqlError => {
reportSQLError('Failed to open read-write transaction for the webSQL database.', sqlError);
callback(new WebSQLShadow(this._db, 0, false));
});
}
private _applyToWithFiles(transaction: SQLTransaction, ftab: { file: string; table: string; }[], mainDrive: Drive, callback: Drive.Detached.CallbackWithShadow): void {
if (!ftab.length) {
callback(new WebSQLShadow(this._db, this.timestamp, this._metadataTableIsValid));
return;
}
var reportedFileCount = 0;
var completeOne = () => {
reportedFileCount++;
if (reportedFileCount === ftab.length) {
callback(new WebSQLShadow(this._db, this.timestamp, this._metadataTableIsValid));
}
};
var applyFile = (file: string, table: string) => {
transaction.executeSql(
'SELECT * FROM "' + table + '"',
[],
(transaction, result) => {
if (result.rows.length) {
var row = result.rows.item(0);
if (row.value === null)
mainDrive.write(file, null);
else if (typeof row.value === 'string')
mainDrive.write(file, fromSqlText(row.value));
}
completeOne();
},
sqlError => {
completeOne();
});
};
for (var i = 0; i < ftab.length; i++) {
applyFile(ftab[i].file, ftab[i].table);
}
}
private _purgeWithTables(transaction: SQLTransaction, tables: string[], callback: Drive.Detached.CallbackWithShadow) {
if (!tables.length) {
callback(new WebSQLShadow(this._db, 0, false));
return;
}
var droppedCount = 0;
var completeOne = () => {
droppedCount++;
if (droppedCount === tables.length) {
callback(new WebSQLShadow(this._db, 0, false));
}
};
for (var i = 0; i < tables.length; i++) {
transaction.executeSql(
'DROP TABLE "' + tables[i] + '"',
[],
(transaction, result) => {
completeOne();
},
(transaction, sqlError) => {
reportSQLError('Failed to drop table for the webSQL database.', sqlError);
completeOne();
});
}
}
}
class WebSQLShadow implements Drive.Shadow {
private _cachedUpdateStatementsByFile: { [name: string]: string; } = {};
private _closures = {
updateMetadata: (transaction: SQLTransaction) => this._updateMetadata(transaction)
};
constructor(private _db: Database, public timestamp: number, private _metadataTableIsValid: boolean) {
}
write(file: string, content: string) {
if (content || typeof content === 'string') {
this._updateCore(file, content);
}
else {
this._dropFileTable(file);
}
}
private _updateCore(file: string, content: string) {
var updateSQL = this._cachedUpdateStatementsByFile[file];
if (!updateSQL) {
var tableName = mangleDatabaseObjectName(file);
updateSQL = this._createUpdateStatement(file, tableName);
}
this._db.transaction(
transaction => {
transaction.executeSql(
updateSQL,
['content', content],
this._closures.updateMetadata,
(transaction, sqlError) => this._createTableAndUpdate(transaction, file, tableName, updateSQL, content));
},
sqlError => {
reportSQLError('Transaction failure updating file "' + file + '".', sqlError);
});
}
private _createTableAndUpdate(transaction: SQLTransaction, file: string, tableName: string, updateSQL: string, content: string) {
if (!tableName)
tableName = mangleDatabaseObjectName(file);
transaction.executeSql(
'CREATE TABLE "' + tableName + '" (name PRIMARY KEY, value)',
[],
(transaction, result) => {
transaction.executeSql(
updateSQL,
['content', content],
this._closures.updateMetadata,
(transaction, sqlError) => {
reportSQLError('Failed to update table "' + tableName + '" for file "' + file + '" after creation.', sqlError);
});
},
(transaction, sqlError) => {
reportSQLError('Failed to create a table "' + tableName + '" for file "' + file + '".', sqlError);
});
}
private _dropFileTable(file: string) {
var tableName = mangleDatabaseObjectName(file);
this._db.transaction(
transaction => {
transaction.executeSql(
'DROP TABLE "' + tableName + '"',
[],
this._closures.updateMetadata,
(transaction, sqlError) => {
reportSQLError('Failed to drop table "' + tableName + '" for file "' + file + '".', sqlError);
});
},
sqlError => {
reportSQLError('Transaction failure dropping table "' + tableName + '" for file "' + file + '".', sqlError);
});
}
private _updateMetadata(transaction: SQLTransaction) {
var updateMetadataSQL = 'INSERT OR REPLACE INTO "*metadata" VALUES (?,?)';
transaction.executeSql(
updateMetadataSQL,
['editedUTC', this.timestamp],
(transaction, result) => { }, // TODO: generate closure statically
(transaction, error) => {
transaction.executeSql(
'CREATE TABLE "*metadata" (name PRIMARY KEY, value)',
[],
(transaction, result) => {
transaction.executeSql(updateMetadataSQL, [], () => { }, () => { });
},
(transaction, sqlError) => {
reportSQLError('Failed to update metadata table after creation.', sqlError);
});
});
}
private _createUpdateStatement(file: string, tableName: string): string {
return this._cachedUpdateStatementsByFile[file] =
'INSERT OR REPLACE INTO "' + tableName + '" VALUES (?,?)';
}
}
function mangleDatabaseObjectName(name: string): string {
// no need to polyfill btoa, if webSQL exists
if (name.toLowerCase() === name)
return name;
else
return '=' + btoa(name);
}
function unmangleDatabaseObjectName(name: string): string {
if (!name || name.charAt(0) === '*') return null;
if (name.charAt(0) !== '=') return name;
try {
return atob(name.slice(1));
}
catch (error) {
return name;
}
}
export function listAllTables(
transaction: SQLTransaction,
callback: (tables: string[]) => void,
errorCallback: (sqlError: SQLError) => void) {
transaction.executeSql(
'SELECT tbl_name from sqlite_master WHERE type=\'table\'',
[],
(transaction, result) => {
var tables: string[] = [];
for (var i = 0; i < result.rows.length; i++) {
var row = result.rows.item(i);
var table = row.tbl_name;
if (!table || (table[0] !== '*' && table.charAt(0) !== '=' && table.charAt(0) !== '/')) continue;
tables.push(row.tbl_name);
}
callback(tables);
},
(transaction, sqlError) => errorCallback(sqlError));
}
function getFilenamesFromTables(tables: string[]) {
var filenames: { table: string; file: string; }[] = [];
for (var i = 0; i < tables.length; i++) {
var file = unmangleDatabaseObjectName(tables[i]);
if (file)
filenames.push({ table: tables[i], file: file });
}
return filenames;
}
function toSqlText(text: string) {
if (text.indexOf('\u00FF') < 0 && text.indexOf('\u0000') < 0) return text;
return text.replace(/\u00FF/g, '\u00FFf').replace(/\u0000/g, '\u00FF0');
}
function fromSqlText(sqlText: string) {
if (sqlText.indexOf('\u00FF') < 0 && sqlText.indexOf('\u0000') < 0) return sqlText;
return sqlText.replace(/\u00FFf/g, '\u00FF').replace(/\u00FF0/g, '\u0000');
}
function reportSQLError(message: string, sqlError: SQLError);
function reportSQLError(sqlError: SQLError);
function reportSQLError(message, sqlError?) {
if (typeof console !== 'undefined' && typeof console.error === 'function') {
if (sqlError)
console.error(message, sqlError);
else
console.error(sqlError);
}
}
}
}module persistence.dom {
export class CommentHeader {
header: string;
contentOffset: number;
contentLength: number;
constructor(public node: Comment) {
var headerLine: string;
var content: string;
if (typeof node.substringData === 'function'
&& typeof node.length === 'number') {
var chunkSize = 128;
if (node.length >= chunkSize) {
// TODO: cut chunks off the start and look for newlines
var headerChunks: string[] = [];
while (headerChunks.length * chunkSize < node.length) {
var nextChunk = node.substringData(headerChunks.length * chunkSize, chunkSize);
var posEOL = nextChunk.search(/\r|\n/);
if (posEOL < 0) {
headerChunks.push(nextChunk);
continue;
}
this.header = headerChunks.join('') + nextChunk.slice(0, posEOL);
this.contentOffset = this.header.length + 1; // if header is separated by a single CR or LF
if (posEOL === nextChunk.length - 1) { // we may have LF part of CRLF in the next chunk!
if (nextChunk.charAt(nextChunk.length - 1) === '\r'
&& node.substringData((headerChunks.length + 1) * chunkSize, 1) === '\n')
this.contentOffset++;
}
else if (nextChunk.slice(posEOL, posEOL + 2) === '\r\n') {
this.contentOffset++;
}
this.contentLength = node.length - this.contentOffset;
return;
}
this.header = headerChunks.join('');
this.contentOffset = this.header.length;
this.contentLength = node.length - content.length;
return;
}
}
var wholeCommentText = node.nodeValue;
var posEOL = wholeCommentText.search(/\r|\n/);
if (posEOL < 0) {
this.header = wholeCommentText;
this.contentOffset = wholeCommentText.length;
this.contentLength = wholeCommentText.length - this.contentOffset;
return;
}
this.contentOffset = wholeCommentText.slice(posEOL, posEOL + 2) === '\r\n' ?
posEOL + 2 : // ends with CRLF
posEOL + 1; // ends with singular CR or LF
this.header = wholeCommentText.slice(0, posEOL),
this.contentLength = wholeCommentText.length - this.contentOffset
}
}
}module persistence.dom {
export class DOMDrive implements Drive {
private _byPath: { [path: string]: DOMFile; } = {};
public timestamp: number;
constructor(
private _totals: DOMTotals,
files: DOMFile[],
private _document: DOMDrive.DocumentSubset) {
this.timestamp = this._totals ? this._totals.timestamp : 0;
for (var i = 0; i < files.length; i++) {
this._byPath[files[i].path] = files[i];
}
}
files(): string[] {
if (typeof Object.keys === 'string') {
var result = Object.keys(this._byPath);
}
else {
var result: string[] = [];
for (var k in this._byPath) if (this._byPath.hasOwnProperty(k)) {
result.push(k);
}
}
result.sort();
return result;
}
read(file: string): string {
var file = normalizePath(file);
var f = this._byPath[file];
if (!f)
return null;
else
return f.read();
}
write(file: string, content: string) {
var totalDelta = 0;
var file = normalizePath(file);
var f = this._byPath[file];
if (content === null) {
// removal
if (f) {
totalDelta -= f.contentLength;
f.node.parentElement.removeChild(f.node);
delete this._byPath[file];
}
}
else {
// addition
if (f) {
var lengthBefore = f.contentLength;
f.write(content);
totalDelta += f.contentLength - lengthBefore;
}
else {
var comment = document.createComment('');
var f = new DOMFile(comment, file, null, 0, 0);
f.write(content);
this._document.body.appendChild(f.node);
this._byPath[file] = f;
totalDelta += f.contentLength;
}
}
this._totals.timestamp = this.timestamp;
this._totals.updateNode();
}
}
export module DOMDrive {
export interface DocumentSubset {
body: HTMLBodyElementSubset;
createComment(data: string): Comment;
}
export interface HTMLBodyElementSubset {
appendChild(node: Node);
insertBefore(newChild: Node, refNode?: Node);
firstChild: Node;
}
}
}module persistence.dom {
export class DOMFile {
private _encodedPath: string = null;
constructor(
public node: Comment,
public path: string,
private _encoding: (text: string) => any,
private _contentOffset: number,
public contentLength: number) {
}
static tryParse(cmheader: CommentHeader): DOMFile {
// /file/path/continue
// "/file/path/continue"
// /file/path/continue [encoding]
var parseFmt = /^\s*((\/|\"\/)(\s|\S)*[^\]])\s*(\[((\s|\S)*)\])?\s*$/;
var parsed = parseFmt.exec(cmheader.header);
if (!parsed) return null; // does not match the format
var filePath = parsed[1];
var encodingName = parsed[5];
if (filePath.charAt(0) === '"') {
if (filePath.charAt(filePath.length - 1) !== '"') return null; // unpaired leading quote
try {
if (typeof JSON !== 'undefined' && typeof JSON.parse === 'function')
filePath = JSON.parse(filePath);
else
filePath = eval(filePath); // security doesn't seem to be compromised, input is coming from the same file
}
catch (parseError) {
return null; // quoted path but wrong format (JSON expected)
}
}
else { // filePath NOT started with quote
if (encodingName) {
// regex above won't strip trailing whitespace from filePath if encoding is specified
// (because whitespace matches 'non-bracket' class too)
filePath = filePath.slice(0, filePath.search(/\S(\s*)$/) + 1);
}
}
var encoding = encodings[encodingName || 'LF'];
// invalid encoding considered a bogus comment, skipped
if (encoding)
return new DOMFile(cmheader.node, filePath, encoding, cmheader.contentOffset, cmheader.contentLength);
return null;
}
read() {
// proper HTML5 has substringData to read only a chunk
// (that saves on string memory allocations
// comparing to fetching the whole text including the file name)
var contentText = typeof this.node.substringData === 'function' ?
this.node.substringData(this._contentOffset, 1000000000) :
this.node.nodeValue.slice(this._contentOffset);
// XML end-comment is escaped when stored in DOM,
// unescape it back
var restoredText = contentText.
replace(/\-\-\*(\**)\>/g, '--$1>').
replace(/\<\*(\**)\!/g, '<$1!');
// decode
var decodedText = this._encoding(restoredText);
// update just in case it's been off
this.contentLength = decodedText.length;
return decodedText;
}
write(content: any) {
var encoded = bestEncode(content);
var protectedText = encoded.content.
replace(/\-\-(\**)\>/g, '--*$1>').
replace(/\<(\**)\!/g, '<*$1!');
if (!this._encodedPath) {
// most cases path is path,
// but if anything is weird, it's going to be quoted
// (actually encoded with JSON format)
var encp = bestEncode(this.path, true /*escapePath*/);
this._encodedPath = encp.content;
}
var leadText = ' ' + this._encodedPath + (encoded.encoding === 'LF' ? '' : ' [' + encoded.encoding + ']') + '\n';
this.node.nodeValue = leadText + encoded.content;
this._encoding = encodings[encoded.encoding || 'LF'];
this._contentOffset = leadText.length;
this.contentLength = content.length;
}
}
}module persistence.dom {
var monthsPrettyCase = ('Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec').split('|');
var monthsUpperCase = ('Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec').toUpperCase().split('|');
export class DOMTotals {
constructor(
public timestamp: number,
public totalSize: number,
private _node: Comment) {
}
static tryParse(cmheader: CommentHeader): DOMTotals {
// TODO: preserve unknowns when parsing
var parts = cmheader.header.split(',');
var anythingParsed = false;
var totalSize = 0;
var timestamp = 0;
for (var i = 0; i < parts.length; i++) {
// total 234Kb
// total 23
// total 6Mb
var totalFmt = /^\s*total\s+(\d*)\s*([KkMm])?b?\s*$/;
var totalMatch = totalFmt.exec(parts[i]);
if (totalMatch) {
try {
var total = parseInt(totalMatch[1]);
if ((totalMatch[2] + '').toUpperCase() === 'K')
total *= 1024;
else if ((totalMatch[2] + '').toUpperCase() === 'M')
total *= 1024 * 1024;
totalSize = total;
anythingParsed = true;
}
catch (totalParseError) { }
continue;
}
var savedFmt = /^\s*saved\s+(\d+)\s+(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+(\d+)\s+(\d+)\:(\d+)(\:(\d+(\.(\d+))?))\s*(GMT\s*[\-\+]?\d+\:?\d*)?\s*$/i;
var savedMatch = savedFmt.exec(parts[i]);
if (savedMatch) {
// 25 Apr 2015 22:52:01.231
try {
var savedDay = parseInt(savedMatch[1]);
var savedMonth = monthsUpperCase.indexOf(savedMatch[2].toUpperCase());
var savedYear = parseInt(savedMatch[3]);
if (savedYear < 100)
savedYear += 2000; // no 19xx notation anymore :-(
var savedHour = parseInt(savedMatch[4]);
var savedMinute = parseInt(savedMatch[5]);
var savedSecond = savedMatch[7] ? parseFloat(savedMatch[7]) : 0;
timestamp = new Date(savedYear, savedMonth, savedDay, savedHour, savedMinute, savedSecond | 0).valueOf();
timestamp += (savedSecond - (savedSecond | 0))*1000; // milliseconds
var savedGMTStr = savedMatch[10];
if (savedGMTStr) {
var gmtColonPos = savedGMTStr.indexOf(':');
if (gmtColonPos>0) {
var gmtH = parseInt(savedGMTStr.slice(0, gmtColonPos));
timestamp += gmtH * 60 /*min*/ * 60 /*sec*/ * 1000 /*msec*/;
var gmtM = parseInt(savedGMTStr.slice(gmtColonPos + 1));
timestamp += gmtM * 60 /*sec*/ * 1000 /*msec*/;
}
}
anythingParsed = true;
}
catch (savedParseError) { }
}
}
if (anythingParsed)
return new DOMTotals(timestamp, totalSize, cmheader.node);
else
return null;
}
updateNode() {
// TODO: update the node content
// total 4Kb, saved 25 Apr 2015 22:52:01.231
var newTotals =
'total ' + (
this.totalSize < 1024 * 9 ? this.totalSize + '' :
this.totalSize < 1024 * 1024 * 9 ? ((this.totalSize / 1024) | 0) + 'Kb' :
((this.totalSize / (1024 * 1024)) | 0) + 'Mb') + ', ' +
'saved ';
var saveDate = new Date(this.timestamp);
newTotals +=
saveDate.getDate() + ' ' +
monthsPrettyCase[saveDate.getMonth()] + ' ' +
saveDate.getFullYear() + ' ' +
num2(saveDate.getHours()) + ':' +
num2(saveDate.getMinutes()) + ':' +
num2(saveDate.getSeconds()) + '.' +
this.timestamp.toString().slice(-3);
var saveDateLocalStr = saveDate.toString();
var gmtMatch = (/(GMT\s*[\-\+]\d+(\:\d+)?)/i).exec(saveDateLocalStr);
if (gmtMatch)
newTotals += ' ' + gmtMatch[1];
this._node.nodeValue = newTotals;
function num2(n: number) {
return n <= 9 ? '0' + n : '' + n;
}
}
}
}module persistence.dom {
export function parseDOMStorage(document: parseDOMStorage.DocumentSubset): parseDOMStorage.ContinueParsing {
var loadedFiles: DOMFile[] = [];
var loadedTotals: DOMTotals;
var lastNode: Node;
var loadedSize = 0;
return continueParsing();
function continueParsing(): parseDOMStorage.ContinueParsing {
continueParsingDOM(false);
return {
continueParsing,
finishParsing,
loadedSize,
totalSize: loadedTotals ? loadedTotals.totalSize : 0,
loadedFileCount: loadedFiles.length
};
}
function finishParsing(): DOMDrive {
continueParsingDOM(true);
if (loadedTotals) {
loadedTotals.totalSize = loadedSize;
loadedTotals.updateNode();
}
var drive = new DOMDrive(loadedTotals, loadedFiles, document);
return drive;
}
function continueParsingDOM(finish: boolean) {
if (document.body) {
if (!lastNode)
lastNode = document.body.firstChild;
while (true) {
if (!lastNode) return;
else if (!finish && lastNode == document.body.lastChild) return;
if (lastNode.nodeType === 8) {
processNode(<Comment>lastNode);
}
lastNode = lastNode.nextSibling;
}
}
}
function processNode(node: Comment): boolean {
var cmheader = new CommentHeader(node);
var file = DOMFile.tryParse(cmheader);
if (file) {
loadedFiles.push(file);
loadedSize += file.contentLength;
return true;
}
var totals = DOMTotals.tryParse(cmheader);
if (totals)
loadedTotals = totals;
}
}
export module parseDOMStorage {
export interface ContinueParsing {
continueParsing(): ContinueParsing;
finishParsing(): DOMDrive;
loadedFileCount: number;
loadedSize: number;
totalSize: number;
}
export interface DocumentSubset extends DOMDrive.DocumentSubset {
body: HTMLBodyElementSubset;
}
export interface HTMLBodyElementSubset extends DOMDrive.HTMLBodyElementSubset {
lastChild: Node;
}
}
}module persistence.encodings {
export function CR(text: string): string {
return text.
replace(/\r\n|\n/g, '\r');
}
}module persistence.encodings {
export function CRLF(text: string): string {
return text.
replace(/\r|\n/g, '\r\n');
}
}module persistence.encodings {
export function LF(text: string): string {
return text.
replace(/\r\n|\r/g, '\n');
}
}module persistence.encodings {
export function base64(text: string): any {
// TODO: convert from base64 to text
// TODO: invent a prefix to signify binary data
throw new Error('Base64 encoding is not implemented yet.');
}
}module persistence.encodings {
export function eval(text: string): any {
return (0, window['eval'])(text);
}
}module persistence.encodings {
export function json(text: string): any {
var result = typeof JSON ==='undefined' ? eval(text) : JSON.parse(text);
if (result && typeof result !== 'string' && result.type) {
var ctor: any = window[result.type];
result = new ctor(result);
}
return result;
}
}module persistence {
export interface Drive {
timestamp: number;
files(): string[];
read(file: string): string;
write(file: string, content: string);
}
export module Drive {
export interface Shadow {
timestamp: number;
write(file: string, content: string): void;
}
export interface Optional {
name: string;
detect(uniqueKey: string, callback: (detached: Detached) => void): void;
}
export interface Detached {
timestamp: number;
totalSize?: number;
applyTo(mainDrive: Drive, callback: Detached.CallbackWithShadow): void;
purge(callback: Detached.CallbackWithShadow): void;
}
export module Detached {
export interface CallbackWithShadow {
(loaded: Shadow): void;
progress?: (current: number, total: number) => void;
}
}
}
}module persistence {
export function bestEncode(content: any, escapePath?: boolean): { content: string; encoding: string; } {
if (content.length>1024*16) {
// TODO: consider packing tightly and using eval encoding to unpack
}
if (typeof content!=='string')
return { content: encodeArrayOrSimilarAsJSON(content), encoding: 'json' };
var needsEscaping: boolean;
if (escapePath) {
// zero-char, newlines, leading/trailing spaces, quote and apostrophe
needsEscaping = /\u0000|\r|\n|^\s|\s$|\"|\'/.test(content);
}
else {
needsEscaping = /\u0000|\r/.test(content);
}
if (needsEscaping) {
// ZERO character is officially unsafe in HTML,
// CR is contentious in IE (which converts any CR or LF into CRLF)
return { content: encodeUnusualStringAsJSON(content), encoding: 'json' };
}
else {
return { content: content, encoding: 'LF' };
}
}
function encodeUnusualStringAsJSON(content: string): string {
if (typeof JSON !== 'undefined' && typeof JSON.stringify === 'function') {
var simpleJSON = JSON.stringify(content);
var sanitizedJSON = simpleJSON.
replace(/\u0000/g, '\\u0000').
replace(/\r/g, '\\r').
replace(/\n/g, '\\n');
return sanitizedJSON;
}
else {
var result = content.replace(
/\"\u0000|\u0001|\u0002|\u0003|\u0004|\u0005|\u0006|\u0007|\u0008|\u0009|\u00010|\u00011|\u00012|\u00013|\u00014|\u00015|\u0016|\u0017|\u0018|\u0019|\u0020|\u0021|\u0022|\u0023|\u0024|\u0025|\u0026|\u0027|\u0028|\u0029|\u0030|\u0031/g,
(chr) =>
chr === '\t' ? '\\t' :
chr === '\r' ? '\\r' :
chr === '\n' ? '\\n' :
chr === '\"' ? '\\"' :
chr < '\u0010' ? '\\u000' + chr.charCodeAt(0).toString(16) :
'\\u00' + chr.charCodeAt(0).toString(16));
return result;
}
}
function encodeArrayOrSimilarAsJSON(content: any): string {
var type = content instanceof Array ? null : content.constructor.name || content.type;
if (typeof JSON !== 'undefined' && typeof JSON.stringify === 'function') {
if (type) {
var wrapped = { type, content };
var wrappedJSON = JSON.stringify(wrapped);
return wrappedJSON;
}
else {
var contentJSON = JSON.stringify(content);
return contentJSON;
}
}
else {
var jsonArr: string[] = [];
if (type) {
jsonArr.push('{"type": "');
jsonArr.push(content.type || content.prototype.constructor.name);
jsonArr.push('", "content": [');
}
else {
jsonArr.push('[');
}
for (var i = 0; i < content.length; i++) {
if (i) jsonArr.push(',');
jsonArr.push(content[i]);
}
if (type)
jsonArr.push(']}');
else
jsonArr.push(']');
return jsonArr.join('');
}
}
}module persistence {
// TODO: pass in progress callback
export function bootMount(uniqueKey: string, document: Document): bootMount.ContinueLoading {
var continueParse: persistence.dom.parseDOMStorage.ContinueParsing;
var ondomdriveloaded;
var domDriveLoaded: Drive;
var storedFinishCallback;
mountDrive(
callback => {
if (domDriveLoaded)
callback(domDriveLoaded);
else
ondomdriveloaded = callback;
},
uniqueKey,
[attached.indexedDB, attached.webSQL, attached.localStorage],
mountedDrive => {
storedFinishCallback(mountedDrive);
});
return continueLoading();
function continueLoading(): bootMount.ContinueLoading {
continueDOMLoading();
// TODO: record progress
return {
continueLoading,
finishLoading,
loadedFileCount: continueParse.loadedFileCount,
loadedSize: continueParse.loadedSize,
totalSize: continueParse.totalSize
};
}
function finishLoading(finishCallback: (monutedDrive: Drive) => void) {
storedFinishCallback = finishCallback;
continueDOMLoading();
domDriveLoaded = continueParse.finishParsing();
if (ondomdriveloaded) {
ondomdriveloaded(domDriveLoaded);
}
}
function continueDOMLoading() {
continueParse = continueParse ? continueParse.continueParsing() : dom.parseDOMStorage(document);
}
}
module bootMount {
export interface ContinueLoading {
continueLoading(): ContinueLoading;
finishLoading(finishCallback: (mountedDrive: Drive) => void);
loadedFileCount: number;
loadedSize: number;
totalSize: number;
}
}
}module persistence {
export function mountDrive(
loadDOMDrive: (callback: (dom: Drive) => void)=> void,
uniqueKey: string,
optionalModules: Drive.Optional[],
callback: mountDrive.Callback): void {
var driveIndex = 0;
loadNextOptional();
function loadNextOptional() {
while (driveIndex < optionalModules.length &&
(!optionalModules[driveIndex] || typeof optionalModules[driveIndex].detect !== 'function')) {
driveIndex++;
}
if (driveIndex >= optionalModules.length) {
loadDOMDrive(dom => callback(new MountedDrive(dom, null)));
return;
}
var op = optionalModules[driveIndex];
op.detect(
uniqueKey,
detached => {
if (!detached) {
driveIndex++;
loadNextOptional();
return;
}
loadDOMDrive(dom => {
if (detached.timestamp > dom.timestamp) {
var callbackWithShadow: Drive.Detached.CallbackWithShadow = loadedDrive => {
dom.timestamp = detached.timestamp;
callback(new MountedDrive(dom, loadedDrive));
};
if (callback.progress)
callbackWithShadow.progress = callback.progress;
loadDOMDrive(dom => detached.applyTo(dom, callbackWithShadow));
}
else {
var callbackWithShadow: Drive.Detached.CallbackWithShadow = loadedDrive => {
callback(new MountedDrive(dom, loadedDrive));
};
if (callback.progress)
callbackWithShadow.progress = callback.progress;
detached.purge(callbackWithShadow);
}
});
});
}
}
export module mountDrive {
export interface Callback {
(drive: Drive): void;
progress?: (current: number, total: number) => void;
}
}
class MountedDrive implements Drive {
updateTime = true;
timestamp: number = 0;
constructor (private _dom: Drive, private _shadow: Drive.Shadow) {
this.timestamp = this._dom.timestamp;
}
files(): string[] {
return this._dom.files();
}
read(file: string): string {
return this._dom.read(file);
}
write(file: string, content: string) {
if (this.updateTime) {
this.timestamp = +new Date();
}
this._dom.timestamp = this.timestamp;
this._dom.write(file, content);
if (this._shadow) {
this._shadow.timestamp = this.timestamp;
this._shadow.write(file, content);
}
}
}
}module persistence {
export function normalizePath(path: string) : string {
if (!path) return '/'; // empty paths converted to root
if (path.charAt(0) !== '/') // ensuring leading slash
path = '/' + path;
path = path.replace(/\/\/*/g, '/'); // replacing duplicate slashes with single
return path;
}
}module build {
export function processTemplate(
template: string, scopes: any[],
log: (logText: string) => void,
callback: (error: Error, result?: string) => void): void {
// <%= expr %>
// <% statement %>
// <%-- comment --%>
log('Generating build script...');
setTimeout(() => {
var fnText = generateBuildScript(template, scopes);
log('Preprocessing build script...');
setTimeout(() => {
try {
var fn = Function('scopes', fnText);
log('Executing build script...');
var output: any[] = fn(scopes);
var outputIndex = 0;
}
catch (error) {
log('Build failure ' + error);
callback(error);
return;
}
processNextOutputChunk();
function processNextOutputChunk() {
var startTime = +new Date();
// all heavy chunks will bail out and queue the next one on setTimeout,
// simple literal insertions keep going for a slice of time
while (true) {
if (outputIndex >= output.length) {
var result = output.join('');
callback(null, result);
return;
}
var outputChunk = output[outputIndex];
if (typeof outputChunk === 'function') {
log('Processing ' + outputChunk + '...');
setTimeout(() => {
try {
var chunkResult = outputChunk();
var chunkResultText = String(chunkResult);
output[outputIndex] = chunkResultText;
}
catch (error) {
callback(error);
return;
}
log('...OK [' + chunkResultText.length + ']');
outputIndex++;
processNextOutputChunk();
//setTimeout(processNextOutputChunk, 1);
}, 1);
break;
}
else {
var literal = String(outputChunk);
output[outputIndex] = literal;
var literalLines = (literal.length > 100 ? literal.slice(0, 50) + '\n...\n' + literal.slice(literal.length - 5) : literal).split('\n');
while (literalLines.length && !literalLines[0]) literalLines.shift();
while (literalLines.length && !literalLines[literalLines.length - 1]) literalLines.pop();
log(literalLines.length <= 2 ? literalLines.join('\n') : literalLines[0] + '\n...\n' + literalLines[literalLines.length - 1]);
outputIndex++;
if (+new Date() - startTime > 300) {
setTimeout(processNextOutputChunk, 1);
break;
}
// keep going if haven't been processing for long yet
}
}
}
}, 1);
}, 1);
}
function generateBuildScript(template: string, scopes: any[]): string {
var generated: string[] = [];
for (var i = 0; i < scopes.length; i++) {
generated.push('with(scopes[' + i + ']) {');
}
generated.push('var output =[];');
var index = 0;
while (index < template.length) {
var nextOpenASP = template.indexOf('<%', index);
if (nextOpenASP < 0) {
generateWrite(generated, template.slice(index));
break;
}
var ch = template.charAt(nextOpenASP + 2);
if (ch === '=') {
var closeASP = template.indexOf('%>', nextOpenASP);
if (closeASP < 0) {
generateWrite(generated, template.slice(index));
break;
}
generateWrite(generated, template.slice(index, nextOpenASP));
generateRedirect(generated, template.slice(nextOpenASP + 3, closeASP));
index = closeASP + 2;
}
else if (ch === '-') {
var closeCommentMatch = template.charAt(nextOpenASP + 3) === '-' ? '--%>' : '-%>';
var closeComment = template.indexOf(closeCommentMatch, nextOpenASP);
if (closeComment < 0) {
generateWrite(generated, template.slice(index));
break;
}
generateWrite(generated, template.slice(index, nextOpenASP));
index = closeComment + closeCommentMatch.length;
}
else {
var closeASP = template.indexOf('%>', nextOpenASP);
if (closeASP < 0) {
generateWrite(generated, template.slice(index));
break;
}
generateWrite(generated, template.slice(index, nextOpenASP));
generateStatement(generated, template.slice(nextOpenASP + 2, closeASP));
index = closeASP + 2;
}
}
for (var i = 0; i < scopes.length; i++) {
generated.push('}');
}
generated.push('return output;');
var fnText = generated.join('\n');
return fnText;
}
function generateWrite(generated: string[], chunk: string) {
if (chunk)
generated.push('output.push(\'' + stringLiteral(chunk) + '\');');
}
function generateRedirect(generated: string[], redirect: string) {
generated.push('output.push(' + redirect + ');');
}
function generateStatement(generated: string[], statement: string) {
generated.push(statement);
}
function stringLiteral(text: string) {
return text.
replace(/\\/g, '\\\\').
replace(/\n/g, '\\n').
replace(/\r/g, '\\r').
replace(/\t/g, '\\t').
replace(/\'/g, '\\\'').
replace(/\"/g, '\\"');
}
}module editor {
export class Editor {
private _textarea: HTMLTextAreaElement;
private _title: HTMLDivElement;
constructor(private _host: HTMLElement, private _file: string, text?: string) {
this._textarea = <any>elem('textarea', {
background: 'navy',
color: 'silver',
top: '0', left: '0',
width: '100%', height: '100%', position: 'absolute',
borderTop: 'solid 1em black'
}, this._host);
this._title = <any>elem('div', {
position: 'absolute',
top: '0', left: '0',
width: '100%', height: '1em',
background: 'silver', color: 'navy',
text: this._file
}, this._host);
if (typeof text === 'string')
this._textarea.value = text;
}
focus() {
this._textarea.focus();
}
setText(text: string) {
this._textarea.value = text;
}
getText(): string {
return this._textarea.value;
}
close() {
this._host.removeChild(this._textarea);
this._host.removeChild(this._title);
}
}
}module panels {
var panelClass = 'panels-panel-page';
export class Panel {
private _cursorPath: string;
private _cursorEntryIndex = -1;
private _entries: Panel.PageEntry[] = null;
private _redrawRequested = 0;
private _metrics: Panel.Metrics = null;
private _scrollContent: HTMLElementWithFlags;
private _pages: Panel.PageData[] = [];
private _entriesInColumn = 0;
private _pageHeight = 0;
private _pageInterval = 0;
private _columnsOnPage = 0;
private _columnWidth = 0;
private _scrollTop = 0;
private _scrollTopHeight = 0;
private _isActive = false;
private _nextRedrawScrollToCurrent = false;
constructor(
private _host: HTMLElement,
private _path: string,
private _directoryService: (path: string) => Panel.DirectoryEntry[]) {
this._scrollContent = <HTMLElementWithFlags>elem('div', this._host);
this._scrollContent.isScrollContent = true;
on(this._host, 'scroll', () => this._onscroll());
this._queueRedraw();
}
set(paths: {currentPath?: string; cursorPath?: string}) {
if (paths.currentPath)
this._path = paths.currentPath;
if (paths.cursorPath) {
this._cursorPath = paths.cursorPath;
this._nextRedrawScrollToCurrent = true;
}
this._queueRedraw();
}
onclick(e: MouseEvent) {
if (!this._entries) return;
var clickElem = <HTMLElementWithFlags>(e.srcElement || e.target || e.currentTarget);
var entryDIV: HTMLElementWithFlags;
var columnDIV: HTMLElementWithFlags;
var pageDIV: HTMLElementWithFlags;
var leadPaddingDIV: HTMLElementWithFlags;
while (clickElem) {
if (clickElem.isScrollContent) {
if (clickElem !== this._scrollContent) return false;
break;
}
if (clickElem.isPageDIV)
pageDIV = clickElem;
if (clickElem.isColumnDIV)
columnDIV = clickElem;
if (clickElem.isEntryDIV)
entryDIV = clickElem;
clickElem = <any>clickElem.parentElement;
}
if (entryDIV) {
for (var i = 0; i < this._entries.length; i++) {
if (this._entries[i].entryDIV === entryDIV) {
if (this._cursorPath ===this._entries[i].path && (this._entries[i].flags & Panel.EntryFlags.Directory)) {
this._cursorPath = this._path;
this._path = this._entries[i].path; // double click (or second click) opens directory
}
else {
this._cursorPath = this._entries[i].path;
}
this._nextRedrawScrollToCurrent = true;
this._queueRedraw();
break;
}
}
this._redrawNow();
}
return true;
}
currentPath() {
return this._path;
}
cursorPath() {
return this._cursorPath;
}
arrange(metrics: Panel.Metrics) {
this._metrics = metrics;
this._redrawNow();
}
isActive() {
return this._isActive;
}
activate() {
this._isActive = true;
this._scrollContent.className = 'panels-panel-active';
}
deactivate() {
this._isActive = false;
this._scrollContent.className = 'panels-panel-inactive';
}
cursorGo(direction: number) {
if (!this._entries || !this._entries.length) return;
var moveStep = 0;
switch (direction) {
case -1: // up
moveStep = -1;
break;
case +1: // down
moveStep = +1;
break;
case -10: // left
var entryIndex = this._calcEntryIndex(this._cursorEntryIndex);
if (this._columnsOnPage === 1) {
moveStep = -entryIndex || -1;
}
else {
var columnIndex = this._calcColumnIndex(this._cursorEntryIndex);
if (columnIndex > 0) {
moveStep = -this._entriesInColumn;
}
else {
moveStep = this._entriesInColumn * (this._columnsOnPage - 1) - 1;
// overflow cases
if (this._cursorEntryIndex === 0) {
moveStep = this._entriesInColumn * (this._columnsOnPage - 1);
}
else if (this._cursorEntryIndex + moveStep >= this._entries.length) { // there is no rightmost column
var endEntryIndex = this._calcEntryIndex(this._entries.length - 1);
var endColumnIndex = this._calcColumnIndex(this._entries.length - 1);
// if the last entry is higher vertically, stop at the previous column
var targetColumnIndex = endEntryIndex >= entryIndex ? endColumnIndex : endColumnIndex - 1;
if (targetColumnIndex <= columnIndex) {
moveStep = -entryIndex; // if nowhere to go right, go all the way up
}
else {
// there are columns on the right, so go there (and one up after)
moveStep = (targetColumnIndex - columnIndex) * this._entriesInColumn - 1;
}
}
}
}
break;
case +10: // right
var columnIndex = this._calcColumnIndex(this._cursorEntryIndex);
if (columnIndex < this._columnsOnPage - 1) {
moveStep = +this._entriesInColumn;
}
else {
moveStep = -this._entriesInColumn * 2 + 1;
}
break;
case -100: // page up
moveStep = -this._entriesInColumn * this._columnsOnPage;
break;
case +100: // page down
moveStep = +this._entriesInColumn * this._columnsOnPage;
break;
}
if (moveStep) {
var newCursorEntryIndex = Math.max(0, Math.min(this._entries.length-1, this._cursorEntryIndex + moveStep));
var e = this._entries[newCursorEntryIndex];
if (e) {
this._cursorPath = this._entries[newCursorEntryIndex].path;
this._nextRedrawScrollToCurrent = true;
this._queueRedraw();
}
}
}
navigateCursor() {
if (this._cursorEntryIndex >= 0) {
var entry = this._entries[this._cursorEntryIndex];
if (entry) {
if (entry.flags & Panel.EntryFlags.Directory) {
this._cursorPath = this._path;
this._path = entry.path;
this._nextRedrawScrollToCurrent = true;
this._queueRedraw();
return true;
}
}
}
}
private _queueRedraw() {
if (this._redrawRequested) return;
this._redrawRequested = setTimeout(() => this._redrawNow(), 100);
}
private _redrawNow() {
var prevOffset = this._calcEntryTopOffset(Math.max(0, this._cursorEntryIndex));
var entries = this._directoryService(this._path);
this._entries = [];
entries.sort((e1, e2) => {
var flagCompare = (e1.flags & Panel.EntryFlags.Directory) ?
((e2.flags & Panel.EntryFlags.Directory) ? 0 : -1) :
((e2.flags & Panel.EntryFlags.Directory) ? +1 : 0);
if (flagCompare) return flagCompare;
var nameCompare = e1.name > e2.name ? 1 : e1.name < e2.name ? -1 : 0;
return nameCompare;
});
if (this._path !== '/') {
var parentPath = this._path.slice(0, this._path.lastIndexOf('/')) || '/';
entries.unshift({
name: '..',
path: parentPath,
flags: Panel.EntryFlags.Directory
});
}
if (!entries || !entries.length) {
this._scrollContent.innerHTML = '';
this._pages = [];
return;
}
this._cursorEntryIndex = -1;
for (var i = 0; i < entries.length; i++) {
if (entries[i].path === this._cursorPath) {
this._cursorEntryIndex = i;
break;
}
}
if (this._cursorEntryIndex < 0) {
this._cursorEntryIndex = 0;
this._cursorPath = entries.length > 0 ? entries[0].path : null;
}
this._entriesInColumn = Math.max(3, ((this._metrics.hostHeight / this._metrics.windowMetrics.emHeight) | 0) - 2);
this._pageHeight = this._entriesInColumn * this._metrics.windowMetrics.emHeight;
this._pageInterval = this._metrics.hostHeight - this._pageHeight - this._metrics.windowMetrics.emHeight;
var desiredColumnWidth = 17 * this._metrics.windowMetrics.emWidth;
this._columnsOnPage = Math.max(1, Math.round(this._metrics.hostWidth / desiredColumnWidth) | 0);
this._columnWidth = ((this._metrics.hostWidth / this._columnsOnPage) | 0) - 1;
if (!this._pages)
this._pages = [];
for (var i = 0; i < entries.length; i++) {
var pageIndex = this._calcPageIndex(i);
var page = this._pages[pageIndex];
if (page) {
if (page.height !== this._pageHeight) {
page.height = this._pageHeight;
page.pageDIV.style.height = this._pageHeight + 'px';
}
if (page.leadInterval !== this._pageInterval) {
page.leadInterval = this._pageInterval;
if (page.leadPaddingDIV)
page.leadPaddingDIV.style.height = this._pageInterval + 'px';
}
}
else {
if (pageIndex) {
var leadPaddingDIV = <HTMLElementWithFlags>elem('div', {
className: 'panels-page-separator',
height: this._pageInterval + 'px'
}, this._scrollContent);
leadPaddingDIV.isLeadPaddingDIV = true;
}
page = {
leadPaddingDIV,
leadInterval: this._pageInterval,
height: this._pageHeight,
pageDIV: <HTMLElementWithFlags>elem('div', {
className: panelClass,
height: this._pageHeight + 'px'
}, this._scrollContent),
columns: []
};
page.pageDIV.isPageDIV = true;
this._pages.push(page);
}
var columnIndex = this._calcColumnIndex(i);
var column = page.columns[columnIndex];
if (column) {
if (columnIndex === this._columnsOnPage - 1 && page.columns.length > this._columnsOnPage) {
this._removeExcessColumns(page, this._columnsOnPage);
}
if (column.height !== this._pageHeight) {
column.height = this._pageHeight;
column.columnDIV.style.height = this._pageHeight + 'px';
}
if (column.width !== this._columnWidth) {
column.width = this._columnWidth;
column.columnDIV.style.width = this._columnWidth + 'px';
}
}
else {
column = {
height: this._pageHeight,
width: this._columnWidth,
columnDIV: <HTMLElementWithFlags>elem('div', {
className: 'panels-panel-column',
height: this._pageHeight + 'px',
width: this._columnWidth + 'px'
}, page.pageDIV),
entries: []
};
column.columnDIV.isColumnDIV = true;
page.columns.push(column);
}
var dentry = entries[i];
var entryIndex = this._calcEntryIndex(i);
var entry = column.entries[entryIndex];
if (!entry) {
var dirfileClassName = dentry.flags & Panel.EntryFlags.Directory ? ' panels-entry-dir' : ' panels-entry-file';
var entryClassName =
'panels-entry' +
dirfileClassName +
(this._cursorEntryIndex === i ? ' panels-entry-current' + dirfileClassName + '-current' : '');
entry = {
name: dentry.name,
path: dentry.path,
flags: dentry.flags,
selectionFlags: this._cursorEntryIndex === i ? Panel.SelectionFlags.Current : 0,
entryDIV: <HTMLElementWithFlags>elem('div', {
className: entryClassName,
text: dentry.name,
height: this._metrics.windowMetrics.emHeight + 'px'
}, column.columnDIV)
};
entry.entryDIV.isEntryDIV = true;
column.entries.push(entry);
}
else {
var expectedSelectionFlags = this._cursorEntryIndex === i ? Panel.SelectionFlags.Current : 0;
if (entry.name !== dentry.name) {
entry.name = dentry.name;
setText(entry.entryDIV, dentry.name);
}
if (entry.path !== dentry.path) {
entry.path = dentry.path;
}
if (entry.flags !== dentry.flags || entry.selectionFlags !== expectedSelectionFlags) {
var dirfileClassName = dentry.flags & Panel.EntryFlags.Directory ? ' panels-entry-dir' : ' panels-entry-file';
var entryClassName =
'panels-entry' +
dirfileClassName +
(this._cursorEntryIndex === i ? ' panels-entry-current' + dirfileClassName + '-current' : '');
entry.entryDIV.className = entryClassName;
entry.flags = dentry.flags;
entry.selectionFlags = expectedSelectionFlags;
}
if (entryIndex === this._entriesInColumn - 1 && column.entries.length > this._entriesInColumn) {
this._removeExcessEntries(column, this._entriesInColumn);
}
}
this._entries.push(entry);
}
this._removeExcessPages(pageIndex + 1);
var p = this._pages[pageIndex];
this._removeExcessColumns(p, columnIndex + 1);
var c = p.columns[columnIndex];
this._removeExcessEntries(c, entryIndex + 1);
var newOffset = this._calcEntryTopOffset(Math.max(0, this._cursorEntryIndex));
if (this._nextRedrawScrollToCurrent) {
this._nextRedrawScrollToCurrent = false;
var maxScroll = newOffset - this._metrics.windowMetrics.emHeight*2;
var minScroll = newOffset - this._metrics.hostHeight + this._metrics.windowMetrics.emHeight*3;
var newScrollTop =
this._scrollTop < minScroll ? minScroll :
this._scrollTop > maxScroll ? maxScroll :
-1;
if (newScrollTop >=0) {
//console.log('redraw: scroll to current [' + newScrollTop + ']');
this._host.scrollTop = newScrollTop
}
}
else {
var prevDistanceFromCenter = prevOffset - (this._scrollTop + this._scrollTopHeight / 2);
var newScrollTop = newOffset - prevDistanceFromCenter - this._metrics.hostHeight / 2;
//console.log({
// prevDistanceFromCenter, prevOffset, this_scrollTop: this._scrollTop, this_scrollTopHeight: this._scrollTopHeight,
// newOffset, this_metrics_hostHeight: this._metrics.hostHeight, newScrollTop
//});
//console.log('redraw: scroll to approximate prev. [' + newScrollTop + ']');
this._host.scrollTop = newScrollTop;
}
this._redrawRequested = 0;
// end of _redrawNow()
}
private _removeExcessPages(expectedCount: number) {
for (var i = this._pages.length - 1; i >= expectedCount; i--) {
var p = this._pages[i];
p.pageDIV.parentElement.removeChild(p.pageDIV);
if (p.leadPaddingDIV)
p.leadPaddingDIV.parentElement.removeChild(p.leadPaddingDIV);
}
if (this._pages.length > expectedCount)
this._pages = this._pages.slice(0, expectedCount);
}
private _removeExcessColumns(p: { columns: Panel.ColumnData[]; }, expectedCount: number) {
for (var i = p.columns.length - 1; i >= expectedCount; i--) {
var c = p.columns[i];
c.columnDIV.parentElement.removeChild(c.columnDIV);
}
if (p.columns.length > expectedCount)
p.columns = p.columns.slice(0, expectedCount);
}
private _removeExcessEntries(c: { entries: Panel.PageEntry[]; }, expectedCount: number) {
for (var i = c.entries.length - 1; i >= expectedCount; i--) {
var e = c.entries[i];
e.entryDIV.parentElement.removeChild(e.entryDIV);
}
if (c.entries.length > expectedCount)
c.entries = c.entries.slice(0, expectedCount);
}
private _onscroll() {
if (this._redrawRequested) return;
this._scrollTop = this._host.scrollTop;
this._scrollTopHeight = this._metrics.hostHeight;
//console.log('onscroll ' + this._scrollTop);
}
private _calcPageIndex(indexOfEntry: number): number {
return (indexOfEntry / (this._columnsOnPage * this._entriesInColumn)) | 0;
}
private _calcColumnIndex(indexOfEntry: number) {
return ((indexOfEntry / this._entriesInColumn) | 0) % this._columnsOnPage;
}
private _calcEntryIndex(indexOfEntry: number) {
return indexOfEntry % this._entriesInColumn;
}
private _calcEntryTopOffset(indexOfEntry: number) {
if (!this._metrics || !this._metrics.windowMetrics) return 0;
var pageIndex = this._calcPageIndex(indexOfEntry);
var entryIndex = this._calcEntryIndex(indexOfEntry);
var offset =
pageIndex * this._entriesInColumn * this._metrics.windowMetrics.emHeight + // whole pages
Math.max(0, pageIndex - 1) * this._pageInterval + // inter-page spaces
entryIndex * this._metrics.windowMetrics.emHeight; // distance from the top of the page
return offset;
}
}
interface HTMLElementWithFlags extends HTMLElement {
isScrollContent: boolean;
isLeadPaddingDIV?: boolean;
isPageDIV: boolean;
isColumnDIV: boolean;
isEntryDIV: boolean;
}
export module Panel {
export interface Metrics {
windowMetrics: CommanderShell.Metrics;
hostWidth: number;
hostHeight: number;
}
export interface DirectoryEntry {
name: string;
path: string;
flags: EntryFlags;
}
export enum EntryFlags {
Directory = 1
}
export interface PageData {
leadPaddingDIV: HTMLElementWithFlags;
pageDIV: HTMLElementWithFlags;
columns: ColumnData[];
height: number;
leadInterval: number;
}
export interface ColumnData {
columnDIV: HTMLElementWithFlags;
entries: PageEntry[];
height: number;
width: number;
}
export interface PageEntry extends DirectoryEntry {
entryDIV: HTMLElementWithFlags;
selectionFlags: SelectionFlags;
}
export enum SelectionFlags {
None = 0,
Current = 1,
Selected = 2
}
}
}module panels {
var panelHMargin = 10;
var panelVMargin = 5;
export class TwoPanels {
private _scrollHost: HTMLDivElement;
private _scrollContent: HTMLDivElement;
private _leftPanelHost: HTMLDivElement;
private _rightPanelHost: HTMLDivElement;
private _leftPanel: Panel;
private _rightPanel: Panel;
constructor(
private _host: HTMLElement,
leftPath: string,
rightPath: string,
private _drive: persistence.Drive) {
this._scrollHost = <any>elem('div', { className: 'panels-scroll-host' }, this._host);
this._scrollContent = <any>elem('div', { className: 'panels-scroll-content' }, this._scrollHost);
this._leftPanelHost = <any>elem('div', { className: 'panels-panel panels-left-panel' }, this._scrollContent);
this._rightPanelHost = <any>elem('div', { className: 'panels-panel panels-right-panel' }, this._scrollContent);
var directoryService = driveDirectoryService(this._drive);
this._leftPanel = new Panel(
this._leftPanelHost,
leftPath,
directoryService);
this._rightPanel = new Panel(
this._rightPanelHost,
rightPath,
directoryService);
this._leftPanel.activate();
/*
TODO: ensure focus stays with the text input at the bottom
elem.on(this._leftPanel, 'mousedown', e=> {
if (e.preventDefault)
e.preventDefault();
return false;
}); */
on(this._leftPanelHost, 'click', (e: MouseEvent) => this._onclick(e));
on(this._rightPanelHost, 'click', (e: MouseEvent) => this._onclick(e));
}
measure() {
}
arrange(metrics: CommanderShell.Metrics) {
var contentWidth = 0;
if (metrics.hostWidth < metrics.emWidth * 80 && metrics.hostWidth < metrics.hostHeight * 1) {
// flippable layout
contentWidth = Math.max(metrics.hostWidth / 2, metrics.hostWidth * 2 - metrics.emWidth * 3);
}
else {
// full layout
contentWidth = metrics.hostWidth;
}
var bottomGap = Math.min(metrics.hostHeight / 3, metrics.emHeight * 3);
this._scrollHost.style.width = metrics.hostWidth + 'px';
var panelsHeight = metrics.hostHeight - bottomGap;
this._scrollHost.style.height = panelsHeight + 'px';
this._scrollContent.style.width = contentWidth + 'px';
this._scrollContent.style.height = panelsHeight + 'px';
var panelWidth = (contentWidth / 2 - 0.5) | 0;
this._leftPanelHost.style.height = panelsHeight + 'px';
this._leftPanelHost.style.width = panelWidth + 'px';
this._rightPanelHost.style.height = panelsHeight + 'px';
this._rightPanelHost.style.width = panelWidth + 'px';
if (this._leftPanelHost.style.display !== 'none') {
this._leftPanel.arrange({
windowMetrics: metrics,
hostWidth: panelWidth - panelHMargin * 2,
hostHeight: panelsHeight - panelVMargin * 2
});
}
if (this._rightPanelHost.style.display !== 'none') {
this._rightPanel.arrange({
windowMetrics: metrics,
hostWidth: panelWidth - panelHMargin * 2,
hostHeight: panelsHeight - panelVMargin * 2
});
}
}
isVisible() {
return this._scrollHost.style.display !== 'none';
}
toggleVisibility() {
this._scrollHost.style.display = this.isVisible() ? 'none' : 'block';
}
isLeftActive() {
return this._leftPanel.isActive();
}
toggleActivePanel() {
if (!this.isVisible()) return;
var isLeftActive = this._leftPanel.isActive();
this._getPanel(isLeftActive).deactivate();
this._getPanel(!isLeftActive).activate();
}
temporarilyHidePanels(): () => void {
var start = +new Date();
var fadeTime = 500;
var opacity = 0.5;
this._scrollHost.style.opacity = <any>opacity;
this._scrollHost.style.filter = 'alpha(opacity=' + (opacity * 100) + ')';
var ani = setInterval(() => {
var passed = (Date.now ? Date.now() : +new Date()) - start;
if (passed > fadeTime) {
clearInterval(ani);
this._scrollHost.style.opacity = '0';
this._scrollHost.style.filter = 'alpha(opacity=0)';
return;
}
opacity = (1 - (passed / fadeTime))/2;
this._scrollHost.style.opacity = <any>opacity;
this._scrollHost.style.filter = 'alpha(opacity=' + (opacity*100) + ')';
}, 1);
var stop = () => {
clearInterval(ani);
var passed = (Date.now ? Date.now() : +new Date()) - start;
opacity = Math.max(0, 1 - (passed / fadeTime));
start = +new Date();
fadeTime = 300 * (1-opacity);
ani = setInterval(() => {
var passed = (Date.now ? Date.now() : +new Date()) - start;
if (passed > fadeTime) {
clearInterval(ani);
this._scrollHost.style.opacity = null;
this._scrollHost.style.filter = null;
return;
}
opacity = passed / fadeTime;
this._scrollHost.style.opacity = <any>opacity;
this._scrollHost.style.filter = 'alpha(opacity=' + (opacity * 100) + ')';
}, 1);
};
return stop;
}
keydown(e: KeyboardEvent): boolean {
switch (e.keyCode) {
case 38:
return this._selectionGo(-1);
case 40:
return this._selectionGo(+1);
case 33:
return this._selectionGo(-100);
case 34:
return this._selectionGo(+100);
case 37:
return this._selectionGo(-10);
case 39:
return this._selectionGo(+10);
case 9:
this.toggleActivePanel();
return true;
case 86: // U
if (e.ctrlKey || e.metaKey)
return this.togglePanelPaths();
break;
case 112: // F1
if (e.ctrlKey || e.metaKey) {
return this.togglePartHidden(true);
}
break;
case 113: // F2
if (e.ctrlKey || e.metaKey) {
return this.togglePartHidden(false);
}
break;
case 13: // Enter
var activePa = this._getPanel(this.isLeftActive());
return activePa.navigateCursor();
default:
if (e.ctrlKey) {
//console.log('ctrl ' + e.keyCode);
}
break;
}
return false;
}
togglePartHidden(leftPanel: boolean) {
var togglePanelHost = this._getPanelHost(leftPanel);
var oppositePanelHost = this._getPanelHost(!leftPanel);
if (!this.isVisible()) {
togglePanelHost.style.display = 'block';
oppositePanelHost.style.display = 'none';
if (this.isLeftActive() !== leftPanel)
this.toggleActivePanel();
this.toggleVisibility();
}
else {
if (togglePanelHost.style.display !== 'none') {
if (oppositePanelHost.style.display === 'none') {
togglePanelHost.style.display = 'block';
this.toggleVisibility();
}
else {
togglePanelHost.style.display = 'none';
if (this.isLeftActive() === leftPanel)
this.toggleActivePanel();
}
}
else {
togglePanelHost.style.display = 'block';
}
}
return true;
}
togglePanelPaths() {
console.log('Ctrl+U toggle is not implemented.');
return false;
}
cursorPath() {
if (!this.isVisible()) return null;
var pan = this._getPanel(this.isLeftActive());
return pan.cursorPath();
}
currentPath() {
if (!this.isVisible()) return null;
var pan = this._getPanel(this.isLeftActive());
return pan.currentPath();
}
cursorOppositePath() {
if (!this.isVisible()) return null;
var pan = this._getPanel(!this.isLeftActive());
return pan.cursorPath();
}
currentOppositePath() {
if (!this.isVisible()) return null;
var pan = this._getPanel(!this.isLeftActive());
return pan.currentPath();
}
private _selectionGo(direction: number) {
var panel = this._getPanel(this.isLeftActive()).cursorGo(direction);
return true;
}
private _getPanel(left: boolean) {
return left ? this._leftPanel : this._rightPanel;
}
private _getPanelHost(left: boolean) {
return left ? this._leftPanelHost : this._rightPanelHost;
}
private _onclick(e: MouseEvent) {
var isLeft = this._leftPanel.onclick(e);
if (!isLeft && !this._rightPanel.onclick(e))
return;
if (isLeft === this.isLeftActive()) return;
this.toggleActivePanel();
}
}
}module panels {
export function driveDirectoryService(drive: persistence.Drive) {
return path => {
var pathPrefix = path === '/' ? path : path + '/';
var result: Panel.DirectoryEntry[] = [];
var resByName: { [name: string]: Panel.DirectoryEntry; } = {};
var files = drive.files();
for (var i = 0; i < files.length; i++) {
var fi = files[i];
if (fi.length < pathPrefix.length + 1) continue;
if (fi.slice(0, pathPrefix.length) !== pathPrefix) continue;
var name: string;
var entryPath = fi;
var isDirectory = false;
var nextSlashPos = fi.indexOf('/', pathPrefix.length);
if (nextSlashPos < 0) {
name = fi.slice(pathPrefix.length);
}
else {
name = fi.slice(pathPrefix.length, nextSlashPos);
entryPath = fi.slice(0, nextSlashPos);
isDirectory = true;
}
if (resByName.hasOwnProperty(name)) continue;
var entry = { path: entryPath, name, flags: isDirectory ? Panel.EntryFlags.Directory : 0 };
result.push(entry);
resByName[name] = entry;
}
return result;
};
}
}.panels-scroll-host {
position: absolute;
left: 0; top: 0; width: 0; height: 0;
overflow: auto;
overflow-y: hidden;
background: black;
background: transparent;
}
.panels-scroll-content {
width: 0; height: 0; overflow: hidden;
}
.panels-panel {
width: 0; height: 0;
overflow: auto;
overflow-x: hidden;
background: rgba(4, 12, 64, 0.95) !important;
background: navy;
color: darkcyan;
padding-top: 10px;
padding-bottom: 10px;
cursor: default;
}
.panels-panel * {
cursor: default;
}
.panels-left-panel {
float: left;
}
.panels-right-panel {
float: right;
}
.panels-panel-page {
clear: both;
}
.panels-page-separator {
clear: both;
}
.panels-panel-column {
float: left;
}
.panels-entry {
padding-left: 10px;
padding-right: 10px;
}
.panels-entry-dir {
color: white;
}
.panels-panel-active .panels-entry-current {
background: darkcyan;
}
.panels-panel-active .panels-entry-file-current {
color: navy;
}
::-webkit-scrollbar {
width: 0.5em;
height: 0.5em
}module terminal {
export class Terminal {
private _history: HTMLDivElement;
private _historyContent: HTMLDivElement;
private _prompt: HTMLDivElement;
private _input: HTMLTextAreaElement;
private _promptWidth = 0;
private _historyContentHeight = 0;
private _hostMetrics: CommanderShell.Metrics = null;
constructor(private _host: HTMLElement, private _node: NodeHost) {
this._history = <any>elem('div', { className: 'terminal-history' }, this._host);
this._historyContent = <any>elem('pre', {
className: 'terminal-history-content',
text: 'Hello world from mini-shell\n\nVersion 0.7s\nJune 2015\nOleg Mihailik\n\nPlease be careful.'
}, this._history);
this._prompt = <any>elem('div', { className: 'terminal-prompt', text: '>' }, this._host);
this._input = <any>elem('textarea', { className: 'terminal-input', autofocus: true }, this._host);
setTimeout(() => this._input.focus(), 1);
}
log(args: any[]) {
log(args, this._historyContent);
if (this._hostMetrics) {
this.measure();
this.arrange(this._hostMetrics);
}
}
hasInput() {
return !!this._getInput();
}
private _getInput() {
return (this._input.value || '').replace(/[\r\n]/g, '');
}
focus() {
this._input.focus();
}
temporarilyHidePrompt(replacementText: string): () => void {
// TODO: hide prompt, display replacement text instead
return () => { };
}
measure() {
this._promptWidth = this._prompt.offsetWidth;
this._historyContentHeight = this._historyContent.offsetHeight;
}
arrange(metrics: CommanderShell.Metrics) {
this._hostMetrics = metrics;
this._history.style.width = metrics.hostWidth + 'px';
this._history.style.bottom = (metrics.emHeight * 2) + 'px';
if (metrics.hostHeight - metrics.emHeight * 2 > this._historyContentHeight) {
this._history.style.height = this._historyContentHeight + 'px';
}
else {
this._history.style.height = (metrics.hostHeight - metrics.emHeight * 2) + 'px';
this._history.scrollTop = this._historyContentHeight - (metrics.hostHeight - metrics.emHeight * 2);
}
this._input.style.left = this._promptWidth + 'px';
this._input.style.width = (metrics.hostWidth - this._promptWidth) + 'px';
}
clearInput() {
setTimeout(() => {
var cleanInput = this._getInput();
if (this._input.value !== cleanInput) {
this._input.value = cleanInput;
}
}, 10);
}
keydown(e: KeyboardEvent, cursorPath: string) {
if (e.keyCode === 38) {
// TODO history
}
else if (e.keyCode === 13) {
var code = this._getInput();
if (code) {
if (code.slice(-2) === '\r\n')
code = code.slice(0, code.length - 2);
this._input.value = '';
elem('div', {
text: code,
color: 'gray'
}, this._historyContent);
this._evalAndLogResults(code);
return true;
}
else {
return false;
}
}
}
private _evalAndLogResults(code: string) {
var result;
try {
result = this._node.run(code, null);
}
catch (error) {
elem('div', {
text: error && error.stack ? error.stack : error,
color: 'red'
}, this._historyContent);
if (this._hostMetrics) {
this.measure();
this.arrange(this._hostMetrics);
}
return;
}
this.log([result]);
}
}
}module terminal {
export function log(args: any[], historyContent: HTMLElement) {
var output = elem('div', historyContent);
for (var i = 0; i < args.length; i++) {
if (i > 0)
elem('span', { text: ' ' }, output);
if (args[i] === null) {
elem('span', { text: 'null', color: 'green' }, output);
}
else {
logAppendObj(args[i], <any>output, 0);
}
}
}
}module terminal {
export function logAppendObj(obj: any, output: HTMLDivElement, level: number) {
switch (typeof obj) {
case 'number':
case 'boolean':
elem('span', { text: obj, color: 'green' }, output);
break;
case 'undefined':
elem('span', { text: 'undefined', color: 'green', opacity: 0.5 }, output);
break;
case 'function':
var funContainer = elem('span', output);
var funFunction = elem('span', { text: 'function ', color: 'silver', opacity: 0.5 }, funContainer);
var funName = elem('span', { text: obj.name, color: 'cornflowerblue', fontWeight: 'bold' }, funContainer);
funContainer.title = obj;
break;
case 'string':
var strContainer = elem('span', output);
elem('span', { text: '"', color: 'tomato' }, strContainer);
elem('span', { text: obj, color: 'tomato', opacity: 0.5 }, strContainer);
elem('span', { text: '"', color: 'tomato' }, strContainer);
break;
default:
if (obj === null) {
elem('span', { text: 'null', color: 'green', opacity: 0.5 }, output);
break;
}
if (obj.constructor && obj.construct && obj.constructor.name !== 'Object' && obj.constructor.name !== 'Array') {
elem('span', { text: obj.constructor.name, color: 'cornflowerblue' }, output);
if (obj.constructor.prototype && obj.constructor.prototype.constructor
&& obj.constructor.prototype.constructor.name
&& obj.constructor.prototype.constructor.name !== 'Object' && obj.constructor.prototype.constructor.name !== 'Array')
elem('span', { text: ':' + obj.contructor.prototype.constructor.name, color: 'cornflowerblue', opacity: 0.5 }, output);
elem('span', output);
}
if (typeof obj.length === 'number' && obj.length >= 0) {
elem('span', { text: '[', color: 'white' }, output);
if (level > 1) {
elem('span', { text: '...', color: 'silver' }, output);
// TODO: handle click
}
else {
for (var i = 0; i < obj.length; i++) {
if (i > 0) elem('span', { text: ', ', color: 'gray' }, output);
if (typeof obj[i] !== 'undefined')
logAppendObj(obj[i], output, level + 1);
}
}
elem('span', { text: ']', color: 'white' }, output);
}
else if (obj.createElement + '' === document.createElement + '' && obj.getElementById + '' === document.getElementById + '' && 'title' in obj) {
elem('span', { text: '#document ' + obj.title, color: 'green' }, output);
}
else if (obj.setInterval + '' === window.setInterval + '' && obj.setTimeout + '' === window.setTimeout + '' && 'location' in obj) {
elem('span', { text: '#window ' + obj.location, color: 'green' }, output);
}
else if (typeof obj.tagName === 'string' && obj.getElementsByTagName + '' === document.body.getElementsByTagName + '') {
elem('span', { text: '<' + obj.tagName + '>', color: 'green' }, output);
}
else if (obj + '' !== '[Object]') {
elem('span', { text: '{', color: 'cornflowerblue' }, output);
if (level > 1) {
elem('span', { text: '...', color: 'cornflowerblue', opacity: 0.5 }, output);
// TODO: handle click
}
else {
var first = true;
for (var k in obj) {
if (obj.hasOwnProperty && !obj.hasOwnProperty(k)) continue;
if (first) {
first = false;
}
else {
elem('span', { text: ', ', color: 'cornflowerblue', opacity: 0.3 }, output);
first = false;
}
elem('span', { text: k, color: 'cornflowerblue', fontWeight: 'bold' }, output);
elem('span', { text: ': ', color: 'cornflowerblue', opacity: 0.5 }, output);
logAppendObj(obj[k], output, level + 1);
}
}
elem('span', { text: '}', color: 'cornflowerblue' }, output);
}
else {
elem('span', { text: obj, color: 'cornflowerblue' }, output);
}
break;
}
}
}.terminal-history {
position: absolute;
left: 0; bottom: 1em;
width: 100%; height: 0;
overflow-y: auto;
overflow-x: hidden;
}
.terminal-history-content {
margin: 0; padding: 0;
}
.terminal-prompt {
position: absolute;
left: 0; bottom: 1em;
height: 1em;
}
.terminal-input {
position: absolute;
left: 0; bottom: 1em;
width: 0; height: 1em;
font: inherit;
border: none;
background: transparent;
color: silver;
outline: none;
resize: none;
overflow: hidden;
}class CommanderShell {
private _metricElem: HTMLDivElement;
private _twoPanels: panels.TwoPanels;
private _terminal: terminal.Terminal;
private _metrics: CommanderShell.Metrics = {
hostWidth: 0,
hostHeight: 0,
emWidth: 0,
emHeight: 0
};
private _onsizechangedTimeout: number = 0;
private _node: NodeHost;
private _editor: editor.Editor = null;
private _fnKeys: HTMLElement[] = [];
constructor(private _host: HTMLElement, private _drive: persistence.Drive) {
this._node = new NodeHost(this._drive);
this._node.log = args => this._terminal.log(args);
elem(this._host, {
background: 'black',
color: 'silver'
});
this._metricElem = <any>elem('div', {
position: 'absolute',
opacity: 0,
left: '-200px', top: '-200px',
wdith: 'auto', height: 'auto',
text: 'M'
}, document.body);
this._terminal = new terminal.Terminal(this._host, this._node);
this._twoPanels = new panels.TwoPanels(this._host, '/', '/src', this._drive);
var fnKeyActions = [null, 'Help', '<None>', 'View', 'Edit', 'Copy', 'Move', 'MkDir', 'Delete', 'Options', 'Save'];
for (var i = 1; i <= 10; i++) {
var fnKeyText = elem('div', {
position: 'absolute', bottom: '0',
whiteSpace: 'nowrap',
cursor: 'pointer'
}, this._host);
var keyName = (i === 1 ? 'F1' : '' + i);
elem('span', { background: 'black', color: 'gray', text: keyName + ' ' }, fnKeyText);
elem('span', { background: 'gray', color: 'black', text: fnKeyActions[i] }, fnKeyText);
this._fnKeys.push(fnKeyText);
}
on(this._fnKeys[4 - 1], 'click', () => {
var cursorPath = this._twoPanels.cursorPath();
this._openEditor(cursorPath);
});
on(this._fnKeys[5 - 1], 'click', () => {
this._copyCommand();
return true;
});
on(this._fnKeys[6 - 1], 'click', () => {
this._moveCommand();
return true;
});
on(this._fnKeys[7 - 1], 'click', () => {
this._mkdirCommand();
return true;
});
on(this._fnKeys[8 - 1], 'click', () => {
this._removeCommand();
return true;
});
on(this._fnKeys[10 - 1], 'click', () => {
this._exportAllHTML();
});
var resizeMod = require('resize');
resizeMod.on(winMetrics => {
this._metrics.hostWidth = winMetrics.windowWidth;
this._metrics.hostHeight = winMetrics.windowHeight;
this.measure();
this.arrange();
});
this._metrics.hostWidth = document.body.offsetWidth;
this._metrics.hostHeight = document.body.offsetHeight;
this.measure();
this.arrange();
on(this._host, 'keydown', e => this._keydown(<any>e));
var _glob = (function() { return this; })();
var applyConsole = (glob) => {
if (glob.console) {
var _oldLog: Function = glob.console.log;
var term = this._terminal;
console.log = function() {
var args = [];
for (var i = 0; i < arguments.length; i++) {
args.push(arguments[i]);
}
term.log(args);
if (typeof _oldLog === 'function')
_oldLog.apply(glob.console, args);
};
}
else {
var term = this._terminal;
glob.console = {
log: function() {
var args = [];
for (var i = 0; i < arguments.length; i++) {
args.push(arguments[i]);
}
term.log(args);
}
};
}
};
applyConsole(_glob);
applyConsole(window);
}
measure() {
this._metrics.emWidth = this._metricElem.offsetWidth;
this._metrics.emHeight = this._metricElem.offsetHeight;
this._twoPanels.measure();
this._terminal.measure();
//this._editor.measure();
}
arrange() {
this._host.style.width = this._metrics.hostWidth + 'px';
this._host.style.height = this._metrics.hostHeight + 'px';
this._twoPanels.arrange(this._metrics);
this._terminal.arrange(this._metrics);
//this._editor.arrange();
var keySize = ((this._metrics.hostWidth / 10) | 0);
for (var i = 0; i < this._fnKeys.length; i++) {
this._fnKeys[i].style.left = (i * keySize) + 'px';
this._fnKeys[i].style.width = keySize + 'px';
}
}
private _keydown(e: KeyboardEvent) {
var res = this._keydownCore(e);
if (res) {
if (e.preventDefault)
e.preventDefault();
}
return res;
}
private _keydownCore(e: KeyboardEvent) {
if (this._editor) {
if (e.keyCode === 27) {
this._closeEditor();
return true;
}
return;
}
if (e.keyCode === 27 && !e.altKey && !e.shiftKey && !e.ctrlKey && !e.metaKey) {
this._twoPanels.toggleVisibility();
return true;
}
if (e.keyCode === 13)
this._terminal.clearInput();
if ((e.keyCode === 13 && this._twoPanels.isVisible() && !this._terminal.hasInput())
|| (e.keyCode !== 13)) {
if (this._twoPanels.keydown(e)) return true;
}
var cursorPath = this._twoPanels.cursorPath();
this._terminal.focus();
if (this._terminal.keydown(e, cursorPath)) return true;
if (e.keyCode === 13)
return this._execute(cursorPath);
//if (e.keyCode < 32 || e.keyCode > 126) {
// this._terminal.log('CommanderShell::keydown ' + e.yCode);
//}
if (e.keyCode === 115) { // F4
var editorPath = cursorPath;
if (e.shiftKey) {
editorPath = prompt('Edit file:', editorPath);
if (!editorPath) return;
}
this._openEditor(editorPath);
return true;
}
if (e.keyCode === 116) { // F5
this._copyCommand();
return true;
}
if (e.keyCode === 117) { // F6
this._moveCommand();
return true;
}
if (e.keyCode === 118) { // F7
this._mkdirCommand();
return true;
}
if (e.keyCode === 119) { // F8
this._removeCommand();
return true;
}
if (e.keyCode === 121) { // F10
this._exportAllHTML();
return true;
}
if (e.ctrlKey || e.altKey || e.metaKey) {
this._terminal.log(['CommanderShell::keydown ', e.keyCode]);
}
}
private _getFilesFor(path: string): string[] {
var fileResult: string[] = [];
var allFiles = this._drive.files();
for (var i = 0; i < allFiles.length; i++) {
var f = allFiles[i];
if (f.slice(0, path.length) !== path) continue;
if (f===path || f.slice(path.length, path.length+1)==='/')
fileResult.push(f);
}
return fileResult;
}
private _copyCommand() {
var cursorPath = this._twoPanels.cursorPath();
var currentOppositePath = this._twoPanels.currentOppositePath();
if (!cursorPath || !currentOppositePath || cursorPath === '/') return;
var filesToCopy: string[] = this._getFilesFor(cursorPath);
var targetDir = prompt('Copy ' + filesToCopy.length + ' files from\n "' + cursorPath + '"\n to', currentOppositePath);
if (!targetDir) return;
var normTargetDir = targetDir;
if (filesToCopy.length === 1 && filesToCopy[0] === cursorPath && normTargetDir.slice(-1) !== '/') {
var content = this._drive.read(filesToCopy[0]);
this._drive.write(normTargetDir, content);
}
else {
if (normTargetDir.slice(-1)!= '/') normTargetDir += '/';
var baseDir = cursorPath.slice(0, cursorPath.lastIndexOf('/') + 1);
for (var i = 0; i < filesToCopy.length; i++) {
var content = this._drive.read(filesToCopy[i]);
var newPath =
normTargetDir +
filesToCopy[i].slice(baseDir.length);
this._drive.write(newPath, content);
}
}
this.measure();
this.arrange();
}
private _moveCommand() {
var cursorPath = this._twoPanels.cursorPath();
var currentOppositePath = this._twoPanels.currentOppositePath();
if (!cursorPath || !currentOppositePath || cursorPath === '/') return;
var filesToCopy: string[] = this._getFilesFor(cursorPath);
var targetDir = prompt('Move/rename ' + filesToCopy.length + ' files from\n "' + cursorPath + '"\n to', currentOppositePath);
if (!targetDir) return;
var normTargetDir = targetDir;
if (filesToCopy.length === 1 && filesToCopy[0] === cursorPath && normTargetDir.slice(-1) !== '/') {
var content = this._drive.read(filesToCopy[0]);
this._drive.write(normTargetDir, content);
this._drive.write(filesToCopy[0], null);
}
else {
if (normTargetDir.slice(-1) !== '/') normTargetDir += '/';
var baseDir = cursorPath.slice(0, cursorPath.lastIndexOf('/') + 1);
for (var i = 0; i < filesToCopy.length; i++) {
var content = this._drive.read(filesToCopy[i]);
var newPath =
normTargetDir +
filesToCopy[i].slice(baseDir.length);
this._drive.write(newPath, content);
this._drive.write(filesToCopy[i], null);
}
}
this.measure();
this.arrange();
}
private _mkdirCommand() {
var dir = prompt('Make directory: ');
if (!dir || dir === '/') return;
var dirPath = dir;
if (dir.slice(0, 1) !== '/') {
dirPath = this._twoPanels.currentPath() + '/' + dirPath;
if (dirPath.slice(0, 2) === '//') dirPath = dirPath.slice(1);
}
if (dirPath.slice(-1) === '/')
dirPath = dirPath.slice(0, dirPath.length - 1);
var matchFiles = this._getFilesFor(dirPath);
if (matchFiles.length) return;
this._drive.write(dirPath + '/', '');
this.measure();
this.arrange();
}
private _removeCommand() {
var cursorPath = this._twoPanels.cursorPath();
if (!cursorPath || cursorPath === '/') return;
var filesToRemove: string[] = this._getFilesFor(cursorPath);
if (!confirm('Remove ' + filesToRemove.length + ' files from\n "' + cursorPath + '"?')) return;
for (var i = 0; i < filesToRemove.length; i++) {
this._drive.write(filesToRemove[i], null);
}
this.measure();
this.arrange();
}
private _closeEditor() {
var newText = this._editor.getText();
var cursorPath = this._twoPanels.cursorPath();
var oldText = this._drive.read(cursorPath);
if (newText !== oldText) {
if (confirm('File was changed: ' + cursorPath + ', save before exit?'))
this._drive.write(cursorPath, newText);
}
this._editor.close();
this._editor = null;
this.measure();
this.arrange();
}
private _openEditor(cursorPath: string) {
if (cursorPath) {
var text = this._drive.read(cursorPath);
if (typeof text === 'string') {
this._terminal.log(['@edit ', cursorPath]);
this._editor = new editor.Editor(this._host, cursorPath, text);
setTimeout(() => {
if (this._editor) this._editor.focus();
}, 1);
}
else {
this._terminal.log(['text at ', cursorPath, ' is ', text]);
}
}
else {
this._terminal.log(['cursorPath = ', cursorPath]);
}
}
private _exportAllHTML() {
var window = require('window');
var document = require('document');
this._terminal.log(['@save']);
var filename = saveFileName();
exportBlob(filename, ['<!doctype html>\n', document.documentElement.outerHTML]);
function exportBlob(filename: string, textChunks: string[]) {
try {
var blob: Blob = new (<any>Blob)(textChunks, { type: 'application/octet-stream' });
}
catch (blobError) {
exportDocumentWrite(filename, textChunks.join(''));
return;
}
exportBlobHTML5(filename, blob);
}
function exportBlobHTML5(filename, blob: Blob) {
var url = URL.createObjectURL(blob);
var a = document.createElement('a');
a.href = url;
a.setAttribute('download', filename);
try {
// safer save method, supposed to work with FireFox
var evt = document.createEvent("MouseEvents");
(<any>evt).initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
a.dispatchEvent(evt);
}
catch (e) {
a.click();
}
}
function exportDocumentWrite(filename: string, content: string) {
var win = document.createElement('iframe');
win.style.width = '100px';
win.style.height = '100px';
win.style.display = 'none';
document.body.appendChild(win);
setTimeout(() => {
var doc = win.contentDocument || (<any>win).document;
doc.open();
doc.write(content);
doc.close();
doc.execCommand('SaveAs', null, filename);
}, 200);
}
function saveFileName() {
if (window.location.protocol.toLowerCase() === 'blob:')
return 'mi-save.html';
var urlParts = window.location.pathname.split('/');
var currentFileName = decodeURI(urlParts[urlParts.length - 1]);
var lastDot = currentFileName.indexOf('.');
if (lastDot > 0) {
currentFileName = currentFileName.slice(0, lastDot) + '.html';
}
else {
currentFileName += '.html';
}
return currentFileName;
}
}
private _execute(cursorPath: string) {
if (/\.js$/.test(cursorPath)) {
var text = this._drive.read(cursorPath);
if (typeof text !== 'undefined' && text !== null) {
this._terminal.log(['@node ' + cursorPath]);
var ani = this._twoPanels.temporarilyHidePanels();
setTimeout(() => {
try {
var result = this._node.run(text, cursorPath);
}
catch (error) {
result = error;
}
ani();
this._terminal.log([result]);
},
1);
return true;
}
}
else if (/\.ts$/.test(cursorPath)) {
var text = this._drive.read('/src/typescript/tsc.js');
if (typeof text !== 'undefined' && text !== null) {
this._terminal.log(['@tsc ' + cursorPath]);
var ani = this._twoPanels.temporarilyHidePanels();
setTimeout(() => {
try {
var result = this._node.run(text, '/src/typescript/tsc.js', [cursorPath]);
}
catch (error) {
this._terminal.log(error);
}
ani();
}, 1);
return true;
}
}
else if (/.html$/.test(cursorPath)) {
this._terminal.log(['@build ' + cursorPath]);
var ani = this._twoPanels.temporarilyHidePanels();
setTimeout(() => {
var htmlTemplate = this._drive.read(cursorPath);
var blankWindow = window.open('', '_blank' + (+new Date()));
var pollUntil = (+new Date()) + 1000;
while (+new Date() < pollUntil) {
try {
var blankWindowDoc = blankWindow.document;
}
catch (error) { }
}
if (!blankWindowDoc) {
alert('Cannot open a window to host the built document');
ani();
return;
}
blankWindow.document.open();
blankWindow.document.write([
'<html><title>Building ' + cursorPath + '...</title>',
'<style>',
'html, body { background: black; color: greenyellow; }',
'h2 { font-weight: 100; width: 40%; position: fixed; font-size: 200%; }',
'pre { width: 50%; padding-left: 50%; opacity: 1; transition: opacity 1s; }',
'</style>',
'<h2>Building ' + cursorPath + '</h2>',
'<' + 's' + 'cript>',
'var textContentProp = "textContent" in document.createElement("pre") ? "textContent" : "innerText";',
'var lastLogElem;',
'function log(text) {',
' var logElem = document.createElement("pre");',
' logElem[textContentProp]=text;',
' document.body.appendChild(logElem);',
' logElem.scrollIntoView();',
' if (lastLogElem) {',
' lastLogElem.style.opacity = 0.5;',
' }',
' lastLogElem = logElem;',
'}',
'<' + '/' + 's' + 'cript>'].join('\n'));
blankWindow.document.close();
try {
build.processTemplate(
htmlTemplate,
[],
txt => {
this._terminal.log([txt]);
(<any>blankWindow).log(txt);
},
(error, result) => {
if (error) {
this._terminal.log([error]);
ani();
return;
}
try {
var blob = new Blob([result], { type: 'text/html' });
var url = URL.createObjectURL(blob);
blankWindow.location.replace(url);
}
catch (blobError) {
blankWindow.document.open();
blankWindow.document.write(result);
blankWindow.document.close();
}
ani();
});
}
catch (errorProcessTemplate) {
ani();
this._terminal.log([errorProcessTemplate]);
}
}, 1);
}
else {
var ani = this._twoPanels.temporarilyHidePanels();
this._terminal.log(['@type ' + cursorPath]);
this._terminal.log([this._drive.read(cursorPath)]);
ani();
}
}
}
module CommanderShell {
export interface Metrics {
hostWidth: number;
hostHeight: number;
emWidth: number;
emHeight: number;
}
}class NodeHost {
private _replGlobal: any;
private _replContext: isolation.Context;
constructor(private _drive: persistence.Drive) {
this._replGlobal = this._enrichGlobal({});
this._replContext = new isolation.Context(window);
}
log: (args: any[]) => void = null;
run(code: string, path: string, argv?: string[]) {
var isInteractive = !path;
if (isInteractive) {
return this._replContext.run(code, path, this._replGlobal);
}
else {
var procGlobal = this._enrichGlobal({});
procGlobal.process.argv.push(path);
if (argv) {
for (var i = 0; i < argv.length; i++) {
procGlobal.process.argv.push(argv[i]);
}
}
procGlobal.exports = procGlobal.module.exports;
procGlobal.__filename = path;
procGlobal.__dirname = path;
if (procGlobal.__dirname.indexOf('/') > 0)
procGlobal.__dirname = procGlobal.__dirname.slice(0, procGlobal.__dirname.indexOf('/'));
var procContext = new isolation.Context(window);
procContext.run(code, path, procGlobal);
return procGlobal.module.exports;
}
}
private _enrichGlobal(global: any): noapi.Global {
noapi.apply(global, this._drive);
var that = this;
global.console = {
log: function() {
var args = [];
for (var i = 0; i < arguments.length; i++) {
args.push(arguments[i]);
}
if (that.log)
that.log(args);
else if (typeof console !== 'undefined')
console.log(args);
}
};
return <any>global;
}
}declare var require;
function showCommander(drive: persistence.Drive) {
document.body.style.overflow = 'hidden';
document.body.parentElement.style.overflow = 'hidden';
var styleText = drive.read('/shell/style.css');
elem('style', { text: styleText }, document.body);
var commander = new CommanderShell(document.body, drive);
}/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
/// <reference no-default-lib="true"/>
/////////////////////////////
/// ECMAScript APIs
/////////////////////////////
declare var NaN: number;
declare var Infinity: number;
/**
* Evaluates JavaScript code and executes it.
* @param x A String value that contains valid JavaScript code.
*/
declare function eval(x: string): any;
/**
* Converts A string to an integer.
* @param s A string to convert into a number.
* @param radix A value between 2 and 36 that specifies the base of the number in numString.
* If this argument is not supplied, strings with a prefix of '0x' are considered hexadecimal.
* All other strings are considered decimal.
*/
declare function parseInt(s: string, radix?: number): number;
/**
* Converts a string to a floating-point number.
* @param string A string that contains a floating-point number.
*/
declare function parseFloat(string: string): number;
/**
* Returns a Boolean value that indicates whether a value is the reserved value NaN (not a number).
* @param number A numeric value.
*/
declare function isNaN(number: number): boolean;
/**
* Determines whether a supplied number is finite.
* @param number Any numeric value.
*/
declare function isFinite(number: number): boolean;
/**
* Gets the unencoded version of an encoded Uniform Resource Identifier (URI).
* @param encodedURI A value representing an encoded URI.
*/
declare function decodeURI(encodedURI: string): string;
/**
* Gets the unencoded version of an encoded component of a Uniform Resource Identifier (URI).
* @param encodedURIComponent A value representing an encoded URI component.
*/
declare function decodeURIComponent(encodedURIComponent: string): string;
/**
* Encodes a text string as a valid Uniform Resource Identifier (URI)
* @param uri A value representing an encoded URI.
*/
declare function encodeURI(uri: string): string;
/**
* Encodes a text string as a valid component of a Uniform Resource Identifier (URI).
* @param uriComponent A value representing an encoded URI component.
*/
declare function encodeURIComponent(uriComponent: string): string;
interface PropertyDescriptor {
configurable?: boolean;
enumerable?: boolean;
value?: any;
writable?: boolean;
get? (): any;
set? (v: any): void;
}
interface PropertyDescriptorMap {
[s: string]: PropertyDescriptor;
}
interface Object {
/** The initial value of Object.prototype.constructor is the standard built-in Object constructor. */
constructor: Function;
/** Returns a string representation of an object. */
toString(): string;
/** Returns a date converted to a string using the current locale. */
toLocaleString(): string;
/** Returns the primitive value of the specified object. */
valueOf(): Object;
/**
* Determines whether an object has a property with the specified name.
* @param v A property name.
*/
hasOwnProperty(v: string): boolean;
/**
* Determines whether an object exists in another object's prototype chain.
* @param v Another object whose prototype chain is to be checked.
*/
isPrototypeOf(v: Object): boolean;
/**
* Determines whether a specified property is enumerable.
* @param v A property name.
*/
propertyIsEnumerable(v: string): boolean;
}
interface ObjectConstructor {
new (value?: any): Object;
(): any;
(value: any): any;
/** A reference to the prototype for a class of objects. */
prototype: Object;
/**
* Returns the prototype of an object.
* @param o The object that references the prototype.
*/
getPrototypeOf(o: any): any;
/**
* Gets the own property descriptor of the specified object.
* An own property descriptor is one that is defined directly on the object and is not inherited from the object's prototype.
* @param o Object that contains the property.
* @param p Name of the property.
*/
getOwnPropertyDescriptor(o: any, p: string): PropertyDescriptor;
/**
* Returns the names of the own properties of an object. The own properties of an object are those that are defined directly
* on that object, and are not inherited from the object's prototype. The properties of an object include both fields (objects) and functions.
* @param o Object that contains the own properties.
*/
getOwnPropertyNames(o: any): string[];
/**
* Creates an object that has the specified prototype, and that optionally contains specified properties.
* @param o Object to use as a prototype. May be null
* @param properties JavaScript object that contains one or more property descriptors.
*/
create(o: any, properties?: PropertyDescriptorMap): any;
/**
* Adds a property to an object, or modifies attributes of an existing property.
* @param o Object on which to add or modify the property. This can be a native JavaScript object (that is, a user-defined object or a built in object) or a DOM object.
* @param p The property name.
* @param attributes Descriptor for the property. It can be for a data property or an accessor property.
*/
defineProperty(o: any, p: string, attributes: PropertyDescriptor): any;
/**
* Adds one or more properties to an object, and/or modifies attributes of existing properties.
* @param o Object on which to add or modify the properties. This can be a native JavaScript object or a DOM object.
* @param properties JavaScript object that contains one or more descriptor objects. Each descriptor object describes a data property or an accessor property.
*/
defineProperties(o: any, properties: PropertyDescriptorMap): any;
/**
* Prevents the modification of attributes of existing properties, and prevents the addition of new properties.
* @param o Object on which to lock the attributes.
*/
seal<T>(o: T): T;
/**
* Prevents the modification of existing property attributes and values, and prevents the addition of new properties.
* @param o Object on which to lock the attributes.
*/
freeze<T>(o: T): T;
/**
* Prevents the addition of new properties to an object.
* @param o Object to make non-extensible.
*/
preventExtensions<T>(o: T): T;
/**
* Returns true if existing property attributes cannot be modified in an object and new properties cannot be added to the object.
* @param o Object to test.
*/
isSealed(o: any): boolean;
/**
* Returns true if existing property attributes and values cannot be modified in an object, and new properties cannot be added to the object.
* @param o Object to test.
*/
isFrozen(o: any): boolean;
/**
* Returns a value that indicates whether new properties can be added to an object.
* @param o Object to test.
*/
isExtensible(o: any): boolean;
/**
* Returns the names of the enumerable properties and methods of an object.
* @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.
*/
keys(o: any): string[];
}
/**
* Provides functionality common to all JavaScript objects.
*/
declare var Object: ObjectConstructor;
/**
* Creates a new function.
*/
interface Function {
/**
* Calls the function, substituting the specified object for the this value of the function, and the specified array for the arguments of the function.
* @param thisArg The object to be used as the this object.
* @param argArray A set of arguments to be passed to the function.
*/
apply(thisArg: any, argArray?: any): any;
/**
* Calls a method of an object, substituting another object for the current object.
* @param thisArg The object to be used as the current object.
* @param argArray A list of arguments to be passed to the method.
*/
call(thisArg: any, ...argArray: any[]): any;
/**
* For a given function, creates a bound function that has the same body as the original function.
* The this object of the bound function is associated with the specified object, and has the specified initial parameters.
* @param thisArg An object to which the this keyword can refer inside the new function.
* @param argArray A list of arguments to be passed to the new function.
*/
bind(thisArg: any, ...argArray: any[]): any;
prototype: any;
length: number;
// Non-standard extensions
arguments: any;
caller: Function;
}
interface FunctionConstructor {
/**
* Creates a new function.
* @param args A list of arguments the function accepts.
*/
new (...args: string[]): Function;
(...args: string[]): Function;
prototype: Function;
}
declare var Function: FunctionConstructor;
interface IArguments {
[index: number]: any;
length: number;
callee: Function;
}
interface String {
/** Returns a string representation of a string. */
toString(): string;
/**
* Returns the character at the specified index.
* @param pos The zero-based index of the desired character.
*/
charAt(pos: number): string;
/**
* Returns the Unicode value of the character at the specified location.
* @param index The zero-based index of the desired character. If there is no character at the specified index, NaN is returned.
*/
charCodeAt(index: number): number;
/**
* Returns a string that contains the concatenation of two or more strings.
* @param strings The strings to append to the end of the string.
*/
concat(...strings: string[]): string;
/**
* Returns the position of the first occurrence of a substring.
* @param searchString The substring to search for in the string
* @param position The index at which to begin searching the String object. If omitted, search starts at the beginning of the string.
*/
indexOf(searchString: string, position?: number): number;
/**
* Returns the last occurrence of a substring in the string.
* @param searchString The substring to search for.
* @param position The index at which to begin searching. If omitted, the search begins at the end of the string.
*/
lastIndexOf(searchString: string, position?: number): number;
/**
* Determines whether two strings are equivalent in the current locale.
* @param that String to compare to target string
*/
localeCompare(that: string): number;
/**
* Matches a string with a regular expression, and returns an array containing the results of that search.
* @param regexp A variable name or string literal containing the regular expression pattern and flags.
*/
match(regexp: string): RegExpMatchArray;
/**
* Matches a string with a regular expression, and returns an array containing the results of that search.
* @param regexp A regular expression object that contains the regular expression pattern and applicable flags.
*/
match(regexp: RegExp): RegExpMatchArray;
/**
* Replaces text in a string, using a regular expression or search string.
* @param searchValue A String object or string literal that represents the regular expression
* @param replaceValue A String object or string literal containing the text to replace for every successful match of rgExp in stringObj.
*/
replace(searchValue: string, replaceValue: string): string;
/**
* Replaces text in a string, using a regular expression or search string.
* @param searchValue A String object or string literal that represents the regular expression
* @param replaceValue A function that returns the replacement text.
*/
replace(searchValue: string, replaceValue: (substring: string, ...args: any[]) => string): string;
/**
* Replaces text in a string, using a regular expression or search string.
* @param searchValue A Regular Expression object containing the regular expression pattern and applicable flags
* @param replaceValue A String object or string literal containing the text to replace for every successful match of rgExp in stringObj.
*/
replace(searchValue: RegExp, replaceValue: string): string;
/**
* Replaces text in a string, using a regular expression or search string.
* @param searchValue A Regular Expression object containing the regular expression pattern and applicable flags
* @param replaceValue A function that returns the replacement text.
*/
replace(searchValue: RegExp, replaceValue: (substring: string, ...args: any[]) => string): string;
/**
* Finds the first substring match in a regular expression search.
* @param regexp The regular expression pattern and applicable flags.
*/
search(regexp: string): number;
/**
* Finds the first substring match in a regular expression search.
* @param regexp The regular expression pattern and applicable flags.
*/
search(regexp: RegExp): number;
/**
* Returns a section of a string.
* @param start The index to the beginning of the specified portion of stringObj.
* @param end The index to the end of the specified portion of stringObj. The substring includes the characters up to, but not including, the character indicated by end.
* If this value is not specified, the substring continues to the end of stringObj.
*/
slice(start?: number, end?: number): string;
/**
* Split a string into substrings using the specified separator and return them as an array.
* @param separator A string that identifies character or characters to use in separating the string. If omitted, a single-element array containing the entire string is returned.
* @param limit A value used to limit the number of elements returned in the array.
*/
split(separator: string, limit?: number): string[];
/**
* Split a string into substrings using the specified separator and return them as an array.
* @param separator A Regular Express that identifies character or characters to use in separating the string. If omitted, a single-element array containing the entire string is returned.
* @param limit A value used to limit the number of elements returned in the array.
*/
split(separator: RegExp, limit?: number): string[];
/**
* Returns the substring at the specified location within a String object.
* @param start The zero-based index number indicating the beginning of the substring.
* @param end Zero-based index number indicating the end of the substring. The substring includes the characters up to, but not including, the character indicated by end.
* If end is omitted, the characters from start through the end of the original string are returned.
*/
substring(start: number, end?: number): string;
/** Converts all the alphabetic characters in a string to lowercase. */
toLowerCase(): string;
/** Converts all alphabetic characters to lowercase, taking into account the host environment's current locale. */
toLocaleLowerCase(): string;
/** Converts all the alphabetic characters in a string to uppercase. */
toUpperCase(): string;
/** Returns a string where all alphabetic characters have been converted to uppercase, taking into account the host environment's current locale. */
toLocaleUpperCase(): string;
/** Removes the leading and trailing white space and line terminator characters from a string. */
trim(): string;
/** Returns the length of a String object. */
length: number;
// IE extensions
/**
* Gets a substring beginning at the specified location and having the specified length.
* @param from The starting position of the desired substring. The index of the first character in the string is zero.
* @param length The number of characters to include in the returned substring.
*/
substr(from: number, length?: number): string;
/** Returns the primitive value of the specified object. */
valueOf(): string;
[index: number]: string;
}
interface StringConstructor {
new (value?: any): String;
(value?: any): string;
prototype: String;
fromCharCode(...codes: number[]): string;
}
/**
* Allows manipulation and formatting of text strings and determination and location of substrings within strings.
*/
declare var String: StringConstructor;
interface Boolean {
/** Returns the primitive value of the specified object. */
valueOf(): boolean;
}
interface BooleanConstructor {
new (value?: any): Boolean;
(value?: any): boolean;
prototype: Boolean;
}
declare var Boolean: BooleanConstructor;
interface Number {
/**
* Returns a string representation of an object.
* @param radix Specifies a radix for converting numeric values to strings. This value is only used for numbers.
*/
toString(radix?: number): string;
/**
* Returns a string representing a number in fixed-point notation.
* @param fractionDigits Number of digits after the decimal point. Must be in the range 0 - 20, inclusive.
*/
toFixed(fractionDigits?: number): string;
/**
* Returns a string containing a number represented in exponential notation.
* @param fractionDigits Number of digits after the decimal point. Must be in the range 0 - 20, inclusive.
*/
toExponential(fractionDigits?: number): string;
/**
* Returns a string containing a number represented either in exponential or fixed-point notation with a specified number of digits.
* @param precision Number of significant digits. Must be in the range 1 - 21, inclusive.
*/
toPrecision(precision?: number): string;
/** Returns the primitive value of the specified object. */
valueOf(): number;
}
interface NumberConstructor {
new (value?: any): Number;
(value?: any): number;
prototype: Number;
/** The largest number that can be represented in JavaScript. Equal to approximately 1.79E+308. */
MAX_VALUE: number;
/** The closest number to zero that can be represented in JavaScript. Equal to approximately 5.00E-324. */
MIN_VALUE: number;
/**
* A value that is not a number.
* In equality comparisons, NaN does not equal any value, including itself. To test whether a value is equivalent to NaN, use the isNaN function.
*/
NaN: number;
/**
* A value that is less than the largest negative number that can be represented in JavaScript.
* JavaScript displays NEGATIVE_INFINITY values as -infinity.
*/
NEGATIVE_INFINITY: number;
/**
* A value greater than the largest number that can be represented in JavaScript.
* JavaScript displays POSITIVE_INFINITY values as infinity.
*/
POSITIVE_INFINITY: number;
}
/** An object that represents a number of any kind. All JavaScript numbers are 64-bit floating-point numbers. */
declare var Number: NumberConstructor;
interface TemplateStringsArray extends Array<string> {
raw: string[];
}
interface Math {
/** The mathematical constant e. This is Euler's number, the base of natural logarithms. */
E: number;
/** The natural logarithm of 10. */
LN10: number;
/** The natural logarithm of 2. */
LN2: number;
/** The base-2 logarithm of e. */
LOG2E: number;
/** The base-10 logarithm of e. */
LOG10E: number;
/** Pi. This is the ratio of the circumference of a circle to its diameter. */
PI: number;
/** The square root of 0.5, or, equivalently, one divided by the square root of 2. */
SQRT1_2: number;
/** The square root of 2. */
SQRT2: number;
/**
* Returns the absolute value of a number (the value without regard to whether it is positive or negative).
* For example, the absolute value of -5 is the same as the absolute value of 5.
* @param x A numeric expression for which the absolute value is needed.
*/
abs(x: number): number;
/**
* Returns the arc cosine (or inverse cosine) of a number.
* @param x A numeric expression.
*/
acos(x: number): number;
/**
* Returns the arcsine of a number.
* @param x A numeric expression.
*/
asin(x: number): number;
/**
* Returns the arctangent of a number.
* @param x A numeric expression for which the arctangent is needed.
*/
atan(x: number): number;
/**
* Returns the angle (in radians) from the X axis to a point.
* @param y A numeric expression representing the cartesian y-coordinate.
* @param x A numeric expression representing the cartesian x-coordinate.
*/
atan2(y: number, x: number): number;
/**
* Returns the smallest number greater than or equal to its numeric argument.
* @param x A numeric expression.
*/
ceil(x: number): number;
/**
* Returns the cosine of a number.
* @param x A numeric expression that contains an angle measured in radians.
*/
cos(x: number): number;
/**
* Returns e (the base of natural logarithms) raised to a power.
* @param x A numeric expression representing the power of e.
*/
exp(x: number): number;
/**
* Returns the greatest number less than or equal to its numeric argument.
* @param x A numeric expression.
*/
floor(x: number): number;
/**
* Returns the natural logarithm (base e) of a number.
* @param x A numeric expression.
*/
log(x: number): number;
/**
* Returns the larger of a set of supplied numeric expressions.
* @param values Numeric expressions to be evaluated.
*/
max(...values: number[]): number;
/**
* Returns the smaller of a set of supplied numeric expressions.
* @param values Numeric expressions to be evaluated.
*/
min(...values: number[]): number;
/**
* Returns the value of a base expression taken to a specified power.
* @param x The base value of the expression.
* @param y The exponent value of the expression.
*/
pow(x: number, y: number): number;
/** Returns a pseudorandom number between 0 and 1. */
random(): number;
/**
* Returns a supplied numeric expression rounded to the nearest number.
* @param x The value to be rounded to the nearest number.
*/
round(x: number): number;
/**
* Returns the sine of a number.
* @param x A numeric expression that contains an angle measured in radians.
*/
sin(x: number): number;
/**
* Returns the square root of a number.
* @param x A numeric expression.
*/
sqrt(x: number): number;
/**
* Returns the tangent of a number.
* @param x A numeric expression that contains an angle measured in radians.
*/
tan(x: number): number;
}
/** An intrinsic object that provides basic mathematics functionality and constants. */
declare var Math: Math;
/** Enables basic storage and retrieval of dates and times. */
interface Date {
/** Returns a string representation of a date. The format of the string depends on the locale. */
toString(): string;
/** Returns a date as a string value. */
toDateString(): string;
/** Returns a time as a string value. */
toTimeString(): string;
/** Returns a value as a string value appropriate to the host environment's current locale. */
toLocaleString(): string;
/** Returns a date as a string value appropriate to the host environment's current locale. */
toLocaleDateString(): string;
/** Returns a time as a string value appropriate to the host environment's current locale. */
toLocaleTimeString(): string;
/** Returns the stored time value in milliseconds since midnight, January 1, 1970 UTC. */
valueOf(): number;
/** Gets the time value in milliseconds. */
getTime(): number;
/** Gets the year, using local time. */
getFullYear(): number;
/** Gets the year using Universal Coordinated Time (UTC). */
getUTCFullYear(): number;
/** Gets the month, using local time. */
getMonth(): number;
/** Gets the month of a Date object using Universal Coordinated Time (UTC). */
getUTCMonth(): number;
/** Gets the day-of-the-month, using local time. */
getDate(): number;
/** Gets the day-of-the-month, using Universal Coordinated Time (UTC). */
getUTCDate(): number;
/** Gets the day of the week, using local time. */
getDay(): number;
/** Gets the day of the week using Universal Coordinated Time (UTC). */
getUTCDay(): number;
/** Gets the hours in a date, using local time. */
getHours(): number;
/** Gets the hours value in a Date object using Universal Coordinated Time (UTC). */
getUTCHours(): number;
/** Gets the minutes of a Date object, using local time. */
getMinutes(): number;
/** Gets the minutes of a Date object using Universal Coordinated Time (UTC). */
getUTCMinutes(): number;
/** Gets the seconds of a Date object, using local time. */
getSeconds(): number;
/** Gets the seconds of a Date object using Universal Coordinated Time (UTC). */
getUTCSeconds(): number;
/** Gets the milliseconds of a Date, using local time. */
getMilliseconds(): number;
/** Gets the milliseconds of a Date object using Universal Coordinated Time (UTC). */
getUTCMilliseconds(): number;
/** Gets the difference in minutes between the time on the local computer and Universal Coordinated Time (UTC). */
getTimezoneOffset(): number;
/**
* Sets the date and time value in the Date object.
* @param time A numeric value representing the number of elapsed milliseconds since midnight, January 1, 1970 GMT.
*/
setTime(time: number): number;
/**
* Sets the milliseconds value in the Date object using local time.
* @param ms A numeric value equal to the millisecond value.
*/
setMilliseconds(ms: number): number;
/**
* Sets the milliseconds value in the Date object using Universal Coordinated Time (UTC).
* @param ms A numeric value equal to the millisecond value.
*/
setUTCMilliseconds(ms: number): number;
/**
* Sets the seconds value in the Date object using local time.
* @param sec A numeric value equal to the seconds value.
* @param ms A numeric value equal to the milliseconds value.
*/
setSeconds(sec: number, ms?: number): number;
/**
* Sets the seconds value in the Date object using Universal Coordinated Time (UTC).
* @param sec A numeric value equal to the seconds value.
* @param ms A numeric value equal to the milliseconds value.
*/
setUTCSeconds(sec: number, ms?: number): number;
/**
* Sets the minutes value in the Date object using local time.
* @param min A numeric value equal to the minutes value.
* @param sec A numeric value equal to the seconds value.
* @param ms A numeric value equal to the milliseconds value.
*/
setMinutes(min: number, sec?: number, ms?: number): number;
/**
* Sets the minutes value in the Date object using Universal Coordinated Time (UTC).
* @param min A numeric value equal to the minutes value.
* @param sec A numeric value equal to the seconds value.
* @param ms A numeric value equal to the milliseconds value.
*/
setUTCMinutes(min: number, sec?: number, ms?: number): number;
/**
* Sets the hour value in the Date object using local time.
* @param hours A numeric value equal to the hours value.
* @param min A numeric value equal to the minutes value.
* @param sec A numeric value equal to the seconds value.
* @param ms A numeric value equal to the milliseconds value.
*/
setHours(hours: number, min?: number, sec?: number, ms?: number): number;
/**
* Sets the hours value in the Date object using Universal Coordinated Time (UTC).
* @param hours A numeric value equal to the hours value.
* @param min A numeric value equal to the minutes value.
* @param sec A numeric value equal to the seconds value.
* @param ms A numeric value equal to the milliseconds value.
*/
setUTCHours(hours: number, min?: number, sec?: number, ms?: number): number;
/**
* Sets the numeric day-of-the-month value of the Date object using local time.
* @param date A numeric value equal to the day of the month.
*/
setDate(date: number): number;
/**
* Sets the numeric day of the month in the Date object using Universal Coordinated Time (UTC).
* @param date A numeric value equal to the day of the month.
*/
setUTCDate(date: number): number;
/**
* Sets the month value in the Date object using local time.
* @param month A numeric value equal to the month. The value for January is 0, and other month values follow consecutively.
* @param date A numeric value representing the day of the month. If this value is not supplied, the value from a call to the getDate method is used.
*/
setMonth(month: number, date?: number): number;
/**
* Sets the month value in the Date object using Universal Coordinated Time (UTC).
* @param month A numeric value equal to the month. The value for January is 0, and other month values follow consecutively.
* @param date A numeric value representing the day of the month. If it is not supplied, the value from a call to the getUTCDate method is used.
*/
setUTCMonth(month: number, date?: number): number;
/**
* Sets the year of the Date object using local time.
* @param year A numeric value for the year.
* @param month A zero-based numeric value for the month (0 for January, 11 for December). Must be specified if numDate is specified.
* @param date A numeric value equal for the day of the month.
*/
setFullYear(year: number, month?: number, date?: number): number;
/**
* Sets the year value in the Date object using Universal Coordinated Time (UTC).
* @param year A numeric value equal to the year.
* @param month A numeric value equal to the month. The value for January is 0, and other month values follow consecutively. Must be supplied if numDate is supplied.
* @param date A numeric value equal to the day of the month.
*/
setUTCFullYear(year: number, month?: number, date?: number): number;
/** Returns a date converted to a string using Universal Coordinated Time (UTC). */
toUTCString(): string;
/** Returns a date as a string value in ISO format. */
toISOString(): string;
/** Used by the JSON.stringify method to enable the transformation of an object's data for JavaScript Object Notation (JSON) serialization. */
toJSON(key?: any): string;
}
interface DateConstructor {
new (): Date;
new (value: number): Date;
new (value: string): Date;
new (year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): Date;
(): string;
prototype: Date;
/**
* Parses a string containing a date, and returns the number of milliseconds between that date and midnight, January 1, 1970.
* @param s A date string
*/
parse(s: string): number;
/**
* Returns the number of milliseconds between midnight, January 1, 1970 Universal Coordinated Time (UTC) (or GMT) and the specified date.
* @param year The full year designation is required for cross-century date accuracy. If year is between 0 and 99 is used, then year is assumed to be 1900 + year.
* @param month The month as an number between 0 and 11 (January to December).
* @param date The date as an number between 1 and 31.
* @param hours Must be supplied if minutes is supplied. An number from 0 to 23 (midnight to 11pm) that specifies the hour.
* @param minutes Must be supplied if seconds is supplied. An number from 0 to 59 that specifies the minutes.
* @param seconds Must be supplied if milliseconds is supplied. An number from 0 to 59 that specifies the seconds.
* @param ms An number from 0 to 999 that specifies the milliseconds.
*/
UTC(year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): number;
now(): number;
}
declare var Date: DateConstructor;
interface RegExpMatchArray extends Array<string> {
index?: number;
input?: string;
}
interface RegExpExecArray extends Array<string> {
index: number;
input: string;
}
interface RegExp {
/**
* Executes a search on a string using a regular expression pattern, and returns an array containing the results of that search.
* @param string The String object or string literal on which to perform the search.
*/
exec(string: string): RegExpExecArray;
/**
* Returns a Boolean value that indicates whether or not a pattern exists in a searched string.
* @param string String on which to perform the search.
*/
test(string: string): boolean;
/** Returns a copy of the text of the regular expression pattern. Read-only. The regExp argument is a Regular expression object. It can be a variable name or a literal. */
source: string;
/** Returns a Boolean value indicating the state of the global flag (g) used with a regular expression. Default is false. Read-only. */
global: boolean;
/** Returns a Boolean value indicating the state of the ignoreCase flag (i) used with a regular expression. Default is false. Read-only. */
ignoreCase: boolean;
/** Returns a Boolean value indicating the state of the multiline flag (m) used with a regular expression. Default is false. Read-only. */
multiline: boolean;
lastIndex: number;
// Non-standard extensions
compile(): RegExp;
}
interface RegExpConstructor {
new (pattern: string, flags?: string): RegExp;
(pattern: string, flags?: string): RegExp;
prototype: RegExp;
// Non-standard extensions
$1: string;
$2: string;
$3: string;
$4: string;
$5: string;
$6: string;
$7: string;
$8: string;
$9: string;
lastMatch: string;
}
declare var RegExp: RegExpConstructor;
interface Error {
name: string;
message: string;
}
interface ErrorConstructor {
new (message?: string): Error;
(message?: string): Error;
prototype: Error;
}
declare var Error: ErrorConstructor;
interface EvalError extends Error {
}
interface EvalErrorConstructor {
new (message?: string): EvalError;
(message?: string): EvalError;
prototype: EvalError;
}
declare var EvalError: EvalErrorConstructor;
interface RangeError extends Error {
}
interface RangeErrorConstructor {
new (message?: string): RangeError;
(message?: string): RangeError;
prototype: RangeError;
}
declare var RangeError: RangeErrorConstructor;
interface ReferenceError extends Error {
}
interface ReferenceErrorConstructor {
new (message?: string): ReferenceError;
(message?: string): ReferenceError;
prototype: ReferenceError;
}
declare var ReferenceError: ReferenceErrorConstructor;
interface SyntaxError extends Error {
}
interface SyntaxErrorConstructor {
new (message?: string): SyntaxError;
(message?: string): SyntaxError;
prototype: SyntaxError;
}
declare var SyntaxError: SyntaxErrorConstructor;
interface TypeError extends Error {
}
interface TypeErrorConstructor {
new (message?: string): TypeError;
(message?: string): TypeError;
prototype: TypeError;
}
declare var TypeError: TypeErrorConstructor;
interface URIError extends Error {
}
interface URIErrorConstructor {
new (message?: string): URIError;
(message?: string): URIError;
prototype: URIError;
}
declare var URIError: URIErrorConstructor;
interface JSON {
/**
* Converts a JavaScript Object Notation (JSON) string into an object.
* @param text A valid JSON string.
* @param reviver A function that transforms the results. This function is called for each member of the object.
* If a member contains nested objects, the nested objects are transformed before the parent object is.
*/
parse(text: string, reviver?: (key: any, value: any) => any): any;
/**
* Converts a JavaScript value to a JavaScript Object Notation (JSON) string.
* @param value A JavaScript value, usually an object or array, to be converted.
*/
stringify(value: any): string;
/**
* Converts a JavaScript value to a JavaScript Object Notation (JSON) string.
* @param value A JavaScript value, usually an object or array, to be converted.
* @param replacer A function that transforms the results.
*/
stringify(value: any, replacer: (key: string, value: any) => any): string;
/**
* Converts a JavaScript value to a JavaScript Object Notation (JSON) string.
* @param value A JavaScript value, usually an object or array, to be converted.
* @param replacer Array that transforms the results.
*/
stringify(value: any, replacer: any[]): string;
/**
* Converts a JavaScript value to a JavaScript Object Notation (JSON) string.
* @param value A JavaScript value, usually an object or array, to be converted.
* @param replacer A function that transforms the results.
* @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.
*/
stringify(value: any, replacer: (key: string, value: any) => any, space: any): string;
/**
* Converts a JavaScript value to a JavaScript Object Notation (JSON) string.
* @param value A JavaScript value, usually an object or array, to be converted.
* @param replacer Array that transforms the results.
* @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.
*/
stringify(value: any, replacer: any[], space: any): string;
}
/**
* An intrinsic object that provides functions to convert JavaScript values to and from the JavaScript Object Notation (JSON) format.
*/
declare var JSON: JSON;
/////////////////////////////
/// ECMAScript Array API (specially handled by compiler)
/////////////////////////////
interface Array<T> {
/**
* Gets or sets the length of the array. This is a number one higher than the highest element defined in an array.
*/
length: number;
/**
* Returns a string representation of an array.
*/
toString(): string;
toLocaleString(): string;
/**
* Appends new elements to an array, and returns the new length of the array.
* @param items New elements of the Array.
*/
push(...items: T[]): number;
/**
* Removes the last element from an array and returns it.
*/
pop(): T;
/**
* Combines two or more arrays.
* @param items Additional items to add to the end of array1.
*/
concat<U extends T[]>(...items: U[]): T[];
/**
* Combines two or more arrays.
* @param items Additional items to add to the end of array1.
*/
concat(...items: T[]): T[];
/**
* Adds all the elements of an array separated by the specified separator string.
* @param separator A string used to separate one element of an array from the next in the resulting String. If omitted, the array elements are separated with a comma.
*/
join(separator?: string): string;
/**
* Reverses the elements in an Array.
*/
reverse(): T[];
/**
* Removes the first element from an array and returns it.
*/
shift(): T;
/**
* Returns a section of an array.
* @param start The beginning of the specified portion of the array.
* @param end The end of the specified portion of the array.
*/
slice(start?: number, end?: number): T[];
/**
* Sorts an array.
* @param compareFn The name of the function used to determine the order of the elements. If omitted, the elements are sorted in ascending, ASCII character order.
*/
sort(compareFn?: (a: T, b: T) => number): T[];
/**
* Removes elements from an array and, if necessary, inserts new elements in their place, returning the deleted elements.
* @param start The zero-based location in the array from which to start removing elements.
*/
splice(start: number): T[];
/**
* Removes elements from an array and, if necessary, inserts new elements in their place, returning the deleted elements.
* @param start The zero-based location in the array from which to start removing elements.
* @param deleteCount The number of elements to remove.
* @param items Elements to insert into the array in place of the deleted elements.
*/
splice(start: number, deleteCount: number, ...items: T[]): T[];
/**
* Inserts new elements at the start of an array.
* @param items Elements to insert at the start of the Array.
*/
unshift(...items: T[]): number;
/**
* Returns the index of the first occurrence of a value in an array.
* @param searchElement The value to locate in the array.
* @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0.
*/
indexOf(searchElement: T, fromIndex?: number): number;
/**
* Returns the index of the last occurrence of a specified value in an array.
* @param searchElement The value to locate in the array.
* @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at the last index in the array.
*/
lastIndexOf(searchElement: T, fromIndex?: number): number;
/**
* Determines whether all the members of an array satisfy the specified test.
* @param callbackfn A function that accepts up to three arguments. The every method calls the callbackfn function for each element in array1 until the callbackfn returns false, or until the end of the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.
*/
every(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any): boolean;
/**
* Determines whether the specified callback function returns true for any element of an array.
* @param callbackfn A function that accepts up to three arguments. The some method calls the callbackfn function for each element in array1 until the callbackfn returns true, or until the end of the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.
*/
some(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any): boolean;
/**
* Performs the specified action for each element in an array.
* @param callbackfn A function that accepts up to three arguments. forEach calls the callbackfn function one time for each element in the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.
*/
forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): void;
/**
* Calls a defined callback function on each element of an array, and returns an array that contains the results.
* @param callbackfn A function that accepts up to three arguments. The map method calls the callbackfn function one time for each element in the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.
*/
map<U>(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[];
/**
* Returns the elements of an array that meet the condition specified in a callback function.
* @param callbackfn A function that accepts up to three arguments. The filter method calls the callbackfn function one time for each element in the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.
*/
filter(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any): T[];
/**
* Calls the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduce method calls the callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.
*/
reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue?: T): T;
/**
* Calls the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduce method calls the callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.
*/
reduce<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U;
/**
* Calls the specified callback function for all the elements in an array, in descending order. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduceRight method calls the callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.
*/
reduceRight(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue?: T): T;
/**
* Calls the specified callback function for all the elements in an array, in descending order. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduceRight method calls the callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.
*/
reduceRight<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U;
[n: number]: T;
}
interface ArrayConstructor {
new (arrayLength?: number): any[];
new <T>(arrayLength: number): T[];
new <T>(...items: T[]): T[];
(arrayLength?: number): any[];
<T>(arrayLength: number): T[];
<T>(...items: T[]): T[];
isArray(arg: any): boolean;
prototype: Array<any>;
}
declare var Array: ArrayConstructor;
interface TypedPropertyDescriptor<T> {
enumerable?: boolean;
configurable?: boolean;
writable?: boolean;
value?: T;
get?: () => T;
set?: (value: T) => void;
}
declare type ClassDecorator = <TFunction extends Function>(target: TFunction) => TFunction | void;
declare type PropertyDecorator = (target: Object, propertyKey: string | symbol) => void;
declare type MethodDecorator = <T>(target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>) => TypedPropertyDescriptor<T> | void;
declare type ParameterDecorator = (target: Object, propertyKey: string | symbol, parameterIndex: number) => void;
/////////////////////////////
/// IE10 ECMAScript Extensions
/////////////////////////////
/**
* Represents a raw buffer of binary data, which is used to store data for the
* different typed arrays. ArrayBuffers cannot be read from or written to directly,
* but can be passed to a typed array or DataView Object to interpret the raw
* buffer as needed.
*/
interface ArrayBuffer {
/**
* Read-only. The length of the ArrayBuffer (in bytes).
*/
byteLength: number;
/**
* Returns a section of an ArrayBuffer.
*/
slice(begin:number, end?:number): ArrayBuffer;
}
interface ArrayBufferConstructor {
prototype: ArrayBuffer;
new (byteLength: number): ArrayBuffer;
isView(arg: any): boolean;
}
declare var ArrayBuffer: ArrayBufferConstructor;
interface ArrayBufferView {
/**
* The ArrayBuffer instance referenced by the array.
*/
buffer: ArrayBuffer;
/**
* The length in bytes of the array.
*/
byteLength: number;
/**
* The offset in bytes of the array.
*/
byteOffset: number;
}
interface DataView {
buffer: ArrayBuffer;
byteLength: number;
byteOffset: number;
/**
* Gets the Float32 value at the specified byte offset from the start of the view. There is
* no alignment constraint; multi-byte values may be fetched from any offset.
* @param byteOffset The place in the buffer at which the value should be retrieved.
*/
getFloat32(byteOffset: number, littleEndian: boolean): number;
/**
* Gets the Float64 value at the specified byte offset from the start of the view. There is
* no alignment constraint; multi-byte values may be fetched from any offset.
* @param byteOffset The place in the buffer at which the value should be retrieved.
*/
getFloat64(byteOffset: number, littleEndian: boolean): number;
/**
* Gets the Int8 value at the specified byte offset from the start of the view. There is
* no alignment constraint; multi-byte values may be fetched from any offset.
* @param byteOffset The place in the buffer at which the value should be retrieved.
*/
getInt8(byteOffset: number): number;
/**
* Gets the Int16 value at the specified byte offset from the start of the view. There is
* no alignment constraint; multi-byte values may be fetched from any offset.
* @param byteOffset The place in the buffer at which the value should be retrieved.
*/
getInt16(byteOffset: number, littleEndian: boolean): number;
/**
* Gets the Int32 value at the specified byte offset from the start of the view. There is
* no alignment constraint; multi-byte values may be fetched from any offset.
* @param byteOffset The place in the buffer at which the value should be retrieved.
*/
getInt32(byteOffset: number, littleEndian: boolean): number;
/**
* Gets the Uint8 value at the specified byte offset from the start of the view. There is
* no alignment constraint; multi-byte values may be fetched from any offset.
* @param byteOffset The place in the buffer at which the value should be retrieved.
*/
getUint8(byteOffset: number): number;
/**
* Gets the Uint16 value at the specified byte offset from the start of the view. There is
* no alignment constraint; multi-byte values may be fetched from any offset.
* @param byteOffset The place in the buffer at which the value should be retrieved.
*/
getUint16(byteOffset: number, littleEndian: boolean): number;
/**
* Gets the Uint32 value at the specified byte offset from the start of the view. There is
* no alignment constraint; multi-byte values may be fetched from any offset.
* @param byteOffset The place in the buffer at which the value should be retrieved.
*/
getUint32(byteOffset: number, littleEndian: boolean): number;
/**
* Stores an Float32 value at the specified byte offset from the start of the view.
* @param byteOffset The place in the buffer at which the value should be set.
* @param value The value to set.
* @param littleEndian If false or undefined, a big-endian value should be written,
* otherwise a little-endian value should be written.
*/
setFloat32(byteOffset: number, value: number, littleEndian: boolean): void;
/**
* Stores an Float64 value at the specified byte offset from the start of the view.
* @param byteOffset The place in the buffer at which the value should be set.
* @param value The value to set.
* @param littleEndian If false or undefined, a big-endian value should be written,
* otherwise a little-endian value should be written.
*/
setFloat64(byteOffset: number, value: number, littleEndian: boolean): void;
/**
* Stores an Int8 value at the specified byte offset from the start of the view.
* @param byteOffset The place in the buffer at which the value should be set.
* @param value The value to set.
*/
setInt8(byteOffset: number, value: number): void;
/**
* Stores an Int16 value at the specified byte offset from the start of the view.
* @param byteOffset The place in the buffer at which the value should be set.
* @param value The value to set.
* @param littleEndian If false or undefined, a big-endian value should be written,
* otherwise a little-endian value should be written.
*/
setInt16(byteOffset: number, value: number, littleEndian: boolean): void;
/**
* Stores an Int32 value at the specified byte offset from the start of the view.
* @param byteOffset The place in the buffer at which the value should be set.
* @param value The value to set.
* @param littleEndian If false or undefined, a big-endian value should be written,
* otherwise a little-endian value should be written.
*/
setInt32(byteOffset: number, value: number, littleEndian: boolean): void;
/**
* Stores an Uint8 value at the specified byte offset from the start of the view.
* @param byteOffset The place in the buffer at which the value should be set.
* @param value The value to set.
*/
setUint8(byteOffset: number, value: number): void;
/**
* Stores an Uint16 value at the specified byte offset from the start of the view.
* @param byteOffset The place in the buffer at which the value should be set.
* @param value The value to set.
* @param littleEndian If false or undefined, a big-endian value should be written,
* otherwise a little-endian value should be written.
*/
setUint16(byteOffset: number, value: number, littleEndian: boolean): void;
/**
* Stores an Uint32 value at the specified byte offset from the start of the view.
* @param byteOffset The place in the buffer at which the value should be set.
* @param value The value to set.
* @param littleEndian If false or undefined, a big-endian value should be written,
* otherwise a little-endian value should be written.
*/
setUint32(byteOffset: number, value: number, littleEndian: boolean): void;
}
interface DataViewConstructor {
new (buffer: ArrayBuffer, byteOffset?: number, byteLength?: number): DataView;
}
declare var DataView: DataViewConstructor;
/**
* A typed array of 8-bit integer values. The contents are initialized to 0. If the requested
* number of bytes could not be allocated an exception is raised.
*/
interface Int8Array {
/**
* The size in bytes of each element in the array.
*/
BYTES_PER_ELEMENT: number;
/**
* The ArrayBuffer instance referenced by the array.
*/
buffer: ArrayBuffer;
/**
* The length in bytes of the array.
*/
byteLength: number;
/**
* The offset in bytes of the array.
*/
byteOffset: number;
/**
* Returns the this object after copying a section of the array identified by start and end
* to the same array starting at position target
* @param target If target is negative, it is treated as length+target where length is the
* length of the array.
* @param start If start is negative, it is treated as length+start. If end is negative, it
* is treated as length+end.
* @param end If not specified, length of the this object is used as its default value.
*/
copyWithin(target: number, start: number, end?: number): Int8Array;
/**
* Determines whether all the members of an array satisfy the specified test.
* @param callbackfn A function that accepts up to three arguments. The every method calls
* the callbackfn function for each element in array1 until the callbackfn returns false,
* or until the end of the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
every(callbackfn: (value: number, index: number, array: Int8Array) => boolean, thisArg?: any): boolean;
/**
* Returns the this object after filling the section identified by start and end with value
* @param value value to fill array section with
* @param start index to start filling the array at. If start is negative, it is treated as
* length+start where length is the length of the array.
* @param end index to stop filling the array at. If end is negative, it is treated as
* length+end.
*/
fill(value: number, start?: number, end?: number): Int8Array;
/**
* Returns the elements of an array that meet the condition specified in a callback function.
* @param callbackfn A function that accepts up to three arguments. The filter method calls
* the callbackfn function one time for each element in the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
filter(callbackfn: (value: number, index: number, array: Int8Array) => boolean, thisArg?: any): Int8Array;
/**
* Returns the value of the first element in the array where predicate is true, and undefined
* otherwise.
* @param predicate find calls predicate once for each element of the array, in ascending
* order, until it finds one where predicate returns true. If such an element is found, find
* immediately returns that element value. Otherwise, find returns undefined.
* @param thisArg If provided, it will be used as the this value for each invocation of
* predicate. If it is not provided, undefined is used instead.
*/
find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;
/**
* Returns the index of the first element in the array where predicate is true, and undefined
* otherwise.
* @param predicate find calls predicate once for each element of the array, in ascending
* order, until it finds one where predicate returns true. If such an element is found, find
* immediately returns that element value. Otherwise, find returns undefined.
* @param thisArg If provided, it will be used as the this value for each invocation of
* predicate. If it is not provided, undefined is used instead.
*/
findIndex(predicate: (value: number) => boolean, thisArg?: any): number;
/**
* Performs the specified action for each element in an array.
* @param callbackfn A function that accepts up to three arguments. forEach calls the
* callbackfn function one time for each element in the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
forEach(callbackfn: (value: number, index: number, array: Int8Array) => void, thisArg?: any): void;
/**
* Returns the index of the first occurrence of a value in an array.
* @param searchElement The value to locate in the array.
* @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
* search starts at index 0.
*/
indexOf(searchElement: number, fromIndex?: number): number;
/**
* Adds all the elements of an array separated by the specified separator string.
* @param separator A string used to separate one element of an array from the next in the
* resulting String. If omitted, the array elements are separated with a comma.
*/
join(separator?: string): string;
/**
* Returns the index of the last occurrence of a value in an array.
* @param searchElement The value to locate in the array.
* @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
* search starts at index 0.
*/
lastIndexOf(searchElement: number, fromIndex?: number): number;
/**
* The length of the array.
*/
length: number;
/**
* Calls a defined callback function on each element of an array, and returns an array that
* contains the results.
* @param callbackfn A function that accepts up to three arguments. The map method calls the
* callbackfn function one time for each element in the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
map(callbackfn: (value: number, index: number, array: Int8Array) => number, thisArg?: any): Int8Array;
/**
* Calls the specified callback function for all the elements in an array. The return value of
* the callback function is the accumulated result, and is provided as an argument in the next
* call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduce method calls the
* callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an argument
* instead of an array value.
*/
reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number, initialValue?: number): number;
/**
* Calls the specified callback function for all the elements in an array. The return value of
* the callback function is the accumulated result, and is provided as an argument in the next
* call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduce method calls the
* callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an argument
* instead of an array value.
*/
reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int8Array) => U, initialValue: U): U;
/**
* Calls the specified callback function for all the elements in an array, in descending order.
* The return value of the callback function is the accumulated result, and is provided as an
* argument in the next call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
* the callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an
* argument instead of an array value.
*/
reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number, initialValue?: number): number;
/**
* Calls the specified callback function for all the elements in an array, in descending order.
* The return value of the callback function is the accumulated result, and is provided as an
* argument in the next call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
* the callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an argument
* instead of an array value.
*/
reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int8Array) => U, initialValue: U): U;
/**
* Reverses the elements in an Array.
*/
reverse(): Int8Array;
/**
* Sets a value or an array of values.
* @param index The index of the location to set.
* @param value The value to set.
*/
set(index: number, value: number): void;
/**
* Sets a value or an array of values.
* @param array A typed or untyped array of values to set.
* @param offset The index in the current array at which the values are to be written.
*/
set(array: Int8Array, offset?: number): void;
/**
* Returns a section of an array.
* @param start The beginning of the specified portion of the array.
* @param end The end of the specified portion of the array.
*/
slice(start?: number, end?: number): Int8Array;
/**
* Determines whether the specified callback function returns true for any element of an array.
* @param callbackfn A function that accepts up to three arguments. The some method calls the
* callbackfn function for each element in array1 until the callbackfn returns true, or until
* the end of the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
some(callbackfn: (value: number, index: number, array: Int8Array) => boolean, thisArg?: any): boolean;
/**
* Sorts an array.
* @param compareFn The name of the function used to determine the order of the elements. If
* omitted, the elements are sorted in ascending, ASCII character order.
*/
sort(compareFn?: (a: number, b: number) => number): Int8Array;
/**
* Gets a new Int8Array view of the ArrayBuffer store for this array, referencing the elements
* at begin, inclusive, up to end, exclusive.
* @param begin The index of the beginning of the array.
* @param end The index of the end of the array.
*/
subarray(begin: number, end?: number): Int8Array;
/**
* Converts a number to a string by using the current locale.
*/
toLocaleString(): string;
/**
* Returns a string representation of an array.
*/
toString(): string;
[index: number]: number;
}
interface Int8ArrayConstructor {
prototype: Int8Array;
new (length: number): Int8Array;
new (array: Int8Array): Int8Array;
new (array: number[]): Int8Array;
new (buffer: ArrayBuffer, byteOffset?: number, length?: number): Int8Array;
/**
* The size in bytes of each element in the array.
*/
BYTES_PER_ELEMENT: number;
/**
* Returns a new array from a set of elements.
* @param items A set of elements to include in the new array object.
*/
of(...items: number[]): Int8Array;
}
declare var Int8Array: Int8ArrayConstructor;
/**
* A typed array of 8-bit unsigned integer values. The contents are initialized to 0. If the
* requested number of bytes could not be allocated an exception is raised.
*/
interface Uint8Array {
/**
* The size in bytes of each element in the array.
*/
BYTES_PER_ELEMENT: number;
/**
* The ArrayBuffer instance referenced by the array.
*/
buffer: ArrayBuffer;
/**
* The length in bytes of the array.
*/
byteLength: number;
/**
* The offset in bytes of the array.
*/
byteOffset: number;
/**
* Returns the this object after copying a section of the array identified by start and end
* to the same array starting at position target
* @param target If target is negative, it is treated as length+target where length is the
* length of the array.
* @param start If start is negative, it is treated as length+start. If end is negative, it
* is treated as length+end.
* @param end If not specified, length of the this object is used as its default value.
*/
copyWithin(target: number, start: number, end?: number): Uint8Array;
/**
* Determines whether all the members of an array satisfy the specified test.
* @param callbackfn A function that accepts up to three arguments. The every method calls
* the callbackfn function for each element in array1 until the callbackfn returns false,
* or until the end of the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
every(callbackfn: (value: number, index: number, array: Uint8Array) => boolean, thisArg?: any): boolean;
/**
* Returns the this object after filling the section identified by start and end with value
* @param value value to fill array section with
* @param start index to start filling the array at. If start is negative, it is treated as
* length+start where length is the length of the array.
* @param end index to stop filling the array at. If end is negative, it is treated as
* length+end.
*/
fill(value: number, start?: number, end?: number): Uint8Array;
/**
* Returns the elements of an array that meet the condition specified in a callback function.
* @param callbackfn A function that accepts up to three arguments. The filter method calls
* the callbackfn function one time for each element in the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
filter(callbackfn: (value: number, index: number, array: Uint8Array) => boolean, thisArg?: any): Uint8Array;
/**
* Returns the value of the first element in the array where predicate is true, and undefined
* otherwise.
* @param predicate find calls predicate once for each element of the array, in ascending
* order, until it finds one where predicate returns true. If such an element is found, find
* immediately returns that element value. Otherwise, find returns undefined.
* @param thisArg If provided, it will be used as the this value for each invocation of
* predicate. If it is not provided, undefined is used instead.
*/
find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;
/**
* Returns the index of the first element in the array where predicate is true, and undefined
* otherwise.
* @param predicate find calls predicate once for each element of the array, in ascending
* order, until it finds one where predicate returns true. If such an element is found, find
* immediately returns that element value. Otherwise, find returns undefined.
* @param thisArg If provided, it will be used as the this value for each invocation of
* predicate. If it is not provided, undefined is used instead.
*/
findIndex(predicate: (value: number) => boolean, thisArg?: any): number;
/**
* Performs the specified action for each element in an array.
* @param callbackfn A function that accepts up to three arguments. forEach calls the
* callbackfn function one time for each element in the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
forEach(callbackfn: (value: number, index: number, array: Uint8Array) => void, thisArg?: any): void;
/**
* Returns the index of the first occurrence of a value in an array.
* @param searchElement The value to locate in the array.
* @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
* search starts at index 0.
*/
indexOf(searchElement: number, fromIndex?: number): number;
/**
* Adds all the elements of an array separated by the specified separator string.
* @param separator A string used to separate one element of an array from the next in the
* resulting String. If omitted, the array elements are separated with a comma.
*/
join(separator?: string): string;
/**
* Returns the index of the last occurrence of a value in an array.
* @param searchElement The value to locate in the array.
* @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
* search starts at index 0.
*/
lastIndexOf(searchElement: number, fromIndex?: number): number;
/**
* The length of the array.
*/
length: number;
/**
* Calls a defined callback function on each element of an array, and returns an array that
* contains the results.
* @param callbackfn A function that accepts up to three arguments. The map method calls the
* callbackfn function one time for each element in the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
map(callbackfn: (value: number, index: number, array: Uint8Array) => number, thisArg?: any): Uint8Array;
/**
* Calls the specified callback function for all the elements in an array. The return value of
* the callback function is the accumulated result, and is provided as an argument in the next
* call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduce method calls the
* callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an argument
* instead of an array value.
*/
reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number, initialValue?: number): number;
/**
* Calls the specified callback function for all the elements in an array. The return value of
* the callback function is the accumulated result, and is provided as an argument in the next
* call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduce method calls the
* callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an argument
* instead of an array value.
*/
reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8Array) => U, initialValue: U): U;
/**
* Calls the specified callback function for all the elements in an array, in descending order.
* The return value of the callback function is the accumulated result, and is provided as an
* argument in the next call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
* the callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an
* argument instead of an array value.
*/
reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number, initialValue?: number): number;
/**
* Calls the specified callback function for all the elements in an array, in descending order.
* The return value of the callback function is the accumulated result, and is provided as an
* argument in the next call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
* the callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an argument
* instead of an array value.
*/
reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8Array) => U, initialValue: U): U;
/**
* Reverses the elements in an Array.
*/
reverse(): Uint8Array;
/**
* Sets a value or an array of values.
* @param index The index of the location to set.
* @param value The value to set.
*/
set(index: number, value: number): void;
/**
* Sets a value or an array of values.
* @param array A typed or untyped array of values to set.
* @param offset The index in the current array at which the values are to be written.
*/
set(array: Uint8Array, offset?: number): void;
/**
* Returns a section of an array.
* @param start The beginning of the specified portion of the array.
* @param end The end of the specified portion of the array.
*/
slice(start?: number, end?: number): Uint8Array;
/**
* Determines whether the specified callback function returns true for any element of an array.
* @param callbackfn A function that accepts up to three arguments. The some method calls the
* callbackfn function for each element in array1 until the callbackfn returns true, or until
* the end of the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
some(callbackfn: (value: number, index: number, array: Uint8Array) => boolean, thisArg?: any): boolean;
/**
* Sorts an array.
* @param compareFn The name of the function used to determine the order of the elements. If
* omitted, the elements are sorted in ascending, ASCII character order.
*/
sort(compareFn?: (a: number, b: number) => number): Uint8Array;
/**
* Gets a new Uint8Array view of the ArrayBuffer store for this array, referencing the elements
* at begin, inclusive, up to end, exclusive.
* @param begin The index of the beginning of the array.
* @param end The index of the end of the array.
*/
subarray(begin: number, end?: number): Uint8Array;
/**
* Converts a number to a string by using the current locale.
*/
toLocaleString(): string;
/**
* Returns a string representation of an array.
*/
toString(): string;
[index: number]: number;
}
interface Uint8ArrayConstructor {
prototype: Uint8Array;
new (length: number): Uint8Array;
new (array: Uint8Array): Uint8Array;
new (array: number[]): Uint8Array;
new (buffer: ArrayBuffer, byteOffset?: number, length?: number): Uint8Array;
/**
* The size in bytes of each element in the array.
*/
BYTES_PER_ELEMENT: number;
/**
* Returns a new array from a set of elements.
* @param items A set of elements to include in the new array object.
*/
of(...items: number[]): Uint8Array;
}
declare var Uint8Array: Uint8ArrayConstructor;
/**
* A typed array of 16-bit signed integer values. The contents are initialized to 0. If the
* requested number of bytes could not be allocated an exception is raised.
*/
interface Int16Array {
/**
* The size in bytes of each element in the array.
*/
BYTES_PER_ELEMENT: number;
/**
* The ArrayBuffer instance referenced by the array.
*/
buffer: ArrayBuffer;
/**
* The length in bytes of the array.
*/
byteLength: number;
/**
* The offset in bytes of the array.
*/
byteOffset: number;
/**
* Returns the this object after copying a section of the array identified by start and end
* to the same array starting at position target
* @param target If target is negative, it is treated as length+target where length is the
* length of the array.
* @param start If start is negative, it is treated as length+start. If end is negative, it
* is treated as length+end.
* @param end If not specified, length of the this object is used as its default value.
*/
copyWithin(target: number, start: number, end?: number): Int16Array;
/**
* Determines whether all the members of an array satisfy the specified test.
* @param callbackfn A function that accepts up to three arguments. The every method calls
* the callbackfn function for each element in array1 until the callbackfn returns false,
* or until the end of the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
every(callbackfn: (value: number, index: number, array: Int16Array) => boolean, thisArg?: any): boolean;
/**
* Returns the this object after filling the section identified by start and end with value
* @param value value to fill array section with
* @param start index to start filling the array at. If start is negative, it is treated as
* length+start where length is the length of the array.
* @param end index to stop filling the array at. If end is negative, it is treated as
* length+end.
*/
fill(value: number, start?: number, end?: number): Int16Array;
/**
* Returns the elements of an array that meet the condition specified in a callback function.
* @param callbackfn A function that accepts up to three arguments. The filter method calls
* the callbackfn function one time for each element in the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
filter(callbackfn: (value: number, index: number, array: Int16Array) => boolean, thisArg?: any): Int16Array;
/**
* Returns the value of the first element in the array where predicate is true, and undefined
* otherwise.
* @param predicate find calls predicate once for each element of the array, in ascending
* order, until it finds one where predicate returns true. If such an element is found, find
* immediately returns that element value. Otherwise, find returns undefined.
* @param thisArg If provided, it will be used as the this value for each invocation of
* predicate. If it is not provided, undefined is used instead.
*/
find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;
/**
* Returns the index of the first element in the array where predicate is true, and undefined
* otherwise.
* @param predicate find calls predicate once for each element of the array, in ascending
* order, until it finds one where predicate returns true. If such an element is found, find
* immediately returns that element value. Otherwise, find returns undefined.
* @param thisArg If provided, it will be used as the this value for each invocation of
* predicate. If it is not provided, undefined is used instead.
*/
findIndex(predicate: (value: number) => boolean, thisArg?: any): number;
/**
* Performs the specified action for each element in an array.
* @param callbackfn A function that accepts up to three arguments. forEach calls the
* callbackfn function one time for each element in the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
forEach(callbackfn: (value: number, index: number, array: Int16Array) => void, thisArg?: any): void;
/**
* Returns the index of the first occurrence of a value in an array.
* @param searchElement The value to locate in the array.
* @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
* search starts at index 0.
*/
indexOf(searchElement: number, fromIndex?: number): number;
/**
* Adds all the elements of an array separated by the specified separator string.
* @param separator A string used to separate one element of an array from the next in the
* resulting String. If omitted, the array elements are separated with a comma.
*/
join(separator?: string): string;
/**
* Returns the index of the last occurrence of a value in an array.
* @param searchElement The value to locate in the array.
* @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
* search starts at index 0.
*/
lastIndexOf(searchElement: number, fromIndex?: number): number;
/**
* The length of the array.
*/
length: number;
/**
* Calls a defined callback function on each element of an array, and returns an array that
* contains the results.
* @param callbackfn A function that accepts up to three arguments. The map method calls the
* callbackfn function one time for each element in the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
map(callbackfn: (value: number, index: number, array: Int16Array) => number, thisArg?: any): Int16Array;
/**
* Calls the specified callback function for all the elements in an array. The return value of
* the callback function is the accumulated result, and is provided as an argument in the next
* call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduce method calls the
* callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an argument
* instead of an array value.
*/
reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int16Array) => number, initialValue?: number): number;
/**
* Calls the specified callback function for all the elements in an array. The return value of
* the callback function is the accumulated result, and is provided as an argument in the next
* call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduce method calls the
* callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an argument
* instead of an array value.
*/
reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int16Array) => U, initialValue: U): U;
/**
* Calls the specified callback function for all the elements in an array, in descending order.
* The return value of the callback function is the accumulated result, and is provided as an
* argument in the next call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
* the callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an
* argument instead of an array value.
*/
reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int16Array) => number, initialValue?: number): number;
/**
* Calls the specified callback function for all the elements in an array, in descending order.
* The return value of the callback function is the accumulated result, and is provided as an
* argument in the next call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
* the callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an argument
* instead of an array value.
*/
reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int16Array) => U, initialValue: U): U;
/**
* Reverses the elements in an Array.
*/
reverse(): Int16Array;
/**
* Sets a value or an array of values.
* @param index The index of the location to set.
* @param value The value to set.
*/
set(index: number, value: number): void;
/**
* Sets a value or an array of values.
* @param array A typed or untyped array of values to set.
* @param offset The index in the current array at which the values are to be written.
*/
set(array: Int16Array, offset?: number): void;
/**
* Returns a section of an array.
* @param start The beginning of the specified portion of the array.
* @param end The end of the specified portion of the array.
*/
slice(start?: number, end?: number): Int16Array;
/**
* Determines whether the specified callback function returns true for any element of an array.
* @param callbackfn A function that accepts up to three arguments. The some method calls the
* callbackfn function for each element in array1 until the callbackfn returns true, or until
* the end of the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
some(callbackfn: (value: number, index: number, array: Int16Array) => boolean, thisArg?: any): boolean;
/**
* Sorts an array.
* @param compareFn The name of the function used to determine the order of the elements. If
* omitted, the elements are sorted in ascending, ASCII character order.
*/
sort(compareFn?: (a: number, b: number) => number): Int16Array;
/**
* Gets a new Int16Array view of the ArrayBuffer store for this array, referencing the elements
* at begin, inclusive, up to end, exclusive.
* @param begin The index of the beginning of the array.
* @param end The index of the end of the array.
*/
subarray(begin: number, end?: number): Int16Array;
/**
* Converts a number to a string by using the current locale.
*/
toLocaleString(): string;
/**
* Returns a string representation of an array.
*/
toString(): string;
[index: number]: number;
}
interface Int16ArrayConstructor {
prototype: Int16Array;
new (length: number): Int16Array;
new (array: Int16Array): Int16Array;
new (array: number[]): Int16Array;
new (buffer: ArrayBuffer, byteOffset?: number, length?: number): Int16Array;
/**
* The size in bytes of each element in the array.
*/
BYTES_PER_ELEMENT: number;
/**
* Returns a new array from a set of elements.
* @param items A set of elements to include in the new array object.
*/
of(...items: number[]): Int16Array;
}
declare var Int16Array: Int16ArrayConstructor;
/**
* A typed array of 16-bit unsigned integer values. The contents are initialized to 0. If the
* requested number of bytes could not be allocated an exception is raised.
*/
interface Uint16Array {
/**
* The size in bytes of each element in the array.
*/
BYTES_PER_ELEMENT: number;
/**
* The ArrayBuffer instance referenced by the array.
*/
buffer: ArrayBuffer;
/**
* The length in bytes of the array.
*/
byteLength: number;
/**
* The offset in bytes of the array.
*/
byteOffset: number;
/**
* Returns the this object after copying a section of the array identified by start and end
* to the same array starting at position target
* @param target If target is negative, it is treated as length+target where length is the
* length of the array.
* @param start If start is negative, it is treated as length+start. If end is negative, it
* is treated as length+end.
* @param end If not specified, length of the this object is used as its default value.
*/
copyWithin(target: number, start: number, end?: number): Uint16Array;
/**
* Determines whether all the members of an array satisfy the specified test.
* @param callbackfn A function that accepts up to three arguments. The every method calls
* the callbackfn function for each element in array1 until the callbackfn returns false,
* or until the end of the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
every(callbackfn: (value: number, index: number, array: Uint16Array) => boolean, thisArg?: any): boolean;
/**
* Returns the this object after filling the section identified by start and end with value
* @param value value to fill array section with
* @param start index to start filling the array at. If start is negative, it is treated as
* length+start where length is the length of the array.
* @param end index to stop filling the array at. If end is negative, it is treated as
* length+end.
*/
fill(value: number, start?: number, end?: number): Uint16Array;
/**
* Returns the elements of an array that meet the condition specified in a callback function.
* @param callbackfn A function that accepts up to three arguments. The filter method calls
* the callbackfn function one time for each element in the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
filter(callbackfn: (value: number, index: number, array: Uint16Array) => boolean, thisArg?: any): Uint16Array;
/**
* Returns the value of the first element in the array where predicate is true, and undefined
* otherwise.
* @param predicate find calls predicate once for each element of the array, in ascending
* order, until it finds one where predicate returns true. If such an element is found, find
* immediately returns that element value. Otherwise, find returns undefined.
* @param thisArg If provided, it will be used as the this value for each invocation of
* predicate. If it is not provided, undefined is used instead.
*/
find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;
/**
* Returns the index of the first element in the array where predicate is true, and undefined
* otherwise.
* @param predicate find calls predicate once for each element of the array, in ascending
* order, until it finds one where predicate returns true. If such an element is found, find
* immediately returns that element value. Otherwise, find returns undefined.
* @param thisArg If provided, it will be used as the this value for each invocation of
* predicate. If it is not provided, undefined is used instead.
*/
findIndex(predicate: (value: number) => boolean, thisArg?: any): number;
/**
* Performs the specified action for each element in an array.
* @param callbackfn A function that accepts up to three arguments. forEach calls the
* callbackfn function one time for each element in the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
forEach(callbackfn: (value: number, index: number, array: Uint16Array) => void, thisArg?: any): void;
/**
* Returns the index of the first occurrence of a value in an array.
* @param searchElement The value to locate in the array.
* @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
* search starts at index 0.
*/
indexOf(searchElement: number, fromIndex?: number): number;
/**
* Adds all the elements of an array separated by the specified separator string.
* @param separator A string used to separate one element of an array from the next in the
* resulting String. If omitted, the array elements are separated with a comma.
*/
join(separator?: string): string;
/**
* Returns the index of the last occurrence of a value in an array.
* @param searchElement The value to locate in the array.
* @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
* search starts at index 0.
*/
lastIndexOf(searchElement: number, fromIndex?: number): number;
/**
* The length of the array.
*/
length: number;
/**
* Calls a defined callback function on each element of an array, and returns an array that
* contains the results.
* @param callbackfn A function that accepts up to three arguments. The map method calls the
* callbackfn function one time for each element in the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
map(callbackfn: (value: number, index: number, array: Uint16Array) => number, thisArg?: any): Uint16Array;
/**
* Calls the specified callback function for all the elements in an array. The return value of
* the callback function is the accumulated result, and is provided as an argument in the next
* call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduce method calls the
* callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an argument
* instead of an array value.
*/
reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint16Array) => number, initialValue?: number): number;
/**
* Calls the specified callback function for all the elements in an array. The return value of
* the callback function is the accumulated result, and is provided as an argument in the next
* call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduce method calls the
* callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an argument
* instead of an array value.
*/
reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint16Array) => U, initialValue: U): U;
/**
* Calls the specified callback function for all the elements in an array, in descending order.
* The return value of the callback function is the accumulated result, and is provided as an
* argument in the next call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
* the callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an
* argument instead of an array value.
*/
reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint16Array) => number, initialValue?: number): number;
/**
* Calls the specified callback function for all the elements in an array, in descending order.
* The return value of the callback function is the accumulated result, and is provided as an
* argument in the next call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
* the callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an argument
* instead of an array value.
*/
reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint16Array) => U, initialValue: U): U;
/**
* Reverses the elements in an Array.
*/
reverse(): Uint16Array;
/**
* Sets a value or an array of values.
* @param index The index of the location to set.
* @param value The value to set.
*/
set(index: number, value: number): void;
/**
* Sets a value or an array of values.
* @param array A typed or untyped array of values to set.
* @param offset The index in the current array at which the values are to be written.
*/
set(array: Uint16Array, offset?: number): void;
/**
* Returns a section of an array.
* @param start The beginning of the specified portion of the array.
* @param end The end of the specified portion of the array.
*/
slice(start?: number, end?: number): Uint16Array;
/**
* Determines whether the specified callback function returns true for any element of an array.
* @param callbackfn A function that accepts up to three arguments. The some method calls the
* callbackfn function for each element in array1 until the callbackfn returns true, or until
* the end of the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
some(callbackfn: (value: number, index: number, array: Uint16Array) => boolean, thisArg?: any): boolean;
/**
* Sorts an array.
* @param compareFn The name of the function used to determine the order of the elements. If
* omitted, the elements are sorted in ascending, ASCII character order.
*/
sort(compareFn?: (a: number, b: number) => number): Uint16Array;
/**
* Gets a new Uint16Array view of the ArrayBuffer store for this array, referencing the elements
* at begin, inclusive, up to end, exclusive.
* @param begin The index of the beginning of the array.
* @param end The index of the end of the array.
*/
subarray(begin: number, end?: number): Uint16Array;
/**
* Converts a number to a string by using the current locale.
*/
toLocaleString(): string;
/**
* Returns a string representation of an array.
*/
toString(): string;
[index: number]: number;
}
interface Uint16ArrayConstructor {
prototype: Uint16Array;
new (length: number): Uint16Array;
new (array: Uint16Array): Uint16Array;
new (array: number[]): Uint16Array;
new (buffer: ArrayBuffer, byteOffset?: number, length?: number): Uint16Array;
/**
* The size in bytes of each element in the array.
*/
BYTES_PER_ELEMENT: number;
/**
* Returns a new array from a set of elements.
* @param items A set of elements to include in the new array object.
*/
of(...items: number[]): Uint16Array;
}
declare var Uint16Array: Uint16ArrayConstructor;
/**
* A typed array of 32-bit signed integer values. The contents are initialized to 0. If the
* requested number of bytes could not be allocated an exception is raised.
*/
interface Int32Array {
/**
* The size in bytes of each element in the array.
*/
BYTES_PER_ELEMENT: number;
/**
* The ArrayBuffer instance referenced by the array.
*/
buffer: ArrayBuffer;
/**
* The length in bytes of the array.
*/
byteLength: number;
/**
* The offset in bytes of the array.
*/
byteOffset: number;
/**
* Returns the this object after copying a section of the array identified by start and end
* to the same array starting at position target
* @param target If target is negative, it is treated as length+target where length is the
* length of the array.
* @param start If start is negative, it is treated as length+start. If end is negative, it
* is treated as length+end.
* @param end If not specified, length of the this object is used as its default value.
*/
copyWithin(target: number, start: number, end?: number): Int32Array;
/**
* Determines whether all the members of an array satisfy the specified test.
* @param callbackfn A function that accepts up to three arguments. The every method calls
* the callbackfn function for each element in array1 until the callbackfn returns false,
* or until the end of the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
every(callbackfn: (value: number, index: number, array: Int32Array) => boolean, thisArg?: any): boolean;
/**
* Returns the this object after filling the section identified by start and end with value
* @param value value to fill array section with
* @param start index to start filling the array at. If start is negative, it is treated as
* length+start where length is the length of the array.
* @param end index to stop filling the array at. If end is negative, it is treated as
* length+end.
*/
fill(value: number, start?: number, end?: number): Int32Array;
/**
* Returns the elements of an array that meet the condition specified in a callback function.
* @param callbackfn A function that accepts up to three arguments. The filter method calls
* the callbackfn function one time for each element in the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
filter(callbackfn: (value: number, index: number, array: Int32Array) => boolean, thisArg?: any): Int32Array;
/**
* Returns the value of the first element in the array where predicate is true, and undefined
* otherwise.
* @param predicate find calls predicate once for each element of the array, in ascending
* order, until it finds one where predicate returns true. If such an element is found, find
* immediately returns that element value. Otherwise, find returns undefined.
* @param thisArg If provided, it will be used as the this value for each invocation of
* predicate. If it is not provided, undefined is used instead.
*/
find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;
/**
* Returns the index of the first element in the array where predicate is true, and undefined
* otherwise.
* @param predicate find calls predicate once for each element of the array, in ascending
* order, until it finds one where predicate returns true. If such an element is found, find
* immediately returns that element value. Otherwise, find returns undefined.
* @param thisArg If provided, it will be used as the this value for each invocation of
* predicate. If it is not provided, undefined is used instead.
*/
findIndex(predicate: (value: number) => boolean, thisArg?: any): number;
/**
* Performs the specified action for each element in an array.
* @param callbackfn A function that accepts up to three arguments. forEach calls the
* callbackfn function one time for each element in the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
forEach(callbackfn: (value: number, index: number, array: Int32Array) => void, thisArg?: any): void;
/**
* Returns the index of the first occurrence of a value in an array.
* @param searchElement The value to locate in the array.
* @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
* search starts at index 0.
*/
indexOf(searchElement: number, fromIndex?: number): number;
/**
* Adds all the elements of an array separated by the specified separator string.
* @param separator A string used to separate one element of an array from the next in the
* resulting String. If omitted, the array elements are separated with a comma.
*/
join(separator?: string): string;
/**
* Returns the index of the last occurrence of a value in an array.
* @param searchElement The value to locate in the array.
* @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
* search starts at index 0.
*/
lastIndexOf(searchElement: number, fromIndex?: number): number;
/**
* The length of the array.
*/
length: number;
/**
* Calls a defined callback function on each element of an array, and returns an array that
* contains the results.
* @param callbackfn A function that accepts up to three arguments. The map method calls the
* callbackfn function one time for each element in the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
map(callbackfn: (value: number, index: number, array: Int32Array) => number, thisArg?: any): Int32Array;
/**
* Calls the specified callback function for all the elements in an array. The return value of
* the callback function is the accumulated result, and is provided as an argument in the next
* call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduce method calls the
* callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an argument
* instead of an array value.
*/
reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int32Array) => number, initialValue?: number): number;
/**
* Calls the specified callback function for all the elements in an array. The return value of
* the callback function is the accumulated result, and is provided as an argument in the next
* call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduce method calls the
* callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an argument
* instead of an array value.
*/
reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int32Array) => U, initialValue: U): U;
/**
* Calls the specified callback function for all the elements in an array, in descending order.
* The return value of the callback function is the accumulated result, and is provided as an
* argument in the next call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
* the callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an
* argument instead of an array value.
*/
reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int32Array) => number, initialValue?: number): number;
/**
* Calls the specified callback function for all the elements in an array, in descending order.
* The return value of the callback function is the accumulated result, and is provided as an
* argument in the next call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
* the callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an argument
* instead of an array value.
*/
reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int32Array) => U, initialValue: U): U;
/**
* Reverses the elements in an Array.
*/
reverse(): Int32Array;
/**
* Sets a value or an array of values.
* @param index The index of the location to set.
* @param value The value to set.
*/
set(index: number, value: number): void;
/**
* Sets a value or an array of values.
* @param array A typed or untyped array of values to set.
* @param offset The index in the current array at which the values are to be written.
*/
set(array: Int32Array, offset?: number): void;
/**
* Returns a section of an array.
* @param start The beginning of the specified portion of the array.
* @param end The end of the specified portion of the array.
*/
slice(start?: number, end?: number): Int32Array;
/**
* Determines whether the specified callback function returns true for any element of an array.
* @param callbackfn A function that accepts up to three arguments. The some method calls the
* callbackfn function for each element in array1 until the callbackfn returns true, or until
* the end of the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
some(callbackfn: (value: number, index: number, array: Int32Array) => boolean, thisArg?: any): boolean;
/**
* Sorts an array.
* @param compareFn The name of the function used to determine the order of the elements. If
* omitted, the elements are sorted in ascending, ASCII character order.
*/
sort(compareFn?: (a: number, b: number) => number): Int32Array;
/**
* Gets a new Int32Array view of the ArrayBuffer store for this array, referencing the elements
* at begin, inclusive, up to end, exclusive.
* @param begin The index of the beginning of the array.
* @param end The index of the end of the array.
*/
subarray(begin: number, end?: number): Int32Array;
/**
* Converts a number to a string by using the current locale.
*/
toLocaleString(): string;
/**
* Returns a string representation of an array.
*/
toString(): string;
[index: number]: number;
}
interface Int32ArrayConstructor {
prototype: Int32Array;
new (length: number): Int32Array;
new (array: Int32Array): Int32Array;
new (array: number[]): Int32Array;
new (buffer: ArrayBuffer, byteOffset?: number, length?: number): Int32Array;
/**
* The size in bytes of each element in the array.
*/
BYTES_PER_ELEMENT: number;
/**
* Returns a new array from a set of elements.
* @param items A set of elements to include in the new array object.
*/
of(...items: number[]): Int32Array;
}
declare var Int32Array: Int32ArrayConstructor;
/**
* A typed array of 32-bit unsigned integer values. The contents are initialized to 0. If the
* requested number of bytes could not be allocated an exception is raised.
*/
interface Uint32Array {
/**
* The size in bytes of each element in the array.
*/
BYTES_PER_ELEMENT: number;
/**
* The ArrayBuffer instance referenced by the array.
*/
buffer: ArrayBuffer;
/**
* The length in bytes of the array.
*/
byteLength: number;
/**
* The offset in bytes of the array.
*/
byteOffset: number;
/**
* Returns the this object after copying a section of the array identified by start and end
* to the same array starting at position target
* @param target If target is negative, it is treated as length+target where length is the
* length of the array.
* @param start If start is negative, it is treated as length+start. If end is negative, it
* is treated as length+end.
* @param end If not specified, length of the this object is used as its default value.
*/
copyWithin(target: number, start: number, end?: number): Uint32Array;
/**
* Determines whether all the members of an array satisfy the specified test.
* @param callbackfn A function that accepts up to three arguments. The every method calls
* the callbackfn function for each element in array1 until the callbackfn returns false,
* or until the end of the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
every(callbackfn: (value: number, index: number, array: Uint32Array) => boolean, thisArg?: any): boolean;
/**
* Returns the this object after filling the section identified by start and end with value
* @param value value to fill array section with
* @param start index to start filling the array at. If start is negative, it is treated as
* length+start where length is the length of the array.
* @param end index to stop filling the array at. If end is negative, it is treated as
* length+end.
*/
fill(value: number, start?: number, end?: number): Uint32Array;
/**
* Returns the elements of an array that meet the condition specified in a callback function.
* @param callbackfn A function that accepts up to three arguments. The filter method calls
* the callbackfn function one time for each element in the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
filter(callbackfn: (value: number, index: number, array: Uint32Array) => boolean, thisArg?: any): Uint32Array;
/**
* Returns the value of the first element in the array where predicate is true, and undefined
* otherwise.
* @param predicate find calls predicate once for each element of the array, in ascending
* order, until it finds one where predicate returns true. If such an element is found, find
* immediately returns that element value. Otherwise, find returns undefined.
* @param thisArg If provided, it will be used as the this value for each invocation of
* predicate. If it is not provided, undefined is used instead.
*/
find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;
/**
* Returns the index of the first element in the array where predicate is true, and undefined
* otherwise.
* @param predicate find calls predicate once for each element of the array, in ascending
* order, until it finds one where predicate returns true. If such an element is found, find
* immediately returns that element value. Otherwise, find returns undefined.
* @param thisArg If provided, it will be used as the this value for each invocation of
* predicate. If it is not provided, undefined is used instead.
*/
findIndex(predicate: (value: number) => boolean, thisArg?: any): number;
/**
* Performs the specified action for each element in an array.
* @param callbackfn A function that accepts up to three arguments. forEach calls the
* callbackfn function one time for each element in the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
forEach(callbackfn: (value: number, index: number, array: Uint32Array) => void, thisArg?: any): void;
/**
* Returns the index of the first occurrence of a value in an array.
* @param searchElement The value to locate in the array.
* @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
* search starts at index 0.
*/
indexOf(searchElement: number, fromIndex?: number): number;
/**
* Adds all the elements of an array separated by the specified separator string.
* @param separator A string used to separate one element of an array from the next in the
* resulting String. If omitted, the array elements are separated with a comma.
*/
join(separator?: string): string;
/**
* Returns the index of the last occurrence of a value in an array.
* @param searchElement The value to locate in the array.
* @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
* search starts at index 0.
*/
lastIndexOf(searchElement: number, fromIndex?: number): number;
/**
* The length of the array.
*/
length: number;
/**
* Calls a defined callback function on each element of an array, and returns an array that
* contains the results.
* @param callbackfn A function that accepts up to three arguments. The map method calls the
* callbackfn function one time for each element in the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
map(callbackfn: (value: number, index: number, array: Uint32Array) => number, thisArg?: any): Uint32Array;
/**
* Calls the specified callback function for all the elements in an array. The return value of
* the callback function is the accumulated result, and is provided as an argument in the next
* call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduce method calls the
* callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an argument
* instead of an array value.
*/
reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint32Array) => number, initialValue?: number): number;
/**
* Calls the specified callback function for all the elements in an array. The return value of
* the callback function is the accumulated result, and is provided as an argument in the next
* call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduce method calls the
* callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an argument
* instead of an array value.
*/
reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint32Array) => U, initialValue: U): U;
/**
* Calls the specified callback function for all the elements in an array, in descending order.
* The return value of the callback function is the accumulated result, and is provided as an
* argument in the next call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
* the callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an
* argument instead of an array value.
*/
reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint32Array) => number, initialValue?: number): number;
/**
* Calls the specified callback function for all the elements in an array, in descending order.
* The return value of the callback function is the accumulated result, and is provided as an
* argument in the next call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
* the callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an argument
* instead of an array value.
*/
reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint32Array) => U, initialValue: U): U;
/**
* Reverses the elements in an Array.
*/
reverse(): Uint32Array;
/**
* Sets a value or an array of values.
* @param index The index of the location to set.
* @param value The value to set.
*/
set(index: number, value: number): void;
/**
* Sets a value or an array of values.
* @param array A typed or untyped array of values to set.
* @param offset The index in the current array at which the values are to be written.
*/
set(array: Uint32Array, offset?: number): void;
/**
* Returns a section of an array.
* @param start The beginning of the specified portion of the array.
* @param end The end of the specified portion of the array.
*/
slice(start?: number, end?: number): Uint32Array;
/**
* Determines whether the specified callback function returns true for any element of an array.
* @param callbackfn A function that accepts up to three arguments. The some method calls the
* callbackfn function for each element in array1 until the callbackfn returns true, or until
* the end of the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
some(callbackfn: (value: number, index: number, array: Uint32Array) => boolean, thisArg?: any): boolean;
/**
* Sorts an array.
* @param compareFn The name of the function used to determine the order of the elements. If
* omitted, the elements are sorted in ascending, ASCII character order.
*/
sort(compareFn?: (a: number, b: number) => number): Uint32Array;
/**
* Gets a new Uint32Array view of the ArrayBuffer store for this array, referencing the elements
* at begin, inclusive, up to end, exclusive.
* @param begin The index of the beginning of the array.
* @param end The index of the end of the array.
*/
subarray(begin: number, end?: number): Uint32Array;
/**
* Converts a number to a string by using the current locale.
*/
toLocaleString(): string;
/**
* Returns a string representation of an array.
*/
toString(): string;
[index: number]: number;
}
interface Uint32ArrayConstructor {
prototype: Uint32Array;
new (length: number): Uint32Array;
new (array: Uint32Array): Uint32Array;
new (array: number[]): Uint32Array;
new (buffer: ArrayBuffer, byteOffset?: number, length?: number): Uint32Array;
/**
* The size in bytes of each element in the array.
*/
BYTES_PER_ELEMENT: number;
/**
* Returns a new array from a set of elements.
* @param items A set of elements to include in the new array object.
*/
of(...items: number[]): Uint32Array;
}
declare var Uint32Array: Uint32ArrayConstructor;
/**
* A typed array of 32-bit float values. The contents are initialized to 0. If the requested number
* of bytes could not be allocated an exception is raised.
*/
interface Float32Array {
/**
* The size in bytes of each element in the array.
*/
BYTES_PER_ELEMENT: number;
/**
* The ArrayBuffer instance referenced by the array.
*/
buffer: ArrayBuffer;
/**
* The length in bytes of the array.
*/
byteLength: number;
/**
* The offset in bytes of the array.
*/
byteOffset: number;
/**
* Returns the this object after copying a section of the array identified by start and end
* to the same array starting at position target
* @param target If target is negative, it is treated as length+target where length is the
* length of the array.
* @param start If start is negative, it is treated as length+start. If end is negative, it
* is treated as length+end.
* @param end If not specified, length of the this object is used as its default value.
*/
copyWithin(target: number, start: number, end?: number): Float32Array;
/**
* Determines whether all the members of an array satisfy the specified test.
* @param callbackfn A function that accepts up to three arguments. The every method calls
* the callbackfn function for each element in array1 until the callbackfn returns false,
* or until the end of the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
every(callbackfn: (value: number, index: number, array: Float32Array) => boolean, thisArg?: any): boolean;
/**
* Returns the this object after filling the section identified by start and end with value
* @param value value to fill array section with
* @param start index to start filling the array at. If start is negative, it is treated as
* length+start where length is the length of the array.
* @param end index to stop filling the array at. If end is negative, it is treated as
* length+end.
*/
fill(value: number, start?: number, end?: number): Float32Array;
/**
* Returns the elements of an array that meet the condition specified in a callback function.
* @param callbackfn A function that accepts up to three arguments. The filter method calls
* the callbackfn function one time for each element in the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
filter(callbackfn: (value: number, index: number, array: Float32Array) => boolean, thisArg?: any): Float32Array;
/**
* Returns the value of the first element in the array where predicate is true, and undefined
* otherwise.
* @param predicate find calls predicate once for each element of the array, in ascending
* order, until it finds one where predicate returns true. If such an element is found, find
* immediately returns that element value. Otherwise, find returns undefined.
* @param thisArg If provided, it will be used as the this value for each invocation of
* predicate. If it is not provided, undefined is used instead.
*/
find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;
/**
* Returns the index of the first element in the array where predicate is true, and undefined
* otherwise.
* @param predicate find calls predicate once for each element of the array, in ascending
* order, until it finds one where predicate returns true. If such an element is found, find
* immediately returns that element value. Otherwise, find returns undefined.
* @param thisArg If provided, it will be used as the this value for each invocation of
* predicate. If it is not provided, undefined is used instead.
*/
findIndex(predicate: (value: number) => boolean, thisArg?: any): number;
/**
* Performs the specified action for each element in an array.
* @param callbackfn A function that accepts up to three arguments. forEach calls the
* callbackfn function one time for each element in the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
forEach(callbackfn: (value: number, index: number, array: Float32Array) => void, thisArg?: any): void;
/**
* Returns the index of the first occurrence of a value in an array.
* @param searchElement The value to locate in the array.
* @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
* search starts at index 0.
*/
indexOf(searchElement: number, fromIndex?: number): number;
/**
* Adds all the elements of an array separated by the specified separator string.
* @param separator A string used to separate one element of an array from the next in the
* resulting String. If omitted, the array elements are separated with a comma.
*/
join(separator?: string): string;
/**
* Returns the index of the last occurrence of a value in an array.
* @param searchElement The value to locate in the array.
* @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
* search starts at index 0.
*/
lastIndexOf(searchElement: number, fromIndex?: number): number;
/**
* The length of the array.
*/
length: number;
/**
* Calls a defined callback function on each element of an array, and returns an array that
* contains the results.
* @param callbackfn A function that accepts up to three arguments. The map method calls the
* callbackfn function one time for each element in the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
map(callbackfn: (value: number, index: number, array: Float32Array) => number, thisArg?: any): Float32Array;
/**
* Calls the specified callback function for all the elements in an array. The return value of
* the callback function is the accumulated result, and is provided as an argument in the next
* call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduce method calls the
* callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an argument
* instead of an array value.
*/
reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float32Array) => number, initialValue?: number): number;
/**
* Calls the specified callback function for all the elements in an array. The return value of
* the callback function is the accumulated result, and is provided as an argument in the next
* call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduce method calls the
* callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an argument
* instead of an array value.
*/
reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float32Array) => U, initialValue: U): U;
/**
* Calls the specified callback function for all the elements in an array, in descending order.
* The return value of the callback function is the accumulated result, and is provided as an
* argument in the next call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
* the callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an
* argument instead of an array value.
*/
reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float32Array) => number, initialValue?: number): number;
/**
* Calls the specified callback function for all the elements in an array, in descending order.
* The return value of the callback function is the accumulated result, and is provided as an
* argument in the next call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
* the callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an argument
* instead of an array value.
*/
reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float32Array) => U, initialValue: U): U;
/**
* Reverses the elements in an Array.
*/
reverse(): Float32Array;
/**
* Sets a value or an array of values.
* @param index The index of the location to set.
* @param value The value to set.
*/
set(index: number, value: number): void;
/**
* Sets a value or an array of values.
* @param array A typed or untyped array of values to set.
* @param offset The index in the current array at which the values are to be written.
*/
set(array: Float32Array, offset?: number): void;
/**
* Returns a section of an array.
* @param start The beginning of the specified portion of the array.
* @param end The end of the specified portion of the array.
*/
slice(start?: number, end?: number): Float32Array;
/**
* Determines whether the specified callback function returns true for any element of an array.
* @param callbackfn A function that accepts up to three arguments. The some method calls the
* callbackfn function for each element in array1 until the callbackfn returns true, or until
* the end of the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
some(callbackfn: (value: number, index: number, array: Float32Array) => boolean, thisArg?: any): boolean;
/**
* Sorts an array.
* @param compareFn The name of the function used to determine the order of the elements. If
* omitted, the elements are sorted in ascending, ASCII character order.
*/
sort(compareFn?: (a: number, b: number) => number): Float32Array;
/**
* Gets a new Float32Array view of the ArrayBuffer store for this array, referencing the elements
* at begin, inclusive, up to end, exclusive.
* @param begin The index of the beginning of the array.
* @param end The index of the end of the array.
*/
subarray(begin: number, end?: number): Float32Array;
/**
* Converts a number to a string by using the current locale.
*/
toLocaleString(): string;
/**
* Returns a string representation of an array.
*/
toString(): string;
[index: number]: number;
}
interface Float32ArrayConstructor {
prototype: Float32Array;
new (length: number): Float32Array;
new (array: Float32Array): Float32Array;
new (array: number[]): Float32Array;
new (buffer: ArrayBuffer, byteOffset?: number, length?: number): Float32Array;
/**
* The size in bytes of each element in the array.
*/
BYTES_PER_ELEMENT: number;
/**
* Returns a new array from a set of elements.
* @param items A set of elements to include in the new array object.
*/
of(...items: number[]): Float32Array;
}
declare var Float32Array: Float32ArrayConstructor;
/**
* A typed array of 64-bit float values. The contents are initialized to 0. If the requested
* number of bytes could not be allocated an exception is raised.
*/
interface Float64Array {
/**
* The size in bytes of each element in the array.
*/
BYTES_PER_ELEMENT: number;
/**
* The ArrayBuffer instance referenced by the array.
*/
buffer: ArrayBuffer;
/**
* The length in bytes of the array.
*/
byteLength: number;
/**
* The offset in bytes of the array.
*/
byteOffset: number;
/**
* Returns the this object after copying a section of the array identified by start and end
* to the same array starting at position target
* @param target If target is negative, it is treated as length+target where length is the
* length of the array.
* @param start If start is negative, it is treated as length+start. If end is negative, it
* is treated as length+end.
* @param end If not specified, length of the this object is used as its default value.
*/
copyWithin(target: number, start: number, end?: number): Float64Array;
/**
* Determines whether all the members of an array satisfy the specified test.
* @param callbackfn A function that accepts up to three arguments. The every method calls
* the callbackfn function for each element in array1 until the callbackfn returns false,
* or until the end of the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
every(callbackfn: (value: number, index: number, array: Float64Array) => boolean, thisArg?: any): boolean;
/**
* Returns the this object after filling the section identified by start and end with value
* @param value value to fill array section with
* @param start index to start filling the array at. If start is negative, it is treated as
* length+start where length is the length of the array.
* @param end index to stop filling the array at. If end is negative, it is treated as
* length+end.
*/
fill(value: number, start?: number, end?: number): Float64Array;
/**
* Returns the elements of an array that meet the condition specified in a callback function.
* @param callbackfn A function that accepts up to three arguments. The filter method calls
* the callbackfn function one time for each element in the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
filter(callbackfn: (value: number, index: number, array: Float64Array) => boolean, thisArg?: any): Float64Array;
/**
* Returns the value of the first element in the array where predicate is true, and undefined
* otherwise.
* @param predicate find calls predicate once for each element of the array, in ascending
* order, until it finds one where predicate returns true. If such an element is found, find
* immediately returns that element value. Otherwise, find returns undefined.
* @param thisArg If provided, it will be used as the this value for each invocation of
* predicate. If it is not provided, undefined is used instead.
*/
find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;
/**
* Returns the index of the first element in the array where predicate is true, and undefined
* otherwise.
* @param predicate find calls predicate once for each element of the array, in ascending
* order, until it finds one where predicate returns true. If such an element is found, find
* immediately returns that element value. Otherwise, find returns undefined.
* @param thisArg If provided, it will be used as the this value for each invocation of
* predicate. If it is not provided, undefined is used instead.
*/
findIndex(predicate: (value: number) => boolean, thisArg?: any): number;
/**
* Performs the specified action for each element in an array.
* @param callbackfn A function that accepts up to three arguments. forEach calls the
* callbackfn function one time for each element in the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
forEach(callbackfn: (value: number, index: number, array: Float64Array) => void, thisArg?: any): void;
/**
* Returns the index of the first occurrence of a value in an array.
* @param searchElement The value to locate in the array.
* @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
* search starts at index 0.
*/
indexOf(searchElement: number, fromIndex?: number): number;
/**
* Adds all the elements of an array separated by the specified separator string.
* @param separator A string used to separate one element of an array from the next in the
* resulting String. If omitted, the array elements are separated with a comma.
*/
join(separator?: string): string;
/**
* Returns the index of the last occurrence of a value in an array.
* @param searchElement The value to locate in the array.
* @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
* search starts at index 0.
*/
lastIndexOf(searchElement: number, fromIndex?: number): number;
/**
* The length of the array.
*/
length: number;
/**
* Calls a defined callback function on each element of an array, and returns an array that
* contains the results.
* @param callbackfn A function that accepts up to three arguments. The map method calls the
* callbackfn function one time for each element in the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
map(callbackfn: (value: number, index: number, array: Float64Array) => number, thisArg?: any): Float64Array;
/**
* Calls the specified callback function for all the elements in an array. The return value of
* the callback function is the accumulated result, and is provided as an argument in the next
* call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduce method calls the
* callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an argument
* instead of an array value.
*/
reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float64Array) => number, initialValue?: number): number;
/**
* Calls the specified callback function for all the elements in an array. The return value of
* the callback function is the accumulated result, and is provided as an argument in the next
* call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduce method calls the
* callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an argument
* instead of an array value.
*/
reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float64Array) => U, initialValue: U): U;
/**
* Calls the specified callback function for all the elements in an array, in descending order.
* The return value of the callback function is the accumulated result, and is provided as an
* argument in the next call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
* the callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an
* argument instead of an array value.
*/
reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float64Array) => number, initialValue?: number): number;
/**
* Calls the specified callback function for all the elements in an array, in descending order.
* The return value of the callback function is the accumulated result, and is provided as an
* argument in the next call to the callback function.
* @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
* the callbackfn function one time for each element in the array.
* @param initialValue If initialValue is specified, it is used as the initial value to start
* the accumulation. The first call to the callbackfn function provides this value as an argument
* instead of an array value.
*/
reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float64Array) => U, initialValue: U): U;
/**
* Reverses the elements in an Array.
*/
reverse(): Float64Array;
/**
* Sets a value or an array of values.
* @param index The index of the location to set.
* @param value The value to set.
*/
set(index: number, value: number): void;
/**
* Sets a value or an array of values.
* @param array A typed or untyped array of values to set.
* @param offset The index in the current array at which the values are to be written.
*/
set(array: Float64Array, offset?: number): void;
/**
* Returns a section of an array.
* @param start The beginning of the specified portion of the array.
* @param end The end of the specified portion of the array.
*/
slice(start?: number, end?: number): Float64Array;
/**
* Determines whether the specified callback function returns true for any element of an array.
* @param callbackfn A function that accepts up to three arguments. The some method calls the
* callbackfn function for each element in array1 until the callbackfn returns true, or until
* the end of the array.
* @param thisArg An object to which the this keyword can refer in the callbackfn function.
* If thisArg is omitted, undefined is used as the this value.
*/
some(callbackfn: (value: number, index: number, array: Float64Array) => boolean, thisArg?: any): boolean;
/**
* Sorts an array.
* @param compareFn The name of the function used to determine the order of the elements. If
* omitted, the elements are sorted in ascending, ASCII character order.
*/
sort(compareFn?: (a: number, b: number) => number): Float64Array;
/**
* Gets a new Float64Array view of the ArrayBuffer store for this array, referencing the elements
* at begin, inclusive, up to end, exclusive.
* @param begin The index of the beginning of the array.
* @param end The index of the end of the array.
*/
subarray(begin: number, end?: number): Float64Array;
/**
* Converts a number to a string by using the current locale.
*/
toLocaleString(): string;
/**
* Returns a string representation of an array.
*/
toString(): string;
[index: number]: number;
}
interface Float64ArrayConstructor {
prototype: Float64Array;
new (length: number): Float64Array;
new (array: Float64Array): Float64Array;
new (array: number[]): Float64Array;
new (buffer: ArrayBuffer, byteOffset?: number, length?: number): Float64Array;
/**
* The size in bytes of each element in the array.
*/
BYTES_PER_ELEMENT: number;
/**
* Returns a new array from a set of elements.
* @param items A set of elements to include in the new array object.
*/
of(...items: number[]): Float64Array;
}
declare var Float64Array: Float64ArrayConstructor;/////////////////////////////
/// ECMAScript Internationalization API
/////////////////////////////
declare module Intl {
interface CollatorOptions {
usage?: string;
localeMatcher?: string;
numeric?: boolean;
caseFirst?: string;
sensitivity?: string;
ignorePunctuation?: boolean;
}
interface ResolvedCollatorOptions {
locale: string;
usage: string;
sensitivity: string;
ignorePunctuation: boolean;
collation: string;
caseFirst: string;
numeric: boolean;
}
interface Collator {
compare(x: string, y: string): number;
resolvedOptions(): ResolvedCollatorOptions;
}
var Collator: {
new (locales?: string[], options?: CollatorOptions): Collator;
new (locale?: string, options?: CollatorOptions): Collator;
(locales?: string[], options?: CollatorOptions): Collator;
(locale?: string, options?: CollatorOptions): Collator;
supportedLocalesOf(locales: string[], options?: CollatorOptions): string[];
supportedLocalesOf(locale: string, options?: CollatorOptions): string[];
}
interface NumberFormatOptions {
localeMatcher?: string;
style?: string;
currency?: string;
currencyDisplay?: string;
useGrouping?: boolean;
}
interface ResolvedNumberFormatOptions {
locale: string;
numberingSystem: string;
style: string;
currency?: string;
currencyDisplay?: string;
minimumintegerDigits: number;
minimumFractionDigits: number;
maximumFractionDigits: number;
minimumSignificantDigits?: number;
maximumSignificantDigits?: number;
useGrouping: boolean;
}
interface NumberFormat {
format(value: number): string;
resolvedOptions(): ResolvedNumberFormatOptions;
}
var NumberFormat: {
new (locales?: string[], options?: NumberFormatOptions): Collator;
new (locale?: string, options?: NumberFormatOptions): Collator;
(locales?: string[], options?: NumberFormatOptions): Collator;
(locale?: string, options?: NumberFormatOptions): Collator;
supportedLocalesOf(locales: string[], options?: NumberFormatOptions): string[];
supportedLocalesOf(locale: string, options?: NumberFormatOptions): string[];
}
interface DateTimeFormatOptions {
localeMatcher?: string;
weekday?: string;
era?: string;
year?: string;
month?: string;
day?: string;
hour?: string;
minute?: string;
second?: string;
timeZoneName?: string;
formatMatcher?: string;
hour12?: boolean;
}
interface ResolvedDateTimeFormatOptions {
locale: string;
calendar: string;
numberingSystem: string;
timeZone: string;
hour12?: boolean;
weekday?: string;
era?: string;
year?: string;
month?: string;
day?: string;
hour?: string;
minute?: string;
second?: string;
timeZoneName?: string;
}
interface DateTimeFormat {
format(date: number): string;
resolvedOptions(): ResolvedDateTimeFormatOptions;
}
var DateTimeFormat: {
new (locales?: string[], options?: DateTimeFormatOptions): Collator;
new (locale?: string, options?: DateTimeFormatOptions): Collator;
(locales?: string[], options?: DateTimeFormatOptions): Collator;
(locale?: string, options?: DateTimeFormatOptions): Collator;
supportedLocalesOf(locales: string[], options?: DateTimeFormatOptions): string[];
supportedLocalesOf(locale: string, options?: DateTimeFormatOptions): string[];
}
}
interface String {
/**
* Determines whether two strings are equivalent in the current locale.
* @param that String to compare to target string
* @param locales An array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used. This parameter must conform to BCP 47 standards; see the Intl.Collator object for details.
* @param options An object that contains one or more properties that specify comparison options. see the Intl.Collator object for details.
*/
localeCompare(that: string, locales: string[], options?: Intl.CollatorOptions): number;
/**
* Determines whether two strings are equivalent in the current locale.
* @param that String to compare to target string
* @param locale Locale tag. If you omit this parameter, the default locale of the JavaScript runtime is used. This parameter must conform to BCP 47 standards; see the Intl.Collator object for details.
* @param options An object that contains one or more properties that specify comparison options. see the Intl.Collator object for details.
*/
localeCompare(that: string, locale: string, options?: Intl.CollatorOptions): number;
}
interface Number {
/**
* Converts a number to a string by using the current or specified locale.
* @param locales An array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used.
* @param options An object that contains one or more properties that specify comparison options.
*/
toLocaleString(locales?: string[], options?: Intl.NumberFormatOptions): string;
/**
* Converts a number to a string by using the current or specified locale.
* @param locale Locale tag. If you omit this parameter, the default locale of the JavaScript runtime is used.
* @param options An object that contains one or more properties that specify comparison options.
*/
toLocaleString(locale?: string, options?: Intl.NumberFormatOptions): string;
}
interface Date {
/**
* Converts a date to a string by using the current or specified locale.
* @param locales An array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used.
* @param options An object that contains one or more properties that specify comparison options.
*/
toLocaleString(locales?: string[], options?: Intl.DateTimeFormatOptions): string;
/**
* Converts a date to a string by using the current or specified locale.
* @param locale Locale tag. If you omit this parameter, the default locale of the JavaScript runtime is used.
* @param options An object that contains one or more properties that specify comparison options.
*/
toLocaleString(locale?: string, options?: Intl.DateTimeFormatOptions): string;
}
/////////////////////////////
/// IE DOM APIs
/////////////////////////////
interface Algorithm {
name?: string;
}
interface AriaRequestEventInit extends EventInit {
attributeName?: string;
attributeValue?: string;
}
interface ClipboardEventInit extends EventInit {
data?: string;
dataType?: string;
}
interface CommandEventInit extends EventInit {
commandName?: string;
detail?: string;
}
interface CompositionEventInit extends UIEventInit {
data?: string;
}
interface ConfirmSiteSpecificExceptionsInformation extends ExceptionInformation {
arrayOfDomainStrings?: string[];
}
interface CustomEventInit extends EventInit {
detail?: any;
}
interface DeviceAccelerationDict {
x?: number;
y?: number;
z?: number;
}
interface DeviceRotationRateDict {
alpha?: number;
beta?: number;
gamma?: number;
}
interface EventInit {
bubbles?: boolean;
cancelable?: boolean;
}
interface ExceptionInformation {
domain?: string;
}
interface FocusEventInit extends UIEventInit {
relatedTarget?: EventTarget;
}
interface HashChangeEventInit extends EventInit {
newURL?: string;
oldURL?: string;
}
interface KeyAlgorithm {
name?: string;
}
interface KeyboardEventInit extends SharedKeyboardAndMouseEventInit {
key?: string;
location?: number;
repeat?: boolean;
}
interface MouseEventInit extends SharedKeyboardAndMouseEventInit {
screenX?: number;
screenY?: number;
clientX?: number;
clientY?: number;
button?: number;
buttons?: number;
relatedTarget?: EventTarget;
}
interface MsZoomToOptions {
contentX?: number;
contentY?: number;
viewportX?: string;
viewportY?: string;
scaleFactor?: number;
animate?: string;
}
interface MutationObserverInit {
childList?: boolean;
attributes?: boolean;
characterData?: boolean;
subtree?: boolean;
attributeOldValue?: boolean;
characterDataOldValue?: boolean;
attributeFilter?: string[];
}
interface ObjectURLOptions {
oneTimeOnly?: boolean;
}
interface PointerEventInit extends MouseEventInit {
pointerId?: number;
width?: number;
height?: number;
pressure?: number;
tiltX?: number;
tiltY?: number;
pointerType?: string;
isPrimary?: boolean;
}
interface PositionOptions {
enableHighAccuracy?: boolean;
timeout?: number;
maximumAge?: number;
}
interface SharedKeyboardAndMouseEventInit extends UIEventInit {
ctrlKey?: boolean;
shiftKey?: boolean;
altKey?: boolean;
metaKey?: boolean;
keyModifierStateAltGraph?: boolean;
keyModifierStateCapsLock?: boolean;
keyModifierStateFn?: boolean;
keyModifierStateFnLock?: boolean;
keyModifierStateHyper?: boolean;
keyModifierStateNumLock?: boolean;
keyModifierStateOS?: boolean;
keyModifierStateScrollLock?: boolean;
keyModifierStateSuper?: boolean;
keyModifierStateSymbol?: boolean;
keyModifierStateSymbolLock?: boolean;
}
interface StoreExceptionsInformation extends ExceptionInformation {
siteName?: string;
explanationString?: string;
detailURI?: string;
}
interface StoreSiteSpecificExceptionsInformation extends StoreExceptionsInformation {
arrayOfDomainStrings?: string[];
}
interface UIEventInit extends EventInit {
view?: Window;
detail?: number;
}
interface WebGLContextAttributes {
alpha?: boolean;
depth?: boolean;
stencil?: boolean;
antialias?: boolean;
premultipliedAlpha?: boolean;
preserveDrawingBuffer?: boolean;
}
interface WebGLContextEventInit extends EventInit {
statusMessage?: string;
}
interface WheelEventInit extends MouseEventInit {
deltaX?: number;
deltaY?: number;
deltaZ?: number;
deltaMode?: number;
}
interface EventListener {
(evt: Event): void;
}
interface ANGLE_instanced_arrays {
drawArraysInstancedANGLE(mode: number, first: number, count: number, primcount: number): void;
drawElementsInstancedANGLE(mode: number, count: number, type: number, offset: number, primcount: number): void;
vertexAttribDivisorANGLE(index: number, divisor: number): void;
VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: number;
}
declare var ANGLE_instanced_arrays: {
prototype: ANGLE_instanced_arrays;
new(): ANGLE_instanced_arrays;
VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: number;
}
interface AnalyserNode extends AudioNode {
fftSize: number;
frequencyBinCount: number;
maxDecibels: number;
minDecibels: number;
smoothingTimeConstant: number;
getByteFrequencyData(array: Uint8Array): void;
getByteTimeDomainData(array: Uint8Array): void;
getFloatFrequencyData(array: any): void;
getFloatTimeDomainData(array: any): void;
}
declare var AnalyserNode: {
prototype: AnalyserNode;
new(): AnalyserNode;
}
interface AnimationEvent extends Event {
animationName: string;
elapsedTime: number;
initAnimationEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, animationNameArg: string, elapsedTimeArg: number): void;
}
declare var AnimationEvent: {
prototype: AnimationEvent;
new(): AnimationEvent;
}
interface ApplicationCache extends EventTarget {
oncached: (ev: Event) => any;
onchecking: (ev: Event) => any;
ondownloading: (ev: Event) => any;
onerror: (ev: Event) => any;
onnoupdate: (ev: Event) => any;
onobsolete: (ev: Event) => any;
onprogress: (ev: ProgressEvent) => any;
onupdateready: (ev: Event) => any;
status: number;
abort(): void;
swapCache(): void;
update(): void;
CHECKING: number;
DOWNLOADING: number;
IDLE: number;
OBSOLETE: number;
UNCACHED: number;
UPDATEREADY: number;
addEventListener(type: "cached", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "checking", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "downloading", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
addEventListener(type: "noupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "obsolete", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
addEventListener(type: "updateready", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var ApplicationCache: {
prototype: ApplicationCache;
new(): ApplicationCache;
CHECKING: number;
DOWNLOADING: number;
IDLE: number;
OBSOLETE: number;
UNCACHED: number;
UPDATEREADY: number;
}
interface AriaRequestEvent extends Event {
attributeName: string;
attributeValue: string;
}
declare var AriaRequestEvent: {
prototype: AriaRequestEvent;
new(type: string, eventInitDict?: AriaRequestEventInit): AriaRequestEvent;
}
interface Attr extends Node {
name: string;
ownerElement: Element;
specified: boolean;
value: string;
}
declare var Attr: {
prototype: Attr;
new(): Attr;
}
interface AudioBuffer {
duration: number;
length: number;
numberOfChannels: number;
sampleRate: number;
getChannelData(channel: number): any;
}
declare var AudioBuffer: {
prototype: AudioBuffer;
new(): AudioBuffer;
}
interface AudioBufferSourceNode extends AudioNode {
buffer: AudioBuffer;
loop: boolean;
loopEnd: number;
loopStart: number;
onended: (ev: Event) => any;
playbackRate: AudioParam;
start(when?: number, offset?: number, duration?: number): void;
stop(when?: number): void;
addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var AudioBufferSourceNode: {
prototype: AudioBufferSourceNode;
new(): AudioBufferSourceNode;
}
interface AudioContext extends EventTarget {
currentTime: number;
destination: AudioDestinationNode;
listener: AudioListener;
sampleRate: number;
createAnalyser(): AnalyserNode;
createBiquadFilter(): BiquadFilterNode;
createBuffer(numberOfChannels: number, length: number, sampleRate: number): AudioBuffer;
createBufferSource(): AudioBufferSourceNode;
createChannelMerger(numberOfInputs?: number): ChannelMergerNode;
createChannelSplitter(numberOfOutputs?: number): ChannelSplitterNode;
createConvolver(): ConvolverNode;
createDelay(maxDelayTime?: number): DelayNode;
createDynamicsCompressor(): DynamicsCompressorNode;
createGain(): GainNode;
createMediaElementSource(mediaElement: HTMLMediaElement): MediaElementAudioSourceNode;
createOscillator(): OscillatorNode;
createPanner(): PannerNode;
createPeriodicWave(real: any, imag: any): PeriodicWave;
createScriptProcessor(bufferSize?: number, numberOfInputChannels?: number, numberOfOutputChannels?: number): ScriptProcessorNode;
createStereoPanner(): StereoPannerNode;
createWaveShaper(): WaveShaperNode;
decodeAudioData(audioData: ArrayBuffer, successCallback: DecodeSuccessCallback, errorCallback?: DecodeErrorCallback): void;
}
declare var AudioContext: {
prototype: AudioContext;
new(): AudioContext;
}
interface AudioDestinationNode extends AudioNode {
maxChannelCount: number;
}
declare var AudioDestinationNode: {
prototype: AudioDestinationNode;
new(): AudioDestinationNode;
}
interface AudioListener {
dopplerFactor: number;
speedOfSound: number;
setOrientation(x: number, y: number, z: number, xUp: number, yUp: number, zUp: number): void;
setPosition(x: number, y: number, z: number): void;
setVelocity(x: number, y: number, z: number): void;
}
declare var AudioListener: {
prototype: AudioListener;
new(): AudioListener;
}
interface AudioNode extends EventTarget {
channelCount: number;
channelCountMode: string;
channelInterpretation: string;
context: AudioContext;
numberOfInputs: number;
numberOfOutputs: number;
connect(destination: AudioNode, output?: number, input?: number): void;
disconnect(output?: number): void;
}
declare var AudioNode: {
prototype: AudioNode;
new(): AudioNode;
}
interface AudioParam {
defaultValue: number;
value: number;
cancelScheduledValues(startTime: number): void;
exponentialRampToValueAtTime(value: number, endTime: number): void;
linearRampToValueAtTime(value: number, endTime: number): void;
setTargetAtTime(target: number, startTime: number, timeConstant: number): void;
setValueAtTime(value: number, startTime: number): void;
setValueCurveAtTime(values: any, startTime: number, duration: number): void;
}
declare var AudioParam: {
prototype: AudioParam;
new(): AudioParam;
}
interface AudioProcessingEvent extends Event {
inputBuffer: AudioBuffer;
outputBuffer: AudioBuffer;
playbackTime: number;
}
declare var AudioProcessingEvent: {
prototype: AudioProcessingEvent;
new(): AudioProcessingEvent;
}
interface AudioTrack {
enabled: boolean;
id: string;
kind: string;
label: string;
language: string;
sourceBuffer: SourceBuffer;
}
declare var AudioTrack: {
prototype: AudioTrack;
new(): AudioTrack;
}
interface AudioTrackList extends EventTarget {
length: number;
onaddtrack: (ev: TrackEvent) => any;
onchange: (ev: Event) => any;
onremovetrack: (ev: TrackEvent) => any;
getTrackById(id: string): AudioTrack;
item(index: number): AudioTrack;
addEventListener(type: "addtrack", listener: (ev: TrackEvent) => any, useCapture?: boolean): void;
addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "removetrack", listener: (ev: TrackEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
[index: number]: AudioTrack;
}
declare var AudioTrackList: {
prototype: AudioTrackList;
new(): AudioTrackList;
}
interface BarProp {
visible: boolean;
}
declare var BarProp: {
prototype: BarProp;
new(): BarProp;
}
interface BeforeUnloadEvent extends Event {
returnValue: any;
}
declare var BeforeUnloadEvent: {
prototype: BeforeUnloadEvent;
new(): BeforeUnloadEvent;
}
interface BiquadFilterNode extends AudioNode {
Q: AudioParam;
detune: AudioParam;
frequency: AudioParam;
gain: AudioParam;
type: string;
getFrequencyResponse(frequencyHz: any, magResponse: any, phaseResponse: any): void;
}
declare var BiquadFilterNode: {
prototype: BiquadFilterNode;
new(): BiquadFilterNode;
}
interface Blob {
size: number;
type: string;
msClose(): void;
msDetachStream(): any;
slice(start?: number, end?: number, contentType?: string): Blob;
}
declare var Blob: {
prototype: Blob;
new (blobParts?: any[], options?: BlobPropertyBag): Blob;
}
interface CDATASection extends Text {
}
declare var CDATASection: {
prototype: CDATASection;
new(): CDATASection;
}
interface CSS {
supports(property: string, value?: string): boolean;
}
declare var CSS: CSS;
interface CSSConditionRule extends CSSGroupingRule {
conditionText: string;
}
declare var CSSConditionRule: {
prototype: CSSConditionRule;
new(): CSSConditionRule;
}
interface CSSFontFaceRule extends CSSRule {
style: CSSStyleDeclaration;
}
declare var CSSFontFaceRule: {
prototype: CSSFontFaceRule;
new(): CSSFontFaceRule;
}
interface CSSGroupingRule extends CSSRule {
cssRules: CSSRuleList;
deleteRule(index?: number): void;
insertRule(rule: string, index?: number): number;
}
declare var CSSGroupingRule: {
prototype: CSSGroupingRule;
new(): CSSGroupingRule;
}
interface CSSImportRule extends CSSRule {
href: string;
media: MediaList;
styleSheet: CSSStyleSheet;
}
declare var CSSImportRule: {
prototype: CSSImportRule;
new(): CSSImportRule;
}
interface CSSKeyframeRule extends CSSRule {
keyText: string;
style: CSSStyleDeclaration;
}
declare var CSSKeyframeRule: {
prototype: CSSKeyframeRule;
new(): CSSKeyframeRule;
}
interface CSSKeyframesRule extends CSSRule {
cssRules: CSSRuleList;
name: string;
appendRule(rule: string): void;
deleteRule(rule: string): void;
findRule(rule: string): CSSKeyframeRule;
}
declare var CSSKeyframesRule: {
prototype: CSSKeyframesRule;
new(): CSSKeyframesRule;
}
interface CSSMediaRule extends CSSConditionRule {
media: MediaList;
}
declare var CSSMediaRule: {
prototype: CSSMediaRule;
new(): CSSMediaRule;
}
interface CSSNamespaceRule extends CSSRule {
namespaceURI: string;
prefix: string;
}
declare var CSSNamespaceRule: {
prototype: CSSNamespaceRule;
new(): CSSNamespaceRule;
}
interface CSSPageRule extends CSSRule {
pseudoClass: string;
selector: string;
selectorText: string;
style: CSSStyleDeclaration;
}
declare var CSSPageRule: {
prototype: CSSPageRule;
new(): CSSPageRule;
}
interface CSSRule {
cssText: string;
parentRule: CSSRule;
parentStyleSheet: CSSStyleSheet;
type: number;
CHARSET_RULE: number;
FONT_FACE_RULE: number;
IMPORT_RULE: number;
KEYFRAMES_RULE: number;
KEYFRAME_RULE: number;
MEDIA_RULE: number;
NAMESPACE_RULE: number;
PAGE_RULE: number;
STYLE_RULE: number;
SUPPORTS_RULE: number;
UNKNOWN_RULE: number;
VIEWPORT_RULE: number;
}
declare var CSSRule: {
prototype: CSSRule;
new(): CSSRule;
CHARSET_RULE: number;
FONT_FACE_RULE: number;
IMPORT_RULE: number;
KEYFRAMES_RULE: number;
KEYFRAME_RULE: number;
MEDIA_RULE: number;
NAMESPACE_RULE: number;
PAGE_RULE: number;
STYLE_RULE: number;
SUPPORTS_RULE: number;
UNKNOWN_RULE: number;
VIEWPORT_RULE: number;
}
interface CSSRuleList {
length: number;
item(index: number): CSSRule;
[index: number]: CSSRule;
}
declare var CSSRuleList: {
prototype: CSSRuleList;
new(): CSSRuleList;
}
interface CSSStyleDeclaration {
alignContent: string;
alignItems: string;
alignSelf: string;
alignmentBaseline: string;
animation: string;
animationDelay: string;
animationDirection: string;
animationDuration: string;
animationFillMode: string;
animationIterationCount: string;
animationName: string;
animationPlayState: string;
animationTimingFunction: string;
backfaceVisibility: string;
background: string;
backgroundAttachment: string;
backgroundClip: string;
backgroundColor: string;
backgroundImage: string;
backgroundOrigin: string;
backgroundPosition: string;
backgroundPositionX: string;
backgroundPositionY: string;
backgroundRepeat: string;
backgroundSize: string;
baselineShift: string;
border: string;
borderBottom: string;
borderBottomColor: string;
borderBottomLeftRadius: string;
borderBottomRightRadius: string;
borderBottomStyle: string;
borderBottomWidth: string;
borderCollapse: string;
borderColor: string;
borderImage: string;
borderImageOutset: string;
borderImageRepeat: string;
borderImageSlice: string;
borderImageSource: string;
borderImageWidth: string;
borderLeft: string;
borderLeftColor: string;
borderLeftStyle: string;
borderLeftWidth: string;
borderRadius: string;
borderRight: string;
borderRightColor: string;
borderRightStyle: string;
borderRightWidth: string;
borderSpacing: string;
borderStyle: string;
borderTop: string;
borderTopColor: string;
borderTopLeftRadius: string;
borderTopRightRadius: string;
borderTopStyle: string;
borderTopWidth: string;
borderWidth: string;
bottom: string;
boxShadow: string;
boxSizing: string;
breakAfter: string;
breakBefore: string;
breakInside: string;
captionSide: string;
clear: string;
clip: string;
clipPath: string;
clipRule: string;
color: string;
colorInterpolationFilters: string;
columnCount: any;
columnFill: string;
columnGap: any;
columnRule: string;
columnRuleColor: any;
columnRuleStyle: string;
columnRuleWidth: any;
columnSpan: string;
columnWidth: any;
columns: string;
content: string;
counterIncrement: string;
counterReset: string;
cssFloat: string;
cssText: string;
cursor: string;
direction: string;
display: string;
dominantBaseline: string;
emptyCells: string;
enableBackground: string;
fill: string;
fillOpacity: string;
fillRule: string;
filter: string;
flex: string;
flexBasis: string;
flexDirection: string;
flexFlow: string;
flexGrow: string;
flexShrink: string;
flexWrap: string;
floodColor: string;
floodOpacity: string;
font: string;
fontFamily: string;
fontFeatureSettings: string;
fontSize: string;
fontSizeAdjust: string;
fontStretch: string;
fontStyle: string;
fontVariant: string;
fontWeight: string;
glyphOrientationHorizontal: string;
glyphOrientationVertical: string;
height: string;
imeMode: string;
justifyContent: string;
kerning: string;
left: string;
length: number;
letterSpacing: string;
lightingColor: string;
lineHeight: string;
listStyle: string;
listStyleImage: string;
listStylePosition: string;
listStyleType: string;
margin: string;
marginBottom: string;
marginLeft: string;
marginRight: string;
marginTop: string;
marker: string;
markerEnd: string;
markerMid: string;
markerStart: string;
mask: string;
maxHeight: string;
maxWidth: string;
minHeight: string;
minWidth: string;
msContentZoomChaining: string;
msContentZoomLimit: string;
msContentZoomLimitMax: any;
msContentZoomLimitMin: any;
msContentZoomSnap: string;
msContentZoomSnapPoints: string;
msContentZoomSnapType: string;
msContentZooming: string;
msFlowFrom: string;
msFlowInto: string;
msFontFeatureSettings: string;
msGridColumn: any;
msGridColumnAlign: string;
msGridColumnSpan: any;
msGridColumns: string;
msGridRow: any;
msGridRowAlign: string;
msGridRowSpan: any;
msGridRows: string;
msHighContrastAdjust: string;
msHyphenateLimitChars: string;
msHyphenateLimitLines: any;
msHyphenateLimitZone: any;
msHyphens: string;
msImeAlign: string;
msOverflowStyle: string;
msScrollChaining: string;
msScrollLimit: string;
msScrollLimitXMax: any;
msScrollLimitXMin: any;
msScrollLimitYMax: any;
msScrollLimitYMin: any;
msScrollRails: string;
msScrollSnapPointsX: string;
msScrollSnapPointsY: string;
msScrollSnapType: string;
msScrollSnapX: string;
msScrollSnapY: string;
msScrollTranslation: string;
msTextCombineHorizontal: string;
msTextSizeAdjust: any;
msTouchAction: string;
msTouchSelect: string;
msUserSelect: string;
msWrapFlow: string;
msWrapMargin: any;
msWrapThrough: string;
opacity: string;
order: string;
orphans: string;
outline: string;
outlineColor: string;
outlineStyle: string;
outlineWidth: string;
overflow: string;
overflowX: string;
overflowY: string;
padding: string;
paddingBottom: string;
paddingLeft: string;
paddingRight: string;
paddingTop: string;
pageBreakAfter: string;
pageBreakBefore: string;
pageBreakInside: string;
parentRule: CSSRule;
perspective: string;
perspectiveOrigin: string;
pointerEvents: string;
position: string;
quotes: string;
right: string;
rubyAlign: string;
rubyOverhang: string;
rubyPosition: string;
stopColor: string;
stopOpacity: string;
stroke: string;
strokeDasharray: string;
strokeDashoffset: string;
strokeLinecap: string;
strokeLinejoin: string;
strokeMiterlimit: string;
strokeOpacity: string;
strokeWidth: string;
tableLayout: string;
textAlign: string;
textAlignLast: string;
textAnchor: string;
textDecoration: string;
textFillColor: string;
textIndent: string;
textJustify: string;
textKashida: string;
textKashidaSpace: string;
textOverflow: string;
textShadow: string;
textTransform: string;
textUnderlinePosition: string;
top: string;
touchAction: string;
transform: string;
transformOrigin: string;
transformStyle: string;
transition: string;
transitionDelay: string;
transitionDuration: string;
transitionProperty: string;
transitionTimingFunction: string;
unicodeBidi: string;
verticalAlign: string;
visibility: string;
webkitAlignContent: string;
webkitAlignItems: string;
webkitAlignSelf: string;
webkitAnimation: string;
webkitAnimationDelay: string;
webkitAnimationDirection: string;
webkitAnimationDuration: string;
webkitAnimationFillMode: string;
webkitAnimationIterationCount: string;
webkitAnimationName: string;
webkitAnimationPlayState: string;
webkitAnimationTimingFunction: string;
webkitAppearance: string;
webkitBackfaceVisibility: string;
webkitBackground: string;
webkitBackgroundAttachment: string;
webkitBackgroundClip: string;
webkitBackgroundColor: string;
webkitBackgroundImage: string;
webkitBackgroundOrigin: string;
webkitBackgroundPosition: string;
webkitBackgroundPositionX: string;
webkitBackgroundPositionY: string;
webkitBackgroundRepeat: string;
webkitBackgroundSize: string;
webkitBorderBottomLeftRadius: string;
webkitBorderBottomRightRadius: string;
webkitBorderImage: string;
webkitBorderImageOutset: string;
webkitBorderImageRepeat: string;
webkitBorderImageSlice: string;
webkitBorderImageSource: string;
webkitBorderImageWidth: string;
webkitBorderRadius: string;
webkitBorderTopLeftRadius: string;
webkitBorderTopRightRadius: string;
webkitBoxAlign: string;
webkitBoxDirection: string;
webkitBoxFlex: string;
webkitBoxOrdinalGroup: string;
webkitBoxOrient: string;
webkitBoxPack: string;
webkitBoxSizing: string;
webkitColumnBreakAfter: string;
webkitColumnBreakBefore: string;
webkitColumnBreakInside: string;
webkitColumnCount: any;
webkitColumnGap: any;
webkitColumnRule: string;
webkitColumnRuleColor: any;
webkitColumnRuleStyle: string;
webkitColumnRuleWidth: any;
webkitColumnSpan: string;
webkitColumnWidth: any;
webkitColumns: string;
webkitFilter: string;
webkitFlex: string;
webkitFlexBasis: string;
webkitFlexDirection: string;
webkitFlexFlow: string;
webkitFlexGrow: string;
webkitFlexShrink: string;
webkitFlexWrap: string;
webkitJustifyContent: string;
webkitOrder: string;
webkitPerspective: string;
webkitPerspectiveOrigin: string;
webkitTapHighlightColor: string;
webkitTextFillColor: string;
webkitTextSizeAdjust: any;
webkitTransform: string;
webkitTransformOrigin: string;
webkitTransformStyle: string;
webkitTransition: string;
webkitTransitionDelay: string;
webkitTransitionDuration: string;
webkitTransitionProperty: string;
webkitTransitionTimingFunction: string;
webkitUserSelect: string;
webkitWritingMode: string;
whiteSpace: string;
widows: string;
width: string;
wordBreak: string;
wordSpacing: string;
wordWrap: string;
writingMode: string;
zIndex: string;
zoom: string;
getPropertyPriority(propertyName: string): string;
getPropertyValue(propertyName: string): string;
item(index: number): string;
removeProperty(propertyName: string): string;
setProperty(propertyName: string, value: string, priority?: string): void;
[index: number]: string;
}
declare var CSSStyleDeclaration: {
prototype: CSSStyleDeclaration;
new(): CSSStyleDeclaration;
}
interface CSSStyleRule extends CSSRule {
readOnly: boolean;
selectorText: string;
style: CSSStyleDeclaration;
}
declare var CSSStyleRule: {
prototype: CSSStyleRule;
new(): CSSStyleRule;
}
interface CSSStyleSheet extends StyleSheet {
cssRules: CSSRuleList;
cssText: string;
href: string;
id: string;
imports: StyleSheetList;
isAlternate: boolean;
isPrefAlternate: boolean;
ownerRule: CSSRule;
owningElement: Element;
pages: StyleSheetPageList;
readOnly: boolean;
rules: CSSRuleList;
addImport(bstrURL: string, lIndex?: number): number;
addPageRule(bstrSelector: string, bstrStyle: string, lIndex?: number): number;
addRule(bstrSelector: string, bstrStyle?: string, lIndex?: number): number;
deleteRule(index?: number): void;
insertRule(rule: string, index?: number): number;
removeImport(lIndex: number): void;
removeRule(lIndex: number): void;
}
declare var CSSStyleSheet: {
prototype: CSSStyleSheet;
new(): CSSStyleSheet;
}
interface CSSSupportsRule extends CSSConditionRule {
}
declare var CSSSupportsRule: {
prototype: CSSSupportsRule;
new(): CSSSupportsRule;
}
interface CanvasGradient {
addColorStop(offset: number, color: string): void;
}
declare var CanvasGradient: {
prototype: CanvasGradient;
new(): CanvasGradient;
}
interface CanvasPattern {
}
declare var CanvasPattern: {
prototype: CanvasPattern;
new(): CanvasPattern;
}
interface CanvasRenderingContext2D {
canvas: HTMLCanvasElement;
fillStyle: any;
font: string;
globalAlpha: number;
globalCompositeOperation: string;
lineCap: string;
lineDashOffset: number;
lineJoin: string;
lineWidth: number;
miterLimit: number;
msFillRule: string;
msImageSmoothingEnabled: boolean;
shadowBlur: number;
shadowColor: string;
shadowOffsetX: number;
shadowOffsetY: number;
strokeStyle: any;
textAlign: string;
textBaseline: string;
arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise?: boolean): void;
arcTo(x1: number, y1: number, x2: number, y2: number, radius: number): void;
beginPath(): void;
bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): void;
clearRect(x: number, y: number, w: number, h: number): void;
clip(fillRule?: string): void;
closePath(): void;
createImageData(imageDataOrSw: number, sh?: number): ImageData;
createImageData(imageDataOrSw: ImageData, sh?: number): ImageData;
createLinearGradient(x0: number, y0: number, x1: number, y1: number): CanvasGradient;
createPattern(image: HTMLImageElement, repetition: string): CanvasPattern;
createPattern(image: HTMLCanvasElement, repetition: string): CanvasPattern;
createPattern(image: HTMLVideoElement, repetition: string): CanvasPattern;
createRadialGradient(x0: number, y0: number, r0: number, x1: number, y1: number, r1: number): CanvasGradient;
drawImage(image: HTMLImageElement, offsetX: number, offsetY: number, width?: number, height?: number, canvasOffsetX?: number, canvasOffsetY?: number, canvasImageWidth?: number, canvasImageHeight?: number): void;
drawImage(image: HTMLCanvasElement, offsetX: number, offsetY: number, width?: number, height?: number, canvasOffsetX?: number, canvasOffsetY?: number, canvasImageWidth?: number, canvasImageHeight?: number): void;
drawImage(image: HTMLVideoElement, offsetX: number, offsetY: number, width?: number, height?: number, canvasOffsetX?: number, canvasOffsetY?: number, canvasImageWidth?: number, canvasImageHeight?: number): void;
fill(fillRule?: string): void;
fillRect(x: number, y: number, w: number, h: number): void;
fillText(text: string, x: number, y: number, maxWidth?: number): void;
getImageData(sx: number, sy: number, sw: number, sh: number): ImageData;
getLineDash(): number[];
isPointInPath(x: number, y: number, fillRule?: string): boolean;
lineTo(x: number, y: number): void;
measureText(text: string): TextMetrics;
moveTo(x: number, y: number): void;
putImageData(imagedata: ImageData, dx: number, dy: number, dirtyX?: number, dirtyY?: number, dirtyWidth?: number, dirtyHeight?: number): void;
quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void;
rect(x: number, y: number, w: number, h: number): void;
restore(): void;
rotate(angle: number): void;
save(): void;
scale(x: number, y: number): void;
setLineDash(segments: number[]): void;
setTransform(m11: number, m12: number, m21: number, m22: number, dx: number, dy: number): void;
stroke(): void;
strokeRect(x: number, y: number, w: number, h: number): void;
strokeText(text: string, x: number, y: number, maxWidth?: number): void;
transform(m11: number, m12: number, m21: number, m22: number, dx: number, dy: number): void;
translate(x: number, y: number): void;
}
declare var CanvasRenderingContext2D: {
prototype: CanvasRenderingContext2D;
new(): CanvasRenderingContext2D;
}
interface ChannelMergerNode extends AudioNode {
}
declare var ChannelMergerNode: {
prototype: ChannelMergerNode;
new(): ChannelMergerNode;
}
interface ChannelSplitterNode extends AudioNode {
}
declare var ChannelSplitterNode: {
prototype: ChannelSplitterNode;
new(): ChannelSplitterNode;
}
interface CharacterData extends Node, ChildNode {
data: string;
length: number;
appendData(arg: string): void;
deleteData(offset: number, count: number): void;
insertData(offset: number, arg: string): void;
replaceData(offset: number, count: number, arg: string): void;
substringData(offset: number, count: number): string;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var CharacterData: {
prototype: CharacterData;
new(): CharacterData;
}
interface ClientRect {
bottom: number;
height: number;
left: number;
right: number;
top: number;
width: number;
}
declare var ClientRect: {
prototype: ClientRect;
new(): ClientRect;
}
interface ClientRectList {
length: number;
item(index: number): ClientRect;
[index: number]: ClientRect;
}
declare var ClientRectList: {
prototype: ClientRectList;
new(): ClientRectList;
}
interface ClipboardEvent extends Event {
clipboardData: DataTransfer;
}
declare var ClipboardEvent: {
prototype: ClipboardEvent;
new(type: string, eventInitDict?: ClipboardEventInit): ClipboardEvent;
}
interface CloseEvent extends Event {
code: number;
reason: string;
wasClean: boolean;
initCloseEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, wasCleanArg: boolean, codeArg: number, reasonArg: string): void;
}
declare var CloseEvent: {
prototype: CloseEvent;
new(): CloseEvent;
}
interface CommandEvent extends Event {
commandName: string;
detail: string;
}
declare var CommandEvent: {
prototype: CommandEvent;
new(type: string, eventInitDict?: CommandEventInit): CommandEvent;
}
interface Comment extends CharacterData {
text: string;
}
declare var Comment: {
prototype: Comment;
new(): Comment;
}
interface CompositionEvent extends UIEvent {
data: string;
locale: string;
initCompositionEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, dataArg: string, locale: string): void;
}
declare var CompositionEvent: {
prototype: CompositionEvent;
new(typeArg: string, eventInitDict?: CompositionEventInit): CompositionEvent;
}
interface Console {
assert(test?: boolean, message?: string, ...optionalParams: any[]): void;
clear(): void;
count(countTitle?: string): void;
debug(message?: string, ...optionalParams: any[]): void;
dir(value?: any, ...optionalParams: any[]): void;
dirxml(value: any): void;
error(message?: any, ...optionalParams: any[]): void;
group(groupTitle?: string): void;
groupCollapsed(groupTitle?: string): void;
groupEnd(): void;
info(message?: any, ...optionalParams: any[]): void;
log(message?: any, ...optionalParams: any[]): void;
msIsIndependentlyComposed(element: Element): boolean;
profile(reportName?: string): void;
profileEnd(): void;
select(element: Element): void;
time(timerName?: string): void;
timeEnd(timerName?: string): void;
trace(): void;
warn(message?: any, ...optionalParams: any[]): void;
}
declare var Console: {
prototype: Console;
new(): Console;
}
interface ConvolverNode extends AudioNode {
buffer: AudioBuffer;
normalize: boolean;
}
declare var ConvolverNode: {
prototype: ConvolverNode;
new(): ConvolverNode;
}
interface Coordinates {
accuracy: number;
altitude: number;
altitudeAccuracy: number;
heading: number;
latitude: number;
longitude: number;
speed: number;
}
declare var Coordinates: {
prototype: Coordinates;
new(): Coordinates;
}
interface Crypto extends Object, RandomSource {
subtle: SubtleCrypto;
}
declare var Crypto: {
prototype: Crypto;
new(): Crypto;
}
interface CryptoKey {
algorithm: KeyAlgorithm;
extractable: boolean;
type: string;
usages: string[];
}
declare var CryptoKey: {
prototype: CryptoKey;
new(): CryptoKey;
}
interface CryptoKeyPair {
privateKey: CryptoKey;
publicKey: CryptoKey;
}
declare var CryptoKeyPair: {
prototype: CryptoKeyPair;
new(): CryptoKeyPair;
}
interface CustomEvent extends Event {
detail: any;
initCustomEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, detailArg: any): void;
}
declare var CustomEvent: {
prototype: CustomEvent;
new(typeArg: string, eventInitDict?: CustomEventInit): CustomEvent;
}
interface DOMError {
name: string;
toString(): string;
}
declare var DOMError: {
prototype: DOMError;
new(): DOMError;
}
interface DOMException {
code: number;
message: string;
name: string;
toString(): string;
ABORT_ERR: number;
DATA_CLONE_ERR: number;
DOMSTRING_SIZE_ERR: number;
HIERARCHY_REQUEST_ERR: number;
INDEX_SIZE_ERR: number;
INUSE_ATTRIBUTE_ERR: number;
INVALID_ACCESS_ERR: number;
INVALID_CHARACTER_ERR: number;
INVALID_MODIFICATION_ERR: number;
INVALID_NODE_TYPE_ERR: number;
INVALID_STATE_ERR: number;
NAMESPACE_ERR: number;
NETWORK_ERR: number;
NOT_FOUND_ERR: number;
NOT_SUPPORTED_ERR: number;
NO_DATA_ALLOWED_ERR: number;
NO_MODIFICATION_ALLOWED_ERR: number;
PARSE_ERR: number;
QUOTA_EXCEEDED_ERR: number;
SECURITY_ERR: number;
SERIALIZE_ERR: number;
SYNTAX_ERR: number;
TIMEOUT_ERR: number;
TYPE_MISMATCH_ERR: number;
URL_MISMATCH_ERR: number;
VALIDATION_ERR: number;
WRONG_DOCUMENT_ERR: number;
}
declare var DOMException: {
prototype: DOMException;
new(): DOMException;
ABORT_ERR: number;
DATA_CLONE_ERR: number;
DOMSTRING_SIZE_ERR: number;
HIERARCHY_REQUEST_ERR: number;
INDEX_SIZE_ERR: number;
INUSE_ATTRIBUTE_ERR: number;
INVALID_ACCESS_ERR: number;
INVALID_CHARACTER_ERR: number;
INVALID_MODIFICATION_ERR: number;
INVALID_NODE_TYPE_ERR: number;
INVALID_STATE_ERR: number;
NAMESPACE_ERR: number;
NETWORK_ERR: number;
NOT_FOUND_ERR: number;
NOT_SUPPORTED_ERR: number;
NO_DATA_ALLOWED_ERR: number;
NO_MODIFICATION_ALLOWED_ERR: number;
PARSE_ERR: number;
QUOTA_EXCEEDED_ERR: number;
SECURITY_ERR: number;
SERIALIZE_ERR: number;
SYNTAX_ERR: number;
TIMEOUT_ERR: number;
TYPE_MISMATCH_ERR: number;
URL_MISMATCH_ERR: number;
VALIDATION_ERR: number;
WRONG_DOCUMENT_ERR: number;
}
interface DOMImplementation {
createDocument(namespaceURI: string, qualifiedName: string, doctype: DocumentType): Document;
createDocumentType(qualifiedName: string, publicId: string, systemId: string): DocumentType;
createHTMLDocument(title: string): Document;
hasFeature(feature: string, version: string): boolean;
}
declare var DOMImplementation: {
prototype: DOMImplementation;
new(): DOMImplementation;
}
interface DOMParser {
parseFromString(source: string, mimeType: string): Document;
}
declare var DOMParser: {
prototype: DOMParser;
new(): DOMParser;
}
interface DOMSettableTokenList extends DOMTokenList {
value: string;
}
declare var DOMSettableTokenList: {
prototype: DOMSettableTokenList;
new(): DOMSettableTokenList;
}
interface DOMStringList {
length: number;
contains(str: string): boolean;
item(index: number): string;
[index: number]: string;
}
declare var DOMStringList: {
prototype: DOMStringList;
new(): DOMStringList;
}
interface DOMStringMap {
[name: string]: string;
}
declare var DOMStringMap: {
prototype: DOMStringMap;
new(): DOMStringMap;
}
interface DOMTokenList {
length: number;
add(...token: string[]): void;
contains(token: string): boolean;
item(index: number): string;
remove(...token: string[]): void;
toString(): string;
toggle(token: string, force?: boolean): boolean;
[index: number]: string;
}
declare var DOMTokenList: {
prototype: DOMTokenList;
new(): DOMTokenList;
}
interface DataCue extends TextTrackCue {
data: ArrayBuffer;
}
declare var DataCue: {
prototype: DataCue;
new(): DataCue;
}
interface DataTransfer {
dropEffect: string;
effectAllowed: string;
files: FileList;
items: DataTransferItemList;
types: DOMStringList;
clearData(format?: string): boolean;
getData(format: string): string;
setData(format: string, data: string): boolean;
}
declare var DataTransfer: {
prototype: DataTransfer;
new(): DataTransfer;
}
interface DataTransferItem {
kind: string;
type: string;
getAsFile(): File;
getAsString(_callback: FunctionStringCallback): void;
}
declare var DataTransferItem: {
prototype: DataTransferItem;
new(): DataTransferItem;
}
interface DataTransferItemList {
length: number;
add(data: File): DataTransferItem;
clear(): void;
item(index: number): File;
remove(index: number): void;
[index: number]: File;
}
declare var DataTransferItemList: {
prototype: DataTransferItemList;
new(): DataTransferItemList;
}
interface DeferredPermissionRequest {
id: number;
type: string;
uri: string;
allow(): void;
deny(): void;
}
declare var DeferredPermissionRequest: {
prototype: DeferredPermissionRequest;
new(): DeferredPermissionRequest;
}
interface DelayNode extends AudioNode {
delayTime: AudioParam;
}
declare var DelayNode: {
prototype: DelayNode;
new(): DelayNode;
}
interface DeviceAcceleration {
x: number;
y: number;
z: number;
}
declare var DeviceAcceleration: {
prototype: DeviceAcceleration;
new(): DeviceAcceleration;
}
interface DeviceMotionEvent extends Event {
acceleration: DeviceAcceleration;
accelerationIncludingGravity: DeviceAcceleration;
interval: number;
rotationRate: DeviceRotationRate;
initDeviceMotionEvent(type: string, bubbles: boolean, cancelable: boolean, acceleration: DeviceAccelerationDict, accelerationIncludingGravity: DeviceAccelerationDict, rotationRate: DeviceRotationRateDict, interval: number): void;
}
declare var DeviceMotionEvent: {
prototype: DeviceMotionEvent;
new(): DeviceMotionEvent;
}
interface DeviceOrientationEvent extends Event {
absolute: boolean;
alpha: number;
beta: number;
gamma: number;
initDeviceOrientationEvent(type: string, bubbles: boolean, cancelable: boolean, alpha: number, beta: number, gamma: number, absolute: boolean): void;
}
declare var DeviceOrientationEvent: {
prototype: DeviceOrientationEvent;
new(): DeviceOrientationEvent;
}
interface DeviceRotationRate {
alpha: number;
beta: number;
gamma: number;
}
declare var DeviceRotationRate: {
prototype: DeviceRotationRate;
new(): DeviceRotationRate;
}
interface Document extends Node, GlobalEventHandlers, NodeSelector, DocumentEvent {
/**
* Sets or gets the URL for the current document.
*/
URL: string;
/**
* Gets the URL for the document, stripped of any character encoding.
*/
URLUnencoded: string;
/**
* Gets the object that has the focus when the parent document has focus.
*/
activeElement: Element;
/**
* Sets or gets the color of all active links in the document.
*/
alinkColor: string;
/**
* Returns a reference to the collection of elements contained by the object.
*/
all: HTMLCollection;
/**
* Retrieves a collection of all a objects that have a name and/or id property. Objects in this collection are in HTML source order.
*/
anchors: HTMLCollection;
/**
* Retrieves a collection of all applet objects in the document.
*/
applets: HTMLCollection;
/**
* Deprecated. Sets or retrieves a value that indicates the background color behind the object.
*/
bgColor: string;
/**
* Specifies the beginning and end of the document body.
*/
body: HTMLElement;
characterSet: string;
/**
* Gets or sets the character set used to encode the object.
*/
charset: string;
/**
* Gets a value that indicates whether standards-compliant mode is switched on for the object.
*/
compatMode: string;
cookie: string;
/**
* Gets the default character set from the current regional language settings.
*/
defaultCharset: string;
defaultView: Window;
/**
* Sets or gets a value that indicates whether the document can be edited.
*/
designMode: string;
/**
* Sets or retrieves a value that indicates the reading order of the object.
*/
dir: string;
/**
* Gets an object representing the document type declaration associated with the current document.
*/
doctype: DocumentType;
/**
* Gets a reference to the root node of the document.
*/
documentElement: HTMLElement;
/**
* Sets or gets the security domain of the document.
*/
domain: string;
/**
* Retrieves a collection of all embed objects in the document.
*/
embeds: HTMLCollection;
/**
* Sets or gets the foreground (text) color of the document.
*/
fgColor: string;
/**
* Retrieves a collection, in source order, of all form objects in the document.
*/
forms: HTMLCollection;
fullscreenElement: Element;
fullscreenEnabled: boolean;
head: HTMLHeadElement;
hidden: boolean;
/**
* Retrieves a collection, in source order, of img objects in the document.
*/
images: HTMLCollection;
/**
* Gets the implementation object of the current document.
*/
implementation: DOMImplementation;
/**
* Returns the character encoding used to create the webpage that is loaded into the document object.
*/
inputEncoding: string;
/**
* Gets the date that the page was last modified, if the page supplies one.
*/
lastModified: string;
/**
* Sets or gets the color of the document links.
*/
linkColor: string;
/**
* Retrieves a collection of all a objects that specify the href property and all area objects in the document.
*/
links: HTMLCollection;
/**
* Contains information about the current URL.
*/
location: Location;
media: string;
msCSSOMElementFloatMetrics: boolean;
msCapsLockWarningOff: boolean;
msHidden: boolean;
msVisibilityState: string;
/**
* Fires when the user aborts the download.
* @param ev The event.
*/
onabort: (ev: Event) => any;
/**
* Fires when the object is set as the active element.
* @param ev The event.
*/
onactivate: (ev: UIEvent) => any;
/**
* Fires immediately before the object is set as the active element.
* @param ev The event.
*/
onbeforeactivate: (ev: UIEvent) => any;
/**
* Fires immediately before the activeElement is changed from the current object to another object in the parent document.
* @param ev The event.
*/
onbeforedeactivate: (ev: UIEvent) => any;
/**
* Fires when the object loses the input focus.
* @param ev The focus event.
*/
onblur: (ev: FocusEvent) => any;
/**
* Occurs when playback is possible, but would require further buffering.
* @param ev The event.
*/
oncanplay: (ev: Event) => any;
oncanplaythrough: (ev: Event) => any;
/**
* Fires when the contents of the object or selection have changed.
* @param ev The event.
*/
onchange: (ev: Event) => any;
/**
* Fires when the user clicks the left mouse button on the object
* @param ev The mouse event.
*/
onclick: (ev: MouseEvent) => any;
/**
* Fires when the user clicks the right mouse button in the client area, opening the context menu.
* @param ev The mouse event.
*/
oncontextmenu: (ev: PointerEvent) => any;
/**
* Fires when the user double-clicks the object.
* @param ev The mouse event.
*/
ondblclick: (ev: MouseEvent) => any;
/**
* Fires when the activeElement is changed from the current object to another object in the parent document.
* @param ev The UI Event
*/
ondeactivate: (ev: UIEvent) => any;
/**
* Fires on the source object continuously during a drag operation.
* @param ev The event.
*/
ondrag: (ev: DragEvent) => any;
/**
* Fires on the source object when the user releases the mouse at the close of a drag operation.
* @param ev The event.
*/
ondragend: (ev: DragEvent) => any;
/**
* Fires on the target element when the user drags the object to a valid drop target.
* @param ev The drag event.
*/
ondragenter: (ev: DragEvent) => any;
/**
* Fires on the target object when the user moves the mouse out of a valid drop target during a drag operation.
* @param ev The drag event.
*/
ondragleave: (ev: DragEvent) => any;
/**
* Fires on the target element continuously while the user drags the object over a valid drop target.
* @param ev The event.
*/
ondragover: (ev: DragEvent) => any;
/**
* Fires on the source object when the user starts to drag a text selection or selected object.
* @param ev The event.
*/
ondragstart: (ev: DragEvent) => any;
ondrop: (ev: DragEvent) => any;
/**
* Occurs when the duration attribute is updated.
* @param ev The event.
*/
ondurationchange: (ev: Event) => any;
/**
* Occurs when the media element is reset to its initial state.
* @param ev The event.
*/
onemptied: (ev: Event) => any;
/**
* Occurs when the end of playback is reached.
* @param ev The event
*/
onended: (ev: Event) => any;
/**
* Fires when an error occurs during object loading.
* @param ev The event.
*/
onerror: (ev: Event) => any;
/**
* Fires when the object receives focus.
* @param ev The event.
*/
onfocus: (ev: FocusEvent) => any;
onfullscreenchange: (ev: Event) => any;
onfullscreenerror: (ev: Event) => any;
oninput: (ev: Event) => any;
/**
* Fires when the user presses a key.
* @param ev The keyboard event
*/
onkeydown: (ev: KeyboardEvent) => any;
/**
* Fires when the user presses an alphanumeric key.
* @param ev The event.
*/
onkeypress: (ev: KeyboardEvent) => any;
/**
* Fires when the user releases a key.
* @param ev The keyboard event
*/
onkeyup: (ev: KeyboardEvent) => any;
/**
* Fires immediately after the browser loads the object.
* @param ev The event.
*/
onload: (ev: Event) => any;
/**
* Occurs when media data is loaded at the current playback position.
* @param ev The event.
*/
onloadeddata: (ev: Event) => any;
/**
* Occurs when the duration and dimensions of the media have been determined.
* @param ev The event.
*/
onloadedmetadata: (ev: Event) => any;
/**
* Occurs when Internet Explorer begins looking for media data.
* @param ev The event.
*/
onloadstart: (ev: Event) => any;
/**
* Fires when the user clicks the object with either mouse button.
* @param ev The mouse event.
*/
onmousedown: (ev: MouseEvent) => any;
/**
* Fires when the user moves the mouse over the object.
* @param ev The mouse event.
*/
onmousemove: (ev: MouseEvent) => any;
/**
* Fires when the user moves the mouse pointer outside the boundaries of the object.
* @param ev The mouse event.
*/
onmouseout: (ev: MouseEvent) => any;
/**
* Fires when the user moves the mouse pointer into the object.
* @param ev The mouse event.
*/
onmouseover: (ev: MouseEvent) => any;
/**
* Fires when the user releases a mouse button while the mouse is over the object.
* @param ev The mouse event.
*/
onmouseup: (ev: MouseEvent) => any;
/**
* Fires when the wheel button is rotated.
* @param ev The mouse event
*/
onmousewheel: (ev: MouseWheelEvent) => any;
onmscontentzoom: (ev: UIEvent) => any;
onmsgesturechange: (ev: MSGestureEvent) => any;
onmsgesturedoubletap: (ev: MSGestureEvent) => any;
onmsgestureend: (ev: MSGestureEvent) => any;
onmsgesturehold: (ev: MSGestureEvent) => any;
onmsgesturestart: (ev: MSGestureEvent) => any;
onmsgesturetap: (ev: MSGestureEvent) => any;
onmsinertiastart: (ev: MSGestureEvent) => any;
onmsmanipulationstatechanged: (ev: MSManipulationEvent) => any;
onmspointercancel: (ev: MSPointerEvent) => any;
onmspointerdown: (ev: MSPointerEvent) => any;
onmspointerenter: (ev: MSPointerEvent) => any;
onmspointerleave: (ev: MSPointerEvent) => any;
onmspointermove: (ev: MSPointerEvent) => any;
onmspointerout: (ev: MSPointerEvent) => any;
onmspointerover: (ev: MSPointerEvent) => any;
onmspointerup: (ev: MSPointerEvent) => any;
/**
* Occurs when an item is removed from a Jump List of a webpage running in Site Mode.
* @param ev The event.
*/
onmssitemodejumplistitemremoved: (ev: MSSiteModeEvent) => any;
/**
* Occurs when a user clicks a button in a Thumbnail Toolbar of a webpage running in Site Mode.
* @param ev The event.
*/
onmsthumbnailclick: (ev: MSSiteModeEvent) => any;
/**
* Occurs when playback is paused.
* @param ev The event.
*/
onpause: (ev: Event) => any;
/**
* Occurs when the play method is requested.
* @param ev The event.
*/
onplay: (ev: Event) => any;
/**
* Occurs when the audio or video has started playing.
* @param ev The event.
*/
onplaying: (ev: Event) => any;
onpointerlockchange: (ev: Event) => any;
onpointerlockerror: (ev: Event) => any;
/**
* Occurs to indicate progress while downloading media data.
* @param ev The event.
*/
onprogress: (ev: ProgressEvent) => any;
/**
* Occurs when the playback rate is increased or decreased.
* @param ev The event.
*/
onratechange: (ev: Event) => any;
/**
* Fires when the state of the object has changed.
* @param ev The event
*/
onreadystatechange: (ev: ProgressEvent) => any;
/**
* Fires when the user resets a form.
* @param ev The event.
*/
onreset: (ev: Event) => any;
/**
* Fires when the user repositions the scroll box in the scroll bar on the object.
* @param ev The event.
*/
onscroll: (ev: UIEvent) => any;
/**
* Occurs when the seek operation ends.
* @param ev The event.
*/
onseeked: (ev: Event) => any;
/**
* Occurs when the current playback position is moved.
* @param ev The event.
*/
onseeking: (ev: Event) => any;
/**
* Fires when the current selection changes.
* @param ev The event.
*/
onselect: (ev: UIEvent) => any;
onselectstart: (ev: Event) => any;
/**
* Occurs when the download has stopped.
* @param ev The event.
*/
onstalled: (ev: Event) => any;
/**
* Fires when the user clicks the Stop button or leaves the Web page.
* @param ev The event.
*/
onstop: (ev: Event) => any;
onsubmit: (ev: Event) => any;
/**
* Occurs if the load operation has been intentionally halted.
* @param ev The event.
*/
onsuspend: (ev: Event) => any;
/**
* Occurs to indicate the current playback position.
* @param ev The event.
*/
ontimeupdate: (ev: Event) => any;
ontouchcancel: (ev: TouchEvent) => any;
ontouchend: (ev: TouchEvent) => any;
ontouchmove: (ev: TouchEvent) => any;
ontouchstart: (ev: TouchEvent) => any;
/**
* Occurs when the volume is changed, or playback is muted or unmuted.
* @param ev The event.
*/
onvolumechange: (ev: Event) => any;
/**
* Occurs when playback stops because the next frame of a video resource is not available.
* @param ev The event.
*/
onwaiting: (ev: Event) => any;
onwebkitfullscreenchange: (ev: Event) => any;
onwebkitfullscreenerror: (ev: Event) => any;
plugins: HTMLCollection;
pointerLockElement: Element;
/**
* Retrieves a value that indicates the current state of the object.
*/
readyState: string;
/**
* Gets the URL of the location that referred the user to the current page.
*/
referrer: string;
/**
* Gets the root svg element in the document hierarchy.
*/
rootElement: SVGSVGElement;
/**
* Retrieves a collection of all script objects in the document.
*/
scripts: HTMLCollection;
security: string;
/**
* Retrieves a collection of styleSheet objects representing the style sheets that correspond to each instance of a link or style object in the document.
*/
styleSheets: StyleSheetList;
/**
* Contains the title of the document.
*/
title: string;
visibilityState: string;
/**
* Sets or gets the color of the links that the user has visited.
*/
vlinkColor: string;
webkitCurrentFullScreenElement: Element;
webkitFullscreenElement: Element;
webkitFullscreenEnabled: boolean;
webkitIsFullScreen: boolean;
xmlEncoding: string;
xmlStandalone: boolean;
/**
* Gets or sets the version attribute specified in the declaration of an XML document.
*/
xmlVersion: string;
adoptNode(source: Node): Node;
captureEvents(): void;
clear(): void;
/**
* Closes an output stream and forces the sent data to display.
*/
close(): void;
/**
* Creates an attribute object with a specified name.
* @param name String that sets the attribute object's name.
*/
createAttribute(name: string): Attr;
createAttributeNS(namespaceURI: string, qualifiedName: string): Attr;
createCDATASection(data: string): CDATASection;
/**
* Creates a comment object with the specified data.
* @param data Sets the comment object's data.
*/
createComment(data: string): Comment;
/**
* Creates a new document.
*/
createDocumentFragment(): DocumentFragment;
/**
* Creates an instance of the element for the specified tag.
* @param tagName The name of an element.
*/
createElement(tagName: "a"): HTMLAnchorElement;
createElement(tagName: "abbr"): HTMLPhraseElement;
createElement(tagName: "acronym"): HTMLPhraseElement;
createElement(tagName: "address"): HTMLBlockElement;
createElement(tagName: "applet"): HTMLAppletElement;
createElement(tagName: "area"): HTMLAreaElement;
createElement(tagName: "audio"): HTMLAudioElement;
createElement(tagName: "b"): HTMLPhraseElement;
createElement(tagName: "base"): HTMLBaseElement;
createElement(tagName: "basefont"): HTMLBaseFontElement;
createElement(tagName: "bdo"): HTMLPhraseElement;
createElement(tagName: "big"): HTMLPhraseElement;
createElement(tagName: "blockquote"): HTMLBlockElement;
createElement(tagName: "body"): HTMLBodyElement;
createElement(tagName: "br"): HTMLBRElement;
createElement(tagName: "button"): HTMLButtonElement;
createElement(tagName: "canvas"): HTMLCanvasElement;
createElement(tagName: "caption"): HTMLTableCaptionElement;
createElement(tagName: "center"): HTMLBlockElement;
createElement(tagName: "cite"): HTMLPhraseElement;
createElement(tagName: "code"): HTMLPhraseElement;
createElement(tagName: "col"): HTMLTableColElement;
createElement(tagName: "colgroup"): HTMLTableColElement;
createElement(tagName: "datalist"): HTMLDataListElement;
createElement(tagName: "dd"): HTMLDDElement;
createElement(tagName: "del"): HTMLModElement;
createElement(tagName: "dfn"): HTMLPhraseElement;
createElement(tagName: "dir"): HTMLDirectoryElement;
createElement(tagName: "div"): HTMLDivElement;
createElement(tagName: "dl"): HTMLDListElement;
createElement(tagName: "dt"): HTMLDTElement;
createElement(tagName: "em"): HTMLPhraseElement;
createElement(tagName: "embed"): HTMLEmbedElement;
createElement(tagName: "fieldset"): HTMLFieldSetElement;
createElement(tagName: "font"): HTMLFontElement;
createElement(tagName: "form"): HTMLFormElement;
createElement(tagName: "frame"): HTMLFrameElement;
createElement(tagName: "frameset"): HTMLFrameSetElement;
createElement(tagName: "h1"): HTMLHeadingElement;
createElement(tagName: "h2"): HTMLHeadingElement;
createElement(tagName: "h3"): HTMLHeadingElement;
createElement(tagName: "h4"): HTMLHeadingElement;
createElement(tagName: "h5"): HTMLHeadingElement;
createElement(tagName: "h6"): HTMLHeadingElement;
createElement(tagName: "head"): HTMLHeadElement;
createElement(tagName: "hr"): HTMLHRElement;
createElement(tagName: "html"): HTMLHtmlElement;
createElement(tagName: "i"): HTMLPhraseElement;
createElement(tagName: "iframe"): HTMLIFrameElement;
createElement(tagName: "img"): HTMLImageElement;
createElement(tagName: "input"): HTMLInputElement;
createElement(tagName: "ins"): HTMLModElement;
createElement(tagName: "isindex"): HTMLIsIndexElement;
createElement(tagName: "kbd"): HTMLPhraseElement;
createElement(tagName: "keygen"): HTMLBlockElement;
createElement(tagName: "label"): HTMLLabelElement;
createElement(tagName: "legend"): HTMLLegendElement;
createElement(tagName: "li"): HTMLLIElement;
createElement(tagName: "link"): HTMLLinkElement;
createElement(tagName: "listing"): HTMLBlockElement;
createElement(tagName: "map"): HTMLMapElement;
createElement(tagName: "marquee"): HTMLMarqueeElement;
createElement(tagName: "menu"): HTMLMenuElement;
createElement(tagName: "meta"): HTMLMetaElement;
createElement(tagName: "nextid"): HTMLNextIdElement;
createElement(tagName: "nobr"): HTMLPhraseElement;
createElement(tagName: "object"): HTMLObjectElement;
createElement(tagName: "ol"): HTMLOListElement;
createElement(tagName: "optgroup"): HTMLOptGroupElement;
createElement(tagName: "option"): HTMLOptionElement;
createElement(tagName: "p"): HTMLParagraphElement;
createElement(tagName: "param"): HTMLParamElement;
createElement(tagName: "plaintext"): HTMLBlockElement;
createElement(tagName: "pre"): HTMLPreElement;
createElement(tagName: "progress"): HTMLProgressElement;
createElement(tagName: "q"): HTMLQuoteElement;
createElement(tagName: "rt"): HTMLPhraseElement;
createElement(tagName: "ruby"): HTMLPhraseElement;
createElement(tagName: "s"): HTMLPhraseElement;
createElement(tagName: "samp"): HTMLPhraseElement;
createElement(tagName: "script"): HTMLScriptElement;
createElement(tagName: "select"): HTMLSelectElement;
createElement(tagName: "small"): HTMLPhraseElement;
createElement(tagName: "source"): HTMLSourceElement;
createElement(tagName: "span"): HTMLSpanElement;
createElement(tagName: "strike"): HTMLPhraseElement;
createElement(tagName: "strong"): HTMLPhraseElement;
createElement(tagName: "style"): HTMLStyleElement;
createElement(tagName: "sub"): HTMLPhraseElement;
createElement(tagName: "sup"): HTMLPhraseElement;
createElement(tagName: "table"): HTMLTableElement;
createElement(tagName: "tbody"): HTMLTableSectionElement;
createElement(tagName: "td"): HTMLTableDataCellElement;
createElement(tagName: "textarea"): HTMLTextAreaElement;
createElement(tagName: "tfoot"): HTMLTableSectionElement;
createElement(tagName: "th"): HTMLTableHeaderCellElement;
createElement(tagName: "thead"): HTMLTableSectionElement;
createElement(tagName: "title"): HTMLTitleElement;
createElement(tagName: "tr"): HTMLTableRowElement;
createElement(tagName: "track"): HTMLTrackElement;
createElement(tagName: "tt"): HTMLPhraseElement;
createElement(tagName: "u"): HTMLPhraseElement;
createElement(tagName: "ul"): HTMLUListElement;
createElement(tagName: "var"): HTMLPhraseElement;
createElement(tagName: "video"): HTMLVideoElement;
createElement(tagName: "x-ms-webview"): MSHTMLWebViewElement;
createElement(tagName: "xmp"): HTMLBlockElement;
createElement(tagName: string): HTMLElement;
createElementNS(namespaceURI: string, qualifiedName: string): Element;
createExpression(expression: string, resolver: XPathNSResolver): XPathExpression;
createNSResolver(nodeResolver: Node): XPathNSResolver;
/**
* Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.
* @param root The root element or node to start traversing on.
* @param whatToShow The type of nodes or elements to appear in the node list
* @param filter A custom NodeFilter function to use. For more information, see filter. Use null for no filter.
* @param entityReferenceExpansion A flag that specifies whether entity reference nodes are expanded.
*/
createNodeIterator(root: Node, whatToShow?: number, filter?: NodeFilter, entityReferenceExpansion?: boolean): NodeIterator;
createProcessingInstruction(target: string, data: string): ProcessingInstruction;
/**
* Returns an empty range object that has both of its boundary points positioned at the beginning of the document.
*/
createRange(): Range;
/**
* Creates a text string from the specified value.
* @param data String that specifies the nodeValue property of the text node.
*/
createTextNode(data: string): Text;
createTouch(view: any, target: EventTarget, identifier: number, pageX: number, pageY: number, screenX: number, screenY: number): Touch;
createTouchList(...touches: Touch[]): TouchList;
/**
* Creates a TreeWalker object that you can use to traverse filtered lists of nodes or elements in a document.
* @param root The root element or node to start traversing on.
* @param whatToShow The type of nodes or elements to appear in the node list. For more information, see whatToShow.
* @param filter A custom NodeFilter function to use.
* @param entityReferenceExpansion A flag that specifies whether entity reference nodes are expanded.
*/
createTreeWalker(root: Node, whatToShow?: number, filter?: NodeFilter, entityReferenceExpansion?: boolean): TreeWalker;
/**
* Returns the element for the specified x coordinate and the specified y coordinate.
* @param x The x-offset
* @param y The y-offset
*/
elementFromPoint(x: number, y: number): Element;
evaluate(expression: string, contextNode: Node, resolver: XPathNSResolver, type: number, result: XPathResult): XPathResult;
/**
* Executes a command on the current document, current selection, or the given range.
* @param commandId String that specifies the command to execute. This command can be any of the command identifiers that can be executed in script.
* @param showUI Display the user interface, defaults to false.
* @param value Value to assign.
*/
execCommand(commandId: string, showUI?: boolean, value?: any): boolean;
/**
* Displays help information for the given command identifier.
* @param commandId Displays help information for the given command identifier.
*/
execCommandShowHelp(commandId: string): boolean;
exitFullscreen(): void;
exitPointerLock(): void;
/**
* Causes the element to receive the focus and executes the code specified by the onfocus event.
*/
focus(): void;
/**
* Returns a reference to the first object with the specified value of the ID or NAME attribute.
* @param elementId String that specifies the ID value. Case-insensitive.
*/
getElementById(elementId: string): HTMLElement;
getElementsByClassName(classNames: string): NodeList;
/**
* Gets a collection of objects based on the value of the NAME or ID attribute.
* @param elementName Gets a collection of objects based on the value of the NAME or ID attribute.
*/
getElementsByName(elementName: string): NodeList;
/**
* Retrieves a collection of objects based on the specified element name.
* @param name Specifies the name of an element.
*/
getElementsByTagName(tagname: "a"): NodeListOf<HTMLAnchorElement>;
getElementsByTagName(tagname: "abbr"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(tagname: "acronym"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(tagname: "address"): NodeListOf<HTMLBlockElement>;
getElementsByTagName(tagname: "applet"): NodeListOf<HTMLAppletElement>;
getElementsByTagName(tagname: "area"): NodeListOf<HTMLAreaElement>;
getElementsByTagName(tagname: "article"): NodeListOf<HTMLElement>;
getElementsByTagName(tagname: "aside"): NodeListOf<HTMLElement>;
getElementsByTagName(tagname: "audio"): NodeListOf<HTMLAudioElement>;
getElementsByTagName(tagname: "b"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(tagname: "base"): NodeListOf<HTMLBaseElement>;
getElementsByTagName(tagname: "basefont"): NodeListOf<HTMLBaseFontElement>;
getElementsByTagName(tagname: "bdo"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(tagname: "big"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(tagname: "blockquote"): NodeListOf<HTMLBlockElement>;
getElementsByTagName(tagname: "body"): NodeListOf<HTMLBodyElement>;
getElementsByTagName(tagname: "br"): NodeListOf<HTMLBRElement>;
getElementsByTagName(tagname: "button"): NodeListOf<HTMLButtonElement>;
getElementsByTagName(tagname: "canvas"): NodeListOf<HTMLCanvasElement>;
getElementsByTagName(tagname: "caption"): NodeListOf<HTMLTableCaptionElement>;
getElementsByTagName(tagname: "center"): NodeListOf<HTMLBlockElement>;
getElementsByTagName(tagname: "circle"): NodeListOf<SVGCircleElement>;
getElementsByTagName(tagname: "cite"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(tagname: "clippath"): NodeListOf<SVGClipPathElement>;
getElementsByTagName(tagname: "code"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(tagname: "col"): NodeListOf<HTMLTableColElement>;
getElementsByTagName(tagname: "colgroup"): NodeListOf<HTMLTableColElement>;
getElementsByTagName(tagname: "datalist"): NodeListOf<HTMLDataListElement>;
getElementsByTagName(tagname: "dd"): NodeListOf<HTMLDDElement>;
getElementsByTagName(tagname: "defs"): NodeListOf<SVGDefsElement>;
getElementsByTagName(tagname: "del"): NodeListOf<HTMLModElement>;
getElementsByTagName(tagname: "desc"): NodeListOf<SVGDescElement>;
getElementsByTagName(tagname: "dfn"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(tagname: "dir"): NodeListOf<HTMLDirectoryElement>;
getElementsByTagName(tagname: "div"): NodeListOf<HTMLDivElement>;
getElementsByTagName(tagname: "dl"): NodeListOf<HTMLDListElement>;
getElementsByTagName(tagname: "dt"): NodeListOf<HTMLDTElement>;
getElementsByTagName(tagname: "ellipse"): NodeListOf<SVGEllipseElement>;
getElementsByTagName(tagname: "em"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(tagname: "embed"): NodeListOf<HTMLEmbedElement>;
getElementsByTagName(tagname: "feblend"): NodeListOf<SVGFEBlendElement>;
getElementsByTagName(tagname: "fecolormatrix"): NodeListOf<SVGFEColorMatrixElement>;
getElementsByTagName(tagname: "fecomponenttransfer"): NodeListOf<SVGFEComponentTransferElement>;
getElementsByTagName(tagname: "fecomposite"): NodeListOf<SVGFECompositeElement>;
getElementsByTagName(tagname: "feconvolvematrix"): NodeListOf<SVGFEConvolveMatrixElement>;
getElementsByTagName(tagname: "fediffuselighting"): NodeListOf<SVGFEDiffuseLightingElement>;
getElementsByTagName(tagname: "fedisplacementmap"): NodeListOf<SVGFEDisplacementMapElement>;
getElementsByTagName(tagname: "fedistantlight"): NodeListOf<SVGFEDistantLightElement>;
getElementsByTagName(tagname: "feflood"): NodeListOf<SVGFEFloodElement>;
getElementsByTagName(tagname: "fefunca"): NodeListOf<SVGFEFuncAElement>;
getElementsByTagName(tagname: "fefuncb"): NodeListOf<SVGFEFuncBElement>;
getElementsByTagName(tagname: "fefuncg"): NodeListOf<SVGFEFuncGElement>;
getElementsByTagName(tagname: "fefuncr"): NodeListOf<SVGFEFuncRElement>;
getElementsByTagName(tagname: "fegaussianblur"): NodeListOf<SVGFEGaussianBlurElement>;
getElementsByTagName(tagname: "feimage"): NodeListOf<SVGFEImageElement>;
getElementsByTagName(tagname: "femerge"): NodeListOf<SVGFEMergeElement>;
getElementsByTagName(tagname: "femergenode"): NodeListOf<SVGFEMergeNodeElement>;
getElementsByTagName(tagname: "femorphology"): NodeListOf<SVGFEMorphologyElement>;
getElementsByTagName(tagname: "feoffset"): NodeListOf<SVGFEOffsetElement>;
getElementsByTagName(tagname: "fepointlight"): NodeListOf<SVGFEPointLightElement>;
getElementsByTagName(tagname: "fespecularlighting"): NodeListOf<SVGFESpecularLightingElement>;
getElementsByTagName(tagname: "fespotlight"): NodeListOf<SVGFESpotLightElement>;
getElementsByTagName(tagname: "fetile"): NodeListOf<SVGFETileElement>;
getElementsByTagName(tagname: "feturbulence"): NodeListOf<SVGFETurbulenceElement>;
getElementsByTagName(tagname: "fieldset"): NodeListOf<HTMLFieldSetElement>;
getElementsByTagName(tagname: "figcaption"): NodeListOf<HTMLElement>;
getElementsByTagName(tagname: "figure"): NodeListOf<HTMLElement>;
getElementsByTagName(tagname: "filter"): NodeListOf<SVGFilterElement>;
getElementsByTagName(tagname: "font"): NodeListOf<HTMLFontElement>;
getElementsByTagName(tagname: "footer"): NodeListOf<HTMLElement>;
getElementsByTagName(tagname: "foreignobject"): NodeListOf<SVGForeignObjectElement>;
getElementsByTagName(tagname: "form"): NodeListOf<HTMLFormElement>;
getElementsByTagName(tagname: "frame"): NodeListOf<HTMLFrameElement>;
getElementsByTagName(tagname: "frameset"): NodeListOf<HTMLFrameSetElement>;
getElementsByTagName(tagname: "g"): NodeListOf<SVGGElement>;
getElementsByTagName(tagname: "h1"): NodeListOf<HTMLHeadingElement>;
getElementsByTagName(tagname: "h2"): NodeListOf<HTMLHeadingElement>;
getElementsByTagName(tagname: "h3"): NodeListOf<HTMLHeadingElement>;
getElementsByTagName(tagname: "h4"): NodeListOf<HTMLHeadingElement>;
getElementsByTagName(tagname: "h5"): NodeListOf<HTMLHeadingElement>;
getElementsByTagName(tagname: "h6"): NodeListOf<HTMLHeadingElement>;
getElementsByTagName(tagname: "head"): NodeListOf<HTMLHeadElement>;
getElementsByTagName(tagname: "header"): NodeListOf<HTMLElement>;
getElementsByTagName(tagname: "hgroup"): NodeListOf<HTMLElement>;
getElementsByTagName(tagname: "hr"): NodeListOf<HTMLHRElement>;
getElementsByTagName(tagname: "html"): NodeListOf<HTMLHtmlElement>;
getElementsByTagName(tagname: "i"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(tagname: "iframe"): NodeListOf<HTMLIFrameElement>;
getElementsByTagName(tagname: "image"): NodeListOf<SVGImageElement>;
getElementsByTagName(tagname: "img"): NodeListOf<HTMLImageElement>;
getElementsByTagName(tagname: "input"): NodeListOf<HTMLInputElement>;
getElementsByTagName(tagname: "ins"): NodeListOf<HTMLModElement>;
getElementsByTagName(tagname: "isindex"): NodeListOf<HTMLIsIndexElement>;
getElementsByTagName(tagname: "kbd"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(tagname: "keygen"): NodeListOf<HTMLBlockElement>;
getElementsByTagName(tagname: "label"): NodeListOf<HTMLLabelElement>;
getElementsByTagName(tagname: "legend"): NodeListOf<HTMLLegendElement>;
getElementsByTagName(tagname: "li"): NodeListOf<HTMLLIElement>;
getElementsByTagName(tagname: "line"): NodeListOf<SVGLineElement>;
getElementsByTagName(tagname: "lineargradient"): NodeListOf<SVGLinearGradientElement>;
getElementsByTagName(tagname: "link"): NodeListOf<HTMLLinkElement>;
getElementsByTagName(tagname: "listing"): NodeListOf<HTMLBlockElement>;
getElementsByTagName(tagname: "map"): NodeListOf<HTMLMapElement>;
getElementsByTagName(tagname: "mark"): NodeListOf<HTMLElement>;
getElementsByTagName(tagname: "marker"): NodeListOf<SVGMarkerElement>;
getElementsByTagName(tagname: "marquee"): NodeListOf<HTMLMarqueeElement>;
getElementsByTagName(tagname: "mask"): NodeListOf<SVGMaskElement>;
getElementsByTagName(tagname: "menu"): NodeListOf<HTMLMenuElement>;
getElementsByTagName(tagname: "meta"): NodeListOf<HTMLMetaElement>;
getElementsByTagName(tagname: "metadata"): NodeListOf<SVGMetadataElement>;
getElementsByTagName(tagname: "nav"): NodeListOf<HTMLElement>;
getElementsByTagName(tagname: "nextid"): NodeListOf<HTMLNextIdElement>;
getElementsByTagName(tagname: "nobr"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(tagname: "noframes"): NodeListOf<HTMLElement>;
getElementsByTagName(tagname: "noscript"): NodeListOf<HTMLElement>;
getElementsByTagName(tagname: "object"): NodeListOf<HTMLObjectElement>;
getElementsByTagName(tagname: "ol"): NodeListOf<HTMLOListElement>;
getElementsByTagName(tagname: "optgroup"): NodeListOf<HTMLOptGroupElement>;
getElementsByTagName(tagname: "option"): NodeListOf<HTMLOptionElement>;
getElementsByTagName(tagname: "p"): NodeListOf<HTMLParagraphElement>;
getElementsByTagName(tagname: "param"): NodeListOf<HTMLParamElement>;
getElementsByTagName(tagname: "path"): NodeListOf<SVGPathElement>;
getElementsByTagName(tagname: "pattern"): NodeListOf<SVGPatternElement>;
getElementsByTagName(tagname: "plaintext"): NodeListOf<HTMLBlockElement>;
getElementsByTagName(tagname: "polygon"): NodeListOf<SVGPolygonElement>;
getElementsByTagName(tagname: "polyline"): NodeListOf<SVGPolylineElement>;
getElementsByTagName(tagname: "pre"): NodeListOf<HTMLPreElement>;
getElementsByTagName(tagname: "progress"): NodeListOf<HTMLProgressElement>;
getElementsByTagName(tagname: "q"): NodeListOf<HTMLQuoteElement>;
getElementsByTagName(tagname: "radialgradient"): NodeListOf<SVGRadialGradientElement>;
getElementsByTagName(tagname: "rect"): NodeListOf<SVGRectElement>;
getElementsByTagName(tagname: "rt"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(tagname: "ruby"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(tagname: "s"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(tagname: "samp"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(tagname: "script"): NodeListOf<HTMLScriptElement>;
getElementsByTagName(tagname: "section"): NodeListOf<HTMLElement>;
getElementsByTagName(tagname: "select"): NodeListOf<HTMLSelectElement>;
getElementsByTagName(tagname: "small"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(tagname: "source"): NodeListOf<HTMLSourceElement>;
getElementsByTagName(tagname: "span"): NodeListOf<HTMLSpanElement>;
getElementsByTagName(tagname: "stop"): NodeListOf<SVGStopElement>;
getElementsByTagName(tagname: "strike"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(tagname: "strong"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(tagname: "style"): NodeListOf<HTMLStyleElement>;
getElementsByTagName(tagname: "sub"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(tagname: "sup"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(tagname: "svg"): NodeListOf<SVGSVGElement>;
getElementsByTagName(tagname: "switch"): NodeListOf<SVGSwitchElement>;
getElementsByTagName(tagname: "symbol"): NodeListOf<SVGSymbolElement>;
getElementsByTagName(tagname: "table"): NodeListOf<HTMLTableElement>;
getElementsByTagName(tagname: "tbody"): NodeListOf<HTMLTableSectionElement>;
getElementsByTagName(tagname: "td"): NodeListOf<HTMLTableDataCellElement>;
getElementsByTagName(tagname: "text"): NodeListOf<SVGTextElement>;
getElementsByTagName(tagname: "textpath"): NodeListOf<SVGTextPathElement>;
getElementsByTagName(tagname: "textarea"): NodeListOf<HTMLTextAreaElement>;
getElementsByTagName(tagname: "tfoot"): NodeListOf<HTMLTableSectionElement>;
getElementsByTagName(tagname: "th"): NodeListOf<HTMLTableHeaderCellElement>;
getElementsByTagName(tagname: "thead"): NodeListOf<HTMLTableSectionElement>;
getElementsByTagName(tagname: "title"): NodeListOf<HTMLTitleElement>;
getElementsByTagName(tagname: "tr"): NodeListOf<HTMLTableRowElement>;
getElementsByTagName(tagname: "track"): NodeListOf<HTMLTrackElement>;
getElementsByTagName(tagname: "tspan"): NodeListOf<SVGTSpanElement>;
getElementsByTagName(tagname: "tt"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(tagname: "u"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(tagname: "ul"): NodeListOf<HTMLUListElement>;
getElementsByTagName(tagname: "use"): NodeListOf<SVGUseElement>;
getElementsByTagName(tagname: "var"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(tagname: "video"): NodeListOf<HTMLVideoElement>;
getElementsByTagName(tagname: "view"): NodeListOf<SVGViewElement>;
getElementsByTagName(tagname: "wbr"): NodeListOf<HTMLElement>;
getElementsByTagName(tagname: "x-ms-webview"): NodeListOf<MSHTMLWebViewElement>;
getElementsByTagName(tagname: "xmp"): NodeListOf<HTMLBlockElement>;
getElementsByTagName(tagname: string): NodeList;
getElementsByTagNameNS(namespaceURI: string, localName: string): NodeList;
/**
* Returns an object representing the current selection of the document that is loaded into the object displaying a webpage.
*/
getSelection(): Selection;
/**
* Gets a value indicating whether the object currently has focus.
*/
hasFocus(): boolean;
importNode(importedNode: Node, deep: boolean): Node;
msElementsFromPoint(x: number, y: number): NodeList;
msElementsFromRect(left: number, top: number, width: number, height: number): NodeList;
msGetPrintDocumentForNamedFlow(flowName: string): Document;
msSetPrintDocumentUriForNamedFlow(flowName: string, uri: string): void;
/**
* Opens a new window and loads a document specified by a given URL. Also, opens a new window that uses the url parameter and the name parameter to collect the output of the write method and the writeln method.
* @param url Specifies a MIME type for the document.
* @param name Specifies the name of the window. This name is used as the value for the TARGET attribute on a form or an anchor element.
* @param features Contains a list of items separated by commas. Each item consists of an option and a value, separated by an equals sign (for example, "fullscreen=yes, toolbar=yes"). The following values are supported.
* @param replace Specifies whether the existing entry for the document is replaced in the history list.
*/
open(url?: string, name?: string, features?: string, replace?: boolean): Document | Window;
/**
* Returns a Boolean value that indicates whether a specified command can be successfully executed using execCommand, given the current state of the document.
* @param commandId Specifies a command identifier.
*/
queryCommandEnabled(commandId: string): boolean;
/**
* Returns a Boolean value that indicates whether the specified command is in the indeterminate state.
* @param commandId String that specifies a command identifier.
*/
queryCommandIndeterm(commandId: string): boolean;
/**
* Returns a Boolean value that indicates the current state of the command.
* @param commandId String that specifies a command identifier.
*/
queryCommandState(commandId: string): boolean;
/**
* Returns a Boolean value that indicates whether the current command is supported on the current range.
* @param commandId Specifies a command identifier.
*/
queryCommandSupported(commandId: string): boolean;
/**
* Retrieves the string associated with a command.
* @param commandId String that contains the identifier of a command. This can be any command identifier given in the list of Command Identifiers.
*/
queryCommandText(commandId: string): string;
/**
* Returns the current value of the document, range, or current selection for the given command.
* @param commandId String that specifies a command identifier.
*/
queryCommandValue(commandId: string): string;
releaseEvents(): void;
/**
* Allows updating the print settings for the page.
*/
updateSettings(): void;
webkitCancelFullScreen(): void;
webkitExitFullscreen(): void;
/**
* Writes one or more HTML expressions to a document in the specified window.
* @param content Specifies the text and HTML tags to write.
*/
write(...content: string[]): void;
/**
* Writes one or more HTML expressions, followed by a carriage return, to a document in the specified window.
* @param content The text and HTML tags to write.
*/
writeln(...content: string[]): void;
addEventListener(type: "MSContentZoom", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSManipulationStateChanged", listener: (ev: MSManipulationEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "activate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforedeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "deactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
addEventListener(type: "fullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "fullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mssitemodejumplistitemremoved", listener: (ev: MSSiteModeEvent) => any, useCapture?: boolean): void;
addEventListener(type: "msthumbnailclick", listener: (ev: MSSiteModeEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerlockchange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "pointerlockerror", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "readystatechange", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "selectstart", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "stop", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var Document: {
prototype: Document;
new(): Document;
}
interface DocumentFragment extends Node, NodeSelector {
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var DocumentFragment: {
prototype: DocumentFragment;
new(): DocumentFragment;
}
interface DocumentType extends Node, ChildNode {
entities: NamedNodeMap;
internalSubset: string;
name: string;
notations: NamedNodeMap;
publicId: string;
systemId: string;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var DocumentType: {
prototype: DocumentType;
new(): DocumentType;
}
interface DragEvent extends MouseEvent {
dataTransfer: DataTransfer;
initDragEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, ctrlKeyArg: boolean, altKeyArg: boolean, shiftKeyArg: boolean, metaKeyArg: boolean, buttonArg: number, relatedTargetArg: EventTarget, dataTransferArg: DataTransfer): void;
msConvertURL(file: File, targetType: string, targetURL?: string): void;
}
declare var DragEvent: {
prototype: DragEvent;
new(): DragEvent;
}
interface DynamicsCompressorNode extends AudioNode {
attack: AudioParam;
knee: AudioParam;
ratio: AudioParam;
reduction: AudioParam;
release: AudioParam;
threshold: AudioParam;
}
declare var DynamicsCompressorNode: {
prototype: DynamicsCompressorNode;
new(): DynamicsCompressorNode;
}
interface EXT_texture_filter_anisotropic {
MAX_TEXTURE_MAX_ANISOTROPY_EXT: number;
TEXTURE_MAX_ANISOTROPY_EXT: number;
}
declare var EXT_texture_filter_anisotropic: {
prototype: EXT_texture_filter_anisotropic;
new(): EXT_texture_filter_anisotropic;
MAX_TEXTURE_MAX_ANISOTROPY_EXT: number;
TEXTURE_MAX_ANISOTROPY_EXT: number;
}
interface Element extends Node, GlobalEventHandlers, ElementTraversal, NodeSelector, ChildNode {
classList: DOMTokenList;
clientHeight: number;
clientLeft: number;
clientTop: number;
clientWidth: number;
msContentZoomFactor: number;
msRegionOverflow: string;
onariarequest: (ev: AriaRequestEvent) => any;
oncommand: (ev: CommandEvent) => any;
ongotpointercapture: (ev: PointerEvent) => any;
onlostpointercapture: (ev: PointerEvent) => any;
onmsgesturechange: (ev: MSGestureEvent) => any;
onmsgesturedoubletap: (ev: MSGestureEvent) => any;
onmsgestureend: (ev: MSGestureEvent) => any;
onmsgesturehold: (ev: MSGestureEvent) => any;
onmsgesturestart: (ev: MSGestureEvent) => any;
onmsgesturetap: (ev: MSGestureEvent) => any;
onmsgotpointercapture: (ev: MSPointerEvent) => any;
onmsinertiastart: (ev: MSGestureEvent) => any;
onmslostpointercapture: (ev: MSPointerEvent) => any;
onmspointercancel: (ev: MSPointerEvent) => any;
onmspointerdown: (ev: MSPointerEvent) => any;
onmspointerenter: (ev: MSPointerEvent) => any;
onmspointerleave: (ev: MSPointerEvent) => any;
onmspointermove: (ev: MSPointerEvent) => any;
onmspointerout: (ev: MSPointerEvent) => any;
onmspointerover: (ev: MSPointerEvent) => any;
onmspointerup: (ev: MSPointerEvent) => any;
ontouchcancel: (ev: TouchEvent) => any;
ontouchend: (ev: TouchEvent) => any;
ontouchmove: (ev: TouchEvent) => any;
ontouchstart: (ev: TouchEvent) => any;
onwebkitfullscreenchange: (ev: Event) => any;
onwebkitfullscreenerror: (ev: Event) => any;
scrollHeight: number;
scrollLeft: number;
scrollTop: number;
scrollWidth: number;
tagName: string;
getAttribute(name?: string): string;
getAttributeNS(namespaceURI: string, localName: string): string;
getAttributeNode(name: string): Attr;
getAttributeNodeNS(namespaceURI: string, localName: string): Attr;
getBoundingClientRect(): ClientRect;
getClientRects(): ClientRectList;
getElementsByTagName(name: "a"): NodeListOf<HTMLAnchorElement>;
getElementsByTagName(name: "abbr"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(name: "acronym"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(name: "address"): NodeListOf<HTMLBlockElement>;
getElementsByTagName(name: "applet"): NodeListOf<HTMLAppletElement>;
getElementsByTagName(name: "area"): NodeListOf<HTMLAreaElement>;
getElementsByTagName(name: "article"): NodeListOf<HTMLElement>;
getElementsByTagName(name: "aside"): NodeListOf<HTMLElement>;
getElementsByTagName(name: "audio"): NodeListOf<HTMLAudioElement>;
getElementsByTagName(name: "b"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(name: "base"): NodeListOf<HTMLBaseElement>;
getElementsByTagName(name: "basefont"): NodeListOf<HTMLBaseFontElement>;
getElementsByTagName(name: "bdo"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(name: "big"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(name: "blockquote"): NodeListOf<HTMLBlockElement>;
getElementsByTagName(name: "body"): NodeListOf<HTMLBodyElement>;
getElementsByTagName(name: "br"): NodeListOf<HTMLBRElement>;
getElementsByTagName(name: "button"): NodeListOf<HTMLButtonElement>;
getElementsByTagName(name: "canvas"): NodeListOf<HTMLCanvasElement>;
getElementsByTagName(name: "caption"): NodeListOf<HTMLTableCaptionElement>;
getElementsByTagName(name: "center"): NodeListOf<HTMLBlockElement>;
getElementsByTagName(name: "circle"): NodeListOf<SVGCircleElement>;
getElementsByTagName(name: "cite"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(name: "clippath"): NodeListOf<SVGClipPathElement>;
getElementsByTagName(name: "code"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(name: "col"): NodeListOf<HTMLTableColElement>;
getElementsByTagName(name: "colgroup"): NodeListOf<HTMLTableColElement>;
getElementsByTagName(name: "datalist"): NodeListOf<HTMLDataListElement>;
getElementsByTagName(name: "dd"): NodeListOf<HTMLDDElement>;
getElementsByTagName(name: "defs"): NodeListOf<SVGDefsElement>;
getElementsByTagName(name: "del"): NodeListOf<HTMLModElement>;
getElementsByTagName(name: "desc"): NodeListOf<SVGDescElement>;
getElementsByTagName(name: "dfn"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(name: "dir"): NodeListOf<HTMLDirectoryElement>;
getElementsByTagName(name: "div"): NodeListOf<HTMLDivElement>;
getElementsByTagName(name: "dl"): NodeListOf<HTMLDListElement>;
getElementsByTagName(name: "dt"): NodeListOf<HTMLDTElement>;
getElementsByTagName(name: "ellipse"): NodeListOf<SVGEllipseElement>;
getElementsByTagName(name: "em"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(name: "embed"): NodeListOf<HTMLEmbedElement>;
getElementsByTagName(name: "feblend"): NodeListOf<SVGFEBlendElement>;
getElementsByTagName(name: "fecolormatrix"): NodeListOf<SVGFEColorMatrixElement>;
getElementsByTagName(name: "fecomponenttransfer"): NodeListOf<SVGFEComponentTransferElement>;
getElementsByTagName(name: "fecomposite"): NodeListOf<SVGFECompositeElement>;
getElementsByTagName(name: "feconvolvematrix"): NodeListOf<SVGFEConvolveMatrixElement>;
getElementsByTagName(name: "fediffuselighting"): NodeListOf<SVGFEDiffuseLightingElement>;
getElementsByTagName(name: "fedisplacementmap"): NodeListOf<SVGFEDisplacementMapElement>;
getElementsByTagName(name: "fedistantlight"): NodeListOf<SVGFEDistantLightElement>;
getElementsByTagName(name: "feflood"): NodeListOf<SVGFEFloodElement>;
getElementsByTagName(name: "fefunca"): NodeListOf<SVGFEFuncAElement>;
getElementsByTagName(name: "fefuncb"): NodeListOf<SVGFEFuncBElement>;
getElementsByTagName(name: "fefuncg"): NodeListOf<SVGFEFuncGElement>;
getElementsByTagName(name: "fefuncr"): NodeListOf<SVGFEFuncRElement>;
getElementsByTagName(name: "fegaussianblur"): NodeListOf<SVGFEGaussianBlurElement>;
getElementsByTagName(name: "feimage"): NodeListOf<SVGFEImageElement>;
getElementsByTagName(name: "femerge"): NodeListOf<SVGFEMergeElement>;
getElementsByTagName(name: "femergenode"): NodeListOf<SVGFEMergeNodeElement>;
getElementsByTagName(name: "femorphology"): NodeListOf<SVGFEMorphologyElement>;
getElementsByTagName(name: "feoffset"): NodeListOf<SVGFEOffsetElement>;
getElementsByTagName(name: "fepointlight"): NodeListOf<SVGFEPointLightElement>;
getElementsByTagName(name: "fespecularlighting"): NodeListOf<SVGFESpecularLightingElement>;
getElementsByTagName(name: "fespotlight"): NodeListOf<SVGFESpotLightElement>;
getElementsByTagName(name: "fetile"): NodeListOf<SVGFETileElement>;
getElementsByTagName(name: "feturbulence"): NodeListOf<SVGFETurbulenceElement>;
getElementsByTagName(name: "fieldset"): NodeListOf<HTMLFieldSetElement>;
getElementsByTagName(name: "figcaption"): NodeListOf<HTMLElement>;
getElementsByTagName(name: "figure"): NodeListOf<HTMLElement>;
getElementsByTagName(name: "filter"): NodeListOf<SVGFilterElement>;
getElementsByTagName(name: "font"): NodeListOf<HTMLFontElement>;
getElementsByTagName(name: "footer"): NodeListOf<HTMLElement>;
getElementsByTagName(name: "foreignobject"): NodeListOf<SVGForeignObjectElement>;
getElementsByTagName(name: "form"): NodeListOf<HTMLFormElement>;
getElementsByTagName(name: "frame"): NodeListOf<HTMLFrameElement>;
getElementsByTagName(name: "frameset"): NodeListOf<HTMLFrameSetElement>;
getElementsByTagName(name: "g"): NodeListOf<SVGGElement>;
getElementsByTagName(name: "h1"): NodeListOf<HTMLHeadingElement>;
getElementsByTagName(name: "h2"): NodeListOf<HTMLHeadingElement>;
getElementsByTagName(name: "h3"): NodeListOf<HTMLHeadingElement>;
getElementsByTagName(name: "h4"): NodeListOf<HTMLHeadingElement>;
getElementsByTagName(name: "h5"): NodeListOf<HTMLHeadingElement>;
getElementsByTagName(name: "h6"): NodeListOf<HTMLHeadingElement>;
getElementsByTagName(name: "head"): NodeListOf<HTMLHeadElement>;
getElementsByTagName(name: "header"): NodeListOf<HTMLElement>;
getElementsByTagName(name: "hgroup"): NodeListOf<HTMLElement>;
getElementsByTagName(name: "hr"): NodeListOf<HTMLHRElement>;
getElementsByTagName(name: "html"): NodeListOf<HTMLHtmlElement>;
getElementsByTagName(name: "i"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(name: "iframe"): NodeListOf<HTMLIFrameElement>;
getElementsByTagName(name: "image"): NodeListOf<SVGImageElement>;
getElementsByTagName(name: "img"): NodeListOf<HTMLImageElement>;
getElementsByTagName(name: "input"): NodeListOf<HTMLInputElement>;
getElementsByTagName(name: "ins"): NodeListOf<HTMLModElement>;
getElementsByTagName(name: "isindex"): NodeListOf<HTMLIsIndexElement>;
getElementsByTagName(name: "kbd"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(name: "keygen"): NodeListOf<HTMLBlockElement>;
getElementsByTagName(name: "label"): NodeListOf<HTMLLabelElement>;
getElementsByTagName(name: "legend"): NodeListOf<HTMLLegendElement>;
getElementsByTagName(name: "li"): NodeListOf<HTMLLIElement>;
getElementsByTagName(name: "line"): NodeListOf<SVGLineElement>;
getElementsByTagName(name: "lineargradient"): NodeListOf<SVGLinearGradientElement>;
getElementsByTagName(name: "link"): NodeListOf<HTMLLinkElement>;
getElementsByTagName(name: "listing"): NodeListOf<HTMLBlockElement>;
getElementsByTagName(name: "map"): NodeListOf<HTMLMapElement>;
getElementsByTagName(name: "mark"): NodeListOf<HTMLElement>;
getElementsByTagName(name: "marker"): NodeListOf<SVGMarkerElement>;
getElementsByTagName(name: "marquee"): NodeListOf<HTMLMarqueeElement>;
getElementsByTagName(name: "mask"): NodeListOf<SVGMaskElement>;
getElementsByTagName(name: "menu"): NodeListOf<HTMLMenuElement>;
getElementsByTagName(name: "meta"): NodeListOf<HTMLMetaElement>;
getElementsByTagName(name: "metadata"): NodeListOf<SVGMetadataElement>;
getElementsByTagName(name: "nav"): NodeListOf<HTMLElement>;
getElementsByTagName(name: "nextid"): NodeListOf<HTMLNextIdElement>;
getElementsByTagName(name: "nobr"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(name: "noframes"): NodeListOf<HTMLElement>;
getElementsByTagName(name: "noscript"): NodeListOf<HTMLElement>;
getElementsByTagName(name: "object"): NodeListOf<HTMLObjectElement>;
getElementsByTagName(name: "ol"): NodeListOf<HTMLOListElement>;
getElementsByTagName(name: "optgroup"): NodeListOf<HTMLOptGroupElement>;
getElementsByTagName(name: "option"): NodeListOf<HTMLOptionElement>;
getElementsByTagName(name: "p"): NodeListOf<HTMLParagraphElement>;
getElementsByTagName(name: "param"): NodeListOf<HTMLParamElement>;
getElementsByTagName(name: "path"): NodeListOf<SVGPathElement>;
getElementsByTagName(name: "pattern"): NodeListOf<SVGPatternElement>;
getElementsByTagName(name: "plaintext"): NodeListOf<HTMLBlockElement>;
getElementsByTagName(name: "polygon"): NodeListOf<SVGPolygonElement>;
getElementsByTagName(name: "polyline"): NodeListOf<SVGPolylineElement>;
getElementsByTagName(name: "pre"): NodeListOf<HTMLPreElement>;
getElementsByTagName(name: "progress"): NodeListOf<HTMLProgressElement>;
getElementsByTagName(name: "q"): NodeListOf<HTMLQuoteElement>;
getElementsByTagName(name: "radialgradient"): NodeListOf<SVGRadialGradientElement>;
getElementsByTagName(name: "rect"): NodeListOf<SVGRectElement>;
getElementsByTagName(name: "rt"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(name: "ruby"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(name: "s"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(name: "samp"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(name: "script"): NodeListOf<HTMLScriptElement>;
getElementsByTagName(name: "section"): NodeListOf<HTMLElement>;
getElementsByTagName(name: "select"): NodeListOf<HTMLSelectElement>;
getElementsByTagName(name: "small"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(name: "source"): NodeListOf<HTMLSourceElement>;
getElementsByTagName(name: "span"): NodeListOf<HTMLSpanElement>;
getElementsByTagName(name: "stop"): NodeListOf<SVGStopElement>;
getElementsByTagName(name: "strike"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(name: "strong"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(name: "style"): NodeListOf<HTMLStyleElement>;
getElementsByTagName(name: "sub"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(name: "sup"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(name: "svg"): NodeListOf<SVGSVGElement>;
getElementsByTagName(name: "switch"): NodeListOf<SVGSwitchElement>;
getElementsByTagName(name: "symbol"): NodeListOf<SVGSymbolElement>;
getElementsByTagName(name: "table"): NodeListOf<HTMLTableElement>;
getElementsByTagName(name: "tbody"): NodeListOf<HTMLTableSectionElement>;
getElementsByTagName(name: "td"): NodeListOf<HTMLTableDataCellElement>;
getElementsByTagName(name: "text"): NodeListOf<SVGTextElement>;
getElementsByTagName(name: "textpath"): NodeListOf<SVGTextPathElement>;
getElementsByTagName(name: "textarea"): NodeListOf<HTMLTextAreaElement>;
getElementsByTagName(name: "tfoot"): NodeListOf<HTMLTableSectionElement>;
getElementsByTagName(name: "th"): NodeListOf<HTMLTableHeaderCellElement>;
getElementsByTagName(name: "thead"): NodeListOf<HTMLTableSectionElement>;
getElementsByTagName(name: "title"): NodeListOf<HTMLTitleElement>;
getElementsByTagName(name: "tr"): NodeListOf<HTMLTableRowElement>;
getElementsByTagName(name: "track"): NodeListOf<HTMLTrackElement>;
getElementsByTagName(name: "tspan"): NodeListOf<SVGTSpanElement>;
getElementsByTagName(name: "tt"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(name: "u"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(name: "ul"): NodeListOf<HTMLUListElement>;
getElementsByTagName(name: "use"): NodeListOf<SVGUseElement>;
getElementsByTagName(name: "var"): NodeListOf<HTMLPhraseElement>;
getElementsByTagName(name: "video"): NodeListOf<HTMLVideoElement>;
getElementsByTagName(name: "view"): NodeListOf<SVGViewElement>;
getElementsByTagName(name: "wbr"): NodeListOf<HTMLElement>;
getElementsByTagName(name: "x-ms-webview"): NodeListOf<MSHTMLWebViewElement>;
getElementsByTagName(name: "xmp"): NodeListOf<HTMLBlockElement>;
getElementsByTagName(name: string): NodeList;
getElementsByTagNameNS(namespaceURI: string, localName: string): NodeList;
hasAttribute(name: string): boolean;
hasAttributeNS(namespaceURI: string, localName: string): boolean;
msGetRegionContent(): MSRangeCollection;
msGetUntransformedBounds(): ClientRect;
msMatchesSelector(selectors: string): boolean;
msReleasePointerCapture(pointerId: number): void;
msSetPointerCapture(pointerId: number): void;
msZoomTo(args: MsZoomToOptions): void;
releasePointerCapture(pointerId: number): void;
removeAttribute(name?: string): void;
removeAttributeNS(namespaceURI: string, localName: string): void;
removeAttributeNode(oldAttr: Attr): Attr;
requestFullscreen(): void;
requestPointerLock(): void;
setAttribute(name?: string, value?: string): void;
setAttributeNS(namespaceURI: string, qualifiedName: string, value: string): void;
setAttributeNode(newAttr: Attr): Attr;
setAttributeNodeNS(newAttr: Attr): Attr;
setPointerCapture(pointerId: number): void;
webkitMatchesSelector(selectors: string): boolean;
webkitRequestFullScreen(): void;
webkitRequestFullscreen(): void;
addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var Element: {
prototype: Element;
new(): Element;
}
interface ErrorEvent extends Event {
colno: number;
error: any;
filename: string;
lineno: number;
message: string;
initErrorEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, messageArg: string, filenameArg: string, linenoArg: number): void;
}
declare var ErrorEvent: {
prototype: ErrorEvent;
new(): ErrorEvent;
}
interface Event {
bubbles: boolean;
cancelBubble: boolean;
cancelable: boolean;
currentTarget: EventTarget;
defaultPrevented: boolean;
eventPhase: number;
isTrusted: boolean;
returnValue: boolean;
srcElement: Element;
target: EventTarget;
timeStamp: number;
type: string;
initEvent(eventTypeArg: string, canBubbleArg: boolean, cancelableArg: boolean): void;
preventDefault(): void;
stopImmediatePropagation(): void;
stopPropagation(): void;
AT_TARGET: number;
BUBBLING_PHASE: number;
CAPTURING_PHASE: number;
}
declare var Event: {
prototype: Event;
new(type: string, eventInitDict?: EventInit): Event;
AT_TARGET: number;
BUBBLING_PHASE: number;
CAPTURING_PHASE: number;
}
interface EventTarget {
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
dispatchEvent(evt: Event): boolean;
removeEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var EventTarget: {
prototype: EventTarget;
new(): EventTarget;
}
interface External {
}
declare var External: {
prototype: External;
new(): External;
}
interface File extends Blob {
lastModifiedDate: any;
name: string;
}
declare var File: {
prototype: File;
new(): File;
}
interface FileList {
length: number;
item(index: number): File;
[index: number]: File;
}
declare var FileList: {
prototype: FileList;
new(): FileList;
}
interface FileReader extends EventTarget, MSBaseReader {
error: DOMError;
readAsArrayBuffer(blob: Blob): void;
readAsBinaryString(blob: Blob): void;
readAsDataURL(blob: Blob): void;
readAsText(blob: Blob, encoding?: string): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var FileReader: {
prototype: FileReader;
new(): FileReader;
}
interface FocusEvent extends UIEvent {
relatedTarget: EventTarget;
initFocusEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, relatedTargetArg: EventTarget): void;
}
declare var FocusEvent: {
prototype: FocusEvent;
new(typeArg: string, eventInitDict?: FocusEventInit): FocusEvent;
}
interface FormData {
append(name: any, value: any, blobName?: string): void;
}
declare var FormData: {
prototype: FormData;
new(): FormData;
}
interface GainNode extends AudioNode {
gain: AudioParam;
}
declare var GainNode: {
prototype: GainNode;
new(): GainNode;
}
interface Gamepad {
axes: number[];
buttons: GamepadButton[];
connected: boolean;
id: string;
index: number;
mapping: string;
timestamp: number;
}
declare var Gamepad: {
prototype: Gamepad;
new(): Gamepad;
}
interface GamepadButton {
pressed: boolean;
value: number;
}
declare var GamepadButton: {
prototype: GamepadButton;
new(): GamepadButton;
}
interface GamepadEvent extends Event {
gamepad: Gamepad;
}
declare var GamepadEvent: {
prototype: GamepadEvent;
new(): GamepadEvent;
}
interface Geolocation {
clearWatch(watchId: number): void;
getCurrentPosition(successCallback: PositionCallback, errorCallback?: PositionErrorCallback, options?: PositionOptions): void;
watchPosition(successCallback: PositionCallback, errorCallback?: PositionErrorCallback, options?: PositionOptions): number;
}
declare var Geolocation: {
prototype: Geolocation;
new(): Geolocation;
}
interface HTMLAllCollection extends HTMLCollection {
namedItem(name: string): Element;
}
declare var HTMLAllCollection: {
prototype: HTMLAllCollection;
new(): HTMLAllCollection;
}
interface HTMLAnchorElement extends HTMLElement {
Methods: string;
/**
* Sets or retrieves the character set used to encode the object.
*/
charset: string;
/**
* Sets or retrieves the coordinates of the object.
*/
coords: string;
/**
* Contains the anchor portion of the URL including the hash sign (#).
*/
hash: string;
/**
* Contains the hostname and port values of the URL.
*/
host: string;
/**
* Contains the hostname of a URL.
*/
hostname: string;
/**
* Sets or retrieves a destination URL or an anchor point.
*/
href: string;
/**
* Sets or retrieves the language code of the object.
*/
hreflang: string;
mimeType: string;
/**
* Sets or retrieves the shape of the object.
*/
name: string;
nameProp: string;
/**
* Contains the pathname of the URL.
*/
pathname: string;
/**
* Sets or retrieves the port number associated with a URL.
*/
port: string;
/**
* Contains the protocol of the URL.
*/
protocol: string;
protocolLong: string;
/**
* Sets or retrieves the relationship between the object and the destination of the link.
*/
rel: string;
/**
* Sets or retrieves the relationship between the object and the destination of the link.
*/
rev: string;
/**
* Sets or retrieves the substring of the href property that follows the question mark.
*/
search: string;
/**
* Sets or retrieves the shape of the object.
*/
shape: string;
/**
* Sets or retrieves the window or frame at which to target content.
*/
target: string;
/**
* Retrieves or sets the text of the object as a string.
*/
text: string;
type: string;
urn: string;
/**
* Returns a string representation of an object.
*/
toString(): string;
}
declare var HTMLAnchorElement: {
prototype: HTMLAnchorElement;
new(): HTMLAnchorElement;
}
interface HTMLAppletElement extends HTMLElement {
/**
* Retrieves a string of the URL where the object tag can be found. This is often the href of the document that the object is in, or the value set by a base element.
*/
BaseHref: string;
align: string;
/**
* Sets or retrieves a text alternative to the graphic.
*/
alt: string;
/**
* Gets or sets the optional alternative HTML script to execute if the object fails to load.
*/
altHtml: string;
/**
* Sets or retrieves a character string that can be used to implement your own archive functionality for the object.
*/
archive: string;
border: string;
code: string;
/**
* Sets or retrieves the URL of the component.
*/
codeBase: string;
/**
* Sets or retrieves the Internet media type for the code associated with the object.
*/
codeType: string;
/**
* Address of a pointer to the document this page or frame contains. If there is no document, then null will be returned.
*/
contentDocument: Document;
/**
* Sets or retrieves the URL that references the data of the object.
*/
data: string;
/**
* Sets or retrieves a character string that can be used to implement your own declare functionality for the object.
*/
declare: boolean;
form: HTMLFormElement;
/**
* Sets or retrieves the height of the object.
*/
height: string;
hspace: number;
/**
* Sets or retrieves the shape of the object.
*/
name: string;
object: string;
/**
* Sets or retrieves a message to be displayed while an object is loading.
*/
standby: string;
/**
* Returns the content type of the object.
*/
type: string;
/**
* Sets or retrieves the URL, often with a bookmark extension (#name), to use as a client-side image map.
*/
useMap: string;
vspace: number;
width: number;
}
declare var HTMLAppletElement: {
prototype: HTMLAppletElement;
new(): HTMLAppletElement;
}
interface HTMLAreaElement extends HTMLElement {
/**
* Sets or retrieves a text alternative to the graphic.
*/
alt: string;
/**
* Sets or retrieves the coordinates of the object.
*/
coords: string;
/**
* Sets or retrieves the subsection of the href property that follows the number sign (#).
*/
hash: string;
/**
* Sets or retrieves the hostname and port number of the location or URL.
*/
host: string;
/**
* Sets or retrieves the host name part of the location or URL.
*/
hostname: string;
/**
* Sets or retrieves a destination URL or an anchor point.
*/
href: string;
/**
* Sets or gets whether clicks in this region cause action.
*/
noHref: boolean;
/**
* Sets or retrieves the file name or path specified by the object.
*/
pathname: string;
/**
* Sets or retrieves the port number associated with a URL.
*/
port: string;
/**
* Sets or retrieves the protocol portion of a URL.
*/
protocol: string;
rel: string;
/**
* Sets or retrieves the substring of the href property that follows the question mark.
*/
search: string;
/**
* Sets or retrieves the shape of the object.
*/
shape: string;
/**
* Sets or retrieves the window or frame at which to target content.
*/
target: string;
/**
* Returns a string representation of an object.
*/
toString(): string;
}
declare var HTMLAreaElement: {
prototype: HTMLAreaElement;
new(): HTMLAreaElement;
}
interface HTMLAreasCollection extends HTMLCollection {
/**
* Adds an element to the areas, controlRange, or options collection.
*/
add(element: HTMLElement, before?: HTMLElement): void;
add(element: HTMLElement, before?: number): void;
/**
* Removes an element from the collection.
*/
remove(index?: number): void;
}
declare var HTMLAreasCollection: {
prototype: HTMLAreasCollection;
new(): HTMLAreasCollection;
}
interface HTMLAudioElement extends HTMLMediaElement {
}
declare var HTMLAudioElement: {
prototype: HTMLAudioElement;
new(): HTMLAudioElement;
}
interface HTMLBRElement extends HTMLElement {
/**
* Sets or retrieves the side on which floating objects are not to be positioned when any IHTMLBlockElement is inserted into the document.
*/
clear: string;
}
declare var HTMLBRElement: {
prototype: HTMLBRElement;
new(): HTMLBRElement;
}
interface HTMLBaseElement extends HTMLElement {
/**
* Gets or sets the baseline URL on which relative links are based.
*/
href: string;
/**
* Sets or retrieves the window or frame at which to target content.
*/
target: string;
}
declare var HTMLBaseElement: {
prototype: HTMLBaseElement;
new(): HTMLBaseElement;
}
interface HTMLBaseFontElement extends HTMLElement, DOML2DeprecatedColorProperty {
/**
* Sets or retrieves the current typeface family.
*/
face: string;
/**
* Sets or retrieves the font size of the object.
*/
size: number;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var HTMLBaseFontElement: {
prototype: HTMLBaseFontElement;
new(): HTMLBaseFontElement;
}
interface HTMLBlockElement extends HTMLElement {
/**
* Sets or retrieves reference information about the object.
*/
cite: string;
clear: string;
/**
* Sets or retrieves the width of the object.
*/
width: number;
}
declare var HTMLBlockElement: {
prototype: HTMLBlockElement;
new(): HTMLBlockElement;
}
interface HTMLBodyElement extends HTMLElement {
aLink: any;
background: string;
bgColor: any;
bgProperties: string;
link: any;
noWrap: boolean;
onafterprint: (ev: Event) => any;
onbeforeprint: (ev: Event) => any;
onbeforeunload: (ev: BeforeUnloadEvent) => any;
onblur: (ev: FocusEvent) => any;
onerror: (ev: Event) => any;
onfocus: (ev: FocusEvent) => any;
onhashchange: (ev: HashChangeEvent) => any;
onload: (ev: Event) => any;
onmessage: (ev: MessageEvent) => any;
onoffline: (ev: Event) => any;
ononline: (ev: Event) => any;
onorientationchange: (ev: Event) => any;
onpagehide: (ev: PageTransitionEvent) => any;
onpageshow: (ev: PageTransitionEvent) => any;
onpopstate: (ev: PopStateEvent) => any;
onresize: (ev: UIEvent) => any;
onstorage: (ev: StorageEvent) => any;
onunload: (ev: Event) => any;
text: any;
vLink: any;
createTextRange(): TextRange;
addEventListener(type: "MSContentZoom", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSManipulationStateChanged", listener: (ev: MSManipulationEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "activate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "afterprint", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforecopy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforecut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforedeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforepaste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforeprint", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "beforeunload", listener: (ev: BeforeUnloadEvent) => any, useCapture?: boolean): void;
addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "copy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "cuechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "cut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "deactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "hashchange", listener: (ev: HashChangeEvent) => any, useCapture?: boolean): void;
addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "message", listener: (ev: MessageEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
addEventListener(type: "offline", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "online", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "orientationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "pagehide", listener: (ev: PageTransitionEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pageshow", listener: (ev: PageTransitionEvent) => any, useCapture?: boolean): void;
addEventListener(type: "paste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "popstate", listener: (ev: PopStateEvent) => any, useCapture?: boolean): void;
addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "resize", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "selectstart", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "storage", listener: (ev: StorageEvent) => any, useCapture?: boolean): void;
addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "unload", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var HTMLBodyElement: {
prototype: HTMLBodyElement;
new(): HTMLBodyElement;
}
interface HTMLButtonElement extends HTMLElement {
/**
* Provides a way to direct a user to a specific field when a document loads. This can provide both direction and convenience for a user, reducing the need to click or tab to a field when a page opens. This attribute is true when present on an element, and false when missing.
*/
autofocus: boolean;
disabled: boolean;
/**
* Retrieves a reference to the form that the object is embedded in.
*/
form: HTMLFormElement;
/**
* Overrides the action attribute (where the data on a form is sent) on the parent form element.
*/
formAction: string;
/**
* Used to override the encoding (formEnctype attribute) specified on the form element.
*/
formEnctype: string;
/**
* Overrides the submit method attribute previously specified on a form element.
*/
formMethod: string;
/**
* Overrides any validation or required attributes on a form or form elements to allow it to be submitted without validation. This can be used to create a "save draft"-type submit option.
*/
formNoValidate: string;
/**
* Overrides the target attribute on a form element.
*/
formTarget: string;
/**
* Sets or retrieves the name of the object.
*/
name: string;
status: any;
/**
* Gets the classification and default behavior of the button.
*/
type: string;
/**
* Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.
*/
validationMessage: string;
/**
* Returns a ValidityState object that represents the validity states of an element.
*/
validity: ValidityState;
/**
* Sets or retrieves the default or selected value of the control.
*/
value: string;
/**
* Returns whether an element will successfully validate based on forms validation rules and constraints.
*/
willValidate: boolean;
/**
* Returns whether a form will validate when it is submitted, without having to submit it.
*/
checkValidity(): boolean;
/**
* Creates a TextRange object for the element.
*/
createTextRange(): TextRange;
/**
* Sets a custom error message that is displayed when a form is submitted.
* @param error Sets a custom error message that is displayed when a form is submitted.
*/
setCustomValidity(error: string): void;
}
declare var HTMLButtonElement: {
prototype: HTMLButtonElement;
new(): HTMLButtonElement;
}
interface HTMLCanvasElement extends HTMLElement {
/**
* Gets or sets the height of a canvas element on a document.
*/
height: number;
/**
* Gets or sets the width of a canvas element on a document.
*/
width: number;
/**
* Returns an object that provides methods and properties for drawing and manipulating images and graphics on a canvas element in a document. A context object includes information about colors, line widths, fonts, and other graphic parameters that can be drawn on a canvas.
* @param contextId The identifier (ID) of the type of canvas to create. Internet Explorer 9 and Internet Explorer 10 support only a 2-D context using canvas.getContext("2d"); IE11 Preview also supports 3-D or WebGL context using canvas.getContext("experimental-webgl");
*/
getContext(contextId: "2d"): CanvasRenderingContext2D;
getContext(contextId: "experimental-webgl"): WebGLRenderingContext;
getContext(contextId: string, ...args: any[]): CanvasRenderingContext2D | WebGLRenderingContext;
/**
* Returns a blob object encoded as a Portable Network Graphics (PNG) format from a canvas image or drawing.
*/
msToBlob(): Blob;
/**
* Returns the content of the current canvas as an image that you can use as a source for another canvas or an HTML element.
* @param type The standard MIME type for the image format to return. If you do not specify this parameter, the default value is a PNG format image.
*/
toDataURL(type?: string, ...args: any[]): string;
}
declare var HTMLCanvasElement: {
prototype: HTMLCanvasElement;
new(): HTMLCanvasElement;
}
interface HTMLCollection {
/**
* Sets or retrieves the number of objects in a collection.
*/
length: number;
/**
* Retrieves an object from various collections.
*/
item(nameOrIndex?: any, optionalIndex?: any): Element;
/**
* Retrieves a select object or an object from an options collection.
*/
namedItem(name: string): Element;
[index: number]: Element;
}
declare var HTMLCollection: {
prototype: HTMLCollection;
new(): HTMLCollection;
}
interface HTMLDDElement extends HTMLElement {
/**
* Sets or retrieves whether the browser automatically performs wordwrap.
*/
noWrap: boolean;
}
declare var HTMLDDElement: {
prototype: HTMLDDElement;
new(): HTMLDDElement;
}
interface HTMLDListElement extends HTMLElement {
compact: boolean;
}
declare var HTMLDListElement: {
prototype: HTMLDListElement;
new(): HTMLDListElement;
}
interface HTMLDTElement extends HTMLElement {
/**
* Sets or retrieves whether the browser automatically performs wordwrap.
*/
noWrap: boolean;
}
declare var HTMLDTElement: {
prototype: HTMLDTElement;
new(): HTMLDTElement;
}
interface HTMLDataListElement extends HTMLElement {
options: HTMLCollection;
}
declare var HTMLDataListElement: {
prototype: HTMLDataListElement;
new(): HTMLDataListElement;
}
interface HTMLDirectoryElement extends HTMLElement {
compact: boolean;
}
declare var HTMLDirectoryElement: {
prototype: HTMLDirectoryElement;
new(): HTMLDirectoryElement;
}
interface HTMLDivElement extends HTMLElement {
/**
* Sets or retrieves how the object is aligned with adjacent text.
*/
align: string;
/**
* Sets or retrieves whether the browser automatically performs wordwrap.
*/
noWrap: boolean;
}
declare var HTMLDivElement: {
prototype: HTMLDivElement;
new(): HTMLDivElement;
}
interface HTMLDocument extends Document {
}
declare var HTMLDocument: {
prototype: HTMLDocument;
new(): HTMLDocument;
}
interface HTMLElement extends Element {
accessKey: string;
children: HTMLCollection;
className: string;
contentEditable: string;
dataset: DOMStringMap;
dir: string;
draggable: boolean;
hidden: boolean;
hideFocus: boolean;
id: string;
innerHTML: string;
innerText: string;
isContentEditable: boolean;
lang: string;
offsetHeight: number;
offsetLeft: number;
offsetParent: Element;
offsetTop: number;
offsetWidth: number;
onabort: (ev: Event) => any;
onactivate: (ev: UIEvent) => any;
onbeforeactivate: (ev: UIEvent) => any;
onbeforecopy: (ev: DragEvent) => any;
onbeforecut: (ev: DragEvent) => any;
onbeforedeactivate: (ev: UIEvent) => any;
onbeforepaste: (ev: DragEvent) => any;
onblur: (ev: FocusEvent) => any;
oncanplay: (ev: Event) => any;
oncanplaythrough: (ev: Event) => any;
onchange: (ev: Event) => any;
onclick: (ev: MouseEvent) => any;
oncontextmenu: (ev: PointerEvent) => any;
oncopy: (ev: DragEvent) => any;
oncuechange: (ev: Event) => any;
oncut: (ev: DragEvent) => any;
ondblclick: (ev: MouseEvent) => any;
ondeactivate: (ev: UIEvent) => any;
ondrag: (ev: DragEvent) => any;
ondragend: (ev: DragEvent) => any;
ondragenter: (ev: DragEvent) => any;
ondragleave: (ev: DragEvent) => any;
ondragover: (ev: DragEvent) => any;
ondragstart: (ev: DragEvent) => any;
ondrop: (ev: DragEvent) => any;
ondurationchange: (ev: Event) => any;
onemptied: (ev: Event) => any;
onended: (ev: Event) => any;
onerror: (ev: Event) => any;
onfocus: (ev: FocusEvent) => any;
oninput: (ev: Event) => any;
onkeydown: (ev: KeyboardEvent) => any;
onkeypress: (ev: KeyboardEvent) => any;
onkeyup: (ev: KeyboardEvent) => any;
onload: (ev: Event) => any;
onloadeddata: (ev: Event) => any;
onloadedmetadata: (ev: Event) => any;
onloadstart: (ev: Event) => any;
onmousedown: (ev: MouseEvent) => any;
onmouseenter: (ev: MouseEvent) => any;
onmouseleave: (ev: MouseEvent) => any;
onmousemove: (ev: MouseEvent) => any;
onmouseout: (ev: MouseEvent) => any;
onmouseover: (ev: MouseEvent) => any;
onmouseup: (ev: MouseEvent) => any;
onmousewheel: (ev: MouseWheelEvent) => any;
onmscontentzoom: (ev: UIEvent) => any;
onmsmanipulationstatechanged: (ev: MSManipulationEvent) => any;
onpaste: (ev: DragEvent) => any;
onpause: (ev: Event) => any;
onplay: (ev: Event) => any;
onplaying: (ev: Event) => any;
onprogress: (ev: ProgressEvent) => any;
onratechange: (ev: Event) => any;
onreset: (ev: Event) => any;
onscroll: (ev: UIEvent) => any;
onseeked: (ev: Event) => any;
onseeking: (ev: Event) => any;
onselect: (ev: UIEvent) => any;
onselectstart: (ev: Event) => any;
onstalled: (ev: Event) => any;
onsubmit: (ev: Event) => any;
onsuspend: (ev: Event) => any;
ontimeupdate: (ev: Event) => any;
onvolumechange: (ev: Event) => any;
onwaiting: (ev: Event) => any;
outerHTML: string;
outerText: string;
spellcheck: boolean;
style: CSSStyleDeclaration;
tabIndex: number;
title: string;
blur(): void;
click(): void;
contains(child: HTMLElement): boolean;
dragDrop(): boolean;
focus(): void;
getElementsByClassName(classNames: string): NodeList;
insertAdjacentElement(position: string, insertedElement: Element): Element;
insertAdjacentHTML(where: string, html: string): void;
insertAdjacentText(where: string, text: string): void;
msGetInputContext(): MSInputMethodContext;
scrollIntoView(top?: boolean): void;
setActive(): void;
addEventListener(type: "MSContentZoom", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSManipulationStateChanged", listener: (ev: MSManipulationEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "activate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforecopy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforecut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforedeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforepaste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "copy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "cuechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "cut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "deactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
addEventListener(type: "paste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "selectstart", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var HTMLElement: {
prototype: HTMLElement;
new(): HTMLElement;
}
interface HTMLEmbedElement extends HTMLElement, GetSVGDocument {
/**
* Sets or retrieves the height of the object.
*/
height: string;
hidden: any;
/**
* Gets or sets whether the DLNA PlayTo device is available.
*/
msPlayToDisabled: boolean;
/**
* Gets or sets the path to the preferred media source. This enables the Play To target device to stream the media content, which can be DRM protected, from a different location, such as a cloud media server.
*/
msPlayToPreferredSourceUri: string;
/**
* Gets or sets the primary DLNA PlayTo device.
*/
msPlayToPrimary: boolean;
/**
* Gets the source associated with the media element for use by the PlayToManager.
*/
msPlayToSource: any;
/**
* Sets or retrieves the name of the object.
*/
name: string;
/**
* Retrieves the palette used for the embedded document.
*/
palette: string;
/**
* Retrieves the URL of the plug-in used to view an embedded document.
*/
pluginspage: string;
readyState: string;
/**
* Sets or retrieves a URL to be loaded by the object.
*/
src: string;
/**
* Sets or retrieves the height and width units of the embed object.
*/
units: string;
/**
* Sets or retrieves the width of the object.
*/
width: string;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var HTMLEmbedElement: {
prototype: HTMLEmbedElement;
new(): HTMLEmbedElement;
}
interface HTMLFieldSetElement extends HTMLElement {
/**
* Sets or retrieves how the object is aligned with adjacent text.
*/
align: string;
disabled: boolean;
/**
* Retrieves a reference to the form that the object is embedded in.
*/
form: HTMLFormElement;
/**
* Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.
*/
validationMessage: string;
/**
* Returns a ValidityState object that represents the validity states of an element.
*/
validity: ValidityState;
/**
* Returns whether an element will successfully validate based on forms validation rules and constraints.
*/
willValidate: boolean;
/**
* Returns whether a form will validate when it is submitted, without having to submit it.
*/
checkValidity(): boolean;
/**
* Sets a custom error message that is displayed when a form is submitted.
* @param error Sets a custom error message that is displayed when a form is submitted.
*/
setCustomValidity(error: string): void;
}
declare var HTMLFieldSetElement: {
prototype: HTMLFieldSetElement;
new(): HTMLFieldSetElement;
}
interface HTMLFontElement extends HTMLElement, DOML2DeprecatedColorProperty, DOML2DeprecatedSizeProperty {
/**
* Sets or retrieves the current typeface family.
*/
face: string;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var HTMLFontElement: {
prototype: HTMLFontElement;
new(): HTMLFontElement;
}
interface HTMLFormElement extends HTMLElement {
/**
* Sets or retrieves a list of character encodings for input data that must be accepted by the server processing the form.
*/
acceptCharset: string;
/**
* Sets or retrieves the URL to which the form content is sent for processing.
*/
action: string;
/**
* Specifies whether autocomplete is applied to an editable text field.
*/
autocomplete: string;
/**
* Retrieves a collection, in source order, of all controls in a given form.
*/
elements: HTMLCollection;
/**
* Sets or retrieves the MIME encoding for the form.
*/
encoding: string;
/**
* Sets or retrieves the encoding type for the form.
*/
enctype: string;
/**
* Sets or retrieves the number of objects in a collection.
*/
length: number;
/**
* Sets or retrieves how to send the form data to the server.
*/
method: string;
/**
* Sets or retrieves the name of the object.
*/
name: string;
/**
* Designates a form that is not validated when submitted.
*/
noValidate: boolean;
/**
* Sets or retrieves the window or frame at which to target content.
*/
target: string;
/**
* Returns whether a form will validate when it is submitted, without having to submit it.
*/
checkValidity(): boolean;
/**
* Retrieves a form object or an object from an elements collection.
* @param name Variant of type Number or String that specifies the object or collection to retrieve. If this parameter is a Number, it is the zero-based index of the object. If this parameter is a string, all objects with matching name or id properties are retrieved, and a collection is returned if more than one match is made.
* @param index Variant of type Number that specifies the zero-based index of the object to retrieve when a collection is returned.
*/
item(name?: any, index?: any): any;
/**
* Retrieves a form object or an object from an elements collection.
*/
namedItem(name: string): any;
/**
* Fires when the user resets a form.
*/
reset(): void;
/**
* Fires when a FORM is about to be submitted.
*/
submit(): void;
[name: string]: any;
}
declare var HTMLFormElement: {
prototype: HTMLFormElement;
new(): HTMLFormElement;
}
interface HTMLFrameElement extends HTMLElement, GetSVGDocument {
/**
* Specifies the properties of a border drawn around an object.
*/
border: string;
/**
* Sets or retrieves the border color of the object.
*/
borderColor: any;
/**
* Retrieves the document object of the page or frame.
*/
contentDocument: Document;
/**
* Retrieves the object of the specified.
*/
contentWindow: Window;
/**
* Sets or retrieves whether to display a border for the frame.
*/
frameBorder: string;
/**
* Sets or retrieves the amount of additional space between the frames.
*/
frameSpacing: any;
/**
* Sets or retrieves the height of the object.
*/
height: string | number;
/**
* Sets or retrieves a URI to a long description of the object.
*/
longDesc: string;
/**
* Sets or retrieves the top and bottom margin heights before displaying the text in a frame.
*/
marginHeight: string;
/**
* Sets or retrieves the left and right margin widths before displaying the text in a frame.
*/
marginWidth: string;
/**
* Sets or retrieves the frame name.
*/
name: string;
/**
* Sets or retrieves whether the user can resize the frame.
*/
noResize: boolean;
/**
* Raised when the object has been completely received from the server.
*/
onload: (ev: Event) => any;
/**
* Sets or retrieves whether the frame can be scrolled.
*/
scrolling: string;
/**
* Sets the value indicating whether the source file of a frame or iframe has specific security restrictions applied.
*/
security: any;
/**
* Sets or retrieves a URL to be loaded by the object.
*/
src: string;
/**
* Sets or retrieves the width of the object.
*/
width: string | number;
addEventListener(type: "MSContentZoom", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSManipulationStateChanged", listener: (ev: MSManipulationEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "activate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforecopy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforecut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforedeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforepaste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "copy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "cuechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "cut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "deactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
addEventListener(type: "paste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "selectstart", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var HTMLFrameElement: {
prototype: HTMLFrameElement;
new(): HTMLFrameElement;
}
interface HTMLFrameSetElement extends HTMLElement {
border: string;
/**
* Sets or retrieves the border color of the object.
*/
borderColor: any;
/**
* Sets or retrieves the frame widths of the object.
*/
cols: string;
/**
* Sets or retrieves whether to display a border for the frame.
*/
frameBorder: string;
/**
* Sets or retrieves the amount of additional space between the frames.
*/
frameSpacing: any;
name: string;
onafterprint: (ev: Event) => any;
onbeforeprint: (ev: Event) => any;
onbeforeunload: (ev: BeforeUnloadEvent) => any;
/**
* Fires when the object loses the input focus.
*/
onblur: (ev: FocusEvent) => any;
onerror: (ev: Event) => any;
/**
* Fires when the object receives focus.
*/
onfocus: (ev: FocusEvent) => any;
onhashchange: (ev: HashChangeEvent) => any;
onload: (ev: Event) => any;
onmessage: (ev: MessageEvent) => any;
onoffline: (ev: Event) => any;
ononline: (ev: Event) => any;
onorientationchange: (ev: Event) => any;
onpagehide: (ev: PageTransitionEvent) => any;
onpageshow: (ev: PageTransitionEvent) => any;
onresize: (ev: UIEvent) => any;
onstorage: (ev: StorageEvent) => any;
onunload: (ev: Event) => any;
/**
* Sets or retrieves the frame heights of the object.
*/
rows: string;
addEventListener(type: "MSContentZoom", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSManipulationStateChanged", listener: (ev: MSManipulationEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "activate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforecopy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforecut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforedeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforepaste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforeprint", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "beforeunload", listener: (ev: BeforeUnloadEvent) => any, useCapture?: boolean): void;
addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "copy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "cuechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "cut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "deactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "hashchange", listener: (ev: HashChangeEvent) => any, useCapture?: boolean): void;
addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "message", listener: (ev: MessageEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
addEventListener(type: "offline", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "online", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "orientationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "pagehide", listener: (ev: PageTransitionEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pageshow", listener: (ev: PageTransitionEvent) => any, useCapture?: boolean): void;
addEventListener(type: "paste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "resize", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "selectstart", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "storage", listener: (ev: StorageEvent) => any, useCapture?: boolean): void;
addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "unload", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var HTMLFrameSetElement: {
prototype: HTMLFrameSetElement;
new(): HTMLFrameSetElement;
}
interface HTMLHRElement extends HTMLElement, DOML2DeprecatedColorProperty, DOML2DeprecatedSizeProperty {
/**
* Sets or retrieves how the object is aligned with adjacent text.
*/
align: string;
/**
* Sets or retrieves whether the horizontal rule is drawn with 3-D shading.
*/
noShade: boolean;
/**
* Sets or retrieves the width of the object.
*/
width: number;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var HTMLHRElement: {
prototype: HTMLHRElement;
new(): HTMLHRElement;
}
interface HTMLHeadElement extends HTMLElement {
profile: string;
}
declare var HTMLHeadElement: {
prototype: HTMLHeadElement;
new(): HTMLHeadElement;
}
interface HTMLHeadingElement extends HTMLElement {
/**
* Sets or retrieves a value that indicates the table alignment.
*/
align: string;
clear: string;
}
declare var HTMLHeadingElement: {
prototype: HTMLHeadingElement;
new(): HTMLHeadingElement;
}
interface HTMLHtmlElement extends HTMLElement {
/**
* Sets or retrieves the DTD version that governs the current document.
*/
version: string;
}
declare var HTMLHtmlElement: {
prototype: HTMLHtmlElement;
new(): HTMLHtmlElement;
}
interface HTMLIFrameElement extends HTMLElement, GetSVGDocument {
/**
* Sets or retrieves how the object is aligned with adjacent text.
*/
align: string;
allowFullscreen: boolean;
/**
* Specifies the properties of a border drawn around an object.
*/
border: string;
/**
* Retrieves the document object of the page or frame.
*/
contentDocument: Document;
/**
* Retrieves the object of the specified.
*/
contentWindow: Window;
/**
* Sets or retrieves whether to display a border for the frame.
*/
frameBorder: string;
/**
* Sets or retrieves the amount of additional space between the frames.
*/
frameSpacing: any;
/**
* Sets or retrieves the height of the object.
*/
height: string;
/**
* Sets or retrieves the horizontal margin for the object.
*/
hspace: number;
/**
* Sets or retrieves a URI to a long description of the object.
*/
longDesc: string;
/**
* Sets or retrieves the top and bottom margin heights before displaying the text in a frame.
*/
marginHeight: string;
/**
* Sets or retrieves the left and right margin widths before displaying the text in a frame.
*/
marginWidth: string;
/**
* Sets or retrieves the frame name.
*/
name: string;
/**
* Sets or retrieves whether the user can resize the frame.
*/
noResize: boolean;
/**
* Raised when the object has been completely received from the server.
*/
onload: (ev: Event) => any;
sandbox: DOMSettableTokenList;
/**
* Sets or retrieves whether the frame can be scrolled.
*/
scrolling: string;
/**
* Sets the value indicating whether the source file of a frame or iframe has specific security restrictions applied.
*/
security: any;
/**
* Sets or retrieves a URL to be loaded by the object.
*/
src: string;
/**
* Sets or retrieves the vertical margin for the object.
*/
vspace: number;
/**
* Sets or retrieves the width of the object.
*/
width: string;
addEventListener(type: "MSContentZoom", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSManipulationStateChanged", listener: (ev: MSManipulationEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "activate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforecopy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforecut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforedeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforepaste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "copy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "cuechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "cut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "deactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
addEventListener(type: "paste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "selectstart", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var HTMLIFrameElement: {
prototype: HTMLIFrameElement;
new(): HTMLIFrameElement;
}
interface HTMLImageElement extends HTMLElement {
/**
* Sets or retrieves how the object is aligned with adjacent text.
*/
align: string;
/**
* Sets or retrieves a text alternative to the graphic.
*/
alt: string;
/**
* Specifies the properties of a border drawn around an object.
*/
border: string;
/**
* Retrieves whether the object is fully loaded.
*/
complete: boolean;
crossOrigin: string;
currentSrc: string;
/**
* Sets or retrieves the height of the object.
*/
height: number;
/**
* Sets or retrieves the width of the border to draw around the object.
*/
hspace: number;
/**
* Sets or retrieves whether the image is a server-side image map.
*/
isMap: boolean;
/**
* Sets or retrieves a Uniform Resource Identifier (URI) to a long description of the object.
*/
longDesc: string;
/**
* Gets or sets whether the DLNA PlayTo device is available.
*/
msPlayToDisabled: boolean;
msPlayToPreferredSourceUri: string;
/**
* Gets or sets the primary DLNA PlayTo device.
*/
msPlayToPrimary: boolean;
/**
* Gets the source associated with the media element for use by the PlayToManager.
*/
msPlayToSource: any;
/**
* Sets or retrieves the name of the object.
*/
name: string;
/**
* The original height of the image resource before sizing.
*/
naturalHeight: number;
/**
* The original width of the image resource before sizing.
*/
naturalWidth: number;
/**
* The address or URL of the a media resource that is to be considered.
*/
src: string;
srcset: string;
/**
* Sets or retrieves the URL, often with a bookmark extension (#name), to use as a client-side image map.
*/
useMap: string;
/**
* Sets or retrieves the vertical margin for the object.
*/
vspace: number;
/**
* Sets or retrieves the width of the object.
*/
width: number;
x: number;
y: number;
msGetAsCastingSource(): any;
}
declare var HTMLImageElement: {
prototype: HTMLImageElement;
new(): HTMLImageElement;
create(): HTMLImageElement;
}
interface HTMLInputElement extends HTMLElement {
/**
* Sets or retrieves a comma-separated list of content types.
*/
accept: string;
/**
* Sets or retrieves how the object is aligned with adjacent text.
*/
align: string;
/**
* Sets or retrieves a text alternative to the graphic.
*/
alt: string;
/**
* Specifies whether autocomplete is applied to an editable text field.
*/
autocomplete: string;
/**
* Provides a way to direct a user to a specific field when a document loads. This can provide both direction and convenience for a user, reducing the need to click or tab to a field when a page opens. This attribute is true when present on an element, and false when missing.
*/
autofocus: boolean;
/**
* Sets or retrieves the width of the border to draw around the object.
*/
border: string;
/**
* Sets or retrieves the state of the check box or radio button.
*/
checked: boolean;
/**
* Retrieves whether the object is fully loaded.
*/
complete: boolean;
/**
* Sets or retrieves the state of the check box or radio button.
*/
defaultChecked: boolean;
/**
* Sets or retrieves the initial contents of the object.
*/
defaultValue: string;
disabled: boolean;
/**
* Returns a FileList object on a file type input object.
*/
files: FileList;
/**
* Retrieves a reference to the form that the object is embedded in.
*/
form: HTMLFormElement;
/**
* Overrides the action attribute (where the data on a form is sent) on the parent form element.
*/
formAction: string;
/**
* Used to override the encoding (formEnctype attribute) specified on the form element.
*/
formEnctype: string;
/**
* Overrides the submit method attribute previously specified on a form element.
*/
formMethod: string;
/**
* Overrides any validation or required attributes on a form or form elements to allow it to be submitted without validation. This can be used to create a "save draft"-type submit option.
*/
formNoValidate: string;
/**
* Overrides the target attribute on a form element.
*/
formTarget: string;
/**
* Sets or retrieves the height of the object.
*/
height: string;
/**
* Sets or retrieves the width of the border to draw around the object.
*/
hspace: number;
indeterminate: boolean;
/**
* Specifies the ID of a pre-defined datalist of options for an input element.
*/
list: HTMLElement;
/**
* Defines the maximum acceptable value for an input element with type="number".When used with the min and step attributes, lets you control the range and increment (such as only even numbers) that the user can enter into an input field.
*/
max: string;
/**
* Sets or retrieves the maximum number of characters that the user can enter in a text control.
*/
maxLength: number;
/**
* Defines the minimum acceptable value for an input element with type="number". When used with the max and step attributes, lets you control the range and increment (such as even numbers only) that the user can enter into an input field.
*/
min: string;
/**
* Sets or retrieves the Boolean value indicating whether multiple items can be selected from a list.
*/
multiple: boolean;
/**
* Sets or retrieves the name of the object.
*/
name: string;
/**
* Gets or sets a string containing a regular expression that the user's input must match.
*/
pattern: string;
/**
* Gets or sets a text string that is displayed in an input field as a hint or prompt to users as the format or type of information they need to enter.The text appears in an input field until the user puts focus on the field.
*/
placeholder: string;
readOnly: boolean;
/**
* When present, marks an element that can't be submitted without a value.
*/
required: boolean;
/**
* Gets or sets the end position or offset of a text selection.
*/
selectionEnd: number;
/**
* Gets or sets the starting position or offset of a text selection.
*/
selectionStart: number;
size: number;
/**
* The address or URL of the a media resource that is to be considered.
*/
src: string;
status: boolean;
/**
* Defines an increment or jump between values that you want to allow the user to enter. When used with the max and min attributes, lets you control the range and increment (for example, allow only even numbers) that the user can enter into an input field.
*/
step: string;
/**
* Returns the content type of the object.
*/
type: string;
/**
* Sets or retrieves the URL, often with a bookmark extension (#name), to use as a client-side image map.
*/
useMap: string;
/**
* Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.
*/
validationMessage: string;
/**
* Returns a ValidityState object that represents the validity states of an element.
*/
validity: ValidityState;
/**
* Returns the value of the data at the cursor's current position.
*/
value: string;
valueAsDate: Date;
/**
* Returns the input field value as a number.
*/
valueAsNumber: number;
/**
* Sets or retrieves the vertical margin for the object.
*/
vspace: number;
/**
* Sets or retrieves the width of the object.
*/
width: string;
/**
* Returns whether an element will successfully validate based on forms validation rules and constraints.
*/
willValidate: boolean;
/**
* Returns whether a form will validate when it is submitted, without having to submit it.
*/
checkValidity(): boolean;
/**
* Creates a TextRange object for the element.
*/
createTextRange(): TextRange;
/**
* Makes the selection equal to the current object.
*/
select(): void;
/**
* Sets a custom error message that is displayed when a form is submitted.
* @param error Sets a custom error message that is displayed when a form is submitted.
*/
setCustomValidity(error: string): void;
/**
* Sets the start and end positions of a selection in a text field.
* @param start The offset into the text field for the start of the selection.
* @param end The offset into the text field for the end of the selection.
*/
setSelectionRange(start: number, end: number): void;
/**
* Decrements a range input control's value by the value given by the Step attribute. If the optional parameter is used, it will decrement the input control's step value multiplied by the parameter's value.
* @param n Value to decrement the value by.
*/
stepDown(n?: number): void;
/**
* Increments a range input control's value by the value given by the Step attribute. If the optional parameter is used, will increment the input control's value by that value.
* @param n Value to increment the value by.
*/
stepUp(n?: number): void;
}
declare var HTMLInputElement: {
prototype: HTMLInputElement;
new(): HTMLInputElement;
}
interface HTMLIsIndexElement extends HTMLElement {
/**
* Sets or retrieves the URL to which the form content is sent for processing.
*/
action: string;
/**
* Retrieves a reference to the form that the object is embedded in.
*/
form: HTMLFormElement;
prompt: string;
}
declare var HTMLIsIndexElement: {
prototype: HTMLIsIndexElement;
new(): HTMLIsIndexElement;
}
interface HTMLLIElement extends HTMLElement {
type: string;
/**
* Sets or retrieves the value of a list item.
*/
value: number;
}
declare var HTMLLIElement: {
prototype: HTMLLIElement;
new(): HTMLLIElement;
}
interface HTMLLabelElement extends HTMLElement {
/**
* Retrieves a reference to the form that the object is embedded in.
*/
form: HTMLFormElement;
/**
* Sets or retrieves the object to which the given label object is assigned.
*/
htmlFor: string;
}
declare var HTMLLabelElement: {
prototype: HTMLLabelElement;
new(): HTMLLabelElement;
}
interface HTMLLegendElement extends HTMLElement {
/**
* Retrieves a reference to the form that the object is embedded in.
*/
align: string;
/**
* Retrieves a reference to the form that the object is embedded in.
*/
form: HTMLFormElement;
}
declare var HTMLLegendElement: {
prototype: HTMLLegendElement;
new(): HTMLLegendElement;
}
interface HTMLLinkElement extends HTMLElement, LinkStyle {
/**
* Sets or retrieves the character set used to encode the object.
*/
charset: string;
disabled: boolean;
/**
* Sets or retrieves a destination URL or an anchor point.
*/
href: string;
/**
* Sets or retrieves the language code of the object.
*/
hreflang: string;
/**
* Sets or retrieves the media type.
*/
media: string;
/**
* Sets or retrieves the relationship between the object and the destination of the link.
*/
rel: string;
/**
* Sets or retrieves the relationship between the object and the destination of the link.
*/
rev: string;
/**
* Sets or retrieves the window or frame at which to target content.
*/
target: string;
/**
* Sets or retrieves the MIME type of the object.
*/
type: string;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var HTMLLinkElement: {
prototype: HTMLLinkElement;
new(): HTMLLinkElement;
}
interface HTMLMapElement extends HTMLElement {
/**
* Retrieves a collection of the area objects defined for the given map object.
*/
areas: HTMLAreasCollection;
/**
* Sets or retrieves the name of the object.
*/
name: string;
}
declare var HTMLMapElement: {
prototype: HTMLMapElement;
new(): HTMLMapElement;
}
interface HTMLMarqueeElement extends HTMLElement {
behavior: string;
bgColor: any;
direction: string;
height: string;
hspace: number;
loop: number;
onbounce: (ev: Event) => any;
onfinish: (ev: Event) => any;
onstart: (ev: Event) => any;
scrollAmount: number;
scrollDelay: number;
trueSpeed: boolean;
vspace: number;
width: string;
start(): void;
stop(): void;
addEventListener(type: "MSContentZoom", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSManipulationStateChanged", listener: (ev: MSManipulationEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "activate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforecopy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforecut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforedeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforepaste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
addEventListener(type: "bounce", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "copy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "cuechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "cut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "deactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
addEventListener(type: "finish", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
addEventListener(type: "paste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "selectstart", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "start", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var HTMLMarqueeElement: {
prototype: HTMLMarqueeElement;
new(): HTMLMarqueeElement;
}
interface HTMLMediaElement extends HTMLElement {
/**
* Returns an AudioTrackList object with the audio tracks for a given video element.
*/
audioTracks: AudioTrackList;
/**
* Gets or sets a value that indicates whether to start playing the media automatically.
*/
autoplay: boolean;
/**
* Gets a collection of buffered time ranges.
*/
buffered: TimeRanges;
/**
* Gets or sets a flag that indicates whether the client provides a set of controls for the media (in case the developer does not include controls for the player).
*/
controls: boolean;
/**
* Gets the address or URL of the current media resource that is selected by IHTMLMediaElement.
*/
currentSrc: string;
/**
* Gets or sets the current playback position, in seconds.
*/
currentTime: number;
defaultMuted: boolean;
/**
* Gets or sets the default playback rate when the user is not using fast forward or reverse for a video or audio resource.
*/
defaultPlaybackRate: number;
/**
* Returns the duration in seconds of the current media resource. A NaN value is returned if duration is not available, or Infinity if the media resource is streaming.
*/
duration: number;
/**
* Gets information about whether the playback has ended or not.
*/
ended: boolean;
/**
* Returns an object representing the current error state of the audio or video element.
*/
error: MediaError;
/**
* Gets or sets a flag to specify whether playback should restart after it completes.
*/
loop: boolean;
/**
* Specifies the purpose of the audio or video media, such as background audio or alerts.
*/
msAudioCategory: string;
/**
* Specifies the output device id that the audio will be sent to.
*/
msAudioDeviceType: string;
msGraphicsTrustStatus: MSGraphicsTrust;
/**
* Gets the MSMediaKeys object, which is used for decrypting media data, that is associated with this media element.
*/
msKeys: MSMediaKeys;
/**
* Gets or sets whether the DLNA PlayTo device is available.
*/
msPlayToDisabled: boolean;
/**
* Gets or sets the path to the preferred media source. This enables the Play To target device to stream the media content, which can be DRM protected, from a different location, such as a cloud media server.
*/
msPlayToPreferredSourceUri: string;
/**
* Gets or sets the primary DLNA PlayTo device.
*/
msPlayToPrimary: boolean;
/**
* Gets the source associated with the media element for use by the PlayToManager.
*/
msPlayToSource: any;
/**
* Specifies whether or not to enable low-latency playback on the media element.
*/
msRealTime: boolean;
/**
* Gets or sets a flag that indicates whether the audio (either audio or the audio track on video media) is muted.
*/
muted: boolean;
/**
* Gets the current network activity for the element.
*/
networkState: number;
onmsneedkey: (ev: MSMediaKeyNeededEvent) => any;
/**
* Gets a flag that specifies whether playback is paused.
*/
paused: boolean;
/**
* Gets or sets the current rate of speed for the media resource to play. This speed is expressed as a multiple of the normal speed of the media resource.
*/
playbackRate: number;
/**
* Gets TimeRanges for the current media resource that has been played.
*/
played: TimeRanges;
/**
* Gets or sets the current playback position, in seconds.
*/
preload: string;
readyState: any;
/**
* Returns a TimeRanges object that represents the ranges of the current media resource that can be seeked.
*/
seekable: TimeRanges;
/**
* Gets a flag that indicates whether the the client is currently moving to a new playback position in the media resource.
*/
seeking: boolean;
/**
* The address or URL of the a media resource that is to be considered.
*/
src: string;
textTracks: TextTrackList;
videoTracks: VideoTrackList;
/**
* Gets or sets the volume level for audio portions of the media element.
*/
volume: number;
addTextTrack(kind: string, label?: string, language?: string): TextTrack;
/**
* Returns a string that specifies whether the client can play a given media resource type.
*/
canPlayType(type: string): string;
/**
* Fires immediately after the client loads the object.
*/
load(): void;
/**
* Clears all effects from the media pipeline.
*/
msClearEffects(): void;
msGetAsCastingSource(): any;
/**
* Inserts the specified audio effect into media pipeline.
*/
msInsertAudioEffect(activatableClassId: string, effectRequired: boolean, config?: any): void;
msSetMediaKeys(mediaKeys: MSMediaKeys): void;
/**
* Specifies the media protection manager for a given media pipeline.
*/
msSetMediaProtectionManager(mediaProtectionManager?: any): void;
/**
* Pauses the current playback and sets paused to TRUE. This can be used to test whether the media is playing or paused. You can also use the pause or play events to tell whether the media is playing or not.
*/
pause(): void;
/**
* Loads and starts playback of a media resource.
*/
play(): void;
HAVE_CURRENT_DATA: number;
HAVE_ENOUGH_DATA: number;
HAVE_FUTURE_DATA: number;
HAVE_METADATA: number;
HAVE_NOTHING: number;
NETWORK_EMPTY: number;
NETWORK_IDLE: number;
NETWORK_LOADING: number;
NETWORK_NO_SOURCE: number;
addEventListener(type: "MSContentZoom", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSManipulationStateChanged", listener: (ev: MSManipulationEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "activate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforecopy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforecut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforedeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforepaste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "copy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "cuechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "cut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "deactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
addEventListener(type: "msneedkey", listener: (ev: MSMediaKeyNeededEvent) => any, useCapture?: boolean): void;
addEventListener(type: "paste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "selectstart", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var HTMLMediaElement: {
prototype: HTMLMediaElement;
new(): HTMLMediaElement;
HAVE_CURRENT_DATA: number;
HAVE_ENOUGH_DATA: number;
HAVE_FUTURE_DATA: number;
HAVE_METADATA: number;
HAVE_NOTHING: number;
NETWORK_EMPTY: number;
NETWORK_IDLE: number;
NETWORK_LOADING: number;
NETWORK_NO_SOURCE: number;
}
interface HTMLMenuElement extends HTMLElement {
compact: boolean;
type: string;
}
declare var HTMLMenuElement: {
prototype: HTMLMenuElement;
new(): HTMLMenuElement;
}
interface HTMLMetaElement extends HTMLElement {
/**
* Sets or retrieves the character set used to encode the object.
*/
charset: string;
/**
* Gets or sets meta-information to associate with httpEquiv or name.
*/
content: string;
/**
* Gets or sets information used to bind the value of a content attribute of a meta element to an HTTP response header.
*/
httpEquiv: string;
/**
* Sets or retrieves the value specified in the content attribute of the meta object.
*/
name: string;
/**
* Sets or retrieves a scheme to be used in interpreting the value of a property specified for the object.
*/
scheme: string;
/**
* Sets or retrieves the URL property that will be loaded after the specified time has elapsed.
*/
url: string;
}
declare var HTMLMetaElement: {
prototype: HTMLMetaElement;
new(): HTMLMetaElement;
}
interface HTMLModElement extends HTMLElement {
/**
* Sets or retrieves reference information about the object.
*/
cite: string;
/**
* Sets or retrieves the date and time of a modification to the object.
*/
dateTime: string;
}
declare var HTMLModElement: {
prototype: HTMLModElement;
new(): HTMLModElement;
}
interface HTMLNextIdElement extends HTMLElement {
n: string;
}
declare var HTMLNextIdElement: {
prototype: HTMLNextIdElement;
new(): HTMLNextIdElement;
}
interface HTMLOListElement extends HTMLElement {
compact: boolean;
/**
* The starting number.
*/
start: number;
type: string;
}
declare var HTMLOListElement: {
prototype: HTMLOListElement;
new(): HTMLOListElement;
}
interface HTMLObjectElement extends HTMLElement, GetSVGDocument {
/**
* Retrieves a string of the URL where the object tag can be found. This is often the href of the document that the object is in, or the value set by a base element.
*/
BaseHref: string;
align: string;
/**
* Sets or retrieves a text alternative to the graphic.
*/
alt: string;
/**
* Gets or sets the optional alternative HTML script to execute if the object fails to load.
*/
altHtml: string;
/**
* Sets or retrieves a character string that can be used to implement your own archive functionality for the object.
*/
archive: string;
border: string;
/**
* Sets or retrieves the URL of the file containing the compiled Java class.
*/
code: string;
/**
* Sets or retrieves the URL of the component.
*/
codeBase: string;
/**
* Sets or retrieves the Internet media type for the code associated with the object.
*/
codeType: string;
/**
* Retrieves the document object of the page or frame.
*/
contentDocument: Document;
/**
* Sets or retrieves the URL that references the data of the object.
*/
data: string;
declare: boolean;
/**
* Retrieves a reference to the form that the object is embedded in.
*/
form: HTMLFormElement;
/**
* Sets or retrieves the height of the object.
*/
height: string;
hspace: number;
/**
* Gets or sets whether the DLNA PlayTo device is available.
*/
msPlayToDisabled: boolean;
/**
* Gets or sets the path to the preferred media source. This enables the Play To target device to stream the media content, which can be DRM protected, from a different location, such as a cloud media server.
*/
msPlayToPreferredSourceUri: string;
/**
* Gets or sets the primary DLNA PlayTo device.
*/
msPlayToPrimary: boolean;
/**
* Gets the source associated with the media element for use by the PlayToManager.
*/
msPlayToSource: any;
/**
* Sets or retrieves the name of the object.
*/
name: string;
/**
* Retrieves the contained object.
*/
object: any;
readyState: number;
/**
* Sets or retrieves a message to be displayed while an object is loading.
*/
standby: string;
/**
* Sets or retrieves the MIME type of the object.
*/
type: string;
/**
* Sets or retrieves the URL, often with a bookmark extension (#name), to use as a client-side image map.
*/
useMap: string;
/**
* Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.
*/
validationMessage: string;
/**
* Returns a ValidityState object that represents the validity states of an element.
*/
validity: ValidityState;
vspace: number;
/**
* Sets or retrieves the width of the object.
*/
width: string;
/**
* Returns whether an element will successfully validate based on forms validation rules and constraints.
*/
willValidate: boolean;
/**
* Returns whether a form will validate when it is submitted, without having to submit it.
*/
checkValidity(): boolean;
/**
* Sets a custom error message that is displayed when a form is submitted.
* @param error Sets a custom error message that is displayed when a form is submitted.
*/
setCustomValidity(error: string): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var HTMLObjectElement: {
prototype: HTMLObjectElement;
new(): HTMLObjectElement;
}
interface HTMLOptGroupElement extends HTMLElement {
/**
* Sets or retrieves the status of an option.
*/
defaultSelected: boolean;
disabled: boolean;
/**
* Retrieves a reference to the form that the object is embedded in.
*/
form: HTMLFormElement;
/**
* Sets or retrieves the ordinal position of an option in a list box.
*/
index: number;
/**
* Sets or retrieves a value that you can use to implement your own label functionality for the object.
*/
label: string;
/**
* Sets or retrieves whether the option in the list box is the default item.
*/
selected: boolean;
/**
* Sets or retrieves the text string specified by the option tag.
*/
text: string;
/**
* Sets or retrieves the value which is returned to the server when the form control is submitted.
*/
value: string;
}
declare var HTMLOptGroupElement: {
prototype: HTMLOptGroupElement;
new(): HTMLOptGroupElement;
}
interface HTMLOptionElement extends HTMLElement {
/**
* Sets or retrieves the status of an option.
*/
defaultSelected: boolean;
disabled: boolean;
/**
* Retrieves a reference to the form that the object is embedded in.
*/
form: HTMLFormElement;
/**
* Sets or retrieves the ordinal position of an option in a list box.
*/
index: number;
/**
* Sets or retrieves a value that you can use to implement your own label functionality for the object.
*/
label: string;
/**
* Sets or retrieves whether the option in the list box is the default item.
*/
selected: boolean;
/**
* Sets or retrieves the text string specified by the option tag.
*/
text: string;
/**
* Sets or retrieves the value which is returned to the server when the form control is submitted.
*/
value: string;
}
declare var HTMLOptionElement: {
prototype: HTMLOptionElement;
new(): HTMLOptionElement;
create(): HTMLOptionElement;
}
interface HTMLParagraphElement extends HTMLElement {
/**
* Sets or retrieves how the object is aligned with adjacent text.
*/
align: string;
clear: string;
}
declare var HTMLParagraphElement: {
prototype: HTMLParagraphElement;
new(): HTMLParagraphElement;
}
interface HTMLParamElement extends HTMLElement {
/**
* Sets or retrieves the name of an input parameter for an element.
*/
name: string;
/**
* Sets or retrieves the content type of the resource designated by the value attribute.
*/
type: string;
/**
* Sets or retrieves the value of an input parameter for an element.
*/
value: string;
/**
* Sets or retrieves the data type of the value attribute.
*/
valueType: string;
}
declare var HTMLParamElement: {
prototype: HTMLParamElement;
new(): HTMLParamElement;
}
interface HTMLPhraseElement extends HTMLElement {
/**
* Sets or retrieves reference information about the object.
*/
cite: string;
/**
* Sets or retrieves the date and time of a modification to the object.
*/
dateTime: string;
}
declare var HTMLPhraseElement: {
prototype: HTMLPhraseElement;
new(): HTMLPhraseElement;
}
interface HTMLPreElement extends HTMLElement {
/**
* Indicates a citation by rendering text in italic type.
*/
cite: string;
clear: string;
/**
* Sets or gets a value that you can use to implement your own width functionality for the object.
*/
width: number;
}
declare var HTMLPreElement: {
prototype: HTMLPreElement;
new(): HTMLPreElement;
}
interface HTMLProgressElement extends HTMLElement {
/**
* Retrieves a reference to the form that the object is embedded in.
*/
form: HTMLFormElement;
/**
* Defines the maximum, or "done" value for a progress element.
*/
max: number;
/**
* Returns the quotient of value/max when the value attribute is set (determinate progress bar), or -1 when the value attribute is missing (indeterminate progress bar).
*/
position: number;
/**
* Sets or gets the current value of a progress element. The value must be a non-negative number between 0 and the max value.
*/
value: number;
}
declare var HTMLProgressElement: {
prototype: HTMLProgressElement;
new(): HTMLProgressElement;
}
interface HTMLQuoteElement extends HTMLElement {
/**
* Sets or retrieves reference information about the object.
*/
cite: string;
/**
* Sets or retrieves the date and time of a modification to the object.
*/
dateTime: string;
}
declare var HTMLQuoteElement: {
prototype: HTMLQuoteElement;
new(): HTMLQuoteElement;
}
interface HTMLScriptElement extends HTMLElement {
async: boolean;
/**
* Sets or retrieves the character set used to encode the object.
*/
charset: string;
/**
* Sets or retrieves the status of the script.
*/
defer: boolean;
/**
* Sets or retrieves the event for which the script is written.
*/
event: string;
/**
* Sets or retrieves the object that is bound to the event script.
*/
htmlFor: string;
/**
* Retrieves the URL to an external file that contains the source code or data.
*/
src: string;
/**
* Retrieves or sets the text of the object as a string.
*/
text: string;
/**
* Sets or retrieves the MIME type for the associated scripting engine.
*/
type: string;
}
declare var HTMLScriptElement: {
prototype: HTMLScriptElement;
new(): HTMLScriptElement;
}
interface HTMLSelectElement extends HTMLElement {
/**
* Provides a way to direct a user to a specific field when a document loads. This can provide both direction and convenience for a user, reducing the need to click or tab to a field when a page opens. This attribute is true when present on an element, and false when missing.
*/
autofocus: boolean;
disabled: boolean;
/**
* Retrieves a reference to the form that the object is embedded in.
*/
form: HTMLFormElement;
/**
* Sets or retrieves the number of objects in a collection.
*/
length: number;
/**
* Sets or retrieves the Boolean value indicating whether multiple items can be selected from a list.
*/
multiple: boolean;
/**
* Sets or retrieves the name of the object.
*/
name: string;
options: HTMLSelectElement;
/**
* When present, marks an element that can't be submitted without a value.
*/
required: boolean;
/**
* Sets or retrieves the index of the selected option in a select object.
*/
selectedIndex: number;
/**
* Sets or retrieves the number of rows in the list box.
*/
size: number;
/**
* Retrieves the type of select control based on the value of the MULTIPLE attribute.
*/
type: string;
/**
* Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.
*/
validationMessage: string;
/**
* Returns a ValidityState object that represents the validity states of an element.
*/
validity: ValidityState;
/**
* Sets or retrieves the value which is returned to the server when the form control is submitted.
*/
value: string;
/**
* Returns whether an element will successfully validate based on forms validation rules and constraints.
*/
willValidate: boolean;
/**
* Adds an element to the areas, controlRange, or options collection.
* @param element Variant of type Number that specifies the index position in the collection where the element is placed. If no value is given, the method places the element at the end of the collection.
* @param before Variant of type Object that specifies an element to insert before, or null to append the object to the collection.
*/
add(element: HTMLElement, before?: HTMLElement): void;
add(element: HTMLElement, before?: number): void;
/**
* Returns whether a form will validate when it is submitted, without having to submit it.
*/
checkValidity(): boolean;
/**
* Retrieves a select object or an object from an options collection.
* @param name Variant of type Number or String that specifies the object or collection to retrieve. If this parameter is an integer, it is the zero-based index of the object. If this parameter is a string, all objects with matching name or id properties are retrieved, and a collection is returned if more than one match is made.
* @param index Variant of type Number that specifies the zero-based index of the object to retrieve when a collection is returned.
*/
item(name?: any, index?: any): any;
/**
* Retrieves a select object or an object from an options collection.
* @param namedItem A String that specifies the name or id property of the object to retrieve. A collection is returned if more than one match is made.
*/
namedItem(name: string): any;
/**
* Removes an element from the collection.
* @param index Number that specifies the zero-based index of the element to remove from the collection.
*/
remove(index?: number): void;
/**
* Sets a custom error message that is displayed when a form is submitted.
* @param error Sets a custom error message that is displayed when a form is submitted.
*/
setCustomValidity(error: string): void;
[name: string]: any;
}
declare var HTMLSelectElement: {
prototype: HTMLSelectElement;
new(): HTMLSelectElement;
}
interface HTMLSourceElement extends HTMLElement {
/**
* Gets or sets the intended media type of the media source.
*/
media: string;
msKeySystem: string;
/**
* The address or URL of the a media resource that is to be considered.
*/
src: string;
/**
* Gets or sets the MIME type of a media resource.
*/
type: string;
}
declare var HTMLSourceElement: {
prototype: HTMLSourceElement;
new(): HTMLSourceElement;
}
interface HTMLSpanElement extends HTMLElement {
}
declare var HTMLSpanElement: {
prototype: HTMLSpanElement;
new(): HTMLSpanElement;
}
interface HTMLStyleElement extends HTMLElement, LinkStyle {
/**
* Sets or retrieves the media type.
*/
media: string;
/**
* Retrieves the CSS language in which the style sheet is written.
*/
type: string;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var HTMLStyleElement: {
prototype: HTMLStyleElement;
new(): HTMLStyleElement;
}
interface HTMLTableCaptionElement extends HTMLElement {
/**
* Sets or retrieves the alignment of the caption or legend.
*/
align: string;
/**
* Sets or retrieves whether the caption appears at the top or bottom of the table.
*/
vAlign: string;
}
declare var HTMLTableCaptionElement: {
prototype: HTMLTableCaptionElement;
new(): HTMLTableCaptionElement;
}
interface HTMLTableCellElement extends HTMLElement, HTMLTableAlignment {
/**
* Sets or retrieves abbreviated text for the object.
*/
abbr: string;
/**
* Sets or retrieves how the object is aligned with adjacent text.
*/
align: string;
/**
* Sets or retrieves a comma-delimited list of conceptual categories associated with the object.
*/
axis: string;
bgColor: any;
/**
* Retrieves the position of the object in the cells collection of a row.
*/
cellIndex: number;
/**
* Sets or retrieves the number columns in the table that the object should span.
*/
colSpan: number;
/**
* Sets or retrieves a list of header cells that provide information for the object.
*/
headers: string;
/**
* Sets or retrieves the height of the object.
*/
height: any;
/**
* Sets or retrieves whether the browser automatically performs wordwrap.
*/
noWrap: boolean;
/**
* Sets or retrieves how many rows in a table the cell should span.
*/
rowSpan: number;
/**
* Sets or retrieves the group of cells in a table to which the object's information applies.
*/
scope: string;
/**
* Sets or retrieves the width of the object.
*/
width: string;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var HTMLTableCellElement: {
prototype: HTMLTableCellElement;
new(): HTMLTableCellElement;
}
interface HTMLTableColElement extends HTMLElement, HTMLTableAlignment {
/**
* Sets or retrieves the alignment of the object relative to the display or table.
*/
align: string;
/**
* Sets or retrieves the number of columns in the group.
*/
span: number;
/**
* Sets or retrieves the width of the object.
*/
width: any;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var HTMLTableColElement: {
prototype: HTMLTableColElement;
new(): HTMLTableColElement;
}
interface HTMLTableDataCellElement extends HTMLTableCellElement {
}
declare var HTMLTableDataCellElement: {
prototype: HTMLTableDataCellElement;
new(): HTMLTableDataCellElement;
}
interface HTMLTableElement extends HTMLElement {
/**
* Sets or retrieves a value that indicates the table alignment.
*/
align: string;
bgColor: any;
/**
* Sets or retrieves the width of the border to draw around the object.
*/
border: string;
/**
* Sets or retrieves the border color of the object.
*/
borderColor: any;
/**
* Retrieves the caption object of a table.
*/
caption: HTMLTableCaptionElement;
/**
* Sets or retrieves the amount of space between the border of the cell and the content of the cell.
*/
cellPadding: string;
/**
* Sets or retrieves the amount of space between cells in a table.
*/
cellSpacing: string;
/**
* Sets or retrieves the number of columns in the table.
*/
cols: number;
/**
* Sets or retrieves the way the border frame around the table is displayed.
*/
frame: string;
/**
* Sets or retrieves the height of the object.
*/
height: any;
/**
* Sets or retrieves the number of horizontal rows contained in the object.
*/
rows: HTMLCollection;
/**
* Sets or retrieves which dividing lines (inner borders) are displayed.
*/
rules: string;
/**
* Sets or retrieves a description and/or structure of the object.
*/
summary: string;
/**
* Retrieves a collection of all tBody objects in the table. Objects in this collection are in source order.
*/
tBodies: HTMLCollection;
/**
* Retrieves the tFoot object of the table.
*/
tFoot: HTMLTableSectionElement;
/**
* Retrieves the tHead object of the table.
*/
tHead: HTMLTableSectionElement;
/**
* Sets or retrieves the width of the object.
*/
width: string;
/**
* Creates an empty caption element in the table.
*/
createCaption(): HTMLElement;
/**
* Creates an empty tBody element in the table.
*/
createTBody(): HTMLElement;
/**
* Creates an empty tFoot element in the table.
*/
createTFoot(): HTMLElement;
/**
* Returns the tHead element object if successful, or null otherwise.
*/
createTHead(): HTMLElement;
/**
* Deletes the caption element and its contents from the table.
*/
deleteCaption(): void;
/**
* Removes the specified row (tr) from the element and from the rows collection.
* @param index Number that specifies the zero-based position in the rows collection of the row to remove.
*/
deleteRow(index?: number): void;
/**
* Deletes the tFoot element and its contents from the table.
*/
deleteTFoot(): void;
/**
* Deletes the tHead element and its contents from the table.
*/
deleteTHead(): void;
/**
* Creates a new row (tr) in the table, and adds the row to the rows collection.
* @param index Number that specifies where to insert the row in the rows collection. The default value is -1, which appends the new row to the end of the rows collection.
*/
insertRow(index?: number): HTMLElement;
}
declare var HTMLTableElement: {
prototype: HTMLTableElement;
new(): HTMLTableElement;
}
interface HTMLTableHeaderCellElement extends HTMLTableCellElement {
/**
* Sets or retrieves the group of cells in a table to which the object's information applies.
*/
scope: string;
}
declare var HTMLTableHeaderCellElement: {
prototype: HTMLTableHeaderCellElement;
new(): HTMLTableHeaderCellElement;
}
interface HTMLTableRowElement extends HTMLElement, HTMLTableAlignment {
/**
* Sets or retrieves how the object is aligned with adjacent text.
*/
align: string;
bgColor: any;
/**
* Retrieves a collection of all cells in the table row.
*/
cells: HTMLCollection;
/**
* Sets or retrieves the height of the object.
*/
height: any;
/**
* Retrieves the position of the object in the rows collection for the table.
*/
rowIndex: number;
/**
* Retrieves the position of the object in the collection.
*/
sectionRowIndex: number;
/**
* Removes the specified cell from the table row, as well as from the cells collection.
* @param index Number that specifies the zero-based position of the cell to remove from the table row. If no value is provided, the last cell in the cells collection is deleted.
*/
deleteCell(index?: number): void;
/**
* Creates a new cell in the table row, and adds the cell to the cells collection.
* @param index Number that specifies where to insert the cell in the tr. The default value is -1, which appends the new cell to the end of the cells collection.
*/
insertCell(index?: number): HTMLElement;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var HTMLTableRowElement: {
prototype: HTMLTableRowElement;
new(): HTMLTableRowElement;
}
interface HTMLTableSectionElement extends HTMLElement, HTMLTableAlignment {
/**
* Sets or retrieves a value that indicates the table alignment.
*/
align: string;
/**
* Sets or retrieves the number of horizontal rows contained in the object.
*/
rows: HTMLCollection;
/**
* Removes the specified row (tr) from the element and from the rows collection.
* @param index Number that specifies the zero-based position in the rows collection of the row to remove.
*/
deleteRow(index?: number): void;
/**
* Creates a new row (tr) in the table, and adds the row to the rows collection.
* @param index Number that specifies where to insert the row in the rows collection. The default value is -1, which appends the new row to the end of the rows collection.
*/
insertRow(index?: number): HTMLElement;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var HTMLTableSectionElement: {
prototype: HTMLTableSectionElement;
new(): HTMLTableSectionElement;
}
interface HTMLTextAreaElement extends HTMLElement {
/**
* Provides a way to direct a user to a specific field when a document loads. This can provide both direction and convenience for a user, reducing the need to click or tab to a field when a page opens. This attribute is true when present on an element, and false when missing.
*/
autofocus: boolean;
/**
* Sets or retrieves the width of the object.
*/
cols: number;
/**
* Sets or retrieves the initial contents of the object.
*/
defaultValue: string;
disabled: boolean;
/**
* Retrieves a reference to the form that the object is embedded in.
*/
form: HTMLFormElement;
/**
* Sets or retrieves the maximum number of characters that the user can enter in a text control.
*/
maxLength: number;
/**
* Sets or retrieves the name of the object.
*/
name: string;
/**
* Gets or sets a text string that is displayed in an input field as a hint or prompt to users as the format or type of information they need to enter.The text appears in an input field until the user puts focus on the field.
*/
placeholder: string;
/**
* Sets or retrieves the value indicated whether the content of the object is read-only.
*/
readOnly: boolean;
/**
* When present, marks an element that can't be submitted without a value.
*/
required: boolean;
/**
* Sets or retrieves the number of horizontal rows contained in the object.
*/
rows: number;
/**
* Gets or sets the end position or offset of a text selection.
*/
selectionEnd: number;
/**
* Gets or sets the starting position or offset of a text selection.
*/
selectionStart: number;
/**
* Sets or retrieves the value indicating whether the control is selected.
*/
status: any;
/**
* Retrieves the type of control.
*/
type: string;
/**
* Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.
*/
validationMessage: string;
/**
* Returns a ValidityState object that represents the validity states of an element.
*/
validity: ValidityState;
/**
* Retrieves or sets the text in the entry field of the textArea element.
*/
value: string;
/**
* Returns whether an element will successfully validate based on forms validation rules and constraints.
*/
willValidate: boolean;
/**
* Sets or retrieves how to handle wordwrapping in the object.
*/
wrap: string;
/**
* Returns whether a form will validate when it is submitted, without having to submit it.
*/
checkValidity(): boolean;
/**
* Creates a TextRange object for the element.
*/
createTextRange(): TextRange;
/**
* Highlights the input area of a form element.
*/
select(): void;
/**
* Sets a custom error message that is displayed when a form is submitted.
* @param error Sets a custom error message that is displayed when a form is submitted.
*/
setCustomValidity(error: string): void;
/**
* Sets the start and end positions of a selection in a text field.
* @param start The offset into the text field for the start of the selection.
* @param end The offset into the text field for the end of the selection.
*/
setSelectionRange(start: number, end: number): void;
}
declare var HTMLTextAreaElement: {
prototype: HTMLTextAreaElement;
new(): HTMLTextAreaElement;
}
interface HTMLTitleElement extends HTMLElement {
/**
* Retrieves or sets the text of the object as a string.
*/
text: string;
}
declare var HTMLTitleElement: {
prototype: HTMLTitleElement;
new(): HTMLTitleElement;
}
interface HTMLTrackElement extends HTMLElement {
default: boolean;
kind: string;
label: string;
readyState: number;
src: string;
srclang: string;
track: TextTrack;
ERROR: number;
LOADED: number;
LOADING: number;
NONE: number;
}
declare var HTMLTrackElement: {
prototype: HTMLTrackElement;
new(): HTMLTrackElement;
ERROR: number;
LOADED: number;
LOADING: number;
NONE: number;
}
interface HTMLUListElement extends HTMLElement {
compact: boolean;
type: string;
}
declare var HTMLUListElement: {
prototype: HTMLUListElement;
new(): HTMLUListElement;
}
interface HTMLUnknownElement extends HTMLElement {
}
declare var HTMLUnknownElement: {
prototype: HTMLUnknownElement;
new(): HTMLUnknownElement;
}
interface HTMLVideoElement extends HTMLMediaElement {
/**
* Gets or sets the height of the video element.
*/
height: number;
msHorizontalMirror: boolean;
msIsLayoutOptimalForPlayback: boolean;
msIsStereo3D: boolean;
msStereo3DPackingMode: string;
msStereo3DRenderMode: string;
msZoom: boolean;
onMSVideoFormatChanged: (ev: Event) => any;
onMSVideoFrameStepCompleted: (ev: Event) => any;
onMSVideoOptimalLayoutChanged: (ev: Event) => any;
/**
* Gets or sets a URL of an image to display, for example, like a movie poster. This can be a still frame from the video, or another image if no video data is available.
*/
poster: string;
/**
* Gets the intrinsic height of a video in CSS pixels, or zero if the dimensions are not known.
*/
videoHeight: number;
/**
* Gets the intrinsic width of a video in CSS pixels, or zero if the dimensions are not known.
*/
videoWidth: number;
webkitDisplayingFullscreen: boolean;
webkitSupportsFullscreen: boolean;
/**
* Gets or sets the width of the video element.
*/
width: number;
getVideoPlaybackQuality(): VideoPlaybackQuality;
msFrameStep(forward: boolean): void;
msInsertVideoEffect(activatableClassId: string, effectRequired: boolean, config?: any): void;
msSetVideoRectangle(left: number, top: number, right: number, bottom: number): void;
webkitEnterFullScreen(): void;
webkitEnterFullscreen(): void;
webkitExitFullScreen(): void;
webkitExitFullscreen(): void;
addEventListener(type: "MSContentZoom", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSManipulationStateChanged", listener: (ev: MSManipulationEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSVideoFormatChanged", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "MSVideoFrameStepCompleted", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "MSVideoOptimalLayoutChanged", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "activate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforecopy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforecut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforedeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "beforepaste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "copy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "cuechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "cut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "deactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
addEventListener(type: "msneedkey", listener: (ev: MSMediaKeyNeededEvent) => any, useCapture?: boolean): void;
addEventListener(type: "paste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "selectstart", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var HTMLVideoElement: {
prototype: HTMLVideoElement;
new(): HTMLVideoElement;
}
interface HashChangeEvent extends Event {
newURL: string;
oldURL: string;
}
declare var HashChangeEvent: {
prototype: HashChangeEvent;
new(type: string, eventInitDict?: HashChangeEventInit): HashChangeEvent;
}
interface History {
length: number;
state: any;
back(distance?: any): void;
forward(distance?: any): void;
go(delta?: any): void;
pushState(statedata: any, title?: string, url?: string): void;
replaceState(statedata: any, title?: string, url?: string): void;
}
declare var History: {
prototype: History;
new(): History;
}
interface IDBCursor {
direction: string;
key: any;
primaryKey: any;
source: any;
advance(count: number): void;
continue(key?: any): void;
delete(): IDBRequest;
update(value: any): IDBRequest;
NEXT: string;
NEXT_NO_DUPLICATE: string;
PREV: string;
PREV_NO_DUPLICATE: string;
}
declare var IDBCursor: {
prototype: IDBCursor;
new(): IDBCursor;
NEXT: string;
NEXT_NO_DUPLICATE: string;
PREV: string;
PREV_NO_DUPLICATE: string;
}
interface IDBCursorWithValue extends IDBCursor {
value: any;
}
declare var IDBCursorWithValue: {
prototype: IDBCursorWithValue;
new(): IDBCursorWithValue;
}
interface IDBDatabase extends EventTarget {
name: string;
objectStoreNames: DOMStringList;
onabort: (ev: Event) => any;
onerror: (ev: Event) => any;
version: string;
close(): void;
createObjectStore(name: string, optionalParameters?: any): IDBObjectStore;
deleteObjectStore(name: string): void;
transaction(storeNames: any, mode?: string): IDBTransaction;
addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var IDBDatabase: {
prototype: IDBDatabase;
new(): IDBDatabase;
}
interface IDBFactory {
cmp(first: any, second: any): number;
deleteDatabase(name: string): IDBOpenDBRequest;
open(name: string, version?: number): IDBOpenDBRequest;
}
declare var IDBFactory: {
prototype: IDBFactory;
new(): IDBFactory;
}
interface IDBIndex {
keyPath: string;
name: string;
objectStore: IDBObjectStore;
unique: boolean;
count(key?: any): IDBRequest;
get(key: any): IDBRequest;
getKey(key: any): IDBRequest;
openCursor(range?: IDBKeyRange, direction?: string): IDBRequest;
openKeyCursor(range?: IDBKeyRange, direction?: string): IDBRequest;
}
declare var IDBIndex: {
prototype: IDBIndex;
new(): IDBIndex;
}
interface IDBKeyRange {
lower: any;
lowerOpen: boolean;
upper: any;
upperOpen: boolean;
}
declare var IDBKeyRange: {
prototype: IDBKeyRange;
new(): IDBKeyRange;
bound(lower: any, upper: any, lowerOpen?: boolean, upperOpen?: boolean): IDBKeyRange;
lowerBound(bound: any, open?: boolean): IDBKeyRange;
only(value: any): IDBKeyRange;
upperBound(bound: any, open?: boolean): IDBKeyRange;
}
interface IDBObjectStore {
indexNames: DOMStringList;
keyPath: string;
name: string;
transaction: IDBTransaction;
add(value: any, key?: any): IDBRequest;
clear(): IDBRequest;
count(key?: any): IDBRequest;
createIndex(name: string, keyPath: string, optionalParameters?: any): IDBIndex;
delete(key: any): IDBRequest;
deleteIndex(indexName: string): void;
get(key: any): IDBRequest;
index(name: string): IDBIndex;
openCursor(range?: any, direction?: string): IDBRequest;
put(value: any, key?: any): IDBRequest;
}
declare var IDBObjectStore: {
prototype: IDBObjectStore;
new(): IDBObjectStore;
}
interface IDBOpenDBRequest extends IDBRequest {
onblocked: (ev: Event) => any;
onupgradeneeded: (ev: IDBVersionChangeEvent) => any;
addEventListener(type: "blocked", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
addEventListener(type: "success", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "upgradeneeded", listener: (ev: IDBVersionChangeEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var IDBOpenDBRequest: {
prototype: IDBOpenDBRequest;
new(): IDBOpenDBRequest;
}
interface IDBRequest extends EventTarget {
error: DOMError;
onerror: (ev: Event) => any;
onsuccess: (ev: Event) => any;
readyState: string;
result: any;
source: any;
transaction: IDBTransaction;
addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
addEventListener(type: "success", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var IDBRequest: {
prototype: IDBRequest;
new(): IDBRequest;
}
interface IDBTransaction extends EventTarget {
db: IDBDatabase;
error: DOMError;
mode: string;
onabort: (ev: Event) => any;
oncomplete: (ev: Event) => any;
onerror: (ev: Event) => any;
abort(): void;
objectStore(name: string): IDBObjectStore;
READ_ONLY: string;
READ_WRITE: string;
VERSION_CHANGE: string;
addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "complete", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var IDBTransaction: {
prototype: IDBTransaction;
new(): IDBTransaction;
READ_ONLY: string;
READ_WRITE: string;
VERSION_CHANGE: string;
}
interface IDBVersionChangeEvent extends Event {
newVersion: number;
oldVersion: number;
}
declare var IDBVersionChangeEvent: {
prototype: IDBVersionChangeEvent;
new(): IDBVersionChangeEvent;
}
interface ImageData {
data: number[];
height: number;
width: number;
}
declare var ImageData: {
prototype: ImageData;
new(): ImageData;
}
interface KeyboardEvent extends UIEvent {
altKey: boolean;
char: string;
charCode: number;
ctrlKey: boolean;
key: string;
keyCode: number;
locale: string;
location: number;
metaKey: boolean;
repeat: boolean;
shiftKey: boolean;
which: number;
getModifierState(keyArg: string): boolean;
initKeyboardEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, keyArg: string, locationArg: number, modifiersListArg: string, repeat: boolean, locale: string): void;
DOM_KEY_LOCATION_JOYSTICK: number;
DOM_KEY_LOCATION_LEFT: number;
DOM_KEY_LOCATION_MOBILE: number;
DOM_KEY_LOCATION_NUMPAD: number;
DOM_KEY_LOCATION_RIGHT: number;
DOM_KEY_LOCATION_STANDARD: number;
}
declare var KeyboardEvent: {
prototype: KeyboardEvent;
new(typeArg: string, eventInitDict?: KeyboardEventInit): KeyboardEvent;
DOM_KEY_LOCATION_JOYSTICK: number;
DOM_KEY_LOCATION_LEFT: number;
DOM_KEY_LOCATION_MOBILE: number;
DOM_KEY_LOCATION_NUMPAD: number;
DOM_KEY_LOCATION_RIGHT: number;
DOM_KEY_LOCATION_STANDARD: number;
}
interface Location {
hash: string;
host: string;
hostname: string;
href: string;
origin: string;
pathname: string;
port: string;
protocol: string;
search: string;
assign(url: string): void;
reload(forcedReload?: boolean): void;
replace(url: string): void;
toString(): string;
}
declare var Location: {
prototype: Location;
new(): Location;
}
interface LongRunningScriptDetectedEvent extends Event {
executionTime: number;
stopPageScriptExecution: boolean;
}
declare var LongRunningScriptDetectedEvent: {
prototype: LongRunningScriptDetectedEvent;
new(): LongRunningScriptDetectedEvent;
}
interface MSApp {
clearTemporaryWebDataAsync(): MSAppAsyncOperation;
createBlobFromRandomAccessStream(type: string, seeker: any): Blob;
createDataPackage(object: any): any;
createDataPackageFromSelection(): any;
createFileFromStorageFile(storageFile: any): File;
createStreamFromInputStream(type: string, inputStream: any): MSStream;
execAsyncAtPriority(asynchronousCallback: MSExecAtPriorityFunctionCallback, priority: string, ...args: any[]): void;
execAtPriority(synchronousCallback: MSExecAtPriorityFunctionCallback, priority: string, ...args: any[]): any;
getCurrentPriority(): string;
getHtmlPrintDocumentSourceAsync(htmlDoc: any): any;
getViewId(view: any): any;
isTaskScheduledAtPriorityOrHigher(priority: string): boolean;
pageHandlesAllApplicationActivations(enabled: boolean): void;
suppressSubdownloadCredentialPrompts(suppress: boolean): void;
terminateApp(exceptionObject: any): void;
CURRENT: string;
HIGH: string;
IDLE: string;
NORMAL: string;
}
declare var MSApp: MSApp;
interface MSAppAsyncOperation extends EventTarget {
error: DOMError;
oncomplete: (ev: Event) => any;
onerror: (ev: Event) => any;
readyState: number;
result: any;
start(): void;
COMPLETED: number;
ERROR: number;
STARTED: number;
addEventListener(type: "complete", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var MSAppAsyncOperation: {
prototype: MSAppAsyncOperation;
new(): MSAppAsyncOperation;
COMPLETED: number;
ERROR: number;
STARTED: number;
}
interface MSBlobBuilder {
append(data: any, endings?: string): void;
getBlob(contentType?: string): Blob;
}
declare var MSBlobBuilder: {
prototype: MSBlobBuilder;
new(): MSBlobBuilder;
}
interface MSCSSMatrix {
a: number;
b: number;
c: number;
d: number;
e: number;
f: number;
m11: number;
m12: number;
m13: number;
m14: number;
m21: number;
m22: number;
m23: number;
m24: number;
m31: number;
m32: number;
m33: number;
m34: number;
m41: number;
m42: number;
m43: number;
m44: number;
inverse(): MSCSSMatrix;
multiply(secondMatrix: MSCSSMatrix): MSCSSMatrix;
rotate(angleX: number, angleY?: number, angleZ?: number): MSCSSMatrix;
rotateAxisAngle(x: number, y: number, z: number, angle: number): MSCSSMatrix;
scale(scaleX: number, scaleY?: number, scaleZ?: number): MSCSSMatrix;
setMatrixValue(value: string): void;
skewX(angle: number): MSCSSMatrix;
skewY(angle: number): MSCSSMatrix;
toString(): string;
translate(x: number, y: number, z?: number): MSCSSMatrix;
}
declare var MSCSSMatrix: {
prototype: MSCSSMatrix;
new(text?: string): MSCSSMatrix;
}
interface MSGesture {
target: Element;
addPointer(pointerId: number): void;
stop(): void;
}
declare var MSGesture: {
prototype: MSGesture;
new(): MSGesture;
}
interface MSGestureEvent extends UIEvent {
clientX: number;
clientY: number;
expansion: number;
gestureObject: any;
hwTimestamp: number;
offsetX: number;
offsetY: number;
rotation: number;
scale: number;
screenX: number;
screenY: number;
translationX: number;
translationY: number;
velocityAngular: number;
velocityExpansion: number;
velocityX: number;
velocityY: number;
initGestureEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, offsetXArg: number, offsetYArg: number, translationXArg: number, translationYArg: number, scaleArg: number, expansionArg: number, rotationArg: number, velocityXArg: number, velocityYArg: number, velocityExpansionArg: number, velocityAngularArg: number, hwTimestampArg: number): void;
MSGESTURE_FLAG_BEGIN: number;
MSGESTURE_FLAG_CANCEL: number;
MSGESTURE_FLAG_END: number;
MSGESTURE_FLAG_INERTIA: number;
MSGESTURE_FLAG_NONE: number;
}
declare var MSGestureEvent: {
prototype: MSGestureEvent;
new(): MSGestureEvent;
MSGESTURE_FLAG_BEGIN: number;
MSGESTURE_FLAG_CANCEL: number;
MSGESTURE_FLAG_END: number;
MSGESTURE_FLAG_INERTIA: number;
MSGESTURE_FLAG_NONE: number;
}
interface MSGraphicsTrust {
constrictionActive: boolean;
status: string;
}
declare var MSGraphicsTrust: {
prototype: MSGraphicsTrust;
new(): MSGraphicsTrust;
}
interface MSHTMLWebViewElement extends HTMLElement {
canGoBack: boolean;
canGoForward: boolean;
containsFullScreenElement: boolean;
documentTitle: string;
height: number;
settings: MSWebViewSettings;
src: string;
width: number;
addWebAllowedObject(name: string, applicationObject: any): void;
buildLocalStreamUri(contentIdentifier: string, relativePath: string): string;
capturePreviewToBlobAsync(): MSWebViewAsyncOperation;
captureSelectedContentToDataPackageAsync(): MSWebViewAsyncOperation;
getDeferredPermissionRequestById(id: number): DeferredPermissionRequest;
getDeferredPermissionRequests(): DeferredPermissionRequest[];
goBack(): void;
goForward(): void;
invokeScriptAsync(scriptName: string, ...args: any[]): MSWebViewAsyncOperation;
navigate(uri: string): void;
navigateToLocalStreamUri(source: string, streamResolver: any): void;
navigateToString(contents: string): void;
navigateWithHttpRequestMessage(requestMessage: any): void;
refresh(): void;
stop(): void;
}
declare var MSHTMLWebViewElement: {
prototype: MSHTMLWebViewElement;
new(): MSHTMLWebViewElement;
}
interface MSHeaderFooter {
URL: string;
dateLong: string;
dateShort: string;
font: string;
htmlFoot: string;
htmlHead: string;
page: number;
pageTotal: number;
textFoot: string;
textHead: string;
timeLong: string;
timeShort: string;
title: string;
}
declare var MSHeaderFooter: {
prototype: MSHeaderFooter;
new(): MSHeaderFooter;
}
interface MSInputMethodContext extends EventTarget {
compositionEndOffset: number;
compositionStartOffset: number;
oncandidatewindowhide: (ev: Event) => any;
oncandidatewindowshow: (ev: Event) => any;
oncandidatewindowupdate: (ev: Event) => any;
target: HTMLElement;
getCandidateWindowClientRect(): ClientRect;
getCompositionAlternatives(): string[];
hasComposition(): boolean;
isCandidateWindowVisible(): boolean;
addEventListener(type: "MSCandidateWindowHide", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "MSCandidateWindowShow", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "MSCandidateWindowUpdate", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var MSInputMethodContext: {
prototype: MSInputMethodContext;
new(): MSInputMethodContext;
}
interface MSManipulationEvent extends UIEvent {
currentState: number;
inertiaDestinationX: number;
inertiaDestinationY: number;
lastState: number;
initMSManipulationEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, lastState: number, currentState: number): void;
MS_MANIPULATION_STATE_ACTIVE: number;
MS_MANIPULATION_STATE_CANCELLED: number;
MS_MANIPULATION_STATE_COMMITTED: number;
MS_MANIPULATION_STATE_DRAGGING: number;
MS_MANIPULATION_STATE_INERTIA: number;
MS_MANIPULATION_STATE_PRESELECT: number;
MS_MANIPULATION_STATE_SELECTING: number;
MS_MANIPULATION_STATE_STOPPED: number;
}
declare var MSManipulationEvent: {
prototype: MSManipulationEvent;
new(): MSManipulationEvent;
MS_MANIPULATION_STATE_ACTIVE: number;
MS_MANIPULATION_STATE_CANCELLED: number;
MS_MANIPULATION_STATE_COMMITTED: number;
MS_MANIPULATION_STATE_DRAGGING: number;
MS_MANIPULATION_STATE_INERTIA: number;
MS_MANIPULATION_STATE_PRESELECT: number;
MS_MANIPULATION_STATE_SELECTING: number;
MS_MANIPULATION_STATE_STOPPED: number;
}
interface MSMediaKeyError {
code: number;
systemCode: number;
MS_MEDIA_KEYERR_CLIENT: number;
MS_MEDIA_KEYERR_DOMAIN: number;
MS_MEDIA_KEYERR_HARDWARECHANGE: number;
MS_MEDIA_KEYERR_OUTPUT: number;
MS_MEDIA_KEYERR_SERVICE: number;
MS_MEDIA_KEYERR_UNKNOWN: number;
}
declare var MSMediaKeyError: {
prototype: MSMediaKeyError;
new(): MSMediaKeyError;
MS_MEDIA_KEYERR_CLIENT: number;
MS_MEDIA_KEYERR_DOMAIN: number;
MS_MEDIA_KEYERR_HARDWARECHANGE: number;
MS_MEDIA_KEYERR_OUTPUT: number;
MS_MEDIA_KEYERR_SERVICE: number;
MS_MEDIA_KEYERR_UNKNOWN: number;
}
interface MSMediaKeyMessageEvent extends Event {
destinationURL: string;
message: Uint8Array;
}
declare var MSMediaKeyMessageEvent: {
prototype: MSMediaKeyMessageEvent;
new(): MSMediaKeyMessageEvent;
}
interface MSMediaKeyNeededEvent extends Event {
initData: Uint8Array;
}
declare var MSMediaKeyNeededEvent: {
prototype: MSMediaKeyNeededEvent;
new(): MSMediaKeyNeededEvent;
}
interface MSMediaKeySession extends EventTarget {
error: MSMediaKeyError;
keySystem: string;
sessionId: string;
close(): void;
update(key: Uint8Array): void;
}
declare var MSMediaKeySession: {
prototype: MSMediaKeySession;
new(): MSMediaKeySession;
}
interface MSMediaKeys {
keySystem: string;
createSession(type: string, initData: Uint8Array, cdmData?: Uint8Array): MSMediaKeySession;
}
declare var MSMediaKeys: {
prototype: MSMediaKeys;
new(keySystem: string): MSMediaKeys;
isTypeSupported(keySystem: string, type?: string): boolean;
}
interface MSMimeTypesCollection {
length: number;
}
declare var MSMimeTypesCollection: {
prototype: MSMimeTypesCollection;
new(): MSMimeTypesCollection;
}
interface MSPluginsCollection {
length: number;
refresh(reload?: boolean): void;
}
declare var MSPluginsCollection: {
prototype: MSPluginsCollection;
new(): MSPluginsCollection;
}
interface MSPointerEvent extends MouseEvent {
currentPoint: any;
height: number;
hwTimestamp: number;
intermediatePoints: any;
isPrimary: boolean;
pointerId: number;
pointerType: any;
pressure: number;
rotation: number;
tiltX: number;
tiltY: number;
width: number;
getCurrentPoint(element: Element): void;
getIntermediatePoints(element: Element): void;
initPointerEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, ctrlKeyArg: boolean, altKeyArg: boolean, shiftKeyArg: boolean, metaKeyArg: boolean, buttonArg: number, relatedTargetArg: EventTarget, offsetXArg: number, offsetYArg: number, widthArg: number, heightArg: number, pressure: number, rotation: number, tiltX: number, tiltY: number, pointerIdArg: number, pointerType: any, hwTimestampArg: number, isPrimary: boolean): void;
}
declare var MSPointerEvent: {
prototype: MSPointerEvent;
new(typeArg: string, eventInitDict?: PointerEventInit): MSPointerEvent;
}
interface MSPrintManagerTemplatePrinter extends MSTemplatePrinter, EventTarget {
percentScale: number;
showHeaderFooter: boolean;
shrinkToFit: boolean;
drawPreviewPage(element: HTMLElement, pageNumber: number): void;
endPrint(): void;
getPrintTaskOptionValue(key: string): any;
invalidatePreview(): void;
setPageCount(pageCount: number): void;
startPrint(): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var MSPrintManagerTemplatePrinter: {
prototype: MSPrintManagerTemplatePrinter;
new(): MSPrintManagerTemplatePrinter;
}
interface MSRangeCollection {
length: number;
item(index: number): Range;
[index: number]: Range;
}
declare var MSRangeCollection: {
prototype: MSRangeCollection;
new(): MSRangeCollection;
}
interface MSSiteModeEvent extends Event {
actionURL: string;
buttonID: number;
}
declare var MSSiteModeEvent: {
prototype: MSSiteModeEvent;
new(): MSSiteModeEvent;
}
interface MSStream {
type: string;
msClose(): void;
msDetachStream(): any;
}
declare var MSStream: {
prototype: MSStream;
new(): MSStream;
}
interface MSStreamReader extends EventTarget, MSBaseReader {
error: DOMError;
readAsArrayBuffer(stream: MSStream, size?: number): void;
readAsBinaryString(stream: MSStream, size?: number): void;
readAsBlob(stream: MSStream, size?: number): void;
readAsDataURL(stream: MSStream, size?: number): void;
readAsText(stream: MSStream, encoding?: string, size?: number): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var MSStreamReader: {
prototype: MSStreamReader;
new(): MSStreamReader;
}
interface MSTemplatePrinter {
collate: boolean;
copies: number;
currentPage: boolean;
currentPageAvail: boolean;
duplex: boolean;
footer: string;
frameActive: boolean;
frameActiveEnabled: boolean;
frameAsShown: boolean;
framesetDocument: boolean;
header: string;
headerFooterFont: string;
marginBottom: number;
marginLeft: number;
marginRight: number;
marginTop: number;
orientation: string;
pageFrom: number;
pageHeight: number;
pageTo: number;
pageWidth: number;
selectedPages: boolean;
selection: boolean;
selectionEnabled: boolean;
unprintableBottom: number;
unprintableLeft: number;
unprintableRight: number;
unprintableTop: number;
usePrinterCopyCollate: boolean;
createHeaderFooter(): MSHeaderFooter;
deviceSupports(property: string): any;
ensurePrintDialogDefaults(): boolean;
getPageMarginBottom(pageRule: CSSPageRule, pageWidth: number, pageHeight: number): any;
getPageMarginBottomImportant(pageRule: CSSPageRule): boolean;
getPageMarginLeft(pageRule: CSSPageRule, pageWidth: number, pageHeight: number): any;
getPageMarginLeftImportant(pageRule: CSSPageRule): boolean;
getPageMarginRight(pageRule: CSSPageRule, pageWidth: number, pageHeight: number): any;
getPageMarginRightImportant(pageRule: CSSPageRule): boolean;
getPageMarginTop(pageRule: CSSPageRule, pageWidth: number, pageHeight: number): any;
getPageMarginTopImportant(pageRule: CSSPageRule): boolean;
printBlankPage(): void;
printNonNative(document: any): boolean;
printNonNativeFrames(document: any, activeFrame: boolean): void;
printPage(element: HTMLElement): void;
showPageSetupDialog(): boolean;
showPrintDialog(): boolean;
startDoc(title: string): boolean;
stopDoc(): void;
updatePageStatus(status: number): void;
}
declare var MSTemplatePrinter: {
prototype: MSTemplatePrinter;
new(): MSTemplatePrinter;
}
interface MSWebViewAsyncOperation extends EventTarget {
error: DOMError;
oncomplete: (ev: Event) => any;
onerror: (ev: Event) => any;
readyState: number;
result: any;
target: MSHTMLWebViewElement;
type: number;
start(): void;
COMPLETED: number;
ERROR: number;
STARTED: number;
TYPE_CAPTURE_PREVIEW_TO_RANDOM_ACCESS_STREAM: number;
TYPE_CREATE_DATA_PACKAGE_FROM_SELECTION: number;
TYPE_INVOKE_SCRIPT: number;
addEventListener(type: "complete", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var MSWebViewAsyncOperation: {
prototype: MSWebViewAsyncOperation;
new(): MSWebViewAsyncOperation;
COMPLETED: number;
ERROR: number;
STARTED: number;
TYPE_CAPTURE_PREVIEW_TO_RANDOM_ACCESS_STREAM: number;
TYPE_CREATE_DATA_PACKAGE_FROM_SELECTION: number;
TYPE_INVOKE_SCRIPT: number;
}
interface MSWebViewSettings {
isIndexedDBEnabled: boolean;
isJavaScriptEnabled: boolean;
}
declare var MSWebViewSettings: {
prototype: MSWebViewSettings;
new(): MSWebViewSettings;
}
interface MediaElementAudioSourceNode extends AudioNode {
}
declare var MediaElementAudioSourceNode: {
prototype: MediaElementAudioSourceNode;
new(): MediaElementAudioSourceNode;
}
interface MediaError {
code: number;
msExtendedCode: number;
MEDIA_ERR_ABORTED: number;
MEDIA_ERR_DECODE: number;
MEDIA_ERR_NETWORK: number;
MEDIA_ERR_SRC_NOT_SUPPORTED: number;
MS_MEDIA_ERR_ENCRYPTED: number;
}
declare var MediaError: {
prototype: MediaError;
new(): MediaError;
MEDIA_ERR_ABORTED: number;
MEDIA_ERR_DECODE: number;
MEDIA_ERR_NETWORK: number;
MEDIA_ERR_SRC_NOT_SUPPORTED: number;
MS_MEDIA_ERR_ENCRYPTED: number;
}
interface MediaList {
length: number;
mediaText: string;
appendMedium(newMedium: string): void;
deleteMedium(oldMedium: string): void;
item(index: number): string;
toString(): string;
[index: number]: string;
}
declare var MediaList: {
prototype: MediaList;
new(): MediaList;
}
interface MediaQueryList {
matches: boolean;
media: string;
addListener(listener: MediaQueryListListener): void;
removeListener(listener: MediaQueryListListener): void;
}
declare var MediaQueryList: {
prototype: MediaQueryList;
new(): MediaQueryList;
}
interface MediaSource extends EventTarget {
activeSourceBuffers: SourceBufferList;
duration: number;
readyState: string;
sourceBuffers: SourceBufferList;
addSourceBuffer(type: string): SourceBuffer;
endOfStream(error?: string): void;
removeSourceBuffer(sourceBuffer: SourceBuffer): void;
}
declare var MediaSource: {
prototype: MediaSource;
new(): MediaSource;
isTypeSupported(type: string): boolean;
}
interface MessageChannel {
port1: MessagePort;
port2: MessagePort;
}
declare var MessageChannel: {
prototype: MessageChannel;
new(): MessageChannel;
}
interface MessageEvent extends Event {
data: any;
origin: string;
ports: any;
source: Window;
initMessageEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, dataArg: any, originArg: string, lastEventIdArg: string, sourceArg: Window): void;
}
declare var MessageEvent: {
prototype: MessageEvent;
new(): MessageEvent;
}
interface MessagePort extends EventTarget {
onmessage: (ev: MessageEvent) => any;
close(): void;
postMessage(message?: any, ports?: any): void;
start(): void;
addEventListener(type: "message", listener: (ev: MessageEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var MessagePort: {
prototype: MessagePort;
new(): MessagePort;
}
interface MimeType {
description: string;
enabledPlugin: Plugin;
suffixes: string;
type: string;
}
declare var MimeType: {
prototype: MimeType;
new(): MimeType;
}
interface MimeTypeArray {
length: number;
item(index: number): Plugin;
namedItem(type: string): Plugin;
[index: number]: Plugin;
}
declare var MimeTypeArray: {
prototype: MimeTypeArray;
new(): MimeTypeArray;
}
interface MouseEvent extends UIEvent {
altKey: boolean;
button: number;
buttons: number;
clientX: number;
clientY: number;
ctrlKey: boolean;
fromElement: Element;
layerX: number;
layerY: number;
metaKey: boolean;
movementX: number;
movementY: number;
offsetX: number;
offsetY: number;
pageX: number;
pageY: number;
relatedTarget: EventTarget;
screenX: number;
screenY: number;
shiftKey: boolean;
toElement: Element;
which: number;
x: number;
y: number;
getModifierState(keyArg: string): boolean;
initMouseEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, ctrlKeyArg: boolean, altKeyArg: boolean, shiftKeyArg: boolean, metaKeyArg: boolean, buttonArg: number, relatedTargetArg: EventTarget): void;
}
declare var MouseEvent: {
prototype: MouseEvent;
new(typeArg: string, eventInitDict?: MouseEventInit): MouseEvent;
}
interface MouseWheelEvent extends MouseEvent {
wheelDelta: number;
wheelDeltaX: number;
wheelDeltaY: number;
initMouseWheelEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, buttonArg: number, relatedTargetArg: EventTarget, modifiersListArg: string, wheelDeltaArg: number): void;
}
declare var MouseWheelEvent: {
prototype: MouseWheelEvent;
new(): MouseWheelEvent;
}
interface MutationEvent extends Event {
attrChange: number;
attrName: string;
newValue: string;
prevValue: string;
relatedNode: Node;
initMutationEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, relatedNodeArg: Node, prevValueArg: string, newValueArg: string, attrNameArg: string, attrChangeArg: number): void;
ADDITION: number;
MODIFICATION: number;
REMOVAL: number;
}
declare var MutationEvent: {
prototype: MutationEvent;
new(): MutationEvent;
ADDITION: number;
MODIFICATION: number;
REMOVAL: number;
}
interface MutationObserver {
disconnect(): void;
observe(target: Node, options: MutationObserverInit): void;
takeRecords(): MutationRecord[];
}
declare var MutationObserver: {
prototype: MutationObserver;
new(callback: MutationCallback): MutationObserver;
}
interface MutationRecord {
addedNodes: NodeList;
attributeName: string;
attributeNamespace: string;
nextSibling: Node;
oldValue: string;
previousSibling: Node;
removedNodes: NodeList;
target: Node;
type: string;
}
declare var MutationRecord: {
prototype: MutationRecord;
new(): MutationRecord;
}
interface NamedNodeMap {
length: number;
getNamedItem(name: string): Attr;
getNamedItemNS(namespaceURI: string, localName: string): Attr;
item(index: number): Attr;
removeNamedItem(name: string): Attr;
removeNamedItemNS(namespaceURI: string, localName: string): Attr;
setNamedItem(arg: Attr): Attr;
setNamedItemNS(arg: Attr): Attr;
[index: number]: Attr;
}
declare var NamedNodeMap: {
prototype: NamedNodeMap;
new(): NamedNodeMap;
}
interface NavigationCompletedEvent extends NavigationEvent {
isSuccess: boolean;
webErrorStatus: number;
}
declare var NavigationCompletedEvent: {
prototype: NavigationCompletedEvent;
new(): NavigationCompletedEvent;
}
interface NavigationEvent extends Event {
uri: string;
}
declare var NavigationEvent: {
prototype: NavigationEvent;
new(): NavigationEvent;
}
interface NavigationEventWithReferrer extends NavigationEvent {
referer: string;
}
declare var NavigationEventWithReferrer: {
prototype: NavigationEventWithReferrer;
new(): NavigationEventWithReferrer;
}
interface Navigator extends Object, NavigatorID, NavigatorOnLine, NavigatorContentUtils, NavigatorStorageUtils, NavigatorGeolocation, MSNavigatorDoNotTrack, MSFileSaver {
appCodeName: string;
appMinorVersion: string;
browserLanguage: string;
connectionSpeed: number;
cookieEnabled: boolean;
cpuClass: string;
language: string;
maxTouchPoints: number;
mimeTypes: MSMimeTypesCollection;
msManipulationViewsEnabled: boolean;
msMaxTouchPoints: number;
msPointerEnabled: boolean;
plugins: MSPluginsCollection;
pointerEnabled: boolean;
systemLanguage: string;
userLanguage: string;
webdriver: boolean;
getGamepads(): Gamepad[];
javaEnabled(): boolean;
msLaunchUri(uri: string, successCallback?: MSLaunchUriCallback, noHandlerCallback?: MSLaunchUriCallback): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var Navigator: {
prototype: Navigator;
new(): Navigator;
}
interface Node extends EventTarget {
attributes: NamedNodeMap;
baseURI: string;
childNodes: NodeList;
firstChild: Node;
lastChild: Node;
localName: string;
namespaceURI: string;
nextSibling: Node;
nodeName: string;
nodeType: number;
nodeValue: string;
ownerDocument: Document;
parentElement: HTMLElement;
parentNode: Node;
prefix: string;
previousSibling: Node;
textContent: string;
appendChild(newChild: Node): Node;
cloneNode(deep?: boolean): Node;
compareDocumentPosition(other: Node): number;
hasAttributes(): boolean;
hasChildNodes(): boolean;
insertBefore(newChild: Node, refChild?: Node): Node;
isDefaultNamespace(namespaceURI: string): boolean;
isEqualNode(arg: Node): boolean;
isSameNode(other: Node): boolean;
lookupNamespaceURI(prefix: string): string;
lookupPrefix(namespaceURI: string): string;
normalize(): void;
removeChild(oldChild: Node): Node;
replaceChild(newChild: Node, oldChild: Node): Node;
ATTRIBUTE_NODE: number;
CDATA_SECTION_NODE: number;
COMMENT_NODE: number;
DOCUMENT_FRAGMENT_NODE: number;
DOCUMENT_NODE: number;
DOCUMENT_POSITION_CONTAINED_BY: number;
DOCUMENT_POSITION_CONTAINS: number;
DOCUMENT_POSITION_DISCONNECTED: number;
DOCUMENT_POSITION_FOLLOWING: number;
DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: number;
DOCUMENT_POSITION_PRECEDING: number;
DOCUMENT_TYPE_NODE: number;
ELEMENT_NODE: number;
ENTITY_NODE: number;
ENTITY_REFERENCE_NODE: number;
NOTATION_NODE: number;
PROCESSING_INSTRUCTION_NODE: number;
TEXT_NODE: number;
}
declare var Node: {
prototype: Node;
new(): Node;
ATTRIBUTE_NODE: number;
CDATA_SECTION_NODE: number;
COMMENT_NODE: number;
DOCUMENT_FRAGMENT_NODE: number;
DOCUMENT_NODE: number;
DOCUMENT_POSITION_CONTAINED_BY: number;
DOCUMENT_POSITION_CONTAINS: number;
DOCUMENT_POSITION_DISCONNECTED: number;
DOCUMENT_POSITION_FOLLOWING: number;
DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: number;
DOCUMENT_POSITION_PRECEDING: number;
DOCUMENT_TYPE_NODE: number;
ELEMENT_NODE: number;
ENTITY_NODE: number;
ENTITY_REFERENCE_NODE: number;
NOTATION_NODE: number;
PROCESSING_INSTRUCTION_NODE: number;
TEXT_NODE: number;
}
interface NodeFilter {
FILTER_ACCEPT: number;
FILTER_REJECT: number;
FILTER_SKIP: number;
SHOW_ALL: number;
SHOW_ATTRIBUTE: number;
SHOW_CDATA_SECTION: number;
SHOW_COMMENT: number;
SHOW_DOCUMENT: number;
SHOW_DOCUMENT_FRAGMENT: number;
SHOW_DOCUMENT_TYPE: number;
SHOW_ELEMENT: number;
SHOW_ENTITY: number;
SHOW_ENTITY_REFERENCE: number;
SHOW_NOTATION: number;
SHOW_PROCESSING_INSTRUCTION: number;
SHOW_TEXT: number;
}
declare var NodeFilter: NodeFilter;
interface NodeIterator {
expandEntityReferences: boolean;
filter: NodeFilter;
root: Node;
whatToShow: number;
detach(): void;
nextNode(): Node;
previousNode(): Node;
}
declare var NodeIterator: {
prototype: NodeIterator;
new(): NodeIterator;
}
interface NodeList {
length: number;
item(index: number): Node;
[index: number]: Node;
}
declare var NodeList: {
prototype: NodeList;
new(): NodeList;
}
interface OES_element_index_uint {
}
declare var OES_element_index_uint: {
prototype: OES_element_index_uint;
new(): OES_element_index_uint;
}
interface OES_standard_derivatives {
FRAGMENT_SHADER_DERIVATIVE_HINT_OES: number;
}
declare var OES_standard_derivatives: {
prototype: OES_standard_derivatives;
new(): OES_standard_derivatives;
FRAGMENT_SHADER_DERIVATIVE_HINT_OES: number;
}
interface OES_texture_float {
}
declare var OES_texture_float: {
prototype: OES_texture_float;
new(): OES_texture_float;
}
interface OES_texture_float_linear {
}
declare var OES_texture_float_linear: {
prototype: OES_texture_float_linear;
new(): OES_texture_float_linear;
}
interface OfflineAudioCompletionEvent extends Event {
renderedBuffer: AudioBuffer;
}
declare var OfflineAudioCompletionEvent: {
prototype: OfflineAudioCompletionEvent;
new(): OfflineAudioCompletionEvent;
}
interface OfflineAudioContext extends AudioContext {
oncomplete: (ev: Event) => any;
startRendering(): void;
addEventListener(type: "complete", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var OfflineAudioContext: {
prototype: OfflineAudioContext;
new(numberOfChannels: number, length: number, sampleRate: number): OfflineAudioContext;
}
interface OscillatorNode extends AudioNode {
detune: AudioParam;
frequency: AudioParam;
onended: (ev: Event) => any;
type: string;
setPeriodicWave(periodicWave: PeriodicWave): void;
start(when?: number): void;
stop(when?: number): void;
addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var OscillatorNode: {
prototype: OscillatorNode;
new(): OscillatorNode;
}
interface PageTransitionEvent extends Event {
persisted: boolean;
}
declare var PageTransitionEvent: {
prototype: PageTransitionEvent;
new(): PageTransitionEvent;
}
interface PannerNode extends AudioNode {
coneInnerAngle: number;
coneOuterAngle: number;
coneOuterGain: number;
distanceModel: string;
maxDistance: number;
panningModel: string;
refDistance: number;
rolloffFactor: number;
setOrientation(x: number, y: number, z: number): void;
setPosition(x: number, y: number, z: number): void;
setVelocity(x: number, y: number, z: number): void;
}
declare var PannerNode: {
prototype: PannerNode;
new(): PannerNode;
}
interface PerfWidgetExternal {
activeNetworkRequestCount: number;
averageFrameTime: number;
averagePaintTime: number;
extraInformationEnabled: boolean;
independentRenderingEnabled: boolean;
irDisablingContentString: string;
irStatusAvailable: boolean;
maxCpuSpeed: number;
paintRequestsPerSecond: number;
performanceCounter: number;
performanceCounterFrequency: number;
addEventListener(eventType: string, callback: Function): void;
getMemoryUsage(): number;
getProcessCpuUsage(): number;
getRecentCpuUsage(last: number): any;
getRecentFrames(last: number): any;
getRecentMemoryUsage(last: number): any;
getRecentPaintRequests(last: number): any;
removeEventListener(eventType: string, callback: Function): void;
repositionWindow(x: number, y: number): void;
resizeWindow(width: number, height: number): void;
}
declare var PerfWidgetExternal: {
prototype: PerfWidgetExternal;
new(): PerfWidgetExternal;
}
interface Performance {
navigation: PerformanceNavigation;
timing: PerformanceTiming;
clearMarks(markName?: string): void;
clearMeasures(measureName?: string): void;
clearResourceTimings(): void;
getEntries(): any;
getEntriesByName(name: string, entryType?: string): any;
getEntriesByType(entryType: string): any;
getMarks(markName?: string): any;
getMeasures(measureName?: string): any;
mark(markName: string): void;
measure(measureName: string, startMarkName?: string, endMarkName?: string): void;
now(): number;
setResourceTimingBufferSize(maxSize: number): void;
toJSON(): any;
}
declare var Performance: {
prototype: Performance;
new(): Performance;
}
interface PerformanceEntry {
duration: number;
entryType: string;
name: string;
startTime: number;
}
declare var PerformanceEntry: {
prototype: PerformanceEntry;
new(): PerformanceEntry;
}
interface PerformanceMark extends PerformanceEntry {
}
declare var PerformanceMark: {
prototype: PerformanceMark;
new(): PerformanceMark;
}
interface PerformanceMeasure extends PerformanceEntry {
}
declare var PerformanceMeasure: {
prototype: PerformanceMeasure;
new(): PerformanceMeasure;
}
interface PerformanceNavigation {
redirectCount: number;
type: number;
toJSON(): any;
TYPE_BACK_FORWARD: number;
TYPE_NAVIGATE: number;
TYPE_RELOAD: number;
TYPE_RESERVED: number;
}
declare var PerformanceNavigation: {
prototype: PerformanceNavigation;
new(): PerformanceNavigation;
TYPE_BACK_FORWARD: number;
TYPE_NAVIGATE: number;
TYPE_RELOAD: number;
TYPE_RESERVED: number;
}
interface PerformanceNavigationTiming extends PerformanceEntry {
connectEnd: number;
connectStart: number;
domComplete: number;
domContentLoadedEventEnd: number;
domContentLoadedEventStart: number;
domInteractive: number;
domLoading: number;
domainLookupEnd: number;
domainLookupStart: number;
fetchStart: number;
loadEventEnd: number;
loadEventStart: number;
navigationStart: number;
redirectCount: number;
redirectEnd: number;
redirectStart: number;
requestStart: number;
responseEnd: number;
responseStart: number;
type: string;
unloadEventEnd: number;
unloadEventStart: number;
}
declare var PerformanceNavigationTiming: {
prototype: PerformanceNavigationTiming;
new(): PerformanceNavigationTiming;
}
interface PerformanceResourceTiming extends PerformanceEntry {
connectEnd: number;
connectStart: number;
domainLookupEnd: number;
domainLookupStart: number;
fetchStart: number;
initiatorType: string;
redirectEnd: number;
redirectStart: number;
requestStart: number;
responseEnd: number;
responseStart: number;
}
declare var PerformanceResourceTiming: {
prototype: PerformanceResourceTiming;
new(): PerformanceResourceTiming;
}
interface PerformanceTiming {
connectEnd: number;
connectStart: number;
domComplete: number;
domContentLoadedEventEnd: number;
domContentLoadedEventStart: number;
domInteractive: number;
domLoading: number;
domainLookupEnd: number;
domainLookupStart: number;
fetchStart: number;
loadEventEnd: number;
loadEventStart: number;
msFirstPaint: number;
navigationStart: number;
redirectEnd: number;
redirectStart: number;
requestStart: number;
responseEnd: number;
responseStart: number;
unloadEventEnd: number;
unloadEventStart: number;
toJSON(): any;
}
declare var PerformanceTiming: {
prototype: PerformanceTiming;
new(): PerformanceTiming;
}
interface PeriodicWave {
}
declare var PeriodicWave: {
prototype: PeriodicWave;
new(): PeriodicWave;
}
interface PermissionRequest extends DeferredPermissionRequest {
state: string;
defer(): void;
}
declare var PermissionRequest: {
prototype: PermissionRequest;
new(): PermissionRequest;
}
interface PermissionRequestedEvent extends Event {
permissionRequest: PermissionRequest;
}
declare var PermissionRequestedEvent: {
prototype: PermissionRequestedEvent;
new(): PermissionRequestedEvent;
}
interface Plugin {
description: string;
filename: string;
length: number;
name: string;
version: string;
item(index: number): MimeType;
namedItem(type: string): MimeType;
[index: number]: MimeType;
}
declare var Plugin: {
prototype: Plugin;
new(): Plugin;
}
interface PluginArray {
length: number;
item(index: number): Plugin;
namedItem(name: string): Plugin;
refresh(reload?: boolean): void;
[index: number]: Plugin;
}
declare var PluginArray: {
prototype: PluginArray;
new(): PluginArray;
}
interface PointerEvent extends MouseEvent {
currentPoint: any;
height: number;
hwTimestamp: number;
intermediatePoints: any;
isPrimary: boolean;
pointerId: number;
pointerType: any;
pressure: number;
rotation: number;
tiltX: number;
tiltY: number;
width: number;
getCurrentPoint(element: Element): void;
getIntermediatePoints(element: Element): void;
initPointerEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, ctrlKeyArg: boolean, altKeyArg: boolean, shiftKeyArg: boolean, metaKeyArg: boolean, buttonArg: number, relatedTargetArg: EventTarget, offsetXArg: number, offsetYArg: number, widthArg: number, heightArg: number, pressure: number, rotation: number, tiltX: number, tiltY: number, pointerIdArg: number, pointerType: any, hwTimestampArg: number, isPrimary: boolean): void;
}
declare var PointerEvent: {
prototype: PointerEvent;
new(typeArg: string, eventInitDict?: PointerEventInit): PointerEvent;
}
interface PopStateEvent extends Event {
state: any;
initPopStateEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, stateArg: any): void;
}
declare var PopStateEvent: {
prototype: PopStateEvent;
new(): PopStateEvent;
}
interface Position {
coords: Coordinates;
timestamp: Date;
}
declare var Position: {
prototype: Position;
new(): Position;
}
interface PositionError {
code: number;
message: string;
toString(): string;
PERMISSION_DENIED: number;
POSITION_UNAVAILABLE: number;
TIMEOUT: number;
}
declare var PositionError: {
prototype: PositionError;
new(): PositionError;
PERMISSION_DENIED: number;
POSITION_UNAVAILABLE: number;
TIMEOUT: number;
}
interface ProcessingInstruction extends CharacterData {
target: string;
}
declare var ProcessingInstruction: {
prototype: ProcessingInstruction;
new(): ProcessingInstruction;
}
interface ProgressEvent extends Event {
lengthComputable: boolean;
loaded: number;
total: number;
initProgressEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, lengthComputableArg: boolean, loadedArg: number, totalArg: number): void;
}
declare var ProgressEvent: {
prototype: ProgressEvent;
new(): ProgressEvent;
}
interface Range {
collapsed: boolean;
commonAncestorContainer: Node;
endContainer: Node;
endOffset: number;
startContainer: Node;
startOffset: number;
cloneContents(): DocumentFragment;
cloneRange(): Range;
collapse(toStart: boolean): void;
compareBoundaryPoints(how: number, sourceRange: Range): number;
createContextualFragment(fragment: string): DocumentFragment;
deleteContents(): void;
detach(): void;
expand(Unit: string): boolean;
extractContents(): DocumentFragment;
getBoundingClientRect(): ClientRect;
getClientRects(): ClientRectList;
insertNode(newNode: Node): void;
selectNode(refNode: Node): void;
selectNodeContents(refNode: Node): void;
setEnd(refNode: Node, offset: number): void;
setEndAfter(refNode: Node): void;
setEndBefore(refNode: Node): void;
setStart(refNode: Node, offset: number): void;
setStartAfter(refNode: Node): void;
setStartBefore(refNode: Node): void;
surroundContents(newParent: Node): void;
toString(): string;
END_TO_END: number;
END_TO_START: number;
START_TO_END: number;
START_TO_START: number;
}
declare var Range: {
prototype: Range;
new(): Range;
END_TO_END: number;
END_TO_START: number;
START_TO_END: number;
START_TO_START: number;
}
interface SVGAElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGURIReference {
target: SVGAnimatedString;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGAElement: {
prototype: SVGAElement;
new(): SVGAElement;
}
interface SVGAngle {
unitType: number;
value: number;
valueAsString: string;
valueInSpecifiedUnits: number;
convertToSpecifiedUnits(unitType: number): void;
newValueSpecifiedUnits(unitType: number, valueInSpecifiedUnits: number): void;
SVG_ANGLETYPE_DEG: number;
SVG_ANGLETYPE_GRAD: number;
SVG_ANGLETYPE_RAD: number;
SVG_ANGLETYPE_UNKNOWN: number;
SVG_ANGLETYPE_UNSPECIFIED: number;
}
declare var SVGAngle: {
prototype: SVGAngle;
new(): SVGAngle;
SVG_ANGLETYPE_DEG: number;
SVG_ANGLETYPE_GRAD: number;
SVG_ANGLETYPE_RAD: number;
SVG_ANGLETYPE_UNKNOWN: number;
SVG_ANGLETYPE_UNSPECIFIED: number;
}
interface SVGAnimatedAngle {
animVal: SVGAngle;
baseVal: SVGAngle;
}
declare var SVGAnimatedAngle: {
prototype: SVGAnimatedAngle;
new(): SVGAnimatedAngle;
}
interface SVGAnimatedBoolean {
animVal: boolean;
baseVal: boolean;
}
declare var SVGAnimatedBoolean: {
prototype: SVGAnimatedBoolean;
new(): SVGAnimatedBoolean;
}
interface SVGAnimatedEnumeration {
animVal: number;
baseVal: number;
}
declare var SVGAnimatedEnumeration: {
prototype: SVGAnimatedEnumeration;
new(): SVGAnimatedEnumeration;
}
interface SVGAnimatedInteger {
animVal: number;
baseVal: number;
}
declare var SVGAnimatedInteger: {
prototype: SVGAnimatedInteger;
new(): SVGAnimatedInteger;
}
interface SVGAnimatedLength {
animVal: SVGLength;
baseVal: SVGLength;
}
declare var SVGAnimatedLength: {
prototype: SVGAnimatedLength;
new(): SVGAnimatedLength;
}
interface SVGAnimatedLengthList {
animVal: SVGLengthList;
baseVal: SVGLengthList;
}
declare var SVGAnimatedLengthList: {
prototype: SVGAnimatedLengthList;
new(): SVGAnimatedLengthList;
}
interface SVGAnimatedNumber {
animVal: number;
baseVal: number;
}
declare var SVGAnimatedNumber: {
prototype: SVGAnimatedNumber;
new(): SVGAnimatedNumber;
}
interface SVGAnimatedNumberList {
animVal: SVGNumberList;
baseVal: SVGNumberList;
}
declare var SVGAnimatedNumberList: {
prototype: SVGAnimatedNumberList;
new(): SVGAnimatedNumberList;
}
interface SVGAnimatedPreserveAspectRatio {
animVal: SVGPreserveAspectRatio;
baseVal: SVGPreserveAspectRatio;
}
declare var SVGAnimatedPreserveAspectRatio: {
prototype: SVGAnimatedPreserveAspectRatio;
new(): SVGAnimatedPreserveAspectRatio;
}
interface SVGAnimatedRect {
animVal: SVGRect;
baseVal: SVGRect;
}
declare var SVGAnimatedRect: {
prototype: SVGAnimatedRect;
new(): SVGAnimatedRect;
}
interface SVGAnimatedString {
animVal: string;
baseVal: string;
}
declare var SVGAnimatedString: {
prototype: SVGAnimatedString;
new(): SVGAnimatedString;
}
interface SVGAnimatedTransformList {
animVal: SVGTransformList;
baseVal: SVGTransformList;
}
declare var SVGAnimatedTransformList: {
prototype: SVGAnimatedTransformList;
new(): SVGAnimatedTransformList;
}
interface SVGCircleElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired {
cx: SVGAnimatedLength;
cy: SVGAnimatedLength;
r: SVGAnimatedLength;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGCircleElement: {
prototype: SVGCircleElement;
new(): SVGCircleElement;
}
interface SVGClipPathElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGUnitTypes {
clipPathUnits: SVGAnimatedEnumeration;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGClipPathElement: {
prototype: SVGClipPathElement;
new(): SVGClipPathElement;
}
interface SVGComponentTransferFunctionElement extends SVGElement {
amplitude: SVGAnimatedNumber;
exponent: SVGAnimatedNumber;
intercept: SVGAnimatedNumber;
offset: SVGAnimatedNumber;
slope: SVGAnimatedNumber;
tableValues: SVGAnimatedNumberList;
type: SVGAnimatedEnumeration;
SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE: number;
SVG_FECOMPONENTTRANSFER_TYPE_GAMMA: number;
SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY: number;
SVG_FECOMPONENTTRANSFER_TYPE_LINEAR: number;
SVG_FECOMPONENTTRANSFER_TYPE_TABLE: number;
SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN: number;
}
declare var SVGComponentTransferFunctionElement: {
prototype: SVGComponentTransferFunctionElement;
new(): SVGComponentTransferFunctionElement;
SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE: number;
SVG_FECOMPONENTTRANSFER_TYPE_GAMMA: number;
SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY: number;
SVG_FECOMPONENTTRANSFER_TYPE_LINEAR: number;
SVG_FECOMPONENTTRANSFER_TYPE_TABLE: number;
SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN: number;
}
interface SVGDefsElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired {
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGDefsElement: {
prototype: SVGDefsElement;
new(): SVGDefsElement;
}
interface SVGDescElement extends SVGElement, SVGStylable, SVGLangSpace {
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGDescElement: {
prototype: SVGDescElement;
new(): SVGDescElement;
}
interface SVGElement extends Element {
id: string;
onclick: (ev: MouseEvent) => any;
ondblclick: (ev: MouseEvent) => any;
onfocusin: (ev: FocusEvent) => any;
onfocusout: (ev: FocusEvent) => any;
onload: (ev: Event) => any;
onmousedown: (ev: MouseEvent) => any;
onmousemove: (ev: MouseEvent) => any;
onmouseout: (ev: MouseEvent) => any;
onmouseover: (ev: MouseEvent) => any;
onmouseup: (ev: MouseEvent) => any;
ownerSVGElement: SVGSVGElement;
viewportElement: SVGElement;
xmlbase: string;
addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "focusin", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
addEventListener(type: "focusout", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGElement: {
prototype: SVGElement;
new(): SVGElement;
}
interface SVGElementInstance extends EventTarget {
childNodes: SVGElementInstanceList;
correspondingElement: SVGElement;
correspondingUseElement: SVGUseElement;
firstChild: SVGElementInstance;
lastChild: SVGElementInstance;
nextSibling: SVGElementInstance;
parentNode: SVGElementInstance;
previousSibling: SVGElementInstance;
}
declare var SVGElementInstance: {
prototype: SVGElementInstance;
new(): SVGElementInstance;
}
interface SVGElementInstanceList {
length: number;
item(index: number): SVGElementInstance;
}
declare var SVGElementInstanceList: {
prototype: SVGElementInstanceList;
new(): SVGElementInstanceList;
}
interface SVGEllipseElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired {
cx: SVGAnimatedLength;
cy: SVGAnimatedLength;
rx: SVGAnimatedLength;
ry: SVGAnimatedLength;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGEllipseElement: {
prototype: SVGEllipseElement;
new(): SVGEllipseElement;
}
interface SVGFEBlendElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
in1: SVGAnimatedString;
in2: SVGAnimatedString;
mode: SVGAnimatedEnumeration;
SVG_FEBLEND_MODE_COLOR: number;
SVG_FEBLEND_MODE_COLOR_BURN: number;
SVG_FEBLEND_MODE_COLOR_DODGE: number;
SVG_FEBLEND_MODE_DARKEN: number;
SVG_FEBLEND_MODE_DIFFERENCE: number;
SVG_FEBLEND_MODE_EXCLUSION: number;
SVG_FEBLEND_MODE_HARD_LIGHT: number;
SVG_FEBLEND_MODE_HUE: number;
SVG_FEBLEND_MODE_LIGHTEN: number;
SVG_FEBLEND_MODE_LUMINOSITY: number;
SVG_FEBLEND_MODE_MULTIPLY: number;
SVG_FEBLEND_MODE_NORMAL: number;
SVG_FEBLEND_MODE_OVERLAY: number;
SVG_FEBLEND_MODE_SATURATION: number;
SVG_FEBLEND_MODE_SCREEN: number;
SVG_FEBLEND_MODE_SOFT_LIGHT: number;
SVG_FEBLEND_MODE_UNKNOWN: number;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGFEBlendElement: {
prototype: SVGFEBlendElement;
new(): SVGFEBlendElement;
SVG_FEBLEND_MODE_COLOR: number;
SVG_FEBLEND_MODE_COLOR_BURN: number;
SVG_FEBLEND_MODE_COLOR_DODGE: number;
SVG_FEBLEND_MODE_DARKEN: number;
SVG_FEBLEND_MODE_DIFFERENCE: number;
SVG_FEBLEND_MODE_EXCLUSION: number;
SVG_FEBLEND_MODE_HARD_LIGHT: number;
SVG_FEBLEND_MODE_HUE: number;
SVG_FEBLEND_MODE_LIGHTEN: number;
SVG_FEBLEND_MODE_LUMINOSITY: number;
SVG_FEBLEND_MODE_MULTIPLY: number;
SVG_FEBLEND_MODE_NORMAL: number;
SVG_FEBLEND_MODE_OVERLAY: number;
SVG_FEBLEND_MODE_SATURATION: number;
SVG_FEBLEND_MODE_SCREEN: number;
SVG_FEBLEND_MODE_SOFT_LIGHT: number;
SVG_FEBLEND_MODE_UNKNOWN: number;
}
interface SVGFEColorMatrixElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
in1: SVGAnimatedString;
type: SVGAnimatedEnumeration;
values: SVGAnimatedNumberList;
SVG_FECOLORMATRIX_TYPE_HUEROTATE: number;
SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA: number;
SVG_FECOLORMATRIX_TYPE_MATRIX: number;
SVG_FECOLORMATRIX_TYPE_SATURATE: number;
SVG_FECOLORMATRIX_TYPE_UNKNOWN: number;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGFEColorMatrixElement: {
prototype: SVGFEColorMatrixElement;
new(): SVGFEColorMatrixElement;
SVG_FECOLORMATRIX_TYPE_HUEROTATE: number;
SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA: number;
SVG_FECOLORMATRIX_TYPE_MATRIX: number;
SVG_FECOLORMATRIX_TYPE_SATURATE: number;
SVG_FECOLORMATRIX_TYPE_UNKNOWN: number;
}
interface SVGFEComponentTransferElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
in1: SVGAnimatedString;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGFEComponentTransferElement: {
prototype: SVGFEComponentTransferElement;
new(): SVGFEComponentTransferElement;
}
interface SVGFECompositeElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
in1: SVGAnimatedString;
in2: SVGAnimatedString;
k1: SVGAnimatedNumber;
k2: SVGAnimatedNumber;
k3: SVGAnimatedNumber;
k4: SVGAnimatedNumber;
operator: SVGAnimatedEnumeration;
SVG_FECOMPOSITE_OPERATOR_ARITHMETIC: number;
SVG_FECOMPOSITE_OPERATOR_ATOP: number;
SVG_FECOMPOSITE_OPERATOR_IN: number;
SVG_FECOMPOSITE_OPERATOR_OUT: number;
SVG_FECOMPOSITE_OPERATOR_OVER: number;
SVG_FECOMPOSITE_OPERATOR_UNKNOWN: number;
SVG_FECOMPOSITE_OPERATOR_XOR: number;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGFECompositeElement: {
prototype: SVGFECompositeElement;
new(): SVGFECompositeElement;
SVG_FECOMPOSITE_OPERATOR_ARITHMETIC: number;
SVG_FECOMPOSITE_OPERATOR_ATOP: number;
SVG_FECOMPOSITE_OPERATOR_IN: number;
SVG_FECOMPOSITE_OPERATOR_OUT: number;
SVG_FECOMPOSITE_OPERATOR_OVER: number;
SVG_FECOMPOSITE_OPERATOR_UNKNOWN: number;
SVG_FECOMPOSITE_OPERATOR_XOR: number;
}
interface SVGFEConvolveMatrixElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
bias: SVGAnimatedNumber;
divisor: SVGAnimatedNumber;
edgeMode: SVGAnimatedEnumeration;
in1: SVGAnimatedString;
kernelMatrix: SVGAnimatedNumberList;
kernelUnitLengthX: SVGAnimatedNumber;
kernelUnitLengthY: SVGAnimatedNumber;
orderX: SVGAnimatedInteger;
orderY: SVGAnimatedInteger;
preserveAlpha: SVGAnimatedBoolean;
targetX: SVGAnimatedInteger;
targetY: SVGAnimatedInteger;
SVG_EDGEMODE_DUPLICATE: number;
SVG_EDGEMODE_NONE: number;
SVG_EDGEMODE_UNKNOWN: number;
SVG_EDGEMODE_WRAP: number;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGFEConvolveMatrixElement: {
prototype: SVGFEConvolveMatrixElement;
new(): SVGFEConvolveMatrixElement;
SVG_EDGEMODE_DUPLICATE: number;
SVG_EDGEMODE_NONE: number;
SVG_EDGEMODE_UNKNOWN: number;
SVG_EDGEMODE_WRAP: number;
}
interface SVGFEDiffuseLightingElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
diffuseConstant: SVGAnimatedNumber;
in1: SVGAnimatedString;
kernelUnitLengthX: SVGAnimatedNumber;
kernelUnitLengthY: SVGAnimatedNumber;
surfaceScale: SVGAnimatedNumber;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGFEDiffuseLightingElement: {
prototype: SVGFEDiffuseLightingElement;
new(): SVGFEDiffuseLightingElement;
}
interface SVGFEDisplacementMapElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
in1: SVGAnimatedString;
in2: SVGAnimatedString;
scale: SVGAnimatedNumber;
xChannelSelector: SVGAnimatedEnumeration;
yChannelSelector: SVGAnimatedEnumeration;
SVG_CHANNEL_A: number;
SVG_CHANNEL_B: number;
SVG_CHANNEL_G: number;
SVG_CHANNEL_R: number;
SVG_CHANNEL_UNKNOWN: number;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGFEDisplacementMapElement: {
prototype: SVGFEDisplacementMapElement;
new(): SVGFEDisplacementMapElement;
SVG_CHANNEL_A: number;
SVG_CHANNEL_B: number;
SVG_CHANNEL_G: number;
SVG_CHANNEL_R: number;
SVG_CHANNEL_UNKNOWN: number;
}
interface SVGFEDistantLightElement extends SVGElement {
azimuth: SVGAnimatedNumber;
elevation: SVGAnimatedNumber;
}
declare var SVGFEDistantLightElement: {
prototype: SVGFEDistantLightElement;
new(): SVGFEDistantLightElement;
}
interface SVGFEFloodElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGFEFloodElement: {
prototype: SVGFEFloodElement;
new(): SVGFEFloodElement;
}
interface SVGFEFuncAElement extends SVGComponentTransferFunctionElement {
}
declare var SVGFEFuncAElement: {
prototype: SVGFEFuncAElement;
new(): SVGFEFuncAElement;
}
interface SVGFEFuncBElement extends SVGComponentTransferFunctionElement {
}
declare var SVGFEFuncBElement: {
prototype: SVGFEFuncBElement;
new(): SVGFEFuncBElement;
}
interface SVGFEFuncGElement extends SVGComponentTransferFunctionElement {
}
declare var SVGFEFuncGElement: {
prototype: SVGFEFuncGElement;
new(): SVGFEFuncGElement;
}
interface SVGFEFuncRElement extends SVGComponentTransferFunctionElement {
}
declare var SVGFEFuncRElement: {
prototype: SVGFEFuncRElement;
new(): SVGFEFuncRElement;
}
interface SVGFEGaussianBlurElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
in1: SVGAnimatedString;
stdDeviationX: SVGAnimatedNumber;
stdDeviationY: SVGAnimatedNumber;
setStdDeviation(stdDeviationX: number, stdDeviationY: number): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGFEGaussianBlurElement: {
prototype: SVGFEGaussianBlurElement;
new(): SVGFEGaussianBlurElement;
}
interface SVGFEImageElement extends SVGElement, SVGFilterPrimitiveStandardAttributes, SVGLangSpace, SVGURIReference, SVGExternalResourcesRequired {
preserveAspectRatio: SVGAnimatedPreserveAspectRatio;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGFEImageElement: {
prototype: SVGFEImageElement;
new(): SVGFEImageElement;
}
interface SVGFEMergeElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGFEMergeElement: {
prototype: SVGFEMergeElement;
new(): SVGFEMergeElement;
}
interface SVGFEMergeNodeElement extends SVGElement {
in1: SVGAnimatedString;
}
declare var SVGFEMergeNodeElement: {
prototype: SVGFEMergeNodeElement;
new(): SVGFEMergeNodeElement;
}
interface SVGFEMorphologyElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
in1: SVGAnimatedString;
operator: SVGAnimatedEnumeration;
radiusX: SVGAnimatedNumber;
radiusY: SVGAnimatedNumber;
SVG_MORPHOLOGY_OPERATOR_DILATE: number;
SVG_MORPHOLOGY_OPERATOR_ERODE: number;
SVG_MORPHOLOGY_OPERATOR_UNKNOWN: number;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGFEMorphologyElement: {
prototype: SVGFEMorphologyElement;
new(): SVGFEMorphologyElement;
SVG_MORPHOLOGY_OPERATOR_DILATE: number;
SVG_MORPHOLOGY_OPERATOR_ERODE: number;
SVG_MORPHOLOGY_OPERATOR_UNKNOWN: number;
}
interface SVGFEOffsetElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
dx: SVGAnimatedNumber;
dy: SVGAnimatedNumber;
in1: SVGAnimatedString;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGFEOffsetElement: {
prototype: SVGFEOffsetElement;
new(): SVGFEOffsetElement;
}
interface SVGFEPointLightElement extends SVGElement {
x: SVGAnimatedNumber;
y: SVGAnimatedNumber;
z: SVGAnimatedNumber;
}
declare var SVGFEPointLightElement: {
prototype: SVGFEPointLightElement;
new(): SVGFEPointLightElement;
}
interface SVGFESpecularLightingElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
in1: SVGAnimatedString;
kernelUnitLengthX: SVGAnimatedNumber;
kernelUnitLengthY: SVGAnimatedNumber;
specularConstant: SVGAnimatedNumber;
specularExponent: SVGAnimatedNumber;
surfaceScale: SVGAnimatedNumber;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGFESpecularLightingElement: {
prototype: SVGFESpecularLightingElement;
new(): SVGFESpecularLightingElement;
}
interface SVGFESpotLightElement extends SVGElement {
limitingConeAngle: SVGAnimatedNumber;
pointsAtX: SVGAnimatedNumber;
pointsAtY: SVGAnimatedNumber;
pointsAtZ: SVGAnimatedNumber;
specularExponent: SVGAnimatedNumber;
x: SVGAnimatedNumber;
y: SVGAnimatedNumber;
z: SVGAnimatedNumber;
}
declare var SVGFESpotLightElement: {
prototype: SVGFESpotLightElement;
new(): SVGFESpotLightElement;
}
interface SVGFETileElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
in1: SVGAnimatedString;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGFETileElement: {
prototype: SVGFETileElement;
new(): SVGFETileElement;
}
interface SVGFETurbulenceElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
baseFrequencyX: SVGAnimatedNumber;
baseFrequencyY: SVGAnimatedNumber;
numOctaves: SVGAnimatedInteger;
seed: SVGAnimatedNumber;
stitchTiles: SVGAnimatedEnumeration;
type: SVGAnimatedEnumeration;
SVG_STITCHTYPE_NOSTITCH: number;
SVG_STITCHTYPE_STITCH: number;
SVG_STITCHTYPE_UNKNOWN: number;
SVG_TURBULENCE_TYPE_FRACTALNOISE: number;
SVG_TURBULENCE_TYPE_TURBULENCE: number;
SVG_TURBULENCE_TYPE_UNKNOWN: number;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGFETurbulenceElement: {
prototype: SVGFETurbulenceElement;
new(): SVGFETurbulenceElement;
SVG_STITCHTYPE_NOSTITCH: number;
SVG_STITCHTYPE_STITCH: number;
SVG_STITCHTYPE_UNKNOWN: number;
SVG_TURBULENCE_TYPE_FRACTALNOISE: number;
SVG_TURBULENCE_TYPE_TURBULENCE: number;
SVG_TURBULENCE_TYPE_UNKNOWN: number;
}
interface SVGFilterElement extends SVGElement, SVGUnitTypes, SVGStylable, SVGLangSpace, SVGURIReference, SVGExternalResourcesRequired {
filterResX: SVGAnimatedInteger;
filterResY: SVGAnimatedInteger;
filterUnits: SVGAnimatedEnumeration;
height: SVGAnimatedLength;
primitiveUnits: SVGAnimatedEnumeration;
width: SVGAnimatedLength;
x: SVGAnimatedLength;
y: SVGAnimatedLength;
setFilterRes(filterResX: number, filterResY: number): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGFilterElement: {
prototype: SVGFilterElement;
new(): SVGFilterElement;
}
interface SVGForeignObjectElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired {
height: SVGAnimatedLength;
width: SVGAnimatedLength;
x: SVGAnimatedLength;
y: SVGAnimatedLength;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGForeignObjectElement: {
prototype: SVGForeignObjectElement;
new(): SVGForeignObjectElement;
}
interface SVGGElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired {
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGGElement: {
prototype: SVGGElement;
new(): SVGGElement;
}
interface SVGGradientElement extends SVGElement, SVGStylable, SVGExternalResourcesRequired, SVGURIReference, SVGUnitTypes {
gradientTransform: SVGAnimatedTransformList;
gradientUnits: SVGAnimatedEnumeration;
spreadMethod: SVGAnimatedEnumeration;
SVG_SPREADMETHOD_PAD: number;
SVG_SPREADMETHOD_REFLECT: number;
SVG_SPREADMETHOD_REPEAT: number;
SVG_SPREADMETHOD_UNKNOWN: number;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGGradientElement: {
prototype: SVGGradientElement;
new(): SVGGradientElement;
SVG_SPREADMETHOD_PAD: number;
SVG_SPREADMETHOD_REFLECT: number;
SVG_SPREADMETHOD_REPEAT: number;
SVG_SPREADMETHOD_UNKNOWN: number;
}
interface SVGImageElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGURIReference {
height: SVGAnimatedLength;
preserveAspectRatio: SVGAnimatedPreserveAspectRatio;
width: SVGAnimatedLength;
x: SVGAnimatedLength;
y: SVGAnimatedLength;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGImageElement: {
prototype: SVGImageElement;
new(): SVGImageElement;
}
interface SVGLength {
unitType: number;
value: number;
valueAsString: string;
valueInSpecifiedUnits: number;
convertToSpecifiedUnits(unitType: number): void;
newValueSpecifiedUnits(unitType: number, valueInSpecifiedUnits: number): void;
SVG_LENGTHTYPE_CM: number;
SVG_LENGTHTYPE_EMS: number;
SVG_LENGTHTYPE_EXS: number;
SVG_LENGTHTYPE_IN: number;
SVG_LENGTHTYPE_MM: number;
SVG_LENGTHTYPE_NUMBER: number;
SVG_LENGTHTYPE_PC: number;
SVG_LENGTHTYPE_PERCENTAGE: number;
SVG_LENGTHTYPE_PT: number;
SVG_LENGTHTYPE_PX: number;
SVG_LENGTHTYPE_UNKNOWN: number;
}
declare var SVGLength: {
prototype: SVGLength;
new(): SVGLength;
SVG_LENGTHTYPE_CM: number;
SVG_LENGTHTYPE_EMS: number;
SVG_LENGTHTYPE_EXS: number;
SVG_LENGTHTYPE_IN: number;
SVG_LENGTHTYPE_MM: number;
SVG_LENGTHTYPE_NUMBER: number;
SVG_LENGTHTYPE_PC: number;
SVG_LENGTHTYPE_PERCENTAGE: number;
SVG_LENGTHTYPE_PT: number;
SVG_LENGTHTYPE_PX: number;
SVG_LENGTHTYPE_UNKNOWN: number;
}
interface SVGLengthList {
numberOfItems: number;
appendItem(newItem: SVGLength): SVGLength;
clear(): void;
getItem(index: number): SVGLength;
initialize(newItem: SVGLength): SVGLength;
insertItemBefore(newItem: SVGLength, index: number): SVGLength;
removeItem(index: number): SVGLength;
replaceItem(newItem: SVGLength, index: number): SVGLength;
}
declare var SVGLengthList: {
prototype: SVGLengthList;
new(): SVGLengthList;
}
interface SVGLineElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired {
x1: SVGAnimatedLength;
x2: SVGAnimatedLength;
y1: SVGAnimatedLength;
y2: SVGAnimatedLength;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGLineElement: {
prototype: SVGLineElement;
new(): SVGLineElement;
}
interface SVGLinearGradientElement extends SVGGradientElement {
x1: SVGAnimatedLength;
x2: SVGAnimatedLength;
y1: SVGAnimatedLength;
y2: SVGAnimatedLength;
}
declare var SVGLinearGradientElement: {
prototype: SVGLinearGradientElement;
new(): SVGLinearGradientElement;
}
interface SVGMarkerElement extends SVGElement, SVGStylable, SVGLangSpace, SVGExternalResourcesRequired, SVGFitToViewBox {
markerHeight: SVGAnimatedLength;
markerUnits: SVGAnimatedEnumeration;
markerWidth: SVGAnimatedLength;
orientAngle: SVGAnimatedAngle;
orientType: SVGAnimatedEnumeration;
refX: SVGAnimatedLength;
refY: SVGAnimatedLength;
setOrientToAngle(angle: SVGAngle): void;
setOrientToAuto(): void;
SVG_MARKERUNITS_STROKEWIDTH: number;
SVG_MARKERUNITS_UNKNOWN: number;
SVG_MARKERUNITS_USERSPACEONUSE: number;
SVG_MARKER_ORIENT_ANGLE: number;
SVG_MARKER_ORIENT_AUTO: number;
SVG_MARKER_ORIENT_UNKNOWN: number;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGMarkerElement: {
prototype: SVGMarkerElement;
new(): SVGMarkerElement;
SVG_MARKERUNITS_STROKEWIDTH: number;
SVG_MARKERUNITS_UNKNOWN: number;
SVG_MARKERUNITS_USERSPACEONUSE: number;
SVG_MARKER_ORIENT_ANGLE: number;
SVG_MARKER_ORIENT_AUTO: number;
SVG_MARKER_ORIENT_UNKNOWN: number;
}
interface SVGMaskElement extends SVGElement, SVGStylable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGUnitTypes {
height: SVGAnimatedLength;
maskContentUnits: SVGAnimatedEnumeration;
maskUnits: SVGAnimatedEnumeration;
width: SVGAnimatedLength;
x: SVGAnimatedLength;
y: SVGAnimatedLength;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGMaskElement: {
prototype: SVGMaskElement;
new(): SVGMaskElement;
}
interface SVGMatrix {
a: number;
b: number;
c: number;
d: number;
e: number;
f: number;
flipX(): SVGMatrix;
flipY(): SVGMatrix;
inverse(): SVGMatrix;
multiply(secondMatrix: SVGMatrix): SVGMatrix;
rotate(angle: number): SVGMatrix;
rotateFromVector(x: number, y: number): SVGMatrix;
scale(scaleFactor: number): SVGMatrix;
scaleNonUniform(scaleFactorX: number, scaleFactorY: number): SVGMatrix;
skewX(angle: number): SVGMatrix;
skewY(angle: number): SVGMatrix;
translate(x: number, y: number): SVGMatrix;
}
declare var SVGMatrix: {
prototype: SVGMatrix;
new(): SVGMatrix;
}
interface SVGMetadataElement extends SVGElement {
}
declare var SVGMetadataElement: {
prototype: SVGMetadataElement;
new(): SVGMetadataElement;
}
interface SVGNumber {
value: number;
}
declare var SVGNumber: {
prototype: SVGNumber;
new(): SVGNumber;
}
interface SVGNumberList {
numberOfItems: number;
appendItem(newItem: SVGNumber): SVGNumber;
clear(): void;
getItem(index: number): SVGNumber;
initialize(newItem: SVGNumber): SVGNumber;
insertItemBefore(newItem: SVGNumber, index: number): SVGNumber;
removeItem(index: number): SVGNumber;
replaceItem(newItem: SVGNumber, index: number): SVGNumber;
}
declare var SVGNumberList: {
prototype: SVGNumberList;
new(): SVGNumberList;
}
interface SVGPathElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGAnimatedPathData {
createSVGPathSegArcAbs(x: number, y: number, r1: number, r2: number, angle: number, largeArcFlag: boolean, sweepFlag: boolean): SVGPathSegArcAbs;
createSVGPathSegArcRel(x: number, y: number, r1: number, r2: number, angle: number, largeArcFlag: boolean, sweepFlag: boolean): SVGPathSegArcRel;
createSVGPathSegClosePath(): SVGPathSegClosePath;
createSVGPathSegCurvetoCubicAbs(x: number, y: number, x1: number, y1: number, x2: number, y2: number): SVGPathSegCurvetoCubicAbs;
createSVGPathSegCurvetoCubicRel(x: number, y: number, x1: number, y1: number, x2: number, y2: number): SVGPathSegCurvetoCubicRel;
createSVGPathSegCurvetoCubicSmoothAbs(x: number, y: number, x2: number, y2: number): SVGPathSegCurvetoCubicSmoothAbs;
createSVGPathSegCurvetoCubicSmoothRel(x: number, y: number, x2: number, y2: number): SVGPathSegCurvetoCubicSmoothRel;
createSVGPathSegCurvetoQuadraticAbs(x: number, y: number, x1: number, y1: number): SVGPathSegCurvetoQuadraticAbs;
createSVGPathSegCurvetoQuadraticRel(x: number, y: number, x1: number, y1: number): SVGPathSegCurvetoQuadraticRel;
createSVGPathSegCurvetoQuadraticSmoothAbs(x: number, y: number): SVGPathSegCurvetoQuadraticSmoothAbs;
createSVGPathSegCurvetoQuadraticSmoothRel(x: number, y: number): SVGPathSegCurvetoQuadraticSmoothRel;
createSVGPathSegLinetoAbs(x: number, y: number): SVGPathSegLinetoAbs;
createSVGPathSegLinetoHorizontalAbs(x: number): SVGPathSegLinetoHorizontalAbs;
createSVGPathSegLinetoHorizontalRel(x: number): SVGPathSegLinetoHorizontalRel;
createSVGPathSegLinetoRel(x: number, y: number): SVGPathSegLinetoRel;
createSVGPathSegLinetoVerticalAbs(y: number): SVGPathSegLinetoVerticalAbs;
createSVGPathSegLinetoVerticalRel(y: number): SVGPathSegLinetoVerticalRel;
createSVGPathSegMovetoAbs(x: number, y: number): SVGPathSegMovetoAbs;
createSVGPathSegMovetoRel(x: number, y: number): SVGPathSegMovetoRel;
getPathSegAtLength(distance: number): number;
getPointAtLength(distance: number): SVGPoint;
getTotalLength(): number;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGPathElement: {
prototype: SVGPathElement;
new(): SVGPathElement;
}
interface SVGPathSeg {
pathSegType: number;
pathSegTypeAsLetter: string;
PATHSEG_ARC_ABS: number;
PATHSEG_ARC_REL: number;
PATHSEG_CLOSEPATH: number;
PATHSEG_CURVETO_CUBIC_ABS: number;
PATHSEG_CURVETO_CUBIC_REL: number;
PATHSEG_CURVETO_CUBIC_SMOOTH_ABS: number;
PATHSEG_CURVETO_CUBIC_SMOOTH_REL: number;
PATHSEG_CURVETO_QUADRATIC_ABS: number;
PATHSEG_CURVETO_QUADRATIC_REL: number;
PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS: number;
PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL: number;
PATHSEG_LINETO_ABS: number;
PATHSEG_LINETO_HORIZONTAL_ABS: number;
PATHSEG_LINETO_HORIZONTAL_REL: number;
PATHSEG_LINETO_REL: number;
PATHSEG_LINETO_VERTICAL_ABS: number;
PATHSEG_LINETO_VERTICAL_REL: number;
PATHSEG_MOVETO_ABS: number;
PATHSEG_MOVETO_REL: number;
PATHSEG_UNKNOWN: number;
}
declare var SVGPathSeg: {
prototype: SVGPathSeg;
new(): SVGPathSeg;
PATHSEG_ARC_ABS: number;
PATHSEG_ARC_REL: number;
PATHSEG_CLOSEPATH: number;
PATHSEG_CURVETO_CUBIC_ABS: number;
PATHSEG_CURVETO_CUBIC_REL: number;
PATHSEG_CURVETO_CUBIC_SMOOTH_ABS: number;
PATHSEG_CURVETO_CUBIC_SMOOTH_REL: number;
PATHSEG_CURVETO_QUADRATIC_ABS: number;
PATHSEG_CURVETO_QUADRATIC_REL: number;
PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS: number;
PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL: number;
PATHSEG_LINETO_ABS: number;
PATHSEG_LINETO_HORIZONTAL_ABS: number;
PATHSEG_LINETO_HORIZONTAL_REL: number;
PATHSEG_LINETO_REL: number;
PATHSEG_LINETO_VERTICAL_ABS: number;
PATHSEG_LINETO_VERTICAL_REL: number;
PATHSEG_MOVETO_ABS: number;
PATHSEG_MOVETO_REL: number;
PATHSEG_UNKNOWN: number;
}
interface SVGPathSegArcAbs extends SVGPathSeg {
angle: number;
largeArcFlag: boolean;
r1: number;
r2: number;
sweepFlag: boolean;
x: number;
y: number;
}
declare var SVGPathSegArcAbs: {
prototype: SVGPathSegArcAbs;
new(): SVGPathSegArcAbs;
}
interface SVGPathSegArcRel extends SVGPathSeg {
angle: number;
largeArcFlag: boolean;
r1: number;
r2: number;
sweepFlag: boolean;
x: number;
y: number;
}
declare var SVGPathSegArcRel: {
prototype: SVGPathSegArcRel;
new(): SVGPathSegArcRel;
}
interface SVGPathSegClosePath extends SVGPathSeg {
}
declare var SVGPathSegClosePath: {
prototype: SVGPathSegClosePath;
new(): SVGPathSegClosePath;
}
interface SVGPathSegCurvetoCubicAbs extends SVGPathSeg {
x: number;
x1: number;
x2: number;
y: number;
y1: number;
y2: number;
}
declare var SVGPathSegCurvetoCubicAbs: {
prototype: SVGPathSegCurvetoCubicAbs;
new(): SVGPathSegCurvetoCubicAbs;
}
interface SVGPathSegCurvetoCubicRel extends SVGPathSeg {
x: number;
x1: number;
x2: number;
y: number;
y1: number;
y2: number;
}
declare var SVGPathSegCurvetoCubicRel: {
prototype: SVGPathSegCurvetoCubicRel;
new(): SVGPathSegCurvetoCubicRel;
}
interface SVGPathSegCurvetoCubicSmoothAbs extends SVGPathSeg {
x: number;
x2: number;
y: number;
y2: number;
}
declare var SVGPathSegCurvetoCubicSmoothAbs: {
prototype: SVGPathSegCurvetoCubicSmoothAbs;
new(): SVGPathSegCurvetoCubicSmoothAbs;
}
interface SVGPathSegCurvetoCubicSmoothRel extends SVGPathSeg {
x: number;
x2: number;
y: number;
y2: number;
}
declare var SVGPathSegCurvetoCubicSmoothRel: {
prototype: SVGPathSegCurvetoCubicSmoothRel;
new(): SVGPathSegCurvetoCubicSmoothRel;
}
interface SVGPathSegCurvetoQuadraticAbs extends SVGPathSeg {
x: number;
x1: number;
y: number;
y1: number;
}
declare var SVGPathSegCurvetoQuadraticAbs: {
prototype: SVGPathSegCurvetoQuadraticAbs;
new(): SVGPathSegCurvetoQuadraticAbs;
}
interface SVGPathSegCurvetoQuadraticRel extends SVGPathSeg {
x: number;
x1: number;
y: number;
y1: number;
}
declare var SVGPathSegCurvetoQuadraticRel: {
prototype: SVGPathSegCurvetoQuadraticRel;
new(): SVGPathSegCurvetoQuadraticRel;
}
interface SVGPathSegCurvetoQuadraticSmoothAbs extends SVGPathSeg {
x: number;
y: number;
}
declare var SVGPathSegCurvetoQuadraticSmoothAbs: {
prototype: SVGPathSegCurvetoQuadraticSmoothAbs;
new(): SVGPathSegCurvetoQuadraticSmoothAbs;
}
interface SVGPathSegCurvetoQuadraticSmoothRel extends SVGPathSeg {
x: number;
y: number;
}
declare var SVGPathSegCurvetoQuadraticSmoothRel: {
prototype: SVGPathSegCurvetoQuadraticSmoothRel;
new(): SVGPathSegCurvetoQuadraticSmoothRel;
}
interface SVGPathSegLinetoAbs extends SVGPathSeg {
x: number;
y: number;
}
declare var SVGPathSegLinetoAbs: {
prototype: SVGPathSegLinetoAbs;
new(): SVGPathSegLinetoAbs;
}
interface SVGPathSegLinetoHorizontalAbs extends SVGPathSeg {
x: number;
}
declare var SVGPathSegLinetoHorizontalAbs: {
prototype: SVGPathSegLinetoHorizontalAbs;
new(): SVGPathSegLinetoHorizontalAbs;
}
interface SVGPathSegLinetoHorizontalRel extends SVGPathSeg {
x: number;
}
declare var SVGPathSegLinetoHorizontalRel: {
prototype: SVGPathSegLinetoHorizontalRel;
new(): SVGPathSegLinetoHorizontalRel;
}
interface SVGPathSegLinetoRel extends SVGPathSeg {
x: number;
y: number;
}
declare var SVGPathSegLinetoRel: {
prototype: SVGPathSegLinetoRel;
new(): SVGPathSegLinetoRel;
}
interface SVGPathSegLinetoVerticalAbs extends SVGPathSeg {
y: number;
}
declare var SVGPathSegLinetoVerticalAbs: {
prototype: SVGPathSegLinetoVerticalAbs;
new(): SVGPathSegLinetoVerticalAbs;
}
interface SVGPathSegLinetoVerticalRel extends SVGPathSeg {
y: number;
}
declare var SVGPathSegLinetoVerticalRel: {
prototype: SVGPathSegLinetoVerticalRel;
new(): SVGPathSegLinetoVerticalRel;
}
interface SVGPathSegList {
numberOfItems: number;
appendItem(newItem: SVGPathSeg): SVGPathSeg;
clear(): void;
getItem(index: number): SVGPathSeg;
initialize(newItem: SVGPathSeg): SVGPathSeg;
insertItemBefore(newItem: SVGPathSeg, index: number): SVGPathSeg;
removeItem(index: number): SVGPathSeg;
replaceItem(newItem: SVGPathSeg, index: number): SVGPathSeg;
}
declare var SVGPathSegList: {
prototype: SVGPathSegList;
new(): SVGPathSegList;
}
interface SVGPathSegMovetoAbs extends SVGPathSeg {
x: number;
y: number;
}
declare var SVGPathSegMovetoAbs: {
prototype: SVGPathSegMovetoAbs;
new(): SVGPathSegMovetoAbs;
}
interface SVGPathSegMovetoRel extends SVGPathSeg {
x: number;
y: number;
}
declare var SVGPathSegMovetoRel: {
prototype: SVGPathSegMovetoRel;
new(): SVGPathSegMovetoRel;
}
interface SVGPatternElement extends SVGElement, SVGStylable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGFitToViewBox, SVGURIReference, SVGUnitTypes {
height: SVGAnimatedLength;
patternContentUnits: SVGAnimatedEnumeration;
patternTransform: SVGAnimatedTransformList;
patternUnits: SVGAnimatedEnumeration;
width: SVGAnimatedLength;
x: SVGAnimatedLength;
y: SVGAnimatedLength;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGPatternElement: {
prototype: SVGPatternElement;
new(): SVGPatternElement;
}
interface SVGPoint {
x: number;
y: number;
matrixTransform(matrix: SVGMatrix): SVGPoint;
}
declare var SVGPoint: {
prototype: SVGPoint;
new(): SVGPoint;
}
interface SVGPointList {
numberOfItems: number;
appendItem(newItem: SVGPoint): SVGPoint;
clear(): void;
getItem(index: number): SVGPoint;
initialize(newItem: SVGPoint): SVGPoint;
insertItemBefore(newItem: SVGPoint, index: number): SVGPoint;
removeItem(index: number): SVGPoint;
replaceItem(newItem: SVGPoint, index: number): SVGPoint;
}
declare var SVGPointList: {
prototype: SVGPointList;
new(): SVGPointList;
}
interface SVGPolygonElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGAnimatedPoints {
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGPolygonElement: {
prototype: SVGPolygonElement;
new(): SVGPolygonElement;
}
interface SVGPolylineElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGAnimatedPoints {
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGPolylineElement: {
prototype: SVGPolylineElement;
new(): SVGPolylineElement;
}
interface SVGPreserveAspectRatio {
align: number;
meetOrSlice: number;
SVG_MEETORSLICE_MEET: number;
SVG_MEETORSLICE_SLICE: number;
SVG_MEETORSLICE_UNKNOWN: number;
SVG_PRESERVEASPECTRATIO_NONE: number;
SVG_PRESERVEASPECTRATIO_UNKNOWN: number;
SVG_PRESERVEASPECTRATIO_XMAXYMAX: number;
SVG_PRESERVEASPECTRATIO_XMAXYMID: number;
SVG_PRESERVEASPECTRATIO_XMAXYMIN: number;
SVG_PRESERVEASPECTRATIO_XMIDYMAX: number;
SVG_PRESERVEASPECTRATIO_XMIDYMID: number;
SVG_PRESERVEASPECTRATIO_XMIDYMIN: number;
SVG_PRESERVEASPECTRATIO_XMINYMAX: number;
SVG_PRESERVEASPECTRATIO_XMINYMID: number;
SVG_PRESERVEASPECTRATIO_XMINYMIN: number;
}
declare var SVGPreserveAspectRatio: {
prototype: SVGPreserveAspectRatio;
new(): SVGPreserveAspectRatio;
SVG_MEETORSLICE_MEET: number;
SVG_MEETORSLICE_SLICE: number;
SVG_MEETORSLICE_UNKNOWN: number;
SVG_PRESERVEASPECTRATIO_NONE: number;
SVG_PRESERVEASPECTRATIO_UNKNOWN: number;
SVG_PRESERVEASPECTRATIO_XMAXYMAX: number;
SVG_PRESERVEASPECTRATIO_XMAXYMID: number;
SVG_PRESERVEASPECTRATIO_XMAXYMIN: number;
SVG_PRESERVEASPECTRATIO_XMIDYMAX: number;
SVG_PRESERVEASPECTRATIO_XMIDYMID: number;
SVG_PRESERVEASPECTRATIO_XMIDYMIN: number;
SVG_PRESERVEASPECTRATIO_XMINYMAX: number;
SVG_PRESERVEASPECTRATIO_XMINYMID: number;
SVG_PRESERVEASPECTRATIO_XMINYMIN: number;
}
interface SVGRadialGradientElement extends SVGGradientElement {
cx: SVGAnimatedLength;
cy: SVGAnimatedLength;
fx: SVGAnimatedLength;
fy: SVGAnimatedLength;
r: SVGAnimatedLength;
}
declare var SVGRadialGradientElement: {
prototype: SVGRadialGradientElement;
new(): SVGRadialGradientElement;
}
interface SVGRect {
height: number;
width: number;
x: number;
y: number;
}
declare var SVGRect: {
prototype: SVGRect;
new(): SVGRect;
}
interface SVGRectElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired {
height: SVGAnimatedLength;
rx: SVGAnimatedLength;
ry: SVGAnimatedLength;
width: SVGAnimatedLength;
x: SVGAnimatedLength;
y: SVGAnimatedLength;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGRectElement: {
prototype: SVGRectElement;
new(): SVGRectElement;
}
interface SVGSVGElement extends SVGElement, DocumentEvent, SVGLocatable, SVGTests, SVGStylable, SVGLangSpace, SVGExternalResourcesRequired, SVGFitToViewBox, SVGZoomAndPan {
contentScriptType: string;
contentStyleType: string;
currentScale: number;
currentTranslate: SVGPoint;
height: SVGAnimatedLength;
onabort: (ev: Event) => any;
onerror: (ev: Event) => any;
onresize: (ev: UIEvent) => any;
onscroll: (ev: UIEvent) => any;
onunload: (ev: Event) => any;
onzoom: (ev: SVGZoomEvent) => any;
pixelUnitToMillimeterX: number;
pixelUnitToMillimeterY: number;
screenPixelToMillimeterX: number;
screenPixelToMillimeterY: number;
viewport: SVGRect;
width: SVGAnimatedLength;
x: SVGAnimatedLength;
y: SVGAnimatedLength;
checkEnclosure(element: SVGElement, rect: SVGRect): boolean;
checkIntersection(element: SVGElement, rect: SVGRect): boolean;
createSVGAngle(): SVGAngle;
createSVGLength(): SVGLength;
createSVGMatrix(): SVGMatrix;
createSVGNumber(): SVGNumber;
createSVGPoint(): SVGPoint;
createSVGRect(): SVGRect;
createSVGTransform(): SVGTransform;
createSVGTransformFromMatrix(matrix: SVGMatrix): SVGTransform;
deselectAll(): void;
forceRedraw(): void;
getComputedStyle(elt: Element, pseudoElt?: string): CSSStyleDeclaration;
getCurrentTime(): number;
getElementById(elementId: string): Element;
getEnclosureList(rect: SVGRect, referenceElement: SVGElement): NodeList;
getIntersectionList(rect: SVGRect, referenceElement: SVGElement): NodeList;
pauseAnimations(): void;
setCurrentTime(seconds: number): void;
suspendRedraw(maxWaitMilliseconds: number): number;
unpauseAnimations(): void;
unsuspendRedraw(suspendHandleID: number): void;
unsuspendRedrawAll(): void;
addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "SVGAbort", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "SVGError", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "SVGUnload", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "SVGZoom", listener: (ev: SVGZoomEvent) => any, useCapture?: boolean): void;
addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "focusin", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
addEventListener(type: "focusout", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "resize", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGSVGElement: {
prototype: SVGSVGElement;
new(): SVGSVGElement;
}
interface SVGScriptElement extends SVGElement, SVGExternalResourcesRequired, SVGURIReference {
type: string;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGScriptElement: {
prototype: SVGScriptElement;
new(): SVGScriptElement;
}
interface SVGStopElement extends SVGElement, SVGStylable {
offset: SVGAnimatedNumber;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGStopElement: {
prototype: SVGStopElement;
new(): SVGStopElement;
}
interface SVGStringList {
numberOfItems: number;
appendItem(newItem: string): string;
clear(): void;
getItem(index: number): string;
initialize(newItem: string): string;
insertItemBefore(newItem: string, index: number): string;
removeItem(index: number): string;
replaceItem(newItem: string, index: number): string;
}
declare var SVGStringList: {
prototype: SVGStringList;
new(): SVGStringList;
}
interface SVGStyleElement extends SVGElement, SVGLangSpace {
media: string;
title: string;
type: string;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGStyleElement: {
prototype: SVGStyleElement;
new(): SVGStyleElement;
}
interface SVGSwitchElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired {
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGSwitchElement: {
prototype: SVGSwitchElement;
new(): SVGSwitchElement;
}
interface SVGSymbolElement extends SVGElement, SVGStylable, SVGLangSpace, SVGExternalResourcesRequired, SVGFitToViewBox {
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGSymbolElement: {
prototype: SVGSymbolElement;
new(): SVGSymbolElement;
}
interface SVGTSpanElement extends SVGTextPositioningElement {
}
declare var SVGTSpanElement: {
prototype: SVGTSpanElement;
new(): SVGTSpanElement;
}
interface SVGTextContentElement extends SVGElement, SVGStylable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired {
lengthAdjust: SVGAnimatedEnumeration;
textLength: SVGAnimatedLength;
getCharNumAtPosition(point: SVGPoint): number;
getComputedTextLength(): number;
getEndPositionOfChar(charnum: number): SVGPoint;
getExtentOfChar(charnum: number): SVGRect;
getNumberOfChars(): number;
getRotationOfChar(charnum: number): number;
getStartPositionOfChar(charnum: number): SVGPoint;
getSubStringLength(charnum: number, nchars: number): number;
selectSubString(charnum: number, nchars: number): void;
LENGTHADJUST_SPACING: number;
LENGTHADJUST_SPACINGANDGLYPHS: number;
LENGTHADJUST_UNKNOWN: number;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGTextContentElement: {
prototype: SVGTextContentElement;
new(): SVGTextContentElement;
LENGTHADJUST_SPACING: number;
LENGTHADJUST_SPACINGANDGLYPHS: number;
LENGTHADJUST_UNKNOWN: number;
}
interface SVGTextElement extends SVGTextPositioningElement, SVGTransformable {
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGTextElement: {
prototype: SVGTextElement;
new(): SVGTextElement;
}
interface SVGTextPathElement extends SVGTextContentElement, SVGURIReference {
method: SVGAnimatedEnumeration;
spacing: SVGAnimatedEnumeration;
startOffset: SVGAnimatedLength;
TEXTPATH_METHODTYPE_ALIGN: number;
TEXTPATH_METHODTYPE_STRETCH: number;
TEXTPATH_METHODTYPE_UNKNOWN: number;
TEXTPATH_SPACINGTYPE_AUTO: number;
TEXTPATH_SPACINGTYPE_EXACT: number;
TEXTPATH_SPACINGTYPE_UNKNOWN: number;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGTextPathElement: {
prototype: SVGTextPathElement;
new(): SVGTextPathElement;
TEXTPATH_METHODTYPE_ALIGN: number;
TEXTPATH_METHODTYPE_STRETCH: number;
TEXTPATH_METHODTYPE_UNKNOWN: number;
TEXTPATH_SPACINGTYPE_AUTO: number;
TEXTPATH_SPACINGTYPE_EXACT: number;
TEXTPATH_SPACINGTYPE_UNKNOWN: number;
}
interface SVGTextPositioningElement extends SVGTextContentElement {
dx: SVGAnimatedLengthList;
dy: SVGAnimatedLengthList;
rotate: SVGAnimatedNumberList;
x: SVGAnimatedLengthList;
y: SVGAnimatedLengthList;
}
declare var SVGTextPositioningElement: {
prototype: SVGTextPositioningElement;
new(): SVGTextPositioningElement;
}
interface SVGTitleElement extends SVGElement, SVGStylable, SVGLangSpace {
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGTitleElement: {
prototype: SVGTitleElement;
new(): SVGTitleElement;
}
interface SVGTransform {
angle: number;
matrix: SVGMatrix;
type: number;
setMatrix(matrix: SVGMatrix): void;
setRotate(angle: number, cx: number, cy: number): void;
setScale(sx: number, sy: number): void;
setSkewX(angle: number): void;
setSkewY(angle: number): void;
setTranslate(tx: number, ty: number): void;
SVG_TRANSFORM_MATRIX: number;
SVG_TRANSFORM_ROTATE: number;
SVG_TRANSFORM_SCALE: number;
SVG_TRANSFORM_SKEWX: number;
SVG_TRANSFORM_SKEWY: number;
SVG_TRANSFORM_TRANSLATE: number;
SVG_TRANSFORM_UNKNOWN: number;
}
declare var SVGTransform: {
prototype: SVGTransform;
new(): SVGTransform;
SVG_TRANSFORM_MATRIX: number;
SVG_TRANSFORM_ROTATE: number;
SVG_TRANSFORM_SCALE: number;
SVG_TRANSFORM_SKEWX: number;
SVG_TRANSFORM_SKEWY: number;
SVG_TRANSFORM_TRANSLATE: number;
SVG_TRANSFORM_UNKNOWN: number;
}
interface SVGTransformList {
numberOfItems: number;
appendItem(newItem: SVGTransform): SVGTransform;
clear(): void;
consolidate(): SVGTransform;
createSVGTransformFromMatrix(matrix: SVGMatrix): SVGTransform;
getItem(index: number): SVGTransform;
initialize(newItem: SVGTransform): SVGTransform;
insertItemBefore(newItem: SVGTransform, index: number): SVGTransform;
removeItem(index: number): SVGTransform;
replaceItem(newItem: SVGTransform, index: number): SVGTransform;
}
declare var SVGTransformList: {
prototype: SVGTransformList;
new(): SVGTransformList;
}
interface SVGUnitTypes {
SVG_UNIT_TYPE_OBJECTBOUNDINGBOX: number;
SVG_UNIT_TYPE_UNKNOWN: number;
SVG_UNIT_TYPE_USERSPACEONUSE: number;
}
declare var SVGUnitTypes: SVGUnitTypes;
interface SVGUseElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGURIReference {
animatedInstanceRoot: SVGElementInstance;
height: SVGAnimatedLength;
instanceRoot: SVGElementInstance;
width: SVGAnimatedLength;
x: SVGAnimatedLength;
y: SVGAnimatedLength;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGUseElement: {
prototype: SVGUseElement;
new(): SVGUseElement;
}
interface SVGViewElement extends SVGElement, SVGExternalResourcesRequired, SVGFitToViewBox, SVGZoomAndPan {
viewTarget: SVGStringList;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var SVGViewElement: {
prototype: SVGViewElement;
new(): SVGViewElement;
}
interface SVGZoomAndPan {
SVG_ZOOMANDPAN_DISABLE: number;
SVG_ZOOMANDPAN_MAGNIFY: number;
SVG_ZOOMANDPAN_UNKNOWN: number;
}
declare var SVGZoomAndPan: SVGZoomAndPan;
interface SVGZoomEvent extends UIEvent {
newScale: number;
newTranslate: SVGPoint;
previousScale: number;
previousTranslate: SVGPoint;
zoomRectScreen: SVGRect;
}
declare var SVGZoomEvent: {
prototype: SVGZoomEvent;
new(): SVGZoomEvent;
}
interface Screen extends EventTarget {
availHeight: number;
availWidth: number;
bufferDepth: number;
colorDepth: number;
deviceXDPI: number;
deviceYDPI: number;
fontSmoothingEnabled: boolean;
height: number;
logicalXDPI: number;
logicalYDPI: number;
msOrientation: string;
onmsorientationchange: (ev: Event) => any;
pixelDepth: number;
systemXDPI: number;
systemYDPI: number;
width: number;
msLockOrientation(orientations: string): boolean;
msLockOrientation(orientations: string[]): boolean;
msUnlockOrientation(): void;
addEventListener(type: "MSOrientationChange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var Screen: {
prototype: Screen;
new(): Screen;
}
interface ScriptNotifyEvent extends Event {
callingUri: string;
value: string;
}
declare var ScriptNotifyEvent: {
prototype: ScriptNotifyEvent;
new(): ScriptNotifyEvent;
}
interface ScriptProcessorNode extends AudioNode {
bufferSize: number;
onaudioprocess: (ev: AudioProcessingEvent) => any;
addEventListener(type: "audioprocess", listener: (ev: AudioProcessingEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var ScriptProcessorNode: {
prototype: ScriptProcessorNode;
new(): ScriptProcessorNode;
}
interface Selection {
anchorNode: Node;
anchorOffset: number;
focusNode: Node;
focusOffset: number;
isCollapsed: boolean;
rangeCount: number;
type: string;
addRange(range: Range): void;
collapse(parentNode: Node, offset: number): void;
collapseToEnd(): void;
collapseToStart(): void;
containsNode(node: Node, partlyContained: boolean): boolean;
deleteFromDocument(): void;
empty(): void;
extend(newNode: Node, offset: number): void;
getRangeAt(index: number): Range;
removeAllRanges(): void;
removeRange(range: Range): void;
selectAllChildren(parentNode: Node): void;
setBaseAndExtent(baseNode: Node, baseOffset: number, extentNode: Node, extentOffset: number): void;
toString(): string;
}
declare var Selection: {
prototype: Selection;
new(): Selection;
}
interface SourceBuffer extends EventTarget {
appendWindowEnd: number;
appendWindowStart: number;
audioTracks: AudioTrackList;
buffered: TimeRanges;
mode: string;
timestampOffset: number;
updating: boolean;
videoTracks: VideoTrackList;
abort(): void;
appendBuffer(data: ArrayBuffer): void;
appendBuffer(data: ArrayBufferView): void;
appendStream(stream: MSStream, maxSize?: number): void;
remove(start: number, end: number): void;
}
declare var SourceBuffer: {
prototype: SourceBuffer;
new(): SourceBuffer;
}
interface SourceBufferList extends EventTarget {
length: number;
item(index: number): SourceBuffer;
[index: number]: SourceBuffer;
}
declare var SourceBufferList: {
prototype: SourceBufferList;
new(): SourceBufferList;
}
interface StereoPannerNode extends AudioNode {
pan: AudioParam;
}
declare var StereoPannerNode: {
prototype: StereoPannerNode;
new(): StereoPannerNode;
}
interface Storage {
length: number;
clear(): void;
getItem(key: string): any;
key(index: number): string;
removeItem(key: string): void;
setItem(key: string, data: string): void;
[key: string]: any;
[index: number]: string;
}
declare var Storage: {
prototype: Storage;
new(): Storage;
}
interface StorageEvent extends Event {
key: string;
newValue: any;
oldValue: any;
storageArea: Storage;
url: string;
initStorageEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, keyArg: string, oldValueArg: any, newValueArg: any, urlArg: string, storageAreaArg: Storage): void;
}
declare var StorageEvent: {
prototype: StorageEvent;
new(): StorageEvent;
}
interface StyleMedia {
type: string;
matchMedium(mediaquery: string): boolean;
}
declare var StyleMedia: {
prototype: StyleMedia;
new(): StyleMedia;
}
interface StyleSheet {
disabled: boolean;
href: string;
media: MediaList;
ownerNode: Node;
parentStyleSheet: StyleSheet;
title: string;
type: string;
}
declare var StyleSheet: {
prototype: StyleSheet;
new(): StyleSheet;
}
interface StyleSheetList {
length: number;
item(index?: number): StyleSheet;
[index: number]: StyleSheet;
}
declare var StyleSheetList: {
prototype: StyleSheetList;
new(): StyleSheetList;
}
interface StyleSheetPageList {
length: number;
item(index: number): CSSPageRule;
[index: number]: CSSPageRule;
}
declare var StyleSheetPageList: {
prototype: StyleSheetPageList;
new(): StyleSheetPageList;
}
interface SubtleCrypto {
decrypt(algorithm: string, key: CryptoKey, data: ArrayBufferView): any;
decrypt(algorithm: Algorithm, key: CryptoKey, data: ArrayBufferView): any;
deriveBits(algorithm: string, baseKey: CryptoKey, length: number): any;
deriveBits(algorithm: Algorithm, baseKey: CryptoKey, length: number): any;
deriveKey(algorithm: string, baseKey: CryptoKey, derivedKeyType: string, extractable: boolean, keyUsages: string[]): any;
deriveKey(algorithm: string, baseKey: CryptoKey, derivedKeyType: Algorithm, extractable: boolean, keyUsages: string[]): any;
deriveKey(algorithm: Algorithm, baseKey: CryptoKey, derivedKeyType: string, extractable: boolean, keyUsages: string[]): any;
deriveKey(algorithm: Algorithm, baseKey: CryptoKey, derivedKeyType: Algorithm, extractable: boolean, keyUsages: string[]): any;
digest(algorithm: string, data: ArrayBufferView): any;
digest(algorithm: Algorithm, data: ArrayBufferView): any;
encrypt(algorithm: string, key: CryptoKey, data: ArrayBufferView): any;
encrypt(algorithm: Algorithm, key: CryptoKey, data: ArrayBufferView): any;
exportKey(format: string, key: CryptoKey): any;
generateKey(algorithm: string, extractable: boolean, keyUsages: string[]): any;
generateKey(algorithm: Algorithm, extractable: boolean, keyUsages: string[]): any;
importKey(format: string, keyData: ArrayBufferView, algorithm: string, extractable: boolean, keyUsages: string[]): any;
importKey(format: string, keyData: ArrayBufferView, algorithm: Algorithm, extractable: boolean, keyUsages: string[]): any;
sign(algorithm: string, key: CryptoKey, data: ArrayBufferView): any;
sign(algorithm: Algorithm, key: CryptoKey, data: ArrayBufferView): any;
unwrapKey(format: string, wrappedKey: ArrayBufferView, unwrappingKey: CryptoKey, unwrapAlgorithm: string, unwrappedKeyAlgorithm: string, extractable: boolean, keyUsages: string[]): any;
unwrapKey(format: string, wrappedKey: ArrayBufferView, unwrappingKey: CryptoKey, unwrapAlgorithm: string, unwrappedKeyAlgorithm: Algorithm, extractable: boolean, keyUsages: string[]): any;
unwrapKey(format: string, wrappedKey: ArrayBufferView, unwrappingKey: CryptoKey, unwrapAlgorithm: Algorithm, unwrappedKeyAlgorithm: string, extractable: boolean, keyUsages: string[]): any;
unwrapKey(format: string, wrappedKey: ArrayBufferView, unwrappingKey: CryptoKey, unwrapAlgorithm: Algorithm, unwrappedKeyAlgorithm: Algorithm, extractable: boolean, keyUsages: string[]): any;
verify(algorithm: string, key: CryptoKey, signature: ArrayBufferView, data: ArrayBufferView): any;
verify(algorithm: Algorithm, key: CryptoKey, signature: ArrayBufferView, data: ArrayBufferView): any;
wrapKey(format: string, key: CryptoKey, wrappingKey: CryptoKey, wrapAlgorithm: string): any;
wrapKey(format: string, key: CryptoKey, wrappingKey: CryptoKey, wrapAlgorithm: Algorithm): any;
}
declare var SubtleCrypto: {
prototype: SubtleCrypto;
new(): SubtleCrypto;
}
interface Text extends CharacterData {
wholeText: string;
replaceWholeText(content: string): Text;
splitText(offset: number): Text;
}
declare var Text: {
prototype: Text;
new(): Text;
}
interface TextEvent extends UIEvent {
data: string;
inputMethod: number;
locale: string;
initTextEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, dataArg: string, inputMethod: number, locale: string): void;
DOM_INPUT_METHOD_DROP: number;
DOM_INPUT_METHOD_HANDWRITING: number;
DOM_INPUT_METHOD_IME: number;
DOM_INPUT_METHOD_KEYBOARD: number;
DOM_INPUT_METHOD_MULTIMODAL: number;
DOM_INPUT_METHOD_OPTION: number;
DOM_INPUT_METHOD_PASTE: number;
DOM_INPUT_METHOD_SCRIPT: number;
DOM_INPUT_METHOD_UNKNOWN: number;
DOM_INPUT_METHOD_VOICE: number;
}
declare var TextEvent: {
prototype: TextEvent;
new(): TextEvent;
DOM_INPUT_METHOD_DROP: number;
DOM_INPUT_METHOD_HANDWRITING: number;
DOM_INPUT_METHOD_IME: number;
DOM_INPUT_METHOD_KEYBOARD: number;
DOM_INPUT_METHOD_MULTIMODAL: number;
DOM_INPUT_METHOD_OPTION: number;
DOM_INPUT_METHOD_PASTE: number;
DOM_INPUT_METHOD_SCRIPT: number;
DOM_INPUT_METHOD_UNKNOWN: number;
DOM_INPUT_METHOD_VOICE: number;
}
interface TextMetrics {
width: number;
}
declare var TextMetrics: {
prototype: TextMetrics;
new(): TextMetrics;
}
interface TextRange {
boundingHeight: number;
boundingLeft: number;
boundingTop: number;
boundingWidth: number;
htmlText: string;
offsetLeft: number;
offsetTop: number;
text: string;
collapse(start?: boolean): void;
compareEndPoints(how: string, sourceRange: TextRange): number;
duplicate(): TextRange;
execCommand(cmdID: string, showUI?: boolean, value?: any): boolean;
execCommandShowHelp(cmdID: string): boolean;
expand(Unit: string): boolean;
findText(string: string, count?: number, flags?: number): boolean;
getBookmark(): string;
getBoundingClientRect(): ClientRect;
getClientRects(): ClientRectList;
inRange(range: TextRange): boolean;
isEqual(range: TextRange): boolean;
move(unit: string, count?: number): number;
moveEnd(unit: string, count?: number): number;
moveStart(unit: string, count?: number): number;
moveToBookmark(bookmark: string): boolean;
moveToElementText(element: Element): void;
moveToPoint(x: number, y: number): void;
parentElement(): Element;
pasteHTML(html: string): void;
queryCommandEnabled(cmdID: string): boolean;
queryCommandIndeterm(cmdID: string): boolean;
queryCommandState(cmdID: string): boolean;
queryCommandSupported(cmdID: string): boolean;
queryCommandText(cmdID: string): string;
queryCommandValue(cmdID: string): any;
scrollIntoView(fStart?: boolean): void;
select(): void;
setEndPoint(how: string, SourceRange: TextRange): void;
}
declare var TextRange: {
prototype: TextRange;
new(): TextRange;
}
interface TextRangeCollection {
length: number;
item(index: number): TextRange;
[index: number]: TextRange;
}
declare var TextRangeCollection: {
prototype: TextRangeCollection;
new(): TextRangeCollection;
}
interface TextTrack extends EventTarget {
activeCues: TextTrackCueList;
cues: TextTrackCueList;
inBandMetadataTrackDispatchType: string;
kind: string;
label: string;
language: string;
mode: any;
oncuechange: (ev: Event) => any;
onerror: (ev: Event) => any;
onload: (ev: Event) => any;
readyState: number;
addCue(cue: TextTrackCue): void;
removeCue(cue: TextTrackCue): void;
DISABLED: number;
ERROR: number;
HIDDEN: number;
LOADED: number;
LOADING: number;
NONE: number;
SHOWING: number;
addEventListener(type: "cuechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var TextTrack: {
prototype: TextTrack;
new(): TextTrack;
DISABLED: number;
ERROR: number;
HIDDEN: number;
LOADED: number;
LOADING: number;
NONE: number;
SHOWING: number;
}
interface TextTrackCue extends EventTarget {
endTime: number;
id: string;
onenter: (ev: Event) => any;
onexit: (ev: Event) => any;
pauseOnExit: boolean;
startTime: number;
text: string;
track: TextTrack;
getCueAsHTML(): DocumentFragment;
addEventListener(type: "enter", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "exit", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var TextTrackCue: {
prototype: TextTrackCue;
new(startTime: number, endTime: number, text: string): TextTrackCue;
}
interface TextTrackCueList {
length: number;
getCueById(id: string): TextTrackCue;
item(index: number): TextTrackCue;
[index: number]: TextTrackCue;
}
declare var TextTrackCueList: {
prototype: TextTrackCueList;
new(): TextTrackCueList;
}
interface TextTrackList extends EventTarget {
length: number;
onaddtrack: (ev: TrackEvent) => any;
item(index: number): TextTrack;
addEventListener(type: "addtrack", listener: (ev: TrackEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
[index: number]: TextTrack;
}
declare var TextTrackList: {
prototype: TextTrackList;
new(): TextTrackList;
}
interface TimeRanges {
length: number;
end(index: number): number;
start(index: number): number;
}
declare var TimeRanges: {
prototype: TimeRanges;
new(): TimeRanges;
}
interface Touch {
clientX: number;
clientY: number;
identifier: number;
pageX: number;
pageY: number;
screenX: number;
screenY: number;
target: EventTarget;
}
declare var Touch: {
prototype: Touch;
new(): Touch;
}
interface TouchEvent extends UIEvent {
altKey: boolean;
changedTouches: TouchList;
ctrlKey: boolean;
metaKey: boolean;
shiftKey: boolean;
targetTouches: TouchList;
touches: TouchList;
}
declare var TouchEvent: {
prototype: TouchEvent;
new(): TouchEvent;
}
interface TouchList {
length: number;
item(index: number): Touch;
[index: number]: Touch;
}
declare var TouchList: {
prototype: TouchList;
new(): TouchList;
}
interface TrackEvent extends Event {
track: any;
}
declare var TrackEvent: {
prototype: TrackEvent;
new(): TrackEvent;
}
interface TransitionEvent extends Event {
elapsedTime: number;
propertyName: string;
initTransitionEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, propertyNameArg: string, elapsedTimeArg: number): void;
}
declare var TransitionEvent: {
prototype: TransitionEvent;
new(): TransitionEvent;
}
interface TreeWalker {
currentNode: Node;
expandEntityReferences: boolean;
filter: NodeFilter;
root: Node;
whatToShow: number;
firstChild(): Node;
lastChild(): Node;
nextNode(): Node;
nextSibling(): Node;
parentNode(): Node;
previousNode(): Node;
previousSibling(): Node;
}
declare var TreeWalker: {
prototype: TreeWalker;
new(): TreeWalker;
}
interface UIEvent extends Event {
detail: number;
view: Window;
initUIEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number): void;
}
declare var UIEvent: {
prototype: UIEvent;
new(type: string, eventInitDict?: UIEventInit): UIEvent;
}
interface URL {
createObjectURL(object: any, options?: ObjectURLOptions): string;
revokeObjectURL(url: string): void;
}
declare var URL: URL;
interface UnviewableContentIdentifiedEvent extends NavigationEventWithReferrer {
mediaType: string;
}
declare var UnviewableContentIdentifiedEvent: {
prototype: UnviewableContentIdentifiedEvent;
new(): UnviewableContentIdentifiedEvent;
}
interface ValidityState {
badInput: boolean;
customError: boolean;
patternMismatch: boolean;
rangeOverflow: boolean;
rangeUnderflow: boolean;
stepMismatch: boolean;
tooLong: boolean;
typeMismatch: boolean;
valid: boolean;
valueMissing: boolean;
}
declare var ValidityState: {
prototype: ValidityState;
new(): ValidityState;
}
interface VideoPlaybackQuality {
corruptedVideoFrames: number;
creationTime: number;
droppedVideoFrames: number;
totalFrameDelay: number;
totalVideoFrames: number;
}
declare var VideoPlaybackQuality: {
prototype: VideoPlaybackQuality;
new(): VideoPlaybackQuality;
}
interface VideoTrack {
id: string;
kind: string;
label: string;
language: string;
selected: boolean;
sourceBuffer: SourceBuffer;
}
declare var VideoTrack: {
prototype: VideoTrack;
new(): VideoTrack;
}
interface VideoTrackList extends EventTarget {
length: number;
onaddtrack: (ev: TrackEvent) => any;
onchange: (ev: Event) => any;
onremovetrack: (ev: TrackEvent) => any;
selectedIndex: number;
getTrackById(id: string): VideoTrack;
item(index: number): VideoTrack;
addEventListener(type: "addtrack", listener: (ev: TrackEvent) => any, useCapture?: boolean): void;
addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "removetrack", listener: (ev: TrackEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
[index: number]: VideoTrack;
}
declare var VideoTrackList: {
prototype: VideoTrackList;
new(): VideoTrackList;
}
interface WEBGL_compressed_texture_s3tc {
COMPRESSED_RGBA_S3TC_DXT1_EXT: number;
COMPRESSED_RGBA_S3TC_DXT3_EXT: number;
COMPRESSED_RGBA_S3TC_DXT5_EXT: number;
COMPRESSED_RGB_S3TC_DXT1_EXT: number;
}
declare var WEBGL_compressed_texture_s3tc: {
prototype: WEBGL_compressed_texture_s3tc;
new(): WEBGL_compressed_texture_s3tc;
COMPRESSED_RGBA_S3TC_DXT1_EXT: number;
COMPRESSED_RGBA_S3TC_DXT3_EXT: number;
COMPRESSED_RGBA_S3TC_DXT5_EXT: number;
COMPRESSED_RGB_S3TC_DXT1_EXT: number;
}
interface WEBGL_debug_renderer_info {
UNMASKED_RENDERER_WEBGL: number;
UNMASKED_VENDOR_WEBGL: number;
}
declare var WEBGL_debug_renderer_info: {
prototype: WEBGL_debug_renderer_info;
new(): WEBGL_debug_renderer_info;
UNMASKED_RENDERER_WEBGL: number;
UNMASKED_VENDOR_WEBGL: number;
}
interface WEBGL_depth_texture {
UNSIGNED_INT_24_8_WEBGL: number;
}
declare var WEBGL_depth_texture: {
prototype: WEBGL_depth_texture;
new(): WEBGL_depth_texture;
UNSIGNED_INT_24_8_WEBGL: number;
}
interface WaveShaperNode extends AudioNode {
curve: any;
oversample: string;
}
declare var WaveShaperNode: {
prototype: WaveShaperNode;
new(): WaveShaperNode;
}
interface WebGLActiveInfo {
name: string;
size: number;
type: number;
}
declare var WebGLActiveInfo: {
prototype: WebGLActiveInfo;
new(): WebGLActiveInfo;
}
interface WebGLBuffer extends WebGLObject {
}
declare var WebGLBuffer: {
prototype: WebGLBuffer;
new(): WebGLBuffer;
}
interface WebGLContextEvent extends Event {
statusMessage: string;
}
declare var WebGLContextEvent: {
prototype: WebGLContextEvent;
new(): WebGLContextEvent;
}
interface WebGLFramebuffer extends WebGLObject {
}
declare var WebGLFramebuffer: {
prototype: WebGLFramebuffer;
new(): WebGLFramebuffer;
}
interface WebGLObject {
}
declare var WebGLObject: {
prototype: WebGLObject;
new(): WebGLObject;
}
interface WebGLProgram extends WebGLObject {
}
declare var WebGLProgram: {
prototype: WebGLProgram;
new(): WebGLProgram;
}
interface WebGLRenderbuffer extends WebGLObject {
}
declare var WebGLRenderbuffer: {
prototype: WebGLRenderbuffer;
new(): WebGLRenderbuffer;
}
interface WebGLRenderingContext {
canvas: HTMLCanvasElement;
drawingBufferHeight: number;
drawingBufferWidth: number;
activeTexture(texture: number): void;
attachShader(program: WebGLProgram, shader: WebGLShader): void;
bindAttribLocation(program: WebGLProgram, index: number, name: string): void;
bindBuffer(target: number, buffer: WebGLBuffer): void;
bindFramebuffer(target: number, framebuffer: WebGLFramebuffer): void;
bindRenderbuffer(target: number, renderbuffer: WebGLRenderbuffer): void;
bindTexture(target: number, texture: WebGLTexture): void;
blendColor(red: number, green: number, blue: number, alpha: number): void;
blendEquation(mode: number): void;
blendEquationSeparate(modeRGB: number, modeAlpha: number): void;
blendFunc(sfactor: number, dfactor: number): void;
blendFuncSeparate(srcRGB: number, dstRGB: number, srcAlpha: number, dstAlpha: number): void;
bufferData(target: number, size: number, usage: number): void;
bufferData(target: number, size: ArrayBufferView, usage: number): void;
bufferData(target: number, size: any, usage: number): void;
bufferSubData(target: number, offset: number, data: ArrayBufferView): void;
bufferSubData(target: number, offset: number, data: any): void;
checkFramebufferStatus(target: number): number;
clear(mask: number): void;
clearColor(red: number, green: number, blue: number, alpha: number): void;
clearDepth(depth: number): void;
clearStencil(s: number): void;
colorMask(red: boolean, green: boolean, blue: boolean, alpha: boolean): void;
compileShader(shader: WebGLShader): void;
compressedTexImage2D(target: number, level: number, internalformat: number, width: number, height: number, border: number, data: ArrayBufferView): void;
compressedTexSubImage2D(target: number, level: number, xoffset: number, yoffset: number, width: number, height: number, format: number, data: ArrayBufferView): void;
copyTexImage2D(target: number, level: number, internalformat: number, x: number, y: number, width: number, height: number, border: number): void;
copyTexSubImage2D(target: number, level: number, xoffset: number, yoffset: number, x: number, y: number, width: number, height: number): void;
createBuffer(): WebGLBuffer;
createFramebuffer(): WebGLFramebuffer;
createProgram(): WebGLProgram;
createRenderbuffer(): WebGLRenderbuffer;
createShader(type: number): WebGLShader;
createTexture(): WebGLTexture;
cullFace(mode: number): void;
deleteBuffer(buffer: WebGLBuffer): void;
deleteFramebuffer(framebuffer: WebGLFramebuffer): void;
deleteProgram(program: WebGLProgram): void;
deleteRenderbuffer(renderbuffer: WebGLRenderbuffer): void;
deleteShader(shader: WebGLShader): void;
deleteTexture(texture: WebGLTexture): void;
depthFunc(func: number): void;
depthMask(flag: boolean): void;
depthRange(zNear: number, zFar: number): void;
detachShader(program: WebGLProgram, shader: WebGLShader): void;
disable(cap: number): void;
disableVertexAttribArray(index: number): void;
drawArrays(mode: number, first: number, count: number): void;
drawElements(mode: number, count: number, type: number, offset: number): void;
enable(cap: number): void;
enableVertexAttribArray(index: number): void;
finish(): void;
flush(): void;
framebufferRenderbuffer(target: number, attachment: number, renderbuffertarget: number, renderbuffer: WebGLRenderbuffer): void;
framebufferTexture2D(target: number, attachment: number, textarget: number, texture: WebGLTexture, level: number): void;
frontFace(mode: number): void;
generateMipmap(target: number): void;
getActiveAttrib(program: WebGLProgram, index: number): WebGLActiveInfo;
getActiveUniform(program: WebGLProgram, index: number): WebGLActiveInfo;
getAttachedShaders(program: WebGLProgram): WebGLShader[];
getAttribLocation(program: WebGLProgram, name: string): number;
getBufferParameter(target: number, pname: number): any;
getContextAttributes(): WebGLContextAttributes;
getError(): number;
getExtension(name: string): any;
getFramebufferAttachmentParameter(target: number, attachment: number, pname: number): any;
getParameter(pname: number): any;
getProgramInfoLog(program: WebGLProgram): string;
getProgramParameter(program: WebGLProgram, pname: number): any;
getRenderbufferParameter(target: number, pname: number): any;
getShaderInfoLog(shader: WebGLShader): string;
getShaderParameter(shader: WebGLShader, pname: number): any;
getShaderPrecisionFormat(shadertype: number, precisiontype: number): WebGLShaderPrecisionFormat;
getShaderSource(shader: WebGLShader): string;
getSupportedExtensions(): string[];
getTexParameter(target: number, pname: number): any;
getUniform(program: WebGLProgram, location: WebGLUniformLocation): any;
getUniformLocation(program: WebGLProgram, name: string): WebGLUniformLocation;
getVertexAttrib(index: number, pname: number): any;
getVertexAttribOffset(index: number, pname: number): number;
hint(target: number, mode: number): void;
isBuffer(buffer: WebGLBuffer): boolean;
isContextLost(): boolean;
isEnabled(cap: number): boolean;
isFramebuffer(framebuffer: WebGLFramebuffer): boolean;
isProgram(program: WebGLProgram): boolean;
isRenderbuffer(renderbuffer: WebGLRenderbuffer): boolean;
isShader(shader: WebGLShader): boolean;
isTexture(texture: WebGLTexture): boolean;
lineWidth(width: number): void;
linkProgram(program: WebGLProgram): void;
pixelStorei(pname: number, param: number): void;
polygonOffset(factor: number, units: number): void;
readPixels(x: number, y: number, width: number, height: number, format: number, type: number, pixels: ArrayBufferView): void;
renderbufferStorage(target: number, internalformat: number, width: number, height: number): void;
sampleCoverage(value: number, invert: boolean): void;
scissor(x: number, y: number, width: number, height: number): void;
shaderSource(shader: WebGLShader, source: string): void;
stencilFunc(func: number, ref: number, mask: number): void;
stencilFuncSeparate(face: number, func: number, ref: number, mask: number): void;
stencilMask(mask: number): void;
stencilMaskSeparate(face: number, mask: number): void;
stencilOp(fail: number, zfail: number, zpass: number): void;
stencilOpSeparate(face: number, fail: number, zfail: number, zpass: number): void;
texImage2D(target: number, level: number, internalformat: number, format: number, type: number, pixels: ImageData): void;
texParameterf(target: number, pname: number, param: number): void;
texParameteri(target: number, pname: number, param: number): void;
texSubImage2D(target: number, level: number, xoffset: number, yoffset: number, format: number, type: number, pixels: ImageData): void;
uniform1f(location: WebGLUniformLocation, x: number): void;
uniform1fv(location: WebGLUniformLocation, v: any): void;
uniform1i(location: WebGLUniformLocation, x: number): void;
uniform1iv(location: WebGLUniformLocation, v: Int32Array): void;
uniform2f(location: WebGLUniformLocation, x: number, y: number): void;
uniform2fv(location: WebGLUniformLocation, v: any): void;
uniform2i(location: WebGLUniformLocation, x: number, y: number): void;
uniform2iv(location: WebGLUniformLocation, v: Int32Array): void;
uniform3f(location: WebGLUniformLocation, x: number, y: number, z: number): void;
uniform3fv(location: WebGLUniformLocation, v: any): void;
uniform3i(location: WebGLUniformLocation, x: number, y: number, z: number): void;
uniform3iv(location: WebGLUniformLocation, v: Int32Array): void;
uniform4f(location: WebGLUniformLocation, x: number, y: number, z: number, w: number): void;
uniform4fv(location: WebGLUniformLocation, v: any): void;
uniform4i(location: WebGLUniformLocation, x: number, y: number, z: number, w: number): void;
uniform4iv(location: WebGLUniformLocation, v: Int32Array): void;
uniformMatrix2fv(location: WebGLUniformLocation, transpose: boolean, value: any): void;
uniformMatrix3fv(location: WebGLUniformLocation, transpose: boolean, value: any): void;
uniformMatrix4fv(location: WebGLUniformLocation, transpose: boolean, value: any): void;
useProgram(program: WebGLProgram): void;
validateProgram(program: WebGLProgram): void;
vertexAttrib1f(indx: number, x: number): void;
vertexAttrib1fv(indx: number, values: any): void;
vertexAttrib2f(indx: number, x: number, y: number): void;
vertexAttrib2fv(indx: number, values: any): void;
vertexAttrib3f(indx: number, x: number, y: number, z: number): void;
vertexAttrib3fv(indx: number, values: any): void;
vertexAttrib4f(indx: number, x: number, y: number, z: number, w: number): void;
vertexAttrib4fv(indx: number, values: any): void;
vertexAttribPointer(indx: number, size: number, type: number, normalized: boolean, stride: number, offset: number): void;
viewport(x: number, y: number, width: number, height: number): void;
ACTIVE_ATTRIBUTES: number;
ACTIVE_TEXTURE: number;
ACTIVE_UNIFORMS: number;
ALIASED_LINE_WIDTH_RANGE: number;
ALIASED_POINT_SIZE_RANGE: number;
ALPHA: number;
ALPHA_BITS: number;
ALWAYS: number;
ARRAY_BUFFER: number;
ARRAY_BUFFER_BINDING: number;
ATTACHED_SHADERS: number;
BACK: number;
BLEND: number;
BLEND_COLOR: number;
BLEND_DST_ALPHA: number;
BLEND_DST_RGB: number;
BLEND_EQUATION: number;
BLEND_EQUATION_ALPHA: number;
BLEND_EQUATION_RGB: number;
BLEND_SRC_ALPHA: number;
BLEND_SRC_RGB: number;
BLUE_BITS: number;
BOOL: number;
BOOL_VEC2: number;
BOOL_VEC3: number;
BOOL_VEC4: number;
BROWSER_DEFAULT_WEBGL: number;
BUFFER_SIZE: number;
BUFFER_USAGE: number;
BYTE: number;
CCW: number;
CLAMP_TO_EDGE: number;
COLOR_ATTACHMENT0: number;
COLOR_BUFFER_BIT: number;
COLOR_CLEAR_VALUE: number;
COLOR_WRITEMASK: number;
COMPILE_STATUS: number;
COMPRESSED_TEXTURE_FORMATS: number;
CONSTANT_ALPHA: number;
CONSTANT_COLOR: number;
CONTEXT_LOST_WEBGL: number;
CULL_FACE: number;
CULL_FACE_MODE: number;
CURRENT_PROGRAM: number;
CURRENT_VERTEX_ATTRIB: number;
CW: number;
DECR: number;
DECR_WRAP: number;
DELETE_STATUS: number;
DEPTH_ATTACHMENT: number;
DEPTH_BITS: number;
DEPTH_BUFFER_BIT: number;
DEPTH_CLEAR_VALUE: number;
DEPTH_COMPONENT: number;
DEPTH_COMPONENT16: number;
DEPTH_FUNC: number;
DEPTH_RANGE: number;
DEPTH_STENCIL: number;
DEPTH_STENCIL_ATTACHMENT: number;
DEPTH_TEST: number;
DEPTH_WRITEMASK: number;
DITHER: number;
DONT_CARE: number;
DST_ALPHA: number;
DST_COLOR: number;
DYNAMIC_DRAW: number;
ELEMENT_ARRAY_BUFFER: number;
ELEMENT_ARRAY_BUFFER_BINDING: number;
EQUAL: number;
FASTEST: number;
FLOAT: number;
FLOAT_MAT2: number;
FLOAT_MAT3: number;
FLOAT_MAT4: number;
FLOAT_VEC2: number;
FLOAT_VEC3: number;
FLOAT_VEC4: number;
FRAGMENT_SHADER: number;
FRAMEBUFFER: number;
FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: number;
FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: number;
FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: number;
FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: number;
FRAMEBUFFER_BINDING: number;
FRAMEBUFFER_COMPLETE: number;
FRAMEBUFFER_INCOMPLETE_ATTACHMENT: number;
FRAMEBUFFER_INCOMPLETE_DIMENSIONS: number;
FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: number;
FRAMEBUFFER_UNSUPPORTED: number;
FRONT: number;
FRONT_AND_BACK: number;
FRONT_FACE: number;
FUNC_ADD: number;
FUNC_REVERSE_SUBTRACT: number;
FUNC_SUBTRACT: number;
GENERATE_MIPMAP_HINT: number;
GEQUAL: number;
GREATER: number;
GREEN_BITS: number;
HIGH_FLOAT: number;
HIGH_INT: number;
IMPLEMENTATION_COLOR_READ_FORMAT: number;
IMPLEMENTATION_COLOR_READ_TYPE: number;
INCR: number;
INCR_WRAP: number;
INT: number;
INT_VEC2: number;
INT_VEC3: number;
INT_VEC4: number;
INVALID_ENUM: number;
INVALID_FRAMEBUFFER_OPERATION: number;
INVALID_OPERATION: number;
INVALID_VALUE: number;
INVERT: number;
KEEP: number;
LEQUAL: number;
LESS: number;
LINEAR: number;
LINEAR_MIPMAP_LINEAR: number;
LINEAR_MIPMAP_NEAREST: number;
LINES: number;
LINE_LOOP: number;
LINE_STRIP: number;
LINE_WIDTH: number;
LINK_STATUS: number;
LOW_FLOAT: number;
LOW_INT: number;
LUMINANCE: number;
LUMINANCE_ALPHA: number;
MAX_COMBINED_TEXTURE_IMAGE_UNITS: number;
MAX_CUBE_MAP_TEXTURE_SIZE: number;
MAX_FRAGMENT_UNIFORM_VECTORS: number;
MAX_RENDERBUFFER_SIZE: number;
MAX_TEXTURE_IMAGE_UNITS: number;
MAX_TEXTURE_SIZE: number;
MAX_VARYING_VECTORS: number;
MAX_VERTEX_ATTRIBS: number;
MAX_VERTEX_TEXTURE_IMAGE_UNITS: number;
MAX_VERTEX_UNIFORM_VECTORS: number;
MAX_VIEWPORT_DIMS: number;
MEDIUM_FLOAT: number;
MEDIUM_INT: number;
MIRRORED_REPEAT: number;
NEAREST: number;
NEAREST_MIPMAP_LINEAR: number;
NEAREST_MIPMAP_NEAREST: number;
NEVER: number;
NICEST: number;
NONE: number;
NOTEQUAL: number;
NO_ERROR: number;
ONE: number;
ONE_MINUS_CONSTANT_ALPHA: number;
ONE_MINUS_CONSTANT_COLOR: number;
ONE_MINUS_DST_ALPHA: number;
ONE_MINUS_DST_COLOR: number;
ONE_MINUS_SRC_ALPHA: number;
ONE_MINUS_SRC_COLOR: number;
OUT_OF_MEMORY: number;
PACK_ALIGNMENT: number;
POINTS: number;
POLYGON_OFFSET_FACTOR: number;
POLYGON_OFFSET_FILL: number;
POLYGON_OFFSET_UNITS: number;
RED_BITS: number;
RENDERBUFFER: number;
RENDERBUFFER_ALPHA_SIZE: number;
RENDERBUFFER_BINDING: number;
RENDERBUFFER_BLUE_SIZE: number;
RENDERBUFFER_DEPTH_SIZE: number;
RENDERBUFFER_GREEN_SIZE: number;
RENDERBUFFER_HEIGHT: number;
RENDERBUFFER_INTERNAL_FORMAT: number;
RENDERBUFFER_RED_SIZE: number;
RENDERBUFFER_STENCIL_SIZE: number;
RENDERBUFFER_WIDTH: number;
RENDERER: number;
REPEAT: number;
REPLACE: number;
RGB: number;
RGB565: number;
RGB5_A1: number;
RGBA: number;
RGBA4: number;
SAMPLER_2D: number;
SAMPLER_CUBE: number;
SAMPLES: number;
SAMPLE_ALPHA_TO_COVERAGE: number;
SAMPLE_BUFFERS: number;
SAMPLE_COVERAGE: number;
SAMPLE_COVERAGE_INVERT: number;
SAMPLE_COVERAGE_VALUE: number;
SCISSOR_BOX: number;
SCISSOR_TEST: number;
SHADER_TYPE: number;
SHADING_LANGUAGE_VERSION: number;
SHORT: number;
SRC_ALPHA: number;
SRC_ALPHA_SATURATE: number;
SRC_COLOR: number;
STATIC_DRAW: number;
STENCIL_ATTACHMENT: number;
STENCIL_BACK_FAIL: number;
STENCIL_BACK_FUNC: number;
STENCIL_BACK_PASS_DEPTH_FAIL: number;
STENCIL_BACK_PASS_DEPTH_PASS: number;
STENCIL_BACK_REF: number;
STENCIL_BACK_VALUE_MASK: number;
STENCIL_BACK_WRITEMASK: number;
STENCIL_BITS: number;
STENCIL_BUFFER_BIT: number;
STENCIL_CLEAR_VALUE: number;
STENCIL_FAIL: number;
STENCIL_FUNC: number;
STENCIL_INDEX: number;
STENCIL_INDEX8: number;
STENCIL_PASS_DEPTH_FAIL: number;
STENCIL_PASS_DEPTH_PASS: number;
STENCIL_REF: number;
STENCIL_TEST: number;
STENCIL_VALUE_MASK: number;
STENCIL_WRITEMASK: number;
STREAM_DRAW: number;
SUBPIXEL_BITS: number;
TEXTURE: number;
TEXTURE0: number;
TEXTURE1: number;
TEXTURE10: number;
TEXTURE11: number;
TEXTURE12: number;
TEXTURE13: number;
TEXTURE14: number;
TEXTURE15: number;
TEXTURE16: number;
TEXTURE17: number;
TEXTURE18: number;
TEXTURE19: number;
TEXTURE2: number;
TEXTURE20: number;
TEXTURE21: number;
TEXTURE22: number;
TEXTURE23: number;
TEXTURE24: number;
TEXTURE25: number;
TEXTURE26: number;
TEXTURE27: number;
TEXTURE28: number;
TEXTURE29: number;
TEXTURE3: number;
TEXTURE30: number;
TEXTURE31: number;
TEXTURE4: number;
TEXTURE5: number;
TEXTURE6: number;
TEXTURE7: number;
TEXTURE8: number;
TEXTURE9: number;
TEXTURE_2D: number;
TEXTURE_BINDING_2D: number;
TEXTURE_BINDING_CUBE_MAP: number;
TEXTURE_CUBE_MAP: number;
TEXTURE_CUBE_MAP_NEGATIVE_X: number;
TEXTURE_CUBE_MAP_NEGATIVE_Y: number;
TEXTURE_CUBE_MAP_NEGATIVE_Z: number;
TEXTURE_CUBE_MAP_POSITIVE_X: number;
TEXTURE_CUBE_MAP_POSITIVE_Y: number;
TEXTURE_CUBE_MAP_POSITIVE_Z: number;
TEXTURE_MAG_FILTER: number;
TEXTURE_MIN_FILTER: number;
TEXTURE_WRAP_S: number;
TEXTURE_WRAP_T: number;
TRIANGLES: number;
TRIANGLE_FAN: number;
TRIANGLE_STRIP: number;
UNPACK_ALIGNMENT: number;
UNPACK_COLORSPACE_CONVERSION_WEBGL: number;
UNPACK_FLIP_Y_WEBGL: number;
UNPACK_PREMULTIPLY_ALPHA_WEBGL: number;
UNSIGNED_BYTE: number;
UNSIGNED_INT: number;
UNSIGNED_SHORT: number;
UNSIGNED_SHORT_4_4_4_4: number;
UNSIGNED_SHORT_5_5_5_1: number;
UNSIGNED_SHORT_5_6_5: number;
VALIDATE_STATUS: number;
VENDOR: number;
VERSION: number;
VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: number;
VERTEX_ATTRIB_ARRAY_ENABLED: number;
VERTEX_ATTRIB_ARRAY_NORMALIZED: number;
VERTEX_ATTRIB_ARRAY_POINTER: number;
VERTEX_ATTRIB_ARRAY_SIZE: number;
VERTEX_ATTRIB_ARRAY_STRIDE: number;
VERTEX_ATTRIB_ARRAY_TYPE: number;
VERTEX_SHADER: number;
VIEWPORT: number;
ZERO: number;
}
declare var WebGLRenderingContext: {
prototype: WebGLRenderingContext;
new(): WebGLRenderingContext;
ACTIVE_ATTRIBUTES: number;
ACTIVE_TEXTURE: number;
ACTIVE_UNIFORMS: number;
ALIASED_LINE_WIDTH_RANGE: number;
ALIASED_POINT_SIZE_RANGE: number;
ALPHA: number;
ALPHA_BITS: number;
ALWAYS: number;
ARRAY_BUFFER: number;
ARRAY_BUFFER_BINDING: number;
ATTACHED_SHADERS: number;
BACK: number;
BLEND: number;
BLEND_COLOR: number;
BLEND_DST_ALPHA: number;
BLEND_DST_RGB: number;
BLEND_EQUATION: number;
BLEND_EQUATION_ALPHA: number;
BLEND_EQUATION_RGB: number;
BLEND_SRC_ALPHA: number;
BLEND_SRC_RGB: number;
BLUE_BITS: number;
BOOL: number;
BOOL_VEC2: number;
BOOL_VEC3: number;
BOOL_VEC4: number;
BROWSER_DEFAULT_WEBGL: number;
BUFFER_SIZE: number;
BUFFER_USAGE: number;
BYTE: number;
CCW: number;
CLAMP_TO_EDGE: number;
COLOR_ATTACHMENT0: number;
COLOR_BUFFER_BIT: number;
COLOR_CLEAR_VALUE: number;
COLOR_WRITEMASK: number;
COMPILE_STATUS: number;
COMPRESSED_TEXTURE_FORMATS: number;
CONSTANT_ALPHA: number;
CONSTANT_COLOR: number;
CONTEXT_LOST_WEBGL: number;
CULL_FACE: number;
CULL_FACE_MODE: number;
CURRENT_PROGRAM: number;
CURRENT_VERTEX_ATTRIB: number;
CW: number;
DECR: number;
DECR_WRAP: number;
DELETE_STATUS: number;
DEPTH_ATTACHMENT: number;
DEPTH_BITS: number;
DEPTH_BUFFER_BIT: number;
DEPTH_CLEAR_VALUE: number;
DEPTH_COMPONENT: number;
DEPTH_COMPONENT16: number;
DEPTH_FUNC: number;
DEPTH_RANGE: number;
DEPTH_STENCIL: number;
DEPTH_STENCIL_ATTACHMENT: number;
DEPTH_TEST: number;
DEPTH_WRITEMASK: number;
DITHER: number;
DONT_CARE: number;
DST_ALPHA: number;
DST_COLOR: number;
DYNAMIC_DRAW: number;
ELEMENT_ARRAY_BUFFER: number;
ELEMENT_ARRAY_BUFFER_BINDING: number;
EQUAL: number;
FASTEST: number;
FLOAT: number;
FLOAT_MAT2: number;
FLOAT_MAT3: number;
FLOAT_MAT4: number;
FLOAT_VEC2: number;
FLOAT_VEC3: number;
FLOAT_VEC4: number;
FRAGMENT_SHADER: number;
FRAMEBUFFER: number;
FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: number;
FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: number;
FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: number;
FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: number;
FRAMEBUFFER_BINDING: number;
FRAMEBUFFER_COMPLETE: number;
FRAMEBUFFER_INCOMPLETE_ATTACHMENT: number;
FRAMEBUFFER_INCOMPLETE_DIMENSIONS: number;
FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: number;
FRAMEBUFFER_UNSUPPORTED: number;
FRONT: number;
FRONT_AND_BACK: number;
FRONT_FACE: number;
FUNC_ADD: number;
FUNC_REVERSE_SUBTRACT: number;
FUNC_SUBTRACT: number;
GENERATE_MIPMAP_HINT: number;
GEQUAL: number;
GREATER: number;
GREEN_BITS: number;
HIGH_FLOAT: number;
HIGH_INT: number;
IMPLEMENTATION_COLOR_READ_FORMAT: number;
IMPLEMENTATION_COLOR_READ_TYPE: number;
INCR: number;
INCR_WRAP: number;
INT: number;
INT_VEC2: number;
INT_VEC3: number;
INT_VEC4: number;
INVALID_ENUM: number;
INVALID_FRAMEBUFFER_OPERATION: number;
INVALID_OPERATION: number;
INVALID_VALUE: number;
INVERT: number;
KEEP: number;
LEQUAL: number;
LESS: number;
LINEAR: number;
LINEAR_MIPMAP_LINEAR: number;
LINEAR_MIPMAP_NEAREST: number;
LINES: number;
LINE_LOOP: number;
LINE_STRIP: number;
LINE_WIDTH: number;
LINK_STATUS: number;
LOW_FLOAT: number;
LOW_INT: number;
LUMINANCE: number;
LUMINANCE_ALPHA: number;
MAX_COMBINED_TEXTURE_IMAGE_UNITS: number;
MAX_CUBE_MAP_TEXTURE_SIZE: number;
MAX_FRAGMENT_UNIFORM_VECTORS: number;
MAX_RENDERBUFFER_SIZE: number;
MAX_TEXTURE_IMAGE_UNITS: number;
MAX_TEXTURE_SIZE: number;
MAX_VARYING_VECTORS: number;
MAX_VERTEX_ATTRIBS: number;
MAX_VERTEX_TEXTURE_IMAGE_UNITS: number;
MAX_VERTEX_UNIFORM_VECTORS: number;
MAX_VIEWPORT_DIMS: number;
MEDIUM_FLOAT: number;
MEDIUM_INT: number;
MIRRORED_REPEAT: number;
NEAREST: number;
NEAREST_MIPMAP_LINEAR: number;
NEAREST_MIPMAP_NEAREST: number;
NEVER: number;
NICEST: number;
NONE: number;
NOTEQUAL: number;
NO_ERROR: number;
ONE: number;
ONE_MINUS_CONSTANT_ALPHA: number;
ONE_MINUS_CONSTANT_COLOR: number;
ONE_MINUS_DST_ALPHA: number;
ONE_MINUS_DST_COLOR: number;
ONE_MINUS_SRC_ALPHA: number;
ONE_MINUS_SRC_COLOR: number;
OUT_OF_MEMORY: number;
PACK_ALIGNMENT: number;
POINTS: number;
POLYGON_OFFSET_FACTOR: number;
POLYGON_OFFSET_FILL: number;
POLYGON_OFFSET_UNITS: number;
RED_BITS: number;
RENDERBUFFER: number;
RENDERBUFFER_ALPHA_SIZE: number;
RENDERBUFFER_BINDING: number;
RENDERBUFFER_BLUE_SIZE: number;
RENDERBUFFER_DEPTH_SIZE: number;
RENDERBUFFER_GREEN_SIZE: number;
RENDERBUFFER_HEIGHT: number;
RENDERBUFFER_INTERNAL_FORMAT: number;
RENDERBUFFER_RED_SIZE: number;
RENDERBUFFER_STENCIL_SIZE: number;
RENDERBUFFER_WIDTH: number;
RENDERER: number;
REPEAT: number;
REPLACE: number;
RGB: number;
RGB565: number;
RGB5_A1: number;
RGBA: number;
RGBA4: number;
SAMPLER_2D: number;
SAMPLER_CUBE: number;
SAMPLES: number;
SAMPLE_ALPHA_TO_COVERAGE: number;
SAMPLE_BUFFERS: number;
SAMPLE_COVERAGE: number;
SAMPLE_COVERAGE_INVERT: number;
SAMPLE_COVERAGE_VALUE: number;
SCISSOR_BOX: number;
SCISSOR_TEST: number;
SHADER_TYPE: number;
SHADING_LANGUAGE_VERSION: number;
SHORT: number;
SRC_ALPHA: number;
SRC_ALPHA_SATURATE: number;
SRC_COLOR: number;
STATIC_DRAW: number;
STENCIL_ATTACHMENT: number;
STENCIL_BACK_FAIL: number;
STENCIL_BACK_FUNC: number;
STENCIL_BACK_PASS_DEPTH_FAIL: number;
STENCIL_BACK_PASS_DEPTH_PASS: number;
STENCIL_BACK_REF: number;
STENCIL_BACK_VALUE_MASK: number;
STENCIL_BACK_WRITEMASK: number;
STENCIL_BITS: number;
STENCIL_BUFFER_BIT: number;
STENCIL_CLEAR_VALUE: number;
STENCIL_FAIL: number;
STENCIL_FUNC: number;
STENCIL_INDEX: number;
STENCIL_INDEX8: number;
STENCIL_PASS_DEPTH_FAIL: number;
STENCIL_PASS_DEPTH_PASS: number;
STENCIL_REF: number;
STENCIL_TEST: number;
STENCIL_VALUE_MASK: number;
STENCIL_WRITEMASK: number;
STREAM_DRAW: number;
SUBPIXEL_BITS: number;
TEXTURE: number;
TEXTURE0: number;
TEXTURE1: number;
TEXTURE10: number;
TEXTURE11: number;
TEXTURE12: number;
TEXTURE13: number;
TEXTURE14: number;
TEXTURE15: number;
TEXTURE16: number;
TEXTURE17: number;
TEXTURE18: number;
TEXTURE19: number;
TEXTURE2: number;
TEXTURE20: number;
TEXTURE21: number;
TEXTURE22: number;
TEXTURE23: number;
TEXTURE24: number;
TEXTURE25: number;
TEXTURE26: number;
TEXTURE27: number;
TEXTURE28: number;
TEXTURE29: number;
TEXTURE3: number;
TEXTURE30: number;
TEXTURE31: number;
TEXTURE4: number;
TEXTURE5: number;
TEXTURE6: number;
TEXTURE7: number;
TEXTURE8: number;
TEXTURE9: number;
TEXTURE_2D: number;
TEXTURE_BINDING_2D: number;
TEXTURE_BINDING_CUBE_MAP: number;
TEXTURE_CUBE_MAP: number;
TEXTURE_CUBE_MAP_NEGATIVE_X: number;
TEXTURE_CUBE_MAP_NEGATIVE_Y: number;
TEXTURE_CUBE_MAP_NEGATIVE_Z: number;
TEXTURE_CUBE_MAP_POSITIVE_X: number;
TEXTURE_CUBE_MAP_POSITIVE_Y: number;
TEXTURE_CUBE_MAP_POSITIVE_Z: number;
TEXTURE_MAG_FILTER: number;
TEXTURE_MIN_FILTER: number;
TEXTURE_WRAP_S: number;
TEXTURE_WRAP_T: number;
TRIANGLES: number;
TRIANGLE_FAN: number;
TRIANGLE_STRIP: number;
UNPACK_ALIGNMENT: number;
UNPACK_COLORSPACE_CONVERSION_WEBGL: number;
UNPACK_FLIP_Y_WEBGL: number;
UNPACK_PREMULTIPLY_ALPHA_WEBGL: number;
UNSIGNED_BYTE: number;
UNSIGNED_INT: number;
UNSIGNED_SHORT: number;
UNSIGNED_SHORT_4_4_4_4: number;
UNSIGNED_SHORT_5_5_5_1: number;
UNSIGNED_SHORT_5_6_5: number;
VALIDATE_STATUS: number;
VENDOR: number;
VERSION: number;
VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: number;
VERTEX_ATTRIB_ARRAY_ENABLED: number;
VERTEX_ATTRIB_ARRAY_NORMALIZED: number;
VERTEX_ATTRIB_ARRAY_POINTER: number;
VERTEX_ATTRIB_ARRAY_SIZE: number;
VERTEX_ATTRIB_ARRAY_STRIDE: number;
VERTEX_ATTRIB_ARRAY_TYPE: number;
VERTEX_SHADER: number;
VIEWPORT: number;
ZERO: number;
}
interface WebGLShader extends WebGLObject {
}
declare var WebGLShader: {
prototype: WebGLShader;
new(): WebGLShader;
}
interface WebGLShaderPrecisionFormat {
precision: number;
rangeMax: number;
rangeMin: number;
}
declare var WebGLShaderPrecisionFormat: {
prototype: WebGLShaderPrecisionFormat;
new(): WebGLShaderPrecisionFormat;
}
interface WebGLTexture extends WebGLObject {
}
declare var WebGLTexture: {
prototype: WebGLTexture;
new(): WebGLTexture;
}
interface WebGLUniformLocation {
}
declare var WebGLUniformLocation: {
prototype: WebGLUniformLocation;
new(): WebGLUniformLocation;
}
interface WebKitCSSMatrix {
a: number;
b: number;
c: number;
d: number;
e: number;
f: number;
m11: number;
m12: number;
m13: number;
m14: number;
m21: number;
m22: number;
m23: number;
m24: number;
m31: number;
m32: number;
m33: number;
m34: number;
m41: number;
m42: number;
m43: number;
m44: number;
inverse(): WebKitCSSMatrix;
multiply(secondMatrix: WebKitCSSMatrix): WebKitCSSMatrix;
rotate(angleX: number, angleY?: number, angleZ?: number): WebKitCSSMatrix;
rotateAxisAngle(x: number, y: number, z: number, angle: number): WebKitCSSMatrix;
scale(scaleX: number, scaleY?: number, scaleZ?: number): WebKitCSSMatrix;
setMatrixValue(value: string): void;
skewX(angle: number): WebKitCSSMatrix;
skewY(angle: number): WebKitCSSMatrix;
toString(): string;
translate(x: number, y: number, z?: number): WebKitCSSMatrix;
}
declare var WebKitCSSMatrix: {
prototype: WebKitCSSMatrix;
new(text?: string): WebKitCSSMatrix;
}
interface WebKitPoint {
x: number;
y: number;
}
declare var WebKitPoint: {
prototype: WebKitPoint;
new(x?: number, y?: number): WebKitPoint;
}
interface WebSocket extends EventTarget {
binaryType: string;
bufferedAmount: number;
extensions: string;
onclose: (ev: CloseEvent) => any;
onerror: (ev: Event) => any;
onmessage: (ev: MessageEvent) => any;
onopen: (ev: Event) => any;
protocol: string;
readyState: number;
url: string;
close(code?: number, reason?: string): void;
send(data: any): void;
CLOSED: number;
CLOSING: number;
CONNECTING: number;
OPEN: number;
addEventListener(type: "close", listener: (ev: CloseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
addEventListener(type: "message", listener: (ev: MessageEvent) => any, useCapture?: boolean): void;
addEventListener(type: "open", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var WebSocket: {
prototype: WebSocket;
new(url: string, protocols?: string): WebSocket;
new(url: string, protocols?: any): WebSocket;
CLOSED: number;
CLOSING: number;
CONNECTING: number;
OPEN: number;
}
interface WheelEvent extends MouseEvent {
deltaMode: number;
deltaX: number;
deltaY: number;
deltaZ: number;
getCurrentPoint(element: Element): void;
initWheelEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, buttonArg: number, relatedTargetArg: EventTarget, modifiersListArg: string, deltaXArg: number, deltaYArg: number, deltaZArg: number, deltaMode: number): void;
DOM_DELTA_LINE: number;
DOM_DELTA_PAGE: number;
DOM_DELTA_PIXEL: number;
}
declare var WheelEvent: {
prototype: WheelEvent;
new(typeArg: string, eventInitDict?: WheelEventInit): WheelEvent;
DOM_DELTA_LINE: number;
DOM_DELTA_PAGE: number;
DOM_DELTA_PIXEL: number;
}
interface Window extends EventTarget, WindowTimers, WindowSessionStorage, WindowLocalStorage, WindowConsole, GlobalEventHandlers, IDBEnvironment, WindowBase64 {
animationStartTime: number;
applicationCache: ApplicationCache;
clientInformation: Navigator;
closed: boolean;
crypto: Crypto;
defaultStatus: string;
devicePixelRatio: number;
doNotTrack: string;
document: Document;
event: Event;
external: External;
frameElement: Element;
frames: Window;
history: History;
innerHeight: number;
innerWidth: number;
length: number;
location: Location;
locationbar: BarProp;
menubar: BarProp;
msAnimationStartTime: number;
msTemplatePrinter: MSTemplatePrinter;
name: string;
navigator: Navigator;
offscreenBuffering: string | boolean;
onabort: (ev: Event) => any;
onafterprint: (ev: Event) => any;
onbeforeprint: (ev: Event) => any;
onbeforeunload: (ev: BeforeUnloadEvent) => any;
onblur: (ev: FocusEvent) => any;
oncanplay: (ev: Event) => any;
oncanplaythrough: (ev: Event) => any;
onchange: (ev: Event) => any;
onclick: (ev: MouseEvent) => any;
oncompassneedscalibration: (ev: Event) => any;
oncontextmenu: (ev: PointerEvent) => any;
ondblclick: (ev: MouseEvent) => any;
ondevicemotion: (ev: DeviceMotionEvent) => any;
ondeviceorientation: (ev: DeviceOrientationEvent) => any;
ondrag: (ev: DragEvent) => any;
ondragend: (ev: DragEvent) => any;
ondragenter: (ev: DragEvent) => any;
ondragleave: (ev: DragEvent) => any;
ondragover: (ev: DragEvent) => any;
ondragstart: (ev: DragEvent) => any;
ondrop: (ev: DragEvent) => any;
ondurationchange: (ev: Event) => any;
onemptied: (ev: Event) => any;
onended: (ev: Event) => any;
onerror: ErrorEventHandler;
onfocus: (ev: FocusEvent) => any;
onhashchange: (ev: HashChangeEvent) => any;
oninput: (ev: Event) => any;
onkeydown: (ev: KeyboardEvent) => any;
onkeypress: (ev: KeyboardEvent) => any;
onkeyup: (ev: KeyboardEvent) => any;
onload: (ev: Event) => any;
onloadeddata: (ev: Event) => any;
onloadedmetadata: (ev: Event) => any;
onloadstart: (ev: Event) => any;
onmessage: (ev: MessageEvent) => any;
onmousedown: (ev: MouseEvent) => any;
onmouseenter: (ev: MouseEvent) => any;
onmouseleave: (ev: MouseEvent) => any;
onmousemove: (ev: MouseEvent) => any;
onmouseout: (ev: MouseEvent) => any;
onmouseover: (ev: MouseEvent) => any;
onmouseup: (ev: MouseEvent) => any;
onmousewheel: (ev: MouseWheelEvent) => any;
onmsgesturechange: (ev: MSGestureEvent) => any;
onmsgesturedoubletap: (ev: MSGestureEvent) => any;
onmsgestureend: (ev: MSGestureEvent) => any;
onmsgesturehold: (ev: MSGestureEvent) => any;
onmsgesturestart: (ev: MSGestureEvent) => any;
onmsgesturetap: (ev: MSGestureEvent) => any;
onmsinertiastart: (ev: MSGestureEvent) => any;
onmspointercancel: (ev: MSPointerEvent) => any;
onmspointerdown: (ev: MSPointerEvent) => any;
onmspointerenter: (ev: MSPointerEvent) => any;
onmspointerleave: (ev: MSPointerEvent) => any;
onmspointermove: (ev: MSPointerEvent) => any;
onmspointerout: (ev: MSPointerEvent) => any;
onmspointerover: (ev: MSPointerEvent) => any;
onmspointerup: (ev: MSPointerEvent) => any;
onoffline: (ev: Event) => any;
ononline: (ev: Event) => any;
onorientationchange: (ev: Event) => any;
onpagehide: (ev: PageTransitionEvent) => any;
onpageshow: (ev: PageTransitionEvent) => any;
onpause: (ev: Event) => any;
onplay: (ev: Event) => any;
onplaying: (ev: Event) => any;
onpopstate: (ev: PopStateEvent) => any;
onprogress: (ev: ProgressEvent) => any;
onratechange: (ev: Event) => any;
onreadystatechange: (ev: ProgressEvent) => any;
onreset: (ev: Event) => any;
onresize: (ev: UIEvent) => any;
onscroll: (ev: UIEvent) => any;
onseeked: (ev: Event) => any;
onseeking: (ev: Event) => any;
onselect: (ev: UIEvent) => any;
onstalled: (ev: Event) => any;
onstorage: (ev: StorageEvent) => any;
onsubmit: (ev: Event) => any;
onsuspend: (ev: Event) => any;
ontimeupdate: (ev: Event) => any;
ontouchcancel: any;
ontouchend: any;
ontouchmove: any;
ontouchstart: any;
onunload: (ev: Event) => any;
onvolumechange: (ev: Event) => any;
onwaiting: (ev: Event) => any;
opener: Window;
orientation: string;
outerHeight: number;
outerWidth: number;
pageXOffset: number;
pageYOffset: number;
parent: Window;
performance: Performance;
personalbar: BarProp;
screen: Screen;
screenLeft: number;
screenTop: number;
screenX: number;
screenY: number;
scrollX: number;
scrollY: number;
scrollbars: BarProp;
self: Window;
status: string;
statusbar: BarProp;
styleMedia: StyleMedia;
toolbar: BarProp;
top: Window;
window: Window;
alert(message?: any): void;
blur(): void;
cancelAnimationFrame(handle: number): void;
captureEvents(): void;
close(): void;
confirm(message?: string): boolean;
focus(): void;
getComputedStyle(elt: Element, pseudoElt?: string): CSSStyleDeclaration;
getMatchedCSSRules(elt: Element, pseudoElt?: string): CSSRuleList;
getSelection(): Selection;
matchMedia(mediaQuery: string): MediaQueryList;
moveBy(x?: number, y?: number): void;
moveTo(x?: number, y?: number): void;
msCancelRequestAnimationFrame(handle: number): void;
msMatchMedia(mediaQuery: string): MediaQueryList;
msRequestAnimationFrame(callback: FrameRequestCallback): number;
msWriteProfilerMark(profilerMarkName: string): void;
open(url?: string, target?: string, features?: string, replace?: boolean): any;
postMessage(message: any, targetOrigin: string, ports?: any): void;
print(): void;
prompt(message?: string, _default?: string): string;
releaseEvents(): void;
requestAnimationFrame(callback: FrameRequestCallback): number;
resizeBy(x?: number, y?: number): void;
resizeTo(x?: number, y?: number): void;
scroll(x?: number, y?: number): void;
scrollBy(x?: number, y?: number): void;
scrollTo(x?: number, y?: number): void;
webkitConvertPointFromNodeToPage(node: Node, pt: WebKitPoint): WebKitPoint;
webkitConvertPointFromPageToNode(node: Node, pt: WebKitPoint): WebKitPoint;
addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "afterprint", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "beforeprint", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "beforeunload", listener: (ev: BeforeUnloadEvent) => any, useCapture?: boolean): void;
addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "compassneedscalibration", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "devicemotion", listener: (ev: DeviceMotionEvent) => any, useCapture?: boolean): void;
addEventListener(type: "deviceorientation", listener: (ev: DeviceOrientationEvent) => any, useCapture?: boolean): void;
addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
addEventListener(type: "hashchange", listener: (ev: HashChangeEvent) => any, useCapture?: boolean): void;
addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "message", listener: (ev: MessageEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
addEventListener(type: "offline", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "online", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "orientationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "pagehide", listener: (ev: PageTransitionEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pageshow", listener: (ev: PageTransitionEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "popstate", listener: (ev: PopStateEvent) => any, useCapture?: boolean): void;
addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "readystatechange", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "resize", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "storage", listener: (ev: StorageEvent) => any, useCapture?: boolean): void;
addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "unload", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
[index: number]: Window;
}
declare var Window: {
prototype: Window;
new(): Window;
}
interface Worker extends EventTarget, AbstractWorker {
onmessage: (ev: MessageEvent) => any;
postMessage(message: any, ports?: any): void;
terminate(): void;
addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
addEventListener(type: "message", listener: (ev: MessageEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var Worker: {
prototype: Worker;
new(stringUrl: string): Worker;
}
interface XMLDocument extends Document {
}
declare var XMLDocument: {
prototype: XMLDocument;
new(): XMLDocument;
}
interface XMLHttpRequest extends EventTarget, XMLHttpRequestEventTarget {
msCaching: string;
onreadystatechange: (ev: ProgressEvent) => any;
readyState: number;
response: any;
responseBody: any;
responseText: string;
responseType: string;
responseXML: any;
status: number;
statusText: string;
timeout: number;
upload: XMLHttpRequestUpload;
withCredentials: boolean;
abort(): void;
getAllResponseHeaders(): string;
getResponseHeader(header: string): string;
msCachingEnabled(): boolean;
open(method: string, url: string, async?: boolean, user?: string, password?: string): void;
overrideMimeType(mime: string): void;
send(data?: Document): void;
send(data?: string): void;
send(data?: any): void;
setRequestHeader(header: string, value: string): void;
DONE: number;
HEADERS_RECEIVED: number;
LOADING: number;
OPENED: number;
UNSENT: number;
addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadend", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
addEventListener(type: "readystatechange", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
addEventListener(type: "timeout", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var XMLHttpRequest: {
prototype: XMLHttpRequest;
new(): XMLHttpRequest;
DONE: number;
HEADERS_RECEIVED: number;
LOADING: number;
OPENED: number;
UNSENT: number;
create(): XMLHttpRequest;
}
interface XMLHttpRequestUpload extends EventTarget, XMLHttpRequestEventTarget {
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
declare var XMLHttpRequestUpload: {
prototype: XMLHttpRequestUpload;
new(): XMLHttpRequestUpload;
}
interface XMLSerializer {
serializeToString(target: Node): string;
}
declare var XMLSerializer: {
prototype: XMLSerializer;
new(): XMLSerializer;
}
interface XPathEvaluator {
createExpression(expression: string, resolver: XPathNSResolver): XPathExpression;
createNSResolver(nodeResolver?: Node): XPathNSResolver;
evaluate(expression: string, contextNode: Node, resolver: XPathNSResolver, type: number, result: XPathResult): XPathResult;
}
declare var XPathEvaluator: {
prototype: XPathEvaluator;
new(): XPathEvaluator;
}
interface XPathExpression {
evaluate(contextNode: Node, type: number, result: XPathResult): XPathExpression;
}
declare var XPathExpression: {
prototype: XPathExpression;
new(): XPathExpression;
}
interface XPathNSResolver {
lookupNamespaceURI(prefix: string): string;
}
declare var XPathNSResolver: {
prototype: XPathNSResolver;
new(): XPathNSResolver;
}
interface XPathResult {
booleanValue: boolean;
invalidIteratorState: boolean;
numberValue: number;
resultType: number;
singleNodeValue: Node;
snapshotLength: number;
stringValue: string;
iterateNext(): Node;
snapshotItem(index: number): Node;
ANY_TYPE: number;
ANY_UNORDERED_NODE_TYPE: number;
BOOLEAN_TYPE: number;
FIRST_ORDERED_NODE_TYPE: number;
NUMBER_TYPE: number;
ORDERED_NODE_ITERATOR_TYPE: number;
ORDERED_NODE_SNAPSHOT_TYPE: number;
STRING_TYPE: number;
UNORDERED_NODE_ITERATOR_TYPE: number;
UNORDERED_NODE_SNAPSHOT_TYPE: number;
}
declare var XPathResult: {
prototype: XPathResult;
new(): XPathResult;
ANY_TYPE: number;
ANY_UNORDERED_NODE_TYPE: number;
BOOLEAN_TYPE: number;
FIRST_ORDERED_NODE_TYPE: number;
NUMBER_TYPE: number;
ORDERED_NODE_ITERATOR_TYPE: number;
ORDERED_NODE_SNAPSHOT_TYPE: number;
STRING_TYPE: number;
UNORDERED_NODE_ITERATOR_TYPE: number;
UNORDERED_NODE_SNAPSHOT_TYPE: number;
}
interface XSLTProcessor {
clearParameters(): void;
getParameter(namespaceURI: string, localName: string): any;
importStylesheet(style: Node): void;
removeParameter(namespaceURI: string, localName: string): void;
reset(): void;
setParameter(namespaceURI: string, localName: string, value: any): void;
transformToDocument(source: Node): Document;
transformToFragment(source: Node, document: Document): DocumentFragment;
}
declare var XSLTProcessor: {
prototype: XSLTProcessor;
new(): XSLTProcessor;
}
interface AbstractWorker {
onerror: (ev: Event) => any;
addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
interface ChildNode {
remove(): void;
}
interface DOML2DeprecatedColorProperty {
color: string;
}
interface DOML2DeprecatedSizeProperty {
size: number;
}
interface DocumentEvent {
createEvent(eventInterface:"AnimationEvent"): AnimationEvent;
createEvent(eventInterface:"AriaRequestEvent"): AriaRequestEvent;
createEvent(eventInterface:"AudioProcessingEvent"): AudioProcessingEvent;
createEvent(eventInterface:"BeforeUnloadEvent"): BeforeUnloadEvent;
createEvent(eventInterface:"CloseEvent"): CloseEvent;
createEvent(eventInterface:"CommandEvent"): CommandEvent;
createEvent(eventInterface:"CompositionEvent"): CompositionEvent;
createEvent(eventInterface: "CustomEvent"): CustomEvent;
createEvent(eventInterface:"DeviceMotionEvent"): DeviceMotionEvent;
createEvent(eventInterface:"DeviceOrientationEvent"): DeviceOrientationEvent;
createEvent(eventInterface:"DragEvent"): DragEvent;
createEvent(eventInterface:"ErrorEvent"): ErrorEvent;
createEvent(eventInterface:"Event"): Event;
createEvent(eventInterface:"Events"): Event;
createEvent(eventInterface:"FocusEvent"): FocusEvent;
createEvent(eventInterface:"GamepadEvent"): GamepadEvent;
createEvent(eventInterface:"HashChangeEvent"): HashChangeEvent;
createEvent(eventInterface:"IDBVersionChangeEvent"): IDBVersionChangeEvent;
createEvent(eventInterface:"KeyboardEvent"): KeyboardEvent;
createEvent(eventInterface:"LongRunningScriptDetectedEvent"): LongRunningScriptDetectedEvent;
createEvent(eventInterface:"MSGestureEvent"): MSGestureEvent;
createEvent(eventInterface:"MSManipulationEvent"): MSManipulationEvent;
createEvent(eventInterface:"MSMediaKeyMessageEvent"): MSMediaKeyMessageEvent;
createEvent(eventInterface:"MSMediaKeyNeededEvent"): MSMediaKeyNeededEvent;
createEvent(eventInterface:"MSPointerEvent"): MSPointerEvent;
createEvent(eventInterface:"MSSiteModeEvent"): MSSiteModeEvent;
createEvent(eventInterface:"MessageEvent"): MessageEvent;
createEvent(eventInterface:"MouseEvent"): MouseEvent;
createEvent(eventInterface:"MouseEvents"): MouseEvent;
createEvent(eventInterface:"MouseWheelEvent"): MouseWheelEvent;
createEvent(eventInterface:"MSGestureEvent"): MSGestureEvent;
createEvent(eventInterface:"MSPointerEvent"): MSPointerEvent;
createEvent(eventInterface:"MutationEvent"): MutationEvent;
createEvent(eventInterface:"MutationEvents"): MutationEvent;
createEvent(eventInterface:"NavigationCompletedEvent"): NavigationCompletedEvent;
createEvent(eventInterface:"NavigationEvent"): NavigationEvent;
createEvent(eventInterface:"NavigationEventWithReferrer"): NavigationEventWithReferrer;
createEvent(eventInterface:"OfflineAudioCompletionEvent"): OfflineAudioCompletionEvent;
createEvent(eventInterface:"PageTransitionEvent"): PageTransitionEvent;
createEvent(eventInterface:"PermissionRequestedEvent"): PermissionRequestedEvent;
createEvent(eventInterface:"PointerEvent"): PointerEvent;
createEvent(eventInterface:"PopStateEvent"): PopStateEvent;
createEvent(eventInterface:"ProgressEvent"): ProgressEvent;
createEvent(eventInterface:"SVGZoomEvent"): SVGZoomEvent;
createEvent(eventInterface:"SVGZoomEvents"): SVGZoomEvent;
createEvent(eventInterface:"ScriptNotifyEvent"): ScriptNotifyEvent;
createEvent(eventInterface:"StorageEvent"): StorageEvent;
createEvent(eventInterface:"TextEvent"): TextEvent;
createEvent(eventInterface:"TouchEvent"): TouchEvent;
createEvent(eventInterface:"TrackEvent"): TrackEvent;
createEvent(eventInterface:"TransitionEvent"): TransitionEvent;
createEvent(eventInterface:"UIEvent"): UIEvent;
createEvent(eventInterface:"UIEvents"): UIEvent;
createEvent(eventInterface:"UnviewableContentIdentifiedEvent"): UnviewableContentIdentifiedEvent;
createEvent(eventInterface:"WebGLContextEvent"): WebGLContextEvent;
createEvent(eventInterface:"WheelEvent"): WheelEvent;
createEvent(eventInterface: string): Event;
}
interface ElementTraversal {
childElementCount: number;
firstElementChild: Element;
lastElementChild: Element;
nextElementSibling: Element;
previousElementSibling: Element;
}
interface GetSVGDocument {
getSVGDocument(): Document;
}
interface GlobalEventHandlers {
onpointercancel: (ev: PointerEvent) => any;
onpointerdown: (ev: PointerEvent) => any;
onpointerenter: (ev: PointerEvent) => any;
onpointerleave: (ev: PointerEvent) => any;
onpointermove: (ev: PointerEvent) => any;
onpointerout: (ev: PointerEvent) => any;
onpointerover: (ev: PointerEvent) => any;
onpointerup: (ev: PointerEvent) => any;
onwheel: (ev: WheelEvent) => any;
addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
interface HTMLTableAlignment {
/**
* Sets or retrieves a value that you can use to implement your own ch functionality for the object.
*/
ch: string;
/**
* Sets or retrieves a value that you can use to implement your own chOff functionality for the object.
*/
chOff: string;
/**
* Sets or retrieves how text and other content are vertically aligned within the object that contains them.
*/
vAlign: string;
}
interface IDBEnvironment {
indexedDB: IDBFactory;
msIndexedDB: IDBFactory;
}
interface LinkStyle {
sheet: StyleSheet;
}
interface MSBaseReader {
onabort: (ev: Event) => any;
onerror: (ev: Event) => any;
onload: (ev: Event) => any;
onloadend: (ev: ProgressEvent) => any;
onloadstart: (ev: Event) => any;
onprogress: (ev: ProgressEvent) => any;
readyState: number;
result: any;
abort(): void;
DONE: number;
EMPTY: number;
LOADING: number;
addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadend", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
interface MSFileSaver {
msSaveBlob(blob: any, defaultName?: string): boolean;
msSaveOrOpenBlob(blob: any, defaultName?: string): boolean;
}
interface MSNavigatorDoNotTrack {
confirmSiteSpecificTrackingException(args: ConfirmSiteSpecificExceptionsInformation): boolean;
confirmWebWideTrackingException(args: ExceptionInformation): boolean;
removeSiteSpecificTrackingException(args: ExceptionInformation): void;
removeWebWideTrackingException(args: ExceptionInformation): void;
storeSiteSpecificTrackingException(args: StoreSiteSpecificExceptionsInformation): void;
storeWebWideTrackingException(args: StoreExceptionsInformation): void;
}
interface NavigatorContentUtils {
}
interface NavigatorGeolocation {
geolocation: Geolocation;
}
interface NavigatorID {
appName: string;
appVersion: string;
platform: string;
product: string;
productSub: string;
userAgent: string;
vendor: string;
vendorSub: string;
}
interface NavigatorOnLine {
onLine: boolean;
}
interface NavigatorStorageUtils {
}
interface NodeSelector {
querySelector(selectors: string): Element;
querySelectorAll(selectors: string): NodeList;
}
interface RandomSource {
getRandomValues(array: ArrayBufferView): ArrayBufferView;
}
interface SVGAnimatedPathData {
pathSegList: SVGPathSegList;
}
interface SVGAnimatedPoints {
animatedPoints: SVGPointList;
points: SVGPointList;
}
interface SVGExternalResourcesRequired {
externalResourcesRequired: SVGAnimatedBoolean;
}
interface SVGFilterPrimitiveStandardAttributes extends SVGStylable {
height: SVGAnimatedLength;
result: SVGAnimatedString;
width: SVGAnimatedLength;
x: SVGAnimatedLength;
y: SVGAnimatedLength;
}
interface SVGFitToViewBox {
preserveAspectRatio: SVGAnimatedPreserveAspectRatio;
viewBox: SVGAnimatedRect;
}
interface SVGLangSpace {
xmllang: string;
xmlspace: string;
}
interface SVGLocatable {
farthestViewportElement: SVGElement;
nearestViewportElement: SVGElement;
getBBox(): SVGRect;
getCTM(): SVGMatrix;
getScreenCTM(): SVGMatrix;
getTransformToElement(element: SVGElement): SVGMatrix;
}
interface SVGStylable {
className: SVGAnimatedString;
style: CSSStyleDeclaration;
}
interface SVGTests {
requiredExtensions: SVGStringList;
requiredFeatures: SVGStringList;
systemLanguage: SVGStringList;
hasExtension(extension: string): boolean;
}
interface SVGTransformable extends SVGLocatable {
transform: SVGAnimatedTransformList;
}
interface SVGURIReference {
href: SVGAnimatedString;
}
interface WindowBase64 {
atob(encodedString: string): string;
btoa(rawString: string): string;
}
interface WindowConsole {
console: Console;
}
interface WindowLocalStorage {
localStorage: Storage;
}
interface WindowSessionStorage {
sessionStorage: Storage;
}
interface WindowTimers extends Object, WindowTimersExtension {
clearInterval(handle: number): void;
clearTimeout(handle: number): void;
setInterval(handler: any, timeout?: any, ...args: any[]): number;
setTimeout(handler: any, timeout?: any, ...args: any[]): number;
}
interface WindowTimersExtension {
clearImmediate(handle: number): void;
msClearImmediate(handle: number): void;
msSetImmediate(expression: any, ...args: any[]): number;
setImmediate(expression: any, ...args: any[]): number;
}
interface XMLHttpRequestEventTarget {
onabort: (ev: Event) => any;
onerror: (ev: Event) => any;
onload: (ev: Event) => any;
onloadend: (ev: ProgressEvent) => any;
onloadstart: (ev: Event) => any;
onprogress: (ev: ProgressEvent) => any;
ontimeout: (ev: ProgressEvent) => any;
addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "loadend", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
addEventListener(type: "timeout", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
interface NodeListOf<TNode extends Node> extends NodeList {
length: number;
item(index: number): TNode;
[index: number]: TNode;
}
interface BlobPropertyBag {
type?: string;
endings?: string;
}
interface EventListenerObject {
handleEvent(evt: Event): void;
}
declare type EventListenerOrEventListenerObject = EventListener | EventListenerObject;
interface ErrorEventHandler {
(event: Event, source?: string, fileno?: number, columnNumber?: number): void;
(event: string, source?: string, fileno?: number, columnNumber?: number): void;
}
interface PositionCallback {
(position: Position): void;
}
interface PositionErrorCallback {
(error: PositionError): void;
}
interface MediaQueryListListener {
(mql: MediaQueryList): void;
}
interface MSLaunchUriCallback {
(): void;
}
interface FrameRequestCallback {
(time: number): void;
}
interface MSUnsafeFunctionCallback {
(): any;
}
interface MSExecAtPriorityFunctionCallback {
(...args: any[]): any;
}
interface MutationCallback {
(mutations: MutationRecord[], observer: MutationObserver): void;
}
interface DecodeSuccessCallback {
(decodedData: AudioBuffer): void;
}
interface DecodeErrorCallback {
(): void;
}
interface FunctionStringCallback {
(data: string): void;
}
declare var Audio: {new(src?: string): HTMLAudioElement; };
declare var Image: {new(width?: number, height?: number): HTMLImageElement; };
declare var Option: {new(text?: string, value?: string, defaultSelected?: boolean, selected?: boolean): HTMLOptionElement; };
declare var animationStartTime: number;
declare var applicationCache: ApplicationCache;
declare var clientInformation: Navigator;
declare var closed: boolean;
declare var crypto: Crypto;
declare var defaultStatus: string;
declare var devicePixelRatio: number;
declare var doNotTrack: string;
declare var document: Document;
declare var event: Event;
declare var external: External;
declare var frameElement: Element;
declare var frames: Window;
declare var history: History;
declare var innerHeight: number;
declare var innerWidth: number;
declare var length: number;
declare var location: Location;
declare var locationbar: BarProp;
declare var menubar: BarProp;
declare var msAnimationStartTime: number;
declare var msTemplatePrinter: MSTemplatePrinter;
declare var name: string;
declare var navigator: Navigator;
declare var offscreenBuffering: string | boolean;
declare var onabort: (ev: Event) => any;
declare var onafterprint: (ev: Event) => any;
declare var onbeforeprint: (ev: Event) => any;
declare var onbeforeunload: (ev: BeforeUnloadEvent) => any;
declare var onblur: (ev: FocusEvent) => any;
declare var oncanplay: (ev: Event) => any;
declare var oncanplaythrough: (ev: Event) => any;
declare var onchange: (ev: Event) => any;
declare var onclick: (ev: MouseEvent) => any;
declare var oncompassneedscalibration: (ev: Event) => any;
declare var oncontextmenu: (ev: PointerEvent) => any;
declare var ondblclick: (ev: MouseEvent) => any;
declare var ondevicemotion: (ev: DeviceMotionEvent) => any;
declare var ondeviceorientation: (ev: DeviceOrientationEvent) => any;
declare var ondrag: (ev: DragEvent) => any;
declare var ondragend: (ev: DragEvent) => any;
declare var ondragenter: (ev: DragEvent) => any;
declare var ondragleave: (ev: DragEvent) => any;
declare var ondragover: (ev: DragEvent) => any;
declare var ondragstart: (ev: DragEvent) => any;
declare var ondrop: (ev: DragEvent) => any;
declare var ondurationchange: (ev: Event) => any;
declare var onemptied: (ev: Event) => any;
declare var onended: (ev: Event) => any;
declare var onerror: ErrorEventHandler;
declare var onfocus: (ev: FocusEvent) => any;
declare var onhashchange: (ev: HashChangeEvent) => any;
declare var oninput: (ev: Event) => any;
declare var onkeydown: (ev: KeyboardEvent) => any;
declare var onkeypress: (ev: KeyboardEvent) => any;
declare var onkeyup: (ev: KeyboardEvent) => any;
declare var onload: (ev: Event) => any;
declare var onloadeddata: (ev: Event) => any;
declare var onloadedmetadata: (ev: Event) => any;
declare var onloadstart: (ev: Event) => any;
declare var onmessage: (ev: MessageEvent) => any;
declare var onmousedown: (ev: MouseEvent) => any;
declare var onmouseenter: (ev: MouseEvent) => any;
declare var onmouseleave: (ev: MouseEvent) => any;
declare var onmousemove: (ev: MouseEvent) => any;
declare var onmouseout: (ev: MouseEvent) => any;
declare var onmouseover: (ev: MouseEvent) => any;
declare var onmouseup: (ev: MouseEvent) => any;
declare var onmousewheel: (ev: MouseWheelEvent) => any;
declare var onmsgesturechange: (ev: MSGestureEvent) => any;
declare var onmsgesturedoubletap: (ev: MSGestureEvent) => any;
declare var onmsgestureend: (ev: MSGestureEvent) => any;
declare var onmsgesturehold: (ev: MSGestureEvent) => any;
declare var onmsgesturestart: (ev: MSGestureEvent) => any;
declare var onmsgesturetap: (ev: MSGestureEvent) => any;
declare var onmsinertiastart: (ev: MSGestureEvent) => any;
declare var onmspointercancel: (ev: MSPointerEvent) => any;
declare var onmspointerdown: (ev: MSPointerEvent) => any;
declare var onmspointerenter: (ev: MSPointerEvent) => any;
declare var onmspointerleave: (ev: MSPointerEvent) => any;
declare var onmspointermove: (ev: MSPointerEvent) => any;
declare var onmspointerout: (ev: MSPointerEvent) => any;
declare var onmspointerover: (ev: MSPointerEvent) => any;
declare var onmspointerup: (ev: MSPointerEvent) => any;
declare var onoffline: (ev: Event) => any;
declare var ononline: (ev: Event) => any;
declare var onorientationchange: (ev: Event) => any;
declare var onpagehide: (ev: PageTransitionEvent) => any;
declare var onpageshow: (ev: PageTransitionEvent) => any;
declare var onpause: (ev: Event) => any;
declare var onplay: (ev: Event) => any;
declare var onplaying: (ev: Event) => any;
declare var onpopstate: (ev: PopStateEvent) => any;
declare var onprogress: (ev: ProgressEvent) => any;
declare var onratechange: (ev: Event) => any;
declare var onreadystatechange: (ev: ProgressEvent) => any;
declare var onreset: (ev: Event) => any;
declare var onresize: (ev: UIEvent) => any;
declare var onscroll: (ev: UIEvent) => any;
declare var onseeked: (ev: Event) => any;
declare var onseeking: (ev: Event) => any;
declare var onselect: (ev: UIEvent) => any;
declare var onstalled: (ev: Event) => any;
declare var onstorage: (ev: StorageEvent) => any;
declare var onsubmit: (ev: Event) => any;
declare var onsuspend: (ev: Event) => any;
declare var ontimeupdate: (ev: Event) => any;
declare var ontouchcancel: any;
declare var ontouchend: any;
declare var ontouchmove: any;
declare var ontouchstart: any;
declare var onunload: (ev: Event) => any;
declare var onvolumechange: (ev: Event) => any;
declare var onwaiting: (ev: Event) => any;
declare var opener: Window;
declare var orientation: string;
declare var outerHeight: number;
declare var outerWidth: number;
declare var pageXOffset: number;
declare var pageYOffset: number;
declare var parent: Window;
declare var performance: Performance;
declare var personalbar: BarProp;
declare var screen: Screen;
declare var screenLeft: number;
declare var screenTop: number;
declare var screenX: number;
declare var screenY: number;
declare var scrollX: number;
declare var scrollY: number;
declare var scrollbars: BarProp;
declare var self: Window;
declare var status: string;
declare var statusbar: BarProp;
declare var styleMedia: StyleMedia;
declare var toolbar: BarProp;
declare var top: Window;
declare var window: Window;
declare function alert(message?: any): void;
declare function blur(): void;
declare function cancelAnimationFrame(handle: number): void;
declare function captureEvents(): void;
declare function close(): void;
declare function confirm(message?: string): boolean;
declare function focus(): void;
declare function getComputedStyle(elt: Element, pseudoElt?: string): CSSStyleDeclaration;
declare function getMatchedCSSRules(elt: Element, pseudoElt?: string): CSSRuleList;
declare function getSelection(): Selection;
declare function matchMedia(mediaQuery: string): MediaQueryList;
declare function moveBy(x?: number, y?: number): void;
declare function moveTo(x?: number, y?: number): void;
declare function msCancelRequestAnimationFrame(handle: number): void;
declare function msMatchMedia(mediaQuery: string): MediaQueryList;
declare function msRequestAnimationFrame(callback: FrameRequestCallback): number;
declare function msWriteProfilerMark(profilerMarkName: string): void;
declare function open(url?: string, target?: string, features?: string, replace?: boolean): any;
declare function postMessage(message: any, targetOrigin: string, ports?: any): void;
declare function print(): void;
declare function prompt(message?: string, _default?: string): string;
declare function releaseEvents(): void;
declare function requestAnimationFrame(callback: FrameRequestCallback): number;
declare function resizeBy(x?: number, y?: number): void;
declare function resizeTo(x?: number, y?: number): void;
declare function scroll(x?: number, y?: number): void;
declare function scrollBy(x?: number, y?: number): void;
declare function scrollTo(x?: number, y?: number): void;
declare function webkitConvertPointFromNodeToPage(node: Node, pt: WebKitPoint): WebKitPoint;
declare function webkitConvertPointFromPageToNode(node: Node, pt: WebKitPoint): WebKitPoint;
declare function toString(): string;
declare function addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
declare function dispatchEvent(evt: Event): boolean;
declare function removeEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
declare function clearInterval(handle: number): void;
declare function clearTimeout(handle: number): void;
declare function setInterval(handler: any, timeout?: any, ...args: any[]): number;
declare function setTimeout(handler: any, timeout?: any, ...args: any[]): number;
declare function clearImmediate(handle: number): void;
declare function msClearImmediate(handle: number): void;
declare function msSetImmediate(expression: any, ...args: any[]): number;
declare function setImmediate(expression: any, ...args: any[]): number;
declare var sessionStorage: Storage;
declare var localStorage: Storage;
declare var console: Console;
declare var onpointercancel: (ev: PointerEvent) => any;
declare var onpointerdown: (ev: PointerEvent) => any;
declare var onpointerenter: (ev: PointerEvent) => any;
declare var onpointerleave: (ev: PointerEvent) => any;
declare var onpointermove: (ev: PointerEvent) => any;
declare var onpointerout: (ev: PointerEvent) => any;
declare var onpointerover: (ev: PointerEvent) => any;
declare var onpointerup: (ev: PointerEvent) => any;
declare var onwheel: (ev: WheelEvent) => any;
declare var indexedDB: IDBFactory;
declare var msIndexedDB: IDBFactory;
declare function atob(encodedString: string): string;
declare function btoa(rawString: string): string;
declare function addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "afterprint", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "beforeprint", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "beforeunload", listener: (ev: BeforeUnloadEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "compassneedscalibration", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "devicemotion", listener: (ev: DeviceMotionEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "deviceorientation", listener: (ev: DeviceOrientationEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "hashchange", listener: (ev: HashChangeEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "message", listener: (ev: MessageEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "offline", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "online", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "orientationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "pagehide", listener: (ev: PageTransitionEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "pageshow", listener: (ev: PageTransitionEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "popstate", listener: (ev: PopStateEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "readystatechange", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "resize", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "storage", listener: (ev: StorageEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "unload", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
declare function addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
declare function addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
/////////////////////////////
/// WorkerGlobalScope APIs
/////////////////////////////
// These are only available in a Web Worker
declare function importScripts(...urls: string[]): void;
/////////////////////////////
/// Windows Script Host APIS
/////////////////////////////
interface ActiveXObject {
new (s: string): any;
}
declare var ActiveXObject: ActiveXObject;
interface ITextWriter {
Write(s: string): void;
WriteLine(s: string): void;
Close(): void;
}
interface TextStreamBase {
/**
* The column number of the current character position in an input stream.
*/
Column: number;
/**
* The current line number in an input stream.
*/
Line: number;
/**
* Closes a text stream.
* It is not necessary to close standard streams; they close automatically when the process ends. If
* you close a standard stream, be aware that any other pointers to that standard stream become invalid.
*/
Close(): void;
}
interface TextStreamWriter extends TextStreamBase {
/**
* Sends a string to an output stream.
*/
Write(s: string): void;
/**
* Sends a specified number of blank lines (newline characters) to an output stream.
*/
WriteBlankLines(intLines: number): void;
/**
* Sends a string followed by a newline character to an output stream.
*/
WriteLine(s: string): void;
}
interface TextStreamReader extends TextStreamBase {
/**
* Returns a specified number of characters from an input stream, starting at the current pointer position.
* Does not return until the ENTER key is pressed.
* Can only be used on a stream in reading mode; causes an error in writing or appending mode.
*/
Read(characters: number): string;
/**
* Returns all characters from an input stream.
* Can only be used on a stream in reading mode; causes an error in writing or appending mode.
*/
ReadAll(): string;
/**
* Returns an entire line from an input stream.
* Although this method extracts the newline character, it does not add it to the returned string.
* Can only be used on a stream in reading mode; causes an error in writing or appending mode.
*/
ReadLine(): string;
/**
* Skips a specified number of characters when reading from an input text stream.
* Can only be used on a stream in reading mode; causes an error in writing or appending mode.
* @param characters Positive number of characters to skip forward. (Backward skipping is not supported.)
*/
Skip(characters: number): void;
/**
* Skips the next line when reading from an input text stream.
* Can only be used on a stream in reading mode, not writing or appending mode.
*/
SkipLine(): void;
/**
* Indicates whether the stream pointer position is at the end of a line.
*/
AtEndOfLine: boolean;
/**
* Indicates whether the stream pointer position is at the end of a stream.
*/
AtEndOfStream: boolean;
}
declare var WScript: {
/**
* Outputs text to either a message box (under WScript.exe) or the command console window followed by
* a newline (under CScript.exe).
*/
Echo(s: any): void;
/**
* Exposes the write-only error output stream for the current script.
* Can be accessed only while using CScript.exe.
*/
StdErr: TextStreamWriter;
/**
* Exposes the write-only output stream for the current script.
* Can be accessed only while using CScript.exe.
*/
StdOut: TextStreamWriter;
Arguments: { length: number; Item(n: number): string; };
/**
* The full path of the currently running script.
*/
ScriptFullName: string;
/**
* Forces the script to stop immediately, with an optional exit code.
*/
Quit(exitCode?: number): number;
/**
* The Windows Script Host build version number.
*/
BuildVersion: number;
/**
* Fully qualified path of the host executable.
*/
FullName: string;
/**
* Gets/sets the script mode - interactive(true) or batch(false).
*/
Interactive: boolean;
/**
* The name of the host executable (WScript.exe or CScript.exe).
*/
Name: string;
/**
* Path of the directory containing the host executable.
*/
Path: string;
/**
* The filename of the currently running script.
*/
ScriptName: string;
/**
* Exposes the read-only input stream for the current script.
* Can be accessed only while using CScript.exe.
*/
StdIn: TextStreamReader;
/**
* Windows Script Host version
*/
Version: string;
/**
* Connects a COM object's event sources to functions named with a given prefix, in the form prefix_event.
*/
ConnectObject(objEventSource: any, strPrefix: string): void;
/**
* Creates a COM object.
* @param strProgiID
* @param strPrefix Function names in the form prefix_event will be bound to this object's COM events.
*/
CreateObject(strProgID: string, strPrefix?: string): any;
/**
* Disconnects a COM object from its event sources.
*/
DisconnectObject(obj: any): void;
/**
* Retrieves an existing object with the specified ProgID from memory, or creates a new one from a file.
* @param strPathname Fully qualified path to the file containing the object persisted to disk.
* For objects in memory, pass a zero-length string.
* @param strProgID
* @param strPrefix Function names in the form prefix_event will be bound to this object's COM events.
*/
GetObject(strPathname: string, strProgID?: string, strPrefix?: string): any;
/**
* Suspends script execution for a specified length of time, then continues execution.
* @param intTime Interval (in milliseconds) to suspend script execution.
*/
Sleep(intTime: number): void;
};
/**
* Allows enumerating over a COM collection, which may not have indexed item access.
*/
interface Enumerator<T> {
/**
* Returns true if the current item is the last one in the collection, or the collection is empty,
* or the current item is undefined.
*/
atEnd(): boolean;
/**
* Returns the current item in the collection
*/
item(): T;
/**
* Resets the current item in the collection to the first item. If there are no items in the collection,
* the current item is set to undefined.
*/
moveFirst(): void;
/**
* Moves the current item to the next item in the collection. If the enumerator is at the end of
* the collection or the collection is empty, the current item is set to undefined.
*/
moveNext(): void;
}
interface EnumeratorConstructor {
new <T>(collection: any): Enumerator<T>;
new (collection: any): Enumerator<any>;
}
declare var Enumerator: EnumeratorConstructor;
/**
* Enables reading from a COM safe array, which might have an alternate lower bound, or multiple dimensions.
*/
interface VBArray<T> {
/**
* Returns the number of dimensions (1-based).
*/
dimensions(): number;
/**
* Takes an index for each dimension in the array, and returns the item at the corresponding location.
*/
getItem(dimension1Index: number, ...dimensionNIndexes: number[]): T;
/**
* Returns the smallest available index for a given dimension.
* @param dimension 1-based dimension (defaults to 1)
*/
lbound(dimension?: number): number;
/**
* Returns the largest available index for a given dimension.
* @param dimension 1-based dimension (defaults to 1)
*/
ubound(dimension?: number): number;
/**
* Returns a Javascript array with all the elements in the VBArray. If there are multiple dimensions,
* each successive dimension is appended to the end of the array.
* Example: [[1,2,3],[4,5,6]] becomes [1,2,3,4,5,6]
*/
toArray(): T[];
}
interface VBArrayConstructor {
new <T>(safeArray: any): VBArray<T>;
new (safeArray: any): VBArray<any>;
}
declare var VBArray: VBArrayConstructor;
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
var ts;
(function (ts) {
(function (ExitStatus) {
ExitStatus[ExitStatus["Success"] = 0] = "Success";
ExitStatus[ExitStatus["DiagnosticsPresent_OutputsSkipped"] = 1] = "DiagnosticsPresent_OutputsSkipped";
ExitStatus[ExitStatus["DiagnosticsPresent_OutputsGenerated"] = 2] = "DiagnosticsPresent_OutputsGenerated";
})(ts.ExitStatus || (ts.ExitStatus = {}));
var ExitStatus = ts.ExitStatus;
(function (DiagnosticCategory) {
DiagnosticCategory[DiagnosticCategory["Warning"] = 0] = "Warning";
DiagnosticCategory[DiagnosticCategory["Error"] = 1] = "Error";
DiagnosticCategory[DiagnosticCategory["Message"] = 2] = "Message";
})(ts.DiagnosticCategory || (ts.DiagnosticCategory = {}));
var DiagnosticCategory = ts.DiagnosticCategory;
})(ts || (ts = {}));
/// <reference path="types.ts"/>
var ts;
(function (ts) {
function forEach(array, callback) {
if (array) {
for (var i = 0, len = array.length; i < len; i++) {
var result = callback(array[i], i);
if (result) {
return result;
}
}
}
return undefined;
}
ts.forEach = forEach;
function contains(array, value) {
if (array) {
for (var _i = 0; _i < array.length; _i++) {
var v = array[_i];
if (v === value) {
return true;
}
}
}
return false;
}
ts.contains = contains;
function indexOf(array, value) {
if (array) {
for (var i = 0, len = array.length; i < len; i++) {
if (array[i] === value) {
return i;
}
}
}
return -1;
}
ts.indexOf = indexOf;
function countWhere(array, predicate) {
var count = 0;
if (array) {
for (var _i = 0; _i < array.length; _i++) {
var v = array[_i];
if (predicate(v)) {
count++;
}
}
}
return count;
}
ts.countWhere = countWhere;
function filter(array, f) {
var result;
if (array) {
result = [];
for (var _i = 0; _i < array.length; _i++) {
var item = array[_i];
if (f(item)) {
result.push(item);
}
}
}
return result;
}
ts.filter = filter;
function map(array, f) {
var result;
if (array) {
result = [];
for (var _i = 0; _i < array.length; _i++) {
var v = array[_i];
result.push(f(v));
}
}
return result;
}
ts.map = map;
function concatenate(array1, array2) {
if (!array2 || !array2.length)
return array1;
if (!array1 || !array1.length)
return array2;
return array1.concat(array2);
}
ts.concatenate = concatenate;
function deduplicate(array) {
var result;
if (array) {
result = [];
for (var _i = 0; _i < array.length; _i++) {
var item = array[_i];
if (!contains(result, item)) {
result.push(item);
}
}
}
return result;
}
ts.deduplicate = deduplicate;
function sum(array, prop) {
var result = 0;
for (var _i = 0; _i < array.length; _i++) {
var v = array[_i];
result += v[prop];
}
return result;
}
ts.sum = sum;
function addRange(to, from) {
if (to && from) {
for (var _i = 0; _i < from.length; _i++) {
var v = from[_i];
to.push(v);
}
}
}
ts.addRange = addRange;
function lastOrUndefined(array) {
if (array.length === 0) {
return undefined;
}
return array[array.length - 1];
}
ts.lastOrUndefined = lastOrUndefined;
function binarySearch(array, value) {
var low = 0;
var high = array.length - 1;
while (low <= high) {
var middle = low + ((high - low) >> 1);
var midValue = array[middle];
if (midValue === value) {
return middle;
}
else if (midValue > value) {
high = middle - 1;
}
else {
low = middle + 1;
}
}
return ~low;
}
ts.binarySearch = binarySearch;
function reduceLeft(array, f, initial) {
if (array) {
var count = array.length;
if (count > 0) {
var pos = 0;
var result = arguments.length <= 2 ? array[pos++] : initial;
while (pos < count) {
result = f(result, array[pos++]);
}
return result;
}
}
return initial;
}
ts.reduceLeft = reduceLeft;
function reduceRight(array, f, initial) {
if (array) {
var pos = array.length - 1;
if (pos >= 0) {
var result = arguments.length <= 2 ? array[pos--] : initial;
while (pos >= 0) {
result = f(result, array[pos--]);
}
return result;
}
}
return initial;
}
ts.reduceRight = reduceRight;
var hasOwnProperty = Object.prototype.hasOwnProperty;
function hasProperty(map, key) {
return hasOwnProperty.call(map, key);
}
ts.hasProperty = hasProperty;
function getProperty(map, key) {
return hasOwnProperty.call(map, key) ? map[key] : undefined;
}
ts.getProperty = getProperty;
function isEmpty(map) {
for (var id in map) {
if (hasProperty(map, id)) {
return false;
}
}
return true;
}
ts.isEmpty = isEmpty;
function clone(object) {
var result = {};
for (var id in object) {
result[id] = object[id];
}
return result;
}
ts.clone = clone;
function extend(first, second) {
var result = {};
for (var id in first) {
result[id] = first[id];
}
for (var id in second) {
if (!hasProperty(result, id)) {
result[id] = second[id];
}
}
return result;
}
ts.extend = extend;
function forEachValue(map, callback) {
var result;
for (var id in map) {
if (result = callback(map[id]))
break;
}
return result;
}
ts.forEachValue = forEachValue;
function forEachKey(map, callback) {
var result;
for (var id in map) {
if (result = callback(id))
break;
}
return result;
}
ts.forEachKey = forEachKey;
function lookUp(map, key) {
return hasProperty(map, key) ? map[key] : undefined;
}
ts.lookUp = lookUp;
function copyMap(source, target) {
for (var p in source) {
target[p] = source[p];
}
}
ts.copyMap = copyMap;
function arrayToMap(array, makeKey) {
var result = {};
forEach(array, function (value) {
result[makeKey(value)] = value;
});
return result;
}
ts.arrayToMap = arrayToMap;
function memoize(callback) {
var value;
return function () {
if (callback) {
value = callback();
callback = undefined;
}
return value;
};
}
ts.memoize = memoize;
function formatStringFromArgs(text, args, baseIndex) {
baseIndex = baseIndex || 0;
return text.replace(/{(\d+)}/g, function (match, index) { return args[+index + baseIndex]; });
}
ts.localizedDiagnosticMessages = undefined;
function getLocaleSpecificMessage(message) {
return ts.localizedDiagnosticMessages && ts.localizedDiagnosticMessages[message]
? ts.localizedDiagnosticMessages[message]
: message;
}
ts.getLocaleSpecificMessage = getLocaleSpecificMessage;
function createFileDiagnostic(file, start, length, message) {
var end = start + length;
Debug.assert(start >= 0, "start must be non-negative, is " + start);
Debug.assert(length >= 0, "length must be non-negative, is " + length);
Debug.assert(start <= file.text.length, "start must be within the bounds of the file. " + start + " > " + file.text.length);
Debug.assert(end <= file.text.length, "end must be the bounds of the file. " + end + " > " + file.text.length);
var text = getLocaleSpecificMessage(message.key);
if (arguments.length > 4) {
text = formatStringFromArgs(text, arguments, 4);
}
return {
file: file,
start: start,
length: length,
messageText: text,
category: message.category,
code: message.code
};
}
ts.createFileDiagnostic = createFileDiagnostic;
function createCompilerDiagnostic(message) {
var text = getLocaleSpecificMessage(message.key);
if (arguments.length > 1) {
text = formatStringFromArgs(text, arguments, 1);
}
return {
file: undefined,
start: undefined,
length: undefined,
messageText: text,
category: message.category,
code: message.code
};
}
ts.createCompilerDiagnostic = createCompilerDiagnostic;
function chainDiagnosticMessages(details, message) {
var text = getLocaleSpecificMessage(message.key);
if (arguments.length > 2) {
text = formatStringFromArgs(text, arguments, 2);
}
return {
messageText: text,
category: message.category,
code: message.code,
next: details
};
}
ts.chainDiagnosticMessages = chainDiagnosticMessages;
function concatenateDiagnosticMessageChains(headChain, tailChain) {
Debug.assert(!headChain.next);
headChain.next = tailChain;
return headChain;
}
ts.concatenateDiagnosticMessageChains = concatenateDiagnosticMessageChains;
function compareValues(a, b) {
if (a === b)
return 0;
if (a === undefined)
return -1;
if (b === undefined)
return 1;
return a < b ? -1 : 1;
}
ts.compareValues = compareValues;
function getDiagnosticFileName(diagnostic) {
return diagnostic.file ? diagnostic.file.fileName : undefined;
}
function compareDiagnostics(d1, d2) {
return compareValues(getDiagnosticFileName(d1), getDiagnosticFileName(d2)) ||
compareValues(d1.start, d2.start) ||
compareValues(d1.length, d2.length) ||
compareValues(d1.code, d2.code) ||
compareMessageText(d1.messageText, d2.messageText) ||
0;
}
ts.compareDiagnostics = compareDiagnostics;
function compareMessageText(text1, text2) {
while (text1 && text2) {
var string1 = typeof text1 === "string" ? text1 : text1.messageText;
var string2 = typeof text2 === "string" ? text2 : text2.messageText;
var res = compareValues(string1, string2);
if (res) {
return res;
}
text1 = typeof text1 === "string" ? undefined : text1.next;
text2 = typeof text2 === "string" ? undefined : text2.next;
}
if (!text1 && !text2) {
return 0;
}
return text1 ? 1 : -1;
}
function sortAndDeduplicateDiagnostics(diagnostics) {
return deduplicateSortedDiagnostics(diagnostics.sort(compareDiagnostics));
}
ts.sortAndDeduplicateDiagnostics = sortAndDeduplicateDiagnostics;
function deduplicateSortedDiagnostics(diagnostics) {
if (diagnostics.length < 2) {
return diagnostics;
}
var newDiagnostics = [diagnostics[0]];
var previousDiagnostic = diagnostics[0];
for (var i = 1; i < diagnostics.length; i++) {
var currentDiagnostic = diagnostics[i];
var isDupe = compareDiagnostics(currentDiagnostic, previousDiagnostic) === 0;
if (!isDupe) {
newDiagnostics.push(currentDiagnostic);
previousDiagnostic = currentDiagnostic;
}
}
return newDiagnostics;
}
ts.deduplicateSortedDiagnostics = deduplicateSortedDiagnostics;
function normalizeSlashes(path) {
return path.replace(/\\/g, "/");
}
ts.normalizeSlashes = normalizeSlashes;
function getRootLength(path) {
if (path.charCodeAt(0) === 47) {
if (path.charCodeAt(1) !== 47)
return 1;
var p1 = path.indexOf("/", 2);
if (p1 < 0)
return 2;
var p2 = path.indexOf("/", p1 + 1);
if (p2 < 0)
return p1 + 1;
return p2 + 1;
}
if (path.charCodeAt(1) === 58) {
if (path.charCodeAt(2) === 47)
return 3;
return 2;
}
if (path.lastIndexOf("file:///", 0) === 0) {
return "file:///".length;
}
var idx = path.indexOf('://');
if (idx !== -1) {
return idx + "://".length;
}
return 0;
}
ts.getRootLength = getRootLength;
ts.directorySeparator = "/";
function getNormalizedParts(normalizedSlashedPath, rootLength) {
var parts = normalizedSlashedPath.substr(rootLength).split(ts.directorySeparator);
var normalized = [];
for (var _i = 0; _i < parts.length; _i++) {
var part = parts[_i];
if (part !== ".") {
if (part === ".." && normalized.length > 0 && lastOrUndefined(normalized) !== "..") {
normalized.pop();
}
else {
if (part) {
normalized.push(part);
}
}
}
}
return normalized;
}
function normalizePath(path) {
path = normalizeSlashes(path);
var rootLength = getRootLength(path);
var normalized = getNormalizedParts(path, rootLength);
return path.substr(0, rootLength) + normalized.join(ts.directorySeparator);
}
ts.normalizePath = normalizePath;
function getDirectoryPath(path) {
return path.substr(0, Math.max(getRootLength(path), path.lastIndexOf(ts.directorySeparator)));
}
ts.getDirectoryPath = getDirectoryPath;
function isUrl(path) {
return path && !isRootedDiskPath(path) && path.indexOf("://") !== -1;
}
ts.isUrl = isUrl;
function isRootedDiskPath(path) {
return getRootLength(path) !== 0;
}
ts.isRootedDiskPath = isRootedDiskPath;
function normalizedPathComponents(path, rootLength) {
var normalizedParts = getNormalizedParts(path, rootLength);
return [path.substr(0, rootLength)].concat(normalizedParts);
}
function getNormalizedPathComponents(path, currentDirectory) {
path = normalizeSlashes(path);
var rootLength = getRootLength(path);
if (rootLength == 0) {
path = combinePaths(normalizeSlashes(currentDirectory), path);
rootLength = getRootLength(path);
}
return normalizedPathComponents(path, rootLength);
}
ts.getNormalizedPathComponents = getNormalizedPathComponents;
function getNormalizedAbsolutePath(fileName, currentDirectory) {
return getNormalizedPathFromPathComponents(getNormalizedPathComponents(fileName, currentDirectory));
}
ts.getNormalizedAbsolutePath = getNormalizedAbsolutePath;
function getNormalizedPathFromPathComponents(pathComponents) {
if (pathComponents && pathComponents.length) {
return pathComponents[0] + pathComponents.slice(1).join(ts.directorySeparator);
}
}
ts.getNormalizedPathFromPathComponents = getNormalizedPathFromPathComponents;
function getNormalizedPathComponentsOfUrl(url) {
// Get root length of http://www.website.com/folder1/foler2/
// In this example the root is: http://www.website.com/
// normalized path components should be ["http://www.website.com/", "folder1", "folder2"]
var urlLength = url.length;
var rootLength = url.indexOf("://") + "://".length;
while (rootLength < urlLength) {
if (url.charCodeAt(rootLength) === 47) {
rootLength++;
}
else {
break;
}
}
if (rootLength === urlLength) {
return [url];
}
var indexOfNextSlash = url.indexOf(ts.directorySeparator, rootLength);
if (indexOfNextSlash !== -1) {
rootLength = indexOfNextSlash + 1;
return normalizedPathComponents(url, rootLength);
}
else {
return [url + ts.directorySeparator];
}
}
function getNormalizedPathOrUrlComponents(pathOrUrl, currentDirectory) {
if (isUrl(pathOrUrl)) {
return getNormalizedPathComponentsOfUrl(pathOrUrl);
}
else {
return getNormalizedPathComponents(pathOrUrl, currentDirectory);
}
}
function getRelativePathToDirectoryOrUrl(directoryPathOrUrl, relativeOrAbsolutePath, currentDirectory, getCanonicalFileName, isAbsolutePathAnUrl) {
var pathComponents = getNormalizedPathOrUrlComponents(relativeOrAbsolutePath, currentDirectory);
var directoryComponents = getNormalizedPathOrUrlComponents(directoryPathOrUrl, currentDirectory);
if (directoryComponents.length > 1 && lastOrUndefined(directoryComponents) === "") {
directoryComponents.length--;
}
for (var joinStartIndex = 0; joinStartIndex < pathComponents.length && joinStartIndex < directoryComponents.length; joinStartIndex++) {
if (getCanonicalFileName(directoryComponents[joinStartIndex]) !== getCanonicalFileName(pathComponents[joinStartIndex])) {
break;
}
}
if (joinStartIndex) {
var relativePath = "";
var relativePathComponents = pathComponents.slice(joinStartIndex, pathComponents.length);
for (; joinStartIndex < directoryComponents.length; joinStartIndex++) {
if (directoryComponents[joinStartIndex] !== "") {
relativePath = relativePath + ".." + ts.directorySeparator;
}
}
return relativePath + relativePathComponents.join(ts.directorySeparator);
}
var absolutePath = getNormalizedPathFromPathComponents(pathComponents);
if (isAbsolutePathAnUrl && isRootedDiskPath(absolutePath)) {
absolutePath = "file:///" + absolutePath;
}
return absolutePath;
}
ts.getRelativePathToDirectoryOrUrl = getRelativePathToDirectoryOrUrl;
function getBaseFileName(path) {
var i = path.lastIndexOf(ts.directorySeparator);
return i < 0 ? path : path.substring(i + 1);
}
ts.getBaseFileName = getBaseFileName;
function combinePaths(path1, path2) {
if (!(path1 && path1.length))
return path2;
if (!(path2 && path2.length))
return path1;
if (getRootLength(path2) !== 0)
return path2;
if (path1.charAt(path1.length - 1) === ts.directorySeparator)
return path1 + path2;
return path1 + ts.directorySeparator + path2;
}
ts.combinePaths = combinePaths;
function fileExtensionIs(path, extension) {
var pathLen = path.length;
var extLen = extension.length;
return pathLen > extLen && path.substr(pathLen - extLen, extLen) === extension;
}
ts.fileExtensionIs = fileExtensionIs;
ts.supportedExtensions = [".ts", ".d.ts"];
var extensionsToRemove = [".d.ts", ".ts", ".js"];
function removeFileExtension(path) {
for (var _i = 0; _i < extensionsToRemove.length; _i++) {
var ext = extensionsToRemove[_i];
if (fileExtensionIs(path, ext)) {
return path.substr(0, path.length - ext.length);
}
}
return path;
}
ts.removeFileExtension = removeFileExtension;
var backslashOrDoubleQuote = /[\"\\]/g;
var escapedCharsRegExp = /[\u0000-\u001f\t\v\f\b\r\n\u2028\u2029\u0085]/g;
var escapedCharsMap = {
"\0": "\\0",
"\t": "\\t",
"\v": "\\v",
"\f": "\\f",
"\b": "\\b",
"\r": "\\r",
"\n": "\\n",
"\\": "\\\\",
"\"": "\\\"",
"\u2028": "\\u2028",
"\u2029": "\\u2029",
"\u0085": "\\u0085"
};
function Symbol(flags, name) {
this.flags = flags;
this.name = name;
this.declarations = undefined;
}
function Type(checker, flags) {
this.flags = flags;
}
function Signature(checker) {
}
ts.objectAllocator = {
getNodeConstructor: function (kind) {
function Node() {
}
Node.prototype = {
kind: kind,
pos: 0,
end: 0,
flags: 0,
parent: undefined
};
return Node;
},
getSymbolConstructor: function () { return Symbol; },
getTypeConstructor: function () { return Type; },
getSignatureConstructor: function () { return Signature; }
};
var Debug;
(function (Debug) {
var currentAssertionLevel = 0;
function shouldAssert(level) {
return currentAssertionLevel >= level;
}
Debug.shouldAssert = shouldAssert;
function assert(expression, message, verboseDebugInfo) {
if (!expression) {
var verboseDebugString = "";
if (verboseDebugInfo) {
verboseDebugString = "\r\nVerbose Debug Information: " + verboseDebugInfo();
}
throw new Error("Debug Failure. False expression: " + (message || "") + verboseDebugString);
}
}
Debug.assert = assert;
function fail(message) {
Debug.assert(false, message);
}
Debug.fail = fail;
})(Debug = ts.Debug || (ts.Debug = {}));
})(ts || (ts = {}));
/// <reference path="core.ts"/>
var ts;
(function (ts) {
ts.sys = (function () {
function getWScriptSystem() {
var fso = new ActiveXObject("Scripting.FileSystemObject");
var fileStream = new ActiveXObject("ADODB.Stream");
fileStream.Type = 2;
var binaryStream = new ActiveXObject("ADODB.Stream");
binaryStream.Type = 1;
var args = [];
for (var i = 0; i < WScript.Arguments.length; i++) {
args[i] = WScript.Arguments.Item(i);
}
function readFile(fileName, encoding) {
if (!fso.FileExists(fileName)) {
return undefined;
}
fileStream.Open();
try {
if (encoding) {
fileStream.Charset = encoding;
fileStream.LoadFromFile(fileName);
}
else {
fileStream.Charset = "x-ansi";
fileStream.LoadFromFile(fileName);
var bom = fileStream.ReadText(2) || "";
fileStream.Position = 0;
fileStream.Charset = bom.length >= 2 && (bom.charCodeAt(0) === 0xFF && bom.charCodeAt(1) === 0xFE || bom.charCodeAt(0) === 0xFE && bom.charCodeAt(1) === 0xFF) ? "unicode" : "utf-8";
}
return fileStream.ReadText();
}
catch (e) {
throw e;
}
finally {
fileStream.Close();
}
}
function writeFile(fileName, data, writeByteOrderMark) {
fileStream.Open();
binaryStream.Open();
try {
fileStream.Charset = "utf-8";
fileStream.WriteText(data);
if (writeByteOrderMark) {
fileStream.Position = 0;
}
else {
fileStream.Position = 3;
}
fileStream.CopyTo(binaryStream);
binaryStream.SaveToFile(fileName, 2);
}
finally {
binaryStream.Close();
fileStream.Close();
}
}
function getNames(collection) {
var result = [];
for (var e = new Enumerator(collection); !e.atEnd(); e.moveNext()) {
result.push(e.item().Name);
}
return result.sort();
}
function readDirectory(path, extension) {
var result = [];
visitDirectory(path);
return result;
function visitDirectory(path) {
var folder = fso.GetFolder(path || ".");
var files = getNames(folder.files);
for (var _i = 0; _i < files.length; _i++) {
var name_1 = files[_i];
if (!extension || ts.fileExtensionIs(name_1, extension)) {
result.push(ts.combinePaths(path, name_1));
}
}
var subfolders = getNames(folder.subfolders);
for (var _a = 0; _a < subfolders.length; _a++) {
var current = subfolders[_a];
visitDirectory(ts.combinePaths(path, current));
}
}
}
return {
args: args,
newLine: "\r\n",
useCaseSensitiveFileNames: false,
write: function (s) {
WScript.StdOut.Write(s);
},
readFile: readFile,
writeFile: writeFile,
resolvePath: function (path) {
return fso.GetAbsolutePathName(path);
},
fileExists: function (path) {
return fso.FileExists(path);
},
directoryExists: function (path) {
return fso.FolderExists(path);
},
createDirectory: function (directoryName) {
if (!this.directoryExists(directoryName)) {
fso.CreateFolder(directoryName);
}
},
getExecutingFilePath: function () {
return WScript.ScriptFullName;
},
getCurrentDirectory: function () {
return new ActiveXObject("WScript.Shell").CurrentDirectory;
},
readDirectory: readDirectory,
exit: function (exitCode) {
try {
WScript.Quit(exitCode);
}
catch (e) {
}
}
};
}
function getNodeSystem() {
var _fs = require("fs");
var _path = require("path");
var _os = require('os');
var platform = _os.platform();
var useCaseSensitiveFileNames = platform !== "win32" && platform !== "win64" && platform !== "darwin";
function readFile(fileName, encoding) {
if (!_fs.existsSync(fileName)) {
return undefined;
}
var buffer = _fs.readFileSync(fileName);
var len = buffer.length;
if (len >= 2 && buffer[0] === 0xFE && buffer[1] === 0xFF) {
len &= ~1;
for (var i = 0; i < len; i += 2) {
var temp = buffer[i];
buffer[i] = buffer[i + 1];
buffer[i + 1] = temp;
}
return buffer.toString("utf16le", 2);
}
if (len >= 2 && buffer[0] === 0xFF && buffer[1] === 0xFE) {
return buffer.toString("utf16le", 2);
}
if (len >= 3 && buffer[0] === 0xEF && buffer[1] === 0xBB && buffer[2] === 0xBF) {
return buffer.toString("utf8", 3);
}
return buffer.toString("utf8");
}
function writeFile(fileName, data, writeByteOrderMark) {
if (writeByteOrderMark) {
data = '\uFEFF' + data;
}
_fs.writeFileSync(fileName, data, "utf8");
}
function readDirectory(path, extension) {
var result = [];
visitDirectory(path);
return result;
function visitDirectory(path) {
var files = _fs.readdirSync(path || ".").sort();
var directories = [];
for (var _i = 0; _i < files.length; _i++) {
var current = files[_i];
var name = ts.combinePaths(path, current);
var stat = _fs.lstatSync(name);
if (stat.isFile()) {
if (!extension || ts.fileExtensionIs(name, extension)) {
result.push(name);
}
}
else if (stat.isDirectory()) {
directories.push(name);
}
}
for (var _a = 0; _a < directories.length; _a++) {
var current = directories[_a];
visitDirectory(current);
}
}
}
return {
args: process.argv.slice(2),
newLine: _os.EOL,
useCaseSensitiveFileNames: useCaseSensitiveFileNames,
write: function (s) {
_fs.writeSync(1, s);
},
readFile: readFile,
writeFile: writeFile,
watchFile: function (fileName, callback) {
_fs.watchFile(fileName, { persistent: true, interval: 250 }, fileChanged);
return {
close: function () { _fs.unwatchFile(fileName, fileChanged); }
};
function fileChanged(curr, prev) {
if (+curr.mtime <= +prev.mtime) {
return;
}
callback(fileName);
}
;
},
resolvePath: function (path) {
return _path.resolve(path);
},
fileExists: function (path) {
return _fs.existsSync(path);
},
directoryExists: function (path) {
return _fs.existsSync(path) && _fs.statSync(path).isDirectory();
},
createDirectory: function (directoryName) {
if (!this.directoryExists(directoryName)) {
_fs.mkdirSync(directoryName);
}
},
getExecutingFilePath: function () {
return __filename;
},
getCurrentDirectory: function () {
return process.cwd();
},
readDirectory: readDirectory,
getMemoryUsage: function () {
if (global.gc) {
global.gc();
}
return process.memoryUsage().heapUsed;
},
exit: function (exitCode) {
process.exit(exitCode);
}
};
}
if (typeof WScript !== "undefined" && typeof ActiveXObject === "function") {
return getWScriptSystem();
}
else if (typeof module !== "undefined" && module.exports) {
return getNodeSystem();
}
else {
return undefined;
}
})();
})(ts || (ts = {}));
/// <reference path="types.ts" />
var ts;
(function (ts) {
ts.Diagnostics = {
Unterminated_string_literal: { code: 1002, category: ts.DiagnosticCategory.Error, key: "Unterminated string literal." },
Identifier_expected: { code: 1003, category: ts.DiagnosticCategory.Error, key: "Identifier expected." },
_0_expected: { code: 1005, category: ts.DiagnosticCategory.Error, key: "'{0}' expected." },
A_file_cannot_have_a_reference_to_itself: { code: 1006, category: ts.DiagnosticCategory.Error, key: "A file cannot have a reference to itself." },
Trailing_comma_not_allowed: { code: 1009, category: ts.DiagnosticCategory.Error, key: "Trailing comma not allowed." },
Asterisk_Slash_expected: { code: 1010, category: ts.DiagnosticCategory.Error, key: "'*/' expected." },
Unexpected_token: { code: 1012, category: ts.DiagnosticCategory.Error, key: "Unexpected token." },
A_rest_parameter_must_be_last_in_a_parameter_list: { code: 1014, category: ts.DiagnosticCategory.Error, key: "A rest parameter must be last in a parameter list." },
Parameter_cannot_have_question_mark_and_initializer: { code: 1015, category: ts.DiagnosticCategory.Error, key: "Parameter cannot have question mark and initializer." },
A_required_parameter_cannot_follow_an_optional_parameter: { code: 1016, category: ts.DiagnosticCategory.Error, key: "A required parameter cannot follow an optional parameter." },
An_index_signature_cannot_have_a_rest_parameter: { code: 1017, category: ts.DiagnosticCategory.Error, key: "An index signature cannot have a rest parameter." },
An_index_signature_parameter_cannot_have_an_accessibility_modifier: { code: 1018, category: ts.DiagnosticCategory.Error, key: "An index signature parameter cannot have an accessibility modifier." },
An_index_signature_parameter_cannot_have_a_question_mark: { code: 1019, category: ts.DiagnosticCategory.Error, key: "An index signature parameter cannot have a question mark." },
An_index_signature_parameter_cannot_have_an_initializer: { code: 1020, category: ts.DiagnosticCategory.Error, key: "An index signature parameter cannot have an initializer." },
An_index_signature_must_have_a_type_annotation: { code: 1021, category: ts.DiagnosticCategory.Error, key: "An index signature must have a type annotation." },
An_index_signature_parameter_must_have_a_type_annotation: { code: 1022, category: ts.DiagnosticCategory.Error, key: "An index signature parameter must have a type annotation." },
An_index_signature_parameter_type_must_be_string_or_number: { code: 1023, category: ts.DiagnosticCategory.Error, key: "An index signature parameter type must be 'string' or 'number'." },
A_class_or_interface_declaration_can_only_have_one_extends_clause: { code: 1024, category: ts.DiagnosticCategory.Error, key: "A class or interface declaration can only have one 'extends' clause." },
An_extends_clause_must_precede_an_implements_clause: { code: 1025, category: ts.DiagnosticCategory.Error, key: "An 'extends' clause must precede an 'implements' clause." },
A_class_can_only_extend_a_single_class: { code: 1026, category: ts.DiagnosticCategory.Error, key: "A class can only extend a single class." },
A_class_declaration_can_only_have_one_implements_clause: { code: 1027, category: ts.DiagnosticCategory.Error, key: "A class declaration can only have one 'implements' clause." },
Accessibility_modifier_already_seen: { code: 1028, category: ts.DiagnosticCategory.Error, key: "Accessibility modifier already seen." },
_0_modifier_must_precede_1_modifier: { code: 1029, category: ts.DiagnosticCategory.Error, key: "'{0}' modifier must precede '{1}' modifier." },
_0_modifier_already_seen: { code: 1030, category: ts.DiagnosticCategory.Error, key: "'{0}' modifier already seen." },
_0_modifier_cannot_appear_on_a_class_element: { code: 1031, category: ts.DiagnosticCategory.Error, key: "'{0}' modifier cannot appear on a class element." },
An_interface_declaration_cannot_have_an_implements_clause: { code: 1032, category: ts.DiagnosticCategory.Error, key: "An interface declaration cannot have an 'implements' clause." },
super_must_be_followed_by_an_argument_list_or_member_access: { code: 1034, category: ts.DiagnosticCategory.Error, key: "'super' must be followed by an argument list or member access." },
Only_ambient_modules_can_use_quoted_names: { code: 1035, category: ts.DiagnosticCategory.Error, key: "Only ambient modules can use quoted names." },
Statements_are_not_allowed_in_ambient_contexts: { code: 1036, category: ts.DiagnosticCategory.Error, key: "Statements are not allowed in ambient contexts." },
A_declare_modifier_cannot_be_used_in_an_already_ambient_context: { code: 1038, category: ts.DiagnosticCategory.Error, key: "A 'declare' modifier cannot be used in an already ambient context." },
Initializers_are_not_allowed_in_ambient_contexts: { code: 1039, category: ts.DiagnosticCategory.Error, key: "Initializers are not allowed in ambient contexts." },
_0_modifier_cannot_appear_on_a_module_element: { code: 1044, category: ts.DiagnosticCategory.Error, key: "'{0}' modifier cannot appear on a module element." },
A_declare_modifier_cannot_be_used_with_an_interface_declaration: { code: 1045, category: ts.DiagnosticCategory.Error, key: "A 'declare' modifier cannot be used with an interface declaration." },
A_declare_modifier_is_required_for_a_top_level_declaration_in_a_d_ts_file: { code: 1046, category: ts.DiagnosticCategory.Error, key: "A 'declare' modifier is required for a top level declaration in a .d.ts file." },
A_rest_parameter_cannot_be_optional: { code: 1047, category: ts.DiagnosticCategory.Error, key: "A rest parameter cannot be optional." },
A_rest_parameter_cannot_have_an_initializer: { code: 1048, category: ts.DiagnosticCategory.Error, key: "A rest parameter cannot have an initializer." },
A_set_accessor_must_have_exactly_one_parameter: { code: 1049, category: ts.DiagnosticCategory.Error, key: "A 'set' accessor must have exactly one parameter." },
A_set_accessor_cannot_have_an_optional_parameter: { code: 1051, category: ts.DiagnosticCategory.Error, key: "A 'set' accessor cannot have an optional parameter." },
A_set_accessor_parameter_cannot_have_an_initializer: { code: 1052, category: ts.DiagnosticCategory.Error, key: "A 'set' accessor parameter cannot have an initializer." },
A_set_accessor_cannot_have_rest_parameter: { code: 1053, category: ts.DiagnosticCategory.Error, key: "A 'set' accessor cannot have rest parameter." },
A_get_accessor_cannot_have_parameters: { code: 1054, category: ts.DiagnosticCategory.Error, key: "A 'get' accessor cannot have parameters." },
Accessors_are_only_available_when_targeting_ECMAScript_5_and_higher: { code: 1056, category: ts.DiagnosticCategory.Error, key: "Accessors are only available when targeting ECMAScript 5 and higher." },
Enum_member_must_have_initializer: { code: 1061, category: ts.DiagnosticCategory.Error, key: "Enum member must have initializer." },
An_export_assignment_cannot_be_used_in_a_namespace: { code: 1063, category: ts.DiagnosticCategory.Error, key: "An export assignment cannot be used in a namespace." },
Ambient_enum_elements_can_only_have_integer_literal_initializers: { code: 1066, category: ts.DiagnosticCategory.Error, key: "Ambient enum elements can only have integer literal initializers." },
Unexpected_token_A_constructor_method_accessor_or_property_was_expected: { code: 1068, category: ts.DiagnosticCategory.Error, key: "Unexpected token. A constructor, method, accessor, or property was expected." },
A_declare_modifier_cannot_be_used_with_an_import_declaration: { code: 1079, category: ts.DiagnosticCategory.Error, key: "A 'declare' modifier cannot be used with an import declaration." },
Invalid_reference_directive_syntax: { code: 1084, category: ts.DiagnosticCategory.Error, key: "Invalid 'reference' directive syntax." },
Octal_literals_are_not_available_when_targeting_ECMAScript_5_and_higher: { code: 1085, category: ts.DiagnosticCategory.Error, key: "Octal literals are not available when targeting ECMAScript 5 and higher." },
An_accessor_cannot_be_declared_in_an_ambient_context: { code: 1086, category: ts.DiagnosticCategory.Error, key: "An accessor cannot be declared in an ambient context." },
_0_modifier_cannot_appear_on_a_constructor_declaration: { code: 1089, category: ts.DiagnosticCategory.Error, key: "'{0}' modifier cannot appear on a constructor declaration." },
_0_modifier_cannot_appear_on_a_parameter: { code: 1090, category: ts.DiagnosticCategory.Error, key: "'{0}' modifier cannot appear on a parameter." },
Only_a_single_variable_declaration_is_allowed_in_a_for_in_statement: { code: 1091, category: ts.DiagnosticCategory.Error, key: "Only a single variable declaration is allowed in a 'for...in' statement." },
Type_parameters_cannot_appear_on_a_constructor_declaration: { code: 1092, category: ts.DiagnosticCategory.Error, key: "Type parameters cannot appear on a constructor declaration." },
Type_annotation_cannot_appear_on_a_constructor_declaration: { code: 1093, category: ts.DiagnosticCategory.Error, key: "Type annotation cannot appear on a constructor declaration." },
An_accessor_cannot_have_type_parameters: { code: 1094, category: ts.DiagnosticCategory.Error, key: "An accessor cannot have type parameters." },
A_set_accessor_cannot_have_a_return_type_annotation: { code: 1095, category: ts.DiagnosticCategory.Error, key: "A 'set' accessor cannot have a return type annotation." },
An_index_signature_must_have_exactly_one_parameter: { code: 1096, category: ts.DiagnosticCategory.Error, key: "An index signature must have exactly one parameter." },
_0_list_cannot_be_empty: { code: 1097, category: ts.DiagnosticCategory.Error, key: "'{0}' list cannot be empty." },
Type_parameter_list_cannot_be_empty: { code: 1098, category: ts.DiagnosticCategory.Error, key: "Type parameter list cannot be empty." },
Type_argument_list_cannot_be_empty: { code: 1099, category: ts.DiagnosticCategory.Error, key: "Type argument list cannot be empty." },
Invalid_use_of_0_in_strict_mode: { code: 1100, category: ts.DiagnosticCategory.Error, key: "Invalid use of '{0}' in strict mode." },
with_statements_are_not_allowed_in_strict_mode: { code: 1101, category: ts.DiagnosticCategory.Error, key: "'with' statements are not allowed in strict mode." },
delete_cannot_be_called_on_an_identifier_in_strict_mode: { code: 1102, category: ts.DiagnosticCategory.Error, key: "'delete' cannot be called on an identifier in strict mode." },
A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement: { code: 1104, category: ts.DiagnosticCategory.Error, key: "A 'continue' statement can only be used within an enclosing iteration statement." },
A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement: { code: 1105, category: ts.DiagnosticCategory.Error, key: "A 'break' statement can only be used within an enclosing iteration or switch statement." },
Jump_target_cannot_cross_function_boundary: { code: 1107, category: ts.DiagnosticCategory.Error, key: "Jump target cannot cross function boundary." },
A_return_statement_can_only_be_used_within_a_function_body: { code: 1108, category: ts.DiagnosticCategory.Error, key: "A 'return' statement can only be used within a function body." },
Expression_expected: { code: 1109, category: ts.DiagnosticCategory.Error, key: "Expression expected." },
Type_expected: { code: 1110, category: ts.DiagnosticCategory.Error, key: "Type expected." },
A_class_member_cannot_be_declared_optional: { code: 1112, category: ts.DiagnosticCategory.Error, key: "A class member cannot be declared optional." },
A_default_clause_cannot_appear_more_than_once_in_a_switch_statement: { code: 1113, category: ts.DiagnosticCategory.Error, key: "A 'default' clause cannot appear more than once in a 'switch' statement." },
Duplicate_label_0: { code: 1114, category: ts.DiagnosticCategory.Error, key: "Duplicate label '{0}'" },
A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement: { code: 1115, category: ts.DiagnosticCategory.Error, key: "A 'continue' statement can only jump to a label of an enclosing iteration statement." },
A_break_statement_can_only_jump_to_a_label_of_an_enclosing_statement: { code: 1116, category: ts.DiagnosticCategory.Error, key: "A 'break' statement can only jump to a label of an enclosing statement." },
An_object_literal_cannot_have_multiple_properties_with_the_same_name_in_strict_mode: { code: 1117, category: ts.DiagnosticCategory.Error, key: "An object literal cannot have multiple properties with the same name in strict mode." },
An_object_literal_cannot_have_multiple_get_Slashset_accessors_with_the_same_name: { code: 1118, category: ts.DiagnosticCategory.Error, key: "An object literal cannot have multiple get/set accessors with the same name." },
An_object_literal_cannot_have_property_and_accessor_with_the_same_name: { code: 1119, category: ts.DiagnosticCategory.Error, key: "An object literal cannot have property and accessor with the same name." },
An_export_assignment_cannot_have_modifiers: { code: 1120, category: ts.DiagnosticCategory.Error, key: "An export assignment cannot have modifiers." },
Octal_literals_are_not_allowed_in_strict_mode: { code: 1121, category: ts.DiagnosticCategory.Error, key: "Octal literals are not allowed in strict mode." },
A_tuple_type_element_list_cannot_be_empty: { code: 1122, category: ts.DiagnosticCategory.Error, key: "A tuple type element list cannot be empty." },
Variable_declaration_list_cannot_be_empty: { code: 1123, category: ts.DiagnosticCategory.Error, key: "Variable declaration list cannot be empty." },
Digit_expected: { code: 1124, category: ts.DiagnosticCategory.Error, key: "Digit expected." },
Hexadecimal_digit_expected: { code: 1125, category: ts.DiagnosticCategory.Error, key: "Hexadecimal digit expected." },
Unexpected_end_of_text: { code: 1126, category: ts.DiagnosticCategory.Error, key: "Unexpected end of text." },
Invalid_character: { code: 1127, category: ts.DiagnosticCategory.Error, key: "Invalid character." },
Declaration_or_statement_expected: { code: 1128, category: ts.DiagnosticCategory.Error, key: "Declaration or statement expected." },
Statement_expected: { code: 1129, category: ts.DiagnosticCategory.Error, key: "Statement expected." },
case_or_default_expected: { code: 1130, category: ts.DiagnosticCategory.Error, key: "'case' or 'default' expected." },
Property_or_signature_expected: { code: 1131, category: ts.DiagnosticCategory.Error, key: "Property or signature expected." },
Enum_member_expected: { code: 1132, category: ts.DiagnosticCategory.Error, key: "Enum member expected." },
Type_reference_expected: { code: 1133, category: ts.DiagnosticCategory.Error, key: "Type reference expected." },
Variable_declaration_expected: { code: 1134, category: ts.DiagnosticCategory.Error, key: "Variable declaration expected." },
Argument_expression_expected: { code: 1135, category: ts.DiagnosticCategory.Error, key: "Argument expression expected." },
Property_assignment_expected: { code: 1136, category: ts.DiagnosticCategory.Error, key: "Property assignment expected." },
Expression_or_comma_expected: { code: 1137, category: ts.DiagnosticCategory.Error, key: "Expression or comma expected." },
Parameter_declaration_expected: { code: 1138, category: ts.DiagnosticCategory.Error, key: "Parameter declaration expected." },
Type_parameter_declaration_expected: { code: 1139, category: ts.DiagnosticCategory.Error, key: "Type parameter declaration expected." },
Type_argument_expected: { code: 1140, category: ts.DiagnosticCategory.Error, key: "Type argument expected." },
String_literal_expected: { code: 1141, category: ts.DiagnosticCategory.Error, key: "String literal expected." },
Line_break_not_permitted_here: { code: 1142, category: ts.DiagnosticCategory.Error, key: "Line break not permitted here." },
or_expected: { code: 1144, category: ts.DiagnosticCategory.Error, key: "'{' or ';' expected." },
Modifiers_not_permitted_on_index_signature_members: { code: 1145, category: ts.DiagnosticCategory.Error, key: "Modifiers not permitted on index signature members." },
Declaration_expected: { code: 1146, category: ts.DiagnosticCategory.Error, key: "Declaration expected." },
Import_declarations_in_a_namespace_cannot_reference_a_module: { code: 1147, category: ts.DiagnosticCategory.Error, key: "Import declarations in a namespace cannot reference a module." },
Cannot_compile_modules_unless_the_module_flag_is_provided: { code: 1148, category: ts.DiagnosticCategory.Error, key: "Cannot compile modules unless the '--module' flag is provided." },
File_name_0_differs_from_already_included_file_name_1_only_in_casing: { code: 1149, category: ts.DiagnosticCategory.Error, key: "File name '{0}' differs from already included file name '{1}' only in casing" },
new_T_cannot_be_used_to_create_an_array_Use_new_Array_T_instead: { code: 1150, category: ts.DiagnosticCategory.Error, key: "'new T[]' cannot be used to create an array. Use 'new Array<T>()' instead." },
var_let_or_const_expected: { code: 1152, category: ts.DiagnosticCategory.Error, key: "'var', 'let' or 'const' expected." },
let_declarations_are_only_available_when_targeting_ECMAScript_6_and_higher: { code: 1153, category: ts.DiagnosticCategory.Error, key: "'let' declarations are only available when targeting ECMAScript 6 and higher." },
const_declarations_are_only_available_when_targeting_ECMAScript_6_and_higher: { code: 1154, category: ts.DiagnosticCategory.Error, key: "'const' declarations are only available when targeting ECMAScript 6 and higher." },
const_declarations_must_be_initialized: { code: 1155, category: ts.DiagnosticCategory.Error, key: "'const' declarations must be initialized" },
const_declarations_can_only_be_declared_inside_a_block: { code: 1156, category: ts.DiagnosticCategory.Error, key: "'const' declarations can only be declared inside a block." },
let_declarations_can_only_be_declared_inside_a_block: { code: 1157, category: ts.DiagnosticCategory.Error, key: "'let' declarations can only be declared inside a block." },
Unterminated_template_literal: { code: 1160, category: ts.DiagnosticCategory.Error, key: "Unterminated template literal." },
Unterminated_regular_expression_literal: { code: 1161, category: ts.DiagnosticCategory.Error, key: "Unterminated regular expression literal." },
An_object_member_cannot_be_declared_optional: { code: 1162, category: ts.DiagnosticCategory.Error, key: "An object member cannot be declared optional." },
yield_expression_must_be_contained_within_a_generator_declaration: { code: 1163, category: ts.DiagnosticCategory.Error, key: "'yield' expression must be contained_within a generator declaration." },
Computed_property_names_are_not_allowed_in_enums: { code: 1164, category: ts.DiagnosticCategory.Error, key: "Computed property names are not allowed in enums." },
A_computed_property_name_in_an_ambient_context_must_directly_refer_to_a_built_in_symbol: { code: 1165, category: ts.DiagnosticCategory.Error, key: "A computed property name in an ambient context must directly refer to a built-in symbol." },
A_computed_property_name_in_a_class_property_declaration_must_directly_refer_to_a_built_in_symbol: { code: 1166, category: ts.DiagnosticCategory.Error, key: "A computed property name in a class property declaration must directly refer to a built-in symbol." },
Computed_property_names_are_only_available_when_targeting_ECMAScript_6_and_higher: { code: 1167, category: ts.DiagnosticCategory.Error, key: "Computed property names are only available when targeting ECMAScript 6 and higher." },
A_computed_property_name_in_a_method_overload_must_directly_refer_to_a_built_in_symbol: { code: 1168, category: ts.DiagnosticCategory.Error, key: "A computed property name in a method overload must directly refer to a built-in symbol." },
A_computed_property_name_in_an_interface_must_directly_refer_to_a_built_in_symbol: { code: 1169, category: ts.DiagnosticCategory.Error, key: "A computed property name in an interface must directly refer to a built-in symbol." },
A_computed_property_name_in_a_type_literal_must_directly_refer_to_a_built_in_symbol: { code: 1170, category: ts.DiagnosticCategory.Error, key: "A computed property name in a type literal must directly refer to a built-in symbol." },
A_comma_expression_is_not_allowed_in_a_computed_property_name: { code: 1171, category: ts.DiagnosticCategory.Error, key: "A comma expression is not allowed in a computed property name." },
extends_clause_already_seen: { code: 1172, category: ts.DiagnosticCategory.Error, key: "'extends' clause already seen." },
extends_clause_must_precede_implements_clause: { code: 1173, category: ts.DiagnosticCategory.Error, key: "'extends' clause must precede 'implements' clause." },
Classes_can_only_extend_a_single_class: { code: 1174, category: ts.DiagnosticCategory.Error, key: "Classes can only extend a single class." },
implements_clause_already_seen: { code: 1175, category: ts.DiagnosticCategory.Error, key: "'implements' clause already seen." },
Interface_declaration_cannot_have_implements_clause: { code: 1176, category: ts.DiagnosticCategory.Error, key: "Interface declaration cannot have 'implements' clause." },
Binary_digit_expected: { code: 1177, category: ts.DiagnosticCategory.Error, key: "Binary digit expected." },
Octal_digit_expected: { code: 1178, category: ts.DiagnosticCategory.Error, key: "Octal digit expected." },
Unexpected_token_expected: { code: 1179, category: ts.DiagnosticCategory.Error, key: "Unexpected token. '{' expected." },
Property_destructuring_pattern_expected: { code: 1180, category: ts.DiagnosticCategory.Error, key: "Property destructuring pattern expected." },
Array_element_destructuring_pattern_expected: { code: 1181, category: ts.DiagnosticCategory.Error, key: "Array element destructuring pattern expected." },
A_destructuring_declaration_must_have_an_initializer: { code: 1182, category: ts.DiagnosticCategory.Error, key: "A destructuring declaration must have an initializer." },
Destructuring_declarations_are_not_allowed_in_ambient_contexts: { code: 1183, category: ts.DiagnosticCategory.Error, key: "Destructuring declarations are not allowed in ambient contexts." },
An_implementation_cannot_be_declared_in_ambient_contexts: { code: 1184, category: ts.DiagnosticCategory.Error, key: "An implementation cannot be declared in ambient contexts." },
Modifiers_cannot_appear_here: { code: 1184, category: ts.DiagnosticCategory.Error, key: "Modifiers cannot appear here." },
Merge_conflict_marker_encountered: { code: 1185, category: ts.DiagnosticCategory.Error, key: "Merge conflict marker encountered." },
A_rest_element_cannot_have_an_initializer: { code: 1186, category: ts.DiagnosticCategory.Error, key: "A rest element cannot have an initializer." },
A_parameter_property_may_not_be_a_binding_pattern: { code: 1187, category: ts.DiagnosticCategory.Error, key: "A parameter property may not be a binding pattern." },
Only_a_single_variable_declaration_is_allowed_in_a_for_of_statement: { code: 1188, category: ts.DiagnosticCategory.Error, key: "Only a single variable declaration is allowed in a 'for...of' statement." },
The_variable_declaration_of_a_for_in_statement_cannot_have_an_initializer: { code: 1189, category: ts.DiagnosticCategory.Error, key: "The variable declaration of a 'for...in' statement cannot have an initializer." },
The_variable_declaration_of_a_for_of_statement_cannot_have_an_initializer: { code: 1190, category: ts.DiagnosticCategory.Error, key: "The variable declaration of a 'for...of' statement cannot have an initializer." },
An_import_declaration_cannot_have_modifiers: { code: 1191, category: ts.DiagnosticCategory.Error, key: "An import declaration cannot have modifiers." },
Module_0_has_no_default_export: { code: 1192, category: ts.DiagnosticCategory.Error, key: "Module '{0}' has no default export." },
An_export_declaration_cannot_have_modifiers: { code: 1193, category: ts.DiagnosticCategory.Error, key: "An export declaration cannot have modifiers." },
Export_declarations_are_not_permitted_in_a_namespace: { code: 1194, category: ts.DiagnosticCategory.Error, key: "Export declarations are not permitted in a namespace." },
Catch_clause_variable_name_must_be_an_identifier: { code: 1195, category: ts.DiagnosticCategory.Error, key: "Catch clause variable name must be an identifier." },
Catch_clause_variable_cannot_have_a_type_annotation: { code: 1196, category: ts.DiagnosticCategory.Error, key: "Catch clause variable cannot have a type annotation." },
Catch_clause_variable_cannot_have_an_initializer: { code: 1197, category: ts.DiagnosticCategory.Error, key: "Catch clause variable cannot have an initializer." },
An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive: { code: 1198, category: ts.DiagnosticCategory.Error, key: "An extended Unicode escape value must be between 0x0 and 0x10FFFF inclusive." },
Unterminated_Unicode_escape_sequence: { code: 1199, category: ts.DiagnosticCategory.Error, key: "Unterminated Unicode escape sequence." },
Line_terminator_not_permitted_before_arrow: { code: 1200, category: ts.DiagnosticCategory.Error, key: "Line terminator not permitted before arrow." },
Import_assignment_cannot_be_used_when_targeting_ECMAScript_6_or_higher_Consider_using_import_Asterisk_as_ns_from_mod_import_a_from_mod_or_import_d_from_mod_instead: { code: 1202, category: ts.DiagnosticCategory.Error, key: "Import assignment cannot be used when targeting ECMAScript 6 or higher. Consider using 'import * as ns from \"mod\"', 'import {a} from \"mod\"' or 'import d from \"mod\"' instead." },
Export_assignment_cannot_be_used_when_targeting_ECMAScript_6_or_higher_Consider_using_export_default_instead: { code: 1203, category: ts.DiagnosticCategory.Error, key: "Export assignment cannot be used when targeting ECMAScript 6 or higher. Consider using 'export default' instead." },
Cannot_compile_modules_into_commonjs_amd_system_or_umd_when_targeting_ES6_or_higher: { code: 1204, category: ts.DiagnosticCategory.Error, key: "Cannot compile modules into 'commonjs', 'amd', 'system' or 'umd' when targeting 'ES6' or higher." },
Decorators_are_only_available_when_targeting_ECMAScript_5_and_higher: { code: 1205, category: ts.DiagnosticCategory.Error, key: "Decorators are only available when targeting ECMAScript 5 and higher." },
Decorators_are_not_valid_here: { code: 1206, category: ts.DiagnosticCategory.Error, key: "Decorators are not valid here." },
Decorators_cannot_be_applied_to_multiple_get_Slashset_accessors_of_the_same_name: { code: 1207, category: ts.DiagnosticCategory.Error, key: "Decorators cannot be applied to multiple get/set accessors of the same name." },
Cannot_compile_namespaces_when_the_separateCompilation_flag_is_provided: { code: 1208, category: ts.DiagnosticCategory.Error, key: "Cannot compile namespaces when the '--separateCompilation' flag is provided." },
Ambient_const_enums_are_not_allowed_when_the_separateCompilation_flag_is_provided: { code: 1209, category: ts.DiagnosticCategory.Error, key: "Ambient const enums are not allowed when the '--separateCompilation' flag is provided." },
Invalid_use_of_0_Class_definitions_are_automatically_in_strict_mode: { code: 1210, category: ts.DiagnosticCategory.Error, key: "Invalid use of '{0}'. Class definitions are automatically in strict mode." },
A_class_declaration_without_the_default_modifier_must_have_a_name: { code: 1211, category: ts.DiagnosticCategory.Error, key: "A class declaration without the 'default' modifier must have a name" },
Identifier_expected_0_is_a_reserved_word_in_strict_mode: { code: 1212, category: ts.DiagnosticCategory.Error, key: "Identifier expected. '{0}' is a reserved word in strict mode" },
Identifier_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_strict_mode: { code: 1213, category: ts.DiagnosticCategory.Error, key: "Identifier expected. '{0}' is a reserved word in strict mode. Class definitions are automatically in strict mode." },
Type_expected_0_is_a_reserved_word_in_strict_mode: { code: 1215, category: ts.DiagnosticCategory.Error, key: "Type expected. '{0}' is a reserved word in strict mode" },
Type_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_strict_mode: { code: 1216, category: ts.DiagnosticCategory.Error, key: "Type expected. '{0}' is a reserved word in strict mode. Class definitions are automatically in strict mode." },
Export_assignment_is_not_supported_when_module_flag_is_system: { code: 1218, category: ts.DiagnosticCategory.Error, key: "Export assignment is not supported when '--module' flag is 'system'." },
Duplicate_identifier_0: { code: 2300, category: ts.DiagnosticCategory.Error, key: "Duplicate identifier '{0}'." },
Initializer_of_instance_member_variable_0_cannot_reference_identifier_1_declared_in_the_constructor: { code: 2301, category: ts.DiagnosticCategory.Error, key: "Initializer of instance member variable '{0}' cannot reference identifier '{1}' declared in the constructor." },
Static_members_cannot_reference_class_type_parameters: { code: 2302, category: ts.DiagnosticCategory.Error, key: "Static members cannot reference class type parameters." },
Circular_definition_of_import_alias_0: { code: 2303, category: ts.DiagnosticCategory.Error, key: "Circular definition of import alias '{0}'." },
Cannot_find_name_0: { code: 2304, category: ts.DiagnosticCategory.Error, key: "Cannot find name '{0}'." },
Module_0_has_no_exported_member_1: { code: 2305, category: ts.DiagnosticCategory.Error, key: "Module '{0}' has no exported member '{1}'." },
File_0_is_not_a_module: { code: 2306, category: ts.DiagnosticCategory.Error, key: "File '{0}' is not a module." },
Cannot_find_module_0: { code: 2307, category: ts.DiagnosticCategory.Error, key: "Cannot find module '{0}'." },
A_module_cannot_have_more_than_one_export_assignment: { code: 2308, category: ts.DiagnosticCategory.Error, key: "A module cannot have more than one export assignment." },
An_export_assignment_cannot_be_used_in_a_module_with_other_exported_elements: { code: 2309, category: ts.DiagnosticCategory.Error, key: "An export assignment cannot be used in a module with other exported elements." },
Type_0_recursively_references_itself_as_a_base_type: { code: 2310, category: ts.DiagnosticCategory.Error, key: "Type '{0}' recursively references itself as a base type." },
A_class_may_only_extend_another_class: { code: 2311, category: ts.DiagnosticCategory.Error, key: "A class may only extend another class." },
An_interface_may_only_extend_a_class_or_another_interface: { code: 2312, category: ts.DiagnosticCategory.Error, key: "An interface may only extend a class or another interface." },
Constraint_of_a_type_parameter_cannot_reference_any_type_parameter_from_the_same_type_parameter_list: { code: 2313, category: ts.DiagnosticCategory.Error, key: "Constraint of a type parameter cannot reference any type parameter from the same type parameter list." },
Generic_type_0_requires_1_type_argument_s: { code: 2314, category: ts.DiagnosticCategory.Error, key: "Generic type '{0}' requires {1} type argument(s)." },
Type_0_is_not_generic: { code: 2315, category: ts.DiagnosticCategory.Error, key: "Type '{0}' is not generic." },
Global_type_0_must_be_a_class_or_interface_type: { code: 2316, category: ts.DiagnosticCategory.Error, key: "Global type '{0}' must be a class or interface type." },
Global_type_0_must_have_1_type_parameter_s: { code: 2317, category: ts.DiagnosticCategory.Error, key: "Global type '{0}' must have {1} type parameter(s)." },
Cannot_find_global_type_0: { code: 2318, category: ts.DiagnosticCategory.Error, key: "Cannot find global type '{0}'." },
Named_property_0_of_types_1_and_2_are_not_identical: { code: 2319, category: ts.DiagnosticCategory.Error, key: "Named property '{0}' of types '{1}' and '{2}' are not identical." },
Interface_0_cannot_simultaneously_extend_types_1_and_2: { code: 2320, category: ts.DiagnosticCategory.Error, key: "Interface '{0}' cannot simultaneously extend types '{1}' and '{2}'." },
Excessive_stack_depth_comparing_types_0_and_1: { code: 2321, category: ts.DiagnosticCategory.Error, key: "Excessive stack depth comparing types '{0}' and '{1}'." },
Type_0_is_not_assignable_to_type_1: { code: 2322, category: ts.DiagnosticCategory.Error, key: "Type '{0}' is not assignable to type '{1}'." },
Property_0_is_missing_in_type_1: { code: 2324, category: ts.DiagnosticCategory.Error, key: "Property '{0}' is missing in type '{1}'." },
Property_0_is_private_in_type_1_but_not_in_type_2: { code: 2325, category: ts.DiagnosticCategory.Error, key: "Property '{0}' is private in type '{1}' but not in type '{2}'." },
Types_of_property_0_are_incompatible: { code: 2326, category: ts.DiagnosticCategory.Error, key: "Types of property '{0}' are incompatible." },
Property_0_is_optional_in_type_1_but_required_in_type_2: { code: 2327, category: ts.DiagnosticCategory.Error, key: "Property '{0}' is optional in type '{1}' but required in type '{2}'." },
Types_of_parameters_0_and_1_are_incompatible: { code: 2328, category: ts.DiagnosticCategory.Error, key: "Types of parameters '{0}' and '{1}' are incompatible." },
Index_signature_is_missing_in_type_0: { code: 2329, category: ts.DiagnosticCategory.Error, key: "Index signature is missing in type '{0}'." },
Index_signatures_are_incompatible: { code: 2330, category: ts.DiagnosticCategory.Error, key: "Index signatures are incompatible." },
this_cannot_be_referenced_in_a_module_or_namespace_body: { code: 2331, category: ts.DiagnosticCategory.Error, key: "'this' cannot be referenced in a module or namespace body." },
this_cannot_be_referenced_in_current_location: { code: 2332, category: ts.DiagnosticCategory.Error, key: "'this' cannot be referenced in current location." },
this_cannot_be_referenced_in_constructor_arguments: { code: 2333, category: ts.DiagnosticCategory.Error, key: "'this' cannot be referenced in constructor arguments." },
this_cannot_be_referenced_in_a_static_property_initializer: { code: 2334, category: ts.DiagnosticCategory.Error, key: "'this' cannot be referenced in a static property initializer." },
super_can_only_be_referenced_in_a_derived_class: { code: 2335, category: ts.DiagnosticCategory.Error, key: "'super' can only be referenced in a derived class." },
super_cannot_be_referenced_in_constructor_arguments: { code: 2336, category: ts.DiagnosticCategory.Error, key: "'super' cannot be referenced in constructor arguments." },
Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors: { code: 2337, category: ts.DiagnosticCategory.Error, key: "Super calls are not permitted outside constructors or in nested functions inside constructors" },
super_property_access_is_permitted_only_in_a_constructor_member_function_or_member_accessor_of_a_derived_class: { code: 2338, category: ts.DiagnosticCategory.Error, key: "'super' property access is permitted only in a constructor, member function, or member accessor of a derived class" },
Property_0_does_not_exist_on_type_1: { code: 2339, category: ts.DiagnosticCategory.Error, key: "Property '{0}' does not exist on type '{1}'." },
Only_public_and_protected_methods_of_the_base_class_are_accessible_via_the_super_keyword: { code: 2340, category: ts.DiagnosticCategory.Error, key: "Only public and protected methods of the base class are accessible via the 'super' keyword" },
Property_0_is_private_and_only_accessible_within_class_1: { code: 2341, category: ts.DiagnosticCategory.Error, key: "Property '{0}' is private and only accessible within class '{1}'." },
An_index_expression_argument_must_be_of_type_string_number_symbol_or_any: { code: 2342, category: ts.DiagnosticCategory.Error, key: "An index expression argument must be of type 'string', 'number', 'symbol, or 'any'." },
Type_0_does_not_satisfy_the_constraint_1: { code: 2344, category: ts.DiagnosticCategory.Error, key: "Type '{0}' does not satisfy the constraint '{1}'." },
Argument_of_type_0_is_not_assignable_to_parameter_of_type_1: { code: 2345, category: ts.DiagnosticCategory.Error, key: "Argument of type '{0}' is not assignable to parameter of type '{1}'." },
Supplied_parameters_do_not_match_any_signature_of_call_target: { code: 2346, category: ts.DiagnosticCategory.Error, key: "Supplied parameters do not match any signature of call target." },
Untyped_function_calls_may_not_accept_type_arguments: { code: 2347, category: ts.DiagnosticCategory.Error, key: "Untyped function calls may not accept type arguments." },
Value_of_type_0_is_not_callable_Did_you_mean_to_include_new: { code: 2348, category: ts.DiagnosticCategory.Error, key: "Value of type '{0}' is not callable. Did you mean to include 'new'?" },
Cannot_invoke_an_expression_whose_type_lacks_a_call_signature: { code: 2349, category: ts.DiagnosticCategory.Error, key: "Cannot invoke an expression whose type lacks a call signature." },
Only_a_void_function_can_be_called_with_the_new_keyword: { code: 2350, category: ts.DiagnosticCategory.Error, key: "Only a void function can be called with the 'new' keyword." },
Cannot_use_new_with_an_expression_whose_type_lacks_a_call_or_construct_signature: { code: 2351, category: ts.DiagnosticCategory.Error, key: "Cannot use 'new' with an expression whose type lacks a call or construct signature." },
Neither_type_0_nor_type_1_is_assignable_to_the_other: { code: 2352, category: ts.DiagnosticCategory.Error, key: "Neither type '{0}' nor type '{1}' is assignable to the other." },
No_best_common_type_exists_among_return_expressions: { code: 2354, category: ts.DiagnosticCategory.Error, key: "No best common type exists among return expressions." },
A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value_or_consist_of_a_single_throw_statement: { code: 2355, category: ts.DiagnosticCategory.Error, key: "A function whose declared type is neither 'void' nor 'any' must return a value or consist of a single 'throw' statement." },
An_arithmetic_operand_must_be_of_type_any_number_or_an_enum_type: { code: 2356, category: ts.DiagnosticCategory.Error, key: "An arithmetic operand must be of type 'any', 'number' or an enum type." },
The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_property_or_indexer: { code: 2357, category: ts.DiagnosticCategory.Error, key: "The operand of an increment or decrement operator must be a variable, property or indexer." },
The_left_hand_side_of_an_instanceof_expression_must_be_of_type_any_an_object_type_or_a_type_parameter: { code: 2358, category: ts.DiagnosticCategory.Error, key: "The left-hand side of an 'instanceof' expression must be of type 'any', an object type or a type parameter." },
The_right_hand_side_of_an_instanceof_expression_must_be_of_type_any_or_of_a_type_assignable_to_the_Function_interface_type: { code: 2359, category: ts.DiagnosticCategory.Error, key: "The right-hand side of an 'instanceof' expression must be of type 'any' or of a type assignable to the 'Function' interface type." },
The_left_hand_side_of_an_in_expression_must_be_of_type_any_string_number_or_symbol: { code: 2360, category: ts.DiagnosticCategory.Error, key: "The left-hand side of an 'in' expression must be of type 'any', 'string', 'number', or 'symbol'." },
The_right_hand_side_of_an_in_expression_must_be_of_type_any_an_object_type_or_a_type_parameter: { code: 2361, category: ts.DiagnosticCategory.Error, key: "The right-hand side of an 'in' expression must be of type 'any', an object type or a type parameter" },
The_left_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_or_an_enum_type: { code: 2362, category: ts.DiagnosticCategory.Error, key: "The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type." },
The_right_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_or_an_enum_type: { code: 2363, category: ts.DiagnosticCategory.Error, key: "The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type." },
Invalid_left_hand_side_of_assignment_expression: { code: 2364, category: ts.DiagnosticCategory.Error, key: "Invalid left-hand side of assignment expression." },
Operator_0_cannot_be_applied_to_types_1_and_2: { code: 2365, category: ts.DiagnosticCategory.Error, key: "Operator '{0}' cannot be applied to types '{1}' and '{2}'." },
Type_parameter_name_cannot_be_0: { code: 2368, category: ts.DiagnosticCategory.Error, key: "Type parameter name cannot be '{0}'" },
A_parameter_property_is_only_allowed_in_a_constructor_implementation: { code: 2369, category: ts.DiagnosticCategory.Error, key: "A parameter property is only allowed in a constructor implementation." },
A_rest_parameter_must_be_of_an_array_type: { code: 2370, category: ts.DiagnosticCategory.Error, key: "A rest parameter must be of an array type." },
A_parameter_initializer_is_only_allowed_in_a_function_or_constructor_implementation: { code: 2371, category: ts.DiagnosticCategory.Error, key: "A parameter initializer is only allowed in a function or constructor implementation." },
Parameter_0_cannot_be_referenced_in_its_initializer: { code: 2372, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' cannot be referenced in its initializer." },
Initializer_of_parameter_0_cannot_reference_identifier_1_declared_after_it: { code: 2373, category: ts.DiagnosticCategory.Error, key: "Initializer of parameter '{0}' cannot reference identifier '{1}' declared after it." },
Duplicate_string_index_signature: { code: 2374, category: ts.DiagnosticCategory.Error, key: "Duplicate string index signature." },
Duplicate_number_index_signature: { code: 2375, category: ts.DiagnosticCategory.Error, key: "Duplicate number index signature." },
A_super_call_must_be_the_first_statement_in_the_constructor_when_a_class_contains_initialized_properties_or_has_parameter_properties: { code: 2376, category: ts.DiagnosticCategory.Error, key: "A 'super' call must be the first statement in the constructor when a class contains initialized properties or has parameter properties." },
Constructors_for_derived_classes_must_contain_a_super_call: { code: 2377, category: ts.DiagnosticCategory.Error, key: "Constructors for derived classes must contain a 'super' call." },
A_get_accessor_must_return_a_value_or_consist_of_a_single_throw_statement: { code: 2378, category: ts.DiagnosticCategory.Error, key: "A 'get' accessor must return a value or consist of a single 'throw' statement." },
Getter_and_setter_accessors_do_not_agree_in_visibility: { code: 2379, category: ts.DiagnosticCategory.Error, key: "Getter and setter accessors do not agree in visibility." },
get_and_set_accessor_must_have_the_same_type: { code: 2380, category: ts.DiagnosticCategory.Error, key: "'get' and 'set' accessor must have the same type." },
A_signature_with_an_implementation_cannot_use_a_string_literal_type: { code: 2381, category: ts.DiagnosticCategory.Error, key: "A signature with an implementation cannot use a string literal type." },
Specialized_overload_signature_is_not_assignable_to_any_non_specialized_signature: { code: 2382, category: ts.DiagnosticCategory.Error, key: "Specialized overload signature is not assignable to any non-specialized signature." },
Overload_signatures_must_all_be_exported_or_not_exported: { code: 2383, category: ts.DiagnosticCategory.Error, key: "Overload signatures must all be exported or not exported." },
Overload_signatures_must_all_be_ambient_or_non_ambient: { code: 2384, category: ts.DiagnosticCategory.Error, key: "Overload signatures must all be ambient or non-ambient." },
Overload_signatures_must_all_be_public_private_or_protected: { code: 2385, category: ts.DiagnosticCategory.Error, key: "Overload signatures must all be public, private or protected." },
Overload_signatures_must_all_be_optional_or_required: { code: 2386, category: ts.DiagnosticCategory.Error, key: "Overload signatures must all be optional or required." },
Function_overload_must_be_static: { code: 2387, category: ts.DiagnosticCategory.Error, key: "Function overload must be static." },
Function_overload_must_not_be_static: { code: 2388, category: ts.DiagnosticCategory.Error, key: "Function overload must not be static." },
Function_implementation_name_must_be_0: { code: 2389, category: ts.DiagnosticCategory.Error, key: "Function implementation name must be '{0}'." },
Constructor_implementation_is_missing: { code: 2390, category: ts.DiagnosticCategory.Error, key: "Constructor implementation is missing." },
Function_implementation_is_missing_or_not_immediately_following_the_declaration: { code: 2391, category: ts.DiagnosticCategory.Error, key: "Function implementation is missing or not immediately following the declaration." },
Multiple_constructor_implementations_are_not_allowed: { code: 2392, category: ts.DiagnosticCategory.Error, key: "Multiple constructor implementations are not allowed." },
Duplicate_function_implementation: { code: 2393, category: ts.DiagnosticCategory.Error, key: "Duplicate function implementation." },
Overload_signature_is_not_compatible_with_function_implementation: { code: 2394, category: ts.DiagnosticCategory.Error, key: "Overload signature is not compatible with function implementation." },
Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local: { code: 2395, category: ts.DiagnosticCategory.Error, key: "Individual declarations in merged declaration {0} must be all exported or all local." },
Duplicate_identifier_arguments_Compiler_uses_arguments_to_initialize_rest_parameters: { code: 2396, category: ts.DiagnosticCategory.Error, key: "Duplicate identifier 'arguments'. Compiler uses 'arguments' to initialize rest parameters." },
Duplicate_identifier_this_Compiler_uses_variable_declaration_this_to_capture_this_reference: { code: 2399, category: ts.DiagnosticCategory.Error, key: "Duplicate identifier '_this'. Compiler uses variable declaration '_this' to capture 'this' reference." },
Expression_resolves_to_variable_declaration_this_that_compiler_uses_to_capture_this_reference: { code: 2400, category: ts.DiagnosticCategory.Error, key: "Expression resolves to variable declaration '_this' that compiler uses to capture 'this' reference." },
Duplicate_identifier_super_Compiler_uses_super_to_capture_base_class_reference: { code: 2401, category: ts.DiagnosticCategory.Error, key: "Duplicate identifier '_super'. Compiler uses '_super' to capture base class reference." },
Expression_resolves_to_super_that_compiler_uses_to_capture_base_class_reference: { code: 2402, category: ts.DiagnosticCategory.Error, key: "Expression resolves to '_super' that compiler uses to capture base class reference." },
Subsequent_variable_declarations_must_have_the_same_type_Variable_0_must_be_of_type_1_but_here_has_type_2: { code: 2403, category: ts.DiagnosticCategory.Error, key: "Subsequent variable declarations must have the same type. Variable '{0}' must be of type '{1}', but here has type '{2}'." },
The_left_hand_side_of_a_for_in_statement_cannot_use_a_type_annotation: { code: 2404, category: ts.DiagnosticCategory.Error, key: "The left-hand side of a 'for...in' statement cannot use a type annotation." },
The_left_hand_side_of_a_for_in_statement_must_be_of_type_string_or_any: { code: 2405, category: ts.DiagnosticCategory.Error, key: "The left-hand side of a 'for...in' statement must be of type 'string' or 'any'." },
Invalid_left_hand_side_in_for_in_statement: { code: 2406, category: ts.DiagnosticCategory.Error, key: "Invalid left-hand side in 'for...in' statement." },
The_right_hand_side_of_a_for_in_statement_must_be_of_type_any_an_object_type_or_a_type_parameter: { code: 2407, category: ts.DiagnosticCategory.Error, key: "The right-hand side of a 'for...in' statement must be of type 'any', an object type or a type parameter." },
Setters_cannot_return_a_value: { code: 2408, category: ts.DiagnosticCategory.Error, key: "Setters cannot return a value." },
Return_type_of_constructor_signature_must_be_assignable_to_the_instance_type_of_the_class: { code: 2409, category: ts.DiagnosticCategory.Error, key: "Return type of constructor signature must be assignable to the instance type of the class" },
All_symbols_within_a_with_block_will_be_resolved_to_any: { code: 2410, category: ts.DiagnosticCategory.Error, key: "All symbols within a 'with' block will be resolved to 'any'." },
Property_0_of_type_1_is_not_assignable_to_string_index_type_2: { code: 2411, category: ts.DiagnosticCategory.Error, key: "Property '{0}' of type '{1}' is not assignable to string index type '{2}'." },
Property_0_of_type_1_is_not_assignable_to_numeric_index_type_2: { code: 2412, category: ts.DiagnosticCategory.Error, key: "Property '{0}' of type '{1}' is not assignable to numeric index type '{2}'." },
Numeric_index_type_0_is_not_assignable_to_string_index_type_1: { code: 2413, category: ts.DiagnosticCategory.Error, key: "Numeric index type '{0}' is not assignable to string index type '{1}'." },
Class_name_cannot_be_0: { code: 2414, category: ts.DiagnosticCategory.Error, key: "Class name cannot be '{0}'" },
Class_0_incorrectly_extends_base_class_1: { code: 2415, category: ts.DiagnosticCategory.Error, key: "Class '{0}' incorrectly extends base class '{1}'." },
Class_static_side_0_incorrectly_extends_base_class_static_side_1: { code: 2417, category: ts.DiagnosticCategory.Error, key: "Class static side '{0}' incorrectly extends base class static side '{1}'." },
Type_name_0_in_extends_clause_does_not_reference_constructor_function_for_0: { code: 2419, category: ts.DiagnosticCategory.Error, key: "Type name '{0}' in extends clause does not reference constructor function for '{0}'." },
Class_0_incorrectly_implements_interface_1: { code: 2420, category: ts.DiagnosticCategory.Error, key: "Class '{0}' incorrectly implements interface '{1}'." },
A_class_may_only_implement_another_class_or_interface: { code: 2422, category: ts.DiagnosticCategory.Error, key: "A class may only implement another class or interface." },
Class_0_defines_instance_member_function_1_but_extended_class_2_defines_it_as_instance_member_accessor: { code: 2423, category: ts.DiagnosticCategory.Error, key: "Class '{0}' defines instance member function '{1}', but extended class '{2}' defines it as instance member accessor." },
Class_0_defines_instance_member_function_1_but_extended_class_2_defines_it_as_instance_member_property: { code: 2424, category: ts.DiagnosticCategory.Error, key: "Class '{0}' defines instance member function '{1}', but extended class '{2}' defines it as instance member property." },
Class_0_defines_instance_member_property_1_but_extended_class_2_defines_it_as_instance_member_function: { code: 2425, category: ts.DiagnosticCategory.Error, key: "Class '{0}' defines instance member property '{1}', but extended class '{2}' defines it as instance member function." },
Class_0_defines_instance_member_accessor_1_but_extended_class_2_defines_it_as_instance_member_function: { code: 2426, category: ts.DiagnosticCategory.Error, key: "Class '{0}' defines instance member accessor '{1}', but extended class '{2}' defines it as instance member function." },
Interface_name_cannot_be_0: { code: 2427, category: ts.DiagnosticCategory.Error, key: "Interface name cannot be '{0}'" },
All_declarations_of_an_interface_must_have_identical_type_parameters: { code: 2428, category: ts.DiagnosticCategory.Error, key: "All declarations of an interface must have identical type parameters." },
Interface_0_incorrectly_extends_interface_1: { code: 2430, category: ts.DiagnosticCategory.Error, key: "Interface '{0}' incorrectly extends interface '{1}'." },
Enum_name_cannot_be_0: { code: 2431, category: ts.DiagnosticCategory.Error, key: "Enum name cannot be '{0}'" },
In_an_enum_with_multiple_declarations_only_one_declaration_can_omit_an_initializer_for_its_first_enum_element: { code: 2432, category: ts.DiagnosticCategory.Error, key: "In an enum with multiple declarations, only one declaration can omit an initializer for its first enum element." },
A_namespace_declaration_cannot_be_in_a_different_file_from_a_class_or_function_with_which_it_is_merged: { code: 2433, category: ts.DiagnosticCategory.Error, key: "A namespace declaration cannot be in a different file from a class or function with which it is merged" },
A_namespace_declaration_cannot_be_located_prior_to_a_class_or_function_with_which_it_is_merged: { code: 2434, category: ts.DiagnosticCategory.Error, key: "A namespace declaration cannot be located prior to a class or function with which it is merged" },
Ambient_modules_cannot_be_nested_in_other_modules: { code: 2435, category: ts.DiagnosticCategory.Error, key: "Ambient modules cannot be nested in other modules." },
Ambient_module_declaration_cannot_specify_relative_module_name: { code: 2436, category: ts.DiagnosticCategory.Error, key: "Ambient module declaration cannot specify relative module name." },
Module_0_is_hidden_by_a_local_declaration_with_the_same_name: { code: 2437, category: ts.DiagnosticCategory.Error, key: "Module '{0}' is hidden by a local declaration with the same name" },
Import_name_cannot_be_0: { code: 2438, category: ts.DiagnosticCategory.Error, key: "Import name cannot be '{0}'" },
Import_or_export_declaration_in_an_ambient_module_declaration_cannot_reference_module_through_relative_module_name: { code: 2439, category: ts.DiagnosticCategory.Error, key: "Import or export declaration in an ambient module declaration cannot reference module through relative module name." },
Import_declaration_conflicts_with_local_declaration_of_0: { code: 2440, category: ts.DiagnosticCategory.Error, key: "Import declaration conflicts with local declaration of '{0}'" },
Duplicate_identifier_0_Compiler_reserves_name_1_in_top_level_scope_of_a_module: { code: 2441, category: ts.DiagnosticCategory.Error, key: "Duplicate identifier '{0}'. Compiler reserves name '{1}' in top level scope of a module." },
Types_have_separate_declarations_of_a_private_property_0: { code: 2442, category: ts.DiagnosticCategory.Error, key: "Types have separate declarations of a private property '{0}'." },
Property_0_is_protected_but_type_1_is_not_a_class_derived_from_2: { code: 2443, category: ts.DiagnosticCategory.Error, key: "Property '{0}' is protected but type '{1}' is not a class derived from '{2}'." },
Property_0_is_protected_in_type_1_but_public_in_type_2: { code: 2444, category: ts.DiagnosticCategory.Error, key: "Property '{0}' is protected in type '{1}' but public in type '{2}'." },
Property_0_is_protected_and_only_accessible_within_class_1_and_its_subclasses: { code: 2445, category: ts.DiagnosticCategory.Error, key: "Property '{0}' is protected and only accessible within class '{1}' and its subclasses." },
Property_0_is_protected_and_only_accessible_through_an_instance_of_class_1: { code: 2446, category: ts.DiagnosticCategory.Error, key: "Property '{0}' is protected and only accessible through an instance of class '{1}'." },
The_0_operator_is_not_allowed_for_boolean_types_Consider_using_1_instead: { code: 2447, category: ts.DiagnosticCategory.Error, key: "The '{0}' operator is not allowed for boolean types. Consider using '{1}' instead." },
Block_scoped_variable_0_used_before_its_declaration: { code: 2448, category: ts.DiagnosticCategory.Error, key: "Block-scoped variable '{0}' used before its declaration." },
The_operand_of_an_increment_or_decrement_operator_cannot_be_a_constant: { code: 2449, category: ts.DiagnosticCategory.Error, key: "The operand of an increment or decrement operator cannot be a constant." },
Left_hand_side_of_assignment_expression_cannot_be_a_constant: { code: 2450, category: ts.DiagnosticCategory.Error, key: "Left-hand side of assignment expression cannot be a constant." },
Cannot_redeclare_block_scoped_variable_0: { code: 2451, category: ts.DiagnosticCategory.Error, key: "Cannot redeclare block-scoped variable '{0}'." },
An_enum_member_cannot_have_a_numeric_name: { code: 2452, category: ts.DiagnosticCategory.Error, key: "An enum member cannot have a numeric name." },
The_type_argument_for_type_parameter_0_cannot_be_inferred_from_the_usage_Consider_specifying_the_type_arguments_explicitly: { code: 2453, category: ts.DiagnosticCategory.Error, key: "The type argument for type parameter '{0}' cannot be inferred from the usage. Consider specifying the type arguments explicitly." },
Type_argument_candidate_1_is_not_a_valid_type_argument_because_it_is_not_a_supertype_of_candidate_0: { code: 2455, category: ts.DiagnosticCategory.Error, key: "Type argument candidate '{1}' is not a valid type argument because it is not a supertype of candidate '{0}'." },
Type_alias_0_circularly_references_itself: { code: 2456, category: ts.DiagnosticCategory.Error, key: "Type alias '{0}' circularly references itself." },
Type_alias_name_cannot_be_0: { code: 2457, category: ts.DiagnosticCategory.Error, key: "Type alias name cannot be '{0}'" },
An_AMD_module_cannot_have_multiple_name_assignments: { code: 2458, category: ts.DiagnosticCategory.Error, key: "An AMD module cannot have multiple name assignments." },
Type_0_has_no_property_1_and_no_string_index_signature: { code: 2459, category: ts.DiagnosticCategory.Error, key: "Type '{0}' has no property '{1}' and no string index signature." },
Type_0_has_no_property_1: { code: 2460, category: ts.DiagnosticCategory.Error, key: "Type '{0}' has no property '{1}'." },
Type_0_is_not_an_array_type: { code: 2461, category: ts.DiagnosticCategory.Error, key: "Type '{0}' is not an array type." },
A_rest_element_must_be_last_in_an_array_destructuring_pattern: { code: 2462, category: ts.DiagnosticCategory.Error, key: "A rest element must be last in an array destructuring pattern" },
A_binding_pattern_parameter_cannot_be_optional_in_an_implementation_signature: { code: 2463, category: ts.DiagnosticCategory.Error, key: "A binding pattern parameter cannot be optional in an implementation signature." },
A_computed_property_name_must_be_of_type_string_number_symbol_or_any: { code: 2464, category: ts.DiagnosticCategory.Error, key: "A computed property name must be of type 'string', 'number', 'symbol', or 'any'." },
this_cannot_be_referenced_in_a_computed_property_name: { code: 2465, category: ts.DiagnosticCategory.Error, key: "'this' cannot be referenced in a computed property name." },
super_cannot_be_referenced_in_a_computed_property_name: { code: 2466, category: ts.DiagnosticCategory.Error, key: "'super' cannot be referenced in a computed property name." },
A_computed_property_name_cannot_reference_a_type_parameter_from_its_containing_type: { code: 2467, category: ts.DiagnosticCategory.Error, key: "A computed property name cannot reference a type parameter from its containing type." },
Cannot_find_global_value_0: { code: 2468, category: ts.DiagnosticCategory.Error, key: "Cannot find global value '{0}'." },
The_0_operator_cannot_be_applied_to_type_symbol: { code: 2469, category: ts.DiagnosticCategory.Error, key: "The '{0}' operator cannot be applied to type 'symbol'." },
Symbol_reference_does_not_refer_to_the_global_Symbol_constructor_object: { code: 2470, category: ts.DiagnosticCategory.Error, key: "'Symbol' reference does not refer to the global Symbol constructor object." },
A_computed_property_name_of_the_form_0_must_be_of_type_symbol: { code: 2471, category: ts.DiagnosticCategory.Error, key: "A computed property name of the form '{0}' must be of type 'symbol'." },
Spread_operator_in_new_expressions_is_only_available_when_targeting_ECMAScript_6_and_higher: { code: 2472, category: ts.DiagnosticCategory.Error, key: "Spread operator in 'new' expressions is only available when targeting ECMAScript 6 and higher." },
Enum_declarations_must_all_be_const_or_non_const: { code: 2473, category: ts.DiagnosticCategory.Error, key: "Enum declarations must all be const or non-const." },
In_const_enum_declarations_member_initializer_must_be_constant_expression: { code: 2474, category: ts.DiagnosticCategory.Error, key: "In 'const' enum declarations member initializer must be constant expression." },
const_enums_can_only_be_used_in_property_or_index_access_expressions_or_the_right_hand_side_of_an_import_declaration_or_export_assignment: { code: 2475, category: ts.DiagnosticCategory.Error, key: "'const' enums can only be used in property or index access expressions or the right hand side of an import declaration or export assignment." },
A_const_enum_member_can_only_be_accessed_using_a_string_literal: { code: 2476, category: ts.DiagnosticCategory.Error, key: "A const enum member can only be accessed using a string literal." },
const_enum_member_initializer_was_evaluated_to_a_non_finite_value: { code: 2477, category: ts.DiagnosticCategory.Error, key: "'const' enum member initializer was evaluated to a non-finite value." },
const_enum_member_initializer_was_evaluated_to_disallowed_value_NaN: { code: 2478, category: ts.DiagnosticCategory.Error, key: "'const' enum member initializer was evaluated to disallowed value 'NaN'." },
Property_0_does_not_exist_on_const_enum_1: { code: 2479, category: ts.DiagnosticCategory.Error, key: "Property '{0}' does not exist on 'const' enum '{1}'." },
let_is_not_allowed_to_be_used_as_a_name_in_let_or_const_declarations: { code: 2480, category: ts.DiagnosticCategory.Error, key: "'let' is not allowed to be used as a name in 'let' or 'const' declarations." },
Cannot_initialize_outer_scoped_variable_0_in_the_same_scope_as_block_scoped_declaration_1: { code: 2481, category: ts.DiagnosticCategory.Error, key: "Cannot initialize outer scoped variable '{0}' in the same scope as block scoped declaration '{1}'." },
The_left_hand_side_of_a_for_of_statement_cannot_use_a_type_annotation: { code: 2483, category: ts.DiagnosticCategory.Error, key: "The left-hand side of a 'for...of' statement cannot use a type annotation." },
Export_declaration_conflicts_with_exported_declaration_of_0: { code: 2484, category: ts.DiagnosticCategory.Error, key: "Export declaration conflicts with exported declaration of '{0}'" },
The_left_hand_side_of_a_for_of_statement_cannot_be_a_previously_defined_constant: { code: 2485, category: ts.DiagnosticCategory.Error, key: "The left-hand side of a 'for...of' statement cannot be a previously defined constant." },
The_left_hand_side_of_a_for_in_statement_cannot_be_a_previously_defined_constant: { code: 2486, category: ts.DiagnosticCategory.Error, key: "The left-hand side of a 'for...in' statement cannot be a previously defined constant." },
Invalid_left_hand_side_in_for_of_statement: { code: 2487, category: ts.DiagnosticCategory.Error, key: "Invalid left-hand side in 'for...of' statement." },
Type_must_have_a_Symbol_iterator_method_that_returns_an_iterator: { code: 2488, category: ts.DiagnosticCategory.Error, key: "Type must have a '[Symbol.iterator]()' method that returns an iterator." },
An_iterator_must_have_a_next_method: { code: 2489, category: ts.DiagnosticCategory.Error, key: "An iterator must have a 'next()' method." },
The_type_returned_by_the_next_method_of_an_iterator_must_have_a_value_property: { code: 2490, category: ts.DiagnosticCategory.Error, key: "The type returned by the 'next()' method of an iterator must have a 'value' property." },
The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern: { code: 2491, category: ts.DiagnosticCategory.Error, key: "The left-hand side of a 'for...in' statement cannot be a destructuring pattern." },
Cannot_redeclare_identifier_0_in_catch_clause: { code: 2492, category: ts.DiagnosticCategory.Error, key: "Cannot redeclare identifier '{0}' in catch clause" },
Tuple_type_0_with_length_1_cannot_be_assigned_to_tuple_with_length_2: { code: 2493, category: ts.DiagnosticCategory.Error, key: "Tuple type '{0}' with length '{1}' cannot be assigned to tuple with length '{2}'." },
Using_a_string_in_a_for_of_statement_is_only_supported_in_ECMAScript_5_and_higher: { code: 2494, category: ts.DiagnosticCategory.Error, key: "Using a string in a 'for...of' statement is only supported in ECMAScript 5 and higher." },
Type_0_is_not_an_array_type_or_a_string_type: { code: 2495, category: ts.DiagnosticCategory.Error, key: "Type '{0}' is not an array type or a string type." },
The_arguments_object_cannot_be_referenced_in_an_arrow_function_in_ES3_and_ES5_Consider_using_a_standard_function_expression: { code: 2496, category: ts.DiagnosticCategory.Error, key: "The 'arguments' object cannot be referenced in an arrow function in ES3 and ES5. Consider using a standard function expression." },
Module_0_resolves_to_a_non_module_entity_and_cannot_be_imported_using_this_construct: { code: 2497, category: ts.DiagnosticCategory.Error, key: "Module '{0}' resolves to a non-module entity and cannot be imported using this construct." },
Module_0_uses_export_and_cannot_be_used_with_export_Asterisk: { code: 2498, category: ts.DiagnosticCategory.Error, key: "Module '{0}' uses 'export =' and cannot be used with 'export *'." },
An_interface_can_only_extend_an_identifier_Slashqualified_name_with_optional_type_arguments: { code: 2499, category: ts.DiagnosticCategory.Error, key: "An interface can only extend an identifier/qualified-name with optional type arguments." },
A_class_can_only_implement_an_identifier_Slashqualified_name_with_optional_type_arguments: { code: 2500, category: ts.DiagnosticCategory.Error, key: "A class can only implement an identifier/qualified-name with optional type arguments." },
A_rest_element_cannot_contain_a_binding_pattern: { code: 2501, category: ts.DiagnosticCategory.Error, key: "A rest element cannot contain a binding pattern." },
_0_is_referenced_directly_or_indirectly_in_its_own_type_annotation: { code: 2502, category: ts.DiagnosticCategory.Error, key: "'{0}' is referenced directly or indirectly in its own type annotation." },
Cannot_find_namespace_0: { code: 2503, category: ts.DiagnosticCategory.Error, key: "Cannot find namespace '{0}'." },
Import_declaration_0_is_using_private_name_1: { code: 4000, category: ts.DiagnosticCategory.Error, key: "Import declaration '{0}' is using private name '{1}'." },
Type_parameter_0_of_exported_class_has_or_is_using_private_name_1: { code: 4002, category: ts.DiagnosticCategory.Error, key: "Type parameter '{0}' of exported class has or is using private name '{1}'." },
Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1: { code: 4004, category: ts.DiagnosticCategory.Error, key: "Type parameter '{0}' of exported interface has or is using private name '{1}'." },
Type_parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1: { code: 4006, category: ts.DiagnosticCategory.Error, key: "Type parameter '{0}' of constructor signature from exported interface has or is using private name '{1}'." },
Type_parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1: { code: 4008, category: ts.DiagnosticCategory.Error, key: "Type parameter '{0}' of call signature from exported interface has or is using private name '{1}'." },
Type_parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1: { code: 4010, category: ts.DiagnosticCategory.Error, key: "Type parameter '{0}' of public static method from exported class has or is using private name '{1}'." },
Type_parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1: { code: 4012, category: ts.DiagnosticCategory.Error, key: "Type parameter '{0}' of public method from exported class has or is using private name '{1}'." },
Type_parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1: { code: 4014, category: ts.DiagnosticCategory.Error, key: "Type parameter '{0}' of method from exported interface has or is using private name '{1}'." },
Type_parameter_0_of_exported_function_has_or_is_using_private_name_1: { code: 4016, category: ts.DiagnosticCategory.Error, key: "Type parameter '{0}' of exported function has or is using private name '{1}'." },
Implements_clause_of_exported_class_0_has_or_is_using_private_name_1: { code: 4019, category: ts.DiagnosticCategory.Error, key: "Implements clause of exported class '{0}' has or is using private name '{1}'." },
Extends_clause_of_exported_class_0_has_or_is_using_private_name_1: { code: 4020, category: ts.DiagnosticCategory.Error, key: "Extends clause of exported class '{0}' has or is using private name '{1}'." },
Extends_clause_of_exported_interface_0_has_or_is_using_private_name_1: { code: 4022, category: ts.DiagnosticCategory.Error, key: "Extends clause of exported interface '{0}' has or is using private name '{1}'." },
Exported_variable_0_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: { code: 4023, category: ts.DiagnosticCategory.Error, key: "Exported variable '{0}' has or is using name '{1}' from external module {2} but cannot be named." },
Exported_variable_0_has_or_is_using_name_1_from_private_module_2: { code: 4024, category: ts.DiagnosticCategory.Error, key: "Exported variable '{0}' has or is using name '{1}' from private module '{2}'." },
Exported_variable_0_has_or_is_using_private_name_1: { code: 4025, category: ts.DiagnosticCategory.Error, key: "Exported variable '{0}' has or is using private name '{1}'." },
Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: { code: 4026, category: ts.DiagnosticCategory.Error, key: "Public static property '{0}' of exported class has or is using name '{1}' from external module {2} but cannot be named." },
Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4027, category: ts.DiagnosticCategory.Error, key: "Public static property '{0}' of exported class has or is using name '{1}' from private module '{2}'." },
Public_static_property_0_of_exported_class_has_or_is_using_private_name_1: { code: 4028, category: ts.DiagnosticCategory.Error, key: "Public static property '{0}' of exported class has or is using private name '{1}'." },
Public_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: { code: 4029, category: ts.DiagnosticCategory.Error, key: "Public property '{0}' of exported class has or is using name '{1}' from external module {2} but cannot be named." },
Public_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4030, category: ts.DiagnosticCategory.Error, key: "Public property '{0}' of exported class has or is using name '{1}' from private module '{2}'." },
Public_property_0_of_exported_class_has_or_is_using_private_name_1: { code: 4031, category: ts.DiagnosticCategory.Error, key: "Public property '{0}' of exported class has or is using private name '{1}'." },
Property_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2: { code: 4032, category: ts.DiagnosticCategory.Error, key: "Property '{0}' of exported interface has or is using name '{1}' from private module '{2}'." },
Property_0_of_exported_interface_has_or_is_using_private_name_1: { code: 4033, category: ts.DiagnosticCategory.Error, key: "Property '{0}' of exported interface has or is using private name '{1}'." },
Parameter_0_of_public_static_property_setter_from_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4034, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public static property setter from exported class has or is using name '{1}' from private module '{2}'." },
Parameter_0_of_public_static_property_setter_from_exported_class_has_or_is_using_private_name_1: { code: 4035, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public static property setter from exported class has or is using private name '{1}'." },
Parameter_0_of_public_property_setter_from_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4036, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public property setter from exported class has or is using name '{1}' from private module '{2}'." },
Parameter_0_of_public_property_setter_from_exported_class_has_or_is_using_private_name_1: { code: 4037, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public property setter from exported class has or is using private name '{1}'." },
Return_type_of_public_static_property_getter_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named: { code: 4038, category: ts.DiagnosticCategory.Error, key: "Return type of public static property getter from exported class has or is using name '{0}' from external module {1} but cannot be named." },
Return_type_of_public_static_property_getter_from_exported_class_has_or_is_using_name_0_from_private_module_1: { code: 4039, category: ts.DiagnosticCategory.Error, key: "Return type of public static property getter from exported class has or is using name '{0}' from private module '{1}'." },
Return_type_of_public_static_property_getter_from_exported_class_has_or_is_using_private_name_0: { code: 4040, category: ts.DiagnosticCategory.Error, key: "Return type of public static property getter from exported class has or is using private name '{0}'." },
Return_type_of_public_property_getter_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named: { code: 4041, category: ts.DiagnosticCategory.Error, key: "Return type of public property getter from exported class has or is using name '{0}' from external module {1} but cannot be named." },
Return_type_of_public_property_getter_from_exported_class_has_or_is_using_name_0_from_private_module_1: { code: 4042, category: ts.DiagnosticCategory.Error, key: "Return type of public property getter from exported class has or is using name '{0}' from private module '{1}'." },
Return_type_of_public_property_getter_from_exported_class_has_or_is_using_private_name_0: { code: 4043, category: ts.DiagnosticCategory.Error, key: "Return type of public property getter from exported class has or is using private name '{0}'." },
Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1: { code: 4044, category: ts.DiagnosticCategory.Error, key: "Return type of constructor signature from exported interface has or is using name '{0}' from private module '{1}'." },
Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_0: { code: 4045, category: ts.DiagnosticCategory.Error, key: "Return type of constructor signature from exported interface has or is using private name '{0}'." },
Return_type_of_call_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1: { code: 4046, category: ts.DiagnosticCategory.Error, key: "Return type of call signature from exported interface has or is using name '{0}' from private module '{1}'." },
Return_type_of_call_signature_from_exported_interface_has_or_is_using_private_name_0: { code: 4047, category: ts.DiagnosticCategory.Error, key: "Return type of call signature from exported interface has or is using private name '{0}'." },
Return_type_of_index_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1: { code: 4048, category: ts.DiagnosticCategory.Error, key: "Return type of index signature from exported interface has or is using name '{0}' from private module '{1}'." },
Return_type_of_index_signature_from_exported_interface_has_or_is_using_private_name_0: { code: 4049, category: ts.DiagnosticCategory.Error, key: "Return type of index signature from exported interface has or is using private name '{0}'." },
Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named: { code: 4050, category: ts.DiagnosticCategory.Error, key: "Return type of public static method from exported class has or is using name '{0}' from external module {1} but cannot be named." },
Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_private_module_1: { code: 4051, category: ts.DiagnosticCategory.Error, key: "Return type of public static method from exported class has or is using name '{0}' from private module '{1}'." },
Return_type_of_public_static_method_from_exported_class_has_or_is_using_private_name_0: { code: 4052, category: ts.DiagnosticCategory.Error, key: "Return type of public static method from exported class has or is using private name '{0}'." },
Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named: { code: 4053, category: ts.DiagnosticCategory.Error, key: "Return type of public method from exported class has or is using name '{0}' from external module {1} but cannot be named." },
Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_private_module_1: { code: 4054, category: ts.DiagnosticCategory.Error, key: "Return type of public method from exported class has or is using name '{0}' from private module '{1}'." },
Return_type_of_public_method_from_exported_class_has_or_is_using_private_name_0: { code: 4055, category: ts.DiagnosticCategory.Error, key: "Return type of public method from exported class has or is using private name '{0}'." },
Return_type_of_method_from_exported_interface_has_or_is_using_name_0_from_private_module_1: { code: 4056, category: ts.DiagnosticCategory.Error, key: "Return type of method from exported interface has or is using name '{0}' from private module '{1}'." },
Return_type_of_method_from_exported_interface_has_or_is_using_private_name_0: { code: 4057, category: ts.DiagnosticCategory.Error, key: "Return type of method from exported interface has or is using private name '{0}'." },
Return_type_of_exported_function_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named: { code: 4058, category: ts.DiagnosticCategory.Error, key: "Return type of exported function has or is using name '{0}' from external module {1} but cannot be named." },
Return_type_of_exported_function_has_or_is_using_name_0_from_private_module_1: { code: 4059, category: ts.DiagnosticCategory.Error, key: "Return type of exported function has or is using name '{0}' from private module '{1}'." },
Return_type_of_exported_function_has_or_is_using_private_name_0: { code: 4060, category: ts.DiagnosticCategory.Error, key: "Return type of exported function has or is using private name '{0}'." },
Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: { code: 4061, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of constructor from exported class has or is using name '{1}' from external module {2} but cannot be named." },
Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4062, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of constructor from exported class has or is using name '{1}' from private module '{2}'." },
Parameter_0_of_constructor_from_exported_class_has_or_is_using_private_name_1: { code: 4063, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of constructor from exported class has or is using private name '{1}'." },
Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2: { code: 4064, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of constructor signature from exported interface has or is using name '{1}' from private module '{2}'." },
Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1: { code: 4065, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of constructor signature from exported interface has or is using private name '{1}'." },
Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2: { code: 4066, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of call signature from exported interface has or is using name '{1}' from private module '{2}'." },
Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1: { code: 4067, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of call signature from exported interface has or is using private name '{1}'." },
Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: { code: 4068, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public static method from exported class has or is using name '{1}' from external module {2} but cannot be named." },
Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4069, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public static method from exported class has or is using name '{1}' from private module '{2}'." },
Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1: { code: 4070, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public static method from exported class has or is using private name '{1}'." },
Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: { code: 4071, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public method from exported class has or is using name '{1}' from external module {2} but cannot be named." },
Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4072, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public method from exported class has or is using name '{1}' from private module '{2}'." },
Parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1: { code: 4073, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public method from exported class has or is using private name '{1}'." },
Parameter_0_of_method_from_exported_interface_has_or_is_using_name_1_from_private_module_2: { code: 4074, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of method from exported interface has or is using name '{1}' from private module '{2}'." },
Parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1: { code: 4075, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of method from exported interface has or is using private name '{1}'." },
Parameter_0_of_exported_function_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: { code: 4076, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of exported function has or is using name '{1}' from external module {2} but cannot be named." },
Parameter_0_of_exported_function_has_or_is_using_name_1_from_private_module_2: { code: 4077, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of exported function has or is using name '{1}' from private module '{2}'." },
Parameter_0_of_exported_function_has_or_is_using_private_name_1: { code: 4078, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of exported function has or is using private name '{1}'." },
Exported_type_alias_0_has_or_is_using_private_name_1: { code: 4081, category: ts.DiagnosticCategory.Error, key: "Exported type alias '{0}' has or is using private name '{1}'." },
Default_export_of_the_module_has_or_is_using_private_name_0: { code: 4082, category: ts.DiagnosticCategory.Error, key: "Default export of the module has or is using private name '{0}'." },
Loop_contains_block_scoped_variable_0_referenced_by_a_function_in_the_loop_This_is_only_supported_in_ECMAScript_6_or_higher: { code: 4091, category: ts.DiagnosticCategory.Error, key: "Loop contains block-scoped variable '{0}' referenced by a function in the loop. This is only supported in ECMAScript 6 or higher." },
The_current_host_does_not_support_the_0_option: { code: 5001, category: ts.DiagnosticCategory.Error, key: "The current host does not support the '{0}' option." },
Cannot_find_the_common_subdirectory_path_for_the_input_files: { code: 5009, category: ts.DiagnosticCategory.Error, key: "Cannot find the common subdirectory path for the input files." },
Cannot_read_file_0_Colon_1: { code: 5012, category: ts.DiagnosticCategory.Error, key: "Cannot read file '{0}': {1}" },
Unsupported_file_encoding: { code: 5013, category: ts.DiagnosticCategory.Error, key: "Unsupported file encoding." },
Failed_to_parse_file_0_Colon_1: { code: 5014, category: ts.DiagnosticCategory.Error, key: "Failed to parse file '{0}': {1}." },
Unknown_compiler_option_0: { code: 5023, category: ts.DiagnosticCategory.Error, key: "Unknown compiler option '{0}'." },
Compiler_option_0_requires_a_value_of_type_1: { code: 5024, category: ts.DiagnosticCategory.Error, key: "Compiler option '{0}' requires a value of type {1}." },
Could_not_write_file_0_Colon_1: { code: 5033, category: ts.DiagnosticCategory.Error, key: "Could not write file '{0}': {1}" },
Option_mapRoot_cannot_be_specified_without_specifying_sourceMap_option: { code: 5038, category: ts.DiagnosticCategory.Error, key: "Option 'mapRoot' cannot be specified without specifying 'sourceMap' option." },
Option_sourceRoot_cannot_be_specified_without_specifying_sourceMap_option: { code: 5039, category: ts.DiagnosticCategory.Error, key: "Option 'sourceRoot' cannot be specified without specifying 'sourceMap' option." },
Option_noEmit_cannot_be_specified_with_option_out_or_outDir: { code: 5040, category: ts.DiagnosticCategory.Error, key: "Option 'noEmit' cannot be specified with option 'out' or 'outDir'." },
Option_noEmit_cannot_be_specified_with_option_declaration: { code: 5041, category: ts.DiagnosticCategory.Error, key: "Option 'noEmit' cannot be specified with option 'declaration'." },
Option_project_cannot_be_mixed_with_source_files_on_a_command_line: { code: 5042, category: ts.DiagnosticCategory.Error, key: "Option 'project' cannot be mixed with source files on a command line." },
Option_sourceMap_cannot_be_specified_with_option_separateCompilation: { code: 5043, category: ts.DiagnosticCategory.Error, key: "Option 'sourceMap' cannot be specified with option 'separateCompilation'." },
Option_declaration_cannot_be_specified_with_option_separateCompilation: { code: 5044, category: ts.DiagnosticCategory.Error, key: "Option 'declaration' cannot be specified with option 'separateCompilation'." },
Option_noEmitOnError_cannot_be_specified_with_option_separateCompilation: { code: 5045, category: ts.DiagnosticCategory.Error, key: "Option 'noEmitOnError' cannot be specified with option 'separateCompilation'." },
Option_out_cannot_be_specified_with_option_separateCompilation: { code: 5046, category: ts.DiagnosticCategory.Error, key: "Option 'out' cannot be specified with option 'separateCompilation'." },
Option_separateCompilation_can_only_be_used_when_either_option_module_is_provided_or_option_target_is_ES6_or_higher: { code: 5047, category: ts.DiagnosticCategory.Error, key: "Option 'separateCompilation' can only be used when either option'--module' is provided or option 'target' is 'ES6' or higher." },
Option_sourceMap_cannot_be_specified_with_option_inlineSourceMap: { code: 5048, category: ts.DiagnosticCategory.Error, key: "Option 'sourceMap' cannot be specified with option 'inlineSourceMap'." },
Option_sourceRoot_cannot_be_specified_with_option_inlineSourceMap: { code: 5049, category: ts.DiagnosticCategory.Error, key: "Option 'sourceRoot' cannot be specified with option 'inlineSourceMap'." },
Option_mapRoot_cannot_be_specified_with_option_inlineSourceMap: { code: 5050, category: ts.DiagnosticCategory.Error, key: "Option 'mapRoot' cannot be specified with option 'inlineSourceMap'." },
Option_inlineSources_can_only_be_used_when_either_option_inlineSourceMap_or_option_sourceMap_is_provided: { code: 5051, category: ts.DiagnosticCategory.Error, key: "Option 'inlineSources' can only be used when either option '--inlineSourceMap' or option '--sourceMap' is provided." },
Concatenate_and_emit_output_to_single_file: { code: 6001, category: ts.DiagnosticCategory.Message, key: "Concatenate and emit output to single file." },
Generates_corresponding_d_ts_file: { code: 6002, category: ts.DiagnosticCategory.Message, key: "Generates corresponding '.d.ts' file." },
Specifies_the_location_where_debugger_should_locate_map_files_instead_of_generated_locations: { code: 6003, category: ts.DiagnosticCategory.Message, key: "Specifies the location where debugger should locate map files instead of generated locations." },
Specifies_the_location_where_debugger_should_locate_TypeScript_files_instead_of_source_locations: { code: 6004, category: ts.DiagnosticCategory.Message, key: "Specifies the location where debugger should locate TypeScript files instead of source locations." },
Watch_input_files: { code: 6005, category: ts.DiagnosticCategory.Message, key: "Watch input files." },
Redirect_output_structure_to_the_directory: { code: 6006, category: ts.DiagnosticCategory.Message, key: "Redirect output structure to the directory." },
Do_not_erase_const_enum_declarations_in_generated_code: { code: 6007, category: ts.DiagnosticCategory.Message, key: "Do not erase const enum declarations in generated code." },
Do_not_emit_outputs_if_any_errors_were_reported: { code: 6008, category: ts.DiagnosticCategory.Message, key: "Do not emit outputs if any errors were reported." },
Do_not_emit_comments_to_output: { code: 6009, category: ts.DiagnosticCategory.Message, key: "Do not emit comments to output." },
Do_not_emit_outputs: { code: 6010, category: ts.DiagnosticCategory.Message, key: "Do not emit outputs." },
Specify_ECMAScript_target_version_Colon_ES3_default_ES5_or_ES6_experimental: { code: 6015, category: ts.DiagnosticCategory.Message, key: "Specify ECMAScript target version: 'ES3' (default), 'ES5', or 'ES6' (experimental)" },
Specify_module_code_generation_Colon_commonjs_amd_system_or_umd: { code: 6016, category: ts.DiagnosticCategory.Message, key: "Specify module code generation: 'commonjs', 'amd', 'system' or 'umd'" },
Print_this_message: { code: 6017, category: ts.DiagnosticCategory.Message, key: "Print this message." },
Print_the_compiler_s_version: { code: 6019, category: ts.DiagnosticCategory.Message, key: "Print the compiler's version." },
Compile_the_project_in_the_given_directory: { code: 6020, category: ts.DiagnosticCategory.Message, key: "Compile the project in the given directory." },
Syntax_Colon_0: { code: 6023, category: ts.DiagnosticCategory.Message, key: "Syntax: {0}" },
options: { code: 6024, category: ts.DiagnosticCategory.Message, key: "options" },
file: { code: 6025, category: ts.DiagnosticCategory.Message, key: "file" },
Examples_Colon_0: { code: 6026, category: ts.DiagnosticCategory.Message, key: "Examples: {0}" },
Options_Colon: { code: 6027, category: ts.DiagnosticCategory.Message, key: "Options:" },
Version_0: { code: 6029, category: ts.DiagnosticCategory.Message, key: "Version {0}" },
Insert_command_line_options_and_files_from_a_file: { code: 6030, category: ts.DiagnosticCategory.Message, key: "Insert command line options and files from a file." },
File_change_detected_Starting_incremental_compilation: { code: 6032, category: ts.DiagnosticCategory.Message, key: "File change detected. Starting incremental compilation..." },
KIND: { code: 6034, category: ts.DiagnosticCategory.Message, key: "KIND" },
FILE: { code: 6035, category: ts.DiagnosticCategory.Message, key: "FILE" },
VERSION: { code: 6036, category: ts.DiagnosticCategory.Message, key: "VERSION" },
LOCATION: { code: 6037, category: ts.DiagnosticCategory.Message, key: "LOCATION" },
DIRECTORY: { code: 6038, category: ts.DiagnosticCategory.Message, key: "DIRECTORY" },
Compilation_complete_Watching_for_file_changes: { code: 6042, category: ts.DiagnosticCategory.Message, key: "Compilation complete. Watching for file changes." },
Generates_corresponding_map_file: { code: 6043, category: ts.DiagnosticCategory.Message, key: "Generates corresponding '.map' file." },
Compiler_option_0_expects_an_argument: { code: 6044, category: ts.DiagnosticCategory.Error, key: "Compiler option '{0}' expects an argument." },
Unterminated_quoted_string_in_response_file_0: { code: 6045, category: ts.DiagnosticCategory.Error, key: "Unterminated quoted string in response file '{0}'." },
Argument_for_module_option_must_be_commonjs_amd_system_or_umd: { code: 6046, category: ts.DiagnosticCategory.Error, key: "Argument for '--module' option must be 'commonjs', 'amd', 'system' or 'umd'." },
Argument_for_target_option_must_be_ES3_ES5_or_ES6: { code: 6047, category: ts.DiagnosticCategory.Error, key: "Argument for '--target' option must be 'ES3', 'ES5', or 'ES6'." },
Locale_must_be_of_the_form_language_or_language_territory_For_example_0_or_1: { code: 6048, category: ts.DiagnosticCategory.Error, key: "Locale must be of the form <language> or <language>-<territory>. For example '{0}' or '{1}'." },
Unsupported_locale_0: { code: 6049, category: ts.DiagnosticCategory.Error, key: "Unsupported locale '{0}'." },
Unable_to_open_file_0: { code: 6050, category: ts.DiagnosticCategory.Error, key: "Unable to open file '{0}'." },
Corrupted_locale_file_0: { code: 6051, category: ts.DiagnosticCategory.Error, key: "Corrupted locale file {0}." },
Raise_error_on_expressions_and_declarations_with_an_implied_any_type: { code: 6052, category: ts.DiagnosticCategory.Message, key: "Raise error on expressions and declarations with an implied 'any' type." },
File_0_not_found: { code: 6053, category: ts.DiagnosticCategory.Error, key: "File '{0}' not found." },
File_0_has_unsupported_extension_The_only_supported_extensions_are_1: { code: 6054, category: ts.DiagnosticCategory.Error, key: "File '{0}' has unsupported extension. The only supported extensions are {1}." },
Suppress_noImplicitAny_errors_for_indexing_objects_lacking_index_signatures: { code: 6055, category: ts.DiagnosticCategory.Message, key: "Suppress noImplicitAny errors for indexing objects lacking index signatures." },
Do_not_emit_declarations_for_code_that_has_an_internal_annotation: { code: 6056, category: ts.DiagnosticCategory.Message, key: "Do not emit declarations for code that has an '@internal' annotation." },
Preserve_new_lines_when_emitting_code: { code: 6057, category: ts.DiagnosticCategory.Message, key: "Preserve new-lines when emitting code." },
Specifies_the_root_directory_of_input_files_Use_to_control_the_output_directory_structure_with_outDir: { code: 6058, category: ts.DiagnosticCategory.Message, key: "Specifies the root directory of input files. Use to control the output directory structure with --outDir." },
File_0_is_not_under_rootDir_1_rootDir_is_expected_to_contain_all_source_files: { code: 6059, category: ts.DiagnosticCategory.Error, key: "File '{0}' is not under 'rootDir' '{1}'. 'rootDir' is expected to contain all source files." },
Specifies_the_end_of_line_sequence_to_be_used_when_emitting_files_Colon_CRLF_dos_or_LF_unix: { code: 6060, category: ts.DiagnosticCategory.Message, key: "Specifies the end of line sequence to be used when emitting files: 'CRLF' (dos) or 'LF' (unix)." },
NEWLINE: { code: 6061, category: ts.DiagnosticCategory.Message, key: "NEWLINE" },
Argument_for_newLine_option_must_be_CRLF_or_LF: { code: 6062, category: ts.DiagnosticCategory.Error, key: "Argument for '--newLine' option must be 'CRLF' or 'LF'." },
Variable_0_implicitly_has_an_1_type: { code: 7005, category: ts.DiagnosticCategory.Error, key: "Variable '{0}' implicitly has an '{1}' type." },
Parameter_0_implicitly_has_an_1_type: { code: 7006, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' implicitly has an '{1}' type." },
Member_0_implicitly_has_an_1_type: { code: 7008, category: ts.DiagnosticCategory.Error, key: "Member '{0}' implicitly has an '{1}' type." },
new_expression_whose_target_lacks_a_construct_signature_implicitly_has_an_any_type: { code: 7009, category: ts.DiagnosticCategory.Error, key: "'new' expression, whose target lacks a construct signature, implicitly has an 'any' type." },
_0_which_lacks_return_type_annotation_implicitly_has_an_1_return_type: { code: 7010, category: ts.DiagnosticCategory.Error, key: "'{0}', which lacks return-type annotation, implicitly has an '{1}' return type." },
Function_expression_which_lacks_return_type_annotation_implicitly_has_an_0_return_type: { code: 7011, category: ts.DiagnosticCategory.Error, key: "Function expression, which lacks return-type annotation, implicitly has an '{0}' return type." },
Construct_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type: { code: 7013, category: ts.DiagnosticCategory.Error, key: "Construct signature, which lacks return-type annotation, implicitly has an 'any' return type." },
Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_type_annotation: { code: 7016, category: ts.DiagnosticCategory.Error, key: "Property '{0}' implicitly has type 'any', because its 'set' accessor lacks a type annotation." },
Index_signature_of_object_type_implicitly_has_an_any_type: { code: 7017, category: ts.DiagnosticCategory.Error, key: "Index signature of object type implicitly has an 'any' type." },
Object_literal_s_property_0_implicitly_has_an_1_type: { code: 7018, category: ts.DiagnosticCategory.Error, key: "Object literal's property '{0}' implicitly has an '{1}' type." },
Rest_parameter_0_implicitly_has_an_any_type: { code: 7019, category: ts.DiagnosticCategory.Error, key: "Rest parameter '{0}' implicitly has an 'any[]' type." },
Call_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type: { code: 7020, category: ts.DiagnosticCategory.Error, key: "Call signature, which lacks return-type annotation, implicitly has an 'any' return type." },
_0_implicitly_has_type_any_because_it_is_does_not_have_a_type_annotation_and_is_referenced_directly_or_indirectly_in_its_own_initializer: { code: 7022, category: ts.DiagnosticCategory.Error, key: "'{0}' implicitly has type 'any' because it is does not have a type annotation and is referenced directly or indirectly in its own initializer." },
_0_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions: { code: 7023, category: ts.DiagnosticCategory.Error, key: "'{0}' implicitly has return type 'any' because it does not have a return type annotation and is referenced directly or indirectly in one of its return expressions." },
Function_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions: { code: 7024, category: ts.DiagnosticCategory.Error, key: "Function implicitly has return type 'any' because it does not have a return type annotation and is referenced directly or indirectly in one of its return expressions." },
You_cannot_rename_this_element: { code: 8000, category: ts.DiagnosticCategory.Error, key: "You cannot rename this element." },
You_cannot_rename_elements_that_are_defined_in_the_standard_TypeScript_library: { code: 8001, category: ts.DiagnosticCategory.Error, key: "You cannot rename elements that are defined in the standard TypeScript library." },
import_can_only_be_used_in_a_ts_file: { code: 8002, category: ts.DiagnosticCategory.Error, key: "'import ... =' can only be used in a .ts file." },
export_can_only_be_used_in_a_ts_file: { code: 8003, category: ts.DiagnosticCategory.Error, key: "'export=' can only be used in a .ts file." },
type_parameter_declarations_can_only_be_used_in_a_ts_file: { code: 8004, category: ts.DiagnosticCategory.Error, key: "'type parameter declarations' can only be used in a .ts file." },
implements_clauses_can_only_be_used_in_a_ts_file: { code: 8005, category: ts.DiagnosticCategory.Error, key: "'implements clauses' can only be used in a .ts file." },
interface_declarations_can_only_be_used_in_a_ts_file: { code: 8006, category: ts.DiagnosticCategory.Error, key: "'interface declarations' can only be used in a .ts file." },
module_declarations_can_only_be_used_in_a_ts_file: { code: 8007, category: ts.DiagnosticCategory.Error, key: "'module declarations' can only be used in a .ts file." },
type_aliases_can_only_be_used_in_a_ts_file: { code: 8008, category: ts.DiagnosticCategory.Error, key: "'type aliases' can only be used in a .ts file." },
_0_can_only_be_used_in_a_ts_file: { code: 8009, category: ts.DiagnosticCategory.Error, key: "'{0}' can only be used in a .ts file." },
types_can_only_be_used_in_a_ts_file: { code: 8010, category: ts.DiagnosticCategory.Error, key: "'types' can only be used in a .ts file." },
type_arguments_can_only_be_used_in_a_ts_file: { code: 8011, category: ts.DiagnosticCategory.Error, key: "'type arguments' can only be used in a .ts file." },
parameter_modifiers_can_only_be_used_in_a_ts_file: { code: 8012, category: ts.DiagnosticCategory.Error, key: "'parameter modifiers' can only be used in a .ts file." },
can_only_be_used_in_a_ts_file: { code: 8013, category: ts.DiagnosticCategory.Error, key: "'?' can only be used in a .ts file." },
property_declarations_can_only_be_used_in_a_ts_file: { code: 8014, category: ts.DiagnosticCategory.Error, key: "'property declarations' can only be used in a .ts file." },
enum_declarations_can_only_be_used_in_a_ts_file: { code: 8015, category: ts.DiagnosticCategory.Error, key: "'enum declarations' can only be used in a .ts file." },
type_assertion_expressions_can_only_be_used_in_a_ts_file: { code: 8016, category: ts.DiagnosticCategory.Error, key: "'type assertion expressions' can only be used in a .ts file." },
decorators_can_only_be_used_in_a_ts_file: { code: 8017, category: ts.DiagnosticCategory.Error, key: "'decorators' can only be used in a .ts file." },
yield_expressions_are_not_currently_supported: { code: 9000, category: ts.DiagnosticCategory.Error, key: "'yield' expressions are not currently supported." },
Generators_are_not_currently_supported: { code: 9001, category: ts.DiagnosticCategory.Error, key: "Generators are not currently supported." },
Only_identifiers_Slashqualified_names_with_optional_type_arguments_are_currently_supported_in_a_class_extends_clauses: { code: 9002, category: ts.DiagnosticCategory.Error, key: "Only identifiers/qualified-names with optional type arguments are currently supported in a class 'extends' clauses." },
class_expressions_are_not_currently_supported: { code: 9003, category: ts.DiagnosticCategory.Error, key: "'class' expressions are not currently supported." },
class_declarations_are_only_supported_directly_inside_a_module_or_as_a_top_level_declaration: { code: 9004, category: ts.DiagnosticCategory.Error, key: "'class' declarations are only supported directly inside a module or as a top level declaration." }
};
})(ts || (ts = {}));
/// <reference path="core.ts"/>
/// <reference path="diagnosticInformationMap.generated.ts"/>
var ts;
(function (ts) {
var textToToken = {
"any": 112,
"as": 111,
"boolean": 113,
"break": 66,
"case": 67,
"catch": 68,
"class": 69,
"continue": 71,
"const": 70,
"constructor": 114,
"debugger": 72,
"declare": 115,
"default": 73,
"delete": 74,
"do": 75,
"else": 76,
"enum": 77,
"export": 78,
"extends": 79,
"false": 80,
"finally": 81,
"for": 82,
"from": 125,
"function": 83,
"get": 116,
"if": 84,
"implements": 102,
"import": 85,
"in": 86,
"instanceof": 87,
"interface": 103,
"let": 104,
"module": 117,
"namespace": 118,
"new": 88,
"null": 89,
"number": 120,
"package": 105,
"private": 106,
"protected": 107,
"public": 108,
"require": 119,
"return": 90,
"set": 121,
"static": 109,
"string": 122,
"super": 91,
"switch": 92,
"symbol": 123,
"this": 93,
"throw": 94,
"true": 95,
"try": 96,
"type": 124,
"typeof": 97,
"var": 98,
"void": 99,
"while": 100,
"with": 101,
"yield": 110,
"of": 126,
"{": 14,
"}": 15,
"(": 16,
")": 17,
"[": 18,
"]": 19,
".": 20,
"...": 21,
";": 22,
",": 23,
"<": 24,
">": 25,
"<=": 26,
">=": 27,
"==": 28,
"!=": 29,
"===": 30,
"!==": 31,
"=>": 32,
"+": 33,
"-": 34,
"*": 35,
"/": 36,
"%": 37,
"++": 38,
"--": 39,
"<<": 40,
">>": 41,
">>>": 42,
"&": 43,
"|": 44,
"^": 45,
"!": 46,
"~": 47,
"&&": 48,
"||": 49,
"?": 50,
":": 51,
"=": 53,
"+=": 54,
"-=": 55,
"*=": 56,
"/=": 57,
"%=": 58,
"<<=": 59,
">>=": 60,
">>>=": 61,
"&=": 62,
"|=": 63,
"^=": 64,
"@": 52
};
var unicodeES3IdentifierStart = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 543, 546, 563, 592, 685, 688, 696, 699, 705, 720, 721, 736, 740, 750, 750, 890, 890, 902, 902, 904, 906, 908, 908, 910, 929, 931, 974, 976, 983, 986, 1011, 1024, 1153, 1164, 1220, 1223, 1224, 1227, 1228, 1232, 1269, 1272, 1273, 1329, 1366, 1369, 1369, 1377, 1415, 1488, 1514, 1520, 1522, 1569, 1594, 1600, 1610, 1649, 1747, 1749, 1749, 1765, 1766, 1786, 1788, 1808, 1808, 1810, 1836, 1920, 1957, 2309, 2361, 2365, 2365, 2384, 2384, 2392, 2401, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2524, 2525, 2527, 2529, 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2699, 2701, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2784, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2870, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 2997, 2999, 3001, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3294, 3294, 3296, 3297, 3333, 3340, 3342, 3344, 3346, 3368, 3370, 3385, 3424, 3425, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3805, 3840, 3840, 3904, 3911, 3913, 3946, 3976, 3979, 4096, 4129, 4131, 4135, 4137, 4138, 4176, 4181, 4256, 4293, 4304, 4342, 4352, 4441, 4447, 4514, 4520, 4601, 4608, 4614, 4616, 4678, 4680, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4742, 4744, 4744, 4746, 4749, 4752, 4782, 4784, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4814, 4816, 4822, 4824, 4846, 4848, 4878, 4880, 4880, 4882, 4885, 4888, 4894, 4896, 4934, 4936, 4954, 5024, 5108, 5121, 5740, 5743, 5750, 5761, 5786, 5792, 5866, 6016, 6067, 6176, 6263, 6272, 6312, 7680, 7835, 7840, 7929, 7936, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8319, 8319, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8497, 8499, 8505, 8544, 8579, 12293, 12295, 12321, 12329, 12337, 12341, 12344, 12346, 12353, 12436, 12445, 12446, 12449, 12538, 12540, 12542, 12549, 12588, 12593, 12686, 12704, 12727, 13312, 19893, 19968, 40869, 40960, 42124, 44032, 55203, 63744, 64045, 64256, 64262, 64275, 64279, 64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65136, 65138, 65140, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,];
var unicodeES3IdentifierPart = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 543, 546, 563, 592, 685, 688, 696, 699, 705, 720, 721, 736, 740, 750, 750, 768, 846, 864, 866, 890, 890, 902, 902, 904, 906, 908, 908, 910, 929, 931, 974, 976, 983, 986, 1011, 1024, 1153, 1155, 1158, 1164, 1220, 1223, 1224, 1227, 1228, 1232, 1269, 1272, 1273, 1329, 1366, 1369, 1369, 1377, 1415, 1425, 1441, 1443, 1465, 1467, 1469, 1471, 1471, 1473, 1474, 1476, 1476, 1488, 1514, 1520, 1522, 1569, 1594, 1600, 1621, 1632, 1641, 1648, 1747, 1749, 1756, 1759, 1768, 1770, 1773, 1776, 1788, 1808, 1836, 1840, 1866, 1920, 1968, 2305, 2307, 2309, 2361, 2364, 2381, 2384, 2388, 2392, 2403, 2406, 2415, 2433, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2492, 2492, 2494, 2500, 2503, 2504, 2507, 2509, 2519, 2519, 2524, 2525, 2527, 2531, 2534, 2545, 2562, 2562, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632, 2635, 2637, 2649, 2652, 2654, 2654, 2662, 2676, 2689, 2691, 2693, 2699, 2701, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757, 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2784, 2790, 2799, 2817, 2819, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2870, 2873, 2876, 2883, 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2913, 2918, 2927, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 2997, 2999, 3001, 3006, 3010, 3014, 3016, 3018, 3021, 3031, 3031, 3047, 3055, 3073, 3075, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3134, 3140, 3142, 3144, 3146, 3149, 3157, 3158, 3168, 3169, 3174, 3183, 3202, 3203, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3262, 3268, 3270, 3272, 3274, 3277, 3285, 3286, 3294, 3294, 3296, 3297, 3302, 3311, 3330, 3331, 3333, 3340, 3342, 3344, 3346, 3368, 3370, 3385, 3390, 3395, 3398, 3400, 3402, 3405, 3415, 3415, 3424, 3425, 3430, 3439, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570, 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3769, 3771, 3773, 3776, 3780, 3782, 3782, 3784, 3789, 3792, 3801, 3804, 3805, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895, 3895, 3897, 3897, 3902, 3911, 3913, 3946, 3953, 3972, 3974, 3979, 3984, 3991, 3993, 4028, 4038, 4038, 4096, 4129, 4131, 4135, 4137, 4138, 4140, 4146, 4150, 4153, 4160, 4169, 4176, 4185, 4256, 4293, 4304, 4342, 4352, 4441, 4447, 4514, 4520, 4601, 4608, 4614, 4616, 4678, 4680, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4742, 4744, 4744, 4746, 4749, 4752, 4782, 4784, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4814, 4816, 4822, 4824, 4846, 4848, 4878, 4880, 4880, 4882, 4885, 4888, 4894, 4896, 4934, 4936, 4954, 4969, 4977, 5024, 5108, 5121, 5740, 5743, 5750, 5761, 5786, 5792, 5866, 6016, 6099, 6112, 6121, 6160, 6169, 6176, 6263, 6272, 6313, 7680, 7835, 7840, 7929, 7936, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8255, 8256, 8319, 8319, 8400, 8412, 8417, 8417, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8497, 8499, 8505, 8544, 8579, 12293, 12295, 12321, 12335, 12337, 12341, 12344, 12346, 12353, 12436, 12441, 12442, 12445, 12446, 12449, 12542, 12549, 12588, 12593, 12686, 12704, 12727, 13312, 19893, 19968, 40869, 40960, 42124, 44032, 55203, 63744, 64045, 64256, 64262, 64275, 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65056, 65059, 65075, 65076, 65101, 65103, 65136, 65138, 65140, 65140, 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65381, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,];
var unicodeES5IdentifierStart = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 902, 902, 904, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415, 1488, 1514, 1520, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774, 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969, 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088, 2088, 2112, 2136, 2208, 2208, 2210, 2220, 2308, 2361, 2365, 2365, 2384, 2384, 2392, 2401, 2417, 2423, 2425, 2431, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529, 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2785, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3133, 3133, 3160, 3161, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3261, 3261, 3294, 3294, 3296, 3297, 3313, 3314, 3333, 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3424, 3425, 3450, 3455, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840, 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186, 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992, 5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6000, 6016, 6067, 6103, 6103, 6108, 6108, 6176, 6263, 6272, 6312, 6314, 6314, 6320, 6389, 6400, 6428, 6480, 6509, 6512, 6516, 6528, 6571, 6593, 6599, 6656, 6678, 6688, 6740, 6823, 6823, 6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7098, 7141, 7168, 7203, 7245, 7247, 7258, 7293, 7401, 7404, 7406, 7409, 7413, 7414, 7424, 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11502, 11506, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11823, 11823, 12293, 12295, 12321, 12329, 12337, 12341, 12344, 12348, 12353, 12438, 12445, 12447, 12449, 12538, 12540, 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893, 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538, 42539, 42560, 42606, 42623, 42647, 42656, 42735, 42775, 42783, 42786, 42888, 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43009, 43011, 43013, 43015, 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259, 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43520, 43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43648, 43695, 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739, 43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43968, 44002, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,];
var unicodeES5IdentifierPart = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 768, 884, 886, 887, 890, 893, 902, 902, 904, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1155, 1159, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415, 1425, 1469, 1471, 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1488, 1514, 1520, 1522, 1552, 1562, 1568, 1641, 1646, 1747, 1749, 1756, 1759, 1768, 1770, 1788, 1791, 1791, 1808, 1866, 1869, 1969, 1984, 2037, 2042, 2042, 2048, 2093, 2112, 2139, 2208, 2208, 2210, 2220, 2276, 2302, 2304, 2403, 2406, 2415, 2417, 2423, 2425, 2431, 2433, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2492, 2500, 2503, 2504, 2507, 2510, 2519, 2519, 2524, 2525, 2527, 2531, 2534, 2545, 2561, 2563, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632, 2635, 2637, 2641, 2641, 2649, 2652, 2654, 2654, 2662, 2677, 2689, 2691, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757, 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2787, 2790, 2799, 2817, 2819, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2876, 2884, 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2915, 2918, 2927, 2929, 2929, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3006, 3010, 3014, 3016, 3018, 3021, 3024, 3024, 3031, 3031, 3046, 3055, 3073, 3075, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3133, 3140, 3142, 3144, 3146, 3149, 3157, 3158, 3160, 3161, 3168, 3171, 3174, 3183, 3202, 3203, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3260, 3268, 3270, 3272, 3274, 3277, 3285, 3286, 3294, 3294, 3296, 3299, 3302, 3311, 3313, 3314, 3330, 3331, 3333, 3340, 3342, 3344, 3346, 3386, 3389, 3396, 3398, 3400, 3402, 3406, 3415, 3415, 3424, 3427, 3430, 3439, 3450, 3455, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570, 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3769, 3771, 3773, 3776, 3780, 3782, 3782, 3784, 3789, 3792, 3801, 3804, 3807, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895, 3895, 3897, 3897, 3902, 3911, 3913, 3948, 3953, 3972, 3974, 3991, 3993, 4028, 4038, 4038, 4096, 4169, 4176, 4253, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4957, 4959, 4992, 5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902, 5908, 5920, 5940, 5952, 5971, 5984, 5996, 5998, 6000, 6002, 6003, 6016, 6099, 6103, 6103, 6108, 6109, 6112, 6121, 6155, 6157, 6160, 6169, 6176, 6263, 6272, 6314, 6320, 6389, 6400, 6428, 6432, 6443, 6448, 6459, 6470, 6509, 6512, 6516, 6528, 6571, 6576, 6601, 6608, 6617, 6656, 6683, 6688, 6750, 6752, 6780, 6783, 6793, 6800, 6809, 6823, 6823, 6912, 6987, 6992, 7001, 7019, 7027, 7040, 7155, 7168, 7223, 7232, 7241, 7245, 7293, 7376, 7378, 7380, 7414, 7424, 7654, 7676, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8204, 8205, 8255, 8256, 8276, 8276, 8305, 8305, 8319, 8319, 8336, 8348, 8400, 8412, 8417, 8417, 8421, 8432, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11647, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11744, 11775, 11823, 11823, 12293, 12295, 12321, 12335, 12337, 12341, 12344, 12348, 12353, 12438, 12441, 12442, 12445, 12447, 12449, 12538, 12540, 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893, 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42539, 42560, 42607, 42612, 42621, 42623, 42647, 42655, 42737, 42775, 42783, 42786, 42888, 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43047, 43072, 43123, 43136, 43204, 43216, 43225, 43232, 43255, 43259, 43259, 43264, 43309, 43312, 43347, 43360, 43388, 43392, 43456, 43471, 43481, 43520, 43574, 43584, 43597, 43600, 43609, 43616, 43638, 43642, 43643, 43648, 43714, 43739, 43741, 43744, 43759, 43762, 43766, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43968, 44010, 44012, 44013, 44016, 44025, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65024, 65039, 65056, 65062, 65075, 65076, 65101, 65103, 65136, 65140, 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,];
function lookupInUnicodeMap(code, map) {
if (code < map[0]) {
return false;
}
var lo = 0;
var hi = map.length;
var mid;
while (lo + 1 < hi) {
mid = lo + (hi - lo) / 2;
mid -= mid % 2;
if (map[mid] <= code && code <= map[mid + 1]) {
return true;
}
if (code < map[mid]) {
hi = mid;
}
else {
lo = mid + 2;
}
}
return false;
}
function isUnicodeIdentifierStart(code, languageVersion) {
return languageVersion >= 1 ?
lookupInUnicodeMap(code, unicodeES5IdentifierStart) :
lookupInUnicodeMap(code, unicodeES3IdentifierStart);
}
ts.isUnicodeIdentifierStart = isUnicodeIdentifierStart;
function isUnicodeIdentifierPart(code, languageVersion) {
return languageVersion >= 1 ?
lookupInUnicodeMap(code, unicodeES5IdentifierPart) :
lookupInUnicodeMap(code, unicodeES3IdentifierPart);
}
function makeReverseMap(source) {
var result = [];
for (var name_2 in source) {
if (source.hasOwnProperty(name_2)) {
result[source[name_2]] = name_2;
}
}
return result;
}
var tokenStrings = makeReverseMap(textToToken);
function tokenToString(t) {
return tokenStrings[t];
}
ts.tokenToString = tokenToString;
function stringToToken(s) {
return textToToken[s];
}
ts.stringToToken = stringToToken;
function computeLineStarts(text) {
var result = new Array();
var pos = 0;
var lineStart = 0;
while (pos < text.length) {
var ch = text.charCodeAt(pos++);
switch (ch) {
case 13:
if (text.charCodeAt(pos) === 10) {
pos++;
}
case 10:
result.push(lineStart);
lineStart = pos;
break;
default:
if (ch > 127 && isLineBreak(ch)) {
result.push(lineStart);
lineStart = pos;
}
break;
}
}
result.push(lineStart);
return result;
}
ts.computeLineStarts = computeLineStarts;
function getPositionOfLineAndCharacter(sourceFile, line, character) {
return computePositionOfLineAndCharacter(getLineStarts(sourceFile), line, character);
}
ts.getPositionOfLineAndCharacter = getPositionOfLineAndCharacter;
function computePositionOfLineAndCharacter(lineStarts, line, character) {
ts.Debug.assert(line >= 0 && line < lineStarts.length);
return lineStarts[line] + character;
}
ts.computePositionOfLineAndCharacter = computePositionOfLineAndCharacter;
function getLineStarts(sourceFile) {
return sourceFile.lineMap || (sourceFile.lineMap = computeLineStarts(sourceFile.text));
}
ts.getLineStarts = getLineStarts;
function computeLineAndCharacterOfPosition(lineStarts, position) {
var lineNumber = ts.binarySearch(lineStarts, position);
if (lineNumber < 0) {
lineNumber = ~lineNumber - 1;
}
return {
line: lineNumber,
character: position - lineStarts[lineNumber]
};
}
ts.computeLineAndCharacterOfPosition = computeLineAndCharacterOfPosition;
function getLineAndCharacterOfPosition(sourceFile, position) {
return computeLineAndCharacterOfPosition(getLineStarts(sourceFile), position);
}
ts.getLineAndCharacterOfPosition = getLineAndCharacterOfPosition;
var hasOwnProperty = Object.prototype.hasOwnProperty;
function isWhiteSpace(ch) {
return ch === 32 ||
ch === 9 ||
ch === 11 ||
ch === 12 ||
ch === 160 ||
ch === 133 ||
ch === 5760 ||
ch >= 8192 && ch <= 8203 ||
ch === 8239 ||
ch === 8287 ||
ch === 12288 ||
ch === 65279;
}
ts.isWhiteSpace = isWhiteSpace;
function isLineBreak(ch) {
// ES5 7.3:
// The ECMAScript line terminator characters are listed in Table 3.
// Table 3: Line Terminator Characters
// Code Unit Value Name Formal Name
// \u000A Line Feed <LF>
// \u000D Carriage Return <CR>
// \u2028 Line separator <LS>
// \u2029 Paragraph separator <PS>
// Only the characters in Table 3 are treated as line terminators. Other new line or line
// breaking characters are treated as white space but not as line terminators.
return ch === 10 ||
ch === 13 ||
ch === 8232 ||
ch === 8233;
}
ts.isLineBreak = isLineBreak;
function isDigit(ch) {
return ch >= 48 && ch <= 57;
}
function isOctalDigit(ch) {
return ch >= 48 && ch <= 55;
}
ts.isOctalDigit = isOctalDigit;
function skipTrivia(text, pos, stopAfterLineBreak) {
while (true) {
var ch = text.charCodeAt(pos);
switch (ch) {
case 13:
if (text.charCodeAt(pos + 1) === 10) {
pos++;
}
case 10:
pos++;
if (stopAfterLineBreak) {
return pos;
}
continue;
case 9:
case 11:
case 12:
case 32:
pos++;
continue;
case 47:
if (text.charCodeAt(pos + 1) === 47) {
pos += 2;
while (pos < text.length) {
if (isLineBreak(text.charCodeAt(pos))) {
break;
}
pos++;
}
continue;
}
if (text.charCodeAt(pos + 1) === 42) {
pos += 2;
while (pos < text.length) {
if (text.charCodeAt(pos) === 42 && text.charCodeAt(pos + 1) === 47) {
pos += 2;
break;
}
pos++;
}
continue;
}
break;
case 60:
case 61:
case 62:
if (isConflictMarkerTrivia(text, pos)) {
pos = scanConflictMarkerTrivia(text, pos);
continue;
}
break;
default:
if (ch > 127 && (isWhiteSpace(ch) || isLineBreak(ch))) {
pos++;
continue;
}
break;
}
return pos;
}
}
ts.skipTrivia = skipTrivia;
var mergeConflictMarkerLength = "<<<<<<<".length;
function isConflictMarkerTrivia(text, pos) {
ts.Debug.assert(pos >= 0);
if (pos === 0 || isLineBreak(text.charCodeAt(pos - 1))) {
var ch = text.charCodeAt(pos);
if ((pos + mergeConflictMarkerLength) < text.length) {
for (var i = 0, n = mergeConflictMarkerLength; i < n; i++) {
if (text.charCodeAt(pos + i) !== ch) {
return false;
}
}
return ch === 61 ||
text.charCodeAt(pos + mergeConflictMarkerLength) === 32;
}
}
return false;
}
function scanConflictMarkerTrivia(text, pos, error) {
if (error) {
error(ts.Diagnostics.Merge_conflict_marker_encountered, mergeConflictMarkerLength);
}
var ch = text.charCodeAt(pos);
var len = text.length;
if (ch === 60 || ch === 62) {
while (pos < len && !isLineBreak(text.charCodeAt(pos))) {
pos++;
}
}
else {
ts.Debug.assert(ch === 61);
while (pos < len) {
var ch_1 = text.charCodeAt(pos);
if (ch_1 === 62 && isConflictMarkerTrivia(text, pos)) {
break;
}
pos++;
}
}
return pos;
}
function getCommentRanges(text, pos, trailing) {
var result;
var collecting = trailing || pos === 0;
while (true) {
var ch = text.charCodeAt(pos);
switch (ch) {
case 13:
if (text.charCodeAt(pos + 1) === 10) {
pos++;
}
case 10:
pos++;
if (trailing) {
return result;
}
collecting = true;
if (result && result.length) {
ts.lastOrUndefined(result).hasTrailingNewLine = true;
}
continue;
case 9:
case 11:
case 12:
case 32:
pos++;
continue;
case 47:
var nextChar = text.charCodeAt(pos + 1);
var hasTrailingNewLine = false;
if (nextChar === 47 || nextChar === 42) {
var kind = nextChar === 47 ? 2 : 3;
var startPos = pos;
pos += 2;
if (nextChar === 47) {
while (pos < text.length) {
if (isLineBreak(text.charCodeAt(pos))) {
hasTrailingNewLine = true;
break;
}
pos++;
}
}
else {
while (pos < text.length) {
if (text.charCodeAt(pos) === 42 && text.charCodeAt(pos + 1) === 47) {
pos += 2;
break;
}
pos++;
}
}
if (collecting) {
if (!result) {
result = [];
}
result.push({ pos: startPos, end: pos, hasTrailingNewLine: hasTrailingNewLine, kind: kind });
}
continue;
}
break;
default:
if (ch > 127 && (isWhiteSpace(ch) || isLineBreak(ch))) {
if (result && result.length && isLineBreak(ch)) {
ts.lastOrUndefined(result).hasTrailingNewLine = true;
}
pos++;
continue;
}
break;
}
return result;
}
}
function getLeadingCommentRanges(text, pos) {
return getCommentRanges(text, pos, false);
}
ts.getLeadingCommentRanges = getLeadingCommentRanges;
function getTrailingCommentRanges(text, pos) {
return getCommentRanges(text, pos, true);
}
ts.getTrailingCommentRanges = getTrailingCommentRanges;
function isIdentifierStart(ch, languageVersion) {
return ch >= 65 && ch <= 90 || ch >= 97 && ch <= 122 ||
ch === 36 || ch === 95 ||
ch > 127 && isUnicodeIdentifierStart(ch, languageVersion);
}
ts.isIdentifierStart = isIdentifierStart;
function isIdentifierPart(ch, languageVersion) {
return ch >= 65 && ch <= 90 || ch >= 97 && ch <= 122 ||
ch >= 48 && ch <= 57 || ch === 36 || ch === 95 ||
ch > 127 && isUnicodeIdentifierPart(ch, languageVersion);
}
ts.isIdentifierPart = isIdentifierPart;
function createScanner(languageVersion, skipTrivia, text, onError, start, length) {
var pos;
var end;
var startPos;
var tokenPos;
var token;
var tokenValue;
var precedingLineBreak;
var hasExtendedUnicodeEscape;
var tokenIsUnterminated;
setText(text, start, length);
return {
getStartPos: function () { return startPos; },
getTextPos: function () { return pos; },
getToken: function () { return token; },
getTokenPos: function () { return tokenPos; },
getTokenText: function () { return text.substring(tokenPos, pos); },
getTokenValue: function () { return tokenValue; },
hasExtendedUnicodeEscape: function () { return hasExtendedUnicodeEscape; },
hasPrecedingLineBreak: function () { return precedingLineBreak; },
isIdentifier: function () { return token === 65 || token > 101; },
isReservedWord: function () { return token >= 66 && token <= 101; },
isUnterminated: function () { return tokenIsUnterminated; },
reScanGreaterToken: reScanGreaterToken,
reScanSlashToken: reScanSlashToken,
reScanTemplateToken: reScanTemplateToken,
scan: scan,
setText: setText,
setScriptTarget: setScriptTarget,
setOnError: setOnError,
setTextPos: setTextPos,
tryScan: tryScan,
lookAhead: lookAhead
};
function error(message, length) {
if (onError) {
onError(message, length || 0);
}
}
function isIdentifierStart(ch) {
return ch >= 65 && ch <= 90 || ch >= 97 && ch <= 122 ||
ch === 36 || ch === 95 ||
ch > 127 && isUnicodeIdentifierStart(ch, languageVersion);
}
function isIdentifierPart(ch) {
return ch >= 65 && ch <= 90 || ch >= 97 && ch <= 122 ||
ch >= 48 && ch <= 57 || ch === 36 || ch === 95 ||
ch > 127 && isUnicodeIdentifierPart(ch, languageVersion);
}
function scanNumber() {
var start = pos;
while (isDigit(text.charCodeAt(pos)))
pos++;
if (text.charCodeAt(pos) === 46) {
pos++;
while (isDigit(text.charCodeAt(pos)))
pos++;
}
var end = pos;
if (text.charCodeAt(pos) === 69 || text.charCodeAt(pos) === 101) {
pos++;
if (text.charCodeAt(pos) === 43 || text.charCodeAt(pos) === 45)
pos++;
if (isDigit(text.charCodeAt(pos))) {
pos++;
while (isDigit(text.charCodeAt(pos)))
pos++;
end = pos;
}
else {
error(ts.Diagnostics.Digit_expected);
}
}
return +(text.substring(start, end));
}
function scanOctalDigits() {
var start = pos;
while (isOctalDigit(text.charCodeAt(pos))) {
pos++;
}
return +(text.substring(start, pos));
}
function scanExactNumberOfHexDigits(count) {
return scanHexDigits(count, false);
}
function scanMinimumNumberOfHexDigits(count) {
return scanHexDigits(count, true);
}
function scanHexDigits(minCount, scanAsManyAsPossible) {
var digits = 0;
var value = 0;
while (digits < minCount || scanAsManyAsPossible) {
var ch = text.charCodeAt(pos);
if (ch >= 48 && ch <= 57) {
value = value * 16 + ch - 48;
}
else if (ch >= 65 && ch <= 70) {
value = value * 16 + ch - 65 + 10;
}
else if (ch >= 97 && ch <= 102) {
value = value * 16 + ch - 97 + 10;
}
else {
break;
}
pos++;
digits++;
}
if (digits < minCount) {
value = -1;
}
return value;
}
function scanString() {
var quote = text.charCodeAt(pos++);
var result = "";
var start = pos;
while (true) {
if (pos >= end) {
result += text.substring(start, pos);
tokenIsUnterminated = true;
error(ts.Diagnostics.Unterminated_string_literal);
break;
}
var ch = text.charCodeAt(pos);
if (ch === quote) {
result += text.substring(start, pos);
pos++;
break;
}
if (ch === 92) {
result += text.substring(start, pos);
result += scanEscapeSequence();
start = pos;
continue;
}
if (isLineBreak(ch)) {
result += text.substring(start, pos);
tokenIsUnterminated = true;
error(ts.Diagnostics.Unterminated_string_literal);
break;
}
pos++;
}
return result;
}
function scanTemplateAndSetTokenValue() {
var startedWithBacktick = text.charCodeAt(pos) === 96;
pos++;
var start = pos;
var contents = "";
var resultingToken;
while (true) {
if (pos >= end) {
contents += text.substring(start, pos);
tokenIsUnterminated = true;
error(ts.Diagnostics.Unterminated_template_literal);
resultingToken = startedWithBacktick ? 10 : 13;
break;
}
var currChar = text.charCodeAt(pos);
if (currChar === 96) {
contents += text.substring(start, pos);
pos++;
resultingToken = startedWithBacktick ? 10 : 13;
break;
}
if (currChar === 36 && pos + 1 < end && text.charCodeAt(pos + 1) === 123) {
contents += text.substring(start, pos);
pos += 2;
resultingToken = startedWithBacktick ? 11 : 12;
break;
}
if (currChar === 92) {
contents += text.substring(start, pos);
contents += scanEscapeSequence();
start = pos;
continue;
}
if (currChar === 13) {
contents += text.substring(start, pos);
pos++;
if (pos < end && text.charCodeAt(pos) === 10) {
pos++;
}
contents += "\n";
start = pos;
continue;
}
pos++;
}
ts.Debug.assert(resultingToken !== undefined);
tokenValue = contents;
return resultingToken;
}
function scanEscapeSequence() {
pos++;
if (pos >= end) {
error(ts.Diagnostics.Unexpected_end_of_text);
return "";
}
var ch = text.charCodeAt(pos++);
switch (ch) {
case 48:
return "\0";
case 98:
return "\b";
case 116:
return "\t";
case 110:
return "\n";
case 118:
return "\v";
case 102:
return "\f";
case 114:
return "\r";
case 39:
return "\'";
case 34:
return "\"";
case 117:
if (pos < end && text.charCodeAt(pos) === 123) {
hasExtendedUnicodeEscape = true;
pos++;
return scanExtendedUnicodeEscape();
}
return scanHexadecimalEscape(4);
case 120:
return scanHexadecimalEscape(2);
case 13:
if (pos < end && text.charCodeAt(pos) === 10) {
pos++;
}
case 10:
case 8232:
case 8233:
return "";
default:
return String.fromCharCode(ch);
}
}
function scanHexadecimalEscape(numDigits) {
var escapedValue = scanExactNumberOfHexDigits(numDigits);
if (escapedValue >= 0) {
return String.fromCharCode(escapedValue);
}
else {
error(ts.Diagnostics.Hexadecimal_digit_expected);
return "";
}
}
function scanExtendedUnicodeEscape() {
var escapedValue = scanMinimumNumberOfHexDigits(1);
var isInvalidExtendedEscape = false;
if (escapedValue < 0) {
error(ts.Diagnostics.Hexadecimal_digit_expected);
isInvalidExtendedEscape = true;
}
else if (escapedValue > 0x10FFFF) {
error(ts.Diagnostics.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive);
isInvalidExtendedEscape = true;
}
if (pos >= end) {
error(ts.Diagnostics.Unexpected_end_of_text);
isInvalidExtendedEscape = true;
}
else if (text.charCodeAt(pos) == 125) {
pos++;
}
else {
error(ts.Diagnostics.Unterminated_Unicode_escape_sequence);
isInvalidExtendedEscape = true;
}
if (isInvalidExtendedEscape) {
return "";
}
return utf16EncodeAsString(escapedValue);
}
function utf16EncodeAsString(codePoint) {
ts.Debug.assert(0x0 <= codePoint && codePoint <= 0x10FFFF);
if (codePoint <= 65535) {
return String.fromCharCode(codePoint);
}
var codeUnit1 = Math.floor((codePoint - 65536) / 1024) + 0xD800;
var codeUnit2 = ((codePoint - 65536) % 1024) + 0xDC00;
return String.fromCharCode(codeUnit1, codeUnit2);
}
function peekUnicodeEscape() {
if (pos + 5 < end && text.charCodeAt(pos + 1) === 117) {
var start_1 = pos;
pos += 2;
var value = scanExactNumberOfHexDigits(4);
pos = start_1;
return value;
}
return -1;
}
function scanIdentifierParts() {
var result = "";
var start = pos;
while (pos < end) {
var ch = text.charCodeAt(pos);
if (isIdentifierPart(ch)) {
pos++;
}
else if (ch === 92) {
ch = peekUnicodeEscape();
if (!(ch >= 0 && isIdentifierPart(ch))) {
break;
}
result += text.substring(start, pos);
result += String.fromCharCode(ch);
pos += 6;
start = pos;
}
else {
break;
}
}
result += text.substring(start, pos);
return result;
}
function getIdentifierToken() {
var len = tokenValue.length;
if (len >= 2 && len <= 11) {
var ch = tokenValue.charCodeAt(0);
if (ch >= 97 && ch <= 122 && hasOwnProperty.call(textToToken, tokenValue)) {
return token = textToToken[tokenValue];
}
}
return token = 65;
}
function scanBinaryOrOctalDigits(base) {
ts.Debug.assert(base !== 2 || base !== 8, "Expected either base 2 or base 8");
var value = 0;
var numberOfDigits = 0;
while (true) {
var ch = text.charCodeAt(pos);
var valueOfCh = ch - 48;
if (!isDigit(ch) || valueOfCh >= base) {
break;
}
value = value * base + valueOfCh;
pos++;
numberOfDigits++;
}
if (numberOfDigits === 0) {
return -1;
}
return value;
}
function scan() {
startPos = pos;
hasExtendedUnicodeEscape = false;
precedingLineBreak = false;
tokenIsUnterminated = false;
while (true) {
tokenPos = pos;
if (pos >= end) {
return token = 1;
}
var ch = text.charCodeAt(pos);
switch (ch) {
case 10:
case 13:
precedingLineBreak = true;
if (skipTrivia) {
pos++;
continue;
}
else {
if (ch === 13 && pos + 1 < end && text.charCodeAt(pos + 1) === 10) {
pos += 2;
}
else {
pos++;
}
return token = 4;
}
case 9:
case 11:
case 12:
case 32:
if (skipTrivia) {
pos++;
continue;
}
else {
while (pos < end && isWhiteSpace(text.charCodeAt(pos))) {
pos++;
}
return token = 5;
}
case 33:
if (text.charCodeAt(pos + 1) === 61) {
if (text.charCodeAt(pos + 2) === 61) {
return pos += 3, token = 31;
}
return pos += 2, token = 29;
}
return pos++, token = 46;
case 34:
case 39:
tokenValue = scanString();
return token = 8;
case 96:
return token = scanTemplateAndSetTokenValue();
case 37:
if (text.charCodeAt(pos + 1) === 61) {
return pos += 2, token = 58;
}
return pos++, token = 37;
case 38:
if (text.charCodeAt(pos + 1) === 38) {
return pos += 2, token = 48;
}
if (text.charCodeAt(pos + 1) === 61) {
return pos += 2, token = 62;
}
return pos++, token = 43;
case 40:
return pos++, token = 16;
case 41:
return pos++, token = 17;
case 42:
if (text.charCodeAt(pos + 1) === 61) {
return pos += 2, token = 56;
}
return pos++, token = 35;
case 43:
if (text.charCodeAt(pos + 1) === 43) {
return pos += 2, token = 38;
}
if (text.charCodeAt(pos + 1) === 61) {
return pos += 2, token = 54;
}
return pos++, token = 33;
case 44:
return pos++, token = 23;
case 45:
if (text.charCodeAt(pos + 1) === 45) {
return pos += 2, token = 39;
}
if (text.charCodeAt(pos + 1) === 61) {
return pos += 2, token = 55;
}
return pos++, token = 34;
case 46:
if (isDigit(text.charCodeAt(pos + 1))) {
tokenValue = "" + scanNumber();
return token = 7;
}
if (text.charCodeAt(pos + 1) === 46 && text.charCodeAt(pos + 2) === 46) {
return pos += 3, token = 21;
}
return pos++, token = 20;
case 47:
if (text.charCodeAt(pos + 1) === 47) {
pos += 2;
while (pos < end) {
if (isLineBreak(text.charCodeAt(pos))) {
break;
}
pos++;
}
if (skipTrivia) {
continue;
}
else {
return token = 2;
}
}
if (text.charCodeAt(pos + 1) === 42) {
pos += 2;
var commentClosed = false;
while (pos < end) {
var ch_2 = text.charCodeAt(pos);
if (ch_2 === 42 && text.charCodeAt(pos + 1) === 47) {
pos += 2;
commentClosed = true;
break;
}
if (isLineBreak(ch_2)) {
precedingLineBreak = true;
}
pos++;
}
if (!commentClosed) {
error(ts.Diagnostics.Asterisk_Slash_expected);
}
if (skipTrivia) {
continue;
}
else {
tokenIsUnterminated = !commentClosed;
return token = 3;
}
}
if (text.charCodeAt(pos + 1) === 61) {
return pos += 2, token = 57;
}
return pos++, token = 36;
case 48:
if (pos + 2 < end && (text.charCodeAt(pos + 1) === 88 || text.charCodeAt(pos + 1) === 120)) {
pos += 2;
var value = scanMinimumNumberOfHexDigits(1);
if (value < 0) {
error(ts.Diagnostics.Hexadecimal_digit_expected);
value = 0;
}
tokenValue = "" + value;
return token = 7;
}
else if (pos + 2 < end && (text.charCodeAt(pos + 1) === 66 || text.charCodeAt(pos + 1) === 98)) {
pos += 2;
var value = scanBinaryOrOctalDigits(2);
if (value < 0) {
error(ts.Diagnostics.Binary_digit_expected);
value = 0;
}
tokenValue = "" + value;
return token = 7;
}
else if (pos + 2 < end && (text.charCodeAt(pos + 1) === 79 || text.charCodeAt(pos + 1) === 111)) {
pos += 2;
var value = scanBinaryOrOctalDigits(8);
if (value < 0) {
error(ts.Diagnostics.Octal_digit_expected);
value = 0;
}
tokenValue = "" + value;
return token = 7;
}
if (pos + 1 < end && isOctalDigit(text.charCodeAt(pos + 1))) {
tokenValue = "" + scanOctalDigits();
return token = 7;
}
case 49:
case 50:
case 51:
case 52:
case 53:
case 54:
case 55:
case 56:
case 57:
tokenValue = "" + scanNumber();
return token = 7;
case 58:
return pos++, token = 51;
case 59:
return pos++, token = 22;
case 60:
if (isConflictMarkerTrivia(text, pos)) {
pos = scanConflictMarkerTrivia(text, pos, error);
if (skipTrivia) {
continue;
}
else {
return token = 6;
}
}
if (text.charCodeAt(pos + 1) === 60) {
if (text.charCodeAt(pos + 2) === 61) {
return pos += 3, token = 59;
}
return pos += 2, token = 40;
}
if (text.charCodeAt(pos + 1) === 61) {
return pos += 2, token = 26;
}
return pos++, token = 24;
case 61:
if (isConflictMarkerTrivia(text, pos)) {
pos = scanConflictMarkerTrivia(text, pos, error);
if (skipTrivia) {
continue;
}
else {
return token = 6;
}
}
if (text.charCodeAt(pos + 1) === 61) {
if (text.charCodeAt(pos + 2) === 61) {
return pos += 3, token = 30;
}
return pos += 2, token = 28;
}
if (text.charCodeAt(pos + 1) === 62) {
return pos += 2, token = 32;
}
return pos++, token = 53;
case 62:
if (isConflictMarkerTrivia(text, pos)) {
pos = scanConflictMarkerTrivia(text, pos, error);
if (skipTrivia) {
continue;
}
else {
return token = 6;
}
}
return pos++, token = 25;
case 63:
return pos++, token = 50;
case 91:
return pos++, token = 18;
case 93:
return pos++, token = 19;
case 94:
if (text.charCodeAt(pos + 1) === 61) {
return pos += 2, token = 64;
}
return pos++, token = 45;
case 123:
return pos++, token = 14;
case 124:
if (text.charCodeAt(pos + 1) === 124) {
return pos += 2, token = 49;
}
if (text.charCodeAt(pos + 1) === 61) {
return pos += 2, token = 63;
}
return pos++, token = 44;
case 125:
return pos++, token = 15;
case 126:
return pos++, token = 47;
case 64:
return pos++, token = 52;
case 92:
var cookedChar = peekUnicodeEscape();
if (cookedChar >= 0 && isIdentifierStart(cookedChar)) {
pos += 6;
tokenValue = String.fromCharCode(cookedChar) + scanIdentifierParts();
return token = getIdentifierToken();
}
error(ts.Diagnostics.Invalid_character);
return pos++, token = 0;
default:
if (isIdentifierStart(ch)) {
pos++;
while (pos < end && isIdentifierPart(ch = text.charCodeAt(pos)))
pos++;
tokenValue = text.substring(tokenPos, pos);
if (ch === 92) {
tokenValue += scanIdentifierParts();
}
return token = getIdentifierToken();
}
else if (isWhiteSpace(ch)) {
pos++;
continue;
}
else if (isLineBreak(ch)) {
precedingLineBreak = true;
pos++;
continue;
}
error(ts.Diagnostics.Invalid_character);
return pos++, token = 0;
}
}
}
function reScanGreaterToken() {
if (token === 25) {
if (text.charCodeAt(pos) === 62) {
if (text.charCodeAt(pos + 1) === 62) {
if (text.charCodeAt(pos + 2) === 61) {
return pos += 3, token = 61;
}
return pos += 2, token = 42;
}
if (text.charCodeAt(pos + 1) === 61) {
return pos += 2, token = 60;
}
return pos++, token = 41;
}
if (text.charCodeAt(pos) === 61) {
return pos++, token = 27;
}
}
return token;
}
function reScanSlashToken() {
if (token === 36 || token === 57) {
var p = tokenPos + 1;
var inEscape = false;
var inCharacterClass = false;
while (true) {
if (p >= end) {
tokenIsUnterminated = true;
error(ts.Diagnostics.Unterminated_regular_expression_literal);
break;
}
var ch = text.charCodeAt(p);
if (isLineBreak(ch)) {
tokenIsUnterminated = true;
error(ts.Diagnostics.Unterminated_regular_expression_literal);
break;
}
if (inEscape) {
inEscape = false;
}
else if (ch === 47 && !inCharacterClass) {
p++;
break;
}
else if (ch === 91) {
inCharacterClass = true;
}
else if (ch === 92) {
inEscape = true;
}
else if (ch === 93) {
inCharacterClass = false;
}
p++;
}
while (p < end && isIdentifierPart(text.charCodeAt(p))) {
p++;
}
pos = p;
tokenValue = text.substring(tokenPos, pos);
token = 9;
}
return token;
}
function reScanTemplateToken() {
ts.Debug.assert(token === 15, "'reScanTemplateToken' should only be called on a '}'");
pos = tokenPos;
return token = scanTemplateAndSetTokenValue();
}
function speculationHelper(callback, isLookahead) {
var savePos = pos;
var saveStartPos = startPos;
var saveTokenPos = tokenPos;
var saveToken = token;
var saveTokenValue = tokenValue;
var savePrecedingLineBreak = precedingLineBreak;
var result = callback();
if (!result || isLookahead) {
pos = savePos;
startPos = saveStartPos;
tokenPos = saveTokenPos;
token = saveToken;
tokenValue = saveTokenValue;
precedingLineBreak = savePrecedingLineBreak;
}
return result;
}
function lookAhead(callback) {
return speculationHelper(callback, true);
}
function tryScan(callback) {
return speculationHelper(callback, false);
}
function setText(newText, start, length) {
text = newText || "";
end = length === undefined ? text.length : start + length;
setTextPos(start || 0);
}
function setOnError(errorCallback) {
onError = errorCallback;
}
function setScriptTarget(scriptTarget) {
languageVersion = scriptTarget;
}
function setTextPos(textPos) {
ts.Debug.assert(textPos >= 0);
pos = textPos;
startPos = textPos;
tokenPos = textPos;
token = 0;
precedingLineBreak = false;
tokenValue = undefined;
hasExtendedUnicodeEscape = false;
tokenIsUnterminated = false;
}
}
ts.createScanner = createScanner;
})(ts || (ts = {}));
/// <reference path="parser.ts"/>
var ts;
(function (ts) {
ts.bindTime = 0;
function getModuleInstanceState(node) {
if (node.kind === 203 || node.kind === 204) {
return 0;
}
else if (ts.isConstEnumDeclaration(node)) {
return 2;
}
else if ((node.kind === 210 || node.kind === 209) && !(node.flags & 1)) {
return 0;
}
else if (node.kind === 207) {
var state = 0;
ts.forEachChild(node, function (n) {
switch (getModuleInstanceState(n)) {
case 0:
return false;
case 2:
state = 2;
return false;
case 1:
state = 1;
return true;
}
});
return state;
}
else if (node.kind === 206) {
return getModuleInstanceState(node.body);
}
else {
return 1;
}
}
ts.getModuleInstanceState = getModuleInstanceState;
function bindSourceFile(file) {
var start = new Date().getTime();
bindSourceFileWorker(file);
ts.bindTime += new Date().getTime() - start;
}
ts.bindSourceFile = bindSourceFile;
function bindSourceFileWorker(file) {
var parent;
var container;
var blockScopeContainer;
var lastContainer;
var symbolCount = 0;
var Symbol = ts.objectAllocator.getSymbolConstructor();
if (!file.locals) {
file.locals = {};
container = file;
setBlockScopeContainer(file, false);
bind(file);
file.symbolCount = symbolCount;
}
function createSymbol(flags, name) {
symbolCount++;
return new Symbol(flags, name);
}
function setBlockScopeContainer(node, cleanLocals) {
blockScopeContainer = node;
if (cleanLocals) {
blockScopeContainer.locals = undefined;
}
}
function addDeclarationToSymbol(symbol, node, symbolKind) {
symbol.flags |= symbolKind;
if (!symbol.declarations)
symbol.declarations = [];
symbol.declarations.push(node);
if (symbolKind & 1952 && !symbol.exports)
symbol.exports = {};
if (symbolKind & 6240 && !symbol.members)
symbol.members = {};
node.symbol = symbol;
if (symbolKind & 107455 && !symbol.valueDeclaration)
symbol.valueDeclaration = node;
}
function getDeclarationName(node) {
if (node.name) {
if (node.kind === 206 && node.name.kind === 8) {
return '"' + node.name.text + '"';
}
if (node.name.kind === 128) {
var nameExpression = node.name.expression;
ts.Debug.assert(ts.isWellKnownSymbolSyntactically(nameExpression));
return ts.getPropertyNameForKnownSymbolName(nameExpression.name.text);
}
return node.name.text;
}
switch (node.kind) {
case 144:
case 136:
return "__constructor";
case 143:
case 139:
return "__call";
case 140:
return "__new";
case 141:
return "__index";
case 216:
return "__export";
case 215:
return node.isExportEquals ? "export=" : "default";
case 201:
case 202:
return node.flags & 256 ? "default" : undefined;
}
}
function getDisplayName(node) {
return node.name ? ts.declarationNameToString(node.name) : getDeclarationName(node);
}
function declareSymbol(symbols, parent, node, includes, excludes) {
ts.Debug.assert(!ts.hasDynamicName(node));
var name = node.flags & 256 && parent ? "default" : getDeclarationName(node);
var symbol;
if (name !== undefined) {
symbol = ts.hasProperty(symbols, name) ? symbols[name] : (symbols[name] = createSymbol(0, name));
if (symbol.flags & excludes) {
if (node.name) {
node.name.parent = node;
}
var message = symbol.flags & 2
? ts.Diagnostics.Cannot_redeclare_block_scoped_variable_0
: ts.Diagnostics.Duplicate_identifier_0;
ts.forEach(symbol.declarations, function (declaration) {
file.bindDiagnostics.push(ts.createDiagnosticForNode(declaration.name || declaration, message, getDisplayName(declaration)));
});
file.bindDiagnostics.push(ts.createDiagnosticForNode(node.name || node, message, getDisplayName(node)));
symbol = createSymbol(0, name);
}
}
else {
symbol = createSymbol(0, "__missing");
}
addDeclarationToSymbol(symbol, node, includes);
symbol.parent = parent;
if ((node.kind === 202 || node.kind === 175) && symbol.exports) {
var prototypeSymbol = createSymbol(4 | 134217728, "prototype");
if (ts.hasProperty(symbol.exports, prototypeSymbol.name)) {
if (node.name) {
node.name.parent = node;
}
file.bindDiagnostics.push(ts.createDiagnosticForNode(symbol.exports[prototypeSymbol.name].declarations[0], ts.Diagnostics.Duplicate_identifier_0, prototypeSymbol.name));
}
symbol.exports[prototypeSymbol.name] = prototypeSymbol;
prototypeSymbol.parent = symbol;
}
return symbol;
}
function declareModuleMember(node, symbolKind, symbolExcludes) {
var hasExportModifier = ts.getCombinedNodeFlags(node) & 1;
if (symbolKind & 8388608) {
if (node.kind === 218 || (node.kind === 209 && hasExportModifier)) {
declareSymbol(container.symbol.exports, container.symbol, node, symbolKind, symbolExcludes);
}
else {
declareSymbol(container.locals, undefined, node, symbolKind, symbolExcludes);
}
}
else {
if (hasExportModifier || container.flags & 65536) {
var exportKind = (symbolKind & 107455 ? 1048576 : 0) |
(symbolKind & 793056 ? 2097152 : 0) |
(symbolKind & 1536 ? 4194304 : 0);
var local = declareSymbol(container.locals, undefined, node, exportKind, symbolExcludes);
local.exportSymbol = declareSymbol(container.symbol.exports, container.symbol, node, symbolKind, symbolExcludes);
node.localSymbol = local;
}
else {
declareSymbol(container.locals, undefined, node, symbolKind, symbolExcludes);
}
}
}
function bindChildren(node, symbolKind, isBlockScopeContainer) {
if (symbolKind & 255504) {
node.locals = {};
}
var saveParent = parent;
var saveContainer = container;
var savedBlockScopeContainer = blockScopeContainer;
parent = node;
if (symbolKind & 262128) {
container = node;
addToContainerChain(container);
}
if (isBlockScopeContainer) {
setBlockScopeContainer(node, (symbolKind & 255504) === 0 && node.kind !== 228);
}
ts.forEachChild(node, bind);
container = saveContainer;
parent = saveParent;
blockScopeContainer = savedBlockScopeContainer;
}
function addToContainerChain(node) {
if (lastContainer) {
lastContainer.nextContainer = node;
}
lastContainer = node;
}
function bindDeclaration(node, symbolKind, symbolExcludes, isBlockScopeContainer) {
switch (container.kind) {
case 206:
declareModuleMember(node, symbolKind, symbolExcludes);
break;
case 228:
if (ts.isExternalModule(container)) {
declareModuleMember(node, symbolKind, symbolExcludes);
break;
}
case 143:
case 144:
case 139:
case 140:
case 141:
case 135:
case 134:
case 136:
case 137:
case 138:
case 201:
case 163:
case 164:
declareSymbol(container.locals, undefined, node, symbolKind, symbolExcludes);
break;
case 175:
case 202:
if (node.flags & 128) {
declareSymbol(container.symbol.exports, container.symbol, node, symbolKind, symbolExcludes);
break;
}
case 146:
case 155:
case 203:
declareSymbol(container.symbol.members, container.symbol, node, symbolKind, symbolExcludes);
break;
case 205:
declareSymbol(container.symbol.exports, container.symbol, node, symbolKind, symbolExcludes);
break;
}
bindChildren(node, symbolKind, isBlockScopeContainer);
}
function isAmbientContext(node) {
while (node) {
if (node.flags & 2)
return true;
node = node.parent;
}
return false;
}
function hasExportDeclarations(node) {
var body = node.kind === 228 ? node : node.body;
if (body.kind === 228 || body.kind === 207) {
for (var _i = 0, _a = body.statements; _i < _a.length; _i++) {
var stat = _a[_i];
if (stat.kind === 216 || stat.kind === 215) {
return true;
}
}
}
return false;
}
function setExportContextFlag(node) {
if (isAmbientContext(node) && !hasExportDeclarations(node)) {
node.flags |= 65536;
}
else {
node.flags &= ~65536;
}
}
function bindModuleDeclaration(node) {
setExportContextFlag(node);
if (node.name.kind === 8) {
bindDeclaration(node, 512, 106639, true);
}
else {
var state = getModuleInstanceState(node);
if (state === 0) {
bindDeclaration(node, 1024, 0, true);
}
else {
bindDeclaration(node, 512, 106639, true);
var currentModuleIsConstEnumOnly = state === 2;
if (node.symbol.constEnumOnlyModule === undefined) {
node.symbol.constEnumOnlyModule = currentModuleIsConstEnumOnly;
}
else {
node.symbol.constEnumOnlyModule = node.symbol.constEnumOnlyModule && currentModuleIsConstEnumOnly;
}
}
}
}
function bindFunctionOrConstructorType(node) {
// For a given function symbol "<...>(...) => T" we want to generate a symbol identical
// to the one we would get for: { <...>(...): T }
//
// We do that by making an anonymous type literal symbol, and then setting the function
// symbol as its sole member. To the rest of the system, this symbol will be indistinguishable
// from an actual type literal symbol you would have gotten had you used the long form.
var symbol = createSymbol(131072, getDeclarationName(node));
addDeclarationToSymbol(symbol, node, 131072);
bindChildren(node, 131072, false);
var typeLiteralSymbol = createSymbol(2048, "__type");
addDeclarationToSymbol(typeLiteralSymbol, node, 2048);
typeLiteralSymbol.members = {};
typeLiteralSymbol.members[node.kind === 143 ? "__call" : "__new"] = symbol;
}
function bindAnonymousDeclaration(node, symbolKind, name, isBlockScopeContainer) {
var symbol = createSymbol(symbolKind, name);
addDeclarationToSymbol(symbol, node, symbolKind);
bindChildren(node, symbolKind, isBlockScopeContainer);
}
function bindCatchVariableDeclaration(node) {
bindChildren(node, 0, true);
}
function bindBlockScopedDeclaration(node, symbolKind, symbolExcludes) {
switch (blockScopeContainer.kind) {
case 206:
declareModuleMember(node, symbolKind, symbolExcludes);
break;
case 228:
if (ts.isExternalModule(container)) {
declareModuleMember(node, symbolKind, symbolExcludes);
break;
}
default:
if (!blockScopeContainer.locals) {
blockScopeContainer.locals = {};
addToContainerChain(blockScopeContainer);
}
declareSymbol(blockScopeContainer.locals, undefined, node, symbolKind, symbolExcludes);
}
bindChildren(node, symbolKind, false);
}
function bindBlockScopedVariableDeclaration(node) {
bindBlockScopedDeclaration(node, 2, 107455);
}
function getDestructuringParameterName(node) {
return "__" + ts.indexOf(node.parent.parameters, node);
}
function bind(node) {
node.parent = parent;
switch (node.kind) {
case 129:
bindDeclaration(node, 262144, 530912, false);
break;
case 130:
bindParameter(node);
break;
case 199:
case 153:
if (ts.isBindingPattern(node.name)) {
bindChildren(node, 0, false);
}
else if (ts.isBlockOrCatchScoped(node)) {
bindBlockScopedVariableDeclaration(node);
}
else if (ts.isParameterDeclaration(node)) {
bindDeclaration(node, 1, 107455, false);
}
else {
bindDeclaration(node, 1, 107454, false);
}
break;
case 133:
case 132:
bindPropertyOrMethodOrAccessor(node, 4 | (node.questionToken ? 536870912 : 0), 107455, false);
break;
case 225:
case 226:
bindPropertyOrMethodOrAccessor(node, 4, 107455, false);
break;
case 227:
bindPropertyOrMethodOrAccessor(node, 8, 107455, false);
break;
case 139:
case 140:
case 141:
bindDeclaration(node, 131072, 0, false);
break;
case 135:
case 134:
bindPropertyOrMethodOrAccessor(node, 8192 | (node.questionToken ? 536870912 : 0), ts.isObjectLiteralMethod(node) ? 107455 : 99263, true);
break;
case 201:
bindDeclaration(node, 16, 106927, true);
break;
case 136:
bindDeclaration(node, 16384, 0, true);
break;
case 137:
bindPropertyOrMethodOrAccessor(node, 32768, 41919, true);
break;
case 138:
bindPropertyOrMethodOrAccessor(node, 65536, 74687, true);
break;
case 143:
case 144:
bindFunctionOrConstructorType(node);
break;
case 146:
bindAnonymousDeclaration(node, 2048, "__type", false);
break;
case 155:
bindAnonymousDeclaration(node, 4096, "__object", false);
break;
case 163:
case 164:
bindAnonymousDeclaration(node, 16, "__function", true);
break;
case 175:
bindAnonymousDeclaration(node, 32, "__class", false);
break;
case 224:
bindCatchVariableDeclaration(node);
break;
case 202:
bindBlockScopedDeclaration(node, 32, 899583);
break;
case 203:
bindDeclaration(node, 64, 792992, false);
break;
case 204:
bindDeclaration(node, 524288, 793056, false);
break;
case 205:
if (ts.isConst(node)) {
bindDeclaration(node, 128, 899967, false);
}
else {
bindDeclaration(node, 256, 899327, false);
}
break;
case 206:
bindModuleDeclaration(node);
break;
case 209:
case 212:
case 214:
case 218:
bindDeclaration(node, 8388608, 8388608, false);
break;
case 211:
if (node.name) {
bindDeclaration(node, 8388608, 8388608, false);
}
else {
bindChildren(node, 0, false);
}
break;
case 216:
if (!node.exportClause) {
declareSymbol(container.symbol.exports, container.symbol, node, 1073741824, 0);
}
bindChildren(node, 0, false);
break;
case 215:
if (node.expression.kind === 65) {
declareSymbol(container.symbol.exports, container.symbol, node, 8388608, 107455 | 8388608);
}
else {
declareSymbol(container.symbol.exports, container.symbol, node, 4, 107455 | 8388608);
}
bindChildren(node, 0, false);
break;
case 228:
setExportContextFlag(node);
if (ts.isExternalModule(node)) {
bindAnonymousDeclaration(node, 512, '"' + ts.removeFileExtension(node.fileName) + '"', true);
break;
}
case 180:
bindChildren(node, 0, !ts.isFunctionLike(node.parent));
break;
case 224:
case 187:
case 188:
case 189:
case 208:
bindChildren(node, 0, true);
break;
default:
var saveParent = parent;
parent = node;
ts.forEachChild(node, bind);
parent = saveParent;
}
}
function bindParameter(node) {
if (ts.isBindingPattern(node.name)) {
bindAnonymousDeclaration(node, 1, getDestructuringParameterName(node), false);
}
else {
bindDeclaration(node, 1, 107455, false);
}
if (node.flags & 112 &&
node.parent.kind === 136 &&
(node.parent.parent.kind === 202 || node.parent.parent.kind === 175)) {
var classDeclaration = node.parent.parent;
declareSymbol(classDeclaration.symbol.members, classDeclaration.symbol, node, 4, 107455);
}
}
function bindPropertyOrMethodOrAccessor(node, symbolKind, symbolExcludes, isBlockScopeContainer) {
if (ts.hasDynamicName(node)) {
bindAnonymousDeclaration(node, symbolKind, "__computed", isBlockScopeContainer);
}
else {
bindDeclaration(node, symbolKind, symbolExcludes, isBlockScopeContainer);
}
}
}
})(ts || (ts = {}));
/// <reference path="binder.ts" />
var ts;
(function (ts) {
function getDeclarationOfKind(symbol, kind) {
var declarations = symbol.declarations;
for (var _i = 0; _i < declarations.length; _i++) {
var declaration = declarations[_i];
if (declaration.kind === kind) {
return declaration;
}
}
return undefined;
}
ts.getDeclarationOfKind = getDeclarationOfKind;
var stringWriters = [];
function getSingleLineStringWriter() {
if (stringWriters.length == 0) {
var str = "";
var writeText = function (text) { return str += text; };
return {
string: function () { return str; },
writeKeyword: writeText,
writeOperator: writeText,
writePunctuation: writeText,
writeSpace: writeText,
writeStringLiteral: writeText,
writeParameter: writeText,
writeSymbol: writeText,
writeLine: function () { return str += " "; },
increaseIndent: function () { },
decreaseIndent: function () { },
clear: function () { return str = ""; },
trackSymbol: function () { }
};
}
return stringWriters.pop();
}
ts.getSingleLineStringWriter = getSingleLineStringWriter;
function releaseStringWriter(writer) {
writer.clear();
stringWriters.push(writer);
}
ts.releaseStringWriter = releaseStringWriter;
function getFullWidth(node) {
return node.end - node.pos;
}
ts.getFullWidth = getFullWidth;
function containsParseError(node) {
aggregateChildData(node);
return (node.parserContextFlags & 64) !== 0;
}
ts.containsParseError = containsParseError;
function aggregateChildData(node) {
if (!(node.parserContextFlags & 128)) {
var thisNodeOrAnySubNodesHasError = ((node.parserContextFlags & 32) !== 0) ||
ts.forEachChild(node, containsParseError);
if (thisNodeOrAnySubNodesHasError) {
node.parserContextFlags |= 64;
}
node.parserContextFlags |= 128;
}
}
function getSourceFileOfNode(node) {
while (node && node.kind !== 228) {
node = node.parent;
}
return node;
}
ts.getSourceFileOfNode = getSourceFileOfNode;
function getStartPositionOfLine(line, sourceFile) {
ts.Debug.assert(line >= 0);
return ts.getLineStarts(sourceFile)[line];
}
ts.getStartPositionOfLine = getStartPositionOfLine;
function nodePosToString(node) {
var file = getSourceFileOfNode(node);
var loc = ts.getLineAndCharacterOfPosition(file, node.pos);
return file.fileName + "(" + (loc.line + 1) + "," + (loc.character + 1) + ")";
}
ts.nodePosToString = nodePosToString;
function getStartPosOfNode(node) {
return node.pos;
}
ts.getStartPosOfNode = getStartPosOfNode;
function nodeIsMissing(node) {
if (!node) {
return true;
}
return node.pos === node.end && node.kind !== 1;
}
ts.nodeIsMissing = nodeIsMissing;
function nodeIsPresent(node) {
return !nodeIsMissing(node);
}
ts.nodeIsPresent = nodeIsPresent;
function getTokenPosOfNode(node, sourceFile) {
if (nodeIsMissing(node)) {
return node.pos;
}
return ts.skipTrivia((sourceFile || getSourceFileOfNode(node)).text, node.pos);
}
ts.getTokenPosOfNode = getTokenPosOfNode;
function getNonDecoratorTokenPosOfNode(node, sourceFile) {
if (nodeIsMissing(node) || !node.decorators) {
return getTokenPosOfNode(node, sourceFile);
}
return ts.skipTrivia((sourceFile || getSourceFileOfNode(node)).text, node.decorators.end);
}
ts.getNonDecoratorTokenPosOfNode = getNonDecoratorTokenPosOfNode;
function getSourceTextOfNodeFromSourceFile(sourceFile, node) {
if (nodeIsMissing(node)) {
return "";
}
var text = sourceFile.text;
return text.substring(ts.skipTrivia(text, node.pos), node.end);
}
ts.getSourceTextOfNodeFromSourceFile = getSourceTextOfNodeFromSourceFile;
function getTextOfNodeFromSourceText(sourceText, node) {
if (nodeIsMissing(node)) {
return "";
}
return sourceText.substring(ts.skipTrivia(sourceText, node.pos), node.end);
}
ts.getTextOfNodeFromSourceText = getTextOfNodeFromSourceText;
function getTextOfNode(node) {
return getSourceTextOfNodeFromSourceFile(getSourceFileOfNode(node), node);
}
ts.getTextOfNode = getTextOfNode;
function escapeIdentifier(identifier) {
return identifier.length >= 2 && identifier.charCodeAt(0) === 95 && identifier.charCodeAt(1) === 95 ? "_" + identifier : identifier;
}
ts.escapeIdentifier = escapeIdentifier;
function unescapeIdentifier(identifier) {
return identifier.length >= 3 && identifier.charCodeAt(0) === 95 && identifier.charCodeAt(1) === 95 && identifier.charCodeAt(2) === 95 ? identifier.substr(1) : identifier;
}
ts.unescapeIdentifier = unescapeIdentifier;
function makeIdentifierFromModuleName(moduleName) {
return ts.getBaseFileName(moduleName).replace(/\W/g, "_");
}
ts.makeIdentifierFromModuleName = makeIdentifierFromModuleName;
function isBlockOrCatchScoped(declaration) {
return (getCombinedNodeFlags(declaration) & 12288) !== 0 ||
isCatchClauseVariableDeclaration(declaration);
}
ts.isBlockOrCatchScoped = isBlockOrCatchScoped;
function getEnclosingBlockScopeContainer(node) {
var current = node.parent;
while (current) {
if (isFunctionLike(current)) {
return current;
}
switch (current.kind) {
case 228:
case 208:
case 224:
case 206:
case 187:
case 188:
case 189:
return current;
case 180:
if (!isFunctionLike(current.parent)) {
return current;
}
}
current = current.parent;
}
}
ts.getEnclosingBlockScopeContainer = getEnclosingBlockScopeContainer;
function isCatchClauseVariableDeclaration(declaration) {
return declaration &&
declaration.kind === 199 &&
declaration.parent &&
declaration.parent.kind === 224;
}
ts.isCatchClauseVariableDeclaration = isCatchClauseVariableDeclaration;
function declarationNameToString(name) {
return getFullWidth(name) === 0 ? "(Missing)" : getTextOfNode(name);
}
ts.declarationNameToString = declarationNameToString;
function createDiagnosticForNode(node, message, arg0, arg1, arg2) {
var sourceFile = getSourceFileOfNode(node);
var span = getErrorSpanForNode(sourceFile, node);
return ts.createFileDiagnostic(sourceFile, span.start, span.length, message, arg0, arg1, arg2);
}
ts.createDiagnosticForNode = createDiagnosticForNode;
function createDiagnosticForNodeFromMessageChain(node, messageChain) {
var sourceFile = getSourceFileOfNode(node);
var span = getErrorSpanForNode(sourceFile, node);
return {
file: sourceFile,
start: span.start,
length: span.length,
code: messageChain.code,
category: messageChain.category,
messageText: messageChain.next ? messageChain : messageChain.messageText
};
}
ts.createDiagnosticForNodeFromMessageChain = createDiagnosticForNodeFromMessageChain;
function getSpanOfTokenAtPosition(sourceFile, pos) {
var scanner = ts.createScanner(sourceFile.languageVersion, true, sourceFile.text, undefined, pos);
scanner.scan();
var start = scanner.getTokenPos();
return ts.createTextSpanFromBounds(start, scanner.getTextPos());
}
ts.getSpanOfTokenAtPosition = getSpanOfTokenAtPosition;
function getErrorSpanForNode(sourceFile, node) {
var errorNode = node;
switch (node.kind) {
case 228:
var pos_1 = ts.skipTrivia(sourceFile.text, 0, false);
if (pos_1 === sourceFile.text.length) {
return ts.createTextSpan(0, 0);
}
return getSpanOfTokenAtPosition(sourceFile, pos_1);
case 199:
case 153:
case 202:
case 175:
case 203:
case 206:
case 205:
case 227:
case 201:
case 163:
errorNode = node.name;
break;
}
if (errorNode === undefined) {
return getSpanOfTokenAtPosition(sourceFile, node.pos);
}
var pos = nodeIsMissing(errorNode)
? errorNode.pos
: ts.skipTrivia(sourceFile.text, errorNode.pos);
return ts.createTextSpanFromBounds(pos, errorNode.end);
}
ts.getErrorSpanForNode = getErrorSpanForNode;
function isExternalModule(file) {
return file.externalModuleIndicator !== undefined;
}
ts.isExternalModule = isExternalModule;
function isDeclarationFile(file) {
return (file.flags & 2048) !== 0;
}
ts.isDeclarationFile = isDeclarationFile;
function isConstEnumDeclaration(node) {
return node.kind === 205 && isConst(node);
}
ts.isConstEnumDeclaration = isConstEnumDeclaration;
function walkUpBindingElementsAndPatterns(node) {
while (node && (node.kind === 153 || isBindingPattern(node))) {
node = node.parent;
}
return node;
}
function getCombinedNodeFlags(node) {
node = walkUpBindingElementsAndPatterns(node);
var flags = node.flags;
if (node.kind === 199) {
node = node.parent;
}
if (node && node.kind === 200) {
flags |= node.flags;
node = node.parent;
}
if (node && node.kind === 181) {
flags |= node.flags;
}
return flags;
}
ts.getCombinedNodeFlags = getCombinedNodeFlags;
function isConst(node) {
return !!(getCombinedNodeFlags(node) & 8192);
}
ts.isConst = isConst;
function isLet(node) {
return !!(getCombinedNodeFlags(node) & 4096);
}
ts.isLet = isLet;
function isPrologueDirective(node) {
return node.kind === 183 && node.expression.kind === 8;
}
ts.isPrologueDirective = isPrologueDirective;
function getLeadingCommentRangesOfNode(node, sourceFileOfNode) {
if (node.kind === 130 || node.kind === 129) {
return ts.concatenate(ts.getTrailingCommentRanges(sourceFileOfNode.text, node.pos), ts.getLeadingCommentRanges(sourceFileOfNode.text, node.pos));
}
else {
return ts.getLeadingCommentRanges(sourceFileOfNode.text, node.pos);
}
}
ts.getLeadingCommentRangesOfNode = getLeadingCommentRangesOfNode;
function getJsDocComments(node, sourceFileOfNode) {
return ts.filter(getLeadingCommentRangesOfNode(node, sourceFileOfNode), isJsDocComment);
function isJsDocComment(comment) {
return sourceFileOfNode.text.charCodeAt(comment.pos + 1) === 42 &&
sourceFileOfNode.text.charCodeAt(comment.pos + 2) === 42 &&
sourceFileOfNode.text.charCodeAt(comment.pos + 3) !== 47;
}
}
ts.getJsDocComments = getJsDocComments;
ts.fullTripleSlashReferencePathRegEx = /^(\/\/\/\s*<reference\s+path\s*=\s*)('|")(.+?)\2.*?\/>/;
function forEachReturnStatement(body, visitor) {
return traverse(body);
function traverse(node) {
switch (node.kind) {
case 192:
return visitor(node);
case 208:
case 180:
case 184:
case 185:
case 186:
case 187:
case 188:
case 189:
case 193:
case 194:
case 221:
case 222:
case 195:
case 197:
case 224:
return ts.forEachChild(node, traverse);
}
}
}
ts.forEachReturnStatement = forEachReturnStatement;
function isVariableLike(node) {
if (node) {
switch (node.kind) {
case 153:
case 227:
case 130:
case 225:
case 133:
case 132:
case 226:
case 199:
return true;
}
}
return false;
}
ts.isVariableLike = isVariableLike;
function isAccessor(node) {
if (node) {
switch (node.kind) {
case 137:
case 138:
return true;
}
}
return false;
}
ts.isAccessor = isAccessor;
function isFunctionLike(node) {
if (node) {
switch (node.kind) {
case 136:
case 163:
case 201:
case 164:
case 135:
case 134:
case 137:
case 138:
case 139:
case 140:
case 141:
case 143:
case 144:
return true;
}
}
return false;
}
ts.isFunctionLike = isFunctionLike;
function isFunctionBlock(node) {
return node && node.kind === 180 && isFunctionLike(node.parent);
}
ts.isFunctionBlock = isFunctionBlock;
function isObjectLiteralMethod(node) {
return node && node.kind === 135 && node.parent.kind === 155;
}
ts.isObjectLiteralMethod = isObjectLiteralMethod;
function getContainingFunction(node) {
while (true) {
node = node.parent;
if (!node || isFunctionLike(node)) {
return node;
}
}
}
ts.getContainingFunction = getContainingFunction;
function getThisContainer(node, includeArrowFunctions) {
while (true) {
node = node.parent;
if (!node) {
return undefined;
}
switch (node.kind) {
case 128:
if (node.parent.parent.kind === 202) {
return node;
}
node = node.parent;
break;
case 131:
if (node.parent.kind === 130 && isClassElement(node.parent.parent)) {
node = node.parent.parent;
}
else if (isClassElement(node.parent)) {
node = node.parent;
}
break;
case 164:
if (!includeArrowFunctions) {
continue;
}
case 201:
case 163:
case 206:
case 133:
case 132:
case 135:
case 134:
case 136:
case 137:
case 138:
case 205:
case 228:
return node;
}
}
}
ts.getThisContainer = getThisContainer;
function getSuperContainer(node, includeFunctions) {
while (true) {
node = node.parent;
if (!node)
return node;
switch (node.kind) {
case 128:
if (node.parent.parent.kind === 202) {
return node;
}
node = node.parent;
break;
case 131:
if (node.parent.kind === 130 && isClassElement(node.parent.parent)) {
node = node.parent.parent;
}
else if (isClassElement(node.parent)) {
node = node.parent;
}
break;
case 201:
case 163:
case 164:
if (!includeFunctions) {
continue;
}
case 133:
case 132:
case 135:
case 134:
case 136:
case 137:
case 138:
return node;
}
}
}
ts.getSuperContainer = getSuperContainer;
function getInvokedExpression(node) {
if (node.kind === 160) {
return node.tag;
}
return node.expression;
}
ts.getInvokedExpression = getInvokedExpression;
function nodeCanBeDecorated(node) {
switch (node.kind) {
case 202:
return true;
case 133:
return node.parent.kind === 202;
case 130:
return node.parent.body && node.parent.parent.kind === 202;
case 137:
case 138:
case 135:
return node.body && node.parent.kind === 202;
}
return false;
}
ts.nodeCanBeDecorated = nodeCanBeDecorated;
function nodeIsDecorated(node) {
switch (node.kind) {
case 202:
if (node.decorators) {
return true;
}
return false;
case 133:
case 130:
if (node.decorators) {
return true;
}
return false;
case 137:
if (node.body && node.decorators) {
return true;
}
return false;
case 135:
case 138:
if (node.body && node.decorators) {
return true;
}
return false;
}
return false;
}
ts.nodeIsDecorated = nodeIsDecorated;
function childIsDecorated(node) {
switch (node.kind) {
case 202:
return ts.forEach(node.members, nodeOrChildIsDecorated);
case 135:
case 138:
return ts.forEach(node.parameters, nodeIsDecorated);
}
return false;
}
ts.childIsDecorated = childIsDecorated;
function nodeOrChildIsDecorated(node) {
return nodeIsDecorated(node) || childIsDecorated(node);
}
ts.nodeOrChildIsDecorated = nodeOrChildIsDecorated;
function isExpression(node) {
switch (node.kind) {
case 93:
case 91:
case 89:
case 95:
case 80:
case 9:
case 154:
case 155:
case 156:
case 157:
case 158:
case 159:
case 160:
case 161:
case 162:
case 163:
case 175:
case 164:
case 167:
case 165:
case 166:
case 168:
case 169:
case 170:
case 171:
case 174:
case 172:
case 10:
case 176:
return true;
case 127:
while (node.parent.kind === 127) {
node = node.parent;
}
return node.parent.kind === 145;
case 65:
if (node.parent.kind === 145) {
return true;
}
case 7:
case 8:
var parent_1 = node.parent;
switch (parent_1.kind) {
case 199:
case 130:
case 133:
case 132:
case 227:
case 225:
case 153:
return parent_1.initializer === node;
case 183:
case 184:
case 185:
case 186:
case 192:
case 193:
case 194:
case 221:
case 196:
case 194:
return parent_1.expression === node;
case 187:
var forStatement = parent_1;
return (forStatement.initializer === node && forStatement.initializer.kind !== 200) ||
forStatement.condition === node ||
forStatement.incrementor === node;
case 188:
case 189:
var forInStatement = parent_1;
return (forInStatement.initializer === node && forInStatement.initializer.kind !== 200) ||
forInStatement.expression === node;
case 161:
return node === parent_1.expression;
case 178:
return node === parent_1.expression;
case 128:
return node === parent_1.expression;
case 131:
return true;
default:
if (isExpression(parent_1)) {
return true;
}
}
}
return false;
}
ts.isExpression = isExpression;
function isInstantiatedModule(node, preserveConstEnums) {
var moduleState = ts.getModuleInstanceState(node);
return moduleState === 1 ||
(preserveConstEnums && moduleState === 2);
}
ts.isInstantiatedModule = isInstantiatedModule;
function isExternalModuleImportEqualsDeclaration(node) {
return node.kind === 209 && node.moduleReference.kind === 220;
}
ts.isExternalModuleImportEqualsDeclaration = isExternalModuleImportEqualsDeclaration;
function getExternalModuleImportEqualsDeclarationExpression(node) {
ts.Debug.assert(isExternalModuleImportEqualsDeclaration(node));
return node.moduleReference.expression;
}
ts.getExternalModuleImportEqualsDeclarationExpression = getExternalModuleImportEqualsDeclarationExpression;
function isInternalModuleImportEqualsDeclaration(node) {
return node.kind === 209 && node.moduleReference.kind !== 220;
}
ts.isInternalModuleImportEqualsDeclaration = isInternalModuleImportEqualsDeclaration;
function getExternalModuleName(node) {
if (node.kind === 210) {
return node.moduleSpecifier;
}
if (node.kind === 209) {
var reference = node.moduleReference;
if (reference.kind === 220) {
return reference.expression;
}
}
if (node.kind === 216) {
return node.moduleSpecifier;
}
}
ts.getExternalModuleName = getExternalModuleName;
function hasDotDotDotToken(node) {
return node && node.kind === 130 && node.dotDotDotToken !== undefined;
}
ts.hasDotDotDotToken = hasDotDotDotToken;
function hasQuestionToken(node) {
if (node) {
switch (node.kind) {
case 130:
return node.questionToken !== undefined;
case 135:
case 134:
return node.questionToken !== undefined;
case 226:
case 225:
case 133:
case 132:
return node.questionToken !== undefined;
}
}
return false;
}
ts.hasQuestionToken = hasQuestionToken;
function hasRestParameters(s) {
return s.parameters.length > 0 && ts.lastOrUndefined(s.parameters).dotDotDotToken !== undefined;
}
ts.hasRestParameters = hasRestParameters;
function isLiteralKind(kind) {
return 7 <= kind && kind <= 10;
}
ts.isLiteralKind = isLiteralKind;
function isTextualLiteralKind(kind) {
return kind === 8 || kind === 10;
}
ts.isTextualLiteralKind = isTextualLiteralKind;
function isTemplateLiteralKind(kind) {
return 10 <= kind && kind <= 13;
}
ts.isTemplateLiteralKind = isTemplateLiteralKind;
function isBindingPattern(node) {
return !!node && (node.kind === 152 || node.kind === 151);
}
ts.isBindingPattern = isBindingPattern;
function isInAmbientContext(node) {
while (node) {
if (node.flags & (2 | 2048)) {
return true;
}
node = node.parent;
}
return false;
}
ts.isInAmbientContext = isInAmbientContext;
function isDeclaration(node) {
switch (node.kind) {
case 164:
case 153:
case 202:
case 136:
case 205:
case 227:
case 218:
case 201:
case 163:
case 137:
case 211:
case 209:
case 214:
case 203:
case 135:
case 134:
case 206:
case 212:
case 130:
case 225:
case 133:
case 132:
case 138:
case 226:
case 204:
case 129:
case 199:
return true;
}
return false;
}
ts.isDeclaration = isDeclaration;
function isStatement(n) {
switch (n.kind) {
case 191:
case 190:
case 198:
case 185:
case 183:
case 182:
case 188:
case 189:
case 187:
case 184:
case 195:
case 192:
case 194:
case 94:
case 197:
case 181:
case 186:
case 193:
case 215:
return true;
default:
return false;
}
}
ts.isStatement = isStatement;
function isClassElement(n) {
switch (n.kind) {
case 136:
case 133:
case 135:
case 137:
case 138:
case 134:
case 141:
return true;
default:
return false;
}
}
ts.isClassElement = isClassElement;
function isDeclarationName(name) {
if (name.kind !== 65 && name.kind !== 8 && name.kind !== 7) {
return false;
}
var parent = name.parent;
if (parent.kind === 214 || parent.kind === 218) {
if (parent.propertyName) {
return true;
}
}
if (isDeclaration(parent)) {
return parent.name === name;
}
return false;
}
ts.isDeclarationName = isDeclarationName;
function isAliasSymbolDeclaration(node) {
return node.kind === 209 ||
node.kind === 211 && !!node.name ||
node.kind === 212 ||
node.kind === 214 ||
node.kind === 218 ||
node.kind === 215 && node.expression.kind === 65;
}
ts.isAliasSymbolDeclaration = isAliasSymbolDeclaration;
function getClassExtendsHeritageClauseElement(node) {
var heritageClause = getHeritageClause(node.heritageClauses, 79);
return heritageClause && heritageClause.types.length > 0 ? heritageClause.types[0] : undefined;
}
ts.getClassExtendsHeritageClauseElement = getClassExtendsHeritageClauseElement;
function getClassImplementsHeritageClauseElements(node) {
var heritageClause = getHeritageClause(node.heritageClauses, 102);
return heritageClause ? heritageClause.types : undefined;
}
ts.getClassImplementsHeritageClauseElements = getClassImplementsHeritageClauseElements;
function getInterfaceBaseTypeNodes(node) {
var heritageClause = getHeritageClause(node.heritageClauses, 79);
return heritageClause ? heritageClause.types : undefined;
}
ts.getInterfaceBaseTypeNodes = getInterfaceBaseTypeNodes;
function getHeritageClause(clauses, kind) {
if (clauses) {
for (var _i = 0; _i < clauses.length; _i++) {
var clause = clauses[_i];
if (clause.token === kind) {
return clause;
}
}
}
return undefined;
}
ts.getHeritageClause = getHeritageClause;
function tryResolveScriptReference(host, sourceFile, reference) {
if (!host.getCompilerOptions().noResolve) {
var referenceFileName = ts.isRootedDiskPath(reference.fileName) ? reference.fileName : ts.combinePaths(ts.getDirectoryPath(sourceFile.fileName), reference.fileName);
referenceFileName = ts.getNormalizedAbsolutePath(referenceFileName, host.getCurrentDirectory());
return host.getSourceFile(referenceFileName);
}
}
ts.tryResolveScriptReference = tryResolveScriptReference;
function getAncestor(node, kind) {
while (node) {
if (node.kind === kind) {
return node;
}
node = node.parent;
}
return undefined;
}
ts.getAncestor = getAncestor;
function getFileReferenceFromReferencePath(comment, commentRange) {
var simpleReferenceRegEx = /^\/\/\/\s*<reference\s+/gim;
var isNoDefaultLibRegEx = /^(\/\/\/\s*<reference\s+no-default-lib\s*=\s*)('|")(.+?)\2\s*\/>/gim;
if (simpleReferenceRegEx.exec(comment)) {
if (isNoDefaultLibRegEx.exec(comment)) {
return {
isNoDefaultLib: true
};
}
else {
var matchResult = ts.fullTripleSlashReferencePathRegEx.exec(comment);
if (matchResult) {
var start = commentRange.pos;
var end = commentRange.end;
return {
fileReference: {
pos: start,
end: end,
fileName: matchResult[3]
},
isNoDefaultLib: false
};
}
else {
return {
diagnosticMessage: ts.Diagnostics.Invalid_reference_directive_syntax,
isNoDefaultLib: false
};
}
}
}
return undefined;
}
ts.getFileReferenceFromReferencePath = getFileReferenceFromReferencePath;
function isKeyword(token) {
return 66 <= token && token <= 126;
}
ts.isKeyword = isKeyword;
function isTrivia(token) {
return 2 <= token && token <= 6;
}
ts.isTrivia = isTrivia;
function hasDynamicName(declaration) {
return declaration.name &&
declaration.name.kind === 128 &&
!isWellKnownSymbolSyntactically(declaration.name.expression);
}
ts.hasDynamicName = hasDynamicName;
function isWellKnownSymbolSyntactically(node) {
return node.kind === 156 && isESSymbolIdentifier(node.expression);
}
ts.isWellKnownSymbolSyntactically = isWellKnownSymbolSyntactically;
function getPropertyNameForPropertyNameNode(name) {
if (name.kind === 65 || name.kind === 8 || name.kind === 7) {
return name.text;
}
if (name.kind === 128) {
var nameExpression = name.expression;
if (isWellKnownSymbolSyntactically(nameExpression)) {
var rightHandSideName = nameExpression.name.text;
return getPropertyNameForKnownSymbolName(rightHandSideName);
}
}
return undefined;
}
ts.getPropertyNameForPropertyNameNode = getPropertyNameForPropertyNameNode;
function getPropertyNameForKnownSymbolName(symbolName) {
return "__@" + symbolName;
}
ts.getPropertyNameForKnownSymbolName = getPropertyNameForKnownSymbolName;
function isESSymbolIdentifier(node) {
return node.kind === 65 && node.text === "Symbol";
}
ts.isESSymbolIdentifier = isESSymbolIdentifier;
function isModifier(token) {
switch (token) {
case 108:
case 106:
case 107:
case 109:
case 78:
case 115:
case 70:
case 73:
return true;
}
return false;
}
ts.isModifier = isModifier;
function isParameterDeclaration(node) {
var root = getRootDeclaration(node);
return root.kind === 130;
}
ts.isParameterDeclaration = isParameterDeclaration;
function getRootDeclaration(node) {
while (node.kind === 153) {
node = node.parent.parent;
}
return node;
}
ts.getRootDeclaration = getRootDeclaration;
function nodeStartsNewLexicalEnvironment(n) {
return isFunctionLike(n) || n.kind === 206 || n.kind === 228;
}
ts.nodeStartsNewLexicalEnvironment = nodeStartsNewLexicalEnvironment;
function nodeIsSynthesized(node) {
return node.pos === -1;
}
ts.nodeIsSynthesized = nodeIsSynthesized;
function createSynthesizedNode(kind, startsOnNewLine) {
var node = ts.createNode(kind);
node.pos = -1;
node.end = -1;
node.startsOnNewLine = startsOnNewLine;
return node;
}
ts.createSynthesizedNode = createSynthesizedNode;
function createSynthesizedNodeArray() {
var array = [];
array.pos = -1;
array.end = -1;
return array;
}
ts.createSynthesizedNodeArray = createSynthesizedNodeArray;
function createDiagnosticCollection() {
var nonFileDiagnostics = [];
var fileDiagnostics = {};
var diagnosticsModified = false;
var modificationCount = 0;
return {
add: add,
getGlobalDiagnostics: getGlobalDiagnostics,
getDiagnostics: getDiagnostics,
getModificationCount: getModificationCount
};
function getModificationCount() {
return modificationCount;
}
function add(diagnostic) {
var diagnostics;
if (diagnostic.file) {
diagnostics = fileDiagnostics[diagnostic.file.fileName];
if (!diagnostics) {
diagnostics = [];
fileDiagnostics[diagnostic.file.fileName] = diagnostics;
}
}
else {
diagnostics = nonFileDiagnostics;
}
diagnostics.push(diagnostic);
diagnosticsModified = true;
modificationCount++;
}
function getGlobalDiagnostics() {
sortAndDeduplicate();
return nonFileDiagnostics;
}
function getDiagnostics(fileName) {
sortAndDeduplicate();
if (fileName) {
return fileDiagnostics[fileName] || [];
}
var allDiagnostics = [];
function pushDiagnostic(d) {
allDiagnostics.push(d);
}
ts.forEach(nonFileDiagnostics, pushDiagnostic);
for (var key in fileDiagnostics) {
if (ts.hasProperty(fileDiagnostics, key)) {
ts.forEach(fileDiagnostics[key], pushDiagnostic);
}
}
return ts.sortAndDeduplicateDiagnostics(allDiagnostics);
}
function sortAndDeduplicate() {
if (!diagnosticsModified) {
return;
}
diagnosticsModified = false;
nonFileDiagnostics = ts.sortAndDeduplicateDiagnostics(nonFileDiagnostics);
for (var key in fileDiagnostics) {
if (ts.hasProperty(fileDiagnostics, key)) {
fileDiagnostics[key] = ts.sortAndDeduplicateDiagnostics(fileDiagnostics[key]);
}
}
}
}
ts.createDiagnosticCollection = createDiagnosticCollection;
var escapedCharsRegExp = /[\\\"\u0000-\u001f\t\v\f\b\r\n\u2028\u2029\u0085]/g;
var escapedCharsMap = {
"\0": "\\0",
"\t": "\\t",
"\v": "\\v",
"\f": "\\f",
"\b": "\\b",
"\r": "\\r",
"\n": "\\n",
"\\": "\\\\",
"\"": "\\\"",
"\u2028": "\\u2028",
"\u2029": "\\u2029",
"\u0085": "\\u0085"
};
function escapeString(s) {
s = escapedCharsRegExp.test(s) ? s.replace(escapedCharsRegExp, getReplacement) : s;
return s;
function getReplacement(c) {
return escapedCharsMap[c] || get16BitUnicodeEscapeSequence(c.charCodeAt(0));
}
}
ts.escapeString = escapeString;
function get16BitUnicodeEscapeSequence(charCode) {
var hexCharCode = charCode.toString(16).toUpperCase();
var paddedHexCode = ("0000" + hexCharCode).slice(-4);
return "\\u" + paddedHexCode;
}
var nonAsciiCharacters = /[^\u0000-\u007F]/g;
function escapeNonAsciiCharacters(s) {
return nonAsciiCharacters.test(s) ?
s.replace(nonAsciiCharacters, function (c) { return get16BitUnicodeEscapeSequence(c.charCodeAt(0)); }) :
s;
}
ts.escapeNonAsciiCharacters = escapeNonAsciiCharacters;
var indentStrings = ["", " "];
function getIndentString(level) {
if (indentStrings[level] === undefined) {
indentStrings[level] = getIndentString(level - 1) + indentStrings[1];
}
return indentStrings[level];
}
ts.getIndentString = getIndentString;
function getIndentSize() {
return indentStrings[1].length;
}
ts.getIndentSize = getIndentSize;
function createTextWriter(newLine) {
var output = "";
var indent = 0;
var lineStart = true;
var lineCount = 0;
var linePos = 0;
function write(s) {
if (s && s.length) {
if (lineStart) {
output += getIndentString(indent);
lineStart = false;
}
output += s;
}
}
function rawWrite(s) {
if (s !== undefined) {
if (lineStart) {
lineStart = false;
}
output += s;
}
}
function writeLiteral(s) {
if (s && s.length) {
write(s);
var lineStartsOfS = ts.computeLineStarts(s);
if (lineStartsOfS.length > 1) {
lineCount = lineCount + lineStartsOfS.length - 1;
linePos = output.length - s.length + ts.lastOrUndefined(lineStartsOfS);
}
}
}
function writeLine() {
if (!lineStart) {
output += newLine;
lineCount++;
linePos = output.length;
lineStart = true;
}
}
function writeTextOfNode(sourceFile, node) {
write(getSourceTextOfNodeFromSourceFile(sourceFile, node));
}
return {
write: write,
rawWrite: rawWrite,
writeTextOfNode: writeTextOfNode,
writeLiteral: writeLiteral,
writeLine: writeLine,
increaseIndent: function () { return indent++; },
decreaseIndent: function () { return indent--; },
getIndent: function () { return indent; },
getTextPos: function () { return output.length; },
getLine: function () { return lineCount + 1; },
getColumn: function () { return lineStart ? indent * getIndentSize() + 1 : output.length - linePos + 1; },
getText: function () { return output; }
};
}
ts.createTextWriter = createTextWriter;
function getOwnEmitOutputFilePath(sourceFile, host, extension) {
var compilerOptions = host.getCompilerOptions();
var emitOutputFilePathWithoutExtension;
if (compilerOptions.outDir) {
emitOutputFilePathWithoutExtension = ts.removeFileExtension(getSourceFilePathInNewDir(sourceFile, host, compilerOptions.outDir));
}
else {
emitOutputFilePathWithoutExtension = ts.removeFileExtension(sourceFile.fileName);
}
return emitOutputFilePathWithoutExtension + extension;
}
ts.getOwnEmitOutputFilePath = getOwnEmitOutputFilePath;
function getSourceFilePathInNewDir(sourceFile, host, newDirPath) {
var sourceFilePath = ts.getNormalizedAbsolutePath(sourceFile.fileName, host.getCurrentDirectory());
sourceFilePath = sourceFilePath.replace(host.getCommonSourceDirectory(), "");
return ts.combinePaths(newDirPath, sourceFilePath);
}
ts.getSourceFilePathInNewDir = getSourceFilePathInNewDir;
function writeFile(host, diagnostics, fileName, data, writeByteOrderMark) {
host.writeFile(fileName, data, writeByteOrderMark, function (hostErrorMessage) {
diagnostics.push(ts.createCompilerDiagnostic(ts.Diagnostics.Could_not_write_file_0_Colon_1, fileName, hostErrorMessage));
});
}
ts.writeFile = writeFile;
function getLineOfLocalPosition(currentSourceFile, pos) {
return ts.getLineAndCharacterOfPosition(currentSourceFile, pos).line;
}
ts.getLineOfLocalPosition = getLineOfLocalPosition;
function getFirstConstructorWithBody(node) {
return ts.forEach(node.members, function (member) {
if (member.kind === 136 && nodeIsPresent(member.body)) {
return member;
}
});
}
ts.getFirstConstructorWithBody = getFirstConstructorWithBody;
function shouldEmitToOwnFile(sourceFile, compilerOptions) {
if (!isDeclarationFile(sourceFile)) {
if ((isExternalModule(sourceFile) || !compilerOptions.out)) {
return compilerOptions.separateCompilation || !ts.fileExtensionIs(sourceFile.fileName, ".js");
}
return false;
}
return false;
}
ts.shouldEmitToOwnFile = shouldEmitToOwnFile;
function getAllAccessorDeclarations(declarations, accessor) {
var firstAccessor;
var secondAccessor;
var getAccessor;
var setAccessor;
if (hasDynamicName(accessor)) {
firstAccessor = accessor;
if (accessor.kind === 137) {
getAccessor = accessor;
}
else if (accessor.kind === 138) {
setAccessor = accessor;
}
else {
ts.Debug.fail("Accessor has wrong kind");
}
}
else {
ts.forEach(declarations, function (member) {
if ((member.kind === 137 || member.kind === 138)
&& (member.flags & 128) === (accessor.flags & 128)) {
var memberName = getPropertyNameForPropertyNameNode(member.name);
var accessorName = getPropertyNameForPropertyNameNode(accessor.name);
if (memberName === accessorName) {
if (!firstAccessor) {
firstAccessor = member;
}
else if (!secondAccessor) {
secondAccessor = member;
}
if (member.kind === 137 && !getAccessor) {
getAccessor = member;
}
if (member.kind === 138 && !setAccessor) {
setAccessor = member;
}
}
}
});
}
return {
firstAccessor: firstAccessor,
secondAccessor: secondAccessor,
getAccessor: getAccessor,
setAccessor: setAccessor
};
}
ts.getAllAccessorDeclarations = getAllAccessorDeclarations;
function emitNewLineBeforeLeadingComments(currentSourceFile, writer, node, leadingComments) {
if (leadingComments && leadingComments.length && node.pos !== leadingComments[0].pos &&
getLineOfLocalPosition(currentSourceFile, node.pos) !== getLineOfLocalPosition(currentSourceFile, leadingComments[0].pos)) {
writer.writeLine();
}
}
ts.emitNewLineBeforeLeadingComments = emitNewLineBeforeLeadingComments;
function emitComments(currentSourceFile, writer, comments, trailingSeparator, newLine, writeComment) {
var emitLeadingSpace = !trailingSeparator;
ts.forEach(comments, function (comment) {
if (emitLeadingSpace) {
writer.write(" ");
emitLeadingSpace = false;
}
writeComment(currentSourceFile, writer, comment, newLine);
if (comment.hasTrailingNewLine) {
writer.writeLine();
}
else if (trailingSeparator) {
writer.write(" ");
}
else {
emitLeadingSpace = true;
}
});
}
ts.emitComments = emitComments;
function writeCommentRange(currentSourceFile, writer, comment, newLine) {
if (currentSourceFile.text.charCodeAt(comment.pos + 1) === 42) {
var firstCommentLineAndCharacter = ts.getLineAndCharacterOfPosition(currentSourceFile, comment.pos);
var lineCount = ts.getLineStarts(currentSourceFile).length;
var firstCommentLineIndent;
for (var pos = comment.pos, currentLine = firstCommentLineAndCharacter.line; pos < comment.end; currentLine++) {
var nextLineStart = (currentLine + 1) === lineCount
? currentSourceFile.text.length + 1
: getStartPositionOfLine(currentLine + 1, currentSourceFile);
if (pos !== comment.pos) {
if (firstCommentLineIndent === undefined) {
firstCommentLineIndent = calculateIndent(getStartPositionOfLine(firstCommentLineAndCharacter.line, currentSourceFile), comment.pos);
}
var currentWriterIndentSpacing = writer.getIndent() * getIndentSize();
var spacesToEmit = currentWriterIndentSpacing - firstCommentLineIndent + calculateIndent(pos, nextLineStart);
if (spacesToEmit > 0) {
var numberOfSingleSpacesToEmit = spacesToEmit % getIndentSize();
var indentSizeSpaceString = getIndentString((spacesToEmit - numberOfSingleSpacesToEmit) / getIndentSize());
writer.rawWrite(indentSizeSpaceString);
while (numberOfSingleSpacesToEmit) {
writer.rawWrite(" ");
numberOfSingleSpacesToEmit--;
}
}
else {
writer.rawWrite("");
}
}
writeTrimmedCurrentLine(pos, nextLineStart);
pos = nextLineStart;
}
}
else {
writer.write(currentSourceFile.text.substring(comment.pos, comment.end));
}
function writeTrimmedCurrentLine(pos, nextLineStart) {
var end = Math.min(comment.end, nextLineStart - 1);
var currentLineText = currentSourceFile.text.substring(pos, end).replace(/^\s+|\s+$/g, '');
if (currentLineText) {
writer.write(currentLineText);
if (end !== comment.end) {
writer.writeLine();
}
}
else {
writer.writeLiteral(newLine);
}
}
function calculateIndent(pos, end) {
var currentLineIndent = 0;
for (; pos < end && ts.isWhiteSpace(currentSourceFile.text.charCodeAt(pos)); pos++) {
if (currentSourceFile.text.charCodeAt(pos) === 9) {
currentLineIndent += getIndentSize() - (currentLineIndent % getIndentSize());
}
else {
currentLineIndent++;
}
}
return currentLineIndent;
}
}
ts.writeCommentRange = writeCommentRange;
function modifierToFlag(token) {
switch (token) {
case 109: return 128;
case 108: return 16;
case 107: return 64;
case 106: return 32;
case 78: return 1;
case 115: return 2;
case 70: return 8192;
case 73: return 256;
}
return 0;
}
ts.modifierToFlag = modifierToFlag;
function isLeftHandSideExpression(expr) {
if (expr) {
switch (expr.kind) {
case 156:
case 157:
case 159:
case 158:
case 160:
case 154:
case 162:
case 155:
case 175:
case 163:
case 65:
case 9:
case 7:
case 8:
case 10:
case 172:
case 80:
case 89:
case 93:
case 95:
case 91:
return true;
}
}
return false;
}
ts.isLeftHandSideExpression = isLeftHandSideExpression;
function isAssignmentOperator(token) {
return token >= 53 && token <= 64;
}
ts.isAssignmentOperator = isAssignmentOperator;
function isSupportedExpressionWithTypeArguments(node) {
return isSupportedExpressionWithTypeArgumentsRest(node.expression);
}
ts.isSupportedExpressionWithTypeArguments = isSupportedExpressionWithTypeArguments;
function isSupportedExpressionWithTypeArgumentsRest(node) {
if (node.kind === 65) {
return true;
}
else if (node.kind === 156) {
return isSupportedExpressionWithTypeArgumentsRest(node.expression);
}
else {
return false;
}
}
function isRightSideOfQualifiedNameOrPropertyAccess(node) {
return (node.parent.kind === 127 && node.parent.right === node) ||
(node.parent.kind === 156 && node.parent.name === node);
}
ts.isRightSideOfQualifiedNameOrPropertyAccess = isRightSideOfQualifiedNameOrPropertyAccess;
function getLocalSymbolForExportDefault(symbol) {
return symbol && symbol.valueDeclaration && (symbol.valueDeclaration.flags & 256) ? symbol.valueDeclaration.localSymbol : undefined;
}
ts.getLocalSymbolForExportDefault = getLocalSymbolForExportDefault;
function getExpandedCharCodes(input) {
var output = [];
var length = input.length;
var leadSurrogate = undefined;
for (var i = 0; i < length; i++) {
var charCode = input.charCodeAt(i);
if (charCode < 0x80) {
output.push(charCode);
}
else if (charCode < 0x800) {
output.push((charCode >> 6) | 192);
output.push((charCode & 63) | 128);
}
else if (charCode < 0x10000) {
output.push((charCode >> 12) | 224);
output.push(((charCode >> 6) & 63) | 128);
output.push((charCode & 63) | 128);
}
else if (charCode < 0x20000) {
output.push((charCode >> 18) | 240);
output.push(((charCode >> 12) & 63) | 128);
output.push(((charCode >> 6) & 63) | 128);
output.push((charCode & 63) | 128);
}
else {
ts.Debug.assert(false, "Unexpected code point");
}
}
return output;
}
var base64Digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
function convertToBase64(input) {
var result = "";
var charCodes = getExpandedCharCodes(input);
var i = 0;
var length = charCodes.length;
var byte1, byte2, byte3, byte4;
while (i < length) {
byte1 = charCodes[i] >> 2;
byte2 = (charCodes[i] & 3) << 4 | charCodes[i + 1] >> 4;
byte3 = (charCodes[i + 1] & 15) << 2 | charCodes[i + 2] >> 6;
byte4 = charCodes[i + 2] & 63;
if (i + 1 >= length) {
byte3 = byte4 = 64;
}
else if (i + 2 >= length) {
byte4 = 64;
}
result += base64Digits.charAt(byte1) + base64Digits.charAt(byte2) + base64Digits.charAt(byte3) + base64Digits.charAt(byte4);
i += 3;
}
return result;
}
ts.convertToBase64 = convertToBase64;
})(ts || (ts = {}));
var ts;
(function (ts) {
function getDefaultLibFileName(options) {
return options.target === 2 ? "lib.es6.d.ts" : "lib.d.ts";
}
ts.getDefaultLibFileName = getDefaultLibFileName;
function textSpanEnd(span) {
return span.start + span.length;
}
ts.textSpanEnd = textSpanEnd;
function textSpanIsEmpty(span) {
return span.length === 0;
}
ts.textSpanIsEmpty = textSpanIsEmpty;
function textSpanContainsPosition(span, position) {
return position >= span.start && position < textSpanEnd(span);
}
ts.textSpanContainsPosition = textSpanContainsPosition;
function textSpanContainsTextSpan(span, other) {
return other.start >= span.start && textSpanEnd(other) <= textSpanEnd(span);
}
ts.textSpanContainsTextSpan = textSpanContainsTextSpan;
function textSpanOverlapsWith(span, other) {
var overlapStart = Math.max(span.start, other.start);
var overlapEnd = Math.min(textSpanEnd(span), textSpanEnd(other));
return overlapStart < overlapEnd;
}
ts.textSpanOverlapsWith = textSpanOverlapsWith;
function textSpanOverlap(span1, span2) {
var overlapStart = Math.max(span1.start, span2.start);
var overlapEnd = Math.min(textSpanEnd(span1), textSpanEnd(span2));
if (overlapStart < overlapEnd) {
return createTextSpanFromBounds(overlapStart, overlapEnd);
}
return undefined;
}
ts.textSpanOverlap = textSpanOverlap;
function textSpanIntersectsWithTextSpan(span, other) {
return other.start <= textSpanEnd(span) && textSpanEnd(other) >= span.start;
}
ts.textSpanIntersectsWithTextSpan = textSpanIntersectsWithTextSpan;
function textSpanIntersectsWith(span, start, length) {
var end = start + length;
return start <= textSpanEnd(span) && end >= span.start;
}
ts.textSpanIntersectsWith = textSpanIntersectsWith;
function textSpanIntersectsWithPosition(span, position) {
return position <= textSpanEnd(span) && position >= span.start;
}
ts.textSpanIntersectsWithPosition = textSpanIntersectsWithPosition;
function textSpanIntersection(span1, span2) {
var intersectStart = Math.max(span1.start, span2.start);
var intersectEnd = Math.min(textSpanEnd(span1), textSpanEnd(span2));
if (intersectStart <= intersectEnd) {
return createTextSpanFromBounds(intersectStart, intersectEnd);
}
return undefined;
}
ts.textSpanIntersection = textSpanIntersection;
function createTextSpan(start, length) {
if (start < 0) {
throw new Error("start < 0");
}
if (length < 0) {
throw new Error("length < 0");
}
return { start: start, length: length };
}
ts.createTextSpan = createTextSpan;
function createTextSpanFromBounds(start, end) {
return createTextSpan(start, end - start);
}
ts.createTextSpanFromBounds = createTextSpanFromBounds;
function textChangeRangeNewSpan(range) {
return createTextSpan(range.span.start, range.newLength);
}
ts.textChangeRangeNewSpan = textChangeRangeNewSpan;
function textChangeRangeIsUnchanged(range) {
return textSpanIsEmpty(range.span) && range.newLength === 0;
}
ts.textChangeRangeIsUnchanged = textChangeRangeIsUnchanged;
function createTextChangeRange(span, newLength) {
if (newLength < 0) {
throw new Error("newLength < 0");
}
return { span: span, newLength: newLength };
}
ts.createTextChangeRange = createTextChangeRange;
ts.unchangedTextChangeRange = createTextChangeRange(createTextSpan(0, 0), 0);
function collapseTextChangeRangesAcrossMultipleVersions(changes) {
if (changes.length === 0) {
return ts.unchangedTextChangeRange;
}
if (changes.length === 1) {
return changes[0];
}
var change0 = changes[0];
var oldStartN = change0.span.start;
var oldEndN = textSpanEnd(change0.span);
var newEndN = oldStartN + change0.newLength;
for (var i = 1; i < changes.length; i++) {
var nextChange = changes[i];
var oldStart1 = oldStartN;
var oldEnd1 = oldEndN;
var newEnd1 = newEndN;
var oldStart2 = nextChange.span.start;
var oldEnd2 = textSpanEnd(nextChange.span);
var newEnd2 = oldStart2 + nextChange.newLength;
oldStartN = Math.min(oldStart1, oldStart2);
oldEndN = Math.max(oldEnd1, oldEnd1 + (oldEnd2 - newEnd1));
newEndN = Math.max(newEnd2, newEnd2 + (newEnd1 - oldEnd2));
}
return createTextChangeRange(createTextSpanFromBounds(oldStartN, oldEndN), newEndN - oldStartN);
}
ts.collapseTextChangeRangesAcrossMultipleVersions = collapseTextChangeRangesAcrossMultipleVersions;
})(ts || (ts = {}));
/// <reference path="scanner.ts"/>
/// <reference path="utilities.ts"/>
var ts;
(function (ts) {
var nodeConstructors = new Array(230);
ts.parseTime = 0;
function getNodeConstructor(kind) {
return nodeConstructors[kind] || (nodeConstructors[kind] = ts.objectAllocator.getNodeConstructor(kind));
}
ts.getNodeConstructor = getNodeConstructor;
function createNode(kind) {
return new (getNodeConstructor(kind))();
}
ts.createNode = createNode;
function visitNode(cbNode, node) {
if (node) {
return cbNode(node);
}
}
function visitNodeArray(cbNodes, nodes) {
if (nodes) {
return cbNodes(nodes);
}
}
function visitEachNode(cbNode, nodes) {
if (nodes) {
for (var _i = 0; _i < nodes.length; _i++) {
var node = nodes[_i];
var result = cbNode(node);
if (result) {
return result;
}
}
}
}
function forEachChild(node, cbNode, cbNodeArray) {
if (!node) {
return;
}
var visitNodes = cbNodeArray ? visitNodeArray : visitEachNode;
var cbNodes = cbNodeArray || cbNode;
switch (node.kind) {
case 127:
return visitNode(cbNode, node.left) ||
visitNode(cbNode, node.right);
case 129:
return visitNode(cbNode, node.name) ||
visitNode(cbNode, node.constraint) ||
visitNode(cbNode, node.expression);
case 130:
case 133:
case 132:
case 225:
case 226:
case 199:
case 153:
return visitNodes(cbNodes, node.decorators) ||
visitNodes(cbNodes, node.modifiers) ||
visitNode(cbNode, node.propertyName) ||
visitNode(cbNode, node.dotDotDotToken) ||
visitNode(cbNode, node.name) ||
visitNode(cbNode, node.questionToken) ||
visitNode(cbNode, node.type) ||
visitNode(cbNode, node.initializer);
case 143:
case 144:
case 139:
case 140:
case 141:
return visitNodes(cbNodes, node.decorators) ||
visitNodes(cbNodes, node.modifiers) ||
visitNodes(cbNodes, node.typeParameters) ||
visitNodes(cbNodes, node.parameters) ||
visitNode(cbNode, node.type);
case 135:
case 134:
case 136:
case 137:
case 138:
case 163:
case 201:
case 164:
return visitNodes(cbNodes, node.decorators) ||
visitNodes(cbNodes, node.modifiers) ||
visitNode(cbNode, node.asteriskToken) ||
visitNode(cbNode, node.name) ||
visitNode(cbNode, node.questionToken) ||
visitNodes(cbNodes, node.typeParameters) ||
visitNodes(cbNodes, node.parameters) ||
visitNode(cbNode, node.type) ||
visitNode(cbNode, node.equalsGreaterThanToken) ||
visitNode(cbNode, node.body);
case 142:
return visitNode(cbNode, node.typeName) ||
visitNodes(cbNodes, node.typeArguments);
case 145:
return visitNode(cbNode, node.exprName);
case 146:
return visitNodes(cbNodes, node.members);
case 147:
return visitNode(cbNode, node.elementType);
case 148:
return visitNodes(cbNodes, node.elementTypes);
case 149:
return visitNodes(cbNodes, node.types);
case 150:
return visitNode(cbNode, node.type);
case 151:
case 152:
return visitNodes(cbNodes, node.elements);
case 154:
return visitNodes(cbNodes, node.elements);
case 155:
return visitNodes(cbNodes, node.properties);
case 156:
return visitNode(cbNode, node.expression) ||
visitNode(cbNode, node.dotToken) ||
visitNode(cbNode, node.name);
case 157:
return visitNode(cbNode, node.expression) ||
visitNode(cbNode, node.argumentExpression);
case 158:
case 159:
return visitNode(cbNode, node.expression) ||
visitNodes(cbNodes, node.typeArguments) ||
visitNodes(cbNodes, node.arguments);
case 160:
return visitNode(cbNode, node.tag) ||
visitNode(cbNode, node.template);
case 161:
return visitNode(cbNode, node.type) ||
visitNode(cbNode, node.expression);
case 162:
return visitNode(cbNode, node.expression);
case 165:
return visitNode(cbNode, node.expression);
case 166:
return visitNode(cbNode, node.expression);
case 167:
return visitNode(cbNode, node.expression);
case 168:
return visitNode(cbNode, node.operand);
case 173:
return visitNode(cbNode, node.asteriskToken) ||
visitNode(cbNode, node.expression);
case 169:
return visitNode(cbNode, node.operand);
case 170:
return visitNode(cbNode, node.left) ||
visitNode(cbNode, node.operatorToken) ||
visitNode(cbNode, node.right);
case 171:
return visitNode(cbNode, node.condition) ||
visitNode(cbNode, node.questionToken) ||
visitNode(cbNode, node.whenTrue) ||
visitNode(cbNode, node.colonToken) ||
visitNode(cbNode, node.whenFalse);
case 174:
return visitNode(cbNode, node.expression);
case 180:
case 207:
return visitNodes(cbNodes, node.statements);
case 228:
return visitNodes(cbNodes, node.statements) ||
visitNode(cbNode, node.endOfFileToken);
case 181:
return visitNodes(cbNodes, node.decorators) ||
visitNodes(cbNodes, node.modifiers) ||
visitNode(cbNode, node.declarationList);
case 200:
return visitNodes(cbNodes, node.declarations);
case 183:
return visitNode(cbNode, node.expression);
case 184:
return visitNode(cbNode, node.expression) ||
visitNode(cbNode, node.thenStatement) ||
visitNode(cbNode, node.elseStatement);
case 185:
return visitNode(cbNode, node.statement) ||
visitNode(cbNode, node.expression);
case 186:
return visitNode(cbNode, node.expression) ||
visitNode(cbNode, node.statement);
case 187:
return visitNode(cbNode, node.initializer) ||
visitNode(cbNode, node.condition) ||
visitNode(cbNode, node.incrementor) ||
visitNode(cbNode, node.statement);
case 188:
return visitNode(cbNode, node.initializer) ||
visitNode(cbNode, node.expression) ||
visitNode(cbNode, node.statement);
case 189:
return visitNode(cbNode, node.initializer) ||
visitNode(cbNode, node.expression) ||
visitNode(cbNode, node.statement);
case 190:
case 191:
return visitNode(cbNode, node.label);
case 192:
return visitNode(cbNode, node.expression);
case 193:
return visitNode(cbNode, node.expression) ||
visitNode(cbNode, node.statement);
case 194:
return visitNode(cbNode, node.expression) ||
visitNode(cbNode, node.caseBlock);
case 208:
return visitNodes(cbNodes, node.clauses);
case 221:
return visitNode(cbNode, node.expression) ||
visitNodes(cbNodes, node.statements);
case 222:
return visitNodes(cbNodes, node.statements);
case 195:
return visitNode(cbNode, node.label) ||
visitNode(cbNode, node.statement);
case 196:
return visitNode(cbNode, node.expression);
case 197:
return visitNode(cbNode, node.tryBlock) ||
visitNode(cbNode, node.catchClause) ||
visitNode(cbNode, node.finallyBlock);
case 224:
return visitNode(cbNode, node.variableDeclaration) ||
visitNode(cbNode, node.block);
case 131:
return visitNode(cbNode, node.expression);
case 202:
case 175:
return visitNodes(cbNodes, node.decorators) ||
visitNodes(cbNodes, node.modifiers) ||
visitNode(cbNode, node.name) ||
visitNodes(cbNodes, node.typeParameters) ||
visitNodes(cbNodes, node.heritageClauses) ||
visitNodes(cbNodes, node.members);
case 203:
return visitNodes(cbNodes, node.decorators) ||
visitNodes(cbNodes, node.modifiers) ||
visitNode(cbNode, node.name) ||
visitNodes(cbNodes, node.typeParameters) ||
visitNodes(cbNodes, node.heritageClauses) ||
visitNodes(cbNodes, node.members);
case 204:
return visitNodes(cbNodes, node.decorators) ||
visitNodes(cbNodes, node.modifiers) ||
visitNode(cbNode, node.name) ||
visitNode(cbNode, node.type);
case 205:
return visitNodes(cbNodes, node.decorators) ||
visitNodes(cbNodes, node.modifiers) ||
visitNode(cbNode, node.name) ||
visitNodes(cbNodes, node.members);
case 227:
return visitNode(cbNode, node.name) ||
visitNode(cbNode, node.initializer);
case 206:
return visitNodes(cbNodes, node.decorators) ||
visitNodes(cbNodes, node.modifiers) ||
visitNode(cbNode, node.name) ||
visitNode(cbNode, node.body);
case 209:
return visitNodes(cbNodes, node.decorators) ||
visitNodes(cbNodes, node.modifiers) ||
visitNode(cbNode, node.name) ||
visitNode(cbNode, node.moduleReference);
case 210:
return visitNodes(cbNodes, node.decorators) ||
visitNodes(cbNodes, node.modifiers) ||
visitNode(cbNode, node.importClause) ||
visitNode(cbNode, node.moduleSpecifier);
case 211:
return visitNode(cbNode, node.name) ||
visitNode(cbNode, node.namedBindings);
case 212:
return visitNode(cbNode, node.name);
case 213:
case 217:
return visitNodes(cbNodes, node.elements);
case 216:
return visitNodes(cbNodes, node.decorators) ||
visitNodes(cbNodes, node.modifiers) ||
visitNode(cbNode, node.exportClause) ||
visitNode(cbNode, node.moduleSpecifier);
case 214:
case 218:
return visitNode(cbNode, node.propertyName) ||
visitNode(cbNode, node.name);
case 215:
return visitNodes(cbNodes, node.decorators) ||
visitNodes(cbNodes, node.modifiers) ||
visitNode(cbNode, node.expression);
case 172:
return visitNode(cbNode, node.head) || visitNodes(cbNodes, node.templateSpans);
case 178:
return visitNode(cbNode, node.expression) || visitNode(cbNode, node.literal);
case 128:
return visitNode(cbNode, node.expression);
case 223:
return visitNodes(cbNodes, node.types);
case 177:
return visitNode(cbNode, node.expression) ||
visitNodes(cbNodes, node.typeArguments);
case 220:
return visitNode(cbNode, node.expression);
case 219:
return visitNodes(cbNodes, node.decorators);
}
}
ts.forEachChild = forEachChild;
function createSourceFile(fileName, sourceText, languageVersion, setParentNodes) {
if (setParentNodes === void 0) { setParentNodes = false; }
var start = new Date().getTime();
var result = Parser.parseSourceFile(fileName, sourceText, languageVersion, undefined, setParentNodes);
ts.parseTime += new Date().getTime() - start;
return result;
}
ts.createSourceFile = createSourceFile;
function updateSourceFile(sourceFile, newText, textChangeRange, aggressiveChecks) {
return IncrementalParser.updateSourceFile(sourceFile, newText, textChangeRange, aggressiveChecks);
}
ts.updateSourceFile = updateSourceFile;
var Parser;
(function (Parser) {
var scanner = ts.createScanner(2, true);
var disallowInAndDecoratorContext = 2 | 16;
var sourceFile;
var syntaxCursor;
var token;
var sourceText;
var nodeCount;
var identifiers;
var identifierCount;
var parsingContext;
var contextFlags = 0;
var parseErrorBeforeNextFinishedNode = false;
function parseSourceFile(fileName, _sourceText, languageVersion, _syntaxCursor, setParentNodes) {
sourceText = _sourceText;
syntaxCursor = _syntaxCursor;
parsingContext = 0;
identifiers = {};
identifierCount = 0;
nodeCount = 0;
contextFlags = 0;
parseErrorBeforeNextFinishedNode = false;
createSourceFile(fileName, languageVersion);
scanner.setText(sourceText);
scanner.setOnError(scanError);
scanner.setScriptTarget(languageVersion);
token = nextToken();
processReferenceComments(sourceFile);
sourceFile.statements = parseList(0, true, parseSourceElement);
ts.Debug.assert(token === 1);
sourceFile.endOfFileToken = parseTokenNode();
setExternalModuleIndicator(sourceFile);
sourceFile.nodeCount = nodeCount;
sourceFile.identifierCount = identifierCount;
sourceFile.identifiers = identifiers;
if (setParentNodes) {
fixupParentReferences(sourceFile);
}
syntaxCursor = undefined;
scanner.setText("");
scanner.setOnError(undefined);
var result = sourceFile;
sourceFile = undefined;
identifiers = undefined;
syntaxCursor = undefined;
sourceText = undefined;
return result;
}
Parser.parseSourceFile = parseSourceFile;
function fixupParentReferences(sourceFile) {
// normally parent references are set during binding. However, for clients that only need
// a syntax tree, and no semantic features, then the binding process is an unnecessary
// overhead. This functions allows us to set all the parents, without all the expense of
// binding.
var parent = sourceFile;
forEachChild(sourceFile, visitNode);
return;
function visitNode(n) {
if (n.parent !== parent) {
n.parent = parent;
var saveParent = parent;
parent = n;
forEachChild(n, visitNode);
parent = saveParent;
}
}
}
function createSourceFile(fileName, languageVersion) {
sourceFile = createNode(228, 0);
sourceFile.pos = 0;
sourceFile.end = sourceText.length;
sourceFile.text = sourceText;
sourceFile.parseDiagnostics = [];
sourceFile.bindDiagnostics = [];
sourceFile.languageVersion = languageVersion;
sourceFile.fileName = ts.normalizePath(fileName);
sourceFile.flags = ts.fileExtensionIs(sourceFile.fileName, ".d.ts") ? 2048 : 0;
}
function setContextFlag(val, flag) {
if (val) {
contextFlags |= flag;
}
else {
contextFlags &= ~flag;
}
}
function setStrictModeContext(val) {
setContextFlag(val, 1);
}
function setDisallowInContext(val) {
setContextFlag(val, 2);
}
function setYieldContext(val) {
setContextFlag(val, 4);
}
function setGeneratorParameterContext(val) {
setContextFlag(val, 8);
}
function setDecoratorContext(val) {
setContextFlag(val, 16);
}
function doOutsideOfContext(flags, func) {
var currentContextFlags = contextFlags & flags;
if (currentContextFlags) {
setContextFlag(false, currentContextFlags);
var result = func();
setContextFlag(true, currentContextFlags);
return result;
}
return func();
}
function allowInAnd(func) {
if (contextFlags & 2) {
setDisallowInContext(false);
var result = func();
setDisallowInContext(true);
return result;
}
return func();
}
function disallowInAnd(func) {
if (contextFlags & 2) {
return func();
}
setDisallowInContext(true);
var result = func();
setDisallowInContext(false);
return result;
}
function doInYieldContext(func) {
if (contextFlags & 4) {
return func();
}
setYieldContext(true);
var result = func();
setYieldContext(false);
return result;
}
function doOutsideOfYieldContext(func) {
if (contextFlags & 4) {
setYieldContext(false);
var result = func();
setYieldContext(true);
return result;
}
return func();
}
function doInDecoratorContext(func) {
if (contextFlags & 16) {
return func();
}
setDecoratorContext(true);
var result = func();
setDecoratorContext(false);
return result;
}
function inYieldContext() {
return (contextFlags & 4) !== 0;
}
function inStrictModeContext() {
return (contextFlags & 1) !== 0;
}
function inGeneratorParameterContext() {
return (contextFlags & 8) !== 0;
}
function inDisallowInContext() {
return (contextFlags & 2) !== 0;
}
function inDecoratorContext() {
return (contextFlags & 16) !== 0;
}
function parseErrorAtCurrentToken(message, arg0) {
var start = scanner.getTokenPos();
var length = scanner.getTextPos() - start;
parseErrorAtPosition(start, length, message, arg0);
}
function parseErrorAtPosition(start, length, message, arg0) {
var lastError = ts.lastOrUndefined(sourceFile.parseDiagnostics);
if (!lastError || start !== lastError.start) {
sourceFile.parseDiagnostics.push(ts.createFileDiagnostic(sourceFile, start, length, message, arg0));
}
parseErrorBeforeNextFinishedNode = true;
}
function scanError(message, length) {
var pos = scanner.getTextPos();
parseErrorAtPosition(pos, length || 0, message);
}
function getNodePos() {
return scanner.getStartPos();
}
function getNodeEnd() {
return scanner.getStartPos();
}
function nextToken() {
return token = scanner.scan();
}
function getTokenPos(pos) {
return ts.skipTrivia(sourceText, pos);
}
function reScanGreaterToken() {
return token = scanner.reScanGreaterToken();
}
function reScanSlashToken() {
return token = scanner.reScanSlashToken();
}
function reScanTemplateToken() {
return token = scanner.reScanTemplateToken();
}
function speculationHelper(callback, isLookAhead) {
var saveToken = token;
var saveParseDiagnosticsLength = sourceFile.parseDiagnostics.length;
var saveParseErrorBeforeNextFinishedNode = parseErrorBeforeNextFinishedNode;
var saveContextFlags = contextFlags;
var result = isLookAhead
? scanner.lookAhead(callback)
: scanner.tryScan(callback);
ts.Debug.assert(saveContextFlags === contextFlags);
if (!result || isLookAhead) {
token = saveToken;
sourceFile.parseDiagnostics.length = saveParseDiagnosticsLength;
parseErrorBeforeNextFinishedNode = saveParseErrorBeforeNextFinishedNode;
}
return result;
}
function lookAhead(callback) {
return speculationHelper(callback, true);
}
function tryParse(callback) {
return speculationHelper(callback, false);
}
function isIdentifier() {
if (token === 65) {
return true;
}
if (token === 110 && inYieldContext()) {
return false;
}
return token > 101;
}
function parseExpected(kind, diagnosticMessage) {
if (token === kind) {
nextToken();
return true;
}
if (diagnosticMessage) {
parseErrorAtCurrentToken(diagnosticMessage);
}
else {
parseErrorAtCurrentToken(ts.Diagnostics._0_expected, ts.tokenToString(kind));
}
return false;
}
function parseOptional(t) {
if (token === t) {
nextToken();
return true;
}
return false;
}
function parseOptionalToken(t) {
if (token === t) {
return parseTokenNode();
}
return undefined;
}
function parseExpectedToken(t, reportAtCurrentPosition, diagnosticMessage, arg0) {
return parseOptionalToken(t) ||
createMissingNode(t, reportAtCurrentPosition, diagnosticMessage, arg0);
}
function parseTokenNode() {
var node = createNode(token);
nextToken();
return finishNode(node);
}
function canParseSemicolon() {
if (token === 22) {
return true;
}
return token === 15 || token === 1 || scanner.hasPrecedingLineBreak();
}
function parseSemicolon() {
if (canParseSemicolon()) {
if (token === 22) {
nextToken();
}
return true;
}
else {
return parseExpected(22);
}
}
function createNode(kind, pos) {
nodeCount++;
var node = new (nodeConstructors[kind] || (nodeConstructors[kind] = ts.objectAllocator.getNodeConstructor(kind)))();
if (!(pos >= 0)) {
pos = scanner.getStartPos();
}
node.pos = pos;
node.end = pos;
return node;
}
function finishNode(node) {
node.end = scanner.getStartPos();
if (contextFlags) {
node.parserContextFlags = contextFlags;
}
if (parseErrorBeforeNextFinishedNode) {
parseErrorBeforeNextFinishedNode = false;
node.parserContextFlags |= 32;
}
return node;
}
function createMissingNode(kind, reportAtCurrentPosition, diagnosticMessage, arg0) {
if (reportAtCurrentPosition) {
parseErrorAtPosition(scanner.getStartPos(), 0, diagnosticMessage, arg0);
}
else {
parseErrorAtCurrentToken(diagnosticMessage, arg0);
}
var result = createNode(kind, scanner.getStartPos());
result.text = "";
return finishNode(result);
}
function internIdentifier(text) {
text = ts.escapeIdentifier(text);
return ts.hasProperty(identifiers, text) ? identifiers[text] : (identifiers[text] = text);
}
function createIdentifier(isIdentifier, diagnosticMessage) {
identifierCount++;
if (isIdentifier) {
var node = createNode(65);
if (token !== 65) {
node.originalKeywordKind = token;
}
node.text = internIdentifier(scanner.getTokenValue());
nextToken();
return finishNode(node);
}
return createMissingNode(65, false, diagnosticMessage || ts.Diagnostics.Identifier_expected);
}
function parseIdentifier(diagnosticMessage) {
return createIdentifier(isIdentifier(), diagnosticMessage);
}
function parseIdentifierName() {
return createIdentifier(isIdentifierOrKeyword());
}
function isLiteralPropertyName() {
return isIdentifierOrKeyword() ||
token === 8 ||
token === 7;
}
function parsePropertyName() {
if (token === 8 || token === 7) {
return parseLiteralNode(true);
}
if (token === 18) {
return parseComputedPropertyName();
}
return parseIdentifierName();
}
function parseComputedPropertyName() {
var node = createNode(128);
parseExpected(18);
var yieldContext = inYieldContext();
if (inGeneratorParameterContext()) {
setYieldContext(false);
}
node.expression = allowInAnd(parseExpression);
if (inGeneratorParameterContext()) {
setYieldContext(yieldContext);
}
parseExpected(19);
return finishNode(node);
}
function parseContextualModifier(t) {
return token === t && tryParse(nextTokenCanFollowModifier);
}
function nextTokenCanFollowModifier() {
if (token === 70) {
return nextToken() === 77;
}
if (token === 78) {
nextToken();
if (token === 73) {
return lookAhead(nextTokenIsClassOrFunction);
}
return token !== 35 && token !== 14 && canFollowModifier();
}
if (token === 73) {
return nextTokenIsClassOrFunction();
}
nextToken();
return canFollowModifier();
}
function parseAnyContextualModifier() {
return ts.isModifier(token) && tryParse(nextTokenCanFollowModifier);
}
function canFollowModifier() {
return token === 18
|| token === 14
|| token === 35
|| isLiteralPropertyName();
}
function nextTokenIsClassOrFunction() {
nextToken();
return token === 69 || token === 83;
}
function isListElement(parsingContext, inErrorRecovery) {
var node = currentNode(parsingContext);
if (node) {
return true;
}
switch (parsingContext) {
case 0:
case 1:
return isSourceElement(inErrorRecovery);
case 2:
case 4:
return isStartOfStatement(inErrorRecovery);
case 3:
return token === 67 || token === 73;
case 5:
return isStartOfTypeMember();
case 6:
return lookAhead(isClassMemberStart) || (token === 22 && !inErrorRecovery);
case 7:
return token === 18 || isLiteralPropertyName();
case 13:
return token === 18 || token === 35 || isLiteralPropertyName();
case 10:
return isLiteralPropertyName();
case 8:
if (token === 14) {
return lookAhead(isValidHeritageClauseObjectLiteral);
}
if (!inErrorRecovery) {
return isStartOfLeftHandSideExpression() && !isHeritageClauseExtendsOrImplementsKeyword();
}
else {
return isIdentifier() && !isHeritageClauseExtendsOrImplementsKeyword();
}
case 9:
return isIdentifierOrPattern();
case 11:
return token === 23 || token === 21 || isIdentifierOrPattern();
case 16:
return isIdentifier();
case 12:
case 14:
return token === 23 || token === 21 || isStartOfExpression();
case 15:
return isStartOfParameter();
case 17:
case 18:
return token === 23 || isStartOfType();
case 19:
return isHeritageClause();
case 20:
return isIdentifierOrKeyword();
}
ts.Debug.fail("Non-exhaustive case in 'isListElement'.");
}
function isValidHeritageClauseObjectLiteral() {
ts.Debug.assert(token === 14);
if (nextToken() === 15) {
var next = nextToken();
return next === 23 || next === 14 || next === 79 || next === 102;
}
return true;
}
function nextTokenIsIdentifier() {
nextToken();
return isIdentifier();
}
function isHeritageClauseExtendsOrImplementsKeyword() {
if (token === 102 ||
token === 79) {
return lookAhead(nextTokenIsStartOfExpression);
}
return false;
}
function nextTokenIsStartOfExpression() {
nextToken();
return isStartOfExpression();
}
function isListTerminator(kind) {
if (token === 1) {
return true;
}
switch (kind) {
case 1:
case 2:
case 3:
case 5:
case 6:
case 7:
case 13:
case 10:
case 20:
return token === 15;
case 4:
return token === 15 || token === 67 || token === 73;
case 8:
return token === 14 || token === 79 || token === 102;
case 9:
return isVariableDeclaratorListTerminator();
case 16:
return token === 25 || token === 16 || token === 14 || token === 79 || token === 102;
case 12:
return token === 17 || token === 22;
case 14:
case 18:
case 11:
return token === 19;
case 15:
return token === 17 || token === 19;
case 17:
return token === 25 || token === 16;
case 19:
return token === 14 || token === 15;
}
}
function isVariableDeclaratorListTerminator() {
if (canParseSemicolon()) {
return true;
}
if (isInOrOfKeyword(token)) {
return true;
}
if (token === 32) {
return true;
}
return false;
}
function isInSomeParsingContext() {
for (var kind = 0; kind < 21; kind++) {
if (parsingContext & (1 << kind)) {
if (isListElement(kind, true) || isListTerminator(kind)) {
return true;
}
}
}
return false;
}
function parseList(kind, checkForStrictMode, parseElement) {
var saveParsingContext = parsingContext;
parsingContext |= 1 << kind;
var result = [];
result.pos = getNodePos();
var savedStrictModeContext = inStrictModeContext();
while (!isListTerminator(kind)) {
if (isListElement(kind, false)) {
var element = parseListElement(kind, parseElement);
result.push(element);
if (checkForStrictMode && !inStrictModeContext()) {
if (ts.isPrologueDirective(element)) {
if (isUseStrictPrologueDirective(sourceFile, element)) {
setStrictModeContext(true);
checkForStrictMode = false;
}
}
else {
checkForStrictMode = false;
}
}
continue;
}
if (abortParsingListOrMoveToNextToken(kind)) {
break;
}
}
setStrictModeContext(savedStrictModeContext);
result.end = getNodeEnd();
parsingContext = saveParsingContext;
return result;
}
function isUseStrictPrologueDirective(sourceFile, node) {
ts.Debug.assert(ts.isPrologueDirective(node));
var nodeText = ts.getSourceTextOfNodeFromSourceFile(sourceFile, node.expression);
return nodeText === '"use strict"' || nodeText === "'use strict'";
}
function parseListElement(parsingContext, parseElement) {
var node = currentNode(parsingContext);
if (node) {
return consumeNode(node);
}
return parseElement();
}
function currentNode(parsingContext) {
if (parseErrorBeforeNextFinishedNode) {
return undefined;
}
if (!syntaxCursor) {
return undefined;
}
var node = syntaxCursor.currentNode(scanner.getStartPos());
if (ts.nodeIsMissing(node)) {
return undefined;
}
if (node.intersectsChange) {
return undefined;
}
if (ts.containsParseError(node)) {
return undefined;
}
var nodeContextFlags = node.parserContextFlags & 63;
if (nodeContextFlags !== contextFlags) {
return undefined;
}
if (!canReuseNode(node, parsingContext)) {
return undefined;
}
return node;
}
function consumeNode(node) {
scanner.setTextPos(node.end);
nextToken();
return node;
}
function canReuseNode(node, parsingContext) {
switch (parsingContext) {
case 1:
return isReusableModuleElement(node);
case 6:
return isReusableClassMember(node);
case 3:
return isReusableSwitchClause(node);
case 2:
case 4:
return isReusableStatement(node);
case 7:
return isReusableEnumMember(node);
case 5:
return isReusableTypeMember(node);
case 9:
return isReusableVariableDeclaration(node);
case 15:
return isReusableParameter(node);
case 19:
case 16:
case 18:
case 17:
case 12:
case 13:
case 8:
}
return false;
}
function isReusableModuleElement(node) {
if (node) {
switch (node.kind) {
case 210:
case 209:
case 216:
case 215:
case 202:
case 203:
case 206:
case 205:
return true;
}
return isReusableStatement(node);
}
return false;
}
function isReusableClassMember(node) {
if (node) {
switch (node.kind) {
case 136:
case 141:
case 135:
case 137:
case 138:
case 133:
case 179:
return true;
}
}
return false;
}
function isReusableSwitchClause(node) {
if (node) {
switch (node.kind) {
case 221:
case 222:
return true;
}
}
return false;
}
function isReusableStatement(node) {
if (node) {
switch (node.kind) {
case 201:
case 181:
case 180:
case 184:
case 183:
case 196:
case 192:
case 194:
case 191:
case 190:
case 188:
case 189:
case 187:
case 186:
case 193:
case 182:
case 197:
case 195:
case 185:
case 198:
return true;
}
}
return false;
}
function isReusableEnumMember(node) {
return node.kind === 227;
}
function isReusableTypeMember(node) {
if (node) {
switch (node.kind) {
case 140:
case 134:
case 141:
case 132:
case 139:
return true;
}
}
return false;
}
function isReusableVariableDeclaration(node) {
if (node.kind !== 199) {
return false;
}
var variableDeclarator = node;
return variableDeclarator.initializer === undefined;
}
function isReusableParameter(node) {
if (node.kind !== 130) {
return false;
}
var parameter = node;
return parameter.initializer === undefined;
}
function abortParsingListOrMoveToNextToken(kind) {
parseErrorAtCurrentToken(parsingContextErrors(kind));
if (isInSomeParsingContext()) {
return true;
}
nextToken();
return false;
}
function parsingContextErrors(context) {
switch (context) {
case 0: return ts.Diagnostics.Declaration_or_statement_expected;
case 1: return ts.Diagnostics.Declaration_or_statement_expected;
case 2: return ts.Diagnostics.Statement_expected;
case 3: return ts.Diagnostics.case_or_default_expected;
case 4: return ts.Diagnostics.Statement_expected;
case 5: return ts.Diagnostics.Property_or_signature_expected;
case 6: return ts.Diagnostics.Unexpected_token_A_constructor_method_accessor_or_property_was_expected;
case 7: return ts.Diagnostics.Enum_member_expected;
case 8: return ts.Diagnostics.Expression_expected;
case 9: return ts.Diagnostics.Variable_declaration_expected;
case 10: return ts.Diagnostics.Property_destructuring_pattern_expected;
case 11: return ts.Diagnostics.Array_element_destructuring_pattern_expected;
case 12: return ts.Diagnostics.Argument_expression_expected;
case 13: return ts.Diagnostics.Property_assignment_expected;
case 14: return ts.Diagnostics.Expression_or_comma_expected;
case 15: return ts.Diagnostics.Parameter_declaration_expected;
case 16: return ts.Diagnostics.Type_parameter_declaration_expected;
case 17: return ts.Diagnostics.Type_argument_expected;
case 18: return ts.Diagnostics.Type_expected;
case 19: return ts.Diagnostics.Unexpected_token_expected;
case 20: return ts.Diagnostics.Identifier_expected;
}
}
;
function parseDelimitedList(kind, parseElement, considerSemicolonAsDelimeter) {
var saveParsingContext = parsingContext;
parsingContext |= 1 << kind;
var result = [];
result.pos = getNodePos();
var commaStart = -1;
while (true) {
if (isListElement(kind, false)) {
result.push(parseListElement(kind, parseElement));
commaStart = scanner.getTokenPos();
if (parseOptional(23)) {
continue;
}
commaStart = -1;
if (isListTerminator(kind)) {
break;
}
parseExpected(23);
if (considerSemicolonAsDelimeter && token === 22 && !scanner.hasPrecedingLineBreak()) {
nextToken();
}
continue;
}
if (isListTerminator(kind)) {
break;
}
if (abortParsingListOrMoveToNextToken(kind)) {
break;
}
}
if (commaStart >= 0) {
result.hasTrailingComma = true;
}
result.end = getNodeEnd();
parsingContext = saveParsingContext;
return result;
}
function createMissingList() {
var pos = getNodePos();
var result = [];
result.pos = pos;
result.end = pos;
return result;
}
function parseBracketedList(kind, parseElement, open, close) {
if (parseExpected(open)) {
var result = parseDelimitedList(kind, parseElement);
parseExpected(close);
return result;
}
return createMissingList();
}
function parseEntityName(allowReservedWords, diagnosticMessage) {
var entity = parseIdentifier(diagnosticMessage);
while (parseOptional(20)) {
var node = createNode(127, entity.pos);
node.left = entity;
node.right = parseRightSideOfDot(allowReservedWords);
entity = finishNode(node);
}
return entity;
}
function parseRightSideOfDot(allowIdentifierNames) {
if (scanner.hasPrecedingLineBreak() && scanner.isReservedWord()) {
var matchesPattern = lookAhead(nextTokenIsIdentifierOrKeywordOnSameLine);
if (matchesPattern) {
return createMissingNode(65, true, ts.Diagnostics.Identifier_expected);
}
}
return allowIdentifierNames ? parseIdentifierName() : parseIdentifier();
}
function parseTemplateExpression() {
var template = createNode(172);
template.head = parseLiteralNode();
ts.Debug.assert(template.head.kind === 11, "Template head has wrong token kind");
var templateSpans = [];
templateSpans.pos = getNodePos();
do {
templateSpans.push(parseTemplateSpan());
} while (ts.lastOrUndefined(templateSpans).literal.kind === 12);
templateSpans.end = getNodeEnd();
template.templateSpans = templateSpans;
return finishNode(template);
}
function parseTemplateSpan() {
var span = createNode(178);
span.expression = allowInAnd(parseExpression);
var literal;
if (token === 15) {
reScanTemplateToken();
literal = parseLiteralNode();
}
else {
literal = parseExpectedToken(13, false, ts.Diagnostics._0_expected, ts.tokenToString(15));
}
span.literal = literal;
return finishNode(span);
}
function parseLiteralNode(internName) {
var node = createNode(token);
var text = scanner.getTokenValue();
node.text = internName ? internIdentifier(text) : text;
if (scanner.hasExtendedUnicodeEscape()) {
node.hasExtendedUnicodeEscape = true;
}
if (scanner.isUnterminated()) {
node.isUnterminated = true;
}
var tokenPos = scanner.getTokenPos();
nextToken();
finishNode(node);
if (node.kind === 7
&& sourceText.charCodeAt(tokenPos) === 48
&& ts.isOctalDigit(sourceText.charCodeAt(tokenPos + 1))) {
node.flags |= 16384;
}
return node;
}
function parseTypeReference() {
var node = createNode(142);
node.typeName = parseEntityName(false, ts.Diagnostics.Type_expected);
if (!scanner.hasPrecedingLineBreak() && token === 24) {
node.typeArguments = parseBracketedList(17, parseType, 24, 25);
}
return finishNode(node);
}
function parseTypeQuery() {
var node = createNode(145);
parseExpected(97);
node.exprName = parseEntityName(true);
return finishNode(node);
}
function parseTypeParameter() {
var node = createNode(129);
node.name = parseIdentifier();
if (parseOptional(79)) {
if (isStartOfType() || !isStartOfExpression()) {
node.constraint = parseType();
}
else {
node.expression = parseUnaryExpressionOrHigher();
}
}
return finishNode(node);
}
function parseTypeParameters() {
if (token === 24) {
return parseBracketedList(16, parseTypeParameter, 24, 25);
}
}
function parseParameterType() {
if (parseOptional(51)) {
return token === 8
? parseLiteralNode(true)
: parseType();
}
return undefined;
}
function isStartOfParameter() {
return token === 21 || isIdentifierOrPattern() || ts.isModifier(token) || token === 52;
}
function setModifiers(node, modifiers) {
if (modifiers) {
node.flags |= modifiers.flags;
node.modifiers = modifiers;
}
}
function parseParameter() {
var node = createNode(130);
node.decorators = parseDecorators();
setModifiers(node, parseModifiers());
node.dotDotDotToken = parseOptionalToken(21);
node.name = inGeneratorParameterContext() ? doInYieldContext(parseIdentifierOrPattern) : parseIdentifierOrPattern();
if (ts.getFullWidth(node.name) === 0 && node.flags === 0 && ts.isModifier(token)) {
nextToken();
}
node.questionToken = parseOptionalToken(50);
node.type = parseParameterType();
node.initializer = inGeneratorParameterContext() ? doOutsideOfYieldContext(parseParameterInitializer) : parseParameterInitializer();
return finishNode(node);
}
function parseParameterInitializer() {
return parseInitializer(true);
}
function fillSignature(returnToken, yieldAndGeneratorParameterContext, requireCompleteParameterList, signature) {
var returnTokenRequired = returnToken === 32;
signature.typeParameters = parseTypeParameters();
signature.parameters = parseParameterList(yieldAndGeneratorParameterContext, requireCompleteParameterList);
if (returnTokenRequired) {
parseExpected(returnToken);
signature.type = parseType();
}
else if (parseOptional(returnToken)) {
signature.type = parseType();
}
}
function parseParameterList(yieldAndGeneratorParameterContext, requireCompleteParameterList) {
if (parseExpected(16)) {
var savedYieldContext = inYieldContext();
var savedGeneratorParameterContext = inGeneratorParameterContext();
setYieldContext(yieldAndGeneratorParameterContext);
setGeneratorParameterContext(yieldAndGeneratorParameterContext);
var result = parseDelimitedList(15, parseParameter);
setYieldContext(savedYieldContext);
setGeneratorParameterContext(savedGeneratorParameterContext);
if (!parseExpected(17) && requireCompleteParameterList) {
return undefined;
}
return result;
}
return requireCompleteParameterList ? undefined : createMissingList();
}
function parseTypeMemberSemicolon() {
if (parseOptional(23)) {
return;
}
parseSemicolon();
}
function parseSignatureMember(kind) {
var node = createNode(kind);
if (kind === 140) {
parseExpected(88);
}
fillSignature(51, false, false, node);
parseTypeMemberSemicolon();
return finishNode(node);
}
function isIndexSignature() {
if (token !== 18) {
return false;
}
return lookAhead(isUnambiguouslyIndexSignature);
}
function isUnambiguouslyIndexSignature() {
nextToken();
if (token === 21 || token === 19) {
return true;
}
if (ts.isModifier(token)) {
nextToken();
if (isIdentifier()) {
return true;
}
}
else if (!isIdentifier()) {
return false;
}
else {
nextToken();
}
if (token === 51 || token === 23) {
return true;
}
if (token !== 50) {
return false;
}
nextToken();
return token === 51 || token === 23 || token === 19;
}
function parseIndexSignatureDeclaration(fullStart, decorators, modifiers) {
var node = createNode(141, fullStart);
node.decorators = decorators;
setModifiers(node, modifiers);
node.parameters = parseBracketedList(15, parseParameter, 18, 19);
node.type = parseTypeAnnotation();
parseTypeMemberSemicolon();
return finishNode(node);
}
function parsePropertyOrMethodSignature() {
var fullStart = scanner.getStartPos();
var name = parsePropertyName();
var questionToken = parseOptionalToken(50);
if (token === 16 || token === 24) {
var method = createNode(134, fullStart);
method.name = name;
method.questionToken = questionToken;
fillSignature(51, false, false, method);
parseTypeMemberSemicolon();
return finishNode(method);
}
else {
var property = createNode(132, fullStart);
property.name = name;
property.questionToken = questionToken;
property.type = parseTypeAnnotation();
parseTypeMemberSemicolon();
return finishNode(property);
}
}
function isStartOfTypeMember() {
switch (token) {
case 16:
case 24:
case 18:
return true;
default:
if (ts.isModifier(token)) {
var result = lookAhead(isStartOfIndexSignatureDeclaration);
if (result) {
return result;
}
}
return isLiteralPropertyName() && lookAhead(isTypeMemberWithLiteralPropertyName);
}
}
function isStartOfIndexSignatureDeclaration() {
while (ts.isModifier(token)) {
nextToken();
}
return isIndexSignature();
}
function isTypeMemberWithLiteralPropertyName() {
nextToken();
return token === 16 ||
token === 24 ||
token === 50 ||
token === 51 ||
canParseSemicolon();
}
function parseTypeMember() {
switch (token) {
case 16:
case 24:
return parseSignatureMember(139);
case 18:
return isIndexSignature()
? parseIndexSignatureDeclaration(scanner.getStartPos(), undefined, undefined)
: parsePropertyOrMethodSignature();
case 88:
if (lookAhead(isStartOfConstructSignature)) {
return parseSignatureMember(140);
}
case 8:
case 7:
return parsePropertyOrMethodSignature();
default:
if (ts.isModifier(token)) {
var result = tryParse(parseIndexSignatureWithModifiers);
if (result) {
return result;
}
}
if (isIdentifierOrKeyword()) {
return parsePropertyOrMethodSignature();
}
}
}
function parseIndexSignatureWithModifiers() {
var fullStart = scanner.getStartPos();
var decorators = parseDecorators();
var modifiers = parseModifiers();
return isIndexSignature()
? parseIndexSignatureDeclaration(fullStart, decorators, modifiers)
: undefined;
}
function isStartOfConstructSignature() {
nextToken();
return token === 16 || token === 24;
}
function parseTypeLiteral() {
var node = createNode(146);
node.members = parseObjectTypeMembers();
return finishNode(node);
}
function parseObjectTypeMembers() {
var members;
if (parseExpected(14)) {
members = parseList(5, false, parseTypeMember);
parseExpected(15);
}
else {
members = createMissingList();
}
return members;
}
function parseTupleType() {
var node = createNode(148);
node.elementTypes = parseBracketedList(18, parseType, 18, 19);
return finishNode(node);
}
function parseParenthesizedType() {
var node = createNode(150);
parseExpected(16);
node.type = parseType();
parseExpected(17);
return finishNode(node);
}
function parseFunctionOrConstructorType(kind) {
var node = createNode(kind);
if (kind === 144) {
parseExpected(88);
}
fillSignature(32, false, false, node);
return finishNode(node);
}
function parseKeywordAndNoDot() {
var node = parseTokenNode();
return token === 20 ? undefined : node;
}
function parseNonArrayType() {
switch (token) {
case 112:
case 122:
case 120:
case 113:
case 123:
var node = tryParse(parseKeywordAndNoDot);
return node || parseTypeReference();
case 99:
return parseTokenNode();
case 97:
return parseTypeQuery();
case 14:
return parseTypeLiteral();
case 18:
return parseTupleType();
case 16:
return parseParenthesizedType();
default:
return parseTypeReference();
}
}
function isStartOfType() {
switch (token) {
case 112:
case 122:
case 120:
case 113:
case 123:
case 99:
case 97:
case 14:
case 18:
case 24:
case 88:
return true;
case 16:
return lookAhead(isStartOfParenthesizedOrFunctionType);
default:
return isIdentifier();
}
}
function isStartOfParenthesizedOrFunctionType() {
nextToken();
return token === 17 || isStartOfParameter() || isStartOfType();
}
function parseArrayTypeOrHigher() {
var type = parseNonArrayType();
while (!scanner.hasPrecedingLineBreak() && parseOptional(18)) {
parseExpected(19);
var node = createNode(147, type.pos);
node.elementType = type;
type = finishNode(node);
}
return type;
}
function parseUnionTypeOrHigher() {
var type = parseArrayTypeOrHigher();
if (token === 44) {
var types = [type];
types.pos = type.pos;
while (parseOptional(44)) {
types.push(parseArrayTypeOrHigher());
}
types.end = getNodeEnd();
var node = createNode(149, type.pos);
node.types = types;
type = finishNode(node);
}
return type;
}
function isStartOfFunctionType() {
if (token === 24) {
return true;
}
return token === 16 && lookAhead(isUnambiguouslyStartOfFunctionType);
}
function isUnambiguouslyStartOfFunctionType() {
nextToken();
if (token === 17 || token === 21) {
return true;
}
if (isIdentifier() || ts.isModifier(token)) {
nextToken();
if (token === 51 || token === 23 ||
token === 50 || token === 53 ||
isIdentifier() || ts.isModifier(token)) {
return true;
}
if (token === 17) {
nextToken();
if (token === 32) {
return true;
}
}
}
return false;
}
function parseType() {
var savedYieldContext = inYieldContext();
var savedGeneratorParameterContext = inGeneratorParameterContext();
setYieldContext(false);
setGeneratorParameterContext(false);
var result = parseTypeWorker();
setYieldContext(savedYieldContext);
setGeneratorParameterContext(savedGeneratorParameterContext);
return result;
}
function parseTypeWorker() {
if (isStartOfFunctionType()) {
return parseFunctionOrConstructorType(143);
}
if (token === 88) {
return parseFunctionOrConstructorType(144);
}
return parseUnionTypeOrHigher();
}
function parseTypeAnnotation() {
return parseOptional(51) ? parseType() : undefined;
}
function isStartOfLeftHandSideExpression() {
switch (token) {
case 93:
case 91:
case 89:
case 95:
case 80:
case 7:
case 8:
case 10:
case 11:
case 16:
case 18:
case 14:
case 83:
case 69:
case 88:
case 36:
case 57:
case 65:
return true;
default:
return isIdentifier();
}
}
function isStartOfExpression() {
if (isStartOfLeftHandSideExpression()) {
return true;
}
switch (token) {
case 33:
case 34:
case 47:
case 46:
case 74:
case 97:
case 99:
case 38:
case 39:
case 24:
case 110:
return true;
default:
if (isBinaryOperator()) {
return true;
}
return isIdentifier();
}
}
function isStartOfExpressionStatement() {
return token !== 14 &&
token !== 83 &&
token !== 69 &&
token !== 52 &&
isStartOfExpression();
}
function parseExpression() {
// Expression[in]:
// AssignmentExpression[in]
// Expression[in] , AssignmentExpression[in]
var saveDecoratorContext = inDecoratorContext();
if (saveDecoratorContext) {
setDecoratorContext(false);
}
var expr = parseAssignmentExpressionOrHigher();
var operatorToken;
while ((operatorToken = parseOptionalToken(23))) {
expr = makeBinaryExpression(expr, operatorToken, parseAssignmentExpressionOrHigher());
}
if (saveDecoratorContext) {
setDecoratorContext(true);
}
return expr;
}
function parseInitializer(inParameter) {
if (token !== 53) {
if (scanner.hasPrecedingLineBreak() || (inParameter && token === 14) || !isStartOfExpression()) {
return undefined;
}
}
parseExpected(53);
return parseAssignmentExpressionOrHigher();
}
function parseAssignmentExpressionOrHigher() {
// AssignmentExpression[in,yield]:
// 1) ConditionalExpression[?in,?yield]
// 2) LeftHandSideExpression = AssignmentExpression[?in,?yield]
// 3) LeftHandSideExpression AssignmentOperator AssignmentExpression[?in,?yield]
// 4) ArrowFunctionExpression[?in,?yield]
// 5) [+Yield] YieldExpression[?In]
//
// Note: for ease of implementation we treat productions '2' and '3' as the same thing.
// (i.e. they're both BinaryExpressions with an assignment operator in it).
if (isYieldExpression()) {
return parseYieldExpression();
}
var arrowExpression = tryParseParenthesizedArrowFunctionExpression();
if (arrowExpression) {
return arrowExpression;
}
var expr = parseBinaryExpressionOrHigher(0);
if (expr.kind === 65 && token === 32) {
return parseSimpleArrowFunctionExpression(expr);
}
if (ts.isLeftHandSideExpression(expr) && ts.isAssignmentOperator(reScanGreaterToken())) {
return makeBinaryExpression(expr, parseTokenNode(), parseAssignmentExpressionOrHigher());
}
return parseConditionalExpressionRest(expr);
}
function isYieldExpression() {
if (token === 110) {
if (inYieldContext()) {
return true;
}
if (inStrictModeContext()) {
return true;
}
return lookAhead(nextTokenIsIdentifierOnSameLine);
}
return false;
}
function nextTokenIsIdentifierOnSameLine() {
nextToken();
return !scanner.hasPrecedingLineBreak() && isIdentifier();
}
function nextTokenIsIdentifierOrStartOfDestructuringOnTheSameLine() {
nextToken();
return !scanner.hasPrecedingLineBreak() &&
(isIdentifier() || token === 14 || token === 18);
}
function parseYieldExpression() {
var node = createNode(173);
nextToken();
if (!scanner.hasPrecedingLineBreak() &&
(token === 35 || isStartOfExpression())) {
node.asteriskToken = parseOptionalToken(35);
node.expression = parseAssignmentExpressionOrHigher();
return finishNode(node);
}
else {
return finishNode(node);
}
}
function parseSimpleArrowFunctionExpression(identifier) {
ts.Debug.assert(token === 32, "parseSimpleArrowFunctionExpression should only have been called if we had a =>");
var node = createNode(164, identifier.pos);
var parameter = createNode(130, identifier.pos);
parameter.name = identifier;
finishNode(parameter);
node.parameters = [parameter];
node.parameters.pos = parameter.pos;
node.parameters.end = parameter.end;
node.equalsGreaterThanToken = parseExpectedToken(32, false, ts.Diagnostics._0_expected, "=>");
node.body = parseArrowFunctionExpressionBody();
return finishNode(node);
}
function tryParseParenthesizedArrowFunctionExpression() {
var triState = isParenthesizedArrowFunctionExpression();
if (triState === 0) {
return undefined;
}
var arrowFunction = triState === 1
? parseParenthesizedArrowFunctionExpressionHead(true)
: tryParse(parsePossibleParenthesizedArrowFunctionExpressionHead);
if (!arrowFunction) {
return undefined;
}
var lastToken = token;
arrowFunction.equalsGreaterThanToken = parseExpectedToken(32, false, ts.Diagnostics._0_expected, "=>");
arrowFunction.body = (lastToken === 32 || lastToken === 14)
? parseArrowFunctionExpressionBody()
: parseIdentifier();
return finishNode(arrowFunction);
}
function isParenthesizedArrowFunctionExpression() {
if (token === 16 || token === 24) {
return lookAhead(isParenthesizedArrowFunctionExpressionWorker);
}
if (token === 32) {
return 1;
}
return 0;
}
function isParenthesizedArrowFunctionExpressionWorker() {
var first = token;
var second = nextToken();
if (first === 16) {
if (second === 17) {
var third = nextToken();
switch (third) {
case 32:
case 51:
case 14:
return 1;
default:
return 0;
}
}
if (second === 18 || second === 14) {
return 2;
}
if (second === 21) {
return 1;
}
if (!isIdentifier()) {
return 0;
}
if (nextToken() === 51) {
return 1;
}
return 2;
}
else {
ts.Debug.assert(first === 24);
if (!isIdentifier()) {
return 0;
}
return 2;
}
}
function parsePossibleParenthesizedArrowFunctionExpressionHead() {
return parseParenthesizedArrowFunctionExpressionHead(false);
}
function parseParenthesizedArrowFunctionExpressionHead(allowAmbiguity) {
var node = createNode(164);
fillSignature(51, false, !allowAmbiguity, node);
if (!node.parameters) {
return undefined;
}
if (!allowAmbiguity && token !== 32 && token !== 14) {
return undefined;
}
return node;
}
function parseArrowFunctionExpressionBody() {
if (token === 14) {
return parseFunctionBlock(false, false);
}
if (isStartOfStatement(true) &&
!isStartOfExpressionStatement() &&
token !== 83 &&
token !== 69) {
return parseFunctionBlock(false, true);
}
return parseAssignmentExpressionOrHigher();
}
function parseConditionalExpressionRest(leftOperand) {
var questionToken = parseOptionalToken(50);
if (!questionToken) {
return leftOperand;
}
var node = createNode(171, leftOperand.pos);
node.condition = leftOperand;
node.questionToken = questionToken;
node.whenTrue = doOutsideOfContext(disallowInAndDecoratorContext, parseAssignmentExpressionOrHigher);
node.colonToken = parseExpectedToken(51, false, ts.Diagnostics._0_expected, ts.tokenToString(51));
node.whenFalse = parseAssignmentExpressionOrHigher();
return finishNode(node);
}
function parseBinaryExpressionOrHigher(precedence) {
var leftOperand = parseUnaryExpressionOrHigher();
return parseBinaryExpressionRest(precedence, leftOperand);
}
function isInOrOfKeyword(t) {
return t === 86 || t === 126;
}
function parseBinaryExpressionRest(precedence, leftOperand) {
while (true) {
reScanGreaterToken();
var newPrecedence = getBinaryOperatorPrecedence();
if (newPrecedence <= precedence) {
break;
}
if (token === 86 && inDisallowInContext()) {
break;
}
leftOperand = makeBinaryExpression(leftOperand, parseTokenNode(), parseBinaryExpressionOrHigher(newPrecedence));
}
return leftOperand;
}
function isBinaryOperator() {
if (inDisallowInContext() && token === 86) {
return false;
}
return getBinaryOperatorPrecedence() > 0;
}
function getBinaryOperatorPrecedence() {
switch (token) {
case 49:
return 1;
case 48:
return 2;
case 44:
return 3;
case 45:
return 4;
case 43:
return 5;
case 28:
case 29:
case 30:
case 31:
return 6;
case 24:
case 25:
case 26:
case 27:
case 87:
case 86:
return 7;
case 40:
case 41:
case 42:
return 8;
case 33:
case 34:
return 9;
case 35:
case 36:
case 37:
return 10;
}
return -1;
}
function makeBinaryExpression(left, operatorToken, right) {
var node = createNode(170, left.pos);
node.left = left;
node.operatorToken = operatorToken;
node.right = right;
return finishNode(node);
}
function parsePrefixUnaryExpression() {
var node = createNode(168);
node.operator = token;
nextToken();
node.operand = parseUnaryExpressionOrHigher();
return finishNode(node);
}
function parseDeleteExpression() {
var node = createNode(165);
nextToken();
node.expression = parseUnaryExpressionOrHigher();
return finishNode(node);
}
function parseTypeOfExpression() {
var node = createNode(166);
nextToken();
node.expression = parseUnaryExpressionOrHigher();
return finishNode(node);
}
function parseVoidExpression() {
var node = createNode(167);
nextToken();
node.expression = parseUnaryExpressionOrHigher();
return finishNode(node);
}
function parseUnaryExpressionOrHigher() {
switch (token) {
case 33:
case 34:
case 47:
case 46:
case 38:
case 39:
return parsePrefixUnaryExpression();
case 74:
return parseDeleteExpression();
case 97:
return parseTypeOfExpression();
case 99:
return parseVoidExpression();
case 24:
return parseTypeAssertion();
default:
return parsePostfixExpressionOrHigher();
}
}
function parsePostfixExpressionOrHigher() {
var expression = parseLeftHandSideExpressionOrHigher();
ts.Debug.assert(ts.isLeftHandSideExpression(expression));
if ((token === 38 || token === 39) && !scanner.hasPrecedingLineBreak()) {
var node = createNode(169, expression.pos);
node.operand = expression;
node.operator = token;
nextToken();
return finishNode(node);
}
return expression;
}
function parseLeftHandSideExpressionOrHigher() {
var expression = token === 91
? parseSuperExpression()
: parseMemberExpressionOrHigher();
return parseCallExpressionRest(expression);
}
function parseMemberExpressionOrHigher() {
var expression = parsePrimaryExpression();
return parseMemberExpressionRest(expression);
}
function parseSuperExpression() {
var expression = parseTokenNode();
if (token === 16 || token === 20) {
return expression;
}
var node = createNode(156, expression.pos);
node.expression = expression;
node.dotToken = parseExpectedToken(20, false, ts.Diagnostics.super_must_be_followed_by_an_argument_list_or_member_access);
node.name = parseRightSideOfDot(true);
return finishNode(node);
}
function parseTypeAssertion() {
var node = createNode(161);
parseExpected(24);
node.type = parseType();
parseExpected(25);
node.expression = parseUnaryExpressionOrHigher();
return finishNode(node);
}
function parseMemberExpressionRest(expression) {
while (true) {
var dotToken = parseOptionalToken(20);
if (dotToken) {
var propertyAccess = createNode(156, expression.pos);
propertyAccess.expression = expression;
propertyAccess.dotToken = dotToken;
propertyAccess.name = parseRightSideOfDot(true);
expression = finishNode(propertyAccess);
continue;
}
if (!inDecoratorContext() && parseOptional(18)) {
var indexedAccess = createNode(157, expression.pos);
indexedAccess.expression = expression;
if (token !== 19) {
indexedAccess.argumentExpression = allowInAnd(parseExpression);
if (indexedAccess.argumentExpression.kind === 8 || indexedAccess.argumentExpression.kind === 7) {
var literal = indexedAccess.argumentExpression;
literal.text = internIdentifier(literal.text);
}
}
parseExpected(19);
expression = finishNode(indexedAccess);
continue;
}
if (token === 10 || token === 11) {
var tagExpression = createNode(160, expression.pos);
tagExpression.tag = expression;
tagExpression.template = token === 10
? parseLiteralNode()
: parseTemplateExpression();
expression = finishNode(tagExpression);
continue;
}
return expression;
}
}
function parseCallExpressionRest(expression) {
while (true) {
expression = parseMemberExpressionRest(expression);
if (token === 24) {
var typeArguments = tryParse(parseTypeArgumentsInExpression);
if (!typeArguments) {
return expression;
}
var callExpr = createNode(158, expression.pos);
callExpr.expression = expression;
callExpr.typeArguments = typeArguments;
callExpr.arguments = parseArgumentList();
expression = finishNode(callExpr);
continue;
}
else if (token === 16) {
var callExpr = createNode(158, expression.pos);
callExpr.expression = expression;
callExpr.arguments = parseArgumentList();
expression = finishNode(callExpr);
continue;
}
return expression;
}
}
function parseArgumentList() {
parseExpected(16);
var result = parseDelimitedList(12, parseArgumentExpression);
parseExpected(17);
return result;
}
function parseTypeArgumentsInExpression() {
if (!parseOptional(24)) {
return undefined;
}
var typeArguments = parseDelimitedList(17, parseType);
if (!parseExpected(25)) {
return undefined;
}
return typeArguments && canFollowTypeArgumentsInExpression()
? typeArguments
: undefined;
}
function canFollowTypeArgumentsInExpression() {
switch (token) {
case 16:
case 20:
case 17:
case 19:
case 51:
case 22:
case 50:
case 28:
case 30:
case 29:
case 31:
case 48:
case 49:
case 45:
case 43:
case 44:
case 15:
case 1:
return true;
case 23:
case 14:
default:
return false;
}
}
function parsePrimaryExpression() {
switch (token) {
case 7:
case 8:
case 10:
return parseLiteralNode();
case 93:
case 91:
case 89:
case 95:
case 80:
return parseTokenNode();
case 16:
return parseParenthesizedExpression();
case 18:
return parseArrayLiteralExpression();
case 14:
return parseObjectLiteralExpression();
case 69:
return parseClassExpression();
case 83:
return parseFunctionExpression();
case 88:
return parseNewExpression();
case 36:
case 57:
if (reScanSlashToken() === 9) {
return parseLiteralNode();
}
break;
case 11:
return parseTemplateExpression();
}
return parseIdentifier(ts.Diagnostics.Expression_expected);
}
function parseParenthesizedExpression() {
var node = createNode(162);
parseExpected(16);
node.expression = allowInAnd(parseExpression);
parseExpected(17);
return finishNode(node);
}
function parseSpreadElement() {
var node = createNode(174);
parseExpected(21);
node.expression = parseAssignmentExpressionOrHigher();
return finishNode(node);
}
function parseArgumentOrArrayLiteralElement() {
return token === 21 ? parseSpreadElement() :
token === 23 ? createNode(176) :
parseAssignmentExpressionOrHigher();
}
function parseArgumentExpression() {
return doOutsideOfContext(disallowInAndDecoratorContext, parseArgumentOrArrayLiteralElement);
}
function parseArrayLiteralExpression() {
var node = createNode(154);
parseExpected(18);
if (scanner.hasPrecedingLineBreak())
node.flags |= 512;
node.elements = parseDelimitedList(14, parseArgumentOrArrayLiteralElement);
parseExpected(19);
return finishNode(node);
}
function tryParseAccessorDeclaration(fullStart, decorators, modifiers) {
if (parseContextualModifier(116)) {
return parseAccessorDeclaration(137, fullStart, decorators, modifiers);
}
else if (parseContextualModifier(121)) {
return parseAccessorDeclaration(138, fullStart, decorators, modifiers);
}
return undefined;
}
function parseObjectLiteralElement() {
var fullStart = scanner.getStartPos();
var decorators = parseDecorators();
var modifiers = parseModifiers();
var accessor = tryParseAccessorDeclaration(fullStart, decorators, modifiers);
if (accessor) {
return accessor;
}
var asteriskToken = parseOptionalToken(35);
var tokenIsIdentifier = isIdentifier();
var nameToken = token;
var propertyName = parsePropertyName();
var questionToken = parseOptionalToken(50);
if (asteriskToken || token === 16 || token === 24) {
return parseMethodDeclaration(fullStart, decorators, modifiers, asteriskToken, propertyName, questionToken);
}
if ((token === 23 || token === 15) && tokenIsIdentifier) {
var shorthandDeclaration = createNode(226, fullStart);
shorthandDeclaration.name = propertyName;
shorthandDeclaration.questionToken = questionToken;
return finishNode(shorthandDeclaration);
}
else {
var propertyAssignment = createNode(225, fullStart);
propertyAssignment.name = propertyName;
propertyAssignment.questionToken = questionToken;
parseExpected(51);
propertyAssignment.initializer = allowInAnd(parseAssignmentExpressionOrHigher);
return finishNode(propertyAssignment);
}
}
function parseObjectLiteralExpression() {
var node = createNode(155);
parseExpected(14);
if (scanner.hasPrecedingLineBreak()) {
node.flags |= 512;
}
node.properties = parseDelimitedList(13, parseObjectLiteralElement, true);
parseExpected(15);
return finishNode(node);
}
function parseFunctionExpression() {
var saveDecoratorContext = inDecoratorContext();
if (saveDecoratorContext) {
setDecoratorContext(false);
}
var node = createNode(163);
parseExpected(83);
node.asteriskToken = parseOptionalToken(35);
node.name = node.asteriskToken ? doInYieldContext(parseOptionalIdentifier) : parseOptionalIdentifier();
fillSignature(51, !!node.asteriskToken, false, node);
node.body = parseFunctionBlock(!!node.asteriskToken, false);
if (saveDecoratorContext) {
setDecoratorContext(true);
}
return finishNode(node);
}
function parseOptionalIdentifier() {
return isIdentifier() ? parseIdentifier() : undefined;
}
function parseNewExpression() {
var node = createNode(159);
parseExpected(88);
node.expression = parseMemberExpressionOrHigher();
node.typeArguments = tryParse(parseTypeArgumentsInExpression);
if (node.typeArguments || token === 16) {
node.arguments = parseArgumentList();
}
return finishNode(node);
}
function parseBlock(ignoreMissingOpenBrace, checkForStrictMode, diagnosticMessage) {
var node = createNode(180);
if (parseExpected(14, diagnosticMessage) || ignoreMissingOpenBrace) {
node.statements = parseList(2, checkForStrictMode, parseStatement);
parseExpected(15);
}
else {
node.statements = createMissingList();
}
return finishNode(node);
}
function parseFunctionBlock(allowYield, ignoreMissingOpenBrace, diagnosticMessage) {
var savedYieldContext = inYieldContext();
setYieldContext(allowYield);
var saveDecoratorContext = inDecoratorContext();
if (saveDecoratorContext) {
setDecoratorContext(false);
}
var block = parseBlock(ignoreMissingOpenBrace, true, diagnosticMessage);
if (saveDecoratorContext) {
setDecoratorContext(true);
}
setYieldContext(savedYieldContext);
return block;
}
function parseEmptyStatement() {
var node = createNode(182);
parseExpected(22);
return finishNode(node);
}
function parseIfStatement() {
var node = createNode(184);
parseExpected(84);
parseExpected(16);
node.expression = allowInAnd(parseExpression);
parseExpected(17);
node.thenStatement = parseStatement();
node.elseStatement = parseOptional(76) ? parseStatement() : undefined;
return finishNode(node);
}
function parseDoStatement() {
var node = createNode(185);
parseExpected(75);
node.statement = parseStatement();
parseExpected(100);
parseExpected(16);
node.expression = allowInAnd(parseExpression);
parseExpected(17);
parseOptional(22);
return finishNode(node);
}
function parseWhileStatement() {
var node = createNode(186);
parseExpected(100);
parseExpected(16);
node.expression = allowInAnd(parseExpression);
parseExpected(17);
node.statement = parseStatement();
return finishNode(node);
}
function parseForOrForInOrForOfStatement() {
var pos = getNodePos();
parseExpected(82);
parseExpected(16);
var initializer = undefined;
if (token !== 22) {
if (token === 98 || token === 104 || token === 70) {
initializer = parseVariableDeclarationList(true);
}
else {
initializer = disallowInAnd(parseExpression);
}
}
var forOrForInOrForOfStatement;
if (parseOptional(86)) {
var forInStatement = createNode(188, pos);
forInStatement.initializer = initializer;
forInStatement.expression = allowInAnd(parseExpression);
parseExpected(17);
forOrForInOrForOfStatement = forInStatement;
}
else if (parseOptional(126)) {
var forOfStatement = createNode(189, pos);
forOfStatement.initializer = initializer;
forOfStatement.expression = allowInAnd(parseAssignmentExpressionOrHigher);
parseExpected(17);
forOrForInOrForOfStatement = forOfStatement;
}
else {
var forStatement = createNode(187, pos);
forStatement.initializer = initializer;
parseExpected(22);
if (token !== 22 && token !== 17) {
forStatement.condition = allowInAnd(parseExpression);
}
parseExpected(22);
if (token !== 17) {
forStatement.incrementor = allowInAnd(parseExpression);
}
parseExpected(17);
forOrForInOrForOfStatement = forStatement;
}
forOrForInOrForOfStatement.statement = parseStatement();
return finishNode(forOrForInOrForOfStatement);
}
function parseBreakOrContinueStatement(kind) {
var node = createNode(kind);
parseExpected(kind === 191 ? 66 : 71);
if (!canParseSemicolon()) {
node.label = parseIdentifier();
}
parseSemicolon();
return finishNode(node);
}
function parseReturnStatement() {
var node = createNode(192);
parseExpected(90);
if (!canParseSemicolon()) {
node.expression = allowInAnd(parseExpression);
}
parseSemicolon();
return finishNode(node);
}
function parseWithStatement() {
var node = createNode(193);
parseExpected(101);
parseExpected(16);
node.expression = allowInAnd(parseExpression);
parseExpected(17);
node.statement = parseStatement();
return finishNode(node);
}
function parseCaseClause() {
var node = createNode(221);
parseExpected(67);
node.expression = allowInAnd(parseExpression);
parseExpected(51);
node.statements = parseList(4, false, parseStatement);
return finishNode(node);
}
function parseDefaultClause() {
var node = createNode(222);
parseExpected(73);
parseExpected(51);
node.statements = parseList(4, false, parseStatement);
return finishNode(node);
}
function parseCaseOrDefaultClause() {
return token === 67 ? parseCaseClause() : parseDefaultClause();
}
function parseSwitchStatement() {
var node = createNode(194);
parseExpected(92);
parseExpected(16);
node.expression = allowInAnd(parseExpression);
parseExpected(17);
var caseBlock = createNode(208, scanner.getStartPos());
parseExpected(14);
caseBlock.clauses = parseList(3, false, parseCaseOrDefaultClause);
parseExpected(15);
node.caseBlock = finishNode(caseBlock);
return finishNode(node);
}
function parseThrowStatement() {
// ThrowStatement[Yield] :
// throw [no LineTerminator here]Expression[In, ?Yield];
var node = createNode(196);
parseExpected(94);
node.expression = scanner.hasPrecedingLineBreak() ? undefined : allowInAnd(parseExpression);
parseSemicolon();
return finishNode(node);
}
function parseTryStatement() {
var node = createNode(197);
parseExpected(96);
node.tryBlock = parseBlock(false, false);
node.catchClause = token === 68 ? parseCatchClause() : undefined;
if (!node.catchClause || token === 81) {
parseExpected(81);
node.finallyBlock = parseBlock(false, false);
}
return finishNode(node);
}
function parseCatchClause() {
var result = createNode(224);
parseExpected(68);
if (parseExpected(16)) {
result.variableDeclaration = parseVariableDeclaration();
}
parseExpected(17);
result.block = parseBlock(false, false);
return finishNode(result);
}
function parseDebuggerStatement() {
var node = createNode(198);
parseExpected(72);
parseSemicolon();
return finishNode(node);
}
function parseExpressionOrLabeledStatement() {
var fullStart = scanner.getStartPos();
var expression = allowInAnd(parseExpression);
if (expression.kind === 65 && parseOptional(51)) {
var labeledStatement = createNode(195, fullStart);
labeledStatement.label = expression;
labeledStatement.statement = parseStatement();
return finishNode(labeledStatement);
}
else {
var expressionStatement = createNode(183, fullStart);
expressionStatement.expression = expression;
parseSemicolon();
return finishNode(expressionStatement);
}
}
function isStartOfStatement(inErrorRecovery) {
if (ts.isModifier(token)) {
var result = lookAhead(parseVariableStatementOrFunctionDeclarationOrClassDeclarationWithDecoratorsOrModifiers);
if (result) {
return true;
}
}
switch (token) {
case 22:
return !inErrorRecovery;
case 14:
case 98:
case 104:
case 83:
case 69:
case 84:
case 75:
case 100:
case 82:
case 71:
case 66:
case 90:
case 101:
case 92:
case 94:
case 96:
case 72:
case 68:
case 81:
return true;
case 70:
var isConstEnum = lookAhead(nextTokenIsEnumKeyword);
return !isConstEnum;
case 103:
case 117:
case 118:
case 77:
case 124:
if (isDeclarationStart()) {
return false;
}
case 108:
case 106:
case 107:
case 109:
if (lookAhead(nextTokenIsIdentifierOrKeywordOnSameLine)) {
return false;
}
default:
return isStartOfExpression();
}
}
function nextTokenIsEnumKeyword() {
nextToken();
return token === 77;
}
function nextTokenIsIdentifierOrKeywordOnSameLine() {
nextToken();
return isIdentifierOrKeyword() && !scanner.hasPrecedingLineBreak();
}
function parseStatement() {
switch (token) {
case 14:
return parseBlock(false, false);
case 98:
case 70:
return parseVariableStatement(scanner.getStartPos(), undefined, undefined);
case 83:
return parseFunctionDeclaration(scanner.getStartPos(), undefined, undefined);
case 69:
return parseClassDeclaration(scanner.getStartPos(), undefined, undefined);
case 22:
return parseEmptyStatement();
case 84:
return parseIfStatement();
case 75:
return parseDoStatement();
case 100:
return parseWhileStatement();
case 82:
return parseForOrForInOrForOfStatement();
case 71:
return parseBreakOrContinueStatement(190);
case 66:
return parseBreakOrContinueStatement(191);
case 90:
return parseReturnStatement();
case 101:
return parseWithStatement();
case 92:
return parseSwitchStatement();
case 94:
return parseThrowStatement();
case 96:
case 68:
case 81:
return parseTryStatement();
case 72:
return parseDebuggerStatement();
case 104:
if (isLetDeclaration()) {
return parseVariableStatement(scanner.getStartPos(), undefined, undefined);
}
default:
if (ts.isModifier(token) || token === 52) {
var result = tryParse(parseVariableStatementOrFunctionDeclarationOrClassDeclarationWithDecoratorsOrModifiers);
if (result) {
return result;
}
}
return parseExpressionOrLabeledStatement();
}
}
function parseVariableStatementOrFunctionDeclarationOrClassDeclarationWithDecoratorsOrModifiers() {
var start = scanner.getStartPos();
var decorators = parseDecorators();
var modifiers = parseModifiers();
switch (token) {
case 70:
var nextTokenIsEnum = lookAhead(nextTokenIsEnumKeyword);
if (nextTokenIsEnum) {
return undefined;
}
return parseVariableStatement(start, decorators, modifiers);
case 104:
if (!isLetDeclaration()) {
return undefined;
}
return parseVariableStatement(start, decorators, modifiers);
case 98:
return parseVariableStatement(start, decorators, modifiers);
case 83:
return parseFunctionDeclaration(start, decorators, modifiers);
case 69:
return parseClassDeclaration(start, decorators, modifiers);
}
return undefined;
}
function parseFunctionBlockOrSemicolon(isGenerator, diagnosticMessage) {
if (token !== 14 && canParseSemicolon()) {
parseSemicolon();
return;
}
return parseFunctionBlock(isGenerator, false, diagnosticMessage);
}
function parseArrayBindingElement() {
if (token === 23) {
return createNode(176);
}
var node = createNode(153);
node.dotDotDotToken = parseOptionalToken(21);
node.name = parseIdentifierOrPattern();
node.initializer = parseInitializer(false);
return finishNode(node);
}
function parseObjectBindingElement() {
var node = createNode(153);
var tokenIsIdentifier = isIdentifier();
var propertyName = parsePropertyName();
if (tokenIsIdentifier && token !== 51) {
node.name = propertyName;
}
else {
parseExpected(51);
node.propertyName = propertyName;
node.name = parseIdentifierOrPattern();
}
node.initializer = parseInitializer(false);
return finishNode(node);
}
function parseObjectBindingPattern() {
var node = createNode(151);
parseExpected(14);
node.elements = parseDelimitedList(10, parseObjectBindingElement);
parseExpected(15);
return finishNode(node);
}
function parseArrayBindingPattern() {
var node = createNode(152);
parseExpected(18);
node.elements = parseDelimitedList(11, parseArrayBindingElement);
parseExpected(19);
return finishNode(node);
}
function isIdentifierOrPattern() {
return token === 14 || token === 18 || isIdentifier();
}
function parseIdentifierOrPattern() {
if (token === 18) {
return parseArrayBindingPattern();
}
if (token === 14) {
return parseObjectBindingPattern();
}
return parseIdentifier();
}
function parseVariableDeclaration() {
var node = createNode(199);
node.name = parseIdentifierOrPattern();
node.type = parseTypeAnnotation();
if (!isInOrOfKeyword(token)) {
node.initializer = parseInitializer(false);
}
return finishNode(node);
}
function parseVariableDeclarationList(inForStatementInitializer) {
var node = createNode(200);
switch (token) {
case 98:
break;
case 104:
node.flags |= 4096;
break;
case 70:
node.flags |= 8192;
break;
default:
ts.Debug.fail();
}
nextToken();
if (token === 126 && lookAhead(canFollowContextualOfKeyword)) {
node.declarations = createMissingList();
}
else {
var savedDisallowIn = inDisallowInContext();
setDisallowInContext(inForStatementInitializer);
node.declarations = parseDelimitedList(9, parseVariableDeclaration);
setDisallowInContext(savedDisallowIn);
}
return finishNode(node);
}
function canFollowContextualOfKeyword() {
return nextTokenIsIdentifier() && nextToken() === 17;
}
function parseVariableStatement(fullStart, decorators, modifiers) {
var node = createNode(181, fullStart);
node.decorators = decorators;
setModifiers(node, modifiers);
node.declarationList = parseVariableDeclarationList(false);
parseSemicolon();
return finishNode(node);
}
function parseFunctionDeclaration(fullStart, decorators, modifiers) {
var node = createNode(201, fullStart);
node.decorators = decorators;
setModifiers(node, modifiers);
parseExpected(83);
node.asteriskToken = parseOptionalToken(35);
node.name = node.flags & 256 ? parseOptionalIdentifier() : parseIdentifier();
fillSignature(51, !!node.asteriskToken, false, node);
node.body = parseFunctionBlockOrSemicolon(!!node.asteriskToken, ts.Diagnostics.or_expected);
return finishNode(node);
}
function parseConstructorDeclaration(pos, decorators, modifiers) {
var node = createNode(136, pos);
node.decorators = decorators;
setModifiers(node, modifiers);
parseExpected(114);
fillSignature(51, false, false, node);
node.body = parseFunctionBlockOrSemicolon(false, ts.Diagnostics.or_expected);
return finishNode(node);
}
function parseMethodDeclaration(fullStart, decorators, modifiers, asteriskToken, name, questionToken, diagnosticMessage) {
var method = createNode(135, fullStart);
method.decorators = decorators;
setModifiers(method, modifiers);
method.asteriskToken = asteriskToken;
method.name = name;
method.questionToken = questionToken;
fillSignature(51, !!asteriskToken, false, method);
method.body = parseFunctionBlockOrSemicolon(!!asteriskToken, diagnosticMessage);
return finishNode(method);
}
function parsePropertyDeclaration(fullStart, decorators, modifiers, name, questionToken) {
var property = createNode(133, fullStart);
property.decorators = decorators;
setModifiers(property, modifiers);
property.name = name;
property.questionToken = questionToken;
property.type = parseTypeAnnotation();
property.initializer = allowInAnd(parseNonParameterInitializer);
parseSemicolon();
return finishNode(property);
}
function parsePropertyOrMethodDeclaration(fullStart, decorators, modifiers) {
var asteriskToken = parseOptionalToken(35);
var name = parsePropertyName();
var questionToken = parseOptionalToken(50);
if (asteriskToken || token === 16 || token === 24) {
return parseMethodDeclaration(fullStart, decorators, modifiers, asteriskToken, name, questionToken, ts.Diagnostics.or_expected);
}
else {
return parsePropertyDeclaration(fullStart, decorators, modifiers, name, questionToken);
}
}
function parseNonParameterInitializer() {
return parseInitializer(false);
}
function parseAccessorDeclaration(kind, fullStart, decorators, modifiers) {
var node = createNode(kind, fullStart);
node.decorators = decorators;
setModifiers(node, modifiers);
node.name = parsePropertyName();
fillSignature(51, false, false, node);
node.body = parseFunctionBlockOrSemicolon(false);
return finishNode(node);
}
function isClassMemberModifier(idToken) {
switch (idToken) {
case 108:
case 106:
case 107:
case 109:
return true;
default:
return false;
}
}
function isClassMemberStart() {
var idToken;
if (token === 52) {
return true;
}
while (ts.isModifier(token)) {
idToken = token;
if (isClassMemberModifier(idToken)) {
return true;
}
nextToken();
}
if (token === 35) {
return true;
}
if (isLiteralPropertyName()) {
idToken = token;
nextToken();
}
if (token === 18) {
return true;
}
if (idToken !== undefined) {
if (!ts.isKeyword(idToken) || idToken === 121 || idToken === 116) {
return true;
}
switch (token) {
case 16:
case 24:
case 51:
case 53:
case 50:
return true;
default:
return canParseSemicolon();
}
}
return false;
}
function parseDecorators() {
var decorators;
while (true) {
var decoratorStart = getNodePos();
if (!parseOptional(52)) {
break;
}
if (!decorators) {
decorators = [];
decorators.pos = scanner.getStartPos();
}
var decorator = createNode(131, decoratorStart);
decorator.expression = doInDecoratorContext(parseLeftHandSideExpressionOrHigher);
decorators.push(finishNode(decorator));
}
if (decorators) {
decorators.end = getNodeEnd();
}
return decorators;
}
function parseModifiers() {
var flags = 0;
var modifiers;
while (true) {
var modifierStart = scanner.getStartPos();
var modifierKind = token;
if (!parseAnyContextualModifier()) {
break;
}
if (!modifiers) {
modifiers = [];
modifiers.pos = modifierStart;
}
flags |= ts.modifierToFlag(modifierKind);
modifiers.push(finishNode(createNode(modifierKind, modifierStart)));
}
if (modifiers) {
modifiers.flags = flags;
modifiers.end = scanner.getStartPos();
}
return modifiers;
}
function parseClassElement() {
if (token === 22) {
var result = createNode(179);
nextToken();
return finishNode(result);
}
var fullStart = getNodePos();
var decorators = parseDecorators();
var modifiers = parseModifiers();
var accessor = tryParseAccessorDeclaration(fullStart, decorators, modifiers);
if (accessor) {
return accessor;
}
if (token === 114) {
return parseConstructorDeclaration(fullStart, decorators, modifiers);
}
if (isIndexSignature()) {
return parseIndexSignatureDeclaration(fullStart, decorators, modifiers);
}
if (isIdentifierOrKeyword() ||
token === 8 ||
token === 7 ||
token === 35 ||
token === 18) {
return parsePropertyOrMethodDeclaration(fullStart, decorators, modifiers);
}
if (decorators) {
var name_3 = createMissingNode(65, true, ts.Diagnostics.Declaration_expected);
return parsePropertyDeclaration(fullStart, decorators, modifiers, name_3, undefined);
}
ts.Debug.fail("Should not have attempted to parse class member declaration.");
}
function parseClassExpression() {
return parseClassDeclarationOrExpression(scanner.getStartPos(), undefined, undefined, 175);
}
function parseClassDeclaration(fullStart, decorators, modifiers) {
return parseClassDeclarationOrExpression(fullStart, decorators, modifiers, 202);
}
function parseClassDeclarationOrExpression(fullStart, decorators, modifiers, kind) {
var savedStrictModeContext = inStrictModeContext();
setStrictModeContext(true);
var node = createNode(kind, fullStart);
node.decorators = decorators;
setModifiers(node, modifiers);
parseExpected(69);
node.name = parseOptionalIdentifier();
node.typeParameters = parseTypeParameters();
node.heritageClauses = parseHeritageClauses(true);
if (parseExpected(14)) {
node.members = inGeneratorParameterContext()
? doOutsideOfYieldContext(parseClassMembers)
: parseClassMembers();
parseExpected(15);
}
else {
node.members = createMissingList();
}
var finishedNode = finishNode(node);
setStrictModeContext(savedStrictModeContext);
return finishedNode;
}
function parseHeritageClauses(isClassHeritageClause) {
// ClassTail[Yield,GeneratorParameter] : See 14.5
// [~GeneratorParameter]ClassHeritage[?Yield]opt { ClassBody[?Yield]opt }
// [+GeneratorParameter] ClassHeritageopt { ClassBodyopt }
if (isHeritageClause()) {
return isClassHeritageClause && inGeneratorParameterContext()
? doOutsideOfYieldContext(parseHeritageClausesWorker)
: parseHeritageClausesWorker();
}
return undefined;
}
function parseHeritageClausesWorker() {
return parseList(19, false, parseHeritageClause);
}
function parseHeritageClause() {
if (token === 79 || token === 102) {
var node = createNode(223);
node.token = token;
nextToken();
node.types = parseDelimitedList(8, parseExpressionWithTypeArguments);
return finishNode(node);
}
return undefined;
}
function parseExpressionWithTypeArguments() {
var node = createNode(177);
node.expression = parseLeftHandSideExpressionOrHigher();
if (token === 24) {
node.typeArguments = parseBracketedList(17, parseType, 24, 25);
}
return finishNode(node);
}
function isHeritageClause() {
return token === 79 || token === 102;
}
function parseClassMembers() {
return parseList(6, false, parseClassElement);
}
function parseInterfaceDeclaration(fullStart, decorators, modifiers) {
var node = createNode(203, fullStart);
node.decorators = decorators;
setModifiers(node, modifiers);
parseExpected(103);
node.name = parseIdentifier();
node.typeParameters = parseTypeParameters();
node.heritageClauses = parseHeritageClauses(false);
node.members = parseObjectTypeMembers();
return finishNode(node);
}
function parseTypeAliasDeclaration(fullStart, decorators, modifiers) {
var node = createNode(204, fullStart);
node.decorators = decorators;
setModifiers(node, modifiers);
parseExpected(124);
node.name = parseIdentifier();
parseExpected(53);
node.type = parseType();
parseSemicolon();
return finishNode(node);
}
function parseEnumMember() {
var node = createNode(227, scanner.getStartPos());
node.name = parsePropertyName();
node.initializer = allowInAnd(parseNonParameterInitializer);
return finishNode(node);
}
function parseEnumDeclaration(fullStart, decorators, modifiers) {
var node = createNode(205, fullStart);
node.decorators = decorators;
setModifiers(node, modifiers);
parseExpected(77);
node.name = parseIdentifier();
if (parseExpected(14)) {
node.members = parseDelimitedList(7, parseEnumMember);
parseExpected(15);
}
else {
node.members = createMissingList();
}
return finishNode(node);
}
function parseModuleBlock() {
var node = createNode(207, scanner.getStartPos());
if (parseExpected(14)) {
node.statements = parseList(1, false, parseModuleElement);
parseExpected(15);
}
else {
node.statements = createMissingList();
}
return finishNode(node);
}
function parseModuleOrNamespaceDeclaration(fullStart, decorators, modifiers, flags) {
var node = createNode(206, fullStart);
node.decorators = decorators;
setModifiers(node, modifiers);
node.flags |= flags;
node.name = parseIdentifier();
node.body = parseOptional(20)
? parseModuleOrNamespaceDeclaration(getNodePos(), undefined, undefined, 1)
: parseModuleBlock();
return finishNode(node);
}
function parseAmbientExternalModuleDeclaration(fullStart, decorators, modifiers) {
var node = createNode(206, fullStart);
node.decorators = decorators;
setModifiers(node, modifiers);
node.name = parseLiteralNode(true);
node.body = parseModuleBlock();
return finishNode(node);
}
function parseModuleDeclaration(fullStart, decorators, modifiers) {
var flags = modifiers ? modifiers.flags : 0;
if (parseOptional(118)) {
flags |= 32768;
}
else {
parseExpected(117);
if (token === 8) {
return parseAmbientExternalModuleDeclaration(fullStart, decorators, modifiers);
}
}
return parseModuleOrNamespaceDeclaration(fullStart, decorators, modifiers, flags);
}
function isExternalModuleReference() {
return token === 119 &&
lookAhead(nextTokenIsOpenParen);
}
function nextTokenIsOpenParen() {
return nextToken() === 16;
}
function nextTokenIsCommaOrFromKeyword() {
nextToken();
return token === 23 ||
token === 125;
}
function parseImportDeclarationOrImportEqualsDeclaration(fullStart, decorators, modifiers) {
parseExpected(85);
var afterImportPos = scanner.getStartPos();
var identifier;
if (isIdentifier()) {
identifier = parseIdentifier();
if (token !== 23 && token !== 125) {
var importEqualsDeclaration = createNode(209, fullStart);
importEqualsDeclaration.decorators = decorators;
setModifiers(importEqualsDeclaration, modifiers);
importEqualsDeclaration.name = identifier;
parseExpected(53);
importEqualsDeclaration.moduleReference = parseModuleReference();
parseSemicolon();
return finishNode(importEqualsDeclaration);
}
}
var importDeclaration = createNode(210, fullStart);
importDeclaration.decorators = decorators;
setModifiers(importDeclaration, modifiers);
if (identifier ||
token === 35 ||
token === 14) {
importDeclaration.importClause = parseImportClause(identifier, afterImportPos);
parseExpected(125);
}
importDeclaration.moduleSpecifier = parseModuleSpecifier();
parseSemicolon();
return finishNode(importDeclaration);
}
function parseImportClause(identifier, fullStart) {
//ImportClause:
// ImportedDefaultBinding
// NameSpaceImport
// NamedImports
// ImportedDefaultBinding, NameSpaceImport
// ImportedDefaultBinding, NamedImports
var importClause = createNode(211, fullStart);
if (identifier) {
importClause.name = identifier;
}
if (!importClause.name ||
parseOptional(23)) {
importClause.namedBindings = token === 35 ? parseNamespaceImport() : parseNamedImportsOrExports(213);
}
return finishNode(importClause);
}
function parseModuleReference() {
return isExternalModuleReference()
? parseExternalModuleReference()
: parseEntityName(false);
}
function parseExternalModuleReference() {
var node = createNode(220);
parseExpected(119);
parseExpected(16);
node.expression = parseModuleSpecifier();
parseExpected(17);
return finishNode(node);
}
function parseModuleSpecifier() {
var result = parseExpression();
if (result.kind === 8) {
internIdentifier(result.text);
}
return result;
}
function parseNamespaceImport() {
var namespaceImport = createNode(212);
parseExpected(35);
parseExpected(111);
namespaceImport.name = parseIdentifier();
return finishNode(namespaceImport);
}
function parseNamedImportsOrExports(kind) {
var node = createNode(kind);
node.elements = parseBracketedList(20, kind === 213 ? parseImportSpecifier : parseExportSpecifier, 14, 15);
return finishNode(node);
}
function parseExportSpecifier() {
return parseImportOrExportSpecifier(218);
}
function parseImportSpecifier() {
return parseImportOrExportSpecifier(214);
}
function parseImportOrExportSpecifier(kind) {
var node = createNode(kind);
var checkIdentifierIsKeyword = ts.isKeyword(token) && !isIdentifier();
var checkIdentifierStart = scanner.getTokenPos();
var checkIdentifierEnd = scanner.getTextPos();
var identifierName = parseIdentifierName();
if (token === 111) {
node.propertyName = identifierName;
parseExpected(111);
checkIdentifierIsKeyword = ts.isKeyword(token) && !isIdentifier();
checkIdentifierStart = scanner.getTokenPos();
checkIdentifierEnd = scanner.getTextPos();
node.name = parseIdentifierName();
}
else {
node.name = identifierName;
}
if (kind === 214 && checkIdentifierIsKeyword) {
parseErrorAtPosition(checkIdentifierStart, checkIdentifierEnd - checkIdentifierStart, ts.Diagnostics.Identifier_expected);
}
return finishNode(node);
}
function parseExportDeclaration(fullStart, decorators, modifiers) {
var node = createNode(216, fullStart);
node.decorators = decorators;
setModifiers(node, modifiers);
if (parseOptional(35)) {
parseExpected(125);
node.moduleSpecifier = parseModuleSpecifier();
}
else {
node.exportClause = parseNamedImportsOrExports(217);
if (parseOptional(125)) {
node.moduleSpecifier = parseModuleSpecifier();
}
}
parseSemicolon();
return finishNode(node);
}
function parseExportAssignment(fullStart, decorators, modifiers) {
var node = createNode(215, fullStart);
node.decorators = decorators;
setModifiers(node, modifiers);
if (parseOptional(53)) {
node.isExportEquals = true;
}
else {
parseExpected(73);
}
node.expression = parseAssignmentExpressionOrHigher();
parseSemicolon();
return finishNode(node);
}
function isLetDeclaration() {
return inStrictModeContext() || lookAhead(nextTokenIsIdentifierOrStartOfDestructuringOnTheSameLine);
}
function isDeclarationStart(followsModifier) {
switch (token) {
case 98:
case 70:
case 83:
return true;
case 104:
return isLetDeclaration();
case 69:
case 103:
case 77:
case 124:
return lookAhead(nextTokenIsIdentifierOrKeyword);
case 85:
return lookAhead(nextTokenCanFollowImportKeyword);
case 117:
case 118:
return lookAhead(nextTokenIsIdentifierOrKeywordOrStringLiteral);
case 78:
return lookAhead(nextTokenCanFollowExportKeyword);
case 115:
case 108:
case 106:
case 107:
case 109:
return lookAhead(nextTokenIsDeclarationStart);
case 52:
return !followsModifier;
}
}
function isIdentifierOrKeyword() {
return token >= 65;
}
function nextTokenIsIdentifierOrKeyword() {
nextToken();
return isIdentifierOrKeyword();
}
function nextTokenIsIdentifierOrKeywordOrStringLiteral() {
nextToken();
return isIdentifierOrKeyword() || token === 8;
}
function nextTokenCanFollowImportKeyword() {
nextToken();
return isIdentifierOrKeyword() || token === 8 ||
token === 35 || token === 14;
}
function nextTokenCanFollowExportKeyword() {
nextToken();
return token === 53 || token === 35 ||
token === 14 || token === 73 || isDeclarationStart(true);
}
function nextTokenIsDeclarationStart() {
nextToken();
return isDeclarationStart(true);
}
function nextTokenIsAsKeyword() {
return nextToken() === 111;
}
function parseDeclaration() {
var fullStart = getNodePos();
var decorators = parseDecorators();
var modifiers = parseModifiers();
if (token === 78) {
nextToken();
if (token === 73 || token === 53) {
return parseExportAssignment(fullStart, decorators, modifiers);
}
if (token === 35 || token === 14) {
return parseExportDeclaration(fullStart, decorators, modifiers);
}
}
switch (token) {
case 98:
case 104:
case 70:
return parseVariableStatement(fullStart, decorators, modifiers);
case 83:
return parseFunctionDeclaration(fullStart, decorators, modifiers);
case 69:
return parseClassDeclaration(fullStart, decorators, modifiers);
case 103:
return parseInterfaceDeclaration(fullStart, decorators, modifiers);
case 124:
return parseTypeAliasDeclaration(fullStart, decorators, modifiers);
case 77:
return parseEnumDeclaration(fullStart, decorators, modifiers);
case 117:
case 118:
return parseModuleDeclaration(fullStart, decorators, modifiers);
case 85:
return parseImportDeclarationOrImportEqualsDeclaration(fullStart, decorators, modifiers);
default:
if (decorators) {
var node = createMissingNode(219, true, ts.Diagnostics.Declaration_expected);
node.pos = fullStart;
node.decorators = decorators;
setModifiers(node, modifiers);
return finishNode(node);
}
ts.Debug.fail("Mismatch between isDeclarationStart and parseDeclaration");
}
}
function isSourceElement(inErrorRecovery) {
return isDeclarationStart() || isStartOfStatement(inErrorRecovery);
}
function parseSourceElement() {
return parseSourceElementOrModuleElement();
}
function parseModuleElement() {
return parseSourceElementOrModuleElement();
}
function parseSourceElementOrModuleElement() {
return isDeclarationStart()
? parseDeclaration()
: parseStatement();
}
function processReferenceComments(sourceFile) {
var triviaScanner = ts.createScanner(sourceFile.languageVersion, false, sourceText);
var referencedFiles = [];
var amdDependencies = [];
var amdModuleName;
while (true) {
var kind = triviaScanner.scan();
if (kind === 5 || kind === 4 || kind === 3) {
continue;
}
if (kind !== 2) {
break;
}
var range = { pos: triviaScanner.getTokenPos(), end: triviaScanner.getTextPos(), kind: triviaScanner.getToken() };
var comment = sourceText.substring(range.pos, range.end);
var referencePathMatchResult = ts.getFileReferenceFromReferencePath(comment, range);
if (referencePathMatchResult) {
var fileReference = referencePathMatchResult.fileReference;
sourceFile.hasNoDefaultLib = referencePathMatchResult.isNoDefaultLib;
var diagnosticMessage = referencePathMatchResult.diagnosticMessage;
if (fileReference) {
referencedFiles.push(fileReference);
}
if (diagnosticMessage) {
sourceFile.parseDiagnostics.push(ts.createFileDiagnostic(sourceFile, range.pos, range.end - range.pos, diagnosticMessage));
}
}
else {
var amdModuleNameRegEx = /^\/\/\/\s*<amd-module\s+name\s*=\s*('|")(.+?)\1/gim;
var amdModuleNameMatchResult = amdModuleNameRegEx.exec(comment);
if (amdModuleNameMatchResult) {
if (amdModuleName) {
sourceFile.parseDiagnostics.push(ts.createFileDiagnostic(sourceFile, range.pos, range.end - range.pos, ts.Diagnostics.An_AMD_module_cannot_have_multiple_name_assignments));
}
amdModuleName = amdModuleNameMatchResult[2];
}
var amdDependencyRegEx = /^\/\/\/\s*<amd-dependency\s/gim;
var pathRegex = /\spath\s*=\s*('|")(.+?)\1/gim;
var nameRegex = /\sname\s*=\s*('|")(.+?)\1/gim;
var amdDependencyMatchResult = amdDependencyRegEx.exec(comment);
if (amdDependencyMatchResult) {
var pathMatchResult = pathRegex.exec(comment);
var nameMatchResult = nameRegex.exec(comment);
if (pathMatchResult) {
var amdDependency = { path: pathMatchResult[2], name: nameMatchResult ? nameMatchResult[2] : undefined };
amdDependencies.push(amdDependency);
}
}
}
}
sourceFile.referencedFiles = referencedFiles;
sourceFile.amdDependencies = amdDependencies;
sourceFile.amdModuleName = amdModuleName;
}
function setExternalModuleIndicator(sourceFile) {
sourceFile.externalModuleIndicator = ts.forEach(sourceFile.statements, function (node) {
return node.flags & 1
|| node.kind === 209 && node.moduleReference.kind === 220
|| node.kind === 210
|| node.kind === 215
|| node.kind === 216
? node
: undefined;
});
}
})(Parser || (Parser = {}));
var IncrementalParser;
(function (IncrementalParser) {
function updateSourceFile(sourceFile, newText, textChangeRange, aggressiveChecks) {
aggressiveChecks = aggressiveChecks || ts.Debug.shouldAssert(2);
checkChangeRange(sourceFile, newText, textChangeRange, aggressiveChecks);
if (ts.textChangeRangeIsUnchanged(textChangeRange)) {
return sourceFile;
}
if (sourceFile.statements.length === 0) {
return Parser.parseSourceFile(sourceFile.fileName, newText, sourceFile.languageVersion, undefined, true);
}
var incrementalSourceFile = sourceFile;
ts.Debug.assert(!incrementalSourceFile.hasBeenIncrementallyParsed);
incrementalSourceFile.hasBeenIncrementallyParsed = true;
var oldText = sourceFile.text;
var syntaxCursor = createSyntaxCursor(sourceFile);
var changeRange = extendToAffectedRange(sourceFile, textChangeRange);
checkChangeRange(sourceFile, newText, changeRange, aggressiveChecks);
ts.Debug.assert(changeRange.span.start <= textChangeRange.span.start);
ts.Debug.assert(ts.textSpanEnd(changeRange.span) === ts.textSpanEnd(textChangeRange.span));
ts.Debug.assert(ts.textSpanEnd(ts.textChangeRangeNewSpan(changeRange)) === ts.textSpanEnd(ts.textChangeRangeNewSpan(textChangeRange)));
var delta = ts.textChangeRangeNewSpan(changeRange).length - changeRange.span.length;
updateTokenPositionsAndMarkElements(incrementalSourceFile, changeRange.span.start, ts.textSpanEnd(changeRange.span), ts.textSpanEnd(ts.textChangeRangeNewSpan(changeRange)), delta, oldText, newText, aggressiveChecks);
var result = Parser.parseSourceFile(sourceFile.fileName, newText, sourceFile.languageVersion, syntaxCursor, true);
return result;
}
IncrementalParser.updateSourceFile = updateSourceFile;
function moveElementEntirelyPastChangeRange(element, isArray, delta, oldText, newText, aggressiveChecks) {
if (isArray) {
visitArray(element);
}
else {
visitNode(element);
}
return;
function visitNode(node) {
if (aggressiveChecks && shouldCheckNode(node)) {
var text = oldText.substring(node.pos, node.end);
}
node._children = undefined;
node.pos += delta;
node.end += delta;
if (aggressiveChecks && shouldCheckNode(node)) {
ts.Debug.assert(text === newText.substring(node.pos, node.end));
}
forEachChild(node, visitNode, visitArray);
checkNodePositions(node, aggressiveChecks);
}
function visitArray(array) {
array._children = undefined;
array.pos += delta;
array.end += delta;
for (var _i = 0; _i < array.length; _i++) {
var node = array[_i];
visitNode(node);
}
}
}
function shouldCheckNode(node) {
switch (node.kind) {
case 8:
case 7:
case 65:
return true;
}
return false;
}
function adjustIntersectingElement(element, changeStart, changeRangeOldEnd, changeRangeNewEnd, delta) {
ts.Debug.assert(element.end >= changeStart, "Adjusting an element that was entirely before the change range");
ts.Debug.assert(element.pos <= changeRangeOldEnd, "Adjusting an element that was entirely after the change range");
ts.Debug.assert(element.pos <= element.end);
element.pos = Math.min(element.pos, changeRangeNewEnd);
if (element.end >= changeRangeOldEnd) {
element.end += delta;
}
else {
element.end = Math.min(element.end, changeRangeNewEnd);
}
ts.Debug.assert(element.pos <= element.end);
if (element.parent) {
ts.Debug.assert(element.pos >= element.parent.pos);
ts.Debug.assert(element.end <= element.parent.end);
}
}
function checkNodePositions(node, aggressiveChecks) {
if (aggressiveChecks) {
var pos = node.pos;
forEachChild(node, function (child) {
ts.Debug.assert(child.pos >= pos);
pos = child.end;
});
ts.Debug.assert(pos <= node.end);
}
}
function updateTokenPositionsAndMarkElements(sourceFile, changeStart, changeRangeOldEnd, changeRangeNewEnd, delta, oldText, newText, aggressiveChecks) {
visitNode(sourceFile);
return;
function visitNode(child) {
ts.Debug.assert(child.pos <= child.end);
if (child.pos > changeRangeOldEnd) {
moveElementEntirelyPastChangeRange(child, false, delta, oldText, newText, aggressiveChecks);
return;
}
var fullEnd = child.end;
if (fullEnd >= changeStart) {
child.intersectsChange = true;
child._children = undefined;
adjustIntersectingElement(child, changeStart, changeRangeOldEnd, changeRangeNewEnd, delta);
forEachChild(child, visitNode, visitArray);
checkNodePositions(child, aggressiveChecks);
return;
}
ts.Debug.assert(fullEnd < changeStart);
}
function visitArray(array) {
ts.Debug.assert(array.pos <= array.end);
if (array.pos > changeRangeOldEnd) {
moveElementEntirelyPastChangeRange(array, true, delta, oldText, newText, aggressiveChecks);
return;
}
var fullEnd = array.end;
if (fullEnd >= changeStart) {
array.intersectsChange = true;
array._children = undefined;
adjustIntersectingElement(array, changeStart, changeRangeOldEnd, changeRangeNewEnd, delta);
for (var _i = 0; _i < array.length; _i++) {
var node = array[_i];
visitNode(node);
}
return;
}
ts.Debug.assert(fullEnd < changeStart);
}
}
function extendToAffectedRange(sourceFile, changeRange) {
var maxLookahead = 1;
var start = changeRange.span.start;
for (var i = 0; start > 0 && i <= maxLookahead; i++) {
var nearestNode = findNearestNodeStartingBeforeOrAtPosition(sourceFile, start);
ts.Debug.assert(nearestNode.pos <= start);
var position = nearestNode.pos;
start = Math.max(0, position - 1);
}
var finalSpan = ts.createTextSpanFromBounds(start, ts.textSpanEnd(changeRange.span));
var finalLength = changeRange.newLength + (changeRange.span.start - start);
return ts.createTextChangeRange(finalSpan, finalLength);
}
function findNearestNodeStartingBeforeOrAtPosition(sourceFile, position) {
var bestResult = sourceFile;
var lastNodeEntirelyBeforePosition;
forEachChild(sourceFile, visit);
if (lastNodeEntirelyBeforePosition) {
var lastChildOfLastEntireNodeBeforePosition = getLastChild(lastNodeEntirelyBeforePosition);
if (lastChildOfLastEntireNodeBeforePosition.pos > bestResult.pos) {
bestResult = lastChildOfLastEntireNodeBeforePosition;
}
}
return bestResult;
function getLastChild(node) {
while (true) {
var lastChild = getLastChildWorker(node);
if (lastChild) {
node = lastChild;
}
else {
return node;
}
}
}
function getLastChildWorker(node) {
var last = undefined;
forEachChild(node, function (child) {
if (ts.nodeIsPresent(child)) {
last = child;
}
});
return last;
}
function visit(child) {
if (ts.nodeIsMissing(child)) {
return;
}
if (child.pos <= position) {
if (child.pos >= bestResult.pos) {
bestResult = child;
}
if (position < child.end) {
forEachChild(child, visit);
return true;
}
else {
ts.Debug.assert(child.end <= position);
lastNodeEntirelyBeforePosition = child;
}
}
else {
ts.Debug.assert(child.pos > position);
return true;
}
}
}
function checkChangeRange(sourceFile, newText, textChangeRange, aggressiveChecks) {
var oldText = sourceFile.text;
if (textChangeRange) {
ts.Debug.assert((oldText.length - textChangeRange.span.length + textChangeRange.newLength) === newText.length);
if (aggressiveChecks || ts.Debug.shouldAssert(3)) {
var oldTextPrefix = oldText.substr(0, textChangeRange.span.start);
var newTextPrefix = newText.substr(0, textChangeRange.span.start);
ts.Debug.assert(oldTextPrefix === newTextPrefix);
var oldTextSuffix = oldText.substring(ts.textSpanEnd(textChangeRange.span), oldText.length);
var newTextSuffix = newText.substring(ts.textSpanEnd(ts.textChangeRangeNewSpan(textChangeRange)), newText.length);
ts.Debug.assert(oldTextSuffix === newTextSuffix);
}
}
}
function createSyntaxCursor(sourceFile) {
var currentArray = sourceFile.statements;
var currentArrayIndex = 0;
ts.Debug.assert(currentArrayIndex < currentArray.length);
var current = currentArray[currentArrayIndex];
var lastQueriedPosition = -1;
return {
currentNode: function (position) {
if (position !== lastQueriedPosition) {
if (current && current.end === position && currentArrayIndex < (currentArray.length - 1)) {
currentArrayIndex++;
current = currentArray[currentArrayIndex];
}
if (!current || current.pos !== position) {
findHighestListElementThatStartsAtPosition(position);
}
}
lastQueriedPosition = position;
ts.Debug.assert(!current || current.pos === position);
return current;
}
};
function findHighestListElementThatStartsAtPosition(position) {
currentArray = undefined;
currentArrayIndex = -1;
current = undefined;
forEachChild(sourceFile, visitNode, visitArray);
return;
function visitNode(node) {
if (position >= node.pos && position < node.end) {
forEachChild(node, visitNode, visitArray);
return true;
}
return false;
}
function visitArray(array) {
if (position >= array.pos && position < array.end) {
for (var i = 0, n = array.length; i < n; i++) {
var child = array[i];
if (child) {
if (child.pos === position) {
currentArray = array;
currentArrayIndex = i;
current = child;
return true;
}
else {
if (child.pos < position && position < child.end) {
forEachChild(child, visitNode, visitArray);
return true;
}
}
}
}
}
return false;
}
}
}
})(IncrementalParser || (IncrementalParser = {}));
})(ts || (ts = {}));
/// <reference path="binder.ts"/>
var ts;
(function (ts) {
var nextSymbolId = 1;
var nextNodeId = 1;
var nextMergeId = 1;
function getNodeId(node) {
if (!node.id)
node.id = nextNodeId++;
return node.id;
}
ts.getNodeId = getNodeId;
ts.checkTime = 0;
function getSymbolId(symbol) {
if (!symbol.id) {
symbol.id = nextSymbolId++;
}
return symbol.id;
}
ts.getSymbolId = getSymbolId;
function createTypeChecker(host, produceDiagnostics) {
var Symbol = ts.objectAllocator.getSymbolConstructor();
var Type = ts.objectAllocator.getTypeConstructor();
var Signature = ts.objectAllocator.getSignatureConstructor();
var typeCount = 0;
var emptyArray = [];
var emptySymbols = {};
var compilerOptions = host.getCompilerOptions();
var languageVersion = compilerOptions.target || 0;
var emitResolver = createResolver();
var undefinedSymbol = createSymbol(4 | 67108864, "undefined");
var argumentsSymbol = createSymbol(4 | 67108864, "arguments");
var checker = {
getNodeCount: function () { return ts.sum(host.getSourceFiles(), "nodeCount"); },
getIdentifierCount: function () { return ts.sum(host.getSourceFiles(), "identifierCount"); },
getSymbolCount: function () { return ts.sum(host.getSourceFiles(), "symbolCount"); },
getTypeCount: function () { return typeCount; },
isUndefinedSymbol: function (symbol) { return symbol === undefinedSymbol; },
isArgumentsSymbol: function (symbol) { return symbol === argumentsSymbol; },
getDiagnostics: getDiagnostics,
getGlobalDiagnostics: getGlobalDiagnostics,
getTypeOfSymbolAtLocation: getTypeOfSymbolAtLocation,
getDeclaredTypeOfSymbol: getDeclaredTypeOfSymbol,
getPropertiesOfType: getPropertiesOfType,
getPropertyOfType: getPropertyOfType,
getSignaturesOfType: getSignaturesOfType,
getIndexTypeOfType: getIndexTypeOfType,
getReturnTypeOfSignature: getReturnTypeOfSignature,
getSymbolsInScope: getSymbolsInScope,
getSymbolAtLocation: getSymbolAtLocation,
getShorthandAssignmentValueSymbol: getShorthandAssignmentValueSymbol,
getTypeAtLocation: getTypeAtLocation,
typeToString: typeToString,
getSymbolDisplayBuilder: getSymbolDisplayBuilder,
symbolToString: symbolToString,
getAugmentedPropertiesOfType: getAugmentedPropertiesOfType,
getRootSymbols: getRootSymbols,
getContextualType: getContextualType,
getFullyQualifiedName: getFullyQualifiedName,
getResolvedSignature: getResolvedSignature,
getConstantValue: getConstantValue,
isValidPropertyAccess: isValidPropertyAccess,
getSignatureFromDeclaration: getSignatureFromDeclaration,
isImplementationOfOverload: isImplementationOfOverload,
getAliasedSymbol: resolveAlias,
getEmitResolver: getEmitResolver,
getExportsOfModule: getExportsOfModuleAsArray
};
var unknownSymbol = createSymbol(4 | 67108864, "unknown");
var resolvingSymbol = createSymbol(67108864, "__resolving__");
var anyType = createIntrinsicType(1, "any");
var stringType = createIntrinsicType(2, "string");
var numberType = createIntrinsicType(4, "number");
var booleanType = createIntrinsicType(8, "boolean");
var esSymbolType = createIntrinsicType(1048576, "symbol");
var voidType = createIntrinsicType(16, "void");
var undefinedType = createIntrinsicType(32 | 262144, "undefined");
var nullType = createIntrinsicType(64 | 262144, "null");
var unknownType = createIntrinsicType(1, "unknown");
var emptyObjectType = createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, undefined, undefined);
var anyFunctionType = createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, undefined, undefined);
var noConstraintType = createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, undefined, undefined);
var anySignature = createSignature(undefined, undefined, emptyArray, anyType, 0, false, false);
var unknownSignature = createSignature(undefined, undefined, emptyArray, unknownType, 0, false, false);
var globals = {};
var globalArraySymbol;
var globalESSymbolConstructorSymbol;
var globalObjectType;
var globalFunctionType;
var globalArrayType;
var globalStringType;
var globalNumberType;
var globalBooleanType;
var globalRegExpType;
var globalTemplateStringsArrayType;
var globalESSymbolType;
var globalIterableType;
var anyArrayType;
var getGlobalClassDecoratorType;
var getGlobalParameterDecoratorType;
var getGlobalPropertyDecoratorType;
var getGlobalMethodDecoratorType;
var tupleTypes = {};
var unionTypes = {};
var stringLiteralTypes = {};
var emitExtends = false;
var emitDecorate = false;
var emitParam = false;
var resolutionTargets = [];
var resolutionResults = [];
var mergedSymbols = [];
var symbolLinks = [];
var nodeLinks = [];
var potentialThisCollisions = [];
var diagnostics = ts.createDiagnosticCollection();
var primitiveTypeInfo = {
"string": {
type: stringType,
flags: 258
},
"number": {
type: numberType,
flags: 132
},
"boolean": {
type: booleanType,
flags: 8
},
"symbol": {
type: esSymbolType,
flags: 1048576
}
};
function getEmitResolver(sourceFile) {
getDiagnostics(sourceFile);
return emitResolver;
}
function error(location, message, arg0, arg1, arg2) {
var diagnostic = location
? ts.createDiagnosticForNode(location, message, arg0, arg1, arg2)
: ts.createCompilerDiagnostic(message, arg0, arg1, arg2);
diagnostics.add(diagnostic);
}
function createSymbol(flags, name) {
return new Symbol(flags, name);
}
function getExcludedSymbolFlags(flags) {
var result = 0;
if (flags & 2)
result |= 107455;
if (flags & 1)
result |= 107454;
if (flags & 4)
result |= 107455;
if (flags & 8)
result |= 107455;
if (flags & 16)
result |= 106927;
if (flags & 32)
result |= 899583;
if (flags & 64)
result |= 792992;
if (flags & 256)
result |= 899327;
if (flags & 128)
result |= 899967;
if (flags & 512)
result |= 106639;
if (flags & 8192)
result |= 99263;
if (flags & 32768)
result |= 41919;
if (flags & 65536)
result |= 74687;
if (flags & 262144)
result |= 530912;
if (flags & 524288)
result |= 793056;
if (flags & 8388608)
result |= 8388608;
return result;
}
function recordMergedSymbol(target, source) {
if (!source.mergeId)
source.mergeId = nextMergeId++;
mergedSymbols[source.mergeId] = target;
}
function cloneSymbol(symbol) {
var result = createSymbol(symbol.flags | 33554432, symbol.name);
result.declarations = symbol.declarations.slice(0);
result.parent = symbol.parent;
if (symbol.valueDeclaration)
result.valueDeclaration = symbol.valueDeclaration;
if (symbol.constEnumOnlyModule)
result.constEnumOnlyModule = true;
if (symbol.members)
result.members = cloneSymbolTable(symbol.members);
if (symbol.exports)
result.exports = cloneSymbolTable(symbol.exports);
recordMergedSymbol(result, symbol);
return result;
}
function mergeSymbol(target, source) {
if (!(target.flags & getExcludedSymbolFlags(source.flags))) {
if (source.flags & 512 && target.flags & 512 && target.constEnumOnlyModule && !source.constEnumOnlyModule) {
target.constEnumOnlyModule = false;
}
target.flags |= source.flags;
if (!target.valueDeclaration && source.valueDeclaration)
target.valueDeclaration = source.valueDeclaration;
ts.forEach(source.declarations, function (node) {
target.declarations.push(node);
});
if (source.members) {
if (!target.members)
target.members = {};
mergeSymbolTable(target.members, source.members);
}
if (source.exports) {
if (!target.exports)
target.exports = {};
mergeSymbolTable(target.exports, source.exports);
}
recordMergedSymbol(target, source);
}
else {
var message = target.flags & 2 || source.flags & 2
? ts.Diagnostics.Cannot_redeclare_block_scoped_variable_0 : ts.Diagnostics.Duplicate_identifier_0;
ts.forEach(source.declarations, function (node) {
error(node.name ? node.name : node, message, symbolToString(source));
});
ts.forEach(target.declarations, function (node) {
error(node.name ? node.name : node, message, symbolToString(source));
});
}
}
function cloneSymbolTable(symbolTable) {
var result = {};
for (var id in symbolTable) {
if (ts.hasProperty(symbolTable, id)) {
result[id] = symbolTable[id];
}
}
return result;
}
function mergeSymbolTable(target, source) {
for (var id in source) {
if (ts.hasProperty(source, id)) {
if (!ts.hasProperty(target, id)) {
target[id] = source[id];
}
else {
var symbol = target[id];
if (!(symbol.flags & 33554432)) {
target[id] = symbol = cloneSymbol(symbol);
}
mergeSymbol(symbol, source[id]);
}
}
}
}
function getSymbolLinks(symbol) {
if (symbol.flags & 67108864)
return symbol;
var id = getSymbolId(symbol);
return symbolLinks[id] || (symbolLinks[id] = {});
}
function getNodeLinks(node) {
var nodeId = getNodeId(node);
return nodeLinks[nodeId] || (nodeLinks[nodeId] = {});
}
function getSourceFile(node) {
return ts.getAncestor(node, 228);
}
function isGlobalSourceFile(node) {
return node.kind === 228 && !ts.isExternalModule(node);
}
function getSymbol(symbols, name, meaning) {
if (meaning && ts.hasProperty(symbols, name)) {
var symbol = symbols[name];
ts.Debug.assert((symbol.flags & 16777216) === 0, "Should never get an instantiated symbol here.");
if (symbol.flags & meaning) {
return symbol;
}
if (symbol.flags & 8388608) {
var target = resolveAlias(symbol);
if (target === unknownSymbol || target.flags & meaning) {
return symbol;
}
}
}
}
function isDefinedBefore(node1, node2) {
var file1 = ts.getSourceFileOfNode(node1);
var file2 = ts.getSourceFileOfNode(node2);
if (file1 === file2) {
return node1.pos <= node2.pos;
}
if (!compilerOptions.out) {
return true;
}
var sourceFiles = host.getSourceFiles();
return sourceFiles.indexOf(file1) <= sourceFiles.indexOf(file2);
}
function resolveName(location, name, meaning, nameNotFoundMessage, nameArg) {
var result;
var lastLocation;
var propertyWithInvalidInitializer;
var errorLocation = location;
var grandparent;
loop: while (location) {
if (location.locals && !isGlobalSourceFile(location)) {
if (result = getSymbol(location.locals, name, meaning)) {
break loop;
}
}
switch (location.kind) {
case 228:
if (!ts.isExternalModule(location))
break;
case 206:
if (result = getSymbol(getSymbolOfNode(location).exports, name, meaning & 8914931)) {
if (result.flags & meaning || !(result.flags & 8388608 && getDeclarationOfAliasSymbol(result).kind === 218)) {
break loop;
}
result = undefined;
}
else if (location.kind === 228 ||
(location.kind === 206 && location.name.kind === 8)) {
result = getSymbolOfNode(location).exports["default"];
var localSymbol = ts.getLocalSymbolForExportDefault(result);
if (result && localSymbol && (result.flags & meaning) && localSymbol.name === name) {
break loop;
}
result = undefined;
}
break;
case 205:
if (result = getSymbol(getSymbolOfNode(location).exports, name, meaning & 8)) {
break loop;
}
break;
case 133:
case 132:
if (location.parent.kind === 202 && !(location.flags & 128)) {
var ctor = findConstructorDeclaration(location.parent);
if (ctor && ctor.locals) {
if (getSymbol(ctor.locals, name, meaning & 107455)) {
propertyWithInvalidInitializer = location;
}
}
}
break;
case 202:
case 203:
if (result = getSymbol(getSymbolOfNode(location).members, name, meaning & 793056)) {
if (lastLocation && lastLocation.flags & 128) {
error(errorLocation, ts.Diagnostics.Static_members_cannot_reference_class_type_parameters);
return undefined;
}
break loop;
}
break;
case 128:
grandparent = location.parent.parent;
if (grandparent.kind === 202 || grandparent.kind === 203) {
if (result = getSymbol(getSymbolOfNode(grandparent).members, name, meaning & 793056)) {
error(errorLocation, ts.Diagnostics.A_computed_property_name_cannot_reference_a_type_parameter_from_its_containing_type);
return undefined;
}
}
break;
case 135:
case 134:
case 136:
case 137:
case 138:
case 201:
case 164:
if (name === "arguments") {
result = argumentsSymbol;
break loop;
}
break;
case 163:
if (name === "arguments") {
result = argumentsSymbol;
break loop;
}
var functionName = location.name;
if (functionName && name === functionName.text) {
result = location.symbol;
break loop;
}
break;
case 175:
var className = location.name;
if (className && name === className.text) {
result = location.symbol;
break loop;
}
break;
case 131:
if (location.parent && location.parent.kind === 130) {
location = location.parent;
}
if (location.parent && ts.isClassElement(location.parent)) {
location = location.parent;
}
break;
}
lastLocation = location;
location = location.parent;
}
if (!result) {
result = getSymbol(globals, name, meaning);
}
if (!result) {
if (nameNotFoundMessage) {
error(errorLocation, nameNotFoundMessage, typeof nameArg === "string" ? nameArg : ts.declarationNameToString(nameArg));
}
return undefined;
}
if (nameNotFoundMessage) {
if (propertyWithInvalidInitializer) {
var propertyName = propertyWithInvalidInitializer.name;
error(errorLocation, ts.Diagnostics.Initializer_of_instance_member_variable_0_cannot_reference_identifier_1_declared_in_the_constructor, ts.declarationNameToString(propertyName), typeof nameArg === "string" ? nameArg : ts.declarationNameToString(nameArg));
return undefined;
}
if (result.flags & 2) {
checkResolvedBlockScopedVariable(result, errorLocation);
}
}
return result;
}
function checkResolvedBlockScopedVariable(result, errorLocation) {
ts.Debug.assert((result.flags & 2) !== 0);
var declaration = ts.forEach(result.declarations, function (d) { return ts.isBlockOrCatchScoped(d) ? d : undefined; });
ts.Debug.assert(declaration !== undefined, "Block-scoped variable declaration is undefined");
var isUsedBeforeDeclaration = !isDefinedBefore(declaration, errorLocation);
if (!isUsedBeforeDeclaration) {
var variableDeclaration = ts.getAncestor(declaration, 199);
var container = ts.getEnclosingBlockScopeContainer(variableDeclaration);
if (variableDeclaration.parent.parent.kind === 181 ||
variableDeclaration.parent.parent.kind === 187) {
isUsedBeforeDeclaration = isSameScopeDescendentOf(errorLocation, variableDeclaration, container);
}
else if (variableDeclaration.parent.parent.kind === 189 ||
variableDeclaration.parent.parent.kind === 188) {
var expression = variableDeclaration.parent.parent.expression;
isUsedBeforeDeclaration = isSameScopeDescendentOf(errorLocation, expression, container);
}
}
if (isUsedBeforeDeclaration) {
error(errorLocation, ts.Diagnostics.Block_scoped_variable_0_used_before_its_declaration, ts.declarationNameToString(declaration.name));
}
}
function isSameScopeDescendentOf(initial, parent, stopAt) {
if (!parent) {
return false;
}
for (var current = initial; current && current !== stopAt && !ts.isFunctionLike(current); current = current.parent) {
if (current === parent) {
return true;
}
}
return false;
}
function getAnyImportSyntax(node) {
if (ts.isAliasSymbolDeclaration(node)) {
if (node.kind === 209) {
return node;
}
while (node && node.kind !== 210) {
node = node.parent;
}
return node;
}
}
function getDeclarationOfAliasSymbol(symbol) {
return ts.forEach(symbol.declarations, function (d) { return ts.isAliasSymbolDeclaration(d) ? d : undefined; });
}
function getTargetOfImportEqualsDeclaration(node) {
if (node.moduleReference.kind === 220) {
return resolveExternalModuleSymbol(resolveExternalModuleName(node, ts.getExternalModuleImportEqualsDeclarationExpression(node)));
}
return getSymbolOfPartOfRightHandSideOfImportEquals(node.moduleReference, node);
}
function getTargetOfImportClause(node) {
var moduleSymbol = resolveExternalModuleName(node, node.parent.moduleSpecifier);
if (moduleSymbol) {
var exportDefaultSymbol = resolveSymbol(moduleSymbol.exports["default"]);
if (!exportDefaultSymbol) {
error(node.name, ts.Diagnostics.Module_0_has_no_default_export, symbolToString(moduleSymbol));
}
return exportDefaultSymbol;
}
}
function getTargetOfNamespaceImport(node) {
var moduleSpecifier = node.parent.parent.moduleSpecifier;
return resolveESModuleSymbol(resolveExternalModuleName(node, moduleSpecifier), moduleSpecifier);
}
function getMemberOfModuleVariable(moduleSymbol, name) {
if (moduleSymbol.flags & 3) {
var typeAnnotation = moduleSymbol.valueDeclaration.type;
if (typeAnnotation) {
return getPropertyOfType(getTypeFromTypeNode(typeAnnotation), name);
}
}
}
function combineValueAndTypeSymbols(valueSymbol, typeSymbol) {
if (valueSymbol.flags & (793056 | 1536)) {
return valueSymbol;
}
var result = createSymbol(valueSymbol.flags | typeSymbol.flags, valueSymbol.name);
result.declarations = ts.concatenate(valueSymbol.declarations, typeSymbol.declarations);
result.parent = valueSymbol.parent || typeSymbol.parent;
if (valueSymbol.valueDeclaration)
result.valueDeclaration = valueSymbol.valueDeclaration;
if (typeSymbol.members)
result.members = typeSymbol.members;
if (valueSymbol.exports)
result.exports = valueSymbol.exports;
return result;
}
function getExportOfModule(symbol, name) {
if (symbol.flags & 1536) {
var exports = getExportsOfSymbol(symbol);
if (ts.hasProperty(exports, name)) {
return resolveSymbol(exports[name]);
}
}
}
function getPropertyOfVariable(symbol, name) {
if (symbol.flags & 3) {
var typeAnnotation = symbol.valueDeclaration.type;
if (typeAnnotation) {
return resolveSymbol(getPropertyOfType(getTypeFromTypeNode(typeAnnotation), name));
}
}
}
function getExternalModuleMember(node, specifier) {
var moduleSymbol = resolveExternalModuleName(node, node.moduleSpecifier);
var targetSymbol = resolveESModuleSymbol(moduleSymbol, node.moduleSpecifier);
if (targetSymbol) {
var name_4 = specifier.propertyName || specifier.name;
if (name_4.text) {
var symbolFromModule = getExportOfModule(targetSymbol, name_4.text);
var symbolFromVariable = getPropertyOfVariable(targetSymbol, name_4.text);
var symbol = symbolFromModule && symbolFromVariable ?
combineValueAndTypeSymbols(symbolFromVariable, symbolFromModule) :
symbolFromModule || symbolFromVariable;
if (!symbol) {
error(name_4, ts.Diagnostics.Module_0_has_no_exported_member_1, getFullyQualifiedName(moduleSymbol), ts.declarationNameToString(name_4));
}
return symbol;
}
}
}
function getTargetOfImportSpecifier(node) {
return getExternalModuleMember(node.parent.parent.parent, node);
}
function getTargetOfExportSpecifier(node) {
return node.parent.parent.moduleSpecifier ?
getExternalModuleMember(node.parent.parent, node) :
resolveEntityName(node.propertyName || node.name, 107455 | 793056 | 1536);
}
function getTargetOfExportAssignment(node) {
return resolveEntityName(node.expression, 107455 | 793056 | 1536);
}
function getTargetOfAliasDeclaration(node) {
switch (node.kind) {
case 209:
return getTargetOfImportEqualsDeclaration(node);
case 211:
return getTargetOfImportClause(node);
case 212:
return getTargetOfNamespaceImport(node);
case 214:
return getTargetOfImportSpecifier(node);
case 218:
return getTargetOfExportSpecifier(node);
case 215:
return getTargetOfExportAssignment(node);
}
}
function resolveSymbol(symbol) {
return symbol && symbol.flags & 8388608 && !(symbol.flags & (107455 | 793056 | 1536)) ? resolveAlias(symbol) : symbol;
}
function resolveAlias(symbol) {
ts.Debug.assert((symbol.flags & 8388608) !== 0, "Should only get Alias here.");
var links = getSymbolLinks(symbol);
if (!links.target) {
links.target = resolvingSymbol;
var node = getDeclarationOfAliasSymbol(symbol);
var target = getTargetOfAliasDeclaration(node);
if (links.target === resolvingSymbol) {
links.target = target || unknownSymbol;
}
else {
error(node, ts.Diagnostics.Circular_definition_of_import_alias_0, symbolToString(symbol));
}
}
else if (links.target === resolvingSymbol) {
links.target = unknownSymbol;
}
return links.target;
}
function markExportAsReferenced(node) {
var symbol = getSymbolOfNode(node);
var target = resolveAlias(symbol);
if (target) {
var markAlias = (target === unknownSymbol && compilerOptions.separateCompilation) ||
(target !== unknownSymbol && (target.flags & 107455) && !isConstEnumOrConstEnumOnlyModule(target));
if (markAlias) {
markAliasSymbolAsReferenced(symbol);
}
}
}
function markAliasSymbolAsReferenced(symbol) {
var links = getSymbolLinks(symbol);
if (!links.referenced) {
links.referenced = true;
var node = getDeclarationOfAliasSymbol(symbol);
if (node.kind === 215) {
checkExpressionCached(node.expression);
}
else if (node.kind === 218) {
checkExpressionCached(node.propertyName || node.name);
}
else if (ts.isInternalModuleImportEqualsDeclaration(node)) {
checkExpressionCached(node.moduleReference);
}
}
}
function getSymbolOfPartOfRightHandSideOfImportEquals(entityName, importDeclaration) {
if (!importDeclaration) {
importDeclaration = ts.getAncestor(entityName, 209);
ts.Debug.assert(importDeclaration !== undefined);
}
if (entityName.kind === 65 && ts.isRightSideOfQualifiedNameOrPropertyAccess(entityName)) {
entityName = entityName.parent;
}
if (entityName.kind === 65 || entityName.parent.kind === 127) {
return resolveEntityName(entityName, 1536);
}
else {
ts.Debug.assert(entityName.parent.kind === 209);
return resolveEntityName(entityName, 107455 | 793056 | 1536);
}
}
function getFullyQualifiedName(symbol) {
return symbol.parent ? getFullyQualifiedName(symbol.parent) + "." + symbolToString(symbol) : symbolToString(symbol);
}
function resolveEntityName(name, meaning) {
if (ts.nodeIsMissing(name)) {
return undefined;
}
var symbol;
if (name.kind === 65) {
var message = meaning === 1536 ? ts.Diagnostics.Cannot_find_namespace_0 : ts.Diagnostics.Cannot_find_name_0;
symbol = resolveName(name, name.text, meaning, message, name);
if (!symbol) {
return undefined;
}
}
else if (name.kind === 127 || name.kind === 156) {
var left = name.kind === 127 ? name.left : name.expression;
var right = name.kind === 127 ? name.right : name.name;
var namespace = resolveEntityName(left, 1536);
if (!namespace || namespace === unknownSymbol || ts.nodeIsMissing(right)) {
return undefined;
}
symbol = getSymbol(getExportsOfSymbol(namespace), right.text, meaning);
if (!symbol) {
error(right, ts.Diagnostics.Module_0_has_no_exported_member_1, getFullyQualifiedName(namespace), ts.declarationNameToString(right));
return undefined;
}
}
else {
ts.Debug.fail("Unknown entity name kind.");
}
ts.Debug.assert((symbol.flags & 16777216) === 0, "Should never get an instantiated symbol here.");
return symbol.flags & meaning ? symbol : resolveAlias(symbol);
}
function isExternalModuleNameRelative(moduleName) {
return moduleName.substr(0, 2) === "./" || moduleName.substr(0, 3) === "../" || moduleName.substr(0, 2) === ".\\" || moduleName.substr(0, 3) === "..\\";
}
function resolveExternalModuleName(location, moduleReferenceExpression) {
if (moduleReferenceExpression.kind !== 8) {
return;
}
var moduleReferenceLiteral = moduleReferenceExpression;
var searchPath = ts.getDirectoryPath(getSourceFile(location).fileName);
var moduleName = ts.escapeIdentifier(moduleReferenceLiteral.text);
if (!moduleName)
return;
var isRelative = isExternalModuleNameRelative(moduleName);
if (!isRelative) {
var symbol = getSymbol(globals, '"' + moduleName + '"', 512);
if (symbol) {
return symbol;
}
}
var fileName;
var sourceFile;
while (true) {
fileName = ts.normalizePath(ts.combinePaths(searchPath, moduleName));
sourceFile = ts.forEach(ts.supportedExtensions, function (extension) { return host.getSourceFile(fileName + extension); });
if (sourceFile || isRelative) {
break;
}
var parentPath = ts.getDirectoryPath(searchPath);
if (parentPath === searchPath) {
break;
}
searchPath = parentPath;
}
if (sourceFile) {
if (sourceFile.symbol) {
return sourceFile.symbol;
}
error(moduleReferenceLiteral, ts.Diagnostics.File_0_is_not_a_module, sourceFile.fileName);
return;
}
error(moduleReferenceLiteral, ts.Diagnostics.Cannot_find_module_0, moduleName);
}
function resolveExternalModuleSymbol(moduleSymbol) {
return moduleSymbol && resolveSymbol(moduleSymbol.exports["export="]) || moduleSymbol;
}
function resolveESModuleSymbol(moduleSymbol, moduleReferenceExpression) {
var symbol = resolveExternalModuleSymbol(moduleSymbol);
if (symbol && !(symbol.flags & (1536 | 3))) {
error(moduleReferenceExpression, ts.Diagnostics.Module_0_resolves_to_a_non_module_entity_and_cannot_be_imported_using_this_construct, symbolToString(moduleSymbol));
symbol = undefined;
}
return symbol;
}
function getExportAssignmentSymbol(moduleSymbol) {
return moduleSymbol.exports["export="];
}
function getExportsOfModuleAsArray(moduleSymbol) {
return symbolsToArray(getExportsOfModule(moduleSymbol));
}
function getExportsOfSymbol(symbol) {
return symbol.flags & 1536 ? getExportsOfModule(symbol) : symbol.exports || emptySymbols;
}
function getExportsOfModule(moduleSymbol) {
var links = getSymbolLinks(moduleSymbol);
return links.resolvedExports || (links.resolvedExports = getExportsForModule(moduleSymbol));
}
function extendExportSymbols(target, source) {
for (var id in source) {
if (id !== "default" && !ts.hasProperty(target, id)) {
target[id] = source[id];
}
}
}
function getExportsForModule(moduleSymbol) {
var result;
var visitedSymbols = [];
visit(moduleSymbol);
return result || moduleSymbol.exports;
function visit(symbol) {
if (symbol && symbol.flags & 1952 && !ts.contains(visitedSymbols, symbol)) {
visitedSymbols.push(symbol);
if (symbol !== moduleSymbol) {
if (!result) {
result = cloneSymbolTable(moduleSymbol.exports);
}
extendExportSymbols(result, symbol.exports);
}
var exportStars = symbol.exports["__export"];
if (exportStars) {
for (var _i = 0, _a = exportStars.declarations; _i < _a.length; _i++) {
var node = _a[_i];
visit(resolveExternalModuleName(node, node.moduleSpecifier));
}
}
}
}
}
function getMergedSymbol(symbol) {
var merged;
return symbol && symbol.mergeId && (merged = mergedSymbols[symbol.mergeId]) ? merged : symbol;
}
function getSymbolOfNode(node) {
return getMergedSymbol(node.symbol);
}
function getParentOfSymbol(symbol) {
return getMergedSymbol(symbol.parent);
}
function getExportSymbolOfValueSymbolIfExported(symbol) {
return symbol && (symbol.flags & 1048576) !== 0
? getMergedSymbol(symbol.exportSymbol)
: symbol;
}
function symbolIsValue(symbol) {
if (symbol.flags & 16777216) {
return symbolIsValue(getSymbolLinks(symbol).target);
}
if (symbol.flags & 107455) {
return true;
}
if (symbol.flags & 8388608) {
return (resolveAlias(symbol).flags & 107455) !== 0;
}
return false;
}
function findConstructorDeclaration(node) {
var members = node.members;
for (var _i = 0; _i < members.length; _i++) {
var member = members[_i];
if (member.kind === 136 && ts.nodeIsPresent(member.body)) {
return member;
}
}
}
function createType(flags) {
var result = new Type(checker, flags);
result.id = typeCount++;
return result;
}
function createIntrinsicType(kind, intrinsicName) {
var type = createType(kind);
type.intrinsicName = intrinsicName;
return type;
}
function createObjectType(kind, symbol) {
var type = createType(kind);
type.symbol = symbol;
return type;
}
function isReservedMemberName(name) {
return name.charCodeAt(0) === 95 &&
name.charCodeAt(1) === 95 &&
name.charCodeAt(2) !== 95 &&
name.charCodeAt(2) !== 64;
}
function getNamedMembers(members) {
var result;
for (var id in members) {
if (ts.hasProperty(members, id)) {
if (!isReservedMemberName(id)) {
if (!result)
result = [];
var symbol = members[id];
if (symbolIsValue(symbol)) {
result.push(symbol);
}
}
}
}
return result || emptyArray;
}
function setObjectTypeMembers(type, members, callSignatures, constructSignatures, stringIndexType, numberIndexType) {
type.members = members;
type.properties = getNamedMembers(members);
type.callSignatures = callSignatures;
type.constructSignatures = constructSignatures;
if (stringIndexType)
type.stringIndexType = stringIndexType;
if (numberIndexType)
type.numberIndexType = numberIndexType;
return type;
}
function createAnonymousType(symbol, members, callSignatures, constructSignatures, stringIndexType, numberIndexType) {
return setObjectTypeMembers(createObjectType(32768, symbol), members, callSignatures, constructSignatures, stringIndexType, numberIndexType);
}
function forEachSymbolTableInScope(enclosingDeclaration, callback) {
var result;
for (var location_1 = enclosingDeclaration; location_1; location_1 = location_1.parent) {
if (location_1.locals && !isGlobalSourceFile(location_1)) {
if (result = callback(location_1.locals)) {
return result;
}
}
switch (location_1.kind) {
case 228:
if (!ts.isExternalModule(location_1)) {
break;
}
case 206:
if (result = callback(getSymbolOfNode(location_1).exports)) {
return result;
}
break;
case 202:
case 203:
if (result = callback(getSymbolOfNode(location_1).members)) {
return result;
}
break;
}
}
return callback(globals);
}
function getQualifiedLeftMeaning(rightMeaning) {
return rightMeaning === 107455 ? 107455 : 1536;
}
function getAccessibleSymbolChain(symbol, enclosingDeclaration, meaning, useOnlyExternalAliasing) {
function getAccessibleSymbolChainFromSymbolTable(symbols) {
function canQualifySymbol(symbolFromSymbolTable, meaning) {
if (!needsQualification(symbolFromSymbolTable, enclosingDeclaration, meaning)) {
return true;
}
var accessibleParent = getAccessibleSymbolChain(symbolFromSymbolTable.parent, enclosingDeclaration, getQualifiedLeftMeaning(meaning), useOnlyExternalAliasing);
return !!accessibleParent;
}
function isAccessible(symbolFromSymbolTable, resolvedAliasSymbol) {
if (symbol === (resolvedAliasSymbol || symbolFromSymbolTable)) {
return !ts.forEach(symbolFromSymbolTable.declarations, hasExternalModuleSymbol) &&
canQualifySymbol(symbolFromSymbolTable, meaning);
}
}
if (isAccessible(ts.lookUp(symbols, symbol.name))) {
return [symbol];
}
return ts.forEachValue(symbols, function (symbolFromSymbolTable) {
if (symbolFromSymbolTable.flags & 8388608 && symbolFromSymbolTable.name !== "export=") {
if (!useOnlyExternalAliasing ||
ts.forEach(symbolFromSymbolTable.declarations, ts.isExternalModuleImportEqualsDeclaration)) {
var resolvedImportedSymbol = resolveAlias(symbolFromSymbolTable);
if (isAccessible(symbolFromSymbolTable, resolveAlias(symbolFromSymbolTable))) {
return [symbolFromSymbolTable];
}
var accessibleSymbolsFromExports = resolvedImportedSymbol.exports ? getAccessibleSymbolChainFromSymbolTable(resolvedImportedSymbol.exports) : undefined;
if (accessibleSymbolsFromExports && canQualifySymbol(symbolFromSymbolTable, getQualifiedLeftMeaning(meaning))) {
return [symbolFromSymbolTable].concat(accessibleSymbolsFromExports);
}
}
}
});
}
if (symbol) {
return forEachSymbolTableInScope(enclosingDeclaration, getAccessibleSymbolChainFromSymbolTable);
}
}
function needsQualification(symbol, enclosingDeclaration, meaning) {
var qualify = false;
forEachSymbolTableInScope(enclosingDeclaration, function (symbolTable) {
if (!ts.hasProperty(symbolTable, symbol.name)) {
return false;
}
var symbolFromSymbolTable = symbolTable[symbol.name];
if (symbolFromSymbolTable === symbol) {
return true;
}
symbolFromSymbolTable = (symbolFromSymbolTable.flags & 8388608) ? resolveAlias(symbolFromSymbolTable) : symbolFromSymbolTable;
if (symbolFromSymbolTable.flags & meaning) {
qualify = true;
return true;
}
return false;
});
return qualify;
}
function isSymbolAccessible(symbol, enclosingDeclaration, meaning) {
if (symbol && enclosingDeclaration && !(symbol.flags & 262144)) {
var initialSymbol = symbol;
var meaningToLook = meaning;
while (symbol) {
var accessibleSymbolChain = getAccessibleSymbolChain(symbol, enclosingDeclaration, meaningToLook, false);
if (accessibleSymbolChain) {
var hasAccessibleDeclarations = hasVisibleDeclarations(accessibleSymbolChain[0]);
if (!hasAccessibleDeclarations) {
return {
accessibility: 1,
errorSymbolName: symbolToString(initialSymbol, enclosingDeclaration, meaning),
errorModuleName: symbol !== initialSymbol ? symbolToString(symbol, enclosingDeclaration, 1536) : undefined
};
}
return hasAccessibleDeclarations;
}
meaningToLook = getQualifiedLeftMeaning(meaning);
symbol = getParentOfSymbol(symbol);
}
var symbolExternalModule = ts.forEach(initialSymbol.declarations, getExternalModuleContainer);
if (symbolExternalModule) {
var enclosingExternalModule = getExternalModuleContainer(enclosingDeclaration);
if (symbolExternalModule !== enclosingExternalModule) {
return {
accessibility: 2,
errorSymbolName: symbolToString(initialSymbol, enclosingDeclaration, meaning),
errorModuleName: symbolToString(symbolExternalModule)
};
}
}
return {
accessibility: 1,
errorSymbolName: symbolToString(initialSymbol, enclosingDeclaration, meaning)
};
}
return { accessibility: 0 };
function getExternalModuleContainer(declaration) {
for (; declaration; declaration = declaration.parent) {
if (hasExternalModuleSymbol(declaration)) {
return getSymbolOfNode(declaration);
}
}
}
}
function hasExternalModuleSymbol(declaration) {
return (declaration.kind === 206 && declaration.name.kind === 8) ||
(declaration.kind === 228 && ts.isExternalModule(declaration));
}
function hasVisibleDeclarations(symbol) {
var aliasesToMakeVisible;
if (ts.forEach(symbol.declarations, function (declaration) { return !getIsDeclarationVisible(declaration); })) {
return undefined;
}
return { accessibility: 0, aliasesToMakeVisible: aliasesToMakeVisible };
function getIsDeclarationVisible(declaration) {
if (!isDeclarationVisible(declaration)) {
var anyImportSyntax = getAnyImportSyntax(declaration);
if (anyImportSyntax &&
!(anyImportSyntax.flags & 1) &&
isDeclarationVisible(anyImportSyntax.parent)) {
getNodeLinks(declaration).isVisible = true;
if (aliasesToMakeVisible) {
if (!ts.contains(aliasesToMakeVisible, anyImportSyntax)) {
aliasesToMakeVisible.push(anyImportSyntax);
}
}
else {
aliasesToMakeVisible = [anyImportSyntax];
}
return true;
}
return false;
}
return true;
}
}
function isEntityNameVisible(entityName, enclosingDeclaration) {
var meaning;
if (entityName.parent.kind === 145) {
meaning = 107455 | 1048576;
}
else if (entityName.kind === 127 || entityName.kind === 156 ||
entityName.parent.kind === 209) {
meaning = 1536;
}
else {
meaning = 793056;
}
var firstIdentifier = getFirstIdentifier(entityName);
var symbol = resolveName(enclosingDeclaration, firstIdentifier.text, meaning, undefined, undefined);
return (symbol && hasVisibleDeclarations(symbol)) || {
accessibility: 1,
errorSymbolName: ts.getTextOfNode(firstIdentifier),
errorNode: firstIdentifier
};
}
function writeKeyword(writer, kind) {
writer.writeKeyword(ts.tokenToString(kind));
}
function writePunctuation(writer, kind) {
writer.writePunctuation(ts.tokenToString(kind));
}
function writeSpace(writer) {
writer.writeSpace(" ");
}
function symbolToString(symbol, enclosingDeclaration, meaning) {
var writer = ts.getSingleLineStringWriter();
getSymbolDisplayBuilder().buildSymbolDisplay(symbol, writer, enclosingDeclaration, meaning);
var result = writer.string();
ts.releaseStringWriter(writer);
return result;
}
function typeToString(type, enclosingDeclaration, flags) {
var writer = ts.getSingleLineStringWriter();
getSymbolDisplayBuilder().buildTypeDisplay(type, writer, enclosingDeclaration, flags);
var result = writer.string();
ts.releaseStringWriter(writer);
var maxLength = compilerOptions.noErrorTruncation || flags & 4 ? undefined : 100;
if (maxLength && result.length >= maxLength) {
result = result.substr(0, maxLength - "...".length) + "...";
}
return result;
}
function getTypeAliasForTypeLiteral(type) {
if (type.symbol && type.symbol.flags & 2048) {
var node = type.symbol.declarations[0].parent;
while (node.kind === 150) {
node = node.parent;
}
if (node.kind === 204) {
return getSymbolOfNode(node);
}
}
return undefined;
}
var _displayBuilder;
function getSymbolDisplayBuilder() {
function appendSymbolNameOnly(symbol, writer) {
if (symbol.declarations && symbol.declarations.length > 0) {
var declaration = symbol.declarations[0];
if (declaration.name) {
writer.writeSymbol(ts.declarationNameToString(declaration.name), symbol);
return;
}
}
writer.writeSymbol(symbol.name, symbol);
}
function buildSymbolDisplay(symbol, writer, enclosingDeclaration, meaning, flags, typeFlags) {
var parentSymbol;
function appendParentTypeArgumentsAndSymbolName(symbol) {
if (parentSymbol) {
if (flags & 1) {
if (symbol.flags & 16777216) {
buildDisplayForTypeArgumentsAndDelimiters(getTypeParametersOfClassOrInterface(parentSymbol), symbol.mapper, writer, enclosingDeclaration);
}
else {
buildTypeParameterDisplayFromSymbol(parentSymbol, writer, enclosingDeclaration);
}
}
writePunctuation(writer, 20);
}
parentSymbol = symbol;
appendSymbolNameOnly(symbol, writer);
}
writer.trackSymbol(symbol, enclosingDeclaration, meaning);
function walkSymbol(symbol, meaning) {
if (symbol) {
var accessibleSymbolChain = getAccessibleSymbolChain(symbol, enclosingDeclaration, meaning, !!(flags & 2));
if (!accessibleSymbolChain ||
needsQualification(accessibleSymbolChain[0], enclosingDeclaration, accessibleSymbolChain.length === 1 ? meaning : getQualifiedLeftMeaning(meaning))) {
walkSymbol(getParentOfSymbol(accessibleSymbolChain ? accessibleSymbolChain[0] : symbol), getQualifiedLeftMeaning(meaning));
}
if (accessibleSymbolChain) {
for (var _i = 0; _i < accessibleSymbolChain.length; _i++) {
var accessibleSymbol = accessibleSymbolChain[_i];
appendParentTypeArgumentsAndSymbolName(accessibleSymbol);
}
}
else {
if (!parentSymbol && ts.forEach(symbol.declarations, hasExternalModuleSymbol)) {
return;
}
if (symbol.flags & 2048 || symbol.flags & 4096) {
return;
}
appendParentTypeArgumentsAndSymbolName(symbol);
}
}
}
var isTypeParameter = symbol.flags & 262144;
var typeFormatFlag = 128 & typeFlags;
if (!isTypeParameter && (enclosingDeclaration || typeFormatFlag)) {
walkSymbol(symbol, meaning);
return;
}
return appendParentTypeArgumentsAndSymbolName(symbol);
}
function buildTypeDisplay(type, writer, enclosingDeclaration, globalFlags, typeStack) {
var globalFlagsToPass = globalFlags & 16;
return writeType(type, globalFlags);
function writeType(type, flags) {
if (type.flags & 1048703) {
writer.writeKeyword(!(globalFlags & 16) &&
(type.flags & 1) ? "any" : type.intrinsicName);
}
else if (type.flags & 4096) {
writeTypeReference(type, flags);
}
else if (type.flags & (1024 | 2048 | 128 | 512)) {
buildSymbolDisplay(type.symbol, writer, enclosingDeclaration, 793056, 0, flags);
}
else if (type.flags & 8192) {
writeTupleType(type);
}
else if (type.flags & 16384) {
writeUnionType(type, flags);
}
else if (type.flags & 32768) {
writeAnonymousType(type, flags);
}
else if (type.flags & 256) {
writer.writeStringLiteral(type.text);
}
else {
writePunctuation(writer, 14);
writeSpace(writer);
writePunctuation(writer, 21);
writeSpace(writer);
writePunctuation(writer, 15);
}
}
function writeTypeList(types, union) {
for (var i = 0; i < types.length; i++) {
if (i > 0) {
if (union) {
writeSpace(writer);
}
writePunctuation(writer, union ? 44 : 23);
writeSpace(writer);
}
writeType(types[i], union ? 64 : 0);
}
}
function writeTypeReference(type, flags) {
if (type.target === globalArrayType && !(flags & 1)) {
writeType(type.typeArguments[0], 64);
writePunctuation(writer, 18);
writePunctuation(writer, 19);
}
else {
buildSymbolDisplay(type.target.symbol, writer, enclosingDeclaration, 793056);
writePunctuation(writer, 24);
writeTypeList(type.typeArguments, false);
writePunctuation(writer, 25);
}
}
function writeTupleType(type) {
writePunctuation(writer, 18);
writeTypeList(type.elementTypes, false);
writePunctuation(writer, 19);
}
function writeUnionType(type, flags) {
if (flags & 64) {
writePunctuation(writer, 16);
}
writeTypeList(type.types, true);
if (flags & 64) {
writePunctuation(writer, 17);
}
}
function writeAnonymousType(type, flags) {
if (type.symbol && type.symbol.flags & (32 | 384 | 512)) {
writeTypeofSymbol(type, flags);
}
else if (shouldWriteTypeOfFunctionSymbol()) {
writeTypeofSymbol(type, flags);
}
else if (typeStack && ts.contains(typeStack, type)) {
var typeAlias = getTypeAliasForTypeLiteral(type);
if (typeAlias) {
buildSymbolDisplay(typeAlias, writer, enclosingDeclaration, 793056, 0, flags);
}
else {
writeKeyword(writer, 112);
}
}
else {
if (!typeStack) {
typeStack = [];
}
typeStack.push(type);
writeLiteralType(type, flags);
typeStack.pop();
}
function shouldWriteTypeOfFunctionSymbol() {
if (type.symbol) {
var isStaticMethodSymbol = !!(type.symbol.flags & 8192 &&
ts.forEach(type.symbol.declarations, function (declaration) { return declaration.flags & 128; }));
var isNonLocalFunctionSymbol = !!(type.symbol.flags & 16) &&
(type.symbol.parent ||
ts.forEach(type.symbol.declarations, function (declaration) {
return declaration.parent.kind === 228 || declaration.parent.kind === 207;
}));
if (isStaticMethodSymbol || isNonLocalFunctionSymbol) {
return !!(flags & 2) ||
(typeStack && ts.contains(typeStack, type));
}
}
}
}
function writeTypeofSymbol(type, typeFormatFlags) {
writeKeyword(writer, 97);
writeSpace(writer);
buildSymbolDisplay(type.symbol, writer, enclosingDeclaration, 107455, 0, typeFormatFlags);
}
function getIndexerParameterName(type, indexKind, fallbackName) {
var declaration = getIndexDeclarationOfSymbol(type.symbol, indexKind);
if (!declaration) {
return fallbackName;
}
ts.Debug.assert(declaration.parameters.length !== 0);
return ts.declarationNameToString(declaration.parameters[0].name);
}
function writeLiteralType(type, flags) {
var resolved = resolveObjectOrUnionTypeMembers(type);
if (!resolved.properties.length && !resolved.stringIndexType && !resolved.numberIndexType) {
if (!resolved.callSignatures.length && !resolved.constructSignatures.length) {
writePunctuation(writer, 14);
writePunctuation(writer, 15);
return;
}
if (resolved.callSignatures.length === 1 && !resolved.constructSignatures.length) {
if (flags & 64) {
writePunctuation(writer, 16);
}
buildSignatureDisplay(resolved.callSignatures[0], writer, enclosingDeclaration, globalFlagsToPass | 8, typeStack);
if (flags & 64) {
writePunctuation(writer, 17);
}
return;
}
if (resolved.constructSignatures.length === 1 && !resolved.callSignatures.length) {
if (flags & 64) {
writePunctuation(writer, 16);
}
writeKeyword(writer, 88);
writeSpace(writer);
buildSignatureDisplay(resolved.constructSignatures[0], writer, enclosingDeclaration, globalFlagsToPass | 8, typeStack);
if (flags & 64) {
writePunctuation(writer, 17);
}
return;
}
}
writePunctuation(writer, 14);
writer.writeLine();
writer.increaseIndent();
for (var _i = 0, _a = resolved.callSignatures; _i < _a.length; _i++) {
var signature = _a[_i];
buildSignatureDisplay(signature, writer, enclosingDeclaration, globalFlagsToPass, typeStack);
writePunctuation(writer, 22);
writer.writeLine();
}
for (var _b = 0, _c = resolved.constructSignatures; _b < _c.length; _b++) {
var signature = _c[_b];
writeKeyword(writer, 88);
writeSpace(writer);
buildSignatureDisplay(signature, writer, enclosingDeclaration, globalFlagsToPass, typeStack);
writePunctuation(writer, 22);
writer.writeLine();
}
if (resolved.stringIndexType) {
writePunctuation(writer, 18);
writer.writeParameter(getIndexerParameterName(resolved, 0, "x"));
writePunctuation(writer, 51);
writeSpace(writer);
writeKeyword(writer, 122);
writePunctuation(writer, 19);
writePunctuation(writer, 51);
writeSpace(writer);
writeType(resolved.stringIndexType, 0);
writePunctuation(writer, 22);
writer.writeLine();
}
if (resolved.numberIndexType) {
writePunctuation(writer, 18);
writer.writeParameter(getIndexerParameterName(resolved, 1, "x"));
writePunctuation(writer, 51);
writeSpace(writer);
writeKeyword(writer, 120);
writePunctuation(writer, 19);
writePunctuation(writer, 51);
writeSpace(writer);
writeType(resolved.numberIndexType, 0);
writePunctuation(writer, 22);
writer.writeLine();
}
for (var _d = 0, _e = resolved.properties; _d < _e.length; _d++) {
var p = _e[_d];
var t = getTypeOfSymbol(p);
if (p.flags & (16 | 8192) && !getPropertiesOfObjectType(t).length) {
var signatures = getSignaturesOfType(t, 0);
for (var _f = 0; _f < signatures.length; _f++) {
var signature = signatures[_f];
buildSymbolDisplay(p, writer);
if (p.flags & 536870912) {
writePunctuation(writer, 50);
}
buildSignatureDisplay(signature, writer, enclosingDeclaration, globalFlagsToPass, typeStack);
writePunctuation(writer, 22);
writer.writeLine();
}
}
else {
buildSymbolDisplay(p, writer);
if (p.flags & 536870912) {
writePunctuation(writer, 50);
}
writePunctuation(writer, 51);
writeSpace(writer);
writeType(t, 0);
writePunctuation(writer, 22);
writer.writeLine();
}
}
writer.decreaseIndent();
writePunctuation(writer, 15);
}
}
function buildTypeParameterDisplayFromSymbol(symbol, writer, enclosingDeclaraiton, flags) {
var targetSymbol = getTargetSymbol(symbol);
if (targetSymbol.flags & 32 || targetSymbol.flags & 64) {
buildDisplayForTypeParametersAndDelimiters(getTypeParametersOfClassOrInterface(symbol), writer, enclosingDeclaraiton, flags);
}
}
function buildTypeParameterDisplay(tp, writer, enclosingDeclaration, flags, typeStack) {
appendSymbolNameOnly(tp.symbol, writer);
var constraint = getConstraintOfTypeParameter(tp);
if (constraint) {
writeSpace(writer);
writeKeyword(writer, 79);
writeSpace(writer);
buildTypeDisplay(constraint, writer, enclosingDeclaration, flags, typeStack);
}
}
function buildParameterDisplay(p, writer, enclosingDeclaration, flags, typeStack) {
if (ts.hasDotDotDotToken(p.valueDeclaration)) {
writePunctuation(writer, 21);
}
appendSymbolNameOnly(p, writer);
if (ts.hasQuestionToken(p.valueDeclaration) || p.valueDeclaration.initializer) {
writePunctuation(writer, 50);
}
writePunctuation(writer, 51);
writeSpace(writer);
buildTypeDisplay(getTypeOfSymbol(p), writer, enclosingDeclaration, flags, typeStack);
}
function buildDisplayForTypeParametersAndDelimiters(typeParameters, writer, enclosingDeclaration, flags, typeStack) {
if (typeParameters && typeParameters.length) {
writePunctuation(writer, 24);
for (var i = 0; i < typeParameters.length; i++) {
if (i > 0) {
writePunctuation(writer, 23);
writeSpace(writer);
}
buildTypeParameterDisplay(typeParameters[i], writer, enclosingDeclaration, flags, typeStack);
}
writePunctuation(writer, 25);
}
}
function buildDisplayForTypeArgumentsAndDelimiters(typeParameters, mapper, writer, enclosingDeclaration, flags, typeStack) {
if (typeParameters && typeParameters.length) {
writePunctuation(writer, 24);
for (var i = 0; i < typeParameters.length; i++) {
if (i > 0) {
writePunctuation(writer, 23);
writeSpace(writer);
}
buildTypeDisplay(mapper(typeParameters[i]), writer, enclosingDeclaration, 0);
}
writePunctuation(writer, 25);
}
}
function buildDisplayForParametersAndDelimiters(parameters, writer, enclosingDeclaration, flags, typeStack) {
writePunctuation(writer, 16);
for (var i = 0; i < parameters.length; i++) {
if (i > 0) {
writePunctuation(writer, 23);
writeSpace(writer);
}
buildParameterDisplay(parameters[i], writer, enclosingDeclaration, flags, typeStack);
}
writePunctuation(writer, 17);
}
function buildReturnTypeDisplay(signature, writer, enclosingDeclaration, flags, typeStack) {
if (flags & 8) {
writeSpace(writer);
writePunctuation(writer, 32);
}
else {
writePunctuation(writer, 51);
}
writeSpace(writer);
buildTypeDisplay(getReturnTypeOfSignature(signature), writer, enclosingDeclaration, flags, typeStack);
}
function buildSignatureDisplay(signature, writer, enclosingDeclaration, flags, typeStack) {
if (signature.target && (flags & 32)) {
buildDisplayForTypeArgumentsAndDelimiters(signature.target.typeParameters, signature.mapper, writer, enclosingDeclaration);
}
else {
buildDisplayForTypeParametersAndDelimiters(signature.typeParameters, writer, enclosingDeclaration, flags, typeStack);
}
buildDisplayForParametersAndDelimiters(signature.parameters, writer, enclosingDeclaration, flags, typeStack);
buildReturnTypeDisplay(signature, writer, enclosingDeclaration, flags, typeStack);
}
return _displayBuilder || (_displayBuilder = {
symbolToString: symbolToString,
typeToString: typeToString,
buildSymbolDisplay: buildSymbolDisplay,
buildTypeDisplay: buildTypeDisplay,
buildTypeParameterDisplay: buildTypeParameterDisplay,
buildParameterDisplay: buildParameterDisplay,
buildDisplayForParametersAndDelimiters: buildDisplayForParametersAndDelimiters,
buildDisplayForTypeParametersAndDelimiters: buildDisplayForTypeParametersAndDelimiters,
buildDisplayForTypeArgumentsAndDelimiters: buildDisplayForTypeArgumentsAndDelimiters,
buildTypeParameterDisplayFromSymbol: buildTypeParameterDisplayFromSymbol,
buildSignatureDisplay: buildSignatureDisplay,
buildReturnTypeDisplay: buildReturnTypeDisplay
});
}
function isDeclarationVisible(node) {
function getContainingExternalModule(node) {
for (; node; node = node.parent) {
if (node.kind === 206) {
if (node.name.kind === 8) {
return node;
}
}
else if (node.kind === 228) {
return ts.isExternalModule(node) ? node : undefined;
}
}
ts.Debug.fail("getContainingModule cant reach here");
}
function isUsedInExportAssignment(node) {
var externalModule = getContainingExternalModule(node);
var exportAssignmentSymbol;
var resolvedExportSymbol;
if (externalModule) {
var externalModuleSymbol = getSymbolOfNode(externalModule);
exportAssignmentSymbol = getExportAssignmentSymbol(externalModuleSymbol);
var symbolOfNode = getSymbolOfNode(node);
if (isSymbolUsedInExportAssignment(symbolOfNode)) {
return true;
}
if (symbolOfNode.flags & 8388608) {
return isSymbolUsedInExportAssignment(resolveAlias(symbolOfNode));
}
}
function isSymbolUsedInExportAssignment(symbol) {
if (exportAssignmentSymbol === symbol) {
return true;
}
if (exportAssignmentSymbol && !!(exportAssignmentSymbol.flags & 8388608)) {
resolvedExportSymbol = resolvedExportSymbol || resolveAlias(exportAssignmentSymbol);
if (resolvedExportSymbol === symbol) {
return true;
}
return ts.forEach(resolvedExportSymbol.declarations, function (current) {
while (current) {
if (current === node) {
return true;
}
current = current.parent;
}
});
}
}
}
function determineIfDeclarationIsVisible() {
switch (node.kind) {
case 153:
return isDeclarationVisible(node.parent.parent);
case 199:
if (ts.isBindingPattern(node.name) &&
!node.name.elements.length) {
return false;
}
case 206:
case 202:
case 203:
case 204:
case 201:
case 205:
case 209:
var parent_2 = getDeclarationContainer(node);
if (!(ts.getCombinedNodeFlags(node) & 1) &&
!(node.kind !== 209 && parent_2.kind !== 228 && ts.isInAmbientContext(parent_2))) {
return isGlobalSourceFile(parent_2);
}
return isDeclarationVisible(parent_2);
case 133:
case 132:
case 137:
case 138:
case 135:
case 134:
if (node.flags & (32 | 64)) {
return false;
}
case 136:
case 140:
case 139:
case 141:
case 130:
case 207:
case 143:
case 144:
case 146:
case 142:
case 147:
case 148:
case 149:
case 150:
return isDeclarationVisible(node.parent);
case 211:
case 212:
case 214:
return false;
case 129:
case 228:
return true;
case 215:
return false;
default:
ts.Debug.fail("isDeclarationVisible unknown: SyntaxKind: " + node.kind);
}
}
if (node) {
var links = getNodeLinks(node);
if (links.isVisible === undefined) {
links.isVisible = !!determineIfDeclarationIsVisible();
}
return links.isVisible;
}
}
function collectLinkedAliases(node) {
var exportSymbol;
if (node.parent && node.parent.kind === 215) {
exportSymbol = resolveName(node.parent, node.text, 107455 | 793056 | 1536, ts.Diagnostics.Cannot_find_name_0, node);
}
else if (node.parent.kind === 218) {
exportSymbol = getTargetOfExportSpecifier(node.parent);
}
var result = [];
if (exportSymbol) {
buildVisibleNodeList(exportSymbol.declarations);
}
return result;
function buildVisibleNodeList(declarations) {
ts.forEach(declarations, function (declaration) {
getNodeLinks(declaration).isVisible = true;
var resultNode = getAnyImportSyntax(declaration) || declaration;
if (!ts.contains(result, resultNode)) {
result.push(resultNode);
}
if (ts.isInternalModuleImportEqualsDeclaration(declaration)) {
var internalModuleReference = declaration.moduleReference;
var firstIdentifier = getFirstIdentifier(internalModuleReference);
var importSymbol = resolveName(declaration, firstIdentifier.text, 107455 | 793056 | 1536, ts.Diagnostics.Cannot_find_name_0, firstIdentifier);
buildVisibleNodeList(importSymbol.declarations);
}
});
}
}
function pushTypeResolution(target) {
var i = 0;
var count = resolutionTargets.length;
while (i < count && resolutionTargets[i] !== target) {
i++;
}
if (i < count) {
do {
resolutionResults[i++] = false;
} while (i < count);
return false;
}
resolutionTargets.push(target);
resolutionResults.push(true);
return true;
}
function popTypeResolution() {
resolutionTargets.pop();
return resolutionResults.pop();
}
function getDeclarationContainer(node) {
node = ts.getRootDeclaration(node);
return node.kind === 199 ? node.parent.parent.parent : node.parent;
}
function getTypeOfPrototypeProperty(prototype) {
var classType = getDeclaredTypeOfSymbol(prototype.parent);
return classType.typeParameters ? createTypeReference(classType, ts.map(classType.typeParameters, function (_) { return anyType; })) : classType;
}
function getTypeOfPropertyOfType(type, name) {
var prop = getPropertyOfType(type, name);
return prop ? getTypeOfSymbol(prop) : undefined;
}
function getTypeForBindingElement(declaration) {
var pattern = declaration.parent;
var parentType = getTypeForVariableLikeDeclaration(pattern.parent);
if (parentType === unknownType) {
return unknownType;
}
if (!parentType || parentType === anyType) {
if (declaration.initializer) {
return checkExpressionCached(declaration.initializer);
}
return parentType;
}
var type;
if (pattern.kind === 151) {
var name_5 = declaration.propertyName || declaration.name;
type = getTypeOfPropertyOfType(parentType, name_5.text) ||
isNumericLiteralName(name_5.text) && getIndexTypeOfType(parentType, 1) ||
getIndexTypeOfType(parentType, 0);
if (!type) {
error(name_5, ts.Diagnostics.Type_0_has_no_property_1_and_no_string_index_signature, typeToString(parentType), ts.declarationNameToString(name_5));
return unknownType;
}
}
else {
var elementType = checkIteratedTypeOrElementType(parentType, pattern, false);
if (!declaration.dotDotDotToken) {
if (elementType.flags & 1) {
return elementType;
}
var propName = "" + ts.indexOf(pattern.elements, declaration);
type = isTupleLikeType(parentType)
? getTypeOfPropertyOfType(parentType, propName)
: elementType;
if (!type) {
if (isTupleType(parentType)) {
error(declaration, ts.Diagnostics.Tuple_type_0_with_length_1_cannot_be_assigned_to_tuple_with_length_2, typeToString(parentType), parentType.elementTypes.length, pattern.elements.length);
}
else {
error(declaration, ts.Diagnostics.Type_0_has_no_property_1, typeToString(parentType), propName);
}
return unknownType;
}
}
else {
type = createArrayType(elementType);
}
}
return type;
}
function getTypeForVariableLikeDeclaration(declaration) {
if (declaration.parent.parent.kind === 188) {
return anyType;
}
if (declaration.parent.parent.kind === 189) {
return checkRightHandSideOfForOf(declaration.parent.parent.expression) || anyType;
}
if (ts.isBindingPattern(declaration.parent)) {
return getTypeForBindingElement(declaration);
}
if (declaration.type) {
return getTypeFromTypeNode(declaration.type);
}
if (declaration.kind === 130) {
var func = declaration.parent;
if (func.kind === 138 && !ts.hasDynamicName(func)) {
var getter = ts.getDeclarationOfKind(declaration.parent.symbol, 137);
if (getter) {
return getReturnTypeOfSignature(getSignatureFromDeclaration(getter));
}
}
var type = getContextuallyTypedParameterType(declaration);
if (type) {
return type;
}
}
if (declaration.initializer) {
return checkExpressionCached(declaration.initializer);
}
if (declaration.kind === 226) {
return checkIdentifier(declaration.name);
}
return undefined;
}
function getTypeFromBindingElement(element) {
if (element.initializer) {
return getWidenedType(checkExpressionCached(element.initializer));
}
if (ts.isBindingPattern(element.name)) {
return getTypeFromBindingPattern(element.name);
}
return anyType;
}
function getTypeFromObjectBindingPattern(pattern) {
var members = {};
ts.forEach(pattern.elements, function (e) {
var flags = 4 | 67108864 | (e.initializer ? 536870912 : 0);
var name = e.propertyName || e.name;
var symbol = createSymbol(flags, name.text);
symbol.type = getTypeFromBindingElement(e);
members[symbol.name] = symbol;
});
return createAnonymousType(undefined, members, emptyArray, emptyArray, undefined, undefined);
}
function getTypeFromArrayBindingPattern(pattern) {
var hasSpreadElement = false;
var elementTypes = [];
ts.forEach(pattern.elements, function (e) {
elementTypes.push(e.kind === 176 || e.dotDotDotToken ? anyType : getTypeFromBindingElement(e));
if (e.dotDotDotToken) {
hasSpreadElement = true;
}
});
if (!elementTypes.length) {
return languageVersion >= 2 ? createIterableType(anyType) : anyArrayType;
}
else if (hasSpreadElement) {
var unionOfElements = getUnionType(elementTypes);
return languageVersion >= 2 ? createIterableType(unionOfElements) : createArrayType(unionOfElements);
}
return createTupleType(elementTypes);
}
function getTypeFromBindingPattern(pattern) {
return pattern.kind === 151
? getTypeFromObjectBindingPattern(pattern)
: getTypeFromArrayBindingPattern(pattern);
}
function getWidenedTypeForVariableLikeDeclaration(declaration, reportErrors) {
var type = getTypeForVariableLikeDeclaration(declaration);
if (type) {
if (reportErrors) {
reportErrorsFromWidening(declaration, type);
}
return declaration.kind !== 225 ? getWidenedType(type) : type;
}
if (ts.isBindingPattern(declaration.name)) {
return getTypeFromBindingPattern(declaration.name);
}
type = declaration.dotDotDotToken ? anyArrayType : anyType;
if (reportErrors && compilerOptions.noImplicitAny) {
var root = ts.getRootDeclaration(declaration);
if (!isPrivateWithinAmbient(root) && !(root.kind === 130 && isPrivateWithinAmbient(root.parent))) {
reportImplicitAnyError(declaration, type);
}
}
return type;
}
function getTypeOfVariableOrParameterOrProperty(symbol) {
var links = getSymbolLinks(symbol);
if (!links.type) {
if (symbol.flags & 134217728) {
return links.type = getTypeOfPrototypeProperty(symbol);
}
var declaration = symbol.valueDeclaration;
if (declaration.parent.kind === 224) {
return links.type = anyType;
}
if (declaration.kind === 215) {
return links.type = checkExpression(declaration.expression);
}
if (!pushTypeResolution(symbol)) {
return unknownType;
}
var type = getWidenedTypeForVariableLikeDeclaration(declaration, true);
if (!popTypeResolution()) {
if (symbol.valueDeclaration.type) {
type = unknownType;
error(symbol.valueDeclaration, ts.Diagnostics._0_is_referenced_directly_or_indirectly_in_its_own_type_annotation, symbolToString(symbol));
}
else {
type = anyType;
if (compilerOptions.noImplicitAny) {
error(symbol.valueDeclaration, ts.Diagnostics._0_implicitly_has_type_any_because_it_is_does_not_have_a_type_annotation_and_is_referenced_directly_or_indirectly_in_its_own_initializer, symbolToString(symbol));
}
}
}
links.type = type;
}
return links.type;
}
function getSetAccessorTypeAnnotationNode(accessor) {
return accessor && accessor.parameters.length > 0 && accessor.parameters[0].type;
}
function getAnnotatedAccessorType(accessor) {
if (accessor) {
if (accessor.kind === 137) {
return accessor.type && getTypeFromTypeNode(accessor.type);
}
else {
var setterTypeAnnotation = getSetAccessorTypeAnnotationNode(accessor);
return setterTypeAnnotation && getTypeFromTypeNode(setterTypeAnnotation);
}
}
return undefined;
}
function getTypeOfAccessors(symbol) {
var links = getSymbolLinks(symbol);
if (!links.type) {
if (!pushTypeResolution(symbol)) {
return unknownType;
}
var getter = ts.getDeclarationOfKind(symbol, 137);
var setter = ts.getDeclarationOfKind(symbol, 138);
var type;
var getterReturnType = getAnnotatedAccessorType(getter);
if (getterReturnType) {
type = getterReturnType;
}
else {
var setterParameterType = getAnnotatedAccessorType(setter);
if (setterParameterType) {
type = setterParameterType;
}
else {
if (getter && getter.body) {
type = getReturnTypeFromBody(getter);
}
else {
if (compilerOptions.noImplicitAny) {
error(setter, ts.Diagnostics.Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_type_annotation, symbolToString(symbol));
}
type = anyType;
}
}
}
if (!popTypeResolution()) {
type = anyType;
if (compilerOptions.noImplicitAny) {
var getter_1 = ts.getDeclarationOfKind(symbol, 137);
error(getter_1, ts.Diagnostics._0_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions, symbolToString(symbol));
}
}
links.type = type;
}
return links.type;
}
function getTypeOfFuncClassEnumModule(symbol) {
var links = getSymbolLinks(symbol);
if (!links.type) {
links.type = createObjectType(32768, symbol);
}
return links.type;
}
function getTypeOfEnumMember(symbol) {
var links = getSymbolLinks(symbol);
if (!links.type) {
links.type = getDeclaredTypeOfEnum(getParentOfSymbol(symbol));
}
return links.type;
}
function getTypeOfAlias(symbol) {
var links = getSymbolLinks(symbol);
if (!links.type) {
var targetSymbol = resolveAlias(symbol);
links.type = targetSymbol.flags & 107455
? getTypeOfSymbol(targetSymbol)
: unknownType;
}
return links.type;
}
function getTypeOfInstantiatedSymbol(symbol) {
var links = getSymbolLinks(symbol);
if (!links.type) {
links.type = instantiateType(getTypeOfSymbol(links.target), links.mapper);
}
return links.type;
}
function getTypeOfSymbol(symbol) {
if (symbol.flags & 16777216) {
return getTypeOfInstantiatedSymbol(symbol);
}
if (symbol.flags & (3 | 4)) {
return getTypeOfVariableOrParameterOrProperty(symbol);
}
if (symbol.flags & (16 | 8192 | 32 | 384 | 512)) {
return getTypeOfFuncClassEnumModule(symbol);
}
if (symbol.flags & 8) {
return getTypeOfEnumMember(symbol);
}
if (symbol.flags & 98304) {
return getTypeOfAccessors(symbol);
}
if (symbol.flags & 8388608) {
return getTypeOfAlias(symbol);
}
return unknownType;
}
function getTargetType(type) {
return type.flags & 4096 ? type.target : type;
}
function hasBaseType(type, checkBase) {
return check(type);
function check(type) {
var target = getTargetType(type);
return target === checkBase || ts.forEach(getBaseTypes(target), check);
}
}
function getTypeParametersOfClassOrInterface(symbol) {
var result;
ts.forEach(symbol.declarations, function (node) {
if (node.kind === 203 || node.kind === 202) {
var declaration = node;
if (declaration.typeParameters && declaration.typeParameters.length) {
ts.forEach(declaration.typeParameters, function (node) {
var tp = getDeclaredTypeOfTypeParameter(getSymbolOfNode(node));
if (!result) {
result = [tp];
}
else if (!ts.contains(result, tp)) {
result.push(tp);
}
});
}
}
});
return result;
}
function getBaseTypes(type) {
var typeWithBaseTypes = type;
if (!typeWithBaseTypes.baseTypes) {
if (type.symbol.flags & 32) {
resolveBaseTypesOfClass(typeWithBaseTypes);
}
else if (type.symbol.flags & 64) {
resolveBaseTypesOfInterface(typeWithBaseTypes);
}
else {
ts.Debug.fail("type must be class or interface");
}
}
return typeWithBaseTypes.baseTypes;
}
function resolveBaseTypesOfClass(type) {
type.baseTypes = [];
var declaration = ts.getDeclarationOfKind(type.symbol, 202);
var baseTypeNode = ts.getClassExtendsHeritageClauseElement(declaration);
if (baseTypeNode) {
var baseType = getTypeFromTypeNode(baseTypeNode);
if (baseType !== unknownType) {
if (getTargetType(baseType).flags & 1024) {
if (type !== baseType && !hasBaseType(baseType, type)) {
type.baseTypes.push(baseType);
}
else {
error(declaration, ts.Diagnostics.Type_0_recursively_references_itself_as_a_base_type, typeToString(type, undefined, 1));
}
}
else {
error(baseTypeNode, ts.Diagnostics.A_class_may_only_extend_another_class);
}
}
}
}
function resolveBaseTypesOfInterface(type) {
type.baseTypes = [];
for (var _i = 0, _a = type.symbol.declarations; _i < _a.length; _i++) {
var declaration = _a[_i];
if (declaration.kind === 203 && ts.getInterfaceBaseTypeNodes(declaration)) {
for (var _b = 0, _c = ts.getInterfaceBaseTypeNodes(declaration); _b < _c.length; _b++) {
var node = _c[_b];
var baseType = getTypeFromTypeNode(node);
if (baseType !== unknownType) {
if (getTargetType(baseType).flags & (1024 | 2048)) {
if (type !== baseType && !hasBaseType(baseType, type)) {
type.baseTypes.push(baseType);
}
else {
error(declaration, ts.Diagnostics.Type_0_recursively_references_itself_as_a_base_type, typeToString(type, undefined, 1));
}
}
else {
error(node, ts.Diagnostics.An_interface_may_only_extend_a_class_or_another_interface);
}
}
}
}
}
}
function getDeclaredTypeOfClassOrInterface(symbol) {
var links = getSymbolLinks(symbol);
if (!links.declaredType) {
var kind = symbol.flags & 32 ? 1024 : 2048;
var type = links.declaredType = createObjectType(kind, symbol);
var typeParameters = getTypeParametersOfClassOrInterface(symbol);
if (typeParameters) {
type.flags |= 4096;
type.typeParameters = typeParameters;
type.instantiations = {};
type.instantiations[getTypeListId(type.typeParameters)] = type;
type.target = type;
type.typeArguments = type.typeParameters;
}
}
return links.declaredType;
}
function getDeclaredTypeOfTypeAlias(symbol) {
var links = getSymbolLinks(symbol);
if (!links.declaredType) {
if (!pushTypeResolution(links)) {
return unknownType;
}
var declaration = ts.getDeclarationOfKind(symbol, 204);
var type = getTypeFromTypeNode(declaration.type);
if (!popTypeResolution()) {
type = unknownType;
error(declaration.name, ts.Diagnostics.Type_alias_0_circularly_references_itself, symbolToString(symbol));
}
links.declaredType = type;
}
return links.declaredType;
}
function getDeclaredTypeOfEnum(symbol) {
var links = getSymbolLinks(symbol);
if (!links.declaredType) {
var type = createType(128);
type.symbol = symbol;
links.declaredType = type;
}
return links.declaredType;
}
function getDeclaredTypeOfTypeParameter(symbol) {
var links = getSymbolLinks(symbol);
if (!links.declaredType) {
var type = createType(512);
type.symbol = symbol;
if (!ts.getDeclarationOfKind(symbol, 129).constraint) {
type.constraint = noConstraintType;
}
links.declaredType = type;
}
return links.declaredType;
}
function getDeclaredTypeOfAlias(symbol) {
var links = getSymbolLinks(symbol);
if (!links.declaredType) {
links.declaredType = getDeclaredTypeOfSymbol(resolveAlias(symbol));
}
return links.declaredType;
}
function getDeclaredTypeOfSymbol(symbol) {
ts.Debug.assert((symbol.flags & 16777216) === 0);
if (symbol.flags & (32 | 64)) {
return getDeclaredTypeOfClassOrInterface(symbol);
}
if (symbol.flags & 524288) {
return getDeclaredTypeOfTypeAlias(symbol);
}
if (symbol.flags & 384) {
return getDeclaredTypeOfEnum(symbol);
}
if (symbol.flags & 262144) {
return getDeclaredTypeOfTypeParameter(symbol);
}
if (symbol.flags & 8388608) {
return getDeclaredTypeOfAlias(symbol);
}
return unknownType;
}
function createSymbolTable(symbols) {
var result = {};
for (var _i = 0; _i < symbols.length; _i++) {
var symbol = symbols[_i];
result[symbol.name] = symbol;
}
return result;
}
function createInstantiatedSymbolTable(symbols, mapper) {
var result = {};
for (var _i = 0; _i < symbols.length; _i++) {
var symbol = symbols[_i];
result[symbol.name] = instantiateSymbol(symbol, mapper);
}
return result;
}
function addInheritedMembers(symbols, baseSymbols) {
for (var _i = 0; _i < baseSymbols.length; _i++) {
var s = baseSymbols[_i];
if (!ts.hasProperty(symbols, s.name)) {
symbols[s.name] = s;
}
}
}
function addInheritedSignatures(signatures, baseSignatures) {
if (baseSignatures) {
for (var _i = 0; _i < baseSignatures.length; _i++) {
var signature = baseSignatures[_i];
signatures.push(signature);
}
}
}
function resolveDeclaredMembers(type) {
if (!type.declaredProperties) {
var symbol = type.symbol;
type.declaredProperties = getNamedMembers(symbol.members);
type.declaredCallSignatures = getSignaturesOfSymbol(symbol.members["__call"]);
type.declaredConstructSignatures = getSignaturesOfSymbol(symbol.members["__new"]);
type.declaredStringIndexType = getIndexTypeOfSymbol(symbol, 0);
type.declaredNumberIndexType = getIndexTypeOfSymbol(symbol, 1);
}
return type;
}
function resolveClassOrInterfaceMembers(type) {
var target = resolveDeclaredMembers(type);
var members = target.symbol.members;
var callSignatures = target.declaredCallSignatures;
var constructSignatures = target.declaredConstructSignatures;
var stringIndexType = target.declaredStringIndexType;
var numberIndexType = target.declaredNumberIndexType;
var baseTypes = getBaseTypes(target);
if (baseTypes.length) {
members = createSymbolTable(target.declaredProperties);
for (var _i = 0; _i < baseTypes.length; _i++) {
var baseType = baseTypes[_i];
addInheritedMembers(members, getPropertiesOfObjectType(baseType));
callSignatures = ts.concatenate(callSignatures, getSignaturesOfType(baseType, 0));
constructSignatures = ts.concatenate(constructSignatures, getSignaturesOfType(baseType, 1));
stringIndexType = stringIndexType || getIndexTypeOfType(baseType, 0);
numberIndexType = numberIndexType || getIndexTypeOfType(baseType, 1);
}
}
setObjectTypeMembers(type, members, callSignatures, constructSignatures, stringIndexType, numberIndexType);
}
function resolveTypeReferenceMembers(type) {
var target = resolveDeclaredMembers(type.target);
var mapper = createTypeMapper(target.typeParameters, type.typeArguments);
var members = createInstantiatedSymbolTable(target.declaredProperties, mapper);
var callSignatures = instantiateList(target.declaredCallSignatures, mapper, instantiateSignature);
var constructSignatures = instantiateList(target.declaredConstructSignatures, mapper, instantiateSignature);
var stringIndexType = target.declaredStringIndexType ? instantiateType(target.declaredStringIndexType, mapper) : undefined;
var numberIndexType = target.declaredNumberIndexType ? instantiateType(target.declaredNumberIndexType, mapper) : undefined;
ts.forEach(getBaseTypes(target), function (baseType) {
var instantiatedBaseType = instantiateType(baseType, mapper);
addInheritedMembers(members, getPropertiesOfObjectType(instantiatedBaseType));
callSignatures = ts.concatenate(callSignatures, getSignaturesOfType(instantiatedBaseType, 0));
constructSignatures = ts.concatenate(constructSignatures, getSignaturesOfType(instantiatedBaseType, 1));
stringIndexType = stringIndexType || getIndexTypeOfType(instantiatedBaseType, 0);
numberIndexType = numberIndexType || getIndexTypeOfType(instantiatedBaseType, 1);
});
setObjectTypeMembers(type, members, callSignatures, constructSignatures, stringIndexType, numberIndexType);
}
function createSignature(declaration, typeParameters, parameters, resolvedReturnType, minArgumentCount, hasRestParameter, hasStringLiterals) {
var sig = new Signature(checker);
sig.declaration = declaration;
sig.typeParameters = typeParameters;
sig.parameters = parameters;
sig.resolvedReturnType = resolvedReturnType;
sig.minArgumentCount = minArgumentCount;
sig.hasRestParameter = hasRestParameter;
sig.hasStringLiterals = hasStringLiterals;
return sig;
}
function cloneSignature(sig) {
return createSignature(sig.declaration, sig.typeParameters, sig.parameters, sig.resolvedReturnType, sig.minArgumentCount, sig.hasRestParameter, sig.hasStringLiterals);
}
function getDefaultConstructSignatures(classType) {
var baseTypes = getBaseTypes(classType);
if (baseTypes.length) {
var baseType = baseTypes[0];
var baseSignatures = getSignaturesOfType(getTypeOfSymbol(baseType.symbol), 1);
return ts.map(baseSignatures, function (baseSignature) {
var signature = baseType.flags & 4096 ?
getSignatureInstantiation(baseSignature, baseType.typeArguments) : cloneSignature(baseSignature);
signature.typeParameters = classType.typeParameters;
signature.resolvedReturnType = classType;
return signature;
});
}
return [createSignature(undefined, classType.typeParameters, emptyArray, classType, 0, false, false)];
}
function createTupleTypeMemberSymbols(memberTypes) {
var members = {};
for (var i = 0; i < memberTypes.length; i++) {
var symbol = createSymbol(4 | 67108864, "" + i);
symbol.type = memberTypes[i];
members[i] = symbol;
}
return members;
}
function resolveTupleTypeMembers(type) {
var arrayType = resolveObjectOrUnionTypeMembers(createArrayType(getUnionType(type.elementTypes)));
var members = createTupleTypeMemberSymbols(type.elementTypes);
addInheritedMembers(members, arrayType.properties);
setObjectTypeMembers(type, members, arrayType.callSignatures, arrayType.constructSignatures, arrayType.stringIndexType, arrayType.numberIndexType);
}
function signatureListsIdentical(s, t) {
if (s.length !== t.length) {
return false;
}
for (var i = 0; i < s.length; i++) {
if (!compareSignatures(s[i], t[i], false, compareTypes)) {
return false;
}
}
return true;
}
function getUnionSignatures(types, kind) {
var signatureLists = ts.map(types, function (t) { return getSignaturesOfType(t, kind); });
var signatures = signatureLists[0];
for (var _i = 0; _i < signatures.length; _i++) {
var signature = signatures[_i];
if (signature.typeParameters) {
return emptyArray;
}
}
for (var i_1 = 1; i_1 < signatureLists.length; i_1++) {
if (!signatureListsIdentical(signatures, signatureLists[i_1])) {
return emptyArray;
}
}
var result = ts.map(signatures, cloneSignature);
for (var i = 0; i < result.length; i++) {
var s = result[i];
s.resolvedReturnType = undefined;
s.unionSignatures = ts.map(signatureLists, function (signatures) { return signatures[i]; });
}
return result;
}
function getUnionIndexType(types, kind) {
var indexTypes = [];
for (var _i = 0; _i < types.length; _i++) {
var type = types[_i];
var indexType = getIndexTypeOfType(type, kind);
if (!indexType) {
return undefined;
}
indexTypes.push(indexType);
}
return getUnionType(indexTypes);
}
function resolveUnionTypeMembers(type) {
var callSignatures = getUnionSignatures(type.types, 0);
var constructSignatures = getUnionSignatures(type.types, 1);
var stringIndexType = getUnionIndexType(type.types, 0);
var numberIndexType = getUnionIndexType(type.types, 1);
setObjectTypeMembers(type, emptySymbols, callSignatures, constructSignatures, stringIndexType, numberIndexType);
}
function resolveAnonymousTypeMembers(type) {
var symbol = type.symbol;
var members;
var callSignatures;
var constructSignatures;
var stringIndexType;
var numberIndexType;
if (symbol.flags & 2048) {
members = symbol.members;
callSignatures = getSignaturesOfSymbol(members["__call"]);
constructSignatures = getSignaturesOfSymbol(members["__new"]);
stringIndexType = getIndexTypeOfSymbol(symbol, 0);
numberIndexType = getIndexTypeOfSymbol(symbol, 1);
}
else {
members = emptySymbols;
callSignatures = emptyArray;
constructSignatures = emptyArray;
if (symbol.flags & 1952) {
members = getExportsOfSymbol(symbol);
}
if (symbol.flags & (16 | 8192)) {
callSignatures = getSignaturesOfSymbol(symbol);
}
if (symbol.flags & 32) {
var classType = getDeclaredTypeOfClassOrInterface(symbol);
constructSignatures = getSignaturesOfSymbol(symbol.members["__constructor"]);
if (!constructSignatures.length) {
constructSignatures = getDefaultConstructSignatures(classType);
}
var baseTypes = getBaseTypes(classType);
if (baseTypes.length) {
members = createSymbolTable(getNamedMembers(members));
addInheritedMembers(members, getPropertiesOfObjectType(getTypeOfSymbol(baseTypes[0].symbol)));
}
}
stringIndexType = undefined;
numberIndexType = (symbol.flags & 384) ? stringType : undefined;
}
setObjectTypeMembers(type, members, callSignatures, constructSignatures, stringIndexType, numberIndexType);
}
function resolveObjectOrUnionTypeMembers(type) {
if (!type.members) {
if (type.flags & (1024 | 2048)) {
resolveClassOrInterfaceMembers(type);
}
else if (type.flags & 32768) {
resolveAnonymousTypeMembers(type);
}
else if (type.flags & 8192) {
resolveTupleTypeMembers(type);
}
else if (type.flags & 16384) {
resolveUnionTypeMembers(type);
}
else {
resolveTypeReferenceMembers(type);
}
}
return type;
}
function getPropertiesOfObjectType(type) {
if (type.flags & 48128) {
return resolveObjectOrUnionTypeMembers(type).properties;
}
return emptyArray;
}
function getPropertyOfObjectType(type, name) {
if (type.flags & 48128) {
var resolved = resolveObjectOrUnionTypeMembers(type);
if (ts.hasProperty(resolved.members, name)) {
var symbol = resolved.members[name];
if (symbolIsValue(symbol)) {
return symbol;
}
}
}
}
function getPropertiesOfUnionType(type) {
var result = [];
ts.forEach(getPropertiesOfType(type.types[0]), function (prop) {
var unionProp = getPropertyOfUnionType(type, prop.name);
if (unionProp) {
result.push(unionProp);
}
});
return result;
}
function getPropertiesOfType(type) {
type = getApparentType(type);
return type.flags & 16384 ? getPropertiesOfUnionType(type) : getPropertiesOfObjectType(type);
}
function getApparentType(type) {
if (type.flags & 16384) {
type = getReducedTypeOfUnionType(type);
}
if (type.flags & 512) {
do {
type = getConstraintOfTypeParameter(type);
} while (type && type.flags & 512);
if (!type) {
type = emptyObjectType;
}
}
if (type.flags & 258) {
type = globalStringType;
}
else if (type.flags & 132) {
type = globalNumberType;
}
else if (type.flags & 8) {
type = globalBooleanType;
}
else if (type.flags & 1048576) {
type = globalESSymbolType;
}
return type;
}
function createUnionProperty(unionType, name) {
var types = unionType.types;
var props;
for (var _i = 0; _i < types.length; _i++) {
var current = types[_i];
var type = getApparentType(current);
if (type !== unknownType) {
var prop = getPropertyOfType(type, name);
if (!prop || getDeclarationFlagsFromSymbol(prop) & (32 | 64)) {
return undefined;
}
if (!props) {
props = [prop];
}
else {
props.push(prop);
}
}
}
var propTypes = [];
var declarations = [];
for (var _a = 0; _a < props.length; _a++) {
var prop = props[_a];
if (prop.declarations) {
declarations.push.apply(declarations, prop.declarations);
}
propTypes.push(getTypeOfSymbol(prop));
}
var result = createSymbol(4 | 67108864 | 268435456, name);
result.unionType = unionType;
result.declarations = declarations;
result.type = getUnionType(propTypes);
return result;
}
function getPropertyOfUnionType(type, name) {
var properties = type.resolvedProperties || (type.resolvedProperties = {});
if (ts.hasProperty(properties, name)) {
return properties[name];
}
var property = createUnionProperty(type, name);
if (property) {
properties[name] = property;
}
return property;
}
function getPropertyOfType(type, name) {
type = getApparentType(type);
if (type.flags & 48128) {
var resolved = resolveObjectOrUnionTypeMembers(type);
if (ts.hasProperty(resolved.members, name)) {
var symbol = resolved.members[name];
if (symbolIsValue(symbol)) {
return symbol;
}
}
if (resolved === anyFunctionType || resolved.callSignatures.length || resolved.constructSignatures.length) {
var symbol = getPropertyOfObjectType(globalFunctionType, name);
if (symbol) {
return symbol;
}
}
return getPropertyOfObjectType(globalObjectType, name);
}
if (type.flags & 16384) {
return getPropertyOfUnionType(type, name);
}
return undefined;
}
function getSignaturesOfObjectOrUnionType(type, kind) {
if (type.flags & (48128 | 16384)) {
var resolved = resolveObjectOrUnionTypeMembers(type);
return kind === 0 ? resolved.callSignatures : resolved.constructSignatures;
}
return emptyArray;
}
function getSignaturesOfType(type, kind) {
return getSignaturesOfObjectOrUnionType(getApparentType(type), kind);
}
function typeHasCallOrConstructSignatures(type) {
var apparentType = getApparentType(type);
if (apparentType.flags & (48128 | 16384)) {
var resolved = resolveObjectOrUnionTypeMembers(type);
return resolved.callSignatures.length > 0
|| resolved.constructSignatures.length > 0;
}
return false;
}
function getIndexTypeOfObjectOrUnionType(type, kind) {
if (type.flags & (48128 | 16384)) {
var resolved = resolveObjectOrUnionTypeMembers(type);
return kind === 0 ? resolved.stringIndexType : resolved.numberIndexType;
}
}
function getIndexTypeOfType(type, kind) {
return getIndexTypeOfObjectOrUnionType(getApparentType(type), kind);
}
function getTypeParametersFromDeclaration(typeParameterDeclarations) {
var result = [];
ts.forEach(typeParameterDeclarations, function (node) {
var tp = getDeclaredTypeOfTypeParameter(node.symbol);
if (!ts.contains(result, tp)) {
result.push(tp);
}
});
return result;
}
function symbolsToArray(symbols) {
var result = [];
for (var id in symbols) {
if (!isReservedMemberName(id)) {
result.push(symbols[id]);
}
}
return result;
}
function getSignatureFromDeclaration(declaration) {
var links = getNodeLinks(declaration);
if (!links.resolvedSignature) {
var classType = declaration.kind === 136 ? getDeclaredTypeOfClassOrInterface(declaration.parent.symbol) : undefined;
var typeParameters = classType ? classType.typeParameters :
declaration.typeParameters ? getTypeParametersFromDeclaration(declaration.typeParameters) : undefined;
var parameters = [];
var hasStringLiterals = false;
var minArgumentCount = -1;
for (var i = 0, n = declaration.parameters.length; i < n; i++) {
var param = declaration.parameters[i];
parameters.push(param.symbol);
if (param.type && param.type.kind === 8) {
hasStringLiterals = true;
}
if (minArgumentCount < 0) {
if (param.initializer || param.questionToken || param.dotDotDotToken) {
minArgumentCount = i;
}
}
}
if (minArgumentCount < 0) {
minArgumentCount = declaration.parameters.length;
}
var returnType;
if (classType) {
returnType = classType;
}
else if (declaration.type) {
returnType = getTypeFromTypeNode(declaration.type);
}
else {
if (declaration.kind === 137 && !ts.hasDynamicName(declaration)) {
var setter = ts.getDeclarationOfKind(declaration.symbol, 138);
returnType = getAnnotatedAccessorType(setter);
}
if (!returnType && ts.nodeIsMissing(declaration.body)) {
returnType = anyType;
}
}
links.resolvedSignature = createSignature(declaration, typeParameters, parameters, returnType, minArgumentCount, ts.hasRestParameters(declaration), hasStringLiterals);
}
return links.resolvedSignature;
}
function getSignaturesOfSymbol(symbol) {
if (!symbol)
return emptyArray;
var result = [];
for (var i = 0, len = symbol.declarations.length; i < len; i++) {
var node = symbol.declarations[i];
switch (node.kind) {
case 143:
case 144:
case 201:
case 135:
case 134:
case 136:
case 139:
case 140:
case 141:
case 137:
case 138:
case 163:
case 164:
if (i > 0 && node.body) {
var previous = symbol.declarations[i - 1];
if (node.parent === previous.parent && node.kind === previous.kind && node.pos === previous.end) {
break;
}
}
result.push(getSignatureFromDeclaration(node));
}
}
return result;
}
function getReturnTypeOfSignature(signature) {
if (!signature.resolvedReturnType) {
if (!pushTypeResolution(signature)) {
return unknownType;
}
var type;
if (signature.target) {
type = instantiateType(getReturnTypeOfSignature(signature.target), signature.mapper);
}
else if (signature.unionSignatures) {
type = getUnionType(ts.map(signature.unionSignatures, getReturnTypeOfSignature));
}
else {
type = getReturnTypeFromBody(signature.declaration);
}
if (!popTypeResolution()) {
type = anyType;
if (compilerOptions.noImplicitAny) {
var declaration = signature.declaration;
if (declaration.name) {
error(declaration.name, ts.Diagnostics._0_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions, ts.declarationNameToString(declaration.name));
}
else {
error(declaration, ts.Diagnostics.Function_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions);
}
}
}
signature.resolvedReturnType = type;
}
return signature.resolvedReturnType;
}
function getRestTypeOfSignature(signature) {
if (signature.hasRestParameter) {
var type = getTypeOfSymbol(ts.lastOrUndefined(signature.parameters));
if (type.flags & 4096 && type.target === globalArrayType) {
return type.typeArguments[0];
}
}
return anyType;
}
function getSignatureInstantiation(signature, typeArguments) {
return instantiateSignature(signature, createTypeMapper(signature.typeParameters, typeArguments), true);
}
function getErasedSignature(signature) {
if (!signature.typeParameters)
return signature;
if (!signature.erasedSignatureCache) {
if (signature.target) {
signature.erasedSignatureCache = instantiateSignature(getErasedSignature(signature.target), signature.mapper);
}
else {
signature.erasedSignatureCache = instantiateSignature(signature, createTypeEraser(signature.typeParameters), true);
}
}
return signature.erasedSignatureCache;
}
function getOrCreateTypeFromSignature(signature) {
if (!signature.isolatedSignatureType) {
var isConstructor = signature.declaration.kind === 136 || signature.declaration.kind === 140;
var type = createObjectType(32768 | 65536);
type.members = emptySymbols;
type.properties = emptyArray;
type.callSignatures = !isConstructor ? [signature] : emptyArray;
type.constructSignatures = isConstructor ? [signature] : emptyArray;
signature.isolatedSignatureType = type;
}
return signature.isolatedSignatureType;
}
function getIndexSymbol(symbol) {
return symbol.members["__index"];
}
function getIndexDeclarationOfSymbol(symbol, kind) {
var syntaxKind = kind === 1 ? 120 : 122;
var indexSymbol = getIndexSymbol(symbol);
if (indexSymbol) {
var len = indexSymbol.declarations.length;
for (var _i = 0, _a = indexSymbol.declarations; _i < _a.length; _i++) {
var decl = _a[_i];
var node = decl;
if (node.parameters.length === 1) {
var parameter = node.parameters[0];
if (parameter && parameter.type && parameter.type.kind === syntaxKind) {
return node;
}
}
}
}
return undefined;
}
function getIndexTypeOfSymbol(symbol, kind) {
var declaration = getIndexDeclarationOfSymbol(symbol, kind);
return declaration
? declaration.type ? getTypeFromTypeNode(declaration.type) : anyType
: undefined;
}
function getConstraintOfTypeParameter(type) {
if (!type.constraint) {
if (type.target) {
var targetConstraint = getConstraintOfTypeParameter(type.target);
type.constraint = targetConstraint ? instantiateType(targetConstraint, type.mapper) : noConstraintType;
}
else {
type.constraint = getTypeFromTypeNode(ts.getDeclarationOfKind(type.symbol, 129).constraint);
}
}
return type.constraint === noConstraintType ? undefined : type.constraint;
}
function getTypeListId(types) {
switch (types.length) {
case 1:
return "" + types[0].id;
case 2:
return types[0].id + "," + types[1].id;
default:
var result = "";
for (var i = 0; i < types.length; i++) {
if (i > 0) {
result += ",";
}
result += types[i].id;
}
return result;
}
}
function getWideningFlagsOfTypes(types) {
var result = 0;
for (var _i = 0; _i < types.length; _i++) {
var type = types[_i];
result |= type.flags;
}
return result & 786432;
}
function createTypeReference(target, typeArguments) {
var id = getTypeListId(typeArguments);
var type = target.instantiations[id];
if (!type) {
var flags = 4096 | getWideningFlagsOfTypes(typeArguments);
type = target.instantiations[id] = createObjectType(flags, target.symbol);
type.target = target;
type.typeArguments = typeArguments;
}
return type;
}
function isTypeParameterReferenceIllegalInConstraint(typeReferenceNode, typeParameterSymbol) {
var links = getNodeLinks(typeReferenceNode);
if (links.isIllegalTypeReferenceInConstraint !== undefined) {
return links.isIllegalTypeReferenceInConstraint;
}
var currentNode = typeReferenceNode;
while (!ts.forEach(typeParameterSymbol.declarations, function (d) { return d.parent === currentNode.parent; })) {
currentNode = currentNode.parent;
}
links.isIllegalTypeReferenceInConstraint = currentNode.kind === 129;
return links.isIllegalTypeReferenceInConstraint;
}
function checkTypeParameterHasIllegalReferencesInConstraint(typeParameter) {
var typeParameterSymbol;
function check(n) {
if (n.kind === 142 && n.typeName.kind === 65) {
var links = getNodeLinks(n);
if (links.isIllegalTypeReferenceInConstraint === undefined) {
var symbol = resolveName(typeParameter, n.typeName.text, 793056, undefined, undefined);
if (symbol && (symbol.flags & 262144)) {
links.isIllegalTypeReferenceInConstraint = ts.forEach(symbol.declarations, function (d) { return d.parent == typeParameter.parent; });
}
}
if (links.isIllegalTypeReferenceInConstraint) {
error(typeParameter, ts.Diagnostics.Constraint_of_a_type_parameter_cannot_reference_any_type_parameter_from_the_same_type_parameter_list);
}
}
ts.forEachChild(n, check);
}
if (typeParameter.constraint) {
typeParameterSymbol = getSymbolOfNode(typeParameter);
check(typeParameter.constraint);
}
}
function getTypeFromTypeReferenceOrExpressionWithTypeArguments(node) {
var links = getNodeLinks(node);
if (!links.resolvedType) {
var type;
if (node.kind !== 177 || ts.isSupportedExpressionWithTypeArguments(node)) {
var typeNameOrExpression = node.kind === 142
? node.typeName
: node.expression;
var symbol = resolveEntityName(typeNameOrExpression, 793056);
if (symbol) {
if ((symbol.flags & 262144) && isTypeParameterReferenceIllegalInConstraint(node, symbol)) {
type = unknownType;
}
else {
type = getDeclaredTypeOfSymbol(symbol);
if (type.flags & (1024 | 2048) && type.flags & 4096) {
var typeParameters = type.typeParameters;
if (node.typeArguments && node.typeArguments.length === typeParameters.length) {
type = createTypeReference(type, ts.map(node.typeArguments, getTypeFromTypeNode));
}
else {
error(node, ts.Diagnostics.Generic_type_0_requires_1_type_argument_s, typeToString(type, undefined, 1), typeParameters.length);
type = undefined;
}
}
else {
if (node.typeArguments) {
error(node, ts.Diagnostics.Type_0_is_not_generic, typeToString(type));
type = undefined;
}
}
}
}
}
links.resolvedType = type || unknownType;
}
return links.resolvedType;
}
function getTypeFromTypeQueryNode(node) {
var links = getNodeLinks(node);
if (!links.resolvedType) {
links.resolvedType = getWidenedType(checkExpressionOrQualifiedName(node.exprName));
}
return links.resolvedType;
}
function getTypeOfGlobalSymbol(symbol, arity) {
function getTypeDeclaration(symbol) {
var declarations = symbol.declarations;
for (var _i = 0; _i < declarations.length; _i++) {
var declaration = declarations[_i];
switch (declaration.kind) {
case 202:
case 203:
case 205:
return declaration;
}
}
}
if (!symbol) {
return emptyObjectType;
}
var type = getDeclaredTypeOfSymbol(symbol);
if (!(type.flags & 48128)) {
error(getTypeDeclaration(symbol), ts.Diagnostics.Global_type_0_must_be_a_class_or_interface_type, symbol.name);
return emptyObjectType;
}
if ((type.typeParameters ? type.typeParameters.length : 0) !== arity) {
error(getTypeDeclaration(symbol), ts.Diagnostics.Global_type_0_must_have_1_type_parameter_s, symbol.name, arity);
return emptyObjectType;
}
return type;
}
function getGlobalValueSymbol(name) {
return getGlobalSymbol(name, 107455, ts.Diagnostics.Cannot_find_global_value_0);
}
function getGlobalTypeSymbol(name) {
return getGlobalSymbol(name, 793056, ts.Diagnostics.Cannot_find_global_type_0);
}
function getGlobalSymbol(name, meaning, diagnostic) {
return resolveName(undefined, name, meaning, diagnostic, name);
}
function getGlobalType(name, arity) {
if (arity === void 0) { arity = 0; }
return getTypeOfGlobalSymbol(getGlobalTypeSymbol(name), arity);
}
function getGlobalESSymbolConstructorSymbol() {
return globalESSymbolConstructorSymbol || (globalESSymbolConstructorSymbol = getGlobalValueSymbol("Symbol"));
}
function createIterableType(elementType) {
return globalIterableType !== emptyObjectType ? createTypeReference(globalIterableType, [elementType]) : emptyObjectType;
}
function createArrayType(elementType) {
var arrayType = globalArrayType || getDeclaredTypeOfSymbol(globalArraySymbol);
return arrayType !== emptyObjectType ? createTypeReference(arrayType, [elementType]) : emptyObjectType;
}
function getTypeFromArrayTypeNode(node) {
var links = getNodeLinks(node);
if (!links.resolvedType) {
links.resolvedType = createArrayType(getTypeFromTypeNode(node.elementType));
}
return links.resolvedType;
}
function createTupleType(elementTypes) {
var id = getTypeListId(elementTypes);
var type = tupleTypes[id];
if (!type) {
type = tupleTypes[id] = createObjectType(8192);
type.elementTypes = elementTypes;
}
return type;
}
function getTypeFromTupleTypeNode(node) {
var links = getNodeLinks(node);
if (!links.resolvedType) {
links.resolvedType = createTupleType(ts.map(node.elementTypes, getTypeFromTypeNode));
}
return links.resolvedType;
}
function addTypeToSortedSet(sortedSet, type) {
if (type.flags & 16384) {
addTypesToSortedSet(sortedSet, type.types);
}
else {
var i = 0;
var id = type.id;
while (i < sortedSet.length && sortedSet[i].id < id) {
i++;
}
if (i === sortedSet.length || sortedSet[i].id !== id) {
sortedSet.splice(i, 0, type);
}
}
}
function addTypesToSortedSet(sortedTypes, types) {
for (var _i = 0; _i < types.length; _i++) {
var type = types[_i];
addTypeToSortedSet(sortedTypes, type);
}
}
function isSubtypeOfAny(candidate, types) {
for (var _i = 0; _i < types.length; _i++) {
var type = types[_i];
if (candidate !== type && isTypeSubtypeOf(candidate, type)) {
return true;
}
}
return false;
}
var removeSubtypesStack = [];
function removeSubtypes(types) {
var typeListId = getTypeListId(types);
if (removeSubtypesStack.lastIndexOf(typeListId) >= 0) {
return;
}
removeSubtypesStack.push(typeListId);
var i = types.length;
while (i > 0) {
i--;
if (isSubtypeOfAny(types[i], types)) {
types.splice(i, 1);
}
}
removeSubtypesStack.pop();
}
function containsAnyType(types) {
for (var _i = 0; _i < types.length; _i++) {
var type = types[_i];
if (type.flags & 1) {
return true;
}
}
return false;
}
function removeAllButLast(types, typeToRemove) {
var i = types.length;
while (i > 0 && types.length > 1) {
i--;
if (types[i] === typeToRemove) {
types.splice(i, 1);
}
}
}
function getUnionType(types, noSubtypeReduction) {
if (types.length === 0) {
return emptyObjectType;
}
var sortedTypes = [];
addTypesToSortedSet(sortedTypes, types);
if (noSubtypeReduction) {
if (containsAnyType(sortedTypes)) {
return anyType;
}
removeAllButLast(sortedTypes, undefinedType);
removeAllButLast(sortedTypes, nullType);
}
else {
removeSubtypes(sortedTypes);
}
if (sortedTypes.length === 1) {
return sortedTypes[0];
}
var id = getTypeListId(sortedTypes);
var type = unionTypes[id];
if (!type) {
type = unionTypes[id] = createObjectType(16384 | getWideningFlagsOfTypes(sortedTypes));
type.types = sortedTypes;
type.reducedType = noSubtypeReduction ? undefined : type;
}
return type;
}
function getReducedTypeOfUnionType(type) {
if (!type.reducedType) {
type.reducedType = getUnionType(type.types, false);
}
return type.reducedType;
}
function getTypeFromUnionTypeNode(node) {
var links = getNodeLinks(node);
if (!links.resolvedType) {
links.resolvedType = getUnionType(ts.map(node.types, getTypeFromTypeNode), true);
}
return links.resolvedType;
}
function getTypeFromTypeLiteralOrFunctionOrConstructorTypeNode(node) {
var links = getNodeLinks(node);
if (!links.resolvedType) {
links.resolvedType = createObjectType(32768, node.symbol);
}
return links.resolvedType;
}
function getStringLiteralType(node) {
if (ts.hasProperty(stringLiteralTypes, node.text)) {
return stringLiteralTypes[node.text];
}
var type = stringLiteralTypes[node.text] = createType(256);
type.text = ts.getTextOfNode(node);
return type;
}
function getTypeFromStringLiteral(node) {
var links = getNodeLinks(node);
if (!links.resolvedType) {
links.resolvedType = getStringLiteralType(node);
}
return links.resolvedType;
}
function getTypeFromTypeNode(node) {
switch (node.kind) {
case 112:
return anyType;
case 122:
return stringType;
case 120:
return numberType;
case 113:
return booleanType;
case 123:
return esSymbolType;
case 99:
return voidType;
case 8:
return getTypeFromStringLiteral(node);
case 142:
return getTypeFromTypeReferenceOrExpressionWithTypeArguments(node);
case 177:
return getTypeFromTypeReferenceOrExpressionWithTypeArguments(node);
case 145:
return getTypeFromTypeQueryNode(node);
case 147:
return getTypeFromArrayTypeNode(node);
case 148:
return getTypeFromTupleTypeNode(node);
case 149:
return getTypeFromUnionTypeNode(node);
case 150:
return getTypeFromTypeNode(node.type);
case 143:
case 144:
case 146:
return getTypeFromTypeLiteralOrFunctionOrConstructorTypeNode(node);
case 65:
case 127:
var symbol = getSymbolInfo(node);
return symbol && getDeclaredTypeOfSymbol(symbol);
default:
return unknownType;
}
}
function instantiateList(items, mapper, instantiator) {
if (items && items.length) {
var result = [];
for (var _i = 0; _i < items.length; _i++) {
var v = items[_i];
result.push(instantiator(v, mapper));
}
return result;
}
return items;
}
function createUnaryTypeMapper(source, target) {
return function (t) { return t === source ? target : t; };
}
function createBinaryTypeMapper(source1, target1, source2, target2) {
return function (t) { return t === source1 ? target1 : t === source2 ? target2 : t; };
}
function createTypeMapper(sources, targets) {
switch (sources.length) {
case 1: return createUnaryTypeMapper(sources[0], targets[0]);
case 2: return createBinaryTypeMapper(sources[0], targets[0], sources[1], targets[1]);
}
return function (t) {
for (var i = 0; i < sources.length; i++) {
if (t === sources[i]) {
return targets[i];
}
}
return t;
};
}
function createUnaryTypeEraser(source) {
return function (t) { return t === source ? anyType : t; };
}
function createBinaryTypeEraser(source1, source2) {
return function (t) { return t === source1 || t === source2 ? anyType : t; };
}
function createTypeEraser(sources) {
switch (sources.length) {
case 1: return createUnaryTypeEraser(sources[0]);
case 2: return createBinaryTypeEraser(sources[0], sources[1]);
}
return function (t) {
for (var _i = 0; _i < sources.length; _i++) {
var source = sources[_i];
if (t === source) {
return anyType;
}
}
return t;
};
}
function createInferenceMapper(context) {
return function (t) {
for (var i = 0; i < context.typeParameters.length; i++) {
if (t === context.typeParameters[i]) {
context.inferences[i].isFixed = true;
return getInferredType(context, i);
}
}
return t;
};
}
function identityMapper(type) {
return type;
}
function combineTypeMappers(mapper1, mapper2) {
return function (t) { return instantiateType(mapper1(t), mapper2); };
}
function instantiateTypeParameter(typeParameter, mapper) {
var result = createType(512);
result.symbol = typeParameter.symbol;
if (typeParameter.constraint) {
result.constraint = instantiateType(typeParameter.constraint, mapper);
}
else {
result.target = typeParameter;
result.mapper = mapper;
}
return result;
}
function instantiateSignature(signature, mapper, eraseTypeParameters) {
var freshTypeParameters;
if (signature.typeParameters && !eraseTypeParameters) {
freshTypeParameters = instantiateList(signature.typeParameters, mapper, instantiateTypeParameter);
mapper = combineTypeMappers(createTypeMapper(signature.typeParameters, freshTypeParameters), mapper);
}
var result = createSignature(signature.declaration, freshTypeParameters, instantiateList(signature.parameters, mapper, instantiateSymbol), signature.resolvedReturnType ? instantiateType(signature.resolvedReturnType, mapper) : undefined, signature.minArgumentCount, signature.hasRestParameter, signature.hasStringLiterals);
result.target = signature;
result.mapper = mapper;
return result;
}
function instantiateSymbol(symbol, mapper) {
if (symbol.flags & 16777216) {
var links = getSymbolLinks(symbol);
symbol = links.target;
mapper = combineTypeMappers(links.mapper, mapper);
}
var result = createSymbol(16777216 | 67108864 | symbol.flags, symbol.name);
result.declarations = symbol.declarations;
result.parent = symbol.parent;
result.target = symbol;
result.mapper = mapper;
if (symbol.valueDeclaration) {
result.valueDeclaration = symbol.valueDeclaration;
}
return result;
}
function instantiateAnonymousType(type, mapper) {
var result = createObjectType(32768, type.symbol);
result.properties = instantiateList(getPropertiesOfObjectType(type), mapper, instantiateSymbol);
result.members = createSymbolTable(result.properties);
result.callSignatures = instantiateList(getSignaturesOfType(type, 0), mapper, instantiateSignature);
result.constructSignatures = instantiateList(getSignaturesOfType(type, 1), mapper, instantiateSignature);
var stringIndexType = getIndexTypeOfType(type, 0);
var numberIndexType = getIndexTypeOfType(type, 1);
if (stringIndexType)
result.stringIndexType = instantiateType(stringIndexType, mapper);
if (numberIndexType)
result.numberIndexType = instantiateType(numberIndexType, mapper);
return result;
}
function instantiateType(type, mapper) {
if (mapper !== identityMapper) {
if (type.flags & 512) {
return mapper(type);
}
if (type.flags & 32768) {
return type.symbol && type.symbol.flags & (16 | 8192 | 2048 | 4096) ?
instantiateAnonymousType(type, mapper) : type;
}
if (type.flags & 4096) {
return createTypeReference(type.target, instantiateList(type.typeArguments, mapper, instantiateType));
}
if (type.flags & 8192) {
return createTupleType(instantiateList(type.elementTypes, mapper, instantiateType));
}
if (type.flags & 16384) {
return getUnionType(instantiateList(type.types, mapper, instantiateType), true);
}
}
return type;
}
function isContextSensitive(node) {
ts.Debug.assert(node.kind !== 135 || ts.isObjectLiteralMethod(node));
switch (node.kind) {
case 163:
case 164:
return isContextSensitiveFunctionLikeDeclaration(node);
case 155:
return ts.forEach(node.properties, isContextSensitive);
case 154:
return ts.forEach(node.elements, isContextSensitive);
case 171:
return isContextSensitive(node.whenTrue) ||
isContextSensitive(node.whenFalse);
case 170:
return node.operatorToken.kind === 49 &&
(isContextSensitive(node.left) || isContextSensitive(node.right));
case 225:
return isContextSensitive(node.initializer);
case 135:
case 134:
return isContextSensitiveFunctionLikeDeclaration(node);
case 162:
return isContextSensitive(node.expression);
}
return false;
}
function isContextSensitiveFunctionLikeDeclaration(node) {
return !node.typeParameters && node.parameters.length && !ts.forEach(node.parameters, function (p) { return p.type; });
}
function getTypeWithoutConstructors(type) {
if (type.flags & 48128) {
var resolved = resolveObjectOrUnionTypeMembers(type);
if (resolved.constructSignatures.length) {
var result = createObjectType(32768, type.symbol);
result.members = resolved.members;
result.properties = resolved.properties;
result.callSignatures = resolved.callSignatures;
result.constructSignatures = emptyArray;
type = result;
}
}
return type;
}
var subtypeRelation = {};
var assignableRelation = {};
var identityRelation = {};
function isTypeIdenticalTo(source, target) {
return checkTypeRelatedTo(source, target, identityRelation, undefined);
}
function compareTypes(source, target) {
return checkTypeRelatedTo(source, target, identityRelation, undefined) ? -1 : 0;
}
function isTypeSubtypeOf(source, target) {
return checkTypeSubtypeOf(source, target, undefined);
}
function isTypeAssignableTo(source, target) {
return checkTypeAssignableTo(source, target, undefined);
}
function checkTypeSubtypeOf(source, target, errorNode, headMessage, containingMessageChain) {
return checkTypeRelatedTo(source, target, subtypeRelation, errorNode, headMessage, containingMessageChain);
}
function checkTypeAssignableTo(source, target, errorNode, headMessage) {
return checkTypeRelatedTo(source, target, assignableRelation, errorNode, headMessage);
}
function isSignatureAssignableTo(source, target) {
var sourceType = getOrCreateTypeFromSignature(source);
var targetType = getOrCreateTypeFromSignature(target);
return checkTypeRelatedTo(sourceType, targetType, assignableRelation, undefined);
}
function checkTypeRelatedTo(source, target, relation, errorNode, headMessage, containingMessageChain) {
var errorInfo;
var sourceStack;
var targetStack;
var maybeStack;
var expandingFlags;
var depth = 0;
var overflow = false;
var elaborateErrors = false;
ts.Debug.assert(relation !== identityRelation || !errorNode, "no error reporting in identity checking");
var result = isRelatedTo(source, target, errorNode !== undefined, headMessage);
if (overflow) {
error(errorNode, ts.Diagnostics.Excessive_stack_depth_comparing_types_0_and_1, typeToString(source), typeToString(target));
}
else if (errorInfo) {
if (errorInfo.next === undefined) {
errorInfo = undefined;
elaborateErrors = true;
isRelatedTo(source, target, errorNode !== undefined, headMessage);
}
if (containingMessageChain) {
errorInfo = ts.concatenateDiagnosticMessageChains(containingMessageChain, errorInfo);
}
diagnostics.add(ts.createDiagnosticForNodeFromMessageChain(errorNode, errorInfo));
}
return result !== 0;
function reportError(message, arg0, arg1, arg2) {
errorInfo = ts.chainDiagnosticMessages(errorInfo, message, arg0, arg1, arg2);
}
function isRelatedTo(source, target, reportErrors, headMessage) {
var result;
if (source === target)
return -1;
if (relation !== identityRelation) {
if (target.flags & 1)
return -1;
if (source === undefinedType)
return -1;
if (source === nullType && target !== undefinedType)
return -1;
if (source.flags & 128 && target === numberType)
return -1;
if (source.flags & 256 && target === stringType)
return -1;
if (relation === assignableRelation) {
if (source.flags & 1)
return -1;
if (source === numberType && target.flags & 128)
return -1;
}
}
var saveErrorInfo = errorInfo;
if (source.flags & 16384 || target.flags & 16384) {
if (relation === identityRelation) {
if (source.flags & 16384 && target.flags & 16384) {
if (result = unionTypeRelatedToUnionType(source, target)) {
if (result &= unionTypeRelatedToUnionType(target, source)) {
return result;
}
}
}
else if (source.flags & 16384) {
if (result = unionTypeRelatedToType(source, target, reportErrors)) {
return result;
}
}
else {
if (result = unionTypeRelatedToType(target, source, reportErrors)) {
return result;
}
}
}
else {
if (source.flags & 16384) {
if (result = unionTypeRelatedToType(source, target, reportErrors)) {
return result;
}
}
else {
if (result = typeRelatedToUnionType(source, target, reportErrors)) {
return result;
}
}
}
}
else if (source.flags & 512 && target.flags & 512) {
if (result = typeParameterRelatedTo(source, target, reportErrors)) {
return result;
}
}
else if (source.flags & 4096 && target.flags & 4096 && source.target === target.target) {
if (result = typesRelatedTo(source.typeArguments, target.typeArguments, reportErrors)) {
return result;
}
}
var reportStructuralErrors = reportErrors && errorInfo === saveErrorInfo;
var sourceOrApparentType = relation === identityRelation ? source : getApparentType(source);
if (sourceOrApparentType.flags & 48128 && target.flags & 48128) {
if (result = objectTypeRelatedTo(sourceOrApparentType, target, reportStructuralErrors)) {
errorInfo = saveErrorInfo;
return result;
}
}
else if (source.flags & 512 && sourceOrApparentType.flags & 16384) {
errorInfo = saveErrorInfo;
if (result = isRelatedTo(sourceOrApparentType, target, reportErrors)) {
return result;
}
}
if (reportErrors) {
headMessage = headMessage || ts.Diagnostics.Type_0_is_not_assignable_to_type_1;
var sourceType = typeToString(source);
var targetType = typeToString(target);
if (sourceType === targetType) {
sourceType = typeToString(source, undefined, 128);
targetType = typeToString(target, undefined, 128);
}
reportError(headMessage, sourceType, targetType);
}
return 0;
}
function unionTypeRelatedToUnionType(source, target) {
var result = -1;
var sourceTypes = source.types;
for (var _i = 0; _i < sourceTypes.length; _i++) {
var sourceType = sourceTypes[_i];
var related = typeRelatedToUnionType(sourceType, target, false);
if (!related) {
return 0;
}
result &= related;
}
return result;
}
function typeRelatedToUnionType(source, target, reportErrors) {
var targetTypes = target.types;
for (var i = 0, len = targetTypes.length; i < len; i++) {
var related = isRelatedTo(source, targetTypes[i], reportErrors && i === len - 1);
if (related) {
return related;
}
}
return 0;
}
function unionTypeRelatedToType(source, target, reportErrors) {
var result = -1;
var sourceTypes = source.types;
for (var _i = 0; _i < sourceTypes.length; _i++) {
var sourceType = sourceTypes[_i];
var related = isRelatedTo(sourceType, target, reportErrors);
if (!related) {
return 0;
}
result &= related;
}
return result;
}
function typesRelatedTo(sources, targets, reportErrors) {
var result = -1;
for (var i = 0, len = sources.length; i < len; i++) {
var related = isRelatedTo(sources[i], targets[i], reportErrors);
if (!related) {
return 0;
}
result &= related;
}
return result;
}
function typeParameterRelatedTo(source, target, reportErrors) {
if (relation === identityRelation) {
if (source.symbol.name !== target.symbol.name) {
return 0;
}
if (source.constraint === target.constraint) {
return -1;
}
if (source.constraint === noConstraintType || target.constraint === noConstraintType) {
return 0;
}
return isRelatedTo(source.constraint, target.constraint, reportErrors);
}
else {
while (true) {
var constraint = getConstraintOfTypeParameter(source);
if (constraint === target)
return -1;
if (!(constraint && constraint.flags & 512))
break;
source = constraint;
}
return 0;
}
}
function objectTypeRelatedTo(source, target, reportErrors) {
if (overflow) {
return 0;
}
var id = relation !== identityRelation || source.id < target.id ? source.id + "," + target.id : target.id + "," + source.id;
var related = relation[id];
if (related !== undefined) {
if (!elaborateErrors || (related === 3)) {
return related === 1 ? -1 : 0;
}
}
if (depth > 0) {
for (var i = 0; i < depth; i++) {
if (maybeStack[i][id]) {
return 1;
}
}
if (depth === 100) {
overflow = true;
return 0;
}
}
else {
sourceStack = [];
targetStack = [];
maybeStack = [];
expandingFlags = 0;
}
sourceStack[depth] = source;
targetStack[depth] = target;
maybeStack[depth] = {};
maybeStack[depth][id] = 1;
depth++;
var saveExpandingFlags = expandingFlags;
if (!(expandingFlags & 1) && isDeeplyNestedGeneric(source, sourceStack))
expandingFlags |= 1;
if (!(expandingFlags & 2) && isDeeplyNestedGeneric(target, targetStack))
expandingFlags |= 2;
var result;
if (expandingFlags === 3) {
result = 1;
}
else {
result = propertiesRelatedTo(source, target, reportErrors);
if (result) {
result &= signaturesRelatedTo(source, target, 0, reportErrors);
if (result) {
result &= signaturesRelatedTo(source, target, 1, reportErrors);
if (result) {
result &= stringIndexTypesRelatedTo(source, target, reportErrors);
if (result) {
result &= numberIndexTypesRelatedTo(source, target, reportErrors);
}
}
}
}
}
expandingFlags = saveExpandingFlags;
depth--;
if (result) {
var maybeCache = maybeStack[depth];
var destinationCache = (result === -1 || depth === 0) ? relation : maybeStack[depth - 1];
ts.copyMap(maybeCache, destinationCache);
}
else {
relation[id] = reportErrors ? 3 : 2;
}
return result;
}
function isDeeplyNestedGeneric(type, stack) {
if (type.flags & 4096 && depth >= 10) {
var target_1 = type.target;
var count = 0;
for (var i = 0; i < depth; i++) {
var t = stack[i];
if (t.flags & 4096 && t.target === target_1) {
count++;
if (count >= 10)
return true;
}
}
}
return false;
}
function propertiesRelatedTo(source, target, reportErrors) {
if (relation === identityRelation) {
return propertiesIdenticalTo(source, target);
}
var result = -1;
var properties = getPropertiesOfObjectType(target);
var requireOptionalProperties = relation === subtypeRelation && !(source.flags & 131072);
for (var _i = 0; _i < properties.length; _i++) {
var targetProp = properties[_i];
var sourceProp = getPropertyOfType(source, targetProp.name);
if (sourceProp !== targetProp) {
if (!sourceProp) {
if (!(targetProp.flags & 536870912) || requireOptionalProperties) {
if (reportErrors) {
reportError(ts.Diagnostics.Property_0_is_missing_in_type_1, symbolToString(targetProp), typeToString(source));
}
return 0;
}
}
else if (!(targetProp.flags & 134217728)) {
var sourceFlags = getDeclarationFlagsFromSymbol(sourceProp);
var targetFlags = getDeclarationFlagsFromSymbol(targetProp);
if (sourceFlags & 32 || targetFlags & 32) {
if (sourceProp.valueDeclaration !== targetProp.valueDeclaration) {
if (reportErrors) {
if (sourceFlags & 32 && targetFlags & 32) {
reportError(ts.Diagnostics.Types_have_separate_declarations_of_a_private_property_0, symbolToString(targetProp));
}
else {
reportError(ts.Diagnostics.Property_0_is_private_in_type_1_but_not_in_type_2, symbolToString(targetProp), typeToString(sourceFlags & 32 ? source : target), typeToString(sourceFlags & 32 ? target : source));
}
}
return 0;
}
}
else if (targetFlags & 64) {
var sourceDeclaredInClass = sourceProp.parent && sourceProp.parent.flags & 32;
var sourceClass = sourceDeclaredInClass ? getDeclaredTypeOfSymbol(sourceProp.parent) : undefined;
var targetClass = getDeclaredTypeOfSymbol(targetProp.parent);
if (!sourceClass || !hasBaseType(sourceClass, targetClass)) {
if (reportErrors) {
reportError(ts.Diagnostics.Property_0_is_protected_but_type_1_is_not_a_class_derived_from_2, symbolToString(targetProp), typeToString(sourceClass || source), typeToString(targetClass));
}
return 0;
}
}
else if (sourceFlags & 64) {
if (reportErrors) {
reportError(ts.Diagnostics.Property_0_is_protected_in_type_1_but_public_in_type_2, symbolToString(targetProp), typeToString(source), typeToString(target));
}
return 0;
}
var related = isRelatedTo(getTypeOfSymbol(sourceProp), getTypeOfSymbol(targetProp), reportErrors);
if (!related) {
if (reportErrors) {
reportError(ts.Diagnostics.Types_of_property_0_are_incompatible, symbolToString(targetProp));
}
return 0;
}
result &= related;
if (sourceProp.flags & 536870912 && !(targetProp.flags & 536870912)) {
if (reportErrors) {
reportError(ts.Diagnostics.Property_0_is_optional_in_type_1_but_required_in_type_2, symbolToString(targetProp), typeToString(source), typeToString(target));
}
return 0;
}
}
}
}
return result;
}
function propertiesIdenticalTo(source, target) {
var sourceProperties = getPropertiesOfObjectType(source);
var targetProperties = getPropertiesOfObjectType(target);
if (sourceProperties.length !== targetProperties.length) {
return 0;
}
var result = -1;
for (var _i = 0; _i < sourceProperties.length; _i++) {
var sourceProp = sourceProperties[_i];
var targetProp = getPropertyOfObjectType(target, sourceProp.name);
if (!targetProp) {
return 0;
}
var related = compareProperties(sourceProp, targetProp, isRelatedTo);
if (!related) {
return 0;
}
result &= related;
}
return result;
}
function signaturesRelatedTo(source, target, kind, reportErrors) {
if (relation === identityRelation) {
return signaturesIdenticalTo(source, target, kind);
}
if (target === anyFunctionType || source === anyFunctionType) {
return -1;
}
var sourceSignatures = getSignaturesOfType(source, kind);
var targetSignatures = getSignaturesOfType(target, kind);
var result = -1;
var saveErrorInfo = errorInfo;
outer: for (var _i = 0; _i < targetSignatures.length; _i++) {
var t = targetSignatures[_i];
if (!t.hasStringLiterals || target.flags & 65536) {
var localErrors = reportErrors;
for (var _a = 0; _a < sourceSignatures.length; _a++) {
var s = sourceSignatures[_a];
if (!s.hasStringLiterals || source.flags & 65536) {
var related = signatureRelatedTo(s, t, localErrors);
if (related) {
result &= related;
errorInfo = saveErrorInfo;
continue outer;
}
localErrors = false;
}
}
return 0;
}
}
return result;
}
function signatureRelatedTo(source, target, reportErrors) {
if (source === target) {
return -1;
}
if (!target.hasRestParameter && source.minArgumentCount > target.parameters.length) {
return 0;
}
var sourceMax = source.parameters.length;
var targetMax = target.parameters.length;
var checkCount;
if (source.hasRestParameter && target.hasRestParameter) {
checkCount = sourceMax > targetMax ? sourceMax : targetMax;
sourceMax--;
targetMax--;
}
else if (source.hasRestParameter) {
sourceMax--;
checkCount = targetMax;
}
else if (target.hasRestParameter) {
targetMax--;
checkCount = sourceMax;
}
else {
checkCount = sourceMax < targetMax ? sourceMax : targetMax;
}
source = getErasedSignature(source);
target = getErasedSignature(target);
var result = -1;
for (var i = 0; i < checkCount; i++) {
var s_1 = i < sourceMax ? getTypeOfSymbol(source.parameters[i]) : getRestTypeOfSignature(source);
var t_1 = i < targetMax ? getTypeOfSymbol(target.parameters[i]) : getRestTypeOfSignature(target);
var saveErrorInfo = errorInfo;
var related = isRelatedTo(s_1, t_1, reportErrors);
if (!related) {
related = isRelatedTo(t_1, s_1, false);
if (!related) {
if (reportErrors) {
reportError(ts.Diagnostics.Types_of_parameters_0_and_1_are_incompatible, source.parameters[i < sourceMax ? i : sourceMax].name, target.parameters[i < targetMax ? i : targetMax].name);
}
return 0;
}
errorInfo = saveErrorInfo;
}
result &= related;
}
var t = getReturnTypeOfSignature(target);
if (t === voidType)
return result;
var s = getReturnTypeOfSignature(source);
return result & isRelatedTo(s, t, reportErrors);
}
function signaturesIdenticalTo(source, target, kind) {
var sourceSignatures = getSignaturesOfType(source, kind);
var targetSignatures = getSignaturesOfType(target, kind);
if (sourceSignatures.length !== targetSignatures.length) {
return 0;
}
var result = -1;
for (var i = 0, len = sourceSignatures.length; i < len; ++i) {
var related = compareSignatures(sourceSignatures[i], targetSignatures[i], true, isRelatedTo);
if (!related) {
return 0;
}
result &= related;
}
return result;
}
function stringIndexTypesRelatedTo(source, target, reportErrors) {
if (relation === identityRelation) {
return indexTypesIdenticalTo(0, source, target);
}
var targetType = getIndexTypeOfType(target, 0);
if (targetType) {
var sourceType = getIndexTypeOfType(source, 0);
if (!sourceType) {
if (reportErrors) {
reportError(ts.Diagnostics.Index_signature_is_missing_in_type_0, typeToString(source));
}
return 0;
}
var related = isRelatedTo(sourceType, targetType, reportErrors);
if (!related) {
if (reportErrors) {
reportError(ts.Diagnostics.Index_signatures_are_incompatible);
}
return 0;
}
return related;
}
return -1;
}
function numberIndexTypesRelatedTo(source, target, reportErrors) {
if (relation === identityRelation) {
return indexTypesIdenticalTo(1, source, target);
}
var targetType = getIndexTypeOfType(target, 1);
if (targetType) {
var sourceStringType = getIndexTypeOfType(source, 0);
var sourceNumberType = getIndexTypeOfType(source, 1);
if (!(sourceStringType || sourceNumberType)) {
if (reportErrors) {
reportError(ts.Diagnostics.Index_signature_is_missing_in_type_0, typeToString(source));
}
return 0;
}
var related;
if (sourceStringType && sourceNumberType) {
related = isRelatedTo(sourceStringType, targetType, false) || isRelatedTo(sourceNumberType, targetType, reportErrors);
}
else {
related = isRelatedTo(sourceStringType || sourceNumberType, targetType, reportErrors);
}
if (!related) {
if (reportErrors) {
reportError(ts.Diagnostics.Index_signatures_are_incompatible);
}
return 0;
}
return related;
}
return -1;
}
function indexTypesIdenticalTo(indexKind, source, target) {
var targetType = getIndexTypeOfType(target, indexKind);
var sourceType = getIndexTypeOfType(source, indexKind);
if (!sourceType && !targetType) {
return -1;
}
if (sourceType && targetType) {
return isRelatedTo(sourceType, targetType);
}
return 0;
}
}
function isPropertyIdenticalTo(sourceProp, targetProp) {
return compareProperties(sourceProp, targetProp, compareTypes) !== 0;
}
function compareProperties(sourceProp, targetProp, compareTypes) {
if (sourceProp === targetProp) {
return -1;
}
var sourcePropAccessibility = getDeclarationFlagsFromSymbol(sourceProp) & (32 | 64);
var targetPropAccessibility = getDeclarationFlagsFromSymbol(targetProp) & (32 | 64);
if (sourcePropAccessibility !== targetPropAccessibility) {
return 0;
}
if (sourcePropAccessibility) {
if (getTargetSymbol(sourceProp) !== getTargetSymbol(targetProp)) {
return 0;
}
}
else {
if ((sourceProp.flags & 536870912) !== (targetProp.flags & 536870912)) {
return 0;
}
}
return compareTypes(getTypeOfSymbol(sourceProp), getTypeOfSymbol(targetProp));
}
function compareSignatures(source, target, compareReturnTypes, compareTypes) {
if (source === target) {
return -1;
}
if (source.parameters.length !== target.parameters.length ||
source.minArgumentCount !== target.minArgumentCount ||
source.hasRestParameter !== target.hasRestParameter) {
return 0;
}
var result = -1;
if (source.typeParameters && target.typeParameters) {
if (source.typeParameters.length !== target.typeParameters.length) {
return 0;
}
for (var i = 0, len = source.typeParameters.length; i < len; ++i) {
var related = compareTypes(source.typeParameters[i], target.typeParameters[i]);
if (!related) {
return 0;
}
result &= related;
}
}
else if (source.typeParameters || target.typeParameters) {
return 0;
}
source = getErasedSignature(source);
target = getErasedSignature(target);
for (var i = 0, len = source.parameters.length; i < len; i++) {
var s = source.hasRestParameter && i === len - 1 ? getRestTypeOfSignature(source) : getTypeOfSymbol(source.parameters[i]);
var t = target.hasRestParameter && i === len - 1 ? getRestTypeOfSignature(target) : getTypeOfSymbol(target.parameters[i]);
var related = compareTypes(s, t);
if (!related) {
return 0;
}
result &= related;
}
if (compareReturnTypes) {
result &= compareTypes(getReturnTypeOfSignature(source), getReturnTypeOfSignature(target));
}
return result;
}
function isSupertypeOfEach(candidate, types) {
for (var _i = 0; _i < types.length; _i++) {
var type = types[_i];
if (candidate !== type && !isTypeSubtypeOf(type, candidate))
return false;
}
return true;
}
function getCommonSupertype(types) {
return ts.forEach(types, function (t) { return isSupertypeOfEach(t, types) ? t : undefined; });
}
function reportNoCommonSupertypeError(types, errorLocation, errorMessageChainHead) {
var bestSupertype;
var bestSupertypeDownfallType;
var bestSupertypeScore = 0;
for (var i = 0; i < types.length; i++) {
var score = 0;
var downfallType = undefined;
for (var j = 0; j < types.length; j++) {
if (isTypeSubtypeOf(types[j], types[i])) {
score++;
}
else if (!downfallType) {
downfallType = types[j];
}
}
ts.Debug.assert(!!downfallType, "If there is no common supertype, each type should have a downfallType");
if (score > bestSupertypeScore) {
bestSupertype = types[i];
bestSupertypeDownfallType = downfallType;
bestSupertypeScore = score;
}
if (bestSupertypeScore === types.length - 1) {
break;
}
}
checkTypeSubtypeOf(bestSupertypeDownfallType, bestSupertype, errorLocation, ts.Diagnostics.Type_argument_candidate_1_is_not_a_valid_type_argument_because_it_is_not_a_supertype_of_candidate_0, errorMessageChainHead);
}
function isArrayType(type) {
return type.flags & 4096 && type.target === globalArrayType;
}
function isArrayLikeType(type) {
return !(type.flags & (32 | 64)) && isTypeAssignableTo(type, anyArrayType);
}
function isTupleLikeType(type) {
return !!getPropertyOfType(type, "0");
}
function isTupleType(type) {
return (type.flags & 8192) && !!type.elementTypes;
}
function getWidenedTypeOfObjectLiteral(type) {
var properties = getPropertiesOfObjectType(type);
var members = {};
ts.forEach(properties, function (p) {
var propType = getTypeOfSymbol(p);
var widenedType = getWidenedType(propType);
if (propType !== widenedType) {
var symbol = createSymbol(p.flags | 67108864, p.name);
symbol.declarations = p.declarations;
symbol.parent = p.parent;
symbol.type = widenedType;
symbol.target = p;
if (p.valueDeclaration)
symbol.valueDeclaration = p.valueDeclaration;
p = symbol;
}
members[p.name] = p;
});
var stringIndexType = getIndexTypeOfType(type, 0);
var numberIndexType = getIndexTypeOfType(type, 1);
if (stringIndexType)
stringIndexType = getWidenedType(stringIndexType);
if (numberIndexType)
numberIndexType = getWidenedType(numberIndexType);
return createAnonymousType(type.symbol, members, emptyArray, emptyArray, stringIndexType, numberIndexType);
}
function getWidenedType(type) {
if (type.flags & 786432) {
if (type.flags & (32 | 64)) {
return anyType;
}
if (type.flags & 131072) {
return getWidenedTypeOfObjectLiteral(type);
}
if (type.flags & 16384) {
return getUnionType(ts.map(type.types, getWidenedType));
}
if (isArrayType(type)) {
return createArrayType(getWidenedType(type.typeArguments[0]));
}
}
return type;
}
function reportWideningErrorsInType(type) {
if (type.flags & 16384) {
var errorReported = false;
ts.forEach(type.types, function (t) {
if (reportWideningErrorsInType(t)) {
errorReported = true;
}
});
return errorReported;
}
if (isArrayType(type)) {
return reportWideningErrorsInType(type.typeArguments[0]);
}
if (type.flags & 131072) {
var errorReported = false;
ts.forEach(getPropertiesOfObjectType(type), function (p) {
var t = getTypeOfSymbol(p);
if (t.flags & 262144) {
if (!reportWideningErrorsInType(t)) {
error(p.valueDeclaration, ts.Diagnostics.Object_literal_s_property_0_implicitly_has_an_1_type, p.name, typeToString(getWidenedType(t)));
}
errorReported = true;
}
});
return errorReported;
}
return false;
}
function reportImplicitAnyError(declaration, type) {
var typeAsString = typeToString(getWidenedType(type));
var diagnostic;
switch (declaration.kind) {
case 133:
case 132:
diagnostic = ts.Diagnostics.Member_0_implicitly_has_an_1_type;
break;
case 130:
diagnostic = declaration.dotDotDotToken ?
ts.Diagnostics.Rest_parameter_0_implicitly_has_an_any_type :
ts.Diagnostics.Parameter_0_implicitly_has_an_1_type;
break;
case 201:
case 135:
case 134:
case 137:
case 138:
case 163:
case 164:
if (!declaration.name) {
error(declaration, ts.Diagnostics.Function_expression_which_lacks_return_type_annotation_implicitly_has_an_0_return_type, typeAsString);
return;
}
diagnostic = ts.Diagnostics._0_which_lacks_return_type_annotation_implicitly_has_an_1_return_type;
break;
default:
diagnostic = ts.Diagnostics.Variable_0_implicitly_has_an_1_type;
}
error(declaration, diagnostic, ts.declarationNameToString(declaration.name), typeAsString);
}
function reportErrorsFromWidening(declaration, type) {
if (produceDiagnostics && compilerOptions.noImplicitAny && type.flags & 262144) {
if (!reportWideningErrorsInType(type)) {
reportImplicitAnyError(declaration, type);
}
}
}
function forEachMatchingParameterType(source, target, callback) {
var sourceMax = source.parameters.length;
var targetMax = target.parameters.length;
var count;
if (source.hasRestParameter && target.hasRestParameter) {
count = sourceMax > targetMax ? sourceMax : targetMax;
sourceMax--;
targetMax--;
}
else if (source.hasRestParameter) {
sourceMax--;
count = targetMax;
}
else if (target.hasRestParameter) {
targetMax--;
count = sourceMax;
}
else {
count = sourceMax < targetMax ? sourceMax : targetMax;
}
for (var i = 0; i < count; i++) {
var s = i < sourceMax ? getTypeOfSymbol(source.parameters[i]) : getRestTypeOfSignature(source);
var t = i < targetMax ? getTypeOfSymbol(target.parameters[i]) : getRestTypeOfSignature(target);
callback(s, t);
}
}
function createInferenceContext(typeParameters, inferUnionTypes) {
var inferences = [];
for (var _i = 0; _i < typeParameters.length; _i++) {
var unused = typeParameters[_i];
inferences.push({ primary: undefined, secondary: undefined, isFixed: false });
}
return {
typeParameters: typeParameters,
inferUnionTypes: inferUnionTypes,
inferences: inferences,
inferredTypes: new Array(typeParameters.length)
};
}
function inferTypes(context, source, target) {
var sourceStack;
var targetStack;
var depth = 0;
var inferiority = 0;
inferFromTypes(source, target);
function isInProcess(source, target) {
for (var i = 0; i < depth; i++) {
if (source === sourceStack[i] && target === targetStack[i]) {
return true;
}
}
return false;
}
function isWithinDepthLimit(type, stack) {
if (depth >= 5) {
var target_2 = type.target;
var count = 0;
for (var i = 0; i < depth; i++) {
var t = stack[i];
if (t.flags & 4096 && t.target === target_2) {
count++;
}
}
return count < 5;
}
return true;
}
function inferFromTypes(source, target) {
if (source === anyFunctionType) {
return;
}
if (target.flags & 512) {
var typeParameters = context.typeParameters;
for (var i = 0; i < typeParameters.length; i++) {
if (target === typeParameters[i]) {
var inferences = context.inferences[i];
if (!inferences.isFixed) {
var candidates = inferiority ?
inferences.secondary || (inferences.secondary = []) :
inferences.primary || (inferences.primary = []);
if (!ts.contains(candidates, source)) {
candidates.push(source);
}
}
return;
}
}
}
else if (source.flags & 4096 && target.flags & 4096 && source.target === target.target) {
var sourceTypes = source.typeArguments;
var targetTypes = target.typeArguments;
for (var i = 0; i < sourceTypes.length; i++) {
inferFromTypes(sourceTypes[i], targetTypes[i]);
}
}
else if (target.flags & 16384) {
var targetTypes = target.types;
var typeParameterCount = 0;
var typeParameter;
for (var _i = 0; _i < targetTypes.length; _i++) {
var t = targetTypes[_i];
if (t.flags & 512 && ts.contains(context.typeParameters, t)) {
typeParameter = t;
typeParameterCount++;
}
else {
inferFromTypes(source, t);
}
}
if (typeParameterCount === 1) {
inferiority++;
inferFromTypes(source, typeParameter);
inferiority--;
}
}
else if (source.flags & 16384) {
var sourceTypes = source.types;
for (var _a = 0; _a < sourceTypes.length; _a++) {
var sourceType = sourceTypes[_a];
inferFromTypes(sourceType, target);
}
}
else if (source.flags & 48128 && (target.flags & (4096 | 8192) ||
(target.flags & 32768) && target.symbol && target.symbol.flags & (8192 | 2048))) {
if (!isInProcess(source, target) && isWithinDepthLimit(source, sourceStack) && isWithinDepthLimit(target, targetStack)) {
if (depth === 0) {
sourceStack = [];
targetStack = [];
}
sourceStack[depth] = source;
targetStack[depth] = target;
depth++;
inferFromProperties(source, target);
inferFromSignatures(source, target, 0);
inferFromSignatures(source, target, 1);
inferFromIndexTypes(source, target, 0, 0);
inferFromIndexTypes(source, target, 1, 1);
inferFromIndexTypes(source, target, 0, 1);
depth--;
}
}
}
function inferFromProperties(source, target) {
var properties = getPropertiesOfObjectType(target);
for (var _i = 0; _i < properties.length; _i++) {
var targetProp = properties[_i];
var sourceProp = getPropertyOfObjectType(source, targetProp.name);
if (sourceProp) {
inferFromTypes(getTypeOfSymbol(sourceProp), getTypeOfSymbol(targetProp));
}
}
}
function inferFromSignatures(source, target, kind) {
var sourceSignatures = getSignaturesOfType(source, kind);
var targetSignatures = getSignaturesOfType(target, kind);
var sourceLen = sourceSignatures.length;
var targetLen = targetSignatures.length;
var len = sourceLen < targetLen ? sourceLen : targetLen;
for (var i = 0; i < len; i++) {
inferFromSignature(getErasedSignature(sourceSignatures[sourceLen - len + i]), getErasedSignature(targetSignatures[targetLen - len + i]));
}
}
function inferFromSignature(source, target) {
forEachMatchingParameterType(source, target, inferFromTypes);
inferFromTypes(getReturnTypeOfSignature(source), getReturnTypeOfSignature(target));
}
function inferFromIndexTypes(source, target, sourceKind, targetKind) {
var targetIndexType = getIndexTypeOfType(target, targetKind);
if (targetIndexType) {
var sourceIndexType = getIndexTypeOfType(source, sourceKind);
if (sourceIndexType) {
inferFromTypes(sourceIndexType, targetIndexType);
}
}
}
}
function getInferenceCandidates(context, index) {
var inferences = context.inferences[index];
return inferences.primary || inferences.secondary || emptyArray;
}
function getInferredType(context, index) {
var inferredType = context.inferredTypes[index];
var inferenceSucceeded;
if (!inferredType) {
var inferences = getInferenceCandidates(context, index);
if (inferences.length) {
var unionOrSuperType = context.inferUnionTypes ? getUnionType(inferences) : getCommonSupertype(inferences);
inferredType = unionOrSuperType ? getWidenedType(unionOrSuperType) : unknownType;
inferenceSucceeded = !!unionOrSuperType;
}
else {
inferredType = emptyObjectType;
inferenceSucceeded = true;
}
if (inferenceSucceeded) {
var constraint = getConstraintOfTypeParameter(context.typeParameters[index]);
inferredType = constraint && !isTypeAssignableTo(inferredType, constraint) ? constraint : inferredType;
}
else if (context.failedTypeParameterIndex === undefined || context.failedTypeParameterIndex > index) {
context.failedTypeParameterIndex = index;
}
context.inferredTypes[index] = inferredType;
}
return inferredType;
}
function getInferredTypes(context) {
for (var i = 0; i < context.inferredTypes.length; i++) {
getInferredType(context, i);
}
return context.inferredTypes;
}
function hasAncestor(node, kind) {
return ts.getAncestor(node, kind) !== undefined;
}
function getResolvedSymbol(node) {
var links = getNodeLinks(node);
if (!links.resolvedSymbol) {
links.resolvedSymbol = (!ts.nodeIsMissing(node) && resolveName(node, node.text, 107455 | 1048576, ts.Diagnostics.Cannot_find_name_0, node)) || unknownSymbol;
}
return links.resolvedSymbol;
}
function isInTypeQuery(node) {
while (node) {
switch (node.kind) {
case 145:
return true;
case 65:
case 127:
node = node.parent;
continue;
default:
return false;
}
}
ts.Debug.fail("should not get here");
}
function removeTypesFromUnionType(type, typeKind, isOfTypeKind, allowEmptyUnionResult) {
if (type.flags & 16384) {
var types = type.types;
if (ts.forEach(types, function (t) { return !!(t.flags & typeKind) === isOfTypeKind; })) {
var narrowedType = getUnionType(ts.filter(types, function (t) { return !(t.flags & typeKind) === isOfTypeKind; }));
if (allowEmptyUnionResult || narrowedType !== emptyObjectType) {
return narrowedType;
}
}
}
else if (allowEmptyUnionResult && !!(type.flags & typeKind) === isOfTypeKind) {
return getUnionType(emptyArray);
}
return type;
}
function hasInitializer(node) {
return !!(node.initializer || ts.isBindingPattern(node.parent) && hasInitializer(node.parent.parent));
}
function isVariableAssignedWithin(symbol, node) {
var links = getNodeLinks(node);
if (links.assignmentChecks) {
var cachedResult = links.assignmentChecks[symbol.id];
if (cachedResult !== undefined) {
return cachedResult;
}
}
else {
links.assignmentChecks = {};
}
return links.assignmentChecks[symbol.id] = isAssignedIn(node);
function isAssignedInBinaryExpression(node) {
if (node.operatorToken.kind >= 53 && node.operatorToken.kind <= 64) {
var n = node.left;
while (n.kind === 162) {
n = n.expression;
}
if (n.kind === 65 && getResolvedSymbol(n) === symbol) {
return true;
}
}
return ts.forEachChild(node, isAssignedIn);
}
function isAssignedInVariableDeclaration(node) {
if (!ts.isBindingPattern(node.name) && getSymbolOfNode(node) === symbol && hasInitializer(node)) {
return true;
}
return ts.forEachChild(node, isAssignedIn);
}
function isAssignedIn(node) {
switch (node.kind) {
case 170:
return isAssignedInBinaryExpression(node);
case 199:
case 153:
return isAssignedInVariableDeclaration(node);
case 151:
case 152:
case 154:
case 155:
case 156:
case 157:
case 158:
case 159:
case 161:
case 162:
case 168:
case 165:
case 166:
case 167:
case 169:
case 171:
case 174:
case 180:
case 181:
case 183:
case 184:
case 185:
case 186:
case 187:
case 188:
case 189:
case 192:
case 193:
case 194:
case 221:
case 222:
case 195:
case 196:
case 197:
case 224:
return ts.forEachChild(node, isAssignedIn);
}
return false;
}
}
function resolveLocation(node) {
var containerNodes = [];
for (var parent_3 = node.parent; parent_3; parent_3 = parent_3.parent) {
if ((ts.isExpression(parent_3) || ts.isObjectLiteralMethod(node)) &&
isContextSensitive(parent_3)) {
containerNodes.unshift(parent_3);
}
}
ts.forEach(containerNodes, function (node) { getTypeOfNode(node); });
}
function getSymbolAtLocation(node) {
resolveLocation(node);
return getSymbolInfo(node);
}
function getTypeAtLocation(node) {
resolveLocation(node);
return getTypeOfNode(node);
}
function getTypeOfSymbolAtLocation(symbol, node) {
resolveLocation(node);
return getNarrowedTypeOfSymbol(symbol, node);
}
function getNarrowedTypeOfSymbol(symbol, node) {
var type = getTypeOfSymbol(symbol);
if (node && symbol.flags & 3 && type.flags & (1 | 48128 | 16384 | 512)) {
loop: while (node.parent) {
var child = node;
node = node.parent;
var narrowedType = type;
switch (node.kind) {
case 184:
if (child !== node.expression) {
narrowedType = narrowType(type, node.expression, child === node.thenStatement);
}
break;
case 171:
if (child !== node.condition) {
narrowedType = narrowType(type, node.condition, child === node.whenTrue);
}
break;
case 170:
if (child === node.right) {
if (node.operatorToken.kind === 48) {
narrowedType = narrowType(type, node.left, true);
}
else if (node.operatorToken.kind === 49) {
narrowedType = narrowType(type, node.left, false);
}
}
break;
case 228:
case 206:
case 201:
case 135:
case 134:
case 137:
case 138:
case 136:
break loop;
}
if (narrowedType !== type) {
if (isVariableAssignedWithin(symbol, node)) {
break;
}
type = narrowedType;
}
}
}
return type;
function narrowTypeByEquality(type, expr, assumeTrue) {
if (expr.left.kind !== 166 || expr.right.kind !== 8) {
return type;
}
var left = expr.left;
var right = expr.right;
if (left.expression.kind !== 65 || getResolvedSymbol(left.expression) !== symbol) {
return type;
}
var typeInfo = primitiveTypeInfo[right.text];
if (expr.operatorToken.kind === 31) {
assumeTrue = !assumeTrue;
}
if (assumeTrue) {
if (!typeInfo) {
return removeTypesFromUnionType(type, 258 | 132 | 8 | 1048576, true, false);
}
if (isTypeSubtypeOf(typeInfo.type, type)) {
return typeInfo.type;
}
return removeTypesFromUnionType(type, typeInfo.flags, false, false);
}
else {
if (typeInfo) {
return removeTypesFromUnionType(type, typeInfo.flags, true, false);
}
return type;
}
}
function narrowTypeByAnd(type, expr, assumeTrue) {
if (assumeTrue) {
return narrowType(narrowType(type, expr.left, true), expr.right, true);
}
else {
return getUnionType([
narrowType(type, expr.left, false),
narrowType(narrowType(type, expr.left, true), expr.right, false)
]);
}
}
function narrowTypeByOr(type, expr, assumeTrue) {
if (assumeTrue) {
return getUnionType([
narrowType(type, expr.left, true),
narrowType(narrowType(type, expr.left, false), expr.right, true)
]);
}
else {
return narrowType(narrowType(type, expr.left, false), expr.right, false);
}
}
function narrowTypeByInstanceof(type, expr, assumeTrue) {
if (type.flags & 1 || !assumeTrue || expr.left.kind !== 65 || getResolvedSymbol(expr.left) !== symbol) {
return type;
}
var rightType = checkExpression(expr.right);
if (!isTypeSubtypeOf(rightType, globalFunctionType)) {
return type;
}
var targetType;
var prototypeProperty = getPropertyOfType(rightType, "prototype");
if (prototypeProperty) {
var prototypePropertyType = getTypeOfSymbol(prototypeProperty);
if (prototypePropertyType !== anyType) {
targetType = prototypePropertyType;
}
}
if (!targetType) {
var constructSignatures;
if (rightType.flags & 2048) {
constructSignatures = resolveDeclaredMembers(rightType).declaredConstructSignatures;
}
else if (rightType.flags & 32768) {
constructSignatures = getSignaturesOfType(rightType, 1);
}
if (constructSignatures && constructSignatures.length) {
targetType = getUnionType(ts.map(constructSignatures, function (signature) { return getReturnTypeOfSignature(getErasedSignature(signature)); }));
}
}
if (targetType) {
if (isTypeSubtypeOf(targetType, type)) {
return targetType;
}
if (type.flags & 16384) {
return getUnionType(ts.filter(type.types, function (t) { return isTypeSubtypeOf(t, targetType); }));
}
}
return type;
}
function narrowType(type, expr, assumeTrue) {
switch (expr.kind) {
case 162:
return narrowType(type, expr.expression, assumeTrue);
case 170:
var operator = expr.operatorToken.kind;
if (operator === 30 || operator === 31) {
return narrowTypeByEquality(type, expr, assumeTrue);
}
else if (operator === 48) {
return narrowTypeByAnd(type, expr, assumeTrue);
}
else if (operator === 49) {
return narrowTypeByOr(type, expr, assumeTrue);
}
else if (operator === 87) {
return narrowTypeByInstanceof(type, expr, assumeTrue);
}
break;
case 168:
if (expr.operator === 46) {
return narrowType(type, expr.operand, !assumeTrue);
}
break;
}
return type;
}
}
function checkIdentifier(node) {
var symbol = getResolvedSymbol(node);
if (symbol === argumentsSymbol && ts.getContainingFunction(node).kind === 164 && languageVersion < 2) {
error(node, ts.Diagnostics.The_arguments_object_cannot_be_referenced_in_an_arrow_function_in_ES3_and_ES5_Consider_using_a_standard_function_expression);
}
if (symbol.flags & 8388608 && !isInTypeQuery(node) && !isConstEnumOrConstEnumOnlyModule(resolveAlias(symbol))) {
markAliasSymbolAsReferenced(symbol);
}
checkCollisionWithCapturedSuperVariable(node, node);
checkCollisionWithCapturedThisVariable(node, node);
checkBlockScopedBindingCapturedInLoop(node, symbol);
return getNarrowedTypeOfSymbol(getExportSymbolOfValueSymbolIfExported(symbol), node);
}
function isInsideFunction(node, threshold) {
var current = node;
while (current && current !== threshold) {
if (ts.isFunctionLike(current)) {
return true;
}
current = current.parent;
}
return false;
}
function checkBlockScopedBindingCapturedInLoop(node, symbol) {
if (languageVersion >= 2 ||
(symbol.flags & 2) === 0 ||
symbol.valueDeclaration.parent.kind === 224) {
return;
}
var container = symbol.valueDeclaration;
while (container.kind !== 200) {
container = container.parent;
}
container = container.parent;
if (container.kind === 181) {
container = container.parent;
}
var inFunction = isInsideFunction(node.parent, container);
var current = container;
while (current && !ts.nodeStartsNewLexicalEnvironment(current)) {
if (isIterationStatement(current, false)) {
if (inFunction) {
grammarErrorOnFirstToken(current, ts.Diagnostics.Loop_contains_block_scoped_variable_0_referenced_by_a_function_in_the_loop_This_is_only_supported_in_ECMAScript_6_or_higher, ts.declarationNameToString(node));
}
getNodeLinks(symbol.valueDeclaration).flags |= 256;
break;
}
current = current.parent;
}
}
function captureLexicalThis(node, container) {
var classNode = container.parent && container.parent.kind === 202 ? container.parent : undefined;
getNodeLinks(node).flags |= 2;
if (container.kind === 133 || container.kind === 136) {
getNodeLinks(classNode).flags |= 4;
}
else {
getNodeLinks(container).flags |= 4;
}
}
function checkThisExpression(node) {
var container = ts.getThisContainer(node, true);
var needToCaptureLexicalThis = false;
if (container.kind === 164) {
container = ts.getThisContainer(container, false);
needToCaptureLexicalThis = (languageVersion < 2);
}
switch (container.kind) {
case 206:
error(node, ts.Diagnostics.this_cannot_be_referenced_in_a_module_or_namespace_body);
break;
case 205:
error(node, ts.Diagnostics.this_cannot_be_referenced_in_current_location);
break;
case 136:
if (isInConstructorArgumentInitializer(node, container)) {
error(node, ts.Diagnostics.this_cannot_be_referenced_in_constructor_arguments);
}
break;
case 133:
case 132:
if (container.flags & 128) {
error(node, ts.Diagnostics.this_cannot_be_referenced_in_a_static_property_initializer);
}
break;
case 128:
error(node, ts.Diagnostics.this_cannot_be_referenced_in_a_computed_property_name);
break;
}
if (needToCaptureLexicalThis) {
captureLexicalThis(node, container);
}
var classNode = container.parent && container.parent.kind === 202 ? container.parent : undefined;
if (classNode) {
var symbol = getSymbolOfNode(classNode);
return container.flags & 128 ? getTypeOfSymbol(symbol) : getDeclaredTypeOfSymbol(symbol);
}
return anyType;
}
function isInConstructorArgumentInitializer(node, constructorDecl) {
for (var n = node; n && n !== constructorDecl; n = n.parent) {
if (n.kind === 130) {
return true;
}
}
return false;
}
function checkSuperExpression(node) {
var isCallExpression = node.parent.kind === 158 && node.parent.expression === node;
var enclosingClass = ts.getAncestor(node, 202);
var baseClass;
if (enclosingClass && ts.getClassExtendsHeritageClauseElement(enclosingClass)) {
var classType = getDeclaredTypeOfSymbol(getSymbolOfNode(enclosingClass));
var baseTypes = getBaseTypes(classType);
baseClass = baseTypes.length && baseTypes[0];
}
if (!baseClass) {
error(node, ts.Diagnostics.super_can_only_be_referenced_in_a_derived_class);
return unknownType;
}
var container = ts.getSuperContainer(node, true);
if (container) {
var canUseSuperExpression = false;
var needToCaptureLexicalThis;
if (isCallExpression) {
canUseSuperExpression = container.kind === 136;
}
else {
needToCaptureLexicalThis = false;
while (container && container.kind === 164) {
container = ts.getSuperContainer(container, true);
needToCaptureLexicalThis = languageVersion < 2;
}
if (container && container.parent && container.parent.kind === 202) {
if (container.flags & 128) {
canUseSuperExpression =
container.kind === 135 ||
container.kind === 134 ||
container.kind === 137 ||
container.kind === 138;
}
else {
canUseSuperExpression =
container.kind === 135 ||
container.kind === 134 ||
container.kind === 137 ||
container.kind === 138 ||
container.kind === 133 ||
container.kind === 132 ||
container.kind === 136;
}
}
}
if (canUseSuperExpression) {
var returnType;
if ((container.flags & 128) || isCallExpression) {
getNodeLinks(node).flags |= 32;
returnType = getTypeOfSymbol(baseClass.symbol);
}
else {
getNodeLinks(node).flags |= 16;
returnType = baseClass;
}
if (container.kind === 136 && isInConstructorArgumentInitializer(node, container)) {
error(node, ts.Diagnostics.super_cannot_be_referenced_in_constructor_arguments);
returnType = unknownType;
}
if (!isCallExpression && needToCaptureLexicalThis) {
captureLexicalThis(node.parent, container);
}
return returnType;
}
}
if (container && container.kind === 128) {
error(node, ts.Diagnostics.super_cannot_be_referenced_in_a_computed_property_name);
}
else if (isCallExpression) {
error(node, ts.Diagnostics.Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors);
}
else {
error(node, ts.Diagnostics.super_property_access_is_permitted_only_in_a_constructor_member_function_or_member_accessor_of_a_derived_class);
}
return unknownType;
}
function getContextuallyTypedParameterType(parameter) {
if (isFunctionExpressionOrArrowFunction(parameter.parent)) {
var func = parameter.parent;
if (isContextSensitive(func)) {
var contextualSignature = getContextualSignature(func);
if (contextualSignature) {
var funcHasRestParameters = ts.hasRestParameters(func);
var len = func.parameters.length - (funcHasRestParameters ? 1 : 0);
var indexOfParameter = ts.indexOf(func.parameters, parameter);
if (indexOfParameter < len) {
return getTypeAtPosition(contextualSignature, indexOfParameter);
}
if (indexOfParameter === (func.parameters.length - 1) &&
funcHasRestParameters && contextualSignature.hasRestParameter && func.parameters.length >= contextualSignature.parameters.length) {
return getTypeOfSymbol(ts.lastOrUndefined(contextualSignature.parameters));
}
}
}
}
return undefined;
}
function getContextualTypeForInitializerExpression(node) {
var declaration = node.parent;
if (node === declaration.initializer) {
if (declaration.type) {
return getTypeFromTypeNode(declaration.type);
}
if (declaration.kind === 130) {
var type = getContextuallyTypedParameterType(declaration);
if (type) {
return type;
}
}
if (ts.isBindingPattern(declaration.name)) {
return getTypeFromBindingPattern(declaration.name);
}
}
return undefined;
}
function getContextualTypeForReturnExpression(node) {
var func = ts.getContainingFunction(node);
if (func) {
if (func.type || func.kind === 136 || func.kind === 137 && getSetAccessorTypeAnnotationNode(ts.getDeclarationOfKind(func.symbol, 138))) {
return getReturnTypeOfSignature(getSignatureFromDeclaration(func));
}
var signature = getContextualSignatureForFunctionLikeDeclaration(func);
if (signature) {
return getReturnTypeOfSignature(signature);
}
}
return undefined;
}
function getContextualTypeForArgument(callTarget, arg) {
var args = getEffectiveCallArguments(callTarget);
var argIndex = ts.indexOf(args, arg);
if (argIndex >= 0) {
var signature = getResolvedSignature(callTarget);
return getTypeAtPosition(signature, argIndex);
}
return undefined;
}
function getContextualTypeForSubstitutionExpression(template, substitutionExpression) {
if (template.parent.kind === 160) {
return getContextualTypeForArgument(template.parent, substitutionExpression);
}
return undefined;
}
function getContextualTypeForBinaryOperand(node) {
var binaryExpression = node.parent;
var operator = binaryExpression.operatorToken.kind;
if (operator >= 53 && operator <= 64) {
if (node === binaryExpression.right) {
return checkExpression(binaryExpression.left);
}
}
else if (operator === 49) {
var type = getContextualType(binaryExpression);
if (!type && node === binaryExpression.right) {
type = checkExpression(binaryExpression.left);
}
return type;
}
return undefined;
}
function applyToContextualType(type, mapper) {
if (!(type.flags & 16384)) {
return mapper(type);
}
var types = type.types;
var mappedType;
var mappedTypes;
for (var _i = 0; _i < types.length; _i++) {
var current = types[_i];
var t = mapper(current);
if (t) {
if (!mappedType) {
mappedType = t;
}
else if (!mappedTypes) {
mappedTypes = [mappedType, t];
}
else {
mappedTypes.push(t);
}
}
}
return mappedTypes ? getUnionType(mappedTypes) : mappedType;
}
function getTypeOfPropertyOfContextualType(type, name) {
return applyToContextualType(type, function (t) {
var prop = getPropertyOfObjectType(t, name);
return prop ? getTypeOfSymbol(prop) : undefined;
});
}
function getIndexTypeOfContextualType(type, kind) {
return applyToContextualType(type, function (t) { return getIndexTypeOfObjectOrUnionType(t, kind); });
}
function contextualTypeIsTupleLikeType(type) {
return !!(type.flags & 16384 ? ts.forEach(type.types, isTupleLikeType) : isTupleLikeType(type));
}
function contextualTypeHasIndexSignature(type, kind) {
return !!(type.flags & 16384 ? ts.forEach(type.types, function (t) { return getIndexTypeOfObjectOrUnionType(t, kind); }) : getIndexTypeOfObjectOrUnionType(type, kind));
}
function getContextualTypeForObjectLiteralMethod(node) {
ts.Debug.assert(ts.isObjectLiteralMethod(node));
if (isInsideWithStatementBody(node)) {
return undefined;
}
return getContextualTypeForObjectLiteralElement(node);
}
function getContextualTypeForObjectLiteralElement(element) {
var objectLiteral = element.parent;
var type = getContextualType(objectLiteral);
if (type) {
if (!ts.hasDynamicName(element)) {
var symbolName = getSymbolOfNode(element).name;
var propertyType = getTypeOfPropertyOfContextualType(type, symbolName);
if (propertyType) {
return propertyType;
}
}
return isNumericName(element.name) && getIndexTypeOfContextualType(type, 1) ||
getIndexTypeOfContextualType(type, 0);
}
return undefined;
}
function getContextualTypeForElementExpression(node) {
var arrayLiteral = node.parent;
var type = getContextualType(arrayLiteral);
if (type) {
var index = ts.indexOf(arrayLiteral.elements, node);
return getTypeOfPropertyOfContextualType(type, "" + index)
|| getIndexTypeOfContextualType(type, 1)
|| (languageVersion >= 2 ? checkIteratedType(type, undefined) : undefined);
}
return undefined;
}
function getContextualTypeForConditionalOperand(node) {
var conditional = node.parent;
return node === conditional.whenTrue || node === conditional.whenFalse ? getContextualType(conditional) : undefined;
}
function getContextualType(node) {
if (isInsideWithStatementBody(node)) {
return undefined;
}
if (node.contextualType) {
return node.contextualType;
}
var parent = node.parent;
switch (parent.kind) {
case 199:
case 130:
case 133:
case 132:
case 153:
return getContextualTypeForInitializerExpression(node);
case 164:
case 192:
return getContextualTypeForReturnExpression(node);
case 158:
case 159:
return getContextualTypeForArgument(parent, node);
case 161:
return getTypeFromTypeNode(parent.type);
case 170:
return getContextualTypeForBinaryOperand(node);
case 225:
return getContextualTypeForObjectLiteralElement(parent);
case 154:
return getContextualTypeForElementExpression(node);
case 171:
return getContextualTypeForConditionalOperand(node);
case 178:
ts.Debug.assert(parent.parent.kind === 172);
return getContextualTypeForSubstitutionExpression(parent.parent, node);
case 162:
return getContextualType(parent);
}
return undefined;
}
function getNonGenericSignature(type) {
var signatures = getSignaturesOfObjectOrUnionType(type, 0);
if (signatures.length === 1) {
var signature = signatures[0];
if (!signature.typeParameters) {
return signature;
}
}
}
function isFunctionExpressionOrArrowFunction(node) {
return node.kind === 163 || node.kind === 164;
}
function getContextualSignatureForFunctionLikeDeclaration(node) {
return isFunctionExpressionOrArrowFunction(node) ? getContextualSignature(node) : undefined;
}
function getContextualSignature(node) {
ts.Debug.assert(node.kind !== 135 || ts.isObjectLiteralMethod(node));
var type = ts.isObjectLiteralMethod(node)
? getContextualTypeForObjectLiteralMethod(node)
: getContextualType(node);
if (!type) {
return undefined;
}
if (!(type.flags & 16384)) {
return getNonGenericSignature(type);
}
var signatureList;
var types = type.types;
for (var _i = 0; _i < types.length; _i++) {
var current = types[_i];
if (signatureList &&
getSignaturesOfObjectOrUnionType(current, 0).length > 1) {
return undefined;
}
var signature = getNonGenericSignature(current);
if (signature) {
if (!signatureList) {
signatureList = [signature];
}
else if (!compareSignatures(signatureList[0], signature, false, compareTypes)) {
return undefined;
}
else {
signatureList.push(signature);
}
}
}
var result;
if (signatureList) {
result = cloneSignature(signatureList[0]);
result.resolvedReturnType = undefined;
result.unionSignatures = signatureList;
}
return result;
}
function isInferentialContext(mapper) {
return mapper && mapper !== identityMapper;
}
function isAssignmentTarget(node) {
var parent = node.parent;
if (parent.kind === 170 && parent.operatorToken.kind === 53 && parent.left === node) {
return true;
}
if (parent.kind === 225) {
return isAssignmentTarget(parent.parent);
}
if (parent.kind === 154) {
return isAssignmentTarget(parent);
}
return false;
}
function checkSpreadElementExpression(node, contextualMapper) {
var arrayOrIterableType = checkExpressionCached(node.expression, contextualMapper);
return checkIteratedTypeOrElementType(arrayOrIterableType, node.expression, false);
}
function checkArrayLiteral(node, contextualMapper) {
var elements = node.elements;
if (!elements.length) {
return createArrayType(undefinedType);
}
var hasSpreadElement = false;
var elementTypes = [];
var inDestructuringPattern = isAssignmentTarget(node);
for (var _i = 0; _i < elements.length; _i++) {
var e = elements[_i];
if (inDestructuringPattern && e.kind === 174) {
var restArrayType = checkExpression(e.expression, contextualMapper);
var restElementType = getIndexTypeOfType(restArrayType, 1) ||
(languageVersion >= 2 ? checkIteratedType(restArrayType, undefined) : undefined);
if (restElementType) {
elementTypes.push(restElementType);
}
}
else {
var type = checkExpression(e, contextualMapper);
elementTypes.push(type);
}
hasSpreadElement = hasSpreadElement || e.kind === 174;
}
if (!hasSpreadElement) {
var contextualType = getContextualType(node);
if (contextualType && contextualTypeIsTupleLikeType(contextualType) || inDestructuringPattern) {
return createTupleType(elementTypes);
}
}
return createArrayType(getUnionType(elementTypes));
}
function isNumericName(name) {
return name.kind === 128 ? isNumericComputedName(name) : isNumericLiteralName(name.text);
}
function isNumericComputedName(name) {
return allConstituentTypesHaveKind(checkComputedPropertyName(name), 1 | 132);
}
function isNumericLiteralName(name) {
return (+name).toString() === name;
}
function checkComputedPropertyName(node) {
var links = getNodeLinks(node.expression);
if (!links.resolvedType) {
links.resolvedType = checkExpression(node.expression);
if (!allConstituentTypesHaveKind(links.resolvedType, 1 | 132 | 258 | 1048576)) {
error(node, ts.Diagnostics.A_computed_property_name_must_be_of_type_string_number_symbol_or_any);
}
else {
checkThatExpressionIsProperSymbolReference(node.expression, links.resolvedType, true);
}
}
return links.resolvedType;
}
function checkObjectLiteral(node, contextualMapper) {
checkGrammarObjectLiteralExpression(node);
var propertiesTable = {};
var propertiesArray = [];
var contextualType = getContextualType(node);
var typeFlags;
for (var _i = 0, _a = node.properties; _i < _a.length; _i++) {
var memberDecl = _a[_i];
var member = memberDecl.symbol;
if (memberDecl.kind === 225 ||
memberDecl.kind === 226 ||
ts.isObjectLiteralMethod(memberDecl)) {
var type = void 0;
if (memberDecl.kind === 225) {
type = checkPropertyAssignment(memberDecl, contextualMapper);
}
else if (memberDecl.kind === 135) {
type = checkObjectLiteralMethod(memberDecl, contextualMapper);
}
else {
ts.Debug.assert(memberDecl.kind === 226);
type = checkExpression(memberDecl.name, contextualMapper);
}
typeFlags |= type.flags;
var prop = createSymbol(4 | 67108864 | member.flags, member.name);
prop.declarations = member.declarations;
prop.parent = member.parent;
if (member.valueDeclaration) {
prop.valueDeclaration = member.valueDeclaration;
}
prop.type = type;
prop.target = member;
member = prop;
}
else {
ts.Debug.assert(memberDecl.kind === 137 || memberDecl.kind === 138);
checkAccessorDeclaration(memberDecl);
}
if (!ts.hasDynamicName(memberDecl)) {
propertiesTable[member.name] = member;
}
propertiesArray.push(member);
}
var stringIndexType = getIndexType(0);
var numberIndexType = getIndexType(1);
var result = createAnonymousType(node.symbol, propertiesTable, emptyArray, emptyArray, stringIndexType, numberIndexType);
result.flags |= 131072 | 524288 | (typeFlags & 262144);
return result;
function getIndexType(kind) {
if (contextualType && contextualTypeHasIndexSignature(contextualType, kind)) {
var propTypes = [];
for (var i = 0; i < propertiesArray.length; i++) {
var propertyDecl = node.properties[i];
if (kind === 0 || isNumericName(propertyDecl.name)) {
var type = getTypeOfSymbol(propertiesArray[i]);
if (!ts.contains(propTypes, type)) {
propTypes.push(type);
}
}
}
var result_1 = propTypes.length ? getUnionType(propTypes) : undefinedType;
typeFlags |= result_1.flags;
return result_1;
}
return undefined;
}
}
function getDeclarationKindFromSymbol(s) {
return s.valueDeclaration ? s.valueDeclaration.kind : 133;
}
function getDeclarationFlagsFromSymbol(s) {
return s.valueDeclaration ? ts.getCombinedNodeFlags(s.valueDeclaration) : s.flags & 134217728 ? 16 | 128 : 0;
}
function checkClassPropertyAccess(node, left, type, prop) {
var flags = getDeclarationFlagsFromSymbol(prop);
if (!(flags & (32 | 64))) {
return;
}
var enclosingClassDeclaration = ts.getAncestor(node, 202);
var enclosingClass = enclosingClassDeclaration ? getDeclaredTypeOfSymbol(getSymbolOfNode(enclosingClassDeclaration)) : undefined;
var declaringClass = getDeclaredTypeOfSymbol(prop.parent);
if (flags & 32) {
if (declaringClass !== enclosingClass) {
error(node, ts.Diagnostics.Property_0_is_private_and_only_accessible_within_class_1, symbolToString(prop), typeToString(declaringClass));
}
return;
}
if (left.kind === 91) {
return;
}
if (!enclosingClass || !hasBaseType(enclosingClass, declaringClass)) {
error(node, ts.Diagnostics.Property_0_is_protected_and_only_accessible_within_class_1_and_its_subclasses, symbolToString(prop), typeToString(declaringClass));
return;
}
if (flags & 128) {
return;
}
if (!(getTargetType(type).flags & (1024 | 2048) && hasBaseType(type, enclosingClass))) {
error(node, ts.Diagnostics.Property_0_is_protected_and_only_accessible_through_an_instance_of_class_1, symbolToString(prop), typeToString(enclosingClass));
}
}
function checkPropertyAccessExpression(node) {
return checkPropertyAccessExpressionOrQualifiedName(node, node.expression, node.name);
}
function checkQualifiedName(node) {
return checkPropertyAccessExpressionOrQualifiedName(node, node.left, node.right);
}
function checkPropertyAccessExpressionOrQualifiedName(node, left, right) {
var type = checkExpressionOrQualifiedName(left);
if (type === unknownType)
return type;
if (type !== anyType) {
var apparentType = getApparentType(getWidenedType(type));
if (apparentType === unknownType) {
return unknownType;
}
var prop = getPropertyOfType(apparentType, right.text);
if (!prop) {
if (right.text) {
error(right, ts.Diagnostics.Property_0_does_not_exist_on_type_1, ts.declarationNameToString(right), typeToString(type));
}
return unknownType;
}
getNodeLinks(node).resolvedSymbol = prop;
if (prop.parent && prop.parent.flags & 32) {
if (left.kind === 91 && getDeclarationKindFromSymbol(prop) !== 135) {
error(right, ts.Diagnostics.Only_public_and_protected_methods_of_the_base_class_are_accessible_via_the_super_keyword);
}
else {
checkClassPropertyAccess(node, left, type, prop);
}
}
return getTypeOfSymbol(prop);
}
return anyType;
}
function isValidPropertyAccess(node, propertyName) {
var left = node.kind === 156
? node.expression
: node.left;
var type = checkExpressionOrQualifiedName(left);
if (type !== unknownType && type !== anyType) {
var prop = getPropertyOfType(getWidenedType(type), propertyName);
if (prop && prop.parent && prop.parent.flags & 32) {
if (left.kind === 91 && getDeclarationKindFromSymbol(prop) !== 135) {
return false;
}
else {
var modificationCount = diagnostics.getModificationCount();
checkClassPropertyAccess(node, left, type, prop);
return diagnostics.getModificationCount() === modificationCount;
}
}
}
return true;
}
function checkIndexedAccess(node) {
if (!node.argumentExpression) {
var sourceFile = getSourceFile(node);
if (node.parent.kind === 159 && node.parent.expression === node) {
var start = ts.skipTrivia(sourceFile.text, node.expression.end);
var end = node.end;
grammarErrorAtPos(sourceFile, start, end - start, ts.Diagnostics.new_T_cannot_be_used_to_create_an_array_Use_new_Array_T_instead);
}
else {
var start = node.end - "]".length;
var end = node.end;
grammarErrorAtPos(sourceFile, start, end - start, ts.Diagnostics.Expression_expected);
}
}
var objectType = getApparentType(checkExpression(node.expression));
var indexType = node.argumentExpression ? checkExpression(node.argumentExpression) : unknownType;
if (objectType === unknownType) {
return unknownType;
}
var isConstEnum = isConstEnumObjectType(objectType);
if (isConstEnum &&
(!node.argumentExpression || node.argumentExpression.kind !== 8)) {
error(node.argumentExpression, ts.Diagnostics.A_const_enum_member_can_only_be_accessed_using_a_string_literal);
return unknownType;
}
if (node.argumentExpression) {
var name_6 = getPropertyNameForIndexedAccess(node.argumentExpression, indexType);
if (name_6 !== undefined) {
var prop = getPropertyOfType(objectType, name_6);
if (prop) {
getNodeLinks(node).resolvedSymbol = prop;
return getTypeOfSymbol(prop);
}
else if (isConstEnum) {
error(node.argumentExpression, ts.Diagnostics.Property_0_does_not_exist_on_const_enum_1, name_6, symbolToString(objectType.symbol));
return unknownType;
}
}
}
if (allConstituentTypesHaveKind(indexType, 1 | 258 | 132 | 1048576)) {
if (allConstituentTypesHaveKind(indexType, 1 | 132)) {
var numberIndexType = getIndexTypeOfType(objectType, 1);
if (numberIndexType) {
return numberIndexType;
}
}
var stringIndexType = getIndexTypeOfType(objectType, 0);
if (stringIndexType) {
return stringIndexType;
}
if (compilerOptions.noImplicitAny && !compilerOptions.suppressImplicitAnyIndexErrors && objectType !== anyType) {
error(node, ts.Diagnostics.Index_signature_of_object_type_implicitly_has_an_any_type);
}
return anyType;
}
error(node, ts.Diagnostics.An_index_expression_argument_must_be_of_type_string_number_symbol_or_any);
return unknownType;
}
function getPropertyNameForIndexedAccess(indexArgumentExpression, indexArgumentType) {
if (indexArgumentExpression.kind === 8 || indexArgumentExpression.kind === 7) {
return indexArgumentExpression.text;
}
if (checkThatExpressionIsProperSymbolReference(indexArgumentExpression, indexArgumentType, false)) {
var rightHandSideName = indexArgumentExpression.name.text;
return ts.getPropertyNameForKnownSymbolName(rightHandSideName);
}
return undefined;
}
function checkThatExpressionIsProperSymbolReference(expression, expressionType, reportError) {
if (expressionType === unknownType) {
return false;
}
if (!ts.isWellKnownSymbolSyntactically(expression)) {
return false;
}
if ((expressionType.flags & 1048576) === 0) {
if (reportError) {
error(expression, ts.Diagnostics.A_computed_property_name_of_the_form_0_must_be_of_type_symbol, ts.getTextOfNode(expression));
}
return false;
}
var leftHandSide = expression.expression;
var leftHandSideSymbol = getResolvedSymbol(leftHandSide);
if (!leftHandSideSymbol) {
return false;
}
var globalESSymbol = getGlobalESSymbolConstructorSymbol();
if (!globalESSymbol) {
return false;
}
if (leftHandSideSymbol !== globalESSymbol) {
if (reportError) {
error(leftHandSide, ts.Diagnostics.Symbol_reference_does_not_refer_to_the_global_Symbol_constructor_object);
}
return false;
}
return true;
}
function resolveUntypedCall(node) {
if (node.kind === 160) {
checkExpression(node.template);
}
else {
ts.forEach(node.arguments, function (argument) {
checkExpression(argument);
});
}
return anySignature;
}
function resolveErrorCall(node) {
resolveUntypedCall(node);
return unknownSignature;
}
function reorderCandidates(signatures, result) {
var lastParent;
var lastSymbol;
var cutoffIndex = 0;
var index;
var specializedIndex = -1;
var spliceIndex;
ts.Debug.assert(!result.length);
for (var _i = 0; _i < signatures.length; _i++) {
var signature = signatures[_i];
var symbol = signature.declaration && getSymbolOfNode(signature.declaration);
var parent_4 = signature.declaration && signature.declaration.parent;
if (!lastSymbol || symbol === lastSymbol) {
if (lastParent && parent_4 === lastParent) {
index++;
}
else {
lastParent = parent_4;
index = cutoffIndex;
}
}
else {
index = cutoffIndex = result.length;
lastParent = parent_4;
}
lastSymbol = symbol;
if (signature.hasStringLiterals) {
specializedIndex++;
spliceIndex = specializedIndex;
cutoffIndex++;
}
else {
spliceIndex = index;
}
result.splice(spliceIndex, 0, signature);
}
}
function getSpreadArgumentIndex(args) {
for (var i = 0; i < args.length; i++) {
if (args[i].kind === 174) {
return i;
}
}
return -1;
}
function hasCorrectArity(node, args, signature) {
var adjustedArgCount;
var typeArguments;
var callIsIncomplete;
if (node.kind === 160) {
var tagExpression = node;
adjustedArgCount = args.length;
typeArguments = undefined;
if (tagExpression.template.kind === 172) {
var templateExpression = tagExpression.template;
var lastSpan = ts.lastOrUndefined(templateExpression.templateSpans);
ts.Debug.assert(lastSpan !== undefined);
callIsIncomplete = ts.nodeIsMissing(lastSpan.literal) || !!lastSpan.literal.isUnterminated;
}
else {
var templateLiteral = tagExpression.template;
ts.Debug.assert(templateLiteral.kind === 10);
callIsIncomplete = !!templateLiteral.isUnterminated;
}
}
else {
var callExpression = node;
if (!callExpression.arguments) {
ts.Debug.assert(callExpression.kind === 159);
return signature.minArgumentCount === 0;
}
adjustedArgCount = callExpression.arguments.hasTrailingComma ? args.length + 1 : args.length;
callIsIncomplete = callExpression.arguments.end === callExpression.end;
typeArguments = callExpression.typeArguments;
}
var hasRightNumberOfTypeArgs = !typeArguments ||
(signature.typeParameters && typeArguments.length === signature.typeParameters.length);
if (!hasRightNumberOfTypeArgs) {
return false;
}
var spreadArgIndex = getSpreadArgumentIndex(args);
if (spreadArgIndex >= 0) {
return signature.hasRestParameter && spreadArgIndex >= signature.parameters.length - 1;
}
if (!signature.hasRestParameter && adjustedArgCount > signature.parameters.length) {
return false;
}
var hasEnoughArguments = adjustedArgCount >= signature.minArgumentCount;
return callIsIncomplete || hasEnoughArguments;
}
function getSingleCallSignature(type) {
if (type.flags & 48128) {
var resolved = resolveObjectOrUnionTypeMembers(type);
if (resolved.callSignatures.length === 1 && resolved.constructSignatures.length === 0 &&
resolved.properties.length === 0 && !resolved.stringIndexType && !resolved.numberIndexType) {
return resolved.callSignatures[0];
}
}
return undefined;
}
function instantiateSignatureInContextOf(signature, contextualSignature, contextualMapper) {
var context = createInferenceContext(signature.typeParameters, true);
forEachMatchingParameterType(contextualSignature, signature, function (source, target) {
inferTypes(context, instantiateType(source, contextualMapper), target);
});
return getSignatureInstantiation(signature, getInferredTypes(context));
}
function inferTypeArguments(signature, args, excludeArgument, context) {
var typeParameters = signature.typeParameters;
var inferenceMapper = createInferenceMapper(context);
for (var i = 0; i < typeParameters.length; i++) {
if (!context.inferences[i].isFixed) {
context.inferredTypes[i] = undefined;
}
}
if (context.failedTypeParameterIndex !== undefined && !context.inferences[context.failedTypeParameterIndex].isFixed) {
context.failedTypeParameterIndex = undefined;
}
for (var i = 0; i < args.length; i++) {
var arg = args[i];
if (arg.kind !== 176) {
var paramType = getTypeAtPosition(signature, i);
var argType = void 0;
if (i === 0 && args[i].parent.kind === 160) {
argType = globalTemplateStringsArrayType;
}
else {
var mapper = excludeArgument && excludeArgument[i] !== undefined ? identityMapper : inferenceMapper;
argType = checkExpressionWithContextualType(arg, paramType, mapper);
}
inferTypes(context, argType, paramType);
}
}
if (excludeArgument) {
for (var i = 0; i < args.length; i++) {
if (excludeArgument[i] === false) {
var arg = args[i];
var paramType = getTypeAtPosition(signature, i);
inferTypes(context, checkExpressionWithContextualType(arg, paramType, inferenceMapper), paramType);
}
}
}
getInferredTypes(context);
}
function checkTypeArguments(signature, typeArguments, typeArgumentResultTypes, reportErrors) {
var typeParameters = signature.typeParameters;
var typeArgumentsAreAssignable = true;
for (var i = 0; i < typeParameters.length; i++) {
var typeArgNode = typeArguments[i];
var typeArgument = getTypeFromTypeNode(typeArgNode);
typeArgumentResultTypes[i] = typeArgument;
if (typeArgumentsAreAssignable) {
var constraint = getConstraintOfTypeParameter(typeParameters[i]);
if (constraint) {
typeArgumentsAreAssignable = checkTypeAssignableTo(typeArgument, constraint, reportErrors ? typeArgNode : undefined, ts.Diagnostics.Type_0_does_not_satisfy_the_constraint_1);
}
}
}
return typeArgumentsAreAssignable;
}
function checkApplicableSignature(node, args, signature, relation, excludeArgument, reportErrors) {
for (var i = 0; i < args.length; i++) {
var arg = args[i];
if (arg.kind !== 176) {
var paramType = getTypeAtPosition(signature, i);
var argType = i === 0 && node.kind === 160
? globalTemplateStringsArrayType
: arg.kind === 8 && !reportErrors
? getStringLiteralType(arg)
: checkExpressionWithContextualType(arg, paramType, excludeArgument && excludeArgument[i] ? identityMapper : undefined);
if (!checkTypeRelatedTo(argType, paramType, relation, reportErrors ? arg : undefined, ts.Diagnostics.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1)) {
return false;
}
}
}
return true;
}
function getEffectiveCallArguments(node) {
var args;
if (node.kind === 160) {
var template = node.template;
args = [template];
if (template.kind === 172) {
ts.forEach(template.templateSpans, function (span) {
args.push(span.expression);
});
}
}
else {
args = node.arguments || emptyArray;
}
return args;
}
function getEffectiveTypeArguments(callExpression) {
if (callExpression.expression.kind === 91) {
var containingClass = ts.getAncestor(callExpression, 202);
var baseClassTypeNode = containingClass && ts.getClassExtendsHeritageClauseElement(containingClass);
return baseClassTypeNode && baseClassTypeNode.typeArguments;
}
else {
return callExpression.typeArguments;
}
}
function resolveCall(node, signatures, candidatesOutArray) {
var isTaggedTemplate = node.kind === 160;
var typeArguments;
if (!isTaggedTemplate) {
typeArguments = getEffectiveTypeArguments(node);
if (node.expression.kind !== 91) {
ts.forEach(typeArguments, checkSourceElement);
}
}
var candidates = candidatesOutArray || [];
reorderCandidates(signatures, candidates);
if (!candidates.length) {
error(node, ts.Diagnostics.Supplied_parameters_do_not_match_any_signature_of_call_target);
return resolveErrorCall(node);
}
var args = getEffectiveCallArguments(node);
var excludeArgument;
for (var i = isTaggedTemplate ? 1 : 0; i < args.length; i++) {
if (isContextSensitive(args[i])) {
if (!excludeArgument) {
excludeArgument = new Array(args.length);
}
excludeArgument[i] = true;
}
}
var candidateForArgumentError;
var candidateForTypeArgumentError;
var resultOfFailedInference;
var result;
if (candidates.length > 1) {
result = chooseOverload(candidates, subtypeRelation);
}
if (!result) {
candidateForArgumentError = undefined;
candidateForTypeArgumentError = undefined;
resultOfFailedInference = undefined;
result = chooseOverload(candidates, assignableRelation);
}
if (result) {
return result;
}
if (candidateForArgumentError) {
checkApplicableSignature(node, args, candidateForArgumentError, assignableRelation, undefined, true);
}
else if (candidateForTypeArgumentError) {
if (!isTaggedTemplate && node.typeArguments) {
checkTypeArguments(candidateForTypeArgumentError, node.typeArguments, [], true);
}
else {
ts.Debug.assert(resultOfFailedInference.failedTypeParameterIndex >= 0);
var failedTypeParameter = candidateForTypeArgumentError.typeParameters[resultOfFailedInference.failedTypeParameterIndex];
var inferenceCandidates = getInferenceCandidates(resultOfFailedInference, resultOfFailedInference.failedTypeParameterIndex);
var diagnosticChainHead = ts.chainDiagnosticMessages(undefined, ts.Diagnostics.The_type_argument_for_type_parameter_0_cannot_be_inferred_from_the_usage_Consider_specifying_the_type_arguments_explicitly, typeToString(failedTypeParameter));
reportNoCommonSupertypeError(inferenceCandidates, node.expression || node.tag, diagnosticChainHead);
}
}
else {
error(node, ts.Diagnostics.Supplied_parameters_do_not_match_any_signature_of_call_target);
}
if (!produceDiagnostics) {
for (var _i = 0; _i < candidates.length; _i++) {
var candidate = candidates[_i];
if (hasCorrectArity(node, args, candidate)) {
return candidate;
}
}
}
return resolveErrorCall(node);
function chooseOverload(candidates, relation) {
for (var _i = 0; _i < candidates.length; _i++) {
var originalCandidate = candidates[_i];
if (!hasCorrectArity(node, args, originalCandidate)) {
continue;
}
var candidate = void 0;
var typeArgumentsAreValid = void 0;
var inferenceContext = originalCandidate.typeParameters
? createInferenceContext(originalCandidate.typeParameters, false)
: undefined;
while (true) {
candidate = originalCandidate;
if (candidate.typeParameters) {
var typeArgumentTypes = void 0;
if (typeArguments) {
typeArgumentTypes = new Array(candidate.typeParameters.length);
typeArgumentsAreValid = checkTypeArguments(candidate, typeArguments, typeArgumentTypes, false);
}
else {
inferTypeArguments(candidate, args, excludeArgument, inferenceContext);
typeArgumentsAreValid = inferenceContext.failedTypeParameterIndex === undefined;
typeArgumentTypes = inferenceContext.inferredTypes;
}
if (!typeArgumentsAreValid) {
break;
}
candidate = getSignatureInstantiation(candidate, typeArgumentTypes);
}
if (!checkApplicableSignature(node, args, candidate, relation, excludeArgument, false)) {
break;
}
var index = excludeArgument ? ts.indexOf(excludeArgument, true) : -1;
if (index < 0) {
return candidate;
}
excludeArgument[index] = false;
}
if (originalCandidate.typeParameters) {
var instantiatedCandidate = candidate;
if (typeArgumentsAreValid) {
candidateForArgumentError = instantiatedCandidate;
}
else {
candidateForTypeArgumentError = originalCandidate;
if (!typeArguments) {
resultOfFailedInference = inferenceContext;
}
}
}
else {
ts.Debug.assert(originalCandidate === candidate);
candidateForArgumentError = originalCandidate;
}
}
return undefined;
}
}
function resolveCallExpression(node, candidatesOutArray) {
if (node.expression.kind === 91) {
var superType = checkSuperExpression(node.expression);
if (superType !== unknownType) {
return resolveCall(node, getSignaturesOfType(superType, 1), candidatesOutArray);
}
return resolveUntypedCall(node);
}
var funcType = checkExpression(node.expression);
var apparentType = getApparentType(funcType);
if (apparentType === unknownType) {
return resolveErrorCall(node);
}
var callSignatures = getSignaturesOfType(apparentType, 0);
var constructSignatures = getSignaturesOfType(apparentType, 1);
if (funcType === anyType || (!callSignatures.length && !constructSignatures.length && !(funcType.flags & 16384) && isTypeAssignableTo(funcType, globalFunctionType))) {
if (node.typeArguments) {
error(node, ts.Diagnostics.Untyped_function_calls_may_not_accept_type_arguments);
}
return resolveUntypedCall(node);
}
if (!callSignatures.length) {
if (constructSignatures.length) {
error(node, ts.Diagnostics.Value_of_type_0_is_not_callable_Did_you_mean_to_include_new, typeToString(funcType));
}
else {
error(node, ts.Diagnostics.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature);
}
return resolveErrorCall(node);
}
return resolveCall(node, callSignatures, candidatesOutArray);
}
function resolveNewExpression(node, candidatesOutArray) {
if (node.arguments && languageVersion < 2) {
var spreadIndex = getSpreadArgumentIndex(node.arguments);
if (spreadIndex >= 0) {
error(node.arguments[spreadIndex], ts.Diagnostics.Spread_operator_in_new_expressions_is_only_available_when_targeting_ECMAScript_6_and_higher);
}
}
var expressionType = checkExpression(node.expression);
if (expressionType === anyType) {
if (node.typeArguments) {
error(node, ts.Diagnostics.Untyped_function_calls_may_not_accept_type_arguments);
}
return resolveUntypedCall(node);
}
expressionType = getApparentType(expressionType);
if (expressionType === unknownType) {
return resolveErrorCall(node);
}
var constructSignatures = getSignaturesOfType(expressionType, 1);
if (constructSignatures.length) {
return resolveCall(node, constructSignatures, candidatesOutArray);
}
var callSignatures = getSignaturesOfType(expressionType, 0);
if (callSignatures.length) {
var signature = resolveCall(node, callSignatures, candidatesOutArray);
if (getReturnTypeOfSignature(signature) !== voidType) {
error(node, ts.Diagnostics.Only_a_void_function_can_be_called_with_the_new_keyword);
}
return signature;
}
error(node, ts.Diagnostics.Cannot_use_new_with_an_expression_whose_type_lacks_a_call_or_construct_signature);
return resolveErrorCall(node);
}
function resolveTaggedTemplateExpression(node, candidatesOutArray) {
var tagType = checkExpression(node.tag);
var apparentType = getApparentType(tagType);
if (apparentType === unknownType) {
return resolveErrorCall(node);
}
var callSignatures = getSignaturesOfType(apparentType, 0);
if (tagType === anyType || (!callSignatures.length && !(tagType.flags & 16384) && isTypeAssignableTo(tagType, globalFunctionType))) {
return resolveUntypedCall(node);
}
if (!callSignatures.length) {
error(node, ts.Diagnostics.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature);
return resolveErrorCall(node);
}
return resolveCall(node, callSignatures, candidatesOutArray);
}
function getResolvedSignature(node, candidatesOutArray) {
var links = getNodeLinks(node);
if (!links.resolvedSignature || candidatesOutArray) {
links.resolvedSignature = anySignature;
if (node.kind === 158) {
links.resolvedSignature = resolveCallExpression(node, candidatesOutArray);
}
else if (node.kind === 159) {
links.resolvedSignature = resolveNewExpression(node, candidatesOutArray);
}
else if (node.kind === 160) {
links.resolvedSignature = resolveTaggedTemplateExpression(node, candidatesOutArray);
}
else {
ts.Debug.fail("Branch in 'getResolvedSignature' should be unreachable.");
}
}
return links.resolvedSignature;
}
function checkCallExpression(node) {
checkGrammarTypeArguments(node, node.typeArguments) || checkGrammarArguments(node, node.arguments);
var signature = getResolvedSignature(node);
if (node.expression.kind === 91) {
return voidType;
}
if (node.kind === 159) {
var declaration = signature.declaration;
if (declaration &&
declaration.kind !== 136 &&
declaration.kind !== 140 &&
declaration.kind !== 144) {
if (compilerOptions.noImplicitAny) {
error(node, ts.Diagnostics.new_expression_whose_target_lacks_a_construct_signature_implicitly_has_an_any_type);
}
return anyType;
}
}
return getReturnTypeOfSignature(signature);
}
function checkTaggedTemplateExpression(node) {
return getReturnTypeOfSignature(getResolvedSignature(node));
}
function checkTypeAssertion(node) {
var exprType = checkExpression(node.expression);
var targetType = getTypeFromTypeNode(node.type);
if (produceDiagnostics && targetType !== unknownType) {
var widenedType = getWidenedType(exprType);
if (!(isTypeAssignableTo(targetType, widenedType))) {
checkTypeAssignableTo(exprType, targetType, node, ts.Diagnostics.Neither_type_0_nor_type_1_is_assignable_to_the_other);
}
}
return targetType;
}
function getTypeAtPosition(signature, pos) {
return signature.hasRestParameter ?
pos < signature.parameters.length - 1 ? getTypeOfSymbol(signature.parameters[pos]) : getRestTypeOfSignature(signature) :
pos < signature.parameters.length ? getTypeOfSymbol(signature.parameters[pos]) : anyType;
}
function assignContextualParameterTypes(signature, context, mapper) {
var len = signature.parameters.length - (signature.hasRestParameter ? 1 : 0);
for (var i = 0; i < len; i++) {
var parameter = signature.parameters[i];
var links = getSymbolLinks(parameter);
links.type = instantiateType(getTypeAtPosition(context, i), mapper);
}
if (signature.hasRestParameter && context.hasRestParameter && signature.parameters.length >= context.parameters.length) {
var parameter = ts.lastOrUndefined(signature.parameters);
var links = getSymbolLinks(parameter);
links.type = instantiateType(getTypeOfSymbol(ts.lastOrUndefined(context.parameters)), mapper);
}
}
function getReturnTypeFromBody(func, contextualMapper) {
var contextualSignature = getContextualSignatureForFunctionLikeDeclaration(func);
if (!func.body) {
return unknownType;
}
var type;
if (func.body.kind !== 180) {
type = checkExpressionCached(func.body, contextualMapper);
}
else {
var types = checkAndAggregateReturnExpressionTypes(func.body, contextualMapper);
if (types.length === 0) {
return voidType;
}
type = contextualSignature ? getUnionType(types) : getCommonSupertype(types);
if (!type) {
error(func, ts.Diagnostics.No_best_common_type_exists_among_return_expressions);
return unknownType;
}
}
if (!contextualSignature) {
reportErrorsFromWidening(func, type);
}
return getWidenedType(type);
}
function checkAndAggregateReturnExpressionTypes(body, contextualMapper) {
var aggregatedTypes = [];
ts.forEachReturnStatement(body, function (returnStatement) {
var expr = returnStatement.expression;
if (expr) {
var type = checkExpressionCached(expr, contextualMapper);
if (!ts.contains(aggregatedTypes, type)) {
aggregatedTypes.push(type);
}
}
});
return aggregatedTypes;
}
function bodyContainsAReturnStatement(funcBody) {
return ts.forEachReturnStatement(funcBody, function (returnStatement) {
return true;
});
}
function bodyContainsSingleThrowStatement(body) {
return (body.statements.length === 1) && (body.statements[0].kind === 196);
}
function checkIfNonVoidFunctionHasReturnExpressionsOrSingleThrowStatment(func, returnType) {
if (!produceDiagnostics) {
return;
}
if (returnType === voidType || returnType === anyType) {
return;
}
if (ts.nodeIsMissing(func.body) || func.body.kind !== 180) {
return;
}
var bodyBlock = func.body;
if (bodyContainsAReturnStatement(bodyBlock)) {
return;
}
if (bodyContainsSingleThrowStatement(bodyBlock)) {
return;
}
error(func.type, ts.Diagnostics.A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value_or_consist_of_a_single_throw_statement);
}
function checkFunctionExpressionOrObjectLiteralMethod(node, contextualMapper) {
ts.Debug.assert(node.kind !== 135 || ts.isObjectLiteralMethod(node));
var hasGrammarError = checkGrammarDeclarationNameInStrictMode(node) || checkGrammarFunctionLikeDeclaration(node);
if (!hasGrammarError && node.kind === 163) {
checkGrammarFunctionName(node.name) || checkGrammarForGenerator(node);
}
if (contextualMapper === identityMapper && isContextSensitive(node)) {
return anyFunctionType;
}
var links = getNodeLinks(node);
var type = getTypeOfSymbol(node.symbol);
if (!(links.flags & 64)) {
var contextualSignature = getContextualSignature(node);
if (!(links.flags & 64)) {
links.flags |= 64;
if (contextualSignature) {
var signature = getSignaturesOfType(type, 0)[0];
if (isContextSensitive(node)) {
assignContextualParameterTypes(signature, contextualSignature, contextualMapper || identityMapper);
}
if (!node.type && !signature.resolvedReturnType) {
var returnType = getReturnTypeFromBody(node, contextualMapper);
if (!signature.resolvedReturnType) {
signature.resolvedReturnType = returnType;
}
}
}
checkSignatureDeclaration(node);
}
}
if (produceDiagnostics && node.kind !== 135 && node.kind !== 134) {
checkCollisionWithCapturedSuperVariable(node, node.name);
checkCollisionWithCapturedThisVariable(node, node.name);
}
return type;
}
function checkFunctionExpressionOrObjectLiteralMethodBody(node) {
ts.Debug.assert(node.kind !== 135 || ts.isObjectLiteralMethod(node));
if (node.type && !node.asteriskToken) {
checkIfNonVoidFunctionHasReturnExpressionsOrSingleThrowStatment(node, getTypeFromTypeNode(node.type));
}
if (node.body) {
if (node.body.kind === 180) {
checkSourceElement(node.body);
}
else {
var exprType = checkExpression(node.body);
if (node.type) {
checkTypeAssignableTo(exprType, getTypeFromTypeNode(node.type), node.body, undefined);
}
checkFunctionExpressionBodies(node.body);
}
}
}
function checkArithmeticOperandType(operand, type, diagnostic) {
if (!allConstituentTypesHaveKind(type, 1 | 132)) {
error(operand, diagnostic);
return false;
}
return true;
}
function checkReferenceExpression(n, invalidReferenceMessage, constantVariableMessage) {
function findSymbol(n) {
var symbol = getNodeLinks(n).resolvedSymbol;
return symbol && getExportSymbolOfValueSymbolIfExported(symbol);
}
function isReferenceOrErrorExpression(n) {
switch (n.kind) {
case 65: {
var symbol = findSymbol(n);
return !symbol || symbol === unknownSymbol || symbol === argumentsSymbol || (symbol.flags & 3) !== 0;
}
case 156: {
var symbol = findSymbol(n);
return !symbol || symbol === unknownSymbol || (symbol.flags & ~8) !== 0;
}
case 157:
return true;
case 162:
return isReferenceOrErrorExpression(n.expression);
default:
return false;
}
}
function isConstVariableReference(n) {
switch (n.kind) {
case 65:
case 156: {
var symbol = findSymbol(n);
return symbol && (symbol.flags & 3) !== 0 && (getDeclarationFlagsFromSymbol(symbol) & 8192) !== 0;
}
case 157: {
var index = n.argumentExpression;
var symbol = findSymbol(n.expression);
if (symbol && index && index.kind === 8) {
var name_7 = index.text;
var prop = getPropertyOfType(getTypeOfSymbol(symbol), name_7);
return prop && (prop.flags & 3) !== 0 && (getDeclarationFlagsFromSymbol(prop) & 8192) !== 0;
}
return false;
}
case 162:
return isConstVariableReference(n.expression);
default:
return false;
}
}
if (!isReferenceOrErrorExpression(n)) {
error(n, invalidReferenceMessage);
return false;
}
if (isConstVariableReference(n)) {
error(n, constantVariableMessage);
return false;
}
return true;
}
function checkDeleteExpression(node) {
if (node.parserContextFlags & 1 && node.expression.kind === 65) {
grammarErrorOnNode(node.expression, ts.Diagnostics.delete_cannot_be_called_on_an_identifier_in_strict_mode);
}
var operandType = checkExpression(node.expression);
return booleanType;
}
function checkTypeOfExpression(node) {
var operandType = checkExpression(node.expression);
return stringType;
}
function checkVoidExpression(node) {
var operandType = checkExpression(node.expression);
return undefinedType;
}
function checkPrefixUnaryExpression(node) {
if ((node.operator === 38 || node.operator === 39)) {
checkGrammarEvalOrArgumentsInStrictMode(node, node.operand);
}
var operandType = checkExpression(node.operand);
switch (node.operator) {
case 33:
case 34:
case 47:
if (someConstituentTypeHasKind(operandType, 1048576)) {
error(node.operand, ts.Diagnostics.The_0_operator_cannot_be_applied_to_type_symbol, ts.tokenToString(node.operator));
}
return numberType;
case 46:
return booleanType;
case 38:
case 39:
var ok = checkArithmeticOperandType(node.operand, operandType, ts.Diagnostics.An_arithmetic_operand_must_be_of_type_any_number_or_an_enum_type);
if (ok) {
checkReferenceExpression(node.operand, ts.Diagnostics.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_property_or_indexer, ts.Diagnostics.The_operand_of_an_increment_or_decrement_operator_cannot_be_a_constant);
}
return numberType;
}
return unknownType;
}
function checkPostfixUnaryExpression(node) {
checkGrammarEvalOrArgumentsInStrictMode(node, node.operand);
var operandType = checkExpression(node.operand);
var ok = checkArithmeticOperandType(node.operand, operandType, ts.Diagnostics.An_arithmetic_operand_must_be_of_type_any_number_or_an_enum_type);
if (ok) {
checkReferenceExpression(node.operand, ts.Diagnostics.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_property_or_indexer, ts.Diagnostics.The_operand_of_an_increment_or_decrement_operator_cannot_be_a_constant);
}
return numberType;
}
function someConstituentTypeHasKind(type, kind) {
if (type.flags & kind) {
return true;
}
if (type.flags & 16384) {
var types = type.types;
for (var _i = 0; _i < types.length; _i++) {
var current = types[_i];
if (current.flags & kind) {
return true;
}
}
return false;
}
return false;
}
function allConstituentTypesHaveKind(type, kind) {
if (type.flags & kind) {
return true;
}
if (type.flags & 16384) {
var types = type.types;
for (var _i = 0; _i < types.length; _i++) {
var current = types[_i];
if (!(current.flags & kind)) {
return false;
}
}
return true;
}
return false;
}
function isConstEnumObjectType(type) {
return type.flags & (48128 | 32768) && type.symbol && isConstEnumSymbol(type.symbol);
}
function isConstEnumSymbol(symbol) {
return (symbol.flags & 128) !== 0;
}
function checkInstanceOfExpression(node, leftType, rightType) {
if (allConstituentTypesHaveKind(leftType, 1049086)) {
error(node.left, ts.Diagnostics.The_left_hand_side_of_an_instanceof_expression_must_be_of_type_any_an_object_type_or_a_type_parameter);
}
if (!(rightType.flags & 1 || isTypeSubtypeOf(rightType, globalFunctionType))) {
error(node.right, ts.Diagnostics.The_right_hand_side_of_an_instanceof_expression_must_be_of_type_any_or_of_a_type_assignable_to_the_Function_interface_type);
}
return booleanType;
}
function checkInExpression(node, leftType, rightType) {
if (!allConstituentTypesHaveKind(leftType, 1 | 258 | 132 | 1048576)) {
error(node.left, ts.Diagnostics.The_left_hand_side_of_an_in_expression_must_be_of_type_any_string_number_or_symbol);
}
if (!allConstituentTypesHaveKind(rightType, 1 | 48128 | 512)) {
error(node.right, ts.Diagnostics.The_right_hand_side_of_an_in_expression_must_be_of_type_any_an_object_type_or_a_type_parameter);
}
return booleanType;
}
function checkObjectLiteralAssignment(node, sourceType, contextualMapper) {
var properties = node.properties;
for (var _i = 0; _i < properties.length; _i++) {
var p = properties[_i];
if (p.kind === 225 || p.kind === 226) {
var name_8 = p.name;
var type = sourceType.flags & 1 ? sourceType :
getTypeOfPropertyOfType(sourceType, name_8.text) ||
isNumericLiteralName(name_8.text) && getIndexTypeOfType(sourceType, 1) ||
getIndexTypeOfType(sourceType, 0);
if (type) {
checkDestructuringAssignment(p.initializer || name_8, type);
}
else {
error(name_8, ts.Diagnostics.Type_0_has_no_property_1_and_no_string_index_signature, typeToString(sourceType), ts.declarationNameToString(name_8));
}
}
else {
error(p, ts.Diagnostics.Property_assignment_expected);
}
}
return sourceType;
}
function checkArrayLiteralAssignment(node, sourceType, contextualMapper) {
var elementType = checkIteratedTypeOrElementType(sourceType, node, false) || unknownType;
var elements = node.elements;
for (var i = 0; i < elements.length; i++) {
var e = elements[i];
if (e.kind !== 176) {
if (e.kind !== 174) {
var propName = "" + i;
var type = sourceType.flags & 1 ? sourceType :
isTupleLikeType(sourceType)
? getTypeOfPropertyOfType(sourceType, propName)
: elementType;
if (type) {
checkDestructuringAssignment(e, type, contextualMapper);
}
else {
if (isTupleType(sourceType)) {
error(e, ts.Diagnostics.Tuple_type_0_with_length_1_cannot_be_assigned_to_tuple_with_length_2, typeToString(sourceType), sourceType.elementTypes.length, elements.length);
}
else {
error(e, ts.Diagnostics.Type_0_has_no_property_1, typeToString(sourceType), propName);
}
}
}
else {
if (i < elements.length - 1) {
error(e, ts.Diagnostics.A_rest_element_must_be_last_in_an_array_destructuring_pattern);
}
else {
var restExpression = e.expression;
if (restExpression.kind === 170 && restExpression.operatorToken.kind === 53) {
error(restExpression.operatorToken, ts.Diagnostics.A_rest_element_cannot_have_an_initializer);
}
else {
checkDestructuringAssignment(restExpression, createArrayType(elementType), contextualMapper);
}
}
}
}
}
return sourceType;
}
function checkDestructuringAssignment(target, sourceType, contextualMapper) {
if (target.kind === 170 && target.operatorToken.kind === 53) {
checkBinaryExpression(target, contextualMapper);
target = target.left;
}
if (target.kind === 155) {
return checkObjectLiteralAssignment(target, sourceType, contextualMapper);
}
if (target.kind === 154) {
return checkArrayLiteralAssignment(target, sourceType, contextualMapper);
}
return checkReferenceAssignment(target, sourceType, contextualMapper);
}
function checkReferenceAssignment(target, sourceType, contextualMapper) {
var targetType = checkExpression(target, contextualMapper);
if (checkReferenceExpression(target, ts.Diagnostics.Invalid_left_hand_side_of_assignment_expression, ts.Diagnostics.Left_hand_side_of_assignment_expression_cannot_be_a_constant)) {
checkTypeAssignableTo(sourceType, targetType, target, undefined);
}
return sourceType;
}
function checkBinaryExpression(node, contextualMapper) {
if (ts.isLeftHandSideExpression(node.left) && ts.isAssignmentOperator(node.operatorToken.kind)) {
checkGrammarEvalOrArgumentsInStrictMode(node, node.left);
}
var operator = node.operatorToken.kind;
if (operator === 53 && (node.left.kind === 155 || node.left.kind === 154)) {
return checkDestructuringAssignment(node.left, checkExpression(node.right, contextualMapper), contextualMapper);
}
var leftType = checkExpression(node.left, contextualMapper);
var rightType = checkExpression(node.right, contextualMapper);
switch (operator) {
case 35:
case 56:
case 36:
case 57:
case 37:
case 58:
case 34:
case 55:
case 40:
case 59:
case 41:
case 60:
case 42:
case 61:
case 44:
case 63:
case 45:
case 64:
case 43:
case 62:
if (leftType.flags & (32 | 64))
leftType = rightType;
if (rightType.flags & (32 | 64))
rightType = leftType;
var suggestedOperator;
if ((leftType.flags & 8) &&
(rightType.flags & 8) &&
(suggestedOperator = getSuggestedBooleanOperator(node.operatorToken.kind)) !== undefined) {
error(node, ts.Diagnostics.The_0_operator_is_not_allowed_for_boolean_types_Consider_using_1_instead, ts.tokenToString(node.operatorToken.kind), ts.tokenToString(suggestedOperator));
}
else {
var leftOk = checkArithmeticOperandType(node.left, leftType, ts.Diagnostics.The_left_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_or_an_enum_type);
var rightOk = checkArithmeticOperandType(node.right, rightType, ts.Diagnostics.The_right_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_or_an_enum_type);
if (leftOk && rightOk) {
checkAssignmentOperator(numberType);
}
}
return numberType;
case 33:
case 54:
if (leftType.flags & (32 | 64))
leftType = rightType;
if (rightType.flags & (32 | 64))
rightType = leftType;
var resultType;
if (allConstituentTypesHaveKind(leftType, 132) && allConstituentTypesHaveKind(rightType, 132)) {
resultType = numberType;
}
else {
if (allConstituentTypesHaveKind(leftType, 258) || allConstituentTypesHaveKind(rightType, 258)) {
resultType = stringType;
}
else if (leftType.flags & 1 || rightType.flags & 1) {
resultType = anyType;
}
if (resultType && !checkForDisallowedESSymbolOperand(operator)) {
return resultType;
}
}
if (!resultType) {
reportOperatorError();
return anyType;
}
if (operator === 54) {
checkAssignmentOperator(resultType);
}
return resultType;
case 24:
case 25:
case 26:
case 27:
if (!checkForDisallowedESSymbolOperand(operator)) {
return booleanType;
}
case 28:
case 29:
case 30:
case 31:
if (!isTypeAssignableTo(leftType, rightType) && !isTypeAssignableTo(rightType, leftType)) {
reportOperatorError();
}
return booleanType;
case 87:
return checkInstanceOfExpression(node, leftType, rightType);
case 86:
return checkInExpression(node, leftType, rightType);
case 48:
return rightType;
case 49:
return getUnionType([leftType, rightType]);
case 53:
checkAssignmentOperator(rightType);
return rightType;
case 23:
return rightType;
}
function checkForDisallowedESSymbolOperand(operator) {
var offendingSymbolOperand = someConstituentTypeHasKind(leftType, 1048576) ? node.left :
someConstituentTypeHasKind(rightType, 1048576) ? node.right :
undefined;
if (offendingSymbolOperand) {
error(offendingSymbolOperand, ts.Diagnostics.The_0_operator_cannot_be_applied_to_type_symbol, ts.tokenToString(operator));
return false;
}
return true;
}
function getSuggestedBooleanOperator(operator) {
switch (operator) {
case 44:
case 63:
return 49;
case 45:
case 64:
return 31;
case 43:
case 62:
return 48;
default:
return undefined;
}
}
function checkAssignmentOperator(valueType) {
if (produceDiagnostics && operator >= 53 && operator <= 64) {
var ok = checkReferenceExpression(node.left, ts.Diagnostics.Invalid_left_hand_side_of_assignment_expression, ts.Diagnostics.Left_hand_side_of_assignment_expression_cannot_be_a_constant);
if (ok) {
checkTypeAssignableTo(valueType, leftType, node.left, undefined);
}
}
}
function reportOperatorError() {
error(node, ts.Diagnostics.Operator_0_cannot_be_applied_to_types_1_and_2, ts.tokenToString(node.operatorToken.kind), typeToString(leftType), typeToString(rightType));
}
}
function checkYieldExpression(node) {
if (!(node.parserContextFlags & 4)) {
grammarErrorOnFirstToken(node, ts.Diagnostics.yield_expression_must_be_contained_within_a_generator_declaration);
}
else {
grammarErrorOnFirstToken(node, ts.Diagnostics.yield_expressions_are_not_currently_supported);
}
}
function checkConditionalExpression(node, contextualMapper) {
checkExpression(node.condition);
var type1 = checkExpression(node.whenTrue, contextualMapper);
var type2 = checkExpression(node.whenFalse, contextualMapper);
return getUnionType([type1, type2]);
}
function checkTemplateExpression(node) {
ts.forEach(node.templateSpans, function (templateSpan) {
checkExpression(templateSpan.expression);
});
return stringType;
}
function checkExpressionWithContextualType(node, contextualType, contextualMapper) {
var saveContextualType = node.contextualType;
node.contextualType = contextualType;
var result = checkExpression(node, contextualMapper);
node.contextualType = saveContextualType;
return result;
}
function checkExpressionCached(node, contextualMapper) {
var links = getNodeLinks(node);
if (!links.resolvedType) {
links.resolvedType = checkExpression(node, contextualMapper);
}
return links.resolvedType;
}
function checkPropertyAssignment(node, contextualMapper) {
if (node.name.kind === 128) {
checkComputedPropertyName(node.name);
}
return checkExpression(node.initializer, contextualMapper);
}
function checkObjectLiteralMethod(node, contextualMapper) {
checkGrammarMethod(node);
if (node.name.kind === 128) {
checkComputedPropertyName(node.name);
}
var uninstantiatedType = checkFunctionExpressionOrObjectLiteralMethod(node, contextualMapper);
return instantiateTypeWithSingleGenericCallSignature(node, uninstantiatedType, contextualMapper);
}
function instantiateTypeWithSingleGenericCallSignature(node, type, contextualMapper) {
if (contextualMapper && contextualMapper !== identityMapper) {
var signature = getSingleCallSignature(type);
if (signature && signature.typeParameters) {
var contextualType = getContextualType(node);
if (contextualType) {
var contextualSignature = getSingleCallSignature(contextualType);
if (contextualSignature && !contextualSignature.typeParameters) {
return getOrCreateTypeFromSignature(instantiateSignatureInContextOf(signature, contextualSignature, contextualMapper));
}
}
}
}
return type;
}
function checkExpression(node, contextualMapper) {
checkGrammarIdentifierInStrictMode(node);
return checkExpressionOrQualifiedName(node, contextualMapper);
}
function checkExpressionOrQualifiedName(node, contextualMapper) {
var type;
if (node.kind == 127) {
type = checkQualifiedName(node);
}
else {
var uninstantiatedType = checkExpressionWorker(node, contextualMapper);
type = instantiateTypeWithSingleGenericCallSignature(node, uninstantiatedType, contextualMapper);
}
if (isConstEnumObjectType(type)) {
var ok = (node.parent.kind === 156 && node.parent.expression === node) ||
(node.parent.kind === 157 && node.parent.expression === node) ||
((node.kind === 65 || node.kind === 127) && isInRightSideOfImportOrExportAssignment(node));
if (!ok) {
error(node, ts.Diagnostics.const_enums_can_only_be_used_in_property_or_index_access_expressions_or_the_right_hand_side_of_an_import_declaration_or_export_assignment);
}
}
return type;
}
function checkNumericLiteral(node) {
checkGrammarNumericLiteral(node);
return numberType;
}
function checkExpressionWorker(node, contextualMapper) {
switch (node.kind) {
case 65:
return checkIdentifier(node);
case 93:
return checkThisExpression(node);
case 91:
return checkSuperExpression(node);
case 89:
return nullType;
case 95:
case 80:
return booleanType;
case 7:
return checkNumericLiteral(node);
case 172:
return checkTemplateExpression(node);
case 8:
case 10:
return stringType;
case 9:
return globalRegExpType;
case 154:
return checkArrayLiteral(node, contextualMapper);
case 155:
return checkObjectLiteral(node, contextualMapper);
case 156:
return checkPropertyAccessExpression(node);
case 157:
return checkIndexedAccess(node);
case 158:
case 159:
return checkCallExpression(node);
case 160:
return checkTaggedTemplateExpression(node);
case 161:
return checkTypeAssertion(node);
case 162:
return checkExpression(node.expression, contextualMapper);
case 175:
return checkClassExpression(node);
case 163:
case 164:
return checkFunctionExpressionOrObjectLiteralMethod(node, contextualMapper);
case 166:
return checkTypeOfExpression(node);
case 165:
return checkDeleteExpression(node);
case 167:
return checkVoidExpression(node);
case 168:
return checkPrefixUnaryExpression(node);
case 169:
return checkPostfixUnaryExpression(node);
case 170:
return checkBinaryExpression(node, contextualMapper);
case 171:
return checkConditionalExpression(node, contextualMapper);
case 174:
return checkSpreadElementExpression(node, contextualMapper);
case 176:
return undefinedType;
case 173:
checkYieldExpression(node);
return unknownType;
}
return unknownType;
}
function checkTypeParameter(node) {
checkGrammarDeclarationNameInStrictMode(node);
if (node.expression) {
grammarErrorOnFirstToken(node.expression, ts.Diagnostics.Type_expected);
}
checkSourceElement(node.constraint);
if (produceDiagnostics) {
checkTypeParameterHasIllegalReferencesInConstraint(node);
checkTypeNameIsReserved(node.name, ts.Diagnostics.Type_parameter_name_cannot_be_0);
}
}
function checkParameter(node) {
// Grammar checking
// It is a SyntaxError if the Identifier "eval" or the Identifier "arguments" occurs as the
// Identifier in a PropertySetParameterList of a PropertyAssignment that is contained in strict code
// or if its FunctionBody is strict code(11.1.5).
// It is a SyntaxError if the identifier eval or arguments appears within a FormalParameterList of a
// strict mode FunctionLikeDeclaration or FunctionExpression(13.1)
checkGrammarDecorators(node) || checkGrammarModifiers(node) || checkGrammarEvalOrArgumentsInStrictMode(node, node.name);
checkVariableLikeDeclaration(node);
var func = ts.getContainingFunction(node);
if (node.flags & 112) {
func = ts.getContainingFunction(node);
if (!(func.kind === 136 && ts.nodeIsPresent(func.body))) {
error(node, ts.Diagnostics.A_parameter_property_is_only_allowed_in_a_constructor_implementation);
}
}
if (node.questionToken && ts.isBindingPattern(node.name) && func.body) {
error(node, ts.Diagnostics.A_binding_pattern_parameter_cannot_be_optional_in_an_implementation_signature);
}
if (node.dotDotDotToken && !ts.isBindingPattern(node.name) && !isArrayType(getTypeOfSymbol(node.symbol))) {
error(node, ts.Diagnostics.A_rest_parameter_must_be_of_an_array_type);
}
}
function checkSignatureDeclaration(node) {
if (node.kind === 141) {
checkGrammarIndexSignature(node);
}
else if (node.kind === 143 || node.kind === 201 || node.kind === 144 ||
node.kind === 139 || node.kind === 136 ||
node.kind === 140) {
checkGrammarFunctionLikeDeclaration(node);
}
checkTypeParameters(node.typeParameters);
ts.forEach(node.parameters, checkParameter);
if (node.type) {
checkSourceElement(node.type);
}
if (produceDiagnostics) {
checkCollisionWithArgumentsInGeneratedCode(node);
if (compilerOptions.noImplicitAny && !node.type) {
switch (node.kind) {
case 140:
error(node, ts.Diagnostics.Construct_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type);
break;
case 139:
error(node, ts.Diagnostics.Call_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type);
break;
}
}
}
checkSpecializedSignatureDeclaration(node);
}
function checkTypeForDuplicateIndexSignatures(node) {
if (node.kind === 203) {
var nodeSymbol = getSymbolOfNode(node);
if (nodeSymbol.declarations.length > 0 && nodeSymbol.declarations[0] !== node) {
return;
}
}
var indexSymbol = getIndexSymbol(getSymbolOfNode(node));
if (indexSymbol) {
var seenNumericIndexer = false;
var seenStringIndexer = false;
for (var _i = 0, _a = indexSymbol.declarations; _i < _a.length; _i++) {
var decl = _a[_i];
var declaration = decl;
if (declaration.parameters.length === 1 && declaration.parameters[0].type) {
switch (declaration.parameters[0].type.kind) {
case 122:
if (!seenStringIndexer) {
seenStringIndexer = true;
}
else {
error(declaration, ts.Diagnostics.Duplicate_string_index_signature);
}
break;
case 120:
if (!seenNumericIndexer) {
seenNumericIndexer = true;
}
else {
error(declaration, ts.Diagnostics.Duplicate_number_index_signature);
}
break;
}
}
}
}
}
function checkPropertyDeclaration(node) {
checkGrammarDecorators(node) || checkGrammarModifiers(node) || checkGrammarProperty(node) || checkGrammarComputedPropertyName(node.name);
checkVariableLikeDeclaration(node);
}
function checkMethodDeclaration(node) {
checkGrammarMethod(node) || checkGrammarComputedPropertyName(node.name);
checkFunctionLikeDeclaration(node);
}
function checkConstructorDeclaration(node) {
checkSignatureDeclaration(node);
checkGrammarConstructorTypeParameters(node) || checkGrammarConstructorTypeAnnotation(node);
checkSourceElement(node.body);
var symbol = getSymbolOfNode(node);
var firstDeclaration = ts.getDeclarationOfKind(symbol, node.kind);
if (node === firstDeclaration) {
checkFunctionOrConstructorSymbol(symbol);
}
if (ts.nodeIsMissing(node.body)) {
return;
}
if (!produceDiagnostics) {
return;
}
function isSuperCallExpression(n) {
return n.kind === 158 && n.expression.kind === 91;
}
function containsSuperCall(n) {
if (isSuperCallExpression(n)) {
return true;
}
switch (n.kind) {
case 163:
case 201:
case 164:
case 155: return false;
default: return ts.forEachChild(n, containsSuperCall);
}
}
function markThisReferencesAsErrors(n) {
if (n.kind === 93) {
error(n, ts.Diagnostics.this_cannot_be_referenced_in_current_location);
}
else if (n.kind !== 163 && n.kind !== 201) {
ts.forEachChild(n, markThisReferencesAsErrors);
}
}
function isInstancePropertyWithInitializer(n) {
return n.kind === 133 &&
!(n.flags & 128) &&
!!n.initializer;
}
if (ts.getClassExtendsHeritageClauseElement(node.parent)) {
if (containsSuperCall(node.body)) {
var superCallShouldBeFirst = ts.forEach(node.parent.members, isInstancePropertyWithInitializer) ||
ts.forEach(node.parameters, function (p) { return p.flags & (16 | 32 | 64); });
if (superCallShouldBeFirst) {
var statements = node.body.statements;
if (!statements.length || statements[0].kind !== 183 || !isSuperCallExpression(statements[0].expression)) {
error(node, ts.Diagnostics.A_super_call_must_be_the_first_statement_in_the_constructor_when_a_class_contains_initialized_properties_or_has_parameter_properties);
}
else {
markThisReferencesAsErrors(statements[0].expression);
}
}
}
else {
error(node, ts.Diagnostics.Constructors_for_derived_classes_must_contain_a_super_call);
}
}
}
function checkAccessorDeclaration(node) {
if (produceDiagnostics) {
checkGrammarFunctionLikeDeclaration(node) || checkGrammarAccessor(node) || checkGrammarComputedPropertyName(node.name);
if (node.kind === 137) {
if (!ts.isInAmbientContext(node) && ts.nodeIsPresent(node.body) && !(bodyContainsAReturnStatement(node.body) || bodyContainsSingleThrowStatement(node.body))) {
error(node.name, ts.Diagnostics.A_get_accessor_must_return_a_value_or_consist_of_a_single_throw_statement);
}
}
if (!ts.hasDynamicName(node)) {
var otherKind = node.kind === 137 ? 138 : 137;
var otherAccessor = ts.getDeclarationOfKind(node.symbol, otherKind);
if (otherAccessor) {
if (((node.flags & 112) !== (otherAccessor.flags & 112))) {
error(node.name, ts.Diagnostics.Getter_and_setter_accessors_do_not_agree_in_visibility);
}
var currentAccessorType = getAnnotatedAccessorType(node);
var otherAccessorType = getAnnotatedAccessorType(otherAccessor);
if (currentAccessorType && otherAccessorType) {
if (!isTypeIdenticalTo(currentAccessorType, otherAccessorType)) {
error(node, ts.Diagnostics.get_and_set_accessor_must_have_the_same_type);
}
}
}
}
getTypeOfAccessors(getSymbolOfNode(node));
}
checkFunctionLikeDeclaration(node);
}
function checkMissingDeclaration(node) {
checkDecorators(node);
}
function checkTypeReferenceNode(node) {
checkGrammarTypeReferenceInStrictMode(node.typeName);
return checkTypeReferenceOrExpressionWithTypeArguments(node);
}
function checkExpressionWithTypeArguments(node) {
checkGrammarExpressionWithTypeArgumentsInStrictMode(node.expression);
return checkTypeReferenceOrExpressionWithTypeArguments(node);
}
function checkTypeReferenceOrExpressionWithTypeArguments(node) {
checkGrammarTypeArguments(node, node.typeArguments);
var type = getTypeFromTypeReferenceOrExpressionWithTypeArguments(node);
if (type !== unknownType && node.typeArguments) {
var len = node.typeArguments.length;
for (var i = 0; i < len; i++) {
checkSourceElement(node.typeArguments[i]);
var constraint = getConstraintOfTypeParameter(type.target.typeParameters[i]);
if (produceDiagnostics && constraint) {
var typeArgument = type.typeArguments[i];
checkTypeAssignableTo(typeArgument, constraint, node, ts.Diagnostics.Type_0_does_not_satisfy_the_constraint_1);
}
}
}
}
function checkTypeQuery(node) {
getTypeFromTypeQueryNode(node);
}
function checkTypeLiteral(node) {
ts.forEach(node.members, checkSourceElement);
if (produceDiagnostics) {
var type = getTypeFromTypeLiteralOrFunctionOrConstructorTypeNode(node);
checkIndexConstraints(type);
checkTypeForDuplicateIndexSignatures(node);
}
}
function checkArrayType(node) {
checkSourceElement(node.elementType);
}
function checkTupleType(node) {
var hasErrorFromDisallowedTrailingComma = checkGrammarForDisallowedTrailingComma(node.elementTypes);
if (!hasErrorFromDisallowedTrailingComma && node.elementTypes.length === 0) {
grammarErrorOnNode(node, ts.Diagnostics.A_tuple_type_element_list_cannot_be_empty);
}
ts.forEach(node.elementTypes, checkSourceElement);
}
function checkUnionType(node) {
ts.forEach(node.types, checkSourceElement);
}
function isPrivateWithinAmbient(node) {
return (node.flags & 32) && ts.isInAmbientContext(node);
}
function checkSpecializedSignatureDeclaration(signatureDeclarationNode) {
if (!produceDiagnostics) {
return;
}
var signature = getSignatureFromDeclaration(signatureDeclarationNode);
if (!signature.hasStringLiterals) {
return;
}
if (ts.nodeIsPresent(signatureDeclarationNode.body)) {
error(signatureDeclarationNode, ts.Diagnostics.A_signature_with_an_implementation_cannot_use_a_string_literal_type);
return;
}
var signaturesToCheck;
if (!signatureDeclarationNode.name && signatureDeclarationNode.parent && signatureDeclarationNode.parent.kind === 203) {
ts.Debug.assert(signatureDeclarationNode.kind === 139 || signatureDeclarationNode.kind === 140);
var signatureKind = signatureDeclarationNode.kind === 139 ? 0 : 1;
var containingSymbol = getSymbolOfNode(signatureDeclarationNode.parent);
var containingType = getDeclaredTypeOfSymbol(containingSymbol);
signaturesToCheck = getSignaturesOfType(containingType, signatureKind);
}
else {
signaturesToCheck = getSignaturesOfSymbol(getSymbolOfNode(signatureDeclarationNode));
}
for (var _i = 0; _i < signaturesToCheck.length; _i++) {
var otherSignature = signaturesToCheck[_i];
if (!otherSignature.hasStringLiterals && isSignatureAssignableTo(signature, otherSignature)) {
return;
}
}
error(signatureDeclarationNode, ts.Diagnostics.Specialized_overload_signature_is_not_assignable_to_any_non_specialized_signature);
}
function getEffectiveDeclarationFlags(n, flagsToCheck) {
var flags = ts.getCombinedNodeFlags(n);
if (n.parent.kind !== 203 && ts.isInAmbientContext(n)) {
if (!(flags & 2)) {
flags |= 1;
}
flags |= 2;
}
return flags & flagsToCheck;
}
function checkFunctionOrConstructorSymbol(symbol) {
if (!produceDiagnostics) {
return;
}
function getCanonicalOverload(overloads, implementation) {
var implementationSharesContainerWithFirstOverload = implementation !== undefined && implementation.parent === overloads[0].parent;
return implementationSharesContainerWithFirstOverload ? implementation : overloads[0];
}
function checkFlagAgreementBetweenOverloads(overloads, implementation, flagsToCheck, someOverloadFlags, allOverloadFlags) {
var someButNotAllOverloadFlags = someOverloadFlags ^ allOverloadFlags;
if (someButNotAllOverloadFlags !== 0) {
var canonicalFlags = getEffectiveDeclarationFlags(getCanonicalOverload(overloads, implementation), flagsToCheck);
ts.forEach(overloads, function (o) {
var deviation = getEffectiveDeclarationFlags(o, flagsToCheck) ^ canonicalFlags;
if (deviation & 1) {
error(o.name, ts.Diagnostics.Overload_signatures_must_all_be_exported_or_not_exported);
}
else if (deviation & 2) {
error(o.name, ts.Diagnostics.Overload_signatures_must_all_be_ambient_or_non_ambient);
}
else if (deviation & (32 | 64)) {
error(o.name, ts.Diagnostics.Overload_signatures_must_all_be_public_private_or_protected);
}
});
}
}
function checkQuestionTokenAgreementBetweenOverloads(overloads, implementation, someHaveQuestionToken, allHaveQuestionToken) {
if (someHaveQuestionToken !== allHaveQuestionToken) {
var canonicalHasQuestionToken = ts.hasQuestionToken(getCanonicalOverload(overloads, implementation));
ts.forEach(overloads, function (o) {
var deviation = ts.hasQuestionToken(o) !== canonicalHasQuestionToken;
if (deviation) {
error(o.name, ts.Diagnostics.Overload_signatures_must_all_be_optional_or_required);
}
});
}
}
var flagsToCheck = 1 | 2 | 32 | 64;
var someNodeFlags = 0;
var allNodeFlags = flagsToCheck;
var someHaveQuestionToken = false;
var allHaveQuestionToken = true;
var hasOverloads = false;
var bodyDeclaration;
var lastSeenNonAmbientDeclaration;
var previousDeclaration;
var declarations = symbol.declarations;
var isConstructor = (symbol.flags & 16384) !== 0;
function reportImplementationExpectedError(node) {
if (node.name && ts.nodeIsMissing(node.name)) {
return;
}
var seen = false;
var subsequentNode = ts.forEachChild(node.parent, function (c) {
if (seen) {
return c;
}
else {
seen = c === node;
}
});
if (subsequentNode) {
if (subsequentNode.kind === node.kind) {
var errorNode_1 = subsequentNode.name || subsequentNode;
if (node.name && subsequentNode.name && node.name.text === subsequentNode.name.text) {
ts.Debug.assert(node.kind === 135 || node.kind === 134);
ts.Debug.assert((node.flags & 128) !== (subsequentNode.flags & 128));
var diagnostic = node.flags & 128 ? ts.Diagnostics.Function_overload_must_be_static : ts.Diagnostics.Function_overload_must_not_be_static;
error(errorNode_1, diagnostic);
return;
}
else if (ts.nodeIsPresent(subsequentNode.body)) {
error(errorNode_1, ts.Diagnostics.Function_implementation_name_must_be_0, ts.declarationNameToString(node.name));
return;
}
}
}
var errorNode = node.name || node;
if (isConstructor) {
error(errorNode, ts.Diagnostics.Constructor_implementation_is_missing);
}
else {
error(errorNode, ts.Diagnostics.Function_implementation_is_missing_or_not_immediately_following_the_declaration);
}
}
var isExportSymbolInsideModule = symbol.parent && symbol.parent.flags & 1536;
var duplicateFunctionDeclaration = false;
var multipleConstructorImplementation = false;
for (var _i = 0; _i < declarations.length; _i++) {
var current = declarations[_i];
var node = current;
var inAmbientContext = ts.isInAmbientContext(node);
var inAmbientContextOrInterface = node.parent.kind === 203 || node.parent.kind === 146 || inAmbientContext;
if (inAmbientContextOrInterface) {
previousDeclaration = undefined;
}
if (node.kind === 201 || node.kind === 135 || node.kind === 134 || node.kind === 136) {
var currentNodeFlags = getEffectiveDeclarationFlags(node, flagsToCheck);
someNodeFlags |= currentNodeFlags;
allNodeFlags &= currentNodeFlags;
someHaveQuestionToken = someHaveQuestionToken || ts.hasQuestionToken(node);
allHaveQuestionToken = allHaveQuestionToken && ts.hasQuestionToken(node);
if (ts.nodeIsPresent(node.body) && bodyDeclaration) {
if (isConstructor) {
multipleConstructorImplementation = true;
}
else {
duplicateFunctionDeclaration = true;
}
}
else if (!isExportSymbolInsideModule && previousDeclaration && previousDeclaration.parent === node.parent && previousDeclaration.end !== node.pos) {
reportImplementationExpectedError(previousDeclaration);
}
if (ts.nodeIsPresent(node.body)) {
if (!bodyDeclaration) {
bodyDeclaration = node;
}
}
else {
hasOverloads = true;
}
previousDeclaration = node;
if (!inAmbientContextOrInterface) {
lastSeenNonAmbientDeclaration = node;
}
}
}
if (multipleConstructorImplementation) {
ts.forEach(declarations, function (declaration) {
error(declaration, ts.Diagnostics.Multiple_constructor_implementations_are_not_allowed);
});
}
if (duplicateFunctionDeclaration) {
ts.forEach(declarations, function (declaration) {
error(declaration.name, ts.Diagnostics.Duplicate_function_implementation);
});
}
if (!isExportSymbolInsideModule && lastSeenNonAmbientDeclaration && !lastSeenNonAmbientDeclaration.body) {
reportImplementationExpectedError(lastSeenNonAmbientDeclaration);
}
if (hasOverloads) {
checkFlagAgreementBetweenOverloads(declarations, bodyDeclaration, flagsToCheck, someNodeFlags, allNodeFlags);
checkQuestionTokenAgreementBetweenOverloads(declarations, bodyDeclaration, someHaveQuestionToken, allHaveQuestionToken);
if (bodyDeclaration) {
var signatures = getSignaturesOfSymbol(symbol);
var bodySignature = getSignatureFromDeclaration(bodyDeclaration);
if (!bodySignature.hasStringLiterals) {
for (var _a = 0; _a < signatures.length; _a++) {
var signature = signatures[_a];
if (!signature.hasStringLiterals && !isSignatureAssignableTo(bodySignature, signature)) {
error(signature.declaration, ts.Diagnostics.Overload_signature_is_not_compatible_with_function_implementation);
break;
}
}
}
}
}
}
function checkExportsOnMergedDeclarations(node) {
if (!produceDiagnostics) {
return;
}
var symbol = node.localSymbol;
if (!symbol) {
symbol = getSymbolOfNode(node);
if (!(symbol.flags & 7340032)) {
return;
}
}
if (ts.getDeclarationOfKind(symbol, node.kind) !== node) {
return;
}
var exportedDeclarationSpaces = 0;
var nonExportedDeclarationSpaces = 0;
ts.forEach(symbol.declarations, function (d) {
var declarationSpaces = getDeclarationSpaces(d);
if (getEffectiveDeclarationFlags(d, 1)) {
exportedDeclarationSpaces |= declarationSpaces;
}
else {
nonExportedDeclarationSpaces |= declarationSpaces;
}
});
var commonDeclarationSpace = exportedDeclarationSpaces & nonExportedDeclarationSpaces;
if (commonDeclarationSpace) {
ts.forEach(symbol.declarations, function (d) {
if (getDeclarationSpaces(d) & commonDeclarationSpace) {
error(d.name, ts.Diagnostics.Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local, ts.declarationNameToString(d.name));
}
});
}
function getDeclarationSpaces(d) {
switch (d.kind) {
case 203:
return 2097152;
case 206:
return d.name.kind === 8 || ts.getModuleInstanceState(d) !== 0
? 4194304 | 1048576
: 4194304;
case 202:
case 205:
return 2097152 | 1048576;
case 209:
var result = 0;
var target = resolveAlias(getSymbolOfNode(d));
ts.forEach(target.declarations, function (d) { result |= getDeclarationSpaces(d); });
return result;
default:
return 1048576;
}
}
}
function checkDecorator(node) {
var expression = node.expression;
var exprType = checkExpression(expression);
switch (node.parent.kind) {
case 202:
var classSymbol = getSymbolOfNode(node.parent);
var classConstructorType = getTypeOfSymbol(classSymbol);
var classDecoratorType = instantiateSingleCallFunctionType(getGlobalClassDecoratorType(), [classConstructorType]);
checkTypeAssignableTo(exprType, classDecoratorType, node);
break;
case 133:
checkTypeAssignableTo(exprType, getGlobalPropertyDecoratorType(), node);
break;
case 135:
case 137:
case 138:
var methodType = getTypeOfNode(node.parent);
var methodDecoratorType = instantiateSingleCallFunctionType(getGlobalMethodDecoratorType(), [methodType]);
checkTypeAssignableTo(exprType, methodDecoratorType, node);
break;
case 130:
checkTypeAssignableTo(exprType, getGlobalParameterDecoratorType(), node);
break;
}
}
function checkTypeNodeAsExpression(node) {
if (node && node.kind === 142) {
var type = getTypeFromTypeNode(node);
var shouldCheckIfUnknownType = type === unknownType && compilerOptions.separateCompilation;
if (!type || (!shouldCheckIfUnknownType && type.flags & (1048703 | 132 | 258))) {
return;
}
if (shouldCheckIfUnknownType || type.symbol.valueDeclaration) {
checkExpressionOrQualifiedName(node.typeName);
}
}
}
function checkTypeAnnotationAsExpression(node) {
switch (node.kind) {
case 133:
checkTypeNodeAsExpression(node.type);
break;
case 130:
checkTypeNodeAsExpression(node.type);
break;
case 135:
checkTypeNodeAsExpression(node.type);
break;
case 137:
checkTypeNodeAsExpression(node.type);
break;
case 138:
checkTypeNodeAsExpression(getSetAccessorTypeAnnotationNode(node));
break;
}
}
function checkParameterTypeAnnotationsAsExpressions(node) {
for (var _i = 0, _a = node.parameters; _i < _a.length; _i++) {
var parameter = _a[_i];
checkTypeAnnotationAsExpression(parameter);
}
}
function checkDecorators(node) {
if (!node.decorators) {
return;
}
if (!ts.nodeCanBeDecorated(node)) {
return;
}
if (compilerOptions.emitDecoratorMetadata) {
switch (node.kind) {
case 202:
var constructor = ts.getFirstConstructorWithBody(node);
if (constructor) {
checkParameterTypeAnnotationsAsExpressions(constructor);
}
break;
case 135:
checkParameterTypeAnnotationsAsExpressions(node);
case 138:
case 137:
case 133:
case 130:
checkTypeAnnotationAsExpression(node);
break;
}
}
emitDecorate = true;
if (node.kind === 130) {
emitParam = true;
}
ts.forEach(node.decorators, checkDecorator);
}
function checkFunctionDeclaration(node) {
if (produceDiagnostics) {
checkFunctionLikeDeclaration(node) ||
checkGrammarDisallowedModifiersInBlockOrObjectLiteralExpression(node) ||
checkGrammarFunctionName(node.name) ||
checkGrammarForGenerator(node);
checkCollisionWithCapturedSuperVariable(node, node.name);
checkCollisionWithCapturedThisVariable(node, node.name);
checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
}
}
function checkFunctionLikeDeclaration(node) {
checkGrammarDeclarationNameInStrictMode(node);
checkDecorators(node);
checkSignatureDeclaration(node);
if (node.name && node.name.kind === 128) {
checkComputedPropertyName(node.name);
}
if (!ts.hasDynamicName(node)) {
var symbol = getSymbolOfNode(node);
var localSymbol = node.localSymbol || symbol;
var firstDeclaration = ts.getDeclarationOfKind(localSymbol, node.kind);
if (node === firstDeclaration) {
checkFunctionOrConstructorSymbol(localSymbol);
}
if (symbol.parent) {
if (ts.getDeclarationOfKind(symbol, node.kind) === node) {
checkFunctionOrConstructorSymbol(symbol);
}
}
}
checkSourceElement(node.body);
if (node.type && !isAccessor(node.kind) && !node.asteriskToken) {
checkIfNonVoidFunctionHasReturnExpressionsOrSingleThrowStatment(node, getTypeFromTypeNode(node.type));
}
if (compilerOptions.noImplicitAny && ts.nodeIsMissing(node.body) && !node.type && !isPrivateWithinAmbient(node)) {
reportImplicitAnyError(node, anyType);
}
}
function checkBlock(node) {
if (node.kind === 180) {
checkGrammarStatementInAmbientContext(node);
}
ts.forEach(node.statements, checkSourceElement);
if (ts.isFunctionBlock(node) || node.kind === 207) {
checkFunctionExpressionBodies(node);
}
}
function checkCollisionWithArgumentsInGeneratedCode(node) {
if (!ts.hasRestParameters(node) || ts.isInAmbientContext(node) || ts.nodeIsMissing(node.body)) {
return;
}
ts.forEach(node.parameters, function (p) {
if (p.name && !ts.isBindingPattern(p.name) && p.name.text === argumentsSymbol.name) {
error(p, ts.Diagnostics.Duplicate_identifier_arguments_Compiler_uses_arguments_to_initialize_rest_parameters);
}
});
}
function needCollisionCheckForIdentifier(node, identifier, name) {
if (!(identifier && identifier.text === name)) {
return false;
}
if (node.kind === 133 ||
node.kind === 132 ||
node.kind === 135 ||
node.kind === 134 ||
node.kind === 137 ||
node.kind === 138) {
return false;
}
if (ts.isInAmbientContext(node)) {
return false;
}
var root = ts.getRootDeclaration(node);
if (root.kind === 130 && ts.nodeIsMissing(root.parent.body)) {
return false;
}
return true;
}
function checkCollisionWithCapturedThisVariable(node, name) {
if (needCollisionCheckForIdentifier(node, name, "_this")) {
potentialThisCollisions.push(node);
}
}
function checkIfThisIsCapturedInEnclosingScope(node) {
var current = node;
while (current) {
if (getNodeCheckFlags(current) & 4) {
var isDeclaration_1 = node.kind !== 65;
if (isDeclaration_1) {
error(node.name, ts.Diagnostics.Duplicate_identifier_this_Compiler_uses_variable_declaration_this_to_capture_this_reference);
}
else {
error(node, ts.Diagnostics.Expression_resolves_to_variable_declaration_this_that_compiler_uses_to_capture_this_reference);
}
return;
}
current = current.parent;
}
}
function checkCollisionWithCapturedSuperVariable(node, name) {
if (!needCollisionCheckForIdentifier(node, name, "_super")) {
return;
}
var enclosingClass = ts.getAncestor(node, 202);
if (!enclosingClass || ts.isInAmbientContext(enclosingClass)) {
return;
}
if (ts.getClassExtendsHeritageClauseElement(enclosingClass)) {
var isDeclaration_2 = node.kind !== 65;
if (isDeclaration_2) {
error(node, ts.Diagnostics.Duplicate_identifier_super_Compiler_uses_super_to_capture_base_class_reference);
}
else {
error(node, ts.Diagnostics.Expression_resolves_to_super_that_compiler_uses_to_capture_base_class_reference);
}
}
}
function checkCollisionWithRequireExportsInGeneratedCode(node, name) {
if (!needCollisionCheckForIdentifier(node, name, "require") && !needCollisionCheckForIdentifier(node, name, "exports")) {
return;
}
if (node.kind === 206 && ts.getModuleInstanceState(node) !== 1) {
return;
}
var parent = getDeclarationContainer(node);
if (parent.kind === 228 && ts.isExternalModule(parent)) {
error(name, ts.Diagnostics.Duplicate_identifier_0_Compiler_reserves_name_1_in_top_level_scope_of_a_module, ts.declarationNameToString(name), ts.declarationNameToString(name));
}
}
function checkVarDeclaredNamesNotShadowed(node) {
// - ScriptBody : StatementList
// It is a Syntax Error if any element of the LexicallyDeclaredNames of StatementList
// also occurs in the VarDeclaredNames of StatementList.
if ((ts.getCombinedNodeFlags(node) & 12288) !== 0 || ts.isParameterDeclaration(node)) {
return;
}
if (node.kind === 199 && !node.initializer) {
return;
}
var symbol = getSymbolOfNode(node);
if (symbol.flags & 1) {
var localDeclarationSymbol = resolveName(node, node.name.text, 3, undefined, undefined);
if (localDeclarationSymbol &&
localDeclarationSymbol !== symbol &&
localDeclarationSymbol.flags & 2) {
if (getDeclarationFlagsFromSymbol(localDeclarationSymbol) & 12288) {
var varDeclList = ts.getAncestor(localDeclarationSymbol.valueDeclaration, 200);
var container = varDeclList.parent.kind === 181 && varDeclList.parent.parent
? varDeclList.parent.parent
: undefined;
var namesShareScope = container &&
(container.kind === 180 && ts.isFunctionLike(container.parent) ||
container.kind === 207 ||
container.kind === 206 ||
container.kind === 228);
if (!namesShareScope) {
var name_9 = symbolToString(localDeclarationSymbol);
error(node, ts.Diagnostics.Cannot_initialize_outer_scoped_variable_0_in_the_same_scope_as_block_scoped_declaration_1, name_9, name_9);
}
}
}
}
}
function checkParameterInitializer(node) {
if (ts.getRootDeclaration(node).kind !== 130) {
return;
}
var func = ts.getContainingFunction(node);
visit(node.initializer);
function visit(n) {
if (n.kind === 65) {
var referencedSymbol = getNodeLinks(n).resolvedSymbol;
if (referencedSymbol && referencedSymbol !== unknownSymbol && getSymbol(func.locals, referencedSymbol.name, 107455) === referencedSymbol) {
if (referencedSymbol.valueDeclaration.kind === 130) {
if (referencedSymbol.valueDeclaration === node) {
error(n, ts.Diagnostics.Parameter_0_cannot_be_referenced_in_its_initializer, ts.declarationNameToString(node.name));
return;
}
if (referencedSymbol.valueDeclaration.pos < node.pos) {
return;
}
}
error(n, ts.Diagnostics.Initializer_of_parameter_0_cannot_reference_identifier_1_declared_after_it, ts.declarationNameToString(node.name), ts.declarationNameToString(n));
}
}
else {
ts.forEachChild(n, visit);
}
}
}
function checkVariableLikeDeclaration(node) {
checkGrammarDeclarationNameInStrictMode(node);
checkDecorators(node);
checkSourceElement(node.type);
if (node.name.kind === 128) {
checkComputedPropertyName(node.name);
if (node.initializer) {
checkExpressionCached(node.initializer);
}
}
if (ts.isBindingPattern(node.name)) {
ts.forEach(node.name.elements, checkSourceElement);
}
if (node.initializer && ts.getRootDeclaration(node).kind === 130 && ts.nodeIsMissing(ts.getContainingFunction(node).body)) {
error(node, ts.Diagnostics.A_parameter_initializer_is_only_allowed_in_a_function_or_constructor_implementation);
return;
}
if (ts.isBindingPattern(node.name)) {
if (node.initializer) {
checkTypeAssignableTo(checkExpressionCached(node.initializer), getWidenedTypeForVariableLikeDeclaration(node), node, undefined);
checkParameterInitializer(node);
}
return;
}
var symbol = getSymbolOfNode(node);
var type = getTypeOfVariableOrParameterOrProperty(symbol);
if (node === symbol.valueDeclaration) {
if (node.initializer) {
checkTypeAssignableTo(checkExpressionCached(node.initializer), type, node, undefined);
checkParameterInitializer(node);
}
}
else {
var declarationType = getWidenedTypeForVariableLikeDeclaration(node);
if (type !== unknownType && declarationType !== unknownType && !isTypeIdenticalTo(type, declarationType)) {
error(node.name, ts.Diagnostics.Subsequent_variable_declarations_must_have_the_same_type_Variable_0_must_be_of_type_1_but_here_has_type_2, ts.declarationNameToString(node.name), typeToString(type), typeToString(declarationType));
}
if (node.initializer) {
checkTypeAssignableTo(checkExpressionCached(node.initializer), declarationType, node, undefined);
}
}
if (node.kind !== 133 && node.kind !== 132) {
checkExportsOnMergedDeclarations(node);
if (node.kind === 199 || node.kind === 153) {
checkVarDeclaredNamesNotShadowed(node);
}
checkCollisionWithCapturedSuperVariable(node, node.name);
checkCollisionWithCapturedThisVariable(node, node.name);
checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
}
}
function checkVariableDeclaration(node) {
checkGrammarVariableDeclaration(node);
return checkVariableLikeDeclaration(node);
}
function checkBindingElement(node) {
checkGrammarBindingElement(node);
return checkVariableLikeDeclaration(node);
}
function checkVariableStatement(node) {
checkGrammarDecorators(node) || checkGrammarDisallowedModifiersInBlockOrObjectLiteralExpression(node) || checkGrammarModifiers(node) || checkGrammarVariableDeclarationList(node.declarationList) || checkGrammarForDisallowedLetOrConstStatement(node);
ts.forEach(node.declarationList.declarations, checkSourceElement);
}
function checkGrammarDisallowedModifiersInBlockOrObjectLiteralExpression(node) {
if (node.modifiers) {
if (inBlockOrObjectLiteralExpression(node)) {
return grammarErrorOnFirstToken(node, ts.Diagnostics.Modifiers_cannot_appear_here);
}
}
}
function inBlockOrObjectLiteralExpression(node) {
while (node) {
if (node.kind === 180 || node.kind === 155) {
return true;
}
node = node.parent;
}
}
function checkExpressionStatement(node) {
checkGrammarStatementInAmbientContext(node);
checkExpression(node.expression);
}
function checkIfStatement(node) {
checkGrammarStatementInAmbientContext(node);
checkExpression(node.expression);
checkSourceElement(node.thenStatement);
checkSourceElement(node.elseStatement);
}
function checkDoStatement(node) {
checkGrammarStatementInAmbientContext(node);
checkSourceElement(node.statement);
checkExpression(node.expression);
}
function checkWhileStatement(node) {
checkGrammarStatementInAmbientContext(node);
checkExpression(node.expression);
checkSourceElement(node.statement);
}
function checkForStatement(node) {
if (!checkGrammarStatementInAmbientContext(node)) {
if (node.initializer && node.initializer.kind == 200) {
checkGrammarVariableDeclarationList(node.initializer);
}
}
if (node.initializer) {
if (node.initializer.kind === 200) {
ts.forEach(node.initializer.declarations, checkVariableDeclaration);
}
else {
checkExpression(node.initializer);
}
}
if (node.condition)
checkExpression(node.condition);
if (node.incrementor)
checkExpression(node.incrementor);
checkSourceElement(node.statement);
}
function checkForOfStatement(node) {
checkGrammarForInOrForOfStatement(node);
if (node.initializer.kind === 200) {
checkForInOrForOfVariableDeclaration(node);
}
else {
var varExpr = node.initializer;
var iteratedType = checkRightHandSideOfForOf(node.expression);
if (varExpr.kind === 154 || varExpr.kind === 155) {
checkDestructuringAssignment(varExpr, iteratedType || unknownType);
}
else {
var leftType = checkExpression(varExpr);
checkReferenceExpression(varExpr, ts.Diagnostics.Invalid_left_hand_side_in_for_of_statement, ts.Diagnostics.The_left_hand_side_of_a_for_of_statement_cannot_be_a_previously_defined_constant);
if (iteratedType) {
checkTypeAssignableTo(iteratedType, leftType, varExpr, undefined);
}
}
}
checkSourceElement(node.statement);
}
function checkForInStatement(node) {
checkGrammarForInOrForOfStatement(node);
if (node.initializer.kind === 200) {
var variable = node.initializer.declarations[0];
if (variable && ts.isBindingPattern(variable.name)) {
error(variable.name, ts.Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern);
}
checkForInOrForOfVariableDeclaration(node);
}
else {
var varExpr = node.initializer;
var leftType = checkExpression(varExpr);
if (varExpr.kind === 154 || varExpr.kind === 155) {
error(varExpr, ts.Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern);
}
else if (!allConstituentTypesHaveKind(leftType, 1 | 258)) {
error(varExpr, ts.Diagnostics.The_left_hand_side_of_a_for_in_statement_must_be_of_type_string_or_any);
}
else {
checkReferenceExpression(varExpr, ts.Diagnostics.Invalid_left_hand_side_in_for_in_statement, ts.Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_be_a_previously_defined_constant);
}
}
var rightType = checkExpression(node.expression);
if (!allConstituentTypesHaveKind(rightType, 1 | 48128 | 512)) {
error(node.expression, ts.Diagnostics.The_right_hand_side_of_a_for_in_statement_must_be_of_type_any_an_object_type_or_a_type_parameter);
}
checkSourceElement(node.statement);
}
function checkForInOrForOfVariableDeclaration(iterationStatement) {
var variableDeclarationList = iterationStatement.initializer;
if (variableDeclarationList.declarations.length >= 1) {
var decl = variableDeclarationList.declarations[0];
checkVariableDeclaration(decl);
}
}
function checkRightHandSideOfForOf(rhsExpression) {
var expressionType = getTypeOfExpression(rhsExpression);
return checkIteratedTypeOrElementType(expressionType, rhsExpression, true);
}
function checkIteratedTypeOrElementType(inputType, errorNode, allowStringInput) {
if (inputType.flags & 1) {
return inputType;
}
if (languageVersion >= 2) {
return checkIteratedType(inputType, errorNode) || anyType;
}
if (allowStringInput) {
return checkElementTypeOfArrayOrString(inputType, errorNode);
}
if (isArrayLikeType(inputType)) {
var indexType = getIndexTypeOfType(inputType, 1);
if (indexType) {
return indexType;
}
}
error(errorNode, ts.Diagnostics.Type_0_is_not_an_array_type, typeToString(inputType));
return unknownType;
}
function checkIteratedType(iterable, errorNode) {
ts.Debug.assert(languageVersion >= 2);
var iteratedType = getIteratedType(iterable, errorNode);
if (errorNode && iteratedType) {
checkTypeAssignableTo(iterable, createIterableType(iteratedType), errorNode);
}
return iteratedType;
function getIteratedType(iterable, errorNode) {
// We want to treat type as an iterable, and get the type it is an iterable of. The iterable
// must have the following structure (annotated with the names of the variables below):
//
// { // iterable
// [Symbol.iterator]: { // iteratorFunction
// (): { // iterator
// next: { // iteratorNextFunction
// (): { // iteratorNextResult
// value: T // iteratorNextValue
// }
// }
// }
// }
// }
//
// T is the type we are after. At every level that involves analyzing return types
// of signatures, we union the return types of all the signatures.
//
// Another thing to note is that at any step of this process, we could run into a dead end,
// meaning either the property is missing, or we run into the anyType. If either of these things
// happens, we return undefined to signal that we could not find the iterated type. If a property
// is missing, and the previous step did not result in 'any', then we also give an error if the
// caller requested it. Then the caller can decide what to do in the case where there is no iterated
// type. This is different from returning anyType, because that would signify that we have matched the
// whole pattern and that T (above) is 'any'.
if (allConstituentTypesHaveKind(iterable, 1)) {
return undefined;
}
if ((iterable.flags & 4096) && iterable.target === globalIterableType) {
return iterable.typeArguments[0];
}
var iteratorFunction = getTypeOfPropertyOfType(iterable, ts.getPropertyNameForKnownSymbolName("iterator"));
if (iteratorFunction && allConstituentTypesHaveKind(iteratorFunction, 1)) {
return undefined;
}
var iteratorFunctionSignatures = iteratorFunction ? getSignaturesOfType(iteratorFunction, 0) : emptyArray;
if (iteratorFunctionSignatures.length === 0) {
if (errorNode) {
error(errorNode, ts.Diagnostics.Type_must_have_a_Symbol_iterator_method_that_returns_an_iterator);
}
return undefined;
}
var iterator = getUnionType(ts.map(iteratorFunctionSignatures, getReturnTypeOfSignature));
if (allConstituentTypesHaveKind(iterator, 1)) {
return undefined;
}
var iteratorNextFunction = getTypeOfPropertyOfType(iterator, "next");
if (iteratorNextFunction && allConstituentTypesHaveKind(iteratorNextFunction, 1)) {
return undefined;
}
var iteratorNextFunctionSignatures = iteratorNextFunction ? getSignaturesOfType(iteratorNextFunction, 0) : emptyArray;
if (iteratorNextFunctionSignatures.length === 0) {
if (errorNode) {
error(errorNode, ts.Diagnostics.An_iterator_must_have_a_next_method);
}
return undefined;
}
var iteratorNextResult = getUnionType(ts.map(iteratorNextFunctionSignatures, getReturnTypeOfSignature));
if (allConstituentTypesHaveKind(iteratorNextResult, 1)) {
return undefined;
}
var iteratorNextValue = getTypeOfPropertyOfType(iteratorNextResult, "value");
if (!iteratorNextValue) {
if (errorNode) {
error(errorNode, ts.Diagnostics.The_type_returned_by_the_next_method_of_an_iterator_must_have_a_value_property);
}
return undefined;
}
return iteratorNextValue;
}
}
function checkElementTypeOfArrayOrString(arrayOrStringType, errorNode) {
ts.Debug.assert(languageVersion < 2);
var arrayType = removeTypesFromUnionType(arrayOrStringType, 258, true, true);
var hasStringConstituent = arrayOrStringType !== arrayType;
var reportedError = false;
if (hasStringConstituent) {
if (languageVersion < 1) {
error(errorNode, ts.Diagnostics.Using_a_string_in_a_for_of_statement_is_only_supported_in_ECMAScript_5_and_higher);
reportedError = true;
}
if (arrayType === emptyObjectType) {
return stringType;
}
}
if (!isArrayLikeType(arrayType)) {
if (!reportedError) {
var diagnostic = hasStringConstituent
? ts.Diagnostics.Type_0_is_not_an_array_type
: ts.Diagnostics.Type_0_is_not_an_array_type_or_a_string_type;
error(errorNode, diagnostic, typeToString(arrayType));
}
return hasStringConstituent ? stringType : unknownType;
}
var arrayElementType = getIndexTypeOfType(arrayType, 1) || unknownType;
if (hasStringConstituent) {
if (arrayElementType.flags & 258) {
return stringType;
}
return getUnionType([arrayElementType, stringType]);
}
return arrayElementType;
}
function checkBreakOrContinueStatement(node) {
checkGrammarStatementInAmbientContext(node) || checkGrammarBreakOrContinueStatement(node);
}
function isGetAccessorWithAnnotatatedSetAccessor(node) {
return !!(node.kind === 137 && getSetAccessorTypeAnnotationNode(ts.getDeclarationOfKind(node.symbol, 138)));
}
function checkReturnStatement(node) {
if (!checkGrammarStatementInAmbientContext(node)) {
var functionBlock = ts.getContainingFunction(node);
if (!functionBlock) {
grammarErrorOnFirstToken(node, ts.Diagnostics.A_return_statement_can_only_be_used_within_a_function_body);
}
}
if (node.expression) {
var func = ts.getContainingFunction(node);
if (func) {
var returnType = getReturnTypeOfSignature(getSignatureFromDeclaration(func));
var exprType = checkExpressionCached(node.expression);
if (func.kind === 138) {
error(node.expression, ts.Diagnostics.Setters_cannot_return_a_value);
}
else {
if (func.kind === 136) {
if (!isTypeAssignableTo(exprType, returnType)) {
error(node.expression, ts.Diagnostics.Return_type_of_constructor_signature_must_be_assignable_to_the_instance_type_of_the_class);
}
}
else if (func.type || isGetAccessorWithAnnotatatedSetAccessor(func)) {
checkTypeAssignableTo(exprType, returnType, node.expression, undefined);
}
}
}
}
}
function checkWithStatement(node) {
if (!checkGrammarStatementInAmbientContext(node)) {
if (node.parserContextFlags & 1) {
grammarErrorOnFirstToken(node, ts.Diagnostics.with_statements_are_not_allowed_in_strict_mode);
}
}
checkExpression(node.expression);
error(node.expression, ts.Diagnostics.All_symbols_within_a_with_block_will_be_resolved_to_any);
}
function checkSwitchStatement(node) {
checkGrammarStatementInAmbientContext(node);
var firstDefaultClause;
var hasDuplicateDefaultClause = false;
var expressionType = checkExpression(node.expression);
ts.forEach(node.caseBlock.clauses, function (clause) {
if (clause.kind === 222 && !hasDuplicateDefaultClause) {
if (firstDefaultClause === undefined) {
firstDefaultClause = clause;
}
else {
var sourceFile = ts.getSourceFileOfNode(node);
var start = ts.skipTrivia(sourceFile.text, clause.pos);
var end = clause.statements.length > 0 ? clause.statements[0].pos : clause.end;
grammarErrorAtPos(sourceFile, start, end - start, ts.Diagnostics.A_default_clause_cannot_appear_more_than_once_in_a_switch_statement);
hasDuplicateDefaultClause = true;
}
}
if (produceDiagnostics && clause.kind === 221) {
var caseClause = clause;
var caseType = checkExpression(caseClause.expression);
if (!isTypeAssignableTo(expressionType, caseType)) {
checkTypeAssignableTo(caseType, expressionType, caseClause.expression, undefined);
}
}
ts.forEach(clause.statements, checkSourceElement);
});
}
function checkLabeledStatement(node) {
if (!checkGrammarStatementInAmbientContext(node)) {
var current = node.parent;
while (current) {
if (ts.isFunctionLike(current)) {
break;
}
if (current.kind === 195 && current.label.text === node.label.text) {
var sourceFile = ts.getSourceFileOfNode(node);
grammarErrorOnNode(node.label, ts.Diagnostics.Duplicate_label_0, ts.getTextOfNodeFromSourceText(sourceFile.text, node.label));
break;
}
current = current.parent;
}
}
checkSourceElement(node.statement);
}
function checkThrowStatement(node) {
if (!checkGrammarStatementInAmbientContext(node)) {
if (node.expression === undefined) {
grammarErrorAfterFirstToken(node, ts.Diagnostics.Line_break_not_permitted_here);
}
}
if (node.expression) {
checkExpression(node.expression);
}
}
function checkTryStatement(node) {
checkGrammarStatementInAmbientContext(node);
checkBlock(node.tryBlock);
var catchClause = node.catchClause;
if (catchClause) {
if (catchClause.variableDeclaration) {
if (catchClause.variableDeclaration.name.kind !== 65) {
grammarErrorOnFirstToken(catchClause.variableDeclaration.name, ts.Diagnostics.Catch_clause_variable_name_must_be_an_identifier);
}
else if (catchClause.variableDeclaration.type) {
grammarErrorOnFirstToken(catchClause.variableDeclaration.type, ts.Diagnostics.Catch_clause_variable_cannot_have_a_type_annotation);
}
else if (catchClause.variableDeclaration.initializer) {
grammarErrorOnFirstToken(catchClause.variableDeclaration.initializer, ts.Diagnostics.Catch_clause_variable_cannot_have_an_initializer);
}
else {
var identifierName = catchClause.variableDeclaration.name.text;
var locals = catchClause.block.locals;
if (locals && ts.hasProperty(locals, identifierName)) {
var localSymbol = locals[identifierName];
if (localSymbol && (localSymbol.flags & 2) !== 0) {
grammarErrorOnNode(localSymbol.valueDeclaration, ts.Diagnostics.Cannot_redeclare_identifier_0_in_catch_clause, identifierName);
}
}
checkGrammarEvalOrArgumentsInStrictMode(node, catchClause.variableDeclaration.name);
}
}
checkBlock(catchClause.block);
}
if (node.finallyBlock) {
checkBlock(node.finallyBlock);
}
}
function checkIndexConstraints(type) {
var declaredNumberIndexer = getIndexDeclarationOfSymbol(type.symbol, 1);
var declaredStringIndexer = getIndexDeclarationOfSymbol(type.symbol, 0);
var stringIndexType = getIndexTypeOfType(type, 0);
var numberIndexType = getIndexTypeOfType(type, 1);
if (stringIndexType || numberIndexType) {
ts.forEach(getPropertiesOfObjectType(type), function (prop) {
var propType = getTypeOfSymbol(prop);
checkIndexConstraintForProperty(prop, propType, type, declaredStringIndexer, stringIndexType, 0);
checkIndexConstraintForProperty(prop, propType, type, declaredNumberIndexer, numberIndexType, 1);
});
if (type.flags & 1024 && type.symbol.valueDeclaration.kind === 202) {
var classDeclaration = type.symbol.valueDeclaration;
for (var _i = 0, _a = classDeclaration.members; _i < _a.length; _i++) {
var member = _a[_i];
if (!(member.flags & 128) && ts.hasDynamicName(member)) {
var propType = getTypeOfSymbol(member.symbol);
checkIndexConstraintForProperty(member.symbol, propType, type, declaredStringIndexer, stringIndexType, 0);
checkIndexConstraintForProperty(member.symbol, propType, type, declaredNumberIndexer, numberIndexType, 1);
}
}
}
}
var errorNode;
if (stringIndexType && numberIndexType) {
errorNode = declaredNumberIndexer || declaredStringIndexer;
if (!errorNode && (type.flags & 2048)) {
var someBaseTypeHasBothIndexers = ts.forEach(getBaseTypes(type), function (base) { return getIndexTypeOfType(base, 0) && getIndexTypeOfType(base, 1); });
errorNode = someBaseTypeHasBothIndexers ? undefined : type.symbol.declarations[0];
}
}
if (errorNode && !isTypeAssignableTo(numberIndexType, stringIndexType)) {
error(errorNode, ts.Diagnostics.Numeric_index_type_0_is_not_assignable_to_string_index_type_1, typeToString(numberIndexType), typeToString(stringIndexType));
}
function checkIndexConstraintForProperty(prop, propertyType, containingType, indexDeclaration, indexType, indexKind) {
if (!indexType) {
return;
}
if (indexKind === 1 && !isNumericName(prop.valueDeclaration.name)) {
return;
}
var errorNode;
if (prop.valueDeclaration.name.kind === 128 || prop.parent === containingType.symbol) {
errorNode = prop.valueDeclaration;
}
else if (indexDeclaration) {
errorNode = indexDeclaration;
}
else if (containingType.flags & 2048) {
var someBaseClassHasBothPropertyAndIndexer = ts.forEach(getBaseTypes(containingType), function (base) { return getPropertyOfObjectType(base, prop.name) && getIndexTypeOfType(base, indexKind); });
errorNode = someBaseClassHasBothPropertyAndIndexer ? undefined : containingType.symbol.declarations[0];
}
if (errorNode && !isTypeAssignableTo(propertyType, indexType)) {
var errorMessage = indexKind === 0
? ts.Diagnostics.Property_0_of_type_1_is_not_assignable_to_string_index_type_2
: ts.Diagnostics.Property_0_of_type_1_is_not_assignable_to_numeric_index_type_2;
error(errorNode, errorMessage, symbolToString(prop), typeToString(propertyType), typeToString(indexType));
}
}
}
function checkTypeNameIsReserved(name, message) {
switch (name.text) {
case "any":
case "number":
case "boolean":
case "string":
case "symbol":
case "void":
error(name, message, name.text);
}
}
function checkTypeParameters(typeParameterDeclarations) {
if (typeParameterDeclarations) {
for (var i = 0, n = typeParameterDeclarations.length; i < n; i++) {
var node = typeParameterDeclarations[i];
checkTypeParameter(node);
if (produceDiagnostics) {
for (var j = 0; j < i; j++) {
if (typeParameterDeclarations[j].symbol === node.symbol) {
error(node.name, ts.Diagnostics.Duplicate_identifier_0, ts.declarationNameToString(node.name));
}
}
}
}
}
}
function checkClassExpression(node) {
grammarErrorOnNode(node, ts.Diagnostics.class_expressions_are_not_currently_supported);
ts.forEach(node.members, checkSourceElement);
return unknownType;
}
function checkClassDeclaration(node) {
checkGrammarDeclarationNameInStrictMode(node);
if (node.parent.kind !== 207 && node.parent.kind !== 228) {
grammarErrorOnNode(node, ts.Diagnostics.class_declarations_are_only_supported_directly_inside_a_module_or_as_a_top_level_declaration);
}
if (!node.name && !(node.flags & 256)) {
grammarErrorOnFirstToken(node, ts.Diagnostics.A_class_declaration_without_the_default_modifier_must_have_a_name);
}
checkGrammarClassDeclarationHeritageClauses(node);
checkDecorators(node);
if (node.name) {
checkTypeNameIsReserved(node.name, ts.Diagnostics.Class_name_cannot_be_0);
checkCollisionWithCapturedThisVariable(node, node.name);
checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
}
checkTypeParameters(node.typeParameters);
checkExportsOnMergedDeclarations(node);
var symbol = getSymbolOfNode(node);
var type = getDeclaredTypeOfSymbol(symbol);
var staticType = getTypeOfSymbol(symbol);
var baseTypeNode = ts.getClassExtendsHeritageClauseElement(node);
if (baseTypeNode) {
if (!ts.isSupportedExpressionWithTypeArguments(baseTypeNode)) {
error(baseTypeNode.expression, ts.Diagnostics.Only_identifiers_Slashqualified_names_with_optional_type_arguments_are_currently_supported_in_a_class_extends_clauses);
}
emitExtends = emitExtends || !ts.isInAmbientContext(node);
checkExpressionWithTypeArguments(baseTypeNode);
}
var baseTypes = getBaseTypes(type);
if (baseTypes.length) {
if (produceDiagnostics) {
var baseType = baseTypes[0];
checkTypeAssignableTo(type, baseType, node.name || node, ts.Diagnostics.Class_0_incorrectly_extends_base_class_1);
var staticBaseType = getTypeOfSymbol(baseType.symbol);
checkTypeAssignableTo(staticType, getTypeWithoutConstructors(staticBaseType), node.name || node, ts.Diagnostics.Class_static_side_0_incorrectly_extends_base_class_static_side_1);
if (baseType.symbol !== resolveEntityName(baseTypeNode.expression, 107455)) {
error(baseTypeNode, ts.Diagnostics.Type_name_0_in_extends_clause_does_not_reference_constructor_function_for_0, typeToString(baseType));
}
checkKindsOfPropertyMemberOverrides(type, baseType);
}
}
if (baseTypes.length || (baseTypeNode && compilerOptions.separateCompilation)) {
checkExpressionOrQualifiedName(baseTypeNode.expression);
}
var implementedTypeNodes = ts.getClassImplementsHeritageClauseElements(node);
if (implementedTypeNodes) {
ts.forEach(implementedTypeNodes, function (typeRefNode) {
if (!ts.isSupportedExpressionWithTypeArguments(typeRefNode)) {
error(typeRefNode.expression, ts.Diagnostics.A_class_can_only_implement_an_identifier_Slashqualified_name_with_optional_type_arguments);
}
checkExpressionWithTypeArguments(typeRefNode);
if (produceDiagnostics) {
var t = getTypeFromTypeNode(typeRefNode);
if (t !== unknownType) {
var declaredType = (t.flags & 4096) ? t.target : t;
if (declaredType.flags & (1024 | 2048)) {
checkTypeAssignableTo(type, t, node.name || node, ts.Diagnostics.Class_0_incorrectly_implements_interface_1);
}
else {
error(typeRefNode, ts.Diagnostics.A_class_may_only_implement_another_class_or_interface);
}
}
}
});
}
ts.forEach(node.members, checkSourceElement);
if (produceDiagnostics) {
checkIndexConstraints(type);
checkTypeForDuplicateIndexSignatures(node);
}
}
function getTargetSymbol(s) {
return s.flags & 16777216 ? getSymbolLinks(s).target : s;
}
function checkKindsOfPropertyMemberOverrides(type, baseType) {
// TypeScript 1.0 spec (April 2014): 8.2.3
// A derived class inherits all members from its base class it doesn't override.
// Inheritance means that a derived class implicitly contains all non - overridden members of the base class.
// Both public and private property members are inherited, but only public property members can be overridden.
// A property member in a derived class is said to override a property member in a base class
// when the derived class property member has the same name and kind(instance or static)
// as the base class property member.
// The type of an overriding property member must be assignable(section 3.8.4)
// to the type of the overridden property member, or otherwise a compile - time error occurs.
// Base class instance member functions can be overridden by derived class instance member functions,
// but not by other kinds of members.
// Base class instance member variables and accessors can be overridden by
// derived class instance member variables and accessors, but not by other kinds of members.
var baseProperties = getPropertiesOfObjectType(baseType);
for (var _i = 0; _i < baseProperties.length; _i++) {
var baseProperty = baseProperties[_i];
var base = getTargetSymbol(baseProperty);
if (base.flags & 134217728) {
continue;
}
var derived = getTargetSymbol(getPropertyOfObjectType(type, base.name));
if (derived) {
var baseDeclarationFlags = getDeclarationFlagsFromSymbol(base);
var derivedDeclarationFlags = getDeclarationFlagsFromSymbol(derived);
if ((baseDeclarationFlags & 32) || (derivedDeclarationFlags & 32)) {
continue;
}
if ((baseDeclarationFlags & 128) !== (derivedDeclarationFlags & 128)) {
continue;
}
if ((base.flags & derived.flags & 8192) || ((base.flags & 98308) && (derived.flags & 98308))) {
continue;
}
var errorMessage = void 0;
if (base.flags & 8192) {
if (derived.flags & 98304) {
errorMessage = ts.Diagnostics.Class_0_defines_instance_member_function_1_but_extended_class_2_defines_it_as_instance_member_accessor;
}
else {
ts.Debug.assert((derived.flags & 4) !== 0);
errorMessage = ts.Diagnostics.Class_0_defines_instance_member_function_1_but_extended_class_2_defines_it_as_instance_member_property;
}
}
else if (base.flags & 4) {
ts.Debug.assert((derived.flags & 8192) !== 0);
errorMessage = ts.Diagnostics.Class_0_defines_instance_member_property_1_but_extended_class_2_defines_it_as_instance_member_function;
}
else {
ts.Debug.assert((base.flags & 98304) !== 0);
ts.Debug.assert((derived.flags & 8192) !== 0);
errorMessage = ts.Diagnostics.Class_0_defines_instance_member_accessor_1_but_extended_class_2_defines_it_as_instance_member_function;
}
error(derived.valueDeclaration.name, errorMessage, typeToString(baseType), symbolToString(base), typeToString(type));
}
}
}
function isAccessor(kind) {
return kind === 137 || kind === 138;
}
function areTypeParametersIdentical(list1, list2) {
if (!list1 && !list2) {
return true;
}
if (!list1 || !list2 || list1.length !== list2.length) {
return false;
}
for (var i = 0, len = list1.length; i < len; i++) {
var tp1 = list1[i];
var tp2 = list2[i];
if (tp1.name.text !== tp2.name.text) {
return false;
}
if (!tp1.constraint && !tp2.constraint) {
continue;
}
if (!tp1.constraint || !tp2.constraint) {
return false;
}
if (!isTypeIdenticalTo(getTypeFromTypeNode(tp1.constraint), getTypeFromTypeNode(tp2.constraint))) {
return false;
}
}
return true;
}
function checkInheritedPropertiesAreIdentical(type, typeNode) {
var baseTypes = getBaseTypes(type);
if (baseTypes.length < 2) {
return true;
}
var seen = {};
ts.forEach(resolveDeclaredMembers(type).declaredProperties, function (p) { seen[p.name] = { prop: p, containingType: type }; });
var ok = true;
for (var _i = 0; _i < baseTypes.length; _i++) {
var base = baseTypes[_i];
var properties = getPropertiesOfObjectType(base);
for (var _a = 0; _a < properties.length; _a++) {
var prop = properties[_a];
if (!ts.hasProperty(seen, prop.name)) {
seen[prop.name] = { prop: prop, containingType: base };
}
else {
var existing = seen[prop.name];
var isInheritedProperty = existing.containingType !== type;
if (isInheritedProperty && !isPropertyIdenticalTo(existing.prop, prop)) {
ok = false;
var typeName1 = typeToString(existing.containingType);
var typeName2 = typeToString(base);
var errorInfo = ts.chainDiagnosticMessages(undefined, ts.Diagnostics.Named_property_0_of_types_1_and_2_are_not_identical, symbolToString(prop), typeName1, typeName2);
errorInfo = ts.chainDiagnosticMessages(errorInfo, ts.Diagnostics.Interface_0_cannot_simultaneously_extend_types_1_and_2, typeToString(type), typeName1, typeName2);
diagnostics.add(ts.createDiagnosticForNodeFromMessageChain(typeNode, errorInfo));
}
}
}
}
return ok;
}
function checkInterfaceDeclaration(node) {
checkGrammarDeclarationNameInStrictMode(node) || checkGrammarDecorators(node) || checkGrammarModifiers(node) || checkGrammarInterfaceDeclaration(node);
checkTypeParameters(node.typeParameters);
if (produceDiagnostics) {
checkTypeNameIsReserved(node.name, ts.Diagnostics.Interface_name_cannot_be_0);
checkExportsOnMergedDeclarations(node);
var symbol = getSymbolOfNode(node);
var firstInterfaceDecl = ts.getDeclarationOfKind(symbol, 203);
if (symbol.declarations.length > 1) {
if (node !== firstInterfaceDecl && !areTypeParametersIdentical(firstInterfaceDecl.typeParameters, node.typeParameters)) {
error(node.name, ts.Diagnostics.All_declarations_of_an_interface_must_have_identical_type_parameters);
}
}
if (node === firstInterfaceDecl) {
var type = getDeclaredTypeOfSymbol(symbol);
if (checkInheritedPropertiesAreIdentical(type, node.name)) {
ts.forEach(getBaseTypes(type), function (baseType) {
checkTypeAssignableTo(type, baseType, node.name, ts.Diagnostics.Interface_0_incorrectly_extends_interface_1);
});
checkIndexConstraints(type);
}
}
}
ts.forEach(ts.getInterfaceBaseTypeNodes(node), function (heritageElement) {
if (!ts.isSupportedExpressionWithTypeArguments(heritageElement)) {
error(heritageElement.expression, ts.Diagnostics.An_interface_can_only_extend_an_identifier_Slashqualified_name_with_optional_type_arguments);
}
checkExpressionWithTypeArguments(heritageElement);
});
ts.forEach(node.members, checkSourceElement);
if (produceDiagnostics) {
checkTypeForDuplicateIndexSignatures(node);
}
}
function checkTypeAliasDeclaration(node) {
checkGrammarDecorators(node) || checkGrammarModifiers(node);
checkTypeNameIsReserved(node.name, ts.Diagnostics.Type_alias_name_cannot_be_0);
checkSourceElement(node.type);
}
function computeEnumMemberValues(node) {
var nodeLinks = getNodeLinks(node);
if (!(nodeLinks.flags & 128)) {
var enumSymbol = getSymbolOfNode(node);
var enumType = getDeclaredTypeOfSymbol(enumSymbol);
var autoValue = 0;
var ambient = ts.isInAmbientContext(node);
var enumIsConst = ts.isConst(node);
ts.forEach(node.members, function (member) {
if (member.name.kind !== 128 && isNumericLiteralName(member.name.text)) {
error(member.name, ts.Diagnostics.An_enum_member_cannot_have_a_numeric_name);
}
var initializer = member.initializer;
if (initializer) {
autoValue = getConstantValueForEnumMemberInitializer(initializer);
if (autoValue === undefined) {
if (enumIsConst) {
error(initializer, ts.Diagnostics.In_const_enum_declarations_member_initializer_must_be_constant_expression);
}
else if (!ambient) {
checkTypeAssignableTo(checkExpression(initializer), enumType, initializer, undefined);
}
}
else if (enumIsConst) {
if (isNaN(autoValue)) {
error(initializer, ts.Diagnostics.const_enum_member_initializer_was_evaluated_to_disallowed_value_NaN);
}
else if (!isFinite(autoValue)) {
error(initializer, ts.Diagnostics.const_enum_member_initializer_was_evaluated_to_a_non_finite_value);
}
}
}
else if (ambient && !enumIsConst) {
autoValue = undefined;
}
if (autoValue !== undefined) {
getNodeLinks(member).enumMemberValue = autoValue++;
}
});
nodeLinks.flags |= 128;
}
function getConstantValueForEnumMemberInitializer(initializer) {
return evalConstant(initializer);
function evalConstant(e) {
switch (e.kind) {
case 168:
var value = evalConstant(e.operand);
if (value === undefined) {
return undefined;
}
switch (e.operator) {
case 33: return value;
case 34: return -value;
case 47: return ~value;
}
return undefined;
case 170:
var left = evalConstant(e.left);
if (left === undefined) {
return undefined;
}
var right = evalConstant(e.right);
if (right === undefined) {
return undefined;
}
switch (e.operatorToken.kind) {
case 44: return left | right;
case 43: return left & right;
case 41: return left >> right;
case 42: return left >>> right;
case 40: return left << right;
case 45: return left ^ right;
case 35: return left * right;
case 36: return left / right;
case 33: return left + right;
case 34: return left - right;
case 37: return left % right;
}
return undefined;
case 7:
return +e.text;
case 162:
return evalConstant(e.expression);
case 65:
case 157:
case 156:
var member = initializer.parent;
var currentType = getTypeOfSymbol(getSymbolOfNode(member.parent));
var enumType;
var propertyName;
if (e.kind === 65) {
enumType = currentType;
propertyName = e.text;
}
else {
var expression;
if (e.kind === 157) {
if (e.argumentExpression === undefined ||
e.argumentExpression.kind !== 8) {
return undefined;
}
expression = e.expression;
propertyName = e.argumentExpression.text;
}
else {
expression = e.expression;
propertyName = e.name.text;
}
var current = expression;
while (current) {
if (current.kind === 65) {
break;
}
else if (current.kind === 156) {
current = current.expression;
}
else {
return undefined;
}
}
enumType = checkExpression(expression);
if (!(enumType.symbol && (enumType.symbol.flags & 384))) {
return undefined;
}
}
if (propertyName === undefined) {
return undefined;
}
var property = getPropertyOfObjectType(enumType, propertyName);
if (!property || !(property.flags & 8)) {
return undefined;
}
var propertyDecl = property.valueDeclaration;
if (member === propertyDecl) {
return undefined;
}
if (!isDefinedBefore(propertyDecl, member)) {
return undefined;
}
return getNodeLinks(propertyDecl).enumMemberValue;
}
}
}
}
function checkEnumDeclaration(node) {
if (!produceDiagnostics) {
return;
}
checkGrammarDeclarationNameInStrictMode(node) || checkGrammarDecorators(node) || checkGrammarModifiers(node) || checkGrammarEnumDeclaration(node);
checkTypeNameIsReserved(node.name, ts.Diagnostics.Enum_name_cannot_be_0);
checkCollisionWithCapturedThisVariable(node, node.name);
checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
checkExportsOnMergedDeclarations(node);
computeEnumMemberValues(node);
var enumIsConst = ts.isConst(node);
if (compilerOptions.separateCompilation && enumIsConst && ts.isInAmbientContext(node)) {
error(node.name, ts.Diagnostics.Ambient_const_enums_are_not_allowed_when_the_separateCompilation_flag_is_provided);
}
var enumSymbol = getSymbolOfNode(node);
var firstDeclaration = ts.getDeclarationOfKind(enumSymbol, node.kind);
if (node === firstDeclaration) {
if (enumSymbol.declarations.length > 1) {
ts.forEach(enumSymbol.declarations, function (decl) {
if (ts.isConstEnumDeclaration(decl) !== enumIsConst) {
error(decl.name, ts.Diagnostics.Enum_declarations_must_all_be_const_or_non_const);
}
});
}
var seenEnumMissingInitialInitializer = false;
ts.forEach(enumSymbol.declarations, function (declaration) {
if (declaration.kind !== 205) {
return false;
}
var enumDeclaration = declaration;
if (!enumDeclaration.members.length) {
return false;
}
var firstEnumMember = enumDeclaration.members[0];
if (!firstEnumMember.initializer) {
if (seenEnumMissingInitialInitializer) {
error(firstEnumMember.name, ts.Diagnostics.In_an_enum_with_multiple_declarations_only_one_declaration_can_omit_an_initializer_for_its_first_enum_element);
}
else {
seenEnumMissingInitialInitializer = true;
}
}
});
}
}
function getFirstNonAmbientClassOrFunctionDeclaration(symbol) {
var declarations = symbol.declarations;
for (var _i = 0; _i < declarations.length; _i++) {
var declaration = declarations[_i];
if ((declaration.kind === 202 ||
(declaration.kind === 201 && ts.nodeIsPresent(declaration.body))) &&
!ts.isInAmbientContext(declaration)) {
return declaration;
}
}
return undefined;
}
function inSameLexicalScope(node1, node2) {
var container1 = ts.getEnclosingBlockScopeContainer(node1);
var container2 = ts.getEnclosingBlockScopeContainer(node2);
if (isGlobalSourceFile(container1)) {
return isGlobalSourceFile(container2);
}
else if (isGlobalSourceFile(container2)) {
return false;
}
else {
return container1 === container2;
}
}
function checkModuleDeclaration(node) {
if (produceDiagnostics) {
if (!checkGrammarDeclarationNameInStrictMode(node) && !checkGrammarDecorators(node) && !checkGrammarModifiers(node)) {
if (!ts.isInAmbientContext(node) && node.name.kind === 8) {
grammarErrorOnNode(node.name, ts.Diagnostics.Only_ambient_modules_can_use_quoted_names);
}
}
checkCollisionWithCapturedThisVariable(node, node.name);
checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
checkExportsOnMergedDeclarations(node);
var symbol = getSymbolOfNode(node);
if (symbol.flags & 512
&& symbol.declarations.length > 1
&& !ts.isInAmbientContext(node)
&& ts.isInstantiatedModule(node, compilerOptions.preserveConstEnums || compilerOptions.separateCompilation)) {
var firstNonAmbientClassOrFunc = getFirstNonAmbientClassOrFunctionDeclaration(symbol);
if (firstNonAmbientClassOrFunc) {
if (ts.getSourceFileOfNode(node) !== ts.getSourceFileOfNode(firstNonAmbientClassOrFunc)) {
error(node.name, ts.Diagnostics.A_namespace_declaration_cannot_be_in_a_different_file_from_a_class_or_function_with_which_it_is_merged);
}
else if (node.pos < firstNonAmbientClassOrFunc.pos) {
error(node.name, ts.Diagnostics.A_namespace_declaration_cannot_be_located_prior_to_a_class_or_function_with_which_it_is_merged);
}
}
var mergedClass = ts.getDeclarationOfKind(symbol, 202);
if (mergedClass &&
inSameLexicalScope(node, mergedClass)) {
getNodeLinks(node).flags |= 2048;
}
}
if (node.name.kind === 8) {
if (!isGlobalSourceFile(node.parent)) {
error(node.name, ts.Diagnostics.Ambient_modules_cannot_be_nested_in_other_modules);
}
if (isExternalModuleNameRelative(node.name.text)) {
error(node.name, ts.Diagnostics.Ambient_module_declaration_cannot_specify_relative_module_name);
}
}
}
checkSourceElement(node.body);
}
function getFirstIdentifier(node) {
while (true) {
if (node.kind === 127) {
node = node.left;
}
else if (node.kind === 156) {
node = node.expression;
}
else {
break;
}
}
ts.Debug.assert(node.kind === 65);
return node;
}
function checkExternalImportOrExportDeclaration(node) {
var moduleName = ts.getExternalModuleName(node);
if (!ts.nodeIsMissing(moduleName) && moduleName.kind !== 8) {
error(moduleName, ts.Diagnostics.String_literal_expected);
return false;
}
var inAmbientExternalModule = node.parent.kind === 207 && node.parent.parent.name.kind === 8;
if (node.parent.kind !== 228 && !inAmbientExternalModule) {
error(moduleName, node.kind === 216 ?
ts.Diagnostics.Export_declarations_are_not_permitted_in_a_namespace :
ts.Diagnostics.Import_declarations_in_a_namespace_cannot_reference_a_module);
return false;
}
if (inAmbientExternalModule && isExternalModuleNameRelative(moduleName.text)) {
error(node, ts.Diagnostics.Import_or_export_declaration_in_an_ambient_module_declaration_cannot_reference_module_through_relative_module_name);
return false;
}
return true;
}
function checkAliasSymbol(node) {
var symbol = getSymbolOfNode(node);
var target = resolveAlias(symbol);
if (target !== unknownSymbol) {
var excludedMeanings = (symbol.flags & 107455 ? 107455 : 0) |
(symbol.flags & 793056 ? 793056 : 0) |
(symbol.flags & 1536 ? 1536 : 0);
if (target.flags & excludedMeanings) {
var message = node.kind === 218 ?
ts.Diagnostics.Export_declaration_conflicts_with_exported_declaration_of_0 :
ts.Diagnostics.Import_declaration_conflicts_with_local_declaration_of_0;
error(node, message, symbolToString(symbol));
}
}
}
function checkImportBinding(node) {
checkCollisionWithCapturedThisVariable(node, node.name);
checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
checkAliasSymbol(node);
}
function checkImportDeclaration(node) {
if (!checkGrammarImportDeclarationNameInStrictMode(node) && !checkGrammarDecorators(node) && !checkGrammarModifiers(node) && (node.flags & 499)) {
grammarErrorOnFirstToken(node, ts.Diagnostics.An_import_declaration_cannot_have_modifiers);
}
if (checkExternalImportOrExportDeclaration(node)) {
var importClause = node.importClause;
if (importClause) {
if (importClause.name) {
checkImportBinding(importClause);
}
if (importClause.namedBindings) {
if (importClause.namedBindings.kind === 212) {
checkImportBinding(importClause.namedBindings);
}
else {
ts.forEach(importClause.namedBindings.elements, checkImportBinding);
}
}
}
}
}
function checkImportEqualsDeclaration(node) {
checkGrammarDeclarationNameInStrictMode(node) || checkGrammarDecorators(node) || checkGrammarModifiers(node);
if (ts.isInternalModuleImportEqualsDeclaration(node) || checkExternalImportOrExportDeclaration(node)) {
checkImportBinding(node);
if (node.flags & 1) {
markExportAsReferenced(node);
}
if (ts.isInternalModuleImportEqualsDeclaration(node)) {
var target = resolveAlias(getSymbolOfNode(node));
if (target !== unknownSymbol) {
if (target.flags & 107455) {
var moduleName = getFirstIdentifier(node.moduleReference);
if (!(resolveEntityName(moduleName, 107455 | 1536).flags & 1536)) {
error(moduleName, ts.Diagnostics.Module_0_is_hidden_by_a_local_declaration_with_the_same_name, ts.declarationNameToString(moduleName));
}
}
if (target.flags & 793056) {
checkTypeNameIsReserved(node.name, ts.Diagnostics.Import_name_cannot_be_0);
}
}
}
else {
if (languageVersion >= 2) {
grammarErrorOnNode(node, ts.Diagnostics.Import_assignment_cannot_be_used_when_targeting_ECMAScript_6_or_higher_Consider_using_import_Asterisk_as_ns_from_mod_import_a_from_mod_or_import_d_from_mod_instead);
}
}
}
}
function checkExportDeclaration(node) {
if (!checkGrammarDecorators(node) && !checkGrammarModifiers(node) && (node.flags & 499)) {
grammarErrorOnFirstToken(node, ts.Diagnostics.An_export_declaration_cannot_have_modifiers);
}
if (!node.moduleSpecifier || checkExternalImportOrExportDeclaration(node)) {
if (node.exportClause) {
ts.forEach(node.exportClause.elements, checkExportSpecifier);
var inAmbientExternalModule = node.parent.kind === 207 && node.parent.parent.name.kind === 8;
if (node.parent.kind !== 228 && !inAmbientExternalModule) {
error(node, ts.Diagnostics.Export_declarations_are_not_permitted_in_a_namespace);
}
}
else {
var moduleSymbol = resolveExternalModuleName(node, node.moduleSpecifier);
if (moduleSymbol && moduleSymbol.exports["export="]) {
error(node.moduleSpecifier, ts.Diagnostics.Module_0_uses_export_and_cannot_be_used_with_export_Asterisk, symbolToString(moduleSymbol));
}
}
}
}
function checkExportSpecifier(node) {
checkAliasSymbol(node);
if (!node.parent.parent.moduleSpecifier) {
markExportAsReferenced(node);
}
}
function checkExportAssignment(node) {
var container = node.parent.kind === 228 ? node.parent : node.parent.parent;
if (container.kind === 206 && container.name.kind === 65) {
error(node, ts.Diagnostics.An_export_assignment_cannot_be_used_in_a_namespace);
return;
}
if (!checkGrammarDecorators(node) && !checkGrammarModifiers(node) && (node.flags & 499)) {
grammarErrorOnFirstToken(node, ts.Diagnostics.An_export_assignment_cannot_have_modifiers);
}
if (node.expression.kind === 65) {
markExportAsReferenced(node);
}
else {
checkExpressionCached(node.expression);
}
checkExternalModuleExports(container);
if (node.isExportEquals && !ts.isInAmbientContext(node)) {
if (languageVersion >= 2) {
grammarErrorOnNode(node, ts.Diagnostics.Export_assignment_cannot_be_used_when_targeting_ECMAScript_6_or_higher_Consider_using_export_default_instead);
}
else if (compilerOptions.module === 4) {
grammarErrorOnNode(node, ts.Diagnostics.Export_assignment_is_not_supported_when_module_flag_is_system);
}
}
}
function getModuleStatements(node) {
if (node.kind === 228) {
return node.statements;
}
if (node.kind === 206 && node.body.kind === 207) {
return node.body.statements;
}
return emptyArray;
}
function hasExportedMembers(moduleSymbol) {
for (var id in moduleSymbol.exports) {
if (id !== "export=") {
return true;
}
}
return false;
}
function checkExternalModuleExports(node) {
var moduleSymbol = getSymbolOfNode(node);
var links = getSymbolLinks(moduleSymbol);
if (!links.exportsChecked) {
var exportEqualsSymbol = moduleSymbol.exports["export="];
if (exportEqualsSymbol && hasExportedMembers(moduleSymbol)) {
var declaration = getDeclarationOfAliasSymbol(exportEqualsSymbol) || exportEqualsSymbol.valueDeclaration;
error(declaration, ts.Diagnostics.An_export_assignment_cannot_be_used_in_a_module_with_other_exported_elements);
}
links.exportsChecked = true;
}
}
function checkSourceElement(node) {
if (!node)
return;
switch (node.kind) {
case 129:
return checkTypeParameter(node);
case 130:
return checkParameter(node);
case 133:
case 132:
return checkPropertyDeclaration(node);
case 143:
case 144:
case 139:
case 140:
return checkSignatureDeclaration(node);
case 141:
return checkSignatureDeclaration(node);
case 135:
case 134:
return checkMethodDeclaration(node);
case 136:
return checkConstructorDeclaration(node);
case 137:
case 138:
return checkAccessorDeclaration(node);
case 142:
return checkTypeReferenceNode(node);
case 145:
return checkTypeQuery(node);
case 146:
return checkTypeLiteral(node);
case 147:
return checkArrayType(node);
case 148:
return checkTupleType(node);
case 149:
return checkUnionType(node);
case 150:
return checkSourceElement(node.type);
case 201:
return checkFunctionDeclaration(node);
case 180:
case 207:
return checkBlock(node);
case 181:
return checkVariableStatement(node);
case 183:
return checkExpressionStatement(node);
case 184:
return checkIfStatement(node);
case 185:
return checkDoStatement(node);
case 186:
return checkWhileStatement(node);
case 187:
return checkForStatement(node);
case 188:
return checkForInStatement(node);
case 189:
return checkForOfStatement(node);
case 190:
case 191:
return checkBreakOrContinueStatement(node);
case 192:
return checkReturnStatement(node);
case 193:
return checkWithStatement(node);
case 194:
return checkSwitchStatement(node);
case 195:
return checkLabeledStatement(node);
case 196:
return checkThrowStatement(node);
case 197:
return checkTryStatement(node);
case 199:
return checkVariableDeclaration(node);
case 153:
return checkBindingElement(node);
case 202:
return checkClassDeclaration(node);
case 203:
return checkInterfaceDeclaration(node);
case 204:
return checkTypeAliasDeclaration(node);
case 205:
return checkEnumDeclaration(node);
case 206:
return checkModuleDeclaration(node);
case 210:
return checkImportDeclaration(node);
case 209:
return checkImportEqualsDeclaration(node);
case 216:
return checkExportDeclaration(node);
case 215:
return checkExportAssignment(node);
case 182:
checkGrammarStatementInAmbientContext(node);
return;
case 198:
checkGrammarStatementInAmbientContext(node);
return;
case 219:
return checkMissingDeclaration(node);
}
}
function checkFunctionExpressionBodies(node) {
switch (node.kind) {
case 163:
case 164:
ts.forEach(node.parameters, checkFunctionExpressionBodies);
checkFunctionExpressionOrObjectLiteralMethodBody(node);
break;
case 135:
case 134:
ts.forEach(node.parameters, checkFunctionExpressionBodies);
if (ts.isObjectLiteralMethod(node)) {
checkFunctionExpressionOrObjectLiteralMethodBody(node);
}
break;
case 136:
case 137:
case 138:
case 201:
ts.forEach(node.parameters, checkFunctionExpressionBodies);
break;
case 193:
checkFunctionExpressionBodies(node.expression);
break;
case 130:
case 133:
case 132:
case 151:
case 152:
case 153:
case 154:
case 155:
case 225:
case 156:
case 157:
case 158:
case 159:
case 160:
case 172:
case 178:
case 161:
case 162:
case 166:
case 167:
case 165:
case 168:
case 169:
case 170:
case 171:
case 174:
case 180:
case 207:
case 181:
case 183:
case 184:
case 185:
case 186:
case 187:
case 188:
case 189:
case 190:
case 191:
case 192:
case 194:
case 208:
case 221:
case 222:
case 195:
case 196:
case 197:
case 224:
case 199:
case 200:
case 202:
case 205:
case 227:
case 215:
case 228:
ts.forEachChild(node, checkFunctionExpressionBodies);
break;
}
}
function checkSourceFile(node) {
var start = new Date().getTime();
checkSourceFileWorker(node);
ts.checkTime += new Date().getTime() - start;
}
function checkSourceFileWorker(node) {
var links = getNodeLinks(node);
if (!(links.flags & 1)) {
checkGrammarSourceFile(node);
emitExtends = false;
emitDecorate = false;
emitParam = false;
potentialThisCollisions.length = 0;
ts.forEach(node.statements, checkSourceElement);
checkFunctionExpressionBodies(node);
if (ts.isExternalModule(node)) {
checkExternalModuleExports(node);
}
if (potentialThisCollisions.length) {
ts.forEach(potentialThisCollisions, checkIfThisIsCapturedInEnclosingScope);
potentialThisCollisions.length = 0;
}
if (emitExtends) {
links.flags |= 8;
}
if (emitDecorate) {
links.flags |= 512;
}
if (emitParam) {
links.flags |= 1024;
}
links.flags |= 1;
}
}
function getDiagnostics(sourceFile) {
throwIfNonDiagnosticsProducing();
if (sourceFile) {
checkSourceFile(sourceFile);
return diagnostics.getDiagnostics(sourceFile.fileName);
}
ts.forEach(host.getSourceFiles(), checkSourceFile);
return diagnostics.getDiagnostics();
}
function getGlobalDiagnostics() {
throwIfNonDiagnosticsProducing();
return diagnostics.getGlobalDiagnostics();
}
function throwIfNonDiagnosticsProducing() {
if (!produceDiagnostics) {
throw new Error("Trying to get diagnostics from a type checker that does not produce them.");
}
}
function isInsideWithStatementBody(node) {
if (node) {
while (node.parent) {
if (node.parent.kind === 193 && node.parent.statement === node) {
return true;
}
node = node.parent;
}
}
return false;
}
function getSymbolsInScope(location, meaning) {
var symbols = {};
var memberFlags = 0;
if (isInsideWithStatementBody(location)) {
return [];
}
populateSymbols();
return symbolsToArray(symbols);
function populateSymbols() {
while (location) {
if (location.locals && !isGlobalSourceFile(location)) {
copySymbols(location.locals, meaning);
}
switch (location.kind) {
case 228:
if (!ts.isExternalModule(location)) {
break;
}
case 206:
copySymbols(getSymbolOfNode(location).exports, meaning & 8914931);
break;
case 205:
copySymbols(getSymbolOfNode(location).exports, meaning & 8);
break;
case 202:
case 203:
if (!(memberFlags & 128)) {
copySymbols(getSymbolOfNode(location).members, meaning & 793056);
}
break;
case 163:
if (location.name) {
copySymbol(location.symbol, meaning);
}
break;
}
memberFlags = location.flags;
location = location.parent;
}
copySymbols(globals, meaning);
}
function copySymbol(symbol, meaning) {
if (symbol.flags & meaning) {
var id = symbol.name;
if (!isReservedMemberName(id) && !ts.hasProperty(symbols, id)) {
symbols[id] = symbol;
}
}
}
function copySymbols(source, meaning) {
if (meaning) {
for (var id in source) {
if (ts.hasProperty(source, id)) {
copySymbol(source[id], meaning);
}
}
}
}
if (isInsideWithStatementBody(location)) {
return [];
}
while (location) {
if (location.locals && !isGlobalSourceFile(location)) {
copySymbols(location.locals, meaning);
}
switch (location.kind) {
case 228:
if (!ts.isExternalModule(location))
break;
case 206:
copySymbols(getSymbolOfNode(location).exports, meaning & 8914931);
break;
case 205:
copySymbols(getSymbolOfNode(location).exports, meaning & 8);
break;
case 202:
case 203:
if (!(memberFlags & 128)) {
copySymbols(getSymbolOfNode(location).members, meaning & 793056);
}
break;
case 163:
if (location.name) {
copySymbol(location.symbol, meaning);
}
break;
}
memberFlags = location.flags;
location = location.parent;
}
copySymbols(globals, meaning);
return symbolsToArray(symbols);
}
function isTypeDeclarationName(name) {
return name.kind == 65 &&
isTypeDeclaration(name.parent) &&
name.parent.name === name;
}
function isTypeDeclaration(node) {
switch (node.kind) {
case 129:
case 202:
case 203:
case 204:
case 205:
return true;
}
}
function isTypeReferenceIdentifier(entityName) {
var node = entityName;
while (node.parent && node.parent.kind === 127) {
node = node.parent;
}
return node.parent && node.parent.kind === 142;
}
function isHeritageClauseElementIdentifier(entityName) {
var node = entityName;
while (node.parent && node.parent.kind === 156) {
node = node.parent;
}
return node.parent && node.parent.kind === 177;
}
function isTypeNode(node) {
if (142 <= node.kind && node.kind <= 150) {
return true;
}
switch (node.kind) {
case 112:
case 120:
case 122:
case 113:
case 123:
return true;
case 99:
return node.parent.kind !== 167;
case 8:
return node.parent.kind === 130;
case 177:
return true;
case 65:
if (node.parent.kind === 127 && node.parent.right === node) {
node = node.parent;
}
else if (node.parent.kind === 156 && node.parent.name === node) {
node = node.parent;
}
case 127:
case 156:
ts.Debug.assert(node.kind === 65 || node.kind === 127 || node.kind === 156, "'node' was expected to be a qualified name, identifier or property access in 'isTypeNode'.");
var parent_5 = node.parent;
if (parent_5.kind === 145) {
return false;
}
if (142 <= parent_5.kind && parent_5.kind <= 150) {
return true;
}
switch (parent_5.kind) {
case 177:
return true;
case 129:
return node === parent_5.constraint;
case 133:
case 132:
case 130:
case 199:
return node === parent_5.type;
case 201:
case 163:
case 164:
case 136:
case 135:
case 134:
case 137:
case 138:
return node === parent_5.type;
case 139:
case 140:
case 141:
return node === parent_5.type;
case 161:
return node === parent_5.type;
case 158:
case 159:
return parent_5.typeArguments && ts.indexOf(parent_5.typeArguments, node) >= 0;
case 160:
return false;
}
}
return false;
}
function getLeftSideOfImportEqualsOrExportAssignment(nodeOnRightSide) {
while (nodeOnRightSide.parent.kind === 127) {
nodeOnRightSide = nodeOnRightSide.parent;
}
if (nodeOnRightSide.parent.kind === 209) {
return nodeOnRightSide.parent.moduleReference === nodeOnRightSide && nodeOnRightSide.parent;
}
if (nodeOnRightSide.parent.kind === 215) {
return nodeOnRightSide.parent.expression === nodeOnRightSide && nodeOnRightSide.parent;
}
return undefined;
}
function isInRightSideOfImportOrExportAssignment(node) {
return getLeftSideOfImportEqualsOrExportAssignment(node) !== undefined;
}
function getSymbolOfEntityNameOrPropertyAccessExpression(entityName) {
if (ts.isDeclarationName(entityName)) {
return getSymbolOfNode(entityName.parent);
}
if (entityName.parent.kind === 215) {
return resolveEntityName(entityName, 107455 | 793056 | 1536 | 8388608);
}
if (entityName.kind !== 156) {
if (isInRightSideOfImportOrExportAssignment(entityName)) {
return getSymbolOfPartOfRightHandSideOfImportEquals(entityName);
}
}
if (ts.isRightSideOfQualifiedNameOrPropertyAccess(entityName)) {
entityName = entityName.parent;
}
if (isHeritageClauseElementIdentifier(entityName)) {
var meaning = entityName.parent.kind === 177 ? 793056 : 1536;
meaning |= 8388608;
return resolveEntityName(entityName, meaning);
}
else if (ts.isExpression(entityName)) {
if (ts.nodeIsMissing(entityName)) {
return undefined;
}
if (entityName.kind === 65) {
var meaning = 107455 | 8388608;
return resolveEntityName(entityName, meaning);
}
else if (entityName.kind === 156) {
var symbol = getNodeLinks(entityName).resolvedSymbol;
if (!symbol) {
checkPropertyAccessExpression(entityName);
}
return getNodeLinks(entityName).resolvedSymbol;
}
else if (entityName.kind === 127) {
var symbol = getNodeLinks(entityName).resolvedSymbol;
if (!symbol) {
checkQualifiedName(entityName);
}
return getNodeLinks(entityName).resolvedSymbol;
}
}
else if (isTypeReferenceIdentifier(entityName)) {
var meaning = entityName.parent.kind === 142 ? 793056 : 1536;
meaning |= 8388608;
return resolveEntityName(entityName, meaning);
}
return undefined;
}
function getSymbolInfo(node) {
if (isInsideWithStatementBody(node)) {
return undefined;
}
if (ts.isDeclarationName(node)) {
return getSymbolOfNode(node.parent);
}
if (node.kind === 65 && isInRightSideOfImportOrExportAssignment(node)) {
return node.parent.kind === 215
? getSymbolOfEntityNameOrPropertyAccessExpression(node)
: getSymbolOfPartOfRightHandSideOfImportEquals(node);
}
switch (node.kind) {
case 65:
case 156:
case 127:
return getSymbolOfEntityNameOrPropertyAccessExpression(node);
case 93:
case 91:
var type = checkExpression(node);
return type.symbol;
case 114:
var constructorDeclaration = node.parent;
if (constructorDeclaration && constructorDeclaration.kind === 136) {
return constructorDeclaration.parent.symbol;
}
return undefined;
case 8:
var moduleName;
if ((ts.isExternalModuleImportEqualsDeclaration(node.parent.parent) &&
ts.getExternalModuleImportEqualsDeclarationExpression(node.parent.parent) === node) ||
((node.parent.kind === 210 || node.parent.kind === 216) &&
node.parent.moduleSpecifier === node)) {
return resolveExternalModuleName(node, node);
}
case 7:
if (node.parent.kind == 157 && node.parent.argumentExpression === node) {
var objectType = checkExpression(node.parent.expression);
if (objectType === unknownType)
return undefined;
var apparentType = getApparentType(objectType);
if (apparentType === unknownType)
return undefined;
return getPropertyOfType(apparentType, node.text);
}
break;
}
return undefined;
}
function getShorthandAssignmentValueSymbol(location) {
if (location && location.kind === 226) {
return resolveEntityName(location.name, 107455);
}
return undefined;
}
function getTypeOfNode(node) {
if (isInsideWithStatementBody(node)) {
return unknownType;
}
if (isTypeNode(node)) {
return getTypeFromTypeNode(node);
}
if (ts.isExpression(node)) {
return getTypeOfExpression(node);
}
if (isTypeDeclaration(node)) {
var symbol = getSymbolOfNode(node);
return getDeclaredTypeOfSymbol(symbol);
}
if (isTypeDeclarationName(node)) {
var symbol = getSymbolInfo(node);
return symbol && getDeclaredTypeOfSymbol(symbol);
}
if (ts.isDeclaration(node)) {
var symbol = getSymbolOfNode(node);
return getTypeOfSymbol(symbol);
}
if (ts.isDeclarationName(node)) {
var symbol = getSymbolInfo(node);
return symbol && getTypeOfSymbol(symbol);
}
if (isInRightSideOfImportOrExportAssignment(node)) {
var symbol = getSymbolInfo(node);
var declaredType = symbol && getDeclaredTypeOfSymbol(symbol);
return declaredType !== unknownType ? declaredType : getTypeOfSymbol(symbol);
}
return unknownType;
}
function getTypeOfExpression(expr) {
if (ts.isRightSideOfQualifiedNameOrPropertyAccess(expr)) {
expr = expr.parent;
}
return checkExpression(expr);
}
function getAugmentedPropertiesOfType(type) {
type = getApparentType(type);
var propsByName = createSymbolTable(getPropertiesOfType(type));
if (getSignaturesOfType(type, 0).length || getSignaturesOfType(type, 1).length) {
ts.forEach(getPropertiesOfType(globalFunctionType), function (p) {
if (!ts.hasProperty(propsByName, p.name)) {
propsByName[p.name] = p;
}
});
}
return getNamedMembers(propsByName);
}
function getRootSymbols(symbol) {
if (symbol.flags & 268435456) {
var symbols = [];
var name_10 = symbol.name;
ts.forEach(getSymbolLinks(symbol).unionType.types, function (t) {
symbols.push(getPropertyOfType(t, name_10));
});
return symbols;
}
else if (symbol.flags & 67108864) {
var target = getSymbolLinks(symbol).target;
if (target) {
return [target];
}
}
return [symbol];
}
function isExternalModuleSymbol(symbol) {
return symbol.flags & 512 && symbol.declarations.length === 1 && symbol.declarations[0].kind === 228;
}
function getAliasNameSubstitution(symbol, getGeneratedNameForNode) {
if (languageVersion >= 2) {
return undefined;
}
var node = getDeclarationOfAliasSymbol(symbol);
if (node) {
if (node.kind === 211) {
var defaultKeyword;
if (languageVersion === 0) {
defaultKeyword = "[\"default\"]";
}
else {
defaultKeyword = ".default";
}
return getGeneratedNameForNode(node.parent) + defaultKeyword;
}
if (node.kind === 214) {
var moduleName = getGeneratedNameForNode(node.parent.parent.parent);
var propertyName = node.propertyName || node.name;
return moduleName + "." + ts.unescapeIdentifier(propertyName.text);
}
}
}
function getExportNameSubstitution(symbol, location, getGeneratedNameForNode) {
if (isExternalModuleSymbol(symbol.parent)) {
if (languageVersion >= 2 || compilerOptions.module === 4) {
return undefined;
}
return "exports." + ts.unescapeIdentifier(symbol.name);
}
var node = location;
var containerSymbol = getParentOfSymbol(symbol);
while (node) {
if ((node.kind === 206 || node.kind === 205) && getSymbolOfNode(node) === containerSymbol) {
return getGeneratedNameForNode(node) + "." + ts.unescapeIdentifier(symbol.name);
}
node = node.parent;
}
}
function getExpressionNameSubstitution(node, getGeneratedNameForNode) {
var symbol = getNodeLinks(node).resolvedSymbol || (ts.isDeclarationName(node) ? getSymbolOfNode(node.parent) : undefined);
if (symbol) {
if (symbol.parent) {
return getExportNameSubstitution(symbol, node.parent, getGeneratedNameForNode);
}
var exportSymbol = getExportSymbolOfValueSymbolIfExported(symbol);
if (symbol !== exportSymbol && !(exportSymbol.flags & 944)) {
return getExportNameSubstitution(exportSymbol, node.parent, getGeneratedNameForNode);
}
if (symbol.flags & 8388608) {
return getAliasNameSubstitution(symbol, getGeneratedNameForNode);
}
}
}
function isValueAliasDeclaration(node) {
switch (node.kind) {
case 209:
case 211:
case 212:
case 214:
case 218:
return isAliasResolvedToValue(getSymbolOfNode(node));
case 216:
var exportClause = node.exportClause;
return exportClause && ts.forEach(exportClause.elements, isValueAliasDeclaration);
case 215:
return node.expression && node.expression.kind === 65 ? isAliasResolvedToValue(getSymbolOfNode(node)) : true;
}
return false;
}
function isTopLevelValueImportEqualsWithEntityName(node) {
if (node.parent.kind !== 228 || !ts.isInternalModuleImportEqualsDeclaration(node)) {
return false;
}
var isValue = isAliasResolvedToValue(getSymbolOfNode(node));
return isValue && node.moduleReference && !ts.nodeIsMissing(node.moduleReference);
}
function isAliasResolvedToValue(symbol) {
var target = resolveAlias(symbol);
if (target === unknownSymbol && compilerOptions.separateCompilation) {
return true;
}
return target !== unknownSymbol && target && target.flags & 107455 && !isConstEnumOrConstEnumOnlyModule(target);
}
function isConstEnumOrConstEnumOnlyModule(s) {
return isConstEnumSymbol(s) || s.constEnumOnlyModule;
}
function isReferencedAliasDeclaration(node, checkChildren) {
if (ts.isAliasSymbolDeclaration(node)) {
var symbol = getSymbolOfNode(node);
if (getSymbolLinks(symbol).referenced) {
return true;
}
}
if (checkChildren) {
return ts.forEachChild(node, function (node) { return isReferencedAliasDeclaration(node, checkChildren); });
}
return false;
}
function isImplementationOfOverload(node) {
if (ts.nodeIsPresent(node.body)) {
var symbol = getSymbolOfNode(node);
var signaturesOfSymbol = getSignaturesOfSymbol(symbol);
return signaturesOfSymbol.length > 1 ||
(signaturesOfSymbol.length === 1 && signaturesOfSymbol[0].declaration !== node);
}
return false;
}
function getNodeCheckFlags(node) {
return getNodeLinks(node).flags;
}
function getEnumMemberValue(node) {
computeEnumMemberValues(node.parent);
return getNodeLinks(node).enumMemberValue;
}
function getConstantValue(node) {
if (node.kind === 227) {
return getEnumMemberValue(node);
}
var symbol = getNodeLinks(node).resolvedSymbol;
if (symbol && (symbol.flags & 8)) {
if (ts.isConstEnumDeclaration(symbol.valueDeclaration.parent)) {
return getEnumMemberValue(symbol.valueDeclaration);
}
}
return undefined;
}
function serializeEntityName(node, getGeneratedNameForNode, fallbackPath) {
if (node.kind === 65) {
var substitution = getExpressionNameSubstitution(node, getGeneratedNameForNode);
var text = substitution || node.text;
if (fallbackPath) {
fallbackPath.push(text);
}
else {
return text;
}
}
else {
var left = serializeEntityName(node.left, getGeneratedNameForNode, fallbackPath);
var right = serializeEntityName(node.right, getGeneratedNameForNode, fallbackPath);
if (!fallbackPath) {
return left + "." + right;
}
}
}
function serializeTypeReferenceNode(node, getGeneratedNameForNode) {
var type = getTypeFromTypeNode(node);
if (type.flags & 16) {
return "void 0";
}
else if (type.flags & 8) {
return "Boolean";
}
else if (type.flags & 132) {
return "Number";
}
else if (type.flags & 258) {
return "String";
}
else if (type.flags & 8192) {
return "Array";
}
else if (type.flags & 1048576) {
return "Symbol";
}
else if (type === unknownType) {
var fallbackPath = [];
serializeEntityName(node.typeName, getGeneratedNameForNode, fallbackPath);
return fallbackPath;
}
else if (type.symbol && type.symbol.valueDeclaration) {
return serializeEntityName(node.typeName, getGeneratedNameForNode);
}
else if (typeHasCallOrConstructSignatures(type)) {
return "Function";
}
return "Object";
}
function serializeTypeNode(node, getGeneratedNameForNode) {
if (node) {
switch (node.kind) {
case 99:
return "void 0";
case 150:
return serializeTypeNode(node.type, getGeneratedNameForNode);
case 143:
case 144:
return "Function";
case 147:
case 148:
return "Array";
case 113:
return "Boolean";
case 122:
case 8:
return "String";
case 120:
return "Number";
case 142:
return serializeTypeReferenceNode(node, getGeneratedNameForNode);
case 145:
case 146:
case 149:
case 112:
break;
default:
ts.Debug.fail("Cannot serialize unexpected type node.");
break;
}
}
return "Object";
}
function serializeTypeOfNode(node, getGeneratedNameForNode) {
switch (node.kind) {
case 202: return "Function";
case 133: return serializeTypeNode(node.type, getGeneratedNameForNode);
case 130: return serializeTypeNode(node.type, getGeneratedNameForNode);
case 137: return serializeTypeNode(node.type, getGeneratedNameForNode);
case 138: return serializeTypeNode(getSetAccessorTypeAnnotationNode(node), getGeneratedNameForNode);
}
if (ts.isFunctionLike(node)) {
return "Function";
}
return "void 0";
}
function serializeParameterTypesOfNode(node, getGeneratedNameForNode) {
if (node) {
var valueDeclaration;
if (node.kind === 202) {
valueDeclaration = ts.getFirstConstructorWithBody(node);
}
else if (ts.isFunctionLike(node) && ts.nodeIsPresent(node.body)) {
valueDeclaration = node;
}
if (valueDeclaration) {
var result;
var parameters = valueDeclaration.parameters;
var parameterCount = parameters.length;
if (parameterCount > 0) {
result = new Array(parameterCount);
for (var i = 0; i < parameterCount; i++) {
if (parameters[i].dotDotDotToken) {
var parameterType = parameters[i].type;
if (parameterType.kind === 147) {
parameterType = parameterType.elementType;
}
else if (parameterType.kind === 142 && parameterType.typeArguments && parameterType.typeArguments.length === 1) {
parameterType = parameterType.typeArguments[0];
}
else {
parameterType = undefined;
}
result[i] = serializeTypeNode(parameterType, getGeneratedNameForNode);
}
else {
result[i] = serializeTypeOfNode(parameters[i], getGeneratedNameForNode);
}
}
return result;
}
}
}
return emptyArray;
}
function serializeReturnTypeOfNode(node, getGeneratedNameForNode) {
if (node && ts.isFunctionLike(node)) {
return serializeTypeNode(node.type, getGeneratedNameForNode);
}
return "void 0";
}
function writeTypeOfDeclaration(declaration, enclosingDeclaration, flags, writer) {
var symbol = getSymbolOfNode(declaration);
var type = symbol && !(symbol.flags & (2048 | 131072))
? getTypeOfSymbol(symbol)
: unknownType;
getSymbolDisplayBuilder().buildTypeDisplay(type, writer, enclosingDeclaration, flags);
}
function writeReturnTypeOfSignatureDeclaration(signatureDeclaration, enclosingDeclaration, flags, writer) {
var signature = getSignatureFromDeclaration(signatureDeclaration);
getSymbolDisplayBuilder().buildTypeDisplay(getReturnTypeOfSignature(signature), writer, enclosingDeclaration, flags);
}
function writeTypeOfExpression(expr, enclosingDeclaration, flags, writer) {
var type = getTypeOfExpression(expr);
getSymbolDisplayBuilder().buildTypeDisplay(type, writer, enclosingDeclaration, flags);
}
function hasGlobalName(name) {
return ts.hasProperty(globals, name);
}
function resolvesToSomeValue(location, name) {
ts.Debug.assert(!ts.nodeIsSynthesized(location), "resolvesToSomeValue called with a synthesized location");
return !!resolveName(location, name, 107455, undefined, undefined);
}
function getReferencedValueDeclaration(reference) {
ts.Debug.assert(!ts.nodeIsSynthesized(reference));
var symbol = getNodeLinks(reference).resolvedSymbol ||
resolveName(reference, reference.text, 107455 | 8388608, undefined, undefined);
return symbol && getExportSymbolOfValueSymbolIfExported(symbol).valueDeclaration;
}
function getBlockScopedVariableId(n) {
ts.Debug.assert(!ts.nodeIsSynthesized(n));
var isVariableDeclarationOrBindingElement = n.parent.kind === 153 || (n.parent.kind === 199 && n.parent.name === n);
var symbol = (isVariableDeclarationOrBindingElement ? getSymbolOfNode(n.parent) : undefined) ||
getNodeLinks(n).resolvedSymbol ||
resolveName(n, n.text, 107455 | 8388608, undefined, undefined);
var isLetOrConst = symbol &&
(symbol.flags & 2) &&
symbol.valueDeclaration.parent.kind !== 224;
if (isLetOrConst) {
getSymbolLinks(symbol);
return symbol.id;
}
return undefined;
}
function instantiateSingleCallFunctionType(functionType, typeArguments) {
if (functionType === unknownType) {
return unknownType;
}
var signature = getSingleCallSignature(functionType);
if (!signature) {
return unknownType;
}
var instantiatedSignature = getSignatureInstantiation(signature, typeArguments);
return getOrCreateTypeFromSignature(instantiatedSignature);
}
function createResolver() {
return {
getExpressionNameSubstitution: getExpressionNameSubstitution,
isValueAliasDeclaration: isValueAliasDeclaration,
hasGlobalName: hasGlobalName,
isReferencedAliasDeclaration: isReferencedAliasDeclaration,
getNodeCheckFlags: getNodeCheckFlags,
isTopLevelValueImportEqualsWithEntityName: isTopLevelValueImportEqualsWithEntityName,
isDeclarationVisible: isDeclarationVisible,
isImplementationOfOverload: isImplementationOfOverload,
writeTypeOfDeclaration: writeTypeOfDeclaration,
writeReturnTypeOfSignatureDeclaration: writeReturnTypeOfSignatureDeclaration,
writeTypeOfExpression: writeTypeOfExpression,
isSymbolAccessible: isSymbolAccessible,
isEntityNameVisible: isEntityNameVisible,
getConstantValue: getConstantValue,
resolvesToSomeValue: resolvesToSomeValue,
collectLinkedAliases: collectLinkedAliases,
getBlockScopedVariableId: getBlockScopedVariableId,
getReferencedValueDeclaration: getReferencedValueDeclaration,
serializeTypeOfNode: serializeTypeOfNode,
serializeParameterTypesOfNode: serializeParameterTypesOfNode,
serializeReturnTypeOfNode: serializeReturnTypeOfNode
};
}
function initializeTypeChecker() {
ts.forEach(host.getSourceFiles(), function (file) {
ts.bindSourceFile(file);
});
ts.forEach(host.getSourceFiles(), function (file) {
if (!ts.isExternalModule(file)) {
mergeSymbolTable(globals, file.locals);
}
});
getSymbolLinks(undefinedSymbol).type = undefinedType;
getSymbolLinks(argumentsSymbol).type = getGlobalType("IArguments");
getSymbolLinks(unknownSymbol).type = unknownType;
globals[undefinedSymbol.name] = undefinedSymbol;
globalArraySymbol = getGlobalTypeSymbol("Array");
globalArrayType = getTypeOfGlobalSymbol(globalArraySymbol, 1);
globalObjectType = getGlobalType("Object");
globalFunctionType = getGlobalType("Function");
globalStringType = getGlobalType("String");
globalNumberType = getGlobalType("Number");
globalBooleanType = getGlobalType("Boolean");
globalRegExpType = getGlobalType("RegExp");
getGlobalClassDecoratorType = ts.memoize(function () { return getGlobalType("ClassDecorator"); });
getGlobalPropertyDecoratorType = ts.memoize(function () { return getGlobalType("PropertyDecorator"); });
getGlobalMethodDecoratorType = ts.memoize(function () { return getGlobalType("MethodDecorator"); });
getGlobalParameterDecoratorType = ts.memoize(function () { return getGlobalType("ParameterDecorator"); });
if (languageVersion >= 2) {
globalTemplateStringsArrayType = getGlobalType("TemplateStringsArray");
globalESSymbolType = getGlobalType("Symbol");
globalESSymbolConstructorSymbol = getGlobalValueSymbol("Symbol");
globalIterableType = getGlobalType("Iterable", 1);
}
else {
globalTemplateStringsArrayType = unknownType;
globalESSymbolType = createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, undefined, undefined);
globalESSymbolConstructorSymbol = undefined;
}
anyArrayType = createArrayType(anyType);
}
function isReservedWordInStrictMode(node) {
return (node.parserContextFlags & 1) &&
(102 <= node.originalKeywordKind && node.originalKeywordKind <= 110);
}
function reportStrictModeGrammarErrorInClassDeclaration(identifier, message, arg0, arg1, arg2) {
if (ts.getAncestor(identifier, 202) || ts.getAncestor(identifier, 175)) {
return grammarErrorOnNode(identifier, message, arg0);
}
return false;
}
function checkGrammarImportDeclarationNameInStrictMode(node) {
if (node.importClause) {
var impotClause = node.importClause;
if (impotClause.namedBindings) {
var nameBindings = impotClause.namedBindings;
if (nameBindings.kind === 212) {
var name_11 = nameBindings.name;
if (isReservedWordInStrictMode(name_11)) {
var nameText = ts.declarationNameToString(name_11);
return grammarErrorOnNode(name_11, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode, nameText);
}
}
else if (nameBindings.kind === 213) {
var reportError = false;
for (var _i = 0, _a = nameBindings.elements; _i < _a.length; _i++) {
var element = _a[_i];
var name_12 = element.name;
if (isReservedWordInStrictMode(name_12)) {
var nameText = ts.declarationNameToString(name_12);
reportError = reportError || grammarErrorOnNode(name_12, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode, nameText);
}
}
return reportError;
}
}
}
return false;
}
function checkGrammarDeclarationNameInStrictMode(node) {
var name = node.name;
if (name && name.kind === 65 && isReservedWordInStrictMode(name)) {
var nameText = ts.declarationNameToString(name);
switch (node.kind) {
case 130:
case 199:
case 201:
case 129:
case 153:
case 203:
case 204:
case 205:
return checkGrammarIdentifierInStrictMode(name);
case 202:
return grammarErrorOnNode(name, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_strict_mode, nameText);
case 206:
return grammarErrorOnNode(name, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode, nameText);
case 209:
return grammarErrorOnNode(name, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode, nameText);
}
}
return false;
}
function checkGrammarTypeReferenceInStrictMode(typeName) {
if (typeName.kind === 65) {
checkGrammarTypeNameInStrictMode(typeName);
}
else if (typeName.kind === 127) {
checkGrammarTypeNameInStrictMode(typeName.right);
checkGrammarTypeReferenceInStrictMode(typeName.left);
}
}
function checkGrammarExpressionWithTypeArgumentsInStrictMode(expression) {
if (expression && expression.kind === 65) {
return checkGrammarIdentifierInStrictMode(expression);
}
else if (expression && expression.kind === 156) {
checkGrammarExpressionWithTypeArgumentsInStrictMode(expression.expression);
}
}
function checkGrammarIdentifierInStrictMode(node, nameText) {
if (node && node.kind === 65 && isReservedWordInStrictMode(node)) {
if (!nameText) {
nameText = ts.declarationNameToString(node);
}
var errorReport = reportStrictModeGrammarErrorInClassDeclaration(node, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_strict_mode, nameText) ||
grammarErrorOnNode(node, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode, nameText);
return errorReport;
}
return false;
}
function checkGrammarTypeNameInStrictMode(node) {
if (node && node.kind === 65 && isReservedWordInStrictMode(node)) {
var nameText = ts.declarationNameToString(node);
var errorReport = reportStrictModeGrammarErrorInClassDeclaration(node, ts.Diagnostics.Type_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_strict_mode, nameText) ||
grammarErrorOnNode(node, ts.Diagnostics.Type_expected_0_is_a_reserved_word_in_strict_mode, nameText);
return errorReport;
}
return false;
}
function checkGrammarDecorators(node) {
if (!node.decorators) {
return false;
}
if (!ts.nodeCanBeDecorated(node)) {
return grammarErrorOnFirstToken(node, ts.Diagnostics.Decorators_are_not_valid_here);
}
else if (languageVersion < 1) {
return grammarErrorOnFirstToken(node, ts.Diagnostics.Decorators_are_only_available_when_targeting_ECMAScript_5_and_higher);
}
else if (node.kind === 137 || node.kind === 138) {
var accessors = ts.getAllAccessorDeclarations(node.parent.members, node);
if (accessors.firstAccessor.decorators && node === accessors.secondAccessor) {
return grammarErrorOnFirstToken(node, ts.Diagnostics.Decorators_cannot_be_applied_to_multiple_get_Slashset_accessors_of_the_same_name);
}
}
return false;
}
function checkGrammarModifiers(node) {
switch (node.kind) {
case 137:
case 138:
case 136:
case 133:
case 132:
case 135:
case 134:
case 141:
case 202:
case 203:
case 206:
case 205:
case 181:
case 201:
case 204:
case 210:
case 209:
case 216:
case 215:
case 130:
break;
default:
return false;
}
if (!node.modifiers) {
return;
}
var lastStatic, lastPrivate, lastProtected, lastDeclare;
var flags = 0;
for (var _i = 0, _a = node.modifiers; _i < _a.length; _i++) {
var modifier = _a[_i];
switch (modifier.kind) {
case 108:
case 107:
case 106:
var text = void 0;
if (modifier.kind === 108) {
text = "public";
}
else if (modifier.kind === 107) {
text = "protected";
lastProtected = modifier;
}
else {
text = "private";
lastPrivate = modifier;
}
if (flags & 112) {
return grammarErrorOnNode(modifier, ts.Diagnostics.Accessibility_modifier_already_seen);
}
else if (flags & 128) {
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_must_precede_1_modifier, text, "static");
}
else if (node.parent.kind === 207 || node.parent.kind === 228) {
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_module_element, text);
}
flags |= ts.modifierToFlag(modifier.kind);
break;
case 109:
if (flags & 128) {
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_already_seen, "static");
}
else if (node.parent.kind === 207 || node.parent.kind === 228) {
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_module_element, "static");
}
else if (node.kind === 130) {
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_parameter, "static");
}
flags |= 128;
lastStatic = modifier;
break;
case 78:
if (flags & 1) {
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_already_seen, "export");
}
else if (flags & 2) {
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_must_precede_1_modifier, "export", "declare");
}
else if (node.parent.kind === 202) {
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_class_element, "export");
}
else if (node.kind === 130) {
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_parameter, "export");
}
flags |= 1;
break;
case 115:
if (flags & 2) {
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_already_seen, "declare");
}
else if (node.parent.kind === 202) {
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_class_element, "declare");
}
else if (node.kind === 130) {
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_parameter, "declare");
}
else if (ts.isInAmbientContext(node.parent) && node.parent.kind === 207) {
return grammarErrorOnNode(modifier, ts.Diagnostics.A_declare_modifier_cannot_be_used_in_an_already_ambient_context);
}
flags |= 2;
lastDeclare = modifier;
break;
}
}
if (node.kind === 136) {
if (flags & 128) {
return grammarErrorOnNode(lastStatic, ts.Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "static");
}
else if (flags & 64) {
return grammarErrorOnNode(lastProtected, ts.Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "protected");
}
else if (flags & 32) {
return grammarErrorOnNode(lastPrivate, ts.Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "private");
}
}
else if ((node.kind === 210 || node.kind === 209) && flags & 2) {
return grammarErrorOnNode(lastDeclare, ts.Diagnostics.A_declare_modifier_cannot_be_used_with_an_import_declaration, "declare");
}
else if (node.kind === 203 && flags & 2) {
return grammarErrorOnNode(lastDeclare, ts.Diagnostics.A_declare_modifier_cannot_be_used_with_an_interface_declaration, "declare");
}
else if (node.kind === 130 && (flags & 112) && ts.isBindingPattern(node.name)) {
return grammarErrorOnNode(node, ts.Diagnostics.A_parameter_property_may_not_be_a_binding_pattern);
}
}
function checkGrammarForDisallowedTrailingComma(list) {
if (list && list.hasTrailingComma) {
var start = list.end - ",".length;
var end = list.end;
var sourceFile = ts.getSourceFileOfNode(list[0]);
return grammarErrorAtPos(sourceFile, start, end - start, ts.Diagnostics.Trailing_comma_not_allowed);
}
}
function checkGrammarTypeParameterList(node, typeParameters, file) {
if (checkGrammarForDisallowedTrailingComma(typeParameters)) {
return true;
}
if (typeParameters && typeParameters.length === 0) {
var start = typeParameters.pos - "<".length;
var end = ts.skipTrivia(file.text, typeParameters.end) + ">".length;
return grammarErrorAtPos(file, start, end - start, ts.Diagnostics.Type_parameter_list_cannot_be_empty);
}
}
function checkGrammarParameterList(parameters) {
if (checkGrammarForDisallowedTrailingComma(parameters)) {
return true;
}
var seenOptionalParameter = false;
var parameterCount = parameters.length;
for (var i = 0; i < parameterCount; i++) {
var parameter = parameters[i];
if (parameter.dotDotDotToken) {
if (i !== (parameterCount - 1)) {
return grammarErrorOnNode(parameter.dotDotDotToken, ts.Diagnostics.A_rest_parameter_must_be_last_in_a_parameter_list);
}
if (ts.isBindingPattern(parameter.name)) {
return grammarErrorOnNode(parameter.name, ts.Diagnostics.A_rest_element_cannot_contain_a_binding_pattern);
}
if (parameter.questionToken) {
return grammarErrorOnNode(parameter.questionToken, ts.Diagnostics.A_rest_parameter_cannot_be_optional);
}
if (parameter.initializer) {
return grammarErrorOnNode(parameter.name, ts.Diagnostics.A_rest_parameter_cannot_have_an_initializer);
}
}
else if (parameter.questionToken || parameter.initializer) {
seenOptionalParameter = true;
if (parameter.questionToken && parameter.initializer) {
return grammarErrorOnNode(parameter.name, ts.Diagnostics.Parameter_cannot_have_question_mark_and_initializer);
}
}
else {
if (seenOptionalParameter) {
return grammarErrorOnNode(parameter.name, ts.Diagnostics.A_required_parameter_cannot_follow_an_optional_parameter);
}
}
}
}
function checkGrammarFunctionLikeDeclaration(node) {
var file = ts.getSourceFileOfNode(node);
return checkGrammarDecorators(node) || checkGrammarModifiers(node) || checkGrammarTypeParameterList(node, node.typeParameters, file) ||
checkGrammarParameterList(node.parameters) || checkGrammarArrowFunction(node, file);
}
function checkGrammarArrowFunction(node, file) {
if (node.kind === 164) {
var arrowFunction = node;
var startLine = ts.getLineAndCharacterOfPosition(file, arrowFunction.equalsGreaterThanToken.pos).line;
var endLine = ts.getLineAndCharacterOfPosition(file, arrowFunction.equalsGreaterThanToken.end).line;
if (startLine !== endLine) {
return grammarErrorOnNode(arrowFunction.equalsGreaterThanToken, ts.Diagnostics.Line_terminator_not_permitted_before_arrow);
}
}
return false;
}
function checkGrammarIndexSignatureParameters(node) {
var parameter = node.parameters[0];
if (node.parameters.length !== 1) {
if (parameter) {
return grammarErrorOnNode(parameter.name, ts.Diagnostics.An_index_signature_must_have_exactly_one_parameter);
}
else {
return grammarErrorOnNode(node, ts.Diagnostics.An_index_signature_must_have_exactly_one_parameter);
}
}
if (parameter.dotDotDotToken) {
return grammarErrorOnNode(parameter.dotDotDotToken, ts.Diagnostics.An_index_signature_cannot_have_a_rest_parameter);
}
if (parameter.flags & 499) {
return grammarErrorOnNode(parameter.name, ts.Diagnostics.An_index_signature_parameter_cannot_have_an_accessibility_modifier);
}
if (parameter.questionToken) {
return grammarErrorOnNode(parameter.questionToken, ts.Diagnostics.An_index_signature_parameter_cannot_have_a_question_mark);
}
if (parameter.initializer) {
return grammarErrorOnNode(parameter.name, ts.Diagnostics.An_index_signature_parameter_cannot_have_an_initializer);
}
if (!parameter.type) {
return grammarErrorOnNode(parameter.name, ts.Diagnostics.An_index_signature_parameter_must_have_a_type_annotation);
}
if (parameter.type.kind !== 122 && parameter.type.kind !== 120) {
return grammarErrorOnNode(parameter.name, ts.Diagnostics.An_index_signature_parameter_type_must_be_string_or_number);
}
if (!node.type) {
return grammarErrorOnNode(node, ts.Diagnostics.An_index_signature_must_have_a_type_annotation);
}
}
function checkGrammarForIndexSignatureModifier(node) {
if (node.flags & 499) {
grammarErrorOnFirstToken(node, ts.Diagnostics.Modifiers_not_permitted_on_index_signature_members);
}
}
function checkGrammarIndexSignature(node) {
return checkGrammarDecorators(node) || checkGrammarModifiers(node) || checkGrammarIndexSignatureParameters(node) || checkGrammarForIndexSignatureModifier(node);
}
function checkGrammarForAtLeastOneTypeArgument(node, typeArguments) {
if (typeArguments && typeArguments.length === 0) {
var sourceFile = ts.getSourceFileOfNode(node);
var start = typeArguments.pos - "<".length;
var end = ts.skipTrivia(sourceFile.text, typeArguments.end) + ">".length;
return grammarErrorAtPos(sourceFile, start, end - start, ts.Diagnostics.Type_argument_list_cannot_be_empty);
}
}
function checkGrammarTypeArguments(node, typeArguments) {
return checkGrammarForDisallowedTrailingComma(typeArguments) ||
checkGrammarForAtLeastOneTypeArgument(node, typeArguments);
}
function checkGrammarForOmittedArgument(node, arguments) {
if (arguments) {
var sourceFile = ts.getSourceFileOfNode(node);
for (var _i = 0; _i < arguments.length; _i++) {
var arg = arguments[_i];
if (arg.kind === 176) {
return grammarErrorAtPos(sourceFile, arg.pos, 0, ts.Diagnostics.Argument_expression_expected);
}
}
}
}
function checkGrammarArguments(node, arguments) {
return checkGrammarForDisallowedTrailingComma(arguments) ||
checkGrammarForOmittedArgument(node, arguments);
}
function checkGrammarHeritageClause(node) {
var types = node.types;
if (checkGrammarForDisallowedTrailingComma(types)) {
return true;
}
if (types && types.length === 0) {
var listType = ts.tokenToString(node.token);
var sourceFile = ts.getSourceFileOfNode(node);
return grammarErrorAtPos(sourceFile, types.pos, 0, ts.Diagnostics._0_list_cannot_be_empty, listType);
}
}
function checkGrammarClassDeclarationHeritageClauses(node) {
var seenExtendsClause = false;
var seenImplementsClause = false;
if (!checkGrammarDecorators(node) && !checkGrammarModifiers(node) && node.heritageClauses) {
for (var _i = 0, _a = node.heritageClauses; _i < _a.length; _i++) {
var heritageClause = _a[_i];
if (heritageClause.token === 79) {
if (seenExtendsClause) {
return grammarErrorOnFirstToken(heritageClause, ts.Diagnostics.extends_clause_already_seen);
}
if (seenImplementsClause) {
return grammarErrorOnFirstToken(heritageClause, ts.Diagnostics.extends_clause_must_precede_implements_clause);
}
if (heritageClause.types.length > 1) {
return grammarErrorOnFirstToken(heritageClause.types[1], ts.Diagnostics.Classes_can_only_extend_a_single_class);
}
seenExtendsClause = true;
}
else {
ts.Debug.assert(heritageClause.token === 102);
if (seenImplementsClause) {
return grammarErrorOnFirstToken(heritageClause, ts.Diagnostics.implements_clause_already_seen);
}
seenImplementsClause = true;
}
checkGrammarHeritageClause(heritageClause);
}
}
}
function checkGrammarInterfaceDeclaration(node) {
var seenExtendsClause = false;
if (node.heritageClauses) {
for (var _i = 0, _a = node.heritageClauses; _i < _a.length; _i++) {
var heritageClause = _a[_i];
if (heritageClause.token === 79) {
if (seenExtendsClause) {
return grammarErrorOnFirstToken(heritageClause, ts.Diagnostics.extends_clause_already_seen);
}
seenExtendsClause = true;
}
else {
ts.Debug.assert(heritageClause.token === 102);
return grammarErrorOnFirstToken(heritageClause, ts.Diagnostics.Interface_declaration_cannot_have_implements_clause);
}
checkGrammarHeritageClause(heritageClause);
}
}
return false;
}
function checkGrammarComputedPropertyName(node) {
if (node.kind !== 128) {
return false;
}
var computedPropertyName = node;
if (computedPropertyName.expression.kind === 170 && computedPropertyName.expression.operatorToken.kind === 23) {
return grammarErrorOnNode(computedPropertyName.expression, ts.Diagnostics.A_comma_expression_is_not_allowed_in_a_computed_property_name);
}
}
function checkGrammarForGenerator(node) {
if (node.asteriskToken) {
return grammarErrorOnNode(node.asteriskToken, ts.Diagnostics.Generators_are_not_currently_supported);
}
}
function checkGrammarFunctionName(name) {
return checkGrammarEvalOrArgumentsInStrictMode(name, name);
}
function checkGrammarForInvalidQuestionMark(node, questionToken, message) {
if (questionToken) {
return grammarErrorOnNode(questionToken, message);
}
}
function checkGrammarObjectLiteralExpression(node) {
var seen = {};
var Property = 1;
var GetAccessor = 2;
var SetAccesor = 4;
var GetOrSetAccessor = GetAccessor | SetAccesor;
var inStrictMode = (node.parserContextFlags & 1) !== 0;
for (var _i = 0, _a = node.properties; _i < _a.length; _i++) {
var prop = _a[_i];
var name_13 = prop.name;
if (prop.kind === 176 ||
name_13.kind === 128) {
checkGrammarComputedPropertyName(name_13);
continue;
}
var currentKind = void 0;
if (prop.kind === 225 || prop.kind === 226) {
checkGrammarForInvalidQuestionMark(prop, prop.questionToken, ts.Diagnostics.An_object_member_cannot_be_declared_optional);
if (name_13.kind === 7) {
checkGrammarNumericLiteral(name_13);
}
currentKind = Property;
}
else if (prop.kind === 135) {
currentKind = Property;
}
else if (prop.kind === 137) {
currentKind = GetAccessor;
}
else if (prop.kind === 138) {
currentKind = SetAccesor;
}
else {
ts.Debug.fail("Unexpected syntax kind:" + prop.kind);
}
if (!ts.hasProperty(seen, name_13.text)) {
seen[name_13.text] = currentKind;
}
else {
var existingKind = seen[name_13.text];
if (currentKind === Property && existingKind === Property) {
if (inStrictMode) {
grammarErrorOnNode(name_13, ts.Diagnostics.An_object_literal_cannot_have_multiple_properties_with_the_same_name_in_strict_mode);
}
}
else if ((currentKind & GetOrSetAccessor) && (existingKind & GetOrSetAccessor)) {
if (existingKind !== GetOrSetAccessor && currentKind !== existingKind) {
seen[name_13.text] = currentKind | existingKind;
}
else {
return grammarErrorOnNode(name_13, ts.Diagnostics.An_object_literal_cannot_have_multiple_get_Slashset_accessors_with_the_same_name);
}
}
else {
return grammarErrorOnNode(name_13, ts.Diagnostics.An_object_literal_cannot_have_property_and_accessor_with_the_same_name);
}
}
}
}
function checkGrammarForInOrForOfStatement(forInOrOfStatement) {
if (checkGrammarStatementInAmbientContext(forInOrOfStatement)) {
return true;
}
if (forInOrOfStatement.initializer.kind === 200) {
var variableList = forInOrOfStatement.initializer;
if (!checkGrammarVariableDeclarationList(variableList)) {
if (variableList.declarations.length > 1) {
var diagnostic = forInOrOfStatement.kind === 188
? ts.Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_in_statement
: ts.Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_of_statement;
return grammarErrorOnFirstToken(variableList.declarations[1], diagnostic);
}
var firstDeclaration = variableList.declarations[0];
if (firstDeclaration.initializer) {
var diagnostic = forInOrOfStatement.kind === 188
? ts.Diagnostics.The_variable_declaration_of_a_for_in_statement_cannot_have_an_initializer
: ts.Diagnostics.The_variable_declaration_of_a_for_of_statement_cannot_have_an_initializer;
return grammarErrorOnNode(firstDeclaration.name, diagnostic);
}
if (firstDeclaration.type) {
var diagnostic = forInOrOfStatement.kind === 188
? ts.Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_use_a_type_annotation
: ts.Diagnostics.The_left_hand_side_of_a_for_of_statement_cannot_use_a_type_annotation;
return grammarErrorOnNode(firstDeclaration, diagnostic);
}
}
}
return false;
}
function checkGrammarAccessor(accessor) {
var kind = accessor.kind;
if (languageVersion < 1) {
return grammarErrorOnNode(accessor.name, ts.Diagnostics.Accessors_are_only_available_when_targeting_ECMAScript_5_and_higher);
}
else if (ts.isInAmbientContext(accessor)) {
return grammarErrorOnNode(accessor.name, ts.Diagnostics.An_accessor_cannot_be_declared_in_an_ambient_context);
}
else if (accessor.body === undefined) {
return grammarErrorAtPos(ts.getSourceFileOfNode(accessor), accessor.end - 1, ";".length, ts.Diagnostics._0_expected, "{");
}
else if (accessor.typeParameters) {
return grammarErrorOnNode(accessor.name, ts.Diagnostics.An_accessor_cannot_have_type_parameters);
}
else if (kind === 137 && accessor.parameters.length) {
return grammarErrorOnNode(accessor.name, ts.Diagnostics.A_get_accessor_cannot_have_parameters);
}
else if (kind === 138) {
if (accessor.type) {
return grammarErrorOnNode(accessor.name, ts.Diagnostics.A_set_accessor_cannot_have_a_return_type_annotation);
}
else if (accessor.parameters.length !== 1) {
return grammarErrorOnNode(accessor.name, ts.Diagnostics.A_set_accessor_must_have_exactly_one_parameter);
}
else {
var parameter = accessor.parameters[0];
if (parameter.dotDotDotToken) {
return grammarErrorOnNode(parameter.dotDotDotToken, ts.Diagnostics.A_set_accessor_cannot_have_rest_parameter);
}
else if (parameter.flags & 499) {
return grammarErrorOnNode(accessor.name, ts.Diagnostics.A_parameter_property_is_only_allowed_in_a_constructor_implementation);
}
else if (parameter.questionToken) {
return grammarErrorOnNode(parameter.questionToken, ts.Diagnostics.A_set_accessor_cannot_have_an_optional_parameter);
}
else if (parameter.initializer) {
return grammarErrorOnNode(accessor.name, ts.Diagnostics.A_set_accessor_parameter_cannot_have_an_initializer);
}
}
}
}
function checkGrammarForNonSymbolComputedProperty(node, message) {
if (node.kind === 128 && !ts.isWellKnownSymbolSyntactically(node.expression)) {
return grammarErrorOnNode(node, message);
}
}
function checkGrammarMethod(node) {
if (checkGrammarDisallowedModifiersInBlockOrObjectLiteralExpression(node) ||
checkGrammarFunctionLikeDeclaration(node) ||
checkGrammarForGenerator(node)) {
return true;
}
if (node.parent.kind === 155) {
if (checkGrammarForInvalidQuestionMark(node, node.questionToken, ts.Diagnostics.A_class_member_cannot_be_declared_optional)) {
return true;
}
else if (node.body === undefined) {
return grammarErrorAtPos(getSourceFile(node), node.end - 1, ";".length, ts.Diagnostics._0_expected, "{");
}
}
if (node.parent.kind === 202) {
if (checkGrammarForInvalidQuestionMark(node, node.questionToken, ts.Diagnostics.A_class_member_cannot_be_declared_optional)) {
return true;
}
if (ts.isInAmbientContext(node)) {
return checkGrammarForNonSymbolComputedProperty(node.name, ts.Diagnostics.A_computed_property_name_in_an_ambient_context_must_directly_refer_to_a_built_in_symbol);
}
else if (!node.body) {
return checkGrammarForNonSymbolComputedProperty(node.name, ts.Diagnostics.A_computed_property_name_in_a_method_overload_must_directly_refer_to_a_built_in_symbol);
}
}
else if (node.parent.kind === 203) {
return checkGrammarForNonSymbolComputedProperty(node.name, ts.Diagnostics.A_computed_property_name_in_an_interface_must_directly_refer_to_a_built_in_symbol);
}
else if (node.parent.kind === 146) {
return checkGrammarForNonSymbolComputedProperty(node.name, ts.Diagnostics.A_computed_property_name_in_a_type_literal_must_directly_refer_to_a_built_in_symbol);
}
}
function isIterationStatement(node, lookInLabeledStatements) {
switch (node.kind) {
case 187:
case 188:
case 189:
case 185:
case 186:
return true;
case 195:
return lookInLabeledStatements && isIterationStatement(node.statement, lookInLabeledStatements);
}
return false;
}
function checkGrammarBreakOrContinueStatement(node) {
var current = node;
while (current) {
if (ts.isFunctionLike(current)) {
return grammarErrorOnNode(node, ts.Diagnostics.Jump_target_cannot_cross_function_boundary);
}
switch (current.kind) {
case 195:
if (node.label && current.label.text === node.label.text) {
var isMisplacedContinueLabel = node.kind === 190
&& !isIterationStatement(current.statement, true);
if (isMisplacedContinueLabel) {
return grammarErrorOnNode(node, ts.Diagnostics.A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement);
}
return false;
}
break;
case 194:
if (node.kind === 191 && !node.label) {
return false;
}
break;
default:
if (isIterationStatement(current, false) && !node.label) {
return false;
}
break;
}
current = current.parent;
}
if (node.label) {
var message = node.kind === 191
? ts.Diagnostics.A_break_statement_can_only_jump_to_a_label_of_an_enclosing_statement
: ts.Diagnostics.A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement;
return grammarErrorOnNode(node, message);
}
else {
var message = node.kind === 191
? ts.Diagnostics.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement
: ts.Diagnostics.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement;
return grammarErrorOnNode(node, message);
}
}
function checkGrammarBindingElement(node) {
if (node.dotDotDotToken) {
var elements = node.parent.elements;
if (node !== ts.lastOrUndefined(elements)) {
return grammarErrorOnNode(node, ts.Diagnostics.A_rest_element_must_be_last_in_an_array_destructuring_pattern);
}
if (node.name.kind === 152 || node.name.kind === 151) {
return grammarErrorOnNode(node.name, ts.Diagnostics.A_rest_element_cannot_contain_a_binding_pattern);
}
if (node.initializer) {
return grammarErrorAtPos(ts.getSourceFileOfNode(node), node.initializer.pos - 1, 1, ts.Diagnostics.A_rest_element_cannot_have_an_initializer);
}
}
return checkGrammarEvalOrArgumentsInStrictMode(node, node.name);
}
function checkGrammarVariableDeclaration(node) {
if (node.parent.parent.kind !== 188 && node.parent.parent.kind !== 189) {
if (ts.isInAmbientContext(node)) {
if (node.initializer) {
var equalsTokenLength = "=".length;
return grammarErrorAtPos(ts.getSourceFileOfNode(node), node.initializer.pos - equalsTokenLength, equalsTokenLength, ts.Diagnostics.Initializers_are_not_allowed_in_ambient_contexts);
}
}
else if (!node.initializer) {
if (ts.isBindingPattern(node.name) && !ts.isBindingPattern(node.parent)) {
return grammarErrorOnNode(node, ts.Diagnostics.A_destructuring_declaration_must_have_an_initializer);
}
if (ts.isConst(node)) {
return grammarErrorOnNode(node, ts.Diagnostics.const_declarations_must_be_initialized);
}
}
}
var checkLetConstNames = languageVersion >= 2 && (ts.isLet(node) || ts.isConst(node));
return (checkLetConstNames && checkGrammarNameInLetOrConstDeclarations(node.name)) ||
checkGrammarEvalOrArgumentsInStrictMode(node, node.name);
}
function checkGrammarNameInLetOrConstDeclarations(name) {
if (name.kind === 65) {
if (name.text === "let") {
return grammarErrorOnNode(name, ts.Diagnostics.let_is_not_allowed_to_be_used_as_a_name_in_let_or_const_declarations);
}
}
else {
var elements = name.elements;
for (var _i = 0; _i < elements.length; _i++) {
var element = elements[_i];
if (element.kind !== 176) {
checkGrammarNameInLetOrConstDeclarations(element.name);
}
}
}
}
function checkGrammarVariableDeclarationList(declarationList) {
var declarations = declarationList.declarations;
if (checkGrammarForDisallowedTrailingComma(declarationList.declarations)) {
return true;
}
if (!declarationList.declarations.length) {
return grammarErrorAtPos(ts.getSourceFileOfNode(declarationList), declarations.pos, declarations.end - declarations.pos, ts.Diagnostics.Variable_declaration_list_cannot_be_empty);
}
}
function allowLetAndConstDeclarations(parent) {
switch (parent.kind) {
case 184:
case 185:
case 186:
case 193:
case 187:
case 188:
case 189:
return false;
case 195:
return allowLetAndConstDeclarations(parent.parent);
}
return true;
}
function checkGrammarForDisallowedLetOrConstStatement(node) {
if (!allowLetAndConstDeclarations(node.parent)) {
if (ts.isLet(node.declarationList)) {
return grammarErrorOnNode(node, ts.Diagnostics.let_declarations_can_only_be_declared_inside_a_block);
}
else if (ts.isConst(node.declarationList)) {
return grammarErrorOnNode(node, ts.Diagnostics.const_declarations_can_only_be_declared_inside_a_block);
}
}
}
function isIntegerLiteral(expression) {
if (expression.kind === 168) {
var unaryExpression = expression;
if (unaryExpression.operator === 33 || unaryExpression.operator === 34) {
expression = unaryExpression.operand;
}
}
if (expression.kind === 7) {
return /^[0-9]+([eE]\+?[0-9]+)?$/.test(expression.text);
}
return false;
}
function checkGrammarEnumDeclaration(enumDecl) {
var enumIsConst = (enumDecl.flags & 8192) !== 0;
var hasError = false;
if (!enumIsConst) {
var inConstantEnumMemberSection = true;
var inAmbientContext = ts.isInAmbientContext(enumDecl);
for (var _i = 0, _a = enumDecl.members; _i < _a.length; _i++) {
var node = _a[_i];
if (node.name.kind === 128) {
hasError = grammarErrorOnNode(node.name, ts.Diagnostics.Computed_property_names_are_not_allowed_in_enums);
}
else if (inAmbientContext) {
if (node.initializer && !isIntegerLiteral(node.initializer)) {
hasError = grammarErrorOnNode(node.name, ts.Diagnostics.Ambient_enum_elements_can_only_have_integer_literal_initializers) || hasError;
}
}
else if (node.initializer) {
inConstantEnumMemberSection = isIntegerLiteral(node.initializer);
}
else if (!inConstantEnumMemberSection) {
hasError = grammarErrorOnNode(node.name, ts.Diagnostics.Enum_member_must_have_initializer) || hasError;
}
}
}
return hasError;
}
function hasParseDiagnostics(sourceFile) {
return sourceFile.parseDiagnostics.length > 0;
}
function grammarErrorOnFirstToken(node, message, arg0, arg1, arg2) {
var sourceFile = ts.getSourceFileOfNode(node);
if (!hasParseDiagnostics(sourceFile)) {
var span = ts.getSpanOfTokenAtPosition(sourceFile, node.pos);
diagnostics.add(ts.createFileDiagnostic(sourceFile, span.start, span.length, message, arg0, arg1, arg2));
return true;
}
}
function grammarErrorAtPos(sourceFile, start, length, message, arg0, arg1, arg2) {
if (!hasParseDiagnostics(sourceFile)) {
diagnostics.add(ts.createFileDiagnostic(sourceFile, start, length, message, arg0, arg1, arg2));
return true;
}
}
function grammarErrorOnNode(node, message, arg0, arg1, arg2) {
var sourceFile = ts.getSourceFileOfNode(node);
if (!hasParseDiagnostics(sourceFile)) {
diagnostics.add(ts.createDiagnosticForNode(node, message, arg0, arg1, arg2));
return true;
}
}
function checkGrammarEvalOrArgumentsInStrictMode(contextNode, name) {
if (name && name.kind === 65) {
var identifier = name;
if (contextNode && (contextNode.parserContextFlags & 1) && isEvalOrArgumentsIdentifier(identifier)) {
var nameText = ts.declarationNameToString(identifier);
var reportErrorInClassDeclaration = reportStrictModeGrammarErrorInClassDeclaration(identifier, ts.Diagnostics.Invalid_use_of_0_Class_definitions_are_automatically_in_strict_mode, nameText);
if (!reportErrorInClassDeclaration) {
return grammarErrorOnNode(identifier, ts.Diagnostics.Invalid_use_of_0_in_strict_mode, nameText);
}
return reportErrorInClassDeclaration;
}
}
}
function isEvalOrArgumentsIdentifier(node) {
return node.kind === 65 &&
(node.text === "eval" || node.text === "arguments");
}
function checkGrammarConstructorTypeParameters(node) {
if (node.typeParameters) {
return grammarErrorAtPos(ts.getSourceFileOfNode(node), node.typeParameters.pos, node.typeParameters.end - node.typeParameters.pos, ts.Diagnostics.Type_parameters_cannot_appear_on_a_constructor_declaration);
}
}
function checkGrammarConstructorTypeAnnotation(node) {
if (node.type) {
return grammarErrorOnNode(node.type, ts.Diagnostics.Type_annotation_cannot_appear_on_a_constructor_declaration);
}
}
function checkGrammarProperty(node) {
if (node.parent.kind === 202) {
if (checkGrammarForInvalidQuestionMark(node, node.questionToken, ts.Diagnostics.A_class_member_cannot_be_declared_optional) ||
checkGrammarForNonSymbolComputedProperty(node.name, ts.Diagnostics.A_computed_property_name_in_a_class_property_declaration_must_directly_refer_to_a_built_in_symbol)) {
return true;
}
}
else if (node.parent.kind === 203) {
if (checkGrammarForNonSymbolComputedProperty(node.name, ts.Diagnostics.A_computed_property_name_in_an_interface_must_directly_refer_to_a_built_in_symbol)) {
return true;
}
}
else if (node.parent.kind === 146) {
if (checkGrammarForNonSymbolComputedProperty(node.name, ts.Diagnostics.A_computed_property_name_in_a_type_literal_must_directly_refer_to_a_built_in_symbol)) {
return true;
}
}
if (ts.isInAmbientContext(node) && node.initializer) {
return grammarErrorOnFirstToken(node.initializer, ts.Diagnostics.Initializers_are_not_allowed_in_ambient_contexts);
}
}
function checkGrammarTopLevelElementForRequiredDeclareModifier(node) {
if (node.kind === 203 ||
node.kind === 210 ||
node.kind === 209 ||
node.kind === 216 ||
node.kind === 215 ||
(node.flags & 2) ||
(node.flags & (1 | 256))) {
return false;
}
return grammarErrorOnFirstToken(node, ts.Diagnostics.A_declare_modifier_is_required_for_a_top_level_declaration_in_a_d_ts_file);
}
function checkGrammarTopLevelElementsForRequiredDeclareModifier(file) {
for (var _i = 0, _a = file.statements; _i < _a.length; _i++) {
var decl = _a[_i];
if (ts.isDeclaration(decl) || decl.kind === 181) {
if (checkGrammarTopLevelElementForRequiredDeclareModifier(decl)) {
return true;
}
}
}
}
function checkGrammarSourceFile(node) {
return ts.isInAmbientContext(node) && checkGrammarTopLevelElementsForRequiredDeclareModifier(node);
}
function checkGrammarStatementInAmbientContext(node) {
if (ts.isInAmbientContext(node)) {
if (isAccessor(node.parent.kind)) {
return getNodeLinks(node).hasReportedStatementInAmbientContext = true;
}
var links = getNodeLinks(node);
if (!links.hasReportedStatementInAmbientContext && ts.isFunctionLike(node.parent)) {
return getNodeLinks(node).hasReportedStatementInAmbientContext = grammarErrorOnFirstToken(node, ts.Diagnostics.An_implementation_cannot_be_declared_in_ambient_contexts);
}
if (node.parent.kind === 180 || node.parent.kind === 207 || node.parent.kind === 228) {
var links_1 = getNodeLinks(node.parent);
if (!links_1.hasReportedStatementInAmbientContext) {
return links_1.hasReportedStatementInAmbientContext = grammarErrorOnFirstToken(node, ts.Diagnostics.Statements_are_not_allowed_in_ambient_contexts);
}
}
else {
}
}
}
function checkGrammarNumericLiteral(node) {
if (node.flags & 16384) {
if (node.parserContextFlags & 1) {
return grammarErrorOnNode(node, ts.Diagnostics.Octal_literals_are_not_allowed_in_strict_mode);
}
else if (languageVersion >= 1) {
return grammarErrorOnNode(node, ts.Diagnostics.Octal_literals_are_not_available_when_targeting_ECMAScript_5_and_higher);
}
}
}
function grammarErrorAfterFirstToken(node, message, arg0, arg1, arg2) {
var sourceFile = ts.getSourceFileOfNode(node);
if (!hasParseDiagnostics(sourceFile)) {
var span = ts.getSpanOfTokenAtPosition(sourceFile, node.pos);
diagnostics.add(ts.createFileDiagnostic(sourceFile, ts.textSpanEnd(span), 0, message, arg0, arg1, arg2));
return true;
}
}
initializeTypeChecker();
return checker;
}
ts.createTypeChecker = createTypeChecker;
})(ts || (ts = {}));
/// <reference path="checker.ts"/>
var ts;
(function (ts) {
function getDeclarationDiagnostics(host, resolver, targetSourceFile) {
var diagnostics = [];
var jsFilePath = ts.getOwnEmitOutputFilePath(targetSourceFile, host, ".js");
emitDeclarations(host, resolver, diagnostics, jsFilePath, targetSourceFile);
return diagnostics;
}
ts.getDeclarationDiagnostics = getDeclarationDiagnostics;
function emitDeclarations(host, resolver, diagnostics, jsFilePath, root) {
var newLine = host.getNewLine();
var compilerOptions = host.getCompilerOptions();
var languageVersion = compilerOptions.target || 0;
var write;
var writeLine;
var increaseIndent;
var decreaseIndent;
var writeTextOfNode;
var writer = createAndSetNewTextWriterWithSymbolWriter();
var enclosingDeclaration;
var currentSourceFile;
var reportedDeclarationError = false;
var emitJsDocComments = compilerOptions.removeComments ? function (declaration) { } : writeJsDocComments;
var emit = compilerOptions.stripInternal ? stripInternal : emitNode;
var moduleElementDeclarationEmitInfo = [];
var asynchronousSubModuleDeclarationEmitInfo;
var referencePathsOutput = "";
if (root) {
if (!compilerOptions.noResolve) {
var addedGlobalFileReference = false;
ts.forEach(root.referencedFiles, function (fileReference) {
var referencedFile = ts.tryResolveScriptReference(host, root, fileReference);
if (referencedFile && ((referencedFile.flags & 2048) ||
ts.shouldEmitToOwnFile(referencedFile, compilerOptions) ||
!addedGlobalFileReference)) {
writeReferencePath(referencedFile);
if (!ts.isExternalModuleOrDeclarationFile(referencedFile)) {
addedGlobalFileReference = true;
}
}
});
}
emitSourceFile(root);
if (moduleElementDeclarationEmitInfo.length) {
var oldWriter = writer;
ts.forEach(moduleElementDeclarationEmitInfo, function (aliasEmitInfo) {
if (aliasEmitInfo.isVisible) {
ts.Debug.assert(aliasEmitInfo.node.kind === 210);
createAndSetNewTextWriterWithSymbolWriter();
ts.Debug.assert(aliasEmitInfo.indent === 0);
writeImportDeclaration(aliasEmitInfo.node);
aliasEmitInfo.asynchronousOutput = writer.getText();
}
});
setWriter(oldWriter);
}
}
else {
var emittedReferencedFiles = [];
ts.forEach(host.getSourceFiles(), function (sourceFile) {
if (!ts.isExternalModuleOrDeclarationFile(sourceFile)) {
if (!compilerOptions.noResolve) {
ts.forEach(sourceFile.referencedFiles, function (fileReference) {
var referencedFile = ts.tryResolveScriptReference(host, sourceFile, fileReference);
if (referencedFile && (ts.isExternalModuleOrDeclarationFile(referencedFile) &&
!ts.contains(emittedReferencedFiles, referencedFile))) {
writeReferencePath(referencedFile);
emittedReferencedFiles.push(referencedFile);
}
});
}
emitSourceFile(sourceFile);
}
});
}
return {
reportedDeclarationError: reportedDeclarationError,
moduleElementDeclarationEmitInfo: moduleElementDeclarationEmitInfo,
synchronousDeclarationOutput: writer.getText(),
referencePathsOutput: referencePathsOutput
};
function hasInternalAnnotation(range) {
var text = currentSourceFile.text;
var comment = text.substring(range.pos, range.end);
return comment.indexOf("@internal") >= 0;
}
function stripInternal(node) {
if (node) {
var leadingCommentRanges = ts.getLeadingCommentRanges(currentSourceFile.text, node.pos);
if (ts.forEach(leadingCommentRanges, hasInternalAnnotation)) {
return;
}
emitNode(node);
}
}
function createAndSetNewTextWriterWithSymbolWriter() {
var writer = ts.createTextWriter(newLine);
writer.trackSymbol = trackSymbol;
writer.writeKeyword = writer.write;
writer.writeOperator = writer.write;
writer.writePunctuation = writer.write;
writer.writeSpace = writer.write;
writer.writeStringLiteral = writer.writeLiteral;
writer.writeParameter = writer.write;
writer.writeSymbol = writer.write;
setWriter(writer);
return writer;
}
function setWriter(newWriter) {
writer = newWriter;
write = newWriter.write;
writeTextOfNode = newWriter.writeTextOfNode;
writeLine = newWriter.writeLine;
increaseIndent = newWriter.increaseIndent;
decreaseIndent = newWriter.decreaseIndent;
}
function writeAsynchronousModuleElements(nodes) {
var oldWriter = writer;
ts.forEach(nodes, function (declaration) {
var nodeToCheck;
if (declaration.kind === 199) {
nodeToCheck = declaration.parent.parent;
}
else if (declaration.kind === 213 || declaration.kind === 214 || declaration.kind === 211) {
ts.Debug.fail("We should be getting ImportDeclaration instead to write");
}
else {
nodeToCheck = declaration;
}
var moduleElementEmitInfo = ts.forEach(moduleElementDeclarationEmitInfo, function (declEmitInfo) { return declEmitInfo.node === nodeToCheck ? declEmitInfo : undefined; });
if (!moduleElementEmitInfo && asynchronousSubModuleDeclarationEmitInfo) {
moduleElementEmitInfo = ts.forEach(asynchronousSubModuleDeclarationEmitInfo, function (declEmitInfo) { return declEmitInfo.node === nodeToCheck ? declEmitInfo : undefined; });
}
if (moduleElementEmitInfo) {
if (moduleElementEmitInfo.node.kind === 210) {
moduleElementEmitInfo.isVisible = true;
}
else {
createAndSetNewTextWriterWithSymbolWriter();
for (var declarationIndent = moduleElementEmitInfo.indent; declarationIndent; declarationIndent--) {
increaseIndent();
}
if (nodeToCheck.kind === 206) {
ts.Debug.assert(asynchronousSubModuleDeclarationEmitInfo === undefined);
asynchronousSubModuleDeclarationEmitInfo = [];
}
writeModuleElement(nodeToCheck);
if (nodeToCheck.kind === 206) {
moduleElementEmitInfo.subModuleElementDeclarationEmitInfo = asynchronousSubModuleDeclarationEmitInfo;
asynchronousSubModuleDeclarationEmitInfo = undefined;
}
moduleElementEmitInfo.asynchronousOutput = writer.getText();
}
}
});
setWriter(oldWriter);
}
function handleSymbolAccessibilityError(symbolAccesibilityResult) {
if (symbolAccesibilityResult.accessibility === 0) {
if (symbolAccesibilityResult && symbolAccesibilityResult.aliasesToMakeVisible) {
writeAsynchronousModuleElements(symbolAccesibilityResult.aliasesToMakeVisible);
}
}
else {
reportedDeclarationError = true;
var errorInfo = writer.getSymbolAccessibilityDiagnostic(symbolAccesibilityResult);
if (errorInfo) {
if (errorInfo.typeName) {
diagnostics.push(ts.createDiagnosticForNode(symbolAccesibilityResult.errorNode || errorInfo.errorNode, errorInfo.diagnosticMessage, ts.getSourceTextOfNodeFromSourceFile(currentSourceFile, errorInfo.typeName), symbolAccesibilityResult.errorSymbolName, symbolAccesibilityResult.errorModuleName));
}
else {
diagnostics.push(ts.createDiagnosticForNode(symbolAccesibilityResult.errorNode || errorInfo.errorNode, errorInfo.diagnosticMessage, symbolAccesibilityResult.errorSymbolName, symbolAccesibilityResult.errorModuleName));
}
}
}
}
function trackSymbol(symbol, enclosingDeclaration, meaning) {
handleSymbolAccessibilityError(resolver.isSymbolAccessible(symbol, enclosingDeclaration, meaning));
}
function writeTypeOfDeclaration(declaration, type, getSymbolAccessibilityDiagnostic) {
writer.getSymbolAccessibilityDiagnostic = getSymbolAccessibilityDiagnostic;
write(": ");
if (type) {
emitType(type);
}
else {
resolver.writeTypeOfDeclaration(declaration, enclosingDeclaration, 2, writer);
}
}
function writeReturnTypeAtSignature(signature, getSymbolAccessibilityDiagnostic) {
writer.getSymbolAccessibilityDiagnostic = getSymbolAccessibilityDiagnostic;
write(": ");
if (signature.type) {
emitType(signature.type);
}
else {
resolver.writeReturnTypeOfSignatureDeclaration(signature, enclosingDeclaration, 2, writer);
}
}
function emitLines(nodes) {
for (var _i = 0; _i < nodes.length; _i++) {
var node = nodes[_i];
emit(node);
}
}
function emitSeparatedList(nodes, separator, eachNodeEmitFn, canEmitFn) {
var currentWriterPos = writer.getTextPos();
for (var _i = 0; _i < nodes.length; _i++) {
var node = nodes[_i];
if (!canEmitFn || canEmitFn(node)) {
if (currentWriterPos !== writer.getTextPos()) {
write(separator);
}
currentWriterPos = writer.getTextPos();
eachNodeEmitFn(node);
}
}
}
function emitCommaList(nodes, eachNodeEmitFn, canEmitFn) {
emitSeparatedList(nodes, ", ", eachNodeEmitFn, canEmitFn);
}
function writeJsDocComments(declaration) {
if (declaration) {
var jsDocComments = ts.getJsDocComments(declaration, currentSourceFile);
ts.emitNewLineBeforeLeadingComments(currentSourceFile, writer, declaration, jsDocComments);
ts.emitComments(currentSourceFile, writer, jsDocComments, true, newLine, ts.writeCommentRange);
}
}
function emitTypeWithNewGetSymbolAccessibilityDiagnostic(type, getSymbolAccessibilityDiagnostic) {
writer.getSymbolAccessibilityDiagnostic = getSymbolAccessibilityDiagnostic;
emitType(type);
}
function emitType(type) {
switch (type.kind) {
case 112:
case 122:
case 120:
case 113:
case 123:
case 99:
case 8:
return writeTextOfNode(currentSourceFile, type);
case 177:
return emitExpressionWithTypeArguments(type);
case 142:
return emitTypeReference(type);
case 145:
return emitTypeQuery(type);
case 147:
return emitArrayType(type);
case 148:
return emitTupleType(type);
case 149:
return emitUnionType(type);
case 150:
return emitParenType(type);
case 143:
case 144:
return emitSignatureDeclarationWithJsDocComments(type);
case 146:
return emitTypeLiteral(type);
case 65:
return emitEntityName(type);
case 127:
return emitEntityName(type);
}
function emitEntityName(entityName) {
var visibilityResult = resolver.isEntityNameVisible(entityName, entityName.parent.kind === 209 ? entityName.parent : enclosingDeclaration);
handleSymbolAccessibilityError(visibilityResult);
writeEntityName(entityName);
function writeEntityName(entityName) {
if (entityName.kind === 65) {
writeTextOfNode(currentSourceFile, entityName);
}
else {
var left = entityName.kind === 127 ? entityName.left : entityName.expression;
var right = entityName.kind === 127 ? entityName.right : entityName.name;
writeEntityName(left);
write(".");
writeTextOfNode(currentSourceFile, right);
}
}
}
function emitExpressionWithTypeArguments(node) {
if (ts.isSupportedExpressionWithTypeArguments(node)) {
ts.Debug.assert(node.expression.kind === 65 || node.expression.kind === 156);
emitEntityName(node.expression);
if (node.typeArguments) {
write("<");
emitCommaList(node.typeArguments, emitType);
write(">");
}
}
}
function emitTypeReference(type) {
emitEntityName(type.typeName);
if (type.typeArguments) {
write("<");
emitCommaList(type.typeArguments, emitType);
write(">");
}
}
function emitTypeQuery(type) {
write("typeof ");
emitEntityName(type.exprName);
}
function emitArrayType(type) {
emitType(type.elementType);
write("[]");
}
function emitTupleType(type) {
write("[");
emitCommaList(type.elementTypes, emitType);
write("]");
}
function emitUnionType(type) {
emitSeparatedList(type.types, " | ", emitType);
}
function emitParenType(type) {
write("(");
emitType(type.type);
write(")");
}
function emitTypeLiteral(type) {
write("{");
if (type.members.length) {
writeLine();
increaseIndent();
emitLines(type.members);
decreaseIndent();
}
write("}");
}
}
function emitSourceFile(node) {
currentSourceFile = node;
enclosingDeclaration = node;
emitLines(node.statements);
}
function getExportDefaultTempVariableName() {
var baseName = "_default";
if (!ts.hasProperty(currentSourceFile.identifiers, baseName)) {
return baseName;
}
var count = 0;
while (true) {
var name_14 = baseName + "_" + (++count);
if (!ts.hasProperty(currentSourceFile.identifiers, name_14)) {
return name_14;
}
}
}
function emitExportAssignment(node) {
if (node.expression.kind === 65) {
write(node.isExportEquals ? "export = " : "export default ");
writeTextOfNode(currentSourceFile, node.expression);
}
else {
var tempVarName = getExportDefaultTempVariableName();
write("declare var ");
write(tempVarName);
write(": ");
writer.getSymbolAccessibilityDiagnostic = getDefaultExportAccessibilityDiagnostic;
resolver.writeTypeOfExpression(node.expression, enclosingDeclaration, 2, writer);
write(";");
writeLine();
write(node.isExportEquals ? "export = " : "export default ");
write(tempVarName);
}
write(";");
writeLine();
if (node.expression.kind === 65) {
var nodes = resolver.collectLinkedAliases(node.expression);
writeAsynchronousModuleElements(nodes);
}
function getDefaultExportAccessibilityDiagnostic(diagnostic) {
return {
diagnosticMessage: ts.Diagnostics.Default_export_of_the_module_has_or_is_using_private_name_0,
errorNode: node
};
}
}
function isModuleElementVisible(node) {
return resolver.isDeclarationVisible(node);
}
function emitModuleElement(node, isModuleElementVisible) {
if (isModuleElementVisible) {
writeModuleElement(node);
}
else if (node.kind === 209 ||
(node.parent.kind === 228 && ts.isExternalModule(currentSourceFile))) {
var isVisible;
if (asynchronousSubModuleDeclarationEmitInfo && node.parent.kind !== 228) {
asynchronousSubModuleDeclarationEmitInfo.push({
node: node,
outputPos: writer.getTextPos(),
indent: writer.getIndent(),
isVisible: isVisible
});
}
else {
if (node.kind === 210) {
var importDeclaration = node;
if (importDeclaration.importClause) {
isVisible = (importDeclaration.importClause.name && resolver.isDeclarationVisible(importDeclaration.importClause)) ||
isVisibleNamedBinding(importDeclaration.importClause.namedBindings);
}
}
moduleElementDeclarationEmitInfo.push({
node: node,
outputPos: writer.getTextPos(),
indent: writer.getIndent(),
isVisible: isVisible
});
}
}
}
function writeModuleElement(node) {
switch (node.kind) {
case 201:
return writeFunctionDeclaration(node);
case 181:
return writeVariableStatement(node);
case 203:
return writeInterfaceDeclaration(node);
case 202:
return writeClassDeclaration(node);
case 204:
return writeTypeAliasDeclaration(node);
case 205:
return writeEnumDeclaration(node);
case 206:
return writeModuleDeclaration(node);
case 209:
return writeImportEqualsDeclaration(node);
case 210:
return writeImportDeclaration(node);
default:
ts.Debug.fail("Unknown symbol kind");
}
}
function emitModuleElementDeclarationFlags(node) {
if (node.parent === currentSourceFile) {
if (node.flags & 1) {
write("export ");
}
if (node.flags & 256) {
write("default ");
}
else if (node.kind !== 203) {
write("declare ");
}
}
}
function emitClassMemberDeclarationFlags(node) {
if (node.flags & 32) {
write("private ");
}
else if (node.flags & 64) {
write("protected ");
}
if (node.flags & 128) {
write("static ");
}
}
function writeImportEqualsDeclaration(node) {
emitJsDocComments(node);
if (node.flags & 1) {
write("export ");
}
write("import ");
writeTextOfNode(currentSourceFile, node.name);
write(" = ");
if (ts.isInternalModuleImportEqualsDeclaration(node)) {
emitTypeWithNewGetSymbolAccessibilityDiagnostic(node.moduleReference, getImportEntityNameVisibilityError);
write(";");
}
else {
write("require(");
writeTextOfNode(currentSourceFile, ts.getExternalModuleImportEqualsDeclarationExpression(node));
write(");");
}
writer.writeLine();
function getImportEntityNameVisibilityError(symbolAccesibilityResult) {
return {
diagnosticMessage: ts.Diagnostics.Import_declaration_0_is_using_private_name_1,
errorNode: node,
typeName: node.name
};
}
}
function isVisibleNamedBinding(namedBindings) {
if (namedBindings) {
if (namedBindings.kind === 212) {
return resolver.isDeclarationVisible(namedBindings);
}
else {
return ts.forEach(namedBindings.elements, function (namedImport) { return resolver.isDeclarationVisible(namedImport); });
}
}
}
function writeImportDeclaration(node) {
if (!node.importClause && !(node.flags & 1)) {
return;
}
emitJsDocComments(node);
if (node.flags & 1) {
write("export ");
}
write("import ");
if (node.importClause) {
var currentWriterPos = writer.getTextPos();
if (node.importClause.name && resolver.isDeclarationVisible(node.importClause)) {
writeTextOfNode(currentSourceFile, node.importClause.name);
}
if (node.importClause.namedBindings && isVisibleNamedBinding(node.importClause.namedBindings)) {
if (currentWriterPos !== writer.getTextPos()) {
write(", ");
}
if (node.importClause.namedBindings.kind === 212) {
write("* as ");
writeTextOfNode(currentSourceFile, node.importClause.namedBindings.name);
}
else {
write("{ ");
emitCommaList(node.importClause.namedBindings.elements, emitImportOrExportSpecifier, resolver.isDeclarationVisible);
write(" }");
}
}
write(" from ");
}
writeTextOfNode(currentSourceFile, node.moduleSpecifier);
write(";");
writer.writeLine();
}
function emitImportOrExportSpecifier(node) {
if (node.propertyName) {
writeTextOfNode(currentSourceFile, node.propertyName);
write(" as ");
}
writeTextOfNode(currentSourceFile, node.name);
}
function emitExportSpecifier(node) {
emitImportOrExportSpecifier(node);
var nodes = resolver.collectLinkedAliases(node.propertyName || node.name);
writeAsynchronousModuleElements(nodes);
}
function emitExportDeclaration(node) {
emitJsDocComments(node);
write("export ");
if (node.exportClause) {
write("{ ");
emitCommaList(node.exportClause.elements, emitExportSpecifier);
write(" }");
}
else {
write("*");
}
if (node.moduleSpecifier) {
write(" from ");
writeTextOfNode(currentSourceFile, node.moduleSpecifier);
}
write(";");
writer.writeLine();
}
function writeModuleDeclaration(node) {
emitJsDocComments(node);
emitModuleElementDeclarationFlags(node);
write("module ");
writeTextOfNode(currentSourceFile, node.name);
while (node.body.kind !== 207) {
node = node.body;
write(".");
writeTextOfNode(currentSourceFile, node.name);
}
var prevEnclosingDeclaration = enclosingDeclaration;
enclosingDeclaration = node;
write(" {");
writeLine();
increaseIndent();
emitLines(node.body.statements);
decreaseIndent();
write("}");
writeLine();
enclosingDeclaration = prevEnclosingDeclaration;
}
function writeTypeAliasDeclaration(node) {
emitJsDocComments(node);
emitModuleElementDeclarationFlags(node);
write("type ");
writeTextOfNode(currentSourceFile, node.name);
write(" = ");
emitTypeWithNewGetSymbolAccessibilityDiagnostic(node.type, getTypeAliasDeclarationVisibilityError);
write(";");
writeLine();
function getTypeAliasDeclarationVisibilityError(symbolAccesibilityResult) {
return {
diagnosticMessage: ts.Diagnostics.Exported_type_alias_0_has_or_is_using_private_name_1,
errorNode: node.type,
typeName: node.name
};
}
}
function writeEnumDeclaration(node) {
emitJsDocComments(node);
emitModuleElementDeclarationFlags(node);
if (ts.isConst(node)) {
write("const ");
}
write("enum ");
writeTextOfNode(currentSourceFile, node.name);
write(" {");
writeLine();
increaseIndent();
emitLines(node.members);
decreaseIndent();
write("}");
writeLine();
}
function emitEnumMemberDeclaration(node) {
emitJsDocComments(node);
writeTextOfNode(currentSourceFile, node.name);
var enumMemberValue = resolver.getConstantValue(node);
if (enumMemberValue !== undefined) {
write(" = ");
write(enumMemberValue.toString());
}
write(",");
writeLine();
}
function isPrivateMethodTypeParameter(node) {
return node.parent.kind === 135 && (node.parent.flags & 32);
}
function emitTypeParameters(typeParameters) {
function emitTypeParameter(node) {
increaseIndent();
emitJsDocComments(node);
decreaseIndent();
writeTextOfNode(currentSourceFile, node.name);
if (node.constraint && !isPrivateMethodTypeParameter(node)) {
write(" extends ");
if (node.parent.kind === 143 ||
node.parent.kind === 144 ||
(node.parent.parent && node.parent.parent.kind === 146)) {
ts.Debug.assert(node.parent.kind === 135 ||
node.parent.kind === 134 ||
node.parent.kind === 143 ||
node.parent.kind === 144 ||
node.parent.kind === 139 ||
node.parent.kind === 140);
emitType(node.constraint);
}
else {
emitTypeWithNewGetSymbolAccessibilityDiagnostic(node.constraint, getTypeParameterConstraintVisibilityError);
}
}
function getTypeParameterConstraintVisibilityError(symbolAccesibilityResult) {
var diagnosticMessage;
switch (node.parent.kind) {
case 202:
diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_exported_class_has_or_is_using_private_name_1;
break;
case 203:
diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1;
break;
case 140:
diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1;
break;
case 139:
diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1;
break;
case 135:
case 134:
if (node.parent.flags & 128) {
diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1;
}
else if (node.parent.parent.kind === 202) {
diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1;
}
else {
diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1;
}
break;
case 201:
diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_exported_function_has_or_is_using_private_name_1;
break;
default:
ts.Debug.fail("This is unknown parent for type parameter: " + node.parent.kind);
}
return {
diagnosticMessage: diagnosticMessage,
errorNode: node,
typeName: node.name
};
}
}
if (typeParameters) {
write("<");
emitCommaList(typeParameters, emitTypeParameter);
write(">");
}
}
function emitHeritageClause(typeReferences, isImplementsList) {
if (typeReferences) {
write(isImplementsList ? " implements " : " extends ");
emitCommaList(typeReferences, emitTypeOfTypeReference);
}
function emitTypeOfTypeReference(node) {
if (ts.isSupportedExpressionWithTypeArguments(node)) {
emitTypeWithNewGetSymbolAccessibilityDiagnostic(node, getHeritageClauseVisibilityError);
}
function getHeritageClauseVisibilityError(symbolAccesibilityResult) {
var diagnosticMessage;
if (node.parent.parent.kind === 202) {
diagnosticMessage = isImplementsList ?
ts.Diagnostics.Implements_clause_of_exported_class_0_has_or_is_using_private_name_1 :
ts.Diagnostics.Extends_clause_of_exported_class_0_has_or_is_using_private_name_1;
}
else {
diagnosticMessage = ts.Diagnostics.Extends_clause_of_exported_interface_0_has_or_is_using_private_name_1;
}
return {
diagnosticMessage: diagnosticMessage,
errorNode: node,
typeName: node.parent.parent.name
};
}
}
}
function writeClassDeclaration(node) {
function emitParameterProperties(constructorDeclaration) {
if (constructorDeclaration) {
ts.forEach(constructorDeclaration.parameters, function (param) {
if (param.flags & 112) {
emitPropertyDeclaration(param);
}
});
}
}
emitJsDocComments(node);
emitModuleElementDeclarationFlags(node);
write("class ");
writeTextOfNode(currentSourceFile, node.name);
var prevEnclosingDeclaration = enclosingDeclaration;
enclosingDeclaration = node;
emitTypeParameters(node.typeParameters);
var baseTypeNode = ts.getClassExtendsHeritageClauseElement(node);
if (baseTypeNode) {
emitHeritageClause([baseTypeNode], false);
}
emitHeritageClause(ts.getClassImplementsHeritageClauseElements(node), true);
write(" {");
writeLine();
increaseIndent();
emitParameterProperties(ts.getFirstConstructorWithBody(node));
emitLines(node.members);
decreaseIndent();
write("}");
writeLine();
enclosingDeclaration = prevEnclosingDeclaration;
}
function writeInterfaceDeclaration(node) {
emitJsDocComments(node);
emitModuleElementDeclarationFlags(node);
write("interface ");
writeTextOfNode(currentSourceFile, node.name);
var prevEnclosingDeclaration = enclosingDeclaration;
enclosingDeclaration = node;
emitTypeParameters(node.typeParameters);
emitHeritageClause(ts.getInterfaceBaseTypeNodes(node), false);
write(" {");
writeLine();
increaseIndent();
emitLines(node.members);
decreaseIndent();
write("}");
writeLine();
enclosingDeclaration = prevEnclosingDeclaration;
}
function emitPropertyDeclaration(node) {
if (ts.hasDynamicName(node)) {
return;
}
emitJsDocComments(node);
emitClassMemberDeclarationFlags(node);
emitVariableDeclaration(node);
write(";");
writeLine();
}
function emitVariableDeclaration(node) {
if (node.kind !== 199 || resolver.isDeclarationVisible(node)) {
if (ts.isBindingPattern(node.name)) {
emitBindingPattern(node.name);
}
else {
writeTextOfNode(currentSourceFile, node.name);
if ((node.kind === 133 || node.kind === 132) && ts.hasQuestionToken(node)) {
write("?");
}
if ((node.kind === 133 || node.kind === 132) && node.parent.kind === 146) {
emitTypeOfVariableDeclarationFromTypeLiteral(node);
}
else if (!(node.flags & 32)) {
writeTypeOfDeclaration(node, node.type, getVariableDeclarationTypeVisibilityError);
}
}
}
function getVariableDeclarationTypeVisibilityDiagnosticMessage(symbolAccesibilityResult) {
if (node.kind === 199) {
return symbolAccesibilityResult.errorModuleName ?
symbolAccesibilityResult.accessibility === 2 ?
ts.Diagnostics.Exported_variable_0_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
ts.Diagnostics.Exported_variable_0_has_or_is_using_name_1_from_private_module_2 :
ts.Diagnostics.Exported_variable_0_has_or_is_using_private_name_1;
}
else if (node.kind === 133 || node.kind === 132) {
if (node.flags & 128) {
return symbolAccesibilityResult.errorModuleName ?
symbolAccesibilityResult.accessibility === 2 ?
ts.Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
ts.Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 :
ts.Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_private_name_1;
}
else if (node.parent.kind === 202) {
return symbolAccesibilityResult.errorModuleName ?
symbolAccesibilityResult.accessibility === 2 ?
ts.Diagnostics.Public_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
ts.Diagnostics.Public_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 :
ts.Diagnostics.Public_property_0_of_exported_class_has_or_is_using_private_name_1;
}
else {
return symbolAccesibilityResult.errorModuleName ?
ts.Diagnostics.Property_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2 :
ts.Diagnostics.Property_0_of_exported_interface_has_or_is_using_private_name_1;
}
}
}
function getVariableDeclarationTypeVisibilityError(symbolAccesibilityResult) {
var diagnosticMessage = getVariableDeclarationTypeVisibilityDiagnosticMessage(symbolAccesibilityResult);
return diagnosticMessage !== undefined ? {
diagnosticMessage: diagnosticMessage,
errorNode: node,
typeName: node.name
} : undefined;
}
function emitBindingPattern(bindingPattern) {
var elements = [];
for (var _i = 0, _a = bindingPattern.elements; _i < _a.length; _i++) {
var element = _a[_i];
if (element.kind !== 176) {
elements.push(element);
}
}
emitCommaList(elements, emitBindingElement);
}
function emitBindingElement(bindingElement) {
function getBindingElementTypeVisibilityError(symbolAccesibilityResult) {
var diagnosticMessage = getVariableDeclarationTypeVisibilityDiagnosticMessage(symbolAccesibilityResult);
return diagnosticMessage !== undefined ? {
diagnosticMessage: diagnosticMessage,
errorNode: bindingElement,
typeName: bindingElement.name
} : undefined;
}
if (bindingElement.name) {
if (ts.isBindingPattern(bindingElement.name)) {
emitBindingPattern(bindingElement.name);
}
else {
writeTextOfNode(currentSourceFile, bindingElement.name);
writeTypeOfDeclaration(bindingElement, undefined, getBindingElementTypeVisibilityError);
}
}
}
}
function emitTypeOfVariableDeclarationFromTypeLiteral(node) {
if (node.type) {
write(": ");
emitType(node.type);
}
}
function isVariableStatementVisible(node) {
return ts.forEach(node.declarationList.declarations, function (varDeclaration) { return resolver.isDeclarationVisible(varDeclaration); });
}
function writeVariableStatement(node) {
emitJsDocComments(node);
emitModuleElementDeclarationFlags(node);
if (ts.isLet(node.declarationList)) {
write("let ");
}
else if (ts.isConst(node.declarationList)) {
write("const ");
}
else {
write("var ");
}
emitCommaList(node.declarationList.declarations, emitVariableDeclaration, resolver.isDeclarationVisible);
write(";");
writeLine();
}
function emitAccessorDeclaration(node) {
if (ts.hasDynamicName(node)) {
return;
}
var accessors = ts.getAllAccessorDeclarations(node.parent.members, node);
var accessorWithTypeAnnotation;
if (node === accessors.firstAccessor) {
emitJsDocComments(accessors.getAccessor);
emitJsDocComments(accessors.setAccessor);
emitClassMemberDeclarationFlags(node);
writeTextOfNode(currentSourceFile, node.name);
if (!(node.flags & 32)) {
accessorWithTypeAnnotation = node;
var type = getTypeAnnotationFromAccessor(node);
if (!type) {
var anotherAccessor = node.kind === 137 ? accessors.setAccessor : accessors.getAccessor;
type = getTypeAnnotationFromAccessor(anotherAccessor);
if (type) {
accessorWithTypeAnnotation = anotherAccessor;
}
}
writeTypeOfDeclaration(node, type, getAccessorDeclarationTypeVisibilityError);
}
write(";");
writeLine();
}
function getTypeAnnotationFromAccessor(accessor) {
if (accessor) {
return accessor.kind === 137
? accessor.type
: accessor.parameters.length > 0
? accessor.parameters[0].type
: undefined;
}
}
function getAccessorDeclarationTypeVisibilityError(symbolAccesibilityResult) {
var diagnosticMessage;
if (accessorWithTypeAnnotation.kind === 138) {
if (accessorWithTypeAnnotation.parent.flags & 128) {
diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
ts.Diagnostics.Parameter_0_of_public_static_property_setter_from_exported_class_has_or_is_using_name_1_from_private_module_2 :
ts.Diagnostics.Parameter_0_of_public_static_property_setter_from_exported_class_has_or_is_using_private_name_1;
}
else {
diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
ts.Diagnostics.Parameter_0_of_public_property_setter_from_exported_class_has_or_is_using_name_1_from_private_module_2 :
ts.Diagnostics.Parameter_0_of_public_property_setter_from_exported_class_has_or_is_using_private_name_1;
}
return {
diagnosticMessage: diagnosticMessage,
errorNode: accessorWithTypeAnnotation.parameters[0],
typeName: accessorWithTypeAnnotation.name
};
}
else {
if (accessorWithTypeAnnotation.flags & 128) {
diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
symbolAccesibilityResult.accessibility === 2 ?
ts.Diagnostics.Return_type_of_public_static_property_getter_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named :
ts.Diagnostics.Return_type_of_public_static_property_getter_from_exported_class_has_or_is_using_name_0_from_private_module_1 :
ts.Diagnostics.Return_type_of_public_static_property_getter_from_exported_class_has_or_is_using_private_name_0;
}
else {
diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
symbolAccesibilityResult.accessibility === 2 ?
ts.Diagnostics.Return_type_of_public_property_getter_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named :
ts.Diagnostics.Return_type_of_public_property_getter_from_exported_class_has_or_is_using_name_0_from_private_module_1 :
ts.Diagnostics.Return_type_of_public_property_getter_from_exported_class_has_or_is_using_private_name_0;
}
return {
diagnosticMessage: diagnosticMessage,
errorNode: accessorWithTypeAnnotation.name,
typeName: undefined
};
}
}
}
function writeFunctionDeclaration(node) {
if (ts.hasDynamicName(node)) {
return;
}
if (!resolver.isImplementationOfOverload(node)) {
emitJsDocComments(node);
if (node.kind === 201) {
emitModuleElementDeclarationFlags(node);
}
else if (node.kind === 135) {
emitClassMemberDeclarationFlags(node);
}
if (node.kind === 201) {
write("function ");
writeTextOfNode(currentSourceFile, node.name);
}
else if (node.kind === 136) {
write("constructor");
}
else {
writeTextOfNode(currentSourceFile, node.name);
if (ts.hasQuestionToken(node)) {
write("?");
}
}
emitSignatureDeclaration(node);
}
}
function emitSignatureDeclarationWithJsDocComments(node) {
emitJsDocComments(node);
emitSignatureDeclaration(node);
}
function emitSignatureDeclaration(node) {
if (node.kind === 140 || node.kind === 144) {
write("new ");
}
emitTypeParameters(node.typeParameters);
if (node.kind === 141) {
write("[");
}
else {
write("(");
}
var prevEnclosingDeclaration = enclosingDeclaration;
enclosingDeclaration = node;
emitCommaList(node.parameters, emitParameterDeclaration);
if (node.kind === 141) {
write("]");
}
else {
write(")");
}
var isFunctionTypeOrConstructorType = node.kind === 143 || node.kind === 144;
if (isFunctionTypeOrConstructorType || node.parent.kind === 146) {
if (node.type) {
write(isFunctionTypeOrConstructorType ? " => " : ": ");
emitType(node.type);
}
}
else if (node.kind !== 136 && !(node.flags & 32)) {
writeReturnTypeAtSignature(node, getReturnTypeVisibilityError);
}
enclosingDeclaration = prevEnclosingDeclaration;
if (!isFunctionTypeOrConstructorType) {
write(";");
writeLine();
}
function getReturnTypeVisibilityError(symbolAccesibilityResult) {
var diagnosticMessage;
switch (node.kind) {
case 140:
diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
ts.Diagnostics.Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 :
ts.Diagnostics.Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_0;
break;
case 139:
diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
ts.Diagnostics.Return_type_of_call_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 :
ts.Diagnostics.Return_type_of_call_signature_from_exported_interface_has_or_is_using_private_name_0;
break;
case 141:
diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
ts.Diagnostics.Return_type_of_index_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 :
ts.Diagnostics.Return_type_of_index_signature_from_exported_interface_has_or_is_using_private_name_0;
break;
case 135:
case 134:
if (node.flags & 128) {
diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
symbolAccesibilityResult.accessibility === 2 ?
ts.Diagnostics.Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named :
ts.Diagnostics.Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_private_module_1 :
ts.Diagnostics.Return_type_of_public_static_method_from_exported_class_has_or_is_using_private_name_0;
}
else if (node.parent.kind === 202) {
diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
symbolAccesibilityResult.accessibility === 2 ?
ts.Diagnostics.Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named :
ts.Diagnostics.Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_private_module_1 :
ts.Diagnostics.Return_type_of_public_method_from_exported_class_has_or_is_using_private_name_0;
}
else {
diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
ts.Diagnostics.Return_type_of_method_from_exported_interface_has_or_is_using_name_0_from_private_module_1 :
ts.Diagnostics.Return_type_of_method_from_exported_interface_has_or_is_using_private_name_0;
}
break;
case 201:
diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
symbolAccesibilityResult.accessibility === 2 ?
ts.Diagnostics.Return_type_of_exported_function_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named :
ts.Diagnostics.Return_type_of_exported_function_has_or_is_using_name_0_from_private_module_1 :
ts.Diagnostics.Return_type_of_exported_function_has_or_is_using_private_name_0;
break;
default:
ts.Debug.fail("This is unknown kind for signature: " + node.kind);
}
return {
diagnosticMessage: diagnosticMessage,
errorNode: node.name || node
};
}
}
function emitParameterDeclaration(node) {
increaseIndent();
emitJsDocComments(node);
if (node.dotDotDotToken) {
write("...");
}
if (ts.isBindingPattern(node.name)) {
emitBindingPattern(node.name);
}
else {
writeTextOfNode(currentSourceFile, node.name);
}
if (node.initializer || ts.hasQuestionToken(node)) {
write("?");
}
decreaseIndent();
if (node.parent.kind === 143 ||
node.parent.kind === 144 ||
node.parent.parent.kind === 146) {
emitTypeOfVariableDeclarationFromTypeLiteral(node);
}
else if (!(node.parent.flags & 32)) {
writeTypeOfDeclaration(node, node.type, getParameterDeclarationTypeVisibilityError);
}
function getParameterDeclarationTypeVisibilityError(symbolAccesibilityResult) {
var diagnosticMessage = getParameterDeclarationTypeVisibilityDiagnosticMessage(symbolAccesibilityResult);
return diagnosticMessage !== undefined ? {
diagnosticMessage: diagnosticMessage,
errorNode: node,
typeName: node.name
} : undefined;
}
function getParameterDeclarationTypeVisibilityDiagnosticMessage(symbolAccesibilityResult) {
switch (node.parent.kind) {
case 136:
return symbolAccesibilityResult.errorModuleName ?
symbolAccesibilityResult.accessibility === 2 ?
ts.Diagnostics.Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
ts.Diagnostics.Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_private_module_2 :
ts.Diagnostics.Parameter_0_of_constructor_from_exported_class_has_or_is_using_private_name_1;
case 140:
return symbolAccesibilityResult.errorModuleName ?
ts.Diagnostics.Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2 :
ts.Diagnostics.Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1;
case 139:
return symbolAccesibilityResult.errorModuleName ?
ts.Diagnostics.Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2 :
ts.Diagnostics.Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1;
case 135:
case 134:
if (node.parent.flags & 128) {
return symbolAccesibilityResult.errorModuleName ?
symbolAccesibilityResult.accessibility === 2 ?
ts.Diagnostics.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
ts.Diagnostics.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_private_module_2 :
ts.Diagnostics.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1;
}
else if (node.parent.parent.kind === 202) {
return symbolAccesibilityResult.errorModuleName ?
symbolAccesibilityResult.accessibility === 2 ?
ts.Diagnostics.Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
ts.Diagnostics.Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_private_module_2 :
ts.Diagnostics.Parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1;
}
else {
return symbolAccesibilityResult.errorModuleName ?
ts.Diagnostics.Parameter_0_of_method_from_exported_interface_has_or_is_using_name_1_from_private_module_2 :
ts.Diagnostics.Parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1;
}
case 201:
return symbolAccesibilityResult.errorModuleName ?
symbolAccesibilityResult.accessibility === 2 ?
ts.Diagnostics.Parameter_0_of_exported_function_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
ts.Diagnostics.Parameter_0_of_exported_function_has_or_is_using_name_1_from_private_module_2 :
ts.Diagnostics.Parameter_0_of_exported_function_has_or_is_using_private_name_1;
default:
ts.Debug.fail("This is unknown parent for parameter: " + node.parent.kind);
}
}
function emitBindingPattern(bindingPattern) {
if (bindingPattern.kind === 151) {
write("{");
emitCommaList(bindingPattern.elements, emitBindingElement);
write("}");
}
else if (bindingPattern.kind === 152) {
write("[");
var elements = bindingPattern.elements;
emitCommaList(elements, emitBindingElement);
if (elements && elements.hasTrailingComma) {
write(", ");
}
write("]");
}
}
function emitBindingElement(bindingElement) {
function getBindingElementTypeVisibilityError(symbolAccesibilityResult) {
var diagnosticMessage = getParameterDeclarationTypeVisibilityDiagnosticMessage(symbolAccesibilityResult);
return diagnosticMessage !== undefined ? {
diagnosticMessage: diagnosticMessage,
errorNode: bindingElement,
typeName: bindingElement.name
} : undefined;
}
if (bindingElement.kind === 176) {
write(" ");
}
else if (bindingElement.kind === 153) {
if (bindingElement.propertyName) {
writeTextOfNode(currentSourceFile, bindingElement.propertyName);
write(": ");
emitBindingPattern(bindingElement.name);
}
else if (bindingElement.name) {
if (ts.isBindingPattern(bindingElement.name)) {
emitBindingPattern(bindingElement.name);
}
else {
ts.Debug.assert(bindingElement.name.kind === 65);
if (bindingElement.dotDotDotToken) {
write("...");
}
writeTextOfNode(currentSourceFile, bindingElement.name);
}
}
}
}
}
function emitNode(node) {
switch (node.kind) {
case 201:
case 206:
case 209:
case 203:
case 202:
case 204:
case 205:
return emitModuleElement(node, isModuleElementVisible(node));
case 181:
return emitModuleElement(node, isVariableStatementVisible(node));
case 210:
return emitModuleElement(node, !node.importClause);
case 216:
return emitExportDeclaration(node);
case 136:
case 135:
case 134:
return writeFunctionDeclaration(node);
case 140:
case 139:
case 141:
return emitSignatureDeclarationWithJsDocComments(node);
case 137:
case 138:
return emitAccessorDeclaration(node);
case 133:
case 132:
return emitPropertyDeclaration(node);
case 227:
return emitEnumMemberDeclaration(node);
case 215:
return emitExportAssignment(node);
case 228:
return emitSourceFile(node);
}
}
function writeReferencePath(referencedFile) {
var declFileName = referencedFile.flags & 2048
? referencedFile.fileName
: ts.shouldEmitToOwnFile(referencedFile, compilerOptions)
? ts.getOwnEmitOutputFilePath(referencedFile, host, ".d.ts")
: ts.removeFileExtension(compilerOptions.out) + ".d.ts";
declFileName = ts.getRelativePathToDirectoryOrUrl(ts.getDirectoryPath(ts.normalizeSlashes(jsFilePath)), declFileName, host.getCurrentDirectory(), host.getCanonicalFileName, false);
referencePathsOutput += "/// <reference path=\"" + declFileName + "\" />" + newLine;
}
}
function writeDeclarationFile(jsFilePath, sourceFile, host, resolver, diagnostics) {
var emitDeclarationResult = emitDeclarations(host, resolver, diagnostics, jsFilePath, sourceFile);
if (!emitDeclarationResult.reportedDeclarationError) {
var declarationOutput = emitDeclarationResult.referencePathsOutput
+ getDeclarationOutput(emitDeclarationResult.synchronousDeclarationOutput, emitDeclarationResult.moduleElementDeclarationEmitInfo);
ts.writeFile(host, diagnostics, ts.removeFileExtension(jsFilePath) + ".d.ts", declarationOutput, host.getCompilerOptions().emitBOM);
}
function getDeclarationOutput(synchronousDeclarationOutput, moduleElementDeclarationEmitInfo) {
var appliedSyncOutputPos = 0;
var declarationOutput = "";
ts.forEach(moduleElementDeclarationEmitInfo, function (aliasEmitInfo) {
if (aliasEmitInfo.asynchronousOutput) {
declarationOutput += synchronousDeclarationOutput.substring(appliedSyncOutputPos, aliasEmitInfo.outputPos);
declarationOutput += getDeclarationOutput(aliasEmitInfo.asynchronousOutput, aliasEmitInfo.subModuleElementDeclarationEmitInfo);
appliedSyncOutputPos = aliasEmitInfo.outputPos;
}
});
declarationOutput += synchronousDeclarationOutput.substring(appliedSyncOutputPos);
return declarationOutput;
}
}
ts.writeDeclarationFile = writeDeclarationFile;
})(ts || (ts = {}));
/// <reference path="checker.ts"/>
/// <reference path="declarationEmitter.ts"/>
var ts;
(function (ts) {
function isExternalModuleOrDeclarationFile(sourceFile) {
return ts.isExternalModule(sourceFile) || ts.isDeclarationFile(sourceFile);
}
ts.isExternalModuleOrDeclarationFile = isExternalModuleOrDeclarationFile;
function emitFiles(resolver, host, targetSourceFile) {
var extendsHelper = "\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n __.prototype = b.prototype;\n d.prototype = new __();\n};";
var decorateHelper = "\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") return Reflect.decorate(decorators, target, key, desc);\n switch (arguments.length) {\n case 2: return decorators.reduceRight(function(o, d) { return (d && d(o)) || o; }, target);\n case 3: return decorators.reduceRight(function(o, d) { return (d && d(target, key)), void 0; }, void 0);\n case 4: return decorators.reduceRight(function(o, d) { return (d && d(target, key, o)) || o; }, desc);\n }\n};";
var metadataHelper = "\nvar __metadata = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};";
var paramHelper = "\nvar __param = (this && this.__param) || function (paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n};";
var compilerOptions = host.getCompilerOptions();
var languageVersion = compilerOptions.target || 0;
var sourceMapDataList = compilerOptions.sourceMap || compilerOptions.inlineSourceMap ? [] : undefined;
var diagnostics = [];
var newLine = host.getNewLine();
if (targetSourceFile === undefined) {
ts.forEach(host.getSourceFiles(), function (sourceFile) {
if (ts.shouldEmitToOwnFile(sourceFile, compilerOptions)) {
var jsFilePath = ts.getOwnEmitOutputFilePath(sourceFile, host, ".js");
emitFile(jsFilePath, sourceFile);
}
});
if (compilerOptions.out) {
emitFile(compilerOptions.out);
}
}
else {
if (ts.shouldEmitToOwnFile(targetSourceFile, compilerOptions)) {
var jsFilePath = ts.getOwnEmitOutputFilePath(targetSourceFile, host, ".js");
emitFile(jsFilePath, targetSourceFile);
}
else if (!ts.isDeclarationFile(targetSourceFile) && compilerOptions.out) {
emitFile(compilerOptions.out);
}
}
diagnostics = ts.sortAndDeduplicateDiagnostics(diagnostics);
return {
emitSkipped: false,
diagnostics: diagnostics,
sourceMaps: sourceMapDataList
};
function isNodeDescendentOf(node, ancestor) {
while (node) {
if (node === ancestor)
return true;
node = node.parent;
}
return false;
}
function isUniqueLocalName(name, container) {
for (var node = container; isNodeDescendentOf(node, container); node = node.nextContainer) {
if (node.locals && ts.hasProperty(node.locals, name)) {
if (node.locals[name].flags & (107455 | 1048576 | 8388608)) {
return false;
}
}
}
return true;
}
function emitJavaScript(jsFilePath, root) {
var writer = ts.createTextWriter(newLine);
var write = writer.write;
var writeTextOfNode = writer.writeTextOfNode;
var writeLine = writer.writeLine;
var increaseIndent = writer.increaseIndent;
var decreaseIndent = writer.decreaseIndent;
var currentSourceFile;
var exportFunctionForFile;
var generatedNameSet = {};
var nodeToGeneratedName = [];
var blockScopedVariableToGeneratedName;
var computedPropertyNamesToGeneratedNames;
var extendsEmitted = false;
var decorateEmitted = false;
var paramEmitted = false;
var tempFlags = 0;
var tempVariables;
var tempParameters;
var externalImports;
var exportSpecifiers;
var exportEquals;
var hasExportStars;
var writeEmittedFiles = writeJavaScriptFile;
var detachedCommentsInfo;
var writeComment = ts.writeCommentRange;
var emit = emitNodeWithoutSourceMap;
var emitStart = function (node) { };
var emitEnd = function (node) { };
var emitToken = emitTokenText;
var scopeEmitStart = function (scopeDeclaration, scopeName) { };
var scopeEmitEnd = function () { };
var sourceMapData;
if (compilerOptions.sourceMap || compilerOptions.inlineSourceMap) {
initializeEmitterWithSourceMaps();
}
if (root) {
emitSourceFile(root);
}
else {
ts.forEach(host.getSourceFiles(), function (sourceFile) {
if (!isExternalModuleOrDeclarationFile(sourceFile)) {
emitSourceFile(sourceFile);
}
});
}
writeLine();
writeEmittedFiles(writer.getText(), compilerOptions.emitBOM);
return;
function emitSourceFile(sourceFile) {
currentSourceFile = sourceFile;
exportFunctionForFile = undefined;
emit(sourceFile);
}
function isUniqueName(name) {
return !resolver.hasGlobalName(name) &&
!ts.hasProperty(currentSourceFile.identifiers, name) &&
!ts.hasProperty(generatedNameSet, name);
}
function makeTempVariableName(flags) {
if (flags && !(tempFlags & flags)) {
var name = flags === 268435456 ? "_i" : "_n";
if (isUniqueName(name)) {
tempFlags |= flags;
return name;
}
}
while (true) {
var count = tempFlags & 268435455;
tempFlags++;
if (count !== 8 && count !== 13) {
var name_15 = count < 26 ? "_" + String.fromCharCode(97 + count) : "_" + (count - 26);
if (isUniqueName(name_15)) {
return name_15;
}
}
}
}
function makeUniqueName(baseName) {
if (baseName.charCodeAt(baseName.length - 1) !== 95) {
baseName += "_";
}
var i = 1;
while (true) {
var generatedName = baseName + i;
if (isUniqueName(generatedName)) {
return generatedNameSet[generatedName] = generatedName;
}
i++;
}
}
function assignGeneratedName(node, name) {
nodeToGeneratedName[ts.getNodeId(node)] = ts.unescapeIdentifier(name);
}
function generateNameForFunctionOrClassDeclaration(node) {
if (!node.name) {
assignGeneratedName(node, makeUniqueName("default"));
}
}
function generateNameForModuleOrEnum(node) {
if (node.name.kind === 65) {
var name_16 = node.name.text;
assignGeneratedName(node, isUniqueLocalName(name_16, node) ? name_16 : makeUniqueName(name_16));
}
}
function generateNameForImportOrExportDeclaration(node) {
var expr = ts.getExternalModuleName(node);
var baseName = expr.kind === 8 ?
ts.escapeIdentifier(ts.makeIdentifierFromModuleName(expr.text)) : "module";
assignGeneratedName(node, makeUniqueName(baseName));
}
function generateNameForImportDeclaration(node) {
if (node.importClause) {
generateNameForImportOrExportDeclaration(node);
}
}
function generateNameForExportDeclaration(node) {
if (node.moduleSpecifier) {
generateNameForImportOrExportDeclaration(node);
}
}
function generateNameForExportAssignment(node) {
if (node.expression && node.expression.kind !== 65) {
assignGeneratedName(node, makeUniqueName("default"));
}
}
function generateNameForNode(node) {
switch (node.kind) {
case 201:
case 202:
case 175:
generateNameForFunctionOrClassDeclaration(node);
break;
case 206:
generateNameForModuleOrEnum(node);
generateNameForNode(node.body);
break;
case 205:
generateNameForModuleOrEnum(node);
break;
case 210:
generateNameForImportDeclaration(node);
break;
case 216:
generateNameForExportDeclaration(node);
break;
case 215:
generateNameForExportAssignment(node);
break;
}
}
function getGeneratedNameForNode(node) {
var nodeId = ts.getNodeId(node);
if (!nodeToGeneratedName[nodeId]) {
generateNameForNode(node);
}
return nodeToGeneratedName[nodeId];
}
function initializeEmitterWithSourceMaps() {
var sourceMapDir;
var sourceMapSourceIndex = -1;
var sourceMapNameIndexMap = {};
var sourceMapNameIndices = [];
function getSourceMapNameIndex() {
return sourceMapNameIndices.length ? ts.lastOrUndefined(sourceMapNameIndices) : -1;
}
var lastRecordedSourceMapSpan;
var lastEncodedSourceMapSpan = {
emittedLine: 1,
emittedColumn: 1,
sourceLine: 1,
sourceColumn: 1,
sourceIndex: 0
};
var lastEncodedNameIndex = 0;
function encodeLastRecordedSourceMapSpan() {
if (!lastRecordedSourceMapSpan || lastRecordedSourceMapSpan === lastEncodedSourceMapSpan) {
return;
}
var prevEncodedEmittedColumn = lastEncodedSourceMapSpan.emittedColumn;
if (lastEncodedSourceMapSpan.emittedLine == lastRecordedSourceMapSpan.emittedLine) {
if (sourceMapData.sourceMapMappings) {
sourceMapData.sourceMapMappings += ",";
}
}
else {
for (var encodedLine = lastEncodedSourceMapSpan.emittedLine; encodedLine < lastRecordedSourceMapSpan.emittedLine; encodedLine++) {
sourceMapData.sourceMapMappings += ";";
}
prevEncodedEmittedColumn = 1;
}
sourceMapData.sourceMapMappings += base64VLQFormatEncode(lastRecordedSourceMapSpan.emittedColumn - prevEncodedEmittedColumn);
sourceMapData.sourceMapMappings += base64VLQFormatEncode(lastRecordedSourceMapSpan.sourceIndex - lastEncodedSourceMapSpan.sourceIndex);
sourceMapData.sourceMapMappings += base64VLQFormatEncode(lastRecordedSourceMapSpan.sourceLine - lastEncodedSourceMapSpan.sourceLine);
sourceMapData.sourceMapMappings += base64VLQFormatEncode(lastRecordedSourceMapSpan.sourceColumn - lastEncodedSourceMapSpan.sourceColumn);
if (lastRecordedSourceMapSpan.nameIndex >= 0) {
sourceMapData.sourceMapMappings += base64VLQFormatEncode(lastRecordedSourceMapSpan.nameIndex - lastEncodedNameIndex);
lastEncodedNameIndex = lastRecordedSourceMapSpan.nameIndex;
}
lastEncodedSourceMapSpan = lastRecordedSourceMapSpan;
sourceMapData.sourceMapDecodedMappings.push(lastEncodedSourceMapSpan);
function base64VLQFormatEncode(inValue) {
function base64FormatEncode(inValue) {
if (inValue < 64) {
return 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.charAt(inValue);
}
throw TypeError(inValue + ": not a 64 based value");
}
if (inValue < 0) {
inValue = ((-inValue) << 1) + 1;
}
else {
inValue = inValue << 1;
}
var encodedStr = "";
do {
var currentDigit = inValue & 31;
inValue = inValue >> 5;
if (inValue > 0) {
currentDigit = currentDigit | 32;
}
encodedStr = encodedStr + base64FormatEncode(currentDigit);
} while (inValue > 0);
return encodedStr;
}
}
function recordSourceMapSpan(pos) {
var sourceLinePos = ts.getLineAndCharacterOfPosition(currentSourceFile, pos);
sourceLinePos.line++;
sourceLinePos.character++;
var emittedLine = writer.getLine();
var emittedColumn = writer.getColumn();
if (!lastRecordedSourceMapSpan ||
lastRecordedSourceMapSpan.emittedLine != emittedLine ||
lastRecordedSourceMapSpan.emittedColumn != emittedColumn ||
(lastRecordedSourceMapSpan.sourceIndex === sourceMapSourceIndex &&
(lastRecordedSourceMapSpan.sourceLine > sourceLinePos.line ||
(lastRecordedSourceMapSpan.sourceLine === sourceLinePos.line && lastRecordedSourceMapSpan.sourceColumn > sourceLinePos.character)))) {
encodeLastRecordedSourceMapSpan();
lastRecordedSourceMapSpan = {
emittedLine: emittedLine,
emittedColumn: emittedColumn,
sourceLine: sourceLinePos.line,
sourceColumn: sourceLinePos.character,
nameIndex: getSourceMapNameIndex(),
sourceIndex: sourceMapSourceIndex
};
}
else {
lastRecordedSourceMapSpan.sourceLine = sourceLinePos.line;
lastRecordedSourceMapSpan.sourceColumn = sourceLinePos.character;
lastRecordedSourceMapSpan.sourceIndex = sourceMapSourceIndex;
}
}
function recordEmitNodeStartSpan(node) {
recordSourceMapSpan(ts.skipTrivia(currentSourceFile.text, node.pos));
}
function recordEmitNodeEndSpan(node) {
recordSourceMapSpan(node.end);
}
function writeTextWithSpanRecord(tokenKind, startPos, emitFn) {
var tokenStartPos = ts.skipTrivia(currentSourceFile.text, startPos);
recordSourceMapSpan(tokenStartPos);
var tokenEndPos = emitTokenText(tokenKind, tokenStartPos, emitFn);
recordSourceMapSpan(tokenEndPos);
return tokenEndPos;
}
function recordNewSourceFileStart(node) {
var sourcesDirectoryPath = compilerOptions.sourceRoot ? host.getCommonSourceDirectory() : sourceMapDir;
sourceMapData.sourceMapSources.push(ts.getRelativePathToDirectoryOrUrl(sourcesDirectoryPath, node.fileName, host.getCurrentDirectory(), host.getCanonicalFileName, true));
sourceMapSourceIndex = sourceMapData.sourceMapSources.length - 1;
sourceMapData.inputSourceFileNames.push(node.fileName);
if (compilerOptions.inlineSources) {
if (!sourceMapData.sourceMapSourcesContent) {
sourceMapData.sourceMapSourcesContent = [];
}
sourceMapData.sourceMapSourcesContent.push(node.text);
}
}
function recordScopeNameOfNode(node, scopeName) {
function recordScopeNameIndex(scopeNameIndex) {
sourceMapNameIndices.push(scopeNameIndex);
}
function recordScopeNameStart(scopeName) {
var scopeNameIndex = -1;
if (scopeName) {
var parentIndex = getSourceMapNameIndex();
if (parentIndex !== -1) {
var name_17 = node.name;
if (!name_17 || name_17.kind !== 128) {
scopeName = "." + scopeName;
}
scopeName = sourceMapData.sourceMapNames[parentIndex] + scopeName;
}
scopeNameIndex = ts.getProperty(sourceMapNameIndexMap, scopeName);
if (scopeNameIndex === undefined) {
scopeNameIndex = sourceMapData.sourceMapNames.length;
sourceMapData.sourceMapNames.push(scopeName);
sourceMapNameIndexMap[scopeName] = scopeNameIndex;
}
}
recordScopeNameIndex(scopeNameIndex);
}
if (scopeName) {
recordScopeNameStart(scopeName);
}
else if (node.kind === 201 ||
node.kind === 163 ||
node.kind === 135 ||
node.kind === 134 ||
node.kind === 137 ||
node.kind === 138 ||
node.kind === 206 ||
node.kind === 202 ||
node.kind === 205) {
if (node.name) {
var name_18 = node.name;
scopeName = name_18.kind === 128
? ts.getTextOfNode(name_18)
: node.name.text;
}
recordScopeNameStart(scopeName);
}
else {
recordScopeNameIndex(getSourceMapNameIndex());
}
}
function recordScopeNameEnd() {
sourceMapNameIndices.pop();
}
;
function writeCommentRangeWithMap(curentSourceFile, writer, comment, newLine) {
recordSourceMapSpan(comment.pos);
ts.writeCommentRange(currentSourceFile, writer, comment, newLine);
recordSourceMapSpan(comment.end);
}
function serializeSourceMapContents(version, file, sourceRoot, sources, names, mappings, sourcesContent) {
if (typeof JSON !== "undefined") {
var map_1 = {
version: version,
file: file,
sourceRoot: sourceRoot,
sources: sources,
names: names,
mappings: mappings
};
if (sourcesContent !== undefined) {
map_1.sourcesContent = sourcesContent;
}
return JSON.stringify(map_1);
}
return "{\"version\":" + version + ",\"file\":\"" + ts.escapeString(file) + "\",\"sourceRoot\":\"" + ts.escapeString(sourceRoot) + "\",\"sources\":[" + serializeStringArray(sources) + "],\"names\":[" + serializeStringArray(names) + "],\"mappings\":\"" + ts.escapeString(mappings) + "\" " + (sourcesContent !== undefined ? ",\"sourcesContent\":[" + serializeStringArray(sourcesContent) + "]" : "") + "}";
function serializeStringArray(list) {
var output = "";
for (var i = 0, n = list.length; i < n; i++) {
if (i) {
output += ",";
}
output += "\"" + ts.escapeString(list[i]) + "\"";
}
return output;
}
}
function writeJavaScriptAndSourceMapFile(emitOutput, writeByteOrderMark) {
encodeLastRecordedSourceMapSpan();
var sourceMapText = serializeSourceMapContents(3, sourceMapData.sourceMapFile, sourceMapData.sourceMapSourceRoot, sourceMapData.sourceMapSources, sourceMapData.sourceMapNames, sourceMapData.sourceMapMappings, sourceMapData.sourceMapSourcesContent);
sourceMapDataList.push(sourceMapData);
var sourceMapUrl;
if (compilerOptions.inlineSourceMap) {
var base64SourceMapText = ts.convertToBase64(sourceMapText);
sourceMapUrl = "//# sourceMappingURL=data:application/json;base64," + base64SourceMapText;
}
else {
ts.writeFile(host, diagnostics, sourceMapData.sourceMapFilePath, sourceMapText, false);
sourceMapUrl = "//# sourceMappingURL=" + sourceMapData.jsSourceMappingURL;
}
writeJavaScriptFile(emitOutput + sourceMapUrl, writeByteOrderMark);
}
var sourceMapJsFile = ts.getBaseFileName(ts.normalizeSlashes(jsFilePath));
sourceMapData = {
sourceMapFilePath: jsFilePath + ".map",
jsSourceMappingURL: sourceMapJsFile + ".map",
sourceMapFile: sourceMapJsFile,
sourceMapSourceRoot: compilerOptions.sourceRoot || "",
sourceMapSources: [],
inputSourceFileNames: [],
sourceMapNames: [],
sourceMapMappings: "",
sourceMapSourcesContent: undefined,
sourceMapDecodedMappings: []
};
sourceMapData.sourceMapSourceRoot = ts.normalizeSlashes(sourceMapData.sourceMapSourceRoot);
if (sourceMapData.sourceMapSourceRoot.length && sourceMapData.sourceMapSourceRoot.charCodeAt(sourceMapData.sourceMapSourceRoot.length - 1) !== 47) {
sourceMapData.sourceMapSourceRoot += ts.directorySeparator;
}
if (compilerOptions.mapRoot) {
sourceMapDir = ts.normalizeSlashes(compilerOptions.mapRoot);
if (root) {
sourceMapDir = ts.getDirectoryPath(ts.getSourceFilePathInNewDir(root, host, sourceMapDir));
}
if (!ts.isRootedDiskPath(sourceMapDir) && !ts.isUrl(sourceMapDir)) {
sourceMapDir = ts.combinePaths(host.getCommonSourceDirectory(), sourceMapDir);
sourceMapData.jsSourceMappingURL = ts.getRelativePathToDirectoryOrUrl(ts.getDirectoryPath(ts.normalizePath(jsFilePath)), ts.combinePaths(sourceMapDir, sourceMapData.jsSourceMappingURL), host.getCurrentDirectory(), host.getCanonicalFileName, true);
}
else {
sourceMapData.jsSourceMappingURL = ts.combinePaths(sourceMapDir, sourceMapData.jsSourceMappingURL);
}
}
else {
sourceMapDir = ts.getDirectoryPath(ts.normalizePath(jsFilePath));
}
function emitNodeWithSourceMap(node, allowGeneratedIdentifiers) {
if (node) {
if (ts.nodeIsSynthesized(node)) {
return emitNodeWithoutSourceMap(node, false);
}
if (node.kind != 228) {
recordEmitNodeStartSpan(node);
emitNodeWithoutSourceMap(node, allowGeneratedIdentifiers);
recordEmitNodeEndSpan(node);
}
else {
recordNewSourceFileStart(node);
emitNodeWithoutSourceMap(node, false);
}
}
}
writeEmittedFiles = writeJavaScriptAndSourceMapFile;
emit = emitNodeWithSourceMap;
emitStart = recordEmitNodeStartSpan;
emitEnd = recordEmitNodeEndSpan;
emitToken = writeTextWithSpanRecord;
scopeEmitStart = recordScopeNameOfNode;
scopeEmitEnd = recordScopeNameEnd;
writeComment = writeCommentRangeWithMap;
}
function writeJavaScriptFile(emitOutput, writeByteOrderMark) {
ts.writeFile(host, diagnostics, jsFilePath, emitOutput, writeByteOrderMark);
}
function createTempVariable(flags) {
var result = ts.createSynthesizedNode(65);
result.text = makeTempVariableName(flags);
return result;
}
function recordTempDeclaration(name) {
if (!tempVariables) {
tempVariables = [];
}
tempVariables.push(name);
}
function createAndRecordTempVariable(flags) {
var temp = createTempVariable(flags);
recordTempDeclaration(temp);
return temp;
}
function emitTempDeclarations(newLine) {
if (tempVariables) {
if (newLine) {
writeLine();
}
else {
write(" ");
}
write("var ");
emitCommaList(tempVariables);
write(";");
}
}
function emitTokenText(tokenKind, startPos, emitFn) {
var tokenString = ts.tokenToString(tokenKind);
if (emitFn) {
emitFn();
}
else {
write(tokenString);
}
return startPos + tokenString.length;
}
function emitOptional(prefix, node) {
if (node) {
write(prefix);
emit(node);
}
}
function emitParenthesizedIf(node, parenthesized) {
if (parenthesized) {
write("(");
}
emit(node);
if (parenthesized) {
write(")");
}
}
function emitTrailingCommaIfPresent(nodeList) {
if (nodeList.hasTrailingComma) {
write(",");
}
}
function emitLinePreservingList(parent, nodes, allowTrailingComma, spacesBetweenBraces) {
ts.Debug.assert(nodes.length > 0);
increaseIndent();
if (nodeStartPositionsAreOnSameLine(parent, nodes[0])) {
if (spacesBetweenBraces) {
write(" ");
}
}
else {
writeLine();
}
for (var i = 0, n = nodes.length; i < n; i++) {
if (i) {
if (nodeEndIsOnSameLineAsNodeStart(nodes[i - 1], nodes[i])) {
write(", ");
}
else {
write(",");
writeLine();
}
}
emit(nodes[i]);
}
if (nodes.hasTrailingComma && allowTrailingComma) {
write(",");
}
decreaseIndent();
if (nodeEndPositionsAreOnSameLine(parent, ts.lastOrUndefined(nodes))) {
if (spacesBetweenBraces) {
write(" ");
}
}
else {
writeLine();
}
}
function emitList(nodes, start, count, multiLine, trailingComma, leadingComma, noTrailingNewLine, emitNode) {
if (!emitNode) {
emitNode = emit;
}
for (var i = 0; i < count; i++) {
if (multiLine) {
if (i || leadingComma) {
write(",");
}
writeLine();
}
else {
if (i || leadingComma) {
write(", ");
}
}
emitNode(nodes[start + i]);
leadingComma = true;
}
if (trailingComma) {
write(",");
}
if (multiLine && !noTrailingNewLine) {
writeLine();
}
return count;
}
function emitCommaList(nodes) {
if (nodes) {
emitList(nodes, 0, nodes.length, false, false);
}
}
function emitLines(nodes) {
emitLinesStartingAt(nodes, 0);
}
function emitLinesStartingAt(nodes, startIndex) {
for (var i = startIndex; i < nodes.length; i++) {
writeLine();
emit(nodes[i]);
}
}
function isBinaryOrOctalIntegerLiteral(node, text) {
if (node.kind === 7 && text.length > 1) {
switch (text.charCodeAt(1)) {
case 98:
case 66:
case 111:
case 79:
return true;
}
}
return false;
}
function emitLiteral(node) {
var text = getLiteralText(node);
if ((compilerOptions.sourceMap || compilerOptions.inlineSourceMap) && (node.kind === 8 || ts.isTemplateLiteralKind(node.kind))) {
writer.writeLiteral(text);
}
else if (languageVersion < 2 && isBinaryOrOctalIntegerLiteral(node, text)) {
write(node.text);
}
else {
write(text);
}
}
function getLiteralText(node) {
if (languageVersion < 2 && (ts.isTemplateLiteralKind(node.kind) || node.hasExtendedUnicodeEscape)) {
return getQuotedEscapedLiteralText('"', node.text, '"');
}
if (node.parent) {
return ts.getSourceTextOfNodeFromSourceFile(currentSourceFile, node);
}
switch (node.kind) {
case 8:
return getQuotedEscapedLiteralText('"', node.text, '"');
case 10:
return getQuotedEscapedLiteralText('`', node.text, '`');
case 11:
return getQuotedEscapedLiteralText('`', node.text, '${');
case 12:
return getQuotedEscapedLiteralText('}', node.text, '${');
case 13:
return getQuotedEscapedLiteralText('}', node.text, '`');
case 7:
return node.text;
}
ts.Debug.fail("Literal kind '" + node.kind + "' not accounted for.");
}
function getQuotedEscapedLiteralText(leftQuote, text, rightQuote) {
return leftQuote + ts.escapeNonAsciiCharacters(ts.escapeString(text)) + rightQuote;
}
function emitDownlevelRawTemplateLiteral(node) {
var text = ts.getSourceTextOfNodeFromSourceFile(currentSourceFile, node);
var isLast = node.kind === 10 || node.kind === 13;
text = text.substring(1, text.length - (isLast ? 1 : 2));
text = text.replace(/\r\n?/g, "\n");
text = ts.escapeString(text);
write('"' + text + '"');
}
function emitDownlevelTaggedTemplateArray(node, literalEmitter) {
write("[");
if (node.template.kind === 10) {
literalEmitter(node.template);
}
else {
literalEmitter(node.template.head);
ts.forEach(node.template.templateSpans, function (child) {
write(", ");
literalEmitter(child.literal);
});
}
write("]");
}
function emitDownlevelTaggedTemplate(node) {
var tempVariable = createAndRecordTempVariable(0);
write("(");
emit(tempVariable);
write(" = ");
emitDownlevelTaggedTemplateArray(node, emit);
write(", ");
emit(tempVariable);
write(".raw = ");
emitDownlevelTaggedTemplateArray(node, emitDownlevelRawTemplateLiteral);
write(", ");
emitParenthesizedIf(node.tag, needsParenthesisForPropertyAccessOrInvocation(node.tag));
write("(");
emit(tempVariable);
if (node.template.kind === 172) {
ts.forEach(node.template.templateSpans, function (templateSpan) {
write(", ");
var needsParens = templateSpan.expression.kind === 170
&& templateSpan.expression.operatorToken.kind === 23;
emitParenthesizedIf(templateSpan.expression, needsParens);
});
}
write("))");
}
function emitTemplateExpression(node) {
if (languageVersion >= 2) {
ts.forEachChild(node, emit);
return;
}
var emitOuterParens = ts.isExpression(node.parent)
&& templateNeedsParens(node, node.parent);
if (emitOuterParens) {
write("(");
}
var headEmitted = false;
if (shouldEmitTemplateHead()) {
emitLiteral(node.head);
headEmitted = true;
}
for (var i = 0, n = node.templateSpans.length; i < n; i++) {
var templateSpan = node.templateSpans[i];
var needsParens = templateSpan.expression.kind !== 162
&& comparePrecedenceToBinaryPlus(templateSpan.expression) !== 1;
if (i > 0 || headEmitted) {
write(" + ");
}
emitParenthesizedIf(templateSpan.expression, needsParens);
if (templateSpan.literal.text.length !== 0) {
write(" + ");
emitLiteral(templateSpan.literal);
}
}
if (emitOuterParens) {
write(")");
}
function shouldEmitTemplateHead() {
// If this expression has an empty head literal and the first template span has a non-empty
// literal, then emitting the empty head literal is not necessary.
// `${ foo } and ${ bar }`
// can be emitted as
// foo + " and " + bar
// This is because it is only required that one of the first two operands in the emit
// output must be a string literal, so that the other operand and all following operands
// are forced into strings.
//
// If the first template span has an empty literal, then the head must still be emitted.
// `${ foo }${ bar }`
// must still be emitted as
// "" + foo + bar
ts.Debug.assert(node.templateSpans.length !== 0);
return node.head.text.length !== 0 || node.templateSpans[0].literal.text.length === 0;
}
function templateNeedsParens(template, parent) {
switch (parent.kind) {
case 158:
case 159:
return parent.expression === template;
case 160:
case 162:
return false;
default:
return comparePrecedenceToBinaryPlus(parent) !== -1;
}
}
function comparePrecedenceToBinaryPlus(expression) {
switch (expression.kind) {
case 170:
switch (expression.operatorToken.kind) {
case 35:
case 36:
case 37:
return 1;
case 33:
case 34:
return 0;
default:
return -1;
}
case 173:
case 171:
return -1;
default:
return 1;
}
}
}
function emitTemplateSpan(span) {
emit(span.expression);
emit(span.literal);
}
function emitExpressionForPropertyName(node) {
ts.Debug.assert(node.kind !== 153);
if (node.kind === 8) {
emitLiteral(node);
}
else if (node.kind === 128) {
if (ts.nodeIsDecorated(node.parent)) {
if (!computedPropertyNamesToGeneratedNames) {
computedPropertyNamesToGeneratedNames = [];
}
var generatedName = computedPropertyNamesToGeneratedNames[ts.getNodeId(node)];
if (generatedName) {
write(generatedName);
return;
}
generatedName = createAndRecordTempVariable(0).text;
computedPropertyNamesToGeneratedNames[ts.getNodeId(node)] = generatedName;
write(generatedName);
write(" = ");
}
emit(node.expression);
}
else {
write("\"");
if (node.kind === 7) {
write(node.text);
}
else {
writeTextOfNode(currentSourceFile, node);
}
write("\"");
}
}
function isNotExpressionIdentifier(node) {
var parent = node.parent;
switch (parent.kind) {
case 130:
case 199:
case 153:
case 133:
case 132:
case 225:
case 226:
case 227:
case 135:
case 134:
case 201:
case 137:
case 138:
case 163:
case 202:
case 203:
case 205:
case 206:
case 209:
case 211:
case 212:
return parent.name === node;
case 214:
case 218:
return parent.name === node || parent.propertyName === node;
case 191:
case 190:
case 215:
return false;
case 195:
return node.parent.label === node;
}
}
function emitExpressionIdentifier(node) {
var substitution = resolver.getExpressionNameSubstitution(node, getGeneratedNameForNode);
if (substitution) {
write(substitution);
}
else {
writeTextOfNode(currentSourceFile, node);
}
}
function getGeneratedNameForIdentifier(node) {
if (ts.nodeIsSynthesized(node) || !blockScopedVariableToGeneratedName) {
return undefined;
}
var variableId = resolver.getBlockScopedVariableId(node);
if (variableId === undefined) {
return undefined;
}
return blockScopedVariableToGeneratedName[variableId];
}
function emitIdentifier(node, allowGeneratedIdentifiers) {
if (allowGeneratedIdentifiers) {
var generatedName = getGeneratedNameForIdentifier(node);
if (generatedName) {
write(generatedName);
return;
}
}
if (!node.parent) {
write(node.text);
}
else if (!isNotExpressionIdentifier(node)) {
emitExpressionIdentifier(node);
}
else {
writeTextOfNode(currentSourceFile, node);
}
}
function emitThis(node) {
if (resolver.getNodeCheckFlags(node) & 2) {
write("_this");
}
else {
write("this");
}
}
function emitSuper(node) {
if (languageVersion >= 2) {
write("super");
}
else {
var flags = resolver.getNodeCheckFlags(node);
if (flags & 16) {
write("_super.prototype");
}
else {
write("_super");
}
}
}
function emitObjectBindingPattern(node) {
write("{ ");
var elements = node.elements;
emitList(elements, 0, elements.length, false, elements.hasTrailingComma);
write(" }");
}
function emitArrayBindingPattern(node) {
write("[");
var elements = node.elements;
emitList(elements, 0, elements.length, false, elements.hasTrailingComma);
write("]");
}
function emitBindingElement(node) {
if (node.propertyName) {
emit(node.propertyName, false);
write(": ");
}
if (node.dotDotDotToken) {
write("...");
}
if (ts.isBindingPattern(node.name)) {
emit(node.name);
}
else {
emitModuleMemberName(node);
}
emitOptional(" = ", node.initializer);
}
function emitSpreadElementExpression(node) {
write("...");
emit(node.expression);
}
function emitYieldExpression(node) {
write(ts.tokenToString(110));
if (node.asteriskToken) {
write("*");
}
if (node.expression) {
write(" ");
emit(node.expression);
}
}
function needsParenthesisForPropertyAccessOrInvocation(node) {
switch (node.kind) {
case 65:
case 154:
case 156:
case 157:
case 158:
case 162:
return false;
}
return true;
}
function emitListWithSpread(elements, alwaysCopy, multiLine, trailingComma) {
var pos = 0;
var group = 0;
var length = elements.length;
while (pos < length) {
if (group === 1) {
write(".concat(");
}
else if (group > 1) {
write(", ");
}
var e = elements[pos];
if (e.kind === 174) {
e = e.expression;
emitParenthesizedIf(e, group === 0 && needsParenthesisForPropertyAccessOrInvocation(e));
pos++;
if (pos === length && group === 0 && alwaysCopy && e.kind !== 154) {
write(".slice()");
}
}
else {
var i = pos;
while (i < length && elements[i].kind !== 174) {
i++;
}
write("[");
if (multiLine) {
increaseIndent();
}
emitList(elements, pos, i - pos, multiLine, trailingComma && i === length);
if (multiLine) {
decreaseIndent();
}
write("]");
pos = i;
}
group++;
}
if (group > 1) {
write(")");
}
}
function isSpreadElementExpression(node) {
return node.kind === 174;
}
function emitArrayLiteral(node) {
var elements = node.elements;
if (elements.length === 0) {
write("[]");
}
else if (languageVersion >= 2 || !ts.forEach(elements, isSpreadElementExpression)) {
write("[");
emitLinePreservingList(node, node.elements, elements.hasTrailingComma, false);
write("]");
}
else {
emitListWithSpread(elements, true, (node.flags & 512) !== 0, elements.hasTrailingComma);
}
}
function emitObjectLiteralBody(node, numElements) {
if (numElements === 0) {
write("{}");
return;
}
write("{");
if (numElements > 0) {
var properties = node.properties;
if (numElements === properties.length) {
emitLinePreservingList(node, properties, languageVersion >= 1, true);
}
else {
var multiLine = (node.flags & 512) !== 0;
if (!multiLine) {
write(" ");
}
else {
increaseIndent();
}
emitList(properties, 0, numElements, multiLine, false);
if (!multiLine) {
write(" ");
}
else {
decreaseIndent();
}
}
}
write("}");
}
function emitDownlevelObjectLiteralWithComputedProperties(node, firstComputedPropertyIndex) {
var multiLine = (node.flags & 512) !== 0;
var properties = node.properties;
write("(");
if (multiLine) {
increaseIndent();
}
var tempVar = createAndRecordTempVariable(0);
emit(tempVar);
write(" = ");
emitObjectLiteralBody(node, firstComputedPropertyIndex);
for (var i = firstComputedPropertyIndex, n = properties.length; i < n; i++) {
writeComma();
var property = properties[i];
emitStart(property);
if (property.kind === 137 || property.kind === 138) {
var accessors = ts.getAllAccessorDeclarations(node.properties, property);
if (property !== accessors.firstAccessor) {
continue;
}
write("Object.defineProperty(");
emit(tempVar);
write(", ");
emitStart(node.name);
emitExpressionForPropertyName(property.name);
emitEnd(property.name);
write(", {");
increaseIndent();
if (accessors.getAccessor) {
writeLine();
emitLeadingComments(accessors.getAccessor);
write("get: ");
emitStart(accessors.getAccessor);
write("function ");
emitSignatureAndBody(accessors.getAccessor);
emitEnd(accessors.getAccessor);
emitTrailingComments(accessors.getAccessor);
write(",");
}
if (accessors.setAccessor) {
writeLine();
emitLeadingComments(accessors.setAccessor);
write("set: ");
emitStart(accessors.setAccessor);
write("function ");
emitSignatureAndBody(accessors.setAccessor);
emitEnd(accessors.setAccessor);
emitTrailingComments(accessors.setAccessor);
write(",");
}
writeLine();
write("enumerable: true,");
writeLine();
write("configurable: true");
decreaseIndent();
writeLine();
write("})");
emitEnd(property);
}
else {
emitLeadingComments(property);
emitStart(property.name);
emit(tempVar);
emitMemberAccessForPropertyName(property.name);
emitEnd(property.name);
write(" = ");
if (property.kind === 225) {
emit(property.initializer);
}
else if (property.kind === 226) {
emitExpressionIdentifier(property.name);
}
else if (property.kind === 135) {
emitFunctionDeclaration(property);
}
else {
ts.Debug.fail("ObjectLiteralElement type not accounted for: " + property.kind);
}
}
emitEnd(property);
}
writeComma();
emit(tempVar);
if (multiLine) {
decreaseIndent();
writeLine();
}
write(")");
function writeComma() {
if (multiLine) {
write(",");
writeLine();
}
else {
write(", ");
}
}
}
function emitObjectLiteral(node) {
var properties = node.properties;
if (languageVersion < 2) {
var numProperties = properties.length;
var numInitialNonComputedProperties = numProperties;
for (var i = 0, n = properties.length; i < n; i++) {
if (properties[i].name.kind === 128) {
numInitialNonComputedProperties = i;
break;
}
}
var hasComputedProperty = numInitialNonComputedProperties !== properties.length;
if (hasComputedProperty) {
emitDownlevelObjectLiteralWithComputedProperties(node, numInitialNonComputedProperties);
return;
}
}
emitObjectLiteralBody(node, properties.length);
}
function createBinaryExpression(left, operator, right, startsOnNewLine) {
var result = ts.createSynthesizedNode(170, startsOnNewLine);
result.operatorToken = ts.createSynthesizedNode(operator);
result.left = left;
result.right = right;
return result;
}
function createPropertyAccessExpression(expression, name) {
var result = ts.createSynthesizedNode(156);
result.expression = parenthesizeForAccess(expression);
result.dotToken = ts.createSynthesizedNode(20);
result.name = name;
return result;
}
function createElementAccessExpression(expression, argumentExpression) {
var result = ts.createSynthesizedNode(157);
result.expression = parenthesizeForAccess(expression);
result.argumentExpression = argumentExpression;
return result;
}
function parenthesizeForAccess(expr) {
if (ts.isLeftHandSideExpression(expr) && expr.kind !== 159 && expr.kind !== 7) {
return expr;
}
var node = ts.createSynthesizedNode(162);
node.expression = expr;
return node;
}
function emitComputedPropertyName(node) {
write("[");
emitExpressionForPropertyName(node);
write("]");
}
function emitMethod(node) {
if (languageVersion >= 2 && node.asteriskToken) {
write("*");
}
emit(node.name, false);
if (languageVersion < 2) {
write(": function ");
}
emitSignatureAndBody(node);
}
function emitPropertyAssignment(node) {
emit(node.name, false);
write(": ");
emit(node.initializer);
}
function emitShorthandPropertyAssignment(node) {
emit(node.name, false);
if (languageVersion < 2) {
write(": ");
var generatedName = getGeneratedNameForIdentifier(node.name);
if (generatedName) {
write(generatedName);
}
else {
emitExpressionIdentifier(node.name);
}
}
else if (resolver.getExpressionNameSubstitution(node.name, getGeneratedNameForNode)) {
write(": ");
emitExpressionIdentifier(node.name);
}
}
function tryEmitConstantValue(node) {
if (compilerOptions.separateCompilation) {
return false;
}
var constantValue = resolver.getConstantValue(node);
if (constantValue !== undefined) {
write(constantValue.toString());
if (!compilerOptions.removeComments) {
var propertyName = node.kind === 156 ? ts.declarationNameToString(node.name) : ts.getTextOfNode(node.argumentExpression);
write(" /* " + propertyName + " */");
}
return true;
}
return false;
}
function indentIfOnDifferentLines(parent, node1, node2, valueToWriteWhenNotIndenting) {
var realNodesAreOnDifferentLines = !ts.nodeIsSynthesized(parent) && !nodeEndIsOnSameLineAsNodeStart(node1, node2);
var synthesizedNodeIsOnDifferentLine = synthesizedNodeStartsOnNewLine(node2);
if (realNodesAreOnDifferentLines || synthesizedNodeIsOnDifferentLine) {
increaseIndent();
writeLine();
return true;
}
else {
if (valueToWriteWhenNotIndenting) {
write(valueToWriteWhenNotIndenting);
}
return false;
}
}
function emitPropertyAccess(node) {
if (tryEmitConstantValue(node)) {
return;
}
emit(node.expression);
var indentedBeforeDot = indentIfOnDifferentLines(node, node.expression, node.dotToken);
write(".");
var indentedAfterDot = indentIfOnDifferentLines(node, node.dotToken, node.name);
emit(node.name, false);
decreaseIndentIf(indentedBeforeDot, indentedAfterDot);
}
function emitQualifiedName(node) {
emit(node.left);
write(".");
emit(node.right);
}
function emitIndexedAccess(node) {
if (tryEmitConstantValue(node)) {
return;
}
emit(node.expression);
write("[");
emit(node.argumentExpression);
write("]");
}
function hasSpreadElement(elements) {
return ts.forEach(elements, function (e) { return e.kind === 174; });
}
function skipParentheses(node) {
while (node.kind === 162 || node.kind === 161) {
node = node.expression;
}
return node;
}
function emitCallTarget(node) {
if (node.kind === 65 || node.kind === 93 || node.kind === 91) {
emit(node);
return node;
}
var temp = createAndRecordTempVariable(0);
write("(");
emit(temp);
write(" = ");
emit(node);
write(")");
return temp;
}
function emitCallWithSpread(node) {
var target;
var expr = skipParentheses(node.expression);
if (expr.kind === 156) {
target = emitCallTarget(expr.expression);
write(".");
emit(expr.name);
}
else if (expr.kind === 157) {
target = emitCallTarget(expr.expression);
write("[");
emit(expr.argumentExpression);
write("]");
}
else if (expr.kind === 91) {
target = expr;
write("_super");
}
else {
emit(node.expression);
}
write(".apply(");
if (target) {
if (target.kind === 91) {
emitThis(target);
}
else {
emit(target);
}
}
else {
write("void 0");
}
write(", ");
emitListWithSpread(node.arguments, false, false, false);
write(")");
}
function emitCallExpression(node) {
if (languageVersion < 2 && hasSpreadElement(node.arguments)) {
emitCallWithSpread(node);
return;
}
var superCall = false;
if (node.expression.kind === 91) {
emitSuper(node.expression);
superCall = true;
}
else {
emit(node.expression);
superCall = node.expression.kind === 156 && node.expression.expression.kind === 91;
}
if (superCall && languageVersion < 2) {
write(".call(");
emitThis(node.expression);
if (node.arguments.length) {
write(", ");
emitCommaList(node.arguments);
}
write(")");
}
else {
write("(");
emitCommaList(node.arguments);
write(")");
}
}
function emitNewExpression(node) {
write("new ");
emit(node.expression);
if (node.arguments) {
write("(");
emitCommaList(node.arguments);
write(")");
}
}
function emitTaggedTemplateExpression(node) {
if (languageVersion >= 2) {
emit(node.tag);
write(" ");
emit(node.template);
}
else {
emitDownlevelTaggedTemplate(node);
}
}
function emitParenExpression(node) {
if (!node.parent || node.parent.kind !== 164) {
if (node.expression.kind === 161) {
var operand = node.expression.expression;
while (operand.kind == 161) {
operand = operand.expression;
}
if (operand.kind !== 168 &&
operand.kind !== 167 &&
operand.kind !== 166 &&
operand.kind !== 165 &&
operand.kind !== 169 &&
operand.kind !== 159 &&
!(operand.kind === 158 && node.parent.kind === 159) &&
!(operand.kind === 163 && node.parent.kind === 158)) {
emit(operand);
return;
}
}
}
write("(");
emit(node.expression);
write(")");
}
function emitDeleteExpression(node) {
write(ts.tokenToString(74));
write(" ");
emit(node.expression);
}
function emitVoidExpression(node) {
write(ts.tokenToString(99));
write(" ");
emit(node.expression);
}
function emitTypeOfExpression(node) {
write(ts.tokenToString(97));
write(" ");
emit(node.expression);
}
function isNameOfExportedSourceLevelDeclarationInSystemExternalModule(node) {
if (!isCurrentFileSystemExternalModule() || node.kind !== 65 || ts.nodeIsSynthesized(node)) {
return false;
}
var isVariableDeclarationOrBindingElement = node.parent && (node.parent.kind === 199 || node.parent.kind === 153);
var targetDeclaration = isVariableDeclarationOrBindingElement
? node.parent
: resolver.getReferencedValueDeclaration(node);
return isSourceFileLevelDeclarationInSystemJsModule(targetDeclaration, true);
}
function emitPrefixUnaryExpression(node) {
var exportChanged = isNameOfExportedSourceLevelDeclarationInSystemExternalModule(node.operand);
if (exportChanged) {
write(exportFunctionForFile + "(\"");
emitNodeWithoutSourceMap(node.operand);
write("\", ");
}
write(ts.tokenToString(node.operator));
if (node.operand.kind === 168) {
var operand = node.operand;
if (node.operator === 33 && (operand.operator === 33 || operand.operator === 38)) {
write(" ");
}
else if (node.operator === 34 && (operand.operator === 34 || operand.operator === 39)) {
write(" ");
}
}
emit(node.operand);
if (exportChanged) {
write(")");
}
}
function emitPostfixUnaryExpression(node) {
var exportChanged = isNameOfExportedSourceLevelDeclarationInSystemExternalModule(node.operand);
if (exportChanged) {
write("(" + exportFunctionForFile + "(\"");
emitNodeWithoutSourceMap(node.operand);
write("\", ");
write(ts.tokenToString(node.operator));
emit(node.operand);
if (node.operator === 38) {
write(") - 1)");
}
else {
write(") + 1)");
}
}
else {
emit(node.operand);
write(ts.tokenToString(node.operator));
}
}
function shouldHoistDeclarationInSystemJsModule(node) {
return isSourceFileLevelDeclarationInSystemJsModule(node, false);
}
function isSourceFileLevelDeclarationInSystemJsModule(node, isExported) {
if (!node || languageVersion >= 2 || !isCurrentFileSystemExternalModule()) {
return false;
}
var current = node;
while (current) {
if (current.kind === 228) {
return !isExported || ((ts.getCombinedNodeFlags(node) & 1) !== 0);
}
else if (ts.isFunctionLike(current) || current.kind === 207) {
return false;
}
else {
current = current.parent;
}
}
}
function emitBinaryExpression(node) {
if (languageVersion < 2 && node.operatorToken.kind === 53 &&
(node.left.kind === 155 || node.left.kind === 154)) {
emitDestructuring(node, node.parent.kind === 183);
}
else {
var exportChanged = node.operatorToken.kind >= 53 &&
node.operatorToken.kind <= 64 &&
isNameOfExportedSourceLevelDeclarationInSystemExternalModule(node.left);
if (exportChanged) {
write(exportFunctionForFile + "(\"");
emitNodeWithoutSourceMap(node.left);
write("\", ");
}
emit(node.left);
var indentedBeforeOperator = indentIfOnDifferentLines(node, node.left, node.operatorToken, node.operatorToken.kind !== 23 ? " " : undefined);
write(ts.tokenToString(node.operatorToken.kind));
var indentedAfterOperator = indentIfOnDifferentLines(node, node.operatorToken, node.right, " ");
emit(node.right);
decreaseIndentIf(indentedBeforeOperator, indentedAfterOperator);
if (exportChanged) {
write(")");
}
}
}
function synthesizedNodeStartsOnNewLine(node) {
return ts.nodeIsSynthesized(node) && node.startsOnNewLine;
}
function emitConditionalExpression(node) {
emit(node.condition);
var indentedBeforeQuestion = indentIfOnDifferentLines(node, node.condition, node.questionToken, " ");
write("?");
var indentedAfterQuestion = indentIfOnDifferentLines(node, node.questionToken, node.whenTrue, " ");
emit(node.whenTrue);
decreaseIndentIf(indentedBeforeQuestion, indentedAfterQuestion);
var indentedBeforeColon = indentIfOnDifferentLines(node, node.whenTrue, node.colonToken, " ");
write(":");
var indentedAfterColon = indentIfOnDifferentLines(node, node.colonToken, node.whenFalse, " ");
emit(node.whenFalse);
decreaseIndentIf(indentedBeforeColon, indentedAfterColon);
}
function decreaseIndentIf(value1, value2) {
if (value1) {
decreaseIndent();
}
if (value2) {
decreaseIndent();
}
}
function isSingleLineEmptyBlock(node) {
if (node && node.kind === 180) {
var block = node;
return block.statements.length === 0 && nodeEndIsOnSameLineAsNodeStart(block, block);
}
}
function emitBlock(node) {
if (isSingleLineEmptyBlock(node)) {
emitToken(14, node.pos);
write(" ");
emitToken(15, node.statements.end);
return;
}
emitToken(14, node.pos);
increaseIndent();
scopeEmitStart(node.parent);
if (node.kind === 207) {
ts.Debug.assert(node.parent.kind === 206);
emitCaptureThisForNodeIfNecessary(node.parent);
}
emitLines(node.statements);
if (node.kind === 207) {
emitTempDeclarations(true);
}
decreaseIndent();
writeLine();
emitToken(15, node.statements.end);
scopeEmitEnd();
}
function emitEmbeddedStatement(node) {
if (node.kind === 180) {
write(" ");
emit(node);
}
else {
increaseIndent();
writeLine();
emit(node);
decreaseIndent();
}
}
function emitExpressionStatement(node) {
emitParenthesizedIf(node.expression, node.expression.kind === 164);
write(";");
}
function emitIfStatement(node) {
var endPos = emitToken(84, node.pos);
write(" ");
endPos = emitToken(16, endPos);
emit(node.expression);
emitToken(17, node.expression.end);
emitEmbeddedStatement(node.thenStatement);
if (node.elseStatement) {
writeLine();
emitToken(76, node.thenStatement.end);
if (node.elseStatement.kind === 184) {
write(" ");
emit(node.elseStatement);
}
else {
emitEmbeddedStatement(node.elseStatement);
}
}
}
function emitDoStatement(node) {
write("do");
emitEmbeddedStatement(node.statement);
if (node.statement.kind === 180) {
write(" ");
}
else {
writeLine();
}
write("while (");
emit(node.expression);
write(");");
}
function emitWhileStatement(node) {
write("while (");
emit(node.expression);
write(")");
emitEmbeddedStatement(node.statement);
}
function tryEmitStartOfVariableDeclarationList(decl, startPos) {
if (shouldHoistVariable(decl, true)) {
return false;
}
var tokenKind = 98;
if (decl && languageVersion >= 2) {
if (ts.isLet(decl)) {
tokenKind = 104;
}
else if (ts.isConst(decl)) {
tokenKind = 70;
}
}
if (startPos !== undefined) {
emitToken(tokenKind, startPos);
write(" ");
}
else {
switch (tokenKind) {
case 98:
write("var ");
break;
case 104:
write("let ");
break;
case 70:
write("const ");
break;
}
}
return true;
}
function emitVariableDeclarationListSkippingUninitializedEntries(list) {
var started = false;
for (var _a = 0, _b = list.declarations; _a < _b.length; _a++) {
var decl = _b[_a];
if (!decl.initializer) {
continue;
}
if (!started) {
started = true;
}
else {
write(", ");
}
emit(decl);
}
return started;
}
function emitForStatement(node) {
var endPos = emitToken(82, node.pos);
write(" ");
endPos = emitToken(16, endPos);
if (node.initializer && node.initializer.kind === 200) {
var variableDeclarationList = node.initializer;
var startIsEmitted = tryEmitStartOfVariableDeclarationList(variableDeclarationList, endPos);
if (startIsEmitted) {
emitCommaList(variableDeclarationList.declarations);
}
else {
emitVariableDeclarationListSkippingUninitializedEntries(variableDeclarationList);
}
}
else if (node.initializer) {
emit(node.initializer);
}
write(";");
emitOptional(" ", node.condition);
write(";");
emitOptional(" ", node.incrementor);
write(")");
emitEmbeddedStatement(node.statement);
}
function emitForInOrForOfStatement(node) {
if (languageVersion < 2 && node.kind === 189) {
return emitDownLevelForOfStatement(node);
}
var endPos = emitToken(82, node.pos);
write(" ");
endPos = emitToken(16, endPos);
if (node.initializer.kind === 200) {
var variableDeclarationList = node.initializer;
if (variableDeclarationList.declarations.length >= 1) {
tryEmitStartOfVariableDeclarationList(variableDeclarationList, endPos);
emit(variableDeclarationList.declarations[0]);
}
}
else {
emit(node.initializer);
}
if (node.kind === 188) {
write(" in ");
}
else {
write(" of ");
}
emit(node.expression);
emitToken(17, node.expression.end);
emitEmbeddedStatement(node.statement);
}
function emitDownLevelForOfStatement(node) {
// The following ES6 code:
//
// for (let v of expr) { }
//
// should be emitted as
//
// for (let _i = 0, _a = expr; _i < _a.length; _i++) {
// let v = _a[_i];
// }
//
// where _a and _i are temps emitted to capture the RHS and the counter,
// respectively.
// When the left hand side is an expression instead of a let declaration,
// the "let v" is not emitted.
// When the left hand side is a let/const, the v is renamed if there is
// another v in scope.
// Note that all assignments to the LHS are emitted in the body, including
// all destructuring.
// Note also that because an extra statement is needed to assign to the LHS,
// for-of bodies are always emitted as blocks.
var endPos = emitToken(82, node.pos);
write(" ");
endPos = emitToken(16, endPos);
var rhsIsIdentifier = node.expression.kind === 65;
var counter = createTempVariable(268435456);
var rhsReference = rhsIsIdentifier ? node.expression : createTempVariable(0);
emitStart(node.expression);
write("var ");
emitNodeWithoutSourceMap(counter);
write(" = 0");
emitEnd(node.expression);
if (!rhsIsIdentifier) {
write(", ");
emitStart(node.expression);
emitNodeWithoutSourceMap(rhsReference);
write(" = ");
emitNodeWithoutSourceMap(node.expression);
emitEnd(node.expression);
}
write("; ");
emitStart(node.initializer);
emitNodeWithoutSourceMap(counter);
write(" < ");
emitNodeWithoutSourceMap(rhsReference);
write(".length");
emitEnd(node.initializer);
write("; ");
emitStart(node.initializer);
emitNodeWithoutSourceMap(counter);
write("++");
emitEnd(node.initializer);
emitToken(17, node.expression.end);
write(" {");
writeLine();
increaseIndent();
var rhsIterationValue = createElementAccessExpression(rhsReference, counter);
emitStart(node.initializer);
if (node.initializer.kind === 200) {
write("var ");
var variableDeclarationList = node.initializer;
if (variableDeclarationList.declarations.length > 0) {
var declaration = variableDeclarationList.declarations[0];
if (ts.isBindingPattern(declaration.name)) {
emitDestructuring(declaration, false, rhsIterationValue);
}
else {
emitNodeWithoutSourceMap(declaration);
write(" = ");
emitNodeWithoutSourceMap(rhsIterationValue);
}
}
else {
emitNodeWithoutSourceMap(createTempVariable(0));
write(" = ");
emitNodeWithoutSourceMap(rhsIterationValue);
}
}
else {
var assignmentExpression = createBinaryExpression(node.initializer, 53, rhsIterationValue, false);
if (node.initializer.kind === 154 || node.initializer.kind === 155) {
emitDestructuring(assignmentExpression, true, undefined);
}
else {
emitNodeWithoutSourceMap(assignmentExpression);
}
}
emitEnd(node.initializer);
write(";");
if (node.statement.kind === 180) {
emitLines(node.statement.statements);
}
else {
writeLine();
emit(node.statement);
}
writeLine();
decreaseIndent();
write("}");
}
function emitBreakOrContinueStatement(node) {
emitToken(node.kind === 191 ? 66 : 71, node.pos);
emitOptional(" ", node.label);
write(";");
}
function emitReturnStatement(node) {
emitToken(90, node.pos);
emitOptional(" ", node.expression);
write(";");
}
function emitWithStatement(node) {
write("with (");
emit(node.expression);
write(")");
emitEmbeddedStatement(node.statement);
}
function emitSwitchStatement(node) {
var endPos = emitToken(92, node.pos);
write(" ");
emitToken(16, endPos);
emit(node.expression);
endPos = emitToken(17, node.expression.end);
write(" ");
emitCaseBlock(node.caseBlock, endPos);
}
function emitCaseBlock(node, startPos) {
emitToken(14, startPos);
increaseIndent();
emitLines(node.clauses);
decreaseIndent();
writeLine();
emitToken(15, node.clauses.end);
}
function nodeStartPositionsAreOnSameLine(node1, node2) {
return ts.getLineOfLocalPosition(currentSourceFile, ts.skipTrivia(currentSourceFile.text, node1.pos)) ===
ts.getLineOfLocalPosition(currentSourceFile, ts.skipTrivia(currentSourceFile.text, node2.pos));
}
function nodeEndPositionsAreOnSameLine(node1, node2) {
return ts.getLineOfLocalPosition(currentSourceFile, node1.end) ===
ts.getLineOfLocalPosition(currentSourceFile, node2.end);
}
function nodeEndIsOnSameLineAsNodeStart(node1, node2) {
return ts.getLineOfLocalPosition(currentSourceFile, node1.end) ===
ts.getLineOfLocalPosition(currentSourceFile, ts.skipTrivia(currentSourceFile.text, node2.pos));
}
function emitCaseOrDefaultClause(node) {
if (node.kind === 221) {
write("case ");
emit(node.expression);
write(":");
}
else {
write("default:");
}
if (node.statements.length === 1 && nodeStartPositionsAreOnSameLine(node, node.statements[0])) {
write(" ");
emit(node.statements[0]);
}
else {
increaseIndent();
emitLines(node.statements);
decreaseIndent();
}
}
function emitThrowStatement(node) {
write("throw ");
emit(node.expression);
write(";");
}
function emitTryStatement(node) {
write("try ");
emit(node.tryBlock);
emit(node.catchClause);
if (node.finallyBlock) {
writeLine();
write("finally ");
emit(node.finallyBlock);
}
}
function emitCatchClause(node) {
writeLine();
var endPos = emitToken(68, node.pos);
write(" ");
emitToken(16, endPos);
emit(node.variableDeclaration);
emitToken(17, node.variableDeclaration ? node.variableDeclaration.end : endPos);
write(" ");
emitBlock(node.block);
}
function emitDebuggerStatement(node) {
emitToken(72, node.pos);
write(";");
}
function emitLabelledStatement(node) {
emit(node.label);
write(": ");
emit(node.statement);
}
function getContainingModule(node) {
do {
node = node.parent;
} while (node && node.kind !== 206);
return node;
}
function emitContainingModuleName(node) {
var container = getContainingModule(node);
write(container ? getGeneratedNameForNode(container) : "exports");
}
function emitModuleMemberName(node) {
emitStart(node.name);
if (ts.getCombinedNodeFlags(node) & 1) {
var container = getContainingModule(node);
if (container) {
write(getGeneratedNameForNode(container));
write(".");
}
else if (languageVersion < 2 && compilerOptions.module !== 4) {
write("exports.");
}
}
emitNodeWithoutSourceMap(node.name);
emitEnd(node.name);
}
function createVoidZero() {
var zero = ts.createSynthesizedNode(7);
zero.text = "0";
var result = ts.createSynthesizedNode(167);
result.expression = zero;
return result;
}
function emitExportMemberAssignment(node) {
if (node.flags & 1) {
writeLine();
emitStart(node);
if (compilerOptions.module === 4 && node.parent === currentSourceFile) {
write(exportFunctionForFile + "(\"");
if (node.flags & 256) {
write("default");
}
else {
emitNodeWithoutSourceMap(node.name);
}
write("\", ");
emitDeclarationName(node);
write(")");
}
else {
if (node.flags & 256) {
if (languageVersion === 0) {
write("exports[\"default\"]");
}
else {
write("exports.default");
}
}
else {
emitModuleMemberName(node);
}
write(" = ");
emitDeclarationName(node);
}
emitEnd(node);
write(";");
}
}
function emitExportMemberAssignments(name) {
if (!exportEquals && exportSpecifiers && ts.hasProperty(exportSpecifiers, name.text)) {
for (var _a = 0, _b = exportSpecifiers[name.text]; _a < _b.length; _a++) {
var specifier = _b[_a];
writeLine();
if (compilerOptions.module === 4) {
emitStart(specifier.name);
write(exportFunctionForFile + "(\"");
emitNodeWithoutSourceMap(specifier.name);
write("\", ");
emitExpressionIdentifier(name);
write(")");
emitEnd(specifier.name);
}
else {
emitStart(specifier.name);
emitContainingModuleName(specifier);
write(".");
emitNodeWithoutSourceMap(specifier.name);
emitEnd(specifier.name);
write(" = ");
emitExpressionIdentifier(name);
}
write(";");
}
}
}
function emitDestructuring(root, isAssignmentExpressionStatement, value) {
var emitCount = 0;
var canDefineTempVariablesInPlace = false;
if (root.kind === 199) {
var isExported = ts.getCombinedNodeFlags(root) & 1;
var isSourceLevelForSystemModuleKind = shouldHoistDeclarationInSystemJsModule(root);
canDefineTempVariablesInPlace = !isExported && !isSourceLevelForSystemModuleKind;
}
else if (root.kind === 130) {
canDefineTempVariablesInPlace = true;
}
if (root.kind === 170) {
emitAssignmentExpression(root);
}
else {
ts.Debug.assert(!isAssignmentExpressionStatement);
emitBindingElement(root, value);
}
function emitAssignment(name, value) {
if (emitCount++) {
write(", ");
}
renameNonTopLevelLetAndConst(name);
var isVariableDeclarationOrBindingElement = name.parent && (name.parent.kind === 199 || name.parent.kind === 153);
var exportChanged = isNameOfExportedSourceLevelDeclarationInSystemExternalModule(name);
if (exportChanged) {
write(exportFunctionForFile + "(\"");
emitNodeWithoutSourceMap(name);
write("\", ");
}
if (isVariableDeclarationOrBindingElement) {
emitModuleMemberName(name.parent);
}
else {
emit(name);
}
write(" = ");
emit(value);
if (exportChanged) {
write(")");
}
}
function ensureIdentifier(expr) {
if (expr.kind !== 65) {
var identifier = createTempVariable(0);
if (!canDefineTempVariablesInPlace) {
recordTempDeclaration(identifier);
}
emitAssignment(identifier, expr);
expr = identifier;
}
return expr;
}
function createDefaultValueCheck(value, defaultValue) {
value = ensureIdentifier(value);
var equals = ts.createSynthesizedNode(170);
equals.left = value;
equals.operatorToken = ts.createSynthesizedNode(30);
equals.right = createVoidZero();
return createConditionalExpression(equals, defaultValue, value);
}
function createConditionalExpression(condition, whenTrue, whenFalse) {
var cond = ts.createSynthesizedNode(171);
cond.condition = condition;
cond.questionToken = ts.createSynthesizedNode(50);
cond.whenTrue = whenTrue;
cond.colonToken = ts.createSynthesizedNode(51);
cond.whenFalse = whenFalse;
return cond;
}
function createNumericLiteral(value) {
var node = ts.createSynthesizedNode(7);
node.text = "" + value;
return node;
}
function createPropertyAccessForDestructuringProperty(object, propName) {
if (propName.kind !== 65) {
return createElementAccessExpression(object, propName);
}
return createPropertyAccessExpression(object, propName);
}
function createSliceCall(value, sliceIndex) {
var call = ts.createSynthesizedNode(158);
var sliceIdentifier = ts.createSynthesizedNode(65);
sliceIdentifier.text = "slice";
call.expression = createPropertyAccessExpression(value, sliceIdentifier);
call.arguments = ts.createSynthesizedNodeArray();
call.arguments[0] = createNumericLiteral(sliceIndex);
return call;
}
function emitObjectLiteralAssignment(target, value) {
var properties = target.properties;
if (properties.length !== 1) {
value = ensureIdentifier(value);
}
for (var _a = 0; _a < properties.length; _a++) {
var p = properties[_a];
if (p.kind === 225 || p.kind === 226) {
var propName = (p.name);
emitDestructuringAssignment(p.initializer || propName, createPropertyAccessForDestructuringProperty(value, propName));
}
}
}
function emitArrayLiteralAssignment(target, value) {
var elements = target.elements;
if (elements.length !== 1) {
value = ensureIdentifier(value);
}
for (var i = 0; i < elements.length; i++) {
var e = elements[i];
if (e.kind !== 176) {
if (e.kind !== 174) {
emitDestructuringAssignment(e, createElementAccessExpression(value, createNumericLiteral(i)));
}
else if (i === elements.length - 1) {
emitDestructuringAssignment(e.expression, createSliceCall(value, i));
}
}
}
}
function emitDestructuringAssignment(target, value) {
if (target.kind === 170 && target.operatorToken.kind === 53) {
value = createDefaultValueCheck(value, target.right);
target = target.left;
}
if (target.kind === 155) {
emitObjectLiteralAssignment(target, value);
}
else if (target.kind === 154) {
emitArrayLiteralAssignment(target, value);
}
else {
emitAssignment(target, value);
}
}
function emitAssignmentExpression(root) {
var target = root.left;
var value = root.right;
if (isAssignmentExpressionStatement) {
emitDestructuringAssignment(target, value);
}
else {
if (root.parent.kind !== 162) {
write("(");
}
value = ensureIdentifier(value);
emitDestructuringAssignment(target, value);
write(", ");
emit(value);
if (root.parent.kind !== 162) {
write(")");
}
}
}
function emitBindingElement(target, value) {
if (target.initializer) {
value = value ? createDefaultValueCheck(value, target.initializer) : target.initializer;
}
else if (!value) {
value = createVoidZero();
}
if (ts.isBindingPattern(target.name)) {
var pattern = target.name;
var elements = pattern.elements;
if (elements.length !== 1) {
value = ensureIdentifier(value);
}
for (var i = 0; i < elements.length; i++) {
var element = elements[i];
if (pattern.kind === 151) {
var propName = element.propertyName || element.name;
emitBindingElement(element, createPropertyAccessForDestructuringProperty(value, propName));
}
else if (element.kind !== 176) {
if (!element.dotDotDotToken) {
emitBindingElement(element, createElementAccessExpression(value, createNumericLiteral(i)));
}
else if (i === elements.length - 1) {
emitBindingElement(element, createSliceCall(value, i));
}
}
}
}
else {
emitAssignment(target.name, value);
}
}
}
function emitVariableDeclaration(node) {
if (ts.isBindingPattern(node.name)) {
if (languageVersion < 2) {
emitDestructuring(node, false);
}
else {
emit(node.name);
emitOptional(" = ", node.initializer);
}
}
else {
renameNonTopLevelLetAndConst(node.name);
var initializer = node.initializer;
if (!initializer && languageVersion < 2) {
var isUninitializedLet = (resolver.getNodeCheckFlags(node) & 256) &&
(getCombinedFlagsForIdentifier(node.name) & 4096);
if (isUninitializedLet &&
node.parent.parent.kind !== 188 &&
node.parent.parent.kind !== 189) {
initializer = createVoidZero();
}
}
var exportChanged = isNameOfExportedSourceLevelDeclarationInSystemExternalModule(node.name);
if (exportChanged) {
write(exportFunctionForFile + "(\"");
emitNodeWithoutSourceMap(node.name);
write("\", ");
}
emitModuleMemberName(node);
emitOptional(" = ", initializer);
if (exportChanged) {
write(")");
}
}
}
function emitExportVariableAssignments(node) {
if (node.kind === 176) {
return;
}
var name = node.name;
if (name.kind === 65) {
emitExportMemberAssignments(name);
}
else if (ts.isBindingPattern(name)) {
ts.forEach(name.elements, emitExportVariableAssignments);
}
}
function getCombinedFlagsForIdentifier(node) {
if (!node.parent || (node.parent.kind !== 199 && node.parent.kind !== 153)) {
return 0;
}
return ts.getCombinedNodeFlags(node.parent);
}
function renameNonTopLevelLetAndConst(node) {
if (languageVersion >= 2 ||
ts.nodeIsSynthesized(node) ||
node.kind !== 65 ||
(node.parent.kind !== 199 && node.parent.kind !== 153)) {
return;
}
var combinedFlags = getCombinedFlagsForIdentifier(node);
if (((combinedFlags & 12288) === 0) || combinedFlags & 1) {
return;
}
var list = ts.getAncestor(node, 200);
if (list.parent.kind === 181) {
var isSourceFileLevelBinding = list.parent.parent.kind === 228;
var isModuleLevelBinding = list.parent.parent.kind === 207;
var isFunctionLevelBinding = list.parent.parent.kind === 180 && ts.isFunctionLike(list.parent.parent.parent);
if (isSourceFileLevelBinding || isModuleLevelBinding || isFunctionLevelBinding) {
return;
}
}
var blockScopeContainer = ts.getEnclosingBlockScopeContainer(node);
var parent = blockScopeContainer.kind === 228
? blockScopeContainer
: blockScopeContainer.parent;
if (resolver.resolvesToSomeValue(parent, node.text)) {
var variableId = resolver.getBlockScopedVariableId(node);
if (!blockScopedVariableToGeneratedName) {
blockScopedVariableToGeneratedName = [];
}
var generatedName = makeUniqueName(node.text);
blockScopedVariableToGeneratedName[variableId] = generatedName;
}
}
function isES6ExportedDeclaration(node) {
return !!(node.flags & 1) &&
languageVersion >= 2 &&
node.parent.kind === 228;
}
function emitVariableStatement(node) {
var startIsEmitted = false;
if (node.flags & 1) {
if (isES6ExportedDeclaration(node)) {
write("export ");
startIsEmitted = tryEmitStartOfVariableDeclarationList(node.declarationList);
}
}
else {
startIsEmitted = tryEmitStartOfVariableDeclarationList(node.declarationList);
}
if (startIsEmitted) {
emitCommaList(node.declarationList.declarations);
write(";");
}
else {
var atLeastOneItem = emitVariableDeclarationListSkippingUninitializedEntries(node.declarationList);
if (atLeastOneItem) {
write(";");
}
}
if (languageVersion < 2 && node.parent === currentSourceFile) {
ts.forEach(node.declarationList.declarations, emitExportVariableAssignments);
}
}
function emitParameter(node) {
if (languageVersion < 2) {
if (ts.isBindingPattern(node.name)) {
var name_19 = createTempVariable(0);
if (!tempParameters) {
tempParameters = [];
}
tempParameters.push(name_19);
emit(name_19);
}
else {
emit(node.name);
}
}
else {
if (node.dotDotDotToken) {
write("...");
}
emit(node.name);
emitOptional(" = ", node.initializer);
}
}
function emitDefaultValueAssignments(node) {
if (languageVersion < 2) {
var tempIndex = 0;
ts.forEach(node.parameters, function (p) {
if (p.dotDotDotToken) {
return;
}
if (ts.isBindingPattern(p.name)) {
writeLine();
write("var ");
emitDestructuring(p, false, tempParameters[tempIndex]);
write(";");
tempIndex++;
}
else if (p.initializer) {
writeLine();
emitStart(p);
write("if (");
emitNodeWithoutSourceMap(p.name);
write(" === void 0)");
emitEnd(p);
write(" { ");
emitStart(p);
emitNodeWithoutSourceMap(p.name);
write(" = ");
emitNodeWithoutSourceMap(p.initializer);
emitEnd(p);
write("; }");
}
});
}
}
function emitRestParameter(node) {
if (languageVersion < 2 && ts.hasRestParameters(node)) {
var restIndex = node.parameters.length - 1;
var restParam = node.parameters[restIndex];
if (ts.isBindingPattern(restParam.name)) {
return;
}
var tempName = createTempVariable(268435456).text;
writeLine();
emitLeadingComments(restParam);
emitStart(restParam);
write("var ");
emitNodeWithoutSourceMap(restParam.name);
write(" = [];");
emitEnd(restParam);
emitTrailingComments(restParam);
writeLine();
write("for (");
emitStart(restParam);
write("var " + tempName + " = " + restIndex + ";");
emitEnd(restParam);
write(" ");
emitStart(restParam);
write(tempName + " < arguments.length;");
emitEnd(restParam);
write(" ");
emitStart(restParam);
write(tempName + "++");
emitEnd(restParam);
write(") {");
increaseIndent();
writeLine();
emitStart(restParam);
emitNodeWithoutSourceMap(restParam.name);
write("[" + tempName + " - " + restIndex + "] = arguments[" + tempName + "];");
emitEnd(restParam);
decreaseIndent();
writeLine();
write("}");
}
}
function emitAccessor(node) {
write(node.kind === 137 ? "get " : "set ");
emit(node.name, false);
emitSignatureAndBody(node);
}
function shouldEmitAsArrowFunction(node) {
return node.kind === 164 && languageVersion >= 2;
}
function emitDeclarationName(node) {
if (node.name) {
emitNodeWithoutSourceMap(node.name);
}
else {
write(getGeneratedNameForNode(node));
}
}
function shouldEmitFunctionName(node) {
if (node.kind === 163) {
return !!node.name;
}
if (node.kind === 201) {
return !!node.name || languageVersion < 2;
}
}
function emitFunctionDeclaration(node) {
if (ts.nodeIsMissing(node.body)) {
return emitOnlyPinnedOrTripleSlashComments(node);
}
if (node.kind !== 135 && node.kind !== 134) {
emitLeadingComments(node);
}
if (!shouldEmitAsArrowFunction(node)) {
if (isES6ExportedDeclaration(node)) {
write("export ");
if (node.flags & 256) {
write("default ");
}
}
write("function");
if (languageVersion >= 2 && node.asteriskToken) {
write("*");
}
write(" ");
}
if (shouldEmitFunctionName(node)) {
emitDeclarationName(node);
}
emitSignatureAndBody(node);
if (languageVersion < 2 && node.kind === 201 && node.parent === currentSourceFile && node.name) {
emitExportMemberAssignments(node.name);
}
if (node.kind !== 135 && node.kind !== 134) {
emitTrailingComments(node);
}
}
function emitCaptureThisForNodeIfNecessary(node) {
if (resolver.getNodeCheckFlags(node) & 4) {
writeLine();
emitStart(node);
write("var _this = this;");
emitEnd(node);
}
}
function emitSignatureParameters(node) {
increaseIndent();
write("(");
if (node) {
var parameters = node.parameters;
var omitCount = languageVersion < 2 && ts.hasRestParameters(node) ? 1 : 0;
emitList(parameters, 0, parameters.length - omitCount, false, false);
}
write(")");
decreaseIndent();
}
function emitSignatureParametersForArrow(node) {
if (node.parameters.length === 1 && node.pos === node.parameters[0].pos) {
emit(node.parameters[0]);
return;
}
emitSignatureParameters(node);
}
function emitSignatureAndBody(node) {
var saveTempFlags = tempFlags;
var saveTempVariables = tempVariables;
var saveTempParameters = tempParameters;
tempFlags = 0;
tempVariables = undefined;
tempParameters = undefined;
if (shouldEmitAsArrowFunction(node)) {
emitSignatureParametersForArrow(node);
write(" =>");
}
else {
emitSignatureParameters(node);
}
if (!node.body) {
write(" { }");
}
else if (node.body.kind === 180) {
emitBlockFunctionBody(node, node.body);
}
else {
emitExpressionFunctionBody(node, node.body);
}
if (!isES6ExportedDeclaration(node)) {
emitExportMemberAssignment(node);
}
tempFlags = saveTempFlags;
tempVariables = saveTempVariables;
tempParameters = saveTempParameters;
}
function emitFunctionBodyPreamble(node) {
emitCaptureThisForNodeIfNecessary(node);
emitDefaultValueAssignments(node);
emitRestParameter(node);
}
function emitExpressionFunctionBody(node, body) {
if (languageVersion < 2) {
emitDownLevelExpressionFunctionBody(node, body);
return;
}
write(" ");
var current = body;
while (current.kind === 161) {
current = current.expression;
}
emitParenthesizedIf(body, current.kind === 155);
}
function emitDownLevelExpressionFunctionBody(node, body) {
write(" {");
scopeEmitStart(node);
increaseIndent();
var outPos = writer.getTextPos();
emitDetachedComments(node.body);
emitFunctionBodyPreamble(node);
var preambleEmitted = writer.getTextPos() !== outPos;
decreaseIndent();
if (!preambleEmitted && nodeStartPositionsAreOnSameLine(node, body)) {
write(" ");
emitStart(body);
write("return ");
emit(body);
emitEnd(body);
write(";");
emitTempDeclarations(false);
write(" ");
}
else {
increaseIndent();
writeLine();
emitLeadingComments(node.body);
write("return ");
emit(body);
write(";");
emitTrailingComments(node.body);
emitTempDeclarations(true);
decreaseIndent();
writeLine();
}
emitStart(node.body);
write("}");
emitEnd(node.body);
scopeEmitEnd();
}
function emitBlockFunctionBody(node, body) {
write(" {");
scopeEmitStart(node);
var initialTextPos = writer.getTextPos();
increaseIndent();
emitDetachedComments(body.statements);
var startIndex = emitDirectivePrologues(body.statements, true);
emitFunctionBodyPreamble(node);
decreaseIndent();
var preambleEmitted = writer.getTextPos() !== initialTextPos;
if (!preambleEmitted && nodeEndIsOnSameLineAsNodeStart(body, body)) {
for (var _a = 0, _b = body.statements; _a < _b.length; _a++) {
var statement = _b[_a];
write(" ");
emit(statement);
}
emitTempDeclarations(false);
write(" ");
emitLeadingCommentsOfPosition(body.statements.end);
}
else {
increaseIndent();
emitLinesStartingAt(body.statements, startIndex);
emitTempDeclarations(true);
writeLine();
emitLeadingCommentsOfPosition(body.statements.end);
decreaseIndent();
}
emitToken(15, body.statements.end);
scopeEmitEnd();
}
function findInitialSuperCall(ctor) {
if (ctor.body) {
var statement = ctor.body.statements[0];
if (statement && statement.kind === 183) {
var expr = statement.expression;
if (expr && expr.kind === 158) {
var func = expr.expression;
if (func && func.kind === 91) {
return statement;
}
}
}
}
}
function emitParameterPropertyAssignments(node) {
ts.forEach(node.parameters, function (param) {
if (param.flags & 112) {
writeLine();
emitStart(param);
emitStart(param.name);
write("this.");
emitNodeWithoutSourceMap(param.name);
emitEnd(param.name);
write(" = ");
emit(param.name);
write(";");
emitEnd(param);
}
});
}
function emitMemberAccessForPropertyName(memberName) {
if (memberName.kind === 8 || memberName.kind === 7) {
write("[");
emitNodeWithoutSourceMap(memberName);
write("]");
}
else if (memberName.kind === 128) {
emitComputedPropertyName(memberName);
}
else {
write(".");
emitNodeWithoutSourceMap(memberName);
}
}
function getInitializedProperties(node, isStatic) {
var properties = [];
for (var _a = 0, _b = node.members; _a < _b.length; _a++) {
var member = _b[_a];
if (member.kind === 133 && isStatic === ((member.flags & 128) !== 0) && member.initializer) {
properties.push(member);
}
}
return properties;
}
function emitPropertyDeclarations(node, properties) {
for (var _a = 0; _a < properties.length; _a++) {
var property = properties[_a];
emitPropertyDeclaration(node, property);
}
}
function emitPropertyDeclaration(node, property, receiver, isExpression) {
writeLine();
emitLeadingComments(property);
emitStart(property);
emitStart(property.name);
if (receiver) {
emit(receiver);
}
else {
if (property.flags & 128) {
emitDeclarationName(node);
}
else {
write("this");
}
}
emitMemberAccessForPropertyName(property.name);
emitEnd(property.name);
write(" = ");
emit(property.initializer);
if (!isExpression) {
write(";");
}
emitEnd(property);
emitTrailingComments(property);
}
function emitMemberFunctionsForES5AndLower(node) {
ts.forEach(node.members, function (member) {
if (member.kind === 179) {
writeLine();
write(";");
}
else if (member.kind === 135 || node.kind === 134) {
if (!member.body) {
return emitOnlyPinnedOrTripleSlashComments(member);
}
writeLine();
emitLeadingComments(member);
emitStart(member);
emitStart(member.name);
emitClassMemberPrefix(node, member);
emitMemberAccessForPropertyName(member.name);
emitEnd(member.name);
write(" = ");
emitStart(member);
emitFunctionDeclaration(member);
emitEnd(member);
emitEnd(member);
write(";");
emitTrailingComments(member);
}
else if (member.kind === 137 || member.kind === 138) {
var accessors = ts.getAllAccessorDeclarations(node.members, member);
if (member === accessors.firstAccessor) {
writeLine();
emitStart(member);
write("Object.defineProperty(");
emitStart(member.name);
emitClassMemberPrefix(node, member);
write(", ");
emitExpressionForPropertyName(member.name);
emitEnd(member.name);
write(", {");
increaseIndent();
if (accessors.getAccessor) {
writeLine();
emitLeadingComments(accessors.getAccessor);
write("get: ");
emitStart(accessors.getAccessor);
write("function ");
emitSignatureAndBody(accessors.getAccessor);
emitEnd(accessors.getAccessor);
emitTrailingComments(accessors.getAccessor);
write(",");
}
if (accessors.setAccessor) {
writeLine();
emitLeadingComments(accessors.setAccessor);
write("set: ");
emitStart(accessors.setAccessor);
write("function ");
emitSignatureAndBody(accessors.setAccessor);
emitEnd(accessors.setAccessor);
emitTrailingComments(accessors.setAccessor);
write(",");
}
writeLine();
write("enumerable: true,");
writeLine();
write("configurable: true");
decreaseIndent();
writeLine();
write("});");
emitEnd(member);
}
}
});
}
function emitMemberFunctionsForES6AndHigher(node) {
for (var _a = 0, _b = node.members; _a < _b.length; _a++) {
var member = _b[_a];
if ((member.kind === 135 || node.kind === 134) && !member.body) {
emitOnlyPinnedOrTripleSlashComments(member);
}
else if (member.kind === 135 ||
member.kind === 137 ||
member.kind === 138) {
writeLine();
emitLeadingComments(member);
emitStart(member);
if (member.flags & 128) {
write("static ");
}
if (member.kind === 137) {
write("get ");
}
else if (member.kind === 138) {
write("set ");
}
if (member.asteriskToken) {
write("*");
}
emit(member.name);
emitSignatureAndBody(member);
emitEnd(member);
emitTrailingComments(member);
}
else if (member.kind === 179) {
writeLine();
write(";");
}
}
}
function emitConstructor(node, baseTypeElement) {
var saveTempFlags = tempFlags;
var saveTempVariables = tempVariables;
var saveTempParameters = tempParameters;
tempFlags = 0;
tempVariables = undefined;
tempParameters = undefined;
emitConstructorWorker(node, baseTypeElement);
tempFlags = saveTempFlags;
tempVariables = saveTempVariables;
tempParameters = saveTempParameters;
}
function emitConstructorWorker(node, baseTypeElement) {
var hasInstancePropertyWithInitializer = false;
ts.forEach(node.members, function (member) {
if (member.kind === 136 && !member.body) {
emitOnlyPinnedOrTripleSlashComments(member);
}
if (member.kind === 133 && member.initializer && (member.flags & 128) === 0) {
hasInstancePropertyWithInitializer = true;
}
});
var ctor = ts.getFirstConstructorWithBody(node);
if (languageVersion >= 2 && !ctor && !hasInstancePropertyWithInitializer) {
return;
}
if (ctor) {
emitLeadingComments(ctor);
}
emitStart(ctor || node);
if (languageVersion < 2) {
write("function ");
emitDeclarationName(node);
emitSignatureParameters(ctor);
}
else {
write("constructor");
if (ctor) {
emitSignatureParameters(ctor);
}
else {
if (baseTypeElement) {
write("(...args)");
}
else {
write("()");
}
}
}
write(" {");
scopeEmitStart(node, "constructor");
increaseIndent();
if (ctor) {
emitDetachedComments(ctor.body.statements);
}
emitCaptureThisForNodeIfNecessary(node);
if (ctor) {
emitDefaultValueAssignments(ctor);
emitRestParameter(ctor);
if (baseTypeElement) {
var superCall = findInitialSuperCall(ctor);
if (superCall) {
writeLine();
emit(superCall);
}
}
emitParameterPropertyAssignments(ctor);
}
else {
if (baseTypeElement) {
writeLine();
emitStart(baseTypeElement);
if (languageVersion < 2) {
write("_super.apply(this, arguments);");
}
else {
write("super(...args);");
}
emitEnd(baseTypeElement);
}
}
emitPropertyDeclarations(node, getInitializedProperties(node, false));
if (ctor) {
var statements = ctor.body.statements;
if (superCall) {
statements = statements.slice(1);
}
emitLines(statements);
}
emitTempDeclarations(true);
writeLine();
if (ctor) {
emitLeadingCommentsOfPosition(ctor.body.statements.end);
}
decreaseIndent();
emitToken(15, ctor ? ctor.body.statements.end : node.members.end);
scopeEmitEnd();
emitEnd(ctor || node);
if (ctor) {
emitTrailingComments(ctor);
}
}
function emitClassExpression(node) {
return emitClassLikeDeclaration(node);
}
function emitClassDeclaration(node) {
return emitClassLikeDeclaration(node);
}
function emitClassLikeDeclaration(node) {
if (languageVersion < 2) {
emitClassLikeDeclarationBelowES6(node);
}
else {
emitClassLikeDeclarationForES6AndHigher(node);
}
}
function emitClassLikeDeclarationForES6AndHigher(node) {
var thisNodeIsDecorated = ts.nodeIsDecorated(node);
if (node.kind === 202) {
if (thisNodeIsDecorated) {
if (isES6ExportedDeclaration(node) && !(node.flags & 256)) {
write("export ");
}
write("let ");
emitDeclarationName(node);
write(" = ");
}
else if (isES6ExportedDeclaration(node)) {
write("export ");
if (node.flags & 256) {
write("default ");
}
}
}
var staticProperties = getInitializedProperties(node, true);
var isClassExpressionWithStaticProperties = staticProperties.length > 0 && node.kind === 175;
var tempVariable;
if (isClassExpressionWithStaticProperties) {
tempVariable = createAndRecordTempVariable(0);
write("(");
increaseIndent();
emit(tempVariable);
write(" = ");
}
write("class");
if ((node.name || !(node.flags & 256)) && !thisNodeIsDecorated) {
write(" ");
emitDeclarationName(node);
}
var baseTypeNode = ts.getClassExtendsHeritageClauseElement(node);
if (baseTypeNode) {
write(" extends ");
emit(baseTypeNode.expression);
}
write(" {");
increaseIndent();
scopeEmitStart(node);
writeLine();
emitConstructor(node, baseTypeNode);
emitMemberFunctionsForES6AndHigher(node);
decreaseIndent();
writeLine();
emitToken(15, node.members.end);
scopeEmitEnd();
if (thisNodeIsDecorated) {
write(";");
}
if (isClassExpressionWithStaticProperties) {
for (var _a = 0; _a < staticProperties.length; _a++) {
var property = staticProperties[_a];
write(",");
writeLine();
emitPropertyDeclaration(node, property, tempVariable, true);
}
write(",");
writeLine();
emit(tempVariable);
decreaseIndent();
write(")");
}
else {
writeLine();
emitPropertyDeclarations(node, staticProperties);
emitDecoratorsOfClass(node);
}
if (!isES6ExportedDeclaration(node) && (node.flags & 1)) {
writeLine();
emitStart(node);
emitModuleMemberName(node);
write(" = ");
emitDeclarationName(node);
emitEnd(node);
write(";");
}
else if (isES6ExportedDeclaration(node) && (node.flags & 256) && thisNodeIsDecorated) {
writeLine();
write("export default ");
emitDeclarationName(node);
write(";");
}
}
function emitClassLikeDeclarationBelowES6(node) {
if (node.kind === 202) {
if (!shouldHoistDeclarationInSystemJsModule(node)) {
write("var ");
}
emitDeclarationName(node);
write(" = ");
}
write("(function (");
var baseTypeNode = ts.getClassExtendsHeritageClauseElement(node);
if (baseTypeNode) {
write("_super");
}
write(") {");
var saveTempFlags = tempFlags;
var saveTempVariables = tempVariables;
var saveTempParameters = tempParameters;
var saveComputedPropertyNamesToGeneratedNames = computedPropertyNamesToGeneratedNames;
tempFlags = 0;
tempVariables = undefined;
tempParameters = undefined;
computedPropertyNamesToGeneratedNames = undefined;
increaseIndent();
scopeEmitStart(node);
if (baseTypeNode) {
writeLine();
emitStart(baseTypeNode);
write("__extends(");
emitDeclarationName(node);
write(", _super);");
emitEnd(baseTypeNode);
}
writeLine();
emitConstructor(node, baseTypeNode);
emitMemberFunctionsForES5AndLower(node);
emitPropertyDeclarations(node, getInitializedProperties(node, true));
writeLine();
emitDecoratorsOfClass(node);
writeLine();
emitToken(15, node.members.end, function () {
write("return ");
emitDeclarationName(node);
});
write(";");
emitTempDeclarations(true);
tempFlags = saveTempFlags;
tempVariables = saveTempVariables;
tempParameters = saveTempParameters;
computedPropertyNamesToGeneratedNames = saveComputedPropertyNamesToGeneratedNames;
decreaseIndent();
writeLine();
emitToken(15, node.members.end);
scopeEmitEnd();
emitStart(node);
write(")(");
if (baseTypeNode) {
emit(baseTypeNode.expression);
}
write(")");
if (node.kind === 202) {
write(";");
}
emitEnd(node);
if (node.kind === 202) {
emitExportMemberAssignment(node);
}
if (languageVersion < 2 && node.parent === currentSourceFile && node.name) {
emitExportMemberAssignments(node.name);
}
}
function emitClassMemberPrefix(node, member) {
emitDeclarationName(node);
if (!(member.flags & 128)) {
write(".prototype");
}
}
function emitDecoratorsOfClass(node) {
emitDecoratorsOfMembers(node, 0);
emitDecoratorsOfMembers(node, 128);
emitDecoratorsOfConstructor(node);
}
function emitDecoratorsOfConstructor(node) {
var decorators = node.decorators;
var constructor = ts.getFirstConstructorWithBody(node);
var hasDecoratedParameters = constructor && ts.forEach(constructor.parameters, ts.nodeIsDecorated);
if (!decorators && !hasDecoratedParameters) {
return;
}
writeLine();
emitStart(node);
emitDeclarationName(node);
write(" = __decorate([");
increaseIndent();
writeLine();
var decoratorCount = decorators ? decorators.length : 0;
var argumentsWritten = emitList(decorators, 0, decoratorCount, true, false, false, true, function (decorator) {
emitStart(decorator);
emit(decorator.expression);
emitEnd(decorator);
});
argumentsWritten += emitDecoratorsOfParameters(constructor, argumentsWritten > 0);
emitSerializedTypeMetadata(node, argumentsWritten >= 0);
decreaseIndent();
writeLine();
write("], ");
emitDeclarationName(node);
write(");");
emitEnd(node);
writeLine();
}
function emitDecoratorsOfMembers(node, staticFlag) {
for (var _a = 0, _b = node.members; _a < _b.length; _a++) {
var member = _b[_a];
if ((member.flags & 128) !== staticFlag) {
continue;
}
if (!ts.nodeCanBeDecorated(member)) {
continue;
}
if (!ts.nodeOrChildIsDecorated(member)) {
continue;
}
var decorators = void 0;
var functionLikeMember = void 0;
if (ts.isAccessor(member)) {
var accessors = ts.getAllAccessorDeclarations(node.members, member);
if (member !== accessors.firstAccessor) {
continue;
}
decorators = accessors.firstAccessor.decorators;
if (!decorators && accessors.secondAccessor) {
decorators = accessors.secondAccessor.decorators;
}
functionLikeMember = accessors.setAccessor;
}
else {
decorators = member.decorators;
if (member.kind === 135) {
functionLikeMember = member;
}
}
writeLine();
emitStart(member);
if (member.kind !== 133) {
write("Object.defineProperty(");
emitStart(member.name);
emitClassMemberPrefix(node, member);
write(", ");
emitExpressionForPropertyName(member.name);
emitEnd(member.name);
write(",");
increaseIndent();
writeLine();
}
write("__decorate([");
increaseIndent();
writeLine();
var decoratorCount = decorators ? decorators.length : 0;
var argumentsWritten = emitList(decorators, 0, decoratorCount, true, false, false, true, function (decorator) {
emitStart(decorator);
emit(decorator.expression);
emitEnd(decorator);
});
argumentsWritten += emitDecoratorsOfParameters(functionLikeMember, argumentsWritten > 0);
emitSerializedTypeMetadata(member, argumentsWritten > 0);
decreaseIndent();
writeLine();
write("], ");
emitStart(member.name);
emitClassMemberPrefix(node, member);
write(", ");
emitExpressionForPropertyName(member.name);
emitEnd(member.name);
if (member.kind !== 133) {
write(", Object.getOwnPropertyDescriptor(");
emitStart(member.name);
emitClassMemberPrefix(node, member);
write(", ");
emitExpressionForPropertyName(member.name);
emitEnd(member.name);
write("))");
decreaseIndent();
}
write(");");
emitEnd(member);
writeLine();
}
}
function emitDecoratorsOfParameters(node, leadingComma) {
var argumentsWritten = 0;
if (node) {
var parameterIndex = 0;
for (var _a = 0, _b = node.parameters; _a < _b.length; _a++) {
var parameter = _b[_a];
if (ts.nodeIsDecorated(parameter)) {
var decorators = parameter.decorators;
argumentsWritten += emitList(decorators, 0, decorators.length, true, false, leadingComma, true, function (decorator) {
emitStart(decorator);
write("__param(" + parameterIndex + ", ");
emit(decorator.expression);
write(")");
emitEnd(decorator);
});
leadingComma = true;
}
++parameterIndex;
}
}
return argumentsWritten;
}
function shouldEmitTypeMetadata(node) {
switch (node.kind) {
case 135:
case 137:
case 138:
case 133:
return true;
}
return false;
}
function shouldEmitReturnTypeMetadata(node) {
switch (node.kind) {
case 135:
return true;
}
return false;
}
function shouldEmitParamTypesMetadata(node) {
switch (node.kind) {
case 202:
case 135:
case 138:
return true;
}
return false;
}
function emitSerializedTypeMetadata(node, writeComma) {
var argumentsWritten = 0;
if (compilerOptions.emitDecoratorMetadata) {
if (shouldEmitTypeMetadata(node)) {
var serializedType = resolver.serializeTypeOfNode(node, getGeneratedNameForNode);
if (serializedType) {
if (writeComma) {
write(", ");
}
writeLine();
write("__metadata('design:type', ");
emitSerializedType(node, serializedType);
write(")");
argumentsWritten++;
}
}
if (shouldEmitParamTypesMetadata(node)) {
var serializedTypes = resolver.serializeParameterTypesOfNode(node, getGeneratedNameForNode);
if (serializedTypes) {
if (writeComma || argumentsWritten) {
write(", ");
}
writeLine();
write("__metadata('design:paramtypes', [");
for (var i = 0; i < serializedTypes.length; ++i) {
if (i > 0) {
write(", ");
}
emitSerializedType(node, serializedTypes[i]);
}
write("])");
argumentsWritten++;
}
}
if (shouldEmitReturnTypeMetadata(node)) {
var serializedType = resolver.serializeReturnTypeOfNode(node, getGeneratedNameForNode);
if (serializedType) {
if (writeComma || argumentsWritten) {
write(", ");
}
writeLine();
write("__metadata('design:returntype', ");
emitSerializedType(node, serializedType);
write(")");
argumentsWritten++;
}
}
}
return argumentsWritten;
}
function serializeTypeNameSegment(location, path, index) {
switch (index) {
case 0:
return "typeof " + path[index] + " !== 'undefined' && " + path[index];
case 1:
return serializeTypeNameSegment(location, path, index - 1) + "." + path[index];
default:
var temp = createAndRecordTempVariable(0).text;
return "(" + temp + " = " + serializeTypeNameSegment(location, path, index - 1) + ") && " + temp + "." + path[index];
}
}
function emitSerializedType(location, name) {
if (typeof name === "string") {
write(name);
return;
}
else {
ts.Debug.assert(name.length > 0, "Invalid serialized type name");
write("(" + serializeTypeNameSegment(location, name, name.length - 1) + ") || Object");
}
}
function emitInterfaceDeclaration(node) {
emitOnlyPinnedOrTripleSlashComments(node);
}
function shouldEmitEnumDeclaration(node) {
var isConstEnum = ts.isConst(node);
return !isConstEnum || compilerOptions.preserveConstEnums || compilerOptions.separateCompilation;
}
function emitEnumDeclaration(node) {
if (!shouldEmitEnumDeclaration(node)) {
return;
}
if (!shouldHoistDeclarationInSystemJsModule(node)) {
if (!(node.flags & 1) || isES6ExportedDeclaration(node)) {
emitStart(node);
if (isES6ExportedDeclaration(node)) {
write("export ");
}
write("var ");
emit(node.name);
emitEnd(node);
write(";");
}
}
writeLine();
emitStart(node);
write("(function (");
emitStart(node.name);
write(getGeneratedNameForNode(node));
emitEnd(node.name);
write(") {");
increaseIndent();
scopeEmitStart(node);
emitLines(node.members);
decreaseIndent();
writeLine();
emitToken(15, node.members.end);
scopeEmitEnd();
write(")(");
emitModuleMemberName(node);
write(" || (");
emitModuleMemberName(node);
write(" = {}));");
emitEnd(node);
if (!isES6ExportedDeclaration(node) && node.flags & 1 && !shouldHoistDeclarationInSystemJsModule(node)) {
writeLine();
emitStart(node);
write("var ");
emit(node.name);
write(" = ");
emitModuleMemberName(node);
emitEnd(node);
write(";");
}
if (languageVersion < 2 && node.parent === currentSourceFile) {
if (compilerOptions.module === 4 && (node.flags & 1)) {
writeLine();
write(exportFunctionForFile + "(\"");
emitDeclarationName(node);
write("\", ");
emitDeclarationName(node);
write(")");
}
emitExportMemberAssignments(node.name);
}
}
function emitEnumMember(node) {
var enumParent = node.parent;
emitStart(node);
write(getGeneratedNameForNode(enumParent));
write("[");
write(getGeneratedNameForNode(enumParent));
write("[");
emitExpressionForPropertyName(node.name);
write("] = ");
writeEnumMemberDeclarationValue(node);
write("] = ");
emitExpressionForPropertyName(node.name);
emitEnd(node);
write(";");
}
function writeEnumMemberDeclarationValue(member) {
var value = resolver.getConstantValue(member);
if (value !== undefined) {
write(value.toString());
return;
}
else if (member.initializer) {
emit(member.initializer);
}
else {
write("undefined");
}
}
function getInnerMostModuleDeclarationFromDottedModule(moduleDeclaration) {
if (moduleDeclaration.body.kind === 206) {
var recursiveInnerModule = getInnerMostModuleDeclarationFromDottedModule(moduleDeclaration.body);
return recursiveInnerModule || moduleDeclaration.body;
}
}
function shouldEmitModuleDeclaration(node) {
return ts.isInstantiatedModule(node, compilerOptions.preserveConstEnums || compilerOptions.separateCompilation);
}
function isModuleMergedWithES6Class(node) {
return languageVersion === 2 && !!(resolver.getNodeCheckFlags(node) & 2048);
}
function emitModuleDeclaration(node) {
var shouldEmit = shouldEmitModuleDeclaration(node);
if (!shouldEmit) {
return emitOnlyPinnedOrTripleSlashComments(node);
}
var hoistedInDeclarationScope = shouldHoistDeclarationInSystemJsModule(node);
var emitVarForModule = !hoistedInDeclarationScope && !isModuleMergedWithES6Class(node);
if (emitVarForModule) {
emitStart(node);
if (isES6ExportedDeclaration(node)) {
write("export ");
}
write("var ");
emit(node.name);
write(";");
emitEnd(node);
writeLine();
}
emitStart(node);
write("(function (");
emitStart(node.name);
write(getGeneratedNameForNode(node));
emitEnd(node.name);
write(") ");
if (node.body.kind === 207) {
var saveTempFlags = tempFlags;
var saveTempVariables = tempVariables;
tempFlags = 0;
tempVariables = undefined;
emit(node.body);
tempFlags = saveTempFlags;
tempVariables = saveTempVariables;
}
else {
write("{");
increaseIndent();
scopeEmitStart(node);
emitCaptureThisForNodeIfNecessary(node);
writeLine();
emit(node.body);
decreaseIndent();
writeLine();
var moduleBlock = getInnerMostModuleDeclarationFromDottedModule(node).body;
emitToken(15, moduleBlock.statements.end);
scopeEmitEnd();
}
write(")(");
if ((node.flags & 1) && !isES6ExportedDeclaration(node)) {
emit(node.name);
write(" = ");
}
emitModuleMemberName(node);
write(" || (");
emitModuleMemberName(node);
write(" = {}));");
emitEnd(node);
if (!isES6ExportedDeclaration(node) && node.name.kind === 65 && node.parent === currentSourceFile) {
if (compilerOptions.module === 4 && (node.flags & 1)) {
writeLine();
write(exportFunctionForFile + "(\"");
emitDeclarationName(node);
write("\", ");
emitDeclarationName(node);
write(")");
}
emitExportMemberAssignments(node.name);
}
}
function emitRequire(moduleName) {
if (moduleName.kind === 8) {
write("require(");
emitStart(moduleName);
emitLiteral(moduleName);
emitEnd(moduleName);
emitToken(17, moduleName.end);
}
else {
write("require()");
}
}
function getNamespaceDeclarationNode(node) {
if (node.kind === 209) {
return node;
}
var importClause = node.importClause;
if (importClause && importClause.namedBindings && importClause.namedBindings.kind === 212) {
return importClause.namedBindings;
}
}
function isDefaultImport(node) {
return node.kind === 210 && node.importClause && !!node.importClause.name;
}
function emitExportImportAssignments(node) {
if (ts.isAliasSymbolDeclaration(node) && resolver.isValueAliasDeclaration(node)) {
emitExportMemberAssignments(node.name);
}
ts.forEachChild(node, emitExportImportAssignments);
}
function emitImportDeclaration(node) {
if (languageVersion < 2) {
return emitExternalImportDeclaration(node);
}
if (node.importClause) {
var shouldEmitDefaultBindings = resolver.isReferencedAliasDeclaration(node.importClause);
var shouldEmitNamedBindings = node.importClause.namedBindings && resolver.isReferencedAliasDeclaration(node.importClause.namedBindings, true);
if (shouldEmitDefaultBindings || shouldEmitNamedBindings) {
write("import ");
emitStart(node.importClause);
if (shouldEmitDefaultBindings) {
emit(node.importClause.name);
if (shouldEmitNamedBindings) {
write(", ");
}
}
if (shouldEmitNamedBindings) {
emitLeadingComments(node.importClause.namedBindings);
emitStart(node.importClause.namedBindings);
if (node.importClause.namedBindings.kind === 212) {
write("* as ");
emit(node.importClause.namedBindings.name);
}
else {
write("{ ");
emitExportOrImportSpecifierList(node.importClause.namedBindings.elements, resolver.isReferencedAliasDeclaration);
write(" }");
}
emitEnd(node.importClause.namedBindings);
emitTrailingComments(node.importClause.namedBindings);
}
emitEnd(node.importClause);
write(" from ");
emit(node.moduleSpecifier);
write(";");
}
}
else {
write("import ");
emit(node.moduleSpecifier);
write(";");
}
}
function emitExternalImportDeclaration(node) {
if (ts.contains(externalImports, node)) {
var isExportedImport = node.kind === 209 && (node.flags & 1) !== 0;
var namespaceDeclaration = getNamespaceDeclarationNode(node);
if (compilerOptions.module !== 2) {
emitLeadingComments(node);
emitStart(node);
if (namespaceDeclaration && !isDefaultImport(node)) {
if (!isExportedImport)
write("var ");
emitModuleMemberName(namespaceDeclaration);
write(" = ");
}
else {
var isNakedImport = 210 && !node.importClause;
if (!isNakedImport) {
write("var ");
write(getGeneratedNameForNode(node));
write(" = ");
}
}
emitRequire(ts.getExternalModuleName(node));
if (namespaceDeclaration && isDefaultImport(node)) {
write(", ");
emitModuleMemberName(namespaceDeclaration);
write(" = ");
write(getGeneratedNameForNode(node));
}
write(";");
emitEnd(node);
emitExportImportAssignments(node);
emitTrailingComments(node);
}
else {
if (isExportedImport) {
emitModuleMemberName(namespaceDeclaration);
write(" = ");
emit(namespaceDeclaration.name);
write(";");
}
else if (namespaceDeclaration && isDefaultImport(node)) {
write("var ");
emitModuleMemberName(namespaceDeclaration);
write(" = ");
write(getGeneratedNameForNode(node));
write(";");
}
emitExportImportAssignments(node);
}
}
}
function emitImportEqualsDeclaration(node) {
if (ts.isExternalModuleImportEqualsDeclaration(node)) {
emitExternalImportDeclaration(node);
return;
}
if (resolver.isReferencedAliasDeclaration(node) ||
(!ts.isExternalModule(currentSourceFile) && resolver.isTopLevelValueImportEqualsWithEntityName(node))) {
emitLeadingComments(node);
emitStart(node);
if (isES6ExportedDeclaration(node)) {
write("export ");
write("var ");
}
else if (!(node.flags & 1)) {
write("var ");
}
emitModuleMemberName(node);
write(" = ");
emit(node.moduleReference);
write(";");
emitEnd(node);
emitExportImportAssignments(node);
emitTrailingComments(node);
}
}
function emitExportDeclaration(node) {
ts.Debug.assert(compilerOptions.module !== 4);
if (languageVersion < 2) {
if (node.moduleSpecifier && (!node.exportClause || resolver.isValueAliasDeclaration(node))) {
emitStart(node);
var generatedName = getGeneratedNameForNode(node);
if (node.exportClause) {
if (compilerOptions.module !== 2) {
write("var ");
write(generatedName);
write(" = ");
emitRequire(ts.getExternalModuleName(node));
write(";");
}
for (var _a = 0, _b = node.exportClause.elements; _a < _b.length; _a++) {
var specifier = _b[_a];
if (resolver.isValueAliasDeclaration(specifier)) {
writeLine();
emitStart(specifier);
emitContainingModuleName(specifier);
write(".");
emitNodeWithoutSourceMap(specifier.name);
write(" = ");
write(generatedName);
write(".");
emitNodeWithoutSourceMap(specifier.propertyName || specifier.name);
write(";");
emitEnd(specifier);
}
}
}
else {
writeLine();
write("__export(");
if (compilerOptions.module !== 2) {
emitRequire(ts.getExternalModuleName(node));
}
else {
write(generatedName);
}
write(");");
}
emitEnd(node);
}
}
else {
if (!node.exportClause || resolver.isValueAliasDeclaration(node)) {
emitStart(node);
write("export ");
if (node.exportClause) {
write("{ ");
emitExportOrImportSpecifierList(node.exportClause.elements, resolver.isValueAliasDeclaration);
write(" }");
}
else {
write("*");
}
if (node.moduleSpecifier) {
write(" from ");
emitNodeWithoutSourceMap(node.moduleSpecifier);
}
write(";");
emitEnd(node);
}
}
}
function emitExportOrImportSpecifierList(specifiers, shouldEmit) {
ts.Debug.assert(languageVersion >= 2);
var needsComma = false;
for (var _a = 0; _a < specifiers.length; _a++) {
var specifier = specifiers[_a];
if (shouldEmit(specifier)) {
if (needsComma) {
write(", ");
}
emitStart(specifier);
if (specifier.propertyName) {
emitNodeWithoutSourceMap(specifier.propertyName);
write(" as ");
}
emitNodeWithoutSourceMap(specifier.name);
emitEnd(specifier);
needsComma = true;
}
}
}
function emitExportAssignment(node) {
if (!node.isExportEquals && resolver.isValueAliasDeclaration(node)) {
if (languageVersion >= 2) {
writeLine();
emitStart(node);
write("export default ");
var expression = node.expression;
emit(expression);
if (expression.kind !== 201 &&
expression.kind !== 202) {
write(";");
}
emitEnd(node);
}
else {
writeLine();
emitStart(node);
if (compilerOptions.module === 4) {
write(exportFunctionForFile + "(\"default\",");
emit(node.expression);
write(")");
}
else {
emitContainingModuleName(node);
if (languageVersion === 0) {
write("[\"default\"] = ");
}
else {
write(".default = ");
}
emit(node.expression);
}
write(";");
emitEnd(node);
}
}
}
function collectExternalModuleInfo(sourceFile) {
externalImports = [];
exportSpecifiers = {};
exportEquals = undefined;
hasExportStars = false;
for (var _a = 0, _b = sourceFile.statements; _a < _b.length; _a++) {
var node = _b[_a];
switch (node.kind) {
case 210:
if (!node.importClause ||
resolver.isReferencedAliasDeclaration(node.importClause, true)) {
externalImports.push(node);
}
break;
case 209:
if (node.moduleReference.kind === 220 && resolver.isReferencedAliasDeclaration(node)) {
externalImports.push(node);
}
break;
case 216:
if (node.moduleSpecifier) {
if (!node.exportClause) {
externalImports.push(node);
hasExportStars = true;
}
else if (resolver.isValueAliasDeclaration(node)) {
externalImports.push(node);
}
}
else {
for (var _c = 0, _d = node.exportClause.elements; _c < _d.length; _c++) {
var specifier = _d[_c];
var name_20 = (specifier.propertyName || specifier.name).text;
(exportSpecifiers[name_20] || (exportSpecifiers[name_20] = [])).push(specifier);
}
}
break;
case 215:
if (node.isExportEquals && !exportEquals) {
exportEquals = node;
}
break;
}
}
}
function emitExportStarHelper() {
if (hasExportStars) {
writeLine();
write("function __export(m) {");
increaseIndent();
writeLine();
write("for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];");
decreaseIndent();
writeLine();
write("}");
}
}
function getLocalNameForExternalImport(importNode) {
var namespaceDeclaration = getNamespaceDeclarationNode(importNode);
if (namespaceDeclaration && !isDefaultImport(importNode)) {
return ts.getSourceTextOfNodeFromSourceFile(currentSourceFile, namespaceDeclaration.name);
}
else {
return getGeneratedNameForNode(importNode);
}
}
function getExternalModuleNameText(importNode) {
var moduleName = ts.getExternalModuleName(importNode);
if (moduleName.kind === 8) {
return getLiteralText(moduleName);
}
return undefined;
}
function emitVariableDeclarationsForImports() {
if (externalImports.length === 0) {
return;
}
writeLine();
var started = false;
for (var _a = 0; _a < externalImports.length; _a++) {
var importNode = externalImports[_a];
var skipNode = importNode.kind === 216 ||
(importNode.kind === 210 && !importNode.importClause);
if (skipNode) {
continue;
}
if (!started) {
write("var ");
started = true;
}
else {
write(", ");
}
write(getLocalNameForExternalImport(importNode));
}
if (started) {
write(";");
}
}
function emitLocalStorageForExportedNamesIfNecessary(exportedDeclarations) {
if (!hasExportStars) {
return undefined;
}
if (!exportedDeclarations && ts.isEmpty(exportSpecifiers)) {
var hasExportDeclarationWithExportClause = false;
for (var _a = 0; _a < externalImports.length; _a++) {
var externalImport = externalImports[_a];
if (externalImport.kind === 216 && externalImport.exportClause) {
hasExportDeclarationWithExportClause = true;
break;
}
}
if (!hasExportDeclarationWithExportClause) {
return emitExportStarFunction(undefined);
}
}
var exportedNamesStorageRef = makeUniqueName("exportedNames");
writeLine();
write("var " + exportedNamesStorageRef + " = {");
increaseIndent();
var started = false;
if (exportedDeclarations) {
for (var i = 0; i < exportedDeclarations.length; ++i) {
writeExportedName(exportedDeclarations[i]);
}
}
if (exportSpecifiers) {
for (var n in exportSpecifiers) {
for (var _b = 0, _c = exportSpecifiers[n]; _b < _c.length; _b++) {
var specifier = _c[_b];
writeExportedName(specifier.name);
}
}
}
for (var _d = 0; _d < externalImports.length; _d++) {
var externalImport = externalImports[_d];
if (externalImport.kind !== 216) {
continue;
}
var exportDecl = externalImport;
if (!exportDecl.exportClause) {
continue;
}
for (var _e = 0, _f = exportDecl.exportClause.elements; _e < _f.length; _e++) {
var element = _f[_e];
writeExportedName(element.name || element.propertyName);
}
}
decreaseIndent();
writeLine();
write("};");
return emitExportStarFunction(exportedNamesStorageRef);
function emitExportStarFunction(localNames) {
var exportStarFunction = makeUniqueName("exportStar");
writeLine();
write("function " + exportStarFunction + "(m) {");
increaseIndent();
writeLine();
write("for(var n in m) {");
increaseIndent();
writeLine();
write("if (n !== \"default\"");
if (localNames) {
write("&& !" + localNames + ".hasOwnProperty(n)");
}
write(") " + exportFunctionForFile + "(n, m[n]);");
decreaseIndent();
writeLine();
write("}");
decreaseIndent();
writeLine();
write("}");
return exportStarFunction;
}
function writeExportedName(node) {
if (node.kind !== 65 && node.flags & 256) {
return;
}
if (started) {
write(",");
}
else {
started = true;
}
writeLine();
write("'");
if (node.kind === 65) {
emitNodeWithoutSourceMap(node);
}
else {
emitDeclarationName(node);
}
write("': true");
}
}
function processTopLevelVariableAndFunctionDeclarations(node) {
var hoistedVars;
var hoistedFunctionDeclarations;
var exportedDeclarations;
visit(node);
if (hoistedVars) {
writeLine();
write("var ");
var seen = {};
for (var i = 0; i < hoistedVars.length; ++i) {
var local = hoistedVars[i];
var name_21 = local.kind === 65
? local
: local.name;
if (name_21) {
var text = ts.unescapeIdentifier(name_21.text);
if (ts.hasProperty(seen, text)) {
continue;
}
else {
seen[text] = text;
}
}
if (i !== 0) {
write(", ");
}
if (local.kind === 202 || local.kind === 206 || local.kind === 205) {
emitDeclarationName(local);
}
else {
emit(local);
}
var flags = ts.getCombinedNodeFlags(local.kind === 65 ? local.parent : local);
if (flags & 1) {
if (!exportedDeclarations) {
exportedDeclarations = [];
}
exportedDeclarations.push(local);
}
}
write(";");
}
if (hoistedFunctionDeclarations) {
for (var _a = 0; _a < hoistedFunctionDeclarations.length; _a++) {
var f = hoistedFunctionDeclarations[_a];
writeLine();
emit(f);
if (f.flags & 1) {
if (!exportedDeclarations) {
exportedDeclarations = [];
}
exportedDeclarations.push(f);
}
}
}
return exportedDeclarations;
function visit(node) {
if (node.flags & 2) {
return;
}
if (node.kind === 201) {
if (!hoistedFunctionDeclarations) {
hoistedFunctionDeclarations = [];
}
hoistedFunctionDeclarations.push(node);
return;
}
if (node.kind === 202) {
if (!hoistedVars) {
hoistedVars = [];
}
hoistedVars.push(node);
return;
}
if (node.kind === 205) {
if (shouldEmitEnumDeclaration(node)) {
if (!hoistedVars) {
hoistedVars = [];
}
hoistedVars.push(node);
}
return;
}
if (node.kind === 206) {
if (shouldEmitModuleDeclaration(node)) {
if (!hoistedVars) {
hoistedVars = [];
}
hoistedVars.push(node);
}
return;
}
if (node.kind === 199 || node.kind === 153) {
if (shouldHoistVariable(node, false)) {
var name_22 = node.name;
if (name_22.kind === 65) {
if (!hoistedVars) {
hoistedVars = [];
}
hoistedVars.push(name_22);
}
else {
ts.forEachChild(name_22, visit);
}
}
return;
}
if (ts.isBindingPattern(node)) {
ts.forEach(node.elements, visit);
return;
}
if (!ts.isDeclaration(node)) {
ts.forEachChild(node, visit);
}
}
}
function shouldHoistVariable(node, checkIfSourceFileLevelDecl) {
if (checkIfSourceFileLevelDecl && !shouldHoistDeclarationInSystemJsModule(node)) {
return false;
}
return (ts.getCombinedNodeFlags(node) & 12288) === 0 ||
ts.getEnclosingBlockScopeContainer(node).kind === 228;
}
function isCurrentFileSystemExternalModule() {
return compilerOptions.module === 4 && ts.isExternalModule(currentSourceFile);
}
function emitSystemModuleBody(node, startIndex) {
emitVariableDeclarationsForImports();
writeLine();
var exportedDeclarations = processTopLevelVariableAndFunctionDeclarations(node);
var exportStarFunction = emitLocalStorageForExportedNamesIfNecessary(exportedDeclarations);
writeLine();
write("return {");
increaseIndent();
writeLine();
emitSetters(exportStarFunction);
writeLine();
emitExecute(node, startIndex);
emitTempDeclarations(true);
decreaseIndent();
writeLine();
write("}");
}
function emitSetters(exportStarFunction) {
write("setters:[");
for (var i = 0; i < externalImports.length; ++i) {
if (i !== 0) {
write(",");
}
writeLine();
increaseIndent();
var importNode = externalImports[i];
var importVariableName = getLocalNameForExternalImport(importNode) || "";
var parameterName = "_" + importVariableName;
write("function (" + parameterName + ") {");
switch (importNode.kind) {
case 210:
if (!importNode.importClause) {
break;
}
case 209:
ts.Debug.assert(importVariableName !== "");
increaseIndent();
writeLine();
write(importVariableName + " = " + parameterName + ";");
writeLine();
var defaultName = importNode.kind === 210
? importNode.importClause.name
: importNode.name;
if (defaultName) {
emitExportMemberAssignments(defaultName);
writeLine();
}
if (importNode.kind === 210 &&
importNode.importClause.namedBindings) {
var namedBindings = importNode.importClause.namedBindings;
if (namedBindings.kind === 212) {
emitExportMemberAssignments(namedBindings.name);
writeLine();
}
else {
for (var _a = 0, _b = namedBindings.elements; _a < _b.length; _a++) {
var element = _b[_a];
emitExportMemberAssignments(element.name || element.propertyName);
writeLine();
}
}
}
decreaseIndent();
break;
case 216:
ts.Debug.assert(importVariableName !== "");
increaseIndent();
if (importNode.exportClause) {
for (var _c = 0, _d = importNode.exportClause.elements; _c < _d.length; _c++) {
var e = _d[_c];
writeLine();
write(exportFunctionForFile + "(\"");
emitNodeWithoutSourceMap(e.name);
write("\", " + parameterName + "[\"");
emitNodeWithoutSourceMap(e.propertyName || e.name);
write("\"]);");
}
}
else {
writeLine();
write(exportStarFunction + "(" + parameterName + ");");
}
writeLine();
decreaseIndent();
break;
}
write("}");
decreaseIndent();
}
write("],");
}
function emitExecute(node, startIndex) {
write("execute: function() {");
increaseIndent();
writeLine();
for (var i = startIndex; i < node.statements.length; ++i) {
var statement = node.statements[i];
switch (statement.kind) {
case 216:
case 210:
case 209:
case 201:
continue;
}
writeLine();
emit(statement);
}
decreaseIndent();
writeLine();
write("}");
}
function emitSystemModule(node, startIndex) {
collectExternalModuleInfo(node);
ts.Debug.assert(!exportFunctionForFile);
exportFunctionForFile = makeUniqueName("exports");
write("System.register([");
for (var i = 0; i < externalImports.length; ++i) {
var text = getExternalModuleNameText(externalImports[i]);
if (i !== 0) {
write(", ");
}
write(text);
}
write("], function(" + exportFunctionForFile + ") {");
writeLine();
increaseIndent();
emitCaptureThisForNodeIfNecessary(node);
emitSystemModuleBody(node, startIndex);
decreaseIndent();
writeLine();
write("});");
}
function emitAMDDependencies(node, includeNonAmdDependencies) {
// An AMD define function has the following shape:
// define(id?, dependencies?, factory);
//
// This has the shape of
// define(name, ["module1", "module2"], function (module1Alias) {
// The location of the alias in the parameter list in the factory function needs to
// match the position of the module name in the dependency list.
//
// To ensure this is true in cases of modules with no aliases, e.g.:
// `import "module"` or `<amd-dependency path= "a.css" />`
// we need to add modules without alias names to the end of the dependencies list
var aliasedModuleNames = [];
var unaliasedModuleNames = [];
var importAliasNames = [];
for (var _a = 0, _b = node.amdDependencies; _a < _b.length; _a++) {
var amdDependency = _b[_a];
if (amdDependency.name) {
aliasedModuleNames.push("\"" + amdDependency.path + "\"");
importAliasNames.push(amdDependency.name);
}
else {
unaliasedModuleNames.push("\"" + amdDependency.path + "\"");
}
}
for (var _c = 0; _c < externalImports.length; _c++) {
var importNode = externalImports[_c];
var externalModuleName = getExternalModuleNameText(importNode);
var importAliasName = getLocalNameForExternalImport(importNode);
if (includeNonAmdDependencies && importAliasName) {
aliasedModuleNames.push(externalModuleName);
importAliasNames.push(importAliasName);
}
else {
unaliasedModuleNames.push(externalModuleName);
}
}
write("[\"require\", \"exports\"");
if (aliasedModuleNames.length) {
write(", ");
write(aliasedModuleNames.join(", "));
}
if (unaliasedModuleNames.length) {
write(", ");
write(unaliasedModuleNames.join(", "));
}
write("], function (require, exports");
if (importAliasNames.length) {
write(", ");
write(importAliasNames.join(", "));
}
}
function emitAMDModule(node, startIndex) {
collectExternalModuleInfo(node);
writeLine();
write("define(");
if (node.amdModuleName) {
write("\"" + node.amdModuleName + "\", ");
}
emitAMDDependencies(node, true);
write(") {");
increaseIndent();
emitExportStarHelper();
emitCaptureThisForNodeIfNecessary(node);
emitLinesStartingAt(node.statements, startIndex);
emitTempDeclarations(true);
emitExportEquals(true);
decreaseIndent();
writeLine();
write("});");
}
function emitCommonJSModule(node, startIndex) {
collectExternalModuleInfo(node);
emitExportStarHelper();
emitCaptureThisForNodeIfNecessary(node);
emitLinesStartingAt(node.statements, startIndex);
emitTempDeclarations(true);
emitExportEquals(false);
}
function emitUMDModule(node, startIndex) {
collectExternalModuleInfo(node);
writeLines("(function (deps, factory) {\n if (typeof module === 'object' && typeof module.exports === 'object') {\n var v = factory(require, exports); if (v !== undefined) module.exports = v;\n }\n else if (typeof define === 'function' && define.amd) {\n define(deps, factory);\n }\n})(");
emitAMDDependencies(node, false);
write(") {");
increaseIndent();
emitExportStarHelper();
emitCaptureThisForNodeIfNecessary(node);
emitLinesStartingAt(node.statements, startIndex);
emitTempDeclarations(true);
emitExportEquals(true);
decreaseIndent();
writeLine();
write("});");
}
function emitES6Module(node, startIndex) {
externalImports = undefined;
exportSpecifiers = undefined;
exportEquals = undefined;
hasExportStars = false;
emitCaptureThisForNodeIfNecessary(node);
emitLinesStartingAt(node.statements, startIndex);
emitTempDeclarations(true);
}
function emitExportEquals(emitAsReturn) {
if (exportEquals && resolver.isValueAliasDeclaration(exportEquals)) {
writeLine();
emitStart(exportEquals);
write(emitAsReturn ? "return " : "module.exports = ");
emit(exportEquals.expression);
write(";");
emitEnd(exportEquals);
}
}
function emitDirectivePrologues(statements, startWithNewLine) {
for (var i = 0; i < statements.length; ++i) {
if (ts.isPrologueDirective(statements[i])) {
if (startWithNewLine || i > 0) {
writeLine();
}
emit(statements[i]);
}
else {
return i;
}
}
return statements.length;
}
function writeLines(text) {
var lines = text.split(/\r\n|\r|\n/g);
for (var i = 0; i < lines.length; ++i) {
var line = lines[i];
if (line.length) {
writeLine();
write(line);
}
}
}
function emitSourceFileNode(node) {
writeLine();
emitDetachedComments(node);
var startIndex = emitDirectivePrologues(node.statements, false);
if (!compilerOptions.noEmitHelpers) {
if ((languageVersion < 2) && (!extendsEmitted && resolver.getNodeCheckFlags(node) & 8)) {
writeLines(extendsHelper);
extendsEmitted = true;
}
if (!decorateEmitted && resolver.getNodeCheckFlags(node) & 512) {
writeLines(decorateHelper);
if (compilerOptions.emitDecoratorMetadata) {
writeLines(metadataHelper);
}
decorateEmitted = true;
}
if (!paramEmitted && resolver.getNodeCheckFlags(node) & 1024) {
writeLines(paramHelper);
paramEmitted = true;
}
}
if (ts.isExternalModule(node) || compilerOptions.separateCompilation) {
if (languageVersion >= 2) {
emitES6Module(node, startIndex);
}
else if (compilerOptions.module === 2) {
emitAMDModule(node, startIndex);
}
else if (compilerOptions.module === 4) {
emitSystemModule(node, startIndex);
}
else if (compilerOptions.module === 3) {
emitUMDModule(node, startIndex);
}
else {
emitCommonJSModule(node, startIndex);
}
}
else {
externalImports = undefined;
exportSpecifiers = undefined;
exportEquals = undefined;
hasExportStars = false;
emitCaptureThisForNodeIfNecessary(node);
emitLinesStartingAt(node.statements, startIndex);
emitTempDeclarations(true);
}
emitLeadingComments(node.endOfFileToken);
}
function emitNodeWithoutSourceMap(node, allowGeneratedIdentifiers) {
if (!node) {
return;
}
if (node.flags & 2) {
return emitOnlyPinnedOrTripleSlashComments(node);
}
var emitComments = shouldEmitLeadingAndTrailingComments(node);
if (emitComments) {
emitLeadingComments(node);
}
emitJavaScriptWorker(node, allowGeneratedIdentifiers);
if (emitComments) {
emitTrailingComments(node);
}
}
function shouldEmitLeadingAndTrailingComments(node) {
switch (node.kind) {
case 203:
case 201:
case 210:
case 209:
case 204:
case 215:
return false;
case 206:
return shouldEmitModuleDeclaration(node);
case 205:
return shouldEmitEnumDeclaration(node);
}
if (node.kind !== 180 &&
node.parent &&
node.parent.kind === 164 &&
node.parent.body === node &&
compilerOptions.target <= 1) {
return false;
}
return true;
}
function emitJavaScriptWorker(node, allowGeneratedIdentifiers) {
if (allowGeneratedIdentifiers === void 0) { allowGeneratedIdentifiers = true; }
switch (node.kind) {
case 65:
return emitIdentifier(node, allowGeneratedIdentifiers);
case 130:
return emitParameter(node);
case 135:
case 134:
return emitMethod(node);
case 137:
case 138:
return emitAccessor(node);
case 93:
return emitThis(node);
case 91:
return emitSuper(node);
case 89:
return write("null");
case 95:
return write("true");
case 80:
return write("false");
case 7:
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
return emitLiteral(node);
case 172:
return emitTemplateExpression(node);
case 178:
return emitTemplateSpan(node);
case 127:
return emitQualifiedName(node);
case 151:
return emitObjectBindingPattern(node);
case 152:
return emitArrayBindingPattern(node);
case 153:
return emitBindingElement(node);
case 154:
return emitArrayLiteral(node);
case 155:
return emitObjectLiteral(node);
case 225:
return emitPropertyAssignment(node);
case 226:
return emitShorthandPropertyAssignment(node);
case 128:
return emitComputedPropertyName(node);
case 156:
return emitPropertyAccess(node);
case 157:
return emitIndexedAccess(node);
case 158:
return emitCallExpression(node);
case 159:
return emitNewExpression(node);
case 160:
return emitTaggedTemplateExpression(node);
case 161:
return emit(node.expression);
case 162:
return emitParenExpression(node);
case 201:
case 163:
case 164:
return emitFunctionDeclaration(node);
case 165:
return emitDeleteExpression(node);
case 166:
return emitTypeOfExpression(node);
case 167:
return emitVoidExpression(node);
case 168:
return emitPrefixUnaryExpression(node);
case 169:
return emitPostfixUnaryExpression(node);
case 170:
return emitBinaryExpression(node);
case 171:
return emitConditionalExpression(node);
case 174:
return emitSpreadElementExpression(node);
case 173:
return emitYieldExpression(node);
case 176:
return;
case 180:
case 207:
return emitBlock(node);
case 181:
return emitVariableStatement(node);
case 182:
return write(";");
case 183:
return emitExpressionStatement(node);
case 184:
return emitIfStatement(node);
case 185:
return emitDoStatement(node);
case 186:
return emitWhileStatement(node);
case 187:
return emitForStatement(node);
case 189:
case 188:
return emitForInOrForOfStatement(node);
case 190:
case 191:
return emitBreakOrContinueStatement(node);
case 192:
return emitReturnStatement(node);
case 193:
return emitWithStatement(node);
case 194:
return emitSwitchStatement(node);
case 221:
case 222:
return emitCaseOrDefaultClause(node);
case 195:
return emitLabelledStatement(node);
case 196:
return emitThrowStatement(node);
case 197:
return emitTryStatement(node);
case 224:
return emitCatchClause(node);
case 198:
return emitDebuggerStatement(node);
case 199:
return emitVariableDeclaration(node);
case 175:
return emitClassExpression(node);
case 202:
return emitClassDeclaration(node);
case 203:
return emitInterfaceDeclaration(node);
case 205:
return emitEnumDeclaration(node);
case 227:
return emitEnumMember(node);
case 206:
return emitModuleDeclaration(node);
case 210:
return emitImportDeclaration(node);
case 209:
return emitImportEqualsDeclaration(node);
case 216:
return emitExportDeclaration(node);
case 215:
return emitExportAssignment(node);
case 228:
return emitSourceFileNode(node);
}
}
function hasDetachedComments(pos) {
return detachedCommentsInfo !== undefined && ts.lastOrUndefined(detachedCommentsInfo).nodePos === pos;
}
function getLeadingCommentsWithoutDetachedComments() {
var leadingComments = ts.getLeadingCommentRanges(currentSourceFile.text, ts.lastOrUndefined(detachedCommentsInfo).detachedCommentEndPos);
if (detachedCommentsInfo.length - 1) {
detachedCommentsInfo.pop();
}
else {
detachedCommentsInfo = undefined;
}
return leadingComments;
}
function filterComments(ranges, onlyPinnedOrTripleSlashComments) {
if (ranges && onlyPinnedOrTripleSlashComments) {
ranges = ts.filter(ranges, isPinnedOrTripleSlashComment);
if (ranges.length === 0) {
return undefined;
}
}
return ranges;
}
function getLeadingCommentsToEmit(node) {
if (node.parent) {
if (node.parent.kind === 228 || node.pos !== node.parent.pos) {
if (hasDetachedComments(node.pos)) {
return getLeadingCommentsWithoutDetachedComments();
}
else {
return ts.getLeadingCommentRangesOfNode(node, currentSourceFile);
}
}
}
}
function getTrailingCommentsToEmit(node) {
if (node.parent) {
if (node.parent.kind === 228 || node.end !== node.parent.end) {
return ts.getTrailingCommentRanges(currentSourceFile.text, node.end);
}
}
}
function emitOnlyPinnedOrTripleSlashComments(node) {
emitLeadingCommentsWorker(node, true);
}
function emitLeadingComments(node) {
return emitLeadingCommentsWorker(node, compilerOptions.removeComments);
}
function emitLeadingCommentsWorker(node, onlyPinnedOrTripleSlashComments) {
var leadingComments = filterComments(getLeadingCommentsToEmit(node), onlyPinnedOrTripleSlashComments);
ts.emitNewLineBeforeLeadingComments(currentSourceFile, writer, node, leadingComments);
ts.emitComments(currentSourceFile, writer, leadingComments, true, newLine, writeComment);
}
function emitTrailingComments(node) {
var trailingComments = filterComments(getTrailingCommentsToEmit(node), compilerOptions.removeComments);
ts.emitComments(currentSourceFile, writer, trailingComments, false, newLine, writeComment);
}
function emitLeadingCommentsOfPosition(pos) {
var leadingComments;
if (hasDetachedComments(pos)) {
leadingComments = getLeadingCommentsWithoutDetachedComments();
}
else {
leadingComments = ts.getLeadingCommentRanges(currentSourceFile.text, pos);
}
leadingComments = filterComments(leadingComments, compilerOptions.removeComments);
ts.emitNewLineBeforeLeadingComments(currentSourceFile, writer, { pos: pos, end: pos }, leadingComments);
ts.emitComments(currentSourceFile, writer, leadingComments, true, newLine, writeComment);
}
function emitDetachedComments(node) {
var leadingComments = ts.getLeadingCommentRanges(currentSourceFile.text, node.pos);
if (leadingComments) {
var detachedComments = [];
var lastComment;
ts.forEach(leadingComments, function (comment) {
if (lastComment) {
var lastCommentLine = ts.getLineOfLocalPosition(currentSourceFile, lastComment.end);
var commentLine = ts.getLineOfLocalPosition(currentSourceFile, comment.pos);
if (commentLine >= lastCommentLine + 2) {
return detachedComments;
}
}
detachedComments.push(comment);
lastComment = comment;
});
if (detachedComments.length) {
var lastCommentLine = ts.getLineOfLocalPosition(currentSourceFile, ts.lastOrUndefined(detachedComments).end);
var nodeLine = ts.getLineOfLocalPosition(currentSourceFile, ts.skipTrivia(currentSourceFile.text, node.pos));
if (nodeLine >= lastCommentLine + 2) {
ts.emitNewLineBeforeLeadingComments(currentSourceFile, writer, node, leadingComments);
ts.emitComments(currentSourceFile, writer, detachedComments, true, newLine, writeComment);
var currentDetachedCommentInfo = { nodePos: node.pos, detachedCommentEndPos: ts.lastOrUndefined(detachedComments).end };
if (detachedCommentsInfo) {
detachedCommentsInfo.push(currentDetachedCommentInfo);
}
else {
detachedCommentsInfo = [currentDetachedCommentInfo];
}
}
}
}
}
function isPinnedOrTripleSlashComment(comment) {
if (currentSourceFile.text.charCodeAt(comment.pos + 1) === 42) {
return currentSourceFile.text.charCodeAt(comment.pos + 2) === 33;
}
else if (currentSourceFile.text.charCodeAt(comment.pos + 1) === 47 &&
comment.pos + 2 < comment.end &&
currentSourceFile.text.charCodeAt(comment.pos + 2) === 47 &&
currentSourceFile.text.substring(comment.pos, comment.end).match(ts.fullTripleSlashReferencePathRegEx)) {
return true;
}
}
}
function emitFile(jsFilePath, sourceFile) {
emitJavaScript(jsFilePath, sourceFile);
if (compilerOptions.declaration) {
ts.writeDeclarationFile(jsFilePath, sourceFile, host, resolver, diagnostics);
}
}
}
ts.emitFiles = emitFiles;
})(ts || (ts = {}));
/// <reference path="sys.ts" />
/// <reference path="emitter.ts" />
var ts;
(function (ts) {
ts.programTime = 0;
ts.emitTime = 0;
ts.ioReadTime = 0;
ts.ioWriteTime = 0;
ts.version = "1.5.2";
var carriageReturnLineFeed = "\r\n";
var lineFeed = "\n";
function findConfigFile(searchPath) {
var fileName = "tsconfig.json";
while (true) {
if (ts.sys.fileExists(fileName)) {
return fileName;
}
var parentPath = ts.getDirectoryPath(searchPath);
if (parentPath === searchPath) {
break;
}
searchPath = parentPath;
fileName = "../" + fileName;
}
return undefined;
}
ts.findConfigFile = findConfigFile;
function createCompilerHost(options, setParentNodes) {
var currentDirectory;
var existingDirectories = {};
function getCanonicalFileName(fileName) {
return ts.sys.useCaseSensitiveFileNames ? fileName : fileName.toLowerCase();
}
var unsupportedFileEncodingErrorCode = -2147024809;
function getSourceFile(fileName, languageVersion, onError) {
var text;
try {
var start = new Date().getTime();
text = ts.sys.readFile(fileName, options.charset);
ts.ioReadTime += new Date().getTime() - start;
}
catch (e) {
if (onError) {
onError(e.number === unsupportedFileEncodingErrorCode
? ts.createCompilerDiagnostic(ts.Diagnostics.Unsupported_file_encoding).messageText
: e.message);
}
text = "";
}
return text !== undefined ? ts.createSourceFile(fileName, text, languageVersion, setParentNodes) : undefined;
}
function directoryExists(directoryPath) {
if (ts.hasProperty(existingDirectories, directoryPath)) {
return true;
}
if (ts.sys.directoryExists(directoryPath)) {
existingDirectories[directoryPath] = true;
return true;
}
return false;
}
function ensureDirectoriesExist(directoryPath) {
if (directoryPath.length > ts.getRootLength(directoryPath) && !directoryExists(directoryPath)) {
var parentDirectory = ts.getDirectoryPath(directoryPath);
ensureDirectoriesExist(parentDirectory);
ts.sys.createDirectory(directoryPath);
}
}
function writeFile(fileName, data, writeByteOrderMark, onError) {
try {
var start = new Date().getTime();
ensureDirectoriesExist(ts.getDirectoryPath(ts.normalizePath(fileName)));
ts.sys.writeFile(fileName, data, writeByteOrderMark);
ts.ioWriteTime += new Date().getTime() - start;
}
catch (e) {
if (onError) {
onError(e.message);
}
}
}
var newLine = options.newLine === 0 ? carriageReturnLineFeed :
options.newLine === 1 ? lineFeed :
ts.sys.newLine;
return {
getSourceFile: getSourceFile,
getDefaultLibFileName: function (options) { return ts.combinePaths(ts.getDirectoryPath(ts.normalizePath(ts.sys.getExecutingFilePath())), ts.getDefaultLibFileName(options)); },
writeFile: writeFile,
getCurrentDirectory: function () { return currentDirectory || (currentDirectory = ts.sys.getCurrentDirectory()); },
useCaseSensitiveFileNames: function () { return ts.sys.useCaseSensitiveFileNames; },
getCanonicalFileName: getCanonicalFileName,
getNewLine: function () { return newLine; }
};
}
ts.createCompilerHost = createCompilerHost;
function getPreEmitDiagnostics(program, sourceFile) {
var diagnostics = program.getSyntacticDiagnostics(sourceFile).concat(program.getGlobalDiagnostics()).concat(program.getSemanticDiagnostics(sourceFile));
if (program.getCompilerOptions().declaration) {
diagnostics.concat(program.getDeclarationDiagnostics(sourceFile));
}
return ts.sortAndDeduplicateDiagnostics(diagnostics);
}
ts.getPreEmitDiagnostics = getPreEmitDiagnostics;
function flattenDiagnosticMessageText(messageText, newLine) {
if (typeof messageText === "string") {
return messageText;
}
else {
var diagnosticChain = messageText;
var result = "";
var indent = 0;
while (diagnosticChain) {
if (indent) {
result += newLine;
for (var i = 0; i < indent; i++) {
result += " ";
}
}
result += diagnosticChain.messageText;
indent++;
diagnosticChain = diagnosticChain.next;
}
return result;
}
}
ts.flattenDiagnosticMessageText = flattenDiagnosticMessageText;
function createProgram(rootNames, options, host) {
var program;
var files = [];
var filesByName = {};
var diagnostics = ts.createDiagnosticCollection();
var seenNoDefaultLib = options.noLib;
var commonSourceDirectory;
var diagnosticsProducingTypeChecker;
var noDiagnosticsTypeChecker;
var start = new Date().getTime();
host = host || createCompilerHost(options);
ts.forEach(rootNames, function (name) { return processRootFile(name, false); });
if (!seenNoDefaultLib) {
processRootFile(host.getDefaultLibFileName(options), true);
}
verifyCompilerOptions();
ts.programTime += new Date().getTime() - start;
program = {
getSourceFile: getSourceFile,
getSourceFiles: function () { return files; },
getCompilerOptions: function () { return options; },
getSyntacticDiagnostics: getSyntacticDiagnostics,
getGlobalDiagnostics: getGlobalDiagnostics,
getSemanticDiagnostics: getSemanticDiagnostics,
getDeclarationDiagnostics: getDeclarationDiagnostics,
getTypeChecker: getTypeChecker,
getDiagnosticsProducingTypeChecker: getDiagnosticsProducingTypeChecker,
getCommonSourceDirectory: function () { return commonSourceDirectory; },
emit: emit,
getCurrentDirectory: function () { return host.getCurrentDirectory(); },
getNodeCount: function () { return getDiagnosticsProducingTypeChecker().getNodeCount(); },
getIdentifierCount: function () { return getDiagnosticsProducingTypeChecker().getIdentifierCount(); },
getSymbolCount: function () { return getDiagnosticsProducingTypeChecker().getSymbolCount(); },
getTypeCount: function () { return getDiagnosticsProducingTypeChecker().getTypeCount(); }
};
return program;
function getEmitHost(writeFileCallback) {
return {
getCanonicalFileName: function (fileName) { return host.getCanonicalFileName(fileName); },
getCommonSourceDirectory: program.getCommonSourceDirectory,
getCompilerOptions: program.getCompilerOptions,
getCurrentDirectory: function () { return host.getCurrentDirectory(); },
getNewLine: function () { return host.getNewLine(); },
getSourceFile: program.getSourceFile,
getSourceFiles: program.getSourceFiles,
writeFile: writeFileCallback || (function (fileName, data, writeByteOrderMark, onError) { return host.writeFile(fileName, data, writeByteOrderMark, onError); })
};
}
function getDiagnosticsProducingTypeChecker() {
return diagnosticsProducingTypeChecker || (diagnosticsProducingTypeChecker = ts.createTypeChecker(program, true));
}
function getTypeChecker() {
return noDiagnosticsTypeChecker || (noDiagnosticsTypeChecker = ts.createTypeChecker(program, false));
}
function emit(sourceFile, writeFileCallback) {
if (options.noEmitOnError && getPreEmitDiagnostics(this).length > 0) {
return { diagnostics: [], sourceMaps: undefined, emitSkipped: true };
}
var emitResolver = getDiagnosticsProducingTypeChecker().getEmitResolver(options.out ? undefined : sourceFile);
var start = new Date().getTime();
var emitResult = ts.emitFiles(emitResolver, getEmitHost(writeFileCallback), sourceFile);
ts.emitTime += new Date().getTime() - start;
return emitResult;
}
function getSourceFile(fileName) {
fileName = host.getCanonicalFileName(ts.normalizeSlashes(fileName));
return ts.hasProperty(filesByName, fileName) ? filesByName[fileName] : undefined;
}
function getDiagnosticsHelper(sourceFile, getDiagnostics) {
if (sourceFile) {
return getDiagnostics(sourceFile);
}
var allDiagnostics = [];
ts.forEach(program.getSourceFiles(), function (sourceFile) {
ts.addRange(allDiagnostics, getDiagnostics(sourceFile));
});
return ts.sortAndDeduplicateDiagnostics(allDiagnostics);
}
function getSyntacticDiagnostics(sourceFile) {
return getDiagnosticsHelper(sourceFile, getSyntacticDiagnosticsForFile);
}
function getSemanticDiagnostics(sourceFile) {
return getDiagnosticsHelper(sourceFile, getSemanticDiagnosticsForFile);
}
function getDeclarationDiagnostics(sourceFile) {
return getDiagnosticsHelper(sourceFile, getDeclarationDiagnosticsForFile);
}
function getSyntacticDiagnosticsForFile(sourceFile) {
return sourceFile.parseDiagnostics;
}
function getSemanticDiagnosticsForFile(sourceFile) {
var typeChecker = getDiagnosticsProducingTypeChecker();
ts.Debug.assert(!!sourceFile.bindDiagnostics);
var bindDiagnostics = sourceFile.bindDiagnostics;
var checkDiagnostics = typeChecker.getDiagnostics(sourceFile);
var programDiagnostics = diagnostics.getDiagnostics(sourceFile.fileName);
return bindDiagnostics.concat(checkDiagnostics).concat(programDiagnostics);
}
function getDeclarationDiagnosticsForFile(sourceFile) {
if (!ts.isDeclarationFile(sourceFile)) {
var resolver = getDiagnosticsProducingTypeChecker().getEmitResolver(sourceFile);
var writeFile = function () { };
return ts.getDeclarationDiagnostics(getEmitHost(writeFile), resolver, sourceFile);
}
}
function getGlobalDiagnostics() {
var typeChecker = getDiagnosticsProducingTypeChecker();
var allDiagnostics = [];
ts.addRange(allDiagnostics, typeChecker.getGlobalDiagnostics());
ts.addRange(allDiagnostics, diagnostics.getGlobalDiagnostics());
return ts.sortAndDeduplicateDiagnostics(allDiagnostics);
}
function hasExtension(fileName) {
return ts.getBaseFileName(fileName).indexOf(".") >= 0;
}
function processRootFile(fileName, isDefaultLib) {
processSourceFile(ts.normalizePath(fileName), isDefaultLib);
}
function processSourceFile(fileName, isDefaultLib, refFile, refPos, refEnd) {
var start;
var length;
var extensions;
var diagnosticArgument;
if (refEnd !== undefined && refPos !== undefined) {
start = refPos;
length = refEnd - refPos;
}
var diagnostic;
if (hasExtension(fileName)) {
if (!options.allowNonTsExtensions && !ts.forEach(ts.supportedExtensions, function (extension) { return ts.fileExtensionIs(host.getCanonicalFileName(fileName), extension); })) {
diagnostic = ts.Diagnostics.File_0_has_unsupported_extension_The_only_supported_extensions_are_1;
diagnosticArgument = [fileName, "'" + ts.supportedExtensions.join("', '") + "'"];
}
else if (!findSourceFile(fileName, isDefaultLib, refFile, refPos, refEnd)) {
diagnostic = ts.Diagnostics.File_0_not_found;
diagnosticArgument = [fileName];
}
else if (refFile && host.getCanonicalFileName(fileName) === host.getCanonicalFileName(refFile.fileName)) {
diagnostic = ts.Diagnostics.A_file_cannot_have_a_reference_to_itself;
diagnosticArgument = [fileName];
}
}
else {
if (options.allowNonTsExtensions && !findSourceFile(fileName, isDefaultLib, refFile, refPos, refEnd)) {
diagnostic = ts.Diagnostics.File_0_not_found;
diagnosticArgument = [fileName];
}
else if (!ts.forEach(ts.supportedExtensions, function (extension) { return findSourceFile(fileName + extension, isDefaultLib, refFile, refPos, refEnd); })) {
diagnostic = ts.Diagnostics.File_0_not_found;
fileName += ".ts";
diagnosticArgument = [fileName];
}
}
if (diagnostic) {
if (refFile) {
diagnostics.add(ts.createFileDiagnostic.apply(void 0, [refFile, start, length, diagnostic].concat(diagnosticArgument)));
}
else {
diagnostics.add(ts.createCompilerDiagnostic.apply(void 0, [diagnostic].concat(diagnosticArgument)));
}
}
}
function findSourceFile(fileName, isDefaultLib, refFile, refStart, refLength) {
var canonicalName = host.getCanonicalFileName(ts.normalizeSlashes(fileName));
if (ts.hasProperty(filesByName, canonicalName)) {
return getSourceFileFromCache(fileName, canonicalName, false);
}
else {
var normalizedAbsolutePath = ts.getNormalizedAbsolutePath(fileName, host.getCurrentDirectory());
var canonicalAbsolutePath = host.getCanonicalFileName(normalizedAbsolutePath);
if (ts.hasProperty(filesByName, canonicalAbsolutePath)) {
return getSourceFileFromCache(normalizedAbsolutePath, canonicalAbsolutePath, true);
}
var file = filesByName[canonicalName] = host.getSourceFile(fileName, options.target, function (hostErrorMessage) {
if (refFile) {
diagnostics.add(ts.createFileDiagnostic(refFile, refStart, refLength, ts.Diagnostics.Cannot_read_file_0_Colon_1, fileName, hostErrorMessage));
}
else {
diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Cannot_read_file_0_Colon_1, fileName, hostErrorMessage));
}
});
if (file) {
seenNoDefaultLib = seenNoDefaultLib || file.hasNoDefaultLib;
filesByName[canonicalAbsolutePath] = file;
if (!options.noResolve) {
var basePath = ts.getDirectoryPath(fileName);
processReferencedFiles(file, basePath);
processImportedModules(file, basePath);
}
if (isDefaultLib) {
files.unshift(file);
}
else {
files.push(file);
}
}
return file;
}
function getSourceFileFromCache(fileName, canonicalName, useAbsolutePath) {
var file = filesByName[canonicalName];
if (file && host.useCaseSensitiveFileNames()) {
var sourceFileName = useAbsolutePath ? ts.getNormalizedAbsolutePath(file.fileName, host.getCurrentDirectory()) : file.fileName;
if (canonicalName !== sourceFileName) {
diagnostics.add(ts.createFileDiagnostic(refFile, refStart, refLength, ts.Diagnostics.File_name_0_differs_from_already_included_file_name_1_only_in_casing, fileName, sourceFileName));
}
}
return file;
}
}
function processReferencedFiles(file, basePath) {
ts.forEach(file.referencedFiles, function (ref) {
var referencedFileName = ts.isRootedDiskPath(ref.fileName) ? ref.fileName : ts.combinePaths(basePath, ref.fileName);
processSourceFile(ts.normalizePath(referencedFileName), false, file, ref.pos, ref.end);
});
}
function processImportedModules(file, basePath) {
ts.forEach(file.statements, function (node) {
if (node.kind === 210 || node.kind === 209 || node.kind === 216) {
var moduleNameExpr = ts.getExternalModuleName(node);
if (moduleNameExpr && moduleNameExpr.kind === 8) {
var moduleNameText = moduleNameExpr.text;
if (moduleNameText) {
var searchPath = basePath;
var searchName;
while (true) {
searchName = ts.normalizePath(ts.combinePaths(searchPath, moduleNameText));
if (ts.forEach(ts.supportedExtensions, function (extension) { return findModuleSourceFile(searchName + extension, moduleNameExpr); })) {
break;
}
var parentPath = ts.getDirectoryPath(searchPath);
if (parentPath === searchPath) {
break;
}
searchPath = parentPath;
}
}
}
}
else if (node.kind === 206 && node.name.kind === 8 && (node.flags & 2 || ts.isDeclarationFile(file))) {
ts.forEachChild(node.body, function (node) {
if (ts.isExternalModuleImportEqualsDeclaration(node) &&
ts.getExternalModuleImportEqualsDeclarationExpression(node).kind === 8) {
var nameLiteral = ts.getExternalModuleImportEqualsDeclarationExpression(node);
var moduleName = nameLiteral.text;
if (moduleName) {
var searchName = ts.normalizePath(ts.combinePaths(basePath, moduleName));
ts.forEach(ts.supportedExtensions, function (extension) { return findModuleSourceFile(searchName + extension, nameLiteral); });
}
}
});
}
});
function findModuleSourceFile(fileName, nameLiteral) {
return findSourceFile(fileName, false, file, nameLiteral.pos, nameLiteral.end - nameLiteral.pos);
}
}
function computeCommonSourceDirectory(sourceFiles) {
var commonPathComponents;
var currentDirectory = host.getCurrentDirectory();
ts.forEach(files, function (sourceFile) {
if (ts.isDeclarationFile(sourceFile)) {
return;
}
var sourcePathComponents = ts.getNormalizedPathComponents(sourceFile.fileName, currentDirectory);
sourcePathComponents.pop();
if (!commonPathComponents) {
commonPathComponents = sourcePathComponents;
return;
}
for (var i = 0, n = Math.min(commonPathComponents.length, sourcePathComponents.length); i < n; i++) {
if (commonPathComponents[i] !== sourcePathComponents[i]) {
if (i === 0) {
diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Cannot_find_the_common_subdirectory_path_for_the_input_files));
return;
}
commonPathComponents.length = i;
break;
}
}
if (sourcePathComponents.length < commonPathComponents.length) {
commonPathComponents.length = sourcePathComponents.length;
}
});
return ts.getNormalizedPathFromPathComponents(commonPathComponents);
}
function checkSourceFilesBelongToPath(sourceFiles, rootDirectory) {
var allFilesBelongToPath = true;
if (sourceFiles) {
var currentDirectory = host.getCurrentDirectory();
var absoluteRootDirectoryPath = host.getCanonicalFileName(ts.getNormalizedAbsolutePath(rootDirectory, currentDirectory));
for (var _i = 0; _i < sourceFiles.length; _i++) {
var sourceFile = sourceFiles[_i];
if (!ts.isDeclarationFile(sourceFile)) {
var absoluteSourceFilePath = host.getCanonicalFileName(ts.getNormalizedAbsolutePath(sourceFile.fileName, currentDirectory));
if (absoluteSourceFilePath.indexOf(absoluteRootDirectoryPath) !== 0) {
diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.File_0_is_not_under_rootDir_1_rootDir_is_expected_to_contain_all_source_files, sourceFile.fileName, options.rootDir));
allFilesBelongToPath = false;
}
}
}
}
return allFilesBelongToPath;
}
function verifyCompilerOptions() {
if (options.separateCompilation) {
if (options.sourceMap) {
diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_sourceMap_cannot_be_specified_with_option_separateCompilation));
}
if (options.declaration) {
diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_declaration_cannot_be_specified_with_option_separateCompilation));
}
if (options.noEmitOnError) {
diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_noEmitOnError_cannot_be_specified_with_option_separateCompilation));
}
if (options.out) {
diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_out_cannot_be_specified_with_option_separateCompilation));
}
}
if (options.inlineSourceMap) {
if (options.sourceMap) {
diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_sourceMap_cannot_be_specified_with_option_inlineSourceMap));
}
if (options.mapRoot) {
diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_mapRoot_cannot_be_specified_with_option_inlineSourceMap));
}
if (options.sourceRoot) {
diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_sourceRoot_cannot_be_specified_with_option_inlineSourceMap));
}
}
if (options.inlineSources) {
if (!options.sourceMap && !options.inlineSourceMap) {
diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_inlineSources_can_only_be_used_when_either_option_inlineSourceMap_or_option_sourceMap_is_provided));
}
}
if (!options.sourceMap && (options.mapRoot || options.sourceRoot)) {
if (options.mapRoot) {
diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_mapRoot_cannot_be_specified_without_specifying_sourceMap_option));
}
if (options.sourceRoot) {
diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_sourceRoot_cannot_be_specified_without_specifying_sourceMap_option));
}
return;
}
var languageVersion = options.target || 0;
var firstExternalModuleSourceFile = ts.forEach(files, function (f) { return ts.isExternalModule(f) ? f : undefined; });
if (options.separateCompilation) {
if (!options.module && languageVersion < 2) {
diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_separateCompilation_can_only_be_used_when_either_option_module_is_provided_or_option_target_is_ES6_or_higher));
}
var firstNonExternalModuleSourceFile = ts.forEach(files, function (f) { return !ts.isExternalModule(f) && !ts.isDeclarationFile(f) ? f : undefined; });
if (firstNonExternalModuleSourceFile) {
var span = ts.getErrorSpanForNode(firstNonExternalModuleSourceFile, firstNonExternalModuleSourceFile);
diagnostics.add(ts.createFileDiagnostic(firstNonExternalModuleSourceFile, span.start, span.length, ts.Diagnostics.Cannot_compile_namespaces_when_the_separateCompilation_flag_is_provided));
}
}
else if (firstExternalModuleSourceFile && languageVersion < 2 && !options.module) {
var span = ts.getErrorSpanForNode(firstExternalModuleSourceFile, firstExternalModuleSourceFile.externalModuleIndicator);
diagnostics.add(ts.createFileDiagnostic(firstExternalModuleSourceFile, span.start, span.length, ts.Diagnostics.Cannot_compile_modules_unless_the_module_flag_is_provided));
}
if (options.module && languageVersion >= 2) {
diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Cannot_compile_modules_into_commonjs_amd_system_or_umd_when_targeting_ES6_or_higher));
}
if (options.outDir ||
options.sourceRoot ||
(options.mapRoot &&
(!options.out || firstExternalModuleSourceFile !== undefined))) {
if (options.rootDir && checkSourceFilesBelongToPath(files, options.rootDir)) {
commonSourceDirectory = ts.getNormalizedAbsolutePath(options.rootDir, host.getCurrentDirectory());
}
else {
commonSourceDirectory = computeCommonSourceDirectory(files);
}
if (commonSourceDirectory && commonSourceDirectory[commonSourceDirectory.length - 1] !== ts.directorySeparator) {
commonSourceDirectory += ts.directorySeparator;
}
}
if (options.noEmit) {
if (options.out || options.outDir) {
diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_noEmit_cannot_be_specified_with_option_out_or_outDir));
}
if (options.declaration) {
diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_noEmit_cannot_be_specified_with_option_declaration));
}
}
}
}
ts.createProgram = createProgram;
})(ts || (ts = {}));
/// <reference path="sys.ts"/>
/// <reference path="types.ts"/>
/// <reference path="core.ts"/>
/// <reference path="scanner.ts"/>
var ts;
(function (ts) {
ts.optionDeclarations = [
{
name: "charset",
type: "string"
},
{
name: "declaration",
shortName: "d",
type: "boolean",
description: ts.Diagnostics.Generates_corresponding_d_ts_file
},
{
name: "diagnostics",
type: "boolean"
},
{
name: "emitBOM",
type: "boolean"
},
{
name: "help",
shortName: "h",
type: "boolean",
description: ts.Diagnostics.Print_this_message
},
{
name: "inlineSourceMap",
type: "boolean"
},
{
name: "inlineSources",
type: "boolean"
},
{
name: "listFiles",
type: "boolean"
},
{
name: "locale",
type: "string"
},
{
name: "mapRoot",
type: "string",
isFilePath: true,
description: ts.Diagnostics.Specifies_the_location_where_debugger_should_locate_map_files_instead_of_generated_locations,
paramType: ts.Diagnostics.LOCATION
},
{
name: "module",
shortName: "m",
type: {
"commonjs": 1,
"amd": 2,
"system": 4,
"umd": 3
},
description: ts.Diagnostics.Specify_module_code_generation_Colon_commonjs_amd_system_or_umd,
paramType: ts.Diagnostics.KIND,
error: ts.Diagnostics.Argument_for_module_option_must_be_commonjs_amd_system_or_umd
},
{
name: "newLine",
type: {
"crlf": 0,
"lf": 1
},
description: ts.Diagnostics.Specifies_the_end_of_line_sequence_to_be_used_when_emitting_files_Colon_CRLF_dos_or_LF_unix,
paramType: ts.Diagnostics.NEWLINE,
error: ts.Diagnostics.Argument_for_newLine_option_must_be_CRLF_or_LF
},
{
name: "noEmit",
type: "boolean",
description: ts.Diagnostics.Do_not_emit_outputs
},
{
name: "noEmitHelpers",
type: "boolean"
},
{
name: "noEmitOnError",
type: "boolean",
description: ts.Diagnostics.Do_not_emit_outputs_if_any_errors_were_reported
},
{
name: "noImplicitAny",
type: "boolean",
description: ts.Diagnostics.Raise_error_on_expressions_and_declarations_with_an_implied_any_type
},
{
name: "noLib",
type: "boolean"
},
{
name: "noResolve",
type: "boolean"
},
{
name: "out",
type: "string",
description: ts.Diagnostics.Concatenate_and_emit_output_to_single_file,
paramType: ts.Diagnostics.FILE
},
{
name: "outDir",
type: "string",
isFilePath: true,
description: ts.Diagnostics.Redirect_output_structure_to_the_directory,
paramType: ts.Diagnostics.DIRECTORY
},
{
name: "preserveConstEnums",
type: "boolean",
description: ts.Diagnostics.Do_not_erase_const_enum_declarations_in_generated_code
},
{
name: "project",
shortName: "p",
type: "string",
isFilePath: true,
description: ts.Diagnostics.Compile_the_project_in_the_given_directory,
paramType: ts.Diagnostics.DIRECTORY
},
{
name: "removeComments",
type: "boolean",
description: ts.Diagnostics.Do_not_emit_comments_to_output
},
{
name: "rootDir",
type: "string",
isFilePath: true,
description: ts.Diagnostics.Specifies_the_root_directory_of_input_files_Use_to_control_the_output_directory_structure_with_outDir,
paramType: ts.Diagnostics.LOCATION
},
{
name: "separateCompilation",
type: "boolean"
},
{
name: "sourceMap",
type: "boolean",
description: ts.Diagnostics.Generates_corresponding_map_file
},
{
name: "sourceRoot",
type: "string",
isFilePath: true,
description: ts.Diagnostics.Specifies_the_location_where_debugger_should_locate_TypeScript_files_instead_of_source_locations,
paramType: ts.Diagnostics.LOCATION
},
{
name: "suppressImplicitAnyIndexErrors",
type: "boolean",
description: ts.Diagnostics.Suppress_noImplicitAny_errors_for_indexing_objects_lacking_index_signatures
},
{
name: "stripInternal",
type: "boolean",
description: ts.Diagnostics.Do_not_emit_declarations_for_code_that_has_an_internal_annotation,
experimental: true
},
{
name: "target",
shortName: "t",
type: { "es3": 0, "es5": 1, "es6": 2 },
description: ts.Diagnostics.Specify_ECMAScript_target_version_Colon_ES3_default_ES5_or_ES6_experimental,
paramType: ts.Diagnostics.VERSION,
error: ts.Diagnostics.Argument_for_target_option_must_be_ES3_ES5_or_ES6
},
{
name: "version",
shortName: "v",
type: "boolean",
description: ts.Diagnostics.Print_the_compiler_s_version
},
{
name: "watch",
shortName: "w",
type: "boolean",
description: ts.Diagnostics.Watch_input_files
},
{
name: "emitDecoratorMetadata",
type: "boolean",
experimental: true
}
];
function parseCommandLine(commandLine) {
var options = {};
var fileNames = [];
var errors = [];
var shortOptionNames = {};
var optionNameMap = {};
ts.forEach(ts.optionDeclarations, function (option) {
optionNameMap[option.name.toLowerCase()] = option;
if (option.shortName) {
shortOptionNames[option.shortName] = option.name;
}
});
parseStrings(commandLine);
return {
options: options,
fileNames: fileNames,
errors: errors
};
function parseStrings(args) {
var i = 0;
while (i < args.length) {
var s = args[i++];
if (s.charCodeAt(0) === 64) {
parseResponseFile(s.slice(1));
}
else if (s.charCodeAt(0) === 45) {
s = s.slice(s.charCodeAt(1) === 45 ? 2 : 1).toLowerCase();
if (ts.hasProperty(shortOptionNames, s)) {
s = shortOptionNames[s];
}
if (ts.hasProperty(optionNameMap, s)) {
var opt = optionNameMap[s];
if (!args[i] && opt.type !== "boolean") {
errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Compiler_option_0_expects_an_argument, opt.name));
}
switch (opt.type) {
case "number":
options[opt.name] = parseInt(args[i++]);
break;
case "boolean":
options[opt.name] = true;
break;
case "string":
options[opt.name] = args[i++] || "";
break;
default:
var map = opt.type;
var key = (args[i++] || "").toLowerCase();
if (ts.hasProperty(map, key)) {
options[opt.name] = map[key];
}
else {
errors.push(ts.createCompilerDiagnostic(opt.error));
}
}
}
else {
errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Unknown_compiler_option_0, s));
}
}
else {
fileNames.push(s);
}
}
}
function parseResponseFile(fileName) {
var text = ts.sys.readFile(fileName);
if (!text) {
errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.File_0_not_found, fileName));
return;
}
var args = [];
var pos = 0;
while (true) {
while (pos < text.length && text.charCodeAt(pos) <= 32)
pos++;
if (pos >= text.length)
break;
var start = pos;
if (text.charCodeAt(start) === 34) {
pos++;
while (pos < text.length && text.charCodeAt(pos) !== 34)
pos++;
if (pos < text.length) {
args.push(text.substring(start + 1, pos));
pos++;
}
else {
errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Unterminated_quoted_string_in_response_file_0, fileName));
}
}
else {
while (text.charCodeAt(pos) > 32)
pos++;
args.push(text.substring(start, pos));
}
}
parseStrings(args);
}
}
ts.parseCommandLine = parseCommandLine;
function readConfigFile(fileName) {
try {
var text = ts.sys.readFile(fileName);
}
catch (e) {
return { error: ts.createCompilerDiagnostic(ts.Diagnostics.Cannot_read_file_0_Colon_1, fileName, e.message) };
}
return parseConfigFileText(fileName, text);
}
ts.readConfigFile = readConfigFile;
function parseConfigFileText(fileName, jsonText) {
try {
return { config: /\S/.test(jsonText) ? JSON.parse(jsonText) : {} };
}
catch (e) {
return { error: ts.createCompilerDiagnostic(ts.Diagnostics.Failed_to_parse_file_0_Colon_1, fileName, e.message) };
}
}
ts.parseConfigFileText = parseConfigFileText;
function parseConfigFile(json, host, basePath) {
var errors = [];
return {
options: getCompilerOptions(),
fileNames: getFiles(),
errors: errors
};
function getCompilerOptions() {
var options = {};
var optionNameMap = {};
ts.forEach(ts.optionDeclarations, function (option) {
optionNameMap[option.name] = option;
});
var jsonOptions = json["compilerOptions"];
if (jsonOptions) {
for (var id in jsonOptions) {
if (ts.hasProperty(optionNameMap, id)) {
var opt = optionNameMap[id];
var optType = opt.type;
var value = jsonOptions[id];
var expectedType = typeof optType === "string" ? optType : "string";
if (typeof value === expectedType) {
if (typeof optType !== "string") {
var key = value.toLowerCase();
if (ts.hasProperty(optType, key)) {
value = optType[key];
}
else {
errors.push(ts.createCompilerDiagnostic(opt.error));
value = 0;
}
}
if (opt.isFilePath) {
value = ts.normalizePath(ts.combinePaths(basePath, value));
}
options[opt.name] = value;
}
else {
errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Compiler_option_0_requires_a_value_of_type_1, id, expectedType));
}
}
else {
errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Unknown_compiler_option_0, id));
}
}
}
return options;
}
function getFiles() {
var files = [];
if (ts.hasProperty(json, "files")) {
if (json["files"] instanceof Array) {
var files = ts.map(json["files"], function (s) { return ts.combinePaths(basePath, s); });
}
}
else {
var sysFiles = host.readDirectory(basePath, ".ts");
for (var i = 0; i < sysFiles.length; i++) {
var name = sysFiles[i];
if (!ts.fileExtensionIs(name, ".d.ts") || !ts.contains(sysFiles, name.substr(0, name.length - 5) + ".ts")) {
files.push(name);
}
}
}
return files;
}
}
ts.parseConfigFile = parseConfigFile;
})(ts || (ts = {}));
/// <reference path="program.ts"/>
/// <reference path="commandLineParser.ts"/>
var ts;
(function (ts) {
function validateLocaleAndSetLanguage(locale, errors) {
var matchResult = /^([a-z]+)([_\-]([a-z]+))?$/.exec(locale.toLowerCase());
if (!matchResult) {
errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Locale_must_be_of_the_form_language_or_language_territory_For_example_0_or_1, 'en', 'ja-jp'));
return false;
}
var language = matchResult[1];
var territory = matchResult[3];
if (!trySetLanguageAndTerritory(language, territory, errors) &&
!trySetLanguageAndTerritory(language, undefined, errors)) {
errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Unsupported_locale_0, locale));
return false;
}
return true;
}
function trySetLanguageAndTerritory(language, territory, errors) {
var compilerFilePath = ts.normalizePath(ts.sys.getExecutingFilePath());
var containingDirectoryPath = ts.getDirectoryPath(compilerFilePath);
var filePath = ts.combinePaths(containingDirectoryPath, language);
if (territory) {
filePath = filePath + "-" + territory;
}
filePath = ts.sys.resolvePath(ts.combinePaths(filePath, "diagnosticMessages.generated.json"));
if (!ts.sys.fileExists(filePath)) {
return false;
}
try {
var fileContents = ts.sys.readFile(filePath);
}
catch (e) {
errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Unable_to_open_file_0, filePath));
return false;
}
try {
ts.localizedDiagnosticMessages = JSON.parse(fileContents);
}
catch (e) {
errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Corrupted_locale_file_0, filePath));
return false;
}
return true;
}
function countLines(program) {
var count = 0;
ts.forEach(program.getSourceFiles(), function (file) {
count += ts.getLineStarts(file).length;
});
return count;
}
function getDiagnosticText(message) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
var diagnostic = ts.createCompilerDiagnostic.apply(undefined, arguments);
return diagnostic.messageText;
}
function reportDiagnostic(diagnostic) {
var output = "";
if (diagnostic.file) {
var loc = ts.getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start);
output += diagnostic.file.fileName + "(" + (loc.line + 1) + "," + (loc.character + 1) + "): ";
}
var category = ts.DiagnosticCategory[diagnostic.category].toLowerCase();
output += category + " TS" + diagnostic.code + ": " + ts.flattenDiagnosticMessageText(diagnostic.messageText, ts.sys.newLine) + ts.sys.newLine;
ts.sys.write(output);
}
function reportDiagnostics(diagnostics) {
for (var i = 0; i < diagnostics.length; i++) {
reportDiagnostic(diagnostics[i]);
}
}
function padLeft(s, length) {
while (s.length < length) {
s = " " + s;
}
return s;
}
function padRight(s, length) {
while (s.length < length) {
s = s + " ";
}
return s;
}
function reportStatisticalValue(name, value) {
ts.sys.write(padRight(name + ":", 12) + padLeft(value.toString(), 10) + ts.sys.newLine);
}
function reportCountStatistic(name, count) {
reportStatisticalValue(name, "" + count);
}
function reportTimeStatistic(name, time) {
reportStatisticalValue(name, (time / 1000).toFixed(2) + "s");
}
function isJSONSupported() {
return typeof JSON === "object" && typeof JSON.parse === "function";
}
function executeCommandLine(args) {
var commandLine = ts.parseCommandLine(args);
var configFileName;
var configFileWatcher;
var cachedProgram;
var rootFileNames;
var compilerOptions;
var compilerHost;
var hostGetSourceFile;
var timerHandle;
if (commandLine.options.locale) {
if (!isJSONSupported()) {
reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.The_current_host_does_not_support_the_0_option, "--locale"));
return ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
}
validateLocaleAndSetLanguage(commandLine.options.locale, commandLine.errors);
}
if (commandLine.errors.length > 0) {
reportDiagnostics(commandLine.errors);
return ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
}
if (commandLine.options.version) {
reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.Version_0, ts.version));
return ts.sys.exit(ts.ExitStatus.Success);
}
if (commandLine.options.help) {
printVersion();
printHelp();
return ts.sys.exit(ts.ExitStatus.Success);
}
if (commandLine.options.project) {
if (!isJSONSupported()) {
reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.The_current_host_does_not_support_the_0_option, "--project"));
return ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
}
configFileName = ts.normalizePath(ts.combinePaths(commandLine.options.project, "tsconfig.json"));
if (commandLine.fileNames.length !== 0) {
reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.Option_project_cannot_be_mixed_with_source_files_on_a_command_line));
return ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
}
}
else if (commandLine.fileNames.length === 0 && isJSONSupported()) {
var searchPath = ts.normalizePath(ts.sys.getCurrentDirectory());
configFileName = ts.findConfigFile(searchPath);
}
if (commandLine.fileNames.length === 0 && !configFileName) {
printVersion();
printHelp();
return ts.sys.exit(ts.ExitStatus.Success);
}
if (commandLine.options.watch) {
if (!ts.sys.watchFile) {
reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.The_current_host_does_not_support_the_0_option, "--watch"));
return ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
}
if (configFileName) {
configFileWatcher = ts.sys.watchFile(configFileName, configFileChanged);
}
}
performCompilation();
function performCompilation() {
if (!cachedProgram) {
if (configFileName) {
var result = ts.readConfigFile(configFileName);
if (result.error) {
reportDiagnostic(result.error);
return ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
}
var configObject = result.config;
var configParseResult = ts.parseConfigFile(configObject, ts.sys, ts.getDirectoryPath(configFileName));
if (configParseResult.errors.length > 0) {
reportDiagnostics(configParseResult.errors);
return ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
}
rootFileNames = configParseResult.fileNames;
compilerOptions = ts.extend(commandLine.options, configParseResult.options);
}
else {
rootFileNames = commandLine.fileNames;
compilerOptions = commandLine.options;
}
compilerHost = ts.createCompilerHost(compilerOptions);
hostGetSourceFile = compilerHost.getSourceFile;
compilerHost.getSourceFile = getSourceFile;
}
var compileResult = compile(rootFileNames, compilerOptions, compilerHost);
if (!compilerOptions.watch) {
return ts.sys.exit(compileResult.exitStatus);
}
setCachedProgram(compileResult.program);
reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.Compilation_complete_Watching_for_file_changes));
}
function getSourceFile(fileName, languageVersion, onError) {
if (cachedProgram) {
var sourceFile = cachedProgram.getSourceFile(fileName);
if (sourceFile && sourceFile.fileWatcher) {
return sourceFile;
}
}
var sourceFile = hostGetSourceFile(fileName, languageVersion, onError);
if (sourceFile && compilerOptions.watch) {
sourceFile.fileWatcher = ts.sys.watchFile(sourceFile.fileName, function () { return sourceFileChanged(sourceFile); });
}
return sourceFile;
}
function setCachedProgram(program) {
if (cachedProgram) {
var newSourceFiles = program ? program.getSourceFiles() : undefined;
ts.forEach(cachedProgram.getSourceFiles(), function (sourceFile) {
if (!(newSourceFiles && ts.contains(newSourceFiles, sourceFile))) {
if (sourceFile.fileWatcher) {
sourceFile.fileWatcher.close();
sourceFile.fileWatcher = undefined;
}
}
});
}
cachedProgram = program;
}
function sourceFileChanged(sourceFile) {
sourceFile.fileWatcher.close();
sourceFile.fileWatcher = undefined;
startTimer();
}
function configFileChanged() {
setCachedProgram(undefined);
startTimer();
}
function startTimer() {
if (timerHandle) {
clearTimeout(timerHandle);
}
timerHandle = setTimeout(recompile, 250);
}
function recompile() {
timerHandle = undefined;
reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.File_change_detected_Starting_incremental_compilation));
performCompilation();
}
}
ts.executeCommandLine = executeCommandLine;
function compile(fileNames, compilerOptions, compilerHost) {
ts.ioReadTime = 0;
ts.ioWriteTime = 0;
ts.programTime = 0;
ts.bindTime = 0;
ts.checkTime = 0;
ts.emitTime = 0;
var program = ts.createProgram(fileNames, compilerOptions, compilerHost);
var exitStatus = compileProgram();
if (compilerOptions.listFiles) {
ts.forEach(program.getSourceFiles(), function (file) {
ts.sys.write(file.fileName + ts.sys.newLine);
});
}
if (compilerOptions.diagnostics) {
var memoryUsed = ts.sys.getMemoryUsage ? ts.sys.getMemoryUsage() : -1;
reportCountStatistic("Files", program.getSourceFiles().length);
reportCountStatistic("Lines", countLines(program));
reportCountStatistic("Nodes", program.getNodeCount());
reportCountStatistic("Identifiers", program.getIdentifierCount());
reportCountStatistic("Symbols", program.getSymbolCount());
reportCountStatistic("Types", program.getTypeCount());
if (memoryUsed >= 0) {
reportStatisticalValue("Memory used", Math.round(memoryUsed / 1000) + "K");
}
reportTimeStatistic("I/O read", ts.ioReadTime);
reportTimeStatistic("I/O write", ts.ioWriteTime);
reportTimeStatistic("Parse time", ts.programTime);
reportTimeStatistic("Bind time", ts.bindTime);
reportTimeStatistic("Check time", ts.checkTime);
reportTimeStatistic("Emit time", ts.emitTime);
reportTimeStatistic("Total time", ts.programTime + ts.bindTime + ts.checkTime + ts.emitTime);
}
return { program: program, exitStatus: exitStatus };
function compileProgram() {
var diagnostics = program.getSyntacticDiagnostics();
reportDiagnostics(diagnostics);
if (diagnostics.length === 0) {
var diagnostics = program.getGlobalDiagnostics();
reportDiagnostics(diagnostics);
if (diagnostics.length === 0) {
var diagnostics = program.getSemanticDiagnostics();
reportDiagnostics(diagnostics);
}
}
if (compilerOptions.noEmit) {
return diagnostics.length
? ts.ExitStatus.DiagnosticsPresent_OutputsSkipped
: ts.ExitStatus.Success;
}
var emitOutput = program.emit();
reportDiagnostics(emitOutput.diagnostics);
if (emitOutput.emitSkipped) {
return ts.ExitStatus.DiagnosticsPresent_OutputsSkipped;
}
if (diagnostics.length > 0 || emitOutput.diagnostics.length > 0) {
return ts.ExitStatus.DiagnosticsPresent_OutputsGenerated;
}
return ts.ExitStatus.Success;
}
}
function printVersion() {
ts.sys.write(getDiagnosticText(ts.Diagnostics.Version_0, ts.version) + ts.sys.newLine);
}
function printHelp() {
var output = "";
var syntaxLength = getDiagnosticText(ts.Diagnostics.Syntax_Colon_0, "").length;
var examplesLength = getDiagnosticText(ts.Diagnostics.Examples_Colon_0, "").length;
var marginLength = Math.max(syntaxLength, examplesLength);
var syntax = makePadding(marginLength - syntaxLength);
syntax += "tsc [" + getDiagnosticText(ts.Diagnostics.options) + "] [" + getDiagnosticText(ts.Diagnostics.file) + " ...]";
output += getDiagnosticText(ts.Diagnostics.Syntax_Colon_0, syntax);
output += ts.sys.newLine + ts.sys.newLine;
var padding = makePadding(marginLength);
output += getDiagnosticText(ts.Diagnostics.Examples_Colon_0, makePadding(marginLength - examplesLength) + "tsc hello.ts") + ts.sys.newLine;
output += padding + "tsc --out file.js file.ts" + ts.sys.newLine;
output += padding + "tsc @args.txt" + ts.sys.newLine;
output += ts.sys.newLine;
output += getDiagnosticText(ts.Diagnostics.Options_Colon) + ts.sys.newLine;
var optsList = ts.filter(ts.optionDeclarations.slice(), function (v) { return !v.experimental; });
optsList.sort(function (a, b) { return ts.compareValues(a.name.toLowerCase(), b.name.toLowerCase()); });
var marginLength = 0;
var usageColumn = [];
var descriptionColumn = [];
for (var i = 0; i < optsList.length; i++) {
var option = optsList[i];
if (!option.description) {
continue;
}
var usageText = " ";
if (option.shortName) {
usageText += "-" + option.shortName;
usageText += getParamType(option);
usageText += ", ";
}
usageText += "--" + option.name;
usageText += getParamType(option);
usageColumn.push(usageText);
descriptionColumn.push(getDiagnosticText(option.description));
marginLength = Math.max(usageText.length, marginLength);
}
var usageText = " @<" + getDiagnosticText(ts.Diagnostics.file) + ">";
usageColumn.push(usageText);
descriptionColumn.push(getDiagnosticText(ts.Diagnostics.Insert_command_line_options_and_files_from_a_file));
marginLength = Math.max(usageText.length, marginLength);
for (var i = 0; i < usageColumn.length; i++) {
var usage = usageColumn[i];
var description = descriptionColumn[i];
output += usage + makePadding(marginLength - usage.length + 2) + description + ts.sys.newLine;
}
ts.sys.write(output);
return;
function getParamType(option) {
if (option.paramType !== undefined) {
return " " + getDiagnosticText(option.paramType);
}
return "";
}
function makePadding(paddingLength) {
return Array(paddingLength + 1).join(" ");
}
}
})(ts || (ts = {}));
ts.executeCommandLine(ts.sys.args);
declare function openDatabase(
name: string,
version: any,
displayName: string,
size: number,
upgrade?: DatabaseCallback): Database;
interface DatabaseCallback {
(database: Database): void;
}
interface Database {
transaction(
callback: (transaction: SQLTransaction) => void,
errorCallback?: (error: SQLError) => void,
successCallback?: () => void);
readTransaction(
callback: (transaction: SQLTransaction) => void,
errorCallback?: (error: SQLError) => void,
successCallback?: () => void);
version: string;
changeVersion(
oldVersion: string,
newVersion: string,
callback: (transaction: SQLTransaction) => void,
errorCallback?: (error: SQLError) => void,
successCallback?: () => void);
}
interface SQLTransaction {
executeSql(
sqlStatement: string,
arguments?: any[],
callback?: (transaction: SQLTransaction, result: SQLResultSet) => void,
errorCallback?: (transaction: SQLTransaction, error: SQLError) => void): void;
}
interface SQLError {
/**
* UNKNOWN_ERR = 0;
* DATABASE_ERR = 1;
* VERSION_ERR = 2;
* TOO_LARGE_ERR = 3;
* QUOTA_ERR = 4;
* SYNTAX_ERR = 5;
* CONSTRAINT_ERR = 6;
* TIMEOUT_ERR = 7;
*/
code: number;
message: string
}
interface SQLResultSet {
insertId: number;
rowsAffected: number;
rows: SQLResultSetRowList;
}
interface SQLResultSetRowList {
length: number;
item(index: number): any;
}class Apple {
constructor(public color = 'red') {
}
}
console.log('Look, I am a happy TypeScript file running away.');
console.log('I\'ve got class ' + Apple);
var apple = new Apple();
console.log('I\'ve created an instance of it: ', apple);
apple.color = 'green';
console.log('I\'ve changed its colour: ', apple);<!doctype html>
<title>mini shell </title>
<script data-legit=mi>
<%=embedFile('boot/onerror.js')%>
//# sourceURL=boot/onerror.js
</script>
<script data-legit=mi>
earlyBoot(window);
<%=typescriptBuild('boot/*')%>
<%=embedFile('boot/bootUI.js')%>
//# sourceURL=/boot/base.js
</script>
<script data-legit=mi>
<%=typescriptBuild('load/*', 'persistence/*', 'boot/base.d.ts', 'typings/*')%>
function showCommanderInContext(drive, window, document, require) {
<%=typescriptBuild('shell/*', 'noapi/*', 'isolation/*', 'boot/base.d.ts', 'persistence/Drive.ts', 'typings/*')%>
showCommander(drive);
}
//# sourceURL=/load/shellLoader.ts.js
</script>
<!-- total 12Mb, saved <%=(function() {
var monthsPrettyCase = ('Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec').split('|');
var saveDate = new Date();
var dtText =
saveDate.getDate() + ' ' +
monthsPrettyCase[saveDate.getMonth()] + ' ' +
saveDate.getFullYear() + ' ' +
num2(saveDate.getHours()) + ':' +
num2(saveDate.getMinutes()) + ':' +
num2(saveDate.getSeconds()) + '.' +
(+saveDate).toString().slice(-3);
var saveDateLocalStr = saveDate.toString();
var gmtMatch = (/(GMT\s*[\-\+]\d+(\:\d+)?)/i).exec(saveDateLocalStr);
if (gmtMatch)
dtText += ' ' + gmtMatch[1];
return dtText;
function num2(n) {
return n <= 9 ? '0' + n : '' + n;
}
})()
%> -->
<!-- /empty/
-->
<!-- /LF-file.txt
123
456-->
<!-- /CRLF-file [CRLF]
123
456-->
<!-- /CR-file [CR]
123
456-->
<!-- /exportsome.js [CR]
module.exports = 55-->
<!-- /exports_fs.js [CR]
module.exports = require('fs')-->
<!-- /exports_process.js [CR]
module.exports = process-->
<!-- /eval-file.txt [eval]
"random char: " + String.fromCharCode(Math.random()*16000)+"\n"+
"date: "+new Date()+"\n"+
"location: "+location -->
<!-- /json-file.txt [json]
"new ok \u2222 and what\r\n or \u0001?\n\n\n"-->
<%=(function() {
return; // SWITCHED OFF LARGE DIRECTORY GENERATION (it makes it easier to debug DOM stuff)
var dump = [];
for (var i = 0; i < 2000; i++) {
dump.push('<'+'!'+'-- /large-directory/'+(500+i)+'.txt');
dump.push('OK --'+'>');
}
return dump.join('\n');
})()%>
<!-- /shell/style.css
<%=(function() {
var drive = portabled.build.processTemplate.mainDrive;
var files = drive.files();
var styleText = [];
for (var i = 0; i < files.length; i++) {
if (/^\/shell\/[\s\S]*\.css$/.test(files[i]))
styleText.push(drive.read(files[i]));
}
return styleText.join('\n');
})()%>
-->
<%=(function() {
var drive = portabled.build.processTemplate.mainDrive;
var files = drive.files();
var fileDump = [];
for (var i = 0; i < files.length; i++) {
var content = drive.read(files[i]);
var decoratedContent = content.
replace(/\-\-(\**)\>/g, '--*$1>').
replace(/\<(\**)\!/g, '<*$1!');
fileDump.push('<'+'!'+'-- '+'/src'+files[i]);
fileDump.push(decoratedContent);
fileDump.push('--'+'!'+'>');
}
return fileDump.join('\n');
})()%>
#New mini portable shell development Used these open-source libraries: * [feross/buffer] (https://github.com/feross/buffer) - MIT * [beatgammit/base64-js] (https://github.com/beatgammit/base64-js) - MIT * [feross/ieee754] (https://github.com/feross/ieee754) - MIT * [retrofox/is-array] (https://github.com/retrofox/is-array) - MIT ## Boot process The boot process begins with first bytes of the page received, during the loading of the content, then would continue for a little after the page is loaded. The main post-content-load is completing the data fetch from the local storage. It may well finish earlier, but may take some time. During the boot process, and at the end of it the code is supposed to show sensible UI and implement neat handover animations (unless the whole boot finishes very fast). ### Early boot The mission of this stage is to create the temporary boot UI (very quickly!) and hand over to the shell loader. The boot UI is something like a splash screen, boot animation, washed-out live-like image or whatever. * Error handler is installed at the first opportunity * Base.js library with primitives for basic DOM manipulation is loaded * BootUI iframe is created * BootUI function is invoked to draw the boot animation ### Shell loader Shell loader's task is to initialise the persistence (virtual filesystem backed by DOM and local storage). During that persistence loading the shell loader passes progress events to the boot UI. Upon completion it starts the actual shell and finally animates from boot UI to the shell. * Persistence loading is started * Persistence keeps polling the DOM state, fishing for pieces of 'virtual filesystem' * Progress is supposed to be reported to the BootUI * Persistence also need to load the locally-stored state, reconciling it with the DOM (by timestamps) * Eventualy persistence report completion * Shell iframe is created with opacity=0 * Shell start code is loaded (normally from the filesystem) and kicked off * Animating BootUI.opacity -> 0; Shell.opacity->1 ### Shell When shell begins to load, the persistence is fully functional, so it's up to the shell what to do with it. The interactive node-like shell emulates node.js to a great extent: by laying node.js API on top of the persistence and various browser features. At the moment the shell also has file-manager-like panels, so virtual filesystem can be navigated and necessary tasks (copying/editing/moving of files or directories) performed interactively. Other shells may host more specialised apps. These are planned examples: * PC.js virtual machine hosting early PC images (DOS, early Windows, OS/2 and such) * Markdown viewer/editor * SVG editor * Slide editor * Spreadsheet editor ## Involved libaries and sub-modules First of all, the sequence above explicitly mentiones three mini-libraries: * Base.js * BootUI * Persistence Those indeed can be considered separately, with a degree of isolation from the rest of the boot process. ### Base.js A very tight set of functions for DOM manipulation. It is used by both booting stage, as well as actually employed by the current shell. These are broad features of the mini-library: * Setting/getting text of a DOM element (older IE handling, special workarounds for some elements) * Creating elements and setting properties/CSS attributes in JSON-like syntax * Subscribing to events * Creating IFRAME and retrieving its key objects (inner window, inner document) ### BootUI The boot-time UI is largely free in what it renders. It is hosted in a separate IFRAME with limited communication to the rest of the code. It is expected that various shells provide each their fine-tuned boot UI 'library'. A good option would be to render the state of the application as the user left, with a tasteful overlay reflecting the boot progress. ### Persistence The task of emulating an embedded virtual filesystem of files/directories is implemented in the persistence mini-library. The persistence API is described in terms of a Drive object (with read/write methods) and its construction stages. Several sources of storage are implemented towards the same API: * DOM * IndexedDB * WebSQL * LocalStorage DOM storage is expected to exist at a very minimum (we are running in the context of a page already!), then one of the local storage options is added upon a brief detection process. From the external caller the persistence mini-library expects a single call to *mountDrive* function, passing in a few inputs and a callback.
Used these open-source libraries:
The boot process begins with first bytes of the page received, during the loading of the content, then would continue for a little after the page is loaded.
The main post-content-load is completing the data fetch from the local storage. It may well finish earlier, but may take some time.
During the boot process, and at the end of it the code is supposed to show sensible UI and implement neat handover animations (unless the whole boot finishes very fast).
The mission of this stage is to create the temporary boot UI (very quickly!) and hand over to the shell loader. The boot UI is something like a splash screen, boot animation, washed-out live-like image or whatever.
Shell loader's task is to initialise the persistence (virtual filesystem backed by DOM and local storage).
During that persistence loading the shell loader passes progress events to the boot UI. Upon completion it starts the actual shell and finally animates from boot UI to the shell.
Animating BootUI.opacity -> 0; Shell.opacity->1
When shell begins to load, the persistence is fully functional, so it's up to the shell what to do with it.
The interactive node-like shell emulates node.js to a great extent: by laying node.js API on top of the persistence and various browser features.
At the moment the shell also has file-manager-like panels, so virtual filesystem can be navigated and necessary tasks (copying/editing/moving of files or directories) performed interactively.
Other shells may host more specialised apps. These are planned examples:
First of all, the sequence above explicitly mentiones three mini-libraries:
Those indeed can be considered separately, with a degree of isolation from the rest of the boot process.
A very tight set of functions for DOM manipulation. It is used by both booting stage, as well as actually employed by the current shell.
These are broad features of the mini-library:
The boot-time UI is largely free in what it renders. It is hosted in a separate IFRAME with limited communication to the rest of the code.
It is expected that various shells provide each their fine-tuned boot UI 'library'.
A good option would be to render the state of the application as the user left, with a tasteful overlay reflecting the boot progress.
The task of emulating an embedded virtual filesystem of files/directories is implemented in the persistence mini-library.
The persistence API is described in terms of a Drive object (with read/write methods) and its construction stages.
Several sources of storage are implemented towards the same API:
DOM storage is expected to exist at a very minimum (we are running in the context of a page already!), then one of the local storage options is added upon a brief detection process.
From the external caller the persistence mini-library expects a single call to mountDrive function, passing in a few inputs and a callback.